merge
authorkoda
Wed, 14 Sep 2011 22:39:39 +0200
changeset 5906 ed9676dc8cb4
parent 5713 190d6bb075c5 (current diff)
parent 5905 0a00bbe97e22 (diff)
child 5907 64ccc6be0ec5
merge
share/hedgewars/Data/Graphics/Hats/Balrog.png
share/hedgewars/Data/Graphics/Hats/Blanka.png
share/hedgewars/Data/Graphics/Hats/BlankaToothless.png
share/hedgewars/Data/Graphics/Hats/BlueCap.png
share/hedgewars/Data/Graphics/Hats/BlueHair.png
share/hedgewars/Data/Graphics/Hats/Bob.png
share/hedgewars/Data/Graphics/Hats/BrainSlug.png
share/hedgewars/Data/Graphics/Hats/BrainSlugMouth.png
share/hedgewars/Data/Graphics/Hats/Bub.png
share/hedgewars/Data/Graphics/Hats/Bunny.png
share/hedgewars/Data/Graphics/Hats/Chunli.png
share/hedgewars/Data/Graphics/Hats/Cororon.png
share/hedgewars/Data/Graphics/Hats/Deer.png
share/hedgewars/Data/Graphics/Hats/Falcon.png
share/hedgewars/Data/Graphics/Hats/Geordi.png
share/hedgewars/Data/Graphics/Hats/GreenCap.png
share/hedgewars/Data/Graphics/Hats/GreenHair.png
share/hedgewars/Data/Graphics/Hats/GreyHair.png
share/hedgewars/Data/Graphics/Hats/Guile.png
share/hedgewars/Data/Graphics/Hats/Honda.png
share/hedgewars/Data/Graphics/Hats/Ken.png
share/hedgewars/Data/Graphics/Hats/KirbyMask.png
share/hedgewars/Data/Graphics/Hats/Kululun.png
share/hedgewars/Data/Graphics/Hats/Ladle.png
share/hedgewars/Data/Graphics/Hats/Luigi.png
share/hedgewars/Data/Graphics/Hats/Mario.png
share/hedgewars/Data/Graphics/Hats/Moose.png
share/hedgewars/Data/Graphics/Hats/OrangeHair.png
share/hedgewars/Data/Graphics/Hats/Pig.png
share/hedgewars/Data/Graphics/Hats/PinkHair.png
share/hedgewars/Data/Graphics/Hats/PrincessDaisy.png
share/hedgewars/Data/Graphics/Hats/PrincessPeach.png
share/hedgewars/Data/Graphics/Hats/Pumpkin_Hat.png
share/hedgewars/Data/Graphics/Hats/PurpleHair.png
share/hedgewars/Data/Graphics/Hats/RedCap.png
share/hedgewars/Data/Graphics/Hats/RedHair.png
share/hedgewars/Data/Graphics/Hats/Ryu.png
share/hedgewars/Data/Graphics/Hats/Samus.png
share/hedgewars/Data/Graphics/Hats/SauceBoatSilver.png
share/hedgewars/Data/Graphics/Hats/Sonic.png
share/hedgewars/Data/Graphics/Hats/Teacup.png
share/hedgewars/Data/Graphics/Hats/TeamCap.png
share/hedgewars/Data/Graphics/Hats/TeamHair.png
share/hedgewars/Data/Graphics/Hats/Teapot.png
share/hedgewars/Data/Graphics/Hats/Toad.png
share/hedgewars/Data/Graphics/Hats/Vega.png
share/hedgewars/Data/Graphics/Hats/Wario.png
share/hedgewars/Data/Graphics/Hats/YellowCap.png
share/hedgewars/Data/Graphics/Hats/YellowHair.png
share/hedgewars/Data/Graphics/Hats/apple.png
share/hedgewars/Data/Graphics/Hats/ash.png
share/hedgewars/Data/Graphics/Hats/banana.png
share/hedgewars/Data/Graphics/Hats/beaver.png
share/hedgewars/Data/Graphics/Hats/charmander.png
share/hedgewars/Data/Graphics/Hats/chikorita.png
share/hedgewars/Data/Graphics/Hats/cyborg.png
share/hedgewars/Data/Graphics/Hats/darthvader.png
share/hedgewars/Data/Graphics/Hats/diglett.png
share/hedgewars/Data/Graphics/Hats/jigglypuff.png
share/hedgewars/Data/Graphics/Hats/junior.png
share/hedgewars/Data/Graphics/Hats/lemon.png
share/hedgewars/Data/Graphics/Hats/link.png
share/hedgewars/Data/Graphics/Hats/lugia.png
share/hedgewars/Data/Graphics/Hats/mudkip.png
share/hedgewars/Data/Graphics/Hats/orange.png
share/hedgewars/Data/Graphics/Hats/pikachu.png
share/hedgewars/Data/Graphics/Hats/porkey.png
share/hedgewars/Data/Graphics/Hats/sheep.png
share/hedgewars/Data/Graphics/Hats/slowpoke.png
share/hedgewars/Data/Graphics/Hats/spidey.png
share/hedgewars/Data/Graphics/Hats/squirtle.png
share/hedgewars/Data/Graphics/Hats/stormtrooper.png
share/hedgewars/Data/Graphics/Hats/venom.png
share/hedgewars/Data/Graphics/Hats/voltorb.png
share/hedgewars/Data/Scripts/Multiplayer/GaudyRacer.cfg
share/hedgewars/Data/Scripts/Multiplayer/GaudyRacer.lua
--- a/CMakeLists.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/CMakeLists.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -194,6 +194,7 @@
 
 if(NOT BUILD_ENGINE_LIBRARY)
 	add_subdirectory(bin)
+	add_subdirectory(misc/quazip)
 	add_subdirectory(QTfrontend)
 	add_subdirectory(share)
 	add_subdirectory(tools)
--- a/ChangeLog.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/ChangeLog.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -2,11 +2,16 @@
 * bugfixes
 
 0.9.15 -> ???:
- + New modes: The Specialists, Space Invasion
+ + New gameplay modes/styles: Racer, The Specialists, Tumbler, Space Invasion
  + Installing content (anything under Data/ - maps, sounds, and any such stuff) to user profile allows custom adding/overriding of any Data/ content
  + Sudden Death art
  + New Weapon/Utility: Land Spray Gun
+ + New Utility: Time Box
  + New Game mode: Tag team
+ + New Game option for map bottom border
+ + New Theme: Golf
+ + Many new hats
+ + Get away time modifier (in %)
  + Allow up to 8 teams in a game
  + Shoppa scheme by default resets ammo
  + Shots are on a tenth of a second delay instead of a 1 and a quarter second delay (fast deagle/portal fire)
@@ -22,9 +27,12 @@
  + Indicator for height of plane when using napalm
  + Land smoothing (looks less pixelated on generation and damage)
  + Improved lua script support (e.g. possibility to change hats)
+ + The names of the ShoppaKingTournament winners are now written on the Trophies in the ShoppaKing and TrophyRace maps!
+ + Allow window resizes during game.
  * Prevent portaling to impossible locations better
  * Snow accumulates more smoothly
  * Rope should be less sticky now
+ * Rope shouldn't be able to get Hogs stuck on walls anymore
  * Fix for last portal shot always being yellow
  * More accurate napalm strike drop location
  * AI fixes
--- a/QTfrontend/CMakeLists.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/CMakeLists.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -4,7 +4,6 @@
 set(QT_USE_QTCORE TRUE)
 set(QT_USE_QTGUI TRUE)
 set(QT_USE_QTNETWORK TRUE)
-set(QT_USE_QTWEBKIT TRUE)
 set(QT_USE_QTSVG FALSE)
 set(QT_USE_QTXML FALSE)
 set(QT_USE_QTOPENGL FALSE)
@@ -13,6 +12,16 @@
 find_package(Qt4 REQUIRED)
 include(${QT_USE_FILE})
 
+# Check if we need zlib
+check_library_exists(${QT_QTCORE_LIBRARY} inflateInit2_ ${QT_LIBRARY_DIR} QT_PROVIDES_ZLIB_FUNCTIONS)
+
+if(NOT QT_PROVIDES_ZLIB_FUNCTIONS)
+    find_package(ZLIB REQUIRED)
+
+    set(HW_LINK_LIBS ${ZLIB_LIBRARIES} ${HW_LINK_LIBS})
+endif()
+
+
 # Configure for SDL
 find_package(SDL REQUIRED)
 find_package(SDL_mixer REQUIRED)
@@ -20,6 +29,7 @@
 include_directories(.)
 include_directories(${SDL_INCLUDE_DIR})
 include_directories(${SDLMIXER_INCLUDE_DIR})
+include_directories(${CMAKE_SOURCE_DIR}/misc/quazip)
 if(UNIX)
     # HACK: in freebsd cannot find iconv.h included via SDL.h
     include_directories("/usr/local/include")
@@ -115,6 +125,7 @@
     drawmapwidget.cpp
     drawmapscene.cpp
     themesmodel.cpp
+    databrowser.cpp
     )
 
 #xfire integration
@@ -196,6 +207,7 @@
     drawmapwidget.h
     drawmapscene.h
     themesmodel.h
+    databrowser.h
     )
 
 set(hwfr_hdrs
@@ -214,7 +226,7 @@
 
 if(APPLE)
     set(hwfr_src ${hwfr_src} InstallController.cpp CocoaInitializer.mm M3Panel.mm M3InstallController.m NSWorkspace_RBAdditions.m)
-    set(HW_LINK_LIBS IOKit)
+    set(HW_LINK_LIBS IOKit ${HW_LINK_LIBS})
 
     if(NOT NOAUTOUPDATE)
         find_package(Sparkle)
@@ -236,6 +248,7 @@
 
 
 set(HW_LINK_LIBS
+    quazip
     ${QT_LIBRARIES}
     ${SDL_LIBRARY}
     ${SDLMIXER_LIBRARY}
@@ -247,7 +260,7 @@
         set(HW_LINK_LIBS ${HW_LINK_LIBS} SDL)
     endif()
 
-    set(	HW_LINK_LIBS
+    set(HW_LINK_LIBS
         ${HW_LINK_LIBS}
         ole32
         oleaut32
@@ -257,7 +270,7 @@
 endif()
 
 
-target_link_libraries(hedgewars	${HW_LINK_LIBS})
+target_link_libraries(hedgewars ${HW_LINK_LIBS})
 
 
 install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/hedgewars${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION ${target_dir})
--- a/QTfrontend/SDLs.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/SDLs.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -104,11 +104,11 @@
 
             // Entry for "Axis Up"
             sprintf(sdlkeys[i][0], "j%da%du", jid, aid);
-            sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2])) : axis + HWApplication::translate("binds (keys)", "(Up)")).toStdString().c_str());
+            sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2])) : axis + HWApplication::translate("binds (keys)", "(Up)")).toUtf8().constData());
 
             // Entry for "Axis Down"
             sprintf(sdlkeys[i][0], "j%da%dd", jid, aid);
-            sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2 + 1])) : axis + HWApplication::translate("binds (keys)", "(Down)")).toStdString().c_str());
+            sprintf(sdlkeys[i++][1], "%s", ((isxb && aid < 5) ? (prefix + HWApplication::translate("binds (keys)", xbox360axes[aid * 2 + 1])) : axis + HWApplication::translate("binds (keys)", "(Down)")).toUtf8().constData());
         }
 
         // Register entries for all coolie hats of this joystick/gamepad
@@ -119,19 +119,19 @@
 
             // Entry for "Hat Up"
             sprintf(sdlkeys[i][0], "j%dh%du", jid, hid);
-            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Up)")).toStdString().c_str());
+            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Up)")).toUtf8().constData());
 
             // Entry for "Hat Down"
             sprintf(sdlkeys[i][0], "j%dh%dd", jid, hid);
-            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Down)")).toStdString().c_str());
+            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Down)")).toUtf8().constData());
 
             // Entry for "Hat Left"
             sprintf(sdlkeys[i][0], "j%dh%dl", jid, hid);
-            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Left)")).toStdString().c_str());
+            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Left)")).toUtf8().constData());
 
             // Entry for "Hat Right"
             sprintf(sdlkeys[i][0], "j%dh%dr", jid, hid);
-            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Right)")).toStdString().c_str());
+            sprintf(sdlkeys[i++][1], "%s", (hat + HWApplication::translate("binds (keys)", "(Right)")).toUtf8().constData());
         }
 
         // Register entries for all buttons of this joystick/gamepad
@@ -139,7 +139,7 @@
         {
             // Buttons
             sprintf(sdlkeys[i][0], "j%db%d", jid, bid);
-            sprintf(sdlkeys[i++][1], "%s", (prefix + ((isxb && bid < 10) ? (HWApplication::translate("binds (keys)", xb360buttons[bid]) + QString(" ")) : HWApplication::translate("binds (keys)", "Button") + QString(" %1").arg(bid + 1))).toStdString().c_str());
+            sprintf(sdlkeys[i++][1], "%s", (prefix + ((isxb && bid < 10) ? (HWApplication::translate("binds (keys)", xb360buttons[bid]) + QString(" ")) : HWApplication::translate("binds (keys)", "Button") + QString(" %1").arg(bid + 1))).toUtf8().constData());
         }
         // Close the game controller as we no longer need it
         SDL_JoystickClose(joy);
--- a/QTfrontend/ammoSchemeModel.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/ammoSchemeModel.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -48,21 +48,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(45)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(5)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(4)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(2)             // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38
-        << QVariant(100)           // get away time  39
+        << 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(4)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
 AmmoSchemeModel::AmmoSchemeModel(QObject* parent, const QString & fileName) :
@@ -111,21 +112,22 @@
         << "disablewind"         // 22
         << "morewind"            // 23
         << "tagteam"             // 24
-        << "damagefactor"        // 25
-        << "turntime"            // 26
-        << "health"              // 27
-        << "suddendeath"         // 28
-        << "caseprobability"     // 29
-        << "minestime"           // 30
-        << "minesnum"            // 31
-        << "minedudpct"          // 32
-        << "explosives"          // 33
-        << "healthprobability"   // 34
-        << "healthcaseamount"    // 35
-        << "waterrise"           // 36
-        << "healthdecrease"      // 37
-        << "ropepct"             // 38
-        << "getawaytime"         // 39
+        << "bottomborder"        // 25
+        << "damagefactor"        // 26
+        << "turntime"            // 27
+        << "health"              // 28
+        << "suddendeath"         // 29
+        << "caseprobability"     // 30
+        << "minestime"           // 31
+        << "minesnum"            // 32
+        << "minedudpct"          // 33
+        << "explosives"          // 34
+        << "healthprobability"   // 35
+        << "healthcaseamount"    // 36
+        << "waterrise"           // 37
+        << "healthdecrease"      // 38
+        << "ropepct"             // 39
+        << "getawaytime"         // 40
         ;
 
     QList<QVariant> proMode;
@@ -155,21 +157,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(15)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(0)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(0)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(2)             // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38 
-        << QVariant(100)           // get away time  39 
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(15)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(0)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(0)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> shoppa;
@@ -199,21 +202,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(30)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(50)            // sudden death   28
-        << QVariant(1)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(0)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(0)             // explosives     33
-        << QVariant(0)             // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38 
-        << QVariant(100)           // get away time  39 
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(50)            // sudden death   29
+        << QVariant(1)             // 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)             // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> cleanslate;
@@ -243,21 +247,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(45)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(5)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(4)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(2)             // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38  
-        << QVariant(100)           // get away time  39 
+        << 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(4)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> minefield;
@@ -287,21 +292,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(30)            // turn time      26
-        << QVariant(50)            // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(0)             // case prob      29
-        << QVariant(0)             // mines time     30
-        << QVariant(80)            // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(0)             // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38   
-        << QVariant(100)           // get away time  39 
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(50)            // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(0)             // case prob      30
+        << QVariant(0)             // mines time     31
+        << QVariant(80)            // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(0)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> barrelmayhem;
@@ -331,21 +337,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(30)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(0)             // case prob      29
-        << QVariant(0)             // mines time     30
-        << QVariant(0)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(80)            // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38    
-        << QVariant(100)           // get away time  39 
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(0)             // case prob      30
+        << QVariant(0)             // mines time     31
+        << QVariant(0)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(80)            // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> tunnelhogs;
@@ -375,21 +382,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(30)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(5)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(10)            // mines number   31
-        << QVariant(10)            // mine dud pct   32
-        << QVariant(10)            // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38     
-        << QVariant(100)           // get away time  39 
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(10)            // mines number   32
+        << QVariant(10)            // mine dud pct   33
+        << QVariant(10)            // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> forts;
@@ -419,21 +427,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(45)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(5)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(0)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(0)             // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38      
-        << QVariant(100)           // get away time  39 
+        << 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(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> timeless;
@@ -463,21 +472,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(9999)          // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(5)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(5)             // mines number   31
-        << QVariant(10)            // mine dud pct   32
-        << QVariant(2)             // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(30)            // health case amt 35
-        << QVariant(0)             // water rise amt 36
-        << QVariant(0)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38 
-        << QVariant(100)           // get away time  39 
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(9999)          // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(5)             // mines number   32
+        << QVariant(10)            // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(30)            // health case amt 36
+        << QVariant(0)             // water rise amt 37
+        << QVariant(0)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> thinkingportals;
@@ -507,21 +517,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(45)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(2)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(5)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(5)             // explosives     33
-        << QVariant(25)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38  
-        << QVariant(100)           // get away time  39 
+        << 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(2)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(5)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(5)             // explosives     34
+        << QVariant(25)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
     QList<QVariant> kingmode;
@@ -551,21 +562,22 @@
         << QVariant(false)         // no wind        22
         << QVariant(false)         // more wind      23
         << QVariant(false)         // tag team       24
-        << QVariant(100)           // damage modfier 25
-        << QVariant(45)            // turn time      26
-        << QVariant(100)           // init health    27
-        << QVariant(15)            // sudden death   28
-        << QVariant(5)             // case prob      29
-        << QVariant(3)             // mines time     30
-        << QVariant(4)             // mines number   31
-        << QVariant(0)             // mine dud pct   32
-        << QVariant(2)             // explosives     33
-        << QVariant(35)            // health case pct 34
-        << QVariant(25)            // health case amt 35
-        << QVariant(47)            // water rise amt 36
-        << QVariant(5)             // health dec amt 37
-        << QVariant(100)           // rope modfier   38 
-        << QVariant(100)           // get away time  39 
+        << 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(4)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
         ;
 
 
@@ -771,4 +783,4 @@
         netScheme[i] = QVariant(cfg[i]);
 
     reset();
-}                      
+}
--- a/QTfrontend/binds.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/binds.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -62,9 +62,7 @@
     {"confirm", "y",    QT_TRANSLATE_NOOP("binds", "confirmation"), NULL, NULL},
     {"+voldown",    "9",    QT_TRANSLATE_NOOP("binds", "volume down"),  NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Modify the game's volume while playing:")},
     {"+volup",  "0",    QT_TRANSLATE_NOOP("binds", "volume up"),    NULL, NULL},
-#ifndef _WIN32
     {"fullscr", "f12",  QT_TRANSLATE_NOOP("binds", "change mode"),  NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle fullscreen mode:")},
-#endif
     {"capture", "c",    QT_TRANSLATE_NOOP("binds", "capture"),  NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Take a screenshot:")},
     {"rotmask", "delete",   QT_TRANSLATE_NOOP("binds", "hedgehogs\ninfo"),  NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle labels above hedgehogs:")}
 };
--- a/QTfrontend/binds.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/binds.h	Wed Sep 14 22:39:39 2011 +0200
@@ -21,11 +21,7 @@
 
 #include <QString>
 
-#ifdef _WIN32
-#define BINDS_NUMBER 43
-#else
 #define BINDS_NUMBER 44
-#endif
 
 struct BindAction
 {
--- a/QTfrontend/chatwidget.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/chatwidget.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -233,7 +233,7 @@
 void HWChatWidget::loadList(QStringList & list, const QString & file)
 {
     list.clear();
-    QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
+    QFile txt(cfgdir->absolutePath() + "/" + file);
     if(!txt.open(QIODevice::ReadOnly))
         return;
     QTextStream stream(&txt);
@@ -253,7 +253,7 @@
 
 void HWChatWidget::saveList(QStringList & list, const QString & file)
 {
-    QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
+    QFile txt(cfgdir->absolutePath() + "/" + file);
     if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate))
         return;
     QTextStream stream(&txt);
@@ -400,9 +400,8 @@
 
 void HWChatWidget::nickRemoved(const QString& nick)
 {
-    QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
-    QListIterator<QListWidgetItem *> it(items);
-    while(it.hasNext()) chatNicks->takeItem(chatNicks->row(it.next()));
+    foreach(QListWidgetItem * item, chatNicks->findItems(nick, Qt::MatchExactly))
+        chatNicks->takeItem(chatNicks->row(item));
 
     emit nickCountUpdate(chatNicks->count());
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/databrowser.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,57 @@
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QDebug>
+#include <QUrl>
+
+#include "databrowser.h"
+
+const QNetworkRequest::Attribute typeAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 1);
+const QNetworkRequest::Attribute urlAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 2);
+
+DataBrowser::DataBrowser(QWidget *parent) :
+    QTextBrowser(parent)
+{
+
+    manager = new QNetworkAccessManager(this);
+}
+
+QVariant DataBrowser::loadResource(int type, const QUrl & name)
+{
+    if(type == QTextDocument::ImageResource || type == QTextDocument::StyleSheetResource)
+    {
+        if(resources.contains(name.toString()))
+        {
+            return resources.take(name.toString());
+        }
+        else
+            if(!requestedResources.contains(name.toString()))
+            {
+                qDebug() << "Requesting resource" << name.toString();
+                requestedResources.insert(name.toString());
+
+                QNetworkRequest newRequest(QUrl("http://www.hedgewars.org" + name.toString()));
+                newRequest.setAttribute(typeAttribute, type);
+                newRequest.setAttribute(urlAttribute, name);
+
+                QNetworkReply *reply = manager->get(newRequest);
+                connect(reply, SIGNAL(finished()), this, SLOT(resourceDownloaded()));
+            }
+    }
+
+    return QVariant();
+}
+
+void DataBrowser::resourceDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        int type = reply->request().attribute(typeAttribute).toInt();
+        QUrl url = reply->request().attribute(urlAttribute).toUrl();
+        resources.insert(url.toString(), reply->readAll());
+        document()->addResource(type, reply->request().url(), QVariant());
+        update();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/databrowser.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,33 @@
+#ifndef DATABROWSER_H
+#define DATABROWSER_H
+
+#include <QTextBrowser>
+#include <QSet>
+
+class QNetworkAccessManager;
+
+class DataBrowser : public QTextBrowser
+{
+    Q_OBJECT
+public:
+    explicit DataBrowser(QWidget *parent = 0);
+
+signals:
+
+public slots:
+
+private:
+    QNetworkAccessManager *manager;
+    
+    // hash and set of QString instead of QUrl to support Qt versions 
+    // older than 4.7 (those have no support for qHash(const QUrl &))
+    QHash<QString, QByteArray> resources;
+    QSet<QString> requestedResources;
+
+    QVariant loadResource(int type, const QUrl & name);
+
+private slots:
+    void resourceDownloaded();
+};
+
+#endif // DATABROWSER_H
--- a/QTfrontend/drawmapscene.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/drawmapscene.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -108,11 +108,32 @@
 
         emit pathChanged();
     }
+    else if(oldItems.size())
+    {
+        while(oldItems.size())
+            addItem(oldItems.takeFirst());
+        paths = oldPaths;
+
+        emit pathChanged();
+    }
 }
 
 void DrawMapScene::clearMap()
 {
-    clear();
+    // don't clear if already cleared
+    if(!items().size())
+        return;
+
+    oldItems.clear();
+
+    // do this since clear() would _destroy_ all items
+    while(items().size()) {
+        oldItems.push_front(items().first());
+        removeItem(items().first());
+    }
+
+    oldPaths = paths;
+
     paths.clear();
 
     emit pathChanged();
@@ -146,6 +167,8 @@
 
 void DrawMapScene::decode(QByteArray data)
 {
+    oldItems.clear();
+    oldPaths.clear();
     clear();
     paths.clear();
 
--- a/QTfrontend/drawmapscene.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/drawmapscene.h	Wed Sep 14 22:39:39 2011 +0200
@@ -48,6 +48,8 @@
     QBrush m_brush;
     QGraphicsPathItem  * m_currPath;
     Paths paths;
+    Paths oldPaths;
+    QList<QGraphicsItem *> oldItems;
 
     virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent);
     virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent);
--- a/QTfrontend/game.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/game.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -53,7 +53,14 @@
 void HWGame::onClientDisconnect()
 {
     switch (gameType) {
-        case gtDemo: break;
+        case gtSave:
+            if (gameState == gsInterrupted || gameState == gsHalted)
+                emit HaveRecord(false, demo);
+            else if (gameState == gsFinished)
+                 emit HaveRecord(true, demo);
+            break;
+        case gtDemo:
+            break;
         case gtNet:
             emit HaveRecord(true, demo);
             break;
@@ -84,8 +91,7 @@
 
     if (m_pTeamSelWidget)
     {
-        QListIterator<HWTeam> it(m_pTeamSelWidget->getPlayingTeams());
-        while(it.hasNext())
+        foreach(HWTeam team, m_pTeamSelWidget->getPlayingTeams())
         {
             HWProto::addStringToBuffer(buf, QString("eammloadt %1").arg(ammostr.mid(0, cAmmoNumber)));
             HWProto::addStringToBuffer(buf, QString("eammprob %1").arg(ammostr.mid(cAmmoNumber, cAmmoNumber)));
@@ -93,7 +99,7 @@
             HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber)));
             if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore"));
             HWProto::addStringListToBuffer(buf,
-                it.next().TeamGameConfig(gamecfg->getInitHealth()));
+                team.TeamGameConfig(gamecfg->getInitHealth()));
             ;
         }
     }
@@ -187,6 +193,7 @@
                     SendQuickConfig();
                     break;
                 }
+                case gtSave:
                 case gtDemo: break;
                 case gtNet: {
                     SendNetConfig();
@@ -320,9 +327,9 @@
     TeamCount++;
 }
 
-void HWGame::PlayDemo(const QString & demofilename)
+void HWGame::PlayDemo(const QString & demofilename, bool isSave)
 {
-    gameType = gtDemo;
+    gameType = isSave ? gtSave : gtDemo;
     QFile demofile(demofilename);
     if (!demofile.open(QIODevice::ReadOnly))
     {
@@ -392,9 +399,8 @@
     if (m_pTeamSelWidget)
     {
         QByteArray buf;
-        QListIterator<HWTeam> it(m_pTeamSelWidget->getPlayingTeams());
-        while(it.hasNext())
-            HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(it.next().TeamName));
+        foreach(HWTeam team, m_pTeamSelWidget->getPlayingTeams())
+            HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(team.TeamName));
         RawSendIPC(buf);
     }
 }
--- a/QTfrontend/game.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/game.h	Wed Sep 14 22:39:39 2011 +0200
@@ -48,7 +48,7 @@
     HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget = 0);
     virtual ~HWGame();
     void AddTeam(const QString & team);
-    void PlayDemo(const QString & demofilename);
+    void PlayDemo(const QString & demofilename, bool isSave);
     void StartLocal();
     void StartQuick();
     void StartNet();
@@ -84,6 +84,7 @@
         gtNet      = 4,
         gtTraining = 5,
         gtCampaign = 6,
+        gtSave     = 7,
     };
     char msgbuf[MAXMSGCHARS];
     QString teams[5];
--- a/QTfrontend/gamecfgwidget.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/gamecfgwidget.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -215,13 +215,15 @@
         result |= 0x01000000;       // more wind
     if (schemeData(24).toBool())
         result |= 0x02000000;       // tag team
+    if (schemeData(25).toBool())
+        result |= 0x04000000;       // bottom border
 
     return result;
 }
 
 quint32 GameCFGWidget::getInitHealth() const
 {
-    return schemeData(27).toInt();
+    return schemeData(28).toInt();
 }
 
 QByteArray GameCFGWidget::getFullConfig() const
@@ -245,20 +247,20 @@
 
     bcfg << QString("eseed " + pMapContainer->getCurrentSeed()).toUtf8();
     bcfg << QString("e$gmflags %1").arg(getGameFlags()).toUtf8();
-    bcfg << QString("e$damagepct %1").arg(schemeData(25).toInt()).toUtf8();
-    bcfg << QString("e$turntime %1").arg(schemeData(26).toInt() * 1000).toUtf8();
-    bcfg << QString("e$sd_turns %1").arg(schemeData(28).toInt()).toUtf8();
-    bcfg << QString("e$casefreq %1").arg(schemeData(29).toInt()).toUtf8();
-    bcfg << QString("e$minestime %1").arg(schemeData(30).toInt() * 1000).toUtf8();
-    bcfg << QString("e$minesnum %1").arg(schemeData(31).toInt()).toUtf8();
-    bcfg << QString("e$minedudpct %1").arg(schemeData(32).toInt()).toUtf8();
-    bcfg << QString("e$explosives %1").arg(schemeData(33).toInt()).toUtf8();
-    bcfg << QString("e$healthprob %1").arg(schemeData(34).toInt()).toUtf8();
-    bcfg << QString("e$hcaseamount %1").arg(schemeData(35).toInt()).toUtf8();
-    bcfg << QString("e$waterrise %1").arg(schemeData(36).toInt()).toUtf8();
-    bcfg << QString("e$healthdec %1").arg(schemeData(37).toInt()).toUtf8();
-    bcfg << QString("e$ropepct %1").arg(schemeData(38).toInt()).toUtf8();
-    bcfg << QString("e$getawaytime %1").arg(schemeData(39).toInt()).toUtf8();
+    bcfg << QString("e$damagepct %1").arg(schemeData(26).toInt()).toUtf8();
+    bcfg << QString("e$turntime %1").arg(schemeData(27).toInt() * 1000).toUtf8();
+    bcfg << QString("e$sd_turns %1").arg(schemeData(29).toInt()).toUtf8();
+    bcfg << QString("e$casefreq %1").arg(schemeData(30).toInt()).toUtf8();
+    bcfg << QString("e$minestime %1").arg(schemeData(31).toInt() * 1000).toUtf8();
+    bcfg << QString("e$minesnum %1").arg(schemeData(32).toInt()).toUtf8();
+    bcfg << QString("e$minedudpct %1").arg(schemeData(33).toInt()).toUtf8();
+    bcfg << QString("e$explosives %1").arg(schemeData(34).toInt()).toUtf8();
+    bcfg << QString("e$healthprob %1").arg(schemeData(35).toInt()).toUtf8();
+    bcfg << QString("e$hcaseamount %1").arg(schemeData(36).toInt()).toUtf8();
+    bcfg << QString("e$waterrise %1").arg(schemeData(37).toInt()).toUtf8();
+    bcfg << QString("e$healthdec %1").arg(schemeData(38).toInt()).toUtf8();
+    bcfg << QString("e$ropepct %1").arg(schemeData(39).toInt()).toUtf8();
+    bcfg << QString("e$getawaytime %1").arg(schemeData(40).toInt()).toUtf8();
     bcfg << QString("e$template_filter %1").arg(pMapContainer->getTemplateFilter()).toUtf8();
     bcfg << QString("e$mapgen %1").arg(mapgen).toUtf8();
 
--- a/QTfrontend/hedgewars.qrc	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hedgewars.qrc	Wed Sep 14 22:39:39 2011 +0200
@@ -81,6 +81,7 @@
         <file>res/btnNoWind.png</file>
         <file>res/btnMoreWind.png</file>
         <file>res/btnTagTeam.png</file>
+        <file>res/btnBottomBorder.png</file>
         <file>res/iconBox.png</file>
         <file>res/iconHealth.png</file>
         <file>res/iconSuddenDeath.png</file>
--- a/QTfrontend/hwconsts.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hwconsts.h	Wed Sep 14 22:39:39 2011 +0200
@@ -74,9 +74,9 @@
 #define AMMOLINE_PROMODE_CRATE  "111111111111111111111111111111111111111110010111111101"
 
 #define AMMOLINE_SHOPPA_QT      "000000990000000000000000000000000000000000000000000000"
-#define AMMOLINE_SHOPPA_PROB    "444441004424440221011212122242200000000200040001001101"
+#define AMMOLINE_SHOPPA_PROB    "444441004424440221011212122242200000000200040001001100"
 #define AMMOLINE_SHOPPA_DELAY   "000000000000000000000000000000000000000000000000000000"
-#define AMMOLINE_SHOPPA_CRATE   "111111111111111111111111111111111111111110110111111101"
+#define AMMOLINE_SHOPPA_CRATE   "111111111111111111111111111111111111111110110111111100"
 
 #define AMMOLINE_CLEAN_QT       "101000900001000001100000000000000000000000000000100000"
 #define AMMOLINE_CLEAN_PROB     "040504054160065554655446477657666666615551010111541101"
--- a/QTfrontend/hwform.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hwform.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -38,6 +38,7 @@
 #include <QSignalMapper>
 #include <QShortcut>
 #include <QDesktopServices>
+#include <QInputDialog>
 
 #include "hwform.h"
 #include "game.h"
@@ -92,7 +93,7 @@
 bool frontendEffects = true;
 QString playerHash;
 
-HWForm::HWForm(QWidget *parent)
+HWForm::HWForm(QWidget *parent, QString styleSheet)
   : QMainWindow(parent), pnetserver(0), pRegisterServer(0), editedTeam(0), hwnet(0)
 {
 #ifdef USE_XFIRE
@@ -103,6 +104,7 @@
     frontendEffects = gameSettings->value("frontend/effects", true).toBool();
     playerHash = QString(QCryptographicHash::hash(gameSettings->value("net/nick","").toString().toLatin1(), QCryptographicHash::Md5).toHex());
 
+    this->setStyleSheet(styleSheet);
     ui.setupUi(this);
     setMinimumSize(760, 580);
     //setFocusPolicy(Qt::StrongFocus);
@@ -151,12 +153,17 @@
     
     connect(ui.pageMain->BtnNet, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
     pageSwitchMapper->setMapping(ui.pageMain->BtnNet, ID_PAGE_NETTYPE);
+
     connect(ui.pageMain->BtnInfo, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
-    pageSwitchMapper->setMapping(ui.pageMain->BtnInfo, ID_PAGE_DATADOWNLOAD);
+    pageSwitchMapper->setMapping(ui.pageMain->BtnInfo, ID_PAGE_INFO);
+
+    connect(ui.pageMain->BtnDataDownload, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
+    pageSwitchMapper->setMapping(ui.pageMain->BtnDataDownload, ID_PAGE_DATADOWNLOAD);
 
     connect(ui.pageMain->BtnExit, SIGNAL(pressed()), this, SLOT(btnExitPressed()));
     connect(ui.pageMain->BtnExit, SIGNAL(clicked()), this, SLOT(btnExitClicked()));
 
+    connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
     connect(ui.pageDataDownload->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
 
     connect(ui.pageEditTeam->BtnTeamSave, SIGNAL(clicked()), this, SLOT(TeamSave()));
@@ -223,6 +230,7 @@
     connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
 
     connect(ui.pageGameStats->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
+    connect(ui.pageGameStats, SIGNAL(saveDemoRequested()), this, SLOT(saveDemoWithCustomName()));
 
     connect(ui.pageSinglePlayer->BtnSimpleGamePage, SIGNAL(clicked()), this, SLOT(SimpleGame()));
     connect(ui.pageSinglePlayer->BtnTrainPage, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
@@ -619,8 +627,9 @@
     }
 
     QStringList tmnames;
-    QListIterator<HWTeam> it(curTeamSelWidget->getDontPlayingTeams());
-    while(it.hasNext()) tmnames += it.next().TeamName;
+
+    foreach(HWTeam team, curTeamSelWidget->getNotPlayingTeams())
+        tmnames += team.TeamName;
 
     //UpdateTeamsLists(&tmnames); // FIXME: still need more work if teamname is updated while configuring
     UpdateTeamsLists();
@@ -722,7 +731,7 @@
         return;
     }
     CreateGame(0, 0, 0);
-    game->PlayDemo(curritem->data(Qt::UserRole).toString());
+    game->PlayDemo(curritem->data(Qt::UserRole).toString(), ui.pagePlayDemo->isSave());
 }
 
 void HWForm::PlayDemoQuick(const QString & demofilename)
@@ -731,7 +740,7 @@
     GoBack(); //needed to cleanly disconnect from netgame
     GoToPage(ID_PAGE_MAIN);
     CreateGame(0, 0, 0);
-    game->PlayDemo(demofilename);
+    game->PlayDemo(demofilename, false);
 }
 
 void HWForm::NetConnectServer(const QString & host, quint16 port)
@@ -1033,6 +1042,7 @@
     connect(game, SIGNAL(GameStats(char, const QString &)), ui.pageGameStats, SLOT(GameStats(char, const QString &)));
     connect(game, SIGNAL(ErrorMessage(const QString &)), this, SLOT(ShowErrorMessage(const QString &)), Qt::QueuedConnection);
     connect(game, SIGNAL(HaveRecord(bool, const QByteArray &)), this, SLOT(GetRecord(bool, const QByteArray &)));
+    m_lastDemo = QByteArray();
 }
 
 void HWForm::ShowErrorMessage(const QString & msg)
@@ -1061,6 +1071,7 @@
         demo.replace(QByteArray("\x02TN"), QByteArray("\x02TD"));
         demo.replace(QByteArray("\x02TS"), QByteArray("\x02TD"));
         filename = cfgdir->absolutePath() + "/Demos/" + recordFileName + "." + *cProtoVer + ".hwd";
+        m_lastDemo = demo;
     } else
     {
         demo.replace(QByteArray("\x02TL"), QByteArray("\x02TS"));
@@ -1075,7 +1086,7 @@
         ShowErrorMessage(tr("Cannot save record to file %1").arg(filename));
         return ;
     }
-    demofile.write(demo.constData(), demo.size());
+    demofile.write(demo);
     demofile.close();
 }
 
@@ -1293,3 +1304,30 @@
     else QMessageBox::information(0, "", QMessageBox::tr("File association failed."));
 }
 
+void HWForm::saveDemoWithCustomName()
+{
+    if(!m_lastDemo.isEmpty())
+    {
+        QString fileName;
+        bool ok = false;
+        do
+        {
+            fileName = QInputDialog::getText(this, tr("Demo name"), tr("Demo name:"));
+            
+            if(!fileName.isEmpty())
+            {
+                QString filePath = cfgdir->absolutePath() + "/Demos/" + fileName + "." + *cProtoVer + ".hwd";
+                QFile demofile(filePath);
+                ok = demofile.open(QIODevice::WriteOnly);
+                if (!ok)
+                    ShowErrorMessage(tr("Cannot save record to file %1").arg(filePath));
+                else
+                {
+                    ok = -1 != demofile.write(m_lastDemo);
+                    demofile.close();
+                }
+            }
+        } while(!fileName.isEmpty() && !ok);
+    }
+}
+
--- a/QTfrontend/hwform.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/hwform.h	Wed Sep 14 22:39:39 2011 +0200
@@ -52,7 +52,7 @@
     Q_OBJECT
 
 public:
-    HWForm(QWidget *parent = 0);
+    HWForm(QWidget *parent = 0, QString styleSheet = "");
     Ui_HWForm ui;
     SDLInteraction sdli;
     GameUIConfig * config;
@@ -117,6 +117,8 @@
     void AsyncNetServerStart();
     void NetLeftRoom();
     void selectFirstNetScheme();
+    
+    void saveDemoWithCustomName();
 
 private:
     void _NetConnect(const QString & hostName, quint16 port, const QString & nick);
@@ -162,6 +164,7 @@
     QTime eggTimer;
     BGWidget * wBackground;
     QSignalMapper * pageSwitchMapper;
+    QByteArray m_lastDemo;
 
 #ifdef __APPLE__
     InstallController * panel;
--- a/QTfrontend/main.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/main.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -96,8 +96,8 @@
 
     Q_INIT_RESOURCE(hedgewars);
 
-    qApp->setStyleSheet
-        (QString(
+    QString styleSheetFromHell =
+        QString(
             "HWForm,QDialog{"
                 "background-image: url(\":/res/Background.png\");"
                 "background-position: bottom center;"
@@ -315,8 +315,7 @@
                 "background-color: #ffcc00;"
                 "width: 8px;"
             "}"
-            )
-        );
+            );
 
     bindir->cd("bin"); // workaround over NSIS installer
 
@@ -470,8 +469,8 @@
         app.installTranslator(&Translator);
     }
 
+#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)
-#ifdef _WIN32
     if(!custom_config)
     {
         QSettings registry_hklm("HKEY_LOCAL_MACHINE", QSettings::NativeFormat);
@@ -484,7 +483,7 @@
     CocoaInitializer initializer;
 #endif
 
-    app.form = new HWForm();
+    app.form = new HWForm(NULL,styleSheetFromHell);
 
     app.form->show();
     return app.exec();
--- a/QTfrontend/mapContainer.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/mapContainer.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -64,8 +64,6 @@
     imageButt->setFlat(true);
     imageButt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);//QSizePolicy::Minimum, QSizePolicy::Minimum);
     mapLayout->addWidget(imageButt, 0, 0, 1, 2);
-    //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomSeed()));
-    //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomTheme()));
     connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomMap()));
 
     chooseMap = new QComboBox(mapWidget);
@@ -293,7 +291,6 @@
         maze_size_label->hide();
         cbMazeSize->hide();
         emit mapChanged("+rnd+");
-        emit mapgenChanged(mapgen);
         emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
         break;
     case MAPGEN_MAZE:
@@ -305,7 +302,6 @@
         maze_size_label->show();
         cbMazeSize->show();
         emit mapChanged("+maze+");
-        emit mapgenChanged(mapgen);
         emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
         break;
     case MAPGEN_DRAWN:
@@ -317,10 +313,10 @@
         maze_size_label->hide();
         cbMazeSize->hide();
         emit mapChanged("+drawn+");
-        emit mapgenChanged(mapgen);
         emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
         break;
     default:
+        mapgen = MAPGEN_MAP;
         updatePreview();
         gbThemes->hide();
         lblFilter->hide();
@@ -329,6 +325,8 @@
         cbMazeSize->hide();
         emit mapChanged(chooseMap->itemData(index).toList()[0].toString());
     }
+
+    emit mapgenChanged(mapgen);
 }
 
 // Should this add text to identify map size?
@@ -447,7 +445,7 @@
 void HWMapContainer::setSeed(const QString & seed)
 {
     intSetSeed(seed);
-    if (chooseMap->currentIndex() < MAPGEN_MAP)
+    if (chooseMap->currentIndex() < MAPGEN_DRAWN)
         updatePreview();
 }
 
@@ -511,15 +509,14 @@
 {
     int i = MAPGEN_MAP + 3 + numMissions + rand() % (chooseMap->count() - MAPGEN_MAP - 3 - numMissions);
     chooseMap->setCurrentIndex(i);
-    setRandomSeed();
+    updatePreview();
 }
 
 void HWMapContainer::setRandomMission()
 {
     int i = MAPGEN_MAP + 2 + rand() % numMissions;
-    qDebug() << i << MAPGEN_MAP << numMissions;
     chooseMap->setCurrentIndex(i);
-    setRandomSeed();
+    updatePreview();
 }
 
 void HWMapContainer::setRandomSeed()
@@ -575,7 +572,10 @@
 void HWMapContainer::intSetMapgen(MapGenerator m)
 {
     mapgen = m;
-    chooseMap->setCurrentIndex(m);
+
+    if(m != MAPGEN_MAP)
+        chooseMap->setCurrentIndex(m);
+
     emit mapgenChanged(m);
 }
 
@@ -644,9 +644,8 @@
         break;
     default:
         QPixmap mapImage;
-        qDebug() << "Map data" << curIndex << chooseMap->currentText() << chooseMap->itemData(curIndex);
         QFile tmpfile;
-        tmpfile.setFileName(cfgdir->absolutePath() + "/Data//Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
+        tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
         if (!tmpfile.exists()) tmpfile.setFileName(datadir->absolutePath() + "/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
         if(!mapImage.load(QFileInfo(tmpfile).absoluteFilePath())) {
             imageButt->setIcon(QIcon());
--- a/QTfrontend/newnetclient.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/newnetclient.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -496,17 +496,6 @@
         emit AskForRunGame();
         return;
     }
-    
-    if (lst[0] == "BYE") {
-        if (lst[1] == "Authentication failed")
-        {
-            // Set the password blank if case the user tries to join and enter his password again
-            config->setValue("net/passwordlength", 0);
-            config->setNetPasswordLength(0);
-        }
-        // return early so the user won't get an unknown error message dialog (the user already gets a server connection is lost one)
-        return;
-    }
 
     if (lst[0] == "ASKPASSWORD") {
         bool ok = false;
@@ -625,6 +614,12 @@
             qWarning("Net: Bad BYE message");
             return;
         }
+        if (lst[1] == "Authentication failed")
+        {
+            // Set the password blank if case the user tries to join and enter his password again
+            config->setValue("net/passwordlength", 0);
+            config->setNetPasswordLength(0);
+        }
         emit showMessage(HWNewNet::tr("Quit reason: ") + lst[1]);
         return;
     }
--- a/QTfrontend/pagedata.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagedata.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -20,10 +20,19 @@
 #include <QPushButton>
 #include <QNetworkAccessManager>
 #include <QNetworkRequest>
+#include <QNetworkReply>
 #include <QFileInfo>
 #include <QFileDialog>
+#include <QDebug>
+#include <QProgressBar>
+#include <QBuffer>
 
 #include "pagedata.h"
+#include "databrowser.h"
+#include "hwconsts.h"
+
+#include "quazip.h"
+#include "quazipfile.h"
 
 PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent)
 {
@@ -32,25 +41,181 @@
     pageLayout->setColumnStretch(1, 1);
     pageLayout->setColumnStretch(2, 1);
 
-    BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true);
+    BtnBack = addButton(":/res/Exit.png", pageLayout, 2, 0, true);
+
+    web = new DataBrowser(this);
+    connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&)));
+    web->setOpenLinks(false);
+    pageLayout->addWidget(web, 0, 0, 1, 3);
+
+    progressBarsLayout = new QVBoxLayout();
+    pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3);
+
+    fetchList();
+}
+
+void PageDataDownload::request(const QUrl &url)
+{
+    QUrl finalUrl;
+    if(url.host().isEmpty())
+        finalUrl = QUrl("http://www.hedgewars.org" + url.path());
+    else
+        finalUrl = url;
+
+    if(url.path().endsWith(".zip"))
+    {
+        qWarning() << "Download Request" << url.toString();
+        QString fileName = QFileInfo(url.toString()).fileName();
+
+        QNetworkRequest newRequest(finalUrl);
+        newRequest.setAttribute(QNetworkRequest::User, fileName);
+
+        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+        QNetworkReply *reply = manager->get(newRequest);
+        connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded()));
+        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
+
+        QProgressBar *progressBar = new QProgressBar(this);
+        progressBarsLayout->addWidget(progressBar);
+        progressBars.insert(reply, progressBar);
+    } else
+    {
+        qWarning() << "Page Request" << url.toString();
+
+        QNetworkRequest newRequest(finalUrl);
 
-    web = new QWebView(this);
-    connect(web, SIGNAL(linkClicked(const QUrl&)), this, SLOT(install(const QUrl&)));
-    web->load(QUrl("http://m8y.org/hw/downloads/"));
-    web->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
-    pageLayout->addWidget(web, 0, 0, 1, 3);
+        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+        QNetworkReply *reply = manager->get(newRequest);
+        connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded()));
+    }
+}
+
+
+void PageDataDownload::pageDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QString html = QString::fromUtf8(reply->readAll());
+        int begin = html.indexOf("<!-- BEGIN -->");
+        int end = html.indexOf("<!-- END -->");
+        if(begin != -1 && begin < end)
+        {
+            html.truncate(end);
+            html.remove(0, begin);
+        }
+        web->setHtml(html);
+    }
+}
+
+void PageDataDownload::fileDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QByteArray fileContents = reply->readAll();
+        QProgressBar *progressBar = progressBars.value(reply, 0);
+
+        if(progressBar)
+        {
+            progressBars.remove(reply);
+            progressBar->deleteLater();
+        }
+
+        extractDataPack(&fileContents);
+    }
 }
 
-void PageDataDownload::install(const QUrl &url)
+void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal)
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QProgressBar *progressBar = progressBars.value(reply, 0);
+
+        if(progressBar)
+        {
+            progressBar->setValue(bytesRecieved);
+            progressBar->setMaximum(bytesTotal);
+        }
+    }
+}
+
+void PageDataDownload::fetchList()
 {
-qWarning("Download Request");
-QString fileName = QFileInfo(url.toString()).fileName();
+    request(QUrl("http://hedgewars.org/content.html"));
+}
+
+bool PageDataDownload::extractDataPack(QByteArray * buf)
+{
+    QBuffer buffer;
+    buffer.setBuffer(buf);
+
+    QuaZip zip;
+    zip.setIoDevice(&buffer);
+    if(!zip.open(QuaZip::mdUnzip))
+    {
+      qWarning("testRead(): zip.open(): %d", zip.getZipError());
+      return false;
+    }
+
+    QuaZipFile file(&zip);
+
+    QDir extractDir(*cfgdir);
+    extractDir.cd("Data");
 
-QNetworkRequest newRequest(url);
-newRequest.setAttribute(QNetworkRequest::User, fileName);
+    for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile())
+    {
+        if(!file.open(QIODevice::ReadOnly))
+        {
+            qWarning("file.open(): %d", file.getZipError());
+            return false;
+        }
+
+
+        QString fileName = file.getActualFileName();
+        QString filePath = extractDir.filePath(fileName);
+        if (fileName.endsWith("/"))
+        {
+            QFileInfo fi(filePath);
+            QDir().mkpath(fi.filePath());
+        } else
+        {
+            qDebug() << "Extracting" << filePath;
+            QFile out(filePath);
+            if(!out.open(QFile::WriteOnly))
+            {
+                qWarning() << "out.open():" << out.errorString();
+                return false;
+            }
 
-QNetworkAccessManager *manager = new QNetworkAccessManager(this);
-QNetworkReply *reply = manager->get(newRequest);
-//connect( reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)) );
-//connect( reply, SIGNAL(finished()), this, SLOT(downloadIssueFinished()));
+            out.write(file.readAll());
+
+            out.close();
+
+            if(file.getZipError() != UNZ_OK) {
+                qWarning("file.getFileName(): %d", file.getZipError());
+                return false;
+            }
+
+            if(!file.atEnd()) {
+                qWarning("read all but not EOF");
+                return false;
+            }
+        }
+
+        file.close();
+
+        if(file.getZipError()!=UNZ_OK) {
+            qWarning("file.close(): %d", file.getZipError());
+            return false;
+        }
+    }
+
+    zip.close();
+
+    return true;
 }
--- a/QTfrontend/pagedata.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagedata.h	Wed Sep 14 22:39:39 2011 +0200
@@ -18,10 +18,15 @@
 
 #ifndef PAGE_DATA_H
 #define PAGE_DATA_H
-#include <QWebView>
+
 #include <QUrl>
 #include "AbstractPage.h"
 
+class DataBrowser;
+class QProgressBar;
+class QNetworkReply;
+class QVBoxLayout;
+
 class PageDataDownload : public AbstractPage
 {
     Q_OBJECT
@@ -30,10 +35,23 @@
     PageDataDownload(QWidget* parent = 0);
 
     QPushButton *BtnBack;
-    QWebView *web;
+
+public slots:
+    void fetchList();
+
+private:
+    DataBrowser *web;
+    QHash<QNetworkReply*, QProgressBar *> progressBars;
+    QVBoxLayout *progressBarsLayout;
+
+    bool extractDataPack(QByteArray * buf);
 
 private slots:
-    void install(const QUrl &url);
+    void request(const QUrl &url);
+
+    void pageDownloaded();
+    void fileDownloaded();
+    void downloadProgress(qint64, qint64);
 };
 
 #endif
--- a/QTfrontend/pagedrawmap.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagedrawmap.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -45,7 +45,7 @@
 
 void PageDrawMap::load()
 {
-    QString fileName = QFileDialog::getOpenFileName(this, tr("Load drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*.*)"));
+    QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*)"));
 
     if(!fileName.isEmpty())
         drawMapWidget->load(fileName);
@@ -53,7 +53,7 @@
 
 void PageDrawMap::save()
 {
-    QString fileName = QFileDialog::getSaveFileName(this, tr("Save drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*.*)"));
+    QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*)"));
 
     if(!fileName.isEmpty())
         drawMapWidget->save(fileName);
--- a/QTfrontend/pageeditteam.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageeditteam.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -358,10 +358,8 @@
     mySdli->SDLMusicInit();
     
     tmpdir.cd(cfgdir->absolutePath());
-    tmpdir.cd("Data/Sounds/voices");
-    tmpdir.cd(CBVoicepack->currentText());
-    
-    if (!tmpdir.exists()) {
+    if (!tmpdir.cd("Data/Sounds/voices/"+CBVoicepack->currentText()))
+    {
         tmpdir.cd(datadir->absolutePath());
         tmpdir.cd("Sounds/voices");
         tmpdir.cd(CBVoicepack->currentText());
--- a/QTfrontend/pagegamestats.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagegamestats.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -47,6 +47,11 @@
     BtnBack = addButton(":/res/Exit.png", pageLayout, 3, 0, true);
     BtnBack->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
 
+    BtnSave = addButton(":/res/Save.png", pageLayout, 3, 2, true);
+    BtnSave->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    BtnSave->setStyleSheet("QPushButton{margin: 12px 0px 12px 0px;}");
+    connect(BtnSave, SIGNAL(clicked()), this, SIGNAL(saveDemoRequested()));
+
     QGroupBox * gb = new QGroupBox(this);
     QVBoxLayout * gbl = new QVBoxLayout;
 
@@ -62,7 +67,7 @@
     gbl->addWidget(l);
     gbl->addWidget(labelGameStats);
     gb->setLayout(gbl);
-    pageLayout->addWidget(gb, 1, 1);
+    pageLayout->addWidget(gb, 1, 1, 1, 2);
     
     // graph
     graphic = new FitGraphicsView(gb);
--- a/QTfrontend/pagegamestats.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagegamestats.h	Wed Sep 14 22:39:39 2011 +0200
@@ -44,6 +44,7 @@
     PageGameStats(QWidget* parent = 0);
 
     QPushButton *BtnBack;
+    QPushButton *BtnSave;
     QLabel *labelGameStats;
     QLabel *labelGameWin;
     QLabel *labelGameRank;
@@ -53,6 +54,9 @@
     void GameStats(char type, const QString & info);
     void clear();
     void renderStats();
+    
+signals:
+    void saveDemoRequested();
 
 private:
     void AddStatText(const QString & msg);
--- a/QTfrontend/pagemain.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagemain.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -41,6 +41,7 @@
     pageLayout->setRowStretch(2, 0);
     pageLayout->setRowStretch(3, 1);
     pageLayout->setRowStretch(4, 1);
+    pageLayout->setRowStretch(5, 1);
 
     BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true);
     BtnSinglePlayer->setToolTip(tr("Local Game (Play a game on a single computer)"));
@@ -50,6 +51,9 @@
     BtnNet->setToolTip(tr("Network Game (Play a game across a network)"));
     pageLayout->setAlignment(BtnNet, Qt::AlignHCenter);
 
+    BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 4, 0, 1, 4, false);
+    pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter);
+
     mainNote = new QLabel(this);
     mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
     mainNote->setWordWrap(true);
@@ -119,9 +123,9 @@
     else
         mainNote->setText(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!"));
 
-    pageLayout->addWidget(mainNote, 4, 1, 1, 2);
+    pageLayout->addWidget(mainNote, 5, 1, 1, 2);
 
-    BtnSetup = addButton(":/res/Settings.png", pageLayout, 4, 3, true);
+    BtnSetup = addButton(":/res/Settings.png", pageLayout, 5, 3, true);
 
     //BtnInfo = addButton(":/res/About.png", pageLayout, 3, 1, 1, 2, true);
     BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
@@ -129,7 +133,7 @@
     pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
     //pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
 
-    BtnExit = addButton(":/res/Exit.png", pageLayout, 4, 0, 1, 1, true);
+    BtnExit = addButton(":/res/Exit.png", pageLayout, 5, 0, 1, 1, true);
     BtnExit->setFixedHeight(BtnSetup->height());
     BtnExit->setStyleSheet("QPushButton{margin-top: 2px;}");
 }
--- a/QTfrontend/pagemain.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagemain.h	Wed Sep 14 22:39:39 2011 +0200
@@ -33,6 +33,7 @@
     QPushButton *BtnSetup;
     QPushButton *BtnInfo;
     QPushButton *BtnExit;
+    QPushButton *BtnDataDownload;
     QLabel *mainNote;
 };
 
--- a/QTfrontend/pageoptions.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageoptions.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -295,11 +295,12 @@
             CBResolution = new QComboBox(AGGroupBox);
             GBAreslayout->addWidget(CBResolution);
             GBAlayout->addLayout(GBAreslayout);
+            connect(CBResolution, SIGNAL(currentIndexChanged(int)), this, SLOT(setResolution(int)));
 
             CBFullscreen = new QCheckBox(AGGroupBox);
             CBFullscreen->setText(QCheckBox::tr("Fullscreen"));
             GBAlayout->addWidget(CBFullscreen);
-            connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(void)));
+            connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(int)));
 
             QLabel * quality = new QLabel(AGGroupBox);
             quality->setText(QLabel::tr("Quality"));
@@ -313,6 +314,8 @@
             SLQuality->setFixedWidth(150);
             GBAqualayout->addWidget(SLQuality);
             GBAlayout->addLayout(GBAqualayout);
+            connect(SLQuality, SIGNAL(valueChanged(int)), this, SLOT(setQuality(int)));
+
             QLabel * stereo = new QLabel(AGGroupBox);
             stereo->setText(QLabel::tr("Stereo rendering"));
             GBAstereolayout->addWidget(stereo);
@@ -402,34 +405,50 @@
     BtnBack->setFixedHeight(BtnSaveOptions->height());
     BtnBack->setFixedWidth(BtnBack->width()+2);
     BtnBack->setStyleSheet("QPushButton{margin: 22px 0 9px 2px;}");
+
+    previousQuality = this->SLQuality->value();
+    previousResolutionIndex = this->CBResolution->currentIndex();
+    previousFullscreenValue = this->CBFullscreen->isChecked();
 }
 
 void PageOptions::forceFullscreen(int index)
 {
+    bool forced = (index == 7 || index == 8 || index == 9);
+
     if (index != 0) {
-        previousFullscreenValue = this->CBFullscreen->isChecked();
-        this->CBFullscreen->setChecked(true);
-        this->CBFullscreen->setEnabled(false);
-        previousQuality = this->SLQuality->value();
         this->SLQuality->setValue(this->SLQuality->maximum());
         this->SLQuality->setEnabled(false);
+        this->CBFullscreen->setEnabled(!forced);
+        this->CBFullscreen->setChecked(forced ? true : previousFullscreenValue);
+        this->CBResolution->setCurrentIndex(forced ? 0 : previousResolutionIndex);
     } else {
-        this->CBFullscreen->setChecked(previousFullscreenValue);
+        this->SLQuality->setEnabled(true);
         this->CBFullscreen->setEnabled(true);
         this->SLQuality->setValue(previousQuality);
-        this->SLQuality->setEnabled(true);
+        this->CBFullscreen->setChecked(previousFullscreenValue);
+        this->CBResolution->setCurrentIndex(previousResolutionIndex);
     }
 }
 
-void PageOptions::setFullscreen(void)
+void PageOptions::setQuality(int value)
+{
+    int index = this->CBStereoMode->currentIndex();
+    if (index == 0)
+        previousQuality = this->SLQuality->value();
+}
+
+void PageOptions::setFullscreen(int state)
 {
-    int tmp = this->CBResolution->currentIndex();
-    if (this->CBFullscreen->isChecked())
-        this->CBResolution->setCurrentIndex(0);
-    else
-        this->CBResolution->setCurrentIndex(previousResolutionIndex);
-    previousResolutionIndex = tmp;
-    this->CBResolution->setEnabled(!this->CBFullscreen->isChecked());
+    int index = this->CBStereoMode->currentIndex();
+    if (index != 7 && index != 8 && index != 9)
+        previousFullscreenValue = this->CBFullscreen->isChecked();
+}
+
+void PageOptions::setResolution(int state)
+{
+    int index = this->CBStereoMode->currentIndex();
+    if (index != 7 && index != 8 && index != 9)
+        previousResolutionIndex = this->CBResolution->currentIndex();
 }
 
 void PageOptions::trimNetNick()
--- a/QTfrontend/pageoptions.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageoptions.h	Wed Sep 14 22:39:39 2011 +0200
@@ -84,7 +84,9 @@
 
 private slots:
     void forceFullscreen(int index);
-    void setFullscreen(void);
+    void setFullscreen(int state);
+    void setResolution(int state);
+    void setQuality(int value);
     void trimNetNick();
 };
 
--- a/QTfrontend/pageplayrecord.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageplayrecord.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -150,3 +150,8 @@
     else
         FillFromDir(recType);
 }
+
+bool PagePlayDemo::isSave()
+{
+    return recType == RT_Save;
+}
--- a/QTfrontend/pageplayrecord.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pageplayrecord.h	Wed Sep 14 22:39:39 2011 +0200
@@ -39,6 +39,7 @@
     PagePlayDemo(QWidget* parent = 0);
 
     void FillFromDir(RecordType rectype);
+    bool isSave();
 
     QPushButton *BtnBack;
     QPushButton *BtnPlayDemo;
--- a/QTfrontend/pagescheme.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagescheme.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -78,7 +78,7 @@
     glGMLayout->addWidget(TBW_solid,0,2,1,1);
 
     TBW_border = new ToggleButtonWidget(gbGameModes, ":/res/btnBorder.png");
-    TBW_border->setToolTip("<b>" + ToggleButtonWidget::tr("Add Border") + "</b>:<br />" + tr("Add an indestructable border around the terrain"));
+    TBW_border->setToolTip("<b>" + ToggleButtonWidget::tr("Add Border") + "</b>:<br />" + tr("Add an indestructible border around the terrain"));
     glGMLayout->addWidget(TBW_border,0,3,1,1);
 
     TBW_lowGravity = new ToggleButtonWidget(gbGameModes, ":/res/btnLowGravity.png");
@@ -161,6 +161,11 @@
     TBW_tagteam->setToolTip("<b>" + ToggleButtonWidget::tr("Tag Team") + "</b>:<br />" + tr("Teams in each clan take successive turns sharing their turn time."));
     glGMLayout->addWidget(TBW_tagteam,4,3,1,1);
 
+    TBW_bottomborder = new ToggleButtonWidget(gbGameModes, ":/res/btnBottomBorder.png");
+    TBW_bottomborder->setToolTip("<b>" + ToggleButtonWidget::tr("Add Bottom Border") + "</b>:<br />" + tr("Add an indestructible border along the bottom"));
+    glGMLayout->addWidget(TBW_bottomborder,4,4,1,1);
+
+
     // Right
     QLabel * l;
 
@@ -430,21 +435,22 @@
     mapper->addMapping(TBW_nowind, 22);
     mapper->addMapping(TBW_morewind, 23);
     mapper->addMapping(TBW_tagteam, 24);
-    mapper->addMapping(SB_DamageModifier, 25);
-    mapper->addMapping(SB_TurnTime, 26);
-    mapper->addMapping(SB_InitHealth, 27);
-    mapper->addMapping(SB_SuddenDeath, 28);
-    mapper->addMapping(SB_CaseProb, 29);
-    mapper->addMapping(SB_MinesTime, 30);
-    mapper->addMapping(SB_Mines, 31);
-    mapper->addMapping(SB_MineDuds, 32);
-    mapper->addMapping(SB_Explosives, 33);
-    mapper->addMapping(SB_HealthCrates, 34);
-    mapper->addMapping(SB_CrateHealth, 35);
-    mapper->addMapping(SB_WaterRise, 36);
-    mapper->addMapping(SB_HealthDecrease, 37);
-    mapper->addMapping(SB_RopeModifier, 38);
-		mapper->addMapping(SB_GetAwayTime, 39);
+    mapper->addMapping(TBW_bottomborder, 25);
+    mapper->addMapping(SB_DamageModifier, 26);
+    mapper->addMapping(SB_TurnTime, 27);
+    mapper->addMapping(SB_InitHealth, 28);
+    mapper->addMapping(SB_SuddenDeath, 29);
+    mapper->addMapping(SB_CaseProb, 30);
+    mapper->addMapping(SB_MinesTime, 31);
+    mapper->addMapping(SB_Mines, 32);
+    mapper->addMapping(SB_MineDuds, 33);
+    mapper->addMapping(SB_Explosives, 34);
+    mapper->addMapping(SB_HealthCrates, 35);
+    mapper->addMapping(SB_CrateHealth, 36);
+    mapper->addMapping(SB_WaterRise, 37);
+    mapper->addMapping(SB_HealthDecrease, 38);
+    mapper->addMapping(SB_RopeModifier, 39);
+	mapper->addMapping(SB_GetAwayTime, 40);
 
     mapper->toFirst();
 }
--- a/QTfrontend/pagescheme.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagescheme.h	Wed Sep 14 22:39:39 2011 +0200
@@ -71,6 +71,7 @@
     ToggleButtonWidget * TBW_nowind;
     ToggleButtonWidget * TBW_morewind;
     ToggleButtonWidget * TBW_tagteam;
+    ToggleButtonWidget * TBW_bottomborder;
 
     QSpinBox * SB_DamageModifier;
     QSpinBox * SB_TurnTime;
Binary file QTfrontend/res/btnBottomBorder.png has changed
Binary file QTfrontend/res/btnTagTeam.png has changed
--- a/QTfrontend/teamselect.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/teamselect.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -44,7 +44,7 @@
                 this, SLOT(proxyTeamColorChanged(const HWTeam&)));
   } else {
     frameDontPlaying->addTeam(team, false);
-    curDontPlayingTeams.push_back(team);
+    m_curNotPlayingTeams.push_back(team);
     if(m_acceptOuter) {
       connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
           this, SLOT(pre_changeTeamStatus(HWTeam)));
@@ -144,14 +144,14 @@
 
 void TeamSelWidget::changeTeamStatus(HWTeam team)
 {
-  QList<HWTeam>::iterator itDontPlay=std::find(curDontPlayingTeams.begin(), curDontPlayingTeams.end(), team);
+  QList<HWTeam>::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team);
   QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
 
-  bool willBePlaying=itDontPlay!=curDontPlayingTeams.end();
+  bool willBePlaying=itDontPlay!=m_curNotPlayingTeams.end();
 
   if(!willBePlaying) {
     // playing team => dont playing
-    curDontPlayingTeams.push_back(*itPlay);
+    m_curNotPlayingTeams.push_back(*itPlay);
     emit teamNotPlaying(*itPlay);
     curPlayingTeams.erase(itPlay);
   } else {
@@ -162,7 +162,7 @@
     itDontPlay->teamColor=framePlaying->getNextColor();
     curPlayingTeams.push_back(*itDontPlay);
     if(!m_acceptOuter) emit teamWillPlay(*itDontPlay);
-    curDontPlayingTeams.erase(itDontPlay);
+    m_curNotPlayingTeams.erase(itDontPlay);
   }
 
   FrameTeams* pRemoveTeams;
@@ -253,10 +253,10 @@
   //frameDontPlaying->removeTeam(*it);
   //}
   frameDontPlaying->resetTeams();
-  curDontPlayingTeams.clear();
+  m_curNotPlayingTeams.clear();
 
-  QListIterator<HWTeam> it(teamslist);
-  while(it.hasNext()) addTeam(it.next());
+  foreach(HWTeam team, teamslist)
+    addTeam(team);
 }
 
 bool TeamSelWidget::isPlaying(HWTeam team) const
@@ -269,9 +269,9 @@
   return curPlayingTeams;
 }
 
-QList<HWTeam> TeamSelWidget::getDontPlayingTeams() const
+QList<HWTeam> TeamSelWidget::getNotPlayingTeams() const
 {
-  return curDontPlayingTeams;
+  return m_curNotPlayingTeams;
 }
 
 void TeamSelWidget::pre_changeTeamStatus(HWTeam team)
--- a/QTfrontend/teamselect.h	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/teamselect.h	Wed Sep 14 22:39:39 2011 +0200
@@ -45,7 +45,7 @@
   void resetPlayingTeams(const QList<HWTeam>& teamslist);
   bool isPlaying(HWTeam team) const;
   QList<HWTeam> getPlayingTeams() const;
-  QList<HWTeam> getDontPlayingTeams() const;
+  QList<HWTeam> getNotPlayingTeams() const;
   void setInteractivity(bool interactive);
 
  public slots:
@@ -77,7 +77,7 @@
   bool m_acceptOuter;
 
   QList<HWTeam> curPlayingTeams;
-  QList<HWTeam> curDontPlayingTeams;
+  QList<HWTeam> m_curNotPlayingTeams;
 };
 
 #endif // _TEAM_SELECT_INCLUDED
--- a/gameServer/Utils.hs	Wed Sep 14 22:27:22 2011 +0200
+++ b/gameServer/Utils.hs	Wed Sep 14 22:39:39 2011 +0200
@@ -103,6 +103,8 @@
             , (35, "0.9.14.1")
             , (37, "0.9.15")
             , (38, "0.9.16-dev")
+            , (39, "0.9.16")
+            , (40, "0.9.17-dev")
             ]
 
 askFromConsole :: B.ByteString -> IO B.ByteString
--- a/hedgewars/CMakeLists.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/CMakeLists.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -183,6 +183,8 @@
 
 
 add_custom_target(${engine_output_name} ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}")
+add_custom_target(ENGINECLEAN COMMAND ${CMAKE_BUILD_TOOL} "clean" "${PROJECT_BINARY_DIR}" "${hedgewars_SOURCE_DIR}/hedgewars")
+add_dependencies(${engine_output_name} ENGINECLEAN)
 
 install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION ${target_dir})
 
--- a/hedgewars/GSHandlers.inc	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/GSHandlers.inc	Wed Sep 14 22:39:39 2011 +0200
@@ -103,6 +103,35 @@
         end;
 end;
 
+procedure HideHog(HH: PHedgehog);
+begin
+ScriptCall('onHogHide', HH^.Gear^.Uid);
+DeleteCI(HH^.Gear);
+if FollowGear = HH^.Gear then FollowGear:= nil;
+if lastGearByUID = HH^.Gear then lastGearByUID := nil;
+RemoveGearFromList(HH^.Gear);
+with HH^.Gear^ do
+    begin
+    Z := cHHZ;
+    Active := false;
+    State:= State and not (gstHHDriven or gstAttacking or gstAttacked);
+    Message := Message and not gmAttack;
+    end;
+HH^.GearHidden:= HH^.Gear;
+HH^.Gear:= nil;
+end;
+
+procedure RestoreHog(HH: PHedgehog);
+begin
+HH^.Gear:=HH^.GearHidden;
+HH^.GearHidden:= nil;
+InsertGearToList(HH^.Gear);
+HH^.Gear^.State:= (HH^.Gear^.State and not (gstHHDriven or gstInvisible or gstAttacking)) or gstAttacked;
+AddGearCI(HH^.Gear);
+HH^.Gear^.Active:= true;
+ScriptCall('onHogRestore', HH^.Gear^.Uid)
+end;
+
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepDrowningGear(Gear: PGear);
 forward;
@@ -483,18 +512,39 @@
     i, gX, gY: LongInt;
     dX, dY: hwFloat;
     Fire: PGear;
+    smoke, glass: PVisualGear;
 begin
     AllInactive := false;
 
     doStepFallingGear(Gear);
     CalcRotationDirAngle(Gear);
 
+    // let's add some smoke depending on speed
+    i:= max(32,152 - hwRound(Distance(Gear^.dX,Gear^.dY)*120))+random(10);
+    if (GameTicks mod i) = 0 then
+        begin
+        // adjust angle to match the texture
+        if Gear^.dX.isNegative then i:= 130 else i:= 50;
+        smoke:= AddVisualGear(hwRound(Gear^.X)-round(cos((Gear^.DirAngle+i) * pi / 180)*20), hwRound(Gear^.Y)-round(sin((Gear^.DirAngle+i) * pi / 180)*20), vgtSmoke);
+        if smoke <> nil then smoke^.Scale:= 0.75;
+        end;
+
     if (Gear^.State and gstCollision) <> 0 then
     begin
         PlaySound(sndMolotov);
         gX := hwRound(Gear^.X);
         gY := hwRound(Gear^.Y);
-        //doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, EXPLAutoSound);
+        for i:= 0 to 2 do
+            begin
+            glass:= AddVisualGear(gx+random(7)-3, gy+random(5)-2, vgtEgg);
+            if glass <> nil then
+                begin
+                glass^.Frame:= 2;
+                glass^.Tint:= $41B83ED0 - i * $10081000;
+                glass^.dX:= 1/(10*(random(11)-5));
+                glass^.dY:= -1/(random(4)+5);
+                end;
+            end;
         for i:= 0 to 24 do
         begin
             dX := AngleCos(i * 2) * ((_0_15*(i div 5))) * (GetRandom + _1);
@@ -766,8 +816,9 @@
 procedure doStepBeeWork(Gear: PGear);
 var 
     t: hwFloat;
-    gX,gY: LongInt;
+    gX,gY,i: LongInt;
     nuw: boolean;
+    flower: PVisualGear;
 
 const uw: boolean =   false;
 begin
@@ -816,6 +867,21 @@
     begin
         StopSound(Gear^.SoundChannel);
         doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+        for i:= 0 to 31 do
+            begin
+            flower:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot);
+            if flower <> nil then 
+                with flower^ do
+                    begin
+                    Scale:= 0.75;
+                    dx:= 0.001 * (random(200));
+                    dy:= 0.001 * (random(200));
+                    if random(2) = 0 then dx := -dx;
+                    if random(2) = 0 then dy := -dy;
+                    FrameTicks:= random(250) + 250;
+                    State:= ord(sprTargetBee);
+                    end;
+            end;
         DeleteGear(Gear);
     end;
 end;
@@ -914,6 +980,44 @@
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
+procedure spawnBulletTrail(Bullet: PGear);
+var oX, oY: hwFloat;
+    VGear: PVisualGear;
+begin
+    if Bullet^.PortalCounter = 0 then
+        begin
+        ox:= CurrentHedgehog^.Gear^.X + Int2hwFloat(GetLaunchX(CurrentHedgehog^.CurAmmoType, hwSign(CurrentHedgehog^.Gear^.dX), CurrentHedgehog^.Gear^.Angle));
+        oy:= CurrentHedgehog^.Gear^.Y + Int2hwFloat(GetLaunchY(CurrentHedgehog^.CurAmmoType, CurrentHedgehog^.Gear^.Angle));
+        end
+    else
+        begin
+        ox:= Bullet^.Elasticity;
+        oy:= Bullet^.Friction;
+        end;
+
+        // Bullet trail
+        VGear := AddVisualGear(hwRound(ox), hwRound(oy), vgtLineTrail);
+        if VGear <> nil then
+            begin
+            VGear^.X:= hwFloat2Float(ox);
+            VGear^.Y:= hwFloat2Float(oy);
+            VGear^.dX:= hwFloat2Float(Bullet^.X);
+            VGear^.dY:= hwFloat2Float(Bullet^.Y);
+
+            // 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
+                    // only extend if not under water
+                    if hwRound(Bullet^.Y) < cWaterLine then
+                        begin
+                        VGear^.dX := VGear^.dX + LAND_WIDTH * (VGear^.dX - VGear^.X);
+                        VGear^.dY := VGear^.dY + LAND_WIDTH * (VGear^.dY - VGear^.Y);
+                        end;
+
+            VGear^.Timer := 200;
+            end;
+end;
+
 procedure doStepBulletWork(Gear: PGear);
 var 
     i, x, y: LongWord;
@@ -932,6 +1036,19 @@
         y := hwRound(Gear^.Y);
         if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0)
            and (Land[y, x] <> 0) then inc(Gear^.Damage);
+        // let's interrupt before a collision to give portals a chance to catch the bullet
+        if (Gear^.Damage = 1) and (Gear^.Tag = 0) and (Land[y, x] > 255) then
+        begin
+            Gear^.Tag := 1;
+            Gear^.Damage := 0;
+            Gear^.X := Gear^.X - Gear^.dX;
+            Gear^.Y := Gear^.Y - Gear^.dY;
+            CheckGearDrowning(Gear);
+            break;
+        end
+        else
+            Gear^.Tag := 0;
+
         if Gear^.Damage > 5 then
             if Gear^.AmmoType = amDEagle then
                 AmmoShove(Gear, 7, 20)
@@ -977,31 +1094,7 @@
             end;
         end;
        
-        if Gear^.PortalCounter = 0 then
-            begin 
-            // Bullet trail
-            VGear := AddVisualGear(
-                hwround(CurrentHedgehog^.Gear^.X) + GetLaunchX(CurrentHedgehog^.CurAmmoType, hwSign(CurrentHedgehog^.Gear^.dX), CurrentHedgehog^.Gear^.Angle), 
-                hwround(CurrentHedgehog^.Gear^.Y) + GetLaunchY(CurrentHedgehog^.CurAmmoType, CurrentHedgehog^.Gear^.Angle),
-                vgtLineTrail
-            );
-            if VGear <> nil then
-                begin
-                // http://mantis.freepascal.org/view.php?id=17714 hits again
-                VGear^.dX := Gear^.X.QWordValue / SignAs(_1,_1).QWordValue;
-                VGear^.dY := Gear^.Y.QWordValue / SignAs(_1,_1).QWordValue;
-                
-                // reached edge of land. assume infinite beam. Extend it way out past camera
-                if (hwRound(Gear^.X) and LAND_WIDTH_MASK <> 0) 
-                    or (hwRound(Gear^.Y) and LAND_HEIGHT_MASK <> 0) then
-                    begin
-                    VGear^.dX := VGear^.dX + (CurrentHedgehog^.Gear^.dX * LAND_WIDTH).QWordValue / SignAs(_1,_1).QWordValue;
-                    VGear^.dY := VGear^.dY + (CurrentHedgehog^.Gear^.dY * LAND_WIDTH).QWordValue / SignAs(_1,_1).QWordValue;
-                    end;
-                
-                VGear^.Timer := 200;
-                end
-            end;
+        spawnBulletTrail(Gear);
         Gear^.doStep := @doStepShotIdle
     end;
 end;
@@ -1110,7 +1203,8 @@
     AllInactive := false;
     HHGear := Gear^.Hedgehog^.Gear;
     dec(Gear^.Timer);
-    if (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
+    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
         begin
         StopSound(Gear^.SoundChannel);
@@ -1219,6 +1313,8 @@
 begin
     AllInactive := false;
     dec(Gear^.Timer);
+    if ((GameFlags and gfInfAttack) <> 0) and (TurnTimeLeft > 0) then dec(TurnTimeLeft);
+    
     HHGear := Gear^.Hedgehog^.Gear;
 
     HedgehogChAngle(HHGear);
@@ -1226,21 +1322,21 @@
     b := false;
 
     if abs(LongInt(HHGear^.Angle) - BTPrevAngle) > 7  then
-    begin
-        Gear^.dX := SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX);
+        begin
+        Gear^.dX := SignAs(AngleSin(HHGear^.Angle) * _0_5, Gear^.dX);
         Gear^.dY := AngleCos(HHGear^.Angle) * ( - _0_5);
         BTPrevAngle := HHGear^.Angle;
         b := true
-    end;
+        end;
 
     if ((HHGear^.State and gstMoving) <> 0) then
-    begin
+        begin
         doStepHedgehogMoving(HHGear);
         if (HHGear^.State and gstHHDriven) = 0 then Gear^.Timer := 0
-    end;
+        end;
 
     if Gear^.Timer mod cHHStepTicks = 0 then
-    begin
+        begin
         b := true;
         if Gear^.dX.isNegative then
             HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmLeft
@@ -1248,7 +1344,7 @@
             HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmRight;
 
         if ((HHGear^.State and gstMoving) = 0) then
-        begin
+            begin
             HHGear^.State := HHGear^.State and not gstAttacking;
             prevX := hwRound(HHGear^.X);
 
@@ -1261,24 +1357,24 @@
                CheckLandValue(hwRound(HHGear^.X + SignAs(_6, HHGear^.dX)), hwRound(HHGear^.Y),
                lfIndestructible) then HHGear^.X := HHGear^.X + SignAs(_1, HHGear^.dX);
             HHGear^.State := HHGear^.State or gstAttacking
-        end;
+            end;
 
         inc(BTSteps);
         if BTSteps = 7 then
-        begin
+            begin
             BTSteps := 0;
             if CheckLandValue(hwRound(HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC) + SignAs(_6,
                Gear^.dX)), hwRound(HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC)),
                lfIndestructible) then
-            begin
+                begin
                 Gear^.X := HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC);
                 Gear^.Y := HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC);
-            end;
+                end;
             HHGear^.State := HHGear^.State or gstNoDamage;
             AmmoShove(Gear, 2, 15);
             HHGear^.State := HHGear^.State and not gstNoDamage
+            end;
         end;
-    end;
 
     if b then
         DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs(
@@ -1286,13 +1382,13 @@
         Gear^.dX, Gear^.dY,
         cHHRadius * 5, cHHRadius * 2 + 7);
 
-    if (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then
-    begin
+    if (TurnTimeLeft = 0) or (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then
+        begin
         HHGear^.Message := 0;
         HHGear^.State := HHGear^.State and (not gstNotKickable);
         DeleteGear(Gear);
         AfterAttack
-    end
+        end
 end;
 
 procedure doStepBlowTorch(Gear: PGear);
@@ -1357,7 +1453,7 @@
 var 
     HHGear: PGear;
     len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat;
-    lx, ly: LongInt;
+    lx, ly, cd: LongInt;
     haveCollision,
     haveDivided: boolean;
 
@@ -1398,16 +1494,30 @@
     else
         if (Gear^.Message and gmRight <> 0) then HHGear^.dX := HHGear^.dX + _0_0002;
 
-    if not TestCollisionYwithGear(HHGear, 1) then
-        begin
-        HHGear^.dY := HHGear^.dY + cGravity;
-        if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
-        end;
-
     // vector between hedgehog and rope attaching point
     ropeDx := HHGear^.X - Gear^.X;
     ropeDy := HHGear^.Y - Gear^.Y;
 
+    if not TestCollisionYwithGear(HHGear, 1) then
+        begin
+
+        // depending on the rope vector we know which X-side to check for collision
+        // in order to find out if the hog can still be moved by gravity
+        if ropeDx.isNegative = RopeDy.IsNegative then
+            cd:= -1
+        else
+            cd:= 1;
+
+        // apply gravity if there is no obstacle
+        if not TestCollisionXwithGear(HHGear, cd) then
+            HHGear^.dY := HHGear^.dY + cGravity;
+
+        if (GameFlags and gfMoreWind) <> 0 then
+            // apply wind if there's no obstacle
+            if not TestCollisionXwithGear(HHGear, hwSign(cWindSpeed)) then
+                HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
+        end;
+
     mdX := ropeDx + HHGear^.dX;
     mdY := ropeDy + HHGear^.dY;
     len := _1 / Distance(mdX, mdY);
@@ -2603,7 +2713,7 @@
         repeat
             CurrentTeam^.CurrHedgehog := Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.
                                          HedgehogsNumber);
-        until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil);
+        until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.Damage = 0);
 
         CurrentHedgehog := @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog];
 
@@ -2674,6 +2784,7 @@
 var 
     i: LongWord;
     HHGear: PGear;
+    sparkles: PVisualGear;
 begin
     AllInactive := false;
 
@@ -2683,9 +2794,15 @@
 
     Gear^.X := HHGear^.X;
     Gear^.Y := HHGear^.Y;
+    if (GameTicks mod 2 = 0) and ((Gear^.Message and (gmPrecise or gmSwitch)) = (gmPrecise or gmSwitch)) then
+        begin
+        sparkles:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust, 1);
+        if sparkles <> nil then sparkles^.Tint:= ((random(210)+45) shl 24) or ((random(210)+45) shl 16) or ((random(210)+45) shl 8) or $FF;
+        end;
 
     i := 2;
     repeat
+        
         Gear^.X := Gear^.X + HHGear^.dX;
         Gear^.Y := Gear^.Y + HHGear^.dY;
         HHGear^.X := Gear^.X;
@@ -2884,7 +3001,7 @@
 
     dec(Gear^.Health);
     Gear^.Timer := Gear^.Health*10;
-    Gear^.PortalCounter:= 0;
+    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
     begin
@@ -2949,10 +3066,8 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepSeductionWork(Gear: PGear);
-var 
-    x, y, i: LongInt;
+var i: LongInt;
     hogs: TPGearArray;
-    d: hwFloat;
 begin
     AllInactive := false;
     hogs := GearsNear(Gear^.X, Gear^.Y, gtHedgehog, Gear^.Radius);
@@ -3021,7 +3136,7 @@
                 if random(2) = 0 then dx := -dx;
                 if random(2) = 0 then dy := -dy;
                 FrameTicks:= random(750) + 1000;
-                heart^.State:= ord(sprSeduction)
+                State:= ord(sprSeduction)
                 end;
         end;
 
@@ -3678,10 +3793,10 @@
     AllInactive := false;
     FollowGear := HHGear;
     with HHGear^ do
-    begin
+        begin
         State := State and not gstAttacking;
         Message := Message and not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight)
-    end
+        end
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -3866,12 +3981,20 @@
                 continue;
         end;
 
+        // draw bullet trail
+        if isbullet then
+            spawnBulletTrail(iterator);
+
         // calc gear offset in portal vector direction
         ox := (iterator^.X - Gear^.X);
         oy := (iterator^.Y - Gear^.Y);
         poffs:= (Gear^.dX * ox + Gear^.dY * oy);
 
-        if poffs < _0 then
+        if not isBullet and poffs.isNegative then
+            continue;
+
+        // only port bullets close to the portal
+        if isBullet and not (hwAbs(poffs) < _3) then
             continue;
 
         //
@@ -3899,8 +4022,11 @@
         // calc gear offset in portal normal vector direction
         noffs:= (nx * ox + ny * oy);
 
+        if isBullet and (hwRound(hwAbs(noffs)) >= Gear^.Radius) then
+            continue;
+
         // avoid gravity related loops of not really moving gear
-        if not iscake and (Gear^.dY.isNegative) and (conPortal^.dY.isNegative)
+        if not (iscake or isbullet) and (Gear^.dY.isNegative) and (conPortal^.dY.isNegative)
             and ((iterator^.dX.QWordValue + iterator^.dY.QWordValue) < _0_08.QWordValue)
             and (iterator^.PortalCounter > 0) then
              continue;
@@ -3927,8 +4053,7 @@
 
         // inverse cake's normal movement direction,
         // as if it just walked through a hole
-        if iscake then
-            nspeed.isNegative:= not nspeed.isNegative;
+        //if iscake then nspeed.isNegative:= not nspeed.isNegative;
 
 //AddFileLog('poffs:'+cstr(poffs)+' noffs:'+cstr(noffs)+' pspeed:'+cstr(pspeed)+' nspeed:'+cstr(nspeed));
         iterator^.dX := -pspeed * conPortal^.dX + nspeed * nx;
@@ -3979,8 +4104,8 @@
                 iterator^.Radius := iterator^.Radius - 1;
 
             // check front
-            isCollision := TestCollisionYwithGear(iterator, sy)
-                        or TestCollisionXwithGear(iterator, sx);
+            isCollision := TestCollisionY(iterator, sy)
+                        or TestCollisionX(iterator, sx);
 
             if not isCollision then
             begin
@@ -3988,8 +4113,8 @@
                 // the square check won't check more pixels than we want to)
                 iterator^.Radius := 1 + resetr div 2;
                 rh := resetr div 4;
-                isCollision := TestCollisionYwithXYShift(iterator,       0, -sy * rh, sy)
-                            or TestCollisionXwithXYShift(iterator, ox * rh,        0, sx);
+                isCollision := TestCollisionYwithXYShift(iterator,       0, -sy * rh, sy, false)
+                            or TestCollisionXwithXYShift(iterator, ox * rh,        0, sx, false);
             end;
 
             iterator^.Radius := resetr;
@@ -4010,11 +4135,19 @@
         //
 
         // Until loops are reliably broken
-        inc(iterator^.PortalCounter);
+        if iscake then iterator^.PortalCounter:= 33
+        else inc(iterator^.PortalCounter);
 
         if not isbullet and (iterator^.Kind <> gtFlake) then
             FollowGear := iterator;
 
+        // store X/Y values of exit for net bullet trail
+        if isbullet then
+        begin
+            iterator^.Elasticity:= iterator^.X;
+            iterator^.Friction  := iterator^.Y;
+        end;
+
         // This jiggles gears, to ensure a portal connection just placed under a gear takes effect.
         iterator:= GearsList;
         while iterator <> nil do
@@ -4076,7 +4209,7 @@
     begin
         Gear^.State := Gear^.State or gstCollision;
         Gear^.State := Gear^.State and not gstMoving;
-        if not calcSlopeTangent(Gear, x, y, tx, ty, 255)
+        if not CalcSlopeTangent(Gear, x, y, tx, ty, 255)
            or (DistanceI(tx,ty) < _12) then // reject shots at too irregular terrain
         begin
             loadNewPortalBall(Gear, true);
@@ -4902,47 +5035,137 @@
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
-procedure doStepTardis(Gear: PGear);
-(*var 
-    i, x, y: LongInt;
-    dX, dY: hwFloat;
-    Fire: PGear;
-    vg: PVisualGear;*)
+(*
+ TARDIS needs 
+ Warp in.  Pos = 1
+ Pause.    Pos = 2
+ Hide gear  (TARDIS hedgehog was nil)
+ Warp out. Pos = 3
+ ... idle active for some time period ...  Pos = 4
+ Warp in.  Pos = 1
+ Pause.    Pos = 2
+ Restore gear  (TARDIS hedgehog was not nil)
+ Warp out. Pos = 3
+*)
+
+procedure doStepTardisWarp(Gear: PGear);
+var HH: PHedgehog;
+    i,j,cnt: LongWord;
 begin
-    if (Gear^.State and gstTmpFlag) = 0 then dec(Gear^.Timer);
-    if (Gear^.Timer = 0) and (CurAmmoGear = Gear) then
+
+HH:= Gear^.Hedgehog;
+if Gear^.Pos = 2 then
+    begin
+    StopSound(Gear^.SoundChannel);
+    if (Gear^.Timer = 0) then
         begin
-        if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then 
+        if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible = 0) then
             begin
-            DeleteGear(Gear);
-            exit
-            end;
-        if Gear = CurAmmoGear then CurAmmoGear := nil;
-        Gear^.Hedgehog:= CurrentHedgehog;
-        RemoveGearFromList(CurrentHedgehog^.Gear);
-        CurrentHedgehog^.Gear^.Z := cHHZ;
-        CurrentHedgehog^.Gear^.Active := false;
-        CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and not gstHHDriven;
-        CurrentHedgehog^.GearHidden:= CurrentHedgehog^.Gear;
-        CurrentHedgehog^.Gear:= nil;
-        Gear^.State:= Gear^.State or gstTmpFlag;
-        Gear^.Timer:= GameTicks + GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime;
+	        AfterAttack;
+            if Gear = CurAmmoGear then CurAmmoGear := nil;
+            HideHog(HH)
+            end
+        //else if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible <> 0) then
+        else if (HH^.GearHidden <> nil) then// and (HH^.Gear^.State and gstInvisible <> 0) then
+            RestoreHog(HH)
+        end;
+
+    inc(Gear^.Timer);
+    if (Gear^.Timer > 2000) and ((GameTicks mod 2000) = 1000) then
+        begin
+        Gear^.SoundChannel := LoopSound(sndTardis);
+        Gear^.Pos:= 3
         end
-    else if (((Gear^.State and gstTmpFlag) <> 0) and (Gear^.Timer = GameTicks)) or SuddenDeath then
+    end;
+
+if (Gear^.Pos = 1) and (GameTicks and $1F = 0) and (Gear^.Power < 255) then inc(Gear^.Power);
+if (Gear^.Pos = 3) and (GameTicks and $1F = 0) and (Gear^.Power > 0) then dec(Gear^.Power);
+if (Gear^.Pos = 1) and (Gear^.Power = 255) and ((GameTicks mod 2000) = 1000) then Gear^.Pos:= 2;
+if (Gear^.Pos = 3) and (Gear^.Power = 0) then
+    begin
+    StopSound(Gear^.SoundChannel);
+    if HH^.GearHidden = nil then
         begin
-        if Gear^.Hedgehog <> nil then
+        DeleteGear(Gear);
+        exit
+        end;
+    Gear^.Pos:= 4;
+    // This condition might need tweaking
+    Gear^.Timer:= GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime
+    end;
+
+if (Gear^.Pos = 4) then
+    begin
+    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 = 0) or SuddenDeathDmg or (Gear^.Timer = 0) then
+        begin
+        Gear^.SoundChannel := LoopSound(sndTardis);
+        Gear^.Pos:= 1;
+        Gear^.Power:= 0;
+        Gear^.Timer:= 0;
+        if HH^.GearHidden <> nil then FindPlace(HH^.GearHidden, false, 0, LAND_WIDTH,true);
+        if HH^.GearHidden <> nil then 
             begin
-            Gear^.Hedgehog^.Gear:= Gear^.Hedgehog^.GearHidden;
-            Gear^.Hedgehog^.GearHidden:= nil;
-            FindPlace(Gear^.Hedgehog^.Gear, false, 0, LAND_WIDTH,true);
-            InsertGearToList(Gear^.Hedgehog^.Gear);
-            Gear^.Hedgehog^.Gear^.State:= (Gear^.Hedgehog^.Gear^.State or gstTmpFlag or gstAttacked) and not gstHHDriven;
-            Gear^.Hedgehog^.Gear^.Timer:= $FF;
-            Gear^.Hedgehog^.Gear^.doStep:= @doStepHedgehogReturn;
-            SetAllHHToActive;
-            end;
-            DeleteGear(Gear)
+            Gear^.X:= HH^.GearHidden^.X;
+            Gear^.Y:= HH^.GearHidden^.Y;
+            //HH^.Gear:=HH^.GearHidden;
+            //HH^.GearHidden:= nil;
+            //HH^.Gear^.State:= HH^.Gear^.State or gstInvisible;
+            end
         end
+    else dec(Gear^.Timer);
+    end;
+
+end;
+
+procedure doStepTardis(Gear: PGear);
+var i,j,cnt: LongWord;
+    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) 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;
+        PlaySound(sndDenied);
+        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;
+    Gear^.SoundChannel := LoopSound(sndTardis);
+    Gear^.doStep:= @doStepTardisWarp
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
--- a/hedgewars/HHHandlers.inc	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/HHHandlers.inc	Wed Sep 14 22:39:39 2011 +0200
@@ -53,7 +53,6 @@
     HHGear^.Message:= HHGear^.Message and not gmSlot;
     ammoidx:= 0;
     if ((HHGear^.State and (gstAttacking or gstAttacked)) <> 0) or
-       (TargetPoint.X <> NoPointX) or
        ((MultiShootAttacks > 0) and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) = 0)) or
        ((HHGear^.State and gstHHDriven) = 0) then exit;
     ChangeAmmo:= true;
@@ -423,7 +422,8 @@
            end
         end else Message:= Message and not gmAttack;
      end;
-     TargetPoint.X := NoPointX
+     TargetPoint.X := NoPointX;
+     ScriptCall('onHogAttack');	
 end;
 
 procedure AfterAttack;
@@ -774,6 +774,11 @@
    begin
    if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0;
    Gear^.State:= Gear^.State or gstMoving;
+   if (CurrentHedgehog^.Gear = Gear)
+        and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > _0_003) then 
+        begin
+        FollowGear:= Gear;
+        end;
    if isUnderwater then Gear^.dY:= Gear^.dY + cGravity / _2
    else
        begin
@@ -1033,7 +1038,7 @@
         PrvInactive:= false;
         AllInactive:= false;
 
-        if not Gear^.Hedgehog^.Team^.hasGone then
+        if (Gear^.State and gstHHGone) = 0 then
             begin
             Gear^.Hedgehog^.Effects[hePoisoned] := false;
             if Gear^.Hedgehog^.Effects[heResurrectable] then begin
@@ -1047,8 +1052,8 @@
             end
         else
             begin
-            Gear^.State:= Gear^.State or gstHHGone;
             Gear^.doStep:= @doStepHedgehogGone;
+
             // Gone message
             AddCaption(Format(GetEventString(eidGone), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage);
             end
@@ -1089,17 +1094,9 @@
 else
     begin
     with Gear^.Hedgehog^ do
-        if Team^.hasGone then TeamGoneEffect(Team^);
-    doStepHedgehogDriven(Gear)
+        if Team^.hasGone then 
+            TeamGoneEffect(Team^)
+        else
+            doStepHedgehogDriven(Gear)
     end;
 end;
-
-procedure doStepHedgehogReturn(Gear: PGear);
-begin
-if (Gear^.Timer > 0) and ((GameTicks mod 20) = 0) then dec(Gear^.Timer)
-else if (Gear^.Timer = 0) then
-    begin
-    Gear^.doStep:= @doStepHedgehog;
-    Gear^.State:= Gear^.State and not gstTmpFlag;
-    end
-end;
--- a/hedgewars/SDLh.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/SDLh.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -278,6 +278,11 @@
     IMG_INIT_PNG = $00000002;
     IMG_INIT_TIF = $00000004;
 
+    {* SDL_EventMask type definition *}
+{$IFNDEF SDL13}
+    SDL_ALLEVENTS = $FFFFFFFF;
+{$ENDIF}
+
 /////////////////////////////////////////////////////////////////
 ///////////////////////  TYPE DEFINITIONS ///////////////////////
 /////////////////////////////////////////////////////////////////
@@ -347,6 +352,7 @@
 {$ENDIF}
         end;
 
+    SDL_eventaction = (SDL_ADDEVENT = 0, SDL_PEEPEVENT, SDL_GETEVENT);
 
     PSDL_Surface = ^TSDL_Surface;
     TSDL_Surface = record
@@ -612,6 +618,8 @@
 {$ENDIF}
         end;
 
+    TSDL_EventFilter = function( event : PSDL_Event ): Integer; cdecl;
+
     PByteArray = ^TByteArray;
     TByteArray = array[0..65535] of Byte;
     PLongWordArray = ^TLongWordArray;
@@ -793,6 +801,10 @@
 
 procedure SDL_WarpMouseInWindow(window: PSDL_Window; x, y: LongInt); cdecl; external SDLLibName;
 function  SDL_SetHint(name, value: PChar): boolean; cdecl; external SDLLibName;
+
+function  SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; minType, maxType: LongInt): LongInt; cdecl; external SDLLibName;
+{$ELSE}
+function  SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; mask: LongInt): LongInt; cdecl; external SDLLibName;
 {$ENDIF}
 
 function  SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName;
@@ -801,6 +813,7 @@
 procedure SDL_PumpEvents; cdecl; external SDLLibName;
 function  SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;
 function  SDL_WaitEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;
+procedure SDL_SetEventFilter( filter : TSDL_EventFilter ); cdecl; external SDLLibName;
 
 function  SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName;
 
--- a/hedgewars/VGSHandlers.inc	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/VGSHandlers.inc	Wed Sep 14 22:39:39 2011 +0200
@@ -174,7 +174,10 @@
 if Gear^.FrameTicks <= Steps then
     DeleteVisualGear(Gear)
 else
-    dec(Gear^.FrameTicks, Steps)
+    dec(Gear^.FrameTicks, Steps);
+
+if Gear^.FrameTicks < $FF then
+   Gear^.Tint:= (Gear^.Tint and $FFFFFF00) or Gear^.FrameTicks
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -587,22 +590,16 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepBigExplosionWork(Gear: PVisualGear; Steps: Longword);
-//var maxMovement: LongInt;
+var maxMovement: LongInt;
 begin
 
 inc(Gear^.Timer, Steps);
-(*
-FIXME - This block desyncs due to the way WorldDx is important for various things network related.
-One possible solution is, instead of using WorldDx, to use straight gl/SDL calls to jitter the screen a bit.
-
-// a comment by unC0Rr: instead of changing WorldDx shake cursor coordinates, that should be safe
-
 if (Gear^.Timer and 5) = 0 then
     begin
     maxMovement := max(1, 13 - ((Gear^.Timer * 15) div 250));
     ShakeCamera(maxMovement);
     end;
-*)
+
 if Gear^.Timer > 250 then DeleteVisualGear(Gear);
 end;
 
@@ -611,6 +608,9 @@
     gX,gY: LongInt;
     vg: PVisualGear;
 begin
+//ScreenFade:= sfFromWhite;
+//ScreenFadeValue:= round(60 * zoom * zoom);
+//ScreenFadeSpeed:= 5;
 gX:= round(Gear^.X);
 gY:= round(Gear^.Y);
 AddVisualGear(gX, gY, vgtSmokeRing);
--- a/hedgewars/hwengine.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/hwengine.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -149,8 +149,12 @@
     PrevTime:= SDL_GetTicks;
     while isTerminated = false do
     begin
-
-        while SDL_PollEvent(@event) <> 0 do
+        SDL_PumpEvents();
+        {$IFDEF SDL13}
+        while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 do
+        {$ELSE}
+        while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0 do
+        {$ENDIF}
         begin
             case event.type_ of
                 SDL_KEYDOWN: if GameState = gsChat then
@@ -176,14 +180,13 @@
                             onFocusStateChanged()
                         end;
                 SDL_VIDEORESIZE: begin
-                    // using lower values causes widget overlap and video issues
-                    if event.resize.w > cMinScreenWidth then cScreenWidth:= event.resize.w
-                    else cScreenWidth:= cMinScreenWidth;
-                    if event.resize.h > cMinScreenHeight then cScreenHeight:= event.resize.h
-                    else cScreenHeight:= cMinScreenHeight;
-                    ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
-                    WriteLnToConsole('window resize');
-                    InitCameraBorders();
+                    // using lower values than cMinScreenWidth or cMinScreenHeight causes widget overlap and off-screen widget parts
+                    // Change by sheepluva:
+                    // Let's only use even numbers for custom width/height since I ran into scaling issues with odd width values.
+                    // Maybe just fixes the symptom not the actual cause(?), I'm too tired to find out :P
+                    cNewScreenWidth:= max(2 * (event.resize.w div 2), cMinScreenWidth);
+                    cNewScreenHeight:= max(2 * (event.resize.h div 2), cMinScreenHeight);
+                    cScreenResizeDelay:= RealTicks+500;
                     end;
 {$ENDIF}
                 SDL_JOYAXISMOTION: ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value);
@@ -193,6 +196,17 @@
                 SDL_QUITEV: isTerminated:= true
             end; //end case event.type_ of
         end; //end while SDL_PollEvent(@event) <> 0 do
+        if (cScreenResizeDelay <> 0) and (cScreenResizeDelay < RealTicks) and ((cNewScreenWidth <> cScreenWidth) or (cNewScreenHeight <> cScreenHeight)) then
+            begin
+            cScreenResizeDelay:= 0;
+            cScreenWidth:= cNewScreenWidth;
+            cScreenHeight:= cNewScreenHeight;
+
+            ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
+            WriteLnToConsole('window resize: ' + IntToStr(cScreenWidth) + ' x ' + IntToStr(cScreenHeight));
+            ScriptOnScreenResize();
+            InitCameraBorders()
+            end;
 
         if isTerminated = false then
         begin
@@ -240,12 +254,10 @@
     recordFileName:= gameArgs[10];
     cStereoMode:= smNone;
 {$ENDIF}
-    cMinScreenWidth:= cScreenWidth;
-    cMinScreenHeight:= cScreenHeight;
+    cMinScreenWidth:= min(cScreenWidth, cMinScreenWidth);
+    cMinScreenHeight:= min(cScreenHeight, cMinScreenHeight);
     cOrigScreenWidth:= cScreenWidth;
     cOrigScreenHeight:= cScreenHeight;
-    if 480 < cMinScreenWidth then cMinScreenWidth:= 480;
-    if 320 < cMinScreenHeight then cMinScreenHeight:= 320;
 
     initEverything(true);
 
--- a/hedgewars/uAIMisc.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uAIMisc.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -112,7 +112,7 @@
             end;
 
 if e > f then friendlyfactor:= 300 + (e - f) * 30
-else friendlyfactor:= max(30, 300 - f * 80 div e)
+else friendlyfactor:= max(30, 300 - f * 80 div max(1,e))
 end;
 
 procedure FillBonuses(isAfterAttack: boolean; filter: TGearsType);
--- a/hedgewars/uAmmos.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uAmmos.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -215,7 +215,7 @@
 FillAmmoStore(hhammo, ammos);
 CurWeapon:= GetAmmoEntry(Hedgehog);
 with Hedgehog, CurWeapon^ do
-        if Count = 0 then
+        if (Count = 0) or (AmmoType = amNothing) then
             begin
             PackAmmo(Ammo, Ammoz[AmmoType].Slot);
             CurAmmoType:= amNothing
--- a/hedgewars/uCollisions.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uCollisions.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -47,10 +47,11 @@
 function  TestCollisionX(Gear: PGear; Dir: LongInt): boolean;
 function  TestCollisionY(Gear: PGear; Dir: LongInt): boolean;
 
-function  TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): boolean;
-function  TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): boolean;
+function  TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
+function  TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
 
-function  calcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): Boolean;
+function  TestRectancleForObstacle(x1, y1, x2, y2: LongInt; landOnly: boolean): boolean;
+function  CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): Boolean;
 
 implementation
 uses uConsts, uLandGraphics, uVariables, uDebug, uGears;
@@ -291,11 +292,13 @@
    end
 end;
 
-function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): boolean;
+function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
 begin
 Gear^.X:= Gear^.X + ShiftX;
 Gear^.Y:= Gear^.Y + int2hwFloat(ShiftY);
-TestCollisionXwithXYShift:= TestCollisionXwithGear(Gear, Dir);
+if withGear then 
+    TestCollisionXwithXYShift:= TestCollisionXwithGear(Gear, Dir)
+else TestCollisionXwithXYShift:= TestCollisionX(Gear, Dir);
 Gear^.X:= Gear^.X - ShiftX;
 Gear^.Y:= Gear^.Y - int2hwFloat(ShiftY)
 end;
@@ -337,17 +340,49 @@
 TestCollisionY:= false
 end;
 
-function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): boolean;
+function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean;
 begin
 Gear^.X:= Gear^.X + int2hwFloat(ShiftX);
 Gear^.Y:= Gear^.Y + int2hwFloat(ShiftY);
-TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir);
+if withGear then TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir)
+else TestCollisionYwithXYShift:= TestCollisionY(Gear, Dir);
 Gear^.X:= Gear^.X - int2hwFloat(ShiftX);
 Gear^.Y:= Gear^.Y - int2hwFloat(ShiftY)
 end;
 
+function TestRectancleForObstacle(x1, y1, x2, y2: LongInt; landOnly: boolean): boolean;
+var x, y: LongInt;
+    TestWord: LongWord;
+begin
+if landOnly then
+    TestWord:= 255
+else
+    TestWord:= 0;
 
-function calcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): boolean;
+if x1 > x2 then
+begin
+    x  := x1;
+    x1 := x2;
+    x2 := x;
+end;
+
+if y1 > y2 then
+begin
+    y  := y1;
+    y1 := y2;
+    y2 := y;
+end;
+
+for y := y1 to y2 do
+    for x := x1 to x2 do
+        if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0)
+          and (Land[y, x] > TestWord) then
+            exit(true);
+
+TestRectancleForObstacle:= false
+end;
+
+function CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): boolean;
 var ldx, ldy, rdx, rdy: LongInt;
     i, j, mx, my, li, ri, jfr, jto, tmpo : ShortInt;
     tmpx, tmpy: LongWord;
--- a/hedgewars/uConsts.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uConsts.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -196,6 +196,7 @@
     gfDisableWind        = $00800000;
     gfMoreWind           = $01000000;
     gfTagTeam            = $02000000;
+    gfBottomBorder       = $04000000;
     // NOTE: When adding new game flags, ask yourself
     // if a "game start notice" would be useful. If so,
     // add one in uWorld.pas - look for "AddGoal".
--- a/hedgewars/uGame.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uGame.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -72,7 +72,7 @@
                         SetBinds(CurrentTeam^.Binds);
                         //CurrentHedgehog^.Gear^.Message:= 0; <- produces bugs with further save restoring and demos
                         isSoundEnabled:= isSEBackup;
-                        if isSoundEnabled then playMusic;
+                        PlayMusic;
                         GameType:= gmtLocal;
                         AddVisualGear(0, 0, vgtTeamHealthSorter);
                         AddVisualGear(0, 0, vgtSmoothWindBar);
--- a/hedgewars/uGears.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uGears.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -43,6 +43,8 @@
 function  GetAmmo: TAmmoType;
 function  GetUtility: TAmmoType;
 procedure ResurrectHedgehog(gear: PGear);
+procedure HideHog(HH: PHedgehog);
+procedure RestoreHog(HH: PHedgehog);
 procedure ProcessGears;
 procedure EndTurnCleanup;
 procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource);
@@ -75,7 +77,6 @@
 procedure AfterAttack; forward;
 procedure HedgehogStep(Gear: PGear); forward;
 procedure doStepHedgehogMoving(Gear: PGear); forward;
-procedure doStepHedgehogReturn(Gear: PGear); forward;
 procedure HedgehogChAngle(HHGear: PGear); forward;
 procedure ShotgunShot(Gear: PGear); forward;
 procedure PickUp(HH, Gear: PGear); forward;
@@ -218,7 +219,6 @@
 gear^.doStep:= doStepHandlers[Kind];
 gear^.CollisionIndex:= -1;
 gear^.Timer:= Timer;
-gear^.Z:= cUsualZ;
 gear^.FlightTime:= 0;
 gear^.uid:= Counter;
 gear^.SoundChannel:= -1;
@@ -226,6 +226,8 @@
 gear^.nImpactSounds:= 0;
 // Define ammo association, if any.
 gear^.AmmoType:= GearKindAmmoTypeMap[Kind];
+if Ammoz[Gear^.AmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0 then gear^.Z:= cHHZ+1
+else gear^.Z:= cUsualZ;
 
 if CurrentHedgehog <> nil then
     begin
@@ -372,7 +374,8 @@
                 gear^.Elasticity:= _0_4;
                 gear^.Friction:= _0_995;
                 gear^.Density:= _6;
-                gear^.Health:= cBarrelHealth
+                gear^.Health:= cBarrelHealth;
+                gear^.Z:= cHHZ-1
                 end;
   gtDEagleShot: begin
                 gear^.Radius:= 1;
@@ -428,6 +431,11 @@
                 gear^.Elasticity:= _0_3;
                 gear^.Timer:= 0
                 end;
+      gtTardis: begin
+                gear^.Timer:= 0;
+                gear^.Pos:= 1;
+                gear^.Z:= cCurrHHZ+1;
+                end;
       gtMortar: begin
                 gear^.Radius:= 4;
                 gear^.Elasticity:= _0_2;
@@ -595,6 +603,7 @@
 else if Gear^.Kind = gtHedgehog then
     if (CurAmmoGear <> nil) and (CurrentHedgehog^.Gear = Gear) then
         begin
+        AttackBar:= 0;
         Gear^.Message:= gmDestroy;
         CurAmmoGear^.Message:= gmDestroy;
         exit
@@ -612,6 +621,7 @@
         team:= Gear^.Hedgehog^.Team;
         if CurrentHedgehog^.Gear = Gear then
             begin
+            AttackBar:= 0;
             FreeActionsList; // to avoid ThinkThread on drawned gear
             if ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) <> 0) and (CurrentHedgehog^.MultiShootAttacks > 0) then OnUsedAmmo(CurrentHedgehog^);
             end;
@@ -938,7 +948,7 @@
             end;
         if delay2 = 0 then
             begin
-            if (CurrentHedgehog^.Gear <> nil) and (CurrentHedgehog^.Gear^.State and gstAttacked = 0) then SweepDirty;
+            if (CurrentHedgehog^.Gear <> nil) and (CurrentHedgehog^.Gear^.State and gstAttacked = 0) and (CurAmmoGear = nil) then SweepDirty;
             CheckNoDamage;
             AliveCount:= 0; // shorter version of check for win to allow typical step activity to proceed
             for i:= 0 to Pred(ClansCount) do
@@ -985,7 +995,10 @@
 if ((GameTicks and $FFFF) = $FFFF) then
     begin
     if (not CurrentTeam^.ExtDriven) then
-        SendIPCTimeInc;
+        begin
+        SendIPC('#');
+        AddFileLog('hiTicks increment message sent')
+        end;
 
     if (not CurrentTeam^.ExtDriven) or CurrentTeam^.hasGone then
         inc(hiTicks) // we do not recieve a message for this
@@ -1450,7 +1463,11 @@
                         ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg, dsShove)
                     else
                         Gear^.State:= Gear^.State or gstWinner;
-                    if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsUnknown); // crank up damage for explosives + blowtorch
+                    if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then 
+                        begin
+                        if (Ammo^.Hedgehog^.Gear <> nil) then Ammo^.Hedgehog^.Gear^.State:= Ammo^.Hedgehog^.Gear^.State and not gstNotKickable;
+                        ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsUnknown); // crank up damage for explosives + blowtorch
+                        end;
 
                     DeleteCI(Gear);
                     if (Gear^.Kind = gtHedgehog) and Gear^.Hedgehog^.King then
@@ -1640,6 +1657,7 @@
 procedure ResurrectHedgehog(gear: PGear);
 var tempTeam : PTeam;
 begin
+    AttackBar:= 0;
     gear^.dX := _0;
     gear^.dY := _0;
     gear^.Damage := 0;
@@ -1737,7 +1755,6 @@
 if (t > 0) then
     begin
     t:= GetRandom(t);
-    AddFileLog(inttostr(t)+' --------------');
     while t >= 0 do
       begin
       inc(i);
--- a/hedgewars/uGearsRender.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uGearsRender.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -227,13 +227,6 @@
         Tint($FF, $FF, $FF, $FF)
         end;
 
-    if  (CurAmmoGear <> nil) and 
-        (CurrentHedgehog^.Gear <> nil) and
-        (CurrentHedgehog^.Gear = Gear) and 
-        (CurAmmoGear^.Kind = gtTardis) then Tint($FF, $FF, $FF, CurAmmoGear^.Timer div 20)
-    // probably will need a new flag for this
-    else if (Gear^.State and gstTmpFlag <> 0) then Tint($FF, $FF, $FF, $FF-Gear^.Timer);
-
     if ((Gear^.State and gstWinner) <> 0) and
     ((CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtPickHammer)) then
         begin
@@ -893,7 +886,10 @@
           gtGrenade: DrawRotated(sprBomb, x, y, 0, Gear^.DirAngle);
       gtSnowball: DrawRotated(sprSnowball, x, y, 0, Gear^.DirAngle);
        gtGasBomb: DrawRotated(sprCheese, x, y, 0, Gear^.DirAngle);
-       gtMolotov: DrawRotated(sprMolotov, x, y, 0, Gear^.DirAngle);
+                  
+       gtMolotov: if (Gear^.State and gstDrowning) = 0 then
+                       DrawRotatedF(sprMolotov, x, y, (RealTicks div 125) mod 8, hwSign(Gear^.dX), Gear^.DirAngle * hwSign(Gear^.dX))
+                  else DrawSprite(sprMolotov, x, y, 8);
 
        gtRCPlane: begin
                   if (Gear^.Tag = -1) then
@@ -1078,16 +1074,36 @@
                         //DrawTexture(x, y, SpritesData[sprVampiric].Texture, 0.1);
                         Tint($FF, $FF, $FF, $FF);
                         end
-                    else if not isInLag then
+                    else //if not isInLag then
                         begin
+                        if isInLag and (Gear^.FlightTime < 256) then inc(Gear^.FlightTime, 8)
+                        else if not isInLag and (Gear^.FlightTime > 0) then dec(Gear^.FlightTime, 8);
+                        if Gear^.FlightTime > 0 then Tint($FF, $FF, $FF, $FF-min(255,Gear^.FlightTime));
                         if vobVelocity = 0 then
                             DrawSprite(sprFlake, x, y, Gear^.Timer)
                         else
-                            DrawRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle)
+                            DrawRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle);
 //DrawSprite(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer)
 //DrawRotatedF(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer, 1, Gear^.DirAngle);
+                        if Gear^.FlightTime > 0 then Tint($FF, $FF, $FF, $FF);
                         end;
        gtStructure: DrawSprite(sprTarget, x - 16, y - 16, 0);
+          gtTardis: if Gear^.Pos <> 4 then
+                        begin
+                        if Gear^.Pos = 2 then Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or $FF)
+                        else Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or max($00, round(Gear^.Power * (1-abs(0.5 - (GameTicks mod 2000) / 2000)))));
+                        DrawSprite(sprTardis, x-24, y-63,0);
+                        if Gear^.Pos = 2 then Tint($FF, $FF, $FF, $FF)
+			else Tint($FF,$FF,$FF,max($00, round(Gear^.Power * (1-abs(0.5 - (GameTicks mod 2000) / 2000)))));
+                        DrawSprite(sprTardis, x-24, y-63,1);
+                        if Gear^.Pos <> 2 then Tint($FF, $FF, $FF, $FF)
+(*
+                        Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or max($00, round(Gear^.Power * abs(1 - (RealTicks mod 500) / 250))));
+                        DrawTexture(x-6, y-70, SpritesData[sprVampiric].Texture, 0.25);
+                        Tint($FF, $FF, $FF, $FF)
+*)
+                        end;
+
 
          end;
       if Gear^.RenderTimer and (Gear^.Tex <> nil) then DrawCentered(x + 8, y + 8, Gear^.Tex);
--- a/hedgewars/uIO.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uIO.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -29,7 +29,6 @@
 procedure SendIPCXY(cmd: char; X, Y: SmallInt);
 procedure SendIPCRaw(p: pointer; len: Longword);
 procedure SendIPCAndWaitReply(s: shortstring);
-procedure SendIPCTimeInc;
 procedure SendKeepAliveMessage(Lag: Longword);
 procedure LoadRecordFromFile(fileName: shortstring);
 procedure SendStat(sit: TStatInfoType; s: shortstring);
@@ -246,13 +245,6 @@
 SendIPC(s)
 end;
 
-procedure SendIPCTimeInc;
-const timeinc: shortstring = '#';
-begin
-AddFileLog('[IPC out] <time increment>');
-SendIPCRaw(@timeinc, 2)
-end;
-
 procedure IPCWaitPongEvent;
 begin
 isPonged:= false;
@@ -288,13 +280,16 @@
     and ((GameTicks = hiTicks shl 16 + headcmd^.loTime)
         or (headcmd^.cmd = 's') // for these commands time is not specified
         or (headcmd^.cmd = 'h') // seems the hedgewars protocol does not allow remote synced commands
-        or (headcmd^.cmd = '#')
+        or (headcmd^.cmd = '#') // must be synced for saves to work
         or (headcmd^.cmd = 'b')
         or (headcmd^.cmd = 'F')) do
     begin
     case headcmd^.cmd of
         '+': ; // do nothing - it is just an empty packet
-        '#': inc(hiTicks);
+        '#': begin
+            AddFileLog('hiTicks increment by remote message');
+            inc(hiTicks);
+            end;
         'L': ParseCommand('+left', true);
         'l': ParseCommand('-left', true);
         'R': ParseCommand('+right', true);
--- a/hedgewars/uLand.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uLand.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -30,6 +30,7 @@
 
 procedure initModule;
 procedure freeModule;
+procedure DrawBottomBorder;
 procedure GenMap;
 function  GenPreview: TPreview;
 
@@ -1070,10 +1071,10 @@
             begin
                 if (cReducedQuality and rqBlurryLand) = 0 then
                     begin
-                    if (Land[y, x-1] = lfBasic) and (Land[y, x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
-                    else if (Land[y, x+1] = lfBasic) and (Land[y, x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
-                    else if (Land[y-1, x] = lfBasic) and (Land[y-1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x]
-                    else if (Land[y+1, x] = lfBasic) and (Land[y+1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x];
+                    if (Land[y, x-1] = lfBasic) and (LandPixels[y, x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
+                    else if (Land[y, x+1] = lfBasic) and (LandPixels[y, x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
+                    else if (Land[y-1, x] = lfBasic) and (LandPixels[y-1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x]
+                    else if (Land[y+1, x] = lfBasic) and (LandPixels[y+1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x];
                     if (((LandPixels[y,x] and AMask) shr AShift) > 10) then LandPixels[y,x]:= (LandPixels[y,x] and not AMask) or (128 shl AShift)
                     end;
                 Land[y,x]:= lfObject
@@ -1090,10 +1091,10 @@
             begin
                 if (cReducedQuality and rqBlurryLand) = 0 then
                     begin
-                    if (Land[y, x-1] = lfBasic) and (Land[y,x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
-                    else if (Land[y, x+1] = lfBasic) and (Land[y,x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
-                    else if (Land[y+1, x] = lfBasic) and (Land[y+1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x]
-                    else if (Land[y-1, x] = lfBasic) and (Land[y-1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x];
+                    if (Land[y, x-1] = lfBasic) and (LandPixels[y,x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1]
+                    else if (Land[y, x+1] = lfBasic) and (LandPixels[y,x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1]
+                    else if (Land[y+1, x] = lfBasic) and (LandPixels[y+1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x]
+                    else if (Land[y-1, x] = lfBasic) and (LandPixels[y-1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x];
                     if (((LandPixels[y,x] and AMask) shr AShift) > 10) then LandPixels[y,x]:= (LandPixels[y,x] and not AMask) or (64 shl AShift)
                     end;
                 Land[y,x]:= lfObject
@@ -1132,9 +1133,14 @@
     p: PLongwordArray;
     x, y, cpX, cpY: Longword;
 begin
-    tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
-    if (tmpsurf = nil) and (mapName <> '') then
-        tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName +'/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+tmpsurf:= LoadImage(UserPathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+if tmpsurf = nil then
+    begin
+    mapName:= ExtractFileName(Pathz[ptMapCurrent]);
+    tmpsurf:= LoadImage(UserPathz[ptMissionMaps] + '/' + mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+    if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+    end;
 
     if (tmpsurf <> nil) and (tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT) and (tmpsurf^.format^.BytesPerPixel = 4) then
     begin
@@ -1178,11 +1184,11 @@
 tmpsurf:= LoadImage(UserPathz[ptMapCurrent] + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
 if tmpsurf = nil then
-begin
+    begin
     mapName:= ExtractFileName(Pathz[ptMapCurrent]);
     tmpsurf:= LoadImage(UserPathz[ptMissionMaps] + '/' + mapName + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
     if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps);
-end;
+    end;
 TryDo((tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT), 'Map dimensions too big!', true);
 
 // unC0Rr - should this be passed from the GUI? I am not sure which layer does what
@@ -1222,6 +1228,25 @@
 LoadMask(mapname);
 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;
+begin
+for w:= 0 to 23 do
+    for x:= leftX to rightX do
+        begin
+        Land[cWaterLine-1 - w, x]:= lfIndestructible;
+        if (x + w) mod 32 < 16 then
+            c:= AMask
+        else
+            c:= AMask or RMask or GMask; // FF00FFFF
+
+        if (cReducedQuality and rqBlurryLand) = 0 then
+            LandPixels[cWaterLine-1 - w, x]:= c
+        else
+            LandPixels[(cWaterLine-1 - w) div 2, x div 2]:= c
+        end
+end;
+
 procedure GenMap;
 var x, y, w, c: Longword;
 begin
@@ -1272,7 +1297,7 @@
     for w:= 0 to 5 do // width of 3 allowed hogs to be knocked through with grenade
         begin
         for y:= topY to LAND_HEIGHT - 1 do
-            begin
+                begin
                 Land[y, leftX + w]:= lfIndestructible;
                 Land[y, rightX - w]:= lfIndestructible;
                 if (y + w) mod 32 < 16 then
@@ -1281,33 +1306,35 @@
                     c:= AMask or RMask or GMask; // FF00FFFF
 
                 if (cReducedQuality and rqBlurryLand) = 0 then
-                begin
+                    begin
                     LandPixels[y, leftX + w]:= c;
                     LandPixels[y, rightX - w]:= c;
-                end
+                    end
                 else
-                begin
+                    begin
                     LandPixels[y div 2, (leftX + w) div 2]:= c;
                     LandPixels[y div 2, (rightX - w) div 2]:= c;
+                    end;
                 end;
-            end;
 
         for x:= leftX to rightX do
             begin
-                Land[topY + w, x]:= lfIndestructible;
-                if (x + w) mod 32 < 16 then
-                    c:= AMask
-                else
-                    c:= AMask or RMask or GMask; // FF00FFFF
+            Land[topY + w, x]:= lfIndestructible;
+            if (x + w) mod 32 < 16 then
+                c:= AMask
+            else
+                c:= AMask or RMask or GMask; // FF00FFFF
 
-                if (cReducedQuality and rqBlurryLand) = 0 then
-                    LandPixels[topY + w, x]:= c
-                else
-                    LandPixels[(topY + w) div 2, x div 2]:= c;
+            if (cReducedQuality and rqBlurryLand) = 0 then
+                LandPixels[topY + w, x]:= c
+            else
+                LandPixels[(topY + w) div 2, x div 2]:= c;
             end;
         end;
     end;
 
+if (GameFlags and gfBottomBorder) <> 0 then DrawBottomBorder;
+
 if (GameFlags and gfDisableGirders) <> 0 then hasGirders:= false;
 
 if ((GameFlags and gfForts) = 0)
--- a/hedgewars/uLandGraphics.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uLandGraphics.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -29,7 +29,7 @@
 
 function  addBgColor(OldColor, NewColor: LongWord): LongWord;
 function  SweepDirty: boolean;
-function  Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord;
+function  Despeckle(X, Y: LongInt): Boolean;
 procedure Smooth(X, Y: LongInt);
 function  CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
 function  DrawExplosion(X, Y, Radius: LongInt): Longword;
@@ -528,8 +528,11 @@
        (((Land[ty, tx] and lfBasic) <> 0) or
        ((Land[ty, tx] and lfObject) <> 0)) then
         begin
-        Land[ty, tx]:= Land[ty, tx] or lfDamaged;
-        if despeckle then LandDirty[ty div 32, tx div 32]:= 1;
+        if despeckle then 
+            begin
+            Land[ty, tx]:= Land[ty, tx] or lfDamaged;
+            LandDirty[ty div 32, tx div 32]:= 1
+            end;
         if (cReducedQuality and rqBlurryLand) = 0 then
             LandPixels[ty, tx]:= cExplosionBorderColor
         else LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
@@ -721,8 +724,7 @@
 UpdateLandTexture(x, w, y, h)
 end;
 
-// was experimenting with applying as damage occurred.
-function Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord;
+function Despeckle(X, Y: LongInt): boolean;
 var nx, ny, i, j, c, xx, yy: LongInt;
     pixelsweep: boolean;
 begin
@@ -737,8 +739,7 @@
    yy:= Y div 2;
    end;
 pixelsweep:= ((Land[Y, X] and $FF00) = 0) and (LandPixels[yy, xx] <> 0);
-if not pixelsweep and gfxOnly then exit(0);
-if ((Land[Y, X] > 255) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
+if (((Land[Y, X] and lfDamaged) <> 0) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
     begin
     c:= 0;
     for i:= -1 to 1 do
@@ -761,8 +762,8 @@
                     else if Land[ny, nx] > 255 then inc(c);
                     end
                 end;
-    if (c < 2) or
-       ((c < 4) and (((Land[Y, X] and lfDamaged) <> 0) or pixelsweep)) then
+
+    if c < 4 then // 0-3 neighbours
         begin
         if ((Land[Y, X] and lfBasic) <> 0) and not disableLandBack then
             LandPixels[yy, xx]:= LandBackPixel(X, Y)
@@ -770,11 +771,10 @@
             LandPixels[yy, xx]:= 0;
 
         Land[Y, X]:= 0;
-        if not pixelsweep then exit(1)
-        else exit(2)
+        if not pixelsweep then exit(true);
         end;
     end;
-Despeckle:= 0
+Despeckle:= false
 end;
 
 procedure Smooth(X, Y: LongInt);
@@ -827,8 +827,8 @@
 end;
 
 function SweepDirty: boolean;
-var x, y, xx, yy, ty, tx, d: LongInt;
-    bRes, updateBlock, resweepCol, resweepGfx, gfxOnly, recheck, firstpass: boolean;
+var x, y, xx, yy, ty, tx: LongInt;
+    bRes, updateBlock, resweep, recheck: boolean;
 begin
 bRes:= false;
 reCheck:= true;
@@ -840,65 +840,67 @@
         begin
         for x:= 0 to LAND_WIDTH div 32 - 1 do
             begin
-            if LandDirty[y, x] <> 0 then
+            if LandDirty[y, x] = 1 then
                 begin
                 updateBlock:= false;
-                resweepCol:= true;
-                resweepGfx:= true;
-                firstpass:= true;
+                resweep:= true;
                 ty:= y * 32;
                 tx:= x * 32;
-                while(resweepCol or resweepGfx) do
+                while(resweep) do
                     begin
-                    gfxOnly:= resweepGfx and not resweepCol;
-                    resweepCol:= false;
-                    resweepGfx:= false;
+                    resweep:= false;
                     for yy:= ty to ty + 31 do
                         for xx:= tx to tx + 31 do
-                            begin
-                            d:= Despeckle(xx, yy, gfxOnly);
-                            if d <> 0 then
+                            if Despeckle(xx, yy) then
                                 begin
                                 bRes:= true;
                                 updateBlock:= true;
-                                if d = 1 then resweepCol:= true
-                                else resweepGfx:= true;
-                                if d = 1 then
-                                    if (yy = ty) and (y > 0) then
-                                        begin
-                                        LandDirty[y-1, x]:= 1;
-                                        recheck:= true;
-                                        end
-                                    else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then
-                                        begin
-                                        LandDirty[y+1, x]:= 1;
-                                        recheck:= true;
-                                        end;
-                                    if (xx = tx) and (x > 0) then
-                                        begin
-                                        LandDirty[y, x-1]:= 1;
-                                        recheck:= true;
-                                        end
-                                    else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then
-                                        begin
-                                        LandDirty[y, x+1]:= 1;
-                                        recheck:= true;
-                                        end
+                                resweep:= true;
+                                if (yy = ty) and (y > 0) then
+                                    begin
+                                    LandDirty[y-1, x]:= 1;
+                                    recheck:= true;
+                                    end
+                                else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then
+                                    begin
+                                    LandDirty[y+1, x]:= 1;
+                                    recheck:= true;
+                                    end;
+                                if (xx = tx) and (x > 0) then
+                                    begin
+                                    LandDirty[y, x-1]:= 1;
+                                    recheck:= true;
+                                    end
+                                else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then
+                                    begin
+                                    LandDirty[y, x+1]:= 1;
+                                    recheck:= true;
+                                    end
                                 end;
-                            if firstpass then Smooth(xx,yy);
-                            end;
-                    firstpass:= false
                     end;
                 if updateBlock then UpdateLandTexture(tx, 32, ty, 32);
-                LandDirty[y, x]:= 0;
+                LandDirty[y, x]:= 2;
                 end;
             end;
         end;
      end;
 
+for y:= 0 to LAND_HEIGHT div 32 - 1 do
+    for x:= 0 to LAND_WIDTH div 32 - 1 do
+        if LandDirty[y, x] <> 0 then
+            begin
+            LandDirty[y, x]:= 0;
+            ty:= y * 32;
+            tx:= x * 32;
+            for yy:= ty to ty + 31 do
+                for xx:= tx to tx + 31 do
+                    Smooth(xx,yy)
+            end;
+
 SweepDirty:= bRes;
 end;
 
+
 // Return true if outside of land or not the value tested, used right now for some X/Y movement that does not use normal hedgehog movement in GSHandlers.inc
 function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
 begin
--- a/hedgewars/uLandObjects.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uLandObjects.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -373,7 +373,7 @@
     f: textfile;
     i: LongInt;
     ii, t: Longword;
-    c1, c2: TSDL_Color;
+    c2: TSDL_Color;
 
     procedure CheckRect(Width, Height, x, y, w, h: LongWord);
     begin
--- a/hedgewars/uScript.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uScript.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -36,6 +36,7 @@
 
 procedure ScriptLoad(name : shortstring);
 procedure ScriptOnGameInit;
+procedure ScriptOnScreenResize();
 
 procedure ScriptCall(fname : shortstring);
 function ScriptCall(fname : shortstring; par1: LongInt) : LongInt;
@@ -1502,6 +1503,29 @@
         lua_pushinteger(L, ord(CurrentHedgehog^.CurAmmoType));
     lc_getcurammotype := 1;
 end;
+
+// boolean TestRectForObstacle(x1, y1, x2, y2, landOnly)
+function lc_testrectforobstacle(L : Plua_State) : LongInt; Cdecl;
+var rtn: Boolean;
+begin
+    if lua_gettop(L) <> 5 then
+        begin
+        LuaError('Lua: Wrong number of parameters passed to TestRectForObstacle!');
+        lua_pushnil(L); // return value on stack (nil)
+        end
+    else
+        begin
+        rtn:= TestRectancleForObstacle(
+                    lua_tointeger(L, 1),
+                    lua_tointeger(L, 2),
+                    lua_tointeger(L, 3),
+                    lua_tointeger(L, 4),
+                    lua_toboolean(L, 5)
+                    );
+        lua_pushboolean(L, rtn);
+        end;
+    lc_testrectforobstacle:= 1
+end;
 ///////////////////
 
 procedure ScriptPrintStack;
@@ -1624,6 +1648,16 @@
 ScriptSetInteger('TeamsCount', TeamsCount)
 end;
 
+
+// Update values of screen dimensions and allow script to react to resolution change
+procedure ScriptOnScreenResize();
+begin
+ScriptSetInteger('ScreenHeight', cScreenHeight);
+ScriptSetInteger('ScreenWidth', cScreenWidth);
+ScriptCall('onScreenResize');
+end;
+
+
 procedure ScriptLoad(name : shortstring);
 var ret : LongInt;
       s : shortstring;
@@ -1798,7 +1832,6 @@
 // import some variables
 ScriptSetInteger('LAND_WIDTH', LAND_WIDTH);
 ScriptSetInteger('LAND_HEIGHT', LAND_HEIGHT);
-
 ScriptSetString('L', cLocale);
 
 // import game flags
@@ -1972,6 +2005,7 @@
 lua_register(luaState, 'SetHogHat', @lc_sethoghat);
 lua_register(luaState, 'PlaceGirder', @lc_placegirder);
 lua_register(luaState, 'GetCurAmmoType', @lc_getcurammotype);
+lua_register(luaState, 'TestRectForObstacle', @lc_testrectforobstacle);
 
 
 ScriptClearStack; // just to be sure stack is empty
--- a/hedgewars/uStore.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uStore.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -259,18 +259,20 @@
     tmpsurf: PSDL_Surface;
     i: LongInt;
 begin
+AddFileLog('StoreLoad()');
 
-for fi:= Low(THWFont) to High(THWFont) do
-    with Fontz[fi] do
-        begin
-        s:= UserPathz[ptFonts] + '/' + Name;
-        if not FileExists(s) then s:= Pathz[ptFonts] + '/' + Name;
-        WriteToConsole(msgLoading + s + ' (' + inttostr(Height) + 'pt)... ');
-        Handle:= TTF_OpenFont(Str2PChar(s), Height);
-        SDLTry(Handle <> nil, true);
-        TTF_SetFontStyle(Handle, style);
-        WriteLnToConsole(msgOK)
-        end;
+if not reload then
+    for fi:= Low(THWFont) to High(THWFont) do
+        with Fontz[fi] do
+            begin
+            s:= UserPathz[ptFonts] + '/' + Name;
+            if not FileExists(s) then s:= Pathz[ptFonts] + '/' + Name;
+            WriteToConsole(msgLoading + s + ' (' + inttostr(Height) + 'pt)... ');
+            Handle:= TTF_OpenFont(Str2PChar(s), Height);
+            SDLTry(Handle <> nil, true);
+            TTF_SetFontStyle(Handle, style);
+            WriteLnToConsole(msgOK)
+            end;
 
 WriteNames(fnt16);
 MakeCrossHairs;
@@ -345,10 +347,10 @@
 // This should maybe be flagged. It wastes quite a bit of memory.
                 if not reload then
                     begin
-{$IFNDEF DARWIN & WIN32}
+{$IF DEFINED(DARWIN) OR DEFINED(WIN32)}
+                    Surface:= tmpsurf 
+{$ELSE}
                     if saveSurf then Surface:= tmpsurf else SDL_FreeSurface(tmpsurf)
-{$ELSE}
-                    Surface:= tmpsurf 
 {$ENDIF}
                     end
                 end
@@ -756,7 +758,6 @@
     SDL_GL_SwapBuffers();
 {$ENDIF}
     inc(Step);
-
 end;
 
 procedure FinishProgress;
@@ -764,6 +765,7 @@
     WriteLnToConsole('Freeing progress surface... ');
     FreeTexture(ProgrTex);
     uMobile.GameLoaded();
+    Step:= 0
 end;
 
 function RenderHelpWindow(caption, subcaption, description, extra: ansistring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
@@ -948,7 +950,6 @@
     reinit: boolean;
     {$IFDEF SDL13}x, y: LongInt;{$ENDIF}
 begin
-    s:= s; // avoid compiler hint
     if Length(s) = 0 then cFullScreen:= not cFullScreen
     else cFullScreen:= s = '1';
 
@@ -981,7 +982,8 @@
         end
     else
         begin
-{$IFDEF DARWIN | WIN32}
+        SetScale(cDefaultZoomLevel);
+{$IF DEFINED(DARWIN) OR DEFINED(WIN32)}
         reinit:= true;
 {$ENDIF}
         AddFileLog('Freeing old primary surface...');
@@ -990,7 +992,13 @@
         end;
 
     // these attributes must be set up before creating the sdl window
+{$IFNDEF WIN32}
+(* On a large number of testers machines, SDL default to software rendering when opengl attributes were set.
+   These attributes were "set" after CreateWindow in .15, which probably did nothing.
+   IMO we should rely on the gl_config defaults from SDL, and use SDL_GL_GetAttribute to possibly post warnings if any
+   bad values are set.  *)
     SetupOpenGLAttributes();
+{$ENDIF}
 {$IFDEF SDL13}
     // these values in x and y make the window appear in the center
     x:= SDL_WINDOWPOS_CENTERED_MASK;
@@ -1038,7 +1046,9 @@
 
         StoreRelease(true);
         StoreLoad(true);
+
         ResetLand;
+
         UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT)
         end;
 end;
--- a/hedgewars/uTeams.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uTeams.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -234,7 +234,7 @@
 
 ApplyAmmoChanges(CurrentHedgehog^);
 
-if not CurrentTeam^.ExtDriven then SetBinds(CurrentTeam^.Binds);
+if (not CurrentTeam^.ExtDriven) and (CurrentHedgehog^.BotLevel = 0) then SetBinds(CurrentTeam^.Binds);
 
 bShowFinger:= true;
 
@@ -427,11 +427,17 @@
 with Team do
     for i:= 0 to cMaxHHIndex do
         with Hedgehogs[i] do
+            begin
+            if Hedgehogs[i].GearHidden <> nil then
+                RestoreHog(@Hedgehogs[i]);
+
             if Gear <> nil then
                 begin
                 Gear^.Invulnerable:= false;
-                Gear^.Damage:= Gear^.Health
+                Gear^.Damage:= Gear^.Health;
+                Gear^.State:= Gear^.State or gstHHGone
                 end
+            end
 end;
 
 procedure chAddHH(var id: shortstring);
--- a/hedgewars/uTypes.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uTypes.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -82,7 +82,7 @@
             sprSMineOff, sprSMineOn, sprHandSMine, sprHammer,
             sprHandResurrector, sprCross, sprAirDrill, sprNapalmBomb,
             sprBulletHit, sprSnowball, sprHandSnowball, sprSnow,
-            sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet
+            sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis
             );
 
     // Gears that interact with other Gears and/or Land
@@ -136,7 +136,7 @@
             sndPoisonCough, sndPoisonMoan, sndBirdyLay, sndWhistle, sndBeeWater,
             sndPiano0, sndPiano1, sndPiano2, sndPiano3, sndPiano4, sndPiano5, sndPiano6, sndPiano7, sndPiano8,
             sndSkip, sndSineGun, sndOoff1, sndOoff2, sndOoff3, sndWhack,
-            sndComeonthen, sndParachute, sndBump, sndResurrector, sndPlane);
+            sndComeonthen, sndParachute, sndBump, sndResurrector, sndPlane, sndTardis);
 
     // Available ammo types to be used by hedgehogs
     TAmmoType  = (amNothing, amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amPickHammer, // 6
--- a/hedgewars/uUtils.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uUtils.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -341,20 +341,7 @@
     Assign(f,'../Documents/hw-' + cLogfileBase + '.log');
     Rewrite(f);
 {$ELSE}
-    if (ParamStr(1) <> '') and (ParamStr(2) <> '') then
-        if (ParamCount <> 3) and (ParamCount <> cDefaultParamNum) then
-        begin
-            i:= 0;
-            while(i < 7) do
-            begin
-                assign(f, ExtractFileDir(ParamStr(2)) + '/' + cLogfileBase + inttostr(i) + '.log');
-                rewrite(f);
-                if IOResult = 0 then break;
-                inc(i)
-            end;
-            if i = 7 then f:= stderr; // if everything fails, write to stderr
-        end
-        else
+    if (UserPathPrefix <> '') then
         begin
             i:= 0;
             while(i < 7) do
--- a/hedgewars/uVariables.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uVariables.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -25,12 +25,15 @@
 
 var
 /////// init flags ///////
-    cMinScreenWidth   : LongInt     = 480;
-    cMinScreenHeight  : LongInt     = 320;
-    cScreenWidth      : LongInt     = 1024;
-    cScreenHeight     : LongInt     = 768;
-    cOrigScreenWidth  : LongInt     = 1024;
-    cOrigScreenHeight : LongInt     = 768;
+    cMinScreenWidth    : LongInt     = 640;
+    cMinScreenHeight   : LongInt     = 480;
+    cScreenWidth       : LongInt     = 1024;
+    cScreenHeight      : LongInt     = 768;
+    cOrigScreenWidth   : LongInt     = 1024;
+    cOrigScreenHeight  : LongInt     = 768;
+    cNewScreenWidth    : LongInt     = 1024;
+    cNewScreenHeight   : LongInt     = 768;
+    cScreenResizeDelay : LongWord    = 0;
     cBits           : LongInt     = 32;
     ipcPort         : Word        = 0;
     cFullScreen     : boolean     = false;
@@ -487,7 +490,7 @@
             (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
             (FileName:  'Molotov'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMolotov
+            Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: 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
             (FileName: 'SmokeWhite'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
@@ -614,7 +617,9 @@
             (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
             (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; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet
+            (FileName:  'TARDIS'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  48; Height: 79; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true)// sprTardis
             );
 
 
@@ -751,7 +756,8 @@
             (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:                'plane.ogg'; Path: ptSounds), // sndPlane
+            (FileName:                'TARDIS.ogg'; Path: ptSounds) // sndTardis
             );
 
     Ammoz: array [TAmmoType] of record
--- a/hedgewars/uVisualGears.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uVisualGears.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -29,7 +29,7 @@
  * E.g.: background flakes, visual effects: explosion, smoke trails, etc.
  *)
 interface
-uses uConsts, uFloat, GLunit, uTypes;
+uses uConsts, uFloat, GLunit, uTypes, uWorld;
 
 procedure initModule;
 procedure freeModule;
@@ -317,10 +317,11 @@
                 dy:= 0;
                 FrameTicks:= 350;
                 Frame:= 7;
-                Angle := 0;
+                Angle:= 0;
                 end;
 vgtSmoothWindBar: Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed);
  vgtStraightShot: begin
+                Scale:= 1.0;
                 dx:= 0.001 * random(45);
                 dy:= 0.001 * (random(20) + 25);
                 State:= ord(sprHealth);
@@ -494,6 +495,7 @@
 var Gear: PVisualGear;
     tinted: boolean;
     tmp: real;
+    i: LongInt;
 begin
 case Layer of
     // this layer is very distant in the background when stereo
@@ -592,8 +594,10 @@
                                    SetScale(zoom)
                                    end
                                end;
-    //if Ger^.Tex <> nil then DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
-               vgtStraightShot: DrawRotatedF(TSprite(Gear^.State), round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
+               vgtStraightShot: begin 
+                                if Gear^.dX < 0 then i:= -1 else i:= 1;
+                                DrawTextureF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height);
+                                end;
            end;
            if (cReducedQuality and rqAntiBoom) = 0 then
                case Gear^.Kind of
@@ -645,14 +649,7 @@
                                    end;
                                DrawRotatedF(sprFeather, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
                              end;
-                   vgtEgg: begin
-                           if Gear^.FrameTicks < $FF then
-                               begin
-                                   Tint($FF, $FF, $FF, Gear^.FrameTicks);
-                                   tinted:= true
-                               end;
-                           DrawRotatedF(sprEgg, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
-                           end;
+                   vgtEgg: DrawRotatedF(sprEgg, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
                    vgtBeeTrace: begin
                                 if Gear^.FrameTicks < $FF then
                                     Tint($FF, $FF, $FF, Gear^.FrameTicks div 2)
--- a/hedgewars/uWorld.pas	Wed Sep 14 22:27:22 2011 +0200
+++ b/hedgewars/uWorld.pas	Wed Sep 14 22:39:39 2011 +0200
@@ -1178,16 +1178,16 @@
 end;
 
 procedure MoveCamera;
-var EdgesDist, wdy, shs: LongInt;
+var EdgesDist, wdy, shs,z: LongInt;
     PrevSentPointTime: LongWord = 0;
 begin
 {$IFNDEF IPHONEOS}
 if (not (CurrentTeam^.ExtDriven and isCursorVisible and not bShowAmmoMenu)) and cHasFocus and (GameState <> gsConfirm) then
     uCursor.updatePosition();
 {$ENDIF}
-
+z:= round(200/zoom);
 if (not PlacingHogs) and (FollowGear <> nil) and (not isCursorVisible) and (not fastUntilLag) then
-    if (not autoCameraOn) or (abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y) > 4) then
+    if (not autoCameraOn) or ((abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y)) > 4) then
     begin
         FollowGear:= nil;
         prevPoint:= CursorPoint;
@@ -1195,8 +1195,8 @@
     end
     else
     begin
-        CursorPoint.X:= (prevPoint.X * 7 + hwRound(FollowGear^.X) + hwSign(FollowGear^.dX) * 100 + WorldDx) div 8;
-        CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y) + WorldDy)) div 8;
+        CursorPoint.X:= (prevPoint.X * 7 + hwRound(FollowGear^.X) + hwSign(FollowGear^.dX) * z + WorldDx) div 8;
+        CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y)+ hwSign(FollowGear^.dY) * z + WorldDy)) div 8;
     end;
 
 wdy:= trunc(cScreenHeight / cScaleFactor) + cScreenHeight div 2 - cWaterLine - cVisibleWater;
@@ -1314,9 +1314,12 @@
 
 procedure ShakeCamera(amount: LongWord);
 begin
-    amount:= Max(1, amount);
-    WorldDx:= WorldDx - amount + LongInt(getRandom(1 + amount * 2));
-    WorldDy:= WorldDy - amount + LongInt(getRandom(1 + amount * 2));
+    if isCursorVisible then exit;
+    amount:= Max(1, round(amount*zoom/2));
+    WorldDx:= WorldDx - amount + LongInt(random(1 + amount * 2));
+    WorldDy:= WorldDy - amount + LongInt(random(1 + amount * 2));
+    //CursorPoint.X:= CursorPoint.X - amount + LongInt(random(1 + amount * 2));
+    //CursorPoint.Y:= CursorPoint.Y - amount + LongInt(random(1 + amount * 2))
 end;
 
 
--- a/misc/hats_js_anim.xhtml	Wed Sep 14 22:27:22 2011 +0200
+++ b/misc/hats_js_anim.xhtml	Wed Sep 14 22:39:39 2011 +0200
@@ -12,7 +12,6 @@
     -moz-background-size: 200%;
     background-size: 200%;
     font-family: sans-serif;
-    overflow: hidden;
 }
 h1 { text-shadow: 0 0 2px white; }
 a 
@@ -45,36 +44,10 @@
 //<![CDATA[
 /* javascript version of a sprite sheet - this could be pretty trivially done in pure HTML, but maintenance
 would be easier with a server-side portion. list of sprites could be gotten from googlecode, but would require XSS whitelisting */
-var masks = [
-'4gsuif',          'Coonskin3',     'jigglypuff',   'NinjaStraight',       'Ryu',              'sth_Super',
-'AkuAku',          'Cororon',       'judo',         'NinjaTriangle',       'Samurai',          'sth_Tails',
-'android',         'Cowboy',        'junior',       'OldMan',              'Samus',            'stormcloud',
-'angel',           'crown',         'Ken',          'OrangeHair',          'Santa',            'stormtrooper',
-'anzac',           'cyborg',        'KirbyMask',    'orange',              'SauceBoatSilver',  'StrawHatEyes',
-'apple',           'darthvader',    'kiss_criss',   'Pantsu',              'ShaggyYeti',       'StrawHatFacial',
-'ash',             'Deer',          'kiss_frehley', 'Pig',                 'sheep',            'StrawHat',
-'Balrog',          'diglett',       'kiss_simmons', 'pikachu',             'ShortHair_Black',  'Sunglasses',
-'banana',          'Disguise',      'kiss_stanley', 'PinkHair',            'ShortHair_Brown',  'SunWukong',
-'Bandit',          'Dragon',        'knight',       'pinksunhat',          'ShortHair_Grey',   'Teacup',
-'beaver',          'dwarf',         'Kululun',      'pirate_jack_bandana', 'ShortHair_Red',    'Teapot',
-'beefeater',       'eastertop',     'Ladle',        'pirate_jack',         'ShortHair_Yellow', 'Terminator_Glasses',
-'Blanka',          'Elvis',         'lambda',       'Plunger',             'Skull',            'test',
-'BlankaToothless', 'Eva_00b',       'Laminaria',    'policecap',           'Sleepwalker',      'thug',
-'BlueCap',         'Eva_00y',       'laurel',       'porkey',              'slowpoke',         'Toad',
-'BlueHair',        'Falcon',        'lemon',        'PrincessDaisy',       'Sniper',           'tophats',
-'Bob',             'Gasmask',       'link',         'PrincessPeach',       'Sonic',            'ushanka',
-'BrainSlugMouth',  'Geordi',        'lugia',        'Pumpkin_Hat',         'SparkleSuperFun',  'Vega',
-'BrainSlug',       'Glasses',       'Luigi',        'PurpleHair',          'spartan',          'venom',
-'Bub',             'GreenCap',      'Mario',        'quotecap',            'spidey',           'Viking',
-'Bunny',           'GreenHair',     'MegaHogX',     'Rain',                'squirtle',         'voltorb',
-'charmander',      'GreyHair',      'mickey_ears',  'Rambo',               'sth_AmyClassic',   'Wario',
-'chef',            'Guile',         'Moose',        'rasta',               'sth_Amy',          'WhySoSerious',
-'chikorita',       'HogInTheHat',   'mp3',          'RedCap',              'sth_Eggman',       'WizardHat',
-'Chunli',          'Honda',         'mudkip',       'RedHair',             'sth_Knux',         'YellowCap',
-'clown-copper',    'IndianChief',   'Mummy',        'RobinHood',           'sth_Metal',        'YellowHair',
-'clown-crossed',   'InfernalHorns', 'naruto',       'royalguard',          'sth_Shadow',       'Zombi',
-'clown',           'Jason',         'NinjaFull',    'RSR',                 'sth_Sonic'];
+/*var masks = ['2001suit2', '2001suit', '4gsuif', 'AkuAku', 'android', 'angel', 'anzac', 'apple', 'ash', 'Balrog', 'banana', 'Bandit', 'bat', 'beaver', 'beefeater', 'Blanka', 'BlankaToothless', 'BlueCap', 'BlueHair', 'bobby2v', 'bobby', 'Bob', 'BrainSlugMouth', 'BrainSlug', 'britishpithhelmet', 'britmedic', 'britsapper', 'Bub', 'Bunny', 'bushhider', 'charlesdegaulle', 'charmander', 'chef', 'chikorita', 'Chunli', 'clown-copper', 'clown-crossed', 'clown', 'Coonskin3', 'Cororon', 'Cowboy', 'crown', 'cyborg', 'darthvader', 'Deer', 'desertgrenadier01', 'desertgrenadier02', 'desertgrenadier04', 'desertgrenadier05', 'desertgrenadierofficer', 'desertmedic', 'desertsapper1', 'desertsapper2', 'diglett', 'Disguise', 'Dragon', 'dwarf', 'eastertop', 'Elvis', 'Eva_00b', 'Eva_00y', 'Falcon', 'frenchwwigasmask', 'frenchwwihelmet', 'Gasmask', 'Geordi', 'germanwiimedichelmet', 'germanwwihelmetmustache', 'germanwwiipithhelmetdes', 'germanwwitankhelmet', 'Glasses', 'GreenCap', 'GreenHair', 'grenadier1', 'GreyHair', 'Guile', 'hedgehogk', 'HogInTheHat', 'hogpharoah', 'Honda', 'IndianChief', 'infernalhorns', 'InfernalHorns', 'Jason', 'jigglypuff', 'judo', 'junior', 'Ken', 'KirbyMask', 'kiss_criss', 'kiss_frehley', 'kiss_simmons', 'kiss_stanley', 'knight', 'Kululun', 'Ladle', 'lambda', 'Laminaria', 'laurel', 'lemon', 'link', 'lugia', 'Luigi', 'Mario', 'MegaHogX', 'metalband', 'mexicansunbrero', 'mickey_ears', 'Moose', 'mp3', 'mudkip', 'Mummy', 'naruto', 'NinjaFull', 'NinjaStraight', 'NinjaTriangle', 'OldMan', 'OrangeHair', 'orange', 'Pantsu', 'Pig', 'pikachu', 'PinkHair', 'pinksunhat', 'pirate_jack_bandana', 'pirate_jack', 'plainpith', 'Plunger', 'policecap', 'porkey', 'PrincessDaisy', 'PrincessPeach', 'Pumpkin_Hat', 'PurpleHair', 'quotecap', 'Rain', 'Rambo', 'rasta', 'RedCap', 'RedHair', 'RobinHood', 'royalguard', 'RSR', 'Ryu', 'Samurai', 'Samus', 'Santa', 'SauceBoatSilver', 'ShaggyYeti', 'sheep', 'ShortHair_Black', 'ShortHair_Brown', 'ShortHair_Grey', 'ShortHair_Red', 'ShortHair_Yellow', 'Skull', 'Sleepwalker', 'slowpoke', 'Sniper', 'Sonic', 'sovietcomrade2', 'sovietcomrade', 'SparkleSuperFun', 'SparkssHelmet', 'spartan', 'spcartman', 'spidey', 'spkenny', 'spkyle', 'spstan', 'squirtle', 'sth_AmyClassic', 'sth_Amy', 'sth_Eggman', 'sth_Knux', 'sth_Metal', 'sth_Shadow', 'sth_Sonic', 'sth_Super', 'sth_Tails', 'stormcloud', 'stormtrooper', 'StrawHatEyes', 'StrawHatFacial', 'StrawHat', 'Sunglasses', 'SunWukong', 'Teacup', 'Teapot', 'terminatorc', 'Terminator_Glasses', 'thug', 'Toad', 'tophats', 'touhou_chen', 'touhou_marisa', 'touhou_patchouli', 'touhou_remelia', 'touhou_suwako', 'touhou_yukari', 'trenchgrenadier1', 'trenchgrenadier2', 'trenchgrenadier3', 'ushanka', 'vampirichog', 'Vega', 'venom', 'Viking', 'voltorb', 'Wario', 'WhySoSerious', 'WizardHat', 'YellowCap', 'YellowHair', 'Zombi'];*/
+var masks = [];
 var themes = {
+"Golf":1,
 "Stage":1,
 "Island":0,
 "Eyes":0,
@@ -107,6 +80,21 @@
 var animationInterval;
 window.onload = function()
 {
+    var xml=new XMLHttpRequest();
+    xml.open("GET", "/hg/share/hedgewars/Data/Graphics/Hats/", false);
+    xml.send(null);
+    /*var resp = xml.responseXML; unfortunately not served as XHTML
+    var a = resp.getElementsByTagName("a");
+    for(var i=0;i<a.length;i++);
+        if (/\.png/.test(a[0].href)) m.push(a[0].replace(/.png/,''));*/
+
+    var resp = xml.responseText;
+    var r = />([^<]*).png</g;
+    var x;
+    while(x = r.exec(resp)) 
+        if (!/^Team|NoHat/.test(x[1])) // Exclude team coloured ones as repetitive, NoHat one as uninteresting
+            masks.push(x[1]);
+
     var opt = document.createElement("option");
     opt.appendChild(document.createTextNode(""));
     var sel = document.body.appendChild(document.createElement("select"));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/CMakeLists.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,12 @@
+set(QT_USE_QTCORE TRUE)
+
+find_package(Qt4 REQUIRED)
+include(${QT_USE_FILE})
+
+
+file(GLOB SRCS "*.c" "*.cpp")
+file(GLOB PUBLIC_HEADERS "*.h")
+qt4_wrap_cpp(MOC_SRCS "quazipfile.h")
+set(SRCS ${SRCS} ${MOC_SRCS})
+
+add_library(quazip STATIC ${SRCS})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/JlCompress.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,468 @@
+#include "JlCompress.h"
+#include <QDebug>
+/**OK
+ * Comprime il file fileName, nell'oggetto zip, con il nome fileDest.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
+ * * non è possibile aprire il file d'origine;
+ * * non è possibile creare il file all'interno dell'oggetto zip;
+ * * si è rilevato un errore nella copia dei dati;
+ * * non è stato possibile chiudere il file all'interno dell'oggetto zip;
+ */
+bool JlCompress::compressFile(QuaZip* zip, QString fileName, QString fileDest) {
+    // zip: oggetto dove aggiungere il file
+    // fileName: nome del file reale
+    // fileDest: nome del file all'interno del file compresso
+
+    // Controllo l'apertura dello zip
+    if (!zip) return false;
+    if (zip->getMode()!=QuaZip::mdCreate &&
+        zip->getMode()!=QuaZip::mdAppend &&
+        zip->getMode()!=QuaZip::mdAdd) return false;
+
+    // Apro il file originale
+    QFile inFile;
+    inFile.setFileName(fileName);
+    if(!inFile.open(QIODevice::ReadOnly)) return false;
+
+    // Apro il file risulato
+    QuaZipFile outFile(zip);
+    if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileDest, inFile.fileName()))) return false;
+
+    // Copio i dati
+    char c;
+    while(inFile.getChar(&c)&&outFile.putChar(c));
+    if(outFile.getZipError()!=UNZ_OK) return false;
+
+    // Chiudo i file
+    outFile.close();
+    if (outFile.getZipError()!=UNZ_OK) return false;
+    inFile.close();
+
+    return true;
+}
+
+/**OK
+ * Comprime la cartella dir nel file fileCompressed, se recursive è true allora
+ * comprime anche le sotto cartelle. I nomi dei file preceduti dal path creato
+ * togliendo il pat della cartella origDir al path della cartella dir.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
+ * * la cartella dir non esiste;
+ * * la compressione di una sotto cartella fallisce (1);
+ * * la compressione di un file fallisce;
+ * (1) La funzione si richiama in maniera ricorsiva per comprimere le sotto cartelle
+ * dunque gli errori di compressione di una sotto cartella sono gli stessi di questa
+ * funzione.
+ */
+bool JlCompress::compressSubDir(QuaZip* zip, QString dir, QString origDir, bool recursive) {
+    // zip: oggetto dove aggiungere il file
+    // dir: cartella reale corrente
+    // origDir: cartella reale originale
+    // (path(dir)-path(origDir)) = path interno all'oggetto zip
+
+    // Controllo l'apertura dello zip
+    if (!zip) return false;
+    if (zip->getMode()!=QuaZip::mdCreate &&
+        zip->getMode()!=QuaZip::mdAppend &&
+        zip->getMode()!=QuaZip::mdAdd) return false;
+
+    // Controllo la cartella
+    QDir directory(dir);
+    if (!directory.exists()) return false;
+
+    // Se comprimo anche le sotto cartelle
+    if (recursive) {
+        // Per ogni sotto cartella
+        QFileInfoList files = directory.entryInfoList(QDir::AllDirs|QDir::NoDotAndDotDot);
+        foreach (QFileInfo file, files) {
+            // Comprimo la sotto cartella
+            if(!compressSubDir(zip,file.absoluteFilePath(),origDir,recursive)) return false;
+        }
+    }
+
+    // Per ogni file nella cartella
+    QFileInfoList files = directory.entryInfoList(QDir::Files);
+    QDir origDirectory(origDir);
+    foreach (QFileInfo file, files) {
+        // Se non è un file o è il file compresso che sto creando
+        if(!file.isFile()||file.absoluteFilePath()==zip->getZipName()) continue;
+
+        // Creo il nome relativo da usare all'interno del file compresso
+        QString filename = origDirectory.relativeFilePath(file.absoluteFilePath());
+
+        // Comprimo il file
+        if (!compressFile(zip,file.absoluteFilePath(),filename)) return false;
+    }
+
+    return true;
+}
+
+/**OK
+ * Estrae il file fileName, contenuto nell'oggetto zip, con il nome fileDest.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato di estrarre.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'estrazione di file;
+ * * non è possibile aprire il file all'interno dell'oggetto zip;
+ * * non è possibile creare il file estratto;
+ * * si è rilevato un errore nella copia dei dati (1);
+ * * non è stato possibile chiudere il file all'interno dell'oggetto zip (1);
+ *
+ * (1): prima di uscire dalla funzione cancella il file estratto.
+ */
+bool JlCompress::extractFile(QuaZip* zip, QString fileName, QString fileDest) {
+    // zip: oggetto dove aggiungere il file
+    // filename: nome del file reale
+    // fileincompress: nome del file all'interno del file compresso
+
+    // Controllo l'apertura dello zip
+    if (!zip) return false;
+    if (zip->getMode()!=QuaZip::mdUnzip) return false;
+
+    // Apro il file compresso
+    zip->setCurrentFile(fileName);
+    QuaZipFile inFile(zip);
+    if(!inFile.open(QIODevice::ReadOnly) || inFile.getZipError()!=UNZ_OK) return false;
+
+    // Controllo esistenza cartella file risultato
+    QDir().mkpath(QFileInfo(fileDest).absolutePath());
+
+    // Apro il file risultato
+    QFile outFile;
+    outFile.setFileName(fileDest);
+    if(!outFile.open(QIODevice::WriteOnly)) return false;
+
+    // Copio i dati
+    char c;
+    while(inFile.getChar(&c)) outFile.putChar(c);
+    if (inFile.getZipError()!=UNZ_OK) {
+        removeFile(QStringList(fileDest));
+        return false;
+    }
+
+    // Chiudo i file
+    inFile.close();
+    if (inFile.getZipError()!=UNZ_OK) {
+        removeFile(QStringList(fileDest));
+        return false;
+    }
+    outFile.close();
+
+    return true;
+}
+
+/**
+ * Rimuove i file il cui nome è specificato all'interno di listFile.
+ * Restituisce true se tutti i file sono stati cancellati correttamente, attenzione
+ * perchè può restituire false anche se alcuni file non esistevano e si è tentato
+ * di cancellarli.
+ */
+bool JlCompress::removeFile(QStringList listFile) {
+    bool ret = true;
+    // Per ogni file
+    for (int i=0; i<listFile.count(); i++) {
+        // Lo elimino
+        ret = ret && QFile::remove(listFile.at(i));
+    }
+    return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+/**OK
+ * Comprime il file fileName nel file fileCompressed.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione del file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressFile(QString fileCompressed, QString file) {
+    // Creo lo zip
+    QuaZip* zip  = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+    QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+    if(!zip->open(QuaZip::mdCreate)) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+
+    // Aggiungo il file
+    if (!compressFile(zip,file,QFileInfo(file).fileName())) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+
+    // Chiudo il file zip
+    zip->close();
+    if(zip->getZipError()!=0) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+    delete zip;
+
+    return true;
+}
+
+/**OK
+ * Comprime i file specificati in files nel file fileCompressed.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressFiles(QString fileCompressed, QStringList files) {
+    // Creo lo zip
+    QuaZip* zip  = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+    QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+    if(!zip->open(QuaZip::mdCreate)) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+
+    // Comprimo i file
+    QFileInfo info;
+    foreach (QString file, files) {
+        info.setFile(file);
+        if (!info.exists() || !compressFile(zip,file,info.fileName())) {
+            delete zip;
+            QFile::remove(fileCompressed);
+            return false;
+        }
+    }
+
+    // Chiudo il file zip
+    zip->close();
+    if(zip->getZipError()!=0) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+    delete zip;
+
+    return true;
+}
+
+/**OK
+ * Comprime la cartella dir nel file fileCompressed, se recursive è true allora
+ * comprime anche le sotto cartelle.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressDir(QString fileCompressed, QString dir, bool recursive) {
+    // Creo lo zip
+    QuaZip* zip  = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+    QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+    if(!zip->open(QuaZip::mdCreate)) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+
+    // Aggiungo i file e le sotto cartelle
+    if (!compressSubDir(zip,dir,dir,recursive)<0) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+
+    // Chiudo il file zip
+    zip->close();
+    if(zip->getZipError()!=0) {
+        delete zip;
+        QFile::remove(fileCompressed);
+        return false;
+    }
+    delete zip;
+
+    return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+/**OK
+ * Estrae il file fileName, contenuto nel file fileCompressed, con il nome fileDest.
+ * Se fileDest = "" allora il file viene estratto con lo stesso nome con cui è
+ * stato compresso.
+ * Se la funzione fallisce cancella il file che si è tentato di estrarre.
+ * Restituisce il nome assoluto del file estratto.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * l'estrazione del file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QString JlCompress::extractFile(QString fileCompressed, QString fileName, QString fileDest) {
+    // Apro lo zip
+    QuaZip* zip  = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+    if(!zip->open(QuaZip::mdUnzip)) {
+        delete zip;
+        return QString();
+    }
+
+    // Estraggo il file
+    if (fileDest.isEmpty()) fileDest = fileName;
+    if (!extractFile(zip,fileName,fileDest)) {
+        delete zip;
+        return QString();
+    }
+
+    // Chiudo il file zip
+    zip->close();
+    if(zip->getZipError()!=0) {
+        removeFile(QStringList(fileDest));
+        return QString();
+    }
+    delete zip;
+
+    return QFileInfo(fileDest).absoluteFilePath();
+}
+
+/**OK
+ * Estrae i file specificati in files, contenuti nel file fileCompressed, nella
+ * cartella dir. La struttura a cartelle del file compresso viene rispettata.
+ * Se dir = "" allora il file viene estratto nella cartella corrente.
+ * Se la funzione fallisce cancella i file che si è tentato di estrarre.
+ * Restituisce i nomi assoluti dei file estratti.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * l'estrazione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::extractFiles(QString fileCompressed, QStringList files, QString dir) {
+    // Creo lo zip
+    QuaZip* zip  = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+    if(!zip->open(QuaZip::mdUnzip)) {
+        delete zip;
+        return QStringList();
+    }
+
+    // Estraggo i file
+    for (int i=0; i<files.count(); i++) {
+        if (!extractFile(zip, files.at(i), QDir(dir).absoluteFilePath(files.at(i)))) {
+            delete zip;
+            removeFile(files);
+            return QStringList();
+        }
+        files[i] = QDir(dir).absoluteFilePath(files.at(i));
+    }
+
+    // Chiudo il file zip
+    zip->close();
+    if(zip->getZipError()!=0) {
+        delete zip;
+        removeFile(files);
+        return QStringList();
+    }
+    delete zip;
+
+    return files;
+}
+
+/**OK
+ * Estrae il file fileCompressed nella cartella dir.
+ * Se dir = "" allora il file viene estratto nella cartella corrente.
+ * Se la funzione fallisce cancella i file che si è tentato di estrarre.
+ * Restituisce i nomi assoluti dei file estratti.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::extractDir(QString fileCompressed, QString dir) {
+    // Apro lo zip
+    QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+    if(!zip->open(QuaZip::mdUnzip)) {
+        delete zip;
+        return QStringList();
+    }
+
+    // Estraggo i file
+    QStringList lst = getFileList(fileCompressed);
+
+    QDir directory(dir);
+    for (int i=0; i<lst.count(); i++) {
+        QString absFilePath = directory.absoluteFilePath(lst.at(i));
+        if (!extractFile(zip, lst.at(i), absFilePath)) {
+            delete zip;
+            removeFile(lst);
+            return QStringList();
+        }
+        lst[i] = absFilePath;
+    }
+
+    // Chiudo il file zip
+    zip->close();
+    if(zip->getZipError()!=0) {
+        delete zip;
+        removeFile(lst);
+        return QStringList();
+    }
+    delete zip;
+
+    return lst;
+}
+
+/**OK
+ * Restituisce la lista dei file resenti nel file compresso fileCompressed.
+ * Se la funzione fallisce, restituisce un elenco vuoto.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la richiesta di informazioni di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::getFileList(QString fileCompressed) {
+    // Apro lo zip
+    QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+    if(!zip->open(QuaZip::mdUnzip)) {
+        delete zip;
+        return QStringList();
+    }
+
+    // Estraggo i nomi dei file
+    QStringList lst;
+    QuaZipFileInfo info;
+    for(bool more=zip->goToFirstFile(); more; more=zip->goToNextFile()) {
+      if(!zip->getCurrentFileInfo(&info)) {
+          delete zip;
+          return QStringList();
+      }
+      lst << info.name;
+      //info.name.toLocal8Bit().constData()
+    }
+
+    // Chiudo il file zip
+    zip->close();
+    if(zip->getZipError()!=0) {
+        delete zip;
+        return QStringList();
+    }
+    delete zip;
+
+    return lst;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/JlCompress.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,32 @@
+#ifndef JLCOMPRESSFOLDER_H_
+#define JLCOMPRESSFOLDER_H_
+
+#include "quazip.h"
+#include "quazipfile.h"
+#include "quazipfileinfo.h"
+#include <QString>
+#include <QDir>
+#include <QFileInfo>
+#include <QFile>
+
+class QUAZIP_EXPORT JlCompress {
+private:
+    static bool compressFile(QuaZip* zip, QString fileName, QString fileDest);
+    static bool compressSubDir(QuaZip* parentZip, QString dir, QString parentDir, bool recursive = true);
+    static bool extractFile(QuaZip* zip, QString fileName, QString fileDest);
+
+    static bool removeFile(QStringList listFile);
+
+public:
+    static bool compressFile(QString fileCompressed, QString file);
+    static bool compressFiles(QString fileCompressed, QStringList files);
+    static bool compressDir(QString fileCompressed, QString dir = QString(), bool recursive = true);
+
+public:
+    static QString extractFile(QString fileCompressed, QString file, QString fileDest = QString());
+    static QStringList extractFiles(QString fileCompressed, QStringList files, QString dir = QString());
+    static QStringList extractDir(QString fileCompressed, QString dir = QString());
+    static QStringList getFileList(QString fileCompressed);
+};
+
+#endif /* JLCOMPRESSFOLDER_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/crypt.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,135 @@
+/* crypt.h -- base code for crypt/uncrypt ZIPfile
+
+
+   Version 1.01e, February 12th, 2005
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   This code is a modified version of crypting code in Infozip distribution
+
+   The encryption/decryption parts of this source code (as opposed to the
+   non-echoing password parts) were originally written in Europe.  The
+   whole source package can be freely distributed, including from the USA.
+   (Prior to January 2000, re-export from the US was a violation of US law.)
+
+   This encryption code is a direct transcription of the algorithm from
+   Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
+   file (appnote.txt) is distributed with the PKZIP program (even in the
+   version without encryption capabilities).
+
+   If you don't need crypting in your application, just define symbols
+   NOCRYPT and NOUNCRYPT.
+
+   This code support the "Traditional PKWARE Encryption".
+
+   The new AES encryption added on Zip format by Winzip (see the page
+   http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
+   Encryption is not supported.
+*/
+
+#include "quazip_global.h"
+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab UNUSED)
+{
+    //(void) pcrc_32_tab; /* avoid "unused parameter" warning */
+    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an
+                     * unpredictable manner on 16-bit systems; not a problem
+                     * with any known compiler so far, though */
+
+    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
+{
+    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+    {
+      register int keyshift = (int)((*(pkeys+1)) >> 24);
+      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+    }
+    return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
+{
+    *(pkeys+0) = 305419896L;
+    *(pkeys+1) = 591751049L;
+    *(pkeys+2) = 878082192L;
+    while (*passwd != '\0') {
+        update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+        passwd++;
+    }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN  12
+   /* "last resort" source for second part of crypt seed pattern */
+#  ifndef ZCR_SEED2
+#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */
+#  endif
+
+static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
+    const char *passwd;         /* password string */
+    unsigned char *buf;         /* where to write header */
+    int bufSize;
+    unsigned long* pkeys;
+    const unsigned long* pcrc_32_tab;
+    unsigned long crcForCrypting;
+{
+    int n;                       /* index in random header */
+    int t;                       /* temporary */
+    int c;                       /* random byte */
+    unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+    static unsigned calls = 0;   /* ensure different random header each time */
+
+    if (bufSize<RAND_HEAD_LEN)
+      return 0;
+
+    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+     * output of rand() to get less predictability, since rand() is
+     * often poorly implemented.
+     */
+    if (++calls == 1)
+    {
+        srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+    }
+    init_keys(passwd, pkeys, pcrc_32_tab);
+    for (n = 0; n < RAND_HEAD_LEN-2; n++)
+    {
+        c = (rand() >> 7) & 0xff;
+        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+    }
+    /* Encrypt random header (last two bytes is high word of crc) */
+    init_keys(passwd, pkeys, pcrc_32_tab);
+    for (n = 0; n < RAND_HEAD_LEN-2; n++)
+    {
+        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+    }
+    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+    return n;
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/faq.dox	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,30 @@
+/**
+ * \page faq QuaZip FAQ
+ *
+ * <!--
+ * \ref faq-GPL "Q. Is it possible to release an LGPL version of the QuaZip?"
+ *
+ * \ref faq-non-QIODevice "Q. Is there any way to use QuaZipFile in Qt where you are supposed to use normal (non-zipped) file, but not through QIODevice API?"
+ * -->
+ *
+ * \anchor faq-GPL Q. Is it possible to release an LGPL version of the
+ * QuaZip?
+ *
+ * A. I do not know much about licensing, so I can answer for sure, but
+ * QuaZip was developed using Open Source edition of Qt, so I see no
+ * way it could be released under anything except GPL.
+ *
+ * \anchor faq-non-QIODevice Q. Is there any way to use QuaZipFile in Qt
+ * where you are supposed to use normal (non-zipped) file, but not
+ * through QIODevice API?
+ *
+ * A. Usually not. For example, if you are passing file name to some
+ * database driver (like SQLite), Qt usually just passes this name down
+ * to the 3rd-party library, which is usually does not know anything
+ * about QIODevice and therefore there is no way to pass QuaZipFile as
+ * normal file. However, if we are talking about some place where you
+ * pass file name, and then indirectly use QFile to open it, then it is
+ * a good idea to make overloaded method, which accepts QIODevice
+ * pointer. Then you would be able to pass QuaZipFile as well as many
+ * other nice things such as QBuffer or QProcess.
+ **/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/index.dox	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,192 @@
+/**
+ * \mainpage QuaZIP - Qt/C++ wrapper for ZIP/UNZIP package
+ *
+\htmlonly
+<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=142688&amp;type=7" style="width:210; height:62; border:none; float:right;" alt="Powered by SourceForge.net" /></a>
+\endhtmlonly
+ * \section overview Overview
+ * 
+ * QuaZIP is a simple C++ wrapper over <a
+ * href="http://www.winimage.com/zLibDll/unzip.html">Gilles Vollant's ZIP/UNZIP
+ * package</a> that can be used to access ZIP archives. It uses <a
+ * href="http://www.trolltech.com/products/qt/index.html">Trolltech's
+ * Qt toolkit</a>.
+ *
+ * If you do not know what Qt is, you have two options:
+ * - Just forget about QuaZIP.
+ * - Learn more about Qt by downloading it and/or reading excellent <a
+ *   href="http://doc.trolltech.com/">official Qt documentation</a>
+ *
+ * The choice is yours, but if you are really interested in
+ * cross-platform (Windows/Linux/BSD/UNIX/Mac/Others) software
+ * development, I would definitely recommend you the second choice ^_^
+ *
+ * QuaZIP allows you to access files inside ZIP archives using QIODevice
+ * API, and - yes! - that means that you can also use QTextStream,
+ * QDataStream or whatever you would like to use on your zipped files.
+ *
+ * QuaZIP provides complete abstraction of the ZIP/UNZIP API, for both
+ * reading from and writing to ZIP archives.
+ *
+ * \section platforms Platforms supported
+ *
+ * QuaZIP has been currently tested with Qt 4.0.0 on the following
+ * platforms:
+ * - linux-g++
+ * - freebsd-g++
+ * - hpux-acc
+ * - win32-g++ (MinGW)
+ * 
+ * No testing has been done on other systems. Of course, patches to
+ * make it work on any platform that it currently does not work on are
+ * always welcome!
+ *
+ * \section whats-new What is new in this version of QuaZIP?
+ *
+ * See NEWS file supplied with the distribution.
+ *
+ * \section getting Getting latest version of QuaZIP
+ *
+ * Check <a href="http://sourceforge.net/projects/quazip/">QuaZIP
+ * project's page at SourceForge.net</a>. Also, you may wish to read
+ * latest version documentation available at the <a
+ * href="http://quazip.sourceforge.net/">QuaZIP web site</a>.
+ *
+ * \section Requirements
+ *
+ * Just <a href="http://www.zlib.org/">zlib</a> and Qt 4. Well, Qt 4
+ * depends on zlib anyway.
+ *
+ * \section building Building, testing and installing
+ *
+ * \note Instructions given in this section assume that you are
+ * using some UNIX dialect, but the build process should be very similar
+ * on win32-g++ platform too. Sorry, but other platforms are
+ * undocumented. I do not think it is a big deal, though - it is
+ * standard usage of the Qt's qmake, so you most probably already know
+ * everything that is required.
+ *
+ * To build it on some UNIX dialect:
+\verbatim
+$ cd /wherever/quazip/source/is/quazip-x.y.z/quazip
+$ qmake [PREFIX=where-to-install]
+$ make
+\endverbatim
+ *
+ * Make sure that you have Qt 4 installed with all required headers and
+ * utilities (not just library) and that you run qmake utility of the Qt
+ * 4, not some other version you may have already installed (you may
+ * need to type full path to qmake like /usr/local/qt4/bin/qmake).
+ *
+ * To reconfigure (with another PREFIX, for example), just run qmake
+ * with appropriate arguments again.
+ *
+ * If you need to specify additional include path or libraries, use
+ * qmake features (see qmake reference in the Qt documentation). For
+ * example:
+ *
+\verbatim
+$ qmake LIBS+=-L/usr/local/zlib/lib INCLUDEPATH+=/usr/local/zlib/include
+\endverbatim
+ * (note abscence of "-I" before include path)
+ *
+ * To check if QuaZIP's basic features work ok on your platform, you may
+ * wish to compile simple test programs provided in test directory.
+ * Look in the sources of the tests to find out about their
+ * requirements. Typically, the test looks something like this:
+\verbatim
+$ cd /wherever/quazip/source/is/quazip-x.y.z/test/zip
+$ qmake
+$ make
+$ ./zip
+$ cd ../unzip
+$ cp ../zip/test.zip ./test.zip
+$ mkdir out
+$ qmake
+$ make
+$ ./unzip
+\endverbatim
+ *
+ * You should see the zip contents with details as the output of the
+ * "./unzip". Ignore message saying you should check the file name for
+ * testCase() if you do not want to test
+ * \link QuaZip::CaseSensitivity locale-aware case-insensitivity\endlink.
+ * Otherwise, see the sources. In any case, this message appearing means
+ * that everything else was fine. Otherwise, you will get some other error
+ * message instead. Investigate it or send bug report including message,
+ * platform and QuaZIP version used.
+ *
+ * To install compiled library:
+\verbatim
+$ make install
+\endverbatim
+ *
+ * By default, QuaZIP compiles as static library, but you have other
+ * options:
+ * - Just copy appropriate source files to your project and use them;
+ * - Compile QuaZIP as shared library by changing "staticlib" in
+ *   quazip/quazip.pro to "dll".
+ *
+ * Latter is not recommended because future versions of QuaZIP most
+ * probably will be binary incompatible.
+ *
+ * \section using Using
+ *
+ * See \ref usage "usage page".
+ * 
+ * \section bugs Bugs
+ *
+ * QuaZIP is currently at the initial development stage. Therefore,
+ * there are may be plenty of bugs and other bad things. Bug reports and
+ * patches are always welcome (see "contacts" below).
+ *
+ * \section contacts Authors and contacts
+ *
+ * This wrapper has been written by Sergey A. Tachenov, AKA Alqualos.
+ * This is my first open source project, so it may suck, but I did not
+ * find anything like that, so I just had no other choice but to write
+ * it.
+ *
+ * If you have anything to say to me about QuaZIP library, feel free to
+ * do so (read the \ref faq first, though). I can not promise,
+ * though, that I fix all the bugs you report in, add any features you
+ * want, or respond to your critics, or respond to your feedback at all.
+ * I may be busy, I may be tired of working on QuaZIP, I may be even
+ * dead already (you never know...). But regardless of this remark, any
+ * feedback is always welcome. This may seem like a paradox to you, but
+ * you do not have to understand it to write feedback.
+ *
+ * To report bugs or to post ideas about what should be done, use
+ * SourceForge.net's <a
+ * href="http://sourceforge.net/tracker/?group_id=142688">trackers</a>.
+ * If you want to send me a private message, use my e-mail address
+ * laerel at yandex dot ru (but do not you dare to put it somewhere on
+ * the Web or wherever).
+ *
+ * Do not use e-mail to report bugs, please. Reporting bugs and problems
+ * with the SourceForge.net's bug report system has that advantage that
+ * it is visible to public.
+ *
+ * \section other-projects My other projects
+ *
+ * As of this moment, I did not write any other useful open source
+ * software (well, I am too lazy to do it) except for one little thing:
+ *
+ * <a href="http://brededor.narod.ru/progs/arcanum50patch.htm">Arcanum
+ * universal cap remover</a>. Arcanum is the old but very good game,
+ * which has one stupid limit: your character maximum level is 50, which
+ * is too low for many players including me. So I wrote this simple
+ * patch to increase this stupid limit to something acceptable.
+ *
+ * Also, my first Web project, which can be of any interest to you only
+ * if you can read Russian and you are crazy ^_- This is a web site with
+ * the main topic of it being The Delirium. It is totally meaningless
+ * and it was purposely made to be such. Do not ask me why - I do not
+ * know either. I just did that. If you are interested, then welcome to
+ * <a href="http://brededor.narod.ru/">The Brededor</a>. It does not get
+ * updated lately because I have become even lazier than I ever was. But
+ * I do not plan to destroy The Brededor no matter what, because I think
+ * it is fun.
+ *
+ * Copyright (C) 2005-2007 Sergey A. Tachenov
+ **/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/usage.dox	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,69 @@
+/** \page usage Usage
+ * 
+ * This page provides general information on QuaZIP usage. See classes
+ * QuaZip and QuaZipFile for the detailed documentation on what can
+ * QuaZIP do and what can not. Also, reading comments in the zip.h and
+ * unzip.h files (taken from the original ZIP/UNZIP package) is always a
+ * good idea too. After all, QuaZIP is just a wrapper with a few
+ * convenience extensions and reimplementations.
+ *
+ * QuaZip is a class representing ZIP archive, QuaZipFile represents a
+ * file inside archive and subclasses QIODevice as well.
+ *
+ * \section terminology Terminology
+ *
+ * "QuaZIP" means whole this library, while "QuaZip" (not case
+ * difference) is just one class in it.
+ *
+ * "ZIP/UNZIP API" means the original API of the Gilles Vollant's
+ * ZIP/UNZIP package. I did not alter it in any way to make it easier to
+ * port to the future ZIP/UNZIP versions.
+ *
+ * "ZIP", "ZIP archive" or "ZIP file" means any ZIP archive. Typically
+ * this is a plain file with ".zip" (or ".ZIP") file name suffix.
+ *
+ * "A file inside archive", "a file inside ZIP" or something like that
+ * means file either being read or written from/to some ZIP archive.
+ *
+ * \section error-handling Error handling
+ *
+ * Almost any call to ZIP/UNZIP API return some error code. Most of the
+ * original API's error checking could be done in this wrapper as well,
+ * but it would cause unnecessary code bloating without any benefit. So,
+ * QuaZIP only checks for situations that ZIP/UNZIP API can not check
+ * for. For example, ZIP/UNZIP API has no "ZIP open mode" concept
+ * because read and write modes are completely separated. On the other
+ * hand, to avoid creating classes like "QuaZipReader", "QuaZipWriter"
+ * or something like that, QuaZIP introduces "ZIP open mode" concept
+ * instead, thus making it possible to use one class (QuaZip) for both
+ * reading and writing. But this leads to additional open mode checks
+ * which are not done in ZIP/UNZIP package.
+ *
+ * Therefore, error checking is two-level (QuaZIP's level and ZIP/UNZIP
+ * API level), which sometimes can be confusing, so here are some
+ * advices on how the error checking should be properly done:
+ *
+ * - Both QuaZip and QuaZipFile have getZipError() function, which return
+ *   error code of the last ZIP/UNZIP API call. Most function calls
+ *   reset error code to UNZ_OK on success and set error code on
+ *   failure. Some functions do not reset error code. Most of them are
+ *   \c const and do not access ZIP archive in any way. Some, on the
+ *   other hand, \em do access ZIP archive, but do not reset or set
+ *   error code. For example, QuaZipFile::pos() function. Such functions
+ *   are explicitly marked in the documentation.
+ * - Most functions have its own way to report errors, by returning a
+ *   null string, negative value or \c false. If such a function returns
+ *   error value, call getZipError() to get more information about
+ *   error. See "zip.h" and "unzip.h" of the ZIP/UNZIP package for error
+ *   codes.
+ * - If the function returns error-stating value (like \c false), but
+ *   getZipError() returns UNZ_OK, it means that you did something
+ *   obviously wrong. For example, tried to write in the archive open
+ *   for reading or not open at all. You better just do not do that!
+ *   Most functions also issue a warning using qWarning() function in
+ *   such cases. See documentation for a specific function for details
+ *   on when it should not be called.
+ *
+ * I know that this is somewhat messy, but I could not find a better way
+ * to do all the error handling.
+ **/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/ioapi.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,77 @@
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+   files using zlib + zip or unzip API
+
+   Version 1.01e, February 12th, 2005
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+#ifndef _ZLIBIOAPI_H
+#define _ZLIBIOAPI_H
+
+
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+
+#define ZLIB_FILEFUNC_MODE_READ      (1)
+#define ZLIB_FILEFUNC_MODE_WRITE     (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE   (8)
+
+
+#ifndef ZCALLBACK
+
+#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
+#define ZCALLBACK CALLBACK
+#else
+#define ZCALLBACK
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, voidpf file, int mode));
+typedef uLong  (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+typedef uLong  (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+typedef uLong   (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
+typedef int   (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+typedef int    (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
+typedef int    (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
+
+typedef struct zlib_filefunc_def_s
+{
+    open_file_func      zopen_file;
+    read_file_func      zread_file;
+    write_file_func     zwrite_file;
+    tell_file_func      ztell_file;
+    seek_file_func      zseek_file;
+    close_file_func     zclose_file;
+    testerror_file_func zerror_file;
+    voidpf              opaque;
+} zlib_filefunc_def;
+
+
+
+void fill_qiodevice_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
+#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
+#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
+#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
+#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
+#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/qioapi.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,142 @@
+/* ioapi.c -- IO base function header for compress/uncompress .zip
+   files using zlib + zip or unzip API
+
+   Version 1.01e, February 12th, 2005
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+#include "quazip_global.h"
+#include <QIODevice>
+
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR    1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END    2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET    0
+#endif
+
+voidpf ZCALLBACK qiodevice_open_file_func (
+   voidpf opaque UNUSED,
+   voidpf file,
+   int mode)
+{
+    QIODevice *iodevice = reinterpret_cast<QIODevice*>(file);
+    if(iodevice->isSequential())
+        return NULL;
+    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+        iodevice->open(QIODevice::ReadOnly);
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+        iodevice->open(QIODevice::ReadWrite);
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+        iodevice->open(QIODevice::WriteOnly);
+
+    if(iodevice->isOpen())
+        return iodevice;
+    else
+        return NULL;
+}
+
+
+uLong ZCALLBACK qiodevice_read_file_func (
+   voidpf opaque UNUSED,
+   voidpf stream,
+   void* buf,
+   uLong size)
+{
+    uLong ret;
+    ret = (uLong)((QIODevice*)stream)->read((char*)buf,size);
+    return ret;
+}
+
+
+uLong ZCALLBACK qiodevice_write_file_func (
+   voidpf opaque UNUSED,
+   voidpf stream,
+   const void* buf,
+   uLong size)
+{
+    uLong ret;
+    ret = (uLong)((QIODevice*)stream)->write((char*)buf,size);
+    return ret;
+}
+
+uLong ZCALLBACK qiodevice_tell_file_func (
+   voidpf opaque UNUSED,
+   voidpf stream)
+{
+    uLong ret;
+    ret = ((QIODevice*)stream)->pos();
+    return ret;
+}
+
+int ZCALLBACK qiodevice_seek_file_func (
+   voidpf opaque UNUSED,
+   voidpf stream,
+   uLong offset,
+   int origin)
+{
+    uLong qiodevice_seek_result=0;
+    int ret;
+    switch (origin)
+    {
+    case ZLIB_FILEFUNC_SEEK_CUR :
+        qiodevice_seek_result = ((QIODevice*)stream)->pos() + offset;
+        break;
+    case ZLIB_FILEFUNC_SEEK_END :
+        qiodevice_seek_result = ((QIODevice*)stream)->size() - offset;
+        break;
+    case ZLIB_FILEFUNC_SEEK_SET :
+        qiodevice_seek_result = offset;
+        break;
+    default: return -1;
+    }
+    ret = !((QIODevice*)stream)->seek(qiodevice_seek_result);
+    return ret;
+}
+
+int ZCALLBACK qiodevice_close_file_func (
+   voidpf opaque UNUSED,
+   voidpf stream)
+{
+    ((QIODevice*)stream)->close();
+    return 0;
+}
+
+int ZCALLBACK qiodevice_error_file_func (
+   voidpf opaque UNUSED,
+   voidpf stream)
+{
+    return !((QIODevice*)stream)->errorString().isEmpty();
+}
+
+void fill_qiodevice_filefunc (
+  zlib_filefunc_def* pzlib_filefunc_def)
+{
+    pzlib_filefunc_def->zopen_file = qiodevice_open_file_func;
+    pzlib_filefunc_def->zread_file = qiodevice_read_file_func;
+    pzlib_filefunc_def->zwrite_file = qiodevice_write_file_func;
+    pzlib_filefunc_def->ztell_file = qiodevice_tell_file_func;
+    pzlib_filefunc_def->zseek_file = qiodevice_seek_file_func;
+    pzlib_filefunc_def->zclose_file = qiodevice_close_file_func;
+    pzlib_filefunc_def->zerror_file = qiodevice_error_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quaadler32.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,28 @@
+#include "quaadler32.h"
+
+#include "zlib.h"
+
+QuaAdler32::QuaAdler32()
+{
+	reset();
+}
+
+quint32 QuaAdler32::calculate(const QByteArray &data)
+{
+	return adler32( adler32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() );
+}
+
+void QuaAdler32::reset()
+{
+	checksum = adler32(0L, Z_NULL, 0);
+}
+
+void QuaAdler32::update(const QByteArray &buf)
+{
+	checksum = adler32( checksum, (const Bytef*)buf.data(), buf.size() );
+}
+
+quint32 QuaAdler32::value()
+{
+	return checksum;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quaadler32.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,29 @@
+#ifndef QUAADLER32_H
+#define QUAADLER32_H
+
+#include <QByteArray>
+
+#include "quachecksum32.h"
+
+/// Adler32 checksum
+/** \class QuaAdler32 quaadler32.h <quazip/quaadler32.h>
+ * This class wrappers the adler32 function with the QuaChecksum32 interface.
+ * See QuaChecksum32 for more info.
+ */
+class QuaAdler32 : public QuaChecksum32
+{
+
+public:
+	QuaAdler32();
+
+	quint32 calculate(const QByteArray &data);
+
+	void reset();
+	void update(const QByteArray &buf);
+	quint32 value();
+
+private:
+	quint32 checksum;
+};
+
+#endif //QUAADLER32_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quachecksum32.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,54 @@
+#ifndef QUACHECKSUM32_H
+#define QUACHECKSUM32_H
+
+#include <QByteArray>
+#include "quazip_global.h"
+
+/// Checksum interface.
+/** \class QuaChecksum32 quachecksum32.h <quazip/quachecksum32.h>
+ * This is an interface for 32 bit checksums.
+ * Classes implementing this interface can calcunate a certin
+ * checksum in a single step:
+ * \code
+ * QChecksum32 *crc32 = new QuaCrc32(); 
+ * rasoult = crc32->calculate(data);
+ * \endcode
+ * or by streaming the data:
+ * \code
+ * QChecksum32 *crc32 = new QuaCrc32(); 
+ * while(!fileA.atEnd())
+ *     crc32->update(fileA.read(bufSize));
+ * resoultA = crc32->value();
+ * crc32->reset();
+ * while(!fileB.atEnd())
+ *     crc32->update(fileB.read(bufSize));
+ * resoultB = crc32->value();
+ * \endcode
+ */
+class QUAZIP_EXPORT QuaChecksum32
+{
+
+public:
+	///Calculates the checksum for data.
+	/** \a data source data
+	 * \return data checksum
+	 *
+	 * This function has no efect on the value returned by value().
+	 */
+	virtual quint32 calculate(const QByteArray &data) = 0;
+
+	///Resets the calculation on a checksun for a stream.
+	virtual void reset() = 0;
+
+	///Updates the calculated checksum for the stream
+	/** \a buf next portion of data from the stream
+	 */
+	virtual void update(const QByteArray &buf) = 0;
+
+	///Value of the checksum calculated for the stream passed throw update().
+	/** \return checksum
+	 */
+	virtual quint32 value() = 0;
+};
+
+#endif //QUACHECKSUM32_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quacrc32.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,28 @@
+#include "quacrc32.h"
+
+#include "zlib.h"
+
+QuaCrc32::QuaCrc32()
+{
+	reset();
+}
+
+quint32 QuaCrc32::calculate(const QByteArray &data)
+{
+	return crc32( crc32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() );
+}
+
+void QuaCrc32::reset()
+{
+	checksum = crc32(0L, Z_NULL, 0);
+}
+
+void QuaCrc32::update(const QByteArray &buf)
+{
+	checksum = crc32( checksum, (const Bytef*)buf.data(), buf.size() );
+}
+
+quint32 QuaCrc32::value()
+{
+	return checksum;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quacrc32.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,26 @@
+#ifndef QUACRC32_H
+#define QUACRC32_H
+
+#include "quachecksum32.h"
+
+///CRC32 checksum
+/** \class QuaCrc32 quacrc32.h <quazip/quacrc32.h>
+* This class wrappers the crc32 function with the QuaChecksum32 interface.
+* See QuaChecksum32 for more info.
+*/
+class QUAZIP_EXPORT QuaCrc32 : public QuaChecksum32 {
+
+public:
+	QuaCrc32();
+
+	quint32 calculate(const QByteArray &data);
+
+	void reset();
+	void update(const QByteArray &buf);
+	quint32 value();
+
+private:
+	quint32 checksum;
+};
+
+#endif //QUACRC32_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,427 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QFile>
+
+#include "quazip.h"
+
+class QuaZipPrivate {
+  friend class QuaZip;
+  private:
+    QTextCodec *fileNameCodec, *commentCodec;
+    QString zipName;
+    QIODevice *ioDevice;
+    QString comment;
+    QuaZip::Mode mode;
+    union {
+      unzFile unzFile_f;
+      zipFile zipFile_f;
+    };
+    bool hasCurrentFile_f;
+    int zipError;
+    inline QuaZipPrivate():
+      fileNameCodec(QTextCodec::codecForLocale()),
+      commentCodec(QTextCodec::codecForLocale()),
+      ioDevice(NULL),
+      mode(QuaZip::mdNotOpen),
+      hasCurrentFile_f(false),
+      zipError(UNZ_OK) {}
+    inline QuaZipPrivate(const QString &zipName):
+      fileNameCodec(QTextCodec::codecForLocale()),
+      commentCodec(QTextCodec::codecForLocale()),
+      zipName(zipName),
+      ioDevice(NULL),
+      mode(QuaZip::mdNotOpen),
+      hasCurrentFile_f(false),
+      zipError(UNZ_OK) {}
+    inline QuaZipPrivate(QIODevice *ioDevice):
+      fileNameCodec(QTextCodec::codecForLocale()),
+      commentCodec(QTextCodec::codecForLocale()),
+      ioDevice(ioDevice),
+      mode(QuaZip::mdNotOpen),
+      hasCurrentFile_f(false),
+      zipError(UNZ_OK) {}
+};
+
+QuaZip::QuaZip():
+  p(new QuaZipPrivate())
+{
+}
+
+QuaZip::QuaZip(const QString& zipName):
+  p(new QuaZipPrivate(zipName))
+{
+}
+
+QuaZip::QuaZip(QIODevice *ioDevice):
+  p(new QuaZipPrivate(ioDevice))
+{
+}
+
+QuaZip::~QuaZip()
+{
+  if(isOpen())
+    close();
+  delete p;
+}
+
+bool QuaZip::open(Mode mode, zlib_filefunc_def* ioApi)
+{
+  p->zipError=UNZ_OK;
+  if(isOpen()) {
+    qWarning("QuaZip::open(): ZIP already opened");
+    return false;
+  }
+  QIODevice *ioDevice = p->ioDevice;
+  if (ioDevice == NULL) {
+    if (p->zipName.isEmpty()) {
+      qWarning("QuaZip::open(): set either ZIP file name or IO device first");
+      return false;
+    } else {
+      ioDevice = new QFile(p->zipName);
+    }
+  }
+  switch(mode) {
+    case mdUnzip:
+      p->unzFile_f=unzOpen2(ioDevice, ioApi);
+      if(p->unzFile_f!=NULL) {
+        p->mode=mode;
+        p->ioDevice = ioDevice;
+        return true;
+      } else {
+        p->zipError=UNZ_OPENERROR;
+        if (!p->zipName.isEmpty())
+          delete ioDevice;
+        return false;
+      }
+    case mdCreate:
+    case mdAppend:
+    case mdAdd:
+      p->zipFile_f=zipOpen2(ioDevice,
+          mode==mdCreate?APPEND_STATUS_CREATE:
+          mode==mdAppend?APPEND_STATUS_CREATEAFTER:
+          APPEND_STATUS_ADDINZIP,
+          NULL,
+          ioApi);
+      if(p->zipFile_f!=NULL) {
+        p->mode=mode;
+        p->ioDevice = ioDevice;
+        return true;
+      } else {
+        p->zipError=UNZ_OPENERROR;
+        if (!p->zipName.isEmpty())
+          delete ioDevice;
+        return false;
+      }
+    default:
+      qWarning("QuaZip::open(): unknown mode: %d", (int)mode);
+      if (!p->zipName.isEmpty())
+        delete ioDevice;
+      return false;
+      break;
+  }
+}
+
+void QuaZip::close()
+{
+  p->zipError=UNZ_OK;
+  switch(p->mode) {
+    case mdNotOpen:
+      qWarning("QuaZip::close(): ZIP is not open");
+      return;
+    case mdUnzip:
+      p->zipError=unzClose(p->unzFile_f);
+      break;
+    case mdCreate:
+    case mdAppend:
+    case mdAdd:
+      p->zipError=zipClose(p->zipFile_f, p->commentCodec->fromUnicode(p->comment).constData());
+      break;
+    default:
+      qWarning("QuaZip::close(): unknown mode: %d", (int)p->mode);
+      return;
+  }
+  // opened by name, need to delete the internal IO device
+  if (!p->zipName.isEmpty())
+    delete p->ioDevice;
+  if(p->zipError==UNZ_OK)
+    p->mode=mdNotOpen;
+}
+
+void QuaZip::setZipName(const QString& zipName)
+{
+  if(isOpen()) {
+    qWarning("QuaZip::setZipName(): ZIP is already open!");
+    return;
+  }
+  p->zipName=zipName;
+  p->ioDevice = NULL;
+}
+
+void QuaZip::setIoDevice(QIODevice *ioDevice)
+{
+  if(isOpen()) {
+    qWarning("QuaZip::setIoDevice(): ZIP is already open!");
+    return;
+  }
+  p->ioDevice = ioDevice;
+  p->zipName = QString();
+}
+
+int QuaZip::getEntriesCount()const
+{
+  QuaZip *fakeThis=(QuaZip*)this; // non-const
+  fakeThis->p->zipError=UNZ_OK;
+  if(p->mode!=mdUnzip) {
+    qWarning("QuaZip::getEntriesCount(): ZIP is not open in mdUnzip mode");
+    return -1;
+  }
+  unz_global_info globalInfo;
+  if((fakeThis->p->zipError=unzGetGlobalInfo(p->unzFile_f, &globalInfo))!=UNZ_OK)
+    return p->zipError;
+  return (int)globalInfo.number_entry;
+}
+
+QString QuaZip::getComment()const
+{
+  QuaZip *fakeThis=(QuaZip*)this; // non-const
+  fakeThis->p->zipError=UNZ_OK;
+  if(p->mode!=mdUnzip) {
+    qWarning("QuaZip::getComment(): ZIP is not open in mdUnzip mode");
+    return QString();
+  }
+  unz_global_info globalInfo;
+  QByteArray comment;
+  if((fakeThis->p->zipError=unzGetGlobalInfo(p->unzFile_f, &globalInfo))!=UNZ_OK)
+    return QString();
+  comment.resize(globalInfo.size_comment);
+  if((fakeThis->p->zipError=unzGetGlobalComment(p->unzFile_f, comment.data(), comment.size())) < 0)
+    return QString();
+  fakeThis->p->zipError = UNZ_OK;
+  return p->commentCodec->toUnicode(comment);
+}
+
+bool QuaZip::setCurrentFile(const QString& fileName, CaseSensitivity cs)
+{
+  p->zipError=UNZ_OK;
+  if(p->mode!=mdUnzip) {
+    qWarning("QuaZip::setCurrentFile(): ZIP is not open in mdUnzip mode");
+    return false;
+  }
+  if(fileName.isEmpty()) {
+    p->hasCurrentFile_f=false;
+    return true;
+  }
+  // Unicode-aware reimplementation of the unzLocateFile function
+  if(p->unzFile_f==NULL) {
+    p->zipError=UNZ_PARAMERROR;
+    return false;
+  }
+  if(fileName.length()>MAX_FILE_NAME_LENGTH) {
+    p->zipError=UNZ_PARAMERROR;
+    return false;
+  }
+  bool sens;
+  if(cs==csDefault) {
+#ifdef Q_WS_WIN
+    sens=false;
+#else
+    sens=true;
+#endif
+  } else sens=cs==csSensitive;
+  QString lower, current;
+  if(!sens) lower=fileName.toLower();
+  p->hasCurrentFile_f=false;
+  for(bool more=goToFirstFile(); more; more=goToNextFile()) {
+    current=getCurrentFileName();
+    if(current.isEmpty()) return false;
+    if(sens) {
+      if(current==fileName) break;
+    } else {
+      if(current.toLower()==lower) break;
+    }
+  }
+  return p->hasCurrentFile_f;
+}
+
+bool QuaZip::goToFirstFile()
+{
+  p->zipError=UNZ_OK;
+  if(p->mode!=mdUnzip) {
+    qWarning("QuaZip::goToFirstFile(): ZIP is not open in mdUnzip mode");
+    return false;
+  }
+  p->zipError=unzGoToFirstFile(p->unzFile_f);
+  p->hasCurrentFile_f=p->zipError==UNZ_OK;
+  return p->hasCurrentFile_f;
+}
+
+bool QuaZip::goToNextFile()
+{
+  p->zipError=UNZ_OK;
+  if(p->mode!=mdUnzip) {
+    qWarning("QuaZip::goToFirstFile(): ZIP is not open in mdUnzip mode");
+    return false;
+  }
+  p->zipError=unzGoToNextFile(p->unzFile_f);
+  p->hasCurrentFile_f=p->zipError==UNZ_OK;
+  if(p->zipError==UNZ_END_OF_LIST_OF_FILE)
+    p->zipError=UNZ_OK;
+  return p->hasCurrentFile_f;
+}
+
+bool QuaZip::getCurrentFileInfo(QuaZipFileInfo *info)const
+{
+  QuaZip *fakeThis=(QuaZip*)this; // non-const
+  fakeThis->p->zipError=UNZ_OK;
+  if(p->mode!=mdUnzip) {
+    qWarning("QuaZip::getCurrentFileInfo(): ZIP is not open in mdUnzip mode");
+    return false;
+  }
+  unz_file_info info_z;
+  QByteArray fileName;
+  QByteArray extra;
+  QByteArray comment;
+  if(info==NULL) return false;
+  if(!isOpen()||!hasCurrentFile()) return false;
+  if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, &info_z, NULL, 0, NULL, 0, NULL, 0))!=UNZ_OK)
+    return false;
+  fileName.resize(info_z.size_filename);
+  extra.resize(info_z.size_file_extra);
+  comment.resize(info_z.size_file_comment);
+  if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, NULL,
+      fileName.data(), fileName.size(),
+      extra.data(), extra.size(),
+      comment.data(), comment.size()))!=UNZ_OK)
+    return false;
+  info->versionCreated=info_z.version;
+  info->versionNeeded=info_z.version_needed;
+  info->flags=info_z.flag;
+  info->method=info_z.compression_method;
+  info->crc=info_z.crc;
+  info->compressedSize=info_z.compressed_size;
+  info->uncompressedSize=info_z.uncompressed_size;
+  info->diskNumberStart=info_z.disk_num_start;
+  info->internalAttr=info_z.internal_fa;
+  info->externalAttr=info_z.external_fa;
+  info->name=p->fileNameCodec->toUnicode(fileName);
+  info->comment=p->commentCodec->toUnicode(comment);
+  info->extra=extra;
+  info->dateTime=QDateTime(
+      QDate(info_z.tmu_date.tm_year, info_z.tmu_date.tm_mon+1, info_z.tmu_date.tm_mday),
+      QTime(info_z.tmu_date.tm_hour, info_z.tmu_date.tm_min, info_z.tmu_date.tm_sec));
+  return true;
+}
+
+QString QuaZip::getCurrentFileName()const
+{
+  QuaZip *fakeThis=(QuaZip*)this; // non-const
+  fakeThis->p->zipError=UNZ_OK;
+  if(p->mode!=mdUnzip) {
+    qWarning("QuaZip::getCurrentFileName(): ZIP is not open in mdUnzip mode");
+    return QString();
+  }
+  if(!isOpen()||!hasCurrentFile()) return QString();
+  QByteArray fileName(MAX_FILE_NAME_LENGTH, 0);
+  if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, NULL, fileName.data(), fileName.size(),
+      NULL, 0, NULL, 0))!=UNZ_OK)
+    return QString();
+  return p->fileNameCodec->toUnicode(fileName.constData());
+}
+
+void QuaZip::setFileNameCodec(QTextCodec *fileNameCodec)
+{
+  p->fileNameCodec=fileNameCodec;
+}
+
+void QuaZip::setFileNameCodec(const char *fileNameCodecName)
+{
+  p->fileNameCodec=QTextCodec::codecForName(fileNameCodecName);
+}
+
+QTextCodec *QuaZip::getFileNameCodec()const
+{
+  return p->fileNameCodec;
+}
+
+void QuaZip::setCommentCodec(QTextCodec *commentCodec)
+{
+  p->commentCodec=commentCodec;
+}
+
+void QuaZip::setCommentCodec(const char *commentCodecName)
+{
+  p->commentCodec=QTextCodec::codecForName(commentCodecName);
+}
+
+QTextCodec *QuaZip::getCommentCodec()const
+{
+  return p->commentCodec;
+}
+
+QString QuaZip::getZipName() const
+{
+  return p->zipName;
+}
+
+QIODevice *QuaZip::getIoDevice() const
+{
+  if (!p->zipName.isEmpty()) // opened by name, using an internal QIODevice
+    return NULL;
+  return p->ioDevice;
+}
+
+QuaZip::Mode QuaZip::getMode()const
+{
+  return p->mode;
+}
+
+bool QuaZip::isOpen()const
+{
+  return p->mode!=mdNotOpen;
+}
+
+int QuaZip::getZipError() const
+{
+  return p->zipError;
+}
+
+void QuaZip::setComment(const QString& comment)
+{
+  p->comment=comment;
+}
+
+bool QuaZip::hasCurrentFile()const
+{
+  return p->hasCurrentFile_f;
+}
+
+unzFile QuaZip::getUnzFile()
+{
+  return p->unzFile_f;
+}
+
+zipFile QuaZip::getZipFile()
+{
+  return p->zipFile_f;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,359 @@
+#ifndef QUA_ZIP_H
+#define QUA_ZIP_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QString>
+#include <QTextCodec>
+
+#include "zip.h"
+#include "unzip.h"
+
+#include "quazip_global.h"
+#include "quazipfileinfo.h"
+
+// just in case it will be defined in the later versions of the ZIP/UNZIP
+#ifndef UNZ_OPENERROR
+// define additional error code
+#define UNZ_OPENERROR -1000
+#endif
+
+class QuaZipPrivate;
+
+/// ZIP archive.
+/** \class QuaZip quazip.h <quazip/quazip.h>
+ * This class implements basic interface to the ZIP archive. It can be
+ * used to read table contents of the ZIP archive and retreiving
+ * information about the files inside it.
+ *
+ * You can also use this class to open files inside archive by passing
+ * pointer to the instance of this class to the constructor of the
+ * QuaZipFile class. But see QuaZipFile::QuaZipFile(QuaZip*, QObject*)
+ * for the possible pitfalls.
+ *
+ * This class is indended to provide interface to the ZIP subpackage of
+ * the ZIP/UNZIP package as well as to the UNZIP subpackage. But
+ * currently it supports only UNZIP.
+ *
+ * The use of this class is simple - just create instance using
+ * constructor, then set ZIP archive file name using setFile() function
+ * (if you did not passed the name to the constructor), then open() and
+ * then use different functions to work with it! Well, if you are
+ * paranoid, you may also wish to call close before destructing the
+ * instance, to check for errors on close.
+ *
+ * You may also use getUnzFile() and getZipFile() functions to get the
+ * ZIP archive handle and use it with ZIP/UNZIP package API directly.
+ *
+ * This class supports localized file names inside ZIP archive, but you
+ * have to set up proper codec with setCodec() function. By default,
+ * locale codec will be used, which is probably ok for UNIX systems, but
+ * will almost certainly fail with ZIP archives created in Windows. This
+ * is because Windows ZIP programs have strange habit of using DOS
+ * encoding for file names in ZIP archives. For example, ZIP archive
+ * with cyrillic names created in Windows will have file names in \c
+ * IBM866 encoding instead of \c WINDOWS-1251. I think that calling one
+ * function is not much trouble, but for true platform independency it
+ * would be nice to have some mechanism for file name encoding auto
+ * detection using locale information. Does anyone know a good way to do
+ * it?
+ **/
+class QUAZIP_EXPORT QuaZip {
+  friend class QuaZipPrivate;
+  public:
+    /// Useful constants.
+    enum Constants {
+      MAX_FILE_NAME_LENGTH=256 /**< Maximum file name length. Taken from
+                                 \c UNZ_MAXFILENAMEINZIP constant in
+                                 unzip.c. */
+    };
+    /// Open mode of the ZIP file.
+    enum Mode {
+      mdNotOpen, ///< ZIP file is not open. This is the initial mode.
+      mdUnzip, ///< ZIP file is open for reading files inside it.
+      mdCreate, ///< ZIP file was created with open() call.
+      mdAppend, /**< ZIP file was opened in append mode. This refers to
+                  * \c APPEND_STATUS_CREATEAFTER mode in ZIP/UNZIP package
+                  * and means that zip is appended to some existing file
+                  * what is useful when that file contains
+                  * self-extractor code. This is obviously \em not what
+                  * you whant to use to add files to the existing ZIP
+                  * archive.
+                  **/
+      mdAdd ///< ZIP file was opened for adding files in the archive.
+    };
+    /// Case sensitivity for the file names.
+    /** This is what you specify when accessing files in the archive.
+     * Works perfectly fine with any characters thanks to Qt's great
+     * unicode support. This is different from ZIP/UNZIP API, where
+     * only US-ASCII characters was supported.
+     **/
+    enum CaseSensitivity {
+      csDefault=0, ///< Default for platform. Case sensitive for UNIX, not for Windows.
+      csSensitive=1, ///< Case sensitive.
+      csInsensitive=2 ///< Case insensitive.
+    };
+  private:
+    QuaZipPrivate *p;
+    // not (and will not be) implemented
+    QuaZip(const QuaZip& that);
+    // not (and will not be) implemented
+    QuaZip& operator=(const QuaZip& that);
+  public:
+    /// Constructs QuaZip object.
+    /** Call setName() before opening constructed object. */
+    QuaZip();
+    /// Constructs QuaZip object associated with ZIP file \a zipName.
+    QuaZip(const QString& zipName);
+    /// Constructs QuaZip object associated with ZIP file represented by \a ioDevice.
+    /** The IO device must be seekable, otherwise an error will occur when opening. */
+    QuaZip(QIODevice *ioDevice);
+    /// Destroys QuaZip object.
+    /** Calls close() if necessary. */
+    ~QuaZip();
+    /// Opens ZIP file.
+    /**
+     * Argument \a mode specifies open mode of the ZIP archive. See Mode
+     * for details. Note that there is zipOpen2() function in the
+     * ZIP/UNZIP API which accepts \a globalcomment argument, but it
+     * does not use it anywhere, so this open() function does not have this
+     * argument. See setComment() if you need to set global comment.
+     *
+     * If the ZIP file is accessed via explicitly set QIODevice, then
+     * this device is opened in the necessary mode. If the device was
+     * already opened by some other means, then the behaviour is defined by
+     * the device implementation, but generally it is not a very good
+     * idea. For example, QFile will at least issue a warning.
+     *
+     * \return \c true if successful, \c false otherwise.
+     *
+     * \note ZIP/UNZIP API open calls do not return error code - they
+     * just return \c NULL indicating an error. But to make things
+     * easier, quazip.h header defines additional error code \c
+     * UNZ_ERROROPEN and getZipError() will return it if the open call
+     * of the ZIP/UNZIP API returns \c NULL.
+     *
+     * Argument \a ioApi specifies IO function set for ZIP/UNZIP
+     * package to use. See unzip.h, zip.h and ioapi.h for details. Note
+     * that IO API for QuaZip is different from the original package.
+     * The file path argument was changed to be of type \c voidpf, and
+     * QuaZip passes a QIODevice pointer there. This QIODevice is either
+     * set explicitly via setIoDevice() or the QuaZip(QIODevice*)
+     * constructor, or it is created internally when opening the archive
+     * by its file name. The default API (qioapi.cpp) just delegates
+     * everything to the QIODevice API. Not only this allows to use a
+     * QIODevice instead of file name, but also has a nice side effect
+     * of raising the file size limit from 2G to 4G.
+     *
+     * In short: just forget about the \a ioApi argument and you'll be
+     * fine.
+     **/
+    bool open(Mode mode, zlib_filefunc_def *ioApi =NULL);
+    /// Closes ZIP file.
+    /** Call getZipError() to determine if the close was successful. The
+     * underlying QIODevice is also closed, regardless of whether it was
+     * set explicitly or not. */
+    void close();
+    /// Sets the codec used to encode/decode file names inside archive.
+    /** This is necessary to access files in the ZIP archive created
+     * under Windows with non-latin characters in file names. For
+     * example, file names with cyrillic letters will be in \c IBM866
+     * encoding.
+     **/
+    void setFileNameCodec(QTextCodec *fileNameCodec);
+    /// Sets the codec used to encode/decode file names inside archive.
+    /** \overload
+     * Equivalent to calling setFileNameCodec(QTextCodec::codecForName(codecName));
+     **/
+    void setFileNameCodec(const char *fileNameCodecName);
+    /// Returns the codec used to encode/decode comments inside archive.
+    QTextCodec* getFileNameCodec() const;
+    /// Sets the codec used to encode/decode comments inside archive.
+    /** This codec defaults to locale codec, which is probably ok.
+     **/
+    void setCommentCodec(QTextCodec *commentCodec);
+    /// Sets the codec used to encode/decode comments inside archive.
+    /** \overload
+     * Equivalent to calling setCommentCodec(QTextCodec::codecForName(codecName));
+     **/
+    void setCommentCodec(const char *commentCodecName);
+    /// Returns the codec used to encode/decode comments inside archive.
+    QTextCodec* getCommentCodec() const;
+    /// Returns the name of the ZIP file.
+    /** Returns null string if no ZIP file name has been set, for
+     * example when the QuaZip instance is set up to use a QIODevice
+     * instead.
+     * \sa setZipName(), setIoDevice(), getIoDevice()
+     **/
+    QString getZipName() const;
+    /// Sets the name of the ZIP file.
+    /** Does nothing if the ZIP file is open.
+     *
+     * Does not reset error code returned by getZipError().
+     * \sa setIoDevice(), getIoDevice(), getZipName()
+     **/
+    void setZipName(const QString& zipName);
+    /// Returns the device representing this ZIP file.
+    /** Returns null string if no device has been set explicitly, for
+     * example when opening a ZIP file by name.
+     * \sa setIoDevice(), getZipName(), setZipName()
+     **/
+    QIODevice *getIoDevice() const;
+    /// Sets the device representing the ZIP file.
+    /** Does nothing if the ZIP file is open.
+     *
+     * Does not reset error code returned by getZipError().
+     * \sa getIoDevice(), getZipName(), setZipName()
+     **/
+    void setIoDevice(QIODevice *ioDevice);
+    /// Returns the mode in which ZIP file was opened.
+    Mode getMode() const;
+    /// Returns \c true if ZIP file is open, \c false otherwise.
+    bool isOpen() const;
+    /// Returns the error code of the last operation.
+    /** Returns \c UNZ_OK if the last operation was successful.
+     *
+     * Error code resets to \c UNZ_OK every time you call any function
+     * that accesses something inside ZIP archive, even if it is \c
+     * const (like getEntriesCount()). open() and close() calls reset
+     * error code too. See documentation for the specific functions for
+     * details on error detection.
+     **/
+    int getZipError() const;
+    /// Returns number of the entries in the ZIP central directory.
+    /** Returns negative error code in the case of error. The same error
+     * code will be returned by subsequent getZipError() call.
+     **/
+    int getEntriesCount() const;
+    /// Returns global comment in the ZIP file.
+    QString getComment() const;
+    /// Sets global comment in the ZIP file.
+    /** Comment will be written to the archive on close operation.
+     *
+     * \sa open()
+     **/
+    void setComment(const QString& comment);
+    /// Sets the current file to the first file in the archive.
+    /** Returns \c true on success, \c false otherwise. Call
+     * getZipError() to get the error code.
+     **/
+    bool goToFirstFile();
+    /// Sets the current file to the next file in the archive.
+    /** Returns \c true on success, \c false otherwise. Call
+     * getZipError() to determine if there was an error.
+     *
+     * Should be used only in QuaZip::mdUnzip mode.
+     *
+     * \note If the end of file was reached, getZipError() will return
+     * \c UNZ_OK instead of \c UNZ_END_OF_LIST_OF_FILE. This is to make
+     * things like this easier:
+     * \code
+     * for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile()) {
+     *   // do something
+     * }
+     * if(zip.getZipError()==UNZ_OK) {
+     *   // ok, there was no error
+     * }
+     * \endcode
+     **/
+    bool goToNextFile();
+    /// Sets current file by its name.
+    /** Returns \c true if successful, \c false otherwise. Argument \a
+     * cs specifies case sensitivity of the file name. Call
+     * getZipError() in the case of a failure to get error code.
+     *
+     * This is not a wrapper to unzLocateFile() function. That is
+     * because I had to implement locale-specific case-insensitive
+     * comparison.
+     *
+     * Here are the differences from the original implementation:
+     *
+     * - If the file was not found, error code is \c UNZ_OK, not \c
+     *   UNZ_END_OF_LIST_OF_FILE (see also goToNextFile()).
+     * - If this function fails, it unsets the current file rather than
+     *   resetting it back to what it was before the call.
+     *
+     * If \a fileName is null string then this function unsets the
+     * current file and return \c true. Note that you should close the
+     * file first if it is open! See
+     * QuaZipFile::QuaZipFile(QuaZip*,QObject*) for the details.
+     *
+     * Should be used only in QuaZip::mdUnzip mode.
+     *
+     * \sa setFileNameCodec(), CaseSensitivity
+     **/
+    bool setCurrentFile(const QString& fileName, CaseSensitivity cs =csDefault);
+    /// Returns \c true if the current file has been set.
+    bool hasCurrentFile() const;
+    /// Retrieves information about the current file.
+    /** Fills the structure pointed by \a info. Returns \c true on
+     * success, \c false otherwise. In the latter case structure pointed
+     * by \a info remains untouched. If there was an error,
+     * getZipError() returns error code.
+     *
+     * Should be used only in QuaZip::mdUnzip mode.
+     *
+     * Does nothing and returns \c false in any of the following cases.
+     * - ZIP is not open;
+     * - ZIP does not have current file;
+     * - \a info is \c NULL;
+     *
+     * In all these cases getZipError() returns \c UNZ_OK since there
+     * is no ZIP/UNZIP API call.
+     **/
+    bool getCurrentFileInfo(QuaZipFileInfo* info)const;
+    /// Returns the current file name.
+    /** Equivalent to calling getCurrentFileInfo() and then getting \c
+     * name field of the QuaZipFileInfo structure, but faster and more
+     * convenient.
+     *
+     * Should be used only in QuaZip::mdUnzip mode.
+     **/
+    QString getCurrentFileName()const;
+    /// Returns \c unzFile handle.
+    /** You can use this handle to directly call UNZIP part of the
+     * ZIP/UNZIP package functions (see unzip.h).
+     *
+     * \warning When using the handle returned by this function, please
+     * keep in mind that QuaZip class is unable to detect any changes
+     * you make in the ZIP file state (e. g. changing current file, or
+     * closing the handle). So please do not do anything with this
+     * handle that is possible to do with the functions of this class.
+     * Or at least return the handle in the original state before
+     * calling some another function of this class (including implicit
+     * destructor calls and calls from the QuaZipFile objects that refer
+     * to this QuaZip instance!). So if you have changed the current
+     * file in the ZIP archive - then change it back or you may
+     * experience some strange behavior or even crashes.
+     **/
+    unzFile getUnzFile();
+    /// Returns \c zipFile handle.
+    /** You can use this handle to directly call ZIP part of the
+     * ZIP/UNZIP package functions (see zip.h). Warnings about the
+     * getUnzFile() function also apply to this function.
+     **/
+    zipFile getZipFile();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.pri	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,23 @@
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+HEADERS += $$PWD/crypt.h \
+           $$PWD/ioapi.h \
+           $$PWD/JlCompress.h \
+           $$PWD/quaadler32.h \
+           $$PWD/quachecksum32.h \
+           $$PWD/quacrc32.h \
+           $$PWD/quazip.h \
+           $$PWD/quazipfile.h \
+           $$PWD/quazipfileinfo.h \
+           $$PWD/quazipnewinfo.h \
+           $$PWD/unzip.h \
+           $$PWD/zip.h
+SOURCES += $$PWD/qioapi.cpp \
+           $$PWD/JlCompress.cpp \
+           $$PWD/quaadler32.cpp \
+           $$PWD/quacrc32.cpp \
+           $$PWD/quazip.cpp \
+           $$PWD/quazipfile.cpp \
+           $$PWD/quazipnewinfo.cpp \
+           $$PWD/unzip.c \
+           $$PWD/zip.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.pro	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,77 @@
+TEMPLATE = lib
+CONFIG += qt warn_on
+QT -= gui
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+HEADERS += \
+    crypt.h\
+    ioapi.h\
+    JlCompress.h\
+    quaadler32.h\
+    quachecksum32.h\
+    quacrc32.h\
+    quazip.h\
+    quazipfile.h\
+    quazipfileinfo.h\
+    quazipnewinfo.h\
+    quazip_global.h\
+    unzip.h\
+    zip.h\
+
+SOURCES += *.c *.cpp
+
+unix:!symbian {
+    headers.path=$$PREFIX/include/quazip
+    headers.files=$$HEADERS
+    target.path=$$PREFIX/lib
+    INSTALLS += headers target
+
+	OBJECTS_DIR=.obj
+	MOC_DIR=.moc
+	
+	LIBS += -lz
+}
+
+win32 {
+    headers.path=$$PREFIX/include/quazip
+    headers.files=$$HEADERS
+    target.path=$$PREFIX/lib
+    INSTALLS += headers target
+
+    *-g++*: LIBS += -lz.dll
+    *-msvc*: LIBS += -lzlib
+    *-msvc*: QMAKE_LFLAGS += /IMPLIB:$$DESTDIR\\quazip.lib
+}
+
+
+symbian {
+
+    # Note, on Symbian you may run into troubles with LGPL.
+    # The point is, if your application uses some version of QuaZip,
+    # and a newer binary compatible version of QuaZip is released, then
+    # the users of your application must be able to relink it with the
+    # new QuaZip version. For example, to take advantage of some QuaZip
+    # bug fixes.
+
+    # This is probably best achieved by building QuaZip as a static
+    # library and providing linkable object files of your application,
+    # so users can relink it.
+
+    CONFIG += staticlib
+    CONFIG += debug_and_release
+
+    LIBS += -lezip
+
+    #Export headers to SDK Epoc32/include directory
+    exportheaders.sources = $$HEADERS
+    exportheaders.path = quazip
+    for(header, exportheaders.sources) {
+        BLD_INF_RULES.prj_exports += "$$header $$exportheaders.path/$$basename(header)"
+    }
+}
+
+
+
+DEFINES += QUAZIP_BUILD
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip_global.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,41 @@
+/**
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ */
+
+#ifndef QUAZIP_GLOBAL_H
+#define QUAZIP_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+/**
+ * When building the library with MSVC, QUAZIP_BUILD must be defined.
+ * qglobal.h takes care of defining Q_DECL_* correctly for msvc/gcc.
+ */
+
+#define QUAZIP_EXPORT
+
+#ifdef __GNUC__
+#define UNUSED __attribute__((__unused__))
+#else
+#define UNUSED
+#endif
+
+#endif // QUAZIP_GLOBAL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfile.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,428 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include "quazipfile.h"
+
+using namespace std;
+
+class QuaZipFilePrivate {
+  friend class QuaZipFile;
+  private:
+    QuaZipFile *q;
+    QuaZip *zip;
+    QString fileName;
+    QuaZip::CaseSensitivity caseSensitivity;
+    bool raw;
+    qint64 writePos;
+    // these two are for writing raw files
+    ulong uncompressedSize;
+    quint32 crc;
+    bool internal;
+    int zipError;
+    inline void resetZipError() const {setZipError(UNZ_OK);}
+    // const, but sets zipError!
+    void setZipError(int zipError) const;
+    inline QuaZipFilePrivate(QuaZipFile *q):
+      q(q), zip(NULL), internal(true), zipError(UNZ_OK) {}
+    inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName):
+      q(q), internal(true), zipError(UNZ_OK)
+      {
+        zip=new QuaZip(zipName);
+      }
+    inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName, const QString &fileName,
+        QuaZip::CaseSensitivity cs):
+      q(q), internal(true), zipError(UNZ_OK)
+      {
+        zip=new QuaZip(zipName);
+        this->fileName=fileName;
+        this->caseSensitivity=cs;
+      }
+    inline QuaZipFilePrivate(QuaZipFile *q, QuaZip *zip):
+      q(q), zip(zip), internal(false), zipError(UNZ_OK) {}
+    inline ~QuaZipFilePrivate()
+    {
+      if (internal)
+        delete zip;
+    }
+};
+
+QuaZipFile::QuaZipFile():
+  p(new QuaZipFilePrivate(this))
+{
+}
+
+QuaZipFile::QuaZipFile(QObject *parent):
+  QIODevice(parent),
+  p(new QuaZipFilePrivate(this))
+{
+}
+
+QuaZipFile::QuaZipFile(const QString& zipName, QObject *parent):
+  QIODevice(parent),
+  p(new QuaZipFilePrivate(this, zipName))
+{
+}
+
+QuaZipFile::QuaZipFile(const QString& zipName, const QString& fileName,
+    QuaZip::CaseSensitivity cs, QObject *parent):
+  QIODevice(parent),
+  p(new QuaZipFilePrivate(this, zipName, fileName, cs))
+{
+}
+
+QuaZipFile::QuaZipFile(QuaZip *zip, QObject *parent):
+  QIODevice(parent),
+  p(new QuaZipFilePrivate(this, zip))
+{
+}
+
+QuaZipFile::~QuaZipFile()
+{
+  if (isOpen())
+    close();
+  delete p;
+}
+
+QString QuaZipFile::getZipName() const
+{
+  return p->zip==NULL ? QString() : p->zip->getZipName();
+}
+
+QString QuaZipFile::getActualFileName()const
+{
+  p->setZipError(UNZ_OK);
+  if (p->zip == NULL || (openMode() & WriteOnly))
+    return QString();
+  QString name=p->zip->getCurrentFileName();
+  if(name.isNull())
+    p->setZipError(p->zip->getZipError());
+  return name;
+}
+
+void QuaZipFile::setZipName(const QString& zipName)
+{
+  if(isOpen()) {
+    qWarning("QuaZipFile::setZipName(): file is already open - can not set ZIP name");
+    return;
+  }
+  if(p->zip!=NULL && p->internal)
+    delete p->zip;
+  p->zip=new QuaZip(zipName);
+  p->internal=true;
+}
+
+void QuaZipFile::setZip(QuaZip *zip)
+{
+  if(isOpen()) {
+    qWarning("QuaZipFile::setZip(): file is already open - can not set ZIP");
+    return;
+  }
+  if(p->zip!=NULL && p->internal)
+    delete p->zip;
+  p->zip=zip;
+  p->fileName=QString();
+  p->internal=false;
+}
+
+void QuaZipFile::setFileName(const QString& fileName, QuaZip::CaseSensitivity cs)
+{
+  if(p->zip==NULL) {
+    qWarning("QuaZipFile::setFileName(): call setZipName() first");
+    return;
+  }
+  if(!p->internal) {
+    qWarning("QuaZipFile::setFileName(): should not be used when not using internal QuaZip");
+    return;
+  }
+  if(isOpen()) {
+    qWarning("QuaZipFile::setFileName(): can not set file name for already opened file");
+    return;
+  }
+  p->fileName=fileName;
+  p->caseSensitivity=cs;
+}
+
+void QuaZipFilePrivate::setZipError(int zipError) const
+{
+  QuaZipFilePrivate *fakeThis = const_cast<QuaZipFilePrivate*>(this); // non-const
+  fakeThis->zipError=zipError;
+  if(zipError==UNZ_OK)
+    q->setErrorString(QString());
+  else
+    q->setErrorString(q->tr("ZIP/UNZIP API error %1").arg(zipError));
+}
+
+bool QuaZipFile::open(OpenMode mode)
+{
+  return open(mode, NULL);
+}
+
+bool QuaZipFile::open(OpenMode mode, int *method, int *level, bool raw, const char *password)
+{
+  p->resetZipError();
+  if(isOpen()) {
+    qWarning("QuaZipFile::open(): already opened");
+    return false;
+  }
+  if(mode&Unbuffered) {
+    qWarning("QuaZipFile::open(): Unbuffered mode is not supported");
+    return false;
+  }
+  if((mode&ReadOnly)&&!(mode&WriteOnly)) {
+    if(p->internal) {
+      if(!p->zip->open(QuaZip::mdUnzip)) {
+        p->setZipError(p->zip->getZipError());
+        return false;
+      }
+      if(!p->zip->setCurrentFile(p->fileName, p->caseSensitivity)) {
+        p->setZipError(p->zip->getZipError());
+        p->zip->close();
+        return false;
+      }
+    } else {
+      if(p->zip==NULL) {
+        qWarning("QuaZipFile::open(): zip is NULL");
+        return false;
+      }
+      if(p->zip->getMode()!=QuaZip::mdUnzip) {
+        qWarning("QuaZipFile::open(): file open mode %d incompatible with ZIP open mode %d",
+            (int)mode, (int)p->zip->getMode());
+        return false;
+      }
+      if(!p->zip->hasCurrentFile()) {
+        qWarning("QuaZipFile::open(): zip does not have current file");
+        return false;
+      }
+    }
+    p->setZipError(unzOpenCurrentFile3(p->zip->getUnzFile(), method, level, (int)raw, password));
+    if(p->zipError==UNZ_OK) {
+      setOpenMode(mode);
+      p->raw=raw;
+      return true;
+    } else
+      return false;
+  }
+  qWarning("QuaZipFile::open(): open mode %d not supported by this function", (int)mode);
+  return false;
+}
+
+bool QuaZipFile::open(OpenMode mode, const QuaZipNewInfo& info,
+    const char *password, quint32 crc,
+    int method, int level, bool raw,
+    int windowBits, int memLevel, int strategy)
+{
+  zip_fileinfo info_z;
+  p->resetZipError();
+  if(isOpen()) {
+    qWarning("QuaZipFile::open(): already opened");
+    return false;
+  }
+  if((mode&WriteOnly)&&!(mode&ReadOnly)) {
+    if(p->internal) {
+      qWarning("QuaZipFile::open(): write mode is incompatible with internal QuaZip approach");
+      return false;
+    }
+    if(p->zip==NULL) {
+      qWarning("QuaZipFile::open(): zip is NULL");
+      return false;
+    }
+    if(p->zip->getMode()!=QuaZip::mdCreate&&p->zip->getMode()!=QuaZip::mdAppend&&p->zip->getMode()!=QuaZip::mdAdd) {
+      qWarning("QuaZipFile::open(): file open mode %d incompatible with ZIP open mode %d",
+          (int)mode, (int)p->zip->getMode());
+      return false;
+    }
+    info_z.tmz_date.tm_year=info.dateTime.date().year();
+    info_z.tmz_date.tm_mon=info.dateTime.date().month() - 1;
+    info_z.tmz_date.tm_mday=info.dateTime.date().day();
+    info_z.tmz_date.tm_hour=info.dateTime.time().hour();
+    info_z.tmz_date.tm_min=info.dateTime.time().minute();
+    info_z.tmz_date.tm_sec=info.dateTime.time().second();
+    info_z.dosDate = 0;
+    info_z.internal_fa=(uLong)info.internalAttr;
+    info_z.external_fa=(uLong)info.externalAttr;
+    p->setZipError(zipOpenNewFileInZip3(p->zip->getZipFile(),
+          p->zip->getFileNameCodec()->fromUnicode(info.name).constData(), &info_z,
+          info.extraLocal.constData(), info.extraLocal.length(),
+          info.extraGlobal.constData(), info.extraGlobal.length(),
+          p->zip->getCommentCodec()->fromUnicode(info.comment).constData(),
+          method, level, (int)raw,
+          windowBits, memLevel, strategy,
+          password, (uLong)crc));
+    if(p->zipError==UNZ_OK) {
+      p->writePos=0;
+      setOpenMode(mode);
+      p->raw=raw;
+      if(raw) {
+        p->crc=crc;
+        p->uncompressedSize=info.uncompressedSize;
+      }
+      return true;
+    } else
+      return false;
+  }
+  qWarning("QuaZipFile::open(): open mode %d not supported by this function", (int)mode);
+  return false;
+}
+
+bool QuaZipFile::isSequential()const
+{
+  return true;
+}
+
+qint64 QuaZipFile::pos()const
+{
+  if(p->zip==NULL) {
+    qWarning("QuaZipFile::pos(): call setZipName() or setZip() first");
+    return -1;
+  }
+  if(!isOpen()) {
+    qWarning("QuaZipFile::pos(): file is not open");
+    return -1;
+  }
+  if(openMode()&ReadOnly)
+    return unztell(p->zip->getUnzFile());
+  else
+    return p->writePos;
+}
+
+bool QuaZipFile::atEnd()const
+{
+  if(p->zip==NULL) {
+    qWarning("QuaZipFile::atEnd(): call setZipName() or setZip() first");
+    return false;
+  }
+  if(!isOpen()) {
+    qWarning("QuaZipFile::atEnd(): file is not open");
+    return false;
+  }
+  if(openMode()&ReadOnly)
+    return unzeof(p->zip->getUnzFile())==1;
+  else
+    return true;
+}
+
+qint64 QuaZipFile::size()const
+{
+  if(!isOpen()) {
+    qWarning("QuaZipFile::atEnd(): file is not open");
+    return -1;
+  }
+  if(openMode()&ReadOnly)
+    return p->raw?csize():usize();
+  else
+    return p->writePos;
+}
+
+qint64 QuaZipFile::csize()const
+{
+  unz_file_info info_z;
+  p->setZipError(UNZ_OK);
+  if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return -1;
+  p->setZipError(unzGetCurrentFileInfo(p->zip->getUnzFile(), &info_z, NULL, 0, NULL, 0, NULL, 0));
+  if(p->zipError!=UNZ_OK)
+    return -1;
+  return info_z.compressed_size;
+}
+
+qint64 QuaZipFile::usize()const
+{
+  unz_file_info info_z;
+  p->setZipError(UNZ_OK);
+  if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return -1;
+  p->setZipError(unzGetCurrentFileInfo(p->zip->getUnzFile(), &info_z, NULL, 0, NULL, 0, NULL, 0));
+  if(p->zipError!=UNZ_OK)
+    return -1;
+  return info_z.uncompressed_size;
+}
+
+bool QuaZipFile::getFileInfo(QuaZipFileInfo *info)
+{
+  if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return false;
+  p->zip->getCurrentFileInfo(info);
+  p->setZipError(p->zip->getZipError());
+  return p->zipError==UNZ_OK;
+}
+
+void QuaZipFile::close()
+{
+  p->resetZipError();
+  if(p->zip==NULL||!p->zip->isOpen()) return;
+  if(!isOpen()) {
+    qWarning("QuaZipFile::close(): file isn't open");
+    return;
+  }
+  if(openMode()&ReadOnly)
+    p->setZipError(unzCloseCurrentFile(p->zip->getUnzFile()));
+  else if(openMode()&WriteOnly)
+    if(isRaw()) p->setZipError(zipCloseFileInZipRaw(p->zip->getZipFile(), p->uncompressedSize, p->crc));
+    else p->setZipError(zipCloseFileInZip(p->zip->getZipFile()));
+  else {
+    qWarning("Wrong open mode: %d", (int)openMode());
+    return;
+  }
+  if(p->zipError==UNZ_OK) setOpenMode(QIODevice::NotOpen);
+  else return;
+  if(p->internal) {
+    p->zip->close();
+    p->setZipError(p->zip->getZipError());
+  }
+}
+
+qint64 QuaZipFile::readData(char *data, qint64 maxSize)
+{
+  p->setZipError(UNZ_OK);
+  qint64 bytesRead=unzReadCurrentFile(p->zip->getUnzFile(), data, (unsigned)maxSize);
+  if(bytesRead<0) p->setZipError((int)bytesRead);
+  return bytesRead;
+}
+
+qint64 QuaZipFile::writeData(const char* data, qint64 maxSize)
+{
+  p->setZipError(ZIP_OK);
+  p->setZipError(zipWriteInFileInZip(p->zip->getZipFile(), data, (uint)maxSize));
+  if(p->zipError!=ZIP_OK) return -1;
+  else {
+    p->writePos+=maxSize;
+    return maxSize;
+  }
+}
+
+QString QuaZipFile::getFileName() const
+{
+  return p->fileName;
+}
+
+QuaZip::CaseSensitivity QuaZipFile::getCaseSensitivity() const
+{
+  return p->caseSensitivity;
+}
+
+bool QuaZipFile::isRaw() const
+{
+  return p->raw;
+}
+
+int QuaZipFile::getZipError() const
+{
+  return p->zipError;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfile.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,433 @@
+#ifndef QUA_ZIPFILE_H
+#define QUA_ZIPFILE_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QIODevice>
+
+#include "quazip_global.h"
+#include "quazip.h"
+#include "quazipnewinfo.h"
+
+class QuaZipFilePrivate;
+
+/// A file inside ZIP archive.
+/** \class QuaZipFile quazipfile.h <quazip/quazipfile.h>
+ * This is the most interesting class. Not only it provides C++
+ * interface to the ZIP/UNZIP package, but also integrates it with Qt by
+ * subclassing QIODevice. This makes possible to access files inside ZIP
+ * archive using QTextStream or QDataStream, for example. Actually, this
+ * is the main purpose of the whole QuaZIP library.
+ *
+ * You can either use existing QuaZip instance to create instance of
+ * this class or pass ZIP archive file name to this class, in which case
+ * it will create internal QuaZip object. See constructors' descriptions
+ * for details. Writing is only possible with the existing instance.
+ *
+ * Note that due to the underlying library's limitation it is not
+ * possible to use multiple QuaZipFile instances to open several files
+ * in the same archive at the same time. If you need to write to
+ * multiple files in parallel, then you should write to temporary files
+ * first, then pack them all at once when you have finished writing. If
+ * you need to read multiple files inside the same archive in parallel,
+ * you should extract them all into a temporary directory first.
+ *
+ * \section quazipfile-sequential Sequential or random-access?
+ *
+ * At the first thought, QuaZipFile has fixed size, the start and the
+ * end and should be therefore considered random-access device. But
+ * there is one major obstacle to making it random-access: ZIP/UNZIP API
+ * does not support seek() operation and the only way to implement it is
+ * through reopening the file and re-reading to the required position,
+ * but this is prohibitively slow.
+ *
+ * Therefore, QuaZipFile is considered to be a sequential device. This
+ * has advantage of availability of the ungetChar() operation (QIODevice
+ * does not implement it properly for non-sequential devices unless they
+ * support seek()). Disadvantage is a somewhat strange behaviour of the
+ * size() and pos() functions. This should be kept in mind while using
+ * this class.
+ *
+ **/
+class QUAZIP_EXPORT QuaZipFile: public QIODevice {
+  friend class QuaZipFilePrivate;
+  Q_OBJECT
+  private:
+    QuaZipFilePrivate *p;
+    // these are not supported nor implemented
+    QuaZipFile(const QuaZipFile& that);
+    QuaZipFile& operator=(const QuaZipFile& that);
+  protected:
+    /// Implementation of the QIODevice::readData().
+    qint64 readData(char *data, qint64 maxSize);
+    /// Implementation of the QIODevice::writeData().
+    qint64 writeData(const char *data, qint64 maxSize);
+  public:
+    /// Constructs a QuaZipFile instance.
+    /** You should use setZipName() and setFileName() or setZip() before
+     * trying to call open() on the constructed object.
+     **/
+    QuaZipFile();
+    /// Constructs a QuaZipFile instance.
+    /** \a parent argument specifies this object's parent object.
+     *
+     * You should use setZipName() and setFileName() or setZip() before
+     * trying to call open() on the constructed object.
+     **/
+    QuaZipFile(QObject *parent);
+    /// Constructs a QuaZipFile instance.
+    /** \a parent argument specifies this object's parent object and \a
+     * zipName specifies ZIP archive file name.
+     *
+     * You should use setFileName() before trying to call open() on the
+     * constructed object.
+     *
+     * QuaZipFile constructed by this constructor can be used for read
+     * only access. Use QuaZipFile(QuaZip*,QObject*) for writing.
+     **/
+    QuaZipFile(const QString& zipName, QObject *parent =NULL);
+    /// Constructs a QuaZipFile instance.
+    /** \a parent argument specifies this object's parent object, \a
+     * zipName specifies ZIP archive file name and \a fileName and \a cs
+     * specify a name of the file to open inside archive.
+     *
+     * QuaZipFile constructed by this constructor can be used for read
+     * only access. Use QuaZipFile(QuaZip*,QObject*) for writing.
+     *
+     * \sa QuaZip::setCurrentFile()
+     **/
+    QuaZipFile(const QString& zipName, const QString& fileName,
+        QuaZip::CaseSensitivity cs =QuaZip::csDefault, QObject *parent =NULL);
+    /// Constructs a QuaZipFile instance.
+    /** \a parent argument specifies this object's parent object.
+     *
+     * \a zip is the pointer to the existing QuaZip object. This
+     * QuaZipFile object then can be used to read current file in the
+     * \a zip or to write to the file inside it.
+     *
+     * \warning Using this constructor for reading current file can be
+     * tricky. Let's take the following example:
+     * \code
+     * QuaZip zip("archive.zip");
+     * zip.open(QuaZip::mdUnzip);
+     * zip.setCurrentFile("file-in-archive");
+     * QuaZipFile file(&zip);
+     * file.open(QIODevice::ReadOnly);
+     * // ok, now we can read from the file
+     * file.read(somewhere, some);
+     * zip.setCurrentFile("another-file-in-archive"); // oops...
+     * QuaZipFile anotherFile(&zip);
+     * anotherFile.open(QIODevice::ReadOnly);
+     * anotherFile.read(somewhere, some); // this is still ok...
+     * file.read(somewhere, some); // and this is NOT
+     * \endcode
+     * So, what exactly happens here? When we change current file in the
+     * \c zip archive, \c file that references it becomes invalid
+     * (actually, as far as I understand ZIP/UNZIP sources, it becomes
+     * closed, but QuaZipFile has no means to detect it).
+     *
+     * Summary: do not close \c zip object or change its current file as
+     * long as QuaZipFile is open. Even better - use another constructors
+     * which create internal QuaZip instances, one per object, and
+     * therefore do not cause unnecessary trouble. This constructor may
+     * be useful, though, if you already have a QuaZip instance and do
+     * not want to access several files at once. Good example:
+     * \code
+     * QuaZip zip("archive.zip");
+     * zip.open(QuaZip::mdUnzip);
+     * // first, we need some information about archive itself
+     * QByteArray comment=zip.getComment();
+     * // and now we are going to access files inside it
+     * QuaZipFile file(&zip);
+     * for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile()) {
+     *   file.open(QIODevice::ReadOnly);
+     *   // do something cool with file here
+     *   file.close(); // do not forget to close!
+     * }
+     * zip.close();
+     * \endcode
+     **/
+    QuaZipFile(QuaZip *zip, QObject *parent =NULL);
+    /// Destroys a QuaZipFile instance.
+    /** Closes file if open, destructs internal QuaZip object (if it
+     * exists and \em is internal, of course).
+     **/
+    virtual ~QuaZipFile();
+    /// Returns the ZIP archive file name.
+    /** If this object was created by passing QuaZip pointer to the
+     * constructor, this function will return that QuaZip's file name
+     * (or null string if that object does not have file name yet).
+     *
+     * Otherwise, returns associated ZIP archive file name or null
+     * string if there are no name set yet.
+     *
+     * \sa setZipName() getFileName()
+     **/
+    QString getZipName()const;
+    /// Returns a pointer to the associated QuaZip object.
+    /** Returns \c NULL if there is no associated QuaZip or it is
+     * internal (so you will not mess with it).
+     **/
+    QuaZip* getZip()const;
+    /// Returns file name.
+    /** This function returns file name you passed to this object either
+     * by using
+     * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*)
+     * or by calling setFileName(). Real name of the file may differ in
+     * case if you used case-insensitivity.
+     *
+     * Returns null string if there is no file name set yet. This is the
+     * case when this QuaZipFile operates on the existing QuaZip object
+     * (constructor QuaZipFile(QuaZip*,QObject*) or setZip() was used).
+     * 
+     * \sa getActualFileName
+     **/
+    QString getFileName() const;
+    /// Returns case sensitivity of the file name.
+    /** This function returns case sensitivity argument you passed to
+     * this object either by using
+     * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*)
+     * or by calling setFileName().
+     *
+     * Returns unpredictable value if getFileName() returns null string
+     * (this is the case when you did not used setFileName() or
+     * constructor above).
+     *
+     * \sa getFileName
+     **/
+    QuaZip::CaseSensitivity getCaseSensitivity() const;
+    /// Returns the actual file name in the archive.
+    /** This is \em not a ZIP archive file name, but a name of file inside
+     * archive. It is not necessary the same name that you have passed
+     * to the
+     * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*),
+     * setFileName() or QuaZip::setCurrentFile() - this is the real file
+     * name inside archive, so it may differ in case if the file name
+     * search was case-insensitive.
+     *
+     * Equivalent to calling getCurrentFileName() on the associated
+     * QuaZip object. Returns null string if there is no associated
+     * QuaZip object or if it does not have a current file yet. And this
+     * is the case if you called setFileName() but did not open the
+     * file yet. So this is perfectly fine:
+     * \code
+     * QuaZipFile file("somezip.zip");
+     * file.setFileName("somefile");
+     * QString name=file.getName(); // name=="somefile"
+     * QString actual=file.getActualFileName(); // actual is null string
+     * file.open(QIODevice::ReadOnly);
+     * QString actual=file.getActualFileName(); // actual can be "SoMeFiLe" on Windows
+     * \endcode
+     *
+     * \sa getZipName(), getFileName(), QuaZip::CaseSensitivity
+     **/
+    QString getActualFileName()const;
+    /// Sets the ZIP archive file name.
+    /** Automatically creates internal QuaZip object and destroys
+     * previously created internal QuaZip object, if any.
+     *
+     * Will do nothing if this file is already open. You must close() it
+     * first.
+     **/
+    void setZipName(const QString& zipName);
+    /// Returns \c true if the file was opened in raw mode.
+    /** If the file is not open, the returned value is undefined.
+     *
+     * \sa open(OpenMode,int*,int*,bool,const char*)
+     **/
+    bool isRaw() const;
+    /// Binds to the existing QuaZip instance.
+    /** This function destroys internal QuaZip object, if any, and makes
+     * this QuaZipFile to use current file in the \a zip object for any
+     * further operations. See QuaZipFile(QuaZip*,QObject*) for the
+     * possible pitfalls.
+     *
+     * Will do nothing if the file is currently open. You must close()
+     * it first.
+     **/
+    void setZip(QuaZip *zip);
+    /// Sets the file name.
+    /** Will do nothing if at least one of the following conditions is
+     * met:
+     * - ZIP name has not been set yet (getZipName() returns null
+     *   string).
+     * - This QuaZipFile is associated with external QuaZip. In this
+     *   case you should call that QuaZip's setCurrentFile() function
+     *   instead!
+     * - File is already open so setting the name is meaningless.
+     *
+     * \sa QuaZip::setCurrentFile
+     **/
+    void setFileName(const QString& fileName, QuaZip::CaseSensitivity cs =QuaZip::csDefault);
+    /// Opens a file for reading.
+    /** Returns \c true on success, \c false otherwise.
+     * Call getZipError() to get error code.
+     *
+     * \note Since ZIP/UNZIP API provides buffered reading only,
+     * QuaZipFile does not support unbuffered reading. So do not pass
+     * QIODevice::Unbuffered flag in \a mode, or open will fail.
+     **/
+    virtual bool open(OpenMode mode);
+    /// Opens a file for reading.
+    /** \overload
+     * Argument \a password specifies a password to decrypt the file. If
+     * it is NULL then this function behaves just like open(OpenMode).
+     **/
+    inline bool open(OpenMode mode, const char *password)
+    {return open(mode, NULL, NULL, false, password);}
+    /// Opens a file for reading.
+    /** \overload
+     * Argument \a password specifies a password to decrypt the file.
+     *
+     * An integers pointed by \a method and \a level will receive codes
+     * of the compression method and level used. See unzip.h.
+     *
+     * If raw is \c true then no decompression is performed.
+     *
+     * \a method should not be \c NULL. \a level can be \c NULL if you
+     * don't want to know the compression level.
+     **/
+    bool open(OpenMode mode, int *method, int *level, bool raw, const char *password =NULL);
+    /// Opens a file for writing.
+    /** \a info argument specifies information about file. It should at
+     * least specify a correct file name. Also, it is a good idea to
+     * specify correct timestamp (by default, current time will be
+     * used). See QuaZipNewInfo.
+     *
+     * Arguments \a password and \a crc provide necessary information
+     * for crypting. Note that you should specify both of them if you
+     * need crypting. If you do not, pass \c NULL as password, but you
+     * still need to specify \a crc if you are going to use raw mode
+     * (see below).
+     *
+     * Arguments \a method and \a level specify compression method and
+     * level.
+     *
+     * If \a raw is \c true, no compression is performed. In this case,
+     * \a crc and uncompressedSize field of the \a info are required.
+     *
+     * Arguments \a windowBits, \a memLevel, \a strategy provide zlib
+     * algorithms tuning. See deflateInit2() in zlib.
+     **/
+    bool open(OpenMode mode, const QuaZipNewInfo& info,
+        const char *password =NULL, quint32 crc =0,
+        int method =Z_DEFLATED, int level =Z_DEFAULT_COMPRESSION, bool raw =false,
+        int windowBits =-MAX_WBITS, int memLevel =DEF_MEM_LEVEL, int strategy =Z_DEFAULT_STRATEGY);
+    /// Returns \c true, but \ref quazipfile-sequential "beware"!
+    virtual bool isSequential()const;
+    /// Returns current position in the file.
+    /** Implementation of the QIODevice::pos(). When reading, this
+     * function is a wrapper to the ZIP/UNZIP unztell(), therefore it is
+     * unable to keep track of the ungetChar() calls (which is
+     * non-virtual and therefore is dangerous to reimplement). So if you
+     * are using ungetChar() feature of the QIODevice, this function
+     * reports incorrect value until you get back characters which you
+     * ungot.
+     *
+     * When writing, pos() returns number of bytes already written
+     * (uncompressed unless you use raw mode).
+     *
+     * \note Although
+     * \ref quazipfile-sequential "QuaZipFile is a sequential device"
+     * and therefore pos() should always return zero, it does not,
+     * because it would be misguiding. Keep this in mind.
+     *
+     * This function returns -1 if the file or archive is not open.
+     *
+     * Error code returned by getZipError() is not affected by this
+     * function call.
+     **/
+    virtual qint64 pos()const;
+    /// Returns \c true if the end of file was reached.
+    /** This function returns \c false in the case of error. This means
+     * that you called this function on either not open file, or a file
+     * in the not open archive or even on a QuaZipFile instance that
+     * does not even have QuaZip instance associated. Do not do that
+     * because there is no means to determine whether \c false is
+     * returned because of error or because end of file was reached.
+     * Well, on the other side you may interpret \c false return value
+     * as "there is no file open to check for end of file and there is
+     * no end of file therefore".
+     *
+     * When writing, this function always returns \c true (because you
+     * are always writing to the end of file).
+     *
+     * Error code returned by getZipError() is not affected by this
+     * function call.
+     **/
+    virtual bool atEnd()const;
+    /// Returns file size.
+    /** This function returns csize() if the file is open for reading in
+     * raw mode, usize() if it is open for reading in normal mode and
+     * pos() if it is open for writing.
+     *
+     * Returns -1 on error, call getZipError() to get error code.
+     *
+     * \note This function returns file size despite that
+     * \ref quazipfile-sequential "QuaZipFile is considered to be sequential device",
+     * for which size() should return bytesAvailable() instead. But its
+     * name would be very misguiding otherwise, so just keep in mind
+     * this inconsistence.
+     **/
+    virtual qint64 size()const;
+    /// Returns compressed file size.
+    /** Equivalent to calling getFileInfo() and then getting
+     * compressedSize field, but more convenient and faster.
+     *
+     * File must be open for reading before calling this function.
+     *
+     * Returns -1 on error, call getZipError() to get error code.
+     **/
+    qint64 csize()const;
+    /// Returns uncompressed file size.
+    /** Equivalent to calling getFileInfo() and then getting
+     * uncompressedSize field, but more convenient and faster. See
+     * getFileInfo() for a warning.
+     *
+     * File must be open for reading before calling this function.
+     *
+     * Returns -1 on error, call getZipError() to get error code.
+     **/
+    qint64 usize()const;
+    /// Gets information about current file.
+    /** This function does the same thing as calling
+     * QuaZip::getCurrentFileInfo() on the associated QuaZip object,
+     * but you can not call getCurrentFileInfo() if the associated
+     * QuaZip is internal (because you do not have access to it), while
+     * you still can call this function in that case.
+     *
+     * File must be open for reading before calling this function.
+     *
+     * Returns \c false in the case of an error.
+     **/
+    bool getFileInfo(QuaZipFileInfo *info);
+    /// Closes the file.
+    /** Call getZipError() to determine if the close was successful.
+     **/
+    virtual void close();
+    /// Returns the error code returned by the last ZIP/UNZIP API call.
+    int getZipError() const;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfileinfo.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,66 @@
+#ifndef QUA_ZIPFILEINFO_H
+#define QUA_ZIPFILEINFO_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QByteArray>
+#include <QDateTime>
+
+#include "quazip_global.h"
+
+/// Information about a file inside archive.
+/** Call QuaZip::getCurrentFileInfo() or QuaZipFile::getFileInfo() to
+ * fill this structure. */
+struct QUAZIP_EXPORT QuaZipFileInfo {
+  /// File name.
+  QString name;
+  /// Version created by.
+  quint16 versionCreated;
+  /// Version needed to extract.
+  quint16 versionNeeded;
+  /// General purpose flags.
+  quint16 flags;
+  /// Compression method.
+  quint16 method;
+  /// Last modification date and time.
+  QDateTime dateTime;
+  /// CRC.
+  quint32 crc;
+  /// Compressed file size.
+  quint32 compressedSize;
+  /// Uncompressed file size.
+  quint32 uncompressedSize;
+  /// Disk number start.
+  quint16 diskNumberStart;
+  /// Internal file attributes.
+  quint16 internalAttr;
+  /// External file attributes.
+  quint32 externalAttr;
+  /// Comment.
+  QString comment;
+  /// Extra field.
+  QByteArray extra;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipnewinfo.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,51 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+*/
+
+#include <QFileInfo>
+
+#include "quazipnewinfo.h"
+
+
+QuaZipNewInfo::QuaZipNewInfo(const QString& name):
+  name(name), dateTime(QDateTime::currentDateTime()), internalAttr(0), externalAttr(0)
+{
+}
+
+QuaZipNewInfo::QuaZipNewInfo(const QString& name, const QString& file):
+  name(name), internalAttr(0), externalAttr(0)
+{
+  QFileInfo info(file);
+  QDateTime lm = info.lastModified();
+  if (!info.exists())
+    dateTime = QDateTime::currentDateTime();
+  else
+    dateTime = lm;
+}
+
+void QuaZipNewInfo::setFileDateTime(const QString& file)
+{
+  QFileInfo info(file);
+  QDateTime lm = info.lastModified();
+  if (info.exists())
+    dateTime = lm;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipnewinfo.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,102 @@
+#ifndef QUA_ZIPNEWINFO_H
+#define QUA_ZIPNEWINFO_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program 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 of the License, or (at
+your option) any later version.
+
+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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QDateTime>
+#include <QString>
+
+#include "quazip_global.h"
+
+/// Information about a file to be created.
+/** This structure holds information about a file to be created inside
+ * ZIP archive. At least name should be set to something correct before
+ * passing this structure to
+ * QuaZipFile::open(OpenMode,const QuaZipNewInfo&,int,int,bool).
+ **/
+struct QUAZIP_EXPORT QuaZipNewInfo {
+  /// File name.
+  /** This field holds file name inside archive, including path relative
+   * to archive root.
+   **/
+  QString name;
+  /// File timestamp.
+  /** This is the last file modification date and time. Will be stored
+   * in the archive central directory. It is a good practice to set it
+   * to the source file timestamp instead of archive creating time. Use
+   * setFileDateTime() or QuaZipNewInfo(const QString&, const QString&).
+   **/
+  QDateTime dateTime;
+  /// File internal attributes.
+  quint16 internalAttr;
+  /// File external attributes.
+  quint32 externalAttr;
+  /// File comment.
+  /** Will be encoded using QuaZip::getCommentCodec().
+   **/
+  QString comment;
+  /// File local extra field.
+  QByteArray extraLocal;
+  /// File global extra field.
+  QByteArray extraGlobal;
+  /// Uncompressed file size.
+  /** This is only needed if you are using raw file zipping mode, i. e.
+   * adding precompressed file in the zip archive.
+   **/
+  ulong uncompressedSize;
+  /// Constructs QuaZipNewInfo instance.
+  /** Initializes name with \a name, dateTime with current date and
+   * time. Attributes are initialized with zeros, comment and extra
+   * field with null values.
+   **/
+  QuaZipNewInfo(const QString& name);
+  /// Constructs QuaZipNewInfo instance.
+  /** Initializes name with \a name and dateTime with timestamp of the
+   * file named \a file. If the \a file does not exists or its timestamp
+   * is inaccessible (e. g. you do not have read permission for the
+   * directory file in), uses current date and time. Attributes are
+   * initialized with zeros, comment and extra field with null values.
+   * 
+   * \sa setFileDateTime()
+   **/
+  QuaZipNewInfo(const QString& name, const QString& file);
+  /// Sets the file timestamp from the existing file.
+  /** Use this function to set the file timestamp from the existing
+   * file. Use it like this:
+   * \code
+   * QuaZipFile zipFile(&zip);
+   * QFile file("file-to-add");
+   * file.open(QIODevice::ReadOnly);
+   * QuaZipNewInfo info("file-name-in-archive");
+   * info.setFileDateTime("file-to-add"); // take the timestamp from file
+   * zipFile.open(QIODevice::WriteOnly, info);
+   * \endcode
+   *
+   * This function does not change dateTime if some error occured (e. g.
+   * file is inaccessible).
+   **/
+  void setFileDateTime(const QString& file);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/unzip.c	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,1603 @@
+/* unzip.c -- IO for uncompress .zip files using zlib
+   Version 1.01e, February 12th, 2005
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   Read unzip.h for more info
+
+   Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
+compatibility with older software. The following is from the original crypt.c. Code
+woven in by Terry Thorsen 1/2003.
+*/
+/*
+  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
+
+  See the accompanying file LICENSE, version 2000-Apr-09 or later
+  (the contents of which are also included in zip.h) for terms of use.
+  If, for some reason, all these files are missing, the Info-ZIP license
+  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
+*/
+/*
+  crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]
+
+  The encryption/decryption parts of this source code (as opposed to the
+  non-echoing password parts) were originally written in Europe.  The
+  whole source package can be freely distributed, including from the USA.
+  (Prior to January 2000, re-export from the US was a violation of US law.)
+ */
+
+/*
+  This encryption code is a direct transcription of the algorithm from
+  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
+  file (appnote.txt) is distributed with the PKZIP program (even in the
+  version without encryption capabilities).
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "unzip.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+#ifndef CASESENSITIVITYDEFAULT_NO
+#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+#    define CASESENSITIVITYDEFAULT_NO
+#  endif
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+
+
+const char unz_copyright[] =
+   " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info_internal_s
+{
+    uLong offset_curfile;/* relative offset of local header 4 bytes */
+} unz_file_info_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+    when reading and decompress it */
+typedef struct
+{
+    char  *read_buffer;         /* internal buffer for compressed data */
+    z_stream stream;            /* zLib stream structure for inflate */
+
+    uLong pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
+    uLong stream_initialised;   /* flag set if stream structure is initialised*/
+
+    uLong offset_local_extrafield;/* offset of the local extra field */
+    uInt  size_local_extrafield;/* size of the local extra field */
+    uLong pos_local_extrafield;   /* position in the local extra field in read*/
+
+    uLong crc32;                /* crc32 of all data uncompressed */
+    uLong crc32_wait;           /* crc32 we must obtain after decompress all */
+    uLong rest_read_compressed; /* number of byte to be decompressed */
+    uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+    zlib_filefunc_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    uLong compression_method;   /* compression method (0==store) */
+    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+    int   raw;
+} file_in_zip_read_info_s;
+
+
+/* unz_s contain internal information about the zipfile
+*/
+typedef struct
+{
+    zlib_filefunc_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    unz_global_info gi;       /* public global information */
+    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+    uLong num_file;             /* number of the current file in the zipfile*/
+    uLong pos_in_central_dir;   /* pos of the current file in the central dir*/
+    uLong current_file_ok;      /* flag about the usability of the current file*/
+    uLong central_pos;          /* position of the beginning of the central dir*/
+
+    uLong size_central_dir;     /* size of the central directory  */
+    uLong offset_central_dir;   /* offset of start of central directory with
+                                   respect to the starting disk number */
+
+    unz_file_info cur_file_info; /* public info about the current file in zip*/
+    unz_file_info_internal cur_file_info_internal; /* private info about it*/
+    file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
+                                        file if we are decompressing it */
+    int encrypted;
+#    ifndef NOUNCRYPT
+    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
+    const unsigned long* pcrc_32_tab;
+#    endif
+} unz_s;
+
+
+#ifndef NOUNCRYPT
+#include "crypt.h"
+#endif
+
+/* ===========================================================================
+     Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+   for end of file.
+   IN assertion: the stream s has been sucessfully opened for reading.
+*/
+
+
+local int unzlocal_getByte OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    int *pi));
+
+local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    int *pi;
+{
+    unsigned char c;
+    int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+    if (err==1)
+    {
+        *pi = (int)c;
+        return UNZ_OK;
+    }
+    else
+    {
+        if (ZERROR(*pzlib_filefunc_def,filestream))
+            return UNZ_ERRNO;
+        else
+            return UNZ_EOF;
+    }
+}
+
+
+/* ===========================================================================
+   Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unzlocal_getShort OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==UNZ_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int unzlocal_getLong OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<16;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<24;
+
+    if (err==UNZ_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (fileName1,fileName2)
+    const char* fileName1;
+    const char* fileName2;
+{
+    for (;;)
+    {
+        char c1=*(fileName1++);
+        char c2=*(fileName2++);
+        if ((c1>='a') && (c1<='z'))
+            c1 -= 0x20;
+        if ((c2>='a') && (c2<='z'))
+            c2 -= 0x20;
+        if (c1=='\0')
+            return ((c2=='\0') ? 0 : -1);
+        if (c2=='\0')
+            return 1;
+        if (c1<c2)
+            return -1;
+        if (c1>c2)
+            return 1;
+    }
+}
+
+
+#ifdef  CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+   Compare two filename (fileName1,fileName2).
+   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+                                                                or strcasecmp)
+   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+        (like 1 on Unix, 2 on Windows)
+
+*/
+extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
+    const char* fileName1;
+    const char* fileName2;
+    int iCaseSensitivity;
+{
+    if (iCaseSensitivity==0)
+        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+    if (iCaseSensitivity==1)
+        return strcmp(fileName1,fileName2);
+
+    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+
+/*
+  Locate the Central directory of a zipfile (at the end, just before
+    the global comment)
+*/
+local uLong unzlocal_SearchCentralDir OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream));
+
+local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+{
+    unsigned char* buf;
+    uLong uSizeFile;
+    uLong uBackRead;
+    uLong uMaxBack=0xffff; /* maximum size of global comment */
+    uLong uPosFound=0;
+
+    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+        return 0;
+
+
+    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+    if (uMaxBack>uSizeFile)
+        uMaxBack = uSizeFile;
+
+    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+    if (buf==NULL)
+        return 0;
+
+    uBackRead = 4;
+    while (uBackRead<uMaxBack)
+    {
+        uLong uReadSize,uReadPos ;
+        int i;
+        if (uBackRead+BUFREADCOMMENT>uMaxBack)
+            uBackRead = uMaxBack;
+        else
+            uBackRead+=BUFREADCOMMENT;
+        uReadPos = uSizeFile-uBackRead ;
+
+        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            break;
+
+        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+            break;
+
+        for (i=(int)uReadSize-3; (i--)>0;)
+            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+            {
+                uPosFound = uReadPos+i;
+                break;
+            }
+
+        if (uPosFound!=0)
+            break;
+    }
+    TRYFREE(buf);
+    return uPosFound;
+}
+
+/*
+  Open a Zip file. path contain the full pathname (by example,
+     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
+     "zlib/zlib114.zip".
+     If the zipfile cannot be opened (file doesn't exist or in not valid), the
+       return value is NULL.
+     Else, the return value is a unzFile Handle, usable with other function
+       of this unzip package.
+*/
+extern unzFile ZEXPORT unzOpen2 (file, pzlib_filefunc_def)
+    voidpf file;
+    zlib_filefunc_def* pzlib_filefunc_def;
+{
+    unz_s us;
+    unz_s *s;
+    uLong central_pos,uL;
+
+    uLong number_disk;          /* number of the current dist, used for
+                                   spaning ZIP, unsupported, always 0*/
+    uLong number_disk_with_CD;  /* number the the disk with central dir, used
+                                   for spaning ZIP, unsupported, always 0*/
+    uLong number_entry_CD;      /* total number of entries in
+                                   the central dir
+                                   (same than number_entry on nospan) */
+
+    int err=UNZ_OK;
+
+    if (unz_copyright[0]!=' ')
+        return NULL;
+
+    if (pzlib_filefunc_def==NULL)
+        fill_qiodevice_filefunc(&us.z_filefunc);
+    else
+        us.z_filefunc = *pzlib_filefunc_def;
+
+    us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
+                                                 file,
+                                                 ZLIB_FILEFUNC_MODE_READ |
+                                                 ZLIB_FILEFUNC_MODE_EXISTING);
+    if (us.filestream==NULL)
+        return NULL;
+
+    central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
+    if (central_pos==0)
+        err=UNZ_ERRNO;
+
+    if (ZSEEK(us.z_filefunc, us.filestream,
+                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        err=UNZ_ERRNO;
+
+    /* the signature, already checked */
+    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* number of this disk */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* number of the disk with the start of the central directory */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* total number of entries in the central dir on this disk */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* total number of entries in the central dir */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if ((number_entry_CD!=us.gi.number_entry) ||
+        (number_disk_with_CD!=0) ||
+        (number_disk!=0))
+        err=UNZ_BADZIPFILE;
+
+    /* size of the central directory */
+    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* offset of start of central directory with respect to the
+          starting disk number */
+    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* zipfile comment length */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+        (err==UNZ_OK))
+        err=UNZ_BADZIPFILE;
+
+    if (err!=UNZ_OK)
+    {
+        ZCLOSE(us.z_filefunc, us.filestream);
+        return NULL;
+    }
+
+    us.byte_before_the_zipfile = central_pos -
+                            (us.offset_central_dir+us.size_central_dir);
+    us.central_pos = central_pos;
+    us.pfile_in_zip_read = NULL;
+    us.encrypted = 0;
+
+
+    s=(unz_s*)ALLOC(sizeof(unz_s));
+    *s=us;
+    unzGoToFirstFile((unzFile)s);
+    return (unzFile)s;
+}
+
+
+extern unzFile ZEXPORT unzOpen (file)
+    voidpf file;
+{
+    return unzOpen2(file, NULL);
+}
+
+/*
+  Close a ZipFile opened with unzipOpen.
+  If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+  return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzClose (file)
+    unzFile file;
+{
+    unz_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+
+    if (s->pfile_in_zip_read!=NULL)
+        unzCloseCurrentFile(file);
+
+    ZCLOSE(s->z_filefunc, s->filestream);
+    TRYFREE(s);
+    return UNZ_OK;
+}
+
+
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
+    unzFile file;
+    unz_global_info *pglobal_info;
+{
+    unz_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    *pglobal_info=s->gi;
+    return UNZ_OK;
+}
+
+
+/*
+   Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
+    uLong ulDosDate;
+    tm_unz* ptm;
+{
+    uLong uDate;
+    uDate = (uLong)(ulDosDate>>16);
+    ptm->tm_mday = (uInt)(uDate&0x1f) ;
+    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
+    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+  Get Info about the current file in the zipfile, with internal only info
+*/
+local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
+                                                  unz_file_info *pfile_info,
+                                                  unz_file_info_internal
+                                                  *pfile_info_internal,
+                                                  char *szFileName,
+                                                  uLong fileNameBufferSize,
+                                                  void *extraField,
+                                                  uLong extraFieldBufferSize,
+                                                  char *szComment,
+                                                  uLong commentBufferSize));
+
+local int unzlocal_GetCurrentFileInfoInternal (file,
+                                              pfile_info,
+                                              pfile_info_internal,
+                                              szFileName, fileNameBufferSize,
+                                              extraField, extraFieldBufferSize,
+                                              szComment,  commentBufferSize)
+    unzFile file;
+    unz_file_info *pfile_info;
+    unz_file_info_internal *pfile_info_internal;
+    char *szFileName;
+    uLong fileNameBufferSize;
+    void *extraField;
+    uLong extraFieldBufferSize;
+    char *szComment;
+    uLong commentBufferSize;
+{
+    unz_s* s;
+    unz_file_info file_info;
+    unz_file_info_internal file_info_internal;
+    int err=UNZ_OK;
+    uLong uMagic;
+    uLong uSeek=0;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (ZSEEK(s->z_filefunc, s->filestream,
+              s->pos_in_central_dir+s->byte_before_the_zipfile,
+              ZLIB_FILEFUNC_SEEK_SET)!=0)
+        err=UNZ_ERRNO;
+
+
+    /* we check the magic */
+    if (err==UNZ_OK) {
+        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+            err=UNZ_ERRNO;
+        else if (uMagic!=0x02014b50)
+            err=UNZ_BADZIPFILE;
+    }
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    uSeek+=file_info.size_filename;
+    if ((err==UNZ_OK) && (szFileName!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_filename<fileNameBufferSize)
+        {
+            *(szFileName+file_info.size_filename)='\0';
+            uSizeRead = file_info.size_filename;
+        }
+        else
+            uSizeRead = fileNameBufferSize;
+
+        if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+            if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        uSeek -= uSizeRead;
+    }
+
+
+    if ((err==UNZ_OK) && (extraField!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_file_extra<extraFieldBufferSize)
+            uSizeRead = file_info.size_file_extra;
+        else
+            uSizeRead = extraFieldBufferSize;
+
+        if (uSeek!=0) {
+            if (ZSEEK(s->z_filefunc, s->filestream,uSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+                uSeek=0;
+            else
+                err=UNZ_ERRNO;
+        }
+        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+            if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        uSeek += file_info.size_file_extra - uSizeRead;
+    }
+    else
+        uSeek+=file_info.size_file_extra;
+
+
+    if ((err==UNZ_OK) && (szComment!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_file_comment<commentBufferSize)
+        {
+            *(szComment+file_info.size_file_comment)='\0';
+            uSizeRead = file_info.size_file_comment;
+        }
+        else
+            uSizeRead = commentBufferSize;
+
+        if (uSeek!=0) {
+            if (ZSEEK(s->z_filefunc, s->filestream,uSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+                uSeek=0;
+            else
+                err=UNZ_ERRNO;
+        }
+        if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+            if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        uSeek+=file_info.size_file_comment - uSizeRead;
+    }
+    else
+        uSeek+=file_info.size_file_comment;
+
+    if ((err==UNZ_OK) && (pfile_info!=NULL))
+        *pfile_info=file_info;
+
+    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+        *pfile_info_internal=file_info_internal;
+
+    return err;
+}
+
+
+
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem.
+*/
+extern int ZEXPORT unzGetCurrentFileInfo (file,
+                                          pfile_info,
+                                          szFileName, fileNameBufferSize,
+                                          extraField, extraFieldBufferSize,
+                                          szComment,  commentBufferSize)
+    unzFile file;
+    unz_file_info *pfile_info;
+    char *szFileName;
+    uLong fileNameBufferSize;
+    void *extraField;
+    uLong extraFieldBufferSize;
+    char *szComment;
+    uLong commentBufferSize;
+{
+    return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+                                                szFileName,fileNameBufferSize,
+                                                extraField,extraFieldBufferSize,
+                                                szComment,commentBufferSize);
+}
+
+/*
+  Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem
+*/
+extern int ZEXPORT unzGoToFirstFile (file)
+    unzFile file;
+{
+    int err=UNZ_OK;
+    unz_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    s->pos_in_central_dir=s->offset_central_dir;
+    s->num_file=0;
+    err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                             &s->cur_file_info_internal,
+                                             NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+/*
+  Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern int ZEXPORT unzGoToNextFile (file)
+    unzFile file;
+{
+    unz_s* s;
+    int err;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */
+      if (s->num_file+1==s->gi.number_entry)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+    s->num_file++;
+    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                               &s->cur_file_info_internal,
+                                               NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+
+/*
+  Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzipStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
+    unzFile file;
+    const char *szFileName;
+    int iCaseSensitivity;
+{
+    unz_s* s;
+    int err;
+
+    /* We remember the 'current' position in the file so that we can jump
+     * back there if we fail.
+     */
+    unz_file_info cur_file_infoSaved;
+    unz_file_info_internal cur_file_info_internalSaved;
+    uLong num_fileSaved;
+    uLong pos_in_central_dirSaved;
+
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+
+    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+        return UNZ_PARAMERROR;
+
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    /* Save the current state */
+    num_fileSaved = s->num_file;
+    pos_in_central_dirSaved = s->pos_in_central_dir;
+    cur_file_infoSaved = s->cur_file_info;
+    cur_file_info_internalSaved = s->cur_file_info_internal;
+
+    err = unzGoToFirstFile(file);
+
+    while (err == UNZ_OK)
+    {
+        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+        err = unzGetCurrentFileInfo(file,NULL,
+                                    szCurrentFileName,sizeof(szCurrentFileName)-1,
+                                    NULL,0,NULL,0);
+        if (err == UNZ_OK)
+        {
+            if (unzStringFileNameCompare(szCurrentFileName,
+                                            szFileName,iCaseSensitivity)==0)
+                return UNZ_OK;
+            err = unzGoToNextFile(file);
+        }
+    }
+
+    /* We failed, so restore the state of the 'current file' to where we
+     * were.
+     */
+    s->num_file = num_fileSaved ;
+    s->pos_in_central_dir = pos_in_central_dirSaved ;
+    s->cur_file_info = cur_file_infoSaved;
+    s->cur_file_info_internal = cur_file_info_internalSaved;
+    return err;
+}
+
+
+/*
+///////////////////////////////////////////
+// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
+// I need random access
+//
+// Further optimization could be realized by adding an ability
+// to cache the directory in memory. The goal being a single
+// comprehensive file read to put the file I need in a memory.
+*/
+
+/*
+typedef struct unz_file_pos_s
+{
+    uLong pos_in_zip_directory;   // offset in file
+    uLong num_of_file;            // # of file
+} unz_file_pos;
+*/
+
+extern int ZEXPORT unzGetFilePos(file, file_pos)
+    unzFile file;
+    unz_file_pos* file_pos;
+{
+    unz_s* s;
+
+    if (file==NULL || file_pos==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;
+    file_pos->num_of_file           = s->num_file;
+
+    return UNZ_OK;
+}
+
+extern int ZEXPORT unzGoToFilePos(file, file_pos)
+    unzFile file;
+    unz_file_pos* file_pos;
+{
+    unz_s* s;
+    int err;
+
+    if (file==NULL || file_pos==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+
+    /* jump to the right spot */
+    s->pos_in_central_dir = file_pos->pos_in_zip_directory;
+    s->num_file           = file_pos->num_of_file;
+
+    /* set the current file */
+    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                               &s->cur_file_info_internal,
+                                               NULL,0,NULL,0,NULL,0);
+    /* return results */
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+/*
+// Unzip Helper Functions - should be here?
+///////////////////////////////////////////
+*/
+
+/*
+  Read the local header of the current zipfile
+  Check the coherency of the local header and info in the end of central
+        directory about this file
+  store in *piSizeVar the size of extra info in local header
+        (filename and size of extra field data)
+*/
+local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
+                                                    poffset_local_extrafield,
+                                                    psize_local_extrafield)
+    unz_s* s;
+    uInt* piSizeVar;
+    uLong *poffset_local_extrafield;
+    uInt  *psize_local_extrafield;
+{
+    uLong uMagic,uData,uFlags;
+    uLong size_filename;
+    uLong size_extra_field;
+    int err=UNZ_OK;
+
+    *piSizeVar = 0;
+    *poffset_local_extrafield = 0;
+    *psize_local_extrafield = 0;
+
+    if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
+                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+
+    if (err==UNZ_OK) {
+        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+            err=UNZ_ERRNO;
+        else if (uMagic!=0x04034b50)
+            err=UNZ_BADZIPFILE;
+    }
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+        err=UNZ_ERRNO;
+/*
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+        err=UNZ_BADZIPFILE;
+*/
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+        err=UNZ_BADZIPFILE;
+
+    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+                         (s->cur_file_info.compression_method!=Z_DEFLATED))
+        err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
+                              ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
+                              ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
+                              ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+        err=UNZ_BADZIPFILE;
+
+    *piSizeVar += (uInt)size_filename;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
+        err=UNZ_ERRNO;
+    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+                                    SIZEZIPLOCALHEADER + size_filename;
+    *psize_local_extrafield = (uInt)size_extra_field;
+
+    *piSizeVar += (uInt)size_extra_field;
+
+    return err;
+}
+
+/*
+  Open for reading data the current file in the zipfile.
+  If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)
+    unzFile file;
+    int* method;
+    int* level;
+    int raw;
+    const char* password;
+{
+    int err=UNZ_OK;
+    uInt iSizeVar;
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    uLong offset_local_extrafield;  /* offset of the local extra field */
+    uInt  size_local_extrafield;    /* size of the local extra field */
+#    ifndef NOUNCRYPT
+    char source[12];
+#    else
+    if (password != NULL)
+        return UNZ_PARAMERROR;
+#    endif
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_PARAMERROR;
+
+    if (s->pfile_in_zip_read != NULL)
+        unzCloseCurrentFile(file);
+
+    if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
+                &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+        return UNZ_BADZIPFILE;
+
+    pfile_in_zip_read_info = (file_in_zip_read_info_s*)
+                                        ALLOC(sizeof(file_in_zip_read_info_s));
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_INTERNALERROR;
+
+    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+    pfile_in_zip_read_info->pos_local_extrafield=0;
+    pfile_in_zip_read_info->raw=raw;
+
+    if (pfile_in_zip_read_info->read_buffer==NULL)
+    {
+        TRYFREE(pfile_in_zip_read_info);
+        return UNZ_INTERNALERROR;
+    }
+
+    pfile_in_zip_read_info->stream_initialised=0;
+
+    if (method!=NULL)
+        *method = (int)s->cur_file_info.compression_method;
+
+    if (level!=NULL)
+    {
+        *level = 6;
+        switch (s->cur_file_info.flag & 0x06)
+        {
+          case 6 : *level = 1; break;
+          case 4 : *level = 2; break;
+          case 2 : *level = 9; break;
+        }
+    }
+
+    if ((s->cur_file_info.compression_method!=0) &&
+        (s->cur_file_info.compression_method!=Z_DEFLATED))
+        err=UNZ_BADZIPFILE;
+
+    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+    pfile_in_zip_read_info->crc32=0;
+    pfile_in_zip_read_info->compression_method =
+            s->cur_file_info.compression_method;
+    pfile_in_zip_read_info->filestream=s->filestream;
+    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
+    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+    pfile_in_zip_read_info->stream.total_out = 0;
+
+    if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
+        (!raw))
+    {
+      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+      pfile_in_zip_read_info->stream.zfree = (free_func)0;
+      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+      pfile_in_zip_read_info->stream.next_in = (voidpf)0;
+      pfile_in_zip_read_info->stream.avail_in = 0;
+
+      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+      if (err == Z_OK)
+        pfile_in_zip_read_info->stream_initialised=1;
+      else
+      {
+        TRYFREE(pfile_in_zip_read_info);
+        return err;
+      }
+        /* windowBits is passed < 0 to tell that there is no zlib header.
+         * Note that in this case inflate *requires* an extra "dummy" byte
+         * after the compressed stream in order to complete decompression and
+         * return Z_STREAM_END.
+         * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+         * size of both compressed and uncompressed data
+         */
+    }
+    pfile_in_zip_read_info->rest_read_compressed =
+            s->cur_file_info.compressed_size ;
+    pfile_in_zip_read_info->rest_read_uncompressed =
+            s->cur_file_info.uncompressed_size ;
+
+
+    pfile_in_zip_read_info->pos_in_zipfile =
+            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+              iSizeVar;
+
+    pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+    s->pfile_in_zip_read = pfile_in_zip_read_info;
+
+#    ifndef NOUNCRYPT
+    if (password != NULL)
+    {
+        int i;
+        s->pcrc_32_tab = get_crc_table();
+        init_keys(password,s->keys,s->pcrc_32_tab);
+        if (ZSEEK(s->z_filefunc, s->filestream,
+                  s->pfile_in_zip_read->pos_in_zipfile +
+                     s->pfile_in_zip_read->byte_before_the_zipfile,
+                  SEEK_SET)!=0)
+            return UNZ_INTERNALERROR;
+        if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)
+            return UNZ_INTERNALERROR;
+
+        for (i = 0; i<12; i++)
+            zdecode(s->keys,s->pcrc_32_tab,source[i]);
+
+        s->pfile_in_zip_read->pos_in_zipfile+=12;
+        s->encrypted=1;
+    }
+#    endif
+
+
+    return UNZ_OK;
+}
+
+extern int ZEXPORT unzOpenCurrentFile (file)
+    unzFile file;
+{
+    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+extern int ZEXPORT unzOpenCurrentFilePassword (file, password)
+    unzFile file;
+    const char* password;
+{
+    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)
+    unzFile file;
+    int* method;
+    int* level;
+    int raw;
+{
+    return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+/*
+  Read bytes from the current file.
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern int ZEXPORT unzReadCurrentFile  (file, buf, len)
+    unzFile file;
+    voidp buf;
+    unsigned len;
+{
+    int err=UNZ_OK;
+    uInt iRead = 0;
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+
+    if ((pfile_in_zip_read_info->read_buffer == NULL))
+        return UNZ_END_OF_LIST_OF_FILE;
+    if (len==0)
+        return 0;
+
+    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+    pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+    if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
+        (!(pfile_in_zip_read_info->raw)))
+        pfile_in_zip_read_info->stream.avail_out =
+            (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+    if ((len>pfile_in_zip_read_info->rest_read_compressed+
+           pfile_in_zip_read_info->stream.avail_in) &&
+         (pfile_in_zip_read_info->raw))
+        pfile_in_zip_read_info->stream.avail_out =
+            (uInt)pfile_in_zip_read_info->rest_read_compressed+
+            pfile_in_zip_read_info->stream.avail_in;
+
+    while (pfile_in_zip_read_info->stream.avail_out>0)
+    {
+        if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+            (pfile_in_zip_read_info->rest_read_compressed>0))
+        {
+            uInt uReadThis = UNZ_BUFSIZE;
+            if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+            if (uReadThis == 0)
+                return UNZ_EOF;
+            if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+                      pfile_in_zip_read_info->filestream,
+                      pfile_in_zip_read_info->pos_in_zipfile +
+                         pfile_in_zip_read_info->byte_before_the_zipfile,
+                         ZLIB_FILEFUNC_SEEK_SET)!=0)
+                return UNZ_ERRNO;
+            if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+                      pfile_in_zip_read_info->filestream,
+                      pfile_in_zip_read_info->read_buffer,
+                      uReadThis)!=uReadThis)
+                return UNZ_ERRNO;
+
+
+#            ifndef NOUNCRYPT
+            if(s->encrypted)
+            {
+                uInt i;
+                for(i=0;i<uReadThis;i++)
+                  pfile_in_zip_read_info->read_buffer[i] =
+                      zdecode(s->keys,s->pcrc_32_tab,
+                              pfile_in_zip_read_info->read_buffer[i]);
+            }
+#            endif
+
+
+            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+            pfile_in_zip_read_info->stream.next_in =
+                (Bytef*)pfile_in_zip_read_info->read_buffer;
+            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+        }
+
+        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
+        {
+            uInt uDoCopy,i ;
+
+            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
+                (pfile_in_zip_read_info->rest_read_compressed == 0))
+                return (iRead==0) ? UNZ_EOF : iRead;
+
+            if (pfile_in_zip_read_info->stream.avail_out <
+                            pfile_in_zip_read_info->stream.avail_in)
+                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+            else
+                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+            for (i=0;i<uDoCopy;i++)
+                *(pfile_in_zip_read_info->stream.next_out+i) =
+                        *(pfile_in_zip_read_info->stream.next_in+i);
+
+            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+                                pfile_in_zip_read_info->stream.next_out,
+                                uDoCopy);
+            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+            pfile_in_zip_read_info->stream.next_out += uDoCopy;
+            pfile_in_zip_read_info->stream.next_in += uDoCopy;
+            pfile_in_zip_read_info->stream.total_out += uDoCopy;
+            iRead += uDoCopy;
+        }
+        else
+        {
+            uLong uTotalOutBefore,uTotalOutAfter;
+            const Bytef *bufBefore;
+            uLong uOutThis;
+            int flush=Z_SYNC_FLUSH;
+
+            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+            bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+            /*
+            if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+                     pfile_in_zip_read_info->stream.avail_out) &&
+                (pfile_in_zip_read_info->rest_read_compressed == 0))
+                flush = Z_FINISH;
+            */
+            err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+            if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
+              err = Z_DATA_ERROR;
+
+            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+            uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+            pfile_in_zip_read_info->crc32 =
+                crc32(pfile_in_zip_read_info->crc32,bufBefore,
+                        (uInt)(uOutThis));
+
+            pfile_in_zip_read_info->rest_read_uncompressed -=
+                uOutThis;
+
+            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+            if (err==Z_STREAM_END)
+                return (iRead==0) ? UNZ_EOF : iRead;
+            if (err!=Z_OK)
+                break;
+        }
+    }
+
+    if (err==Z_OK)
+        return iRead;
+    return err;
+}
+
+
+/*
+  Give the current position in uncompressed data
+*/
+extern z_off_t ZEXPORT unztell (file)
+    unzFile file;
+{
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+
+/*
+  return 1 if the end of file was reached, 0 elsewhere
+*/
+extern int ZEXPORT unzeof (file)
+    unzFile file;
+{
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+        return 1;
+    else
+        return 0;
+}
+
+
+
+/*
+  Read extra field from the current file (opened by unzOpenCurrentFile)
+  This is the local-header version of the extra field (sometimes, there is
+    more info in the local-header version than in the central-header)
+
+  if buf==NULL, it return the size of the local extra field that can be read
+
+  if buf!=NULL, len is the size of the buffer, the extra header is copied in
+    buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+    the error code
+*/
+extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
+    unzFile file;
+    voidp buf;
+    unsigned len;
+{
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    uInt read_now;
+    uLong size_to_read;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+                pfile_in_zip_read_info->pos_local_extrafield);
+
+    if (buf==NULL)
+        return (int)size_to_read;
+
+    if (len>size_to_read)
+        read_now = (uInt)size_to_read;
+    else
+        read_now = (uInt)len ;
+
+    if (read_now==0)
+        return 0;
+
+    if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+              pfile_in_zip_read_info->filestream,
+              pfile_in_zip_read_info->offset_local_extrafield +
+              pfile_in_zip_read_info->pos_local_extrafield,
+              ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+    if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+              pfile_in_zip_read_info->filestream,
+              buf,read_now)!=read_now)
+        return UNZ_ERRNO;
+
+    return (int)read_now;
+}
+
+/*
+  Close the file in zip opened with unzipOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern int ZEXPORT unzCloseCurrentFile (file)
+    unzFile file;
+{
+    int err=UNZ_OK;
+
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+
+    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
+        (!pfile_in_zip_read_info->raw))
+    {
+        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+            err=UNZ_CRCERROR;
+    }
+
+
+    TRYFREE(pfile_in_zip_read_info->read_buffer);
+    pfile_in_zip_read_info->read_buffer = NULL;
+    if (pfile_in_zip_read_info->stream_initialised)
+        inflateEnd(&pfile_in_zip_read_info->stream);
+
+    pfile_in_zip_read_info->stream_initialised = 0;
+    TRYFREE(pfile_in_zip_read_info);
+
+    s->pfile_in_zip_read=NULL;
+
+    return err;
+}
+
+
+/*
+  Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0
+*/
+extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
+    unzFile file;
+    char *szComment;
+    uLong uSizeBuf;
+{
+    unz_s* s;
+    uLong uReadThis ;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+
+    uReadThis = uSizeBuf;
+    if (uReadThis>s->gi.size_comment)
+        uReadThis = s->gi.size_comment;
+
+    if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+    if (uReadThis>0)
+    {
+      *szComment='\0';
+      if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
+        return UNZ_ERRNO;
+    }
+
+    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+        *(szComment+s->gi.size_comment)='\0';
+    return (int)uReadThis;
+}
+
+/* Additions by RX '2004 */
+extern uLong ZEXPORT unzGetOffset (file)
+    unzFile file;
+{
+    unz_s* s;
+
+    if (file==NULL)
+          return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+      return 0;
+    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
+      if (s->num_file==s->gi.number_entry)
+         return 0;
+    return s->pos_in_central_dir;
+}
+
+extern int ZEXPORT unzSetOffset (file, pos)
+        unzFile file;
+        uLong pos;
+{
+    unz_s* s;
+    int err;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+
+    s->pos_in_central_dir = pos;
+    s->num_file = s->gi.number_entry;      /* hack */
+    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                              &s->cur_file_info_internal,
+                                              NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/unzip.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,356 @@
+/* unzip.h -- IO for uncompress .zip files using zlib
+   Version 1.01e, February 12th, 2005
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
+     WinZip, InfoZip tools and compatible.
+
+   Multi volume ZipFile (span) are not supported.
+   Encryption compatible with pkzip 2.04g only supported
+   Old compressions used by old PKZip 1.x are not supported
+
+
+   I WAIT FEEDBACK at mail info@winimage.com
+   Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
+
+   Condition of use and distribution are the same than zlib :
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+   Modified by Sergey A. Tachenov to integrate with Qt.
+
+
+*/
+
+/* for more info about .ZIP format, see
+      http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+      http://www.info-zip.org/pub/infozip/doc/
+   PkWare has also a specification at :
+      ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _unz_H
+#define _unz_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+    from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK                          (0)
+#define UNZ_END_OF_LIST_OF_FILE         (-100)
+#define UNZ_ERRNO                       (Z_ERRNO)
+#define UNZ_EOF                         (0)
+#define UNZ_PARAMERROR                  (-102)
+#define UNZ_BADZIPFILE                  (-103)
+#define UNZ_INTERNALERROR               (-104)
+#define UNZ_CRCERROR                    (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+    uInt tm_sec;            /* seconds after the minute - [0,59] */
+    uInt tm_min;            /* minutes after the hour - [0,59] */
+    uInt tm_hour;           /* hours since midnight - [0,23] */
+    uInt tm_mday;           /* day of the month - [1,31] */
+    uInt tm_mon;            /* months since January - [0,11] */
+    uInt tm_year;           /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+   These data comes from the end of central dir */
+typedef struct unz_global_info_s
+{
+    uLong number_entry;         /* total number of entries in
+                       the central dir on this disk */
+    uLong size_comment;         /* size of the global comment of the zipfile */
+} unz_global_info;
+
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info_s
+{
+    uLong version;              /* version made by                 2 bytes */
+    uLong version_needed;       /* version needed to extract       2 bytes */
+    uLong flag;                 /* general purpose bit flag        2 bytes */
+    uLong compression_method;   /* compression method              2 bytes */
+    uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */
+    uLong crc;                  /* crc-32                          4 bytes */
+    uLong compressed_size;      /* compressed size                 4 bytes */
+    uLong uncompressed_size;    /* uncompressed size               4 bytes */
+    uLong size_filename;        /* filename length                 2 bytes */
+    uLong size_file_extra;      /* extra field length              2 bytes */
+    uLong size_file_comment;    /* file comment length             2 bytes */
+
+    uLong disk_num_start;       /* disk number start               2 bytes */
+    uLong internal_fa;          /* internal file attributes        2 bytes */
+    uLong external_fa;          /* external file attributes        4 bytes */
+
+    tm_unz tmu_date;
+} unz_file_info;
+
+extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
+                                                 const char* fileName2,
+                                                 int iCaseSensitivity));
+/*
+   Compare two filename (fileName1,fileName2).
+   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+                                or strcasecmp)
+   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+    (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern unzFile ZEXPORT unzOpen OF((voidpf file));
+/*
+  Open a Zip file. path contain whatever zopen_file from the IO API
+  accepts. For Qt implementation it is a pointer to QIODevice, for
+  fopen() implementation it's a file name.
+     If the zipfile cannot be opened (file don't exist or in not valid), the
+       return value is NULL.
+     Else, the return value is a unzFile Handle, usable with other function
+       of this unzip package.
+*/
+
+extern unzFile ZEXPORT unzOpen2 OF((voidpf file,
+                                    zlib_filefunc_def* pzlib_filefunc_def));
+/*
+   Open a Zip file, like unzOpen, but provide a set of file low level API
+      for read/write the zip file (see ioapi.h)
+*/
+
+extern int ZEXPORT unzClose OF((unzFile file));
+/*
+  Close a ZipFile opened with unzipOpen.
+  If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+  return UNZ_OK if there is no problem. */
+
+extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
+                                        unz_global_info *pglobal_info));
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. */
+
+
+extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
+                                           char *szComment,
+                                           uLong uSizeBuf));
+/*
+  Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
+/*
+  Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem
+*/
+
+extern int ZEXPORT unzGoToNextFile OF((unzFile file));
+/*
+  Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern int ZEXPORT unzLocateFile OF((unzFile file,
+                     const char *szFileName,
+                     int iCaseSensitivity));
+/*
+  Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+/* ****************************************** */
+/* Ryan supplied functions */
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_pos_s
+{
+    uLong pos_in_zip_directory;   /* offset in zip file directory */
+    uLong num_of_file;            /* # of file */
+} unz_file_pos;
+
+extern int ZEXPORT unzGetFilePos(
+    unzFile file,
+    unz_file_pos* file_pos);
+
+extern int ZEXPORT unzGoToFilePos(
+    unzFile file,
+    unz_file_pos* file_pos);
+
+/* ****************************************** */
+
+extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
+                         unz_file_info *pfile_info,
+                         char *szFileName,
+                         uLong fileNameBufferSize,
+                         void *extraField,
+                         uLong extraFieldBufferSize,
+                         char *szComment,
+                         uLong commentBufferSize));
+/*
+  Get Info about the current file
+  if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+        the current file
+  if szFileName!=NULL, the filemane string will be copied in szFileName
+            (fileNameBufferSize is the size of the buffer)
+  if extraField!=NULL, the extra field information will be copied in extraField
+            (extraFieldBufferSize is the size of the buffer).
+            This is the Central-header version of the extra field
+  if szComment!=NULL, the comment string of the file will be copied in szComment
+            (commentBufferSize is the size of the buffer)
+*/
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+   from it, and close it (you can close it before reading all the file)
+   */
+
+extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
+/*
+  Open for reading data the current file in the zipfile.
+  If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
+                                                  const char* password));
+/*
+  Open for reading data the current file in the zipfile.
+  password is a crypting password
+  If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
+                                           int* method,
+                                           int* level,
+                                           int raw));
+/*
+  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+    if raw==1
+  *method will receive method of compression, *level will receive level of
+     compression
+  note : you can set level parameter as NULL (if you did not want known level,
+         but you CANNOT set method parameter as NULL
+*/
+
+extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
+                                           int* method,
+                                           int* level,
+                                           int raw,
+                                           const char* password));
+/*
+  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+    if raw==1
+  *method will receive method of compression, *level will receive level of
+     compression
+  note : you can set level parameter as NULL (if you did not want known level,
+         but you CANNOT set method parameter as NULL
+*/
+
+
+extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
+/*
+  Close the file in zip opened with unzOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
+                      voidp buf,
+                      unsigned len));
+/*
+  Read bytes from the current file (opened by unzOpenCurrentFile)
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t ZEXPORT unztell OF((unzFile file));
+/*
+  Give the current position in uncompressed data
+*/
+
+extern int ZEXPORT unzeof OF((unzFile file));
+/*
+  return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
+                                             voidp buf,
+                                             unsigned len));
+/*
+  Read extra field from the current file (opened by unzOpenCurrentFile)
+  This is the local-header version of the extra field (sometimes, there is
+    more info in the local-header version than in the central-header)
+
+  if buf==NULL, it return the size of the local extra field
+
+  if buf!=NULL, len is the size of the buffer, the extra header is copied in
+    buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+    the error code
+*/
+
+/***************************************************************************/
+
+/* Get the current file offset */
+extern uLong ZEXPORT unzGetOffset (unzFile file);
+
+/* Set the current file offset */
+extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zconf.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,332 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+#  define deflateInit_          z_deflateInit_
+#  define deflate               z_deflate
+#  define deflateEnd            z_deflateEnd
+#  define inflateInit_          z_inflateInit_
+#  define inflate               z_inflate
+#  define inflateEnd            z_inflateEnd
+#  define deflateInit2_         z_deflateInit2_
+#  define deflateSetDictionary  z_deflateSetDictionary
+#  define deflateCopy           z_deflateCopy
+#  define deflateReset          z_deflateReset
+#  define deflateParams         z_deflateParams
+#  define deflateBound          z_deflateBound
+#  define deflatePrime          z_deflatePrime
+#  define inflateInit2_         z_inflateInit2_
+#  define inflateSetDictionary  z_inflateSetDictionary
+#  define inflateSync           z_inflateSync
+#  define inflateSyncPoint      z_inflateSyncPoint
+#  define inflateCopy           z_inflateCopy
+#  define inflateReset          z_inflateReset
+#  define inflateBack           z_inflateBack
+#  define inflateBackEnd        z_inflateBackEnd
+#  define compress              z_compress
+#  define compress2             z_compress2
+#  define compressBound         z_compressBound
+#  define uncompress            z_uncompress
+#  define adler32               z_adler32
+#  define crc32                 z_crc32
+#  define get_crc_table         z_get_crc_table
+#  define zError                z_zError
+
+#  define alloc_func            z_alloc_func
+#  define free_func             z_free_func
+#  define in_func               z_in_func
+#  define out_func              z_out_func
+#  define Byte                  z_Byte
+#  define uInt                  z_uInt
+#  define uLong                 z_uLong
+#  define Bytef                 z_Bytef
+#  define charf                 z_charf
+#  define intf                  z_intf
+#  define uIntf                 z_uIntf
+#  define uLongf                z_uLongf
+#  define voidpf                z_voidpf
+#  define voidp                 z_voidp
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+#  define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+#  define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+#  define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+#  ifndef WIN32
+#    define WIN32
+#  endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+#    ifndef SYS16BIT
+#      define SYS16BIT
+#    endif
+#  endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+#  define MAXSEG_64K
+#endif
+#ifdef MSDOS
+#  define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+#  ifndef STDC
+#    define STDC
+#  endif
+#  if __STDC_VERSION__ >= 199901L
+#    ifndef STDC99
+#      define STDC99
+#    endif
+#  endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+#  define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC)    /* iSeries (formerly AS/400). */
+#  define STDC
+#endif
+
+#ifndef STDC
+#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+#    define const       /* note: need a more gentle solution here */
+#  endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
+#  define NO_DUMMY_DECL
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+#  ifdef MAXSEG_64K
+#    define MAX_MEM_LEVEL 8
+#  else
+#    define MAX_MEM_LEVEL 9
+#  endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+#  define MAX_WBITS   15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+            (1 << (windowBits+2)) +  (1 << (memLevel+9))
+ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+   The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+                        /* Type declarations */
+
+#ifndef OF /* function prototypes */
+#  ifdef STDC
+#    define OF(args)  args
+#  else
+#    define OF(args)  ()
+#  endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+#  if defined(M_I86SM) || defined(M_I86MM)
+     /* MSC small or medium model */
+#    define SMALL_MEDIUM
+#    ifdef _MSC_VER
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
+#  endif
+#  if (defined(__SMALL__) || defined(__MEDIUM__))
+     /* Turbo C small or medium model */
+#    define SMALL_MEDIUM
+#    ifdef __BORLANDC__
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
+#  endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+   /* If building or using zlib as a DLL, define ZLIB_DLL.
+    * This is not mandatory, but it offers a little performance increase.
+    */
+#  ifdef ZLIB_DLL
+#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+#      ifdef ZLIB_INTERNAL
+#        define ZEXTERN extern __declspec(dllexport)
+#      else
+#        define ZEXTERN extern __declspec(dllimport)
+#      endif
+#    endif
+#  endif  /* ZLIB_DLL */
+   /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+    * define ZLIB_WINAPI.
+    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+    */
+#  ifdef ZLIB_WINAPI
+#    ifdef FAR
+#      undef FAR
+#    endif
+#    include <windows.h>
+     /* No need for _export, use ZLIB.DEF instead. */
+     /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+#    define ZEXPORT WINAPI
+#    ifdef WIN32
+#      define ZEXPORTVA WINAPIV
+#    else
+#      define ZEXPORTVA FAR CDECL
+#    endif
+#  endif
+#endif
+
+#if defined (__BEOS__)
+#  ifdef ZLIB_DLL
+#    ifdef ZLIB_INTERNAL
+#      define ZEXPORT   __declspec(dllexport)
+#      define ZEXPORTVA __declspec(dllexport)
+#    else
+#      define ZEXPORT   __declspec(dllimport)
+#      define ZEXPORTVA __declspec(dllimport)
+#    endif
+#  endif
+#endif
+
+#ifndef ZEXTERN
+#  define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+#  define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+#  define ZEXPORTVA
+#endif
+
+#ifndef FAR
+#  define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char  Byte;  /* 8 bits */
+#endif
+typedef unsigned int   uInt;  /* 16 bits or more */
+typedef unsigned long  uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+#  define Bytef Byte FAR
+#else
+   typedef Byte  FAR Bytef;
+#endif
+typedef char  FAR charf;
+typedef int   FAR intf;
+typedef uInt  FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+   typedef void const *voidpc;
+   typedef void FAR   *voidpf;
+   typedef void       *voidp;
+#else
+   typedef Byte const *voidpc;
+   typedef Byte FAR   *voidpf;
+   typedef Byte       *voidp;
+#endif
+
+#if 0           /* HAVE_UNISTD_H -- this line is updated by ./configure */
+#  include <sys/types.h> /* for off_t */
+#  include <unistd.h>    /* for SEEK_* and off_t */
+#  ifdef VMS
+#    include <unixio.h>   /* for off_t */
+#  endif
+#  define z_off_t off_t
+#endif
+#ifndef SEEK_SET
+#  define SEEK_SET        0       /* Seek from beginning of file.  */
+#  define SEEK_CUR        1       /* Seek from current position.  */
+#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+#  define z_off_t long
+#endif
+
+#if defined(__OS400__)
+#  define NO_vsnprintf
+#endif
+
+#if defined(__MVS__)
+#  define NO_vsnprintf
+#  ifdef FAR
+#    undef FAR
+#  endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+#   pragma map(deflateInit_,"DEIN")
+#   pragma map(deflateInit2_,"DEIN2")
+#   pragma map(deflateEnd,"DEEND")
+#   pragma map(deflateBound,"DEBND")
+#   pragma map(inflateInit_,"ININ")
+#   pragma map(inflateInit2_,"ININ2")
+#   pragma map(inflateEnd,"INEND")
+#   pragma map(inflateSync,"INSY")
+#   pragma map(inflateSetDictionary,"INSEDI")
+#   pragma map(compressBound,"CMBND")
+#   pragma map(inflate_table,"INTABL")
+#   pragma map(inflate_fast,"INFA")
+#   pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zip.c	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,1243 @@
+/* zip.c -- IO on .zip files using zlib
+   Version 1.01e, February 12th, 2005
+
+   27 Dec 2004 Rolf Kalbermatter
+   Modification to zipOpen2 to support globalComment retrieval.
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   Read zip.h for more info
+
+   Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "zlib.h"
+#include "zip.h"
+#include "quazip_global.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+#ifndef VERSIONMADEBY
+# define VERSIONMADEBY   (0x031e) /* best for standard pkware crypt */
+#endif
+
+#ifndef Z_BUFSIZE
+#define Z_BUFSIZE (16384)
+#endif
+
+#ifndef Z_MAXFILENAMEINZIP
+#define Z_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+/*
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+*/
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR    1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END    2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET    0
+#endif
+
+#ifndef DEF_MEM_LEVEL
+#if MAX_MEM_LEVEL >= 8
+#  define DEF_MEM_LEVEL 8
+#else
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#endif
+#endif
+const char zip_copyright[] =
+   " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+
+#define SIZEDATA_INDATABLOCK (4096-(4*4))
+
+#define LOCALHEADERMAGIC    (0x04034b50)
+#define DESCRIPTORHEADERMAGIC    (0x08074b50)
+#define CENTRALHEADERMAGIC  (0x02014b50)
+#define ENDHEADERMAGIC      (0x06054b50)
+
+#define FLAG_LOCALHEADER_OFFSET (0x06)
+#define CRC_LOCALHEADER_OFFSET  (0x0e)
+
+#define SIZECENTRALHEADER (0x2e) /* 46 */
+
+typedef struct linkedlist_datablock_internal_s
+{
+  struct linkedlist_datablock_internal_s* next_datablock;
+  uLong  avail_in_this_block;
+  uLong  filled_in_this_block;
+  uLong  unused; /* for future use and alignement */
+  unsigned char data[SIZEDATA_INDATABLOCK];
+} linkedlist_datablock_internal;
+
+typedef struct linkedlist_data_s
+{
+    linkedlist_datablock_internal* first_block;
+    linkedlist_datablock_internal* last_block;
+} linkedlist_data;
+
+
+typedef struct
+{
+    z_stream stream;            /* zLib stream structure for inflate */
+    int  stream_initialised;    /* 1 is stream is initialised */
+    uInt pos_in_buffered_data;  /* last written byte in buffered_data */
+
+    uLong pos_local_header;     /* offset of the local header of the file
+                                     currenty writing */
+    char* central_header;       /* central header data for the current file */
+    uLong size_centralheader;   /* size of the central header for cur file */
+    uLong flag;                 /* flag of the file currently writing */
+
+    int  method;                /* compression method of file currenty wr.*/
+    int  raw;                   /* 1 for directly writing raw data */
+    Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
+    uLong dosDate;
+    uLong crc32;
+    int  encrypt;
+#ifndef NOCRYPT
+    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
+    const unsigned long* pcrc_32_tab;
+    int crypt_header_size;
+#endif
+} curfile_info;
+
+typedef struct
+{
+    zlib_filefunc_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    linkedlist_data central_dir;/* datablock with central dir in construction*/
+    int  in_opened_file_inzip;  /* 1 if a file in the zip is currently writ.*/
+    curfile_info ci;            /* info on the file curretly writing */
+
+    uLong begin_pos;            /* position of the beginning of the zipfile */
+    uLong add_position_when_writting_offset;
+    uLong number_entry;
+#ifndef NO_ADDFILEINEXISTINGZIP
+    char *globalcomment;
+#endif
+} zip_internal;
+
+
+
+#ifndef NOCRYPT
+#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+#include "crypt.h"
+#endif
+
+local linkedlist_datablock_internal* allocate_new_datablock()
+{
+    linkedlist_datablock_internal* ldi;
+    ldi = (linkedlist_datablock_internal*)
+                 ALLOC(sizeof(linkedlist_datablock_internal));
+    if (ldi!=NULL)
+    {
+        ldi->next_datablock = NULL ;
+        ldi->filled_in_this_block = 0 ;
+        ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
+    }
+    return ldi;
+}
+
+local void free_datablock(ldi)
+    linkedlist_datablock_internal* ldi;
+{
+    while (ldi!=NULL)
+    {
+        linkedlist_datablock_internal* ldinext = ldi->next_datablock;
+        TRYFREE(ldi);
+        ldi = ldinext;
+    }
+}
+
+local void init_linkedlist(ll)
+    linkedlist_data* ll;
+{
+    ll->first_block = ll->last_block = NULL;
+}
+
+#if 0 // unused
+local void free_linkedlist(ll)
+    linkedlist_data* ll;
+{
+    free_datablock(ll->first_block);
+    ll->first_block = ll->last_block = NULL;
+}
+#endif
+
+local int add_data_in_datablock(ll,buf,len)
+    linkedlist_data* ll;
+    const void* buf;
+    uLong len;
+{
+    linkedlist_datablock_internal* ldi;
+    const unsigned char* from_copy;
+
+    if (ll==NULL)
+        return ZIP_INTERNALERROR;
+
+    if (ll->last_block == NULL)
+    {
+        ll->first_block = ll->last_block = allocate_new_datablock();
+        if (ll->first_block == NULL)
+            return ZIP_INTERNALERROR;
+    }
+
+    ldi = ll->last_block;
+    from_copy = (unsigned char*)buf;
+
+    while (len>0)
+    {
+        uInt copy_this;
+        uInt i;
+        unsigned char* to_copy;
+
+        if (ldi->avail_in_this_block==0)
+        {
+            ldi->next_datablock = allocate_new_datablock();
+            if (ldi->next_datablock == NULL)
+                return ZIP_INTERNALERROR;
+            ldi = ldi->next_datablock ;
+            ll->last_block = ldi;
+        }
+
+        if (ldi->avail_in_this_block < len)
+            copy_this = (uInt)ldi->avail_in_this_block;
+        else
+            copy_this = (uInt)len;
+
+        to_copy = &(ldi->data[ldi->filled_in_this_block]);
+
+        for (i=0;i<copy_this;i++)
+            *(to_copy+i)=*(from_copy+i);
+
+        ldi->filled_in_this_block += copy_this;
+        ldi->avail_in_this_block -= copy_this;
+        from_copy += copy_this ;
+        len -= copy_this;
+    }
+    return ZIP_OK;
+}
+
+
+
+/****************************************************************************/
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+/* ===========================================================================
+   Inputs a long in LSB order to the given file
+   nbByte == 1, 2 or 4 (byte, short or long)
+*/
+
+local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def,
+                                voidpf filestream, uLong x, int nbByte));
+local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong x;
+    int nbByte;
+{
+    unsigned char buf[4];
+    int n;
+    for (n = 0; n < nbByte; n++)
+    {
+        buf[n] = (unsigned char)(x & 0xff);
+        x >>= 8;
+    }
+    if (x != 0)
+      {     /* data overflow - hack for ZIP64 (X Roche) */
+      for (n = 0; n < nbByte; n++)
+        {
+          buf[n] = 0xff;
+        }
+      }
+
+    if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
+        return ZIP_ERRNO;
+    else
+        return ZIP_OK;
+}
+
+local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));
+local void ziplocal_putValue_inmemory (dest, x, nbByte)
+    void* dest;
+    uLong x;
+    int nbByte;
+{
+    unsigned char* buf=(unsigned char*)dest;
+    int n;
+    for (n = 0; n < nbByte; n++) {
+        buf[n] = (unsigned char)(x & 0xff);
+        x >>= 8;
+    }
+
+    if (x != 0)
+    {     /* data overflow - hack for ZIP64 */
+       for (n = 0; n < nbByte; n++)
+       {
+          buf[n] = 0xff;
+       }
+    }
+}
+
+/****************************************************************************/
+
+
+local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)
+    const tm_zip* ptm;
+    uLong dosDate UNUSED;
+{
+    uLong year = (uLong)ptm->tm_year;
+    if (year>1980)
+        year-=1980;
+    else if (year>80)
+        year-=80;
+    return
+      (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
+        ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
+}
+
+
+/****************************************************************************/
+
+local int ziplocal_getByte OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    int *pi));
+
+local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    int *pi;
+{
+    unsigned char c;
+    int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+    if (err==1)
+    {
+        *pi = (int)c;
+        return ZIP_OK;
+    }
+    else
+    {
+        if (ZERROR(*pzlib_filefunc_def,filestream))
+            return ZIP_ERRNO;
+        else
+            return ZIP_EOF;
+    }
+}
+
+
+/* ===========================================================================
+   Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int ziplocal_getShort OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==ZIP_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int ziplocal_getLong OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<16;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<24;
+
+    if (err==ZIP_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+/*
+  Locate the Central directory of a zipfile (at the end, just before
+    the global comment)
+*/
+local uLong ziplocal_SearchCentralDir OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream));
+
+local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+{
+    unsigned char* buf;
+    uLong uSizeFile;
+    uLong uBackRead;
+    uLong uMaxBack=0xffff; /* maximum size of global comment */
+    uLong uPosFound=0;
+
+    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+        return 0;
+
+
+    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+    if (uMaxBack>uSizeFile)
+        uMaxBack = uSizeFile;
+
+    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+    if (buf==NULL)
+        return 0;
+
+    uBackRead = 4;
+    while (uBackRead<uMaxBack)
+    {
+        uLong uReadSize,uReadPos ;
+        int i;
+        if (uBackRead+BUFREADCOMMENT>uMaxBack)
+            uBackRead = uMaxBack;
+        else
+            uBackRead+=BUFREADCOMMENT;
+        uReadPos = uSizeFile-uBackRead ;
+
+        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            break;
+
+        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+            break;
+
+        for (i=(int)uReadSize-3; (i--)>0;)
+            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+            {
+                uPosFound = uReadPos+i;
+                break;
+            }
+
+        if (uPosFound!=0)
+            break;
+    }
+    TRYFREE(buf);
+    return uPosFound;
+}
+#endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+/************************************************************/
+extern zipFile ZEXPORT zipOpen2 (file, append, globalcomment, pzlib_filefunc_def)
+    voidpf file;
+    int append;
+    zipcharpc* globalcomment;
+    zlib_filefunc_def* pzlib_filefunc_def;
+{
+    zip_internal ziinit;
+    zip_internal* zi;
+    int err=ZIP_OK;
+
+
+    if (pzlib_filefunc_def==NULL)
+        fill_qiodevice_filefunc(&ziinit.z_filefunc);
+    else
+        ziinit.z_filefunc = *pzlib_filefunc_def;
+
+    ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))
+                 (ziinit.z_filefunc.opaque,
+                  file,
+                  (append == APPEND_STATUS_CREATE) ?
+                  (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
+                    (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
+
+    if (ziinit.filestream == NULL)
+        return NULL;
+    ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);
+    ziinit.in_opened_file_inzip = 0;
+    ziinit.ci.stream_initialised = 0;
+    ziinit.number_entry = 0;
+    ziinit.add_position_when_writting_offset = 0;
+    init_linkedlist(&(ziinit.central_dir));
+
+
+    zi = (zip_internal*)ALLOC(sizeof(zip_internal));
+    if (zi==NULL)
+    {
+        ZCLOSE(ziinit.z_filefunc,ziinit.filestream);
+        return NULL;
+    }
+
+    /* now we add file in a zipfile */
+#    ifndef NO_ADDFILEINEXISTINGZIP
+    ziinit.globalcomment = NULL;
+    if (append == APPEND_STATUS_ADDINZIP)
+    {
+        uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+
+        uLong size_central_dir;     /* size of the central directory  */
+        uLong offset_central_dir;   /* offset of start of central directory */
+        uLong central_pos,uL;
+
+        uLong number_disk;          /* number of the current dist, used for
+                                    spaning ZIP, unsupported, always 0*/
+        uLong number_disk_with_CD;  /* number the the disk with central dir, used
+                                    for spaning ZIP, unsupported, always 0*/
+        uLong number_entry;
+        uLong number_entry_CD;      /* total number of entries in
+                                    the central dir
+                                    (same than number_entry on nospan) */
+        uLong size_comment;
+
+        central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);
+        if (central_pos==0)
+            err=ZIP_ERRNO;
+
+        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err=ZIP_ERRNO;
+
+        /* the signature, already checked */
+        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* number of this disk */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* number of the disk with the start of the central directory */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* total number of entries in the central dir on this disk */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* total number of entries in the central dir */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        if ((number_entry_CD!=number_entry) ||
+            (number_disk_with_CD!=0) ||
+            (number_disk!=0))
+            err=ZIP_BADZIPFILE;
+
+        /* size of the central directory */
+        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* offset of start of central directory with respect to the
+            starting disk number */
+        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* zipfile global comment length */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        if ((central_pos<offset_central_dir+size_central_dir) &&
+            (err==ZIP_OK))
+            err=ZIP_BADZIPFILE;
+
+        if (err!=ZIP_OK)
+        {
+            ZCLOSE(ziinit.z_filefunc, ziinit.filestream);
+            return NULL;
+        }
+
+        if (size_comment>0)
+        {
+            ziinit.globalcomment = ALLOC(size_comment+1);
+            if (ziinit.globalcomment)
+            {
+               size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment);
+               ziinit.globalcomment[size_comment]=0;
+            }
+        }
+
+        byte_before_the_zipfile = central_pos -
+                                (offset_central_dir+size_central_dir);
+        ziinit.add_position_when_writting_offset = byte_before_the_zipfile;
+
+        {
+            uLong size_central_dir_to_read = size_central_dir;
+            size_t buf_size = SIZEDATA_INDATABLOCK;
+            void* buf_read = (void*)ALLOC(buf_size);
+            if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+                  offset_central_dir + byte_before_the_zipfile,
+                  ZLIB_FILEFUNC_SEEK_SET) != 0)
+                  err=ZIP_ERRNO;
+
+            while ((size_central_dir_to_read>0) && (err==ZIP_OK))
+            {
+                uLong read_this = SIZEDATA_INDATABLOCK;
+                if (read_this > size_central_dir_to_read)
+                    read_this = size_central_dir_to_read;
+                if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)
+                    err=ZIP_ERRNO;
+
+                if (err==ZIP_OK)
+                    err = add_data_in_datablock(&ziinit.central_dir,buf_read,
+                                                (uLong)read_this);
+                size_central_dir_to_read-=read_this;
+            }
+            TRYFREE(buf_read);
+        }
+        ziinit.begin_pos = byte_before_the_zipfile;
+        ziinit.number_entry = number_entry_CD;
+
+        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+                  offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err=ZIP_ERRNO;
+    }
+
+    if (globalcomment)
+    {
+      *globalcomment = ziinit.globalcomment;
+    }
+#    endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+    if (err != ZIP_OK)
+    {
+#    ifndef NO_ADDFILEINEXISTINGZIP
+        TRYFREE(ziinit.globalcomment);
+#    endif /* !NO_ADDFILEINEXISTINGZIP*/
+        TRYFREE(zi);
+        return NULL;
+    }
+    else
+    {
+        *zi = ziinit;
+        return (zipFile)zi;
+    }
+}
+
+extern zipFile ZEXPORT zipOpen (file, append)
+    voidpf file;
+    int append;
+{
+    return zipOpen2(file,append,NULL,NULL);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,
+                                         extrafield_local, size_extrafield_local,
+                                         extrafield_global, size_extrafield_global,
+                                         comment, method, level, raw,
+                                         windowBits, memLevel, strategy,
+                                         password, crcForCrypting)
+    zipFile file;
+    const char* filename;
+    const zip_fileinfo* zipfi;
+    const void* extrafield_local;
+    uInt size_extrafield_local;
+    const void* extrafield_global;
+    uInt size_extrafield_global;
+    const char* comment;
+    int method;
+    int level;
+    int raw;
+    int windowBits;
+    int memLevel;
+    int strategy;
+    const char* password;
+    uLong crcForCrypting;
+{
+    zip_internal* zi;
+    uInt size_filename;
+    uInt size_comment;
+    uInt i;
+    int err = ZIP_OK;
+
+#    ifdef NOCRYPT
+    if (password != NULL)
+        return ZIP_PARAMERROR;
+#    endif
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    if ((method!=0) && (method!=Z_DEFLATED))
+        return ZIP_PARAMERROR;
+
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 1)
+    {
+        err = zipCloseFileInZip (file);
+        if (err != ZIP_OK)
+            return err;
+    }
+
+
+    if (filename==NULL)
+        filename="-";
+
+    if (comment==NULL)
+        size_comment = 0;
+    else
+        size_comment = (uInt)strlen(comment);
+
+    size_filename = (uInt)strlen(filename);
+
+    if (zipfi == NULL)
+        zi->ci.dosDate = 0;
+    else
+    {
+        if (zipfi->dosDate != 0)
+            zi->ci.dosDate = zipfi->dosDate;
+        else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
+    }
+
+    zi->ci.flag = 0;
+    if ((level==8) || (level==9))
+      zi->ci.flag |= 2;
+    if ((level==2))
+      zi->ci.flag |= 4;
+    if ((level==1))
+      zi->ci.flag |= 6;
+    if (password != NULL)
+    {
+      zi->ci.flag |= 1;
+    }
+    zi->ci.flag |= 8;
+    zi->ci.crc32 = 0;
+    zi->ci.method = method;
+    zi->ci.encrypt = 0;
+    zi->ci.stream_initialised = 0;
+    zi->ci.pos_in_buffered_data = 0;
+    zi->ci.raw = raw;
+    zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;
+    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
+                                      size_extrafield_global + size_comment;
+    zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
+
+    ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
+    /* version info */
+    ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
+    ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
+
+    if (zipfi==NULL)
+        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
+    else
+        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
+
+    if (zipfi==NULL)
+        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
+    else
+        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
+
+    ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);
+
+    for (i=0;i<size_filename;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
+
+    for (i=0;i<size_extrafield_global;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
+              *(((const char*)extrafield_global)+i);
+
+    for (i=0;i<size_comment;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
+              size_extrafield_global+i) = *(comment+i);
+    if (zi->ci.central_header == NULL)
+        return ZIP_INTERNALERROR;
+
+    /* write the local header */
+    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);
+
+    if ((err==ZIP_OK) && (size_filename>0))
+        if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
+                err = ZIP_ERRNO;
+
+    if ((err==ZIP_OK) && (size_extrafield_local>0))
+        if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)
+                                                                           !=size_extrafield_local)
+                err = ZIP_ERRNO;
+
+    zi->ci.stream.avail_in = (uInt)0;
+    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+    zi->ci.stream.next_out = zi->ci.buffered_data;
+    zi->ci.stream.total_in = 0;
+    zi->ci.stream.total_out = 0;
+
+    if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+    {
+        zi->ci.stream.zalloc = (alloc_func)0;
+        zi->ci.stream.zfree = (free_func)0;
+        zi->ci.stream.opaque = (voidpf)0;
+
+        if (windowBits>0)
+            windowBits = -windowBits;
+
+        err = deflateInit2(&zi->ci.stream, level,
+               Z_DEFLATED, windowBits, memLevel, strategy);
+
+        if (err==Z_OK)
+            zi->ci.stream_initialised = 1;
+    }
+#    ifndef NOCRYPT
+    zi->ci.crypt_header_size = 0;
+    if ((err==Z_OK) && (password != NULL))
+    {
+        unsigned char bufHead[RAND_HEAD_LEN];
+        unsigned int sizeHead;
+        zi->ci.encrypt = 1;
+        zi->ci.pcrc_32_tab = get_crc_table();
+        /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
+
+        crcForCrypting = (uLong)zi->ci.dosDate << 16; // ATTANTION! Without this row, you don't unpack your password protected archive in other app.
+
+        sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
+        zi->ci.crypt_header_size = sizeHead;
+
+        if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
+                err = ZIP_ERRNO;
+    }
+#    endif
+
+    if (err==Z_OK)
+        zi->in_opened_file_inzip = 1;
+    return err;
+}
+
+extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi,
+                                        extrafield_local, size_extrafield_local,
+                                        extrafield_global, size_extrafield_global,
+                                        comment, method, level, raw)
+    zipFile file;
+    const char* filename;
+    const zip_fileinfo* zipfi;
+    const void* extrafield_local;
+    uInt size_extrafield_local;
+    const void* extrafield_global;
+    uInt size_extrafield_global;
+    const char* comment;
+    int method;
+    int level;
+    int raw;
+{
+    return zipOpenNewFileInZip3 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, raw,
+                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+                                 NULL, 0);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,
+                                        extrafield_local, size_extrafield_local,
+                                        extrafield_global, size_extrafield_global,
+                                        comment, method, level)
+    zipFile file;
+    const char* filename;
+    const zip_fileinfo* zipfi;
+    const void* extrafield_local;
+    uInt size_extrafield_local;
+    const void* extrafield_global;
+    uInt size_extrafield_global;
+    const char* comment;
+    int method;
+    int level;
+{
+    return zipOpenNewFileInZip2 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, 0);
+}
+
+local int zipFlushWriteBuffer(zi)
+  zip_internal* zi;
+{
+    int err=ZIP_OK;
+
+    if (zi->ci.encrypt != 0)
+    {
+#ifndef NOCRYPT
+        uInt i;
+        int t;
+        for (i=0;i<zi->ci.pos_in_buffered_data;i++)
+            zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,
+                                       zi->ci.buffered_data[i],t);
+#endif
+    }
+    if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)
+                                                                    !=zi->ci.pos_in_buffered_data)
+      err = ZIP_ERRNO;
+    zi->ci.pos_in_buffered_data = 0;
+    return err;
+}
+
+extern int ZEXPORT zipWriteInFileInZip (file, buf, len)
+    zipFile file;
+    const void* buf;
+    unsigned len;
+{
+    zip_internal* zi;
+    int err=ZIP_OK;
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 0)
+        return ZIP_PARAMERROR;
+
+    zi->ci.stream.next_in = (void*)buf;
+    zi->ci.stream.avail_in = len;
+    zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
+
+    while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
+    {
+        if (zi->ci.stream.avail_out == 0)
+        {
+            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+                err = ZIP_ERRNO;
+            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+            zi->ci.stream.next_out = zi->ci.buffered_data;
+        }
+
+
+        if(err != ZIP_OK)
+            break;
+
+        if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+        {
+            uLong uTotalOutBefore = zi->ci.stream.total_out;
+            err=deflate(&zi->ci.stream,  Z_NO_FLUSH);
+            zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+
+        }
+        else
+        {
+            uInt copy_this,i;
+            if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
+                copy_this = zi->ci.stream.avail_in;
+            else
+                copy_this = zi->ci.stream.avail_out;
+            for (i=0;i<copy_this;i++)
+                *(((char*)zi->ci.stream.next_out)+i) =
+                    *(((const char*)zi->ci.stream.next_in)+i);
+            {
+                zi->ci.stream.avail_in -= copy_this;
+                zi->ci.stream.avail_out-= copy_this;
+                zi->ci.stream.next_in+= copy_this;
+                zi->ci.stream.next_out+= copy_this;
+                zi->ci.stream.total_in+= copy_this;
+                zi->ci.stream.total_out+= copy_this;
+                zi->ci.pos_in_buffered_data += copy_this;
+            }
+        }
+    }
+
+    return err;
+}
+
+extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)
+    zipFile file;
+    uLong uncompressed_size;
+    uLong crc32;
+{
+    zip_internal* zi;
+    uLong compressed_size;
+    int err=ZIP_OK;
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 0)
+        return ZIP_PARAMERROR;
+    zi->ci.stream.avail_in = 0;
+
+    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+        while (err==ZIP_OK)
+    {
+        uLong uTotalOutBefore;
+        if (zi->ci.stream.avail_out == 0)
+        {
+            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+                err = ZIP_ERRNO;
+            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+            zi->ci.stream.next_out = zi->ci.buffered_data;
+        }
+        uTotalOutBefore = zi->ci.stream.total_out;
+        err=deflate(&zi->ci.stream,  Z_FINISH);
+        zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+    }
+
+    if (err==Z_STREAM_END)
+        err=ZIP_OK; /* this is normal */
+
+    if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
+        if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
+            err = ZIP_ERRNO;
+
+    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+    {
+        err=deflateEnd(&zi->ci.stream);
+        zi->ci.stream_initialised = 0;
+    }
+
+    if (!zi->ci.raw)
+    {
+        crc32 = (uLong)zi->ci.crc32;
+        uncompressed_size = (uLong)zi->ci.stream.total_in;
+    }
+    compressed_size = (uLong)zi->ci.stream.total_out;
+#    ifndef NOCRYPT
+    compressed_size += zi->ci.crypt_header_size;
+#    endif
+
+    ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+20,
+                                compressed_size,4); /*compr size*/
+    if (zi->ci.stream.data_type == Z_ASCII)
+        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+24,
+                                uncompressed_size,4); /*uncompr size*/
+
+    if (err==ZIP_OK)
+        err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
+                                       (uLong)zi->ci.size_centralheader);
+    free(zi->ci.central_header);
+
+    if (err==ZIP_OK)
+    {
+        uLong cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+        if (ZSEEK(zi->z_filefunc,zi->filestream,
+                  zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err = ZIP_ERRNO;
+
+        if (err==ZIP_OK)
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+        if (err==ZIP_OK) /* compressed size, unknown */
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+        if (err==ZIP_OK) /* uncompressed size, unknown */
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+
+        if (ZSEEK(zi->z_filefunc,zi->filestream,
+                  cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err = ZIP_ERRNO;
+
+        /* Write local Descriptor after file data */
+        if (err==ZIP_OK)
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)DESCRIPTORHEADERMAGIC,4);
+
+        if (err==ZIP_OK)
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+        if (err==ZIP_OK) /* compressed size, unknown */
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+        if (err==ZIP_OK) /* uncompressed size, unknown */
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+
+
+    }
+
+    zi->number_entry ++;
+    zi->in_opened_file_inzip = 0;
+
+    return err;
+}
+
+extern int ZEXPORT zipCloseFileInZip (file)
+    zipFile file;
+{
+    return zipCloseFileInZipRaw (file,0,0);
+}
+
+extern int ZEXPORT zipClose (file, global_comment)
+    zipFile file;
+    const char* global_comment;
+{
+    zip_internal* zi;
+    int err = 0;
+    uLong size_centraldir = 0;
+    uLong centraldir_pos_inzip;
+    uInt size_global_comment;
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 1)
+    {
+        err = zipCloseFileInZip (file);
+    }
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+    if (global_comment==NULL)
+        global_comment = zi->globalcomment;
+#endif
+    if (global_comment==NULL)
+        size_global_comment = 0;
+    else
+        size_global_comment = (uInt)strlen(global_comment);
+
+    centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+    if (err==ZIP_OK)
+    {
+        linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;
+        while (ldi!=NULL)
+        {
+            if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
+                if (ZWRITE(zi->z_filefunc,zi->filestream,
+                           ldi->data,ldi->filled_in_this_block)
+                              !=ldi->filled_in_this_block )
+                    err = ZIP_ERRNO;
+
+            size_centraldir += ldi->filled_in_this_block;
+            ldi = ldi->next_datablock;
+        }
+    }
+    free_datablock(zi->central_dir.first_block);
+
+    if (err==ZIP_OK) /* Magic End */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);
+
+    if (err==ZIP_OK) /* number of this disk */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+    if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+    if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+    if (err==ZIP_OK) /* total number of entries in the central dir */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+    if (err==ZIP_OK) /* size of the central directory */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
+
+    if (err==ZIP_OK) /* offset of start of central directory with respect to the
+                            starting disk number */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,
+                                (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);
+
+    if (err==ZIP_OK) /* zipfile comment length */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
+
+    if ((err==ZIP_OK) && (size_global_comment>0))
+        if (ZWRITE(zi->z_filefunc,zi->filestream,
+                   global_comment,size_global_comment) != size_global_comment)
+                err = ZIP_ERRNO;
+
+    if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)
+        if (err == ZIP_OK)
+            err = ZIP_ERRNO;
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+    TRYFREE(zi->globalcomment);
+#endif
+    TRYFREE(zi);
+
+    return err;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zip.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,237 @@
+/* zip.h -- IO for compress .zip files using zlib
+   Version 1.01e, February 12th, 2005
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   This unzip package allow creates .ZIP file, compatible with PKZip 2.04g
+     WinZip, InfoZip tools and compatible.
+   Multi volume ZipFile (span) are not supported.
+   Encryption compatible with pkzip 2.04g only supported
+   Old compressions used by old PKZip 1.x are not supported
+
+  For uncompress .zip file, look at unzip.h
+
+
+   I WAIT FEEDBACK at mail info@winimage.com
+   Visit also http://www.winimage.com/zLibDll/unzip.html for evolution
+
+   Condition of use and distribution are the same than zlib :
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+   Modified by Sergey A. Tachenov to integrate with Qt.
+
+
+*/
+
+/* for more info about .ZIP format, see
+      http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+      http://www.info-zip.org/pub/infozip/doc/
+   PkWare has also a specification at :
+      ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _zip_H
+#define _zip_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+    from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zipFile__;
+typedef zipFile__ *zipFile;
+#else
+typedef voidp zipFile;
+#endif
+
+#define ZIP_OK                          (0)
+#define ZIP_EOF                         (0)
+#define ZIP_ERRNO                       (Z_ERRNO)
+#define ZIP_PARAMERROR                  (-102)
+#define ZIP_BADZIPFILE                  (-103)
+#define ZIP_INTERNALERROR               (-104)
+
+#ifndef DEF_MEM_LEVEL
+#  if MAX_MEM_LEVEL >= 8
+#    define DEF_MEM_LEVEL 8
+#  else
+#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#  endif
+#endif
+/* default memLevel */
+
+/* tm_zip contain date/time info */
+typedef struct tm_zip_s
+{
+    uInt tm_sec;            /* seconds after the minute - [0,59] */
+    uInt tm_min;            /* minutes after the hour - [0,59] */
+    uInt tm_hour;           /* hours since midnight - [0,23] */
+    uInt tm_mday;           /* day of the month - [1,31] */
+    uInt tm_mon;            /* months since January - [0,11] */
+    uInt tm_year;           /* years - [1980..2044] */
+} tm_zip;
+
+typedef struct
+{
+    tm_zip      tmz_date;       /* date in understandable format           */
+    uLong       dosDate;       /* if dos_date == 0, tmu_date is used      */
+/*    uLong       flag;        */   /* general purpose bit flag        2 bytes */
+
+    uLong       internal_fa;    /* internal file attributes        2 bytes */
+    uLong       external_fa;    /* external file attributes        4 bytes */
+} zip_fileinfo;
+
+typedef const char* zipcharpc;
+
+
+#define APPEND_STATUS_CREATE        (0)
+#define APPEND_STATUS_CREATEAFTER   (1)
+#define APPEND_STATUS_ADDINZIP      (2)
+
+extern zipFile ZEXPORT zipOpen OF((voidpf file, int append));
+/*
+  Create a zipfile.
+     file is whatever the IO API accepts. For Qt IO API it's a pointer to
+       QIODevice. For fopen() IO API it's a file name (const char*).
+     if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
+       will be created at the end of the file.
+         (useful if the file contain a self extractor code)
+     if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
+       add files in existing zip (be sure you don't add file that doesn't exist)
+     If the zipfile cannot be opened, the return value is NULL.
+     Else, the return value is a zipFile Handle, usable with other function
+       of this zip package.
+*/
+
+/* Note : there is no delete function into a zipfile.
+   If you want delete file into a zipfile, you must open a zipfile, and create another
+   Of couse, you can use RAW reading and writing to copy the file you did not want delte
+*/
+
+extern zipFile ZEXPORT zipOpen2 OF((voidpf file,
+                                   int append,
+                                   zipcharpc* globalcomment,
+                                   zlib_filefunc_def* pzlib_filefunc_def));
+
+extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
+                       const char* filename,
+                       const zip_fileinfo* zipfi,
+                       const void* extrafield_local,
+                       uInt size_extrafield_local,
+                       const void* extrafield_global,
+                       uInt size_extrafield_global,
+                       const char* comment,
+                       int method,
+                       int level));
+/*
+  Open a file in the ZIP for writing.
+  filename : the filename in zip (if NULL, '-' without quote will be used
+  *zipfi contain supplemental information
+  if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
+    contains the extrafield data the the local header
+  if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
+    contains the extrafield data the the local header
+  if comment != NULL, comment contain the comment string
+  method contain the compression method (0 for store, Z_DEFLATED for deflate)
+  level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
+*/
+
+
+extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw));
+
+/*
+  Same than zipOpenNewFileInZip, except if raw=1, we write raw file
+ */
+
+extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw,
+                                            int windowBits,
+                                            int memLevel,
+                                            int strategy,
+                                            const char* password,
+                                            uLong crcForCtypting));
+
+/*
+  Same than zipOpenNewFileInZip2, except
+    windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
+    password : crypting password (NULL for no crypting)
+    crcForCtypting : crc of file to compress (needed for crypting)
+ */
+
+
+extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
+                       const void* buf,
+                       unsigned len));
+/*
+  Write data in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
+/*
+  Close the current file in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
+                                            uLong uncompressed_size,
+                                            uLong crc32));
+/*
+  Close the current file in the zipfile, for fiel opened with
+    parameter raw=1 in zipOpenNewFileInZip2
+  uncompressed_size and crc32 are value for the uncompressed size
+*/
+
+extern int ZEXPORT zipClose OF((zipFile file,
+                const char* global_comment));
+/*
+  Close the zipfile
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _zip_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zlib.h	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,1368 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+  version 1.2.3, July 18th, 2005
+
+  Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup@gzip.org          madler@alumni.caltech.edu
+
+
+  The data format used by the zlib library is described by RFCs (Request for
+  Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
+  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#include "zconf.h"
+#include "qconfig.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.3"
+#define ZLIB_VERNUM 0x1230
+
+#if defined(QT_VISIBILITY_AVAILABLE)
+# define Q_ZEXPORT __attribute__((visibility("default")))
+#else
+# ifdef QT_MAKEDLL
+# define Q_ZEXPORT __declspec(dllexport)
+# else
+# define Q_ZEXPORT ZEXPORT
+# endif
+#endif
+
+/*
+     The 'zlib' compression library provides in-memory compression and
+  decompression functions, including integrity checks of the uncompressed
+  data.  This version of the library supports only one compression method
+  (deflation) but other algorithms will be added later and will have the same
+  stream interface.
+
+     Compression can be done in a single step if the buffers are large
+  enough (for example if an input file is mmap'ed), or can be done by
+  repeated calls of the compression function.  In the latter case, the
+  application must provide more input and/or consume the output
+  (providing more output space) before each call.
+
+     The compressed data format used by default by the in-memory functions is
+  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+  around a deflate stream, which is itself documented in RFC 1951.
+
+     The library also supports reading and writing files in gzip (.gz) format
+  with an interface similar to that of stdio using the functions that start
+  with "gz".  The gzip format is different from the zlib format.  gzip is a
+  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+     This library can optionally read and write gzip streams in memory as well.
+
+     The zlib format was designed to be compact and fast for use in memory
+  and on communications channels.  The gzip format was designed for single-
+  file compression on file systems, has a larger header than zlib to maintain
+  directory information, and uses a different, slower check method than zlib.
+
+     The library does not install any signal handler. The decoder checks
+  the consistency of the compressed data, so the library should never
+  crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+    Bytef    *next_in;  /* next input byte */
+    uInt     avail_in;  /* number of bytes available at next_in */
+    uLong    total_in;  /* total nb of input bytes read so far */
+
+    Bytef    *next_out; /* next output byte should be put there */
+    uInt     avail_out; /* remaining free space at next_out */
+    uLong    total_out; /* total nb of bytes output so far */
+
+    char     *msg;      /* last error message, NULL if no error */
+    struct internal_state FAR *state; /* not visible by applications */
+
+    alloc_func zalloc;  /* used to allocate the internal state */
+    free_func  zfree;   /* used to free the internal state */
+    voidpf     opaque;  /* private data object passed to zalloc and zfree */
+
+    int     data_type;  /* best guess about the data type: binary or text */
+    uLong   adler;      /* adler32 value of the uncompressed data */
+    uLong   reserved;   /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+     gzip header information passed to and from zlib routines.  See RFC 1952
+  for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+    int     text;       /* true if compressed data believed to be text */
+    uLong   time;       /* modification time */
+    int     xflags;     /* extra flags (not used when writing a gzip file) */
+    int     os;         /* operating system */
+    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
+    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
+    uInt    extra_max;  /* space at extra (only when reading header) */
+    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
+    uInt    name_max;   /* space at name (only when reading header) */
+    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
+    uInt    comm_max;   /* space at comment (only when reading header) */
+    int     hcrc;       /* true if there was or will be a header crc */
+    int     done;       /* true when done reading gzip header (not used
+                           when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+   The application must update next_in and avail_in when avail_in has
+   dropped to zero. It must update next_out and avail_out when avail_out
+   has dropped to zero. The application must initialize zalloc, zfree and
+   opaque before calling the init function. All other fields are set by the
+   compression library and must not be updated by the application.
+
+   The opaque value provided by the application will be passed as the first
+   parameter for calls of zalloc and zfree. This can be useful for custom
+   memory management. The compression library attaches no meaning to the
+   opaque value.
+
+   zalloc must return Z_NULL if there is not enough memory for the object.
+   If zlib is used in a multi-threaded application, zalloc and zfree must be
+   thread safe.
+
+   On 16-bit systems, the functions zalloc and zfree must be able to allocate
+   exactly 65536 bytes, but will not be required to allocate more than this
+   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+   pointers returned by zalloc for objects of exactly 65536 bytes *must*
+   have their offset normalized to zero. The default allocation function
+   provided by this library ensures this (see zutil.c). To reduce memory
+   requirements and avoid any allocation of 64K objects, at the expense of
+   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+   The fields total_in and total_out can be used for statistics or
+   progress reports. After compression, total_in holds the total size of
+   the uncompressed data and may be saved for use in the decompressor
+   (particularly if the decompressor wants to decompress everything in
+   a single step).
+*/
+
+                        /* constants */
+
+#define Z_NO_FLUSH      0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH    2
+#define Z_FULL_FLUSH    3
+#define Z_FINISH        4
+#define Z_BLOCK         5
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK            0
+#define Z_STREAM_END    1
+#define Z_NEED_DICT     2
+#define Z_ERRNO        (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR   (-3)
+#define Z_MEM_ERROR    (-4)
+#define Z_BUF_ERROR    (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION         0
+#define Z_BEST_SPEED             1
+#define Z_BEST_COMPRESSION       9
+#define Z_DEFAULT_COMPRESSION  (-1)
+/* compression levels */
+
+#define Z_FILTERED            1
+#define Z_HUFFMAN_ONLY        2
+#define Z_RLE                 3
+#define Z_FIXED               4
+#define Z_DEFAULT_STRATEGY    0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY   0
+#define Z_TEXT     1
+#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN  2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED   8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+                        /* basic functions */
+
+ZEXTERN Q_ZEXPORT const char * zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+   If the first character differs, the library code actually used is
+   not compatible with the zlib.h header file used by the application.
+   This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+     Initializes the internal stream state for compression. The fields
+   zalloc, zfree and opaque must be initialized before by the caller.
+   If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+   use default allocation functions.
+
+     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+   1 gives best speed, 9 gives best compression, 0 gives no compression at
+   all (the input data is simply copied a block at a time).
+   Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+   compression (currently equivalent to level 6).
+
+     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+   with the version assumed by the caller (ZLIB_VERSION).
+   msg is set to null if there is no error message.  deflateInit does not
+   perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int Q_ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+    deflate compresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may introduce some
+  output latency (reading input without producing any output) except when
+  forced to flush.
+
+    The detailed semantics are as follows. deflate performs one or both of the
+  following actions:
+
+  - Compress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in and avail_in are updated and
+    processing will resume at this point for the next call of deflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly. This action is forced if the parameter flush is non zero.
+    Forcing flush frequently degrades the compression ratio, so this parameter
+    should be set only when necessary (in interactive applications).
+    Some output may be provided even if flush is not set.
+
+  Before the call of deflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating avail_in or avail_out accordingly; avail_out
+  should never be zero before the call. The application can consume the
+  compressed output when it wants, for example when the output buffer is full
+  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+  and with zero avail_out, it must be called again after making room in the
+  output buffer because there might be more output pending.
+
+    Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+  decide how much data to accumualte before producing output, in order to
+  maximize compression.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+  flushed to the output buffer and the output is aligned on a byte boundary, so
+  that the decompressor can get all input data available so far. (In particular
+  avail_in is zero after the call if enough output space has been provided
+  before the call.)  Flushing may degrade compression for some compression
+  algorithms and so it should be used only when necessary.
+
+    If flush is set to Z_FULL_FLUSH, all output is flushed as with
+  Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+  restart from this point if previous compressed data has been damaged or if
+  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+  compression.
+
+    If deflate returns with avail_out == 0, this function must be called again
+  with the same value of the flush parameter and more output space (updated
+  avail_out), until the flush is complete (deflate returns with non-zero
+  avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+  avail_out is greater than six to avoid repeated flush markers due to
+  avail_out == 0 on return.
+
+    If the parameter flush is set to Z_FINISH, pending input is processed,
+  pending output is flushed and deflate returns with Z_STREAM_END if there
+  was enough output space; if deflate returns with Z_OK, this function must be
+  called again with Z_FINISH and more output space (updated avail_out) but no
+  more input data, until it returns with Z_STREAM_END or an error. After
+  deflate has returned Z_STREAM_END, the only possible operations on the
+  stream are deflateReset or deflateEnd.
+
+    Z_FINISH can be used immediately after deflateInit if all the compression
+  is to be done in a single step. In this case, avail_out must be at least
+  the value returned by deflateBound (see below). If deflate does not return
+  Z_STREAM_END, then it must be called again as described above.
+
+    deflate() sets strm->adler to the adler32 checksum of all input read
+  so far (that is, total_in bytes).
+
+    deflate() may update strm->data_type if it can make a good guess about
+  the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+  binary. This field is only for information purposes and does not affect
+  the compression algorithm in any manner.
+
+    deflate() returns Z_OK if some progress has been made (more input
+  processed or more output produced), Z_STREAM_END if all input has been
+  consumed and all output has been produced (only when flush is set to
+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+  (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+  fatal, and deflate() can be called again with more input and more output
+  space to continue compressing.
+*/
+
+
+ZEXTERN int Q_ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+   stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+   prematurely (some input or output was discarded). In the error case,
+   msg may be set but then points to a static string (which must not be
+   deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+     Initializes the internal stream state for decompression. The fields
+   next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+   value depends on the compression method), inflateInit determines the
+   compression method from the zlib header and allocates all data structures
+   accordingly; otherwise the allocation will be deferred to the first call of
+   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+   use default allocation functions.
+
+     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+   version assumed by the caller.  msg is set to null if there is no error
+   message. inflateInit does not perform any decompression apart from reading
+   the zlib header if present: this will be done by inflate().  (So next_in and
+   avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int Q_ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+    inflate decompresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may introduce
+  some output latency (reading input without producing any output) except when
+  forced to flush.
+
+  The detailed semantics are as follows. inflate performs one or both of the
+  following actions:
+
+  - Decompress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in is updated and processing
+    will resume at this point for the next call of inflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly.  inflate() provides as much output as possible, until there
+    is no more input data or no more space in the output buffer (see below
+    about the flush parameter).
+
+  Before the call of inflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating the next_* and avail_* values accordingly.
+  The application can consume the uncompressed output when it wants, for
+  example when the output buffer is full (avail_out == 0), or after each
+  call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+  must be called again after making room in the output buffer because there
+  might be more output pending.
+
+    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
+  Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
+  output as possible to the output buffer. Z_BLOCK requests that inflate() stop
+  if and when it gets to the next deflate block boundary. When decoding the
+  zlib or gzip format, this will cause inflate() to return immediately after
+  the header and before the first block. When doing a raw inflate, inflate()
+  will go ahead and process the first block, and will return when it gets to
+  the end of that block, or when it runs out of data.
+
+    The Z_BLOCK option assists in appending to or combining deflate streams.
+  Also to assist in this, on return inflate() will set strm->data_type to the
+  number of unused bits in the last byte taken from strm->next_in, plus 64
+  if inflate() is currently decoding the last block in the deflate stream,
+  plus 128 if inflate() returned immediately after decoding an end-of-block
+  code or decoding the complete header up to just before the first byte of the
+  deflate stream. The end-of-block will not be indicated until all of the
+  uncompressed data from that block has been written to strm->next_out.  The
+  number of unused bits may in general be greater than seven, except when
+  bit 7 of data_type is set, in which case the number of unused bits will be
+  less than eight.
+
+    inflate() should normally be called until it returns Z_STREAM_END or an
+  error. However if all decompression is to be performed in a single step
+  (a single call of inflate), the parameter flush should be set to
+  Z_FINISH. In this case all pending input is processed and all pending
+  output is flushed; avail_out must be large enough to hold all the
+  uncompressed data. (The size of the uncompressed data may have been saved
+  by the compressor for this purpose.) The next operation on this stream must
+  be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+  is never required, but can be used to inform inflate that a faster approach
+  may be used for the single inflate() call.
+
+     In this implementation, inflate() always flushes as much output as
+  possible to the output buffer, and always uses the faster approach on the
+  first call. So the only effect of the flush parameter in this implementation
+  is on the return value of inflate(), as noted below, or when it returns early
+  because Z_BLOCK is used.
+
+     If a preset dictionary is needed after this call (see inflateSetDictionary
+  below), inflate sets strm->adler to the adler32 checksum of the dictionary
+  chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+  strm->adler to the adler32 checksum of all output produced so far (that is,
+  total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+  below. At the end of the stream, inflate() checks that its computed adler32
+  checksum is equal to that saved by the compressor and returns Z_STREAM_END
+  only if the checksum is correct.
+
+    inflate() will decompress and check either zlib-wrapped or gzip-wrapped
+  deflate data.  The header type is detected automatically.  Any information
+  contained in the gzip header is not retained, so applications that need that
+  information should instead use raw inflate, see inflateInit2() below, or
+  inflateBack() and perform their own processing of the gzip header and
+  trailer.
+
+    inflate() returns Z_OK if some progress has been made (more input processed
+  or more output produced), Z_STREAM_END if the end of the compressed data has
+  been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+  corrupted (input stream not conforming to the zlib format or incorrect check
+  value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+  if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
+  Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+  output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+  inflate() can be called again with more input and more output space to
+  continue decompressing. If Z_DATA_ERROR is returned, the application may then
+  call inflateSync() to look for a good compression block if a partial recovery
+  of the data is desired.
+*/
+
+
+ZEXTERN int Q_ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+   was inconsistent. In the error case, msg may be set but then points to a
+   static string (which must not be deallocated).
+*/
+
+                        /* Advanced functions */
+
+/*
+    The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+                                     int  level,
+                                     int  method,
+                                     int  windowBits,
+                                     int  memLevel,
+                                     int  strategy));
+
+     This is another version of deflateInit with more compression options. The
+   fields next_in, zalloc, zfree and opaque must be initialized before by
+   the caller.
+
+     The method parameter is the compression method. It must be Z_DEFLATED in
+   this version of the library.
+
+     The windowBits parameter is the base two logarithm of the window size
+   (the size of the history buffer). It should be in the range 8..15 for this
+   version of the library. Larger values of this parameter result in better
+   compression at the expense of memory usage. The default value is 15 if
+   deflateInit is used instead.
+
+     windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+   determines the window size. deflate() will then generate raw deflate data
+   with no zlib header or trailer, and will not compute an adler32 check value.
+
+     windowBits can also be greater than 15 for optional gzip encoding. Add
+   16 to windowBits to write a simple gzip header and trailer around the
+   compressed data instead of a zlib wrapper. The gzip header will have no
+   file name, no extra data, no comment, no modification time (set to zero),
+   no header crc, and the operating system will be set to 255 (unknown).  If a
+   gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+     The memLevel parameter specifies how much memory should be allocated
+   for the internal compression state. memLevel=1 uses minimum memory but
+   is slow and reduces compression ratio; memLevel=9 uses maximum memory
+   for optimal speed. The default value is 8. See zconf.h for total memory
+   usage as a function of windowBits and memLevel.
+
+     The strategy parameter is used to tune the compression algorithm. Use the
+   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+   filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+   string match), or Z_RLE to limit match distances to one (run-length
+   encoding). Filtered data consists mostly of small values with a somewhat
+   random distribution. In this case, the compression algorithm is tuned to
+   compress them better. The effect of Z_FILTERED is to force more Huffman
+   coding and less string matching; it is somewhat intermediate between
+   Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
+   Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
+   parameter only affects the compression ratio but not the correctness of the
+   compressed output even if it is not set appropriately.  Z_FIXED prevents the
+   use of dynamic Huffman codes, allowing for a simpler decoder for special
+   applications.
+
+      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+   method). msg is set to null if there is no error message.  deflateInit2 does
+   not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int Q_ZEXPORT deflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the compression dictionary from the given byte sequence
+   without producing any compressed output. This function must be called
+   immediately after deflateInit, deflateInit2 or deflateReset, before any
+   call of deflate. The compressor and decompressor must use exactly the same
+   dictionary (see inflateSetDictionary).
+
+     The dictionary should consist of strings (byte sequences) that are likely
+   to be encountered later in the data to be compressed, with the most commonly
+   used strings preferably put towards the end of the dictionary. Using a
+   dictionary is most useful when the data to be compressed is short and can be
+   predicted with good accuracy; the data can then be compressed better than
+   with the default empty dictionary.
+
+     Depending on the size of the compression data structures selected by
+   deflateInit or deflateInit2, a part of the dictionary may in effect be
+   discarded, for example if the dictionary is larger than the window size in
+   deflate or deflate2. Thus the strings most likely to be useful should be
+   put at the end of the dictionary, not at the front. In addition, the
+   current implementation of deflate will use at most the window size minus
+   262 bytes of the provided dictionary.
+
+     Upon return of this function, strm->adler is set to the adler32 value
+   of the dictionary; the decompressor may later use this value to determine
+   which dictionary has been used by the compressor. (The adler32 value
+   applies to the whole dictionary even if only a subset of the dictionary is
+   actually used by the compressor.) If a raw deflate was requested, then the
+   adler32 value is not computed and strm->adler is not set.
+
+     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent (for example if deflate has already been called for this stream
+   or if the compression method is bsort). deflateSetDictionary does not
+   perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int Q_ZEXPORT deflateCopy OF((z_streamp dest,
+                                    z_streamp source));
+/*
+     Sets the destination stream as a complete copy of the source stream.
+
+     This function can be useful when several compression strategies will be
+   tried, for example when there are several ways of pre-processing the input
+   data with a filter. The streams that will be discarded should then be freed
+   by calling deflateEnd.  Note that deflateCopy duplicates the internal
+   compression state which can be quite large, so this strategy is slow and
+   can consume lots of memory.
+
+     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+   (such as zalloc being NULL). msg is left unchanged in both source and
+   destination.
+*/
+
+ZEXTERN int Q_ZEXPORT deflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to deflateEnd followed by deflateInit,
+   but does not free and reallocate all the internal compression state.
+   The stream will keep the same compression level and any other attributes
+   that may have been set by deflateInit2.
+
+      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int Q_ZEXPORT deflateParams OF((z_streamp strm,
+                                      int level,
+                                      int strategy));
+/*
+     Dynamically update the compression level and compression strategy.  The
+   interpretation of level and strategy is as in deflateInit2.  This can be
+   used to switch between compression and straight copy of the input data, or
+   to switch to a different kind of input data requiring a different
+   strategy. If the compression level is changed, the input available so far
+   is compressed with the old level (and may be flushed); the new level will
+   take effect only at the next call of deflate().
+
+     Before the call of deflateParams, the stream state must be set as for
+   a call of deflate(), since the currently available input may have to
+   be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+   if strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+                                    int good_length,
+                                    int max_lazy,
+                                    int nice_length,
+                                    int max_chain));
+/*
+     Fine tune deflate's internal compression parameters.  This should only be
+   used by someone who understands the algorithm used by zlib's deflate for
+   searching for the best matching string, and even then only by the most
+   fanatic optimizer trying to squeeze out the last compressed bit for their
+   specific input data.  Read the deflate.c source code for the meaning of the
+   max_lazy, good_length, nice_length, and max_chain parameters.
+
+     deflateTune() can be called after deflateInit() or deflateInit2(), and
+   returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+                                       uLong sourceLen));
+/*
+     deflateBound() returns an upper bound on the compressed size after
+   deflation of sourceLen bytes.  It must be called after deflateInit()
+   or deflateInit2().  This would be used to allocate an output buffer
+   for deflation in a single pass, and so would be called before deflate().
+*/
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+                                     int bits,
+                                     int value));
+/*
+     deflatePrime() inserts bits in the deflate output stream.  The intent
+  is that this function is used to start off the deflate output with the
+  bits leftover from a previous deflate stream when appending to it.  As such,
+  this function can only be used for raw deflate, and must be used before the
+  first deflate() call after a deflateInit2() or deflateReset().  bits must be
+  less than or equal to 16, and that many of the least significant bits of
+  value will be inserted in the output.
+
+      deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+                                         gz_headerp head));
+/*
+      deflateSetHeader() provides gzip header information for when a gzip
+   stream is requested by deflateInit2().  deflateSetHeader() may be called
+   after deflateInit2() or deflateReset() and before the first call of
+   deflate().  The text, time, os, extra field, name, and comment information
+   in the provided gz_header structure are written to the gzip header (xflag is
+   ignored -- the extra flags are set according to the compression level).  The
+   caller must assure that, if not Z_NULL, name and comment are terminated with
+   a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+   available there.  If hcrc is true, a gzip header crc is included.  Note that
+   the current versions of the command-line version of gzip (up through version
+   1.3.x) do not support header crc's, and will report that it is a "multi-part
+   gzip file" and give up.
+
+      If deflateSetHeader is not used, the default gzip header has text false,
+   the time set to zero, and os set to 255, with no extra, name, or comment
+   fields.  The gzip header is returned to the default state by deflateReset().
+
+      deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+                                     int  windowBits));
+
+     This is another version of inflateInit with an extra parameter. The
+   fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+   before by the caller.
+
+     The windowBits parameter is the base two logarithm of the maximum window
+   size (the size of the history buffer).  It should be in the range 8..15 for
+   this version of the library. The default value is 15 if inflateInit is used
+   instead. windowBits must be greater than or equal to the windowBits value
+   provided to deflateInit2() while compressing, or it must be equal to 15 if
+   deflateInit2() was not used. If a compressed stream with a larger window
+   size is given as input, inflate() will return with the error code
+   Z_DATA_ERROR instead of trying to allocate a larger window.
+
+     windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+   determines the window size. inflate() will then process raw deflate data,
+   not looking for a zlib or gzip header, not generating a check value, and not
+   looking for any check values for comparison at the end of the stream. This
+   is for use with other formats that use the deflate compressed data format
+   such as zip.  Those formats provide their own check values. If a custom
+   format is developed using the raw deflate format for compressed data, it is
+   recommended that a check value such as an adler32 or a crc32 be applied to
+   the uncompressed data as is done in the zlib, gzip, and zip formats.  For
+   most applications, the zlib format should be used as is. Note that comments
+   above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+     windowBits can also be greater than 15 for optional gzip decoding. Add
+   32 to windowBits to enable zlib and gzip decoding with automatic header
+   detection, or add 16 to decode only the gzip format (the zlib format will
+   return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is
+   a crc32 instead of an adler32.
+
+     inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg
+   is set to null if there is no error message.  inflateInit2 does not perform
+   any decompression apart from reading the zlib header if present: this will
+   be done by inflate(). (So next_in and avail_in may be modified, but next_out
+   and avail_out are unchanged.)
+*/
+
+ZEXTERN int Q_ZEXPORT inflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the decompression dictionary from the given uncompressed byte
+   sequence. This function must be called immediately after a call of inflate,
+   if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+   can be determined from the adler32 value returned by that call of inflate.
+   The compressor and decompressor must use exactly the same dictionary (see
+   deflateSetDictionary).  For raw inflate, this function can be called
+   immediately after inflateInit2() or inflateReset() and before any call of
+   inflate() to set the dictionary.  The application must insure that the
+   dictionary that was used for compression is provided.
+
+     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+   expected one (incorrect adler32 value). inflateSetDictionary does not
+   perform any decompression: this will be done by subsequent calls of
+   inflate().
+*/
+
+ZEXTERN int Q_ZEXPORT inflateSync OF((z_streamp strm));
+/*
+    Skips invalid compressed data until a full flush point (see above the
+  description of deflate with Z_FULL_FLUSH) can be found, or until all
+  available input is skipped. No output is provided.
+
+    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+  if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+  case, the application may save the current current value of total_in which
+  indicates where valid compressed data was found. In the error case, the
+  application may repeatedly call inflateSync, providing more input each time,
+  until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+                                    z_streamp source));
+/*
+     Sets the destination stream as a complete copy of the source stream.
+
+     This function can be useful when randomly accessing a large stream.  The
+   first pass through the stream can periodically record the inflate state,
+   allowing restarting inflate at those points when randomly accessing the
+   stream.
+
+     inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+   (such as zalloc being NULL). msg is left unchanged in both source and
+   destination.
+*/
+
+ZEXTERN int Q_ZEXPORT inflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to inflateEnd followed by inflateInit,
+   but does not free and reallocate all the internal decompression state.
+   The stream will keep attributes that may have been set by inflateInit2.
+
+      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+                                     int bits,
+                                     int value));
+/*
+     This function inserts bits in the inflate input stream.  The intent is
+  that this function is used to start inflating at a bit position in the
+  middle of a byte.  The provided bits will be used before any bytes are used
+  from next_in.  This function should only be used with raw inflate, and
+  should be used before the first inflate() call after inflateInit2() or
+  inflateReset().  bits must be less than or equal to 16, and that many of the
+  least significant bits of value will be inserted in the input.
+
+      inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+                                         gz_headerp head));
+/*
+      inflateGetHeader() requests that gzip header information be stored in the
+   provided gz_header structure.  inflateGetHeader() may be called after
+   inflateInit2() or inflateReset(), and before the first call of inflate().
+   As inflate() processes the gzip stream, head->done is zero until the header
+   is completed, at which time head->done is set to one.  If a zlib stream is
+   being decoded, then head->done is set to -1 to indicate that there will be
+   no gzip header information forthcoming.  Note that Z_BLOCK can be used to
+   force inflate() to return immediately after header processing is complete
+   and before any actual data is decompressed.
+
+      The text, time, xflags, and os fields are filled in with the gzip header
+   contents.  hcrc is set to true if there is a header CRC.  (The header CRC
+   was valid if done is set to one.)  If extra is not Z_NULL, then extra_max
+   contains the maximum number of bytes to write to extra.  Once done is true,
+   extra_len contains the actual extra field length, and extra contains the
+   extra field, or that field truncated if extra_max is less than extra_len.
+   If name is not Z_NULL, then up to name_max characters are written there,
+   terminated with a zero unless the length is greater than name_max.  If
+   comment is not Z_NULL, then up to comm_max characters are written there,
+   terminated with a zero unless the length is greater than comm_max.  When
+   any of extra, name, or comment are not Z_NULL and the respective field is
+   not present in the header, then that field is set to Z_NULL to signal its
+   absence.  This allows the use of deflateSetHeader() with the returned
+   structure to duplicate the header.  However if those fields are set to
+   allocated memory, then the application will need to save those pointers
+   elsewhere so that they can be eventually freed.
+
+      If inflateGetHeader is not used, then the header information is simply
+   discarded.  The header is always checked for validity, including the header
+   CRC if present.  inflateReset() will reset the process to discard the header
+   information.  The application would need to call inflateGetHeader() again to
+   retrieve the header from the next gzip stream.
+
+      inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+                                        unsigned char FAR *window));
+
+     Initialize the internal stream state for decompression using inflateBack()
+   calls.  The fields zalloc, zfree and opaque in strm must be initialized
+   before the call.  If zalloc and zfree are Z_NULL, then the default library-
+   derived memory allocation routines are used.  windowBits is the base two
+   logarithm of the window size, in the range 8..15.  window is a caller
+   supplied buffer of that size.  Except for special applications where it is
+   assured that deflate was used with small window sizes, windowBits must be 15
+   and a 32K byte window must be supplied to be able to decompress general
+   deflate streams.
+
+     See inflateBack() for the usage of these routines.
+
+     inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+   the paramaters are invalid, Z_MEM_ERROR if the internal state could not
+   be allocated, or Z_VERSION_ERROR if the version of the library does not
+   match the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+                                    in_func in, void FAR *in_desc,
+                                    out_func out, void FAR *out_desc));
+/*
+     inflateBack() does a raw inflate with a single call using a call-back
+   interface for input and output.  This is more efficient than inflate() for
+   file i/o applications in that it avoids copying between the output and the
+   sliding window by simply making the window itself the output buffer.  This
+   function trusts the application to not change the output buffer passed by
+   the output function, at least until inflateBack() returns.
+
+     inflateBackInit() must be called first to allocate the internal state
+   and to initialize the state with the user-provided window buffer.
+   inflateBack() may then be used multiple times to inflate a complete, raw
+   deflate stream with each call.  inflateBackEnd() is then called to free
+   the allocated state.
+
+     A raw deflate stream is one with no zlib or gzip header or trailer.
+   This routine would normally be used in a utility that reads zip or gzip
+   files and writes out uncompressed files.  The utility would decode the
+   header and process the trailer on its own, hence this routine expects
+   only the raw deflate stream to decompress.  This is different from the
+   normal behavior of inflate(), which expects either a zlib or gzip header and
+   trailer around the deflate stream.
+
+     inflateBack() uses two subroutines supplied by the caller that are then
+   called by inflateBack() for input and output.  inflateBack() calls those
+   routines until it reads a complete deflate stream and writes out all of the
+   uncompressed data, or until it encounters an error.  The function's
+   parameters and return types are defined above in the in_func and out_func
+   typedefs.  inflateBack() will call in(in_desc, &buf) which should return the
+   number of bytes of provided input, and a pointer to that input in buf.  If
+   there is no input available, in() must return zero--buf is ignored in that
+   case--and inflateBack() will return a buffer error.  inflateBack() will call
+   out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].  out()
+   should return zero on success, or non-zero on failure.  If out() returns
+   non-zero, inflateBack() will return with an error.  Neither in() nor out()
+   are permitted to change the contents of the window provided to
+   inflateBackInit(), which is also the buffer that out() uses to write from.
+   The length written by out() will be at most the window size.  Any non-zero
+   amount of input may be provided by in().
+
+     For convenience, inflateBack() can be provided input on the first call by
+   setting strm->next_in and strm->avail_in.  If that input is exhausted, then
+   in() will be called.  Therefore strm->next_in must be initialized before
+   calling inflateBack().  If strm->next_in is Z_NULL, then in() will be called
+   immediately for input.  If strm->next_in is not Z_NULL, then strm->avail_in
+   must also be initialized, and then if strm->avail_in is not zero, input will
+   initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+     The in_desc and out_desc parameters of inflateBack() is passed as the
+   first parameter of in() and out() respectively when they are called.  These
+   descriptors can be optionally used to pass any information that the caller-
+   supplied in() and out() functions need to do their job.
+
+     On return, inflateBack() will set strm->next_in and strm->avail_in to
+   pass back any unused input that was provided by the last in() call.  The
+   return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+   if in() or out() returned an error, Z_DATA_ERROR if there was a format
+   error in the deflate stream (in which case strm->msg is set to indicate the
+   nature of the error), or Z_STREAM_ERROR if the stream was not properly
+   initialized.  In the case of Z_BUF_ERROR, an input or output error can be
+   distinguished using strm->next_in which will be Z_NULL only if in() returned
+   an error.  If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
+   out() returning non-zero.  (in() will always be called before out(), so
+   strm->next_in is assured to be defined if out() returns non-zero.)  Note
+   that inflateBack() cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+     All memory allocated by inflateBackInit() is freed.
+
+     inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+   state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+    Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+     1.0: size of uInt
+     3.2: size of uLong
+     5.4: size of voidpf (pointer)
+     7.6: size of z_off_t
+
+    Compiler, assembler, and debug options:
+     8: DEBUG
+     9: ASMV or ASMINF -- use ASM code
+     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+     11: 0 (reserved)
+
+    One-time table building (smaller code, but not thread-safe if true):
+     12: BUILDFIXED -- build static block decoding tables when needed
+     13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+     14,15: 0 (reserved)
+
+    Library content (indicates missing functionality):
+     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+                          deflate code when not needed)
+     17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+                    and decode gzip streams (to avoid linking crc code)
+     18-19: 0 (reserved)
+
+    Operation variations (changes in library functionality):
+     20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+     21: FASTEST -- deflate algorithm with only one, lowest compression level
+     22,23: 0 (reserved)
+
+    The sprintf variant used by gzprintf (zero is best):
+     24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+     25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+     26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+    Remainder:
+     27-31: 0 (reserved)
+ */
+
+
+                        /* utility functions */
+
+/*
+     The following utility functions are implemented on top of the
+   basic stream-oriented functions. To simplify the interface, some
+   default options are assumed (compression level and memory usage,
+   standard memory allocation functions). The source code of these
+   utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int Q_ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
+                                 const Bytef *source, uLong sourceLen));
+/*
+     Compresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be at least the value returned
+   by compressBound(sourceLen). Upon exit, destLen is the actual size of the
+   compressed buffer.
+     This function can be used to compress a whole file at once if the
+   input file is mmap'ed.
+     compress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer.
+*/
+
+ZEXTERN int Q_ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
+                                  const Bytef *source, uLong sourceLen,
+                                  int level));
+/*
+     Compresses the source buffer into the destination buffer. The level
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte
+   length of the source buffer. Upon entry, destLen is the total size of the
+   destination buffer, which must be at least the value returned by
+   compressBound(sourceLen). Upon exit, destLen is the actual size of the
+   compressed buffer.
+
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+   Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+     compressBound() returns an upper bound on the compressed size after
+   compress() or compress2() on sourceLen bytes.  It would be used before
+   a compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int Q_ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
+                                   const Bytef *source, uLong sourceLen));
+/*
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be large enough to hold the
+   entire uncompressed data. (The size of the uncompressed data must have
+   been saved previously by the compressor and transmitted to the decompressor
+   by some mechanism outside the scope of this compression library.)
+   Upon exit, destLen is the actual size of the compressed buffer.
+     This function can be used to decompress a whole file at once if the
+   input file is mmap'ed.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile Q_ZEXPORT gzopen  OF((const char *path, const char *mode));
+/*
+     Opens a gzip (.gz) file for reading or writing. The mode parameter
+   is as in fopen ("rb" or "wb") but can also include a compression level
+   ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+   Huffman only compression as in "wb1h", or 'R' for run-length encoding
+   as in "wb1R". (See the description of deflateInit2 for more information
+   about the strategy parameter.)
+
+     gzopen can be used to read a file which is not in gzip format; in this
+   case gzread will directly read from the file without decompression.
+
+     gzopen returns NULL if the file could not be opened or if there was
+   insufficient memory to allocate the (de)compression state; errno
+   can be checked to distinguish the two cases (if errno is zero, the
+   zlib error is Z_MEM_ERROR).  */
+
+ZEXTERN gzFile Q_ZEXPORT gzdopen  OF((int fd, const char *mode));
+/*
+     gzdopen() associates a gzFile with the file descriptor fd.  File
+   descriptors are obtained from calls like open, dup, creat, pipe or
+   fileno (in the file has been previously opened with fopen).
+   The mode parameter is as in gzopen.
+     The next call of gzclose on the returned gzFile will also close the
+   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+     gzdopen returns NULL if there was insufficient memory to allocate
+   the (de)compression state.
+*/
+
+ZEXTERN int Q_ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+     Dynamically update the compression level or strategy. See the description
+   of deflateInit2 for the meaning of these parameters.
+     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+   opened for writing.
+*/
+
+ZEXTERN int Q_ZEXPORT    gzread  OF((gzFile file, voidp buf, unsigned len));
+/*
+     Reads the given number of uncompressed bytes from the compressed file.
+   If the input file was not in gzip format, gzread copies the given number
+   of bytes into the buffer.
+     gzread returns the number of uncompressed bytes actually read (0 for
+   end of file, -1 for error). */
+
+ZEXTERN int Q_ZEXPORT    gzwrite OF((gzFile file,
+                                   voidpc buf, unsigned len));
+/*
+     Writes the given number of uncompressed bytes into the compressed file.
+   gzwrite returns the number of uncompressed bytes actually written
+   (0 in case of error).
+*/
+
+ZEXTERN int Q_ZEXPORT gzprintf OF((gzFile file, const char *format, ...));
+/*
+     Converts, formats, and writes the args to the compressed file under
+   control of the format string, as in fprintf. gzprintf returns the number of
+   uncompressed bytes actually written (0 in case of error).  The number of
+   uncompressed bytes written is limited to 4095. The caller should assure that
+   this limit is not exceeded. If it is exceeded, then gzprintf() will return
+   return an error (0) with nothing written. In this case, there may also be a
+   buffer overflow with unpredictable consequences, which is possible only if
+   zlib was compiled with the insecure functions sprintf() or vsprintf()
+   because the secure snprintf() or vsnprintf() functions were not available.
+*/
+
+ZEXTERN int Q_ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+      Writes the given null-terminated string to the compressed file, excluding
+   the terminating null character.
+      gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN Q_ZEXPORT char * gzgets OF((gzFile file, char *buf, int len));
+/*
+      Reads bytes from the compressed file until len-1 characters are read, or
+   a newline character is read and transferred to buf, or an end-of-file
+   condition is encountered.  The string is then terminated with a null
+   character.
+      gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int Q_ZEXPORT    gzputc OF((gzFile file, int c));
+/*
+      Writes c, converted to an unsigned char, into the compressed file.
+   gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int Q_ZEXPORT    gzgetc OF((gzFile file));
+/*
+      Reads one byte from the compressed file. gzgetc returns this byte
+   or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT    gzungetc OF((int c, gzFile file));
+/*
+      Push one character back onto the stream to be read again later.
+   Only one character of push-back is allowed.  gzungetc() returns the
+   character pushed, or -1 on failure.  gzungetc() will fail if a
+   character has been pushed but not read yet, or if c is -1. The pushed
+   character will be discarded if the stream is repositioned with gzseek()
+   or gzrewind().
+*/
+
+ZEXTERN int Q_ZEXPORT    gzflush OF((gzFile file, int flush));
+/*
+     Flushes all pending output into the compressed file. The parameter
+   flush is as in the deflate() function. The return value is the zlib
+   error number (see function gzerror below). gzflush returns Z_OK if
+   the flush parameter is Z_FINISH and all output could be flushed.
+     gzflush should be called only when strictly necessary because it can
+   degrade compression.
+*/
+
+ZEXTERN z_off_t Q_ZEXPORT    gzseek OF((gzFile file,
+                                      z_off_t offset, int whence));
+/*
+      Sets the starting position for the next gzread or gzwrite on the
+   given compressed file. The offset represents a number of bytes in the
+   uncompressed data stream. The whence parameter is defined as in lseek(2);
+   the value SEEK_END is not supported.
+     If the file is opened for reading, this function is emulated but can be
+   extremely slow. If the file is opened for writing, only forward seeks are
+   supported; gzseek then compresses a sequence of zeroes up to the new
+   starting position.
+
+      gzseek returns the resulting offset location as measured in bytes from
+   the beginning of the uncompressed stream, or -1 in case of error, in
+   particular if the file is opened for writing and the new starting position
+   would be before the current position.
+*/
+
+ZEXTERN int Q_ZEXPORT    gzrewind OF((gzFile file));
+/*
+     Rewinds the given file. This function is supported only for reading.
+
+   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t Q_ZEXPORT    gztell OF((gzFile file));
+/*
+     Returns the starting position for the next gzread or gzwrite on the
+   given compressed file. This position represents a number of bytes in the
+   uncompressed data stream.
+
+   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int Q_ZEXPORT gzeof OF((gzFile file));
+/*
+     Returns 1 when EOF has previously been detected reading the given
+   input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+     Returns 1 if file is being read directly without decompression, otherwise
+   zero.
+*/
+
+ZEXTERN int Q_ZEXPORT    gzclose OF((gzFile file));
+/*
+     Flushes all pending output if necessary, closes the compressed file
+   and deallocates all the (de)compression state. The return value is the zlib
+   error number (see function gzerror below).
+*/
+
+ZEXTERN Q_ZEXPORT const char * gzerror OF((gzFile file, int *errnum));
+/*
+     Returns the error message for the last error which occurred on the
+   given compressed file. errnum is set to zlib error number. If an
+   error occurred in the file system and not in the compression library,
+   errnum is set to Z_ERRNO and the application may consult errno
+   to get the exact error code.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+     Clears the error and end-of-file flags for file. This is analogous to the
+   clearerr() function in stdio. This is useful for continuing to read a gzip
+   file that is being written concurrently.
+*/
+
+                        /* checksum functions */
+
+/*
+     These functions are not related to compression but are exported
+   anyway because they might be useful in applications using the
+   compression library.
+*/
+
+ZEXTERN uLong Q_ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+   return the updated checksum. If buf is NULL, this function returns
+   the required initial value for the checksum.
+   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+   much faster. Usage example:
+
+     uLong adler = adler32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       adler = adler32(adler, buffer, length);
+     }
+     if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+                                          z_off_t len2));
+/*
+     Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1
+   and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+   each, adler1 and adler2.  adler32_combine() returns the Adler-32 checksum of
+   seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
+*/
+
+ZEXTERN uLong Q_ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
+/*
+     Update a running CRC-32 with the bytes buf[0..len-1] and return the
+   updated CRC-32. If buf is NULL, this function returns the required initial
+   value for the for the crc. Pre- and post-conditioning (one's complement) is
+   performed within this function so it shouldn't be done by the application.
+   Usage example:
+
+     uLong crc = crc32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       crc = crc32(crc, buffer, length);
+     }
+     if (crc != original_crc) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+/*
+     Combine two CRC-32 check values into one.  For two sequences of bytes,
+   seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+   calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32
+   check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+   len2.
+*/
+
+
+                        /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int Q_ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+                                     const char *version, int stream_size));
+ZEXTERN int Q_ZEXPORT inflateInit_ OF((z_streamp strm,
+                                     const char *version, int stream_size));
+ZEXTERN int Q_ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
+                                      int windowBits, int memLevel,
+                                      int strategy, const char *version,
+                                      int stream_size));
+ZEXTERN int Q_ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
+                                      const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+                                         unsigned char FAR *window,
+                                         const char *version,
+                                         int stream_size));
+#define deflateInit(strm, level) \
+        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+                      (strategy),           ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+        inflateBackInit_((strm), (windowBits), (window), \
+        ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
+    struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN Q_ZEXPORT const char   * zError           OF((int));
+ZEXTERN int            Q_ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN Q_ZEXPORT const uLongf * get_crc_table    OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */
--- a/project_files/hedgewars.pro	Wed Sep 14 22:27:22 2011 +0200
+++ b/project_files/hedgewars.pro	Wed Sep 14 22:39:39 2011 +0200
@@ -4,6 +4,7 @@
 INCLUDEPATH += ../QTfrontend/
 INCLUDEPATH += /usr/local/include/SDL
 INCLUDEPATH += /usr/include/SDL
+INCLUDEPATH += ../misc/quazip/
 
 DESTDIR = .
 
@@ -64,7 +65,8 @@
     ../QTfrontend/pagegamestats.h \
     ../QTfrontend/HWApplication.h \
     ../QTfrontend/AbstractPage.h \
-    ../QTfrontend/themesmodel.h
+    ../QTfrontend/themesmodel.h \
+    ../QTfrontend/databrowser.h
 
 SOURCES += ../QTfrontend/SDLs.cpp ../QTfrontend/SquareLabel.cpp \
 	../QTfrontend/about.cpp ../QTfrontend/ammoSchemeModel.cpp \
@@ -115,7 +117,8 @@
     ../QTfrontend/pagegamestats.cpp \
     ../QTfrontend/pageplayrecord.cpp \
     ../QTfrontend/HWApplication.cpp \
-    ../QTfrontend/themesmodel.cpp
+    ../QTfrontend/themesmodel.cpp \
+    ../QTfrontend/databrowser.cpp
 
 win32 {
 	SOURCES += ../QTfrontend/xfire.cpp
@@ -148,6 +151,8 @@
 
 RESOURCES += ../QTfrontend/hedgewars.qrc
 
+LIBS += -L../misc/quazip -lquazip
+
 !macx {
         LIBS += -lSDL -lSDL_mixer
 } else {
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed
Binary file share/hedgewars/Data/Graphics/Flags/libya.png has changed
Binary file share/hedgewars/Data/Graphics/Flags/south_sudan.png has changed
Binary file share/hedgewars/Data/Graphics/Graves/Ghost.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Balrog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Blanka.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlankaToothless.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlueCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlueHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bob.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BrainSlug.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BrainSlugMouth.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bub.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bunny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Chunli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Cororon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Deer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Falcon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Gasmask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Geordi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreenCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreenHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreyHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Guile.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Honda.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ken.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/KirbyMask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Kululun.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ladle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Luigi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Mario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Moose.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/OrangeHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Pig.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PinkHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PrincessDaisy.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PrincessPeach.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Pumpkin_Hat.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PurpleHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/RedCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/RedHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ryu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Samus.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/SauceBoatSilver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Sonic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Teacup.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamHeadband.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Teapot.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Toad.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Vega.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Wario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/YellowCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/YellowHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/apple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ash.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/banana.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_bob.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_bub.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_cororon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_kululun.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/beaver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bobby.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bobby2v.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bushhider.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_blue.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_green.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_junior.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_red.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_team.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_yellow.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/charmander.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/chikorita.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/chuckl.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyclops.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/darthvader.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/diglett.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Ladle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_SauceBoatSilver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Teacup.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Teapot.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_apple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_banana.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_lemon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_pumpkin.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_blue.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_green.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_grey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_pink.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_purple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_red.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_team.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_yellow.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hogpharoah.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/jigglypuff.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/junior.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/knight.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/lemon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/link.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/lugia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/metalband.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mexicansunbrero.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mudkip.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mv_Spidey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mv_Venom.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Falcon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Kirby.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Link.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Samus.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/pikachu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_ash.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_charmander.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_chikorita.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_diglett.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_jigglypuff.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_lugia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_mudkip.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_pikachu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_slowpoke.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_squirtle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_voltorb.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/porkey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_2001O.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_2001Y.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_BrainSlug.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_BrainSlug2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_Geordi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_SparkssHelmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_swDarthvader.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_swStormtrooper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_balrog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_blanka.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_blankatoothless.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_chunli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_guile.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_honda.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_ken.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_ryu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_vega.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sheep.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/slowpoke.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_daisy.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_luigi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_mario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_peach.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_toad.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_wario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/snowhog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spcartman.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spidey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spkenny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spkyle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spstan.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/squirtle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sth_SonicClassic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/stormtrooper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/swordsmensquire.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_chen.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_marisa.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_patchouli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_remelia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_suwako.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_yukari.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/vampirichog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/venom.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/voltorb.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britmedic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britpthhelmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britsapper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier4.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier5.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertmedic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertofficer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertsapper1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertsapper2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_frenchww1gasmask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_frenchww1helmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww1helmet2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww1tankhelm.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww2medic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww2pith.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_grenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_plainpith.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_sovietcomrade1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_sovietcomrade2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier3.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Bat.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Beaver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Bunny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Deer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Hedgehog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Moose.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Pig.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Porkey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Sheep.png has changed
Binary file share/hedgewars/Data/Graphics/Molotov.png has changed
Binary file share/hedgewars/Data/Graphics/TARDIS.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Graphics/TARDIS.svg	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="602.30084"
+   height="985.60046"
+   id="svg2993"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="TARDIS.svg"
+   inkscape:export-filename="/home/nemo/hg/hedgewars/trunk/share/hedgewars/Data/Graphics/TARDIS.png"
+   inkscape:export-xdpi="7.1700001"
+   inkscape:export-ydpi="7.1700001">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1224"
+     inkscape:window-height="819"
+     id="namedview26"
+     showgrid="false"
+     inkscape:zoom="0.37737215"
+     inkscape:cx="376.41146"
+     inkscape:cy="253.45483"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2993" />
+  <defs
+     id="defs2995">
+    <linearGradient
+       id="linearGradient3989">
+      <stop
+         id="stop3991"
+         style="stop-color:#fafafa;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3993"
+         style="stop-color:#8b8b8b;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3828">
+      <stop
+         id="stop3830"
+         style="stop-color:#8b8b8b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3832"
+         style="stop-color:#fafafa;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="-1057.5507"
+       y1="191.91734"
+       x2="-1059.9078"
+       y2="-113.3521"
+       id="linearGradient3844"
+       xlink:href="#linearGradient3828"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="113.2114"
+       y1="152.75597"
+       x2="199.6232"
+       y2="-33.112103"
+       id="linearGradient3854"
+       xlink:href="#linearGradient3828"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="309.39694"
+       cy="13.796296"
+       r="3.9589372"
+       fx="309.39694"
+       fy="13.796296"
+       id="radialGradient8731"
+       xlink:href="#linearGradient3419-4"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3419-4">
+      <stop
+         id="stop3421-3"
+         style="stop-color:#0affff;stop-opacity:0.75083059"
+         offset="0" />
+      <stop
+         id="stop3423-8"
+         style="stop-color:#0affff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3828"
+       id="linearGradient3008"
+       gradientUnits="userSpaceOnUse"
+       x1="-1057.5507"
+       y1="191.91734"
+       x2="-1059.9078"
+       y2="-113.3521"
+       gradientTransform="matrix(0.93114557,0,0,0.89934391,1339.0116,154.19356)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3828"
+       id="linearGradient3011"
+       gradientUnits="userSpaceOnUse"
+       x1="113.2114"
+       y1="152.75597"
+       x2="199.6232"
+       y2="-33.112103"
+       gradientTransform="translate(-57.858835,37.069206)" />
+  </defs>
+  <metadata
+     id="metadata2998">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <path
+     inkscape:connector-curvature="0"
+     style="fill:#969696;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="path3775"
+     d="M 138.16503,984.23482 30.672801,927.20212 C 18.551737,922.91392 -0.596054,905.80425 0.554147,893.93247 l 1.916685,-741.22655 99.670338,62.43976 0.74684,724.2708 z"
+     sodipodi:nodetypes="ccccccc" />
+  <rect
+     style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="rect3001-8"
+     y="522.15204"
+     x="102.26261"
+     ry="49.543434"
+     height="463.24161"
+     width="499.75171" />
+  <path
+     inkscape:connector-curvature="0"
+     style="fill:url(#linearGradient3011);fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="path3846"
+     d="M 3.292803,152.15982 103.15132,214.97236 336.42687,0.85996 C 225.47858,-4.261508 82.644107,44.055874 3.292803,152.15982 z"
+     sodipodi:nodetypes="cccc" />
+  <path
+     inkscape:connector-curvature="0"
+     style="fill:url(#linearGradient3008);fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="path3836"
+     d="m 602.0764,242.39804 a 250.07911,241.53809 0 1 1 -500.15817,0 250.07911,241.53809 0 1 1 500.15817,0 z" />
+  <rect
+     style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="rect3001"
+     y="215.64488"
+     x="102.63232"
+     height="687.14258"
+     width="499.00977" />
+  <rect
+     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="rect3856"
+     y="283.32965"
+     x="159.90025"
+     ry="64.465645"
+     height="197.26489"
+     width="140.26874" />
+  <rect
+     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="rect3856-5"
+     y="283.32965"
+     x="397.28613"
+     ry="64.465645"
+     height="197.26489"
+     width="140.26874" />
+  <rect
+     style="fill:#e6e6e6;fill-opacity:1;stroke:#ff0000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     id="rect3997"
+     y="894.97705"
+     x="106.97141"
+     height="19.192898"
+     width="489.60989" />
+</svg>
Binary file share/hedgewars/Data/Graphics/TARDIS.xcf has changed
--- a/share/hedgewars/Data/Locale/cs.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/cs.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
       ["!!!"] = "!!!",
       ["..."] = "...",
       ["Accuracy Bonus!"] = "Bonus za přesnost!",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
       ["a Hedgewars mini-game"] = "Hedgewars mini-hra", -- Space_Invasion, The_Specialists
       ["Aiming Practice"] = "Trénink přesnosti", --Bazooka, Shotgun, SniperRifle
+      ["Ammo Depleted!"] = "Munice vyčerpána!",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
+      ["Ammo Maniac!"] = "Muniční maniak!",
       ["Ammo"] = "Munice",
-      ["Ammo Depleted!"] = "Munice vyčerpána!",
-      ["Ammo Maniac!"] = "Muniční maniak!",
       ["Available points remaining: "] = "Zbývá bodů:",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
       ["Bat balls at your enemies and|push them into the sea!"] = "Odpal míčky na své nepřátele|a odstrč je do vody!",
       ["Bat your opponents through the|baskets and out of the map!"] = "Odpal protivníky skrz|koše a pryč z mapy!",
       ["Bazooka Training"] = "Trénink s bazukou",
@@ -19,8 +26,10 @@
       ["BOOM!"] = "BUM!",
       ["Boss defeated!"] = "Velitel poražen!",
       ["Boss Slayer!"] = "Velitel zabit!",
+--      ["Build a track and race."] = "",
       ["CAPTURE THE FLAG"] = "ZAJMI VLAJKU",
       ["Careless"] = "Neopatrný",
+--      ["Change Weapon"] = "",
       ["Clumsy"] = "Nešikovný",
       ["Codename: Teamwork"] = "Krycí jméno: Týmová práce",
       ["Complete the track as fast as you can!"] = "Dokonči trasu tak rychle, jak můžeš!",
@@ -28,12 +37,14 @@
       ["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
       ["Control pillars to score points."] = "Obsaď všechny sloupy, abys dostal body.",
       ["Cybernetic Empire"] = "Kybernetická říše",
+      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ZATRACENĚ, ZELENÁČI! VYPADNI Z MOJI HLAVY!",
       ["DAMMIT, ROOKIE!"] = "ZATRACENĚ, ZELENÁČI!",
-      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ZATRACENĚ, ZELENÁČI! VYPADNI Z MOJI HLAVY!",
       ["Dangerous Ducklings"] = "Nebezpečná káčátka",
       ["Deadweight"] = "Mrtvá váha",
+--      ["Demolition is fun!"] = "",
       ["Depleted Kamikaze!"] = "Vyčerpaný sebevrah!",
       ["Destroy invaders to score points."] = "Znič nájezdníky k získání bodů.",
+--      ["Double Kill!"] = "",
       ["Drone Hunter!"] = "Lovec trubců!",
       ["Drowner"] = "Utopenec",
       ["Each turn you get 1-3 random weapons"] = "Každý tah dostaneš 1-3 náhodné zbraně",
@@ -42,8 +53,11 @@
       ["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 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 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",
+--      ["Energetic Engineer"] = "",
       ["Enjoy the swim..."] = "Užij si plavání...",
       ["[Enter]"] = "[Enter]",
       ["Fastest lap: "] = "Nejrychlejší kolo: ",
@@ -53,6 +67,9 @@
       ["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"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
       ["GAME BEGUN!!!"] = "HRA ZAČALA!!!",
       ["Game Modifiers: "] = "Herní modifikátory: ",
       ["GAME OVER!"] = "KONEC HRY!",
@@ -62,11 +79,15 @@
       ["GO! GO! GO!"] = "Běž! Běž! Běž!",
       ["Good birdy......"] = "Hodný ptáček......",
       ["Good luck out there!"] = "Hodně štěstí tam venku!",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
       ["GOTCHA!"] = "Mám tě!",
+--      ["Grab Mines/Explosives"] = "",
       ["Hahahaha!"] = "Hahahaha!",
       ["Haha, now THAT would be something!"] = "Haha, tak TOHLE bude něco!",
+      [" Hapless Hogs left!"] = "Nešťastný ježek odešel!",
       ["Hapless Hogs"] = "Nešťastný ježek",
-      [" Hapless Hogs left!"] = "Nešťastný ježek odešel!",
+--      ["Health crates extend your time."] = "",
       ["Heavy"] = "Těžký",
       ["Hedgewars-Basketball"] = "Hedgewars-Basketbal",
       ["Hedgewars-Knockball"] = "Hedgewars=Vybíjená",
@@ -80,19 +101,28 @@
       ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "To je dobře, že NÁHLÁ SMRT je 99 tahů vzdálená...",
       ["Jumping is disabled"] = "Skákání je vypnuto",
       ["Kamikaze Expert!"] = "Expert na sebevraždy!",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
       ["KILLS"] = "ÚLOVKY",
+--      ["Last Target!"] = "",
       ["[Left Shift]"] = "[Levý shift]",
       ["Listen up, maggot!!"] = "Poslouchej, bídný červe!!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
       ["|- Mines Time:"] = "|- Časovač min:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
       ["MISSION FAILED"] = "MISE NEÚSPĚŠNÁ", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+      ["MISSION SUCCESSFUL"] = "MISE ÚSPĚŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
       ["MISSION SUCCESS"] = "MISE ÚSPĚŠNÁ",
-      ["MISSION SUCCESSFUL"] = "MISE ÚSPĚŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
       ["Movement: [Up], [Down], [Left], [Right]"] = "Pohyb: [nahoru], [dolu], [vlevo], [vpravo]",
       ["Multi-shot!"] = "Vícenásobná rána!",
       ["Nameless Heroes"] = "Bezejmenní hrdinové",
+--      ["New Barrels Per Turn"] = "",
       ["NEW CLAN RECORD: "] = "NOVÝ KLANOVÝ REKORD: ",
       ["NEW fastest lap: "] = "NOVÉ nejrychlejší kolo: ",
+--      ["New Mines Per Turn"] = "",
       ["NEW RACE RECORD: "] = "NOVÝ TRAŤOVÝ REKORD: ",
+--      ["Newton's Hammock"] = "",
       ["NOT ENOUGH WAYPOINTS"] = "NEDOSTATEK NAVIGAČNÍCH BODŮ",
       ["Not So Friendly Match"] = "Ne moc přátelský zápas", -- Basketball, Knockball
       ["Oh no! Just try again!"] = "Ale ne! Prostě to zkus znovu!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,23 +130,28 @@
       ["Operation Diver"] = "Operace potápěč",
       ["Opposing Team: "] = "Protivníkův tým: ",
       ["Pathetic Hog #%d"] = "Žalostný ježek #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
       ["Per-Hog Ammo"] = "Individuální munice",
       ["Place more waypoints using [ENTER]"] = "Umísti více navigačních bodů pomocí klávesy [enter]",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
       ["points"] = "body", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
       ["Poison"] = "Otrava",
       ["Power Remaining"] = "Zbývající energie",
+--      ["Prepare yourself"] = "",
       ["Press [Precise] to skip intro"] = "Stiskni [přesnost] pro přeskočení",
       ["Race complexity limit reached."] = "Dosažen limit složitosti závodu.",
+--      ["RACER"] = "",
       [" - 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",
+--      ["Round Limit:"] = "",
       ["Round Limit"] = "Limit kol",
+--      ["Rounds Complete: "] = "",
       ["Rounds Complete"] = "Dokončených kol",
       ["RULES OF THE GAME [Press ESC to view]"] = "PRAVIDLA HRY [Stiskni ESC pro prohlédnutí]",
-      ["s|"] = "s|",
       ["Save as many hapless hogs as possible!"] = "Zachraň tolik nešťastných ježků, kolik jen můžeš!",
       ["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
       ["See ya!"] = "Uvidíme se!",
-      ["s"] = "s", -- GaudyRacer, Space_Invasion
+--      ["selected!"] = "",
       ["Shield boosted! +30 power"] = "Štít posílen! +30 energie",
       ["Shield Depleted"] = "Štít vyčerpán",
       ["Shield is fully recharged!"] = "Štít je plně dobit",
@@ -127,7 +162,7 @@
       ["Shield Seeker!"] = "Hledač štítů!",
       ["Shotgun Team"] = "Brokovnicový tým",
       ["Shotgun Training"] = "Trénink s brokovnicí",
-      ["Shots Left: "] = "Zbývá střel: ", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
       ["Silly"] = "Hloupý",
       ["Sinky"] = "Propadlý",
       ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s je venku a tým %d|má penaltu!| |Skóre:", -- Basketball, Knockball
@@ -136,6 +171,8 @@
       ["Sniperz"] = "Snajpři",
       ["Sponge"] = "Mycí houba",
       ["Spooky Tree"] = "Strašidelný strom",
+      ["s|"] = "s|",
+      ["s"] = "s", -- GaudyRacer, Space_Invasion
       ["STATUS UPDATE"] = "AKTUALIZACE STAVU", -- GaudyRacer, Space_Invasion
       ["Switched to "] = "Přepnut na ",
       ["Team %d: "] = "Tým %d: ",
@@ -146,26 +183,33 @@
       ["The flag will respawn next round."] = "Vlajka se obnoví příští kolo.",
       ["The Nameless One"] = "Bezejmenný",
       ["THE SPECIALISTS"] = "SPECIALISTÉ",
+--      ["This one's tricky."] = "",
       ["This rain is really something..."] = "Tenhle déšť je opravdu něco...",
       ["TIME: "] = "ČAS: ",
       ["Timed Kamikaze!"] = "Časovaná sebevražda!",
       ["Time Extended!"] = "Čas prodloužen!",
-      ["Time Left: "] = "Zbývá času: ",
+--      ["Time Extension"] = "",
       ["Toggle Shield"] = "Přepnout štít",
       ["Toxic Team"] = "Jedovatý tým", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
       ["TRACK COMPLETED"] = "TRASA KOMPLETNÍ",
-      ["Track Time: "] = "Čas na trati: ",
+--      ["TRACK FAILED!"] = "",
       ["TrophyRace"] = "Závod o trofej",
       ["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
       ["Turn Time"] = "Čas kola",
+--      ["Unit"] = "",
       ["Unit 3378"] = "Jednotka 3378",
+--      ["Unit 835"] = "",
       ["Unlimited Attacks"] = "Neomezeně útoků",
+--      ["Unstoppable!"] = "",
       ["User Challenge"] = "Výzva",
       ["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íš!",
-      ["v.06"] = "v.06",
       ["Victory for the "] = "Vítězství pro ", -- CTF_Blizzard, Capture_the_Flag
       ["Waypoint placed."] = "Navigační bod umístěn.",
+--      ["Way-Points Remaining"] = "",
       ["Weapons Reset"] = "Zbraně obnoveny",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
       ["WINNING TIME: "] = "VÍTĚZNÝ ČAS: ",
       ["You'd almost swear the water was rising!"] = "Přísahal bys, že voda stoupá!",
       ["You have SCORED!!"] = "SKÓROVAL jsi!!",
--- a/share/hedgewars/Data/Locale/de.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/de.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -2,132 +2,170 @@
 --      [":("] = "",
 --      ["!!!"] = "",
 --      ["..."] = "",
---      ["Accuracy Bonus!"] = "",
---      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
+    ["Accuracy Bonus!"] = "Präzisions-Bonus!",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+	["a Hedgewars mini-game"] = "ein Hedgewars Mini-Spiel", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Zielübung", --Bazooka, Shotgun, SniperRifle
---      ["Ammo"] = "",
---      ["Ammo Depleted!"] = "",
---      ["Ammo Maniac!"] = "",
---      ["Available points remaining: "] = "",
+	["Ammo Depleted!"] = "Munition erschöpft!",
+--      ["ammo extended!"] = "",
+	["Ammo is reset at the end of your turn."] = "Munition wird am Ende des Spielzuges zurückgesetzt.",
+	["Ammo Maniac!"] = "Munitionsverrückter!",
+	["Ammo"] = "Munition",
+	["Available points remaining: "] = "Verfügbare Punkte verbleibend:",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+	["Barrel Eater!"] = "Fassfresser!",
+	["Barrel Launcher"] = "Fasswerfer",
 	["Bat balls at your enemies and|push them into the sea!"] = "Schlage Bälle auf deine Widersacher|und lass sie ins Meer fallen!",
 	["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",
---	["Best laps per team: "] = "",
---      ["Best Team Times: "] = "",
---      ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
---      ["Boom!"] = "",
---      ["BOOM!"] = "",
---      ["Boss defeated!"] = "",
---      ["Boss Slayer!"] = "",
---      ["CAPTURE THE FLAG"] = "",
---      ["Careless"] = "",
---      ["Clumsy"] = "",
---      ["Codename: Teamwork"] = "",
---      ["Complete the track as fast as you can!"] = "",
---      ["Congratulations!"] = "",
+	["Best laps per team: "] = "Beste Rundenzeiten pro Team: ",
+	["Best Team Times: "] = "Besten Team-Zeiten: ",
+	["Bloody Rookies"] = "Blutige Anfänger", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+	["Boom!"] = "Bumm!",
+	["BOOM!"] = "KABUMM!",
+	["Boss defeated!"] = "Boss wurde besiegt!",
+	["Boss Slayer!"] = "Boss-Töter!",
+--      ["Build a track and race."] = "",
+	["CAPTURE THE FLAG"] = "EROBERE DIE FAHNE",
+	["Careless"] = "Achtlos",
+	["Change Weapon"] = "Waffenwechsel",
+	["Clumsy"] = "Ungeschickt",
+	["Codename: Teamwork"] = "Code-Name: Teamwork",
+	["Complete the track as fast as you can!"] = "Durchlaufe die Strecke so schnell du kannst!",
+	["Congratulations!"] = "Gratulation!",
 	["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulation! Du hast alle Ziele innerhalb der|verfügbaren Zeit ausgeschaltet.", --Bazooka, Shotgun, SniperRifle
---      ["Control pillars to score points."] = "",
---      ["Cybernetic Empire"] = "",
---      ["DAMMIT, ROOKIE!"] = "",
---      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
+	["Control pillars to score points."] = "Kontrolliere die Säulen um Punkte zu erhalten.",
+	["Cybernetic Empire"] = "Kybernetisches Imperium",
+	["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "VERDAMMT, REKRUT! RUNTER VON MEINEM KOPF!",
+	["DAMMIT, ROOKIE!"] = "VERDAMMT, REKRUT!",
 --      ["Dangerous Ducklings"] = "",
---      ["Deadweight"] = "",
---      ["Depleted Kamikaze!"] = "",
---      ["Destroy invaders to score points."] = "",
+	["Deadweight"] = "Leergewicht",
+	["Demolition is fun!"] = "Zerstörung macht Spaß!",
+	["Depleted Kamikaze!"] = "Munitionsloses Kamikaze!",
+	["Destroy invaders to score points."] = "Zerstöre die Angreifer um Punkte zu erhalten.",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
---      ["Each turn you get 1-3 random weapons"] = "",
---      ["Each turn you get one random weapon"] = "",
---      ["Eliminate all enemies"] = "",
+	["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.",
+	["Eliminate all enemies"] = "Vernichte alle Gegner",
 	["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.", --Bazooka, Shotgun, SniperRifle
 --      ["Eliminate Poison before the time runs out"] = "",
---      ["Eliminate the Blue Team"] = "",
+	["Eliminate the Blue Team"] = "Lösche das Blaue Team aus",
+--      ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+--      ["Eliminate the enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
---      ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
---      ["Enjoy the swim..."] = "",
+	["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Vernichte Einheit 3378 |  Kraftloser Widerstand muss überleben",
+--      ["Energetic Engineer"] = "",
+	["Enjoy the swim..."] = "Viel Spaß beim Schwimmen...",
 --      ["[Enter]"] = "",
---	["Fastest lap: "] = "",
---      ["Feeble Resistance"] = "",
---      ["Fire"] = "",
---      ["Flag captured!"] = "",
---      ["Flag respawned!"] = "",
---      ["Flag returned!"] = "",
---      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
---      ["GAME BEGUN!!!"] = "",
+	["Fastest lap: "] = "Schnellste Runde: ",
+	["Feeble Resistance"] = "Kraftloser Widerstand",
+	["Fire"] = "Feuer",
+	["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"] = "",
+--      ["Friendly Fire!"] = "",
+	["fuel extended!"] = "Treibstoff aus!",
+	["GAME BEGUN!!!"] = "SPIEL GESTARTET!!!",
 --      ["Game Modifiers: "] = "",
---      ["GAME OVER!"] = "",
---      ["Game Started!"] = "",
---      ["Get on over there and take him out!"] = "",
---      ["Goal"] = "",
---      ["GO! GO! GO!"] = "",
---      ["Good birdy......"] = "",
---      ["Good luck out there!"] = "",
---      ["GOTCHA!"] = "",
+	["GAME OVER!"] = "SPIEL ZU ENDE!",
+	["Game Started!"] = "Spiel Gestartet!]",
+	["Get on over there and take him out!"] = "Mach, dass du hinüber kommst und schalte ihn aus!",
+	["Goal"] = "Ziel",
+	["GO! GO! GO!"] = "Bewegung, Bewegung, Bewegung!",
+	["Good birdy......"] = "Braver Vogel......",
+	["Good luck out there!"] = "Viel Glück da draußen!",
+	["Good so far!"] = "Gut soweit!",
+	["Good to go!"] = "Startklar!",
+	["GOTCHA!"] = "ERWISCHT!",
+	["Grab Mines/Explosives"] = "Sammle Minen/Fässer",
 --      ["Hahahaha!"] = "",
---      ["Haha, now THAT would be something!"] = "",
---      ["Hapless Hogs"] = "",
---      [" Hapless Hogs left!"] = "",
+	["Haha, now THAT would be something!"] = "Haha, na DAS wär ja was!",
+	["Hapless Hogs"] = "Glücklose Igel",
+	[" Hapless Hogs left!"] = " Glücklose Igel verbleibend!",
+	["Health crates extend your time."] = "Medipacks verlängern deine Zeit.",
 --      ["Heavy"] = "",
 	["Hedgewars-Basketball"] = "Hedgewars-Basketball",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
---      ["Heh, it's not that bad."] = "",
+	["Heh, it's not that bad."] = "Hehe, so schlimm ist es nicht.",
 --      ["Hit Combo!"] = "",
 --      ["Hmmm..."] = "",
---      ["Hooray!"] = "",
+	["Hooray!"] = "Hurra!",
 	["Hunter"] = "Jäger", --Bazooka, Shotgun, SniperRifle
---      ["Instructor"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
---      ["invaders destroyed"] = "",
---      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
---      ["Jumping is disabled"] = "",
---      ["Kamikaze Expert!"] = "",
+	["Instructor"] = "Ausbilder", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
+	["invaders destroyed"] = "Angreifer zerstört",
+	["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Gut, dass SUDDEN DEATH noch 99 Runden entfernt ist...",
+	["Jumping is disabled"] = "Sprünge sind deaktiviert!",
+	["Kamikaze Expert!"] = "Kamikazeexperte!",
+	["Keep it up!"] = "Weiter so!",
+	["Killing spree!"] = "Blutrausch!",
 --      ["KILLS"] = "",
+	["Last Target!"] = "Letzte Zielscheibe!",
 --      ["[Left Shift]"] = "",
---      ["Listen up, maggot!!"] = "",
---      ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["MISSION SUCCESS"] = "",
---      ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["Movement: [Up], [Down], [Left], [Right]"] = "",
+	["Listen up, maggot!!"] = "Aufgepasst, du Made!!",
+--      ["Lively Lifeguard"] = "",
+	["Mine Deployer"] = "Minenleger",
+	["Mine Eater!"] = "Minenfresser!",
+	["|- Mines Time:"] = "| - Minenzündzeit: ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+	["MISSION FAILED"] = "MISSION GESCHEITERT", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+	["MISSION SUCCESSFUL"] = "MISSION ERFOLGREICH", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+	["MISSION SUCCESS"] = "MISSIONSERFOLG",
+	["Movement: [Up], [Down], [Left], [Right]"] = "Bewegung: [Hoch], [Runter], [Links], [Rechts]",
 --      ["Multi-shot!"] = "",
---      ["Nameless Heroes"] = "",
---      ["NEW CLAN RECORD: "] = "",
---	["NEW fastest lap: "] = "",
---      ["NEW RACE RECORD: "] = "",
---      ["NOT ENOUGH WAYPOINTS"] = "",
+	["Munition!"] = "Munition erschöpft!",
+	["Nameless Heroes"] = "Namenlose Helden",
+	["New Barrels Per Turn"] = "Neue Fässer jede Runde",
+	["NEW CLAN RECORD: "] = "NEUER KLAN-REKORD",
+	["NEW fastest lap: "] = "NEUE schnellste Runde: ",
+	["New Mines Per Turn"] = "Neue Minen jede Runde",
+	["NEW RACE RECORD: "] = "NEUER RENNREKORD: ",
+--      ["Newton's Hammock"] = "",
+	["NOT ENOUGH WAYPOINTS"] = "NICHT GENUG WEGPUNKTE",
 	["Not So Friendly Match"] = "Kein-so-Freundschaftsspiel", -- Basketball, Knockball
 --      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["Oh no! Time's up! Just try again."] = "Oh nein! Die Zeit ist um! Versuche es nochmal.", --Bazooka, Shotgun, SniperRifle
 --      ["Operation Diver"] = "",
---      ["Opposing Team: "] = "",
+	["Opposing Team: "] = "Gegnerisches Team: ",
 --      ["Pathetic Hog #%d"] = "",
---      ["Per-Hog Ammo"] = "",
---      ["Place more waypoints using [ENTER]"] = "",
---      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
---      ["Poison"] = "",
---      ["Power Remaining"] = "",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+	["Per-Hog Ammo"] = "Munition pro Igel",
+	["Place more waypoints using [ENTER]"] = "Setze mehr Wegpunkte durch Drücken von [ENTER]",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
+	["points"] = "Punkte", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+	["Poison"] = "Gift",
+	["Power Remaining"] = "Verbleibende Energie",
+	["Prepare yourself"] = "Mach dich bereit",
 --      ["Press [Precise] to skip intro"] = "",
---      ["Race complexity limit reached."] = "",
+	["Race complexity limit reached."] = "Rennkomplexitätslimit erreicht.",
+--      ["RACER"] = "",
 --      [" - 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"] = "",
---      ["Round Limit"] = "",
---      ["Rounds Complete"] = "",
---      ["RULES OF THE GAME [Press ESC to view]"] = "",
+--      ["Round Limit:"] = "",
+	["Round Limit"] = "Rundenbegrenzung",
+--      ["Rounds Complete: "] = "",
+	["Rounds Complete"] = "Runden Gespielt",
+	["RULES OF THE GAME [Press ESC to view]"] = "SPIEL REGELN (Drücke ESC zum Anzeigen)",
 --      ["s|"] = "",
---      ["Save as many hapless hogs as possible!"] = "",
+	["Save as many hapless hogs as possible!"] = "Rette so viele glücklose Igel als möglich!",
 --      ["SCORE"] = "",
 --      ["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
---      ["See ya!"] = "",
+	["See ya!"] = "Mach's gut!",
+	["selected!"] = "ausgewählt!",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
---      ["Shield boosted! +30 power"] = "",
---      ["Shield Depleted"] = "",
---      ["Shield is fully recharged!"] = "",
---      ["Shield Master!"] = "",
---      ["Shield Miser!"] = "",
---      ["Shield OFF:"] = "",
---      ["Shield ON:"] = "",
---      ["Shield Seeker!"] = "",
-	["Shotgun Team"] = "Entrenamiento con escopeta",
+	["Shield boosted! +30 power"] = "Schild verstärkt! +30 Energie",
+	["Shield Depleted"] = "Schild aufgebraucht!",
+	["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!",
+	["Shotgun Team"] = "Schrotflinten-Team",
 	["Shotgun Training"] = "Schrotflinten-Training",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+	["shots remaining."] = "Schüsse übrig",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 	["%s is out and Team %d|scored a penalty!| |Score:"] = "%s ist draußen und Team %d|erhält eine Strafe!| |Punktestand:", -- Basketball, Knockball
@@ -141,36 +179,44 @@
 --	["Team %d: "] = "",
 --      ["Team Scores"] = "", -- Control, Space_Invasion
 --      ["That Sinking Feeling"] = "",
---      ["That was pointless."] = "",
---      ["The enemy is hiding out on yonder ducky!"] = "",
---      ["The flag will respawn next round."] = "",
---      ["The Nameless One"] = "",
---      ["THE SPECIALISTS"] = "",
---      ["This rain is really something..."] = "",
---      ["TIME: "] = "",
---      ["Timed Kamikaze!"] = "",
---      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
---      ["Toggle Shield"] = "",
+	["That was pointless."] = "Das war sinnlos.",
+	["The enemy is hiding out on yonder ducky!"] = "Der Feind versteckt sich auf dem Entlein dort drüben!",
+	["The flag will respawn next round."] = "Die Fahne wird nächste Runde wieder auftauchen.",
+	["The Nameless One"] = "Der Namenlose",
+	["THE SPECIALISTS"] = "DIE SPEZIALISTEN",
+	["This one's tricky."] = "Der hier ist knifflig.",
+	["This rain is really something..."] = "Das nenne ich mal einen Regenschauer...",
+	["Timed Kamikaze!"] = "Pünktliches Kamikaze!",
+	["Time Extended!"] = "Zeit verlängert!",
+	["Time Extension"] = "Zeitverlängerung",
+	["Time Left: "] = "Verbleibende Zeit",
+	["TIME: "] = "ZEIT: ",
+	["Toggle Shield"] = "Schild ein/aus",
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 --	["TrophyRace"] = "",
 --      ["T_T"] = "",
---      ["Turn Time"] = "",
---      ["Unit 3378"] = "",
---      ["Unlimited Attacks"] = "",
+	["Tumbling Time Extended!"] = "Purzelzeit verlängert!",
+	["Turn Time"] = "Zeit pro Zug",
+	["Unit 3378"] = "Einheit 3378",
+	["Unit 835"] = "Einheit 3378",
+	["Unit"] = "Einheit",
+	["Unlimited Attacks"] = "Unbegrenzte Angriffe",
+	["Unstoppable!"] = "Unaufhaltbar!",
 --      ["User Challenge"] = "",
---	["Use your rope to get from start to finish as fast as you can!"] = "",
---      ["v.06"] = "",
---      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
---      ["Waypoint placed."] = "",
+	["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!",
+	["Victory for the "] = "Sieg für ", -- CTF_Blizzard, Capture_the_Flag
+	["Waypoint placed."] = "Wegpunkt gesetzt",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
---      ["WINNING TIME: "] = "",
---      ["You'd almost swear the water was rising!"] = "",
---      ["You have SCORED!!"] = "",
---      ["You saved"] = "",
---      ["You've failed. Try again."] = "",
---	["You've reached the goal!| |Time: "] = "",
+	["Well done."] = "Gut gemacht.",
+	["Will this ever end?"] = "Wird dies je enden?",
+	["WINNING TIME: "] = "SIEGESZEIT: ",
+	["You'd almost swear the water was rising!"] = "Man könnte fast schwören das Wasser würde steigen!",
+	["You have SCORED!!"] = "Du hast GEPUNKTET!",
+	["You saved"] = "Gerettet: ",
+	["You've failed. Try again."] = "Du bist gescheitert. Versuche es nochmal.",
+	["You've reached the goal!| |Time: "] = "Ziel erreicht!| |Zeit: ",
 	["'Zooka Team"] = "Die Knalltüten",
     }
--- a/share/hedgewars/Data/Locale/en.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/en.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -53,7 +53,7 @@
 00:50=Drill Strike
 00:51=Mudball
 00:52=No weapon selected
-00:53=TARDIS
+00:53=TimeBox
 00:54=Structure
 00:55=Land Spray
 
@@ -448,6 +448,7 @@
 03:52=UNUSED
 03:53=Type 40
 03:54=Build something
+03:55=Utility
 
 ; Weapon Descriptions (use | as line breaks)
 04:00=Attack your enemies using a simple grenade.|It will explode once its timer reaches zero.|1-5: Set grenade's timer|Attack: Hold to throw with more power
@@ -500,6 +501,12 @@
 04:47=Double the fun with two spiky, sneaky, sticky mines.|Set up a chain reaction or defend yourself (or both!)|Attack: Hold to shoot with more power (twice)
 04:48=Why should the moles get all the abuse?|Wacking a hog can be just as fun! A good|blow from this hammer will shave off one|third of a hog's health and plunge them|underground.|Attack: Activate
 04:49=Resurrect your friends!|But beware that this also resurrects your foes.|Attack: Keep attack pressed to resurrect slowly|Up: Accelerate resurrection
+04:50=Is someone hiding underground?|Dig them out with a drill strike!|Timer controls how far it will dig.
+04:51=Get in a free shot in by hurling a ball of mud.|Stings a bit, and knocks hogs back.
+04:52=UNUSED
+04:53=Go on an adventure 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.
+04:54=INCOMPLETE                                                                                                                                     
+04:55=Spray a stream of sticky flakes.|Build bridges, bury enemies, seal off tunnels.|Be careful you don't get any on you!
 
 ; Game goal strings
 05:00=Game Modes
--- a/share/hedgewars/Data/Locale/es.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/es.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
 	[":("] = ":(",
 	["!!!"] = "!!!",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Practica tu puntería", --Bazooka, Shotgun, SniperRifle
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 	["Bat balls at your enemies and|push them into the sea!"] = "¡Batea pelotas hacia tus enemigos|y hazlos caer al agua!",
 	["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 Training"] = "Entrenamiento con bazuca",
@@ -19,8 +26,10 @@
 --      ["BOOM!"] = "",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
 	["CAPTURE THE FLAG"] = "Capturar la bandera",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
 	["Codename: Teamwork"] = "Nombre en clave: Trabajo en equipo",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
 	["DAMMIT, ROOKIE!"] = "¡MALDITA SEA, RECLUTA!",
 	["Dangerous Ducklings"] = "Patitos peligrosos",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 	["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 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"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+--      ["Eliminate the enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
 	["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Elimina a la Unidad 3378 |- Resustencia Fútil debe sobrevivir",
+--      ["Energetic Engineer"] = "",
 	["Enjoy the swim..."] = "Disfruta del baño...",
 --      ["[Enter]"] = "",
 	["Fastest lap: "] = "Vuelta rápida: ",
@@ -53,6 +67,9 @@
 	["Flag respawned!"] = "¡Bandera restablecida!",
 	["Flag returned!"] = "¡Bandera recuperada!",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
 	["GAME OVER!"] = "¡FIN DEL JUEGO!",
@@ -62,11 +79,15 @@
 	["GO! GO! GO!"] = "¡VAMOS! ¡VAMOS! ¡VAMOS!",
 	["Good birdy......"] = "Buen pajarito......",
 	["Good luck out there!"] = "¡Buena suerte!",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 	["Hedgewars-Basketball"] = "Hedgewars-Baloncesto",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
 	["Listen up, maggot!!"] = "¡Atento, escoria!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 --      ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION FAILED"] = "MISIÓN FALLIDA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 	["NEW fastest lap: "] = "NUEVA vuelta rápida: ",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 	["Not So Friendly Match"] = "Partido no-tan-amistoso", -- Basketball, Knockball
 	["Oh no! Just try again!"] = "¡Oh, no! ¿Por qué no lo intentas de nuevo?", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 	["Operation Diver"] = "Buzo",
 	["Opposing Team: "] = "Equipo enemigo: ",
 	["Pathetic Hog #%d"] = "Erizo patético #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 	["Poison"] = "Veneno",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 	[" - 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",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
 --      ["RULES OF THE GAME [Press ESC to view]"] = "",
 	["RULES OF THE GAME [Press ESC to view]"] = "REGLAS DEL JUEGO (Presiona ESC para leerlas)",
@@ -117,6 +153,7 @@
 --      ["SCORE"] = "",
 --      ["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
 	["See ya!"] = "¡Hasta otra!",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -128,7 +165,7 @@
 --      ["Shield Seeker!"] = "",
 	["Shotgun Team"] = "Escopeteros",
 	["Shotgun Training"] = "Entrenamiento con escopeta",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 	["%s is out and Team %d|scored a penalty!| |Score:"] = "¡%s cayó y Equipo %d|anotó una falta!| |Puntuación:", -- Basketball, Knockball
@@ -147,26 +184,33 @@
 --      ["The flag will respawn next round."] = "",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
 	["Toxic Team"] = "Tóxicos", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 	["TrophyRace"] = "TrophyRace",
 	["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
 	["Unit 3378"] = "Unidad 3378",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 	["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!",
---      ["v.06"] = "",
 	["Victory for the "] = "La victoria es para", -- CTF_Blizzard, Capture_the_Flag
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
 	["You have SCORED!!"] = "¡Has anotado!",
--- a/share/hedgewars/Data/Locale/fr.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/fr.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
 --      ["!!!"] = "",
 --      ["..."] = "",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
       ["Aiming Practice"] = "Entrainement de tir", --Bazooka, Shotgun, SniperRifle
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
       ["Bat balls at your enemies and|push them into the sea!"] = "Frappez vos ennemis à la batte|et envoyez-les à la mer !",
       ["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 Training"] = "Entrainement au Bazooka",
@@ -19,8 +26,10 @@
 --      ["BOOM!"] = "",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
       ["CAPTURE THE FLAG"] = "Capturez le drapeau !",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
       ["Codename: Teamwork"] = "Nom de code : Travail d'équipe",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
       ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "Et merde, recrue ! Dégage de me tête !",
       ["Dangerous Ducklings"] = "Canetons dangereux",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
       ["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 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"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+--      ["Eliminate the enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
       ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "Éliminez l'unité 3378|- Résistance Futile doit survivre",
+--      ["Energetic Engineer"] = "",
       ["Enjoy the swim..."] = "Profitez du bain ...",
 --      ["[Enter]"] = "",
       ["Fastest lap: "] = "Meilleur tour : ",
@@ -53,6 +67,9 @@
       ["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."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
       ["GAME OVER!"] = "Fin du jeu ! ",
@@ -62,11 +79,15 @@
 --      ["GO! GO! GO!"] = "",
       ["Good birdy......"] = "Gentil oiseau ...",
       ["Good luck out there!"] = "Bonne chance pour sortir d'ici",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 --      ["Hedgewars-Basketball"] = "",
 --      ["Hedgewars-Knockball"] = "",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
       ["Listen up, maggot!!"] = "Écoutez, asticots",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 --      ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
       ["MISSION FAILED"] = "Mission échouée", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
       ["NEW fastest lap: "] = "Nouveau meilleur temps",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
       ["Not So Friendly Match"] = "Match pas si amical", -- Basketball, Knockball
       ["Oh no! Just try again!"] = "Eh non ! Essayez encore ! ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 --      ["Operation Diver"] = "",
       ["Opposing Team: "] = "Équipe opposée",
       ["Pathetic Hog #%d"] = "Hérisson pathétique #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
       ["points"] = "points", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
       ["Poison"] = "Poison",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
       [" - 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 à 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",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
       ["RULES OF THE GAME [Press ESC to view]"] = "RÈGLES DU JEU | [Appuyez Échap pour voir]",
 --      ["s|"] = "",
@@ -116,6 +152,7 @@
 --      ["SCORE"] = "",
 --      ["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
       ["See ya!"] = "Bye bye",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
 --      ["Shield Seeker!"] = "",
       ["Shotgun Team"] = "Équipe de choc",
       ["Shotgun Training"] = "Entrainement au fusil",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
       ["%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
@@ -146,26 +183,33 @@
       ["The flag will respawn next round."] = "Le drapeau va réapparaitre au prochain tour",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
       ["Toxic Team"] = "Équipe toxique", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 --      ["TrophyRace"] = "",
 --      ["T_T"] = "",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
       ["Unit 3378"] = "Unité 3378",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
       ["Use your rope to get from start to finish as fast as you can!"] = "Utilisez votre Corde Ninja pour aller du début à la fin aussi vite que vous pouvez !",
---      ["v.06"] = "",
       ["Victory for the "] = "Victoire pour ", -- CTF_Blizzard, Capture_the_Flag
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
       ["You have SCORED!!"] = "Vous avez marqué !",
--- a/share/hedgewars/Data/Locale/hedgewars_de.ts	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_de.ts	Wed Sep 14 22:39:39 2011 +0200
@@ -359,30 +359,30 @@
     </message>
     <message>
         <source>Cancel</source>
-        <translation type="unfinished">Abbrechen</translation>
+        <translation>Abbrechen</translation>
     </message>
 </context>
 <context>
     <name>PageDrawMap</name>
     <message>
         <source>Undo</source>
-        <translation type="unfinished"></translation>
+        <translation>Rückgängig</translation>
     </message>
     <message>
         <source>Clear</source>
-        <translation type="unfinished"></translation>
+        <translation>Löschen</translation>
     </message>
     <message>
         <source>Load</source>
-        <translation type="unfinished">Laden</translation>
+        <translation>Laden</translation>
     </message>
     <message>
         <source>Save</source>
-        <translation type="unfinished"></translation>
+        <translation>Sichern</translation>
     </message>
     <message>
         <source>Load drawn map</source>
-        <translation type="unfinished"></translation>
+        <translation>Gezeichnete Karte laden</translation>
     </message>
     <message>
         <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
@@ -390,7 +390,7 @@
     </message>
     <message>
         <source>Save drawn map</source>
-        <translation type="unfinished"></translation>
+        <translation>Gezeichnete Karte sichern</translation>
     </message>
 </context>
 <context>
@@ -1351,7 +1351,7 @@
     </message>
     <message>
         <source>hand drawn map...</source>
-        <translation type="unfinished"></translation>
+        <translation>Handgezeichnete Karte</translation>
     </message>
     <message>
         <source>Disabled</source>
--- a/share/hedgewars/Data/Locale/hedgewars_lt.ts	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_lt.ts	Wed Sep 14 22:39:39 2011 +0200
@@ -153,7 +153,7 @@
     <message>
         <location filename="../../../../QTfrontend/game.cpp" line="311"/>
         <source>en.txt</source>
-        <translation type="unfinished"></translation>
+        <translation>lt.txt</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/game.cpp" line="329"/>
--- a/share/hedgewars/Data/Locale/hedgewars_pl.ts	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts	Wed Sep 14 22:39:39 2011 +0200
@@ -16,15 +16,15 @@
     <name>DrawMapWidget</name>
     <message>
         <source>File error</source>
-        <translation type="unfinished">Błąd pliku</translation>
+        <translation>Błąd pliku</translation>
     </message>
     <message>
         <source>Cannot open file &apos;%1&apos; for writing</source>
-        <translation type="unfinished">Nie można otworzyć &apos;%1&apos; do zapisu</translation>
+        <translation>Nie można otworzyć &apos;%1&apos; do zapisu</translation>
     </message>
     <message>
         <source>Cannot read file &apos;%1&apos;</source>
-        <translation type="unfinished">Nie można odczytać pliku &apos;%1&apos;</translation>
+        <translation>Nie można odczytać pliku &apos;%1&apos;</translation>
     </message>
 </context>
 <context>
@@ -128,6 +128,14 @@
         <comment>File Types</comment>
         <translation>Zapisana gra</translation>
     </message>
+    <message>
+        <source>Demo name</source>
+        <translation type="unfinished">Nazwa demo</translation>
+    </message>
+    <message>
+        <source>Demo name:</source>
+        <translation type="unfinished">Nazwa demo:</translation>
+    </message>
 </context>
 <context>
     <name>HWGame</name>
@@ -298,14 +306,17 @@
     </message>
     <message>
         <source>Nickname</source>
-        <translation type="unfinished">Nick</translation>
+        <translation>Nick</translation>
     </message>
     <message>
         <source>Some one already uses
  your nickname %1
 on the server.
 Please pick another nickname:</source>
-        <translation type="unfinished"></translation>
+        <translation>Ktoś właśnie używa
+tego nicku %1
+na serwerze.
+Przoszę wybrać nowy nick:</translation>
     </message>
 </context>
 <context>
@@ -362,7 +373,7 @@
     </message>
     <message>
         <source>Cancel</source>
-        <translation type="unfinished">Anuluj</translation>
+        <translation>Anuluj</translation>
     </message>
 </context>
 <context>
@@ -516,7 +527,7 @@
     <message>
         <source>Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.</source>
         <comment>Tips</comment>
-        <translation>Niektóre z broni zadają mało punktów obrażeń jednak użyte w odpowiednim momencie mogą pokazać swój pazur. Na przykład spróbuj użyć pistoletu do strącania swoich przeciwników do wody.</translation>
+        <translation type="unfinished">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.</translation>
     </message>
     <message>
         <source>If you&apos;re unsure what to do and don&apos;t want to waste ammo, skip one round. But don&apos;t let too much time pass as there will be Sudden Death!</source>
@@ -561,17 +572,17 @@
     <message>
         <source>From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.</source>
         <comment>Tips</comment>
-        <translation>Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane  z wyprzedzeniem na http://www.hedgewars.org/ .</translation>
+        <translation type="unfinished">Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane z wyprzedzeniem na http://www.hedgewars.org/ .</translation>
     </message>
     <message>
         <source>Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!</source>
         <comment>Tips</comment>
-        <translation>Hedgewars jest dostępne w wielu językach. Jeśli brakuje tłumaczenia w twoim języku bądź jest ono wybrakowane, nie bój się z nami skontaktować!</translation>
+        <translation type="unfinished">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ć!</translation>
     </message>
     <message>
         <source>Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.</source>
         <comment>Tips</comment>
-        <translation>Hedgewars może być uruchomione na różnych systemach operacyjnych takich jak Microsoft Windows, MacOS X oraz Linux.</translation>
+        <translation type="unfinished">Hedgewars może być uruchomione na różnych systemach operacyjnych takich jak Microsoft Windows, MacOS X, FreeBSD oraz Linux.</translation>
     </message>
     <message>
         <source>Always remember you&apos;re able to set up your own games in local and network/online play. You&apos;re not restricted to the &apos;Simple Game&apos; option.</source>
@@ -606,7 +617,7 @@
     <message>
         <source>Especially while playing online be polite and always remember there might be some minors playing with or against you as well!</source>
         <comment>Tips</comment>
-        <translation>Bądź kulturalny grając w internecie oraz pamiętaj o tym, że w Hedgewars mogą grać także młodsze osoby!</translation>
+        <translation type="unfinished">Bądź kulturalny grając przez internet. Pamiętaj o tym, że w Hedgewars mogą grać także młodsze osoby!</translation>
     </message>
     <message>
         <source>Special game modes such as &apos;Vampirism&apos; or &apos;Karma&apos; allow you to develop completely new tactics. Try them in a custom game!</source>
@@ -646,7 +657,7 @@
     <message>
         <source>Connect one or more gamepads before starting the game to be able to assign their controls to your teams.</source>
         <comment>Tips</comment>
-        <translation>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.</translation>
+        <translation type="unfinished">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.</translation>
     </message>
     <message>
         <source>Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.</source>
@@ -761,12 +772,12 @@
     <message>
         <source>You&apos;re able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.</source>
         <comment>Tips</comment>
-        <translation>Możesz powiązać typy plików związane z Hedgewars (zapisy gier i dema) by móc je uruchamiać potem bezpośrednio z ulubionego menedżera plików bądź przeglądarki internetowej.</translation>
+        <translation type="unfinished">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.</translation>
     </message>
     <message>
         <source>Want to save ropes? Release the rope in mid air and then shoot again. As long as you don&apos;t touch the ground you&apos;ll reuse your rope without wasting ammo!</source>
         <comment>Tips</comment>
-        <translation>Chcesz zaoszczędzić liny? Odłącz ją będąc w powietrzu, a potem wypuść ją ponownie. Tak długo jak nie dotkniesz ziemi, będziesz używał pojedynczego naboju!</translation>
+        <translation type="unfinished">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!</translation>
     </message>
     <message>
         <source>You can find your Hedgewars configuration files under &quot;Library/Application Support/Hedgewars&quot; in your home directory. Create backups or take the files with you, but don&apos;t edit them by hand.</source>
@@ -781,17 +792,21 @@
     <message>
         <source>The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.</source>
         <comment>Tips</comment>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">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.</translation>
     </message>
     <message>
         <source>Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
         <comment>Tips</comment>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Użyj koktajlu Mołotowa lub Miotacza ognia by powstrzymać przeciwnika przed przedostaniem się przez tunele lub platformy.</translation>
     </message>
     <message>
         <source>The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.</source>
         <comment>Tips</comment>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">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.</translation>
+    </message>
+    <message>
+        <source>Downloadable Content</source>
+        <translation type="unfinished">Dodatki do pobrania</translation>
     </message>
 </context>
 <context>
@@ -820,15 +835,15 @@
     </message>
     <message>
         <source>Error</source>
-        <translation type="unfinished">Błąd</translation>
+        <translation>Błąd</translation>
     </message>
     <message>
         <source>Please enter room name</source>
-        <translation type="unfinished">Wprowadź nazwę pokoju</translation>
+        <translation>Wprowadź nazwę pokoju</translation>
     </message>
     <message>
         <source>OK</source>
-        <translation type="unfinished">OK</translation>
+        <translation>OK</translation>
     </message>
 </context>
 <context>
@@ -1050,10 +1065,10 @@
     </message>
     <message numerus="yes">
         <source>%1 players online</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>%1 gracz online</numerusform>
+            <numerusform>%1 graczy online</numerusform>
+            <numerusform>%1 graczy online</numerusform>
         </translation>
     </message>
 </context>
@@ -1081,7 +1096,7 @@
     </message>
     <message>
         <source>Add an indestructable border around the terrain</source>
-        <translation>Dodaje niezniszczalną ramkę dookoła terenu</translation>
+        <translation type="obsolete">Dodaje niezniszczalną ramkę dookoła terenu</translation>
     </message>
     <message>
         <source>Lower gravity</source>
@@ -1177,7 +1192,15 @@
     </message>
     <message>
         <source>Teams in each clan take successive turns sharing their turn time.</source>
-        <translation type="unfinished"></translation>
+        <translation>Zespoły wykonują swoje tury po kolei dzieląc czas pomiędzy siebie.</translation>
+    </message>
+    <message>
+        <source>Add an indestructible border around the terrain</source>
+        <translation type="unfinished">Dodaje niezniszczalną ramkę dookoła terenu</translation>
+    </message>
+    <message>
+        <source>Add an indestructible border along the bottom</source>
+        <translation type="unfinished">Dodaje na dole niezniszczalną ramkę</translation>
     </message>
 </context>
 <context>
@@ -1274,7 +1297,7 @@
     </message>
     <message>
         <source>Update</source>
-        <translation type="unfinished">Odśwież</translation>
+        <translation>Zmień</translation>
     </message>
 </context>
 <context>
@@ -1416,67 +1439,67 @@
     </message>
     <message>
         <source>Disabled</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Wyłączone</translation>
     </message>
     <message>
         <source>Red/Cyan</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Czerwone/Błękitne</translation>
     </message>
     <message>
         <source>Cyan/Red</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Błękitne/Czerwone</translation>
     </message>
     <message>
         <source>Red/Blue</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Czerwone/Niebieskie</translation>
     </message>
     <message>
         <source>Blue/Red</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Niebieskie/Czerwone</translation>
     </message>
     <message>
         <source>Red/Green</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Czerwone/Zielone</translation>
     </message>
     <message>
         <source>Green/Red</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Zielone/Czerwone</translation>
     </message>
     <message>
         <source>Side-by-side</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Obok siebie</translation>
     </message>
     <message>
         <source>Top-Bottom</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Góra-dół</translation>
     </message>
     <message>
         <source>Wiggle</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Trzęsący się obraz</translation>
     </message>
     <message>
         <source>Red/Cyan grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Czer/Błęk w odc. szar</translation>
     </message>
     <message>
         <source>Cyan/Red grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Błęk/Czer w odc. szar</translation>
     </message>
     <message>
         <source>Red/Blue grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Czer/Nieb w odc. szar</translation>
     </message>
     <message>
         <source>Blue/Red grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Nieb/Czer w odc. szar</translation>
     </message>
     <message>
         <source>Red/Green grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Czer/Ziel w odc. szar</translation>
     </message>
     <message>
         <source>Green/Red grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Ziel/Czer w odc. szar</translation>
     </message>
 </context>
 <context>
@@ -1726,19 +1749,19 @@
     </message>
     <message>
         <source>Stereo rendering</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Wyświetlanie w 3D</translation>
     </message>
     <message>
         <source>Game Options</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Opcje</translation>
     </message>
     <message>
         <source>Style</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Tryb gry</translation>
     </message>
     <message>
         <source>Scheme</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Schemat</translation>
     </message>
     <message>
         <source>Password</source>
@@ -1746,7 +1769,7 @@
     </message>
     <message>
         <source>% Get Away Time</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Czas na ucieczkę w %</translation>
     </message>
 </context>
 <context>
@@ -2113,7 +2136,11 @@
     </message>
     <message>
         <source>Tag Team</source>
-        <translation type="unfinished"></translation>
+        <translation type="unfinished">Zespół</translation>
+    </message>
+    <message>
+        <source>Add Bottom Border</source>
+        <translation type="unfinished">Ddoaj ramkę na dole</translation>
     </message>
 </context>
 <context>
--- a/share/hedgewars/Data/Locale/hedgewars_uk.ts	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts	Wed Sep 14 22:39:39 2011 +0200
@@ -16,15 +16,15 @@
     <name>DrawMapWidget</name>
     <message>
         <source>File error</source>
-        <translation type="unfinished"></translation>
+        <translation>Помилка файлу</translation>
     </message>
     <message>
         <source>Cannot open file &apos;%1&apos; for writing</source>
-        <translation type="unfinished"></translation>
+        <translation>Не можу відкрити файл &apos;%1&apos; для запису</translation>
     </message>
     <message>
         <source>Cannot read file &apos;%1&apos;</source>
-        <translation type="unfinished"></translation>
+        <translation>Не можу прочитати файл &apos;%1&apos;</translation>
     </message>
 </context>
 <context>
@@ -290,14 +290,17 @@
     </message>
     <message>
         <source>Nickname</source>
-        <translation type="unfinished">Ім&apos;я</translation>
+        <translation>Нікнейм</translation>
     </message>
     <message>
         <source>Some one already uses
  your nickname %1
 on the server.
 Please pick another nickname:</source>
-        <translation type="unfinished"></translation>
+        <translation>Хтось вже використовує
+ нікнейм %1
+на сервері.
+Виберіть інший нікнейм:</translation>
     </message>
 </context>
 <context>
@@ -354,7 +357,7 @@
     </message>
     <message>
         <source>Cancel</source>
-        <translation type="unfinished">Скасувати</translation>
+        <translation>Скасувати</translation>
     </message>
 </context>
 <context>
@@ -732,11 +735,6 @@
         <translation>Windows-версія Hedgewars підтримує Xfire. Переконайтеся в тому, що ви додали Hedgewars до списку ігор, щоб ваші друзі могли бачити вас в грі.</translation>
     </message>
     <message>
-        <source>The Homing Bee can be tricky to use. Its turn radius depends on it&apos;s velocity, so try to not use full power.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу.</translation>
-    </message>
-    <message>
         <source>Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
         <comment>Tips</comment>
         <translation>Використайте Коктейль Молотова або Вогнемет щоб тимчасово утримати їжаків від проходження такої місцевості як тунелі або платформи.</translation>
@@ -744,7 +742,7 @@
     <message>
         <source>The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.</source>
         <comment>Tips</comment>
-        <translation type="unfinished"></translation>
+        <translation>Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу.</translation>
     </message>
 </context>
 <context>
@@ -773,15 +771,15 @@
     </message>
     <message>
         <source>Error</source>
-        <translation type="unfinished">Помилка</translation>
+        <translation>Помилка</translation>
     </message>
     <message>
         <source>Please enter room name</source>
-        <translation type="unfinished">Введіть назву кімнати</translation>
+        <translation>Введіть назву кімнати</translation>
     </message>
     <message>
         <source>OK</source>
-        <translation type="unfinished">Так</translation>
+        <translation>Так</translation>
     </message>
 </context>
 <context>
@@ -1003,10 +1001,10 @@
     </message>
     <message numerus="yes">
         <source>%1 players online</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>%1 гравець в мережі</numerusform>
+            <numerusform>%1 гравця в мережі</numerusform>
+            <numerusform>%1 гравців в мережі</numerusform>
         </translation>
     </message>
 </context>
@@ -1130,7 +1128,7 @@
     </message>
     <message>
         <source>Teams in each clan take successive turns sharing their turn time.</source>
-        <translation type="unfinished"></translation>
+        <translation>Команди в кожному клані здійснюють послідовні ходи, поділяючи час ходу.</translation>
     </message>
 </context>
 <context>
@@ -1227,7 +1225,7 @@
     </message>
     <message>
         <source>Update</source>
-        <translation type="unfinished">Оновити</translation>
+        <translation>Оновити</translation>
     </message>
 </context>
 <context>
@@ -1377,27 +1375,27 @@
     </message>
     <message>
         <source>Red/Cyan grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation>Черв./Блак. відтінки сірого</translation>
     </message>
     <message>
         <source>Cyan/Red grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation>Блак./Черв. відтінки сірого</translation>
     </message>
     <message>
         <source>Red/Blue grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation>Черв./Синій відтінки сірого</translation>
     </message>
     <message>
         <source>Blue/Red grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation>Синій/Черв. відтінки сірого</translation>
     </message>
     <message>
         <source>Red/Green grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation>Черв./Зел. відтінки сірого</translation>
     </message>
     <message>
         <source>Green/Red grayscale</source>
-        <translation type="unfinished"></translation>
+        <translation>Зел./Черв. відтінки сірого</translation>
     </message>
 </context>
 <context>
@@ -1626,32 +1624,28 @@
         <translation>% Довжина Мотузки</translation>
     </message>
     <message>
-        <source>Gameplay</source>
-        <translation type="obsolete">Геймплей</translation>
-    </message>
-    <message>
         <source>Stereo rendering</source>
         <translation>Стерео рендеринг</translation>
     </message>
     <message>
         <source>Game Options</source>
-        <translation type="unfinished"></translation>
+        <translation>Параметри гри</translation>
     </message>
     <message>
         <source>Style</source>
-        <translation type="unfinished"></translation>
+        <translation>Стиль</translation>
     </message>
     <message>
         <source>Scheme</source>
-        <translation type="unfinished"></translation>
+        <translation>Схема</translation>
     </message>
     <message>
         <source>Password</source>
-        <translation type="unfinished">Пароль</translation>
+        <translation>Пароль</translation>
     </message>
     <message>
         <source>% Get Away Time</source>
-        <translation type="unfinished"></translation>
+        <translation>% Час Тікати</translation>
     </message>
 </context>
 <context>
@@ -2014,7 +2008,7 @@
     </message>
     <message>
         <source>Tag Team</source>
-        <translation type="unfinished"></translation>
+        <translation>Збірна Команда</translation>
     </message>
 </context>
 <context>
--- a/share/hedgewars/Data/Locale/it.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/it.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
 	[":("] = ":(",
 	["!!!"] = "!!!",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Pratica la tua mira", --Bazooka, Shotgun, SniperRifle
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 	["Bat balls at your enemies and|push them into the sea!"] = "Lancia delle palle ai tuoi nemici|e spingili in acqua!",
 	["Bat your opponents through the|baskets and out of the map!"] = "Manda (colpendoli) i tuoi nemici|in acqua attraverso i canestri laterali!",
 	["Bazooka Training"] = "Addestramento con il Bazooka",
@@ -19,8 +26,10 @@
 --      ["Boom!"] = "BOOM!",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
 	["CAPTURE THE FLAG"] = "Cattura la Bandiera",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
 	["Codename: Teamwork"] = "Nome in codice: Lavoro di Squadra",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
 	["DAMMIT, ROOKIE!"] = "MALEDIZIONE, RECLUTA!",
 	["Dangerous Ducklings"] = "Papere Pericolose",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 	["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.", --Bazooka, Shotgun, SniperRifle
 	["Eliminate Poison before the time runs out"] = "Elimina Veleno prima che il tempo finisca",
 	["Eliminate the Blue Team"] = "Elimina il Blue Team",
+--      ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+--      ["Eliminate the enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
 	["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Elimina l'Unità 3378 |- La Resistenza Finale deve sopravvivere",
+--      ["Energetic Engineer"] = "",
 	["Enjoy the swim..."] = "Nuota con piacere...",
 --      ["[Enter]"] = "",
 	["Fastest lap: "] = "Giro migliore: ",
@@ -53,6 +67,9 @@
 	["Flag respawned!"] = "Bandiera restituita!",
 	["Flag returned!"] = "Bandiera recuperata!",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
 	["GAME OVER!"] = "GAME OVER!",
@@ -62,11 +79,15 @@
 	["GO! GO! GO!"] = "VAI! VAI! VAI!",
 	["Good birdy......"] = "Bell'uccellino......",
 	["Good luck out there!"] = "Buona fortuna!",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 	["Hedgewars-Basketball"] = "Hedgewars-Pallacanestro",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
 	["Listen up, maggot!!"] = "Recluta, Attenzione!!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 --      ["|- Mines Time:"] = "|-Timer delle mine:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION FAILED"] = "MISSIONE FALLITA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION SUCCESSFUL"] = "MISSIONE COMPLETATA CON SUCCESSO", -- User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -90,9 +117,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 	["NEW fastest lap: "] = "Nuovo giro migliore: ",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 	["Not So Friendly Match"] = "Partita non molto amichevole", -- Basketball, Knockball
 	["Oh no! Just try again!"] = "Oh no! Prova ancora!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 	["Operation Diver"] = "Operazione Sub",
 	["Opposing Team: "] = "Squadra Nemica: ",
 	["Pathetic Hog #%d"] = "Riccio Patetico #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] = "", -- Control, Space_Invasion
 	["Poison"] = "Veleno",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 	[" - 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!",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
 --      ["RULES OF THE GAME [Press ESC to view]"] = "",
 	["RULES OF THE GAME [Press ESC to view]"] = "REGOLE DEL GIOCO (Premi ESC per visualizzarle)",
@@ -117,6 +153,7 @@
 --      ["SCORE"] = "",
 --      ["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
 	["See ya!"] = "Ci vediamo!",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -128,7 +165,7 @@
 --      ["Shield Seeker!"] = "",
 	["Shotgun Team"] = "Squadra FaP",
 	["Shotgun Training"] = "Allenamento con il Fucile a Pompa",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 	["%s is out and Team %d|scored a penalty!| |Score:"] = "%s è fuori dal campo e la squadra %d|prende una penalità!| |Punteggio:", -- Basketball, Knockball
@@ -147,27 +184,34 @@
 --      ["The flag will respawn next round."] = "La bandiera verrà restituita alla fine del turno.",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
 	["Toxic Team"] = "Team Velenoso", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 	["TrophyRace"] = "TrophyRace",
 	["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
 	["Unit 3378"] = "Unità 3378",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 	["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!",
---      ["v.06"] = "",
 --      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 	["Victory for the"] = "La vittoria è di",
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
 	["You have SCORED!!"] = "Hai guadagnato un PUNTO!",
--- a/share/hedgewars/Data/Locale/ko.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/ko.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
 --      ["!!!"] = "",
 --      ["..."] = "",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 --      ["Aiming Practice"] = "", --Bazooka, Shotgun, SniperRifle
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 --      ["Bat balls at your enemies and|push them into the sea!"] = "",
 --      ["Bat your opponents through the|baskets and out of the map!"] = "",
 --      ["Bazooka Training"] = "",
@@ -19,8 +26,10 @@
 --      ["BOOM!"] = "",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
 --      ["CAPTURE THE FLAG"] = "",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
 --      ["Codename: Teamwork"] = "",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
 --      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
 --      ["Dangerous Ducklings"] = "",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 --      ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
 --      ["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 enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
 --      ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+--      ["Energetic Engineer"] = "",
 --      ["Enjoy the swim..."] = "",
 --      ["[Enter]"] = "",
 --      ["Fastest lap: "] = "",
@@ -53,6 +67,9 @@
 --      ["Flag respawned!"] = "",
 --      ["Flag returned!"] = "",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
 --      ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
 --      ["GO! GO! GO!"] = "",
 --      ["Good birdy......"] = "",
 --      ["Good luck out there!"] = "",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 --      ["Hedgewars-Basketball"] = "",
 --      ["Hedgewars-Knockball"] = "",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
 --      ["Listen up, maggot!!"] = "",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 --      ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 --      ["NEW fastest lap: "] = "",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 --      ["Not So Friendly Match"] = "", -- Basketball, Knockball
 --      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 --      ["Operation Diver"] = "",
 --      ["Opposing Team: "] = "",
 --      ["Pathetic Hog #%d"] = "",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["Poison"] = "",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 --      [" - 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"] = "",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
 --      ["RULES OF THE GAME [Press ESC to view]"] = "",
 --      ["s|"] = "",
@@ -116,6 +152,7 @@
 --      ["SCORE"] = "",
 --      ["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
 --      ["See ya!"] = "",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
 --      ["Shield Seeker!"] = "",
 --      ["Shotgun Team"] = "",
 --      ["Shotgun Training"] = "",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 --      ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball
@@ -146,26 +183,33 @@
 --      ["The flag will respawn next round."] = "",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 --      ["TrophyRace"] = "",
 --      ["T_T"] = "",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
 --      ["Unit 3378"] = "",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 --      ["Use your rope to get from start to finish as fast as you can!"] = "",
---      ["v.06"] = "",
 --      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You have SCORED!!"] = "",
--- a/share/hedgewars/Data/Locale/lt.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/lt.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
    ["!!!"] = "!!!",
    ["..."] = "...",
    ["Accuracy Bonus!"] = "Taiklumo Bonusas!",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
    ["a Hedgewars mini-game"] = "Eþiu karu mini þaidimas", -- Space_Invasion, The_Specialists
    ["Aiming Practice"] = "Taiklumo Treniruotë", --Bazooka, Shotgun, SniperRifle
+   ["Ammo Depleted!"] = "Nusodrintojo Kulkos!",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
    ["Ammo"] = "Kulkos",
-   ["Ammo Depleted!"] = "Nusodrintojo Kulkos!",
    ["Ammo Maniac!"] = "Kulku Maniakas!",
    ["Available points remaining: "] = "Pajamumu taðku liko: ",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
    ["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!",
    ["Bat your opponents through the|baskets and out of the map!"] = "Dauþk savo obonentus pro kaðes|ir ið þemëlapio!",
    ["Bazooka Training"] = "Bazukos Treniruotë",
@@ -19,8 +26,10 @@
    ["BOOM!"] = "BOOM!",
    ["Boss defeated!"] = "Bosas Nugalëtas!",
    ["Boss Slayer!"] = "Bosu Þudikas!",
+--      ["Build a track and race."] = "",
    ["CAPTURE THE FLAG"] = "Pagriebk Vëliava",
    ["Careless"] = "Neatsargus",
+--      ["Change Weapon"] = "",
    ["Clumsy"] = "Durnelis",
    ["Codename: Teamwork"] = "Kodas: Komandinis Darbas",
    ["Complete the track as fast as you can!"] = "Apvaryk trasa taip greitai kaip gali!",
@@ -28,12 +37,14 @@
    ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Sveikinu! Tu pradanginai visus taikinius|per leista laika.", --Bazooka, Shotgun, SniperRifle
    ["Control pillars to score points."] = "Valdyk stulpus ir gausi taðku.",
    ["Cybernetic Empire"] = "Kibernetinë Karalystë",
+   ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "PO VELNIU EILINI NULIPK MAN NUO GALVOS!",
    ["DAMMIT, ROOKIE!"] = "PO VELNIU EILINI!",
-   ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "PO VELNIU EILINI NULIPK MAN NUO GALVOS!",
    ["Dangerous Ducklings"] = "Pavojingos Antis",
    ["Deadweight"] = "Dedveitas",
+--      ["Demolition is fun!"] = "",
    ["Depleted Kamikaze!"] = "Nusodrintojo Kamikaze!",
    ["Destroy invaders to score points."] = "Sunaikink Isiverþëjus Ir Gauk Taðku.",
+--      ["Double Kill!"] = "",
    ["Drone Hunter!"] = "Drone Medþiotojas!",
    ["Drowner"] = "Skendëjas",
    ["Each turn you get 1-3 random weapons"] = "Kekviena Eile Gausi 1-3 Atsitiktiniu Ginklu",
@@ -42,8 +53,11 @@
    ["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 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 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",
+--      ["Energetic Engineer"] = "",
    ["Enjoy the swim..."] = "Pasimëgauk Rlaukimu...",
    ["[Enter]"] = "[ENTER"],
    ["Fastest lap: "] = "Greièiausias Ratas: ",
@@ -53,6 +67,9 @@
    ["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"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
    ["GAME BEGUN!!!"] = "Þaidimas Prasidëjo!!!",
    ["Game Modifiers: "] = "Þaidimo Modifikatoriai: ",
    ["GAME OVER!"] = "Þaidimas Baigtas!",
@@ -62,11 +79,15 @@
    ["GO! GO! GO!"] = "Bëk! Bëk! Bëk!",
    ["Good birdy......"] = "Geras Paukðtelis......",
    ["Good luck out there!"] = "Sëkmës Tau Ten!",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
    ["GOTCHA!"] = "Prigavau!",
+--      ["Grab Mines/Explosives"] = "",
    ["Hahahaha!"] = "Hahahaha!",
    ["Haha, now THAT would be something!"] = "Haha, na tai jau butu kaþkas!",
+   [" Hapless Hogs left!"] = " Nelaimingu Eþiu Liko!",
    ["Hapless Hogs"] = "Nelaimingi Eþiai",
-   [" Hapless Hogs left!"] = " Nelaimingu Eþiu Liko!",
+--      ["Health crates extend your time."] = "",
    ["Heavy"] = "Sunku",
    ["Hedgewars-Basketball"] = "Eþiukaru-Krepðinis",
    ["Hedgewars-Knockball"] = "Eþiukaru-Trenktaskamuolys",
@@ -80,19 +101,28 @@
    ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Geras dalykas kad MARAS dar po 99 eiliu...",
    ["Jumping is disabled"] = "Ðokimas ira iðjungtas",
    ["Kamikaze Expert!"] = "Kamikazes Ekspertas!",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
    ["KILLS"] = "Nuþudymai",
+--      ["Last Target!"] = "",
    ["[Left Shift]"] = "[Kairis Shiftas"],
    ["Listen up, maggot!!"] = "Paklausyk eilini!!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
    ["|- Mines Time:"] = "|- Minu Laikas:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
    ["MISSION FAILED"] = "Misija Nepavyko", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+   ["MISSION SUCCESSFUL"] = "Misija Buvo Ivykdita", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
    ["MISSION SUCCESS"] = "Misija Pavyko",
-   ["MISSION SUCCESSFUL"] = "Misija Buvo Ivykdita", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
    ["Movement: [Up], [Down], [Left], [Right]"] = "Judëjimas: [I Virðu, [I Apaèia], [I Kaire], [I Deðine]"],
    ["Multi-shot!"] = "Dvigubas-Ðuvis!",
    ["Nameless Heroes"] = "Bevardþiai Herojiai",
+--      ["New Barrels Per Turn"] = "",
    ["NEW CLAN RECORD: "] = "Naujas Klano Rekordas: ",
    ["NEW fastest lap: "] = "Naujas Greièiausias Ratas: ",
+--      ["New Mines Per Turn"] = "",
    ["NEW RACE RECORD: "] = "Naujas Lenktyniu Rekordas: ",
+--      ["Newton's Hammock"] = "",
    ["NOT ENOUGH WAYPOINTS"] = "Neuþtenka Kelio Taðku",
    ["Not So Friendly Match"] = "Ne Toks Jau Ir Draugiðkas Turnyras", -- Basketball, Knockball
    ["Oh no! Just try again!"] = "O NE! Tiesiog Bandyk Vël", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,23 +130,28 @@
    ["Operation Diver"] = "Operacijos Vairuotojas",
    ["Opposing Team: "] = "Pasiprieðinanti Komanda: ",
    ["Pathetic Hog #%d"] = "Niekam Tikes Eþys #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
    ["Per-Hog Ammo"] = "Kulkos Per-Eþy",
    ["Place more waypoints using [ENTER]"] = "Padëk Daugiau Kelio Taðku Su [ENTER"],
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
    ["points"] = "taðkai", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
    ["Poison"] = "Nuodai",
    ["Power Remaining"] = "Jëgos Liko",
+--      ["Prepare yourself"] = "",
    ["Press [Precise] to skip intro"] = "Spausk [TaikluNusitaikima kad baigtum iëjima"],
    ["Race complexity limit reached."] = "Lenktyniu Sudëtingumo Limitas Pasiektas.",
+--      ["RACER"] = "",
    [" - 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",
+--      ["Round Limit:"] = "",
    ["Round Limit"] = "Raundu Limitas",
+--      ["Rounds Complete: "] = "",
    ["Rounds Complete"] = "Raundai Ivykditi",
    ["RULES OF THE GAME [Press ESC to view]"] = "ÞAIDIMO TAISYKLES [Spausk ESC Kad Parodytu"],
-   ["s|"] = "s|",
    ["Save as many hapless hogs as possible!"] = "Iðgelbëk kuo daugiau nelaimingu eþiu!",
    ["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
    ["See ya!"] = "Iki!",
-   ["s"] = "s", -- GaudyRacer, Space_Invasion
+--      ["selected!"] = "",
    ["Shield boosted! +30 power"] = "Skydas Pagerintas! +30 jëga",
    ["Shield Depleted"] = "Skydas Nusodrintas",
    ["Shield is fully recharged!"] = "Skydas Pilnai Pakrautas!",
@@ -127,7 +162,7 @@
    ["Shield Seeker!"] = "Skydo Ieðkotojas!",
    ["Shotgun Team"] = "Ðratinio Ðautuvo Komanda",
    ["Shotgun Training"] = "Ðratinio Ðautuvo Treniruotë",
-   ["Shots Left: "] = "Liko Ðuviu: ", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
    ["Silly"] = "Durnelis",
    ["Sinky"] = "Paskenduolis",
    ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s Iðkrito ir komanda %d|gavo bausme!| |Score:", -- Basketball, Knockball
@@ -136,6 +171,8 @@
    ["Sniperz"] = "Snaiperiai",
    ["Sponge"] = "Kempinë",
    ["Spooky Tree"] = "Baisusis Medis",
+   ["s|"] = "s|",
+   ["s"] = "s", -- GaudyRacer, Space_Invasion
    ["STATUS UPDATE"] = "Bûsenos Atnaujinimas", -- GaudyRacer, Space_Invasion
    ["Switched to "] = "Pakeistas i ",
    ["Team %d: "] = "Komanda %d: ",
@@ -146,26 +183,33 @@
    ["The flag will respawn next round."] = "Vëliava atsigaus kita raunda.",
    ["The Nameless One"] = "Bevardis",
    ["THE SPECIALISTS"] = "Specialistai",
+--      ["This one's tricky."] = "",
    ["This rain is really something..."] = "Ðis lietus tikrai kaþkas...",
-   ["TIME: "] = "Laikas: ",
    ["Timed Kamikaze!"] = "Laikina Kamikaze!",
    ["Time Extended!"] = "Laikas Prailgintas!",
-   ["Time Left: "] = "Liko Laiko: ",
+--      ["Time Extension"] = "",
+   ["TIME: "] = "Laikas: ",
    ["Toggle Shield"] = "Perjungti i skyda",
    ["Toxic Team"] = "Toksinë Komanda", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
    ["TRACK COMPLETED"] = "Trasa Ivykdita",
-   ["Track Time: "] = "Trasos Laikas: ",
+--      ["TRACK FAILED!"] = "",
    ["TrophyRace"] = "Trophëju Trasa",
    ["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
    ["Turn Time"] = "Eilës Laikas",
+--      ["Unit"] = "",
    ["Unit 3378"] = "Tipas 3378",
+--      ["Unit 835"] = "",
    ["Unlimited Attacks"] = "Nesibaigianèios Atakos",
+--      ["Unstoppable!"] = "",
    ["User Challenge"] = "Vartotojo Iðukis",
    ["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!",
-   ["v.06"] = "v.06",
    ["Victory for the "] = "Pergalë ", -- CTF_Blizzard, Capture_the_Flag
    ["Waypoint placed."] = "Kelio Taðkas Pasiektas.",
+--      ["Way-Points Remaining"] = "",
    ["Weapons Reset"] = "Ginklai Atgaivinti",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
    ["WINNING TIME: "] = "Laimëjimo Laikas: ",
    ["You'd almost swear the water was rising!"] = "Galima pamanyti kad vanduo tikrai kyla!",
    ["You have SCORED!!"] = "Tu gavai TAÐKU!!",
@@ -173,4 +217,4 @@
    ["You've failed. Try again."] = "Tau nepavyko. Bandyk vël.",
    ["You've reached the goal!| |Time: "] = "Tu pasiekiai taikini!| |Laikas: ",
    ["'Zooka Team"] = "'Zukos Komanda",
-   }
+    }
--- a/share/hedgewars/Data/Locale/pl.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pl.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,29 +1,38 @@
 locale = {
     [":("] = ":(",
     ["!!!"] = "!!!",
---      ["..."] = "",
---      ["Accuracy Bonus!"] = "",
---      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
+    ["..."] = "...",
+    ["Accuracy Bonus!"] = "Bonus za celność",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+    ["a Hedgewars mini-game"] = "Mini gra", -- Space_Invasion, The_Specialists
     ["Aiming Practice"] = "Potrenuj celność",
---      ["Ammo"] = "",
---      ["Ammo Depleted!"] = "",
---      ["Ammo Maniac!"] = "",
---      ["Available points remaining: "] = "",
+    ["Ammo"] = "Amunicja",
+    ["Ammo Depleted!"] = "Koniec amunicji!",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
+    ["Ammo Maniac!"] = "Nabojowy Maniak!",
+    ["Available points remaining: "] = "Pozostały następujące punkty: ",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
     ["Bat balls at your enemies and|push them into the sea!"] = "Uderzaj piłkami w swoich przeciwników|i strącaj ich do wody!",
     ["Bat your opponents through the|baskets and out of the map!"] = "Uderzaj swoich przekiwników|wyrzucając przez kosz, poza mapę!",
     ["Bazooka Training"] = "Trening bazooki",
     ["Best laps per team: "] = "Najszybsze okrążenie drużyny: ",
---      ["Best Team Times: "] = "",
+    ["Best Team Times: "] = "Najlepszy czas zespołów",
     ["Bloody Rookies"] = "Żółtodzioby",
---      ["BOOM!"] = "",
     ["Boom!"] = "BUM!",
---      ["Boss defeated!"] = "",
---      ["Boss Slayer!"] = "",
+    ["BOOM!"] = "BUM!",
+    ["Boss defeated!"] = "Boss pokonany!",
+    ["Boss Slayer!"] = "Pogromca bossów",
+--      ["Build a track and race."] = "",
     ["CAPTURE THE FLAG"] = "PRZECHWYĆ FLAGĘ",
---      ["Careless"] = "",
---      ["Clumsy"] = "",
+    ["Careless"] = "Nieostrożny",
+--      ["Change Weapon"] = "",
+    ["Clumsy"] = "Fajtłapa",
     ["Codename: Teamwork"] = "Kryptonim: Praca zespołowa",
---      ["Complete the track as fast as you can!"] = "",
+    ["Complete the track as fast as you can!"] = "Ukończ trasę tak szybko jak tylko potrafisz!",
     ["Congratulations!"] = "Gratulacje",
     ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulacje! Zniszczyłeś wszystkie cele przed upłynięciem czasu.",  
     ["Control pillars to score points."] = "Kontroluj filary by zdobyć punkty",
@@ -32,144 +41,179 @@
     ["DAMMIT, ROOKIE!"] = "Żółtodziobie!",
     ["Dangerous Ducklings"] = "Niebezpieczne Kaczory",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
---      ["Destroy invaders to score points."] = "",
---      ["Drone Hunter!"] = "",
+    ["Destroy invaders to score points."] = "Zabijaj najeźdźców by zdobyć punkty.",
+--      ["Double Kill!"] = "",
+    ["Drone Hunter!"] = "Łowca dronów",
 --      ["Drowner"] = "",
---      ["Each turn you get 1-3 random weapons"] = "",
---      ["Each turn you get one random weapon"] = "",
+    ["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ń",
     ["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 Poison before the time runs out"] = "Zabij Truciciela zanim skończy się czas",
     ["Eliminate the Blue Team"] = "Zniszcz niebieską drużynę",
---      ["Eliminate the enemy specialists."] = "",
-    ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "Rozwal Jednostkę 3378 | Twoja drużyna musi przetrwać",
+--      ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+--      ["Eliminate the enemy hogs to win."] = "",
+    ["Eliminate the enemy specialists."] = "Weliminuj specjalistów wroga.",
+    ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Rozwal Jednostkę 3378 |- Twoja drużyna musi przetrwać",
+--      ["Energetic Engineer"] = "",
     ["Enjoy the swim..."] = "Popływaj trochę...",
---      ["[Enter]"] = "",
+    ["[Enter]"] = "[Enter]",
     ["Fastest lap: "] = "Najszybsze okrążenie: ",
     ["Feeble Resistance"] = "Ruch Oporu",
---      ["Fire"] = "",
+    ["Fire"] = "Ogień",
     ["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."] = "",
---      ["GAME BEGUN!!!"] = "",
---      ["Game Modifiers: "] = "",
+    ["Flags, and their home base will be placed where each team ends their first turn."] = "Flagi i baza zostaną umieszzcone tam gdzie zespół zakończy swą pierwszą turę.",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
+    ["GAME BEGUN!!!"] = "GRA ROZPOCZĘTA!!!",
+    ["Game Modifiers: "] = "Modyfikatory: ",
     ["GAME OVER!"] = "KONIEC GRY!",
     ["Game Started!"] = "Gra Rozpoczęta",
     ["Get on over there and take him out!"] = "Dostań się tam i go wykończ!",
---      ["Goal"] = "",
+    ["Goal"] = "Gol",
     ["GO! GO! GO!"] = "RUCHY! RUCHY! RUCHY!",
     ["Good birdy......"] = "Dooobry ptaszek...",
     ["Good luck out there!"] = "Powodzenia!",
---      ["GOTCHA!"] = "",
---      ["Hahahaha!"] = "",
---      ["Haha, now THAT would be something!"] = "",
---      ["Hapless Hogs"] = "",
---      [" Hapless Hogs left!"] = "",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
+    ["GOTCHA!"] = "MAM CIĘ!",
+--      ["Grab Mines/Explosives"] = "",
+    ["Hahahaha!"] = "Hahahaha!",
+    ["Haha, now THAT would be something!"] = "Haha, to było by COŚ",
+    [" Hapless Hogs left!"] = " Nieszczęsne Jeże pozostały",
+    ["Hapless Hogs"] = "Nieszczęsne Jeże",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
     ["Hedgewars-Basketball"] = "Hedgewars-Koszykówka",
     ["Hedgewars-Knockball"] = "Hedgewars-Knockball",
---      ["Heh, it's not that bad."] = "",
---      ["Hit Combo!"] = "",
+    ["Heh, it's not that bad."] = "Heh, nie jest aż tak źle.",
+    ["Hit Combo!"] = "Combo!",
     ["Hmmm..."] = "Hmmmm...",
     ["Hooray!"] = "Hurraaa!",
     ["Hunter"] = "Strzelec",  
     ["Instructor"] = "Instruktor",  
---      ["invaders destroyed"] = "",
---      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
---      ["Jumping is disabled"] = "",
+    ["invaders destroyed"] = "najeźdzców zniszczonych",
+    ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Jak to dobrze, że Nagła Śmierć jest dopiero za 99 tur...",
+    ["Jumping is disabled"] = "Skakanie jest niemożliwe",
 --      ["Kamikaze Expert!"] = "",
---      ["KILLS"] = "",
---      ["[Left Shift]"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
+    ["KILLS"] = "Zabicia",
+--      ["Last Target!"] = "",
+    ["[Left Shift]"] = "[Lewy Shift]",
     ["Listen up, maggot!!"] = "Słuchaj mnie, gnido!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
     ["|- Mines Time:"] = "|- Czas detonacji min:",
     ["MISSION FAILED"] = "MISJA ZAKOŃCZONA NIEPOWODZENIEM", 
---      ["MISSION SUCCESS"] = "",
     ["MISSION SUCCESSFUL"] = "MISJA POWIODŁA SIĘ",  
---      ["Movement: [Up], [Down], [Left], [Right]"] = "",
---      ["Multi-shot!"] = "",
---      ["Nameless Heroes"] = "",
---      ["NEW CLAN RECORD: "] = "",
+    ["MISSION SUCCESS"] = "MISJA ZAKOŃCZONA SUKCESEM",
+    ["Movement: [Up], [Down], [Left], [Right]"] = "Poruszanie się: [Góra], [Dół], [Lewo], [Prawo]",
+    ["Multi-shot!"] = "Wielokrotny strzał",
+    ["Nameless Heroes"] = "Bezimienni Bohaterowie",
+--      ["New Barrels Per Turn"] = "",
+    ["NEW CLAN RECORD: "] = "NOWY REKORD ZESPOŁU: ",
     ["NEW fastest lap: "] = "NOWE najszybsze okrążenie: ",
---      ["NEW RACE RECORD: "] = "",
---      ["NOT ENOUGH WAYPOINTS"] = "",
+--      ["New Mines Per Turn"] = "",
+    ["NEW RACE RECORD: "] = "NOWY REKORD WYŚCIGU: ",
+--      ["Newton's Hammock"] = "",
+    ["NOT ENOUGH WAYPOINTS"] = "BRAK PUNKTÓW ORIENTACYJNYCH",
     ["Not So Friendly Match"] = "Mecz Nie-Do-Końca Towarzyski",  
     ["Oh no! Just try again!"] = "Ojojoj! Spróbuj jeszcze raz!", 
     ["Oh no! Time's up! Just try again."] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",  
     ["Operation Diver"] = "Operacja Nurek",
     ["Opposing Team: "] = "Przeciwna drużyna",
     ["Pathetic Hog #%d"] = "Załosny Jeż #%d",
---      ["Per-Hog Ammo"] = "",
---      ["Place more waypoints using [ENTER]"] = "",
---      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+    ["Per-Hog Ammo"] = "Oddzielna amunicja dla jeży",
+    ["Place more waypoints using [ENTER]"] = "Postaw więcej punktów orientacyjnych za pomocą [Entera]",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
+    ["points"] = "punkty", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
     ["Poison"] = "Truciciel",
---      ["Power Remaining"] = "",
---      ["Press [Precise] to skip intro"] = "",
+    ["Power Remaining"] = "pkt. energii pozostało",
+--      ["Prepare yourself"] = "",
+    ["Press [Precise] to skip intro"] = "Naciśnij [Precyzyjne celowanie] by pominąć intro",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
     [" - 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",
---      ["Round Limit"] = "",
---      ["Rounds Complete"] = "",
+--      ["Round Limit:"] = "",
+    ["Round Limit"] = "Ilość rund",
+--      ["Rounds Complete: "] = "",
+    ["Rounds Complete"] = "Koniec",
     ["RULES OF THE GAME [Press ESC to view]"] = "ZASADY GRY [Naciśnij ESC by zobaczyć]",        
---      ["s|"] = "",
---      ["Save as many hapless hogs as possible!"] = "",
---      ["SCORE"] = "",
+    ["Save as many hapless hogs as possible!"] = "Uratuj jak najwięcej nieszczęsnych jeży",
+    ["SCORE"] = "PUNKTY",
     ["sec"] = "sek",
     ["See ya!"] = "Do zobaczenia!",
---      ["s"] = "", -- GaudyRacer, Space_Invasion
---      ["Shield boosted! +30 power"] = "",
---      ["Shield Depleted"] = "",
---      ["Shield is fully recharged!"] = "",
---      ["Shield Master!"] = "",
---      ["Shield Miser!"] = "",
---      ["Shield OFF:"] = "",
---      ["Shield ON:"] = "",
---      ["Shield Seeker!"] = "",
+--      ["selected!"] = "",
+    ["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!",
     ["Shotgun Team"] = "Strzelcy",
     ["Shotgun Training"] = "Trening strzelecki",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
---      ["Silly"] = "",
+--      ["shots remaining."] = "",
+    ["Silly"] = "Głuptas",
 --      ["Sinky"] = "",
     ["%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:",  
     ["Sniper Training"] = "Trening Snajperski",
     ["Sniperz"] = "Snajperzy",
---      ["Sponge"] = "",
+    ["Sponge"] = "Gąbka",
     ["Spooky Tree"] = "Straszne drzewo",
---      ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
---      ["Switched to "] = "",
+    ["s|"] = "s|",
+    ["s"] = "s", -- GaudyRacer, Space_Invasion
+    ["STATUS UPDATE"] = "WYNIKI", -- GaudyRacer, Space_Invasion
+    ["Switched to "] = "Przełączono na ",
     ["Team %d: "] = "Drużyna %d: ",
---      ["Team Scores"] = "", -- Control, Space_Invasion
+    ["Team Scores"] = "Punktacja(?)", -- Control, Space_Invasion
 --      ["That Sinking Feeling"] = "",
     ["That was pointless."] = "To było bezcelowe",
     ["The enemy is hiding out on yonder ducky!"] = "Na tamtej kaczce ukrywa się nasz przeciwnik!",
     ["The flag will respawn next round."] = "Flaga pojawi się ponownie przy następnej rundzie.",
---      ["The Nameless One"] = "",
---      ["THE SPECIALISTS"] = "",
+    ["The Nameless One"] = "Bezimienny",
+    ["THE SPECIALISTS"] = "SPECJALIŚCI",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
---      ["TIME: "] = "",
+    ["TIME: "] = "CZAS: ",
 --      ["Timed Kamikaze!"] = "",
---      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
---      ["Toggle Shield"] = "",
+    ["Time Extended!"] = "Dodatkowy Czas!",
+--      ["Time Extension"] = "",
+    ["Toggle Shield"] = "Wł/Wył Osłonę",
     ["Toxic Team"] = "Toksyczny zespół", 
---      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+    ["TRACK COMPLETED"] = "UKOŃCZONO TRASĘ",
+--      ["TRACK FAILED!"] = "",
     ["TrophyRace"] = "TrophyRace",
     ["T_T"] = "T_T",
---      ["Turn Time"] = "",
+--      ["Tumbling Time Extended!"] = "",
+    ["Turn Time"] = "Długość Tury",
+--      ["Unit"] = "",
     ["Unit 3378"] = "Jednostka 3378",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
     ["Use your rope to get from start to finish as fast as you can!"] = "Użyj liny by jak najszybciej dotrzec od startu do mety",
---      ["v.06"] = "",
     ["Victory for the "] = "Zwycięstwo przypadło",
---      ["Waypoint placed."] = "",
---      ["Weapons Reset"] = "",
---      ["WINNING TIME: "] = "",
---      ["You'd almost swear the water was rising!"] = "",
+    ["Waypoint placed."] = "Postawiono punkt orientacyjny",
+--      ["Way-Points Remaining"] = "",
+    ["Weapons Reset"] = "Bronie odnawiają się",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
+    ["WINNING TIME: "] = "ZWYCIĘSKI CZAS: ",
+    ["You'd almost swear the water was rising!"] = "Przysiągłbym, że woda zdaje się podnosić!",
     ["You have SCORED!!"] = "Zdobyłeś PUNKT",
---      ["You saved"] = "",
+    ["You saved"] = "Uratowałeś",
     ["You've failed. Try again."] = "Przegrałeś. Spróbuj jeszcze raz",
     ["You've reached the goal!| |Time: "] = "Dotarłeś do celu!| |Czas: ",
     ["'Zooka Team"] = "Bazookinierzy",
--- a/share/hedgewars/Data/Locale/pl.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pl.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -52,10 +52,10 @@
 00:49=Wskrzeszacz
 00:50=Wiertniczy nalot
 00:51=Kula błotna
-00:52=Nie wybrano broń
+00:52=Nie wybrano broni
 00:53=TARDIS
-00:54=Struktura
-00:55=Land Spray
+00:54=Budynek
+00:55=Miotacz błota
 
 01:00=Walczmy!
 01:01=Remis
@@ -72,6 +72,12 @@
 01:12=To już ostatnia runda przed Nagłą Śmiercią!
 01:13=Zostało %1 rund do Nagłej Śmierci!
 01:14=Bądź gotów, %1!
+01:15=Delikatne
+01:16=Słabe
+01:17=Normalne
+01:18=Duże
+01:19=Ekstremalne
+01:20=%1 odbicie
 
 ; Event messages
 ; Hog (%1) died
@@ -469,12 +475,11 @@
 02:10=To było odlotowe!
 
 ; Hog (%1) has to leave (team is gone)
-02:11=%1 musi iść do łóżka!
-02:11=%1 wydaje się zbyt zajęty, by grać
-02:11=Zostałeś zajęty zamrozić dla jeża, %1
-02:11=Źłe gry przestała, albo nie działa.
-02:11=%1 awaria z gracza
-02:11=Belka go, Szkot!
+02:11=%1 musi iść spać!
+02:11=%1 ma ważniejsze sprawy na głowie
+02:11=Żegnamy Cię, %1
+02:11=KSZSZ, KSZZ. Jest tam ktoś po drugiej stronie?
+02:11=%1 nie ma zamiaru dłużej grać
 02:11=%1 musi odejść
 
 ; Weapon Categories
@@ -532,7 +537,8 @@
 03:51=Znalezione na ziemi
 03:52=UNUSED
 03:53=Typ 40
-03:54=Zbudować coś
+03:54=Zbuduj coś przydatnego
+03:55=Narzędzie
 
 ; 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łą
@@ -582,9 +588,15 @@
 04:44=To nie jest zwykły ser. To broń biologiczna!|Wybuch z pewnością nie będzie potężny, ale gdy|licznik dojdzie do zera, chmura gazu zatruje|każdego nieszczęśnika który będzie w pobliżu|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
 04:45=Wszystkie lekcje fizyki w końcu się opłaciły!|Wystrzel niszczącą sinusoidalną falę|która przechodzi przez teren i uderza|w twoich przeciwników|Uważaj! Ta broń ma kopa!|Atak: Strzelaj
 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ść wystrzeliwania
-04:47=Podwójna zabawa z podwójną ilością 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: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=Wskrześ swoich przyjaciół!|Jednakże uważaj byś nie pomógł swojemu wrogowi.|Atak: Przytrzymaj by powoli przywracać życie|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 może gogoś zepchnąć z krawędzi!|Atak: Przytrzymaj by strzelić z większą siłą
+04:52=UNUSED
+04:53=Wybierz się na podróż w czasie i przestrzeni|zostawiając innne jeże na polu walki.|Bądź przygotowany na powrót w dowolnym momencie.|Gdy rozpocznie się|Nagła Śmierć lub większość jeży zostanie wybita.|Uwaga. Nie zadziała podczas Nagłej Śmierci,|gdy jesteś sam, lub jeśli jesteś Królem.
+04:54=INCOMPLETE                                                                                                                                     
+04:55=Wystrzel strumień kleistej mazi.|Buduj mosty, zasypuj wrogów, ztykaj tunele.|Uważaj by nie zasypać samego siebie!
 
 ; Game goal strings
 05:00=Ustawienia gry
@@ -608,4 +620,4 @@
 05:18=Tura nie kończy się po wykonaniu ataku
 05:19=Uzbrojenie zostaje przywrócone przy kolejnej turze
 05:20=Każdy z jeży ma oddzielne uzbrojenie
-05:21=Zespół Tag: Zespoły w klanie na kolejnych kolejkach|Wspólna Godzina: Drużyny w akcji raz z kolei klanu
+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
--- a/share/hedgewars/Data/Locale/pt_BR.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pt_BR.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
 --      ["!!!"] = "",
 --      ["..."] = "",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Pratique a sua pontaria", --Bazooka, Shotgun, SniperRifle
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 	["Bat balls at your enemies and|push them into the sea!"] = "Rebata as bolas em direção ao seus|e derrube-os no mar!",
 	["Bat your opponents through the|baskets and out of the map!"] = "Rebata seus oponentes para|fora do mapa através dos cestos!",
 	["Bazooka Training"] = "Treino com a Bazuca",
@@ -19,8 +26,10 @@
 --      ["BOOM!"] = "",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
 --      ["CAPTURE THE FLAG"] = "",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
 --      ["Codename: Teamwork"] = "",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
 --      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
 --      ["Dangerous Ducklings"] = "",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 	["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 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 enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
 --      ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+--      ["Energetic Engineer"] = "",
 --      ["Enjoy the swim..."] = "",
 --      ["[Enter]"] = "",
 	["Fastest lap: "] = "Volta mais rápida: ",
@@ -53,6 +67,9 @@
 --      ["Flag respawned!"] = "",
 --      ["Flag returned!"] = "",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
 --      ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
 --      ["GO! GO! GO!"] = "",
 --      ["Good birdy......"] = "",
 --      ["Good luck out there!"] = "",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 	["Hedgewars-Basketball"] = "Hedgewars-Basketball",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
 --      ["Listen up, maggot!!"] = "",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 --      ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 	["NEW fastest lap: "] = "NOVA volta mais rápida: ",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 	["Not So Friendly Match"] = "Partida não muito amigável", -- Basketball, Knockball
 --      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 --      ["Operation Diver"] = "",
 --      ["Opposing Team: "] = "",
 --      ["Pathetic Hog #%d"] = "",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["Poison"] = "",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 --      [" - 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"] = "",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
 --      ["RULES OF THE GAME [Press ESC to view]"] = "",
 --      ["s|"] = "",
@@ -116,6 +152,7 @@
 --      ["SCORE"] = "",
 --      ["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
 --      ["See ya!"] = "",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
 --      ["Shield Seeker!"] = "",
 	["Shotgun Team"] = "Carabineiros",
 	["Shotgun Training"] = "Treino com a Escopeta",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 	["%s is out and Team %d|scored a penalty!| |Score:"] = "%s está fora e a Equipe %d|sofreu uma penalidade!| |Pontuação:", -- Basketball, Knockball
@@ -146,26 +183,33 @@
 --      ["The flag will respawn next round."] = "",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 	["TrophyRace"] = "TrophyRace",
 --      ["T_T"] = "",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
 --      ["Unit 3378"] = "",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 	["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!",
---      ["v.06"] = "",
 --      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You have SCORED!!"] = "",
--- a/share/hedgewars/Data/Locale/pt_PT.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/pt_PT.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,26 +1,35 @@
 locale = {
-	["..."] = "...",
 	[":("] = ":(",
 	["!!!"] = "!!!",
+	["..."] = "...",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 	["a Hedgewars mini-game"] = "um mini-jogo Hedgewars", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Pratica a tua pontaria", --Bazooka, Shotgun, SniperRifle
+--      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
+--      ["Ammo Maniac!"] = "",
       ["Ammo"] = "Munições",
---      ["Ammo Depleted!"] = "",
---      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 	["Bat balls at your enemies and|push them into the sea!"] = "Bate bolas contra os teus|enimigos e empurra-os ao mar!",
 	["Bat your opponents through the|baskets and out of the map!"] = "Bate os teus adversarios|fora do mapa acertando com eles no cesto!",
 	["Bazooka Training"] = "Treino com Bazuca",
 	["Best laps per team: "] = "Melhores voltas por equipa: ",
 --      ["Best Team Times: "] = "",
 --      ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+	["Boom!"] = "Boom!",
 	["BOOM!"] = "BOOM!",
-	["Boom!"] = "Boom!",
 	["Boss defeated!"] = "Boss derrotado!",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
 	["CAPTURE THE FLAG"] = "CAPTURAR A BANDEIRA",
       ["Careless"] = "Descuidado",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
 --      ["Codename: Teamwork"] = "",
 	["Complete the track as fast as you can!"] = "Completa a pista o mais rápido que conseguires!",
@@ -32,8 +41,10 @@
 --      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
 	["Dangerous Ducklings"] = "Patinhos perigosos",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 	["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 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 enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
 --      ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+--      ["Energetic Engineer"] = "",
 	["Enjoy the swim..."] = "Aproveita o mergulho",
       ["[Enter]"] = "[Enter]",
 	["Fastest lap: "] = "Volta mais rápida: ",
@@ -53,6 +67,9 @@
 	["Flag respawned!"] = "Bandeira reiniciada!",
 	["Flag returned!"] = "Bandeira devolvida!",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
 --      ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
 	["GO! GO! GO!"] = "GO! GO! GO!",
 	["Good birdy......"] = "Bom passarito......",
 	["Good luck out there!"] = "Boa sorte aí fora!",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 	["Hahahaha!"] = "Hahahaha!",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 	["Hedgewars-Basketball"] = "Hedgewars-Basketball",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 	["Kamikaze Expert!"] = "Kamikaze profissional!",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 	["[Left Shift]"] = "[Shift Esquerdo]",
 	["Listen up, maggot!!"] = "Oiçam bem suas larvas!!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 	["|- Mines Time:"] = "|- Tempo das minas:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION FAILED"] = "MISSÃO FALHADA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION SUCCESSFUL"] = "MISSÃO COMPLETA", -- User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -90,9 +117,12 @@
 	["Movement: [Up], [Down], [Left], [Right]"] = "Movimento: [Cima], [Baixo], [Esquerda], [Direita]",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 	["NEW fastest lap: "] = "NOVA volta recorde: ",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 	["Not So Friendly Match"] = "Partida não muito amigável", -- Basketball, Knockball
 	["Oh no! Just try again!"] = "Oh não! Tenta novamente!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 	["Operation Diver"] = "Operação Mergulho",
 	["Opposing Team: "] = "Equipa adversária",
 	["Pathetic Hog #%d"] = "Ouriço patético #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] = "", -- Control, Space_Invasion
 	["Poison"] = "Poison",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 	[" - 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",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
 	["RULES OF THE GAME [Press ESC to view]"] = "REGRAS DE JOGO [Pressiona ESC para as visualizar]",
 	["RULES OF THE GAME [Press ESC to view]"] = "REGRAS DE JOGO [Pressiona ESC para as visualizar]",
@@ -117,7 +153,7 @@
 --      ["SCORE"] = "",
 	["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
 	["See ya!"] = "Chau!",
-	["s"] = "s", -- GaudyRacer, Space_Invasion
+--      ["selected!"] = "",
 --      ["Shield boosted! +30 power"] = "",
 	["Shield Depleted"] = "Escudo Esgotado",
 	["Shield is fully recharged!"] = "Escudo completamente recarregado!",
@@ -128,7 +164,7 @@
 --      ["Shield Seeker!"] = "",
 	["Shotgun Team"] = "Caçadores",
 	["Shotgun Training"] = "Treino com Caçadeira",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 	["%s is out and Team %d|scored a penalty!| |Score:"] = "%s está fora e a equipa %d|perde um ponto!| |Pontuação:", -- Basketball, Knockball
@@ -137,6 +173,7 @@
 	["Sniperz"] = "Sniperz",
 --      ["Sponge"] = "",
 --      ["Spooky Tree"] = "",
+	["s"] = "s", -- GaudyRacer, Space_Invasion
 --      ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
 --      ["Switched to "] = "",
 	["Team %d: "] = "Equipa %d: ",
@@ -147,27 +184,34 @@
 	["The flag will respawn next round."] = "A bandeira ira reaparecer no próximo turno.",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
-      ["TIME: "] = "TEMPO: ",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
-      ["Time Left: "] = "Tempo Restante: ",
+--      ["Time Extension"] = "",
+      ["TIME: "] = "TEMPO: ",
 --      ["Toggle Shield"] = "",
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 	["TrophyRace"] = "TrophyRace",
 	["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
 	["Unit 3378"] = "Unidade 3378",
+--      ["Unit 835"] = "",
 	["Unlimited Attacks"] = "Ataques Ilimitados",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 	["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!",
---      ["v.06"] = "",
 --      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 	["Victory for the"] = "Vitória para a",
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
 	["You have SCORED!!"] = "Marcaste!!",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/ru.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,220 @@
+locale = {
+--      [":("] = "",
+--      ["!!!"] = "",
+--      ["..."] = "",
+      ["Accuracy Bonus!"] = "Бонус за аккуратность!",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+      ["a Hedgewars mini-game"] = "Мини-игра в Hedgewars", -- Space_Invasion, The_Specialists
+      ["Aiming Practice"] = "Упражнение на точность", --Bazooka, Shotgun, SniperRifle
+--      ["Ammo"] = "",
+--      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
+--      ["Ammo Maniac!"] = "",
+--      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
+--      ["Bat balls at your enemies and|push them into the sea!"] = "",
+--      ["Bat your opponents through the|baskets and out of the map!"] = "",
+      ["Bazooka Training"] = "Упражнение с базукой",
+--      ["Best laps per team: "] = "",
+--      ["Best Team Times: "] = "",
+--      ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+      ["Boom!"] = "Бум!",
+      ["BOOM!"] = "БАБАХ!",
+--      ["Boss defeated!"] = "",
+--      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
+      ["CAPTURE THE FLAG"] = "ЗАХВАТ ФЛАГА",
+--      ["Careless"] = "",
+      ["Change Weapon"] = "Сменить оружие",
+--      ["Clumsy"] = "",
+--      ["Codename: Teamwork"] = "",
+--      ["Complete the track as fast as you can!"] = "",
+      ["Congratulations!"] = "Поздравления!",
+--      ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "", --Bazooka, Shotgun, SniperRifle
+--      ["Control pillars to score points."] = "",
+--      ["Cybernetic Empire"] = "",
+--      ["DAMMIT, ROOKIE!"] = "",
+--      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
+--      ["Dangerous Ducklings"] = "",
+--      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
+--      ["Depleted Kamikaze!"] = "",
+--      ["Destroy invaders to score points."] = "",
+      ["Double Kill!"] = "Двойное убийство!",
+--      ["Drone Hunter!"] = "",
+--      ["Drowner"] = "",
+--      ["Each turn you get 1-3 random weapons"] = "",
+--      ["Each turn you get one random weapon"] = "",
+--      ["Eliminate all enemies"] = "",
+--      ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
+--      ["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 enemy hogs to win."] = "",
+--      ["Eliminate the enemy specialists."] = "",
+--      ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+--      ["Energetic Engineer"] = "",
+      ["Enjoy the swim..."] = "Приятного плавания...",
+--      ["[Enter]"] = "",
+--      ["Fastest lap: "] = "",
+--      ["Feeble Resistance"] = "",
+--      ["Fire"] = "",
+--      ["Flag captured!"] = "",
+--      ["Flag respawned!"] = "",
+--      ["Flag returned!"] = "",
+--      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
+--      ["GAME BEGUN!!!"] = "",
+--      ["Game Modifiers: "] = "",
+      ["GAME OVER!"] = "ИГРА ОКОНЧЕНА!",
+--      ["Game Started!"] = "",
+--      ["Get on over there and take him out!"] = "",
+      ["Goal"] = "Цель",
+--      ["GO! GO! GO!"] = "",
+--      ["Good birdy......"] = "",
+--      ["Good luck out there!"] = "",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
+      ["GOTCHA!"] = "ПОПАЛСЯ!",
+--      ["Grab Mines/Explosives"] = "",
+--      ["Hahahaha!"] = "",
+--      ["Haha, now THAT would be something!"] = "",
+--      ["Hapless Hogs"] = "",
+--      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
+--      ["Heavy"] = "",
+--      ["Hedgewars-Basketball"] = "",
+--      ["Hedgewars-Knockball"] = "",
+--      ["Heh, it's not that bad."] = "",
+--      ["Hit Combo!"] = "",
+      ["Hmmm..."] = "Хммм...",
+      ["Hooray!"] = "Ура!",
+      ["Hunter"] = "Охотник", --Bazooka, Shotgun, SniperRifle
+      ["Instructor"] = "Инструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
+--      ["invaders destroyed"] = "",
+--      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
+      ["Jumping is disabled"] = "Прыжки отключены",
+--      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
+--      ["KILLS"] = "",
+      ["Last Target!"] = "Последняя цель!",
+--      ["[Left Shift]"] = "",
+--      ["Listen up, maggot!!"] = "",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
+--      ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+      ["MISSION FAILED"] = "МИССИЯ ПРОВАЛЕНА", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["MISSION SUCCESS"] = "",
+      ["MISSION SUCCESSFUL"] = "МИССИЯ УСПЕШНА", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Movement: [Up], [Down], [Left], [Right]"] = "",
+--      ["Multi-shot!"] = "",
+      ["Nameless Heroes"] = "Безымянные герои",
+--      ["New Barrels Per Turn"] = "",
+      ["NEW CLAN RECORD: "] = "НОВЫЙ РЕКОРД КЛАНА: ",
+--      ["NEW fastest lap: "] = "",
+--      ["New Mines Per Turn"] = "",
+--      ["NEW RACE RECORD: "] = "",
+      ["Newton's Hammock"] = "Гамак Ньютона",
+--      ["NOT ENOUGH WAYPOINTS"] = "",
+--      ["Not So Friendly Match"] = "", -- Basketball, Knockball
+--      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Oh no! Time's up! Just try again."] = "", --Bazooka, Shotgun, SniperRifle
+--      ["Operation Diver"] = "",
+--      ["Opposing Team: "] = "",
+--      ["Pathetic Hog #%d"] = "",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+--      ["Per-Hog Ammo"] = "",
+--      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
+--      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+      ["Poison"] = "Яд",
+--      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
+--      ["Press [Precise] to skip intro"] = "",
+--      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
+--      [" - 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"] = "",
+--      ["Round Limit:"] = "",
+--      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
+--      ["Rounds Complete"] = "",
+--      ["RULES OF THE GAME [Press ESC to view]"] = "",
+--      ["s|"] = "",
+--      ["Save as many hapless hogs as possible!"] = "",
+--      ["SCORE"] = "",
+      ["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
+      ["See ya!"] = "Увидимся!",
+--      ["selected!"] = "",
+--      ["s"] = "", -- GaudyRacer, Space_Invasion
+--      ["Shield boosted! +30 power"] = "",
+--      ["Shield Depleted"] = "",
+--      ["Shield is fully recharged!"] = "",
+--      ["Shield Master!"] = "",
+--      ["Shield Miser!"] = "",
+--      ["Shield OFF:"] = "",
+--      ["Shield ON:"] = "",
+--      ["Shield Seeker!"] = "",
+--      ["Shotgun Team"] = "",
+--      ["Shotgun Training"] = "",
+--      ["shots remaining."] = "",
+--      ["Silly"] = "",
+--      ["Sinky"] = "",
+--      ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball
+--      ["%s is out and Team %d|scored a point!| |Score:"] = "", -- Basketball, Knockball
+      ["Sniper Training"] = "Тренировка снайпера",
+--      ["Sniperz"] = "",
+--      ["Sponge"] = "",
+--      ["Spooky Tree"] = "",
+--      ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
+--      ["Switched to "] = "",
+      ["Team %d: "] = "Команда %d: ",
+      ["Team Scores"] = "Очки команды", -- Control, Space_Invasion
+--      ["That Sinking Feeling"] = "",
+--      ["That was pointless."] = "",
+--      ["The enemy is hiding out on yonder ducky!"] = "",
+--      ["The flag will respawn next round."] = "",
+--      ["The Nameless One"] = "",
+--      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
+--      ["This rain is really something..."] = "",
+      ["TIME: "] = "ВРЕМЯ: ",
+--      ["Timed Kamikaze!"] = "",
+--      ["Time Extended!"] = "",
+--      ["Time Extension"] = "",
+--      ["Toggle Shield"] = "",
+--      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["TRACK COMPLETED"] = "",
+--      ["TRACK FAILED!"] = "",
+--      ["TrophyRace"] = "",
+--      ["T_T"] = "",
+--      ["Tumbling Time Extended!"] = "",
+--      ["Turn Time"] = "",
+--      ["Unit"] = "",
+--      ["Unit 3378"] = "",
+--      ["Unit 835"] = "",
+--      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
+--      ["User Challenge"] = "",
+--      ["Use your rope to get from start to finish as fast as you can!"] = "",
+--      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
+--      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
+--      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
+--      ["WINNING TIME: "] = "",
+--      ["You'd almost swear the water was rising!"] = "",
+--      ["You have SCORED!!"] = "",
+--      ["You saved"] = "",
+--      ["You've failed. Try again."] = "",
+--      ["You've reached the goal!| |Time: "] = "",
+--      ["'Zooka Team"] = "",
+    }
--- a/share/hedgewars/Data/Locale/ru.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/ru.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -45,7 +45,7 @@
 00:42=Портативный телепорт
 00:43=Фортепьяновый удар
 00:44=Старый Лимбургер
-00:45=Синус-пушка (в разработке)
+00:45=Синус-пушка (бета)
 00:46=Огнемет
 00:47=Мина-липучка
 00:48=Молот
@@ -53,9 +53,9 @@
 00:50=Сверлящий удар
 00:51=Комок грязи
 00:52=Оружие не выбрано
-00:53=Машина времени и пространства
+00:53=Будка времени
 00:54=Структура
-00:55=Земляной распылитель
+00:55=Распылитель земли
 
 01:00=Вперёд к победе!
 01:01=Ничья
@@ -107,11 +107,11 @@
 02:00=%1 уже не достанет свой Desert Eagle
 02:00=%1 заплатил сполна
 02:00=%1 мог бы воспользоваться аптечкой
-02:00=%1 ушел играть в игру получше
+02:00=%1 ушел играть лучшую игру
 02:00=%1 прожил трудную жизнь
 02:00=%1 вышел из строя
 02:00=Бедный, бедный %1...
-02:00=%1 предпочитает Wormux
+02:00=%1 предпочитает Warmux
 02:00=%1 принял удар на себя
 02:00=%1 герой среди лю...гм...ежей
 02:00=%1 занял свое место в Валгале
@@ -125,7 +125,7 @@
 02:00=Скажите "Прощай, %1!"
 02:00=Надежды больше нет, %1
 02:00=Это было твое последнее представление, %1
-02:00=Закури перед смертью, %1, т.к твоему здоровью это уже не повредит
+02:00=Закури перед смертью, %1, твоему здоровью это уже не повредит
 02:00=%1 испытал Внезапный Массовый Отказ в Системе Жизнеобеспечения (C)
 02:00=%1 преставился
 02:00=%1 стопроцентный труп
@@ -152,7 +152,7 @@
 02:01=%1 помылся
 02:01=%1 - это один мокрый ёж
 02:01=%1 забыл надеть спасательный жилет
-02:01=%1 плескается в воде
+02:01=%1 плещется в воде
 02:01=%1 спит среди рыб
 02:01=%1 думал, что физика воды в этой игре полный отстой
 02:01=%1 испытывает жажду
@@ -176,7 +176,7 @@
 02:01=%1 пошел посмотреть аквариум
 02:01=%1 нашёл потерянный город Атлантиды
 02:01=%1 стремится к главной роли в игре Bioshock 3
-02:01=Твое плаванье по-сабачьи принесло мало пользы, %1
+02:01=Твое плаванье по-собачьи принесло мало пользы, %1
 02:01=%1 забыл взять гидроцикл
 02:01=%1 не любит водный спорт
 02:01=%1 всегда пускает пузыри
@@ -338,9 +338,9 @@
 02:08=%1 вообще не хотел идти в армию
 02:08=Хватит впустую тратить время, %1
 02:08=Я разочарован тобой, %1
-02:08=Давай, ты можешь добиться большего, чем этот %1
+02:08=Давай, ты можешь быть лучше, чем сейчас, %1
 02:08=Намерения %1 провалились
-02:08=%1 очевидно знает более интересные дела
+02:08=%1, очевидно, знает более интересные дела
 02:08=%1 оцепенел от страха
 02:08=%1 уснул
 
@@ -383,7 +383,7 @@
 ; Hog shot an home run (using the bat and another hog)
 02:10=Хоум-ран!
 02:10=Птица, самолет, ...
-02:10=Тот отсутствует!
+02:10=Вылетел!
 
 ; Hog (%1) has to leave (team is gone)
 02:11=%1 должен идти спать!
@@ -435,8 +435,9 @@
 03:40=Испепеляющая граната
 03:41=Большой поклонник Squawks
 03:42=Здесь я веду записи...
+
 ; the misspelled "Beethoven" is intentional (-> to beat)
-03:43=Исполнение смертельной сонаты Бетховена
+03:43=Исполнение смертельной сонаты Битьховена
 03:44=Годен до: 1923
 03:45=Достижения науки
 03:46=Горячо, горячо, горячо!
@@ -448,6 +449,7 @@
 03:52=Не используется
 03:53=Модель 40
 03:54=Построй что нибудь
+03:55=Полезная вещь
 
 ; Weapon Descriptions (use | as line breaks)
 04:00=Атакуй своих врагов обычной гранатой.|Она взорвется сразу, как только таймер|достигнет нуля.|1-5: Установить таймер гранаты|Атака: Удерживай для более дальнего броска
--- a/share/hedgewars/Data/Locale/sk.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/sk.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,24 +3,33 @@
         ["!!!"] = "!!!",
 --      ["..."] = "",
         ["Accuracy Bonus!"] = "Bonus za presnosť!",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
         ["a Hedgewars mini-game"] = "minihra Hedgewars", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Tréning presnosti", --Bazooka, Shotgun, SniperRifle
+        ["Ammo Depleted!"] = "Výzbroj vyčerpaná!",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
+--      ["Ammo Maniac!"] = "",
         ["Ammo"] = "Výzbroj",
-        ["Ammo Depleted!"] = "Výzbroj vyčerpaná!",
---      ["Ammo Maniac!"] = "",
         ["Available points remaining: "] = "Zostavajúci počet bodov: ",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 	["Bat balls at your enemies and|push them into the sea!"] = "Loptami triafajte vašich nepriateľov|a zhoďte ich tak do mora!",
 	["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 Training"] = "Tréning s bazukou",
 	["Best laps per team: "] = "Najrýchlejšie kolá podľa tímov: ",
         ["Best Team Times: "] = "Najrýchlejšie tímové časy: ",
         ["Bloody Rookies"] = "Mizerní zelenáči", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+        ["Boom!"] = "Bum!",
         ["BOOM!"] = "BUM!",
-        ["Boom!"] = "Bum!",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
         ["CAPTURE THE FLAG"] = "ZMOCNITE SA VLAJKY",
         ["Careless"] = "Bezstarostný",
+--      ["Change Weapon"] = "",
         ["Clumsy"] = "Nešikovný",
         ["Codename: Teamwork"] = "Kódové meno: Teamová práca",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
         ["DAMMIT, ROOKIE!"] = "Prekliaty zelenáč!",
         ["Dangerous Ducklings"] = "Nebezpečné kačiatka",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 	["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 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"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+--      ["Eliminate the enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
         ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Zneškodnite Jednotku 3378|- Slabý odpor musí prežiť",
+--      ["Energetic Engineer"] = "",
         ["Enjoy the swim..."] = "Užite si plávanie...",
 --      ["[Enter]"] = "",
 	["Fastest lap: "] = "Najrýchlejšie kolo: ",
@@ -53,6 +67,9 @@
         ["Flag respawned!"] = "Vlajka obnovená!",
         ["Flag returned!"] = "Vlajka vrátená!",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
         ["GAME OVER!"] = "KONIEC HRY!",
@@ -62,11 +79,15 @@
         ["GO! GO! GO!"] = "POĎ! POĎ! POĎ!",
         ["Good birdy......"] = "Dobrý vtáčik......",
         ["Good luck out there!"] = "Veľa šťastia!",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 	["Hedgewars-Basketball"] = "Hedgewars-Basketbal",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
         ["Listen up, maggot!!"] = "Počúvaj, ty biedny červ!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
         ["|- Mines Time:"] = "|- Časovač pre míny:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
         ["MISSION FAILED"] = "MISIA NEÚSPEŠNÁ", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
         ["Movement: [Up], [Down], [Left], [Right]"] = "Pohyb: [Hore], [Dole], [Vľavo], [Vpravo]",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 	["NEW fastest lap: "] = "NOVÉ najrýchlejšie kolo: ",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 	["Not So Friendly Match"] = "Nie tak celkom priateľský zápas", -- Basketball, Knockball
         ["Oh no! Just try again!"] = "Áále nie! Tak to skúste znovu!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
         ["Operation Diver"] = "Operácia Potápač",
         ["Opposing Team: "] = "Nepriateľský tím",
         ["Pathetic Hog #%d"] = "Žalostný ježko #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
         ["points"] = "body", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
         ["Poison"] = "Poison",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
         [" - 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ú",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
         ["RULES OF THE GAME [Press ESC to view]"] = "PRAVIDLÁ HRY [Stlačte Esc pre ich zobrazenie]",
 --      ["s|"] = "",
@@ -116,6 +152,7 @@
 --      ["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
         ["See ya!"] = "Tak zatiaľ!",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
 --      ["Shield Seeker!"] = "",
 	["Shotgun Team"] = "Shotgun tím",
 	["Shotgun Training"] = "Tréning s brokovnicou",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 	["%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
@@ -146,26 +183,33 @@
         ["The flag will respawn next round."] = "V ďalšom kole sa obnoví vlajka.",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
         ["TIME: "] = "ČAS: ",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
         ["Toxic Team"] = "Toxic tím", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
-        ["Track Time: "] = "Čas: ",
+--      ["TRACK FAILED!"] = "",
 	["TrophyRace"] = "Preteky o trofej",
         ["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
         ["Turn Time"] = "Čas na ťah",
+--      ["Unit"] = "",
         ["Unit 3378"] = "Jednotka 3378",
+--      ["Unit 835"] = "",
         ["Unlimited Attacks"] = "Neobmedzené útoky",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 	["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!",
-        ["v.06"] = "v.06",
         ["Victory for the "] = "Víťazstvo pre", -- CTF_Blizzard, Capture_the_Flag
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
         ["You have SCORED!!"] = "SKÓROVALI ste!!",
--- a/share/hedgewars/Data/Locale/stub.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/stub.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
 --      ["!!!"] = "",
 --      ["..."] = "",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 --      ["Aiming Practice"] = "", --Bazooka, Shotgun, SniperRifle
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 --      ["Bat balls at your enemies and|push them into the sea!"] = "",
 --      ["Bat your opponents through the|baskets and out of the map!"] = "",
 --      ["Bazooka Training"] = "",
@@ -19,8 +26,10 @@
 --      ["BOOM!"] = "",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
 --      ["CAPTURE THE FLAG"] = "",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
 --      ["Codename: Teamwork"] = "",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
 --      ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "",
 --      ["Dangerous Ducklings"] = "",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 --      ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
 --      ["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 enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
 --      ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "",
+--      ["Energetic Engineer"] = "",
 --      ["Enjoy the swim..."] = "",
 --      ["[Enter]"] = "",
 --      ["Fastest lap: "] = "",
@@ -53,6 +67,9 @@
 --      ["Flag respawned!"] = "",
 --      ["Flag returned!"] = "",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
 --      ["GAME OVER!"] = "",
@@ -62,11 +79,15 @@
 --      ["GO! GO! GO!"] = "",
 --      ["Good birdy......"] = "",
 --      ["Good luck out there!"] = "",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 --      ["Hedgewars-Basketball"] = "",
 --      ["Hedgewars-Knockball"] = "",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
 --      ["Listen up, maggot!!"] = "",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 --      ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 --      ["NEW fastest lap: "] = "",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 --      ["Not So Friendly Match"] = "", -- Basketball, Knockball
 --      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 --      ["Operation Diver"] = "",
 --      ["Opposing Team: "] = "",
 --      ["Pathetic Hog #%d"] = "",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["Poison"] = "",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 --      [" - 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"] = "",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
 --      ["RULES OF THE GAME [Press ESC to view]"] = "",
 --      ["s|"] = "",
@@ -116,6 +152,7 @@
 --      ["SCORE"] = "",
 --      ["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
 --      ["See ya!"] = "",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
 --      ["Shield Seeker!"] = "",
 --      ["Shotgun Team"] = "",
 --      ["Shotgun Training"] = "",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 --      ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball
@@ -146,26 +183,33 @@
 --      ["The flag will respawn next round."] = "",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 --      ["TrophyRace"] = "",
 --      ["T_T"] = "",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
 --      ["Unit 3378"] = "",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 --      ["Use your rope to get from start to finish as fast as you can!"] = "",
---      ["v.06"] = "",
 --      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You have SCORED!!"] = "",
--- a/share/hedgewars/Data/Locale/sv.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/sv.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -3,12 +3,19 @@
 	[":("] = ":(",
 	["!!!"] = "!!!",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Siktesövning", --Bazooka, Shotgun, SniperRifle
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
 	["Bat balls at your enemies and|push them into the sea!"] = "Slå bollar mot dina fiender|och slå ner dem i havet",
 	["Bat your opponents through the|baskets and out of the map!"] = "Slå ner dina motståndare i|korgarna och ut ur kartan!",
 	["Bazooka Training"] = "Bazookaträning",
@@ -19,8 +26,10 @@
     ["Boom!"] = "Bom!",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
 	["CAPTURE THE FLAG"] = "CAPTURE THE FLAG",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
 	["Codename: Teamwork"] = "Kodnamn: Lagarbete",
 --      ["Complete the track as fast as you can!"] = "",
@@ -32,8 +41,10 @@
 	["DAMMIT, ROOKIE!"] = "SATAN, GRÖNGÖLING!",
 	["Dangerous Ducklings"] = "Farliga ankungar",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -42,8 +53,11 @@
 	["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 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 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",
+--      ["Energetic Engineer"] = "",
 	["Enjoy the swim..."] = "Ha en trevlig simtur...",
 --      ["[Enter]"] = "",
 	["Fastest lap: "] = "Snabbast varv: ",
@@ -53,6 +67,9 @@
 	["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"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
 	["GAME OVER!"] = "SPELET ÄR SLUT!",
@@ -62,11 +79,15 @@
 	["GO! GO! GO!"] = "Kör! Kör! Kör!",
 	["Good birdy......"] = "Fin fågel......",
 	["Good luck out there!"] = "Lycka till där ute!",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
 	["Hedgewars-Basketball"] = "Hedgewars-Basket",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
@@ -80,9 +101,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
 	["Listen up, maggot!!"] = "Hör här, ynkrygg!!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
     ["|- Mines Time:"] = "|- Mintid:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION FAILED"] = "UPPDRAG MISSLYCKADES", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -90,9 +117,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
 	["NEW fastest lap: "] = "NYTT snabbast varv: ",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
 	["Not So Friendly Match"] = "En inte så vänlig match", -- Basketball, Knockball
 	["Oh no! Just try again!"] = "Å nej! Bara att försöka igen!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -100,15 +130,21 @@
 	["Operation Diver"] = "Operationens dykare",
 	["Opposing Team: "] = "Motståndarlag: ",
 	["Pathetic Hog #%d"] = "Patetisk kott #%d",
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 	["Poison"] = "Gift",
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 	[" - 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",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
 	["RULES OF THE GAME [Press ESC to view]"] = "SPELREGLER [Tryck ESC för att se]",
 --      ["s|"] = "",
@@ -116,6 +152,7 @@
 --      ["SCORE"] = "",
     ["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
 	["See ya!"] = "Ses!",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -127,7 +164,7 @@
 --      ["Shield Seeker!"] = "",
 	["Shotgun Team"] = "Hagelgevärslaget",
 	["Shotgun Training"] = "Hagelgevärsträning",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
 	["%s is out and Team %d|scored a penalty!| |Score:"] = "%s är ute och lag %d|fick ett straff!| |Poängställning:", -- Basketball, Knockball
@@ -146,26 +183,33 @@
     ["The flag will respawn next round."] = "Flaggan kommer tillbaka nästa runda.",
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
 	["Toxic Team"] = "Förgiftade laget", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
 	["TrophyRace"] = "TrophyRace",
 	["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
 	["Unit 3378"] = "Enhet 3378",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
 	["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!",
---      ["v.06"] = "",
 	["Victory for the "] = "Vinst för", -- CTF_Blizzard, Capture_the_Flag
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
 	["You have SCORED!!"] = "Du har tagit poäng!",
--- a/share/hedgewars/Data/Locale/uk.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/uk.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,28 +1,38 @@
 locale = {
 --      [":("] = "",
+        ["!!!"] = "Я!",
 --      ["..."] = "",
---      ["Accuracy Bonus!"] = "",
---      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
+        ["Accuracy Bonus!"] = "Бонус Точності!",
+        ["Achievement Unlocked"] = "Досягнення Розблоковано", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+        ["a Hedgewars mini-game"] = "Міні-гра Hedgewars", -- Space_Invasion, The_Specialists
         ["Aiming Practice"] = "Практика прицілювання", --Bazooka, Shotgun, SniperRifle
---      ["Ammo"] = "",
---      ["Ammo Depleted!"] = "",
---      ["Ammo Maniac!"] = "",
---      ["Available points remaining: "] = "",
+        ["Ammo"] = "Боєприпаси",
+        ["Ammo Depleted!"] = "Боєприпаси Скінчились!",
+        ["ammo extended!"] = "Боєприпаси поповнені!",
+        ["Ammo is reset at the end of your turn."] = "Боєприпаси обнуляються в кінці вашого ходу.",
+        ["Ammo Maniac!"] = "Маніяк Боєприпасів!",
+        ["Available points remaining: "] = "Залишилось доступних очків: ",
+--      ["[Backspace]"] = "",
+        ["Bamboo Thicket"] = "Бамбукові Хащі",
+        ["Barrel Eater!"] = "Поїдач Бочок!",
+        ["Barrel Launcher"] = "Катапульта для бочок",
         ["Bat balls at your enemies and|push them into the sea!"] = "Закидайте ворогів м'ячами щоб|зіштовути їх у море!",
         ["Bat your opponents through the|baskets and out of the map!"] = "Дубасьте опонентів битою через|кошики та за межі карти!",
         ["Bazooka Training"] = "Тренування з базукою",
         ["Best laps per team: "] = "Кращі партії на команду: ",
---      ["Best Team Times: "] = "",
+        ["Best Team Times: "] = "Кращий Командний Час: ",
         ["Bloody Rookies"] = "Криваві Салаги", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
---      ["BOOM!"] = "",
+        ["BOOM!"] = "БАБАХ!",
         ["Boom!"] = "Бабах!",
---      ["Boss defeated!"] = "",
---      ["Boss Slayer!"] = "",
+        ["Boss defeated!"] = "Боса переможено!",
+        ["Boss Slayer!"] = "Вбивця Боса!",
+        ["Build a track and race."] = "Створіть трасу та женіть.",
         ["CAPTURE THE FLAG"] = "ЗАХОПЛЕННЯ ПРАПОРА",
---      ["Careless"] = "",
---      ["Clumsy"] = "",
+        ["Careless"] = "Безтурботний",
+        ["Change Weapon"] = "Змінити Зброю",
+        ["Clumsy"] = "Незграбний",
         ["Codename: Teamwork"] = "Кодова назва: Командна гра",
---      ["Complete the track as fast as you can!"] = "",
+        ["Complete the track as fast as you can!"] = "Подолайте трасу так швидко, як тільки зможете!",
         ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Вітаємо! Ви знищили всі цілі|в межах дозволеного часу.", --Bazooka, Shotgun, SniperRifle
         ["Congratulations!"] = "Вітаємо!",
         ["Control pillars to score points."] = "Контрольюй стовпи щоб набрати очки.",
@@ -30,147 +40,181 @@
         ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА! ЗЛІЗЬ З МОЄЇ ГОЛОВИ!",
         ["DAMMIT, ROOKIE!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА!",
         ["Dangerous Ducklings"] = "Небезпечні Каченята",
---      ["Deadweight"] = "",
---      ["Depleted Kamikaze!"] = "",
---      ["Destroy invaders to score points."] = "",
---      ["Drone Hunter!"] = "",
---      ["Drowner"] = "",
---      ["Each turn you get 1-3 random weapons"] = "",
---      ["Each turn you get one random weapon"] = "",
+        ["Deadweight"] = "Власна вага",
+        ["Demolition is fun!"] = "Руйнування це весело!",
+        ["Depleted Kamikaze!"] = "Виснажений Камікадзе!",
+        ["Destroy invaders to score points."] = "Знищіть загарбників, щоб набрати очки.",
+        ["Double Kill!"] = "Подвійне Вбивство!",
+        ["Drone Hunter!"] = "Мисливець за Джмелями!",
+        ["Drowner"] = "Потопаючий",
+        ["Each turn you get 1-3 random weapons"] = "Кожного ходу ви отримуєте 1-3 випадкової зброї",
+        ["Each turn you get one random weapon"] = "Кожного ходу ви отримуєте одну випадкову зброю",
         ["Eliminate all enemies"] = "Ліквідуйте всіх ворогів",
         ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Знищіть всі цілі до закінчення часу.|У вас безмежні боєприпаси.", --Bazooka, Shotgun, SniperRifle
         ["Eliminate Poison before the time runs out"] = "Знешкодьте Смердюка до закінчення часу",
         ["Eliminate the Blue Team"] = "Знищіть Синю Команду",
---      ["Eliminate the enemy specialists."] = "",
+        ["Eliminate the enemy before the time runs out"] = "Знешкодьте ворога до закінчення часу", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+        ["Eliminate the enemy hogs to win."] = "Знешкодьте ворожих їжаків щоб перемогти.",
+        ["Eliminate the enemy specialists."] = "Знешкодьте ворожих спеціалістів.",
         ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Знищіть Об'єкт 3378 |- Жалюгідні Повстанці повинні вижити",
+        ["Energetic Engineer"] = "Енергетичний Інженер",
         ["Enjoy the swim..."] = "Насолоджуйся плаванням...",
 --      ["[Enter]"] = "",
         ["Fastest lap: "] = "Найшвидша партія: ",
         ["Feeble Resistance"] = "Жалюгідні Повстанці",
---      ["Fire"] = "",
+        ["Fire"] = "Вогонь",
         ["Flag captured!"] = "Прапор захоплено!",
         ["Flag respawned!"] = "Прапор відновлено!",
         ["Flag returned!"] = "Прапор повернено!",
---      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
---      ["GAME BEGUN!!!"] = "",
---      ["Game Modifiers: "] = "",
+        ["Flags, and their home base will be placed where each team ends their first turn."] = "Прапори і їх базування будуть розміщені там, де кожна команда закінчить її перший хід.",
+        ["Flamer"] = "Вогнемет",
+        ["Friendly Fire!"] = "Дружній Вогонь!",
+        ["fuel extended!"] = "пальне поповнене!",
+        ["GAME BEGUN!!!"] = "ГРА ПОЧАЛАСЬ!!!",
+        ["Game Modifiers: "] = "Модифікатори Гри: ",
         ["GAME OVER!"] = "КІНЕЦЬ ГРИ!",
         ["Game Started!"] = "Гра почалась!",
         ["Get on over there and take him out!"] = "Залізь туди і прикінчи його!",
---      ["Goal"] = "",
+        ["Goal"] = "Мета",
         ["GO! GO! GO!"] = "ДАВАЙ! ДАВАЙ! РУХАЙСЯ!",
         ["Good birdy......"] = "Гарна пташка......",
         ["Good luck out there!"] = "Удачі!",
---      ["GOTCHA!"] = "",
---      ["Hahahaha!"] = "",
---      ["Haha, now THAT would be something!"] = "",
---      ["Hapless Hogs"] = "",
---      [" Hapless Hogs left!"] = "",
---      ["Heavy"] = "",
+        ["Good so far!"] = "Покищо добре!",
+        ["Good to go!"] = "Так тримати!",
+        ["GOTCHA!"] = "ПОПАВСЯ!",
+        ["Grab Mines/Explosives"] = "Схопити Міни/Вибухівку",
+        ["Hahahaha!"] = "Хахахаха!",
+        ["Haha, now THAT would be something!"] = "Хаха, от ЦЕ буде щось!",
+        ["Hapless Hogs"] = "Нещасні Їжаки",
+        [" Hapless Hogs left!"] = " Нещасних Їжаків лишилось!",
+        ["Health crates extend your time."] = "Ящики зі здоров'ям продовжують ваш час.",
+        ["Heavy"] = "В'ялий",
         ["Hedgewars-Basketball"] = "Баскетбол Їжаками",
         ["Hedgewars-Knockball"] = "Бейсбол Їжаками",
---      ["Heh, it's not that bad."] = "",
---      ["Hit Combo!"] = "",
+        ["Heh, it's not that bad."] = "хех, це не так вже й погано.",
+        ["Hit Combo!"] = "Зробив Комбо!",
         ["Hmmm..."] = "Хмм...",
         ["Hooray!"] = "Урааа!",
         ["Hunter"] = "Мисливець", --Bazooka, Shotgun, SniperRifle
         ["Instructor"] = "Інструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
---      ["invaders destroyed"] = "",
---      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
---      ["Jumping is disabled"] = "",
---      ["Kamikaze Expert!"] = "",
---      ["KILLS"] = "",
---      ["[Left Shift]"] = "",
+        ["invaders destroyed"] = "Загарбників знищено",
+        ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Це чудово що РАПТОВА СМЕРТЬ віддалилась на 99 ходів...",
+        ["Jumping is disabled"] = "Стрибання вимкнене",
+        ["Kamikaze Expert!"] = "Камікадзе Експерт!",
+        ["Keep it up!"] = "Так тримати!",
+        ["Killing spree!"] = "Череда вбивств!",
+        ["KILLS"] = "ВБИВСТВ",
+        ["Last Target!"] = "Остання Ціль!",
+        ["[Left Shift]"] = "[Лівий Shift]",
         ["Listen up, maggot!!"] = "Слухай, хробак!",
+        ["Lively Lifeguard"] = "Жвавий Рятівник",
+        ["Mine Deployer"] = "Мінер",
+        ["Mine Eater!"] = "Поїдач Мін!",
         ["|- Mines Time:"] = "|- Час детонування мін:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
         ["MISSION FAILED"] = "МІСІЮ ПРОВАЛЕНО", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["MISSION SUCCESS"] = "",
+        ["MISSION SUCCESS"] = "УСПІХ МІСІЇ",
         ["MISSION SUCCESSFUL"] = "МІСІЮ ВИКОНАНО", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["Movement: [Up], [Down], [Left], [Right]"] = "",
---      ["Multi-shot!"] = "",
---      ["Nameless Heroes"] = "",
---      ["NEW CLAN RECORD: "] = "",
+        ["Movement: [Up], [Down], [Left], [Right]"] = "Керування: [Вверх], [Вниз], [Вліво], [Вправо]",
+        ["Multi-shot!"] = "Мультипостріл!",
+        ["Nameless Heroes"] = "Безіменні Герої",
+        ["New Barrels Per Turn"] = "Нових Бочок на Хід",
+        ["NEW CLAN RECORD: "] = "НОВИЙ РЕКОРД КЛАНУ: ",
         ["NEW fastest lap: "] = "НОВА найшвидша партія: ",
---      ["NEW RACE RECORD: "] = "",
---      ["NOT ENOUGH WAYPOINTS"] = "",
+        ["New Mines Per Turn"] = "Нових Мін на Хід",
+        ["NEW RACE RECORD: "] = "НОВИЙ РЕКОРД ГОНКИ: ",
+        ["Newton's Hammock"] = "Гамак Ньютона",
+        ["NOT ENOUGH WAYPOINTS"] = "НЕДОСТАТНЬО ТОЧОК ШЛЯХУ",
         ["Not So Friendly Match"] = "Не дуже товариський матч", -- Basketball, Knockball
         ["Oh no! Just try again!"] = "О, ні! Давай, спробуй ще раз!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
         ["Oh no! Time's up! Just try again."] = "О, ні! Час йде! Спробуй ще раз.", --Bazooka, Shotgun, SniperRifle
         ["Operation Diver"] = "Операція Водолаз",
         ["Opposing Team: "] = "Команда-Противник: ",
         ["Pathetic Hog #%d"] = "Жалюгідний Їжак #%d",
---      ["Per-Hog Ammo"] = "",
---      ["Place more waypoints using [ENTER]"] = "",
+        ["Pathetic Resistance"] = "Жалюгідний Опір", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+        ["Per-Hog Ammo"] = "Боєприпаси на їжака",
+        ["Place more waypoints using [ENTER]"] = "Розмістіть більше точок шляху за допомогою [Enter]",
+        ["Place more waypoints using the 'Air Attack' weapon."] = "Розмістіть більше точок шляху використавши зброю 'Повітряна Атака'.",
         ["points"] = "очок", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
         ["Poison"] = "Смердюк",
---      ["Power Remaining"] = "",
---      ["Press [Precise] to skip intro"] = "",
---      ["Race complexity limit reached."] = "",
+        ["Power Remaining"] = "Залишилось Енергії",
+        ["Prepare yourself"] = "Приготуйся",
+        ["Press [Precise] to skip intro"] = "Натисніть [Приціл] щоб пропустити вступ",
+        ["Race complexity limit reached."] = "Досягнута межа складності гонки.",
+        ["RACER"] = "ГОНЩИК",
         [" - 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"] = " - Поверніть ворожий прапор на свою базу щоб заробити очко | - Виграє команда з трьома очками | - Ви можете заробити очко лише коли ваш прапор на вашій базі | - Їжак покине прапор якщо потоне чи буде вбитий | - Покинутий прапор можна повернути або захопити знов | - Їжаки відновлюються після смерті",
---      ["Round Limit"] = "",
---      ["Rounds Complete"] = "",
+        ["Round Limit:"] = "Межа Раунду:",
+        ["Round Limit"] = "Межа Раунду",
+        ["Rounds Complete: "] = "Раундів Завершено: ",
+        ["Rounds Complete"] = "Раундів Завершено",
         ["RULES OF THE GAME [Press ESC to view]"] = "ПРАВИЛА ГРИ [Натисніть ESC для перегляду]",
---      ["s|"] = "",
---      ["Save as many hapless hogs as possible!"] = "",
---      ["SCORE"] = "",
+        ["s|"] = "с|",
+        ["Save as many hapless hogs as possible!"] = "Врятуйте якнайбільше нещасних їжаків!",
+        ["SCORE"] = "РАХУНОК",
         ["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
         ["See ya!"] = "Побачимося!",
---      ["s"] = "", -- GaudyRacer, Space_Invasion
---      ["Shield boosted! +30 power"] = "",
---      ["Shield Depleted"] = "",
---      ["Shield is fully recharged!"] = "",
---      ["Shield Master!"] = "",
---      ["Shield Miser!"] = "",
---      ["Shield OFF:"] = "",
---      ["Shield ON:"] = "",
---      ["Shield Seeker!"] = "",
+        ["selected!"] = "вибрано!",
+        ["s"] = "с", -- GaudyRacer, Space_Invasion
+        ["Shield boosted! +30 power"] = "Щит підсилено! +30 сили",
+        ["Shield Depleted"] = "Щит Вичерпаний",
+        ["Shield is fully recharged!"] = "Щит повністю заряджений!",
+        ["Shield Master!"] = "Майстер Щита!",
+        ["Shield Miser!"] = "Скупій Щита!",
+        ["Shield OFF:"] = "Щит Вимкнено:",
+        ["Shield ON:"] = "Щит Ввімкнено:",
+        ["Shield Seeker!"] = "Шукач Щита!",
         ["Shotgun Team"] = "Команда Рушниць",
         ["Shotgun Training"] = "Тренування з рушницею",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
---      ["Silly"] = "",
---      ["Sinky"] = "",
+        ["shots remaining."] = "пострілів залишилось.",
+        ["Silly"] = "Дурник",
+        ["Sinky"] = "Любимчик",
         ["%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
         ["Sniper Training"] = "Снайперське тренування",
 --      ["Sniperz"] = "",
---      ["Sponge"] = "",
+        ["Sponge"] = "Губка",
         ["Spooky Tree"] = "Примарне Дерево",
---      ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
---      ["Switched to "] = "",
+        ["STATUS UPDATE"] = "ОНОВЛЕННЯ СТАНУ", -- GaudyRacer, Space_Invasion
+        ["Switched to "] = "Перейшов до ",
         ["Team %d: "] = "Команда %d: ",
---      ["Team Scores"] = "", -- Control, Space_Invasion
---      ["That Sinking Feeling"] = "",
+        ["Team Scores"] = "Очки Команди", -- Control, Space_Invasion
+        ["That Sinking Feeling"] = "Ця раптова слабкість",
         ["That was pointless."] = "Це було безглуздо.",
         ["The enemy is hiding out on yonder ducky!"] = "Ворог ховається на он тій качечці!",
         ["The flag will respawn next round."] = "Прапор відновиться в наступному раунді.",
---      ["The Nameless One"] = "",
---      ["THE SPECIALISTS"] = "",
---      ["This rain is really something..."] = "",
---      ["TIME: "] = "",
---      ["Timed Kamikaze!"] = "",
---      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
---      ["Toggle Shield"] = "",
+        ["The Nameless One"] = "Безіменний",
+        ["THE SPECIALISTS"] = "СПЕЦІАЛІСТИ",
+        ["This one's tricky."] = "Хитро придумано.",
+        ["This rain is really something..."] = "Цей дощ дійсно дещо...",
+        ["TIME: "] = "ЧАС: ",
+        ["Timed Kamikaze!"] = "Часовий Камікадзе!",
+        ["Time Extended!"] = "Час Продовжено!",
+        ["Time Extension"] = "Збільшення Часу",
+        ["Toggle Shield"] = "Перемкнути Щит",
         ["Toxic Team"] = "Токсична Команда", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+        ["TRACK COMPLETED"] = "ТРАСУ ПРОЙДЕНО",
+        ["TRACK FAILED!"] = "ТРАСУ НЕ ПРОЙДЕНО!",
         ["TrophyRace"] = "Погоня за Трофеєм",
         ["T_T"] = "Ааааа!!!",
---      ["Turn Time"] = "",
+        ["Tumbling Time Extended!"] = "Час Падіння Збільшений!",
+        ["Turn Time"] = "Час Ходу",
+        ["Unit"] = "Модуль",
         ["Unit 3378"] = "Об'єкт 3378",
---      ["Unlimited Attacks"] = "",
---      ["User Challenge"] = "",
+        ["Unit 835"] = "Об'єкт 835",
+        ["Unlimited Attacks"] = "Необмежені Атаки",
+        ["Unstoppable!"] = "Невпинний!",
+        ["User Challenge"] = "Дуель між користувачами",
         ["Use your rope to get from start to finish as fast as you can!"] = "Скористайся мотузкою щоб якнайшвидше досягнути фінішу!",
---      ["v.06"] = "",
         ["Victory for the "] = "Перемога для ", -- CTF_Blizzard, Capture_the_Flag
---      ["Waypoint placed."] = "",
---      ["Weapons Reset"] = "",
---      ["WINNING TIME: "] = "",
---      ["You'd almost swear the water was rising!"] = "",
+        ["Waypoint placed."] = "Точка шляху розміщена.",
+        ["Way-Points Remaining"] = "Залишилось Точок",
+        ["Weapons Reset"] = "Скидання Зброї",
+        ["Well done."] = "Чудова робота.",
+        ["Will this ever end?"] = "Це коли-небудь закінчиться?",
+        ["WINNING TIME: "] = "ЧАС ВИГРАШУ: ",
+        ["You'd almost swear the water was rising!"] = "Ти ледь не присягався, що вода піднімається!",
         ["You have SCORED!!"] = "Ви заробили ОЧКО!!",
---      ["You saved"] = "",
+        ["You saved"] = "Ви врятували",
         ["You've failed. Try again."] = "Спроба не вдалась. Спробуйте знов.",
         ["You've reached the goal!| |Time: "] = "Ви досягли мети!| |Час: ",
         ["'Zooka Team"] = "Команда 'Zooka",
-        ["!!!"] = "Я!",
     }
--- a/share/hedgewars/Data/Locale/uk.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/uk.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -53,8 +53,9 @@
 00:50=Атака дрелями
 00:51=Грудка багна
 00:52=Зброя не вибрана
-00:53=TARDIS
+00:53=Будка Часу
 00:54=Структура
+00:55=Земляний Спрей
 
 01:00=Вперед до перемоги!
 01:01=Нічия
@@ -286,6 +287,7 @@
 03:52=UNUSED
 03:53=Тип 40
 03:54=Збудуй щось
+03:55=Утиліта
 
 ; Weapon Descriptions (use | as line breaks)
 04:00=Атакуй ворогів використовуючи просту гранату.|Вона вибухне як тільки її таймер доходить до нуля.|1-5: Вистав таймер гранати|Атака: Утримуй щоб метнути сильніше
@@ -338,6 +340,12 @@
 04:47=Подвійні веселощі з двома гострими, підлими,|липкими мінами. Налаштуй ланцюгову реакцію|або захищайся (або і те і те!)|Атака: Утримуй щоб кинути сильніше (двічі)
 04:48=Чому всі образи повинні отримати кроти?|Зробити з їжака божевільного теж весело!|Удар цим молотком забере у їжака|третину здоров'я і заб'є його під землю.|Атака: Активуй
 04:49=Воскреси своїх друзів! Але май на|увазі що це воскресить також і ворогів.|Атака: Утримуй атаку для повільного відновлення|Вверх: Пришвидш відновлення
+04:50=Хтось ховається під землею?|Вирий їх атакою дрелями!|Таймер керує тим, як далеко вони будуть рити.
+04:51=Здійсни халявний удар, шпурни грудку багна.|Трохи пече і відкидає їжака назад.
+04:52=UNUSED
+04:53=Здійсни подорож крізь час та простір,|залишивши товаришів битись далі самим.|Будь готовий повернутись в кожну мить,|або до Раптової смерті або до їх поразки.|Відмова. Не працює в Раптовій Смерті,|якщо ти один, або якщо ти Король.
+04:54=НЕЗАВЕРШЕНО                                                                                                                                     
+04:55=Розпили потік лепких пластівців.|будуй мости, хорони ворогів, перекривай тунелі.|Стеж щоб на тебе не впала жодна з них!
 
 ; Game goal strings
 05:00=Режими Гри
@@ -361,3 +369,4 @@
 05:18=Необмежені Атаки
 05:19=Зброя скидається на кінці ходу
 05:20=Зброя не розподіляється між їжаками
+05:21=Збірна Команда: Команди одного клану виконують послідовні ходи|Спільний Час: Команди одного клану ділять між собою час ходу
--- a/share/hedgewars/Data/Locale/zh_CN.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/zh_CN.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -2,12 +2,19 @@
       ["!!!"] = "!!!",
 --      ["..."] = "",
 --      ["Accuracy Bonus!"] = "",
+--      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
 --      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
       ["Aiming Practice"] = "瞄准练习", --火箭筒、霰弹枪、狙击枪
 --      ["Ammo"] = "",
 --      ["Ammo Depleted!"] = "",
+--      ["ammo extended!"] = "",
+--      ["Ammo is reset at the end of your turn."] = "",
 --      ["Ammo Maniac!"] = "",
 --      ["Available points remaining: "] = "",
+--      ["[Backspace]"] = "",
+--      ["Bamboo Thicket"] = "",
+--      ["Barrel Eater!"] = "",
+--      ["Barrel Launcher"] = "",
       ["Bat balls at your enemies and|push them into the sea!"] = "发射棒球将敌人击打入水",
       ["Bat your opponents through the|baskets and out of the map!"] = "把敌人击出场地——对准栏框",
       ["Bazooka Training"] = "火箭筒训练",
@@ -18,8 +25,10 @@
 --      ["BOOM!"] = "",
 --      ["Boss defeated!"] = "",
 --      ["Boss Slayer!"] = "",
+--      ["Build a track and race."] = "",
       ["CAPTURE THE FLAG"] = "抢旗子",
 --      ["Careless"] = "",
+--      ["Change Weapon"] = "",
 --      ["Clumsy"] = "",
       ["Codename: Teamwork"] = "代号:团队行动",
 --      ["Complete the track as fast as you can!"] = "",
@@ -31,8 +40,10 @@
       ["DAMMIT, ROOKIE!"] = "新人",
       ["Dangerous Ducklings"] = "危险的小鸭子",
 --      ["Deadweight"] = "",
+--      ["Demolition is fun!"] = "",
 --      ["Depleted Kamikaze!"] = "",
 --      ["Destroy invaders to score points."] = "",
+--      ["Double Kill!"] = "",
 --      ["Drone Hunter!"] = "",
 --      ["Drowner"] = "",
 --      ["Each turn you get 1-3 random weapons"] = "",
@@ -41,8 +52,11 @@
       ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "时间限制内清除全部目标。弹药无限。", --Bazooka, Shotgun, SniperRifle
       ["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 enemy hogs to win."] = "",
 --      ["Eliminate the enemy specialists."] = "",
       ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- 打倒 3378 |-反抗者必须存活",
+--      ["Energetic Engineer"] = "",
       ["Enjoy the swim..."] = "游水愉快",
 --      ["[Enter]"] = "",
       ["Fastest lap: "] = "最快记录:",
@@ -52,6 +66,9 @@
       ["Flag respawned!"] = "旗帜重生!",
       ["Flag returned!"] = "旗帜归还!",
 --      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
+--      ["Flamer"] = "",
+--      ["Friendly Fire!"] = "",
+--      ["fuel extended!"] = "",
 --      ["GAME BEGUN!!!"] = "",
 --      ["Game Modifiers: "] = "",
       ["GAME OVER!"] = "结束了!",
@@ -61,11 +78,15 @@
       ["GO! GO! GO!"] = "上!",
       ["Good birdy......"] = "乖鸟儿",
       ["Good luck out there!"] = "祝好运",
+--      ["Good so far!"] = "",
+--      ["Good to go!"] = "",
 --      ["GOTCHA!"] = "",
+--      ["Grab Mines/Explosives"] = "",
 --      ["Hahahaha!"] = "",
 --      ["Haha, now THAT would be something!"] = "",
 --      ["Hapless Hogs"] = "",
 --      [" Hapless Hogs left!"] = "",
+--      ["Health crates extend your time."] = "",
 --      ["Heavy"] = "",
       ["Hedgewars-Basketball"] = "刺猬大作战-篮球计划",
       ["Hedgewars-Knockball"] = "刺猬大作战-击球计划",
@@ -79,9 +100,15 @@
 --      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
 --      ["Jumping is disabled"] = "",
 --      ["Kamikaze Expert!"] = "",
+--      ["Keep it up!"] = "",
+--      ["Killing spree!"] = "",
 --      ["KILLS"] = "",
+--      ["Last Target!"] = "",
 --      ["[Left Shift]"] = "",
       ["Listen up, maggot!!"] = "听好,小子!!",
+--      ["Lively Lifeguard"] = "",
+--      ["Mine Deployer"] = "",
+--      ["Mine Eater!"] = "",
 --      ["|- Mines Time:"] =
       ["MISSION FAILED"] = "任务失败", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["MISSION SUCCESS"] = "",
@@ -89,9 +116,12 @@
 --      ["Movement: [Up], [Down], [Left], [Right]"] = "",
 --      ["Multi-shot!"] = "",
 --      ["Nameless Heroes"] = "",
+--      ["New Barrels Per Turn"] = "",
 --      ["NEW CLAN RECORD: "] = "",
       ["NEW fastest lap: "] = "新记录",
+--      ["New Mines Per Turn"] = "",
 --      ["NEW RACE RECORD: "] = "",
+--      ["Newton's Hammock"] = "",
 --      ["NOT ENOUGH WAYPOINTS"] = "",
       ["Not So Friendly Match"] = "非友善对抗", -- Basketball, Knockball
       ["Oh no! Just try again!"] = "不!重新再来。", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
@@ -102,16 +132,22 @@
       ["Pathetic Hog #1"] = "可怜刺猬一号",
       ["Pathetic Hog #2"] = "可怜刺猬二号",
 --      ["Pathetic Hog #%d"] =
+--      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Per-Hog Ammo"] = "",
 --      ["Place more waypoints using [ENTER]"] = "",
+--      ["Place more waypoints using the 'Air Attack' weapon."] = "",
 --      ["points"] =
 --      ["Poison"] =
 --      ["Power Remaining"] = "",
+--      ["Prepare yourself"] = "",
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Race complexity limit reached."] = "",
+--      ["RACER"] = "",
 --      [" - 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 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次夺旗队伍获胜| - 只有旗帜在己方基地才算| -带旗刺猬消逝则旗帜落下| -落下的旗帜使用方式不变| -损失的刺猬瞬间还原",
+--      ["Round Limit:"] = "",
 --      ["Round Limit"] = "",
+--      ["Rounds Complete: "] = "",
 --      ["Rounds Complete"] = "",
       ["RULES OF THE GAME [Press ESC to view]"] = "游戏规则 [按下 ESC键 查看]",
 --      ["s|"] = "",
@@ -119,6 +155,7 @@
 --      ["SCORE"] = "",
 --      ["sec"] =
       ["See ya!"] = "再见!",
+--      ["selected!"] = "",
 --      ["s"] = "", -- GaudyRacer, Space_Invasion
 --      ["Shield boosted! +30 power"] = "",
 --      ["Shield Depleted"] = "",
@@ -130,7 +167,7 @@
 --      ["Shield Seeker!"] = "",
       ["Shotgun Team"] = "霰弹枪队",
       ["Shotgun Training"] = "霰弹枪训练",
---      ["Shots Left: "] = "", -- GaudyRacer, Tumbler
+--      ["shots remaining."] = "",
 --      ["Silly"] = "",
 --      ["Sinky"] = "",
       ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s 出局, %d 惩罚分数!", -- Basketball, Knockball
@@ -149,26 +186,33 @@
 --      ["The flag will respawn next round."] =
 --      ["The Nameless One"] = "",
 --      ["THE SPECIALISTS"] = "",
+--      ["This one's tricky."] = "",
 --      ["This rain is really something..."] = "",
 --      ["TIME: "] = "",
 --      ["Timed Kamikaze!"] = "",
 --      ["Time Extended!"] = "",
---      ["Time Left: "] = "",
+--      ["Time Extension"] = "",
 --      ["Toggle Shield"] = "",
       ["Toxic Team"] = "腐坏的队伍", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "",
---      ["Track Time: "] = "",
+--      ["TRACK FAILED!"] = "",
       ["TrophyRace"] = "竞速",
       ["T_T"] = "T_T",
+--      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
+--      ["Unit"] = "",
       ["Unit 3378"] = "3378",
+--      ["Unit 835"] = "",
 --      ["Unlimited Attacks"] = "",
+--      ["Unstoppable!"] = "",
 --      ["User Challenge"] = "",
       ["Use your rope to get from start to finish as fast as you can!"] = "抓起绳子飞向目的地,越快越好。",
---      ["v.06"] = "",
       ["Victory for the "] = "胜利属于",
 --      ["Waypoint placed."] = "",
+--      ["Way-Points Remaining"] = "",
 --      ["Weapons Reset"] = "",
+--      ["Well done."] = "",
+--      ["Will this ever end?"] = "",
 --      ["WINNING TIME: "] = "",
 --      ["You'd almost swear the water was rising!"] = "",
       ["You have SCORED!!"] = "得分",
--- a/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
 --------------------------------
--- CTF_BLIZZARD 0.8
+-- CTF_BLIZZARD 0.9
 --------------------------------
 
 ---------
@@ -68,14 +68,14 @@
 -- removed teleport from starting weapons
 -- increased captures to 3
 
------------
+------------
 -- 0.7
 ------------
 
 -- hopefully fixed a bug with the teleporters
 -- added a fix for crate possibly getting imbedded in land when it was near the water line
 
------------
+------------
 -- 0.8
 ------------
 
@@ -84,6 +84,13 @@
 -- changed hog placements code so that they start in the same place for both teams
 -- and hogs move in the same order, not backwards to each other.
 
+-----------
+-- 0.9
+------------
+
+-- add support for more players
+-- re-enable sudden death, but set water rise to 0
+
 loadfile(GetDataPath() .. "Scripts/Locale.lua")()
 
 ---------------------------------------------------------------
@@ -469,7 +476,7 @@
 
 
 	-- make a list of individual team names
-	for i = 0, 5 do
+	for i = 0, (TeamsCount-1) do
 		teamNameArr[i] = i
 		teamSize[i] = 0
 		teamIndex[i] = 0
@@ -566,7 +573,8 @@
 	MinesTime  = 2000
 	Explosives = 0 -- The number of explosives being placed
 	Delay = 10 -- The delay between each round
-	SuddenDeathTurns = 99 -- suddendeath is off, effectively
+	WaterRise = 0 -- I sure hope this works	
+	--SuddenDeathTurns = 99 -- suddendeath is off, effectively
 	Map = "Blizzard" -- The map to be played
 	Theme = "Snow" -- The theme to be used "Nature"
 
--- a/share/hedgewars/Data/Maps/Control/map.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Maps/Control/map.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
 --------------------------------
--- CONTROL 0.5
+-- CONTROL 0.6
 --------------------------------
 
 ---------
@@ -35,6 +35,16 @@
 -- removed user branding
 -- fixed infinite attack time exploit
 
+--------
+-- 0.6
+--------
+
+-- timebox fix
+-- support for more players
+-- remove version numbers
+-- enable limited sudden death
+-- using skip go generates as many points as you would have gotten had you sat and waited
+
 -----------------
 --script begins
 -----------------
@@ -88,10 +98,6 @@
 --zone and teleporter variables
 --------------------------------
 
---local redTel
---local orangeTel
---local areaArr = {} -- no longer used
-
 local cPoint = {}
 local cOwnerClan = {}
 
@@ -159,26 +165,27 @@
 		SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)
 		cOwnerClan[i] = nil
 		for k = 0, (numhhs-1) do
-			if (hhs[k] ~= nil) then
-			if (GearIsInZone(hhs[k],i)) == true then
+			if (hhs[k] ~= nil) then --and (GetGearType(hhs[k]) ~= nil) then
+                if (GearIsInZone(hhs[k],i)) == true then
 
-				if cOwnerClan[i] ~= nil then
-					if cOwnerClan[i] ~= GetHogClan(hhs[k]) then 
-						--if the hog now being compared is different to one that is also here and was previously compared
-						
-						SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)						
-						--SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, 0xffffffff)
-	
-						cOwnerClan[i] = 10 -- this means conflicted
-					end
-				elseif cOwnerClan[i] == nil then
-					cOwnerClan[i] = GetHogClan(hhs[k])
-					--SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, GetClanColor( GetHogClan(hhs[k])) )
-					SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], GetClanColor( GetHogClan(hhs[k])))
-	
-				end
+                    if cOwnerClan[i] ~= nil then
+                        if cOwnerClan[i] ~= GetHogClan(hhs[k]) then 
+                            --if the hog now being compared is different to one that is also here and was previously compared
+                            
+                            SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)						
+                            --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, 0xffffffff)
+        
+                            cOwnerClan[i] = 10 -- this means conflicted
+                        end
+                    elseif cOwnerClan[i] == nil then
+                        cOwnerClan[i] = GetHogClan(hhs[k])
+                        --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, GetClanColor( GetHogClan(hhs[k])) )
+                        SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], GetClanColor( GetHogClan(hhs[k])))
+        
+                    end
 
-			end
+                end
+           -- else hhs[k] = nil
 			end
 		end
 
@@ -206,9 +213,9 @@
 	for i = 0,(zCount-1) do			
 		if CurrentHedgehog ~= nil then		
 			if cOwnerClan[i] == GetHogClan(CurrentHedgehog) then
-				g = AddVisualGear(vCircX[i], vCircY[i], vgtHealthTag, 100, False)
+				g = AddVisualGear(vCircX[i], vCircY[i]-100, vgtHealthTag, 100, False)
                 if g ~= 0 then
-				    SetVisualGearValues(g, vCircX[i], vCircY[i], 0, 0, 0, 0, 0, teamScore[cOwnerClan[i]], 1500, GetClanColor(cOwnerClan[i]))
+				    SetVisualGearValues(g, vCircX[i], vCircY[i]-100, 0, 0, 0, 0, 0, teamScore[cOwnerClan[i]], 1500, GetClanColor(cOwnerClan[i]))
                 end
 			end
 		end
@@ -224,7 +231,7 @@
 
 
 	-- make a list of individual team names
-	for i = 0, 5 do
+	for i = 0, (TeamsCount-1) do
 		teamNameArr[i] = " " -- = i
 		teamSize[i] = 0
 		teamIndex[i] = 0
@@ -281,14 +288,27 @@
 -- game methods
 ------------------------
 
+function onAttack()
+
+	if CurrentHedgehog ~= nil then
+		if GetCurAmmoType() == amSkip then
+			z = (TurnTimeLeft / 2000) - (TurnTimeLeft / 2000)%2 
+			--AddCaption("scored: " .. z,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
+			for i = 0, z do
+				AwardPoints()
+			end
+		end
+	end
+
+end
+
 function onGameInit()
 
 	-- Things we don't modify here will use their default values.
 	--GameFlags = gfInfAttack + gfSolidLand -- Game settings and rules
 	
 	GameFlags = band(bor(GameFlags, gfInfAttack + gfSolidLand), bnot(gfKing + gfForts))
-		
-	SuddenDeathTurns = 99 -- suddendeath is off, effectively
+	WaterRise = 0
 
 end
 
@@ -334,10 +354,7 @@
 	for i = 0, (numTeams-1) do
 		pointLimit = pointLimit - 25
 	end
-	--SetGearPosition(hhs[0], 631, 82)
-	--SetGearPosition(hhs[1], 1088, 684)
-	--SetGearPosition(hhs[2], 381, 1569)
-
+	
 	-- reposition hogs if they are on control points until they are not or sanity limit kicks in
 	reN = 0
 	--zz = 0
@@ -352,7 +369,10 @@
 		--AddCaption(zz) -- number of times it took to work
 	end
 
-	ShowMission("CONTROL v0.3", "", loc("Control pillars to score points.") .. "|" .. loc("Goal") .. ": " .. pointLimit .. " " .. loc("points"), 0, 0)
+	ShowMission("CONTROL", 
+	"", 
+	loc("Control pillars to score points.") .. "|" .. 
+	loc("Goal") .. ": " .. pointLimit .. " " .. loc("points"), 0, 0)
 
 
 end
@@ -388,14 +408,19 @@
 			TurnTimeLeft = 1
 		end
 
-		for i = 0,5 do
+		totalComment = ""		
+		for i = 0,(TeamsCount-1) do
 				if teamNameArr[i] ~= " " then				-- i
 					teamComment[i] = teamNameArr[i] .. ": " .. teamScore[teamClan[i]] .. " " .. loc("points") .. "|"
+					totalComment = totalComment .. teamComment[i]			
 				elseif teamNameArr[i] == " " then
 					teamComment[i] = "|"
 				end
 			end
-			ShowMission("CONTROL", loc("Team Scores") .. ":", teamComment[0] .. teamComment[1] .. teamComment[2] .. teamComment[3] .. teamComment[4] .. teamComment[5], 0, 1600)
+			
+			ShowMission("CONTROL", 
+			loc("Team Scores") .. ":", 
+			totalComment, 0, 1600)
 	
 	end
 
@@ -407,20 +432,6 @@
 	if (vCircCount >= 500) and (gameWon == false) then
 		vCircCount = 0
 		CheckZones()
-		--AwardPoints()
-
-
-		--[[for i = 0,5 do
-
-			if teamNameArr[i] ~= " " then				-- i
-				teamComment[i] = teamNameArr[i] .. ": " .. teamScore[teamClan[i] ] .. " points|"
-			elseif teamNameArr[i] == " " then
-				teamComment[i] = "|"
-			end
-		end
-		
-		ShowMission("CONTROL", "Team Scores:", teamComment[0] .. teamComment[1] .. teamComment[2] .. teamComment[3] .. teamComment[4] .. teamComment[5], 0, 1600)]]
-
 	end	
 
 	-- things we wanna check often
@@ -460,15 +471,37 @@
 	AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
 end
 
+function InABetterPlaceNow(gear)
+	for i = 0, (numhhs-1) do
+		if gear == hhs[i] then
+			hhs[i] = nil
+		end
+	end
+end
+
+function onHogHide(gear)
+	 InABetterPlaceNow(gear)
+end
+
+function onHogRestore(gear)
+	match = false
+	for i = 0, (numhhs-1) do
+		if (hhs[i] == nil) and (match == false) then
+			hhs[i] = gear
+			--AddCaption(GetHogName(gear) .. " has reappeared it seems!")
+			--FollowGear(gear)
+			match = true
+		end
+	end
+end
+
 
 function onGearAdd(gear)
 
 	if GetGearType(gear) == gtHedgehog then
-
 		hhs[numhhs] = gear
 		numhhs = numhhs + 1
 		SetEffect(gear, heResurrectable, true)
-
 	end
 
 end
@@ -476,13 +509,7 @@
 function onGearDelete(gear)
 
 	if GetGearType(gear) == gtHedgehog then
-	--AddCaption("gear deleted!")
-		for i = 0, (numhhs-1) do
-			if gear == hhs[i] then
-				hhs[i] = nil
-				--AddCaption("for real")	
-			end		
-		end
+		InABetterPlaceNow(gear)
 	end
 
 end
Binary file share/hedgewars/Data/Maps/Ruler/preview.png has changed
Binary file share/hedgewars/Data/Maps/ShoppaKing/map.png has changed
Binary file share/hedgewars/Data/Maps/TrophyRace/map.png has changed
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -189,6 +189,7 @@
 			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)
@@ -213,8 +214,10 @@
 			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)
@@ -239,6 +242,7 @@
 			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)
@@ -260,6 +264,7 @@
 			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)
@@ -271,7 +276,6 @@
 				blowUp(2805,630)
 				blowUp(2805,760)
 				blowUp(2805,890)
-				blowUp(2700,890)
 				blowUp(3258,370)
 				blowUp(3258,475)
 				blowUp(3264,575)
@@ -291,6 +295,7 @@
 			elseif score == 29 then
 				spawnTarget(3670,0)
 			elseif score == 30 then
+				AddCaption(loc("Last Target!"));
 				spawnTarget(3480,1200)
 			end
 		else
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -18,12 +18,13 @@
 	Explosives = 0 
 	Map = "Bamboo" 
 	Theme = "Bamboo"
+	SuddenDeathTurns = 99999
 
 	AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default")
 	player = AddHog("Ikeda", 0, 10, "StrawHat")
 			
 	AddTeam(loc("Cybernetic Empire"), 	1175851, "Simple", "Island", "Default")
-	enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg")
+	enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg1")
 
 	SetGearPosition(player,1166,1680)
 	SetGearPosition(enemy,2848,1443)
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Dangerous_Ducklings.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Dangerous_Ducklings.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -28,13 +28,14 @@
 	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")
 
 	--AddTeam("Instructors", 14483456, "Simple", "Island", "Default")
-	instructor = AddHog(loc("Instructor"), 1, 1, "Vega")
+	instructor = AddHog(loc("Instructor"), 1, 1, "sf_vega")
 
 	AddTeam("Blue Team", 29439, "Simple", "Island", "Default")
 	enemy = AddHog("Filthy Blue", 1, 100, "Skull")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Diver.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Diver.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -20,6 +20,7 @@
 	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")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -25,7 +25,7 @@
 	player = AddHog("Ikeda", 0, 48, "StrawHat")
 			
 	AddTeam(loc("Cybernetic Empire"), 	1175851, "Simple", "Island", "Default")
-	enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg")
+	enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg1")
 
 	SetGearPosition(player, 1454, 1540)
 	SetGearPosition(enemy, 2488, 1960)
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Spooky_Tree.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Spooky_Tree.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -26,6 +26,7 @@
 	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")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Teamwork.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Teamwork.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -12,7 +12,6 @@
 	-- 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
-	SuddenDeathTurns = 9999
 	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
@@ -21,6 +20,7 @@
 	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")
@@ -28,7 +28,7 @@
 
 	--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, "cyborg")
+	enemy = AddHog(loc("Unit 3378"), 5, 30, "cyborg1")
 
 	SetGearPosition(player, 2427, 1259)
 	SetGearPosition(p2, 2293, 1263)
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -10,6 +10,8 @@
 local genCounter = 0
 local waterCounter = 0
 local waterPix = 0
+local frig = 0
+local watGear = nil
 
 -- allow skipping of the intro via hitting precise key
 function onPrecise()
@@ -34,19 +36,20 @@
 	Delay = 10
 	Map = "Islands"
 	Theme = "City"
+	SuddenDeathTurns = 1
 
 	AddTeam(loc("Nameless Heroes"), 14483456, "Simple", "Island", "Default")
 	player = AddHog(loc("The Nameless One"), 0, 1, "NoHat")
 
 	AddTeam(loc("Hapless Hogs"), 	1175851, "Simple", "Island", "Default")
-	hh[0] = AddHog(loc("Sinky"), 1, 100, "lemon")
-	hh[1] = AddHog(loc("Drowner"), 1, 100, "orange")
-	hh[2] = AddHog(loc("Heavy"), 1, 100, "Teapot")
-	hh[3] = AddHog(loc("Clumsy"), 1, 100, "SauceBoatSilver")
-	hh[4] = AddHog(loc("Silly"), 1, 100, "Ladle")
+	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, "Chunli")
-	hh[7] = AddHog(loc("Deadweight"), 1, 100, "Teacup")
+	hh[6] = AddHog(loc("Sponge"), 1, 100, "sf_chunli")
+	hh[7] = AddHog(loc("Deadweight"), 1, 100, "dish_Teacup")
 
 	SetGearPosition(player, 3992, 733)
 	SetGearPosition(hh[0], 938, 1369)
@@ -83,15 +86,26 @@
 	-- intro sequence
 	if introStage < 100 then
 
-		AddCaption(loc("Press [Precise] to skip intro"))
+		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])
+						
+			--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
@@ -99,10 +113,11 @@
 			end
 
 		elseif introStage == 1 then
-
-			FollowGear(hh[1])
+						
+			--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
@@ -111,9 +126,10 @@
 
 		elseif introStage == 2 then
 
-			FollowGear(hh[0])
+			--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
@@ -122,9 +138,10 @@
 
 		elseif introStage == 3 then
 
-			FollowGear(hh[1])
+			--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
@@ -133,9 +150,10 @@
 
 		elseif introStage == 4 then
 
-			FollowGear(hh[0])
+			--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
@@ -145,9 +163,10 @@
 
 		elseif introStage == 5 then
 
-			FollowGear(hh[1])
+			--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
@@ -157,9 +176,10 @@
 
 		elseif introStage == 6 then
 
-			FollowGear(hh[0])
+			--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
@@ -194,6 +214,11 @@
 				SetHealth(player, 0)
 				TurnTimeLeft = 1
 				ShowMission(loc("That Sinking Feeling"), loc("MISSION SUCCESS"), loc("You saved") .. " " .. hhCount .. " " .. loc("Hapless Hogs") .."!", 0, 0)
+
+				if hhCount == 8 then
+					AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Lively Lifeguard"),0xffba00ff,capgrpMessage2)
+				end
+
 			end
 
 		end
--- a/share/hedgewars/Data/Names/cowboy.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Names/cowboy.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -7,7 +7,7 @@
 Tom
 Ernesto
 Douglas
-Mario
+sm_mario
 Jose
 Francisco
 Brian
--- a/share/hedgewars/Data/Names/ninja.txt	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Names/ninja.txt	Wed Sep 14 22:39:39 2011 +0200
@@ -6,4 +6,4 @@
 Arashi
 Bushi
 Itami
-Kenshi
+sf_kenshi
--- a/share/hedgewars/Data/Names/types.ini	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Names/types.ini	Wed Sep 14 22:39:39 2011 +0200
@@ -12,10 +12,10 @@
 #####
 Fruit
 #####
-apple
-banana
-lemon
-orange
+fr_apple
+fr_banana
+fr_lemon
+fr_orange
 #####
 Indians
 Apache
@@ -37,13 +37,13 @@
 Possessed
 Parasites
 #####
-BrainSlug
-BrainSlugMouth
-BrainSlugMouth
+scif_BrainSlug
+scif_BrainSlug2
+scif_BrainSlug2
 #####
 Bunnies
 #####
-Bunny
+zoo_Bunny
 #####
 Detectives
 #####
@@ -79,9 +79,9 @@
 #####
 StarHogs
 #####
-darthvader
-stormtrooper
-stormtrooper
+scif_swDarthvader
+scif_swStormtrooper
+scif_swStormtrooper
 #####
 Hogtrix
 #####
@@ -89,24 +89,24 @@
 #####
 Hog Fighters
 #####
-Balrog
-Blanka
-BlankaToothless
-Chunli
-Guile
-Honda
-Ken
-Ryu
-Vega
+sf_balrog
+sf_blanka
+sf_blankatoothless
+sf_chunli
+sf_guile
+sf_honda
+sf_ken
+sf_ryu
+sf_vega
 #####
 Mushroom Kingdom
 #####
-Mario
-Luigi
-PrincessPeach
-PrincessDaisy
-Toad
-Wario
+sm_mario
+sm_luigi
+sm_peach
+sm_daisy
+sm_toad
+sm_wario
 #####
 Honor
 #####
@@ -120,13 +120,13 @@
 #####
 Rainbow
 #####
-GreenHair
-BlueHair
-RedHair
-OrangeHair
-YellowHair
-PurpleHair
-GreyHair
+hair_green
+hair_blue
+hair_red
+hair_orange
+hair_yellow
+hair_purple
+hair_grey
 #####
 Pride
 #####
@@ -146,17 +146,17 @@
 #####
 Pocket Pros
 #####
-ash
-charmander
-chikorita
-diglett
-jigglypuff
-lugia
-mudkip
-pikachu
-slowpoke
-squirtle
-voltorb
+poke_ash
+poke_charmander
+poke_chikorita
+poke_diglett
+poke_jigglypuff
+poke_lugia
+poke_mudkip
+poke_pikachu
+poke_slowpoke
+poke_squirtle
+poke_voltorb
 #####
 Vikings
 #####
--- a/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -18,16 +18,16 @@
 
 function randomAmmo()
     local n = 3   --"points" to be allocated on weapons
-    
+
     --pick random weapon and subtract cost
     local r = GetRandom(table.maxn(weapons_values)) + 1
     local picked_items = {}
     table.insert(picked_items, weapons[r])
     n = n - weapons_values[r]
-    
-    
+
+
     --choose any weapons or utilities to use up remaining n
-    
+
     while n > 0 do
         local items = {}
         local items_values = {}
@@ -63,12 +63,12 @@
                 end
             end
         end
-        
+
         local r = GetRandom(table.maxn(items_values)) + 1
         table.insert(picked_items, items[r])
         n = n - items_values[r]
     end
-    
+
     return picked_items
 end
 
@@ -111,7 +111,7 @@
 
 function onAmmoStoreInit()
     SetAmmo(amSkip, 9, 0, 0, 0)
-    
+
     SetAmmo(amExtraDamage, 0, 1, 0, 1)
     SetAmmo(amInvulnerable, 0, 1, 0, 1)
     SetAmmo(amExtraTime, 0, 1, 0, 1)
--- a/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
 ---------------------------------------
--- CAPTURE_THE_FLAG GAMEPLAY MODE 0.4
+-- CAPTURE_THE_FLAG GAMEPLAY MODE 0.5
 -- by mikade
 ---------------------------------------
 
@@ -61,6 +61,15 @@
 -- changed starting feedback a little
 -- increased the radius around the circle indicating the flag thief so that it doesn't obscure his health
 
+--------
+-- 0.5
+--------
+
+-- add support for more players
+-- allow limited sudden death
+-- stop TimeBox ruining my life
+-- profit???
+
 -----------------
 --SCRIPT BEGINS
 -----------------
@@ -75,7 +84,7 @@
 ------------------ "Oh well, they probably have the memory"
 
 local gameStarted = false
-local gameTurns = 0	
+local gameTurns = 0
 
 --------------------------
 -- hog and team tracking variales
@@ -133,14 +142,14 @@
 
 	if fCaptures[teamID] == 3 then
 		for i = 0, (numhhs-1) do
-			if hhs[i] ~= nil then			
+			if hhs[i] ~= nil then
 				if GetHogClan(hhs[i]) == alt then
 					SetEffect(hhs[i], heResurrectable, false)
 					SetHealth(hhs[i],0)
 				end
 			end
 		end
-		if CurrentHedgehog ~= nil then		
+		if CurrentHedgehog ~= nil then
 			ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0)
 		end
 	end
@@ -156,18 +165,18 @@
 		wtf = 1
 		bbq = 0
 	end
-	
+
 	-- player has successfully captured the enemy flag
 	if (GetHogClan(CurrentHedgehog) == wtf) and (CurrentHedgehog == fThief[bbq]) and (fIsMissing[wtf] == false) then
-		
+
 		DeleteVisualGear(fGear[wtf])
-		fGear[wtf] = nil -- the flag has now disappeared				
-				
+		fGear[wtf] = nil -- the flag has now disappeared
+
 		fIsMissing[wtf] = false
 		fNeedsRespawn[wtf] = true
 		fIsMissing[bbq] = false
 		fNeedsRespawn[bbq] = true
-		fCaptures[wtf] = fCaptures[wtf] +1				
+		fCaptures[wtf] = fCaptures[wtf] +1
 		ShowMission(loc("You have SCORED!!"), GetHogTeamName(CurrentHedgehog) .. ": " .. fCaptures[wtf], loc("Opposing Team: ") .. fCaptures[bbq], 0, 0)
 		PlaySound(sndVictory)
 		fThief[bbq] = nil -- player no longer has the enemy flag
@@ -175,23 +184,23 @@
 
 	--if the player is returning the flag
 	elseif (GetHogClan(CurrentHedgehog) == wtf) and (fIsMissing[wtf] == true) then
-			
+
 		DeleteVisualGear(fGear[wtf])
 		fGear[wtf] = nil -- the flag has now disappeared
-					
-		fNeedsRespawn[wtf] = true					
+
+		fNeedsRespawn[wtf] = true
 		HandleRespawns() -- this will set fIsMissing[wtf] to false :)
 		AddCaption(loc("Flag returned!"))
-	
+
 	--if the player is taking the enemy flag
 	elseif GetHogClan(CurrentHedgehog) == bbq then
-				
+
 		DeleteVisualGear(fGear[wtf])
-		fGear[wtf] = nil -- the flag has now disappeared				
-				
+		fGear[wtf] = nil -- the flag has now disappeared
+
 		fIsMissing[wtf] = true
 		for i = 0,numhhs-1 do
-			if CurrentHedgehog ~= nil then			
+			if CurrentHedgehog ~= nil then
 				if CurrentHedgehog == hhs[i] then
 					fThief[wtf] = hhs[i]
 				end
@@ -200,23 +209,23 @@
 		AddCaption(loc("Flag captured!"))
 
 	end
-	
+
 end
 
-function CheckFlagProximity() 
+function CheckFlagProximity()
 
 	for i = 0, 1 do
 		if fGear[i] ~= nil then
-			
+
 			g1X = fGearX[i]
-			g1Y = fGearY[i]			
-	
+			g1Y = fGearY[i]
+
 			g2X, g2Y = GetGearPosition(CurrentHedgehog)
 
 			q = g1X - g2X
 			w = g1Y - g2Y
 			dist = (q*q) + (w*w)
-			
+
 			if dist < 500 then --1600
 				DoFlagStuff(fGear[i])
 			end
@@ -233,7 +242,7 @@
 		if fNeedsRespawn[i] == true then
 			fGear[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
 			fGearX[i] = fSpawnX[i]
-			fGearY[i] = fSpawnY[i]			
+			fGearY[i] = fSpawnY[i]
 
 			fNeedsRespawn[i] = false
 			fIsMissing[i] = false -- new, this should solve problems of a respawned flag being "returned" when a player tries to score
@@ -256,16 +265,16 @@
 	end
 
 	if fThief[wtf] ~= nil then
-		-- falls into water		
-		--ShowMission(LAND_HEIGHT,  fThiefY[wtf], (LAND_HEIGHT - fThiefY[wtf]), 0, 0)	
+		-- falls into water
+		--ShowMission(LAND_HEIGHT,  fThiefY[wtf], (LAND_HEIGHT - fThiefY[wtf]), 0, 0)
 		if (LAND_HEIGHT - fThiefY[wtf]) < 15 then
 			fIsMissing[wtf] = true
 			fNeedsRespawn[wtf] = true
 			HandleRespawns()
-		else	--normally	
+		else	--normally
 			fGearX[wtf]  =  fThiefX[wtf]
-			fGearY[wtf]  =  fThiefY[wtf]	
-			fGear[wtf] = AddVisualGear(fGearX[wtf],fGearY[wtf],vgtCircle,0,true)		
+			fGearY[wtf]  =  fThiefY[wtf]
+			fGear[wtf] = AddVisualGear(fGearX[wtf],fGearY[wtf],vgtCircle,0,true)
 		end
 
 		AddVisualGear(fThiefX[wtf], fThiefY[wtf], vgtBigExplosion, 0, false)
@@ -281,14 +290,14 @@
 		fGearTimer = 0
 		fGearRad = fGearRad + 1
 		if fGearRad > fGearRadMax then
-			fGearRad = fGearRadMin	
+			fGearRad = fGearRadMin
 		end
 	end
 
 	for i = 0, 1 do
-		
+
 		--SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 50, 3, fCol[i]) -- draw a circ for spawning area
-		
+
 		if fIsMissing[i] == false then -- draw a flag marker at the flag's spawning place
 			SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 20, 0, 10, 0, 33, 3, fCol[i])
 			if fGear[i] ~= nil then -- draw the flag gear itself
@@ -299,12 +308,12 @@
 				SetVisualGearValues(fCirc[i], fThiefX[i], fThiefY[i], 20, 200, 0, 0, 100, 50, 3, fCol[i])
 				--AddCaption("circle marking carrier")
 			elseif fThief[i] == nil then -- draw cirle round dropped flag
-				--g1X,g1Y,g4,g5,g6,g7,g8,g9,g10,g11 =  GetVisualGearValues(fGear[i])				
+				--g1X,g1Y,g4,g5,g6,g7,g8,g9,g10,g11 =  GetVisualGearValues(fGear[i])
 				--SetVisualGearValues(fCirc[i], g1X, g1Y, 20, 200, 0, 0, 100, 33, 2, fCol[i])
 				SetVisualGearValues(fCirc[i], fGearX[i], fGearY[i], 20, 200, 0, 0, 100, 33, 3, fCol[i])
-				--AddCaption('dropped circle marker')				
+				--AddCaption('dropped circle marker')
 				if fGear[i] ~= nil then -- flag gear itself
-					--SetVisualGearValues(fGear[i], g1X, g1Y, 20, 200, 0, 0, 100, 10, 4, fCol[i])					
+					--SetVisualGearValues(fGear[i], g1X, g1Y, 20, 200, 0, 0, 100, 10, 4, fCol[i])
 					SetVisualGearValues(fGear[i], fGearX[i], fGearY[i], 20, 200, 0, 0, 100, fGearRad, 2, fCol[i])
 					--AddCaption('dropped flag itself')
 				end
@@ -342,7 +351,7 @@
 
 
 	-- make a list of individual team names
-	for i = 0, 5 do
+	for i = 0, (TeamsCount-1) do
 		teamNameArr[i] = i
 		teamSize[i] = 0
 		teamIndex[i] = 0
@@ -401,13 +410,13 @@
 
 	for i = 0, 1 do
 
-		-- if someone uses kamikaze downwards, this can happen as the hog won't respawn		
+		-- if someone uses kamikaze downwards, this can happen as the hog won't respawn
 		if (LAND_HEIGHT - fSpawnY[i]) < 0 then
 			tempG = AddGear(0, 0, gtTarget, 0, 0, 0, 0)
-     			FindPlace(tempG, true, 0, LAND_WIDTH, true)			
+     			FindPlace(tempG, true, 0, LAND_WIDTH, true)
 			fSpawnX[i], fSpawnY[i] = GetGearPosition(tempG)
 			DeleteGear(tempG)
-		end  		
+		end
 
 		fGear[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
 		fCirc[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
@@ -420,11 +429,11 @@
 		fIsMissing[i] = false
 		fNeedsRespawn[i] = false
 		fCaptures[i] = 0
-		
-		--SetVisualGearValues(zxc, 1000,1000, 20, 100, 0,    10,                     1,         100,        5,      GetClanColor(0))		
-		
+
+		--SetVisualGearValues(zxc, 1000,1000, 20, 100, 0,    10,                     1,         100,        5,      GetClanColor(0))
+
 		SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 20, 100, 0, 10, 0, 75, 5, fCol[i])
-				
+
 	end
 
 end
@@ -436,8 +445,9 @@
 function onGameInit()
 
 	GameFlags = band(bor(GameFlags, gfDivideTeams), bnot(gfKing + gfForts))
-	SuddenDeathTurns = 999 -- suddendeath is off, effectively
-	Delay = 10 
+	--SuddenDeathTurns = 999 -- suddendeath is off, effectively
+	WaterRise = 0
+	Delay = 10
 
 end
 
@@ -448,8 +458,8 @@
 	ShowMission(loc("CAPTURE THE FLAG"), loc("Flags, and their home base will be placed where each team ends their first turn."), "", 0, 0)
 
 	RebuildTeamInfo()
-	
-	-- should gfDivideTeams do this automatically?	
+
+	-- should gfDivideTeams do this automatically?
 	--[[for i = 0, (TeamsCount-1) do
 		for g = teamIndex[i], (teamIndex[i]+teamSize[i]-1) do
 			if GetHogClan(hhs[g]) == 0 then
@@ -465,7 +475,7 @@
 
 	--zxc = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
 
-	
+
 	--SetVisualGearValues(zxc, 1000,1000, 20, 255, 1,    10,                     0,         200,        1,      GetClanColor(0))
 					--minO,max0 -glowyornot	--pulsate timer	 -- fuckall      -- radius -- width  -- colour
 end
@@ -474,7 +484,7 @@
 function onNewTurn()
 
 	gameTurns = gameTurns + 1
-	
+
 	if lastTeam ~= GetHogTeamName(CurrentHedgehog) then
 		lastTeam = GetHogTeamName(CurrentHedgehog)
 	end
@@ -482,14 +492,14 @@
 	--AddCaption("Handling respawns")
 	if gameStarted == true then
 		HandleRespawns()
-	--new method of placing starting flags	
+	--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)
 	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	
+		fPlaced[1] = true
 		StartTheGame()
 	end
 
@@ -525,16 +535,16 @@
 			CheckFlagProximity()
 		end
 	elseif CurrentHedgehog ~= nil then -- if the game hasn't started yet, keep track of where we are gonna put the flags on turn end
-				
+
 		if GetHogClan(CurrentHedgehog) == 0 then
-			i = 0			
+			i = 0
 		elseif GetHogClan(CurrentHedgehog) == 1 then
-			i = 1			
-		end			
-		
+			i = 1
+		end
+
 		fSpawnX[i] = GetX(CurrentHedgehog)
 		fSpawnY[i] = GetY(CurrentHedgehog)
-			
+
 	end
 
 end
@@ -562,18 +572,48 @@
 
 end
 
+function InABetterPlaceNow(gear)
+	for i = 0, (numhhs-1) do
+		if gear == hhs[i] then
+
+			for i = 0,1 do
+				if gear == fThief[i] then
+					FlagThiefDead(gear)
+				end
+			end
+			hhs[i] = nil
+		end
+	end
+end
+
+function onHogHide(gear)
+	 InABetterPlaceNow(gear)
+end
+
+function onHogRestore(gear)
+	match = false
+	for i = 0, (numhhs-1) do
+		if (hhs[i] == nil) and (match == false) then
+			hhs[i] = gear
+			--AddCaption(GetHogName(gear) .. " has reappeared it seems!")
+			match = true
+		end
+	end
+end
+
+
 function onGearAdd(gear)
 
 	if GetGearType(gear) == gtHedgehog then
 		hhs[numhhs] = gear
 		numhhs = numhhs + 1
 		SetEffect(gear, heResurrectable, true)
-	
+
 	elseif GetGearType(gear) == gtPiano then
 
 		for i = 0, 1 do
 			if CurrentHedgehog == fThief[i] then
-				FlagThiefDead(gear)			
+				FlagThiefDead(gear)
 			end
 		end
 
@@ -584,17 +624,7 @@
 function onGearDelete(gear)
 
 	if GetGearType(gear) == gtHedgehog then
-		for i = 0, (numhhs-1) do
-			if gear == hhs[i] then
-				
-				for i = 0,1 do
-					if gear == fThief[i] then
-						FlagThiefDead(gear)
-					end
-				end				
-				hhs[i] = nil	
-			end		
-		end
+		InABetterPlaceNow(gear)
 	end
 
 end
--- a/share/hedgewars/Data/Scripts/Multiplayer/GaudyRacer.cfg	Wed Sep 14 22:27:22 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Default
-Default
--- a/share/hedgewars/Data/Scripts/Multiplayer/GaudyRacer.lua	Wed Sep 14 22:27:22 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,730 +0,0 @@
-
-------------------------------------------
--- RACER
--- a crazy, map-independant racing script
--- by mikade
------------------------------------------
-
------------------------------------
---0.1: with apologies to tumbler
------------------------------------
--- added tumbler movement system
--- added weapon systems
--- added timer to stop tumbler
--- added racer circle arrays
--- added changing of circs on contact
--- added a "track complete" etc
-
------------------------------------
---0.2: for your racing convenience
------------------------------------
-
--- added resurrection
--- added team tracking
--- added proper scoring (hopefully, finally)
--- changed showmission icons to match feedback
--- changed circles to be netural colours, and then change to team col
--- cleaned up code
--- cleaned up gameplay: removing control on resurrect, trackcomplete, maxpointset etc
--- improved player feedback: race record, clan record, no record etc.
-
------------------------------------
---0.3: user-requested features
------------------------------------
-
--- hogs now start at the location of the first waypoint \o/
--- added sticky camera. Hog will no longer lose focus on explosions etc.
--- increased maximum complexity for tracks
-
------------------------------------
---0.4: user-requested features
------------------------------------
-
--- added movement trail
--- removed exploder weapon
--- removed mortar weapon
-
------------------------------------
--- 0.5 gaudy feature experimentation
------------------------------------
--- added a booster
--- added flame trail for booster
--- added and removed dx/dy on mortar launch
--- added and removed keypress-based mortar fire
--- changed mortar for a gtShell, probably more useful for tunneling
--- added dx/dy *2 shell fire
-
-----------------------------------
--- 0.6 modesty / display mod
-----------------------------------
--- author branding removed
--- version numbers removed
-
------------------------------
--- SCRIPT BEGINS
------------------------------
-
--- enable awesome translaction support so we can use loc() wherever we want
-loadfile(GetDataPath() .. "Scripts/Locale.lua")()
-
-------------------
--- Got Variables?
-------------------
-
-local roundLimit = 3
-local roundNumber = 0
-local firstClan = 10
-
-local versionNo = loc("v.06")
-
---------------------------
--- hog and team tracking variales
---------------------------
-
-local numhhs = 0 -- store number of hedgehogs
-local hhs = {} -- store hedgehog gears
-
-local numTeams --  store the number of teams in the game
-local teamNameArr = {}	-- store the list of teams
-local teamClan = {}
-local teamSize = {}	-- store how many hogs per team
-local teamIndex = {} -- at what point in the hhs{} does each team begin
-
-local teamComment = {}
-local teamScore = {}
-
----------
--- tumbler stuff
----------
-
-local moveTimer = 0
-local leftOn = false
-local rightOn = false
-local upOn = false
-local downOn = false
-
-local shotsMax = 30	--10
-local shotsLeft = 10
-
-local TimeLeftCounter = 0
-local TimeLeft = 60
-local stopMovement = false
-local tumbleStarted = false
-
--------
--- racer vars
---------
-
-local boosterOn = false
-local boosterFuel = 75
-local boosterPower = 0.3
-local boosterTimer = 0
-
-local bestClan = nil
-local bestTime = nil
-
-local gameBegun = false
-local gameOver = false
-local racerActive = false
-local trackTime = 0
-local wpCheckCounter = 0
-
-local wpCirc = {}
-local wpX = {}
-local wpY = {}
-local wpCol = {}
-local wpActive = {}
-local wpRad = 75
-local wpCount = 0
-local wpLimit = 20
-
--------------------
--- general methods
--------------------
-
-function RebuildTeamInfo()
-
-
-	-- make a list of individual team names
-	for i = 0, 7 do
-		teamNameArr[i] = " " -- = i
-		teamSize[i] = 0
-		teamIndex[i] = 0
-		teamScore[i] = 100000
-	end
-	numTeams = 0
-
-	for i = 0, (numhhs-1) do
-
-		z = 0
-		unfinished = true
-		while(unfinished == true) do
-
-			newTeam = true
-			tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name
-
-			if tempHogTeamName == teamNameArr[z] then
-				newTeam = false
-				unfinished = false
-			end
-
-			z = z + 1
-
-			if z == TeamsCount then
-				unfinished = false
-				if newTeam == true then
-					teamNameArr[numTeams] = tempHogTeamName
-					numTeams = numTeams + 1
-				end
-			end
-
-		end
-
-	end
-
-	-- find out how many hogs per team, and the index of the first hog in hhs
-	for i = 0, (numTeams-1) do
-		for z = 0, (numhhs-1) do
-			if GetHogTeamName(hhs[z]) == teamNameArr[i] then
-				teamClan[i] = GetHogClan(hhs[z])
-				if teamSize[i] == 0 then
-					teamIndex[i] = z -- should give starting index
-				end
-				teamSize[i] = teamSize[i] + 1
-				--add a pointer so this hog appears at i in hhs
-			end
-		end
-
-	end
-
-end
-
-
------------------
--- RACER METHODS
------------------
-
-function GetSpeed()
-
-	dx, dy = GetGearVelocity(CurrentHedgehog)
-
-	x = dx*dx
-	y = dy*dy
-	z = x+y
-
-	z = z*100
-
-	k = z%1
-
-	if k ~= 0 then
-	 z = z - k
-	end
-
-	return(z)
-
-end
-
-function CheckWaypoints()
-
-	trackFinished = true
-
-	for i = 0, (wpCount-1) do
-
-		g1X, g1Y = GetGearPosition(CurrentHedgehog)
-		g2X, g2Y = wpX[i], wpY[i]
-
-		g1X = g1X - g2X
-		g1Y = g1Y - g2Y
-		dist = (g1X*g1X) + (g1Y*g1Y)
-
-		--if i == 0 then
-		--	AddCaption(dist .. "/" .. (wpRad*wpRad) )
-		--end
-
-		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, 0, 10, 0, wpRad, 5, wpCol[i])
-		end
-
-		if wpActive[i] == false then
-			trackFinished = false
-		end
-
-	end
-
-	return(trackFinished)
-
-end
-
-function AdjustScores()
-
-	--[[if bestTime == nil then
-		bestTime = 100000
-		bestClan = 10
-		bestTimeComment = "N/A"
-	else
-		bestTimeComment = (bestTime/1000) ..loc("s")
-	end]]
-
-	if bestTime == nil then
-		bestTime = 100000
-		bestClan = 10
-		bestTimeComment = "N/A"
-	end
-
-	newScore = false
-
-	-- update this clan's time if the new track is better
-	for i = 0, (numTeams-1) do
-		if teamClan[i] == GetHogClan(CurrentHedgehog) then
-			if trackTime < teamScore[i] then
-				teamScore[i] = trackTime
-				newScore = true
-			else
-				newScore = false
-			end
-		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
-			bestTime = teamScore[i]
-			bestClan = teamClan[i]
-		end
-	end
-
-	if bestTime ~= 100000 then
-		bestTimeComment = (bestTime/1000) ..loc("s")
-	end
-
-	if newScore == true then
-		if trackTime == bestTime then -- best time of the race
-			ShowMission("RACER", loc("TRACK COMPLETED"), loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. loc("WINNING TIME: ") .. bestTimeComment, 0, 4000)
-		else	-- best time for the clan
-			ShowMission("RACER", loc("TRACK COMPLETED"), loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. loc("WINNING TIME: ") .. bestTimeComment, 4, 4000)
-		end
-	else -- not any kind of new score
-		ShowMission("RACER", loc("TRACK COMPLETED"), loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" .. loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000)
-	end
-
-end
-
-function CheckForNewRound()
-
-	if GetHogClan(CurrentHedgehog) == firstClan then
-
-		roundNumber = roundNumber + 1
-
-		for i = 0, 7 do
-				if teamNameArr[i] ~= " " then				-- teamScore[teamClan[i]]
-					teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|")
-				elseif teamNameArr[i] == " " then
-					teamComment[i] = "|"
-				end
-		end
-		ShowMission("RACER", loc("STATUS UPDATE"), loc("Rounds Complete") .. ": " .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" .. loc("Best Team Times: ") .. "|" .. teamComment[0] .. teamComment[1] .. teamComment[2] .. teamComment[3] .. teamComment[4] .. teamComment[5] .. teamComment[6] .. teamComment[7], 0, 1600)
-
-		-- 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, false)
-					SetHealth(hhs[i],0)
-				end
-			end
-			gameOver = true
-			TurnTimeLeft = 1
-		end
-
-	end
-
-end
-
-function DisableTumbler()
-	stopMovement = true
-	upOn = false
-	down = false
-	leftOn = false
-	rightOn = false
-	boosterOn = false
-end
-
-----------------------------------
--- GAME METHODS / EVENT HANDLERS
-----------------------------------
-
-function onGameInit()
-	--Theme = "Hell"
-	--GameFlags
-	--GameFlags = gfDisableWind
-end
-
-
-function onGameStart()
-	RebuildTeamInfo()
-	ShowMission("RACER", "", "", 4, 4000)
-end
-
-function onHJump()
-	if (shotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then -- seems to not work with a hedgehog nil chek
-
-		shotsLeft = shotsLeft - 1
-		morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtShell, 0, 0, 0, 1)
-		AddCaption(loc("Shots Left: ") .. shotsLeft)
-
-
-		-- based on player movement already
-		CopyPV(CurrentHedgehog, morte) -- new addition
-
-		--x2
-		x,y = GetGearVelocity(morte)
-		x = x*2
-		y = y*2
-		SetGearVelocity(morte, x, y)
-
-		--- or based on keys?
-		--[[x = 0
-		y = 0
-
-		launchPower = 0.5
-
-		if leftOn == true then
-			x = x - launchPower
-		end
-		if rightOn == true then
-			x = x + launchPower
-		end
-
-		if upOn == true then
-			y = y - launchPower
-		end
-		if downOn == true then
-			y = y + launchPower
-		end
-
-		SetGearVelocity(morte, x, y)]]
-
-
-	end
-end
-
-function onLJump()
-
-
-	if (wpCount < wpLimit) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (gameBegun == false) then -- seems to not work with a hedgehog nil chek
-
-		wpX[wpCount] = GetX(CurrentHedgehog)
-		wpY[wpCount] = GetY(CurrentHedgehog)
-		wpCol[wpCount] = 0xffffffff
-		wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)
-																		--100	  --0		--75	--wpCol[wpCount]
-		SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 0, 10, 0, wpRad, 5, wpCol[wpCount])
-
-		wpCount = wpCount + 1
-
-		AddCaption(loc("Waypoint placed.") .. " " .. loc("Available points remaining: ") .. (wpLimit-wpCount))
-
-		if wpCount == wpLimit then
-			AddCaption(loc("Race complexity limit reached."))
-			DisableTumbler()
-		end
-
-	end
-
-
-	if (boosterFuel > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (gameBegun == true) then
-
-		if boosterOn == false then
-			boosterOn = true
-		else
-			boosterOn = false
-		end
-
-	end
-
-end
-
-function onLeft()
-	if (CurrentHedgehog ~= nil) and (stopMovement == false) then
-		leftOn = true
-	end
-end
-
-function onRight()
-	if (CurrentHedgehog ~= nil) and (stopMovement == false) then
-		rightOn = true
-	end
-end
-
-function onUp()
-	if (CurrentHedgehog ~= nil) and (stopMovement == false) then
-		upOn = true
-	end
-end
-
-function onDown()
-	if (CurrentHedgehog ~= nil) and (stopMovement == false) then
-		downOn = true
-	end
-end
-
-function onDownUp()
-	downOn = false
-end
-function onUpUp()
-	upOn = false
-end
-function onLeftUp()
-	leftOn = false
-end
-function onRightUp()
-	rightOn = false
-end
-
-function onNewTurn()
-
-	CheckForNewRound()
-
-	--if gameOver == false then
-		shotsLeft = shotsMax
-		stopMovement = false
-		tumbleStarted = false
-		boosterOn = false
-		boosterFuel = 75
-		SetTag(AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1), boosterFuel)
-		--SetInputMask(band(0xFFFFFFFF, bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmPrecise+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon)))
-		--AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
-	--end
-
-
-
-	-- Set the waypoints to unactive on new round
-	for i = 0,(wpCount-1) do
-		wpActive[i] = false
-		wpCol[i] = 0xffffffff
-		SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 0, 10, 0, wpRad, 5, wpCol[i])
-	end
-
-	-- Handle Starting Stage of Game
-	if (gameOver == false) and (gameBegun == false) then
-		if wpCount >= 3 then
-			gameBegun = true
-			racerActive = true
-			roundNumber = 0 -- 0
-			firstClan = GetHogClan(CurrentHedgehog)
-			ShowMission("RACER", loc("GAME BEGUN!!!"), loc("Complete the track as fast as you can!"), 2, 4000)
-		else
-			ShowMission("RACER", loc("NOT ENOUGH WAYPOINTS"), loc("Place more waypoints using [ENTER]"), 2, 4000)
-		end
-	end
-
-	if gameOver == true then
-		gameBegun = false
-		stopMovement = true
-		tumbleStarted = false
-	end
-
-end
-
-function onGameTick()
-
-	-- 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("Good to go!")
-			tumbleStarted = true
-			racerActive = true
-			trackTime = 0
-			TimeLeft = 60
-
-			-- if the gamehas started put the player in the middle of the first
-			--waypoint that was placed
-			if gameBegun == true then
-				SetGearPosition(CurrentHedgehog, wpX[0], wpY[0])
-				AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
-				FollowGear(CurrentHedgehog)
-			else -- otherwise just start him tumbling from wherever he is
-				AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
-			end
-
-		end
-	end
-
-	-- has the player started his tumbling spree?
-	if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
-
-		--AddCaption(LOC_NOT("Speed: ") .. GetSpeed())
-
-		-- if the RACE has started, show tracktimes and keep tabs on waypoints
-		if (racerActive == true) and (gameBegun == true) then
-
-			trackTime = trackTime + 1
-
-			wpCheckCounter = wpCheckCounter + 1
-			if (wpCheckCounter == 100) then
-
-				AddCaption(loc("Track Time: ") .. (trackTime/1000) .. loc("s") )
-				wpCheckCounter = 0
-				if (CheckWaypoints() == true) then
-					AdjustScores()
-					racerActive = false
-					DisableTumbler()
-				end
-
-			end
-
-		end
-
-		if boosterOn == true then
-			boosterTimer = boosterTimer + 1
-			if boosterTimer == 150 then --200
-				boosterTimer = 0
-				boosterFuel = boosterFuel - 1
-				SetTag(AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1), boosterFuel)
-				if boosterFuel == 0 then
-					boosterOn = false
-				end
-			end
-		end
-
-		-- Calculate and display turn time
-		TimeLeftCounter = TimeLeftCounter + 1
-		if TimeLeftCounter == 1000 then
-			TimeLeftCounter = 0
-			TimeLeft = TimeLeft - 1
-
-			if TimeLeft >= 0 then
-				--TurnTimeLeft = TimeLeft
-				--AddCaption(LOC_NOT("Time Left: ") .. TimeLeft)
-			end
-
-		end
-
-		-- if the player has expended his tunbling time, stop him tumbling
-		if TimeLeft == 0 then
-			DisableTumbler()
-		end
-
-
-		-- handle movement based on IO
-		moveTimer = moveTimer + 1
-		if moveTimer == 100 then -- 100
-			moveTimer = 0
-
-			-- keep in mind gravity is acting on the hog
-			-- so his down is more powerful than his up
-
-			dx, dy = GetGearVelocity(CurrentHedgehog)
-
-			dxlimit = 0.4 --0.4
-			dylimit = 0.4 --0.4
-
-			if boosterOn == true then
-
-				--flame trail, now removed
-				AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0)
-				--tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtDust, 0, false)
-
-				dxlimit = dxlimit + boosterPower
-				dylimit = dylimit + boosterPower
-			else
-				tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtDust, 0, false)
-				g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
-				SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(GetHogClan(CurrentHedgehog)) )
-			end
-
-			if dx > dxlimit then
-				dx = dxlimit
-			end
-			if dy > dylimit then
-				dy = dylimit
-			end
-			if dx < -dxlimit then
-				dx = -dxlimit
-			end
-			if dy < -dylimit then
-				dy = -dylimit
-			end
-
-
-			dxPower = 0.1 --0.1
-			dyPower = 0.1 --0.1
-
-			if leftOn == true then
-				dx = dx - dxPower
-			end
-			if rightOn == true then
-				dx = dx + dxPower
-			end
-
-			if upOn == true then
-				dy = dy - dyPower -- -0.1 -- new addition
-			end
-			if downOn == true then
-				dy = dy + dyPower
-			end
-
-			--if leftOn == true then
-			--	dx = dx - 0.04
-			--end
-			--if rightOn == true then
-			--	dx = dx + 0.04
-			--end
-
-			--if upOn == true then
-			--	dy = dy - 0.1
-			--end
-			--if downOn == true then
-			--	dy = dy + 0.06
-			--end
-
-			SetGearVelocity(CurrentHedgehog, dx, dy)
-
-		end
-
-	end
-
-end
-
-function onGearDamage(gear, damage)
-	--if gear == CurrentHedgehog then
-		-- You are now tumbling
-	--end
-end
-
-function onGearResurrect(gear)
-
-	AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
-
-	-- if the player stops and "dies" or flies into water, stop him tumbling
-	if gear == CurrentHedgehog then
-		DisableTumbler()
-	end
-
-end
-
-function onGearAdd(gear)
-
-	if GetGearType(gear) == gtHedgehog then
-		hhs[numhhs] = gear
-		numhhs = numhhs + 1
-		SetEffect(gear, heResurrectable, true)
-	end
-
-end
-
-function onGearDelete(gear)
-	--not needed today, yet
-
-	--sticky camera
-	if CurrentHedgehog ~= nil then
-		FollowGear(CurrentHedgehog)
-	end
-
-end
--- a/share/hedgewars/Data/Scripts/Multiplayer/No_Jumping.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/No_Jumping.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -15,7 +15,7 @@
 end
 
 function onGearAdd(gear)
-	
+
 	if (GetGearType(gear) == gtJetpack) or (GetGearType(gear) == gtRope) or (GetGearType(gear) == gtParachute) then
 		specialGear = gear
 		SetInputMask(band(0xFFFFFFFF, bnot(gmHJump)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.cfg	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,2 @@
+Shoppa
+Shoppa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -0,0 +1,622 @@
+
+------------------------------------------
+-- RACER 0.4
+-- map-independant racing script
+-- by mikade
+-----------------------------------------
+
+-----------------------------------
+--0.1: took all the code from crazy racer and scrapped most of it
+-----------------------------------
+
+-- Removed tumbler system
+-- Removed extra adds like boosters etc
+-- Added experimental waypoint placement system
+-- More user feedback
+-- Reduced race complexity limit to 5 waypoints
+-- stop placement at complexity limit reached and end turn
+-- guys dont keep racing after dying
+-- invulnerable feasibility
+-- reverted time keeping method
+-- reduced feedback display time
+-- colour-coded addcaptions
+-- cleaned up code
+-- support for more players properly added
+-- tardis fix
+-- remove airstrikes
+
+-- i think the remainder 0 .456 sec of the tracktime isnt getting reset on newturn
+
+-- update feedback
+
+-------
+-- 0.2
+-------
+
+-- allow gameflags
+-- extend time to 90s
+-- remove other air-attack based weps
+-- turn off water rise for sd
+
+-------
+-- 0.3
+-------
+
+-- prevent WP being placed in land
+-- prevent waypoints being placed outside border
+
+-------
+-- 0.4
+-------
+
+-- update user feedback
+-- add more sounds
+
+-----------------------------
+-- SCRIPT BEGINS
+-----------------------------
+
+loadfile(GetDataPath() .. "Scripts/Locale.lua")()
+
+------------------
+-- Got Variables?
+------------------
+
+local fMod = 1000000 -- 1
+local roundLimit = 3
+local roundNumber = 0
+local firstClan = 10
+
+local fastX = {}
+local fastY = {}
+local fastCount = 0
+local fastIndex = 0
+local fastColour
+
+local currX = {}
+local currY = {}
+local currCount = 0
+
+--------------------------
+-- hog and team tracking variales
+--------------------------
+
+local numhhs = 0 -- store number of hedgehogs
+local hhs = {} -- store hedgehog gears
+
+local numTeams --  store the number of teams in the game
+local teamNameArr = {}	-- store the list of teams
+local teamClan = {}
+local teamSize = {}	-- store how many hogs per team
+local teamIndex = {} -- at what point in the hhs{} does each team begin
+
+local teamComment = {}
+local teamScore = {}
+
+-------
+-- racer vars
+--------
+
+local cGear = nil
+local gTimer = 0
+
+local bestClan = nil
+local bestTime = nil
+
+local gameBegun = false
+local gameOver = false
+local racerActive = false
+local trackTime = 0
+local wpCheckCounter = 0
+
+local wpCirc = {}
+local wpX = {}
+local wpY = {}
+local wpCol = {}
+local wpActive = {}
+local wpRad = 450 --75
+local wpCount = 0
+local wpLimit = 5
+
+-------------------
+-- general methods
+-------------------
+
+function RebuildTeamInfo()
+
+
+	-- make a list of individual team names
+	for i = 0, (TeamsCount-1) do
+		teamNameArr[i] = " " -- = i
+		teamSize[i] = 0
+		teamIndex[i] = 0
+		teamScore[i] = 100000
+	end
+	numTeams = 0
+
+	for i = 0, (numhhs-1) do
+
+		z = 0
+		unfinished = true
+		while(unfinished == true) do
+
+			newTeam = true
+			tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name
+
+			if tempHogTeamName == teamNameArr[z] then
+				newTeam = false
+				unfinished = false
+			end
+
+			z = z + 1
+
+			if z == TeamsCount then
+				unfinished = false
+				if newTeam == true then
+					teamNameArr[numTeams] = tempHogTeamName
+					numTeams = numTeams + 1
+				end
+			end
+
+		end
+
+	end
+
+	-- find out how many hogs per team, and the index of the first hog in hhs
+	for i = 0, (numTeams-1) do
+		for z = 0, (numhhs-1) do
+			if GetHogTeamName(hhs[z]) == teamNameArr[i] then
+				teamClan[i] = GetHogClan(hhs[z])
+				if teamSize[i] == 0 then
+					teamIndex[i] = z -- should give starting index
+				end
+				teamSize[i] = teamSize[i] + 1
+				--add a pointer so this hog appears at i in hhs
+			end
+		end
+
+	end
+
+end
+
+
+-----------------
+-- RACER METHODS
+-----------------
+
+function CheckWaypoints()
+
+	trackFinished = true
+
+	for i = 0, (wpCount-1) do
+
+		g1X, g1Y = GetGearPosition(CurrentHedgehog)
+		g2X, g2Y = wpX[i], wpY[i]
+
+		g1X = g1X - g2X
+		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)
+			SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i])
+
+			wpRem = 0
+			for k = 0, (wpCount-1) do
+				if wpActive[k] == false then
+					wpRem = wpRem + 1
+				end
+			end
+
+			AddCaption(loc("Way-Points Remaining") .. ": " .. wpRem,0xffba00ff,capgrpAmmoinfo)
+
+		end
+
+		if wpActive[i] == false then
+			trackFinished = false
+		end
+
+	end
+
+	return(trackFinished)
+
+end
+
+function AdjustScores()
+
+	if bestTime == nil then
+		bestTime = 100000
+		bestClan = 10
+		bestTimeComment = "N/A"
+	end
+
+	newScore = false
+
+	-- update this clan's time if the new track is better
+	for i = 0, (numTeams-1) do
+		if teamClan[i] == GetHogClan(CurrentHedgehog) then
+			if trackTime < teamScore[i] then
+				teamScore[i] = trackTime
+				newScore = true
+			else
+				newScore = false
+			end
+		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
+			bestTime = teamScore[i]
+			bestClan = teamClan[i]
+		end
+	end
+
+	if bestTime ~= 100000 then
+		bestTimeComment = (bestTime/1000) ..loc("s")
+	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)
+			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)
+		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)
+		PlaySound(sndHellish)
+	end
+
+
+	--------
+	--new
+	--------
+
+	if bestTime == trackTime then
+		--AddCaption("wooooooooooooooooooooooooooooo")
+
+		fastColour = GetClanColor(GetHogClan(CurrentHedgehog))
+
+		for i = 0, (currCount-1) do
+			fastX[i] = currX[i]
+			fastY[i] = currY[i]
+		end
+
+		fastCount = currCount
+		fastIndex = 0
+
+		--currCount = 0 -- is this needed?
+
+	else
+		currCount = 0
+		fastIndex = 0
+	end
+
+
+end
+
+function CheckForNewRound()
+
+	if GetHogClan(CurrentHedgehog) == firstClan then
+
+		roundNumber = roundNumber + 1
+
+		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] = "|"
+				end
+		end
+
+		ShowMission(	loc("RACER"),
+				loc("STATUS UPDATE"),
+				loc("Rounds Complete: ") .. 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, false)
+					SetHealth(hhs[i],0)
+				end
+			end
+			gameOver = true
+			TurnTimeLeft = 1
+		end
+
+	end
+
+end
+
+function DisableTumbler()
+	currCount = 0
+	fastIndex = 0
+	TurnTimeLeft = 0
+	racerActive = false -- newadd
+end
+
+function HandleGhost()
+
+	-- get the current xy of the racer at this point
+	currX[currCount] = GetX(CurrentHedgehog)
+	currY[currCount] = GetY(CurrentHedgehog)
+	currCount = currCount + 1
+
+	-- draw a ping of smoke where the fastest player was at this point
+	if (fastCount ~= 0) and (fastIndex < fastCount) then
+
+		fastIndex = fastIndex + 1
+
+		tempE = AddVisualGear(fastX[fastIndex], fastY[fastIndex], vgtSmoke, 0, false)
+		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
+
+----------------------------------
+-- GAME METHODS / EVENT HANDLERS
+----------------------------------
+
+function onGameInit()
+	GameFlags = GameFlags + gfInfAttack + gfInvulnerable
+	CaseFreq = 0
+	TurnTime = 90000
+	WaterRise = 0
+end
+
+
+function onGameStart()
+	RebuildTeamInfo()
+
+	ShowMission	(
+				loc("RACER"),
+				loc("a Hedgewars mini-game"),
+
+				loc("Build a track and race.") .. "|" ..
+				loc("Round Limit:") .. " " .. roundLimit .. "|" ..
+
+				"", 4, 4000
+				)
+
+
+end
+
+function PlaceWayPoint(x,y)
+
+	if (wpCount < wpLimit) then -- seems to not work with a hedgehog nil chek
+
+		wpX[wpCount] = x
+		wpY[wpCount] = y
+		wpCol[wpCount] = 0xffffffff
+		wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)
+																		--100
+		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))
+
+	end
+
+end
+
+function onNewTurn()
+
+	CheckForNewRound()
+
+	racerActive = false
+
+	trackTime = 0
+
+	currCount = 0 -- hopefully this solves problem
+	AddAmmo(CurrentHedgehog, amAirAttack, 0)
+	gTimer = 0
+
+	-- Set the waypoints to unactive on new round
+	for i = 0,(wpCount-1) do
+		wpActive[i] = false
+		wpCol[i] = 0xffffffff
+		SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i])
+	end
+
+	-- Handle Starting Stage of Game
+	if (gameOver == false) and (gameBegun == false) then
+		if wpCount >= 3 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)
+		else
+			ShowMission(loc("RACER"),
+			loc("NOT ENOUGH WAYPOINTS"),
+			loc("Place more waypoints using the 'Air Attack' weapon."), 2, 4000)
+			AddAmmo(CurrentHedgehog, amAirAttack, 4000)
+		end
+	end
+
+	if gameOver == true then
+		gameBegun = false
+		racerActive = false -- newadd
+	end
+
+	AddAmmo(CurrentHedgehog, amTardis, 0)
+	AddAmmo(CurrentHedgehog, amDrillStrike, 0)
+	AddAmmo(CurrentHedgehog, amMineStrike, 0)
+	AddAmmo(CurrentHedgehog, amNapalm, 0)
+	AddAmmo(CurrentHedgehog, amPiano, 0)
+
+end
+
+function onGameTick()
+
+	-- airstrike detected, convert this into a potential waypoint spot
+	if cGear ~= nil then
+		x,y = GetGearTarget(cGear)
+		
+		DeleteGear(cGear)
+
+		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."))
+			PlaySound(sndDenied)
+		else
+			PlaceWayPoint(x, y)
+			if wpCount == wpLimit then
+				AddCaption(loc("Race complexity limit reached."))
+				DisableTumbler()
+			end
+		end
+
+	end
+
+
+	-- start the player tumbling with a boom once their turn has actually begun
+	if racerActive == false then
+
+		if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
+
+			-- if the gamehas started put the player in the middle of the first
+			--waypoint that was placed
+			if gameBegun == true then
+				AddCaption(loc("Good to go!"))
+				racerActive = true
+				trackTime = 0
+
+				SetGearPosition(CurrentHedgehog, wpX[0], wpY[0])
+				AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
+				FollowGear(CurrentHedgehog)
+				ShowMission("...", "...", "...", 2, 1)
+
+			else
+				-- still in placement mode
+			end
+
+		end
+	end
+
+
+
+	-- has the player started his tumbling spree?
+	if (CurrentHedgehog ~= nil) then
+
+		--airstrike conversion used to be here
+
+		-- if the RACE has started, show tracktimes and keep tabs on waypoints
+		if (racerActive == true) and (gameBegun == true) then
+
+			--ghost
+			gTimer = gTimer + 1
+			if gTimer == 15 then
+				gTimer = 0
+				HandleGhost()
+			end
+
+			trackTime = trackTime + 1
+
+			wpCheckCounter = wpCheckCounter + 1
+			if (wpCheckCounter == 100) then
+
+				wpCheckCounter = 0
+				AddCaption(trackTime/1000,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
+
+				if (CheckWaypoints() == true) then
+					AdjustScores()
+					racerActive = false
+					DisableTumbler()
+				end
+
+			end
+
+		end
+
+
+
+		-- if the player has expended his tunbling time, stop him tumbling
+		if TurnTimeLeft <= 1 then
+			DisableTumbler()
+		end
+
+	end
+
+end
+
+function onGearResurrect(gear)
+
+	AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+
+	-- if the player stops and "dies" or flies into water, stop him racing
+	--[[if gear == CurrentHedgehog then
+		DisableTumbler()
+		ShowMission(loc("RACER"),
+		loc("TRACK FAILED!"),
+		loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000)
+	end]]
+
+end
+
+function onGearAdd(gear)
+
+	if GetGearType(gear) == gtHedgehog then
+		hhs[numhhs] = gear
+		numhhs = numhhs + 1
+		SetEffect(gear, heResurrectable, true)
+	end
+
+	if GetGearType(gear) == gtAirAttack then
+		cGear = gear
+	end
+
+end
+
+function onGearDelete(gear)
+
+	if GetGearType(gear) == gtAirAttack then
+		cGear = nil
+	end
+
+end
+
+--[[function onAmmoStoreInit()
+	SetAmmo(amRope, 9, 0, 0, 0)
+	SetAmmo(amJetpack, 9, 0, 0, 0)
+	SetAmmo(amSkip, 9, 0, 0, 0)
+end]]
+
+
--- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -5,7 +5,7 @@
 ---------------------------------------------------
 ---------------------------------------------------
 ---------------------------------------------------
---- Space Invasion Code Follows (0.8)
+--- Space Invasion Code Follows (0.9)
 ---------------------------------------------------
 ---------------------------------------------------
 -- VERSION HISTORY
@@ -73,7 +73,7 @@
 -- delete explosives in DeleteFarFlungBarrel rather than explode them on map boundaries to save on performance
 -- utilized the improved AddCaption to tint / prevent overrides
 -- temporarily disabled bugged sort that displays teams according to their score
--- reluctantly changed the colour of the bonus circ to purple 
+-- reluctantly changed the colour of the bonus circ to purple
 -- standarized point notation
 -- added some missing locs
 -- commented out remaining WriteLnToConsoles for the meanwhile with the prefix "nw"
@@ -86,13 +86,13 @@
 -- Boss Slayer (Destroy 2 blue circles for +25 points)
 
 -- Shield Master (disolve 5 shells for +10 points)
--- Shield Miser (don't use your shield at all +20 points)
+-- Shield Miser (don't use your shield at all (2.5*roundkills)+2 points)
 
 -- Depleted Kamikaze! (kamikaze into a blue/red circ when you are out of ammo) 5pts
 -- Timed Kamikaze! (kamikaze into a blue/red circ when you only have 5s left) 10pts
 -- Kamikaze Expert (combination of the above two) 15pts
 
--- Multi-shot (destroy more than 1 invader with a single bullet) 5pts
+-- Multi-shot (destroy more than 1 invader with a single bullet) 15pts
 -- X-Hit Combo (destroy another invader in less than 3 seconds) chainLength*2 points
 
 -- Accuracy Bonus (80% accuracy at the end of your turn with more than 5 shots fired) 15pts
@@ -106,6 +106,22 @@
 -- added a HUD for turntimeleft, ammo, shield
 -- shieldhealth hits 0 properly
 
+------------------------
+-- version 0.8.1
+------------------------
+
+-- stop hiding non-existant 4th Tag
+-- redraw HUD on screen resolution change
+
+------------------------
+-- version 0.9
+------------------------
+-- time for more 'EXPERIMENTS' mwahahahahahaha D:
+-- (hopefully) balanced Shield Miser
+-- bosses are no longer a redunkulous 50 points, but toned down to 30
+-- experimental radar (it's INTERACTIVE and math-heavy :D) (visual gears are safe... right? D:)
+-- bugfix and balance for multishot
+
 --------------------------
 --notes for later
 --------------------------
@@ -121,7 +137,7 @@
 capgrpAmmostate
 -----------------
 AddCaption( chainLength .. LOC_NOT("-chain! +") .. chainLength*2 .. LOC_NOT(" points!"),0xffba00ff,capgrpAmmostate)
-AddCaption(LOC_NOT("Multi-shot! +5 points!"),0xffba00ff,capgrpAmmostate) 
+AddCaption(LOC_NOT("Multi-shot! +15 points!"),0xffba00ff,capgrpAmmostate)
 
 -----------------
 capgrpAmmoinfo
@@ -138,7 +154,7 @@
 AddCaption(LOC_NOT("Accuracy Bonus! +15 points!"),0xffba00ff,capgrpVolume)
 
 -----------------
-capgrpMessage 
+capgrpMessage
 -----------------
 AddCaption(LOC_NOT("Ammo Depleted!"),0xff0000ff,capgrpMessage)
 AddCaption(LOC_NOT("Ammo: ") .. primShotsLeft)
@@ -158,7 +174,7 @@
 AddCaption(LOC_NOT("Timed Kamikaze! +10 points!"),0xffba00ff,capgrpMessage)
 
 -----------------
-capgrpMessage2 
+capgrpMessage2
 -----------------
 AddCaption(LOC_NOT("Drone Hunter! +10 points!"),0xffba00ff,capgrpMessage2)
 AddCaption(LOC_NOT("Ammo Maniac! +5 points!"),0xffba00ff,capgrpMessage2)
@@ -213,6 +229,7 @@
 --local teamBlue = {}
 --local teamOrange = {}
 --local teamGreen = {}
+local roundKills = 0
 local RK = 0
 local GK = 0
 local BK = 0
@@ -220,7 +237,7 @@
 local SK = 0
 local shieldMiser = true
 local chainCounter = 0
-local chainLength = 0 
+local chainLength = 0
 local shotsFired = 0
 local shotsHit = 0
 
@@ -267,6 +284,13 @@
 local vCirc = {}
 local vCCount = 0
 
+local rCirc = {}
+local rCircX = {}
+local rCircY = {}
+local rAlpha = 255
+local rPingTimer = 0
+local radShotsLeft = 0
+
 local vCircActive = {}
 local vCircHealth = {}
 local vType = {}
@@ -301,31 +325,31 @@
 
 function HideTags()
 
-	for i = 0, 3 do 	
+	for i = 0, 2 do
 		SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
 	end
 
 end
 
 function DrawTag(i)
-	
+
 	zoomL = 1.3
 
 	xOffset = 40
 
 	if i == 0 then
-		yOffset = 40	
+		yOffset = 40
 		tCol = 0xffba00ff
 		tValue = TimeLeft
 	elseif i == 1 then
-		zoomL = 1.1		
-		yOffset = 70	
+		zoomL = 1.1
+		yOffset = 70
 		tCol = 0x00ff00ff
 		tValue = primShotsLeft
 	elseif i == 2 then
-		zoomL = 1.1		
+		zoomL = 1.1
 		xOffset = 40 + 35
-		yOffset = 70		
+		yOffset = 70
 		tCol = 0xa800ffff
 		tValue = shieldHealth - 80
 	end
@@ -333,7 +357,7 @@
 	DeleteVisualGear(vTag[i])
 	vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
 	g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i])
-	SetVisualGearValues	(	
+	SetVisualGearValues	(
 				vTag[i], 		--id
 				-(ScreenWidth/2) + xOffset,	--xoffset
 				ScreenHeight - yOffset, --yoffset
@@ -420,6 +444,8 @@
 
 function AwardKills(t)
 
+	roundKills = roundKills + 1
+	
 	for i = 0,(TeamsCount-1) do
 		if teamClan[i] == GetHogClan(CurrentHedgehog) then
 			teamCircsKilled[i] = teamCircsKilled[i] + 1
@@ -621,8 +647,8 @@
 			(GetX(gear) > 6200) or
 			(GetY(gear) < -3400)
 		then
-			AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)			
-			DeleteGear(gear)			
+			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
@@ -644,8 +670,8 @@
 	-- Fire Barrel
 	if (primShotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
 
-		shotsFired = shotsFired +1		
-		
+		shotsFired = shotsFired +1
+
 		morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1)
 
 		primShotsLeft = primShotsLeft - 1
@@ -702,6 +728,18 @@
 	end
 end
 
+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)
+	end
+
+end
+
 -----------------
 -- movement keys
 -----------------
@@ -750,8 +788,8 @@
 	MinesNum = 0
 	Explosives = 0
 
-	for i = 0, 3 do 	
-		vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false)	
+	for i = 0, 3 do
+		vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
 	end
 
 	HideTags()
@@ -780,6 +818,7 @@
 				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: ") .. "|" ..
@@ -797,10 +836,21 @@
 
 end
 
+function onScreenResize()
+
+	-- redraw Tags so that their screen locations are updated
+	if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
+			DrawTag(0)
+			DrawTag(1)
+			DrawTag(2)
+	end
+
+end
 
 function onNewTurn()
 
 	primShotsLeft = primShotsMax
+	radShotsLeft = 2
 	stopMovement = false
 	tumbleStarted = false
 	beam = false
@@ -811,6 +861,7 @@
 	BK = 0
 	OK = 0
 	SK = 0
+	roundKills = 0
 	shieldMiser = true
 	shotsFired = 0
 	shotsHit = 0
@@ -835,7 +886,7 @@
 		tumbleStarted = false
 		SetMyCircles(false)
 	end
-	
+
 	HideTags()
 
 	---------------
@@ -862,8 +913,8 @@
 
 function onGameTick()
 
-	
-	--WriteLnToConsole("Start of GameTick")	
+
+	--WriteLnToConsole("Start of GameTick")
 	luaGameTicks = luaGameTicks + 1 -- GameTime
 
 	HandleCircles()
@@ -919,6 +970,7 @@
 			tumbleStarted = true
 			TimeLeft = (TurnTime/1000)	--45
 			FadeAlpha = 0
+			rAlpha = 255
 			AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
 			DrawTag(0)
 			DrawTag(1)
@@ -955,9 +1007,9 @@
 		if PlayerIsFine() == false then
 			TimeLeft = 0
 		end
-		
+
 		--WriteLnToConsole("successfully checked playerIsFine")
-		
+
 		if (TimeLeft == 0) then
 			if (stopMovement == false) then	--time to stop the player
 				stopMovement = true
@@ -968,11 +1020,19 @@
 				rightOn = false
 				SetMyCircles(false)
 				HideTags()
+				rAlpha = 255
 				--nw WriteLnToConsole("Player is out of luck")
 
 				if shieldMiser == true then
-					AddCaption(loc("Shield Miser!") .. " +20 " .. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
-					AwardPoints(20)
+					
+					p = (roundKills*2.5) - ((roundKills*2.5)%1) + 2
+					--p = (roundKills*2.5) + 2
+					--if (p%2 ~= 0) then
+					--	p = p -0.5					
+					--end
+
+					AddCaption(loc("Shield Miser!") .." +" .. p .." ".. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
+					AwardPoints(p)
 				end
 
 				if ((shotsHit / shotsFired * 100) >= 80) and (shotsFired > 4) then
@@ -985,16 +1045,16 @@
 		-------------------------------
 		-- Player is still in luck
 		-------------------------------
-			
+
 
 			--WriteLnToConsole("about to do chainCounter checks")
 			if chainCounter > 0 then
-				chainCounter = chainCounter -1 
+				chainCounter = chainCounter -1
 				if chainCounter == 0 then
 					chainLength = 0
 				end
 			end
-				
+
 			-- handle movement based on IO
 			moveTimer = moveTimer + 1
 			if moveTimer == 100 then -- 100
@@ -1063,7 +1123,7 @@
 	end
 
 	--WriteLnToConsole("End of GameTick")
-
+	
 end
 
 function onGearResurrect(gear)
@@ -1149,8 +1209,47 @@
 ------------------------------------------------------------
 ------------------------------------------------------------
 
-
-
+function DoHorribleThings(cUID)
+
+	-- maybe	
+	-- add a check to draw it inside the circ and not past it if
+	-- it is closer than 150 or w/e
+
+	-- work out the distance to the target	
+	g1X, g1Y = GetGearPosition(CurrentHedgehog)
+	g2X, g2Y = vCircX[cUID], vCircY[cUID]
+	q = g1X - g2X				
+	w = g1Y - g2Y				
+	r = math.sqrt( (q*q) + (w*w) )	--alternate
+	
+
+	opp = w	
+	if opp < 0 then
+		opp = opp*-1
+	end
+
+	-- work out the angle (theta) to the target
+	t = math.deg ( math.asin(opp / r) )
+		
+	-- based on the radius of the radar, calculate what x/y displacement should be	
+	NR = 150 -- radius at which to draw circs
+	NX = math.cos( math.rad(t) ) * NR
+	NY = math.sin( math.rad(t) ) * NR	
+		
+	-- displace xy based on where this thing actually is
+	if q > 0 then
+		rCircX[cUID] = g1X - NX
+	else
+		rCircX[cUID] = g1X + NX
+	end
+
+	if w > 0 then
+		rCircY[cUID] = g1Y - NY
+	else
+		rCircY[cUID] = g1Y + NY
+	end
+	
+end
 
 function PlayerIsFine()
 	return (playerIsFine)
@@ -1213,6 +1312,10 @@
 		vCCount = vCCount +1
 		vCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
 
+		rCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
+		rCircX[i] = 0
+		rCircY[i] = 0
+
 		vCircDX[i] = 0
 		vCircDY[i] = 0
 
@@ -1240,6 +1343,9 @@
 		vCircCol[i] = 0xff00ffff
 
 		SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i])
+
+		SetVisualGearValues(rCirc[i], 0, 0, 100, 255, 1, 10, 0, 40, 3, vCircCol[i])
+
 	end
 
 	pShield = AddVisualGear(0,0,vgtCircle,0,true)
@@ -1340,7 +1446,7 @@
 
 		elseif (vType[i] == "blueboss") then
 			PlaySound(sndHellishImpact3)
-			AddCaption(loc("Boss defeated!") .. " +50 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage)
+			AddCaption(loc("Boss defeated!") .. " +30 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage)
 
 			morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1)
 			SetHealth(morte, 0)
@@ -1431,7 +1537,7 @@
 			vCircRadMax[i] = 180*5
 			vCircWidth[i] = 1
 			vCounterLim[i] = 2000
-			vCircScore[i] = 50
+			vCircScore[i] = 30
 			vCircHealth[i] = 3
 		else
 		--elseif r == 1 then
@@ -1464,6 +1570,11 @@
 	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
 
 	--nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i])
@@ -1565,7 +1676,9 @@
 
 					circsHit = circsHit + 1
 					if circsHit > 1 then
-						AddCaption(loc("Multi-shot!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate) 
+						AddCaption(loc("Multi-shot!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate)
+						AwardPoints(15)
+						circsHit = 0
 					end
 
 					shotsHit = shotsHit + 1
@@ -1638,6 +1751,8 @@
 		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
@@ -1688,7 +1803,6 @@
 
 function HandleCircles()
 
-
 	--[[if CirclesAreGo == true then
 
 		--CheckDistances()
@@ -1702,8 +1816,27 @@
 
 	end]]
 
+	
+	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
+
 	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
+
 		vCounter[i] = vCounter[i] + 1
 		if vCounter[i] >= vCounterLim[i] then
 
@@ -1853,6 +1986,11 @@
 		for i = 0,(vCCount-1) do
 			vCircX[i] = vCircX[i] + vCircDX[i]
 			vCircY[i] = vCircY[i] + vCircDY[i]
+
+			if (CurrentHedgehog ~= nil) and (rAlpha ~= 255) then			
+				DoHorribleThings(i)--(i, g1X, g1Y, g2X, g2Y, dist)				
+			end
+
 		end
 
 		if (TimeLeft == 0) and (tumbleStarted == true) then
@@ -1862,12 +2000,12 @@
 				FadeAlpha = 255
 			end
 
-			--new			
+			--new
 			--if FadeAlpha == 1 then
-			--	AddCaption("GOT IT")				
+			--	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	
+			--		vCircCol[i] = g10
 			--	end
 			--end
 
--- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,5 +1,5 @@
 ----------------------------------
--- THE SPECIALISTS MODE 0.5
+-- THE SPECIALISTS MODE 0.6
 -- by mikade
 ----------------------------------
 
@@ -35,6 +35,11 @@
 -- provision for variable minetimer / demo mines set to 5000ms
 -- don't autoswitch if player only has 1 hog on his team
 
+----------------
+-- version 0.6
+----------------
+-- for the meanwhile, don't drop any crates except health crates
+
 --------------------
 --TO DO
 --------------------
@@ -79,7 +84,7 @@
                 if z == 1 then
 
                         SetHogName(hhs[i],"Soldier")
-                        SetHogHat(hhs[i], "Vega")
+                        SetHogHat(hhs[i], "sf_vega")
                         SetHealth(hhs[i],200)
 
                 elseif z == 2 then
@@ -214,6 +219,7 @@
 function onGameInit()
         GameFlags = gfRandomOrder + gfResetWeps + gfInfAttack + gfPlaceHog
         Delay = 10
+	HealthCaseProb = 100
 end
 
 function onGameStart()
@@ -253,42 +259,42 @@
 	if (CurrentHedgehog ~= nil) then
 
 		currName = GetHogName(CurrentHedgehog)
-		
+
 		if (currName ~= lastName) and (switchStage > 100) then
 			AddCaption(loc("Switched to ") .. currName .. "!")
-			AssignAmmo()		
+			AssignAmmo()
 		end
 
-		if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) and (switchStage < 100) then			
-			
-			AddCaption(loc("Prepare yourself") .. ", " .. currName .. "!") 
+		if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) and (switchStage < 100) then
+
+			AddCaption(loc("Prepare yourself") .. ", " .. currName .. "!")
 
 			hogCounter = 0
 			runOnHogsInTeam(CountHog, GetHogTeamName(CurrentHedgehog) )
 
 			if hogCounter > 1 then
 
-				switchStage = switchStage + 1	
-			
+				switchStage = switchStage + 1
+
 				if switchStage == 1 then
 					AddAmmo(CurrentHedgehog, amSwitch, 1)
-				
+
 				elseif switchStage == 2 then
 					ParseCommand("setweap " .. string.char(amSwitch))
 				elseif switchStage == 3 then
-					SetGearMessage(CurrentHedgehog,gmAttack) 
+					SetGearMessage(CurrentHedgehog,gmAttack)
 				elseif switchStage == 4 then
 					switchStage = 110
 					AddAmmo(CurrentHedgehog, amSwitch, 0)
 				end
-			
+
 			else
 				switchStage = 110
 			end
 
 
-		end		
-		
+		end
+
 		lastName = currName
 
 	end
@@ -301,12 +307,12 @@
                 hhs[numhhs] = gear
                 numhhs = numhhs + 1
         elseif (GetGearType(gear) == gtMine) and (started == true) then
-		SetTimer(gear,5000)	
+		SetTimer(gear,5000)
 	end
-	
+
 	if (GetGearType(gear) == gtHedgehog) or (GetGearType(gear) == gtResurrector) then
 		trackGear(gear)
-	end 
+	end
 
 
 end
@@ -314,7 +320,7 @@
 function onGearDelete(gear)
 	if (GetGearType(gear) == gtHedgehog) or (GetGearType(gear) == gtResurrector) then
 		trackDeletion(gear)
-	end 
+	end
 end
 
 function onAmmoStoreInit()
--- a/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua	Wed Sep 14 22:39:39 2011 +0200
@@ -1,36 +1,41 @@
 ------------------------------------
 -- TUMBLER
--- v.0.6
+-- v.0.7.1
 ------------------------------------
 
 loadfile(GetDataPath() .. "Scripts/Locale.lua")()
 loadfile(GetDataPath() .. "Scripts/Tracker.lua")()
 
---local fMod = 1	--.15
 local fMod = 1000000 -- use this for dev and .16+ games
-local moveTimer = 0
+
 local leftOn = false
 local rightOn = false
 local upOn = false
 local downOn = false
+local preciseOn = false
 
-local preciseOn = false
---local HJumpOn = false
---local LJumpON = false
-local fireTimer = 0
-local scoreTag = nil
 local wep = {}
 local wepAmmo = {}
+local wepCol = {}
 local wepIndex = 0
 local wepCount = 0
+local fGears = 0
+
+local mineSpawn
+local barrelSpawn
+
 local roundKills = 0
+local barrelsEaten = 0
+local minesEaten = 0
 
+local moveTimer = 0
+local fireTimer = 0
 local TimeLeftCounter = 0
 local TimeLeft = 0
 local stopMovement = false
 local tumbleStarted = false
 
-local beam = false
+local vTag = {}
 
 ------------------------
 -- version 0.4
@@ -72,38 +77,179 @@
 -- modified crate frequencies a bit
 -- added some simple kill-based achievements, i think
 
+------------------------
+-- version 0.7
+------------------------
+
+-- a few code optimisations/performance tweaks
+-- removed some deprecated code
+-- fix a potential spawn bug
+
+-- improved HUD (now shows ammo counts)
+-- improved user feedback (less generic messages)
+-- colour-coded addcaptions to match hud :)
+
+-- base tumbling time now equals scheme turntime
+-- tumbling time extension is now based on the amount of health contained in crate
+-- new mines per turn based on minesnum
+-- new barrels per turn based on explosives
+
+-- added 2 more achievements: barrel eater and mine eater (like kills, don't do anything atm)
+-- slightly increased grab distance for explosives/mines
+-- slightly increased flamer velocity
+-- slightly decreased flamer volume
+-- added a flame vaporiser (based on number of flame gears?)
+-- give tumblers an extra 47 health on the start of their tumble to counter the grenade (exp)
+-- refocus camera on tumbler on newturn (not on crates, barrels etc)
+-- increase delay: yes, yes, eat your hearts out
+
+-- commit log
+-- Better HUD
+-- Allow more user customization
+-- Bugfix for new gear spawns
+-- Performance tweaks
+-- Variety of small gameplay changes
+
+------------------------
+-- version 0.7.1
+------------------------
+
+-- redraw HUD on screen resolution change
+
 ---------------------------
 -- some other ideas/things
 ---------------------------
 --[[
--- fix "ammo extended" message to be non-generic
+-- add better gameflag handling
 -- fix flamer "shots remaining" message on start or choose a standard versus %
 -- add more sounds
--- make barrels always explode?
--- persistent ammo?
--- allow custom turntime?
--- dont hurt tumblers and restore their health at turn end?
+-- better barrel/minespawn effects
+-- separate grab distance for mines/barrels
+-- [probably not] make barrels always explode?
+-- [probably not] persistent ammo?
+-- [probably not] dont hurt tumblers and restore their health at turn end?
 ]]
 
-function DrawTags()
-	
+
+----------------------------------------------------------------
+----------------------------------------------------------------
+
+local flames = {}
+local fGearValues = {}
+
+function runOnflames(func)
+    for k, gear in ipairs(flames) do
+        func(gear)
+    end
+end
+
+function trackFGear(gear)
+    table.insert(flames, gear)
+end
+
+function trackFGearDeletion(gear)
+    fGearValues[gear] = nil
+    for k, g in ipairs(flames) do
+        if g == gear then
+            table.remove(flames, k)
+            break
+        end
+    end
+end
+
+function getFGearValue(gear, key)
+    if fGearValues[gear] ~= nil then
+        return fGearValues[gear][key]
+    end
+    return nil
+end
+
+function setFGearValue(gear, key, value)
+    found = false
+    for id, values in pairs(fGearValues) do
+        if id == gear then
+            values[key] = value
+            found = true
+        end
+    end
+    if not found then
+        fGearValues[gear] = { [key] = value }
+    end
+end
+
+function decreaseFGearValue(gear, key)
+    for id, values in pairs(fGearValues) do
+        if id == gear then
+            values[key] = values[key] - 1
+        end
+    end
+end
+
+function HandleLife(gear)
+
+	decreaseFGearValue(gear, "L")
+	if getFGearValue(gear, "L") == 0 then
+		AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false)
+		DeleteGear(gear)
+	end
+
+end
+
+----------------------------------------------------------------
+----------------------------------------------------------------
+
+function HideTags()
+
+	for i = 0, 3 do
+		SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+	end
+
+end
+
+function DrawTag(i)
+
 	zoomL = 1.3
 
-	DeleteVisualGear(scoreTag)
-	scoreTag = AddVisualGear(0, 0, vgtHealthTag, 0, false)
-	g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(scoreTag)
-	SetVisualGearValues	(	
-				scoreTag, 		--id
-				-(ScreenWidth/2) + 45,	--xoffset
-				ScreenHeight - 50, 	--yoffset
+	xOffset = 40
+
+	if i == 0 then
+		yOffset = 40
+		tCol = 0xffba00ff --0xffed09ff --0xffba00ff
+		tValue = TimeLeft
+	elseif i == 1 then
+		zoomL = 1.1
+		yOffset = 70
+		tCol = wepCol[0]
+		tValue = wepAmmo[0]
+	elseif i == 2 then
+		zoomL = 1.1
+		xOffset = 40 + 35
+		yOffset = 70
+		tCol = wepCol[1]
+		tValue = wepAmmo[1]
+	elseif i == 3 then
+		zoomL = 1.1
+		xOffset = 40 + 70
+		yOffset = 70
+		tCol = wepCol[2]
+		tValue = wepAmmo[2]
+	end
+
+	DeleteVisualGear(vTag[i])
+	vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
+	g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i])
+	SetVisualGearValues	(
+				vTag[i], 		--id
+				-(ScreenWidth/2) + xOffset,	--xoffset
+				ScreenHeight - yOffset, --yoffset
 				0, 			--dx
 				0, 			--dy
 				zoomL, 			--zoom
 				1, 			--~= 0 means align to screen
 				g7, 			--frameticks
-				TimeLeft, 		--value
+				tValue, 		--value
 				240000, 		--timer
-				0xffba00ff		--GetClanColor( GetHogClan(CurrentHedgehog) )
+				tCol		--GetClanColor( GetHogClan(CurrentHedgehog) )
 				)
 
 end
@@ -123,22 +269,34 @@
 -- yes that was my justification for a non generic method
 function CheckProximityToExplosives(gear)
 
-	if (GetGearDistance(gear) < 1300) then 
+	if (GetGearDistance(gear) < 1400) then
 
 		if (GetGearType(gear) == gtExplosives) then
-		
-			wepAmmo[0] = wepAmmo[0] + 1			
+
+			wepAmmo[0] = wepAmmo[0] + 1
 			PlaySound(sndShotgunReload)
 			DeleteGear(gear)
-			AddCaption(loc("Ammo extended!"))
+			AddCaption(wep[0] .. " " .. loc("ammo extended!"), wepCol[0], capgrpAmmoinfo )
+			DrawTag(1)
+
+			barrelsEaten = barrelsEaten + 1
+			if barrelsEaten == 5 then
+				AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Barrel Eater!"),0xffba00ff,capgrpMessage2)
+			end
 
 		elseif (GetGearType(gear) == gtMine) then
-			wepAmmo[2] = wepAmmo[2] + 1			
+			wepAmmo[1] = wepAmmo[1] + 1
 			PlaySound(sndShotgunReload)
 			DeleteGear(gear)
-			AddCaption(loc("Ammo extended!"))
-		end 
+			AddCaption(wep[1] .. " " .. loc("ammo extended!"), wepCol[1], capgrpAmmoinfo )
+			DrawTag(2)
 
+			minesEaten = minesEaten + 1
+			if minesEaten == 5 then
+				AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Mine Eater!"),0xffba00ff,capgrpMessage2)
+			end
+
+		end
 
 	else
 		--AddCaption("There is nothing here...")
@@ -150,103 +308,38 @@
 function CheckProximity(gear)
 
 	dist = GetGearDistance(gear)
-				--15000
-	if ((dist < 15000) and (beam == true)) and
-	( (GetGearType(gear) == gtMine) or (GetGearType(gear) == gtExplosives) ) then
-	--	ndx, ndy = GetGearVelocity(CurrentHedgehog)
-	--	SetGearVelocity(gear, ndx, ndy)
-		--AddCaption("hello???")
-	elseif (dist < 1600) and (GetGearType(gear) == gtCase) then
-	
-		if GetHealth(gear) > 0 then		
+
+	if (dist < 1600) and (GetGearType(gear) == gtCase) then
+
+		if GetHealth(gear) > 0 then
 
-			AddCaption(loc("Tumbling Time Extended!"))
-			TimeLeft = TimeLeft + 5 --5s
-			DrawTags()
+			AddCaption(loc("Tumbling Time Extended!"), 0xffba00ff, capgrpMessage2 )
+
+			TimeLeft = TimeLeft + HealthCaseAmount  --5 --5s
+			DrawTag(0)
 			--PlaySound(sndShotgunReload)
 		else
-			wepAmmo[1] = wepAmmo[1] + 800	
+			wepAmmo[2] = wepAmmo[2] + 800
 			PlaySound(sndShotgunReload)
-			AddCaption(loc("Ammo extended!"))
+			AddCaption(wep[2] .. " " .. loc("fuel extended!"), wepCol[2], capgrpAmmoinfo )
+			DrawTag(3)
 		end
-		
+
 		DeleteGear(gear)
 
 	end
 
 end
 
---[[function ProjectileTrack(gear)
-
-	if (GetGearType(gear) == gtMine) or (GetGearType(gear) == gtExplosives) then
-
-		dist = GetGearDistance(gear)
-
-		alt = 1
-		if (dist < 30000) then
-			alt = -1
-		end
-
-		if (dist < 60000)
-		--and (dist > 16000)
-		then
-
-			--if (GetGearType(gear) == gtShell) then
-				turningSpeed = 0.1*fMod*alt
-			--end
-
-			dx, dy = GetGearVelocity(gear)
-
-			if GetX(gear) > GetX(CurrentHedgehog) then
-				dx = dx - turningSpeed
-			else
-				dx = dx + turningSpeed
-			end
+function ChangeWeapon()
 
-			if GetY(gear) > GetY(CurrentHedgehog) then
-				dy = dy - turningSpeed
-			else
-				dy = dy + turningSpeed
-			end
-
-
-			if (GetGearType(gear) == gtShell) then
-				dxlimit = 0.4*fMod
-				dylimit = 0.4*fMod
-			end
-
-			if dx > dxlimit then
-				dx = dxlimit
-			end
-			if dy > dylimit then
-				dy = dylimit
-			end
-			if dx < -dxlimit then
-				dx = -dxlimit
-			end
-			if dy < -dylimit then
-				dy = -dylimit
-			end
-
-			SetGearVelocity(gear, dx, dy)
-
-		end
-
+	wepIndex = wepIndex + 1
+	if wepIndex == wepCount then
+		wepIndex = 0
 	end
 
-end]]
-
-
-function ChangeWeapon()
-
-	--new
-	wepIndex = wepIndex + 1
-	if wepIndex == wepCount then
-		wepIndex = 0	
-	end
-
-	AddCaption(wep[wepIndex] .. " " .. loc("selected!"), GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo )
-	AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
+	AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo )
+	AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2)
 
 end
 
@@ -259,7 +352,7 @@
 	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."), GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)		
+		AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2)
 
 		if wep[wepIndex] == loc("Barrel Launcher") then
 			morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1)
@@ -268,10 +361,12 @@
 			x = x*2
 			y = y*2
 			SetGearVelocity(morte, x, y)
-		
+			DrawTag(1)
+
 		elseif wep[wepIndex] == loc("Mine Deployer") then
 			morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtMine, 0, 0, 0, 0)
 			SetTimer(morte, 1000)
+			DrawTag(2)
 		end
 
 	end
@@ -285,26 +380,14 @@
 end
 
 function onHJump()
-	-- pick up explosives if nearby them
+	-- pick up explosives/mines if nearby them
 	if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
 		runOnGears(CheckProximityToExplosives)
 	end
 end
 
 function onLJump()
-	-- for attracting mines and explosives if the beam is on
-	--[[if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
-		if beam == false then
-			beam = true
-			AddCaption(loc("Mine-attractor on!"))
-		else
-			beam = false
-			AddCaption(loc("Mine-attractor off!"))
-		end
-	end]]
-
 	ChangeWeapon()
-
 end
 
 -----------------
@@ -353,22 +436,53 @@
 --------------------------
 
 function onGameInit()
-	--Theme = "Hell"
 	CaseFreq = 0
-	HealthCaseProb = 0 
+	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
+
+	HideTags()
+
+	wep[0] = loc("Barrel Launcher")
+	wep[1] = loc("Mine Deployer")
+	wep[2] = loc("Flamer")
+
+	wepCol[0] = 0x78818eff
+	wepCol[1] = 0xa12a77ff
+	wepCol[2] = 0xf49318ff
+
+	wepCount = 3
+
 end
 
 function onGameStart()
-	
+
 	ShowMission	(
 			"TUMBLER",
 			loc("a Hedgewars mini-game"),
 			loc("Eliminate the enemy hogs to win.") .. "|" ..
 			" " .. "|" ..
 
-			--loc("Round Limit") .. ": " .. roundLimit .. "|" ..
-			--loc("Turn Time") .. ": " .. (TurnTime/1000) .. loc("sec") .. "|" ..
-			--" " .. "|" ..
+			loc("New Mines Per Turn") .. ": " .. (mineSpawn) .. "|" ..
+			loc("New Barrels Per Turn") .. ": " .. (barrelSpawn) .. "|" ..
+			loc("Time Extension") .. ": " .. (HealthCaseAmount) .. loc("sec") .. "|" ..
+			" " .. "|" ..
 
 			loc("Movement: [Up], [Down], [Left], [Right]") .. "|" ..
 			loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" ..
@@ -381,72 +495,76 @@
 			loc("Ammo is reset at the end of your turn.") .. "|" ..
 
 			"", 4, 4000
-			)	
+			)
 
-	scoreTag = AddVisualGear(0, 0, vgtHealthTag, 0, false)
-	--DrawTags()
+end
+
+function onScreenResize()
 
-	SetVisualGearValues(scoreTag,0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
-
-	wep[0] = loc("Barrel Launcher")
-	wep[1] = loc("Flamer")
-	wep[2] = loc("Mine Deployer")
-	wepCount = 3
+	-- redraw Tags so that their screen locations are updated
+	if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
+		for i = 0, 3 do
+			DrawTag(i)
+		end
+	end
 
 end
 
+function onNewTurn()
 
-function onNewTurn()
-	
 	stopMovement = false
 	tumbleStarted = false
-	beam = false
 
-	-- randomly create 2 new barrels and 3 mines on the map every turn
-	for i = 0, 1 do
-		gear = AddGear(0, 0, gtExplosives, 0, 0, 0, 0)
+	-- randomly create new barrels mines on the map every turn (can be disabled by setting mine/barrels to 0 in scheme)
+	for i = 0, barrelSpawn-1 do
+		gear = AddGear(100, 100, gtExplosives, 0, 0, 0, 0)
 		SetHealth(gear, 100)
-		FindPlace(gear, false, 0, LAND_WIDTH)
-		tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+		if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then
+			tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+		end
 	end
-	for i = 0, 2 do
-		gear = AddGear(0, 0, gtMine, 0, 0, 0, 0)
-		FindPlace(gear, false, 0, LAND_WIDTH)
-		tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+	for i = 0, mineSpawn-1 do
+		gear = AddGear(100, 100, gtMine, 0, 0, 0, 0)
+		if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then
+			tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+		end
 	end
 
+	-- randomly spawn time extension crates / flamer fuel on the map
 	r = GetRandom(100)
 	if r > 50 then
-		SpawnHealthCrate(0, 0)
+		gear = SpawnHealthCrate(0, 0)
 	end
 	r = GetRandom(100)
 	if r > 70 then
-		SpawnAmmoCrate(0, 0, amSkip)
+		gear = SpawnAmmoCrate(0, 0, amSkip)
 	end
 
-	--DrawTags()
-	SetVisualGearValues(scoreTag,0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+	HideTags()
 
 	--reset ammo counts
 	wepAmmo[0] = 2
-	wepAmmo[1] = 50
-	wepAmmo[2] = 1
+	wepAmmo[1] = 1
+	wepAmmo[2] = 50 -- 50000 -- 50
 	wepIndex = 2
 	ChangeWeapon()
 
 	roundKills = 0
+	barrelsEaten = 0
+	minesEaten = 0
+
+	FollowGear(CurrentHedgehog)
 
 end
 
 
 function DisableTumbler()
 	stopMovement = true
-	beam = false
 	upOn = false
 	down = false
 	leftOn = false
 	rightOn = false
-	SetVisualGearValues(scoreTag,0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+	HideTags()
 end
 
 function onGameTick()
@@ -456,33 +574,27 @@
 		if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
 			--AddCaption(loc("Good to go!"))
 			tumbleStarted = true
-			TimeLeft = 30
+			TimeLeft = (TurnTime/1000)
 			AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
-			DrawTags()
+			SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog) + 47) -- new
+			for i = 0, 3 do
+				DrawTag(i)
+			end
 		end
 	end
 
 	if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
 
-		--AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog) )
-
-		runOnGears(CheckProximity) -- crates and mines
-
-		--if beam == true then
-		--	runOnGears(ProjectileTrack)
-		--end
+		runOnGears(CheckProximity) -- crates
 
 		-- Calculate and display turn time
 		TimeLeftCounter = TimeLeftCounter + 1
 		if TimeLeftCounter == 1000 then
 			TimeLeftCounter = 0
 			TimeLeft = TimeLeft - 1
-		
-			
 
 			if TimeLeft >= 0 then
-				--AddCaption(TimeLeft)
-				DrawTags()
+				DrawTag(0)
 			end
 
 		end
@@ -496,6 +608,8 @@
 		if moveTimer == 100 then -- 100
 			moveTimer = 0
 
+			runOnflames(HandleLife)
+
 			---------------
 			-- new trail code
 			---------------
@@ -540,8 +654,6 @@
 				dy = dy + 0.1*fMod
 			end
 
-		
-
 			SetGearVelocity(CurrentHedgehog, dx, dy)
 
 		end
@@ -550,18 +662,19 @@
 		--flamer
 		--
 		fireTimer = fireTimer + 1
-		if fireTimer == 5 then	-- 5 --10
+		if fireTimer == 6 then	-- 5 --10
 			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 .. "%", 
-						GetClanColor(GetHogClan(CurrentHedgehog)),
+				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)
 				shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0)
@@ -582,16 +695,14 @@
 					ydev = ydev*-1
 				end
 
-				--*13	--8
-				SetGearVelocity(shell, (dx*4)+(xdev*fMod), (dy*4)+(ydev*fMod))	--10
+				--*13	--8	*-4
+				SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod))	--10
 
 			end
 
 		end
 		--
 
-
-
 	end
 
 
@@ -600,7 +711,6 @@
 function isATrackedGear(gear)
 	if 	(GetGearType(gear) == gtExplosives) or
 		(GetGearType(gear) == gtMine) or
-		(GetGearType(gear) == gtShell) or	-- new -- gtBall
 		(GetGearType(gear) == gtCase)
 	then
 		return(true)
@@ -609,7 +719,6 @@
 	end
 end
 
-
 --[[function onGearDamage(gear, damage)
 	if gear == CurrentHedgehog then
 		-- You are now tumbling
@@ -618,50 +727,60 @@
 
 function onGearAdd(gear)
 
-	if isATrackedGear(gear) then
+	if GetGearType(gear) == gtFlame then
+
+		trackFGear(gear)
+
+		fGears = fGears +1
+
+		if fGears < 80 then
+			setFGearValue(gear,"L",30)
+		else
+			setFGearValue(gear,"L",5) --3
+		end
+
+	elseif isATrackedGear(gear) then
 		trackGear(gear)
 	end
 
-	--if GetGearType(gear) == gtBall then
-	--	SetTimer(gear, 15000)
-	--end
-
 end
 
 function onGearDelete(gear)
 
-	if isATrackedGear(gear) then
+	if GetGearType(gear) == gtFlame then
+		trackFGearDeletion(gear)
+		fGears = fGears -1
+
+	elseif isATrackedGear(gear) then
 		trackDeletion(gear)
+
+	-- achievements? prototype
+	elseif GetGearType(gear) == gtHedgehog then
+
+		if GetHogTeamName(gear) ~= GetHogTeamName(CurrentHedgehog) then
+
+			roundKills = roundKills + 1
+			if roundKills == 2 then
+				AddCaption(loc("Double Kill!"),0xffba00ff,capgrpMessage2)
+			elseif roundKills == 3 then
+				AddCaption(loc("Killing spree!"),0xffba00ff,capgrpMessage2)
+			elseif roundKills >= 4 then
+				AddCaption(loc("Unstoppable!"),0xffba00ff,capgrpMessage2)
+			end
+
+		elseif gear == CurrentHedgehog then
+			DisableTumbler()
+
+		elseif gear ~= CurrentHedgehog then
+			AddCaption(loc("Friendly Fire!"),0xffba00ff,capgrpMessage2)
+		end
+
 	end
 
 	if CurrentHedgehog ~= nil then
 		FollowGear(CurrentHedgehog)
 	end
 
-	if gear == CurrentHedgehog then
-		DisableTumbler()
-	end
+end
 
 
-	-- achievements? prototype
-	if GetGearType(gear) == gtHedgehog then	
-		if GetHogTeamName(gear) ~= GetHogTeamName(CurrentHedgehog) then
-						
-			roundKills = roundKills + 1 		
-			if roundKills == 2 then
-				AddCaption(loc("Double Kill!"),0xffba00ff,capgrpMessage2)
-			elseif roundKills == 3 then
-				AddCaption(loc("Killing spree!"),0xffba00ff,capgrpMessage2)
-			elseif roundKills >= 4 then
-				AddCaption(loc("Unstoppable!"),0xffba00ff,capgrpMessage2)			
-			end		
-	
-		elseif gear ~= CurrentHedgehog then
-			AddCaption(loc("Friendly Fire!"),0xffba00ff,capgrpMessage2)
-		end
-
-	end
-
-
-
-end
Binary file share/hedgewars/Data/Sounds/TARDIS.ogg has changed
Binary file share/hedgewars/Data/Themes/Art/LandBackTex.png has changed
Binary file share/hedgewars/Data/Themes/Castle/LandBackTex.png has changed
Binary file share/hedgewars/Data/Themes/Digital/LandTex.png has changed
Binary file share/hedgewars/Data/Themes/Digital/Sky.png has changed
Binary file share/hedgewars/Data/Themes/EarthRise/horizontL.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Bag.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Ball.png has changed
Binary file share/hedgewars/Data/Themes/Golf/BlueWater.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Car.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Clouds.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Club2.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Flake.png has changed
Binary file share/hedgewars/Data/Themes/Golf/LandBackTex.png has changed
Binary file share/hedgewars/Data/Themes/Golf/LandTex.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Sky.png has changed
Binary file share/hedgewars/Data/Themes/Golf/SkyL.png has changed
Binary file share/hedgewars/Data/Themes/Golf/SkyR.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Tee.png has changed
Binary file share/hedgewars/Data/Themes/Golf/horizont.png has changed
--- a/share/hedgewars/Data/Themes/Golf/theme.cfg	Wed Sep 14 22:27:22 2011 +0200
+++ b/share/hedgewars/Data/Themes/Golf/theme.cfg	Wed Sep 14 22:39:39 2011 +0200
@@ -1,13 +1,14 @@
 sky = 34, 67, 135
 border = 38, 114, 35
-water-top = $54, $5C, $9D
-water-bottom = $34, $3C, $7D
-water-opacity = $80
+water-top = 72, 105, 127
+water-bottom = 37, 76, 91
+water-opacity = 128
 music = Golf.ogg
 clouds = 9
 object = Hole, 2, 0, 31, 123, 1, 1, 31, 0, 40, 27
 object = Car, 1, 78, 320, 80, 30, 1, 0, 0, 330, 220
-object = Club, 2, 180, 175, 5, 1, 2, 189, 155, 15, 20, 0, 0, 100, 100
+object = Club, 3, 180, 175, 5, 1, 2, 189, 155, 15, 20, 0, 0, 100, 100
+object = Club2, 1, 126, 26, 1, 1, 2, 0, 0, 20, 30, 240, 23, 15, 10
 object = Flag1, 1, 0, 305, 15, 5, 1, 20, 0, 103, 260
 object = Flag2, 1, 40, 305, 10, 4, 1, 0, 0, 53, 270
 object = Flag3, 1, 0, 280, 12, 7, 1, 30, 0, 112, 260