# HG changeset patch # User nemo # Date 1298847813 18000 # Node ID 98c5b7a0630a841217caf89773289ca949960e8f # Parent 039771ae3f65ff117dd9c1fa65af56359ddeeec5# Parent ebd3dae634ca4d4e50c91dd789d4b8b712e56e19 merge diff -r ebd3dae634ca -r 98c5b7a0630a QTfrontend/about.cpp --- 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
" "Spanish: Carlos Vives <mail@carlosvives.es>
" "Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
" - "Ukrainian: Eugene V. Lyubimkin <jackyf.devel@gmail.com>, Igor Paliychuk <igor-hkr@mail.ru>, Yevhen Sakara <eresid@gmail.com>" + "Ukrainian: Eugene V. Lyubimkin <jackyf.devel@gmail.com>, Igor Paliychuk <mansonigor@gmail.com>, Eugene Sakara <eresid@gmail.com>" "

") + QLabel::tr("Special thanks:") + "

" diff -r ebd3dae634ca -r 98c5b7a0630a QTfrontend/chatwidget.h --- 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; diff -r ebd3dae634ca -r 98c5b7a0630a QTfrontend/gameuiconfig.h --- 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; }; diff -r ebd3dae634ca -r 98c5b7a0630a QTfrontend/newnetclient.cpp --- 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; } diff -r ebd3dae634ca -r 98c5b7a0630a gameServer/Actions.hs --- 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}) diff -r ebd3dae634ca -r 98c5b7a0630a gameServer/CoreTypes.hs --- 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 diff -r ebd3dae634ca -r 98c5b7a0630a gameServer/Opts.hs --- 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 diff -r ebd3dae634ca -r 98c5b7a0630a gameServer/ServerCore.hs --- 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) diff -r ebd3dae634ca -r 98c5b7a0630a gameServer/hedgewars-server.hs --- 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 diff -r ebd3dae634ca -r 98c5b7a0630a hedgewars/GSHandlers.inc --- 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; //////////////////////////////////////////////////////////////////////////////// diff -r ebd3dae634ca -r 98c5b7a0630a hedgewars/SDLh.pas --- 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; diff -r ebd3dae634ca -r 98c5b7a0630a hedgewars/uSound.pas --- 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 diff -r ebd3dae634ca -r 98c5b7a0630a hedgewars/uTypes.pas --- 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 diff -r ebd3dae634ca -r 98c5b7a0630a hedgewars/uVariables.pas --- 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 diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Graphics/Hats/NinjaFull.png Binary file share/hedgewars/Data/Graphics/Hats/NinjaFull.png has changed diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Graphics/Hats/NinjaStraight.png Binary file share/hedgewars/Data/Graphics/Hats/NinjaStraight.png has changed diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Graphics/Hats/NinjaTriangle.png Binary file share/hedgewars/Data/Graphics/Hats/NinjaTriangle.png has changed diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Graphics/Hats/NoHat.png Binary file share/hedgewars/Data/Graphics/Hats/NoHat.png has changed diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Graphics/Hats/darthvader.png Binary file share/hedgewars/Data/Graphics/Hats/darthvader.png has changed diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Graphics/Hats/mickey_ears.png Binary file share/hedgewars/Data/Graphics/Hats/mickey_ears.png has changed diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Graphics/Hats/stormtrooper.png Binary file share/hedgewars/Data/Graphics/Hats/stormtrooper.png has changed diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Locale/hedgewars_uk.ts --- 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 @@ copy of - + копія @@ -21,7 +21,7 @@ Every %1 turn - Хожного ходу + Кожного ходу Кожних %1 ходи Кожних %1 ходів @@ -46,10 +46,6 @@ Редагувати схеми - When this option is enabled selecting a game scheme will auto-select a weapon (and viceversa) - Коли ввімкнена ця опція при виборі схеми гри зброя буде вибрана автоматично (and viceversa) - - When this option is enabled selecting a game scheme will auto-select a weapon Коли ввімкнена ця опція при виборі схеми гри зброя буде вибрана автоматично @@ -193,11 +189,11 @@ Seed - + Перемішати Set - + Задати @@ -335,31 +331,31 @@ PageDrawMap Undo - + Повернути Clear - Очистити + Очистити Load - Завантажити + Завантажити Save - + Зберегти Load drawn map - + Завантажити намальовану мапу Drawn Maps (*.hwmap);;All files (*.*) - + Намальовані мапи (*.hwmap);;Всі файли (*.*) Save drawn map - + Зберегти намальовану мапу @@ -561,11 +557,6 @@ Спеціальні режими гри, такі як 'Вампіризм' чи 'Карма' дозволяють розробляти цілком нову тактику. Спробуйте їх в налаштованій грі! - The Windows version of Hedgewars supports Xfire. Make sure to add Hedgwars to its game list so your friends can see you playing. - Tips - Windows-версія Hedgewars підтримує Xfire. Переконайтеся в тому, що ви додали Hedgwars до списку ігор, щоб ваші друзі могли бачити вас в грі. - - You should never install Hedgewars on computers you don't own (school, university, work, etc.). Please ask the responsible person instead! Tips Ви не повинні встановлювати Hedgewars на комп'ютерах, які вам не належать (школа, університет, робота тощо). Будь ласка, звертайтесь до відповідальної особи! @@ -631,11 +622,6 @@ Напад піаніно є найбільш руйнівним повітряним ударом. Але ви втратите їжака, тому він має і негативну сторону. - The Homing Bee can be tricky to use. It's turn radius depends on it's velocity, so try to not use full power. - Tips - Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу. - - Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations ... or water. Tips Липкі Міни чудовий інструмент створення малих ланцюгових реакцій для закидання ворогів у складні ситуації ... або у воду. @@ -661,11 +647,6 @@ Вогнемет це зброя, але його можна також використати для риття тунелю. - Use the Incinerating Grenade to temporary keep hedgehogs from passing terrain such as tunnels or platforms. - Tips - Використайте Горючу Гранату щоб тимчасово утримати їжаків від проходження такої місцевості як тунелі або платформи. - - Want to know who's behind the game? Click on the Hedgewars logo in the main menu to see the credits. Tips Хочете знати хто робить гру? Натисніть на логотип Hedgewars в головному меню, щоб побачити список. @@ -718,17 +699,17 @@ The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing. Tips - + Windows-версія Hedgewars підтримує Xfire. Переконайтеся в тому, що ви додали Hedgewars до списку ігор, щоб ваші друзі могли бачити вас в грі. The Homing Bee can be tricky to use. Its turn radius depends on it's velocity, so try to not use full power. Tips - + Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу. Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms. Tips - + Використайте Коктейль Молотова або Вогнемет щоб тимчасово утримати їжаків від проходження такої місцевості як тунелі або платформи. @@ -1090,7 +1071,7 @@ Copy - + Копіювати @@ -1109,7 +1090,7 @@ Copy - + Копіювати @@ -1289,47 +1270,47 @@ hand drawn map... - + вручну намальована мапа... Disabled - + Вимкнено Red/Cyan - + Червоний/Блакитний Cyan/Red - + Блакитний/Червоний Red/Blue - + Червоний/Синій Blue/Red - + Синій/Червоний Red/Green - + Червоний/Зелений Green/Red - + Зелений/Червоний Side-by-side - + Пліч-о-пліч Top-Bottom - + Верх-низ Wiggle - + Погойдування @@ -1559,11 +1540,11 @@ Gameplay - + Геймплей Stereo rendering - + Стерео рендеринг @@ -1750,7 +1731,7 @@ more - + більше @@ -1808,7 +1789,7 @@ copy of - + копія @@ -2212,7 +2193,7 @@ Delete - Видалити + Видалити Mouse: Left button @@ -2244,7 +2225,7 @@ Clear - Очистити + Очистити Return diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Locale/uk.lua --- /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", + } diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Locale/uk.txt --- 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=Поклич літак для атаки ваших ворогів|бомбардуванням.|Вліво/Вправо: Визнач напрямок нападу|Курсор: Вибери цільовий регіон diff -r ebd3dae634ca -r 98c5b7a0630a share/hedgewars/Data/Sounds/plane.ogg Binary file share/hedgewars/Data/Sounds/plane.ogg has changed