merge
authornemo
Sun, 27 Feb 2011 18:03:33 -0500
changeset 4971 98c5b7a0630a
parent 4970 039771ae3f65 (diff)
parent 4953 ebd3dae634ca (current diff)
child 4972 2f9c8a12edce
merge
--- a/QTfrontend/about.cpp	Tue Feb 22 18:51:22 2011 +0200
+++ b/QTfrontend/about.cpp	Sun Feb 27 18:03:33 2011 -0500
@@ -127,7 +127,7 @@
             "Slovak: Jose Riha<br>"
             "Spanish: Carlos Vives &lt;<a href=\"mailto:mail@carlosvives.es\">mail@carlosvives.es</a>&gt;<br>"
             "Swedish: Niklas Grahn &lt;<a href=\"mailto:raewolusjoon@yaoo.com\">raewolusjoon@yaoo.com</a>&gt;, Henrik Rostedt &lt;<a href=\"mailto:henrik.rostedt@gmail.com\">henrik.rostedt@gmail.com</a>&gt;<br>"
-            "Ukrainian: Eugene V. Lyubimkin &lt;<a href=\"mailto:jackyf.devel@gmail.com\">jackyf.devel@gmail.com</a>&gt;, Igor Paliychuk &lt;<a href=\"mailto:igor-hkr@mail.ru\">igor-hkr@mail.ru</a>&gt;, Yevhen Sakara &lt;<a href=\"mailto:eresid@gmail.com\">eresid@gmail.com</a>&gt;"
+            "Ukrainian: Eugene V. Lyubimkin &lt;<a href=\"mailto:jackyf.devel@gmail.com\">jackyf.devel@gmail.com</a>&gt;, Igor Paliychuk &lt;<a href=\"mailto:mansonigor@gmail.com\">mansonigor@gmail.com</a>&gt;, Eugene Sakara &lt;<a href=\"mailto:eresid@gmail.com\">eresid@gmail.com</a>&gt;"
             "</p><h2>") +
 
             QLabel::tr("Special thanks:") + "</h2><p>"
--- a/QTfrontend/chatwidget.h	Tue Feb 22 18:51:22 2011 +0200
+++ b/QTfrontend/chatwidget.h	Sun Feb 27 18:03:33 2011 -0500
@@ -61,6 +61,7 @@
   void setShowReady(bool s);
   void setShowFollow(bool enabled);
   static const char* STYLE;
+  QStringList ignoreList, friendsList;
 
 private:
   void loadList(QStringList & list, const QString & file);
@@ -90,7 +91,6 @@
   QGridLayout mainLayout;
   QTextBrowser* chatText;
   QStringList chatStrings;
-  QStringList ignoreList, friendsList;
   QListWidget* chatNicks;
   QLineEdit* chatEditLine;
   QAction * acInfo;
--- a/QTfrontend/gameuiconfig.h	Tue Feb 22 18:51:22 2011 +0200
+++ b/QTfrontend/gameuiconfig.h	Sun Feb 27 18:03:33 2011 -0500
@@ -31,6 +31,7 @@
     Q_OBJECT
 
 public:
+    HWForm * Form;
     GameUIConfig(HWForm * FormWidgets, const QString & fileName);
     QStringList GetTeamsList();
     QRect vid_Resolution();
@@ -67,7 +68,6 @@
     void SaveOptions();
 
 private:
-    HWForm * Form;
     quint8 depth;
 };
 
--- a/QTfrontend/newnetclient.cpp	Tue Feb 22 18:51:22 2011 +0200
+++ b/QTfrontend/newnetclient.cpp	Sun Feb 27 18:03:33 2011 -0500
@@ -29,6 +29,10 @@
 #include "gamecfgwidget.h"
 #include "teamselect.h"
 #include "misc.h"
+/* only to get the ignoreList from the chat widget */
+#include "hwform.h"
+#include "pages.h"
+#include "chatwidget.h"
 
 char delimeter='\n';
 
@@ -398,8 +402,15 @@
                 if (isChief)
                     emit configAsked();
             }
-            emit nickAdded(lst[i], isChief && (lst[i] != mynick));
-            emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i]));
+            if (lst[i] != mynick && isChief && config->Form->ui.pageRoomsList->chatWidget->ignoreList.contains(lst[i], Qt::CaseInsensitive) && !config->Form->ui.pageRoomsList->chatWidget->friendsList.contains(lst[i], Qt::CaseInsensitive))
+            {
+                kickPlayer(lst[i]);
+            }
+            else
+            {
+                emit nickAdded(lst[i], isChief && (lst[i] != mynick));
+                emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i]));
+            }
         }
         return;
     }
--- a/gameServer/Actions.hs	Tue Feb 22 18:51:22 2011 +0200
+++ b/gameServer/Actions.hs	Sun Feb 27 18:03:33 2011 -0500
@@ -14,6 +14,7 @@
 import Control.DeepSeq
 import Data.Unique
 import Control.Arrow
+import Control.Exception
 -----------------------------
 import CoreTypes
 import Utils
@@ -53,6 +54,7 @@
     | StatsAction
     | RestartServer Bool
 
+
 type CmdHandler = [B.ByteString] -> Reader (ClientIndex, IRnC) [Action]
 
 instance NFData Action where
@@ -412,5 +414,8 @@
     where
           st irnc = (length $ allRooms irnc, length $ allClients irnc)
 
-processAction (RestartServer _) =
-    return ()
\ No newline at end of file
+processAction (RestartServer force) = do
+    if force then do
+        throw RestartException
+        else
+        processAction $ ModifyServerInfo (\s -> s{restartPending=True})
--- a/gameServer/CoreTypes.hs	Tue Feb 22 18:51:22 2011 +0200
+++ b/gameServer/CoreTypes.hs	Sun Feb 27 18:03:33 2011 -0500
@@ -1,8 +1,7 @@
-{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE OverloadedStrings, DeriveDataTypeable #-}
 module CoreTypes where
 
 import Control.Concurrent
-import Control.Concurrent.STM
 import Data.Word
 import qualified Data.Map as Map
 import Data.Sequence(Seq, empty)
@@ -11,7 +10,9 @@
 import Data.Function
 import Data.ByteString.Char8 as B
 import Data.Unique
-
+import Control.Exception
+import Data.Typeable
+-----------------------
 import RoomsAndClients
 
 type ClientChan = Chan [B.ByteString]
@@ -135,7 +136,7 @@
         dbLogin :: B.ByteString,
         dbPassword :: B.ByteString,
         lastLogins :: [(B.ByteString, (UTCTime, B.ByteString))],
-        stats :: TMVar StatisticsInfo,
+        restartPending :: Bool,
         coreChan :: Chan CoreMessage,
         dbQueries :: Chan DBQuery
     }
@@ -143,7 +144,7 @@
 instance Show ServerInfo where
     show _ = "Server Info"
 
-newServerInfo :: TMVar StatisticsInfo -> Chan CoreMessage -> Chan DBQuery -> ServerInfo
+newServerInfo :: Chan CoreMessage -> Chan DBQuery -> ServerInfo
 newServerInfo =
     ServerInfo
         True
@@ -156,6 +157,7 @@
         ""
         ""
         []
+        False
 
 data AccountInfo =
     HasAccount B.ByteString Bool
@@ -189,4 +191,11 @@
 data Notice =
     NickAlreadyInUse
     | AdminLeft
-    deriving Enum
\ No newline at end of file
+    deriving Enum
+
+data ShutdownException =
+    ShutdownException
+    | RestartException
+     deriving (Show, Typeable)
+
+instance Exception ShutdownException
--- a/gameServer/Opts.hs	Tue Feb 22 18:51:22 2011 +0200
+++ b/gameServer/Opts.hs	Sun Feb 27 18:03:33 2011 -0500
@@ -7,10 +7,6 @@
 import System.Environment
 import System.Console.GetOpt
 import Data.Maybe ( fromMaybe )
-#if defined(OFFICIAL_SERVER)
-import qualified Data.ByteString.Char8 as B
-import Network
-#endif
 -------------------
 import CoreTypes
 import Utils
@@ -23,11 +19,6 @@
 
 readListenPort
     , readDedicated
-#if defined(OFFICIAL_SERVER)
-    , readDbLogin
-    , readDbPassword
-    readDbHost
-#endif
     :: String -> ServerInfo -> ServerInfo
 
 
@@ -39,12 +30,6 @@
     where
         readDed = fromMaybe True (maybeRead str :: Maybe Bool)
 
-#if defined(OFFICIAL_SERVER)
-readDbLogin str opts = opts{dbLogin = B.pack str}
-readDbPassword str opts = opts{dbPassword = B.pack str}
-readDbHost str opts = opts{dbHost = B.pack str}
-#endif
-
 getOpts :: ServerInfo -> IO ServerInfo
 getOpts opts = do
     args <- getArgs
--- a/gameServer/ServerCore.hs	Tue Feb 22 18:51:22 2011 +0200
+++ b/gameServer/ServerCore.hs	Sun Feb 27 18:03:33 2011 -0500
@@ -32,7 +32,7 @@
 
 mainLoop :: StateT ServerState IO ()
 mainLoop = forever $ do
-    get >>= \s -> put $! s
+    -- get >>= \s -> put $! s
 
     si <- gets serverInfo
     r <- liftIO $ readChan $ coreChan si
@@ -53,11 +53,6 @@
             liftIO $ debugM "Clients"  $ "DeleteClient: " ++ show ci
             processAction (DeleteClient ci)
 
-                --else
-                --do
-                --debugM "Clients" "Message from dead client"
-                --return (serverInfo, rnc)
-
         ClientAccountInfo ci uid info -> do
             rnc <- gets roomsClients
             exists <- liftIO $ clientExists rnc ci
@@ -90,6 +85,4 @@
 
     rnc <- newRoomsAndClients newRoom
 
-    _ <- forkIO $ evalStateT mainLoop (ServerState Nothing si Set.empty rnc)
-
-    forever $ threadDelay 3600000000 -- one hour
+    evalStateT mainLoop (ServerState Nothing si Set.empty rnc)
--- a/gameServer/hedgewars-server.hs	Tue Feb 22 18:51:22 2011 +0200
+++ b/gameServer/hedgewars-server.hs	Sun Feb 27 18:03:33 2011 -0500
@@ -4,18 +4,15 @@
 
 import Network.Socket
 import Network.BSD
-import Control.Concurrent.STM
 import Control.Concurrent.Chan
-import qualified Control.Exception as Exception
+import qualified Control.Exception as E
 import System.Log.Logger
+import System.Process
+import Control.Monad
 -----------------------------------
 import Opts
 import CoreTypes
 import ServerCore
-#if defined(OFFICIAL_SERVER)
-import Utils
-#endif
-
 
 #if !defined(mingw32_HOST_OS)
 import System.Posix
@@ -27,6 +24,26 @@
     updateGlobalLogger "Clients"
         (setLevel INFO)
 
+
+server :: ServerInfo -> IO ()
+server si = do
+    proto <- getProtocolNumber "tcp"
+    E.bracket
+        (socket AF_INET Stream proto)
+        sClose
+        (\sock -> do
+            setSocketOption sock ReuseAddr 1
+            bindSocket sock (SockAddrInet (listenPort si) iNADDR_ANY)
+            listen sock maxListenQueue
+            startServer si sock
+        )
+
+handleRestart :: ShutdownException -> IO ()
+handleRestart ShutdownException = return ()
+handleRestart RestartException = do
+    _ <- createProcess (proc "./hedgewars-server" [])
+    return ()
+
 main :: IO ()
 main = withSocketsDo $ do
 #if !defined(mingw32_HOST_OS)
@@ -36,28 +53,15 @@
 
     setupLoggers
 
-    stats' <- atomically $ newTMVar (StatisticsInfo 0 0)
     dbQueriesChan <- newChan
     coreChan' <- newChan
-    serverInfo' <- getOpts $ newServerInfo stats' coreChan' dbQueriesChan
+    serverInfo' <- getOpts $ newServerInfo coreChan' dbQueriesChan
 
 #if defined(OFFICIAL_SERVER)
-    dbHost' <- askFromConsole "DB host: "
-    dbLogin' <- askFromConsole "login: "
-    dbPassword' <- askFromConsole "password: "
-    let serverInfo = serverInfo'{dbHost = dbHost', dbLogin = dbLogin', dbPassword = dbPassword'}
+    [dbHost', dbLogin', dbPassword'] <- liftM read $ readFile "hedgewars-server.ini"
+    let si = serverInfo'{dbHost = dbHost', dbLogin = dbLogin', dbPassword = dbPassword'}
 #else
-    let serverInfo = serverInfo'
+    let si = serverInfo'
 #endif
 
-
-    proto <- getProtocolNumber "tcp"
-    Exception.bracket
-        (socket AF_INET Stream proto)
-        sClose
-        (\sock -> do
-            setSocketOption sock ReuseAddr 1
-            bindSocket sock (SockAddrInet (listenPort serverInfo) iNADDR_ANY)
-            listen sock maxListenQueue
-            startServer serverInfo sock
-        )
+    (server si) `E.catch` handleRestart
--- a/hedgewars/GSHandlers.inc	Tue Feb 22 18:51:22 2011 +0200
+++ b/hedgewars/GSHandlers.inc	Sun Feb 27 18:03:33 2011 -0500
@@ -1692,6 +1692,27 @@
     else
         if ((GameTicks and $3F) = 25) then
             doStepFallingGear(Gear);
+    if (Gear^.Health = 0) then
+        begin
+            if not Gear^.dY.isNegative and (Gear^.dY > _0_2) and TestCollisionYwithGear(Gear, 1) then
+                inc(Gear^.Damage, hwRound(Gear^.dY * _70))
+            else if not Gear^.dX.isNegative and (Gear^.dX > _0_2) and TestCollisionXwithGear(Gear, 1) then
+                 inc(Gear^.Damage, hwRound(Gear^.dX * _70))
+            else if Gear^.dY.isNegative and (Gear^.dY < -_0_2) and TestCollisionYwithGear(Gear, -1) then
+                 inc(Gear^.Damage, hwRound(Gear^.dY * -_70))
+            else if Gear^.dX.isNegative and (Gear^.dX < -_0_2) and TestCollisionXwithGear(Gear, -1) then
+                 inc(Gear^.Damage, hwRound(Gear^.dX * -_70));
+        
+        if (Gear^.Damage > random(30)) and ((GameTicks and $FF) = 0) then
+            AddVisualGear(hwRound(Gear^.X) - 4  + Random(8), hwRound(Gear^.Y) - 4 - Random(4), vgtSmoke);
+
+        if (Gear^.Damage > 35) then
+            begin
+            doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+            DeleteGear(Gear);
+            exit
+            end
+        end;
 
     if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then
         if ((Gear^.State and gstAttacking) = 0) then
@@ -1719,6 +1740,8 @@
                     vgtSmoke);
                     PlaySound(sndVaporize);
                     Gear^.Health := 0;
+                    Gear^.Damage := 0;
+AddFileLog('initial mine damage:'+IntToStr(Gear^.Damage));
                     end;
                 exit
                 end;
@@ -2307,13 +2330,19 @@
             //4: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtWaterMelon, 0, cBombsSpeed *
             //                 Gear^.Tag, _0, 5000);
         end;
-        Gear^.dX := Gear^.dX + int2hwFloat(30 * Gear^.Tag)
+        Gear^.dX := Gear^.dX + int2hwFloat(30 * Gear^.Tag);
+        StopSound(Gear^.SoundChannel, 4000);
     end;
 
     if (GameTicks and $3F) = 0 then
         AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
 
-    if (hwRound(Gear^.X) > (LAND_WIDTH+1024)) or (hwRound(Gear^.X) < -1024) then DeleteGear(Gear)
+    if (hwRound(Gear^.X) > (LAND_WIDTH+1024)) or (hwRound(Gear^.X) < -1024) then
+    begin
+        // avoid to play forever (is this necessary?)
+        StopSound(Gear^.SoundChannel);
+        DeleteGear(Gear)
+    end;
 end;
 
 procedure doStepAirAttack(Gear: PGear);
@@ -2344,6 +2373,8 @@
 
     Gear^.Health := 6;
     Gear^.doStep := @doStepAirAttackWork;
+    Gear^.SoundChannel := LoopSound(sndPlane, 4000);
+
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
--- a/hedgewars/SDLh.pas	Tue Feb 22 18:51:22 2011 +0200
+++ b/hedgewars/SDLh.pas	Sun Feb 27 18:03:33 2011 -0500
@@ -826,6 +826,9 @@
 function  Mix_ResumeMusic(music: PMixMusic): LongInt; cdecl; external SDL_MixerLibName;
 function  Mix_HaltChannel(channel: LongInt): LongInt; cdecl; external SDL_MixerLibName;
 
+function  Mix_FadeInChannelTimed(channel: LongInt; chunk: PMixChunk; loops: LongInt; fadems: LongInt; ticks: LongInt): LongInt; cdecl; external SDL_MixerLibName;
+function  Mix_FadeOutChannel(channel: LongInt; fadems: LongInt): LongInt; cdecl; external SDL_MixerLibName;
+
 (*  SDL_image  *)
 function  IMG_Init(flags: LongInt): LongInt; cdecl; external SDL_ImageLibName;
 procedure IMG_Quit; cdecl; external SDL_ImageLibName;
--- a/hedgewars/uSound.pas	Tue Feb 22 18:51:22 2011 +0200
+++ b/hedgewars/uSound.pas	Sun Feb 27 18:03:33 2011 -0500
@@ -35,13 +35,16 @@
 procedure PlaySound(snd: TSound; voicepack: PVoicepack);
 procedure PlaySound(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean);
 function  LoopSound(snd: TSound): LongInt;
+function  LoopSound(snd: TSound; fadems: LongInt): LongInt;
 function  LoopSound(snd: TSound; voicepack: PVoicepack): LongInt;
+function  LoopSound(snd: TSound; voicepack: PVoicepack; fadems: LongInt): LongInt;
 procedure PlayMusic;
 procedure PauseMusic;
 procedure ResumeMusic;
 procedure ChangeMusic;
 procedure StopSound(snd: TSound);
 procedure StopSound(chn: LongInt);
+procedure StopSound(chn, fadems: LongInt);
 function  ChangeVolume(voldelta: LongInt): LongInt;
 function  AskForVoicepack(name: shortstring): Pointer;
 
@@ -219,7 +222,17 @@
     LoopSound:= LoopSound(snd, nil)
 end;
 
+function LoopSound(snd: TSound; fadems: LongInt): LongInt;
+begin
+    LoopSound:= LoopSound(snd, nil, fadems)
+end;
+
 function LoopSound(snd: TSound; voicepack: PVoicepack): LongInt;
+begin
+    LoopSound:= LoopSound(snd, nil, 0)
+end;
+
+function LoopSound(snd: TSound; voicepack: PVoicepack; fadems: LongInt): LongInt;
 var s: shortstring;
 begin
     if (not isSoundEnabled) or fastUntilLag then
@@ -252,13 +265,17 @@
             TryDo(defVoicepack^.chunks[snd] <> nil, msgFailed, true);
             WriteLnToConsole(msgOK);
         end;
-        LoopSound:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], -1, -1);
+        if fadems > 0 then
+            LoopSound:= Mix_FadeInChannelTimed(-1, defVoicepack^.chunks[snd], -1, fadems, -1)
+        else
+            LoopSound:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], -1, -1);
     end;
 end;
 
 procedure StopSound(snd: TSound);
 begin
     if not isSoundEnabled then exit;
+
     if (lastChan[snd] <> -1) and (Mix_Playing(lastChan[snd]) <> 0) then
     begin
         Mix_HaltChannel(lastChan[snd]);
@@ -274,6 +291,14 @@
         Mix_HaltChannel(chn);
 end;
 
+procedure StopSound(chn, fadems: LongInt);
+begin
+    if not isSoundEnabled then exit;
+
+    if (chn <> -1) and (Mix_Playing(chn) <> 0) then
+        Mix_FadeOutChannel(chn, fadems);
+end;
+
 procedure PlayMusic;
 var s: shortstring;
 begin
--- a/hedgewars/uTypes.pas	Tue Feb 22 18:51:22 2011 +0200
+++ b/hedgewars/uTypes.pas	Sun Feb 27 18:03:33 2011 -0500
@@ -106,7 +106,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);
+            sndComeonthen, sndParachute, sndBump, sndResurrector, sndPlane);
 
     TAmmoType  = (amNothing, amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amPickHammer, // 6
             amSkip, amRope, amMine, amDEagle, amDynamite, amFirePunch, amWhip, // 13
--- a/hedgewars/uVariables.pas	Tue Feb 22 18:51:22 2011 +0200
+++ b/hedgewars/uVariables.pas	Sun Feb 27 18:03:33 2011 -0500
@@ -704,7 +704,8 @@
             (FileName:           'Comeonthen.ogg'; Path: ptVoices),// sndComeonthen
             (FileName:            'parachute.ogg'; Path: ptSounds),// sndParachute
             (FileName:                 'bump.ogg'; Path: ptSounds),// sndBump
-            (FileName: 'hogchant3.ogg'; Path: ptSounds) // sndResurrector
+            (FileName:            'hogchant3.ogg'; Path: ptSounds),// sndResurrector
+            (FileName:                'plane.ogg'; Path: ptSounds) // sndPlane
             );
 
     Ammoz: array [TAmmoType] of record
Binary file share/hedgewars/Data/Graphics/Hats/NinjaFull.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/NinjaStraight.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/NinjaTriangle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/NoHat.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/darthvader.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mickey_ears.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/stormtrooper.png has changed
--- a/share/hedgewars/Data/Locale/hedgewars_uk.ts	Tue Feb 22 18:51:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts	Sun Feb 27 18:03:33 2011 -0500
@@ -9,7 +9,7 @@
     </message>
     <message>
         <source>copy of</source>
-        <translation type="unfinished"></translation>
+        <translation>копія</translation>
     </message>
 </context>
 <context>
@@ -21,7 +21,7 @@
     <message numerus="yes">
         <source>Every %1 turn</source>
         <translation>
-            <numerusform>Хожного ходу</numerusform>
+            <numerusform>Кожного ходу</numerusform>
             <numerusform>Кожних %1 ходи</numerusform>
             <numerusform>Кожних %1 ходів</numerusform>
         </translation>
@@ -46,10 +46,6 @@
         <translation>Редагувати схеми</translation>
     </message>
     <message>
-        <source>When this option is enabled selecting a game scheme will auto-select a weapon (and viceversa)</source>
-        <translation type="obsolete">Коли ввімкнена ця опція при виборі схеми гри зброя буде вибрана автоматично (and viceversa)</translation>
-    </message>
-    <message>
         <source>When this option is enabled selecting a game scheme will auto-select a weapon</source>
         <translation>Коли ввімкнена ця опція при виборі схеми гри зброя буде вибрана автоматично</translation>
     </message>
@@ -193,11 +189,11 @@
     </message>
     <message>
         <source>Seed</source>
-        <translation type="unfinished"></translation>
+        <translation>Перемішати</translation>
     </message>
     <message>
         <source>Set</source>
-        <translation type="unfinished"></translation>
+        <translation>Задати</translation>
     </message>
 </context>
 <context>
@@ -335,31 +331,31 @@
     <name>PageDrawMap</name>
     <message>
         <source>Undo</source>
-        <translation type="unfinished"></translation>
+        <translation>Повернути</translation>
     </message>
     <message>
         <source>Clear</source>
-        <translation type="unfinished">Очистити</translation>
+        <translation>Очистити</translation>
     </message>
     <message>
         <source>Load</source>
-        <translation type="unfinished">Завантажити</translation>
+        <translation>Завантажити</translation>
     </message>
     <message>
         <source>Save</source>
-        <translation type="unfinished"></translation>
+        <translation>Зберегти</translation>
     </message>
     <message>
         <source>Load drawn map</source>
-        <translation type="unfinished"></translation>
+        <translation>Завантажити намальовану мапу</translation>
     </message>
     <message>
         <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
-        <translation type="unfinished"></translation>
+        <translation>Намальовані мапи (*.hwmap);;Всі файли (*.*)</translation>
     </message>
     <message>
         <source>Save drawn map</source>
-        <translation type="unfinished"></translation>
+        <translation>Зберегти намальовану мапу</translation>
     </message>
 </context>
 <context>
@@ -561,11 +557,6 @@
         <translation>Спеціальні режими гри, такі як &apos;Вампіризм&apos; чи &apos;Карма&apos; дозволяють розробляти цілком нову тактику. Спробуйте їх в налаштованій грі!</translation>
     </message>
     <message>
-        <source>The Windows version of Hedgewars supports Xfire. Make sure to add Hedgwars to its game list so your friends can see you playing.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">Windows-версія Hedgewars підтримує Xfire. Переконайтеся в тому, що ви додали Hedgwars до списку ігор, щоб ваші друзі могли бачити вас в грі.</translation>
-    </message>
-    <message>
         <source>You should never install Hedgewars on computers you don&apos;t own (school, university, work, etc.). Please ask the responsible person instead!</source>
         <comment>Tips</comment>
         <translation>Ви не повинні встановлювати Hedgewars на комп&apos;ютерах, які вам не належать (школа, університет, робота тощо). Будь ласка, звертайтесь до відповідальної особи!</translation>
@@ -631,11 +622,6 @@
         <translation>Напад піаніно є найбільш руйнівним повітряним ударом. Але ви втратите їжака, тому він має і негативну сторону.</translation>
     </message>
     <message>
-        <source>The Homing Bee can be tricky to use. It&apos;s 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>Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations ... or water.</source>
         <comment>Tips</comment>
         <translation>Липкі Міни чудовий інструмент створення малих ланцюгових реакцій для закидання ворогів у складні ситуації ... або у воду.</translation>
@@ -661,11 +647,6 @@
         <translation>Вогнемет це зброя, але його можна також використати для риття тунелю.</translation>
     </message>
     <message>
-        <source>Use the Incinerating Grenade to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">Використайте Горючу Гранату щоб тимчасово утримати їжаків від проходження такої місцевості як тунелі або платформи.</translation>
-    </message>
-    <message>
         <source>Want to know who&apos;s behind the game? Click on the Hedgewars logo in the main menu to see the credits.</source>
         <comment>Tips</comment>
         <translation>Хочете знати хто робить гру? Натисніть на логотип Hedgewars в головному меню, щоб побачити список.</translation>
@@ -718,17 +699,17 @@
     <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>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="unfinished"></translation>
+        <translation>Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу.</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>Використайте Коктейль Молотова або Вогнемет щоб тимчасово утримати їжаків від проходження такої місцевості як тунелі або платформи.</translation>
     </message>
 </context>
 <context>
@@ -1090,7 +1071,7 @@
     </message>
     <message>
         <source>Copy</source>
-        <translation type="unfinished"></translation>
+        <translation>Копіювати</translation>
     </message>
 </context>
 <context>
@@ -1109,7 +1090,7 @@
     </message>
     <message>
         <source>Copy</source>
-        <translation type="unfinished"></translation>
+        <translation>Копіювати</translation>
     </message>
 </context>
 <context>
@@ -1289,47 +1270,47 @@
     </message>
     <message>
         <source>hand drawn map...</source>
-        <translation type="unfinished"></translation>
+        <translation>вручну намальована мапа...</translation>
     </message>
     <message>
         <source>Disabled</source>
-        <translation type="unfinished"></translation>
+        <translation>Вимкнено</translation>
     </message>
     <message>
         <source>Red/Cyan</source>
-        <translation type="unfinished"></translation>
+        <translation>Червоний/Блакитний</translation>
     </message>
     <message>
         <source>Cyan/Red</source>
-        <translation type="unfinished"></translation>
+        <translation>Блакитний/Червоний</translation>
     </message>
     <message>
         <source>Red/Blue</source>
-        <translation type="unfinished"></translation>
+        <translation>Червоний/Синій</translation>
     </message>
     <message>
         <source>Blue/Red</source>
-        <translation type="unfinished"></translation>
+        <translation>Синій/Червоний</translation>
     </message>
     <message>
         <source>Red/Green</source>
-        <translation type="unfinished"></translation>
+        <translation>Червоний/Зелений</translation>
     </message>
     <message>
         <source>Green/Red</source>
-        <translation type="unfinished"></translation>
+        <translation>Зелений/Червоний</translation>
     </message>
     <message>
         <source>Side-by-side</source>
-        <translation type="unfinished"></translation>
+        <translation>Пліч-о-пліч</translation>
     </message>
     <message>
         <source>Top-Bottom</source>
-        <translation type="unfinished"></translation>
+        <translation>Верх-низ</translation>
     </message>
     <message>
         <source>Wiggle</source>
-        <translation type="unfinished"></translation>
+        <translation>Погойдування</translation>
     </message>
 </context>
 <context>
@@ -1559,11 +1540,11 @@
     </message>
     <message>
         <source>Gameplay</source>
-        <translation type="unfinished"></translation>
+        <translation>Геймплей</translation>
     </message>
     <message>
         <source>Stereo rendering</source>
-        <translation type="unfinished"></translation>
+        <translation>Стерео рендеринг</translation>
     </message>
 </context>
 <context>
@@ -1750,7 +1731,7 @@
     </message>
     <message>
         <source>more</source>
-        <translation type="unfinished"></translation>
+        <translation>більше</translation>
     </message>
 </context>
 <context>
@@ -1808,7 +1789,7 @@
     </message>
     <message>
         <source>copy of</source>
-        <translation type="unfinished"></translation>
+        <translation>копія</translation>
     </message>
 </context>
 <context>
@@ -2212,7 +2193,7 @@
     </message>
     <message>
         <source>Delete</source>
-        <translation type="unfinished">Видалити</translation>
+        <translation>Видалити</translation>
     </message>
     <message>
         <source>Mouse: Left button</source>
@@ -2244,7 +2225,7 @@
     </message>
     <message>
         <source>Clear</source>
-        <translation type="unfinished">Очистити</translation>
+        <translation>Очистити</translation>
     </message>
     <message>
         <source>Return</source>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/uk.lua	Sun Feb 27 18:03:33 2011 -0500
@@ -0,0 +1,94 @@
+locale = {
+--      [":("] = "",
+        ["!!!"] = "Я!",
+        ["A game of luck"] = "Гра на вдачу",
+        ["Aiming Practice"] = "Практика прицілювання", --Bazooka, Shotgun, SniperRifle
+        ["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: "] = "Кращі партії на команду: ",
+        ["Bloody Rookies"] = "Криваві Салаги", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
+        ["Boom!"] = "Бабах!",
+        ["by mikade"] = "від mikade", -- Control, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
+        ["CAPTURE THE FLAG"] = "ЗАХОПЛЕННЯ ПРАПОРА",
+        ["Codename: Teamwork"] = "Кодова назва: Командна гра",
+        ["Congratulations!"] = "Вітаємо!",
+        ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Вітаємо! Ви знищили всі цілі|в межах дозволеного часу.", --Bazooka, Shotgun, SniperRifle
+        ["CONTROL"] = "КОНТРОЛЬ",
+        ["Control pillars to score points."] = "Контрольюй стовпи щоб набрати очки.",
+        ["CONTROL v0.3"] = "КОНТРОЛЬ v0.3",
+        ["CTF_BLIZZARD"] = "ЗАХОПЛЕННЯ ПРАПОРА - ОПЕРАЦІЯ ХУРТОВИНА",
+        ["CUSTOM BUILD 0.2"] = "ОСОБИСТА ВЕРСІЯ 0.2",
+        ["Cybernetic Empire"] = "Кібернетична Імперія",
+        ["DAMMIT, ROOKIE!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА!",
+        ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА! ЗЛІЗЬ З МОЄЇ ГОЛОВИ!",
+        ["Dangerous Ducklings"] = "Небезпечні Каченята",
+        ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Знищіть Об'єкт 3378 |- Жалюгідні Повстанці повинні вижити",
+        ["Enjoy the swim..."] = "Насолоджуйся плаванням...",
+        ["Fastest lap: "] = "Найшвидша партія: ",
+        ["Feeble Resistance"] = "Жалюгідні Повстанці",
+        ["Flag captured!"] = "Прапор захоплено!",
+        ["Flag respawned!"] = "Прапор відновлено!",
+        ["Flag returned!"] = "Прапор повернено!",
+        ["Flags will be placed where each team ends their turn."] = "Прапори будуть розміщені там де кожна команда закінчить свій хід.",
+        ["GAME OVER!"] = "КІНЕЦЬ ГРИ!",
+        ["Game Started!"] = "Гра почалась!",
+        ["Get on over there and take him out!"] = "Залізь туди і прикінчи його!",
+        ["Goal:"] = "Мета:",
+        ["GO! GO! GO!"] = "ДАВАЙ! ДАВАЙ! РУХАЙСЯ!",
+        ["Good birdy......"] = "Гарна пташка......",
+        ["Good luck out there!"] = "Удачі!",
+        ["Hedgewars-Basketball"] = "Баскетбол Їжаками",
+        ["Hedgewars-Knockball"] = "Бейсбол Їжаками",
+        ["Hmmm..."] = "Хмм...",
+        ["Hooray!"] = "Урааа!",
+        ["Hunter"] = "Мисливець", --Bazooka, Shotgun, SniperRifle
+        ["Instructor"] = "Інструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
+        ["- Jumping is disabled"] = "- Стрибки вимкнено",
+        ["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 SUCCESSFUL"] = "МІСІЮ ВИКОНАНО", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+        ["NEW fastest lap: "] = "НОВА найшвидша партія: ",
+        ["NO JUMPING"] = "БЕЗ СТРИБКІВ",
+        ["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",
+        ["points"] = "очок", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+        ["Poison"] = "Смердюк",
+        ["Random Weapons"] = "Випадкова Зброя",
+        [" - 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"] = " - Поверніть ворожий прапор на свою базу щоб заробити очко | - Виграє команда з трьома очками | - Ви можете заробити очко лише коли ваш прапор на вашій базі | - Їжак покине прапор якщо потоне чи буде вбитий | - Покинутий прапор можна повернути або захопити знов | - Їжаки відновлюються після смерті",
+        ["RULES OF THE GAME [Press ESC to view]"] = "ПРАВИЛА ГРИ [Натисніть ESC для перегляду]",
+        ["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!"] = "Побачимося!",
+        ["Shotgun Team"] = "Команда Рушниць",
+        ["Shotgun Training"] = "Тренування з рушницею",
+        ["%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"] = "",
+        ["Spooky Tree"] = "Примарне Дерево",
+        ["Team %d: "] = "Команда %d: ",
+        ["Team Scores:"] = "Результати команд:",
+        ["That was pointless."] = "Це було безглуздо.",
+        ["The enemy is hiding out on yonder ducky!"] = "Ворог ховається на он тій качечці!",
+        ["The flag will respawn next round."] = "Прапор відновиться в наступному раунді.",
+        ["There has been a mix-up with your gear and now you|have to utilize whatever is coming your way!"] = "Сталася плутанина з передачою, і тому ви|повинні використовувати все, що вам попадеться!",
+        ["Toxic Team"] = "Токсична Команда", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+        ["TrophyRace"] = "Погоня за Трофеєм",
+        ["T_T"] = "Ааааа!!!",
+        ["Unit 3378"] = "Об'єкт 3378",
+        ["Use your rope to get from start to finish as fast as you can!"] = "Скористайся мотузкою щоб якнайшвидше досягнути фінішу!",
+        ["Victory for the "] = "Перемога для ", -- CTF_Blizzard, Capture_the_Flag
+        ["You have SCORED!!"] = "Ви заробили ОЧКО!!",
+        ["You've failed. Try again."] = "Спроба не вдалась. Спробуйте знов.",
+        ["You've reached the goal!| |Time: "] = "Ви досягли мети!| |Час: ",
+        ["'Zooka Team"] = "Команда 'Zooka",
+    }
--- a/share/hedgewars/Data/Locale/uk.txt	Tue Feb 22 18:51:22 2011 +0200
+++ b/share/hedgewars/Data/Locale/uk.txt	Sun Feb 27 18:03:33 2011 -0500
@@ -12,7 +12,7 @@
 00:09=Пустельний Орел
 00:10=Динаміт
 00:11=Бейсбольна бита
-00:12=Shoryuken
+00:12=Козацький Удар
 00:13=сек
 00:14=Парашут
 00:15=Повітряна атака
@@ -50,7 +50,11 @@
 00:47=Липка міна
 00:48=Молоток
 00:49=Воскрешатор
-00:50=Напад дрелі
+00:50=Атака дрелями
+00:51=Грудка багна
+00:52=Зброя не вибрана
+00:53=TARDIS
+00:54=Структура
 
 01:00=Вперед до перемоги!
 01:01=Нічия
@@ -277,7 +281,11 @@
 03:47=Приліпіть їх де треба!
 03:48=Час молотка!
 03:49=Робить те, що ви подумали
-03:50=Кротячий фанат
+03:50=Кротяча зброя
+03:51=Знайдено на землі
+03:52=UNUSED
+03:53=Тип 40
+03:54=Збудуй щось
 
 ; Weapon Descriptions (use | as line breaks)
 04:00=Атакуй ворогів використовуючи просту гранату.|Вона вибухне як тільки її таймер доходить до нуля.|1-5: Вистав таймер гранати|Атака: Утримуй щоб метнути сильніше
@@ -292,7 +300,7 @@
 04:09=Вагаєшся відносно цілі? Візьми Пустельного|Орла та стріляй аж до чотирьох разів.|Атака: Стріляй (кілька разів)
 04:10=Груба сила - завжди варіант. Кинь цю класичну|вибухівку поруч з ворогом та відступай.|Атака: Кинь динаміт собі під ноги
 04:11=Позбудься ворога, відправивши його за межі|мапи чи у воду. А як щодо|пограти бейсбол мінами з друзями?|Атака: Дубась все, що бачиш перед собою
-04:12=Підійди близенько та розкрий всю силу|цієї майже смертельної техніки бойових мистецтв.|Атака: Виконай Вогняний Стусан
+04:12=Підійди близенько та розкрий всю силу|цієї майже смертельної техніки бойових мистецтв.|Атака: Виконай Козацький Удар
 04:13=UNUSED
 04:14=Боїшся висоти? Краще візьми парашут.Він|відкриється коли ти будеш падати та|вбереже твого їжака від поранення.|Атака: Розкрий парашут|Довгий Стрибок: Кинь гранати чи подібну зброю
 04:15=Поклич літак для атаки ваших ворогів|бомбардуванням.|Вліво/Вправо: Визнач напрямок нападу|Курсор: Вибери цільовий регіон
Binary file share/hedgewars/Data/Sounds/plane.ogg has changed