# HG changeset patch # User hwmirror # Date 1447086843 0 # Node ID 91370591662bead0e825fa4fd5116f05ffd22186 # Parent 2400c94962881315fa371e18c34cf13a17bb0e76# Parent 5438a3907d59888d1ec05e1d5ffc940f88d0329b Merge from github diff -r 5438a3907d59 -r 91370591662b .hgtags --- a/.hgtags Tue Oct 06 13:28:11 2015 +0200 +++ b/.hgtags Mon Nov 09 16:34:03 2015 +0000 @@ -64,3 +64,9 @@ 7e55468ffe384a3065524c483eb5e3cdb1658fd5 0.9.21-release 7e55468ffe384a3065524c483eb5e3cdb1658fd5 fab746a3597e 0f5961910e2712582b162abd08ae3eed330cc978 Nice one +d9622394ec9c2974a84b9b4d9e6c0ac26c4060ff 0.9.22-RC +0f5961910e2712582b162abd08ae3eed330cc978 Nice one +0000000000000000000000000000000000000000 Nice one +4c4f22cc3fa4e6c1e5cd6cce35350dd93478415f 0.9.22-release +4c4f22cc3fa4e6c1e5cd6cce35350dd93478415f 0.9.22-release +9621fdcad96589b3fd78713a0f31e72f26f068bb 0.9.22-release diff -r 5438a3907d59 -r 91370591662b CMakeLists.txt --- a/CMakeLists.txt Tue Oct 06 13:28:11 2015 +0200 +++ b/CMakeLists.txt Mon Nov 09 16:34:03 2015 +0000 @@ -52,8 +52,8 @@ #versioning set(CPACK_PACKAGE_VERSION_MAJOR 0) set(CPACK_PACKAGE_VERSION_MINOR 9) -set(CPACK_PACKAGE_VERSION_PATCH 22) -set(HEDGEWARS_PROTO_VER 50) +set(CPACK_PACKAGE_VERSION_PATCH 23) +set(HEDGEWARS_PROTO_VER 52) set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") include(${CMAKE_MODULE_PATH}/revinfo.cmake) diff -r 5438a3907d59 -r 91370591662b ChangeLog.txt --- a/ChangeLog.txt Tue Oct 06 13:28:11 2015 +0200 +++ b/ChangeLog.txt Mon Nov 09 16:34:03 2015 +0000 @@ -1,22 +1,39 @@ + features * bugfixes +0.9.22 -> 0.9.23 + * Hammer damage is now rounded down. This means it will cause NO DAMAGE to a hedgehog with less than 3 hp. + * Fixed bee not being affected by wrap world edge while still being thrown + * Fixed turn not ending when sticky mine was trapped on rubberband + 0.9.21 -> 0.9.22 + + New Weapon / Map object: AirMine (floating mine that will follow nearby hedgehogs) + Extensive changes to TechRacer: Variable terrain types, enhanced parameters, hwmap interpreter, fuel limiter, etc. + + HedgeEditor - create missions/etc. in-game! see http://hedgewars.org/HedgeEditor + Map previews can now take script parameters into account and preview waypoints in TechRacer + Added a couple new flags - + Small improvements to the interface and in-game chat - + Divided teams options will now just be ignored when more/less than 2 teams, instead of displaying a fatal error + + Various tweaks to the interface and in-game chat + + Divided teams options will now just be ignored when more/less than 2 teams/clans, instead of displaying a fatal error + Added 6 TechRacer maps to TechMaps + Added 3 SpeedShoppa Challenges: Shoppa Love, Ropes and Crates, The Customer is King + Hammer damage is now rounded up. This means it can be used to execute hedgehogs with only 1 hp. + Improved "Art" theme. * Generated bridges/girders are now connected better to the land mass * Fixed rubberband sprite + * Fixed Wind-Indicator being wrong in certain situations + * Melon Bomb Pieces now bounce on Rubberband + * Reduced menu music volume * The game will now fallback to default voicepack if a team's voicepack is not locally installed. (Instead of rendering team voiceless) * Hammer now does more damage when the Extra-Damage utility is used * Many other bug fixes +Lua-API: + + New map parameter: MapFeatureSize -- numeric representation of detail slider below map preview; use within onGameInit()/onPreviewInit() + + New function: SetMaxBuildDistance([ distInPx ]) -- specify how many pixels away a hedgehog can still place girders/etc. set to 0 for no limit; call with no param to reset to default + + New hook: onSuddenDeath() -- called by engine when sudden death begins + * Previously missing gear states are now available (gstSubmersible, gstFrozen and gstNoGravity) + * Fixed OnHogAttack giving the incorrect AmmoType (amNothing) under certain conditions + 0.9.20 -> 0.9.21: + New type of randomly generated maps: Perlin Maps. + Old Random generated maps are more diverse now. diff -r 5438a3907d59 -r 91370591662b QTfrontend/res/html/about.html --- a/QTfrontend/res/html/about.html Tue Oct 06 13:28:11 2015 +0200 +++ b/QTfrontend/res/html/about.html Mon Nov 09 16:34:03 2015 +0000 @@ -35,6 +35,7 @@ Keybinds, feedback, maps and hats interfaces: Drew Gottlieb <gottlieb.drew@gmail.com>
Login dialogs, frontend improvements: Ondrej Skopek <skopekondrej@gmail.com>
Icegun weapon: Julia Struchenko <urbertar@gmail.com>
+ iPhone/iPad ports: Anton Malmygin <antonc27@mail.ru>

Art:

@@ -82,7 +83,7 @@ Lithuanian: Lukas Urbonas <lukasu08@gmail.com>
Polish: Maciej Mroziński <mynick2@o2.pl>, Wojciech Latkowski <magik17l@gmail.com>, Piotr Mitana, Maciej Górny
Portuguese: Fábio Canário <inufabie@gmail.com>
- Russian: Andrey Korotaev <unC0Rr@gmail.com>, Vitaly Novichkov <admin@wohlnet.ru>
+ Russian: Andrey Korotaev <unC0Rr@gmail.com>, Vitaly Novichkov <admin@wohlnet.ru>, Anton Malmygin <antonc27@mail.ru>
Slovak: Jose Riha
Spanish: Carlos Vives <mail@carlosvives.es>
Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
diff -r 5438a3907d59 -r 91370591662b QTfrontend/util/LibavInteraction.cpp --- a/QTfrontend/util/LibavInteraction.cpp Tue Oct 06 13:28:11 2015 +0200 +++ b/QTfrontend/util/LibavInteraction.cpp Mon Nov 09 16:34:03 2015 +0000 @@ -21,7 +21,9 @@ #if VIDEOREC extern "C" { +#include "libavcodec/avcodec.h" #include "libavformat/avformat.h" +#include "libavutil/avutil.h" } #include @@ -30,13 +32,25 @@ #include "HWApplication.h" -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54, 25, 0) -#define CodecID AVCodecID +// compatibility section +#if LIBAVCODEC_VERSION_MAJOR < 55 +#define av_codec_is_encoder(x) x->encode +#define AVCodecID CodecID +#endif + +#if LIBAVFORMAT_VERSION_MAJOR < 54 +#define avformat_find_stream_info(x, y) av_find_stream_info(x) +#define avformat_close_input(x) av_close_input_file(*(x)) +#endif + +#if LIBAVUTIL_VERSION_MAJOR < 54 +#define AVPixelFormat PixelFormat +#define AV_PIX_FMT_YUV420P PIX_FMT_YUV420P #endif struct Codec { - CodecID id; + AVCodecID id; bool isAudio; QString shortName; // used for identification QString longName; // used for displaying to user @@ -56,7 +70,7 @@ QMap formats; // test if given format supports given codec -bool FormatQueryCodec(AVOutputFormat *ofmt, enum CodecID codec_id) +bool FormatQueryCodec(AVOutputFormat *ofmt, enum AVCodecID codec_id) { #if LIBAVFORMAT_VERSION_MAJOR >= 54 return avformat_query_codec(ofmt, codec_id, FF_COMPLIANCE_NORMAL) == 1; @@ -76,11 +90,7 @@ AVCodec* pCodec = NULL; while ((pCodec = av_codec_next(pCodec))) { -#if LIBAVCODEC_VERSION_MAJOR >= 54 if (!av_codec_is_encoder(pCodec)) -#else - if (!pCodec->encode) -#endif continue; if (pCodec->type != AVMEDIA_TYPE_VIDEO && pCodec->type != AVMEDIA_TYPE_AUDIO) @@ -106,8 +116,8 @@ if (!pCodec->pix_fmts) continue; bool yuv420Supported = false; - for (const PixelFormat* pfmt = pCodec->pix_fmts; *pfmt != -1; pfmt++) - if (*pfmt == PIX_FMT_YUV420P) + for (const enum AVPixelFormat* pfmt = pCodec->pix_fmts; *pfmt != -1; pfmt++) + if (*pfmt == AV_PIX_FMT_YUV420P) { yuv420Supported = true; break; @@ -121,7 +131,7 @@ if (!pCodec->sample_fmts) continue; bool s16Supported = false; - for (const AVSampleFormat* pfmt = pCodec->sample_fmts; *pfmt != -1; pfmt++) + for (const enum AVSampleFormat* pfmt = pCodec->sample_fmts; *pfmt != -1; pfmt++) if (*pfmt == AV_SAMPLE_FMT_S16) { s16Supported = true; @@ -274,11 +284,7 @@ QByteArray utf8path = filepath.toUtf8(); if (avformat_open_input(&pContext, utf8path.data(), NULL, NULL) < 0) return ""; -#if LIBAVFORMAT_VERSION_MAJOR < 53 - if (av_find_stream_info(pContext) < 0) -#else if (avformat_find_stream_info(pContext, NULL) < 0) -#endif return ""; int s = float(pContext->duration)/AV_TIME_BASE; @@ -312,11 +318,7 @@ AVDictionaryEntry* pComment = av_dict_get(pContext->metadata, "comment", NULL, 0); if (pComment) desc += QString("\n") + pComment->value; -#if LIBAVFORMAT_VERSION_MAJOR < 53 - av_close_input_file(pContext); -#else avformat_close_input(&pContext); -#endif return desc; } diff -r 5438a3907d59 -r 91370591662b README --- a/README Tue Oct 06 13:28:11 2015 +0200 +++ b/README Mon Nov 09 16:34:03 2015 +0000 @@ -1,46 +1,1 @@ -Hedgewars - a turn based strategy game. -======================================= - -Copyright 2004-2015 Andrey Korotaev and others. -See QTfrontend/res/html/about.html and CREDITS for a complete list of authors. - -Licence: --------- -Source code is distributed under the terms of the GNU General Public Licence -version 2; images and sounds are distributed under the terms of the GNU Free -Documentation Licence version 1.2. See the COPYING file for the full text of -the licenses. - -Instructions: -------------- -See our wiki at: https://code.google.com/p/hedgewars/wiki/BuildingHedgewars - -You can find an outline of the necessary dependencies in the INSTALL file. - -Source code: ------------- -Our main repository is located at http://hedgewars.googlecode.com using -Mercurial as DVCS. A Git repository is also available (mirrored daily) -at https://github.com/hedgewars/hw - -Contribute: ------------ -If you see a bug or have any suggestion please use the official bug tracker at -http://code.google.com/p/hedgewars/issues/list or the integrated feedback -button. - -If you want to help or get to know the sources better you can do that with some -easy tasks from http://code.google.com/p/hedgewars/wiki/TODO. We also have an -extended API in LUA to customize your adventures in our wiki at -http://code.google.com/p/hedgewars/wiki/LuaAPI. - -If you know your way through the code feel free to send a patch or open a pull -request. The best LUA scripts get released in the official DLC page and later -integrated in the next version. - -Contact: --------- -* IRC channel - irc://irc.freenode.net/hedgewars -* community forum - http://www.hedgewars.org/forum -* mailing list - https://mail.gna.org/listinfo/hedgewars-dev - +README.md \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.md Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,46 @@ +Hedgewars - a turn based strategy game. +======================================= + +Copyright 2004-2015 Andrey Korotaev and others. +See QTfrontend/res/html/about.html and CREDITS for a complete list of authors. + +Licence: +-------- +Source code is distributed under the terms of the GNU General Public Licence +version 2; images and sounds are distributed under the terms of the GNU Free +Documentation Licence version 1.2. See the COPYING file for the full text of +the licenses. + +Instructions: +------------- +See our wiki at: http://hedgewars.org/kb/BuildingHedgewars + +You can find an outline of the necessary dependencies in the INSTALL file. + +Source code: +------------ +Our main repository is located at http://hg.hedgewars.org/hedgewars/ using +Mercurial as DVCS. A Git repository is also available (mirrored daily) +at https://github.com/hedgewars/hw + +Contribute: +----------- +If you see a bug or have any suggestion please use the official bug tracker at +http://code.google.com/p/hedgewars/issues/list or the integrated feedback +button. + +If you want to help or get to know the sources better you can do that with some +easy tasks from http://hedgewars.org/kb/TODO. We also have an +extended API in LUA to customize your adventures in our wiki at +http://hedgewars.org/kb/LuaAPI. + +If you know your way through the code feel free to send a patch or open a pull +request. The best LUA scripts get released in the official DLC page and later +integrated in the next version. + +Contact: +-------- +* IRC channel - irc://irc.freenode.net/hedgewars +* community forum - http://www.hedgewars.org/forum +* mailing list - https://mail.gna.org/listinfo/hedgewars-dev + diff -r 5438a3907d59 -r 91370591662b gameServer/Actions.hs --- a/gameServer/Actions.hs Tue Oct 06 13:28:11 2015 +0200 +++ b/gameServer/Actions.hs Mon Nov 09 16:34:03 2015 +0000 @@ -757,15 +757,16 @@ processAction (CheckFailed msg) = do - Just (CheckInfo fileName _) <- client's checkInfo + Just (CheckInfo fileName _ _) <- client's checkInfo io $ moveFailedRecord fileName processAction (CheckSuccess info) = do - Just (CheckInfo fileName teams) <- client's checkInfo + Just (CheckInfo fileName teams gameDetails) <- client's checkInfo p <- client's clientProto si <- gets serverInfo - io $ writeChan (dbQueries si) $ StoreAchievements p (B.pack fileName) (map toPair teams) info + when (isJust gameDetails) + $ io $ writeChan (dbQueries si) $ StoreAchievements p (B.pack fileName) (map toPair teams) (fromJust gameDetails) info io $ moveCheckedRecord fileName where toPair t = (teamname t, teamowner t) diff -r 5438a3907d59 -r 91370591662b gameServer/CoreTypes.hs --- a/gameServer/CoreTypes.hs Tue Oct 06 13:28:11 2015 +0200 +++ b/gameServer/CoreTypes.hs Mon Nov 09 16:34:03 2015 +0000 @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. \-} -{-# LANGUAGE CPP, OverloadedStrings, DeriveDataTypeable #-} +{-# LANGUAGE CPP, OverloadedStrings, DeriveDataTypeable, GeneralizedNewtypeDeriving #-} module CoreTypes where import Control.Concurrent @@ -119,7 +119,8 @@ CheckInfo { recordFileName :: String, - recordTeams :: [TeamInfo] + recordTeams :: [TeamInfo], + details :: Maybe GameDetails } data ClientInfo = @@ -303,8 +304,8 @@ ServerInfo True "

http://www.hedgewars.org/

" - "

Hedgewars 0.9.19 is out! Please update.

Download page here" - 47 -- latestReleaseVersion + "

Hedgewars 0.9.22 is out! Please update.

Download page here" + 51 -- latestReleaseVersion 41 -- earliestCompatibleVersion 46631 "" @@ -345,10 +346,21 @@ CheckAccount ClientIndex Int B.ByteString B.ByteString | ClearCache | SendStats Int Int - | StoreAchievements Word16 B.ByteString [(B.ByteString, B.ByteString)] [B.ByteString] + | StoreAchievements Word16 B.ByteString [(B.ByteString, B.ByteString)] GameDetails [B.ByteString] | GetReplayName ClientIndex Int B.ByteString deriving (Show, Read) +data GameDetails = + GameDetails { + gameScript :: B.ByteString + , infRope + , isVamp + , infAttacks :: Bool + } deriving (Show, Read) + +instance NFData GameDetails where + rnf (GameDetails a b c d) = a `deepseq` b `deepseq` c `deepseq` d `deepseq` () + data CoreMessage = Accept ClientInfo | ClientMessage (ClientIndex, [B.ByteString]) diff -r 5438a3907d59 -r 91370591662b gameServer/EngineInteraction.hs --- a/gameServer/EngineInteraction.hs Tue Oct 06 13:28:11 2015 +0200 +++ b/gameServer/EngineInteraction.hs Mon Nov 09 16:34:03 2015 +0000 @@ -100,8 +100,8 @@ -> Map.Map B.ByteString B.ByteString -> Map.Map B.ByteString [B.ByteString] -> [B.ByteString] - -> [B.ByteString] -replayToDemo ti mParams prms msgs = if not sane then [] else concat [ + -> (Maybe GameDetails, [B.ByteString]) +replayToDemo ti mParams prms msgs = if not sane then (Nothing, []) else (Just $ GameDetails scriptName infRopes vamp infattacks, concat [ [em "TD"] , maybeScript , maybeMap @@ -117,7 +117,7 @@ , concatMap teamSetup ti , msgs , [em "!"] - ] + ]) where keys1, keys2 :: Set.Set B.ByteString keys1 = Set.fromList ["FEATURE_SIZE", "MAP", "MAPGEN", "MAZE_SIZE", "SEED", "TEMPLATE"] @@ -126,8 +126,10 @@ && Set.null (keys2 Set.\\ Map.keysSet prms) && (not . null . drop 41 $ scheme) && (not . null . tail $ prms Map.! "AMMO") + && ((B.length . head . tail $ prms Map.! "AMMO") > 200) mapGenTypes = ["+rnd+", "+maze+", "+drawn+", "+perlin+"] - maybeScript = let s = head . fromMaybe ["Normal"] $ Map.lookup "SCRIPT" prms in if s == "Normal" then [] else [eml ["escript Scripts/Multiplayer/", s, ".lua"]] + scriptName = head . fromMaybe ["Normal"] $ Map.lookup "SCRIPT" prms + maybeScript = let s = scriptName in if s == "Normal" then [] else [eml ["escript Scripts/Multiplayer/", s, ".lua"]] maybeMap = let m = mParams Map.! "MAP" in if m `elem` mapGenTypes then [] else [eml ["emap ", m]] scheme = tail $ prms Map.! "SCHEME" mapgen = mParams Map.! "MAPGEN" @@ -161,6 +163,9 @@ ]) $ hedgehogs t ) + infRopes = ammoStr `B.index` 7 == '9' + vamp = gameFlags .&. 0x00000200 /= 0 + infattacks = gameFlags .&. 0x00100000 /= 0 drawnMapData :: B.ByteString -> [B.ByteString] drawnMapData = diff -r 5438a3907d59 -r 91370591662b gameServer/OfficialServer/GameReplayStore.hs --- a/gameServer/OfficialServer/GameReplayStore.hs Tue Oct 06 13:28:11 2015 +0200 +++ b/gameServer/OfficialServer/GameReplayStore.hs Mon Nov 09 16:34:03 2015 +0000 @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. \-} -{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-} module OfficialServer.GameReplayStore where import Data.Time @@ -70,11 +70,12 @@ where loadFile :: String -> IO (Maybe CheckInfo, [B.ByteString]) loadFile fileName = E.handle (\(e :: SomeException) -> - warningM "REPLAYS" ("Problems reading " ++ fileName ++ ": " ++ show e) >> return (Just $ CheckInfo fileName [], [])) $ do + warningM "REPLAYS" ("Problems reading " ++ fileName ++ ": " ++ show e) >> return (Just $ CheckInfo fileName [] Nothing, [])) $ do (teams, params1, params2, roundMsgs) <- liftM read $ readFile fileName - return $ ( - Just (CheckInfo fileName teams) - , let d = replayToDemo teams (Map.fromList params1) (Map.fromList params2) (reverse roundMsgs) in d `deepseq` d + let d = replayToDemo teams (Map.fromList params1) (Map.fromList params2) (reverse roundMsgs) + d `deepseq` return $ ( + Just (CheckInfo fileName teams (fst d)) + , snd d ) moveFailedRecord :: String -> IO () diff -r 5438a3907d59 -r 91370591662b gameServer/OfficialServer/extdbinterface.hs --- a/gameServer/OfficialServer/extdbinterface.hs Tue Oct 06 13:28:11 2015 +0200 +++ b/gameServer/OfficialServer/extdbinterface.hs Mon Nov 09 16:34:03 2015 +0000 @@ -28,9 +28,10 @@ import Database.MySQL.Simple import Database.MySQL.Simple.QueryResults import Database.MySQL.Simple.Result -import Data.List (lookup) +import Data.List (lookup, elem) import qualified Data.ByteString.Char8 as B import Data.Word +import Data.Int -------------------------- import CoreTypes import Utils @@ -50,6 +51,15 @@ \ VALUES (?, (SELECT id FROM achievement_types WHERE name = ?), (SELECT uid FROM users WHERE name = ?), \ \ ?, ?, ?, ?)" +dbQueryGamesHistory = + "INSERT INTO rating_games (script, protocol, filename, time, vamp, ropes, infattacks) \ + \ VALUES (?, ?, ?, ?, ?, ?, ?)" + +dbQueryGameId = "SELECT LAST_INSERT_ID()" + +dbQueryGamesHistoryPlaces = "INSERT INTO rating_players (userid, gameid, place) \ + \ VALUES ((SELECT uid FROM users WHERE name = ?), ?, ?)" + dbQueryReplayFilename = "SELECT filename FROM achievements WHERE id = ?" @@ -83,36 +93,54 @@ SendStats clients rooms -> void $ execute dbConn dbQueryStats (clients, rooms) - StoreAchievements p fileName teams info -> - mapM_ (execute dbConn dbQueryAchievement) $ (parseStats p fileName teams) info + StoreAchievements p fileName teams g info -> + sequence_ $ parseStats dbConn p fileName teams g info --readTime = read . B.unpack . B.take 19 . B.drop 8 readTime = B.take 19 . B.drop 8 parseStats :: - Word16 + Connection + -> Word16 -> B.ByteString -> [(B.ByteString, B.ByteString)] - -> [B.ByteString] - -> [(B.ByteString, B.ByteString, B.ByteString, Int, B.ByteString, B.ByteString, Int)] -parseStats p fileName teams = ps + -> GameDetails + -> [B.ByteString] + -> [IO Int64] +parseStats dbConn p fileName teams (GameDetails script infRopes vamp infAttacks) = ps where time = readTime fileName + ps :: [B.ByteString] -> [IO Int64] ps [] = [] - ps ("DRAW" : bs) = ps bs - ps ("WINNERS" : n : bs) = ps $ drop (readInt_ n) bs - ps ("ACHIEVEMENT" : typ : teamname : location : value : bs) = + ps ("DRAW" : bs) = execute dbConn dbQueryGamesHistory (script, (fromIntegral p) :: Int, fileName, time, vamp, infRopes, infAttacks) + : places (map drawParams teams) + : ps bs + ps ("WINNERS" : n : bs) = let winNum = readInt_ n in execute dbConn dbQueryGamesHistory (script, (fromIntegral p) :: Int, fileName, time, vamp, infRopes, infAttacks) + : places (map (placeParams (take winNum bs)) teams) + : ps (drop winNum bs) + ps ("ACHIEVEMENT" : typ : teamname : location : value : bs) = execute dbConn dbQueryAchievement ( time , typ , fromMaybe "" (lookup teamname teams) - , readInt_ value + , (readInt_ value) :: Int , fileName , location - , fromIntegral p + , (fromIntegral p) :: Int ) : ps bs ps (b:bs) = ps bs - + drawParams t = (snd t, 0 :: Int) + placeParams winners t = (snd t, if (fst t) `elem` winners then 1 else 2 :: Int) + places :: [(B.ByteString, Int)] -> IO Int64 + places params = do + res <- query_ dbConn dbQueryGameId + let gameId = case res of + [Only a] -> a + _ -> 0 + mapM_ (execute dbConn dbQueryGamesHistoryPlaces . midInsert gameId) params + return 0 + midInsert :: Int -> (a, b) -> (a, Int, b) + midInsert g (a, b) = (a, g, b) dbConnectionLoop mySQLConnectionInfo = Control.Exception.handle (\(e :: SomeException) -> hPutStrLn stderr $ show e) $ diff -r 5438a3907d59 -r 91370591662b gameServer/Utils.hs --- a/gameServer/Utils.hs Tue Oct 06 13:28:11 2015 +0200 +++ b/gameServer/Utils.hs Mon Nov 09 16:34:03 2015 +0000 @@ -115,6 +115,8 @@ , (48, "0.9.21-dev") , (49, "0.9.21") , (50, "0.9.22-dev") + , (51, "0.9.22") + , (52, "0.9.23-dev") ] askFromConsole :: B.ByteString -> IO B.ByteString diff -r 5438a3907d59 -r 91370591662b hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/CMakeLists.txt Mon Nov 09 16:34:03 2015 +0000 @@ -137,7 +137,7 @@ if(${sdl_framework} GREATER -1) add_flag_append(CMAKE_Pascal_FLAGS "-k-lsdl -k-lsdl_image -k-lsdl_mixer -k-lsdl_ttf -k-lsdl_net") else() - add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kSDL -k-framework -kSDL_image -k-framework -k SDL_mixer -k-framework -k SDL_net -k-framework -kSDL_net") + add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kSDL -k-framework -kSDL_image -k-framework -kSDL_mixer -k-framework -kSDL_net -k-framework -kSDL_net -k-framework -kSDL_ttf") endif() endif() diff -r 5438a3907d59 -r 91370591662b hedgewars/avwrapper/avwrapper.c --- a/hedgewars/avwrapper/avwrapper.c Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/avwrapper/avwrapper.c Mon Nov 09 16:34:03 2015 +0000 @@ -21,13 +21,12 @@ #include #include #include + +#include "libavcodec/avcodec.h" #include "libavformat/avformat.h" +#include "libavutil/avutil.h" #include "libavutil/mathematics.h" -#ifndef AVIO_FLAG_WRITE -#define AVIO_FLAG_WRITE AVIO_WRONLY -#endif - #if (defined _MSC_VER) #define AVWRAP_DECL __declspec(dllexport) #elif ((__GNUC__ >= 3) && (!__EMX__) && (!sun)) @@ -57,11 +56,38 @@ static int g_NumSamples; +// compatibility section #if LIBAVCODEC_VERSION_MAJOR < 54 #define OUTBUFFER_SIZE 200000 static uint8_t g_OutBuffer[OUTBUFFER_SIZE]; +#define avcodec_open2(x, y, z) avcodec_open(x, y) #endif +#if LIBAVCODEC_VERSION_MAJOR < 56 +#define av_frame_alloc avcodec_alloc_frame +#define av_frame_free av_freep +#endif + +#if LIBAVCODEC_VERSION_MAJOR < 57 +#define AV_CODEC_CAP_DELAY CODEC_CAP_DELAY +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE CODEC_CAP_VARIABLE_FRAME_SIZE +#define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER +#define AV_CODEC_FLAG_QSCALE CODEC_FLAG_QSCALE +#endif + +#if LIBAVFORMAT_VERSION_MAJOR < 53 +#define AVIO_FLAG_WRITE AVIO_WRONLY +#endif + +#if LIBAVFORMAT_VERSION_MAJOR < 54 +#define avformat_new_stream(x, y) av_new_stream(x, y->type == AVMEDIA_TYPE_AUDIO) +#endif + +#if LIBAVUTIL_VERSION_MAJOR < 54 +#define AV_PIX_FMT_YUV420P PIX_FMT_YUV420P +#endif + + // pointer to function from hwengine (uUtils.pas) static void (*AddFileLogRaw)(const char* pString); @@ -105,11 +131,7 @@ static void AddAudioStream() { -#if LIBAVFORMAT_VERSION_MAJOR >= 53 g_pAStream = avformat_new_stream(g_pContainer, g_pACodec); -#else - g_pAStream = av_new_stream(g_pContainer, 1); -#endif if(!g_pAStream) { Log("Could not allocate audio stream\n"); @@ -131,26 +153,22 @@ g_pAudio->bit_rate = 160000; // for codecs that support variable bitrate use it, it should be better - g_pAudio->flags |= CODEC_FLAG_QSCALE; + g_pAudio->flags |= AV_CODEC_FLAG_QSCALE; g_pAudio->global_quality = 1*FF_QP2LAMBDA; // some formats want stream headers to be separate if (g_pFormat->flags & AVFMT_GLOBALHEADER) - g_pAudio->flags |= CODEC_FLAG_GLOBAL_HEADER; + g_pAudio->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; // open it -#if LIBAVCODEC_VERSION_MAJOR >= 53 if (avcodec_open2(g_pAudio, g_pACodec, NULL) < 0) -#else - if (avcodec_open(g_pAudio, g_pACodec) < 0) -#endif { Log("Could not open audio codec %s\n", g_pACodec->long_name); return; } #if LIBAVCODEC_VERSION_MAJOR >= 54 - if (g_pACodec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE) + if (g_pACodec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) #else if (g_pAudio->frame_size == 0) #endif @@ -158,7 +176,7 @@ else g_NumSamples = g_pAudio->frame_size; g_pSamples = (int16_t*)av_malloc(g_NumSamples*g_Channels*sizeof(int16_t)); - g_pAFrame = avcodec_alloc_frame(); + g_pAFrame = av_frame_alloc(); if (!g_pAFrame) { Log("Could not allocate frame\n"); @@ -172,7 +190,7 @@ if (!g_pAStream) return 0; - AVPacket Packet = { 0 }; + AVPacket Packet; av_init_packet(&Packet); int NumSamples = fread(g_pSamples, 2*g_Channels, g_NumSamples, g_pSoundFile); @@ -217,11 +235,7 @@ // add a video output stream static int AddVideoStream() { -#if LIBAVFORMAT_VERSION_MAJOR >= 53 g_pVStream = avformat_new_stream(g_pContainer, g_pVCodec); -#else - g_pVStream = av_new_stream(g_pContainer, 0); -#endif if (!g_pVStream) return FatalError("Could not allocate video stream"); @@ -241,20 +255,20 @@ g_pVideo->time_base.den = g_Framerate.num; g_pVideo->time_base.num = g_Framerate.den; //g_pVideo->gop_size = 12; /* emit one intra frame every twelve frames at most */ - g_pVideo->pix_fmt = PIX_FMT_YUV420P; + g_pVideo->pix_fmt = AV_PIX_FMT_YUV420P; // set quality if (g_VQuality > 100) g_pVideo->bit_rate = g_VQuality; else { - g_pVideo->flags |= CODEC_FLAG_QSCALE; + g_pVideo->flags |= AV_CODEC_FLAG_QSCALE; g_pVideo->global_quality = g_VQuality*FF_QP2LAMBDA; } // some formats want stream headers to be separate if (g_pFormat->flags & AVFMT_GLOBALHEADER) - g_pVideo->flags |= CODEC_FLAG_GLOBAL_HEADER; + g_pVideo->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; #if LIBAVCODEC_VERSION_MAJOR < 53 // for some versions of ffmpeg x264 options must be set explicitly @@ -288,18 +302,10 @@ #endif // open the codec -#if LIBAVCODEC_VERSION_MAJOR >= 53 - AVDictionary* pDict = NULL; - if (strcmp(g_pVCodec->name, "libx264") == 0) - av_dict_set(&pDict, "preset", "medium", 0); - - if (avcodec_open2(g_pVideo, g_pVCodec, &pDict) < 0) -#else - if (avcodec_open(g_pVideo, g_pVCodec) < 0) -#endif + if (avcodec_open2(g_pVideo, g_pVCodec, NULL) < 0) return FatalError("Could not open video codec %s", g_pVCodec->long_name); - g_pVFrame = avcodec_alloc_frame(); + g_pVFrame = av_frame_alloc(); if (!g_pVFrame) return FatalError("Could not allocate frame"); @@ -317,10 +323,10 @@ // write interleaved audio frame if (g_pAStream) { - VideoTime = (double)g_pVStream->pts.val*g_pVStream->time_base.num/g_pVStream->time_base.den; + VideoTime = (double)g_pVFrame->pts * g_pVStream->time_base.num/g_pVStream->time_base.den; do { - AudioTime = (double)g_pAStream->pts.val*g_pAStream->time_base.num/g_pAStream->time_base.den; + AudioTime = (double)g_pAFrame->pts * g_pAStream->time_base.num/g_pAStream->time_base.den; ret = WriteAudioFrame(); } while (AudioTime < VideoTime && ret); @@ -496,7 +502,7 @@ { int ret; // output buffered frames - if (g_pVCodec->capabilities & CODEC_CAP_DELAY) + if (g_pVCodec->capabilities & AV_CODEC_CAP_DELAY) { do ret = WriteFrame(NULL); @@ -526,14 +532,14 @@ avcodec_close(g_pVideo); av_free(g_pVideo); av_free(g_pVStream); - av_free(g_pVFrame); + av_frame_free(&g_pVFrame); } if (g_pAStream) { avcodec_close(g_pAudio); av_free(g_pAudio); av_free(g_pAStream); - av_free(g_pAFrame); + av_frame_free(&g_pAFrame); av_free(g_pSamples); fclose(g_pSoundFile); } diff -r 5438a3907d59 -r 91370591662b hedgewars/hwengine.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/options.inc diff -r 5438a3907d59 -r 91370591662b hedgewars/uChat.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uGears.pas --- a/hedgewars/uGears.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uGears.pas Mon Nov 09 16:34:03 2015 +0000 @@ -320,6 +320,7 @@ Ammoz[amTardis].Probability:= 0; end; AddCaption(trmsg[sidSuddenDeath], cWhiteColor, capgrpGameState); + ScriptCall('onSuddenDeath'); playSound(sndSuddenDeath); StopMusic; if SDMusicFN <> '' then PlayMusic diff -r 5438a3907d59 -r 91370591662b hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uGearsHandlersMess.pas Mon Nov 09 16:34:03 2015 +0000 @@ -1094,6 +1094,7 @@ AllInactive := false; Gear^.X := Gear^.X + Gear^.dX; Gear^.Y := Gear^.Y + Gear^.dY; + WorldWrap(Gear); Gear^.dY := Gear^.dY + cGravity; CheckGearDrowning(Gear); CheckCollision(Gear); @@ -1959,7 +1960,7 @@ if land = 0 then land:= TestCollisionYwithGear(Gear,-2); if land = 0 then land:= TestCollisionXwithGear(Gear,-2); if land = 0 then land:= TestCollisionYwithGear(Gear, 2); - if (land <> 0) and (land and lfBouncy = 0) then + if (land <> 0) and ((land and lfBouncy = 0) or ((Gear^.State and gstMoving) = 0)) then begin if ((Gear^.State and gstMoving) <> 0) or (not isZero(Gear^.dX)) or (not isZero(Gear^.dY)) then begin @@ -5197,7 +5198,9 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepPoisonCloud(Gear: PGear); begin - WorldWrap(Gear); + // don't bounce + if WorldEdge <> weBounce then + WorldWrap(Gear); if Gear^.Timer = 0 then begin DeleteGear(Gear); @@ -5253,13 +5256,12 @@ d:= 2 else d:= 3; - // always round up - if dmg mod d > 0 then - dmg:= dmg div d + 1 - else - dmg:= dmg div d; - - ApplyDamage(tmp, CurrentHedgehog, dmg, dsUnknown); + + // always rounding down + dmg:= dmg div d; + + if dmg > 0 then + ApplyDamage(tmp, CurrentHedgehog, dmg, dsUnknown); end; end; @@ -5429,7 +5431,7 @@ for i:= 0 to graves.size - 1 do if graves.ar^[i]^.Health > 0 then begin - resgear := AddGear(hwRound(graves.ar^[i]^.X), hwRound(graves.ar^[i]^.Y), gtHedgehog, gstWait, _0, _0, 0); + resgear := AddGear(hwRound(graves.ar^[i]^.X), hwRound(graves.ar^[i]^.Y), gtHedgehog, gstWait, _0, _0, 0,graves.ar^[i]^.Pos); resgear^.Hedgehog := graves.ar^[i]^.Hedgehog; resgear^.Health := graves.ar^[i]^.Health; PHedgehog(graves.ar^[i]^.Hedgehog)^.Gear := resgear; diff -r 5438a3907d59 -r 91370591662b hedgewars/uGearsHandlersRope.pas --- a/hedgewars/uGearsHandlersRope.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uGearsHandlersRope.pas Mon Nov 09 16:34:03 2015 +0000 @@ -42,7 +42,8 @@ OutError('ERROR: doStepRopeAfterAttack called while HHGear = nil', IsNilHHFatal); DeleteGear(Gear); exit() - end; + end + else if not CurrentTeam^.ExtDriven and (FollowGear <> nil) then FollowGear := HHGear; tX:= HHGear^.X; if WorldWrap(HHGear) and (WorldEdge = weWrap) and @@ -137,7 +138,8 @@ OutError('ERROR: doStepRopeWork called while HHGear = nil', IsNilHHFatal); DeleteGear(Gear); exit() - end; + end + else if not CurrentTeam^.ExtDriven and (FollowGear <> nil) then FollowGear := HHGear; if ((HHGear^.State and gstHHDriven) = 0) or (CheckGearDrowning(HHGear)) or (Gear^.PortalCounter <> 0) then @@ -425,6 +427,7 @@ HHGear: PGear; tx, ty, tt: hwFloat; begin + Gear^.X := Gear^.X - Gear^.dX; Gear^.Y := Gear^.Y - Gear^.dY; Gear^.Elasticity := Gear^.Elasticity + _1; @@ -435,7 +438,8 @@ OutError('ERROR: doStepRopeAttach called while HHGear = nil', IsNilHHFatal); DeleteGear(Gear); exit() - end; + end + else if not CurrentTeam^.ExtDriven and (FollowGear <> nil) then FollowGear := HHGear; DeleteCI(HHGear); diff -r 5438a3907d59 -r 91370591662b hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uGearsHedgehog.pas Mon Nov 09 16:34:03 2015 +0000 @@ -572,6 +572,7 @@ procedure doStepHedgehogDead(Gear: PGear); const frametime = 200; timertime = frametime * 6; +var grave: PGear; begin if Gear^.Hedgehog^.Unplaced then exit; @@ -587,7 +588,10 @@ Gear^.Hedgehog^.Effects[heFrozen]:= 0; Gear^.State:= Gear^.State or gstNoDamage; doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, CurrentHedgehog, EXPLAutoSound); - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtGrave, 0, _0, _0, 0)^.Hedgehog:= Gear^.Hedgehog; + grave:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtGrave, 0, _0, _0, 0); + grave^.Hedgehog:= Gear^.Hedgehog; + grave^.Pos:= Gear^.uid; + DeleteGear(Gear); SetAllToActive end @@ -906,6 +910,7 @@ end; Gear^.State:= Gear^.State or gstMoving; if (Gear^.State and gstHHDriven <> 0) and + (FollowGear <> nil) and (not CurrentTeam^.ExtDriven) and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > _0_003) then begin // TODO: why so aggressive at setting FollowGear when falling? diff -r 5438a3907d59 -r 91370591662b hedgewars/uGearsList.pas --- a/hedgewars/uGearsList.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uGearsList.pas Mon Nov 09 16:34:03 2015 +0000 @@ -23,6 +23,7 @@ uses uFloat, uTypes, SDLh; function AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear; +function AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer, newUid: LongWord): PGear; procedure DeleteGear(Gear: PGear); procedure InsertGearToList(Gear: PGear); procedure RemoveGearFromList(Gear: PGear); @@ -164,11 +165,16 @@ function AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear; +begin +AddGear:= AddGear(X, Y, Kind, State, dX, dY, Timer, 0); +end; +function AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer, newUid: LongWord): PGear; var gear: PGear; //c: byte; cakeData: PCakeData; begin -inc(GCounter); +if newUid = 0 then + inc(GCounter); AddFileLog('AddGear: #' + inttostr(GCounter) + ' (' + inttostr(x) + ',' + inttostr(y) + '), d(' + floattostr(dX) + ',' + floattostr(dY) + ') type = ' + EnumToStr(Kind)); @@ -186,7 +192,9 @@ gear^.doStep:= doStepHandlers[Kind]; gear^.CollisionIndex:= -1; gear^.Timer:= Timer; -gear^.uid:= GCounter; +if newUid = 0 then + gear^.uid:= GCounter +else gear^.uid:= newUid; gear^.SoundChannel:= -1; gear^.ImpactSound:= sndNone; gear^.Density:= _1; diff -r 5438a3907d59 -r 91370591662b hedgewars/uGearsRender.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uLandGenTemplateBased.pas --- a/hedgewars/uLandGenTemplateBased.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uLandGenTemplateBased.pas Mon Nov 09 16:34:03 2015 +0000 @@ -9,7 +9,7 @@ var minDistance, dabDiv: LongInt; // different details size implementation -uses uVariables, uConsts, uFloat, uLandUtils, uRandom, SDLh, math; +uses uVariables, uTypes, uConsts, uFloat, uLandUtils, uRandom, SDLh, math; procedure SetPoints(var Template: TEdgeTemplate; var pa: TPixAr; fps: PPointArray); @@ -327,6 +327,9 @@ DivideEdges(Template.FillPointsCount, pa) until i = pa.Count; +{$IFDEF IPHONEOS} + if GameType <> gmtLandPreview then +{$ENDIF} // make it smooth BezierizeEdge(pa, _0_2); end; diff -r 5438a3907d59 -r 91370591662b hedgewars/uLandTexture.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uLocale.pas --- a/hedgewars/uLocale.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uLocale.pas Mon Nov 09 16:34:03 2015 +0000 @@ -138,11 +138,13 @@ PathPrefix := Strpas(path); uUtils.initModule(false); + uVariables.initModule; uPhysFSLayer.initModule; LoadLocale(Strpas(filename)); uPhysFSLayer.freeModule; + uVariables.freeModule; uUtils.freeModule; end; {$ENDIF} diff -r 5438a3907d59 -r 91370591662b hedgewars/uMatrix.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uRender.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uRenderUtils.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uScript.pas --- a/hedgewars/uScript.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uScript.pas Mon Nov 09 16:34:03 2015 +0000 @@ -644,7 +644,9 @@ begin gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), AmmoCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); - lua_pushinteger(L, gear^.uid); + if gear <> nil then + lua_pushinteger(L, gear^.uid) + else lua_pushnil(L) end else lua_pushnil(L); @@ -658,7 +660,9 @@ begin gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), UtilityCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); - lua_pushinteger(L, gear^.uid); + if gear <> nil then + lua_pushinteger(L, gear^.uid) + else lua_pushnil(L) end else lua_pushnil(L); @@ -677,9 +681,8 @@ health:= cHealthCaseAmount; gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), HealthCrate, health, 0); if gear <> nil then - lua_pushinteger(L, gear^.uid) - else - lua_pushnil(L); + lua_pushinteger(L, gear^.uid) + else lua_pushnil(L); end else lua_pushnil(L); @@ -696,9 +699,8 @@ gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), AmmoCrate, lua_tointeger(L, 3), 0) else gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), AmmoCrate, lua_tointeger(L, 3), lua_tointeger(L, 4)); if gear <> nil then - lua_pushinteger(L, gear^.uid) - else - lua_pushnil(L); + lua_pushinteger(L, gear^.uid) + else lua_pushnil(L); end else lua_pushnil(L); @@ -715,9 +717,8 @@ gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), UtilityCrate, lua_tointeger(L, 3), 0) else gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), UtilityCrate, lua_tointeger(L, 3), lua_tointeger(L, 4)); if gear <> nil then - lua_pushinteger(L, gear^.uid) - else - lua_pushnil(L); + lua_pushinteger(L, gear^.uid) + else lua_pushnil(L); end else lua_pushnil(L); diff -r 5438a3907d59 -r 91370591662b hedgewars/uSound.pas --- a/hedgewars/uSound.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uSound.pas Mon Nov 09 16:34:03 2015 +0000 @@ -301,7 +301,7 @@ end; procedure InitSound; -const channels: LongInt = {$IFDEF MOBILE}1{$ELSE}2{$ENDIF}; +const channels: LongInt = 2; var success: boolean; begin if not (isSoundEnabled or isMusicEnabled) then diff -r 5438a3907d59 -r 91370591662b hedgewars/uStore.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uTextures.pas diff -r 5438a3907d59 -r 91370591662b hedgewars/uTouch.pas --- a/hedgewars/uTouch.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uTouch.pas Mon Nov 09 16:34:03 2015 +0000 @@ -296,7 +296,7 @@ end; if targetting then - AddCaption('Press the target button to mark the target', cWhiteColor, capgrpAmmoInfo); + AddCaption(trmsg[sidPressTarget], cWhiteColor, capgrpAmmoInfo); deleteFinger(pointerId); end; diff -r 5438a3907d59 -r 91370591662b hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uTypes.pas Mon Nov 09 16:34:03 2015 +0000 @@ -61,6 +61,7 @@ {$IFDEF USE_TOUCH_INTERFACE} sprFireButton, sprArrowUp, sprArrowDown, sprArrowLeft, sprArrowRight, sprJumpWidget, sprAMWidget, sprPauseButton, sprTimerButton, sprTargetButton, + sprSwitchButton, {$ENDIF} sprFlake, sprHandRope, sprHandBazooka, sprHandShotgun, sprHandDEagle, sprHandAirAttack, sprHandBaseball, sprPHammer, @@ -455,7 +456,7 @@ sidConfirm, sidSuddenDeath, sidRemaining, sidFuel, sidSync, sidNoEndTurn, sidNotYetAvailable, sidRoundSD, sidRoundsSD, sidReady, sidBounce1, sidBounce2, sidBounce3, sidBounce4, sidBounce5, sidBounce, - sidMute, sidAFK, sidAutoCameraOff, sidAutoCameraOn); + sidMute, sidAFK, sidAutoCameraOff, sidAutoCameraOn, sidPressTarget); // Events that are important for the course of the game or at least interesting for other reasons TEventId = (eidDied, eidDrowned, eidRoundStart, eidRoundWin, eidRoundDraw, diff -r 5438a3907d59 -r 91370591662b hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uVariables.pas Mon Nov 09 16:34:03 2015 +0000 @@ -441,10 +441,12 @@ Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprJumpWidget (FileName: 'pause'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; Width: 120; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprPauseButton - (FileName: 'pause'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;//TODO correct image - Width: 120; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTimerButton - (FileName: 'forwardjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;//TODO correct image - Width: 120; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTargetButton + (FileName: 'timerbutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTimerButton + (FileName: 'targetbutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTargetButton + (FileName: 'switchbutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprSwitchButton {$ENDIF} (FileName: 'Flake'; Path:ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil; Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlake @@ -1363,7 +1365,7 @@ NameTex: nil; Probability: 100; NumberInCase: 4; - Ammo: (Propz: 0; + Ammo: (Propz: ammoprop_NeedUpDown; Count: 4; NumPerTurn: 0; Timer: 0; @@ -2154,6 +2156,7 @@ NumberInCase: 1; Ammo: (Propz: ammoprop_Power or ammoprop_AltUse or + ammoprop_NeedUpDown or ammoprop_NoRoundEnd; Count: 2; NumPerTurn: 0; @@ -2235,6 +2238,7 @@ Probability: 20; NumberInCase: 1; Ammo: (Propz: ammoprop_NoRoundEnd or + ammoprop_NeedUpDown or ammoprop_Utility; Count: 1; NumPerTurn: 0; diff -r 5438a3907d59 -r 91370591662b hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Tue Oct 06 13:28:11 2015 +0200 +++ b/hedgewars/uWorld.pas Mon Nov 09 16:34:03 2015 +0000 @@ -1930,7 +1930,7 @@ ammoType:= CurrentHedgehog^.CurAmmoType; if(CurrentHedgehog <> nil)then - if (Ammoz[ammoType].Ammo.Propz and ammoprop_Timerable) <> 0 then + if ((Ammoz[ammoType].Ammo.Propz and ammoprop_Timerable) <> 0) and (ammoType <> amDrillStrike) then begin utilityWidget.sprite:= sprTimerButton; animateWidget(@utilityWidget, true, true); @@ -1942,7 +1942,7 @@ end else if ammoType = amSwitch then begin - utilityWidget.sprite:= sprTargetButton; + utilityWidget.sprite:= sprSwitchButton; animateWidget(@utilityWidget, true, true); end else if utilityWidget.show then diff -r 5438a3907d59 -r 91370591662b misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj --- a/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Tue Oct 06 13:28:11 2015 +0200 +++ b/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Mon Nov 09 16:34:03 2015 +0000 @@ -290,7 +290,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0710; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Lua" */; compatibilityVersion = "Xcode 3.2"; @@ -398,6 +398,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; diff -r 5438a3907d59 -r 91370591662b misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj --- a/misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj Tue Oct 06 13:28:11 2015 +0200 +++ b/misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj Mon Nov 09 16:34:03 2015 +0000 @@ -179,7 +179,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0710; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Physfs" */; compatibilityVersion = "Xcode 3.2"; @@ -273,6 +273,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; diff -r 5438a3907d59 -r 91370591662b misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj --- a/misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj Tue Oct 06 13:28:11 2015 +0200 +++ b/misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj Mon Nov 09 16:34:03 2015 +0000 @@ -125,7 +125,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0710; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Physlayer" */; compatibilityVersion = "Xcode 3.2"; @@ -204,6 +204,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; diff -r 5438a3907d59 -r 91370591662b project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/switchbutton.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/switchbutton.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/targetbutton.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/targetbutton.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/timerbutton.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/timerbutton.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/AboutViewController.m --- a/project_files/HedgewarsMobile/Classes/AboutViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/AboutViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -27,7 +27,10 @@ return rotationManager(interfaceOrientation); } --(void) viewDidLoad { +-(void) viewDidLoad +{ + [super viewDidLoad]; + [self.tableView setBackgroundColorForAnyTable:[UIColor clearColor]]; self.tableView.allowsSelection = NO; @@ -48,7 +51,7 @@ [self.view insertSubview:background atIndex:0]; [background release]; - [super viewDidLoad]; + [self localizeSegmentedControl]; } -(IBAction) buttonPressed:(id) sender { @@ -56,6 +59,17 @@ [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; } +#pragma mark - Segmented Control + +- (void)localizeSegmentedControl +{ + for (NSUInteger i = 0; i < self.segmentedControl.numberOfSegments; i++) + { + NSString *oldTitle = [self.segmentedControl titleForSegmentAtIndex:i]; + [self.segmentedControl setTitle:NSLocalizedStringFromTable(oldTitle, @"About", nil) forSegmentAtIndex:i]; + } +} + -(IBAction) segmentedControlChanged:(id) sender { [[AudioManagerController mainManager] playClickSound]; [self.tableView setContentOffset:CGPointMake(0, 0) animated:NO]; @@ -119,6 +133,7 @@ label.textColor = [UIColor lightGrayColor]; label.numberOfLines = 5; label.text = footerString; + [footerString release]; label.backgroundColor = [UIColor clearColor]; [footer addSubview:label]; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater.h --- a/project_files/HedgewarsMobile/Classes/Appirater.h Tue Oct 06 13:28:11 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/* - This file is part of Appirater, http://arashpayan.com - - Copyright (c) 2010, Arash Payan - All rights reserved. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import - -extern NSString *const kAppiraterLaunchDate; -extern NSString *const kAppiraterLaunchCount; -extern NSString *const kAppiraterCurrentVersion; -extern NSString *const kAppiraterRatedCurrentVersion; -extern NSString *const kAppiraterDeclinedToRate; - -/* - Place your Apple generated software id here. - */ -#define APPIRATER_APP_ID 391234866 - -/* - Your app's name. - */ -#define APPIRATER_APP_NAME [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey] - -/* - This is the message your users will see once they've passed the day+launches - threshold. - */ -#define APPIRATER_MESSAGE [NSString stringWithFormat:@"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!", APPIRATER_APP_NAME] - -/* - This is the title of the message alert that users will see. - */ -#define APPIRATER_MESSAGE_TITLE [NSString stringWithFormat:@"Rate %@", APPIRATER_APP_NAME] - -/* - The text of the button that rejects reviewing the app. - */ -#define APPIRATER_CANCEL_BUTTON NSLocalizedString(@"No thanks",@"") - -/* - Text of button that will send user to app review page. - */ -#define APPIRATER_RATE_BUTTON [NSString stringWithFormat:@"Rate %@", APPIRATER_APP_NAME] - -/* - Text for button to remind the user to review later. - */ -#define APPIRATER_RATE_LATER NSLocalizedString(@"Remind me later",@"") - -/* - Users will need to have the same version of your app installed for this many - days before they will be prompted to rate it. - */ -#define DAYS_UNTIL_PROMPT 3 // double - -/* - Users will need to launch the same version of the app this many times before - they will be prompted to rate it. - */ -#define LAUNCHES_UNTIL_PROMPT 5 // integer - -/* - 'YES' will show the Appirater alert everytime. Useful for testing how your message - looks and making sure the link to your app's review page works. - */ -#define APPIRATER_DEBUG NO // bool - -@interface Appirater : NSObject { - -} - -+(void) appLaunched; - -@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater.m --- a/project_files/HedgewarsMobile/Classes/Appirater.m Tue Oct 06 13:28:11 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,159 +0,0 @@ -/* - This file is part of Appirater, http://arashpayan.com - - Copyright (c) 2010, Arash Payan - All rights reserved. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - */ - - -#import "Appirater.h" -#import -#import - -NSString *const kAppiraterLaunchDate = @"kAppiraterLaunchDate"; -NSString *const kAppiraterLaunchCount = @"kAppiraterLaunchCount"; -NSString *const kAppiraterCurrentVersion = @"kAppiraterCurrentVersion"; -NSString *const kAppiraterRatedCurrentVersion = @"kAppiraterRatedCurrentVersion"; -NSString *const kAppiraterDeclinedToRate = @"kAppiraterDeclinedToRate"; - -NSString *templateReviewURL = @"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=APP_ID&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software"; - -@implementation Appirater - -+(void) appLaunched { - Appirater *appirater = [[Appirater alloc] init]; - [NSThread detachNewThreadSelector:@selector(appLaunchedHandler) toTarget:appirater withObject:nil]; -} - --(void) appLaunchedHandler { - @autoreleasepool { - - if (APPIRATER_DEBUG) { - [self performSelectorOnMainThread:@selector(showPrompt) withObject:nil waitUntilDone:NO]; - return; - } - - BOOL willShowPrompt = NO; - - // get the app's version - NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]; - - // get the version number that we've been tracking - NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - NSString *trackingVersion = [userDefaults stringForKey:kAppiraterCurrentVersion]; - if (trackingVersion == nil) { - trackingVersion = version; - [userDefaults setObject:version forKey:kAppiraterCurrentVersion]; - } - - if (APPIRATER_DEBUG) - DLog(@"APPIRATER Tracking version: %@", trackingVersion); - - if ([trackingVersion isEqualToString:version]) { - // get the launch date - NSTimeInterval timeInterval = [userDefaults doubleForKey:kAppiraterLaunchDate]; - if (timeInterval == 0) { - timeInterval = [[NSDate date] timeIntervalSince1970]; - [userDefaults setDouble:timeInterval forKey:kAppiraterLaunchDate]; - } - - NSTimeInterval secondsSinceLaunch = [[NSDate date] timeIntervalSinceDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]]; - double secondsUntilPrompt = 60 * 60 * 24 * DAYS_UNTIL_PROMPT; - - // get the launch count - NSInteger launchCount = [userDefaults integerForKey:kAppiraterLaunchCount]; - launchCount++; - [userDefaults setInteger:launchCount forKey:kAppiraterLaunchCount]; - if (APPIRATER_DEBUG) - NSLog(@"APPIRATER Launch count: %ld", (long)launchCount); - - // have they previously declined to rate this version of the app? - BOOL declinedToRate = [userDefaults boolForKey:kAppiraterDeclinedToRate]; - - // have they already rated the app? - BOOL ratedApp = [userDefaults boolForKey:kAppiraterRatedCurrentVersion]; - - if (secondsSinceLaunch > secondsUntilPrompt && - launchCount > LAUNCHES_UNTIL_PROMPT && - !declinedToRate && - !ratedApp) { - if ([HWUtils isNetworkReachable]) { // check if they can reach the app store - willShowPrompt = YES; - [self performSelectorOnMainThread:@selector(showPrompt) withObject:nil waitUntilDone:NO]; - } - } - } else { - // it's a new version of the app, so restart tracking - [userDefaults setObject:version forKey:kAppiraterCurrentVersion]; - [userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:kAppiraterLaunchDate]; - [userDefaults setInteger:1 forKey:kAppiraterLaunchCount]; - [userDefaults setBool:NO forKey:kAppiraterRatedCurrentVersion]; - [userDefaults setBool:NO forKey:kAppiraterDeclinedToRate]; - } - - [userDefaults synchronize]; - if (!willShowPrompt) - [self autorelease]; - - } -} - --(void) showPrompt { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:APPIRATER_MESSAGE_TITLE - message:APPIRATER_MESSAGE - delegate:self - cancelButtonTitle:APPIRATER_CANCEL_BUTTON - otherButtonTitles:APPIRATER_RATE_BUTTON, APPIRATER_RATE_LATER, nil]; - [alertView show]; - [alertView release]; -} - --(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger) buttonIndex { - NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - - switch (buttonIndex) { - case 0: - // they don't want to rate it - [userDefaults setBool:YES forKey:kAppiraterDeclinedToRate]; - break; - case 1: - // they want to rate it - [[UIApplication sharedApplication] openURL: - [NSURL URLWithString:[templateReviewURL stringByReplacingOccurrencesOfString:@"APP_ID" withString:[NSString stringWithFormat:@"%d", APPIRATER_APP_ID]]]]; - - [userDefaults setBool:YES forKey:kAppiraterRatedCurrentVersion]; - break; - case 2: - // remind them later - break; - default: - break; - } - - [userDefaults synchronize]; - - [self release]; -} - -@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ar.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ar.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "إذا كنت تستمع باستخدام %@، فهل تمانع بأن تأخذ دقيقة من وقتك لتقيمه؟ لن يستغرق الأمر أكثر من دقيقة. شكرا لدعمك!"; +"Rate %@" = "قيم %@"; +"No, Thanks" = "لا شكرا"; +"Remind me later" = "ذكرني لاحقا"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ca.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ca.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si li agrada utilitzar %@, li importaria prendre’s un moment per a valorar-lo? No trigarà més d’un minut. Gràcies por la seva col·laboració!"; +"Rate %@" = "Valorar %@"; +"No, Thanks" = "No, gràcies"; +"Remind me later" = "Recordar-m’ho més tard"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/cs.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/cs.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokud se Vám aplikace %@ líbí, mohli byste ji prosím ohodnotit v App Store? Zabere to jen chvilku. Díky za Vaši podporu!"; +"Rate %@" = "Ohodnotit %@"; +"No, Thanks" = "Ne, díky"; +"Remind me later" = "Možná později"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/da.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/da.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du synes om at bruge %@, vil du have noget imod at bruge et kort øjeblik på at bedømme det? Det tager kun et minut. Tak for din støtte!"; +"Rate %@" = "Bedøm %@"; +"No, Thanks" = "Nej tak"; +"Remind me later" = "Påmind mig senere"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/de.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/de.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Sie nutzen %@ gerne? Dann nehmen Sie sich bitte für eine Bewertung einen Moment Zeit! Es dauert nicht länger als eine Minute. Vielen Dank!"; +"Rate %@" = "Bewerte %@"; +"No, Thanks" = "Nein, danke"; +"Remind me later" = "Später erinnern"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/el.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/el.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Αν σου αρέσει το %@, θα μπορούσες να αφιερώσεις μια στιγμή για να το βαθμολογήσεις; Η διαδικασία είναι πολύ σύντομη. Ευχαριστούμε για τη στήριξη!"; +"Rate %@" = "Βαθμολόγηση του %@"; +"No, Thanks" = "Όχι, ευχαριστώ"; +"Remind me later" = "Υπενθύμιση αργότερα"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/en.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/en.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!"; +"Rate %@" = "Rate %@"; +"No, Thanks" = "No, thanks"; +"Remind me later" = "Remind me later"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/es.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/es.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si te ha gustado %@, ¿te gustaría calificarnos? No te tomará más de un minuto. ¡Gracias por tu colaboración!"; +"Rate %@" = "Calificar %@"; +"No, Thanks" = "No, gracias"; +"Remind me later" = "Recuérdame más tarde"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/fi.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/fi.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jos käytät mielelläsi %@, voisitko käyttää hetken ja arvostella sen? Se ei kestä minuuttia kauempaa. Kiitos tuestasi!"; +"Rate %@" = "Arvioi %@"; +"No, Thanks" = "Ei kiitos"; +"Remind me later" = "Muistuta minua myöhemmin"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/fr.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/fr.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si vous aimez %@, voulez-vous prendre un moment pour l'évaluer ? Cela ne vous prendra pas plus d'une minute. Merci de votre soutien !"; +"Rate %@" = "Évaluer %@"; +"No, Thanks" = "Non, merci"; +"Remind me later" = "Me rappeler plus tard"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/he.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/he.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "אם נהנת להשתמש ב %@, האם תסכים לדרג אותה? זה לא יקח יותר מדקה. תודה על התמיכה!"; +"Rate %@" = "דרג את %@"; +"No, Thanks" = "לא תודה"; +"Remind me later" = "מאוחר יותר"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/hu.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/hu.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Ha tetszik a %@, ne felejtsd el értékelni az App Store-ban! Csak egy perc az egész. Köszönet a támogatásért!"; +"Rate %@" = "%@ értékelése"; +"No, Thanks" = "Most inkább nem"; +"Remind me later" = "Emlékeztess később"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/id.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/id.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jika anda menyukai %@, maukah anda memberikan rating kepada aplikasi ini? Rating hanya memakan waktu kurang dari 1 menit. Terimakasih untuk dukungan anda!"; +"Rate %@" = "Rating %@"; +"No, Thanks" = "Tidak, terimakasih"; +"Remind me later" = "Silakan ingatkan saya lagi"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/it.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/it.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se ti piace %@, perché non dedichi qualche istante a darne una valutazione sull'App Store? Non richiederà più di un minuto. Grazie per il supporto!"; +"Rate %@" = "Valuta %@"; +"No, Thanks" = "No, grazie"; +"Remind me later" = "Ricordamelo più tardi"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ja.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ja.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "%@をお使いいただきありがとうございます。もしよろしければ、ほんの少しだけお時間をいただき評価をお願いできませんか?ご協力感謝いたします!"; +"Rate %@" = "%@を評価する"; +"No, Thanks" ="結構です"; +"Remind me later" = "あとで"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ko.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ko.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "%@ 사용이 맘에 드셨나요? 잠시만 시간을 내서 평가를 부탁드리겠습니다. 감사합니다!"; +"Rate %@" = "%@ 평가하기"; +"No, Thanks" = "평가하지 않겠습니다"; +"Remind me later" = "다음에 평가하겠습니다"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ms.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ms.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jika anda suka %@, bolehkah luangkan sedikit masa untuk beri penarafan? Tak sampai seminit pun. Terima kasih atas sokongan anda!"; +"Rate %@" = "Tarafkan %@"; +"No, Thanks" = "Terima kasih saja"; +"Remind me later" = "Ingatkan saya lain kali"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/nb.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/nb.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du liker å bruke %@, kan du ta deg et øyeblikk for å vurdere den? Det vil ikke ta mer enn ett minutt. Takk for din støtte!"; +"Rate %@" = "Vurder %@"; +"No, Thanks" = "Nei, takk"; +"Remind me later" = "Påminn meg senere"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/nl.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/nl.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Als het gebruik van %@ je bevalt, zou je dan een momentje de tijd willen nemen om het te beoordelen? Het duurt nog geen minuut. Bedankt voor je steun!"; +"Rate %@" = "%@ beoordelen"; +"No, Thanks" = "Nee, bedankt"; +"Remind me later" = "Herinner me er later aan"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pl.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pl.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jeżeli podoba Ci się korzystanie z %@, może zechciałbyś poświęcić chwilę czasu, aby ocenić aplikację? Nie zajmie Ci to więcej niż minutę. Dziękujemy za pomoc!"; +"Rate %@" = "Oceń %@"; +"No, Thanks" = "Nie, dziękuję"; +"Remind me later" = "Przypomnij później"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pt-BR.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pt-BR.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se você gosta de usar o %@, que tal avaliá-lo? Não levará mais de um minuto. Agradecemos o seu apoio!"; +"Rate %@" = "Avaliar o %@"; +"No, Thanks" = "Não, obrigado"; +"Remind me later" = "Mais tarde"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pt.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pt.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se você gosta de usar o %@, que tal avaliá-lo? Não levará mais de um minuto. Agradecemos o seu apoio!"; +"Rate %@" = "Avaliar o %@"; +"No, Thanks" = "Não, obrigado"; +"Remind me later" = "Mais tarde"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ro.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ro.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Dacă îți place %@, acordă-i o notă te rog, nu durează mult. Mulțumim pentru susținere!"; +"Rate %@" = "Acordă notă pentru %@"; +"No, Thanks" = "Nu, mulțumesc"; +"Remind me later" = "Adu-mi aminte mai târziu"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ru.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ru.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Если Вам нравится %@, пожалуйста, поставьте свою оценку. Это займет у Вас не больше одной минуты.\n Спасибо за поддержку!"; +"Rate %@" = "Оценить %@"; +"No, Thanks" = "Нет, спасибо"; +"Remind me later" = "Напомнить позже"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/sk.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/sk.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokiaľ sa Vám páči aplikácia %@, mohli by ste ju prosím ohodnotiť v App Store? Zaberie to len chvíľu. Vďaka za Vašu podporu!"; +"Rate %@" = "Ohodnotiť %@"; +"No, Thanks" = "Nie, ďakujem"; +"Remind me later" = "Pripomenúť neskôr"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/sv.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/sv.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Om du gillar att använda %@, kan du tänka dig att betygsätta det åt oss? Det tar bara en minut. Tack för hjälpen!"; +"Rate %@" = "Betygsätt %@"; +"No, Thanks" = "Nej tack"; +"Remind me later" = "Påminn mig senare"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/th.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/th.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "ถ้าคุณกำลังใช้ %@ โปรดสละเวลาสักครู่ในการให้อันดับแก่เรา คุณจะเสียเวลาไม่เกินหนึ่งนาที ขอบคุณสำหรับการสนับสนุน!"; +"Rate %@" = "ให้อันดับ %@"; +"No, Thanks" = "ไม่ ขอบคุณ"; +"Remind me later" = "เตือนฉันภายหลัง"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/tr.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/tr.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Eğer %@ uygulamasını kullanmaktan keyif alıyorsanız, onu değerlendirmek için zaman ayırabilir misiniz? Desteğiniz için teşekkür ederiz!"; +"Rate %@" = "%@ uygulamasını değerlendir"; +"No, Thanks" = "Hayır, teşekkürler"; +"Remind me later" = "Daha sonra hatırlat"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/uk.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/uk.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Якщо вам сподобалося %@, будь ласка, поставте свою оцінку. Це займає не більше однієї хвилини.\n Дякуємо за підтримку!"; +"Rate %@" = "Оцінити %@"; +"No, Thanks" = "Ні, дякую"; +"Remind me later" = "Нагадати пізніше"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/vi.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/vi.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Cảm ơn bạn đã sử dụng ứng dụng %@ trong thời gian qua, bạn có thể dành chút thời gian để đánh giá ứng dụng trong AppStore không?"; +"Rate %@" = "Đánh giá %@"; +"No, Thanks" = "Không, xin cảm ơn"; +"Remind me later" = "Hãy nhắc nhở tôi sau"; \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/zh-Hans.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/zh-Hans.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜欢使用%@,你介意花一点时间给它评分吗?不会超过一分钟。感谢您的支持!"; +"Rate %@" = "给%@评分"; +"No, Thanks" = "不,谢谢"; +"Remind me later" = "稍后提醒我"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/zh-Hant.lproj/AppiraterLocalizable.strings --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/zh-Hant.lproj/AppiraterLocalizable.strings Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,4 @@ +"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜歡使用%@,你介意花一點時間給它評分嗎?不會超過一分鐘。感謝您的支持!"; +"Rate %@" = "給%@評分"; +"No, Thanks" = "不,謝謝"; +"Remind me later" = "稍後提醒我"; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.h Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,331 @@ +/* + This file is part of Appirater. + + Copyright (c) 2012, Arash Payan + All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ +/* + * Appirater.h + * appirater + * + * Created by Arash Payan on 9/5/09. + * http://arashpayan.com + * Copyright 2012 Arash Payan. All rights reserved. + */ + +#import +#import "AppiraterDelegate.h" +#import + +extern NSString *const kAppiraterFirstUseDate; +extern NSString *const kAppiraterUseCount; +extern NSString *const kAppiraterSignificantEventCount; +extern NSString *const kAppiraterCurrentVersion; +extern NSString *const kAppiraterRatedCurrentVersion; +extern NSString *const kAppiraterDeclinedToRate; +extern NSString *const kAppiraterReminderRequestDate; + +/*! + Your localized app's name. + */ +#define APPIRATER_LOCALIZED_APP_NAME [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"] + +/*! + Your app's name. + */ +#define APPIRATER_APP_NAME APPIRATER_LOCALIZED_APP_NAME ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"] + +/*! + This is the message your users will see once they've passed the day+launches + threshold. + */ +#define APPIRATER_LOCALIZED_MESSAGE NSLocalizedStringFromTableInBundle(@"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!", @"AppiraterLocalizable", [Appirater bundle], nil) +#define APPIRATER_MESSAGE [NSString stringWithFormat:APPIRATER_LOCALIZED_MESSAGE, APPIRATER_APP_NAME] + +/*! + This is the title of the message alert that users will see. + */ +#define APPIRATER_LOCALIZED_MESSAGE_TITLE NSLocalizedStringFromTableInBundle(@"Rate %@", @"AppiraterLocalizable", [Appirater bundle], nil) +#define APPIRATER_MESSAGE_TITLE [NSString stringWithFormat:APPIRATER_LOCALIZED_MESSAGE_TITLE, APPIRATER_APP_NAME] + +/*! + The text of the button that rejects reviewing the app. + */ +#define APPIRATER_CANCEL_BUTTON NSLocalizedStringFromTableInBundle(@"No, Thanks", @"AppiraterLocalizable", [Appirater bundle], nil) + +/*! + Text of button that will send user to app review page. + */ +#define APPIRATER_LOCALIZED_RATE_BUTTON NSLocalizedStringFromTableInBundle(@"Rate %@", @"AppiraterLocalizable", [Appirater bundle], nil) +#define APPIRATER_RATE_BUTTON [NSString stringWithFormat:APPIRATER_LOCALIZED_RATE_BUTTON, APPIRATER_APP_NAME] + +/*! + Text for button to remind the user to review later. + */ +#define APPIRATER_RATE_LATER NSLocalizedStringFromTableInBundle(@"Remind me later", @"AppiraterLocalizable", [Appirater bundle], nil) + +@interface Appirater : NSObject { + + UIAlertView *ratingAlert; +} + +@property(nonatomic, strong) UIAlertView *ratingAlert; +@property(nonatomic) BOOL openInAppStore; +#if __has_feature(objc_arc_weak) +@property(nonatomic, weak) NSObject *delegate; +#else +@property(nonatomic, unsafe_unretained) NSObject *delegate; +#endif + +/*! + Tells Appirater that the app has launched, and on devices that do NOT + support multitasking, the 'uses' count will be incremented. You should + call this method at the end of your application delegate's + application:didFinishLaunchingWithOptions: method. + + If the app has been used enough to be rated (and enough significant events), + you can suppress the rating alert + by passing NO for canPromptForRating. The rating alert will simply be postponed + until it is called again with YES for canPromptForRating. The rating alert + can also be triggered by appEnteredForeground: and userDidSignificantEvent: + (as long as you pass YES for canPromptForRating in those methods). + */ ++ (void)appLaunched:(BOOL)canPromptForRating; + +/*! + Tells Appirater that the app was brought to the foreground on multitasking + devices. You should call this method from the application delegate's + applicationWillEnterForeground: method. + + If the app has been used enough to be rated (and enough significant events), + you can suppress the rating alert + by passing NO for canPromptForRating. The rating alert will simply be postponed + until it is called again with YES for canPromptForRating. The rating alert + can also be triggered by appLaunched: and userDidSignificantEvent: + (as long as you pass YES for canPromptForRating in those methods). + */ ++ (void)appEnteredForeground:(BOOL)canPromptForRating; + +/*! + Tells Appirater that the user performed a significant event. A significant + event is whatever you want it to be. If you're app is used to make VoIP + calls, then you might want to call this method whenever the user places + a call. If it's a game, you might want to call this whenever the user + beats a level boss. + + If the user has performed enough significant events and used the app enough, + you can suppress the rating alert by passing NO for canPromptForRating. The + rating alert will simply be postponed until it is called again with YES for + canPromptForRating. The rating alert can also be triggered by appLaunched: + and appEnteredForeground: (as long as you pass YES for canPromptForRating + in those methods). + */ ++ (void)userDidSignificantEvent:(BOOL)canPromptForRating; + +/*! + Tells Appirater to try and show the prompt (a rating alert). The prompt will be showed + if there is connection available, the user hasn't declined to rate + or hasn't rated current version. + + You could call to show the prompt regardless Appirater settings, + e.g., in case of some special event in your app. + */ ++ (void)tryToShowPrompt; + +/*! + Tells Appirater to show the prompt (a rating alert). + Similar to tryToShowPrompt, but without checks (the prompt is always displayed). + Passing false will hide the rate later button on the prompt. + + The only case where you should call this is if your app has an + explicit "Rate this app" command somewhere. This is similar to rateApp, + but instead of jumping to the review directly, an intermediary prompt is displayed. + */ ++ (void)forceShowPrompt:(BOOL)displayRateLaterButton; + +/*! + Tells Appirater to open the App Store page where the user can specify a + rating for the app. Also records the fact that this has happened, so the + user won't be prompted again to rate the app. + + The only case where you should call this directly is if your app has an + explicit "Rate this app" command somewhere. In all other cases, don't worry + about calling this -- instead, just call the other functions listed above, + and let Appirater handle the bookkeeping of deciding when to ask the user + whether to rate the app. + */ ++ (void)rateApp; + +/*! + Tells Appirater to immediately close any open rating modals (e.g. StoreKit rating VCs). +*/ ++ (void)closeModal; + +/*! + Asks Appirater if the user has declined to rate; +*/ +- (BOOL)userHasDeclinedToRate; + +/*! + Asks Appirater if the user has rated the current version. + Note that this is not a guarantee that the user has actually rated the app in the + app store, but they've just clicked the rate button on the Appirater dialog. +*/ +- (BOOL)userHasRatedCurrentVersion; + +@end + +@interface Appirater(Configuration) + +/*! + Set your Apple generated software id here. + */ ++ (void) setAppId:(NSString*)appId; + +/*! + Users will need to have the same version of your app installed for this many + days before they will be prompted to rate it. + */ ++ (void) setDaysUntilPrompt:(double)value; + +/*! + An example of a 'use' would be if the user launched the app. Bringing the app + into the foreground (on devices that support it) would also be considered + a 'use'. You tell Appirater about these events using the two methods: + [Appirater appLaunched:] + [Appirater appEnteredForeground:] + + Users need to 'use' the same version of the app this many times before + before they will be prompted to rate it. + */ ++ (void) setUsesUntilPrompt:(NSInteger)value; + +/*! + A significant event can be anything you want to be in your app. In a + telephone app, a significant event might be placing or receiving a call. + In a game, it might be beating a level or a boss. This is just another + layer of filtering that can be used to make sure that only the most + loyal of your users are being prompted to rate you on the app store. + If you leave this at a value of -1, then this won't be a criterion + used for rating. To tell Appirater that the user has performed + a significant event, call the method: + [Appirater userDidSignificantEvent:]; + */ ++ (void) setSignificantEventsUntilPrompt:(NSInteger)value; + + +/*! + Once the rating alert is presented to the user, they might select + 'Remind me later'. This value specifies how long (in days) Appirater + will wait before reminding them. + */ ++ (void) setTimeBeforeReminding:(double)value; + +/*! + Set customized title for alert view. + */ ++ (void) setCustomAlertTitle:(NSString *)title; + +/*! + Set customized message for alert view. + */ ++ (void) setCustomAlertMessage:(NSString *)message; + +/*! + Set customized cancel button title for alert view. + */ ++ (void) setCustomAlertCancelButtonTitle:(NSString *)cancelTitle; + +/*! + Set customized rate button title for alert view. + */ ++ (void) setCustomAlertRateButtonTitle:(NSString *)rateTitle; + +/*! + Set customized rate later button title for alert view. + */ ++ (void) setCustomAlertRateLaterButtonTitle:(NSString *)rateLaterTitle; + +/*! + 'YES' will show the Appirater alert everytime. Useful for testing how your message + looks and making sure the link to your app's review page works. + */ ++ (void) setDebug:(BOOL)debug; + +/*! + Set the delegate if you want to know when Appirater does something + */ ++ (void)setDelegate:(id)delegate; + +/*! + Set whether or not Appirater uses animation (currently respected when pushing modal StoreKit rating VCs). + */ ++ (void)setUsesAnimation:(BOOL)animation; + +/*! + If set to YES, Appirater will open App Store link (instead of SKStoreProductViewController on iOS 6). Default YES. + */ ++ (void)setOpenInAppStore:(BOOL)openInAppStore; + +/*! + If set to YES, the main bundle will always be used to load localized strings. + Set this to YES if you have provided your own custom localizations in AppiraterLocalizable.strings + in your main bundle. Default is NO. + */ ++ (void)setAlwaysUseMainBundle:(BOOL)useMainBundle; + +@end + + +/*! + Methods in this interface are public out of necessity, but may change without notice + */ +@interface Appirater(Unsafe) + +/*! + The bundle localized strings will be loaded from. +*/ ++(NSBundle *)bundle; + +@end + +@interface Appirater(Deprecated) + +/*! + DEPRECATED: While still functional, it's better to use + appLaunched:(BOOL)canPromptForRating instead. + + Calls [Appirater appLaunched:YES]. See appLaunched: for details of functionality. + */ ++ (void)appLaunched __attribute__((deprecated)); + +/*! + DEPRECATED: While still functional, it's better to use + tryToShowPrompt instead. + + Calls [Appirater tryToShowPrompt]. See tryToShowPrompt for details of functionality. + */ ++ (void)showPrompt __attribute__((deprecated)); + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/Appirater.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.m Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,732 @@ +/* + This file is part of Appirater. + + Copyright (c) 2012, Arash Payan + All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ +/* + * Appirater.m + * appirater + * + * Created by Arash Payan on 9/5/09. + * http://arashpayan.com + * Copyright 2012 Arash Payan. All rights reserved. + */ + +#import "Appirater.h" +#import +#include + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + +NSString *const kAppiraterFirstUseDate = @"kAppiraterFirstUseDate"; +NSString *const kAppiraterUseCount = @"kAppiraterUseCount"; +NSString *const kAppiraterSignificantEventCount = @"kAppiraterSignificantEventCount"; +NSString *const kAppiraterCurrentVersion = @"kAppiraterCurrentVersion"; +NSString *const kAppiraterRatedCurrentVersion = @"kAppiraterRatedCurrentVersion"; +NSString *const kAppiraterDeclinedToRate = @"kAppiraterDeclinedToRate"; +NSString *const kAppiraterReminderRequestDate = @"kAppiraterReminderRequestDate"; + +NSString *templateReviewURL = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APP_ID"; +NSString *templateReviewURLiOS7 = @"itms-apps://itunes.apple.com/app/idAPP_ID"; +NSString *templateReviewURLiOS8 = @"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=APP_ID&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software"; + +static NSString *_appId; +static double _daysUntilPrompt = 30; +static NSInteger _usesUntilPrompt = 20; +static NSInteger _significantEventsUntilPrompt = -1; +static double _timeBeforeReminding = 1; +static BOOL _debug = NO; +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 + static id _delegate; +#else + __weak static id _delegate; +#endif +static BOOL _usesAnimation = TRUE; +static UIStatusBarStyle _statusBarStyle; +static BOOL _modalOpen = false; +static BOOL _alwaysUseMainBundle = NO; + +@interface Appirater () +@property (nonatomic, copy) NSString *alertTitle; +@property (nonatomic, copy) NSString *alertMessage; +@property (nonatomic, copy) NSString *alertCancelTitle; +@property (nonatomic, copy) NSString *alertRateTitle; +@property (nonatomic, copy) NSString *alertRateLaterTitle; +- (BOOL)connectedToNetwork; ++ (Appirater*)sharedInstance; +- (void)showPromptWithChecks:(BOOL)withChecks + displayRateLaterButton:(BOOL)displayRateLaterButton; +- (void)showRatingAlert:(BOOL)displayRateLaterButton; +- (void)showRatingAlert; +- (BOOL)ratingAlertIsAppropriate; +- (BOOL)ratingConditionsHaveBeenMet; +- (void)incrementUseCount; +- (void)hideRatingAlert; +@end + +@implementation Appirater + +@synthesize ratingAlert; + ++ (void) setAppId:(NSString *)appId { + _appId = appId; +} + ++ (void) setDaysUntilPrompt:(double)value { + _daysUntilPrompt = value; +} + ++ (void) setUsesUntilPrompt:(NSInteger)value { + _usesUntilPrompt = value; +} + ++ (void) setSignificantEventsUntilPrompt:(NSInteger)value { + _significantEventsUntilPrompt = value; +} + ++ (void) setTimeBeforeReminding:(double)value { + _timeBeforeReminding = value; +} + ++ (void) setCustomAlertTitle:(NSString *)title +{ + [self sharedInstance].alertTitle = title; +} + ++ (void) setCustomAlertMessage:(NSString *)message +{ + [self sharedInstance].alertMessage = message; +} + ++ (void) setCustomAlertCancelButtonTitle:(NSString *)cancelTitle +{ + [self sharedInstance].alertCancelTitle = cancelTitle; +} + ++ (void) setCustomAlertRateButtonTitle:(NSString *)rateTitle +{ + [self sharedInstance].alertRateTitle = rateTitle; +} + ++ (void) setCustomAlertRateLaterButtonTitle:(NSString *)rateLaterTitle +{ + [self sharedInstance].alertRateLaterTitle = rateLaterTitle; +} + ++ (void) setDebug:(BOOL)debug { + _debug = debug; +} ++ (void)setDelegate:(id)delegate{ + _delegate = delegate; +} ++ (void)setUsesAnimation:(BOOL)animation { + _usesAnimation = animation; +} ++ (void)setOpenInAppStore:(BOOL)openInAppStore { + [Appirater sharedInstance].openInAppStore = openInAppStore; +} ++ (void)setStatusBarStyle:(UIStatusBarStyle)style { + _statusBarStyle = style; +} ++ (void)setModalOpen:(BOOL)open { + _modalOpen = open; +} ++ (void)setAlwaysUseMainBundle:(BOOL)alwaysUseMainBundle { + _alwaysUseMainBundle = alwaysUseMainBundle; +} + ++ (NSBundle *)bundle +{ + NSBundle *bundle; + + if (_alwaysUseMainBundle) { + bundle = [NSBundle mainBundle]; + } else { + NSURL *appiraterBundleURL = [[NSBundle mainBundle] URLForResource:@"Appirater" withExtension:@"bundle"]; + + if (appiraterBundleURL) { + // Appirater.bundle will likely only exist when used via CocoaPods + bundle = [NSBundle bundleWithURL:appiraterBundleURL]; + } else { + bundle = [NSBundle mainBundle]; + } + } + + return bundle; +} + +- (NSString *)alertTitle +{ + return _alertTitle ? _alertTitle : APPIRATER_MESSAGE_TITLE; +} + +- (NSString *)alertMessage +{ + return _alertMessage ? _alertMessage : APPIRATER_MESSAGE; +} + +- (NSString *)alertCancelTitle +{ + return _alertCancelTitle ? _alertCancelTitle : APPIRATER_CANCEL_BUTTON; +} + +- (NSString *)alertRateTitle +{ + return _alertRateTitle ? _alertRateTitle : APPIRATER_RATE_BUTTON; +} + +- (NSString *)alertRateLaterTitle +{ + return _alertRateLaterTitle ? _alertRateLaterTitle : APPIRATER_RATE_LATER; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (id)init { + self = [super init]; + if (self) { + if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) { + self.openInAppStore = YES; + } else { + self.openInAppStore = NO; + } + } + + return self; +} + +- (BOOL)connectedToNetwork { + // Create zero addy + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + // Recover reachability flags + SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); + SCNetworkReachabilityFlags flags; + + Boolean didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); + CFRelease(defaultRouteReachability); + + if (!didRetrieveFlags) + { + NSLog(@"Error. Could not recover network reachability flags"); + return NO; + } + + BOOL isReachable = flags & kSCNetworkFlagsReachable; + BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; + BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection; + + NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"]; + NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0]; + NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self]; + + return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO; +} + ++ (Appirater*)sharedInstance { + static Appirater *appirater = nil; + if (appirater == nil) + { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + appirater = [[Appirater alloc] init]; + appirater.delegate = _delegate; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive) name: + UIApplicationWillResignActiveNotification object:nil]; + }); + } + + return appirater; +} + +- (void)showRatingAlert:(BOOL)displayRateLaterButton { + UIAlertView *alertView = nil; + id delegate = _delegate; + + if(delegate && [delegate respondsToSelector:@selector(appiraterShouldDisplayAlert:)] && ![delegate appiraterShouldDisplayAlert:self]) { + return; + } + + if (displayRateLaterButton) { + alertView = [[UIAlertView alloc] initWithTitle:self.alertTitle + message:self.alertMessage + delegate:self + cancelButtonTitle:self.alertCancelTitle + otherButtonTitles:self.alertRateTitle, self.alertRateLaterTitle, nil]; + } else { + alertView = [[UIAlertView alloc] initWithTitle:self.alertTitle + message:self.alertMessage + delegate:self + cancelButtonTitle:self.alertCancelTitle + otherButtonTitles:self.alertRateTitle, nil]; + } + + self.ratingAlert = alertView; + [alertView show]; + + if (delegate && [delegate respondsToSelector:@selector(appiraterDidDisplayAlert:)]) { + [delegate appiraterDidDisplayAlert:self]; + } +} + +- (void)showRatingAlert +{ + [self showRatingAlert:true]; +} + +// is this an ok time to show the alert? (regardless of whether the rating conditions have been met) +// +// things checked here: +// * connectivity with network +// * whether user has rated before +// * whether user has declined to rate +// * whether rating alert is currently showing visibly +// things NOT checked here: +// * time since first launch +// * number of uses of app +// * number of significant events +// * time since last reminder +- (BOOL)ratingAlertIsAppropriate { + return ([self connectedToNetwork] + && ![self userHasDeclinedToRate] + && !self.ratingAlert.visible + && ![self userHasRatedCurrentVersion]); +} + +// have the rating conditions been met/earned? (regardless of whether this would be a moment when it's appropriate to show a new rating alert) +// +// things checked here: +// * time since first launch +// * number of uses of app +// * number of significant events +// * time since last reminder +// things NOT checked here: +// * connectivity with network +// * whether user has rated before +// * whether user has declined to rate +// * whether rating alert is currently showing visibly +- (BOOL)ratingConditionsHaveBeenMet { + if (_debug) + return YES; + + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + + NSDate *dateOfFirstLaunch = [NSDate dateWithTimeIntervalSince1970:[userDefaults doubleForKey:kAppiraterFirstUseDate]]; + NSTimeInterval timeSinceFirstLaunch = [[NSDate date] timeIntervalSinceDate:dateOfFirstLaunch]; + NSTimeInterval timeUntilRate = 60 * 60 * 24 * _daysUntilPrompt; + if (timeSinceFirstLaunch < timeUntilRate) + return NO; + + // check if the app has been used enough + NSInteger useCount = [userDefaults integerForKey:kAppiraterUseCount]; + if (useCount < _usesUntilPrompt) + return NO; + + // check if the user has done enough significant events + NSInteger sigEventCount = [userDefaults integerForKey:kAppiraterSignificantEventCount]; + if (sigEventCount < _significantEventsUntilPrompt) + return NO; + + // if the user wanted to be reminded later, has enough time passed? + NSDate *reminderRequestDate = [NSDate dateWithTimeIntervalSince1970:[userDefaults doubleForKey:kAppiraterReminderRequestDate]]; + NSTimeInterval timeSinceReminderRequest = [[NSDate date] timeIntervalSinceDate:reminderRequestDate]; + NSTimeInterval timeUntilReminder = 60 * 60 * 24 * _timeBeforeReminding; + if (timeSinceReminderRequest < timeUntilReminder) + return NO; + + return YES; +} + +- (void)incrementUseCount { + // get the app's version + NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]; + + // get the version number that we've been tracking + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + NSString *trackingVersion = [userDefaults stringForKey:kAppiraterCurrentVersion]; + if (trackingVersion == nil) + { + trackingVersion = version; + [userDefaults setObject:version forKey:kAppiraterCurrentVersion]; + } + + if (_debug) + NSLog(@"APPIRATER Tracking version: %@", trackingVersion); + + if ([trackingVersion isEqualToString:version]) + { + // check if the first use date has been set. if not, set it. + NSTimeInterval timeInterval = [userDefaults doubleForKey:kAppiraterFirstUseDate]; + if (timeInterval == 0) + { + timeInterval = [[NSDate date] timeIntervalSince1970]; + [userDefaults setDouble:timeInterval forKey:kAppiraterFirstUseDate]; + } + + // increment the use count + NSInteger useCount = [userDefaults integerForKey:kAppiraterUseCount]; + useCount++; + [userDefaults setInteger:useCount forKey:kAppiraterUseCount]; + if (_debug) + NSLog(@"APPIRATER Use count: %@", @(useCount)); + } + else + { + // it's a new version of the app, so restart tracking + [userDefaults setObject:version forKey:kAppiraterCurrentVersion]; + [userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:kAppiraterFirstUseDate]; + [userDefaults setInteger:1 forKey:kAppiraterUseCount]; + [userDefaults setInteger:0 forKey:kAppiraterSignificantEventCount]; + [userDefaults setBool:NO forKey:kAppiraterRatedCurrentVersion]; + [userDefaults setBool:NO forKey:kAppiraterDeclinedToRate]; + [userDefaults setDouble:0 forKey:kAppiraterReminderRequestDate]; + } + + [userDefaults synchronize]; +} + +- (void)incrementSignificantEventCount { + // get the app's version + NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]; + + // get the version number that we've been tracking + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + NSString *trackingVersion = [userDefaults stringForKey:kAppiraterCurrentVersion]; + if (trackingVersion == nil) + { + trackingVersion = version; + [userDefaults setObject:version forKey:kAppiraterCurrentVersion]; + } + + if (_debug) + NSLog(@"APPIRATER Tracking version: %@", trackingVersion); + + if ([trackingVersion isEqualToString:version]) + { + // check if the first use date has been set. if not, set it. + NSTimeInterval timeInterval = [userDefaults doubleForKey:kAppiraterFirstUseDate]; + if (timeInterval == 0) + { + timeInterval = [[NSDate date] timeIntervalSince1970]; + [userDefaults setDouble:timeInterval forKey:kAppiraterFirstUseDate]; + } + + // increment the significant event count + NSInteger sigEventCount = [userDefaults integerForKey:kAppiraterSignificantEventCount]; + sigEventCount++; + [userDefaults setInteger:sigEventCount forKey:kAppiraterSignificantEventCount]; + if (_debug) + NSLog(@"APPIRATER Significant event count: %@", @(sigEventCount)); + } + else + { + // it's a new version of the app, so restart tracking + [userDefaults setObject:version forKey:kAppiraterCurrentVersion]; + [userDefaults setDouble:0 forKey:kAppiraterFirstUseDate]; + [userDefaults setInteger:0 forKey:kAppiraterUseCount]; + [userDefaults setInteger:1 forKey:kAppiraterSignificantEventCount]; + [userDefaults setBool:NO forKey:kAppiraterRatedCurrentVersion]; + [userDefaults setBool:NO forKey:kAppiraterDeclinedToRate]; + [userDefaults setDouble:0 forKey:kAppiraterReminderRequestDate]; + } + + [userDefaults synchronize]; +} + +- (void)incrementAndRate:(BOOL)canPromptForRating { + [self incrementUseCount]; + + if (canPromptForRating && + [self ratingConditionsHaveBeenMet] && + [self ratingAlertIsAppropriate]) + { + dispatch_async(dispatch_get_main_queue(), + ^{ + [self showRatingAlert]; + }); + } +} + +- (void)incrementSignificantEventAndRate:(BOOL)canPromptForRating { + [self incrementSignificantEventCount]; + + if (canPromptForRating && + [self ratingConditionsHaveBeenMet] && + [self ratingAlertIsAppropriate]) + { + dispatch_async(dispatch_get_main_queue(), + ^{ + [self showRatingAlert]; + }); + } +} + +- (BOOL)userHasDeclinedToRate { + return [[NSUserDefaults standardUserDefaults] boolForKey:kAppiraterDeclinedToRate]; +} + +- (BOOL)userHasRatedCurrentVersion { + return [[NSUserDefaults standardUserDefaults] boolForKey:kAppiraterRatedCurrentVersion]; +} + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-implementations" ++ (void)appLaunched { + [Appirater appLaunched:YES]; +} +#pragma GCC diagnostic pop + ++ (void)appLaunched:(BOOL)canPromptForRating { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), + ^{ + Appirater *a = [Appirater sharedInstance]; + if (_debug) { + dispatch_async(dispatch_get_main_queue(), + ^{ + [a showRatingAlert]; + }); + } else { + [a incrementAndRate:canPromptForRating]; + } + }); +} + +- (void)hideRatingAlert { + if (self.ratingAlert.visible) { + if (_debug) + NSLog(@"APPIRATER Hiding Alert"); + [self.ratingAlert dismissWithClickedButtonIndex:-1 animated:NO]; + } +} + ++ (void)appWillResignActive { + if (_debug) + NSLog(@"APPIRATER appWillResignActive"); + [[Appirater sharedInstance] hideRatingAlert]; +} + ++ (void)appEnteredForeground:(BOOL)canPromptForRating { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), + ^{ + [[Appirater sharedInstance] incrementAndRate:canPromptForRating]; + }); +} + ++ (void)userDidSignificantEvent:(BOOL)canPromptForRating { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), + ^{ + [[Appirater sharedInstance] incrementSignificantEventAndRate:canPromptForRating]; + }); +} + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-implementations" ++ (void)showPrompt { + [Appirater tryToShowPrompt]; +} +#pragma GCC diagnostic pop + ++ (void)tryToShowPrompt { + [[Appirater sharedInstance] showPromptWithChecks:true + displayRateLaterButton:true]; +} + ++ (void)forceShowPrompt:(BOOL)displayRateLaterButton { + [[Appirater sharedInstance] showPromptWithChecks:false + displayRateLaterButton:displayRateLaterButton]; +} + +- (void)showPromptWithChecks:(BOOL)withChecks + displayRateLaterButton:(BOOL)displayRateLaterButton { + if (withChecks == NO || [self ratingAlertIsAppropriate]) { + [self showRatingAlert:displayRateLaterButton]; + } +} + ++ (id)getRootViewController { + UIWindow *window = [[UIApplication sharedApplication] keyWindow]; + if (window.windowLevel != UIWindowLevelNormal) { + NSArray *windows = [[UIApplication sharedApplication] windows]; + for(window in windows) { + if (window.windowLevel == UIWindowLevelNormal) { + break; + } + } + } + + return [Appirater iterateSubViewsForViewController:window]; // iOS 8+ deep traverse +} + ++ (id)iterateSubViewsForViewController:(UIView *) parentView { + for (UIView *subView in [parentView subviews]) { + UIResponder *responder = [subView nextResponder]; + if([responder isKindOfClass:[UIViewController class]]) { + return [self topMostViewController: (UIViewController *) responder]; + } + id found = [Appirater iterateSubViewsForViewController:subView]; + if( nil != found) { + return found; + } + } + return nil; +} + ++ (UIViewController *) topMostViewController: (UIViewController *) controller { + BOOL isPresenting = NO; + do { + // this path is called only on iOS 6+, so -presentedViewController is fine here. + UIViewController *presented = [controller presentedViewController]; + isPresenting = presented != nil; + if(presented != nil) { + controller = presented; + } + + } while (isPresenting); + + return controller; +} + ++ (void)rateApp { + + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + [userDefaults setBool:YES forKey:kAppiraterRatedCurrentVersion]; + [userDefaults synchronize]; + + //Use the in-app StoreKit view if available (iOS 6) and imported. This works in the simulator. + if (![Appirater sharedInstance].openInAppStore && NSStringFromClass([SKStoreProductViewController class]) != nil) { + + SKStoreProductViewController *storeViewController = [[SKStoreProductViewController alloc] init]; + NSNumber *appId = [NSNumber numberWithInteger:_appId.integerValue]; + [storeViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:appId} completionBlock:nil]; + storeViewController.delegate = self.sharedInstance; + + id delegate = self.sharedInstance.delegate; + if ([delegate respondsToSelector:@selector(appiraterWillPresentModalView:animated:)]) { + [delegate appiraterWillPresentModalView:self.sharedInstance animated:_usesAnimation]; + } + [[self getRootViewController] presentViewController:storeViewController animated:_usesAnimation completion:^{ + [self setModalOpen:YES]; + //Temporarily use a black status bar to match the StoreKit view. + [self setStatusBarStyle:[UIApplication sharedApplication].statusBarStyle]; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent animated:_usesAnimation]; +#endif + }]; + + //Use the standard openUrl method if StoreKit is unavailable. + } else { + + #if TARGET_IPHONE_SIMULATOR + NSLog(@"APPIRATER NOTE: iTunes App Store is not supported on the iOS simulator. Unable to open App Store page."); + #else + NSString *reviewURL = [templateReviewURL stringByReplacingOccurrencesOfString:@"APP_ID" withString:[NSString stringWithFormat:@"%@", _appId]]; + + // iOS 7 needs a different templateReviewURL @see https://github.com/arashpayan/appirater/issues/131 + // Fixes condition @see https://github.com/arashpayan/appirater/issues/205 + if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 && [[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) { + reviewURL = [templateReviewURLiOS7 stringByReplacingOccurrencesOfString:@"APP_ID" withString:[NSString stringWithFormat:@"%@", _appId]]; + } + // iOS 8 needs a different templateReviewURL also @see https://github.com/arashpayan/appirater/issues/182 + else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) + { + reviewURL = [templateReviewURLiOS8 stringByReplacingOccurrencesOfString:@"APP_ID" withString:[NSString stringWithFormat:@"%@", _appId]]; + } + + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:reviewURL]]; + #endif + } +} + +- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + + id delegate = _delegate; + + switch (buttonIndex) { + case 0: + { + // they don't want to rate it + [userDefaults setBool:YES forKey:kAppiraterDeclinedToRate]; + [userDefaults synchronize]; + if(delegate && [delegate respondsToSelector:@selector(appiraterDidDeclineToRate:)]){ + [delegate appiraterDidDeclineToRate:self]; + } + break; + } + case 1: + { + // they want to rate it + [Appirater rateApp]; + if(delegate&& [delegate respondsToSelector:@selector(appiraterDidOptToRate:)]){ + [delegate appiraterDidOptToRate:self]; + } + break; + } + case 2: + // remind them later + [userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:kAppiraterReminderRequestDate]; + [userDefaults synchronize]; + if(delegate && [delegate respondsToSelector:@selector(appiraterDidOptToRemindLater:)]){ + [delegate appiraterDidOptToRemindLater:self]; + } + break; + default: + break; + } +} + +//Delegate call from the StoreKit view. +- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController { + [Appirater closeModal]; +} + +//Close the in-app rating (StoreKit) view and restore the previous status bar style. ++ (void)closeModal { + if (_modalOpen) { + [[UIApplication sharedApplication]setStatusBarStyle:_statusBarStyle animated:_usesAnimation]; + BOOL usedAnimation = _usesAnimation; + [self setModalOpen:NO]; + + // get the top most controller (= the StoreKit Controller) and dismiss it + UIViewController *presentingController = [UIApplication sharedApplication].keyWindow.rootViewController; + presentingController = [self topMostViewController: presentingController]; + [presentingController dismissViewControllerAnimated:_usesAnimation completion:^{ + id delegate = self.sharedInstance.delegate; + if ([delegate respondsToSelector:@selector(appiraterDidDismissModalView:animated:)]) { + [delegate appiraterDidDismissModalView:(Appirater *)self animated:usedAnimation]; + } + }]; + [self.class setStatusBarStyle:(UIStatusBarStyle)nil]; + } +} + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/Appirater/AppiraterDelegate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/Appirater/AppiraterDelegate.h Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,23 @@ +// +// AppiraterDelegate.h +// Banana Stand +// +// Created by Robert Haining on 9/25/12. +// Copyright (c) 2012 News.me. All rights reserved. +// + +#import + +@class Appirater; + +@protocol AppiraterDelegate + +@optional +-(BOOL)appiraterShouldDisplayAlert:(Appirater *)appirater; +-(void)appiraterDidDisplayAlert:(Appirater *)appirater; +-(void)appiraterDidDeclineToRate:(Appirater *)appirater; +-(void)appiraterDidOptToRate:(Appirater *)appirater; +-(void)appiraterDidOptToRemindLater:(Appirater *)appirater; +-(void)appiraterWillPresentModalView:(Appirater *)appirater animated:(BOOL)animated; +-(void)appiraterDidDismissModalView:(Appirater *)appirater animated:(BOOL)animated; +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/CreationChamber.m --- a/project_files/HedgewarsMobile/Classes/CreationChamber.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/CreationChamber.m Mon Nov 09 16:34:03 2015 +0000 @@ -57,7 +57,7 @@ [[NSFileManager defaultManager] removeItemAtPath:SCHEMES_DIRECTORY() error:NULL]; NSArray *schemeNames = [[NSArray alloc] initWithObjects:@"Default",@"Pro Mode",@"Shoppa",@"Clean Slate", @"Minefield",@"Barrel Mayhem",@"Tunnel Hogs",@"Fort Mode",@"Timeless", - @"Thinking with Portals",@"King Mode",nil]; + @"Thinking with Portals",@"King Mode",@"Construction Mode",nil]; index = 0; for (NSString *name in schemeNames) [self createSchemeNamed:name ofType:index++]; @@ -65,7 +65,7 @@ // WEAPONS - always overwrite as merge is not needed (missing weaps are 0ed automatically) NSArray *weaponNames = [[NSArray alloc] initWithObjects:@"Default",@"Crazy",@"Pro Mode",@"Shoppa",@"Clean Slate", - @"Minefield",@"Thinking with Portals",nil]; + @"Minefield",@"Thinking with Portals",@"One of Everything",@"Highlander",@"Construction Mode",@"Shoppa Pro",nil]; index = 0; for (NSString *name in weaponNames) [self createWeaponNamed:name ofType:index++]; @@ -241,6 +241,30 @@ delay = [[NSString alloc] initWithBytes:AMMOLINE_PORTALS_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; crate = [[NSString alloc] initWithBytes:AMMOLINE_PORTALS_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; break; + case 7: //one of everything + qt = [[NSString alloc] initWithBytes:AMMOLINE_ONEEVERY_QT length:ammolineSize encoding:NSUTF8StringEncoding]; + prob = [[NSString alloc] initWithBytes:AMMOLINE_ONEEVERY_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; + delay = [[NSString alloc] initWithBytes:AMMOLINE_ONEEVERY_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; + crate = [[NSString alloc] initWithBytes:AMMOLINE_ONEEVERY_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; + break; + case 8: //highlander + qt = [[NSString alloc] initWithBytes:AMMOLINE_HIGHLANDER_QT length:ammolineSize encoding:NSUTF8StringEncoding]; + prob = [[NSString alloc] initWithBytes:AMMOLINE_HIGHLANDER_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; + delay = [[NSString alloc] initWithBytes:AMMOLINE_HIGHLANDER_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; + crate = [[NSString alloc] initWithBytes:AMMOLINE_HIGHLANDER_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; + break; + case 9: //construction mode + qt = [[NSString alloc] initWithBytes:AMMOLINE_CONSTRUCTION_QT length:ammolineSize encoding:NSUTF8StringEncoding]; + prob = [[NSString alloc] initWithBytes:AMMOLINE_CONSTRUCTION_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; + delay = [[NSString alloc] initWithBytes:AMMOLINE_CONSTRUCTION_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; + crate = [[NSString alloc] initWithBytes:AMMOLINE_CONSTRUCTION_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; + break; + case 10: //shoppa pro + qt = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPAPRO_QT length:ammolineSize encoding:NSUTF8StringEncoding]; + prob = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPAPRO_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; + delay = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPAPRO_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; + crate = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPAPRO_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; + break; } NSDictionary *theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys: qt,@"ammostore_initialqt", @@ -303,6 +327,7 @@ [basicArray replaceObjectAtIndex:9 withObject:[NSNumber numberWithInt:25]]; [basicArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithInt:0]]; [basicArray replaceObjectAtIndex:13 withObject:[NSNumber numberWithInt:0]]; + [basicArray replaceObjectAtIndex:15 withObject:[NSNumber numberWithInt:8]]; [gamemodArray replaceObjectAtIndex:1 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; @@ -342,6 +367,7 @@ [basicArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithInt:10]]; [basicArray replaceObjectAtIndex:12 withObject:[NSNumber numberWithInt:10]]; [basicArray replaceObjectAtIndex:13 withObject:[NSNumber numberWithInt:10]]; + [basicArray replaceObjectAtIndex:15 withObject:[NSNumber numberWithInt:4]]; [gamemodArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:14 withObject:[NSNumber numberWithBool:YES]]; @@ -373,6 +399,7 @@ [basicArray replaceObjectAtIndex:10 withObject:[NSNumber numberWithInt:4]]; [basicArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithInt:5]]; [basicArray replaceObjectAtIndex:13 withObject:[NSNumber numberWithInt:5]]; + [basicArray replaceObjectAtIndex:15 withObject:[NSNumber numberWithInt:4]]; [gamemodArray replaceObjectAtIndex:9 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; break; @@ -380,6 +407,15 @@ [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:12 withObject:[NSNumber numberWithBool:YES]]; break; + case 11: // construction mode + [basicArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithInt:0]]; + [basicArray replaceObjectAtIndex:13 withObject:[NSNumber numberWithInt:0]]; + [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; + [gamemodArray replaceObjectAtIndex:15 withObject:[NSNumber numberWithBool:YES]]; + [gamemodArray replaceObjectAtIndex:16 withObject:[NSNumber numberWithBool:YES]]; + [gamemodArray replaceObjectAtIndex:18 withObject:[NSNumber numberWithBool:YES]]; + [gamemodArray replaceObjectAtIndex:20 withObject:[NSNumber numberWithBool:YES]]; + break; } NSMutableDictionary *theScheme = [[NSMutableDictionary alloc] initWithObjectsAndKeys: diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/EditableCellView.m --- a/project_files/HedgewarsMobile/Classes/EditableCellView.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/EditableCellView.m Mon Nov 09 16:34:03 2015 +0000 @@ -18,7 +18,7 @@ #import "EditableCellView.h" - +#import "UITableViewCell+FindTable.h" @implementation EditableCellView @synthesize delegate, textField, titleLabel, minimumCharacters, maximumCharacters, respectEditing, oldValue; @@ -103,13 +103,13 @@ -(BOOL) textFieldShouldBeginEditing:(UITextField *)aTextField { return (delegate != nil) && [delegate respondsToSelector:@selector(saveTextFieldValue:withTag:)] && - (respectEditing) ? ((UITableView*)[self superview]).editing : YES; + (respectEditing) ? [self findTable].editing : YES; } // the textfield is being modified, update the navigation controller -(void) textFieldDidBeginEditing:(UITextField *)aTextField{ // don't interact with table below - ((UITableView*)[self superview]).scrollEnabled = NO; + [self findTable].scrollEnabled = NO; self.oldValue = self.textField.text; @@ -147,9 +147,9 @@ [self save:aTextField]; // restores default behaviour on caller - ((UITableView*)[self superview]).scrollEnabled = YES; - [(UITableViewController *)delegate navigationItem].rightBarButtonItem = [(UITableViewController *)delegate navigationItem].backBarButtonItem; - [(UITableViewController *)delegate navigationItem].leftBarButtonItem = nil; + [self findTable].scrollEnabled = YES; + [(UITableViewController *)delegate navigationItem].leftBarButtonItem = [(UITableViewController *)delegate navigationItem].backBarButtonItem; + [(UITableViewController *)delegate navigationItem].rightBarButtonItem = nil; } #pragma mark - diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m --- a/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Mon Nov 09 16:34:03 2015 +0000 @@ -197,7 +197,7 @@ // wrapper that computes the length of the message and then sends the command string, saving the command on a file -(int) sendToEngine:(NSString *)string { - uint8_t length = [string length]; + uint8_t length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; [self dumpRawData:[string UTF8String] ofSize:length]; SDLNet_TCP_Send(csd, &length, 1); @@ -206,7 +206,7 @@ // wrapper that computes the length of the message and then sends the command string, skipping file writing -(int) sendToEngineNoSave:(NSString *)string { - uint8_t length = [string length]; + uint8_t length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; SDLNet_TCP_Send(csd, &length, 1); return SDLNet_TCP_Send(csd, [string UTF8String], length); @@ -341,19 +341,25 @@ NSString *tempStr = [NSString stringWithUTF8String:&buffer[2]]; NSArray *info = [tempStr componentsSeparatedByString:@" "]; NSString *arg = [info objectAtIndex:0]; - int index = [arg length] + 3; + int index = [arg lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 3; switch (buffer[1]) { case 'r': // winning team [statsArray insertObject:[NSString stringWithUTF8String:&buffer[2]] atIndex:1]; break; case 'D': // best shot - [statsArray addObject:[NSString stringWithFormat:@"The best shot award won by %s (with %@ points)", &buffer[index], arg]]; + { + NSString *hogName = [NSString stringWithUTF8String:&buffer[index]]; + [statsArray addObject:[NSString stringWithFormat:NSLocalizedString(@"The best shot award won by %@ (with %@ points)", nil), hogName, arg]]; break; + } case 'k': // best hedgehog - [statsArray addObject:[NSString stringWithFormat:@"The best killer is %s with %@ kill(s) in a turn", &buffer[index], arg]]; + { + NSString *hogName = [NSString stringWithUTF8String:&buffer[index]]; + [statsArray addObject:[NSString stringWithFormat:NSLocalizedString(@"The best killer is %@ with %@ kill(s) in a turn", nil), hogName, arg]]; break; + } case 'K': // number of hogs killed - [statsArray addObject:[NSString stringWithFormat:@"%@ hedgehog(s) were killed during this round", arg]]; + [statsArray addObject:[NSString stringWithFormat:NSLocalizedString(@"%@ hedgehog(s) were killed during this round", nil), arg]]; break; case 'H': // team health/graph break; @@ -364,14 +370,23 @@ [[statsArray objectAtIndex:0] addObject:tempStr]; break; case 's': // self damage - [statsArray addObject:[NSString stringWithFormat:@"%s thought it's good to shoot his own hedgehogs with %@ points", &buffer[index], arg]]; + { + NSString *hogName = [NSString stringWithUTF8String:&buffer[index]]; + [statsArray addObject:[NSString stringWithFormat:NSLocalizedString(@"%@ thought it's good to shoot his own hedgehogs with %@ points", nil), hogName, arg]]; break; + } case 'S': // friendly fire - [statsArray addObject:[NSString stringWithFormat:@"%s killed %@ of his own hedgehogs", &buffer[index], arg]]; + { + NSString *hogName = [NSString stringWithUTF8String:&buffer[index]]; + [statsArray addObject:[NSString stringWithFormat:NSLocalizedString(@"%@ killed %@ of his own hedgehogs", nil), hogName, arg]]; break; + } case 'B': // turn skipped - [statsArray addObject:[NSString stringWithFormat:@"%s was scared and skipped turn %@ times", &buffer[index], arg]]; + { + NSString *hogName = [NSString stringWithUTF8String:&buffer[index]]; + [statsArray addObject:[NSString stringWithFormat:NSLocalizedString(@"%@ was scared and skipped turn %@ times", nil), hogName, arg]]; break; + } default: DLog(@"Unhandled stat message, see statsPage.cpp"); break; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/FortsViewController.m --- a/project_files/HedgewarsMobile/Classes/FortsViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/FortsViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -38,11 +38,13 @@ NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:FORTS_DIRECTORY() error:NULL]; NSMutableArray *filteredContents = [[NSMutableArray alloc] initWithCapacity:([directoryContents count] / IMGNUM_PER_FORT)]; - // we need to remove the double entries and the L.png suffix - for (NSUInteger i = 0; i < [directoryContents count]; i++) { - if (i % IMGNUM_PER_FORT == IMGNUM_PER_FORT-1) { - NSString *currentName = [directoryContents objectAtIndex:i]; - NSString *correctName = [currentName substringToIndex:([currentName length] - 5)]; + // we assume here that fort's images has one image with the 'L.png' suffix and we remove this suffix to get the correct name + for (NSUInteger i = 0; i < [directoryContents count]; i++) + { + NSString *currentName = [directoryContents objectAtIndex:i]; + if ([currentName rangeOfString:@"L.png"].location != NSNotFound) + { + NSString *correctName = [currentName stringByReplacingOccurrencesOfString:@"L.png" withString:@""]; [filteredContents addObject:correctName]; } } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,438 +1,105 @@ - - - - 1792 - 14E46 - 7706 - 1348.17 - 758.70 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 7703 - - - IBProxyObject - IBUIBarButtonItem - IBUISegmentedControl - IBUIToolbar - IBUIView - IBUIViewController - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 266 - - - - 292 - {{105, 8}, {270, 30}} - - NO - 12345 - IBCocoaTouchFramework - 2 - 4 - 0 - - Map - Teams - Details - Help - - - - - - - - - - - - - - - {0, 0} - {0, 0} - {0, 0} - {0, 0} - - - - - - - - - 1 - MC42IDAuNiAwLjYAA - - - - {{0, 276}, {480, 44}} - - - NO - NO - IBCocoaTouchFramework - 1 - - - Back - IBCocoaTouchFramework - 1 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - - - - - IBCocoaTouchFramework - - 5 - - - 1 - Start - IBCocoaTouchFramework - 68 - 2 - - - - - - - 274 - {480, 276} - - - - 3 - MQA - - 2 - - - YES - IBCocoaTouchFramework - - - - 274 - {480, 276} - - - - 3 - MQA - - - YES - IBCocoaTouchFramework - - - {480, 320} - - - 3 - MQA - - NO - - 3 - 3 - - - IBUISimulatedFreeformSizeMetricsSentinel - Freeform - - IBCocoaTouchFramework - - - MapConfigViewController-iPhone - - - 3 - 3 - - - IBUIScreenMetrics - IBCocoaTouchFramework - iPhone 4-inch - - YES - - - - - - {320, 568} - {568, 320} - - - 2 - - IBCocoaTouchFramework - YES - - - - 1 - - - - IBCocoaTouchFramework - YES - - - - - - IBCocoaTouchFramework - YES - - - - - - - view - - - - 3 - - - - mapConfigViewController - - - - 33 - - - - teamConfigViewController - - - - 34 - - - - schemeWeaponConfigViewController - - - - 35 - - - - buttonPressed: - - - - 17 - - - - buttonPressed: - - - - 23 - - - - segmentPressed: - - - 13 - - 29 - - - - view - - - - 42 - - - - view - - - - 43 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - - - - 15 - - - - - - - - - - - - 16 - - - - - 18 - - - - - 19 - - - - - 21 - - - - - - - - 20 - - - - - 22 - - - - - 30 - - - - - 31 - - - - - 32 - - - - - 40 - - - TeamConfigViewController View - - - 41 - - - SchemeWeaponConfigViewController View - - - - - GameConfigViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - MapConfigViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - TeamConfigViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - SchemeWeaponConfigViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 45 - - - 0 - IBCocoaTouchFramework - NO - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GameConfigViewController.h --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -36,7 +36,8 @@ HelpPageLobbyViewController *helpPage; } -@property (retain) UIView *imgContainer; +@property (atomic) BOOL isDrawingNiceHogs; +@property (nonatomic,retain) UIView *imgContainer; @property (nonatomic,retain) UILabel * sliderBackground; @property (nonatomic,retain) IBOutlet UIImageView *titleImage; @property (nonatomic,retain) IBOutlet SchemeWeaponConfigViewController *schemeWeaponConfigViewController; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GameConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -24,6 +24,13 @@ #import "GameInterfaceBridge.h" #import "HelpPageLobbyViewController.h" +@interface GameConfigViewController () +@property (nonatomic, retain) IBOutlet UISegmentedControl *tabsSegmentedControl; //iPhone only + +@property (nonatomic, retain) IBOutlet UIBarButtonItem *backButton; //iPhone only +@property (nonatomic, retain) IBOutlet UIBarButtonItem *startButton; //iPhone only +@end + @implementation GameConfigViewController @synthesize imgContainer, titleImage, sliderBackground, helpPage, mapConfigViewController, teamConfigViewController, schemeWeaponConfigViewController; @@ -32,6 +39,8 @@ return rotationManager(interfaceOrientation); } +#pragma mark - Buttons + -(IBAction) buttonPressed:(id) sender { UIButton *theButton = (UIButton *)sender; @@ -55,12 +64,7 @@ if ([self isEverythingSet] == NO) return; theButton.enabled = NO; - for (UIView *oneView in self.imgContainer.subviews) { - if ([oneView isMemberOfClass:[UIImageView class]]) { - UIImageView *anImageView = (UIImageView *)oneView; - [anImageView removeFromSuperview]; - } - } + [self clearImgContainer]; [self startGame:theButton]; break; @@ -81,6 +85,17 @@ } } +#pragma mark - Tabs Segmented Control + +- (void)localizeTabsSegmentedControl +{ + for (NSUInteger i = 0; i < self.tabsSegmentedControl.numberOfSegments; i++) + { + NSString *oldTitle = [self.tabsSegmentedControl titleForSegmentAtIndex:i]; + [self.tabsSegmentedControl setTitle:NSLocalizedString(oldTitle, nil) forSegmentAtIndex:i]; + } +} + -(IBAction) segmentPressed:(id) sender { UISegmentedControl *theSegment = (UISegmentedControl *)sender; @@ -121,6 +136,8 @@ } +#pragma mark - + -(BOOL) isEverythingSet { // don't start playing if the preview is in progress if ([self.mapConfigViewController busy]) { @@ -229,73 +246,95 @@ [gameDictionary release]; } --(void) loadNiceHogs { - @autoreleasepool { +-(void) loadNiceHogs +{ + @autoreleasepool + { - srand(time(NULL)); - NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Hedgehog/Idle.png",GRAPHICS_DIRECTORY()]; - UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:filePath]; - [filePath release]; + NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Hedgehog/Idle.png",GRAPHICS_DIRECTORY()]; + UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:filePath]; + [filePath release]; - NSArray *hatArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:HATS_DIRECTORY() error:NULL]; - NSUInteger numberOfHats = [hatArray count]; - int animationFrames = IS_VERY_POWERFUL([HWUtils modelType]) ? 18 : 1; - - if (self.imgContainer != nil) - [self.imgContainer removeFromSuperview]; - - self.imgContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 40)]; - NSInteger numberOfHogs = 1 + random() % 20; - DLog(@"Drawing %ld nice hedgehogs", (long)numberOfHogs); - for (int i = 0; i < numberOfHogs; i++) { - NSString *hat = [hatArray objectAtIndex:random()%numberOfHats]; + NSArray *hatArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:HATS_DIRECTORY() error:NULL]; + NSUInteger numberOfHats = [hatArray count]; + int animationFrames = IS_VERY_POWERFUL([HWUtils modelType]) ? 16 : 1; + + self.imgContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 40)]; + NSInteger numberOfHogs = 1 + arc4random_uniform(15); + DLog(@"Drawing %ld nice hedgehogs", (long)numberOfHogs); + for (int i = 0; i < numberOfHogs; i++) { + NSString *hat = [hatArray objectAtIndex:arc4random_uniform((int)numberOfHats)]; - NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; - UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile:hatFile]; - NSMutableArray *animation = [[NSMutableArray alloc] initWithCapacity:animationFrames]; - for (int j = 0; j < animationFrames; j++) { - int x = ((j*32)/(int)hatSprite.size.height)*32; - int y = (j*32)%(int)hatSprite.size.height; - UIImage *hatSpriteFrame = [hatSprite cutAt:CGRectMake(x, y, 32, 32)]; - UIImage *hogSpriteFrame = [hogSprite cutAt:CGRectMake(x, y, 32, 32)]; - UIImage *hogWithHat = [hogSpriteFrame mergeWith:hatSpriteFrame atPoint:CGPointMake(0, 5)]; - [animation addObject:hogWithHat]; - } - [hatSprite release]; - [hatFile release]; + NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; + UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile:hatFile]; + NSMutableArray *animation = [[NSMutableArray alloc] initWithCapacity:animationFrames]; + for (int j = 0; j < animationFrames; j++) { + int x = ((j*32)/(int)hatSprite.size.height)*32; + int y = (j*32)%(int)hatSprite.size.height; + UIImage *hatSpriteFrame = [hatSprite cutAt:CGRectMake(x, y, 32, 32)]; + UIImage *hogSpriteFrame = [hogSprite cutAt:CGRectMake(x, y, 32, 32)]; + UIImage *hogWithHat = [hogSpriteFrame mergeWith:hatSpriteFrame atPoint:CGPointMake(0, 5)]; + [animation addObject:hogWithHat]; + } + [hatSprite release]; + [hatFile release]; + + UIImageView *hog = [[UIImageView alloc] initWithImage:[animation objectAtIndex:0]]; + hog.animationImages = animation; + hog.animationDuration = 3; + [animation release]; - UIImageView *hog = [[UIImageView alloc] initWithImage:[animation objectAtIndex:0]]; - hog.animationImages = animation; - hog.animationDuration = 3; - [animation release]; - - int x = 20*i+random()%128; - if (x > 320 - 32) - x = i*random()%32; - hog.frame = CGRectMake(x, 25, hog.frame.size.width, hog.frame.size.height); - [self.imgContainer addSubview:hog]; - [hog startAnimating]; - [hog release]; - } - - // don't place the nice hogs if there is no space for them - if ((self.interfaceOrientation == UIInterfaceOrientationPortrait || - self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) - self.imgContainer.alpha = 0; - - [self.view addSubview:self.imgContainer]; - [hogSprite release]; + int x = 20*i+arc4random_uniform(128); + while (x > 320 - 32) + x = i*arc4random_uniform(32); + + hog.frame = CGRectMake(x, 25, hog.frame.size.width, hog.frame.size.height); + [self.imgContainer addSubview:hog]; + [hog startAnimating]; + [hog release]; + } + [hogSprite release]; + dispatch_async(dispatch_get_main_queue(), ^{ + + [self.view addSubview:self.imgContainer]; + + // don't place the nice hogs if there is no space for them + if ((self.interfaceOrientation == UIInterfaceOrientationPortrait || + self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) + self.imgContainer.alpha = 0; + + self.isDrawingNiceHogs = NO; + }); } } --(void) viewDidLoad { +- (void)clearImgContainer +{ + for (UIView *oneView in [self.imgContainer subviews]) + { + if ([oneView isMemberOfClass:[UIImageView class]]) + { + UIImageView *anImageView = (UIImageView *)oneView; + [anImageView removeFromSuperview]; + } + } + + [self.imgContainer removeFromSuperview]; + self.imgContainer = nil; +} + +-(void) viewDidLoad +{ + [super viewDidLoad]; + self.view.backgroundColor = [UIColor blackColor]; CGRect screenRect = [[UIScreen mainScreen] safeBounds]; self.view.frame = screenRect; - if (IS_IPAD()) { + if (IS_IPAD()) + { // the label for the filter slider UILabel *backLabel = [[UILabel alloc] initWithFrame:CGRectMake(116, 714, 310, 40) andTitle:nil @@ -314,13 +353,19 @@ [self.view addSubview:maxLabel]; self.mapConfigViewController.maxLabel = maxLabel; [maxLabel release]; - } else { + } + else + { + [self localizeTabsSegmentedControl]; + + [self.backButton setTitle:NSLocalizedString(@"Back", nil)]; + [self.startButton setTitle:NSLocalizedString(@"Start", nil)]; + self.mapConfigViewController.view.frame = CGRectMake(0, 0, screenRect.size.width, screenRect.size.height-44); } + [self.view addSubview:self.mapConfigViewController.view]; [self.view bringSubviewToFront:self.mapConfigViewController.slider]; - - [super viewDidLoad]; } -(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval) duration { @@ -329,8 +374,6 @@ [self updateiPadUIForInterfaceOrientation:toInterfaceOrientation]; - [self.schemeWeaponConfigViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation - duration:duration]; if (self.helpPage) { self.helpPage.view.frame = self.view.frame; @@ -361,9 +404,15 @@ } } --(void) viewWillAppear:(BOOL)animated { -// if (IS_IPAD()) -// [NSThread detachNewThreadSelector:@selector(loadNiceHogs) toTarget:self withObject:nil]; +-(void) viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + if (IS_IPAD() && !self.imgContainer && !self.isDrawingNiceHogs) + { + self.isDrawingNiceHogs = YES; + [NSThread detachNewThreadSelector:@selector(loadNiceHogs) toTarget:self withObject:nil]; + } if (IS_IPAD()) { @@ -371,38 +420,23 @@ UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; [self updateiPadUIForInterfaceOrientation:currentOrientation]; } - - [self.mapConfigViewController viewWillAppear:animated]; - [self.teamConfigViewController viewWillAppear:animated]; - [self.schemeWeaponConfigViewController viewWillAppear:animated]; - // add other controllers here and below - - [super viewWillAppear:animated]; -} - --(void) viewDidAppear:(BOOL)animated { - [self.mapConfigViewController viewDidAppear:animated]; - [self.teamConfigViewController viewDidAppear:animated]; - [self.schemeWeaponConfigViewController viewDidAppear:animated]; - [super viewDidAppear:animated]; } --(void) viewWillDisappear:(BOOL)animated { - [self.mapConfigViewController viewWillDisappear:animated]; - [self.teamConfigViewController viewWillDisappear:animated]; - [self.schemeWeaponConfigViewController viewWillDisappear:animated]; - [super viewWillDisappear:animated]; +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + if (IS_IPAD()) + { + // need to call this again in order to fix layout on iOS 9 when going back from rotated stats page + UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; + [self updateiPadUIForInterfaceOrientation:currentOrientation]; + } } --(void) viewDidDisappear:(BOOL)animated { - [self.mapConfigViewController viewDidDisappear:animated]; - [self.teamConfigViewController viewDidDisappear:animated]; - [self.schemeWeaponConfigViewController viewDidDisappear:animated]; - [super viewDidDisappear:animated]; -} - --(void) didReceiveMemoryWarning { - self.imgContainer = nil; +-(void) didReceiveMemoryWarning +{ + [self clearImgContainer]; if (self.titleImage.superview == nil) self.titleImage = nil; @@ -434,6 +468,9 @@ } -(void) dealloc { + releaseAndNil(_tabsSegmentedControl); + releaseAndNil(_backButton); + releaseAndNil(_startButton); releaseAndNil(imgContainer); releaseAndNil(titleImage); releaseAndNil(sliderBackground); diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m --- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Mon Nov 09 16:34:03 2015 +0000 @@ -99,7 +99,9 @@ CGFloat width, height; CGFloat screenScale = [[UIScreen mainScreen] safeScale]; NSString *ipcString = [[NSString alloc] initWithFormat:@"%d",self.port]; - NSString *localeString = [[NSString alloc] initWithFormat:@"%@.txt",[[NSLocale preferredLanguages] objectAtIndex:0]]; + + NSString *localeString = [[NSString alloc] initWithFormat:@"%@.txt", [HWUtils languageID]]; + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; CGRect screenBounds = [[UIScreen mainScreen] safeBounds]; @@ -248,8 +250,6 @@ } +(void) startSimpleGame { - srand(time(0)); - // generate a seed CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault); NSString *seed = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid); @@ -259,7 +259,7 @@ // pick a random static map NSArray *listOfMaps = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:MAPS_DIRECTORY() error:NULL]; - NSString *mapName = [listOfMaps objectAtIndex:random()%[listOfMaps count]]; + NSString *mapName = [listOfMaps objectAtIndex:arc4random_uniform((int)[listOfMaps count])]; NSString *fileCfg = [[NSString alloc] initWithFormat:@"%@/%@/map.cfg",MAPS_DIRECTORY(),mapName]; NSString *contents = [[NSString alloc] initWithContentsOfFile:fileCfg encoding:NSUTF8StringEncoding error:NULL]; [fileCfg release]; @@ -272,8 +272,8 @@ NSArray *colorArray = [HWUtils teamColors]; NSInteger firstColorIndex, secondColorIndex; do { - firstColorIndex = random()%[colorArray count]; - secondColorIndex = random()%[colorArray count]; + firstColorIndex = arc4random_uniform((int)[colorArray count]); + secondColorIndex = arc4random_uniform((int)[colorArray count]); } while (firstColorIndex == secondColorIndex); unsigned int firstColor = [[colorArray objectAtIndex:firstColorIndex] intValue]; unsigned int secondColor = [[colorArray objectAtIndex:secondColorIndex] intValue]; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GameLogViewController.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/GameLogViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,23 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#import + +@interface GameLogViewController : UIViewController + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GameLogViewController.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/GameLogViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,144 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#import "GameLogViewController.h" + +#ifdef DEBUG +#import +#endif + +@interface GameLogViewController () +#ifdef DEBUG + +#endif + +@end + +@implementation GameLogViewController + +#pragma mark - View life cycle + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = @"Last game log"; + + UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(dismissAction)]; + self.navigationItem.rightBarButtonItem = closeButton; + [closeButton release]; + +#ifdef DEBUG + if ([self allowSendLogByEmail]) + { + UIBarButtonItem *sendButton = [[UIBarButtonItem alloc] initWithTitle:@"Send" style:UIBarButtonItemStylePlain target:self action:@selector(sendLogByEmailAction)]; + self.navigationItem.leftBarButtonItem = sendButton; + [sendButton release]; + } +#endif + + NSString *debugStr = nil; + if ([[NSFileManager defaultManager] fileExistsAtPath:DEBUG_FILE()]) + debugStr = [[NSString alloc] initWithContentsOfFile:DEBUG_FILE() encoding:NSUTF8StringEncoding error:nil]; + else + debugStr = [[NSString alloc] initWithString:@"Here be log"]; + + UITextView *logView = [[UITextView alloc] initWithFrame:self.view.frame]; + [logView setAutoresizingMask:(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth)]; + logView.text = debugStr; + [debugStr release]; + logView.editable = NO; + + [self.view addSubview:logView]; + [logView release]; +} + +#pragma mark - Parameters + +#ifdef DEBUG +- (BOOL)allowSendLogByEmail +{ + return ([MFMailComposeViewController canSendMail] && [[NSFileManager defaultManager] fileExistsAtPath:DEBUG_FILE()]); +} +#endif + +#pragma mark - Actions + +#ifdef DEBUG +- (void)sendLogByEmailAction +{ + MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; + picker.mailComposeDelegate = self; + [picker setSubject:@"Log file of iHedgewars game"]; + + // Attach a log file to the email + NSData *logData = [NSData dataWithContentsOfFile:DEBUG_FILE()]; + [picker addAttachmentData:logData mimeType:@"text/plain" fileName:@"game0.log"]; + + // Fill out the email body text + NSString *emailBody = @"Add here description of a problem/log"; + [picker setMessageBody:emailBody isHTML:NO]; + + [self presentViewController:picker animated:YES completion:nil]; + [picker release]; +} +#endif + +- (void)dismissAction +{ + [self dismissViewControllerAnimated:YES completion:nil]; +} + +#pragma mark - MailCompose delegate + +#ifdef DEBUG +- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error +{ + // Notifies users about errors associated with the interface + switch (result) + { + case MFMailComposeResultCancelled: + NSLog(@"MailComposeResult: canceled"); + break; + case MFMailComposeResultSaved: + NSLog(@"MailComposeResult: saved"); + break; + case MFMailComposeResultSent: + NSLog(@"MailComposeResult: sent"); + break; + case MFMailComposeResultFailed: + NSLog(@"MailComposeResult: failed"); + break; + default: + NSLog(@"MailComposeResult: not sent"); + break; + } + + [self dismissViewControllerAnimated:YES completion:nil]; +} +#endif + +#pragma mark - Memory warning + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h --- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -18,9 +18,9 @@ #import - +#import "TableViewControllerWithDoneButton.h" -@interface GeneralSettingsViewController : UITableViewController { +@interface GeneralSettingsViewController : TableViewControllerWithDoneButton { } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -30,7 +30,7 @@ #pragma mark - #pragma mark View Lifecycle -(void) viewDidLoad { - self.navigationItem.title = @"Edit game options"; + self.navigationItem.title = NSLocalizedString(@"Edit game options", nil); [super viewDidLoad]; } @@ -179,7 +179,7 @@ switchContent = (UISwitch *)cell.accessoryView; if (row == 0) { - cell.textLabel.text = NSLocalizedString(@"Sound Effects", @"from the settings table"); + cell.textLabel.text = NSLocalizedString(@"Sound", @"from the settings table"); switchContent.on = [[settings objectForKey:@"sound"] boolValue]; switchContent.tag = 10; } else { diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HWUtils.h --- a/project_files/HedgewarsMobile/Classes/HWUtils.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HWUtils.h Mon Nov 09 16:34:03 2015 +0000 @@ -41,6 +41,7 @@ +(NSInteger) randomPort; +(void) freePort:(NSInteger) port; +(BOOL) isNetworkReachable; ++(NSString *) languageID; //+(UIView *)mainSDLViewInstance; @end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HWUtils.m --- a/project_files/HedgewarsMobile/Classes/HWUtils.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HWUtils.m Mon Nov 09 16:34:03 2015 +0000 @@ -103,14 +103,13 @@ +(NSInteger) randomPort { // set a new feed only at initialization time and forbid connecting to the server port if (activePorts == nil) { - srandom(time(NULL)); activePorts = [[NSMutableArray arrayWithObject:[NSNumber numberWithInt:NETGAME_DEFAULT_PORT]] retain]; } // pick a random number from the free ports list NSInteger res = 0; do { - res = (random() % 64511) + 1024; + res = (arc4random_uniform(64511)) + 1024; } while ([activePorts containsObject:[NSNumber numberWithInteger:res]]); // add this number to the forbdding list @@ -156,6 +155,12 @@ return ((isReachable && !needsConnection) || nonWiFi) ? testResult : NO; } ++ (NSString *)languageID +{ + NSString *language = [[NSLocale preferredLanguages] firstObject]; + return [[language componentsSeparatedByString:@"-"] firstObject]; +} + /* +(UIView *)mainSDLViewInstance { SDL_Window *window = HW_getSDLWindow(); diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m --- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Mon Nov 09 16:34:03 2015 +0000 @@ -19,7 +19,7 @@ #import "HedgewarsAppDelegate.h" #import "MainMenuViewController.h" - +#import "Appirater.h" @implementation SDLUIKitDelegate (customDelegate) @@ -50,7 +50,16 @@ } // override the direct execution of SDL_main to allow us to implement our own frontend --(void) postFinishLaunch { +-(void) postFinishLaunch +{ + // Setup Appirater + [Appirater setAppId:@"391234866"]; + [Appirater setDaysUntilPrompt:3]; + [Appirater setUsesUntilPrompt:5]; + [Appirater setSignificantEventsUntilPrompt:-1]; + [Appirater setTimeBeforeReminding:1]; + //[Appirater setDebug:YES]; + [self performSelector:@selector(hideLaunchScreen) withObject:nil afterDelay:0.0]; [[UIApplication sharedApplication] setStatusBarHidden:YES]; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib --- a/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,1126 +1,320 @@ - - - - 1792 - 14E46 - 7706 - 1348.17 - 758.70 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 7703 - - - IBProxyObject - IBUIImageView - IBUILabel - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 256 - - - - 292 - - - - 274 - {{0, 1}, {278, 50}} - - - NO - NO - IBIPadFramework - - NSImage - helpleft.png - - - - - 274 - {{22, -2}, {248, 54}} - - - NO - YES - 7 - NO - IBIPadFramework - Did you know you can customize almost everything in the settings page? - - 1 - MCAwIDAAA - darkTextColor - - - 1 - 10 - 0 - - Helvetica-Oblique - Helvetica - 1 - 14 - - - Helvetica-Oblique - 14 - 16 - - YES - 248 - - - {{10, 8}, {278, 52}} - - - - 3 - MCAwAA - - IBIPadFramework - - - - 297 - - - - 274 - {240, 102} - - - NO - NO - IBIPadFramework - - NSImage - helpabove.png - - - - - 292 - {{12, 19}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Map theme - - - 1 - 10 - - Helvetica-Bold - Helvetica - 2 - 18 - - - Helvetica-Bold - 18 - 16 - - YES - - - - 274 - {{11, 36}, {218, 66}} - - - NO - YES - 7 - NO - IBIPadFramework - Here you can choose how your map will appear in game. - - - 1 - 10 - 0 - - Helvetica - Helvetica - 0 - 16 - - - Helvetica - 16 - 16 - - YES - 218 - - - {{742, 360}, {240, 102}} - - - - IBIPadFramework - - - - 289 - - - - 274 - {240, 146} - - - NO - NO - IBIPadFramework - - - - - 292 - {{11, 22}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Map type - - - 1 - 10 - - - YES - - - - 274 - {{11, 41}, {218, 99}} - - - NO - YES - 7 - NO - IBIPadFramework - Choose between a static map or a randomly generated one (might require more time). In a mission you need to perfom some action to win. - - - 1 - 10 - 0 - - - YES - 218 - - - {{653, 202}, {240, 146}} - - - - IBIPadFramework - - - - 289 - - - - 274 - {240, 101} - - - NO - NO - IBIPadFramework - - NSImage - helpright.png - - - - - 292 - {{9, 7}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Map preview - - - 1 - 10 - - - YES - - - - 274 - {{8, 25}, {218, 65}} - - - NO - YES - 7 - NO - IBIPadFramework - This is a small preview of your next map. Tap to select / generate a new map. - - - 1 - 10 - 0 - - - YES - 218 - - - {{494, 20}, {240, 101}} - - - - IBIPadFramework - - - - 269 - - - - 274 - {242, 171} - - - NO - NO - IBIPadFramework - - - - - 292 - {{8, 25}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Teams - - - 1 - 10 - - - YES - - - - 274 - {{10, 45}, {232, 120}} - - - NO - YES - 7 - NO - IBIPadFramework - Select which teams are playing! Add hogs by tapping on them and set their color to figure friend and foe teams out. AI teams will appear with a small robot badge next their name. - - - 1 - 10 - 0 - - - YES - 232 - - - {{358, 389}, {242, 171}} - - - - IBIPadFramework - - - - 292 - - - - 274 - {240, 104} - - - NO - NO - IBIPadFramework - - - - - 292 - {{23, 8}, {204, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Schemes and Weapons - - - 1 - 10 - - - YES - - - - 274 - {{23, 27}, {210, 71}} - - - NO - YES - 7 - NO - IBIPadFramework - Here you can choose which rules and which weapon set will be applied in game. - - - 1 - 10 - 0 - - - YES - 210 - - - {{142, 160}, {240, 104}} - - - - IBIPadFramework - - - - 268 - - - - 274 - {240, 117} - - - NO - NO - IBIPadFramework - - NSImage - helpbottom.png - - - - - 292 - {{10, 8}, {138, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Max hedgehogs - - - 1 - 10 - - - YES - - - - 274 - {{11, 26}, {218, 73}} - - - NO - YES - 7 - NO - IBIPadFramework - This number is the maximum size for all the hogs playing (in every team). - - - 1 - 10 - 0 - - - YES - 218 - - - {{35, 590}, {240, 117}} - - - - IBIPadFramework - - - - 265 - - - - 274 - {240, 109} - - - NO - NO - IBIPadFramework - - - - - 292 - {{8, 6}, {138, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Size slider - - - 1 - 10 - - - YES - - - - 292 - {{11, 22}, {218, 73}} - - - NO - YES - 7 - NO - IBIPadFramework - For Random and Maze maps you can decide to generate only maps of a certain size. - - - 1 - 10 - 0 - - - YES - 218 - - - {{695, 598}, {240, 109}} - - - - IBIPadFramework - - - - 292 - - - - 274 - {240, 128} - - - NO - NO - IBIPadFramework - - NSImage - helpplain.png - - - - - 288 - {{6, 8}, {229, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Tap anywhere to dismiss - - - 1 - 10 - 1 - - - YES - - - - 274 - {{8, 32}, {224, 87}} - - - NO - YES - 7 - NO - IBIPadFramework - Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you. - - - 1 - 10 - 0 - - - YES - 224 - - - {{45, 360}, {240, 128}} - - - - IBIPadFramework - - - - 269 - - - - 274 - {240, 61} - - - NO - NO - IBIPadFramework - - - - - 292 - {{8, 3}, {138, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Start button - - - 1 - 10 - - - YES - - - - 274 - {{11, 14}, {218, 46}} - - - NO - YES - 7 - NO - IBIPadFramework - This button starts the game. - - - 1 - 10 - 0 - - - YES - 218 - - - {{344, 646}, {240, 61}} - - - - IBIPadFramework - - - {1024, 768} - - - 3 - MCAwLjQAA - - NO - NO - - 3 - 3 - - - IBUIScreenMetrics - IBIPadFramework - iPad Full Screen - - YES - - - - - - {768, 1024} - {1024, 768} - - - 1 - - IBIPadFramework - - - - - - - view - - - - 3 - - - - dismiss - - - 7 - - 16 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - - - - - - - - - - - 60 - - - - - - - - Teams Bubble - - - 43 - - - - - 44 - - - - - 45 - - - - - 61 - - - - - - - - Tap anywere Bubble - - - 25 - - - - - 26 - - - - - 27 - - - - - 62 - - - - - - - - Start button Bubble - - - 49 - - - - - 50 - - - - - 51 - - - - - 63 - - - - - - - - Size slider Bubble - - - 37 - - - - - 38 - - - - - 39 - - - - - 64 - - - - - - - - Max hogs Bubble - - - 34 - - - - - 35 - - - - - 36 - - - - - 65 - - - - - - - - Map theme Bubble - - - 28 - - - - - 29 - - - - - 30 - - - - - 66 - - - - - - - - Map type Bubble - - - 52 - - - - - 53 - - - - - 54 - - - - - 67 - - - - - - - - Map preview Bubble - - - 6 - - - - - 7 - - - - - 8 - - - - - 68 - - - - - - - - Schemes & Weapons Bubble - - - 40 - - - - - 41 - - - - - 42 - - - - - 69 - - - - - - - Customize Bubble - - - 58 - - - - - 59 - - - - - - - HelpPageLobbyViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIControl - - {581, 369} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 70 - - - 0 - IBIPadFramework - NO - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - {295, 156} - {295, 156} - {308, 144} - {296, 138} - {308, 144} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,614 +1,166 @@ - - - - 1792 - 14E46 - 7706 - 1348.17 - 758.70 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 7703 - - - IBProxyObject - IBUILabel - IBUIScrollView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 274 - - - - 290 - {{20, 587}, {440, 52}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you. - - 1 - MCAwIDAAA - - - 1 - 10 - 0 - 1 - - Helvetica - Helvetica - 0 - 16 - - - Helvetica - 16 - 16 - - YES - 440 - - - - 292 - {{20, 279}, {138, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Size slider - - - 1 - 10 - - Helvetica-Bold - Helvetica - 2 - 18 - - - Helvetica-Bold - 18 - 16 - - YES - - - - 290 - {{20, 298}, {440, 44}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - For Random and Maze maps you can decide to generate only maps of a certain size. - - - 1 - 10 - 0 - - - YES - 440 - - - - 292 - {{20, 511}, {204, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Schemes and Weapons - - - 1 - 10 - - - YES - - - - 290 - {{20, 530}, {433, 45}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Here you can choose which rules and which weapon set will be applied in game. - - - 1 - 10 - 0 - - - YES - 433 - - - - 292 - {{20, 68}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Map preview - - - 1 - 10 - - - YES - - - - 290 - {{20, 88}, {440, 44}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - This is a small preview of your next map. Tap to select / generate a new map. - - - 1 - 10 - 0 - - - YES - 440 - - - - 292 - {{20, 140}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Map type - - - 1 - 10 - - - YES - - - - 290 - {{20, 164}, {440, 58}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Choose between a static map or a randomly generated one (might require more time). In a mission you need to perfom some action to win. - - - 1 - 10 - 0 - - - YES - 440 - - - - 292 - {{20, 229}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Map theme - - - 1 - 10 - - - YES - - - - 290 - {{20, 244}, {440, 33}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Here you can choose how your map will appear in game. - - - 1 - 10 - 0 - - - YES - 440 - - - - 292 - {{20, 347}, {138, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Max hedgehogs - - - 1 - 10 - - - YES - - - - 290 - {{20, 367}, {440, 41}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - This number is the maximum size for all the hogs playing (in every team). - - - 1 - 10 - 0 - - - YES - 440 - - - - 292 - {{20, 418}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Teams - - - 1 - 10 - - - YES - - - - 290 - {{20, 436}, {433, 66}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Select which teams are playing! Add hogs by tapping on them and set their color to figure friend and foe teams out. AI teams will appear with a small robot badge next their name. - - - 1 - 10 - 0 - - - YES - 433 - - - - 290 - {{20, 3}, {440, 60}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Here you can find help for the game configuration options. You can customize almost everything in the settings page. - - - 1 - 10 - 0 - 1 - - Helvetica-Oblique - Helvetica - 1 - 16 - - - Helvetica-Oblique - 16 - 16 - - YES - 440 - - - {480, 276} - - YES - YES - IBCocoaTouchFramework - - - {480, 276} - - 2 - MC45OTYwNzg0OTEyIDAuOTg4MjM1MzU0NCAxAA - - NO - NO - - - 3 - 3 - - - IBUISimulatedFreeformSizeMetricsSentinel - Freeform - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - scrollView - - - - 95 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - - 60 - - - - - - - - - - - - - - - - - - - - - - - 61 - - - - - 62 - - - - - 63 - - - - - 64 - - - - - 65 - - - - - 66 - - - - - 67 - - - - - 68 - - - - - 69 - - - - - 70 - - - - - 71 - - - - - 72 - - - - - 73 - - - - - 74 - - - - - 75 - - - - - 76 - - - - - - - HelpPageLobbyViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {505, 338} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 95 - - - 0 - IBCocoaTouchFramework - NO - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HogHatViewController.h --- a/project_files/HedgewarsMobile/Classes/HogHatViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -26,13 +26,11 @@ NSArray *hatArray; UIImage *normalHogSprite; - NSIndexPath *lastIndexPath; } @property (nonatomic,retain) NSDictionary *teamDictionary; @property (nonatomic) NSInteger selectedHog; @property (nonatomic,retain) NSArray *hatArray; @property (nonatomic,retain) UIImage *normalHogSprite; -@property (nonatomic,retain) NSIndexPath *lastIndexPath; @end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HogHatViewController.m --- a/project_files/HedgewarsMobile/Classes/HogHatViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -21,7 +21,7 @@ @implementation HogHatViewController -@synthesize teamDictionary, hatArray, normalHogSprite, lastIndexPath, selectedHog; +@synthesize teamDictionary, hatArray, normalHogSprite, selectedHog; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { @@ -77,8 +77,7 @@ if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; - NSDictionary *hog = [[self.teamDictionary objectForKey:@"hedgehogs"] objectAtIndex:selectedHog]; - NSString *hat = [hatArray objectAtIndex:[indexPath row]]; + NSString *hat = [self.hatArray objectAtIndex:[indexPath row]]; cell.textLabel.text = [hat stringByDeletingPathExtension]; NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; @@ -87,9 +86,9 @@ cell.imageView.image = [self.normalHogSprite mergeWith:hatSprite atPoint:CGPointMake(0, 5)]; [hatSprite release]; - if ([hat isEqualToString:[hog objectForKey:@"hat"]]) { + NSDictionary *hog = (self.selectedHog != -1) ? [[self.teamDictionary objectForKey:@"hedgehogs"] objectAtIndex:self.selectedHog] : nil; + if ([[hat stringByDeletingPathExtension] isEqualToString:[hog objectForKey:@"hat"]]) { cell.accessoryType = UITableViewCellAccessoryCheckmark; - self.lastIndexPath = indexPath; } else { cell.accessoryType = UITableViewCellAccessoryNone; } @@ -100,45 +99,53 @@ #pragma mark - #pragma mark Table view delegate --(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - NSInteger newRow = [indexPath row]; - NSInteger oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1; - - if (newRow != oldRow) { - // if the two selected rows differ update data on the hog dictionary and reload table content - // TODO: maybe this section could be cleaned up - NSDictionary *oldHog = [[teamDictionary objectForKey:@"hedgehogs"] objectAtIndex:selectedHog]; +-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSInteger selectedRow = [indexPath row]; + NSString *newHat = [[self.hatArray objectAtIndex:selectedRow] stringByDeletingPathExtension]; + + // update data on the hogs dictionary + if (self.selectedHog != -1) + { + // update only selected hog with new hat + [self updateTeamDictionaryWithNewHat:newHat forStartHogIndex:self.selectedHog toEndHogIndex:self.selectedHog]; + } + else + { + // update all hogs with new hat + NSInteger startIndex = 0; + NSInteger endIndex = [[self.teamDictionary objectForKey:@"hedgehogs"] count] - 1; + [self updateTeamDictionaryWithNewHat:newHat forStartHogIndex:startIndex toEndHogIndex:endIndex]; + } - NSMutableDictionary *newHog = [[NSMutableDictionary alloc] initWithDictionary: oldHog]; - [newHog setObject:[[hatArray objectAtIndex:newRow] stringByDeletingPathExtension] forKey:@"hat"]; - [[teamDictionary objectForKey:@"hedgehogs"] replaceObjectAtIndex:selectedHog withObject:newHog]; - [newHog release]; - - // tell our boss to write this new stuff on disk - [[NSNotificationCenter defaultCenter] postNotificationName:@"setWriteNeedTeams" object:nil]; - - UITableViewCell *newCell = [aTableView cellForRowAtIndexPath:indexPath]; - newCell.accessoryType = UITableViewCellAccessoryCheckmark; - UITableViewCell *oldCell = [aTableView cellForRowAtIndexPath:lastIndexPath]; - oldCell.accessoryType = UITableViewCellAccessoryNone; - self.lastIndexPath = indexPath; - [aTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; - } - [aTableView deselectRowAtIndexPath:indexPath animated:YES]; + // tell our boss to write this new stuff on disk + [[NSNotificationCenter defaultCenter] postNotificationName:@"setWriteNeedTeams" object:nil]; + [self.navigationController popViewControllerAnimated:YES]; } +- (void)updateTeamDictionaryWithNewHat:(NSString *)newHat forStartHogIndex:(NSInteger)startIndex toEndHogIndex:(NSInteger)endIndex +{ + NSMutableArray *hogsArray = [self.teamDictionary objectForKey:@"hedgehogs"]; + + for (NSInteger i=startIndex; i <= endIndex; i++) + { + NSDictionary *oldHog = [hogsArray objectAtIndex:i]; + NSMutableDictionary *newHog = [[NSMutableDictionary alloc] initWithDictionary:oldHog]; + [newHog setObject:newHat forKey:@"hat"]; + [hogsArray replaceObjectAtIndex:i withObject:newHog]; + [newHog release]; + } +} #pragma mark - #pragma mark Memory management -(void) didReceiveMemoryWarning { - self.lastIndexPath = nil; MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } -(void) viewDidUnload { - self.lastIndexPath = nil; self.normalHogSprite = nil; self.teamDictionary = nil; self.hatArray = nil; @@ -150,7 +157,6 @@ releaseAndNil(hatArray); releaseAndNil(teamDictionary); releaseAndNil(normalHogSprite); - releaseAndNil(lastIndexPath); [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/HoldTableViewCell.m --- a/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Mon Nov 09 16:34:03 2015 +0000 @@ -18,7 +18,7 @@ #import "HoldTableViewCell.h" - +#import "UITableViewCell+FindTable.h" @implementation HoldTableViewCell @synthesize delegate; @@ -66,22 +66,6 @@ } } -- (UITableView *)findTable -{ - UIView *tableView = self.superview; - while (![tableView isKindOfClass:[UITableView class]] || (tableView == nil)) - { - tableView = tableView.superview; - - if ([tableView isEqual:self.window]) - { - tableView = nil; - } - } - - return (UITableView *)tableView; -} - -(void) dealloc { self.delegate = nil; [super dealloc]; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/LabelWithIBLocalization.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/LabelWithIBLocalization.h Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,23 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + +@interface LabelWithIBLocalization : UILabel + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/LabelWithIBLocalization.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/LabelWithIBLocalization.m Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,41 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "LabelWithIBLocalization.h" + +@interface LabelWithIBLocalization () +@property (nonatomic) BOOL isAlreadyLocalized; +@end + +@implementation LabelWithIBLocalization + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + if (!self.isAlreadyLocalized) + { + // Text which set in Interface Builder used here as a key for localization + self.text = NSLocalizedString(self.text, nil); + + [self setNeedsLayout]; + self.isAlreadyLocalized = YES; + } +} + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/LevelViewController.m --- a/project_files/HedgewarsMobile/Classes/LevelViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/LevelViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -31,7 +31,6 @@ #pragma mark View lifecycle -(void) viewDidLoad { [super viewDidLoad]; - srandom(time(NULL)); NSArray *array = [[NSArray alloc] initWithObjects: NSLocalizedString(@"Brutal",@""), @@ -59,10 +58,6 @@ [self.tableView setContentOffset:CGPointMake(0,0) animated:NO]; } --(void) viewWillDisappear:(BOOL)animated { - // stuff like checking that at least 1 field was selected -} - #pragma mark - #pragma mark Table view data source -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { @@ -133,7 +128,7 @@ if (theSwitch.on) { numberOfSections = 2; [self.tableView insertSections:sections withRowAnimation:UITableViewRowAnimationFade]; - level = 1 + (random() % ([levelArray count] - 1)); + level = 1 + arc4random_uniform((int)[levelArray count] - 1); } else { numberOfSections = 1; [self.tableView deleteSections:sections withRowAnimation:UITableViewRowAnimationFade]; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m --- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m Mon Nov 09 16:34:03 2015 +0000 @@ -34,8 +34,6 @@ - (void)dealloc { self.cornerBackgroundColor = nil; - - [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m --- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m Mon Nov 09 16:34:03 2015 +0000 @@ -31,8 +31,6 @@ - (void)dealloc { self.splitViewController = nil; - - [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m --- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -152,8 +152,6 @@ _delegate = nil; _viewControllers = nil; [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; - - [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib --- a/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,446 +1,135 @@ - - - - 1792 - 14E46 - 7706 - 1348.17 - 758.70 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 7703 - - - IBProxyObject - IBUIButton - IBUIImageView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 294 - - - - 274 - {1024, 768} - - - NO - IBIPadFramework - - NSImage - background.png - - - - - 301 - {{383, 389}, {271, 244}} - - - NO - IBIPadFramework - 0 - 0 - 215 - 0.0 - 0.0 - 0.0 - - 2 - MC45OTYwNzg0OTEyIDAuODAwMDAwMDcxNSAwLjAzOTIxNTY4NzY2AA - - - 3 - MQA - - - 3 - MC41AA - - - NSImage - localplayButton.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 289 - {{986, 19}, {18, 19}} - - - NO - YES - 0.31690141558647156 - 3 - IBIPadFramework - 0 - 0 - 3 - YES - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - - 265 - {{940, 686}, {64, 64}} - - NO - 2 - IBIPadFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - settingsButton.png - - - - - - - 268 - {{20, 686}, {64, 64}} - - - NO - 4 - IBIPadFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - savesButton.png - - - - - - - 301 - {{242, 43}, {540, 300}} - - - NO - IBIPadFramework - - NSImage - title.png - - - - - 269 - {{565, 686}, {89, 37}} - - - NO - 5 - IBIPadFramework - 0 - 0 - 1 - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - Missions - - - - - - - 269 - {{383, 686}, {89, 37}} - - - NO - 6 - IBIPadFramework - 0 - 0 - 1 - - - Simple - - - - - - {1024, 768} - - - 1 - MCAwIDAAA - darkTextColor - - - 3 - 3 - - - IBUIScreenMetrics - IBIPadFramework - iPad Full Screen - - YES - - - - - - {768, 1024} - {1024, 768} - - - 1 - - IBIPadFramework - - - - - - - view - - - - 3 - - - - simpleGameButton - - - - 95 - - - - missionsButton - - - - 96 - - - - switchViews: - - - 7 - - 48 - - - - switchViews: - - - 7 - - 47 - - - - switchViews: - - - 7 - - 54 - - - - switchViews: - - - 7 - - 89 - - - - switchViews: - - - 7 - - 92 - - - - switchViews: - - - 7 - - 94 - - - - - - 0 - - - - - - 1 - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 39 - - - local - - - 45 - - - - - 52 - - - - - 37 - - - - - 88 - - - - - 90 - - - - - 91 - - - - - 93 - - - - - - - MainMenuViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 96 - - - 0 - IBIPadFramework - NO - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - {1024, 768} - {263, 244} - {64, 64} - {64, 64} - {540, 300} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,581 +1,137 @@ - - - - 1792 - 14E46 - 7706 - 1348.17 - 758.70 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 7703 - - - IBProxyObject - IBUIButton - IBUIImageView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 293 - - - - 274 - {480, 320} - - - - - 3 - MCAwAA - - 2 - NO - IBCocoaTouchFramework - - NSImage - background.png - - - - - 293 - {{105, 20}, {270, 150}} - - - - NO - NO - 4 - NO - IBCocoaTouchFramework - - NSImage - title.png - - - - - 289 - {{376, 14}, {89, 31}} - - - - NO - 5 - IBCocoaTouchFramework - 0 - 0 - 1 - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - 3 - MQA - - Missions - - 3 - MC41AA - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 269 - {{190, 200}, {100, 100}} - - - - - 1 - MCAwIDAgMAA - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - NSImage - localplayButton.png - - - - - - - 265 - {{396, 236}, {64, 64}} - - - NO - NO - 2 - IBCocoaTouchFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - NSImage - settingsButton.png - - - - - - - 268 - {{20, 236}, {64, 64}} - - - - NO - NO - 4 - IBCocoaTouchFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - NSImage - savesButton.png - - - - - - - 292 - {{20, 19}, {18, 19}} - - - - NO - 0.5 - 3 - IBCocoaTouchFramework - 0 - 0 - 3 - YES - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - - 289 - {{376, 57}, {89, 31}} - - - - NO - 6 - IBCocoaTouchFramework - 0 - 0 - 1 - - - Simple - - - - - - {480, 320} - - - - - 1 - MCAwIDAAA - darkTextColor - - - 3 - 3 - - - IBUISimulatedFreeformSizeMetricsSentinel - Freeform - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - missionsButton - - - - 54 - - - - simpleGameButton - - - - 56 - - - - switchViews: - - - 7 - - 40 - - - - switchViews: - - - 7 - - 30 - - - - switchViews: - - - 7 - - 42 - - - - switchViews: - - - 7 - - 44 - - - - switchViews: - - - 7 - - 55 - - - - switchViews: - - - 7 - - 53 - - - - - - 0 - - - - - - 1 - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 23 - - - - - 22 - - - - - 41 - - - - - 43 - - - - - 24 - - - - - 28 - - - - - 51 - - - - - 52 - - - - - - - MainMenuViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - {567, 470} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 56 - - - - - MainMenuViewController - UIViewController - - switchViews: - id - - - switchViews: - - switchViews: - id - - - - IBProjectSource - ../Classes/MainMenuViewController.h - - - - MainMenuViewController - - switchViews: - id - - - switchViews: - - switchViews: - id - - - - UIButton - UIButton - - - - missionsButton - UIButton - - - simpleGameButton - UIButton - - - - IBProjectSource - ../Classes/MainMenuViewController.m - - - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIGestureRecognizer - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIGestureRecognizer.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UIResponder - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - NO - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - {480, 320} - {100, 100} - {64, 64} - {64, 64} - {270, 150} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MainMenuViewController.h --- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -19,29 +19,7 @@ #import - -@class GameConfigViewController; -@class SettingsContainerViewController; -@class AboutViewController; -@class SavedGamesViewController; -@class RestoreViewController; -@class MissionTrainingViewController; - -@interface MainMenuViewController : UIViewController { - GameConfigViewController *gameConfigViewController; - SettingsContainerViewController *settingsViewController; - AboutViewController *aboutViewController; - SavedGamesViewController *savedGamesViewController; - RestoreViewController *restoreViewController; - MissionTrainingViewController *missionsViewController; -} - -@property (nonatomic,retain) GameConfigViewController *gameConfigViewController; -@property (nonatomic,retain) SettingsContainerViewController *settingsViewController; -@property (nonatomic,retain) AboutViewController *aboutViewController; -@property (nonatomic,retain) SavedGamesViewController *savedGamesViewController; -@property (nonatomic,retain) RestoreViewController *restoreViewController; -@property (nonatomic,retain) MissionTrainingViewController *missionsViewController; +@interface MainMenuViewController : UIViewController -(IBAction) switchViews:(id)sender; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MainMenuViewController.m --- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -20,7 +20,8 @@ #import "MainMenuViewController.h" #import #import "GameConfigViewController.h" -#import "SettingsContainerViewController.h" +#import "MGSplitViewController.h" +#import "SettingsBaseViewController.h" #import "AboutViewController.h" #import "SavedGamesViewController.h" #import "RestoreViewController.h" @@ -29,14 +30,23 @@ #import "ServerProtocolNetwork.h" #import "GameInterfaceBridge.h" +#import "SettingsBaseViewController.h" +#import "GeneralSettingsViewController.h" +#import "TeamSettingsViewController.h" +#import "WeaponSettingsViewController.h" +#import "SchemeSettingsViewController.h" +#import "SupportViewController.h" + +#ifdef DEBUG +#import "GameLogViewController.h" +#endif + @interface MainMenuViewController () @property (retain, nonatomic) IBOutlet UIButton *simpleGameButton; @property (retain, nonatomic) IBOutlet UIButton *missionsButton; @end @implementation MainMenuViewController -@synthesize gameConfigViewController, settingsViewController, aboutViewController, savedGamesViewController, - restoreViewController, missionsViewController; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { return rotationManager(interfaceOrientation); @@ -47,6 +57,9 @@ self.view.frame = [[UIScreen mainScreen] safeBounds]; [super viewDidLoad]; + [self.simpleGameButton setTitle:NSLocalizedString(@"Simple", nil) forState:UIControlStateNormal]; + [self.missionsButton setTitle:NSLocalizedString(@"Missions", nil) forState:UIControlStateNormal]; + [self.simpleGameButton applyDarkBlueQuickStyle]; [self.missionsButton applyDarkBlueQuickStyle]; @@ -69,19 +82,19 @@ // prompt for restoring any previous game NSString *saveString = [userDefaults objectForKey:@"savedGamePath"]; - if (saveString != nil && [saveString isEqualToString:@""] == NO && [[userDefaults objectForKey:@"saveIsValid"] boolValue]) { - if (self.restoreViewController == nil) { - NSString *xibName = [@"RestoreViewController-" stringByAppendingString:(IS_IPAD() ? @"iPad" : @"iPhone")]; - RestoreViewController *restored = [[RestoreViewController alloc] initWithNibName:xibName bundle:nil]; - if ([restored respondsToSelector:@selector(setModalPresentationStyle:)]) - restored.modalPresentationStyle = UIModalPresentationFormSheet; - self.restoreViewController = restored; - [restored release]; - } - [self performSelector:@selector(presentViewController:) withObject:self.restoreViewController afterDelay:0.25]; - } else { + if (saveString != nil && [saveString isEqualToString:@""] == NO && [[userDefaults objectForKey:@"saveIsValid"] boolValue]) + { + NSString *xibName = [@"RestoreViewController-" stringByAppendingString:(IS_IPAD() ? @"iPad" : @"iPhone")]; + RestoreViewController *restored = [[RestoreViewController alloc] initWithNibName:xibName bundle:nil]; + if ([restored respondsToSelector:@selector(setModalPresentationStyle:)]) + restored.modalPresentationStyle = UIModalPresentationFormSheet; + + [self performSelector:@selector(presentViewController:) withObject:restored afterDelay:0.25]; + } + else + { // let's not prompt for rating when app crashed >_> - [Appirater appLaunched]; + [Appirater appLaunched:YES]; } /* @@ -92,6 +105,7 @@ - (void) presentViewController:(UIViewController *)vc { [self presentViewController:vc animated:NO completion:nil]; + [vc release]; } -(void) viewWillAppear:(BOOL)animated { @@ -104,99 +118,134 @@ UIButton *button = (UIButton *)sender; UIAlertView *alert; NSString *xib = nil; - NSString *debugStr = nil; [[AudioManagerController mainManager] playClickSound]; switch (button.tag) { case 0: - if (nil == self.gameConfigViewController) { - xib = IS_IPAD() ? @"GameConfigViewController-iPad" : @"GameConfigViewController-iPhone"; + xib = IS_IPAD() ? @"GameConfigViewController-iPad" : @"GameConfigViewController-iPhone"; - GameConfigViewController *gcvc = [[GameConfigViewController alloc] initWithNibName:xib bundle:nil]; - gcvc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; - self.gameConfigViewController = gcvc; - [gcvc release]; - } - [self presentViewController:self.gameConfigViewController animated:YES completion:nil]; + GameConfigViewController *gcvc = [[GameConfigViewController alloc] initWithNibName:xib bundle:nil]; + gcvc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; + + [self presentViewController:gcvc animated:YES completion:nil]; + [gcvc release]; break; case 2: - if (nil == self.settingsViewController) { - SettingsContainerViewController *svrc = [[SettingsContainerViewController alloc] initWithNibName:nil bundle:nil]; - svrc.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - self.settingsViewController = svrc; - [svrc release]; + if (IS_IPAD()) + { + // the contents on the right of the splitview, setting targetController to nil to avoid creating the table + SettingsBaseViewController *rightController = [[SettingsBaseViewController alloc] init]; + rightController.targetController = nil; + UINavigationController *rightNavController = [[UINavigationController alloc] initWithRootViewController:rightController]; + [rightController release]; + + // the contens on the left of the splitview, setting targetController that will receive push/pop actions + SettingsBaseViewController *leftController = [[SettingsBaseViewController alloc] init]; + leftController.targetController = rightNavController.topViewController; + UINavigationController *leftNavController = [[UINavigationController alloc] initWithRootViewController:leftController]; + [leftController release]; + + MGSplitViewController *splitViewRootController = [[MGSplitViewController alloc] init]; + splitViewRootController.delegate = nil; + splitViewRootController.showsMasterInPortrait = YES; + splitViewRootController.viewControllers = [NSArray arrayWithObjects:leftNavController, rightNavController, nil]; + [leftNavController release]; + [rightNavController release]; + + [self presentViewController:splitViewRootController animated:YES completion:nil]; + [splitViewRootController release]; } - [self presentViewController:self.settingsViewController animated:YES completion:nil]; + else + { + NSMutableArray *tabBarNavigationControllers = [[NSMutableArray alloc] initWithCapacity:5]; + + UIViewController *generalSettingsViewController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + generalSettingsViewController.tabBarItem = [self tabBarItemWithTitle:NSLocalizedString(@"General",@"") imageName:@"flower" selectedImageName:@"flower_filled"]; + UINavigationController *generalNavController = [[UINavigationController alloc] initWithRootViewController:generalSettingsViewController]; + [generalSettingsViewController release]; + [tabBarNavigationControllers addObject:generalNavController]; + [generalNavController release]; + + UIViewController *teamSettingsViewController = [[TeamSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + teamSettingsViewController.tabBarItem = [self tabBarItemWithTitle:NSLocalizedString(@"Teams",@"") imageName:@"teams" selectedImageName:@"teams_filled"]; + UINavigationController *teamNavController = [[UINavigationController alloc] initWithRootViewController:teamSettingsViewController]; + [teamSettingsViewController release]; + [tabBarNavigationControllers addObject:teamNavController]; + [teamNavController release]; + + UIViewController *weaponSettingsViewController = [[WeaponSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + weaponSettingsViewController.tabBarItem = [self tabBarItemWithTitle:NSLocalizedString(@"Weapons",@"") imageName:@"bullet" selectedImageName:@"bullet_filled"]; + UINavigationController *weaponNavController = [[UINavigationController alloc] initWithRootViewController:weaponSettingsViewController]; + [weaponSettingsViewController release]; + [tabBarNavigationControllers addObject:weaponNavController]; + [weaponNavController release]; + + UIViewController *schemeSettingsViewController = [[SchemeSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + schemeSettingsViewController.tabBarItem = [self tabBarItemWithTitle:NSLocalizedString(@"Schemes",@"") imageName:@"target" selectedImageName:@"target_filled"]; + UINavigationController *schemeNavController = [[UINavigationController alloc] initWithRootViewController:schemeSettingsViewController]; + [schemeSettingsViewController release]; + [tabBarNavigationControllers addObject:schemeNavController]; + [schemeNavController release]; + + UIViewController *supportViewController = [[SupportViewController alloc] initWithStyle:UITableViewStyleGrouped]; + supportViewController.tabBarItem = [self tabBarItemWithTitle:NSLocalizedString(@"Support",@"") imageName:@"heart" selectedImageName:@"heart_filled"]; + UINavigationController *supportNavController = [[UINavigationController alloc] initWithRootViewController:supportViewController]; + [supportViewController release]; + [tabBarNavigationControllers addObject:supportNavController]; + [supportNavController release]; + + UITabBarController *settingsTabController = [[UITabBarController alloc] init]; + settingsTabController.viewControllers = tabBarNavigationControllers; + [tabBarNavigationControllers release]; + + [self presentViewController:settingsTabController animated:YES completion:nil]; + [settingsTabController release]; + } break; case 3: #ifdef DEBUG - if ([[NSFileManager defaultManager] fileExistsAtPath:DEBUG_FILE()]) - debugStr = [[NSString alloc] initWithContentsOfFile:DEBUG_FILE()]; - else - debugStr = [[NSString alloc] initWithString:@"Here be log"]; - UITextView *scroll = [[UITextView alloc] initWithFrame:self.view.frame]; - scroll.text = debugStr; - [debugStr release]; - scroll.editable = NO; - scroll.alpha = 0; - - UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; - [btn addTarget:scroll action:@selector(removeFromSuperview) forControlEvents:UIControlEventTouchUpInside]; - [btn addTarget:btn action:@selector(removeFromSuperview) forControlEvents:UIControlEventTouchUpInside]; - btn.frame = CGRectMake(self.view.frame.size.width-58, -6, 64, 64); - btn.backgroundColor = [UIColor blackColor]; - btn.titleLabel.textColor = [UIColor whiteColor]; - btn.titleLabel.textAlignment = UITextAlignmentCenter; - btn.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]]; - [btn setTitle:@"Close" forState:UIControlStateNormal]; - btn.alpha = 0; - [btn.layer setCornerRadius:10.0f]; - [btn.layer setMasksToBounds:YES]; - - [self.view addSubview:scroll]; - [self.view addSubview:btn]; - - [UIView beginAnimations:@"fadein" context:NULL]; - [UIView setAnimationDuration:0.25f]; - btn.alpha = 1; - scroll.alpha = 1; - [UIView commitAnimations]; - [scroll release]; + { + GameLogViewController *gameLogVC = [[GameLogViewController alloc] init]; + UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:gameLogVC]; + [gameLogVC release]; + + [self presentViewController:navController animated:YES completion:nil]; + [navController release]; + } #else - debugStr = debugStr; // prevent compiler warning - if (nil == self.aboutViewController) { + { AboutViewController *about = [[AboutViewController alloc] initWithNibName:@"AboutViewController" bundle:nil]; about.modalTransitionStyle = UIModalTransitionStyleCoverVertical; if ([about respondsToSelector:@selector(setModalPresentationStyle:)]) about.modalPresentationStyle = UIModalPresentationFormSheet; - self.aboutViewController = about; + + [self presentViewController:about animated:YES completion:nil]; [about release]; } - [self presentViewController:self.aboutViewController animated:YES completion:nil]; #endif break; case 4: - if (nil == self.savedGamesViewController) { + { SavedGamesViewController *savedgames = [[SavedGamesViewController alloc] initWithNibName:@"SavedGamesViewController" bundle:nil]; savedgames.modalTransitionStyle = UIModalTransitionStyleCoverVertical; if ([savedgames respondsToSelector:@selector(setModalPresentationStyle:)]) savedgames.modalPresentationStyle = UIModalPresentationPageSheet; - self.savedGamesViewController = savedgames; + + [self presentViewController:savedgames animated:YES completion:nil]; [savedgames release]; } - [self presentViewController:self.savedGamesViewController animated:YES completion:nil]; break; case 5: - if (nil == self.missionsViewController) { + { xib = IS_IPAD() ? @"MissionTrainingViewController-iPad" : @"MissionTrainingViewController-iPhone"; MissionTrainingViewController *missions = [[MissionTrainingViewController alloc] initWithNibName:xib bundle:nil]; missions.modalTransitionStyle = IS_IPAD() ? UIModalTransitionStyleCoverVertical : UIModalTransitionStyleCrossDissolve; if ([missions respondsToSelector:@selector(setModalPresentationStyle:)]) missions.modalPresentationStyle = UIModalPresentationPageSheet; - self.missionsViewController = missions; + + [self presentViewController:missions animated:YES completion:nil]; [missions release]; } - [self presentViewController:self.missionsViewController animated:YES completion:nil]; break; case 6: [GameInterfaceBridge registerCallingController:self]; @@ -214,42 +263,27 @@ } } +- (UITabBarItem *)tabBarItemWithTitle: (NSString *)title + imageName: (NSString *)imageName + selectedImageName: (NSString *)selectedImageName +{ + return [[[UITabBarItem alloc] initWithTitle:title + image:[UIImage imageNamed:imageName] + selectedImage:[UIImage imageNamed:selectedImageName]] autorelease]; +} + #pragma mark - -(void) viewDidUnload { - self.gameConfigViewController = nil; - self.settingsViewController = nil; - self.aboutViewController = nil; - self.savedGamesViewController = nil; - self.restoreViewController = nil; - self.missionsViewController = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } -(void) didReceiveMemoryWarning { - if (self.settingsViewController.view.superview == nil) - self.settingsViewController = nil; - if (self.gameConfigViewController.view.superview == nil) - self.gameConfigViewController = nil; - if (self.aboutViewController.view.superview == nil) - self.aboutViewController = nil; - if (self.savedGamesViewController.view.superview == nil) - self.savedGamesViewController = nil; - if (self.restoreViewController.view.superview == nil) - self.restoreViewController = nil; - if (self.missionsViewController.view.superview == nil) - self.missionsViewController = nil; MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } -(void) dealloc { - releaseAndNil(settingsViewController); - releaseAndNil(gameConfigViewController); - releaseAndNil(aboutViewController); - releaseAndNil(savedGamesViewController); - releaseAndNil(restoreViewController); - releaseAndNil(missionsViewController); [_simpleGameButton release]; [_missionsButton release]; [super dealloc]; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MapConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -62,7 +62,7 @@ [seed release]; // perform as if user clicked on an entry - NSIndexPath *theIndex = [NSIndexPath indexPathForRow:(random()%[source count]) inSection:0]; + NSIndexPath *theIndex = [NSIndexPath indexPathForRow:arc4random_uniform((int)[source count]) inSection:0]; [self tableView:self.tableView didSelectRowAtIndexPath:theIndex]; if (IS_NOT_POWERFUL([HWUtils modelType]) == NO) [self.tableView scrollToRowAtIndexPath:theIndex atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; @@ -352,6 +352,15 @@ oldPage = newPage; } +- (void)localizeSegmentedControl +{ + for (NSUInteger i = 0; i < self.segmentedControl.numberOfSegments; i++) + { + NSString *oldTitle = [self.segmentedControl titleForSegmentAtIndex:i]; + [self.segmentedControl setTitle:NSLocalizedString(oldTitle, nil) forSegmentAtIndex:i]; + } +} + #pragma mark - #pragma mark view management -(NSArray *) dataSourceArray { @@ -403,8 +412,9 @@ -(void) viewDidLoad { [super viewDidLoad]; - srandom(time(NULL)); - + + [self localizeSegmentedControl]; + // initialize some "default" values self.slider.value = 0.05f; self.slider.enabled = NO; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m --- a/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Mon Nov 09 16:34:03 2015 +0000 @@ -58,7 +58,7 @@ #pragma mark - #pragma mark preview -(int) sendToEngine:(NSString *)string { - unsigned char length = [string length]; + unsigned char length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; SDLNet_TCP_Send(csd, &length, 1); return SDLNet_TCP_Send(csd, [string UTF8String], length); diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h --- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -20,18 +20,12 @@ #import -@interface MissionTrainingViewController : UIViewController { - NSArray *listOfMissions; - NSArray *listOfDescriptions; - NSString *missionName; - UIImageView *previewImage; - UITableView *tableView; - UILabel *descriptionLabel; -} +@interface MissionTrainingViewController : UIViewController -@property (nonatomic, retain) NSArray *listOfMissions; -@property (nonatomic, retain) NSArray *listOfDescriptions; +@property (nonatomic, retain) NSArray *listOfMissionIDs; +@property (nonatomic, retain) NSDictionary *dictOfMissions; @property (nonatomic, retain) NSString *missionName; + @property (nonatomic, retain) IBOutlet UIImageView *previewImage; @property (nonatomic, retain) IBOutlet UITableView *tableView; @property (nonatomic, retain) IBOutlet UILabel *descriptionLabel; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m --- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -23,7 +23,6 @@ @implementation MissionTrainingViewController -@synthesize listOfMissions, listOfDescriptions, previewImage, tableView, descriptionLabel, missionName; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { return rotationManager(interfaceOrientation); @@ -31,7 +30,10 @@ #pragma mark - #pragma mark View management --(void) viewDidLoad { +-(void) viewDidLoad +{ + [super viewDidLoad]; + self.previewImage.layer.borderColor = [[UIColor darkYellowColor] CGColor]; self.previewImage.layer.borderWidth = 3.8f; self.previewImage.layer.cornerRadius = 14; @@ -50,12 +52,11 @@ self.tableView.separatorColor = [UIColor whiteColor]; self.descriptionLabel.textColor = [UIColor lightYellowColor]; - [super viewDidLoad]; } -(void) viewWillAppear:(BOOL)animated { - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:random()%[self.listOfMissions count] inSection:0]; - [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:arc4random_uniform((int)[self.listOfMissionIDs count]) inSection:0]; + [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; [super viewWillAppear:animated]; } @@ -72,43 +73,129 @@ } } -#pragma mark - -#pragma mark override setters/getters for better memory handling --(NSArray *)listOfMissions { - if (listOfMissions == nil) - self.listOfMissions = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:TRAININGS_DIRECTORY() error:NULL]; - return listOfMissions; +#pragma mark - Missions dictionaries methods + +- (NSDictionary *)newLocalizedMissionsDictionary +{ + NSString *languageID = [HWUtils languageID]; + + NSString *missionsDescLocation = [[NSString alloc] initWithFormat:@"%@/missions_en.txt",LOCALE_DIRECTORY()]; + NSString *localizedMissionsDescLocation = [[NSString alloc] initWithFormat:@"%@/missions_%@.txt", LOCALE_DIRECTORY(), languageID]; + + if (![languageID isEqualToString:@"en"] && [[NSFileManager defaultManager] fileExistsAtPath:localizedMissionsDescLocation]) + { + NSDictionary *missionsDict = [self newMissionsDictionaryFromMissionsFile:missionsDescLocation]; + NSDictionary *localizedMissionsDict = [self newMissionsDictionaryFromMissionsFile:localizedMissionsDescLocation]; + + [missionsDescLocation release]; + [localizedMissionsDescLocation release]; + + NSMutableDictionary *tempMissionsDict = [[NSMutableDictionary alloc] init]; + + for (NSString *key in [missionsDict allKeys]) + { + if ([localizedMissionsDict objectForKey:key]) + { + [tempMissionsDict setObject:[localizedMissionsDict objectForKey:key] forKey:key]; + } + else + { + [tempMissionsDict setObject:[missionsDict objectForKey:key] forKey:key]; + } + } + + [missionsDict release]; + [localizedMissionsDict release]; + + return tempMissionsDict; + } + else + { + NSDictionary *missionsDict = [self newMissionsDictionaryFromMissionsFile:missionsDescLocation]; + + [missionsDescLocation release]; + [localizedMissionsDescLocation release]; + + return missionsDict; + } } --(NSArray *)listOfDescriptions { - if (listOfDescriptions == nil) { - NSString *descLocation = [[NSString alloc] initWithFormat:@"%@/missions_en.txt",LOCALE_DIRECTORY()]; - NSString *descComplete = [[NSString alloc] initWithContentsOfFile:descLocation encoding:NSUTF8StringEncoding error:NULL]; - [descLocation release]; - NSArray *descArray = [descComplete componentsSeparatedByString:@"\n"]; - NSMutableArray *filteredArray = [[NSMutableArray alloc] initWithCapacity:[descArray count]/3]; - [descComplete release]; - // sanity check to avoid having missions and descriptions conflicts - for (NSUInteger i = 0; i < [self.listOfMissions count]; i++) { - NSString *desc = [[self.listOfMissions objectAtIndex:i] stringByDeletingPathExtension]; - for (NSString *str in descArray) +- (NSDictionary *)newMissionsDictionaryFromMissionsFile:(NSString *)filePath +{ + NSMutableDictionary *missionsDict = [[NSMutableDictionary alloc] init]; + + NSString *missionsFileContents = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; + NSArray *missionsLines = [missionsFileContents componentsSeparatedByString:@"\n"]; + [missionsFileContents release]; + + for (NSString *line in missionsLines) + { + if ([line length] > 0) + { + NSUInteger firstDotLocation = [line rangeOfString:@"."].location; + + NSString *missionID = [line substringToIndex:firstDotLocation]; + + NSString *missionFullPath = [NSString stringWithFormat:@"%@%@.lua", TRAININGS_DIRECTORY(), missionID]; + if (![[NSFileManager defaultManager] fileExistsAtPath:missionFullPath]) { - if ([str hasPrefix:desc] && [str hasSuffix:@"\""]) { - NSArray *descriptionText = [str componentsSeparatedByString:@"\""]; - [filteredArray addObject:[descriptionText objectAtIndex:1]]; - break; - } + continue; + } + + NSString *nameOrDesc = [line substringFromIndex:firstDotLocation+1]; + + NSString *missionParsedName = ([nameOrDesc hasPrefix:@"name="]) ? [nameOrDesc stringByReplacingOccurrencesOfString:@"name=" withString:@""] : nil; + NSString *missionParsedDesc = ([nameOrDesc hasPrefix:@"desc="]) ? [nameOrDesc stringByReplacingOccurrencesOfString:@"desc=" withString:@""] : nil; + + if (![missionsDict objectForKey:missionID]) + { + NSMutableDictionary *missionDict = [[NSMutableDictionary alloc] init]; + [missionsDict setObject:missionDict forKey:missionID]; + [missionDict release]; } - if ([filteredArray count] == i) + NSMutableDictionary *missionDict = [missionsDict objectForKey:missionID]; + + if (missionParsedName) { - [filteredArray addObject:@""]; + [missionDict setObject:missionParsedName forKey:@"name"]; } + + if (missionParsedDesc) + { + missionParsedDesc = [missionParsedDesc stringByReplacingOccurrencesOfString:@"\"" withString:@""]; + [missionDict setObject:missionParsedDesc forKey:@"desc"]; + } + + [missionsDict setObject:missionDict forKey:missionID]; } - self.listOfDescriptions = filteredArray; - [filteredArray release]; } - return listOfDescriptions; + + return missionsDict; +} + +#pragma mark - +#pragma mark override setters/getters for better memory handling + +-(NSArray *)listOfMissionIDs +{ + if (!_listOfMissionIDs) + { + NSArray *sortedKeys = [[self.dictOfMissions allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + _listOfMissionIDs = [[NSArray alloc] initWithArray:sortedKeys]; + } + + return _listOfMissionIDs; +} + +- (NSDictionary *)dictOfMissions +{ + if (!_dictOfMissions) + { + _dictOfMissions = [self newLocalizedMissionsDictionary]; + } + + return _dictOfMissions; } #pragma mark - @@ -118,7 +205,7 @@ } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [self.listOfMissions count]; + return [self.listOfMissionIDs count]; } -(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -133,21 +220,28 @@ if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:(IS_IPAD()) ? UITableViewCellStyleDefault : UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; - - cell.textLabel.text = [[[self.listOfMissions objectAtIndex:row] stringByDeletingPathExtension] - stringByReplacingOccurrencesOfString:@"_" withString:@" "]; + + NSString *missionID = [self.listOfMissionIDs objectAtIndex:row]; + cell.textLabel.text = self.dictOfMissions[missionID][@"name"]; + cell.textLabel.textColor = [UIColor lightYellowColor]; //cell.textLabel.font = [UIFont fontWithName:@"Bradley Hand Bold" size:[UIFont labelFontSize]]; cell.textLabel.textAlignment = (IS_IPAD()) ? UITextAlignmentCenter : UITextAlignmentLeft; cell.textLabel.backgroundColor = [UIColor clearColor]; cell.textLabel.adjustsFontSizeToFitWidth = YES; - cell.detailTextLabel.text = (IS_IPAD()) ? nil : [self.listOfDescriptions objectAtIndex:row]; + cell.detailTextLabel.text = (IS_IPAD()) ? nil : self.dictOfMissions[missionID][@"desc"]; cell.detailTextLabel.textColor = [UIColor whiteColor]; cell.detailTextLabel.backgroundColor = [UIColor clearColor]; cell.detailTextLabel.adjustsFontSizeToFitWidth = YES; cell.detailTextLabel.numberOfLines = ([cell.detailTextLabel.text length] % 40); cell.detailTextLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters; + UIView *bgColorView = [[UIView alloc] init]; + bgColorView.backgroundColor = [UIColor colorWithRed:(85.0/255.0) green:(15.0/255.0) blue:(106.0/255.0) alpha:1.0]; + bgColorView.layer.masksToBounds = YES; + cell.selectedBackgroundView = bgColorView; + [bgColorView release]; + cell.backgroundColor = [UIColor blackColorTransparent]; return cell; } @@ -157,7 +251,7 @@ -(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger row = [indexPath row]; - self.missionName = [[self.listOfMissions objectAtIndex:row] stringByDeletingPathExtension]; + self.missionName = [self.listOfMissionIDs objectAtIndex:row]; NSString *size = IS_IPAD() ? @"@2x" : @""; NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Missions/Training/%@%@.png",GRAPHICS_DIRECTORY(),self.missionName,size]; UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath]; @@ -165,24 +259,27 @@ [self.previewImage setImage:img]; [img release]; - self.descriptionLabel.text = [self.listOfDescriptions objectAtIndex:row]; + self.descriptionLabel.text = self.dictOfMissions[self.missionName][@"desc"]; } #pragma mark - #pragma mark Memory management --(void) didReceiveMemoryWarning { + +-(void) didReceiveMemoryWarning +{ self.previewImage = nil; self.missionName = nil; - self.listOfMissions = nil; - self.listOfDescriptions = nil; + self.listOfMissionIDs = nil; + self.dictOfMissions = nil; // if you nil this one it won't get updated anymore //self.previewImage = nil; [super didReceiveMemoryWarning]; } --(void) viewDidUnload { - self.listOfMissions = nil; - self.listOfDescriptions = nil; +-(void) viewDidUnload +{ + self.listOfMissionIDs = nil; + self.dictOfMissions = nil; self.previewImage = nil; self.tableView = nil; self.descriptionLabel = nil; @@ -192,13 +289,14 @@ } --(void) dealloc { - releaseAndNil(listOfMissions); - releaseAndNil(listOfDescriptions); - releaseAndNil(previewImage); - releaseAndNil(tableView); - releaseAndNil(descriptionLabel); - releaseAndNil(missionName); +-(void) dealloc +{ + releaseAndNil(_listOfMissionIDs); + releaseAndNil(_dictOfMissions); + releaseAndNil(_previewImage); + releaseAndNil(_tableView); + releaseAndNil(_descriptionLabel); + releaseAndNil(_missionName); [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib --- a/project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,654 +1,92 @@ - - - - 1056 - 10K549 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 319 - {540, 640} - - NO - IBIPadFramework - - NSImage - smallerBackground~ipad.png - - - - - 302 - {{84, 517}, {151, 37}} - - NO - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - 1 - Dismiss - - 3 - MQA - - - 1 - MCAwIDAuNTAxOTYwODE0AA - - - 3 - MC41AA - - - - - 299 - {{308, 517}, {151, 37}} - - NO - 1 - IBIPadFramework - 0 - 0 - - 1 - Restore - - - - - - - 295 - {{216, 35}, {108, 29}} - - NO - YES - 7 - NO - IBIPadFramework - Hmm... - - Helvetica-Bold - 24 - 16 - - - 2 - MSAwLjc4MDM5MjIyOTYgMAA - - - 1 - 10 - 1 - - - - 282 - {{80, 375}, {380, 96}} - - NO - YES - 7 - NO - IBIPadFramework - Would you like to restore it? - - Helvetica - 18 - 16 - - - 1 - MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA - - - 1 - 10 - 4 - 1 - - - - 306 - {{80, 87}, {380, 96}} - - NO - YES - 7 - NO - IBIPadFramework - It appears you didn't complete your last game! - - - 1 - MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA - - - 1 - 10 - 4 - 1 - - - - 301 - {{150, 191}, {240, 160}} - - NO - IBIPadFramework - - NSImage - denied.png - - - - {540, 640} - - - 4 - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - buttonReleased: - - - 7 - - 21 - - - - buttonReleased: - - - 7 - - 22 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 15 - - - - - 16 - - - - - 18 - - - - - 19 - - - - - 20 - - - - - 23 - - - - - 24 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 18.IBPluginDependency - 18.IBViewBoundsToFrameTransform - 19.IBPluginDependency - 19.IBViewBoundsToFrameTransform - 20.IBPluginDependency - 20.IBViewBoundsToFrameTransform - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 24.IBPluginDependency - 24.IBViewBoundsToFrameTransform - - - YES - RestoreViewController - UIResponder - {{650, 289}, {540, 640}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDlIAAw2gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEAkAAw2gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDXAAAw3UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKgAABDmYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDFgAAw8cAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCoAAAw9uAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - YES - - - YES - - - - - YES - - - YES - - - - 24 - - - - YES - - RestoreViewController - UIViewController - - buttonReleased: - id - - - buttonReleased: - - buttonReleased: - id - - - - IBProjectSource - Classes/RestoreViewController.h - - - - UILabel - - IBProjectSource - Classes/ExtraCategories.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - denied.png - smallerBackground~ipad.png - - - YES - {240, 160} - {540, 640} - - - 132 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,620 +1,93 @@ - - - - 1056 - 10K549 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 319 - {480, 320} - - NO - IBCocoaTouchFramework - - NSImage - smallerBackground~iphone.png - - - - - 300 - {{20, 20}, {240, 160}} - - NO - IBCocoaTouchFramework - - NSImage - denied.png - - - - - 315 - {{310, 32}, {108, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Hmm... - - Helvetica-Bold - 24 - 16 - - - 2 - MSAwLjgyNzQ1MTA1MDMgMAA - - - 3 - MQA - - 1 - 10 - 1 - - - - 307 - {{268, 74}, {192, 96}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - It appears you didn't complete your last game! Would you like to restore it? - - Helvetica - 18 - 16 - - - 1 - MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA - - - 1 - 10 - 4 - 1 - - - - 302 - {{53, 229}, {151, 37}} - - NO - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - 1 - Dismiss - - - 1 - MCAwIDAuNTAxOTYwODE0AA - - - 3 - MC41AA - - - - - 299 - {{277, 229}, {151, 37}} - - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - 1 - Restore - - - - - - {480, 320} - - - 4 - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - buttonReleased: - - - 7 - - 11 - - - - buttonReleased: - - - 7 - - 12 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 10 - - - - - 15 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 8.IBPluginDependency - 8.IBViewBoundsToFrameTransform - - - YES - RestoreViewController - UIResponder - {{206, 423}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUOKgABDZQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGgAABBoAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUObAABCAAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUOGAABClAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJUAABDZQAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 15 - - - - YES - - RestoreViewController - UIViewController - - buttonReleased: - id - - - buttonReleased: - - buttonReleased: - id - - - - IBProjectSource - Classes/RestoreViewController.h - - - - UILabel - - IBProjectSource - Classes/ExtraCategories.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - denied.png - smallerBackground~iphone.png - - - YES - {240, 160} - {480, 320} - - - 132 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/RestoreViewController.m --- a/project_files/HedgewarsMobile/Classes/RestoreViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/RestoreViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -20,6 +20,11 @@ #import "RestoreViewController.h" #import "GameInterfaceBridge.h" +@interface RestoreViewController () +@property (retain, nonatomic) IBOutlet UIButton *restoreButton; +@property (retain, nonatomic) IBOutlet UIButton *dismissButton; +@end + @implementation RestoreViewController -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @@ -33,7 +38,14 @@ if (theButton.tag != 0) { [[AudioManagerController mainManager] playClickSound]; [GameInterfaceBridge registerCallingController:self.presentingViewController]; - [GameInterfaceBridge startSaveGame:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedGamePath"]]; + + // Since iOS 8, the file system layout of app containers has changed. + // So, we must rely now on saved game filename, not full path. + NSString *oldSavedGamePath = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedGamePath"]; + NSString *savedGameFile = [oldSavedGamePath lastPathComponent]; + NSString *newSavedGamePath = [NSString stringWithFormat:@"%@%@", SAVES_DIRECTORY(), savedGameFile]; + + [GameInterfaceBridge startSaveGame:newSavedGamePath]; } else { [[AudioManagerController mainManager] playBackSound]; [defaults setObject:@"" forKey:@"savedGamePath"]; @@ -44,6 +56,12 @@ -(void) viewDidLoad { [super viewDidLoad]; + + [self.restoreButton setTitle:NSLocalizedString(@"Restore", nil) forState:UIControlStateNormal]; + [self.dismissButton setTitle:NSLocalizedString(@"Dismiss", nil) forState:UIControlStateNormal]; + + [self.restoreButton applyDarkBlueQuickStyle]; + [self.dismissButton applyDarkBlueQuickStyle]; } -(void) didReceiveMemoryWarning { @@ -55,6 +73,8 @@ } -(void) dealloc { + [_restoreButton release]; + [_dismissButton release]; [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SavedGamesViewController.h --- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -24,12 +24,10 @@ EditableCellViewDelegate, UIActionSheetDelegate> { UITableView *tableView; NSMutableArray *listOfSavegames; - NSInteger numberOfItems; } @property (nonatomic,retain) IBOutlet UITableView *tableView; @property (nonatomic,retain) NSMutableArray *listOfSavegames; -@property (assign) NSInteger numberOfItems; -(IBAction) buttonPressed:(id) sender; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SavedGamesViewController.m --- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -20,9 +20,12 @@ #import "SavedGamesViewController.h" #import "GameInterfaceBridge.h" +@interface SavedGamesViewController () +@property (retain, nonatomic) IBOutlet UIBarButtonItem *clearAllButton; +@end @implementation SavedGamesViewController -@synthesize tableView, listOfSavegames, numberOfItems; +@synthesize tableView, listOfSavegames; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { return rotationManager(interfaceOrientation); @@ -33,12 +36,14 @@ NSMutableArray *array = [[NSMutableArray alloc] initWithArray:contentsOfDir copyItems:YES]; self.listOfSavegames = array; [array release]; - self.numberOfItems = [self.listOfSavegames count]; [self.tableView reloadData]; } --(void) viewDidLoad { +-(void) viewDidLoad +{ + [super viewDidLoad]; + [self.tableView setBackgroundColorForAnyTable:[UIColor clearColor]]; NSString *imgName = (IS_IPAD()) ? @"mediumBackground~ipad.png" : @"smallerBackground~iphone.png"; @@ -49,10 +54,11 @@ background.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view insertSubview:background atIndex:0]; [background release]; - + + [self.clearAllButton setTitle:NSLocalizedString(@"Clear All", nil)]; + if (self.listOfSavegames == nil) [self updateTable]; - [super viewDidLoad]; } -(void) viewWillAppear:(BOOL)animated { @@ -96,13 +102,12 @@ [[NSFileManager defaultManager] createDirectoryAtPath:SAVES_DIRECTORY() withIntermediateDirectories:NO attributes:nil error:NULL]; // update the table and the cached list - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:self.numberOfItems]; - for (int i = 0; i < self.numberOfItems; i++) + NSMutableArray *array = [[NSMutableArray alloc] init]; + for (int i = 0; i < [self.listOfSavegames count]; i++) [array addObject:[NSIndexPath indexPathForRow:i inSection:0]]; - self.numberOfItems = 0; + [self.listOfSavegames removeAllObjects]; + [self.tableView deleteRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationTop]; - [self.listOfSavegames removeAllObjects]; - [array release]; } } @@ -114,20 +119,19 @@ } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return self.numberOfItems; + return [self.listOfSavegames count]; } -(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; - if (self.listOfSavegames == nil) - [self updateTable]; EditableCellView *editableCell = (EditableCellView *)[aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (editableCell == nil) { editableCell = [[[EditableCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; - editableCell.delegate = self; + editableCell.delegate = nil; + editableCell.textField.userInteractionEnabled = NO; } - editableCell.respectEditing = YES; + editableCell.tag = [indexPath row]; editableCell.textField.text = [[self.listOfSavegames objectAtIndex:[indexPath row]] stringByDeletingPathExtension]; editableCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; @@ -158,13 +162,29 @@ -(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { [(EditableCellView *)[self.tableView cellForRowAtIndexPath:indexPath] save:nil]; - self.numberOfItems--; - [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft]; + [self fixTagsForStartTag:[indexPath row]]; NSString *saveName = [self.listOfSavegames objectAtIndex:[indexPath row]]; NSString *filePath = [NSString stringWithFormat:@"%@/%@",SAVES_DIRECTORY(),saveName]; [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil]; [self.listOfSavegames removeObject:saveName]; + + [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft]; +} + +#pragma mark - Fix cells' tags + +- (void)fixTagsForStartTag:(NSInteger)tag +{ + for (UITableViewCell *cell in self.tableView.visibleCells) + { + NSInteger oldTag = cell.tag; + + if (oldTag > tag) + { + cell.tag--; + } + } } #pragma mark - @@ -187,7 +207,6 @@ [[NSFileManager defaultManager] copyItemAtPath:currentFilePath toPath:newFilePath error:nil]; [newFilePath release]; - self.numberOfItems++; [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; [GameInterfaceBridge registerCallingController:self]; @@ -229,6 +248,7 @@ -(void) dealloc { releaseAndNil(tableView); releaseAndNil(listOfSavegames); + releaseAndNil(_clearAllButton); [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib --- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib Mon Nov 09 16:34:03 2015 +0000 @@ -1,553 +1,56 @@ - - - - 1056 - 10K549 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 292 - - YES - - - 290 - {768, 44} - - NO - 458912 - IBIPadFramework - - YES - - IBIPadFramework - 1 - - 0 - - - IBIPadFramework - - 5 - - - 1 - Clear All - IBIPadFramework - 1 - - - - - - - 274 - {{0, 44}, {768, 724}} - - - 3 - MCAwAA - - YES - IBIPadFramework - YES - 1 - 2 - 0 - YES - 44 - 10 - 10 - - - {768, 768} - - - 3 - MQA - - NO - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - buttonPressed: - - - - 6 - - - - dataSource - - - - 8 - - - - delegate - - - - 9 - - - - tableView - - - - 10 - - - - buttonPressed: - - - - 17 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - 4 - - - YES - - - - - - - - 5 - - - - - 7 - - - - - 13 - - - - - 15 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 13.IBPluginDependency - 15.IBPluginDependency - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 4.IBPluginDependency - 5.IBPluginDependency - 7.IBPluginDependency - - - YES - SavedGamesViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{467, 276}, {768, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 17 - - - - YES - - SavedGamesViewController - UIViewController - - buttonPressed: - id - - - buttonPressed: - - buttonPressed: - id - - - - tableView - UITableView - - - tableView - - tableView - UITableView - - - - IBProjectSource - Classes/SavedGamesViewController.h - - - - UITableView - - IBProjectSource - Classes/ExtraCategories.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - 132 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h --- a/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -18,13 +18,10 @@ #import - - -@class SingleSchemeViewController; +#import "TableViewControllerWithDoneButton.h" -@interface SchemeSettingsViewController : UITableViewController { +@interface SchemeSettingsViewController : TableViewControllerWithDoneButton { NSMutableArray *listOfSchemes; - SingleSchemeViewController *childController; } @property (nonatomic, retain) NSMutableArray *listOfSchemes; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -40,7 +40,7 @@ self.navigationItem.rightBarButtonItem = editButton; [editButton release]; - self.navigationItem.title = @"List of schemes"; + self.navigationItem.title = NSLocalizedString(@"List of schemes", nil); } -(void) viewWillAppear:(BOOL) animated { @@ -131,43 +131,43 @@ #pragma mark - #pragma mark Table view delegate --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (childController == nil) { - childController = [[SingleSchemeViewController alloc] initWithStyle:UITableViewStyleGrouped]; - } - +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + SingleSchemeViewController *singleSchemeViewController = [[SingleSchemeViewController alloc] initWithStyle:UITableViewStyleGrouped]; + NSInteger row = [indexPath row]; NSString *selectedSchemeFile = [self.listOfSchemes objectAtIndex:row]; // this must be set so childController can load the correct plist - childController.schemeName = [selectedSchemeFile stringByDeletingPathExtension]; - [childController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; + singleSchemeViewController.schemeName = [selectedSchemeFile stringByDeletingPathExtension]; + [singleSchemeViewController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; - [self.navigationController pushViewController:childController animated:YES]; + [self.navigationController pushViewController:singleSchemeViewController animated:YES]; + [singleSchemeViewController release]; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; } #pragma mark - #pragma mark Memory management --(void)didReceiveMemoryWarning { +-(void)didReceiveMemoryWarning +{ [super didReceiveMemoryWarning]; - if (childController.view.superview == nil ) - childController = nil; MSG_MEMCLEAN(); } --(void) viewDidUnload { +-(void) viewDidUnload +{ self.listOfSchemes = nil; - childController = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } --(void) dealloc { +-(void) dealloc +{ releaseAndNil(listOfSchemes); - releaseAndNil(childController); [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -20,6 +20,7 @@ #import "SchemeWeaponConfigViewController.h" #import +#define DISABLED_GAME_STYLES @[@"Frenzy.lua", @"Gravity.lua", @"HedgeEditor.lua", @"Continental_supplies.lua", @"Space_Invasion.lua", @"Tumbler.lua"] #define LABEL_TAG 57423 #define TABLE_TAG 45657 @@ -48,7 +49,7 @@ -(NSString *)selectedScript { if (selectedScript == nil) - self.selectedScript = @"Normal.plist"; + self.selectedScript = @""; return selectedScript; } @@ -73,7 +74,7 @@ -(NSArray *)listOfScripts { if (listOfScripts == nil) self.listOfScripts = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:SCRIPTS_DIRECTORY() error:NULL] - filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF ENDSWITH '.lua'"]]; + filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF ENDSWITH '.lua' AND NOT (SELF IN %@)", DISABLED_GAME_STYLES]]; return listOfScripts; } @@ -166,7 +167,7 @@ else if (self.topControl.selectedSegmentIndex == 1) return [self.listOfWeapons count]; else - return [self.listOfScripts count]; + return [self.listOfScripts count] + 1; // +1 for fake 'Normal' } // Customize the appearance of table view cells. @@ -205,14 +206,31 @@ self.lastIndexPath_we = indexPath; } } else { - cell.textLabel.text = [[[self.listOfScripts objectAtIndex:row] stringByDeletingPathExtension] - stringByReplacingOccurrencesOfString:@"_" withString:@" "]; - //cell.detailTextLabel.text = ; - if ([[self.listOfScripts objectAtIndex:row] isEqualToString:self.selectedScript]) { - UIImageView *checkbox = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:@"checkbox.png"]]; - cell.accessoryView = checkbox; - [checkbox release]; - self.lastIndexPath_lu = indexPath; + if (row == 0) + { + cell.textLabel.text = @"Normal"; + + if ([self.selectedScript isEqualToString:@""]) + { + UIImageView *checkbox = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:@"checkbox.png"]]; + cell.accessoryView = checkbox; + [checkbox release]; + self.lastIndexPath_lu = indexPath; + } + } + else + { + row--; + + cell.textLabel.text = [[[self.listOfScripts objectAtIndex:row] stringByDeletingPathExtension] + stringByReplacingOccurrencesOfString:@"_" withString:@" "]; + //cell.detailTextLabel.text = ; + if ([[self.listOfScripts objectAtIndex:row] isEqualToString:self.selectedScript]) { + UIImageView *checkbox = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:@"checkbox.png"]]; + cell.accessoryView = checkbox; + [checkbox release]; + self.lastIndexPath_lu = indexPath; + } } } @@ -311,44 +329,63 @@ self.selectedWeapon = [self.listOfWeapons objectAtIndex:newRow]; } else { self.lastIndexPath_lu = indexPath; - self.selectedScript = [self.listOfScripts objectAtIndex:newRow]; - - // some styles disable or force the choice of a particular scheme/weaponset - NSString *path = [[NSString alloc] initWithFormat:@"%@/%@.cfg",SCRIPTS_DIRECTORY(),[self.selectedScript stringByDeletingPathExtension]]; - NSString *configFile = [[NSString alloc] initWithContentsOfFile:path]; - [path release]; - NSArray *scriptOptions = [configFile componentsSeparatedByString:@"\n"]; - [configFile release]; - - self.scriptCommand = [NSString stringWithFormat:@"escript Scripts/Multiplayer/%@",self.selectedScript]; - NSString *scheme = [scriptOptions objectAtIndex:0]; - if ([scheme isEqualToString:@"locked"]) + + if (newRow == 0) { + self.selectedScript = nil; + self.scriptCommand = nil; + self.selectedScheme = @"Default.plist"; - [self.topControl setEnabled:NO forSegmentAtIndex:0]; + [self.topControl setEnabled:YES forSegmentAtIndex:0]; + + self.selectedWeapon = @"Default.plist"; + [self.topControl setEnabled:YES forSegmentAtIndex:1]; } else { - if (![scheme isEqualToString:@"*"]) + newRow--; + + self.selectedScript = [self.listOfScripts objectAtIndex:newRow]; + + // some styles disable or force the choice of a particular scheme/weaponset + NSString *path = [[NSString alloc] initWithFormat:@"%@/%@.cfg",SCRIPTS_DIRECTORY(),[self.selectedScript stringByDeletingPathExtension]]; + NSString *configFile = [[NSString alloc] initWithContentsOfFile:path]; + [path release]; + NSArray *scriptOptions = [configFile componentsSeparatedByString:@"\n"]; + [configFile release]; + + self.scriptCommand = [NSString stringWithFormat:@"escript Scripts/Multiplayer/%@",self.selectedScript]; + NSString *scheme = [scriptOptions objectAtIndex:0]; + if ([scheme isEqualToString:@"locked"]) { - self.selectedScheme = [NSString stringWithFormat:@"%@.plist",scheme]; + self.selectedScheme = @"Default.plist"; + [self.topControl setEnabled:NO forSegmentAtIndex:0]; } - [self.topControl setEnabled:YES forSegmentAtIndex:0]; - } - - NSString *weapon = [scriptOptions objectAtIndex:1]; - if ([weapon isEqualToString:@"locked"]) - { - self.selectedWeapon = @"Default.plist"; - [self.topControl setEnabled:NO forSegmentAtIndex:1]; - } - else - { - if (![weapon isEqualToString:@"*"]) + else + { + if (scheme && ![scheme isEqualToString:@"*"]) + { + NSString *correctScheme = [scheme stringByReplacingOccurrencesOfString:@"_" withString:@" "]; + self.selectedScheme = [NSString stringWithFormat:@"%@.plist", correctScheme]; + } + [self.topControl setEnabled:YES forSegmentAtIndex:0]; + } + + NSString *weapon = [scriptOptions objectAtIndex:1]; + if ([weapon isEqualToString:@"locked"]) { - self.selectedWeapon = [NSString stringWithFormat:@"%@.plist",weapon]; + self.selectedWeapon = @"Default.plist"; + [self.topControl setEnabled:NO forSegmentAtIndex:1]; } - [self.topControl setEnabled:YES forSegmentAtIndex:1]; + else + { + if (weapon && ![weapon isEqualToString:@"*"]) + { + NSString *correctWeapon = [weapon stringByReplacingOccurrencesOfString:@"_" withString:@" "]; + self.selectedWeapon = [NSString stringWithFormat:@"%@.plist", correctWeapon]; + } + [self.topControl setEnabled:YES forSegmentAtIndex:1]; + } } } @@ -396,16 +433,6 @@ #pragma mark - #pragma mark Memory management -(void) didReceiveMemoryWarning { - if ([HWUtils isGameLaunched]) { - self.lastIndexPath_sc = nil; - self.lastIndexPath_we = nil; - self.lastIndexPath_lu = nil; - self.selectedScheme = nil; - self.selectedWeapon = nil; - self.selectedScript = nil; - self.scriptCommand = nil; - self.topControl = nil; - } self.listOfSchemes = nil; self.listOfWeapons = nil; self.listOfScripts = nil; @@ -414,7 +441,6 @@ } -(void) viewDidUnload { - [[NSNotificationCenter defaultCenter] removeObserver:self]; self.listOfSchemes = nil; self.listOfWeapons = nil; self.listOfScripts = nil; @@ -430,7 +456,9 @@ [super viewDidUnload]; } --(void) dealloc { +-(void) dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; releaseAndNil(listOfSchemes); releaseAndNil(listOfWeapons); releaseAndNil(listOfScripts); diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m --- a/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m Mon Nov 09 16:34:03 2015 +0000 @@ -69,14 +69,14 @@ #pragma mark Communication layer -(int) sendToServer:(NSString *)command { NSString *message = [[NSString alloc] initWithFormat:@"%@\n\n",command]; - int result = SDLNet_TCP_Send(self.ssd, [message UTF8String], [message length]); + int result = SDLNet_TCP_Send(self.ssd, [message UTF8String], [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); [message release]; return result; } -(int) sendToServer:(NSString *)command withArgument:(NSString *)argument { NSString *message = [[NSString alloc] initWithFormat:@"%@\n%@\n\n",command,argument]; - int result = SDLNet_TCP_Send(self.ssd, [message UTF8String], [message length]); + int result = SDLNet_TCP_Send(self.ssd, [message UTF8String], [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); [message release]; return result; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h --- a/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -19,29 +19,16 @@ #import - -@class GeneralSettingsViewController; -@class TeamSettingsViewController; -@class WeaponSettingsViewController; -@class SchemeSettingsViewController; -@class SupportViewController; - @interface SettingsBaseViewController : UIViewController { UIViewController *targetController; NSArray *controllerNames; NSIndexPath *lastIndexPath; UITabBarController *tabController; - GeneralSettingsViewController *generalSettingsViewController; - TeamSettingsViewController *teamSettingsViewController; - WeaponSettingsViewController *weaponSettingsViewController; - SchemeSettingsViewController *schemeSettingsViewController; - SupportViewController *supportViewController; } @property (nonatomic, retain) UIViewController *targetController; @property (nonatomic, retain) NSArray *controllerNames; @property (nonatomic, retain) NSIndexPath *lastIndexPath; -@property (nonatomic, retain) UITabBarController *tabController; -(void) dismissSplitView; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m --- a/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -26,7 +26,7 @@ @implementation SettingsBaseViewController -@synthesize tabController, targetController, controllerNames, lastIndexPath; +@synthesize targetController, controllerNames, lastIndexPath; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { return rotationManager(interfaceOrientation); @@ -45,90 +45,35 @@ self.controllerNames = array; [array release]; - UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:self - action:@selector(dismissSplitView)]; - if (IS_IPAD()) { + if (IS_IPAD()) + { // this class gets loaded twice, we tell the difference by looking at targetController - if (self.targetController != nil) { + if (self.targetController != nil) + { UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain]; + tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; tableView.delegate = self; tableView.dataSource = self; [tableView reloadData]; [self.view addSubview:tableView]; [self tableView:tableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; [tableView release]; - self.navigationItem.leftBarButtonItem = doneButton; - } - } else { - // this class just loads all controllers and set up tabbar and navigation controllers - NSMutableArray *tabBarNavigationControllers = [[NSMutableArray alloc] initWithCapacity:5]; - UINavigationController *navController = nil; - - if (nil == generalSettingsViewController) { - generalSettingsViewController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - generalSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:0]; - generalSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/TargetBee.png",GRAPHICS_DIRECTORY()]]; - navController = [[UINavigationController alloc] initWithRootViewController:generalSettingsViewController]; - generalSettingsViewController.navigationItem.backBarButtonItem = doneButton; - generalSettingsViewController.navigationItem.leftBarButtonItem = doneButton; - [generalSettingsViewController release]; - [tabBarNavigationControllers addObject:navController]; - releaseAndNil(navController); - } - if (nil == teamSettingsViewController) { - teamSettingsViewController = [[TeamSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - teamSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:1]; - teamSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/Egg.png",GRAPHICS_DIRECTORY()]]; - navController = [[UINavigationController alloc] initWithRootViewController:teamSettingsViewController]; - teamSettingsViewController.navigationItem.backBarButtonItem = doneButton; - teamSettingsViewController.navigationItem.leftBarButtonItem = doneButton; - [tabBarNavigationControllers addObject:navController]; - releaseAndNil(navController); + self.navigationItem.leftBarButtonItem = [self doneButton]; } - if (nil == weaponSettingsViewController) { - weaponSettingsViewController = [[WeaponSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - weaponSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:2]; - weaponSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/cheese.png",GRAPHICS_DIRECTORY()]]; - navController = [[UINavigationController alloc] initWithRootViewController:weaponSettingsViewController]; - weaponSettingsViewController.navigationItem.backBarButtonItem = doneButton; - weaponSettingsViewController.navigationItem.leftBarButtonItem = doneButton; - [tabBarNavigationControllers addObject:navController]; - releaseAndNil(navController); - } - if (nil == schemeSettingsViewController) { - schemeSettingsViewController = [[SchemeSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - schemeSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:3]; - schemeSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/Targetp.png",GRAPHICS_DIRECTORY()]]; - navController = [[UINavigationController alloc] initWithRootViewController:schemeSettingsViewController]; - schemeSettingsViewController.navigationItem.backBarButtonItem = doneButton; - schemeSettingsViewController.navigationItem.leftBarButtonItem = doneButton; - [tabBarNavigationControllers addObject:navController]; - releaseAndNil(navController); - } - if (nil == supportViewController) { - supportViewController = [[SupportViewController alloc] initWithStyle:UITableViewStyleGrouped]; - supportViewController.tabBarItem.title = [self.controllerNames objectAtIndex:4]; - supportViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/Seduction.png",GRAPHICS_DIRECTORY()]]; - navController = [[UINavigationController alloc] initWithRootViewController:supportViewController]; - supportViewController.navigationItem.backBarButtonItem = doneButton; - supportViewController.navigationItem.leftBarButtonItem = doneButton; - [tabBarNavigationControllers addObject:navController]; - releaseAndNil(navController); - } + } + else + { + //iPhone part moved to MainMenuViewController + } - self.tabController = [[UITabBarController alloc] init]; - self.tabController.viewControllers = tabBarNavigationControllers; - self.tabController.delegate = self; - - [self.view addSubview:self.tabController.view]; - } - [doneButton release]; [super viewDidLoad]; } --(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { - [viewController viewWillAppear:NO]; +- (UIBarButtonItem *)doneButton +{ + return [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self + action:@selector(dismissSplitView)] autorelease]; } -(void) dismissSplitView { @@ -136,16 +81,6 @@ [[[HedgewarsAppDelegate sharedAppDelegate] mainViewController] dismissViewControllerAnimated:YES completion:nil]; } --(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - if (IS_IPAD() == NO) - return; - - if (self.targetController != nil) { - CGRect screenRect = [[UIScreen mainScreen] safeBounds]; - self.view.frame = CGRectMake(0, 0, 320, screenRect.size.height); - } -} - #pragma mark - #pragma mark Table view data source -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { @@ -197,40 +132,33 @@ #pragma mark - #pragma mark Table view delegate --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ NSInteger newRow = [indexPath row]; NSInteger oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1; UIViewController *nextController = nil; - if (newRow != oldRow) { + if (newRow != oldRow) + { [tableView deselectRowAtIndexPath:lastIndexPath animated:YES]; [targetController.navigationController popToRootViewControllerAnimated:NO]; - switch (newRow) { + switch (newRow) + { case 0: - if (nil == generalSettingsViewController) - generalSettingsViewController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = generalSettingsViewController; + nextController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped];; break; case 1: - if (nil == teamSettingsViewController) - teamSettingsViewController = [[TeamSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = teamSettingsViewController; + nextController = [[TeamSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; break; case 2: - if (nil == weaponSettingsViewController) - weaponSettingsViewController = [[WeaponSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = weaponSettingsViewController; + nextController = [[WeaponSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; break; case 3: - if (nil == schemeSettingsViewController) - schemeSettingsViewController = [[SchemeSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = schemeSettingsViewController; + nextController = [[SchemeSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; break; case 4: - if (nil == supportViewController) - supportViewController = [[SupportViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = supportViewController; + nextController = [[SupportViewController alloc] initWithStyle:UITableViewStyleGrouped]; break; } @@ -240,6 +168,8 @@ nextController.navigationItem.hidesBackButton = YES; [nextController viewWillAppear:NO]; [targetController.navigationController pushViewController:nextController animated:NO]; + [nextController release]; + [[AudioManagerController mainManager] playClickSound]; } } @@ -247,62 +177,28 @@ #pragma mark - #pragma mark Memory management --(void) didReceiveMemoryWarning { - if (generalSettingsViewController.view.superview == nil) - generalSettingsViewController = nil; - if (teamSettingsViewController.view.superview == nil) - teamSettingsViewController = nil; - if (weaponSettingsViewController.view.superview == nil) - weaponSettingsViewController = nil; - if (schemeSettingsViewController.view.superview == nil) - schemeSettingsViewController = nil; - if (supportViewController.view.superview == nil) - supportViewController = nil; - if (tabController.view.superview == nil) - tabController = nil; +-(void) didReceiveMemoryWarning +{ MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } --(void) viewDidUnload { +-(void) viewDidUnload +{ self.controllerNames = nil; self.lastIndexPath = nil; self.targetController = nil; - self.tabController = nil; - generalSettingsViewController = nil; - teamSettingsViewController = nil; - weaponSettingsViewController = nil; - schemeSettingsViewController = nil; - supportViewController = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } --(void) dealloc { +-(void) dealloc +{ releaseAndNil(targetController); releaseAndNil(controllerNames); releaseAndNil(lastIndexPath); - releaseAndNil(tabController); - releaseAndNil(generalSettingsViewController); - releaseAndNil(teamSettingsViewController); - releaseAndNil(weaponSettingsViewController); - releaseAndNil(schemeSettingsViewController); - releaseAndNil(supportViewController); [super dealloc]; } - --(void) viewWillDisappear:(BOOL)animated { - // this will send -viewWillDisappear: only the active view - [self.tabController viewWillDisappear:animated]; - // let's send that to every page, even though only GeneralSettingsViewController needs it - [generalSettingsViewController viewWillDisappear:animated]; - [teamSettingsViewController viewWillDisappear:animated]; - [weaponSettingsViewController viewWillDisappear:animated]; - [schemeSettingsViewController viewWillDisappear:animated]; - [supportViewController viewWillDisappear:animated]; - [super viewWillDisappear:animated]; -} - @end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SettingsContainerViewController.h --- a/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2012 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - - -#import - - -@class SettingsBaseViewController; -@class MGSplitViewController; - -@interface SettingsContainerViewController : UIViewController { - SettingsBaseViewController *baseController; - MGSplitViewController *splitViewRootController; -} - -@property (nonatomic,retain) SettingsBaseViewController *baseController; -@property (nonatomic,retain) MGSplitViewController *splitViewRootController; - -@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SettingsContainerViewController.m --- a/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2012 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - - -#import "SettingsContainerViewController.h" -#import "SettingsBaseViewController.h" -#import "MGSplitViewController.h" - - -@implementation SettingsContainerViewController -@synthesize baseController, splitViewRootController; - --(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return rotationManager(interfaceOrientation); -} - --(void) viewDidLoad { - CGRect screenRect = [[UIScreen mainScreen] safeBounds]; - self.view.frame = screenRect; - - if (IS_IPAD()) { - // the contents on the right of the splitview, setting targetController to nil to avoid creating the table - SettingsBaseViewController *rightController = [[SettingsBaseViewController alloc] init]; - rightController.targetController = nil; - UINavigationController *rightNavController = [[UINavigationController alloc] initWithRootViewController:rightController]; - [rightController release]; - - // the contens on the left of the splitview, setting targetController that will receive push/pop actions - SettingsBaseViewController *leftController = [[SettingsBaseViewController alloc] init]; - leftController.targetController = rightNavController.topViewController; - UINavigationController *leftNavController = [[UINavigationController alloc] initWithRootViewController:leftController]; - [leftController release]; - - self.splitViewRootController = [[MGSplitViewController alloc] init]; - self.splitViewRootController.delegate = nil; - self.splitViewRootController.view.frame = screenRect; - self.splitViewRootController.viewControllers = [NSArray arrayWithObjects: leftNavController, rightNavController, nil]; - self.splitViewRootController.showsMasterInPortrait = YES; - [leftNavController release]; - [rightNavController release]; - - // add view to main controller - [self.view addSubview:self.splitViewRootController.view]; - } else { - if (nil == self.baseController) { - SettingsBaseViewController *sbvc = [[SettingsBaseViewController alloc] init]; - self.baseController = sbvc; - [sbvc release]; - } - self.baseController.targetController = nil; - self.baseController.view.frame = screenRect; - - [self.view addSubview:self.baseController.view]; - } - - [super viewDidLoad]; -} - -#pragma mark - -#pragma mark Memory management --(void) didReceiveMemoryWarning { - if (self.baseController.view.superview == nil) - self.baseController = nil; - if (self.splitViewRootController.view.superview == nil) - self.splitViewRootController = nil; - MSG_MEMCLEAN(); - [super didReceiveMemoryWarning]; -} - --(void) viewDidUnload { - self.baseController = nil; - self.splitViewRootController = nil; - MSG_DIDUNLOAD(); - [super viewDidUnload]; -} - --(void) dealloc { - releaseAndNil(baseController); - releaseAndNil(splitViewRootController); - [super dealloc]; -} - - -#pragma mark - -#pragma mark view event management propagation -// every time we add a uiviewcontroller programmatically we need to take care of propgating such messages -// see http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/ --(void) viewWillAppear:(BOOL)animated { - [self.splitViewRootController.detailViewController viewWillAppear:animated]; - [self.baseController viewWillAppear:animated]; - [super viewWillAppear:animated]; -} - --(void) viewWillDisappear:(BOOL)animated { - [self.splitViewRootController.detailViewController viewWillDisappear:animated]; - [self.baseController viewWillDisappear:animated]; - [super viewWillDisappear:animated]; -} - --(void) viewDidAppear:(BOOL)animated { - [self.splitViewRootController.detailViewController viewDidAppear:animated]; - [self.baseController viewDidAppear:animated]; - [super viewDidAppear:animated]; -} - --(void) viewDidDisappear:(BOOL)animated { - [self.splitViewRootController.detailViewController viewDidDisappear:animated]; - [self.baseController viewDidDisappear:animated]; - [super viewDidDisappear:animated]; -} - --(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - [self.splitViewRootController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.baseController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; -} - --(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - [self.splitViewRootController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.baseController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; -} - --(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [self.splitViewRootController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self.baseController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; -} - -@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -25,18 +25,6 @@ #define SLIDER_TAG 54321 #define SWITCH_TAG 67890 -#define checkValueString(detailString,labelSting,sliderRef); \ - if ([labelSting isEqualToString:@"Turn Time"] && (NSInteger) sliderRef.value == 100) \ - detailString = @"∞"; \ - else if ([labelSting isEqualToString:@"Water Rise Amount"] && (NSInteger) sliderRef.value == 100) \ - detailString = NSLocalizedString(@"Nvr",@"Short for 'Never'"); \ - else if ([labelSting isEqualToString:@"Crate Drop Turns"] && (NSInteger) sliderRef.value == 0) \ - detailString = NSLocalizedString(@"Nvr",@"Short for 'Never'"); \ - else if ([labelSting isEqualToString:@"Mines Time"] && (NSInteger) sliderRef.value == -1) \ - detailString = NSLocalizedString(@"Rnd",@"Short for 'Random'"); \ - else \ - detailString = [NSString stringWithFormat:@"%d",(NSInteger) sliderRef.value]; - @implementation SingleSchemeViewController @synthesize schemeName, schemeDictionary, basicSettingList, gameModifierArray; @@ -221,8 +209,7 @@ } cellSlider.frame = CGRectMake(hOffset, vOffset, sliderLength, 23); - NSString *prestring = nil; - checkValueString(prestring,basicSettingTitleKey,cellSlider); + NSString *prestring = [self localizedValueStringForKey:basicSettingTitleKey andSlider:cellSlider]; // forced to use this weird format otherwise the label disappears when size of the text is bigger than the original while ([prestring length] <= 4) @@ -280,10 +267,10 @@ UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; // grab the associated labels UILabel *detailLabel = (UILabel *)cell.detailTextLabel; - UILabel *cellLabel = (UILabel *)[cell.contentView viewWithTag:LABEL_TAG]; // modify it - checkValueString(detailLabel.text,cellLabel.text,theSlider); + NSString *basicSettingTitleKey = [[self.basicSettingList objectAtIndex:[indexPath row]] objectForKey:@"title"]; + detailLabel.text = [self localizedValueStringForKey:basicSettingTitleKey andSlider:theSlider]; // save changes in the main array NSMutableArray *array = [self.schemeDictionary objectForKey:@"basic"]; @@ -348,6 +335,42 @@ return 56; } +#pragma mark - Helper methods + +- (NSString *)localizedValueStringForKey:(NSString *)keyString andSlider:(UISlider *)slider +{ + NSInteger sliderValue = (NSInteger)slider.value; + + if ([keyString isEqualToString:@"Turn Time"] && sliderValue == 100) + return @"∞"; + else if ([keyString isEqualToString:@"Water Rise Amount"] && sliderValue == 100) + return NSLocalizedString(@"Nvr", @"Short for 'Never'"); + else if ([keyString isEqualToString:@"Crate Drop Turns"] && sliderValue == 0) + return NSLocalizedString(@"Nvr", @"Short for 'Never'"); + else if ([keyString isEqualToString:@"Mines Time"] && sliderValue == -1) + return NSLocalizedString(@"Rnd", @"Short for 'Random'"); + else if ([keyString isEqualToString:@"World Edge"]) + switch (sliderValue) + { + case 0: + return NSLocalizedString(@"None", nil); + + case 1: + return NSLocalizedString(@"Wrap", nil); + + case 2: + return NSLocalizedString(@"Bounce", nil); + + case 3: + return NSLocalizedString(@"Sea", nil); + + default: + return @""; + } + else + return [NSString stringWithFormat:@"%ld", (long)sliderValue]; +} + #pragma mark - #pragma mark Memory management -(void) didReceiveMemoryWarning { diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SingleTeamViewController.h --- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -19,14 +19,6 @@ #import - -@class HogHatViewController; -@class GravesViewController; -@class VoicesViewController; -@class FortsViewController; -@class FlagsViewController; -@class LevelViewController; - @interface SingleTeamViewController : UITableViewController { NSMutableDictionary *teamDictionary; @@ -36,13 +28,6 @@ NSArray *secondaryItems; NSArray *moreSecondaryItems; BOOL isWriteNeeded; - - HogHatViewController *hogHatViewController; - GravesViewController *gravesViewController; - VoicesViewController *voicesViewController; - FortsViewController *fortsViewController; - FlagsViewController *flagsViewController; - LevelViewController *levelViewController; } @property (nonatomic,retain) NSMutableDictionary *teamDictionary; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SingleTeamViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -146,7 +146,7 @@ rows = 1; break; case 1: // team members - rows = HW_getMaxNumberOfHogs(); + rows = HW_getMaxNumberOfHogs() + 1; // one for 'Select one hat for all hogs' cell break; case 2: // team details rows = [self.secondaryItems count]; @@ -180,6 +180,7 @@ static NSString *CellIdentifier0 = @"Cell0"; static NSString *CellIdentifier1 = @"Cell1"; static NSString *CellIdentifier2 = @"Cell2"; + static NSString *CellIdentifierDefault = @"CellDefault"; NSArray *hogArray; UITableViewCell *cell = nil; @@ -204,13 +205,28 @@ cell = editableCell; break; case 1: + if ([indexPath row] == HW_getMaxNumberOfHogs()) + { + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierDefault]; + if (cell == nil) + { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:CellIdentifierDefault] autorelease]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + } + + cell.textLabel.text = NSLocalizedString(@"Select one hat for all hogs", nil); + + break; + } + editableCell = (EditableCellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; if (editableCell == nil) { editableCell = [[[EditableCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease]; editableCell.delegate = self; - editableCell.tag = [indexPath row]; } + editableCell.tag = [indexPath row]; hogArray = [self.teamDictionary objectForKey:@"hedgehogs"]; @@ -290,120 +306,118 @@ NSInteger row = [indexPath row]; NSInteger section = [indexPath section]; - if (2 == section) { - switch (row) { + if (2 == section) + { + switch (row) + { case 0: // grave - if (nil == gravesViewController) - gravesViewController = [[GravesViewController alloc] initWithStyle:UITableViewStyleGrouped]; + { + GravesViewController *gravesViewController = [[GravesViewController alloc] initWithStyle:UITableViewStyleGrouped]; [gravesViewController setTeamDictionary:teamDictionary]; [self.navigationController pushViewController:gravesViewController animated:YES]; + [gravesViewController release]; break; + } case 1: // voice - if (nil == voicesViewController) - voicesViewController = [[VoicesViewController alloc] initWithStyle:UITableViewStyleGrouped]; + { + VoicesViewController *voicesViewController = [[VoicesViewController alloc] initWithStyle:UITableViewStyleGrouped]; [voicesViewController setTeamDictionary:teamDictionary]; [self.navigationController pushViewController:voicesViewController animated:YES]; + [voicesViewController release]; break; + } case 2: // fort - if (nil == fortsViewController) - fortsViewController = [[FortsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + { + FortsViewController *fortsViewController = [[FortsViewController alloc] initWithStyle:UITableViewStyleGrouped]; [fortsViewController setTeamDictionary:teamDictionary]; [self.navigationController pushViewController:fortsViewController animated:YES]; + [fortsViewController release]; break; + } case 3: // flag - if (nil == flagsViewController) - flagsViewController = [[FlagsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + { + FlagsViewController *flagsViewController = [[FlagsViewController alloc] initWithStyle:UITableViewStyleGrouped]; [flagsViewController setTeamDictionary:teamDictionary]; [self.navigationController pushViewController:flagsViewController animated:YES]; + [flagsViewController release]; break; + } case 4: // level - if (nil == levelViewController) - levelViewController = [[LevelViewController alloc] initWithStyle:UITableViewStyleGrouped]; + { + LevelViewController *levelViewController = [[LevelViewController alloc] initWithStyle:UITableViewStyleGrouped]; [levelViewController setTeamDictionary:teamDictionary]; [self.navigationController pushViewController:levelViewController animated:YES]; + [levelViewController release]; break; + } default: DLog(@"Nope"); break; } } else { - EditableCellView *cell = (EditableCellView *)[aTableView cellForRowAtIndexPath:indexPath]; - [cell replyKeyboard]; - [aTableView deselectRowAtIndexPath:indexPath animated:NO]; + if (section == 1 && row == HW_getMaxNumberOfHogs()) { + // 'Select one hat for all hogs' selected + [self showHogHatViewControllerForHogIndex:-1]; + } else { + EditableCellView *cell = (EditableCellView *)[aTableView cellForRowAtIndexPath:indexPath]; + [cell replyKeyboard]; + [aTableView deselectRowAtIndexPath:indexPath animated:NO]; + } } } // action to perform when you want to change a hog hat -(void) tableView:(UITableView *)aTableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { - if (nil == hogHatViewController) - hogHatViewController = [[HogHatViewController alloc] initWithStyle:UITableViewStyleGrouped]; - - // cache the dictionary file of the team, so that other controllers can modify it - hogHatViewController.teamDictionary = self.teamDictionary; - hogHatViewController.selectedHog = [indexPath row]; - // if we are editing the field undo any change before proceeding EditableCellView *cell = (EditableCellView *)[aTableView cellForRowAtIndexPath:indexPath]; [cell cancel:nil]; - - [self.navigationController pushViewController:hogHatViewController animated:YES]; + + [self showHogHatViewControllerForHogIndex:[indexPath row]]; } +- (void)showHogHatViewControllerForHogIndex:(NSInteger)hogIndex +{ + HogHatViewController *hogHatViewController = [[HogHatViewController alloc] initWithStyle:UITableViewStyleGrouped]; + + // cache the dictionary file of the team, so that other controllers can modify it + hogHatViewController.teamDictionary = self.teamDictionary; + hogHatViewController.selectedHog = hogIndex; + + [self.navigationController pushViewController:hogHatViewController animated:YES]; + [hogHatViewController release]; +} #pragma mark - #pragma mark Memory management -(void) didReceiveMemoryWarning { [super didReceiveMemoryWarning]; - if (hogHatViewController.view.superview == nil) - hogHatViewController = nil; - if (gravesViewController.view.superview == nil) - gravesViewController = nil; - if (voicesViewController.view.superview == nil) - voicesViewController = nil; - if (fortsViewController.view.superview == nil) - fortsViewController = nil; - if (flagsViewController.view.superview == nil) - flagsViewController = nil; - if (levelViewController.view.superview == nil) - levelViewController = nil; MSG_MEMCLEAN(); } -(void) viewDidUnload { - [[NSNotificationCenter defaultCenter] removeObserver:self]; self.teamDictionary = nil; self.teamName = nil; self.normalHogSprite = nil; self.secondaryItems = nil; self.moreSecondaryItems = nil; - hogHatViewController = nil; - gravesViewController = nil; - voicesViewController = nil; - flagsViewController = nil; - fortsViewController = nil; - levelViewController = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } --(void) dealloc { +-(void) dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; releaseAndNil(teamDictionary); releaseAndNil(teamName); releaseAndNil(normalHogSprite); releaseAndNil(secondaryItems); releaseAndNil(moreSecondaryItems); - releaseAndNil(hogHatViewController); - releaseAndNil(gravesViewController); - releaseAndNil(fortsViewController); - releaseAndNil(voicesViewController); - releaseAndNil(flagsViewController); - releaseAndNil(levelViewController); [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -37,7 +37,7 @@ [super viewDidLoad]; self.trPath = [NSString stringWithFormat:@"%@", LOCALE_DIRECTORY()]; - self.trFileName = [NSString stringWithFormat:@"%@.txt", [[NSLocale preferredLanguages] firstObject]]; + self.trFileName = [NSString stringWithFormat:@"%@.txt", [HWUtils languageID]]; // fill the data structure that we are going to read LoadLocaleWrapper([self.trPath UTF8String], [self.trFileName UTF8String]); diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/StatsPageViewController.m --- a/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -29,6 +29,7 @@ -(void) viewDidLoad { UITableView *aTableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped]; + aTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [aTableView setBackgroundColorForAnyTable:[UIColor clearColor]]; NSString *imgName = (IS_IPAD()) ? @"mediumBackground~ipad.png" : @"smallerBackground~iphone.png"; @@ -53,6 +54,20 @@ [super viewDidLoad]; } +#pragma mark - Helpers + +- (NSString *)teamNameFromInfo: (NSArray *)info +{ + NSString *teamName = [NSString stringWithString:[info objectAtIndex:2]]; + + for (int i=3; i < [info count]; i++) + { + teamName = [teamName stringByAppendingFormat:@" %@", [info objectAtIndex:i]]; + } + + return teamName; +} + #pragma mark - #pragma mark Table view data source -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { @@ -92,7 +107,7 @@ green:((color >> 8) & 0xFF)/255.0f blue:(color & 0xFF)/255.0f alpha:1.0f]; - cell.textLabel.text = [NSString stringWithFormat:@"%d. %@ (%@ kills)", row+1, [info objectAtIndex:2], [info objectAtIndex:1]]; + cell.textLabel.text = [NSString stringWithFormat:@"%d. %@ (%@ %@)", row+1, [self teamNameFromInfo:info], [info objectAtIndex:1], NSLocalizedString(@"kills", nil)]; imgName = [NSString stringWithFormat:@"StatsMedal%d",row+1]; } else if (section == 2) { // general info imgName = @"iconDamage"; @@ -118,7 +133,7 @@ } -(CGFloat) tableView:(UITableView *)aTableView heightForHeaderInSection:(NSInteger)section { - return 160; + return (section == 0) ? 160 : 40; } -(UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section { diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SupportViewController.h --- a/project_files/HedgewarsMobile/Classes/SupportViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SupportViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -18,9 +18,9 @@ #import - +#import "TableViewControllerWithDoneButton.h" -@interface SupportViewController : UITableViewController { +@interface SupportViewController : TableViewControllerWithDoneButton { NSArray *waysToSupport; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/SupportViewController.m --- a/project_files/HedgewarsMobile/Classes/SupportViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/SupportViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -18,7 +18,7 @@ #import "SupportViewController.h" - +#import "Appirater.h" @implementation SupportViewController @synthesize waysToSupport; @@ -95,6 +95,7 @@ DLog(@"No way"); break; } + cell.accessoryView = nil; } NSString *imgString = [[NSString alloc] initWithFormat:@"%@/%@.png",[[NSBundle mainBundle] resourcePath],imgName]; @@ -113,12 +114,17 @@ #pragma mark - #pragma mark Table view delegate --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *urlString = nil; +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ if ([indexPath section] == 0) - urlString = @"http://itunes.apple.com/us/app/hedgewars/id391234866?affC=QQABAAAAHgAFasEiWjVwUGZOc3k1VGctQkRJazlacXhUclpBTVpiU2xteVdfUQ%3D%3D#&mt=8"; + { + [Appirater rateApp]; + } else - switch ([indexPath row]) { + { + NSString *urlString = nil; + switch ([indexPath row]) + { case 0: urlString = @"http://www.facebook.com/Hedgewars"; break; @@ -135,7 +141,8 @@ DLog(@"No way"); break; } - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; + } } -(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger) section { @@ -154,7 +161,7 @@ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 20)]; label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; label.textAlignment = UITextAlignmentCenter; - label.text = @" ♥ THANK YOU ♥ "; + label.text = NSLocalizedString(@" ♥ THANK YOU ♥ ", nil); label.backgroundColor = [UIColor clearColor]; label.center = CGPointMake(self.tableView.frame.size.width/2, 250); [footer addSubview:label]; @@ -167,7 +174,7 @@ -(CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { // image height + label height - return 265; + return (section == 1) ? 265 : 20; } #pragma mark - diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/TableViewControllerWithDoneButton.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/TableViewControllerWithDoneButton.h Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,23 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#import + +@interface TableViewControllerWithDoneButton : UITableViewController + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/TableViewControllerWithDoneButton.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/TableViewControllerWithDoneButton.m Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,52 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#import "TableViewControllerWithDoneButton.h" + +@interface TableViewControllerWithDoneButton () + +@end + +@implementation TableViewControllerWithDoneButton + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + if (!IS_IPAD()) + { + UIBarButtonItem *doneButton = [self doneButton]; + self.navigationItem.backBarButtonItem = doneButton; + self.navigationItem.leftBarButtonItem = doneButton; + } +} + +- (UIBarButtonItem *)doneButton +{ + return [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self + action:@selector(dismissView)] autorelease]; +} + +- (void)dismissView +{ + [[AudioManagerController mainManager] playBackSound]; + [[[HedgewarsAppDelegate sharedAppDelegate] mainViewController] dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h --- a/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -18,13 +18,10 @@ #import - - -@class SingleTeamViewController; +#import "TableViewControllerWithDoneButton.h" -@interface TeamSettingsViewController : UITableViewController { +@interface TeamSettingsViewController : TableViewControllerWithDoneButton { NSMutableArray *listOfTeams; - SingleTeamViewController *childController; } @property (nonatomic, retain) NSMutableArray *listOfTeams; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -41,7 +41,7 @@ self.navigationItem.rightBarButtonItem = editButton; [editButton release]; - self.navigationItem.title = @"List of teams"; + self.navigationItem.title = NSLocalizedString(@"List of teams", nil); } // load the list of teams in the teams directory @@ -136,43 +136,43 @@ #pragma mark - #pragma mark Table view delegate --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (childController == nil) { - childController = [[SingleTeamViewController alloc] initWithStyle:UITableViewStyleGrouped]; - } - +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + SingleTeamViewController *singleTeamViewController = [[SingleTeamViewController alloc] initWithStyle:UITableViewStyleGrouped]; + NSInteger row = [indexPath row]; NSString *selectedTeamFile = [listOfTeams objectAtIndex:row]; // this must be set so childController can load the correct plist - childController.teamName = [selectedTeamFile stringByDeletingPathExtension]; - [childController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; + singleTeamViewController.teamName = [selectedTeamFile stringByDeletingPathExtension]; + [singleTeamViewController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; - [self.navigationController pushViewController:childController animated:YES]; + [self.navigationController pushViewController:singleTeamViewController animated:YES]; + [singleTeamViewController release]; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; } #pragma mark - #pragma mark Memory management --(void) didReceiveMemoryWarning { +-(void) didReceiveMemoryWarning +{ // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Relinquish ownership any cached data, images, etc that aren't in use. - if (childController.view.superview == nil ) - childController = nil; } --(void) viewDidUnload { +-(void) viewDidUnload +{ self.listOfTeams = nil; - childController = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } --(void) dealloc { +-(void) dealloc +{ releaseAndNil(listOfTeams); - releaseAndNil(childController); [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/UITableViewCell+FindTable.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/UITableViewCell+FindTable.h Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,25 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + +@interface UITableViewCell (FindTable) + +- (UITableView *)findTable; + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/UITableViewCell+FindTable.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/UITableViewCell+FindTable.m Mon Nov 09 16:34:03 2015 +0000 @@ -0,0 +1,39 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2015 Anton Malmygin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UITableViewCell+FindTable.h" + +@implementation UITableViewCell (FindTable) + +- (UITableView *)findTable +{ + UIView *tableView = self.superview; + while (![tableView isKindOfClass:[UITableView class]] || (tableView == nil)) + { + tableView = tableView.superview; + + if ([tableView isEqual:self.window]) + { + tableView = nil; + } + } + + return (UITableView *)tableView; +} + +@end diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/VoicesViewController.m --- a/project_files/HedgewarsMobile/Classes/VoicesViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/VoicesViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -32,7 +32,6 @@ #pragma mark View lifecycle -(void) viewDidLoad { [super viewDidLoad]; - srandom(time(NULL)); voiceBeingPlayed = NULL; @@ -129,7 +128,7 @@ NSString *voiceDir = [[NSString alloc] initWithFormat:@"%@/%@/",VOICES_DIRECTORY(),[voiceArray objectAtIndex:newRow]]; NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:voiceDir error:NULL]; - int index = random() % [array count]; + int index = arc4random_uniform((int)[array count]); voiceBeingPlayed = Mix_LoadWAV([[voiceDir stringByAppendingString:[array objectAtIndex:index]] UTF8String]); [voiceDir release]; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h --- a/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h Mon Nov 09 16:34:03 2015 +0000 @@ -18,13 +18,10 @@ #import - - -@class SingleWeaponViewController; +#import "TableViewControllerWithDoneButton.h" -@interface WeaponSettingsViewController : UITableViewController { +@interface WeaponSettingsViewController : TableViewControllerWithDoneButton { NSMutableArray *listOfWeapons; - SingleWeaponViewController *childController; } @property (nonatomic, retain) NSMutableArray *listOfWeapons; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Mon Nov 09 16:34:03 2015 +0000 @@ -40,7 +40,7 @@ self.navigationItem.rightBarButtonItem = editButton; [editButton release]; - self.navigationItem.title = @"List of weapons"; + self.navigationItem.title = NSLocalizedString(@"List of weapons", nil); } -(void) viewWillAppear:(BOOL) animated { @@ -131,42 +131,42 @@ #pragma mark - #pragma mark Table view delegate --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (childController == nil) { - childController = [[SingleWeaponViewController alloc] initWithStyle:UITableViewStyleGrouped]; - } +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + SingleWeaponViewController *singleWeaponViewController = [[SingleWeaponViewController alloc] initWithStyle:UITableViewStyleGrouped]; NSInteger row = [indexPath row]; NSString *selectedWeaponFile = [self.listOfWeapons objectAtIndex:row]; // this must be set so childController can load the correct plist - childController.weaponName = [selectedWeaponFile stringByDeletingPathExtension]; - [childController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; + singleWeaponViewController.weaponName = [selectedWeaponFile stringByDeletingPathExtension]; + [singleWeaponViewController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; - [self.navigationController pushViewController:childController animated:YES]; + [self.navigationController pushViewController:singleWeaponViewController animated:YES]; + [singleWeaponViewController release]; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; } #pragma mark - #pragma mark Memory management --(void)didReceiveMemoryWarning { +-(void)didReceiveMemoryWarning +{ [super didReceiveMemoryWarning]; - if (childController.view.superview == nil ) - childController = nil; } --(void) viewDidUnload { +-(void) viewDidUnload +{ self.listOfWeapons = nil; - childController = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } --(void) dealloc { +-(void) dealloc +{ releaseAndNil(listOfWeapons); - releaseAndNil(childController); [super dealloc]; } diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj --- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Mon Nov 09 16:34:03 2015 +0000 @@ -74,9 +74,9 @@ 615AD9EB1207654E00F2FF04 /* helpButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 615AD9EA1207654E00F2FF04 /* helpButton.png */; }; 615BE3D4155C5DDF003CA34D /* uInputHandler.pas in Sources */ = {isa = PBXBuildFile; fileRef = 615BE3D3155C5DDF003CA34D /* uInputHandler.pas */; }; 615E755A14E41E8C00FBA131 /* MXAudioPlayerFadeOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E755914E41E8C00FBA131 /* MXAudioPlayerFadeOperation.m */; }; - 615E76BC14E4421200FBA131 /* MGSplitCornersView.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E76B714E4421200FBA131 /* MGSplitCornersView.m */; }; - 615E76BD14E4421200FBA131 /* MGSplitDividerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E76B914E4421200FBA131 /* MGSplitDividerView.m */; }; - 615E76BE14E4421200FBA131 /* MGSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E76BB14E4421200FBA131 /* MGSplitViewController.m */; }; + 615E76BC14E4421200FBA131 /* MGSplitCornersView.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E76B714E4421200FBA131 /* MGSplitCornersView.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; + 615E76BD14E4421200FBA131 /* MGSplitDividerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E76B914E4421200FBA131 /* MGSplitDividerView.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; + 615E76BE14E4421200FBA131 /* MGSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E76BB14E4421200FBA131 /* MGSplitViewController.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 615FEAE212A2A6640098EE92 /* localplayButton~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 615FEADF12A2A6640098EE92 /* localplayButton~ipad.png */; }; 615FEAE312A2A6640098EE92 /* localplayButton~iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = 615FEAE012A2A6640098EE92 /* localplayButton~iphone.png */; }; 616065A8159A71FD00CFAEF4 /* hwclassic.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 616065A7159A71FD00CFAEF4 /* hwclassic.mp3 */; }; @@ -96,7 +96,6 @@ 6165921B11CA9BA200D6E256 /* SchemeWeaponConfigViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591FD11CA9BA200D6E256 /* SchemeWeaponConfigViewController.m */; }; 6165921C11CA9BA200D6E256 /* SingleSchemeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591FF11CA9BA200D6E256 /* SingleSchemeViewController.m */; }; 6165921D11CA9BA200D6E256 /* SingleTeamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920111CA9BA200D6E256 /* SingleTeamViewController.m */; }; - 6165921E11CA9BA200D6E256 /* SettingsContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */; }; 6165921F11CA9BA200D6E256 /* TeamConfigViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920511CA9BA200D6E256 /* TeamConfigViewController.m */; }; 6165922011CA9BA200D6E256 /* TeamSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920711CA9BA200D6E256 /* TeamSettingsViewController.m */; }; 6165922111CA9BA200D6E256 /* VoicesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920911CA9BA200D6E256 /* VoicesViewController.m */; }; @@ -208,7 +207,6 @@ 61A670C112747DB900B06CE7 /* MainMenuViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6165924C11CA9CB400D6E256 /* MainMenuViewController-iPhone.xib */; }; 61A670C212747DBD00B06CE7 /* MapConfigViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6165924E11CA9CB400D6E256 /* MapConfigViewController-iPhone.xib */; }; 61A976B3136F668500DD9878 /* uCursor.pas in Sources */ = {isa = PBXBuildFile; fileRef = 61A976B2136F668500DD9878 /* uCursor.pas */; }; - 61AC067412B2E32D000B52A2 /* Appirater.m in Sources */ = {isa = PBXBuildFile; fileRef = 61AC067312B2E32D000B52A2 /* Appirater.m */; }; 61B37A1F17837C78009F283D /* ArgParsers.pas in Sources */ = {isa = PBXBuildFile; fileRef = 61B37A1D17837C78009F283D /* ArgParsers.pas */; }; 61B37A2017837C78009F283D /* uVisualGearsList.pas in Sources */ = {isa = PBXBuildFile; fileRef = 61B37A1E17837C78009F283D /* uVisualGearsList.pas */; }; 61B37A80178381DB009F283D /* uGearsHandlersMess.pas in Sources */ = {isa = PBXBuildFile; fileRef = 61B37A7F178381DB009F283D /* uGearsHandlersMess.pas */; }; @@ -244,6 +242,27 @@ 61F9040B11DF59370068B24D /* background.png in Resources */ = {isa = PBXBuildFile; fileRef = 61F9040A11DF59370068B24D /* background.png */; }; 61F904D711DF7DA30068B24D /* WeaponCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 61F904D611DF7DA30068B24D /* WeaponCellView.m */; }; 922F64900F10F53100DC6EC0 /* libfpc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 928301170F10CAFC00CC5A3C /* libfpc.a */; }; + F60D04771BD137B5003ACB00 /* bullet_filled.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04631BD137B5003ACB00 /* bullet_filled.png */; }; + F60D04781BD137B5003ACB00 /* bullet_filled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04641BD137B5003ACB00 /* bullet_filled@2x.png */; }; + F60D04791BD137B5003ACB00 /* bullet.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04651BD137B5003ACB00 /* bullet.png */; }; + F60D047A1BD137B5003ACB00 /* bullet@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04661BD137B5003ACB00 /* bullet@2x.png */; }; + F60D047B1BD137B5003ACB00 /* flower_filled.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04671BD137B5003ACB00 /* flower_filled.png */; }; + F60D047C1BD137B5003ACB00 /* flower_filled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04681BD137B5003ACB00 /* flower_filled@2x.png */; }; + F60D047D1BD137B5003ACB00 /* flower.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04691BD137B5003ACB00 /* flower.png */; }; + F60D047E1BD137B5003ACB00 /* flower@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D046A1BD137B5003ACB00 /* flower@2x.png */; }; + F60D047F1BD137B5003ACB00 /* heart_filled.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D046B1BD137B5003ACB00 /* heart_filled.png */; }; + F60D04801BD137B5003ACB00 /* heart_filled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D046C1BD137B5003ACB00 /* heart_filled@2x.png */; }; + F60D04811BD137B5003ACB00 /* heart.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D046D1BD137B5003ACB00 /* heart.png */; }; + F60D04821BD137B5003ACB00 /* heart@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D046E1BD137B5003ACB00 /* heart@2x.png */; }; + F60D04831BD137B5003ACB00 /* target_filled.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D046F1BD137B5003ACB00 /* target_filled.png */; }; + F60D04841BD137B5003ACB00 /* target_filled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04701BD137B5003ACB00 /* target_filled@2x.png */; }; + F60D04851BD137B5003ACB00 /* target.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04711BD137B5003ACB00 /* target.png */; }; + F60D04861BD137B5003ACB00 /* target@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04721BD137B5003ACB00 /* target@2x.png */; }; + F60D04871BD137B5003ACB00 /* teams_filled.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04731BD137B5003ACB00 /* teams_filled.png */; }; + F60D04881BD137B5003ACB00 /* teams_filled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04741BD137B5003ACB00 /* teams_filled@2x.png */; }; + F60D04891BD137B5003ACB00 /* teams.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04751BD137B5003ACB00 /* teams.png */; }; + F60D048A1BD137B5003ACB00 /* teams@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F60D04761BD137B5003ACB00 /* teams@2x.png */; }; + F6448CE31BD2E00500C31C8C /* TableViewControllerWithDoneButton.m in Sources */ = {isa = PBXBuildFile; fileRef = F6448CE21BD2E00500C31C8C /* TableViewControllerWithDoneButton.m */; }; F65724FD1B7E784700A86262 /* helpabove.png in Resources */ = {isa = PBXBuildFile; fileRef = F65724F81B7E784700A86262 /* helpabove.png */; }; F65724FE1B7E784700A86262 /* helpbottom.png in Resources */ = {isa = PBXBuildFile; fileRef = F65724F91B7E784700A86262 /* helpbottom.png */; }; F65724FF1B7E784700A86262 /* helpleft.png in Resources */ = {isa = PBXBuildFile; fileRef = F65724FA1B7E784700A86262 /* helpleft.png */; }; @@ -252,6 +271,11 @@ F65E1DBF1B9B95A400A78ADF /* Icon-60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F65E1DBC1B9B95A400A78ADF /* Icon-60@2x.png */; }; F65E1DC01B9B95A400A78ADF /* Icon-76.png in Resources */ = {isa = PBXBuildFile; fileRef = F65E1DBD1B9B95A400A78ADF /* Icon-76.png */; }; F65E1DC11B9B95A400A78ADF /* Icon-76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F65E1DBE1B9B95A400A78ADF /* Icon-76@2x.png */; }; + F6756D801BD8550500B6AB6B /* LabelWithIBLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = F6756D7F1BD8550500B6AB6B /* LabelWithIBLocalization.m */; }; + F67FC8121BEC06E700A9DC75 /* Appirater.m in Sources */ = {isa = PBXBuildFile; fileRef = F67FC8101BEC06E700A9DC75 /* Appirater.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; + F67FC8141BEC072B00A9DC75 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F67FC8131BEC072B00A9DC75 /* StoreKit.framework */; }; + F67FC8161BEC17AC00A9DC75 /* Appirater.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F67FC8151BEC17AC00A9DC75 /* Appirater.bundle */; }; + F6BA38461BA7A834005D16EA /* GameLogViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BA38451BA7A834005D16EA /* GameLogViewController.m */; }; F6D7E09F1B76884E004F3BCF /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F6D7E09E1B76884E004F3BCF /* Default-568h@2x.png */; }; F6D7E0C21B768F19004F3BCF /* uLandGenPerlin.pas in Sources */ = {isa = PBXBuildFile; fileRef = F6D7E0BF1B768F19004F3BCF /* uLandGenPerlin.pas */; }; F6D7E0C31B768F19004F3BCF /* uLandGenTemplateBased.pas in Sources */ = {isa = PBXBuildFile; fileRef = F6D7E0C01B768F19004F3BCF /* uLandGenTemplateBased.pas */; }; @@ -261,6 +285,8 @@ F6F07BDE1B7E72D40010E48F /* HelpPageLobbyViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6F07BDA1B7E72D40010E48F /* HelpPageLobbyViewController-iPad.xib */; }; F6F07BDF1B7E72D40010E48F /* HelpPageLobbyViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6F07BDB1B7E72D40010E48F /* HelpPageLobbyViewController-iPhone.xib */; }; F6F07BE01B7E72D40010E48F /* HelpPageLobbyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F6F07BDD1B7E72D40010E48F /* HelpPageLobbyViewController.m */; }; + F6F7DA8F1BE18F5700432EA7 /* UITableViewCell+FindTable.m in Sources */ = {isa = PBXBuildFile; fileRef = F6F7DA8E1BE18F5700432EA7 /* UITableViewCell+FindTable.m */; }; + F6FF25A21BB8AEE300124053 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F6FF25A11BB8AEE300124053 /* GameController.framework */; }; /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ @@ -507,8 +533,6 @@ 616591FF11CA9BA200D6E256 /* SingleSchemeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SingleSchemeViewController.m; sourceTree = ""; }; 6165920011CA9BA200D6E256 /* SingleTeamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SingleTeamViewController.h; sourceTree = ""; }; 6165920111CA9BA200D6E256 /* SingleTeamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SingleTeamViewController.m; sourceTree = ""; }; - 6165920211CA9BA200D6E256 /* SettingsContainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsContainerViewController.h; sourceTree = ""; }; - 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsContainerViewController.m; sourceTree = ""; }; 6165920411CA9BA200D6E256 /* TeamConfigViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TeamConfigViewController.h; sourceTree = ""; }; 6165920511CA9BA200D6E256 /* TeamConfigViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TeamConfigViewController.m; sourceTree = ""; }; 6165920611CA9BA200D6E256 /* TeamSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TeamSettingsViewController.h; sourceTree = ""; }; @@ -652,8 +676,6 @@ 61A4A39312A5CCC2004D81E6 /* uVariables.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uVariables.pas; path = ../../hedgewars/uVariables.pas; sourceTree = SOURCE_ROOT; }; 61A4A3A112A5CD56004D81E6 /* uCaptions.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uCaptions.pas; path = ../../hedgewars/uCaptions.pas; sourceTree = SOURCE_ROOT; }; 61A976B2136F668500DD9878 /* uCursor.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uCursor.pas; path = ../../hedgewars/uCursor.pas; sourceTree = SOURCE_ROOT; }; - 61AC067212B2E32D000B52A2 /* Appirater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Appirater.h; path = Classes/Appirater.h; sourceTree = ""; }; - 61AC067312B2E32D000B52A2 /* Appirater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Appirater.m; path = Classes/Appirater.m; sourceTree = ""; }; 61B37A1D17837C78009F283D /* ArgParsers.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = ArgParsers.pas; path = ../../hedgewars/ArgParsers.pas; sourceTree = SOURCE_ROOT; }; 61B37A1E17837C78009F283D /* uVisualGearsList.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uVisualGearsList.pas; path = ../../hedgewars/uVisualGearsList.pas; sourceTree = SOURCE_ROOT; }; 61B37A7F178381DB009F283D /* uGearsHandlersMess.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uGearsHandlersMess.pas; path = ../../hedgewars/uGearsHandlersMess.pas; sourceTree = SOURCE_ROOT; }; @@ -709,6 +731,28 @@ 61F904D611DF7DA30068B24D /* WeaponCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WeaponCellView.m; path = Classes/WeaponCellView.m; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 928301170F10CAFC00CC5A3C /* libfpc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfpc.a; sourceTree = BUILT_PRODUCTS_DIR; }; + F60D04631BD137B5003ACB00 /* bullet_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = bullet_filled.png; path = Resources/Icons/bullet_filled.png; sourceTree = ""; }; + F60D04641BD137B5003ACB00 /* bullet_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bullet_filled@2x.png"; path = "Resources/Icons/bullet_filled@2x.png"; sourceTree = ""; }; + F60D04651BD137B5003ACB00 /* bullet.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = bullet.png; path = Resources/Icons/bullet.png; sourceTree = ""; }; + F60D04661BD137B5003ACB00 /* bullet@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bullet@2x.png"; path = "Resources/Icons/bullet@2x.png"; sourceTree = ""; }; + F60D04671BD137B5003ACB00 /* flower_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = flower_filled.png; path = Resources/Icons/flower_filled.png; sourceTree = ""; }; + F60D04681BD137B5003ACB00 /* flower_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "flower_filled@2x.png"; path = "Resources/Icons/flower_filled@2x.png"; sourceTree = ""; }; + F60D04691BD137B5003ACB00 /* flower.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = flower.png; path = Resources/Icons/flower.png; sourceTree = ""; }; + F60D046A1BD137B5003ACB00 /* flower@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "flower@2x.png"; path = "Resources/Icons/flower@2x.png"; sourceTree = ""; }; + F60D046B1BD137B5003ACB00 /* heart_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = heart_filled.png; path = Resources/Icons/heart_filled.png; sourceTree = ""; }; + F60D046C1BD137B5003ACB00 /* heart_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "heart_filled@2x.png"; path = "Resources/Icons/heart_filled@2x.png"; sourceTree = ""; }; + F60D046D1BD137B5003ACB00 /* heart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = heart.png; path = Resources/Icons/heart.png; sourceTree = ""; }; + F60D046E1BD137B5003ACB00 /* heart@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "heart@2x.png"; path = "Resources/Icons/heart@2x.png"; sourceTree = ""; }; + F60D046F1BD137B5003ACB00 /* target_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = target_filled.png; path = Resources/Icons/target_filled.png; sourceTree = ""; }; + F60D04701BD137B5003ACB00 /* target_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "target_filled@2x.png"; path = "Resources/Icons/target_filled@2x.png"; sourceTree = ""; }; + F60D04711BD137B5003ACB00 /* target.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = target.png; path = Resources/Icons/target.png; sourceTree = ""; }; + F60D04721BD137B5003ACB00 /* target@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "target@2x.png"; path = "Resources/Icons/target@2x.png"; sourceTree = ""; }; + F60D04731BD137B5003ACB00 /* teams_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = teams_filled.png; path = Resources/Icons/teams_filled.png; sourceTree = ""; }; + F60D04741BD137B5003ACB00 /* teams_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "teams_filled@2x.png"; path = "Resources/Icons/teams_filled@2x.png"; sourceTree = ""; }; + F60D04751BD137B5003ACB00 /* teams.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = teams.png; path = Resources/Icons/teams.png; sourceTree = ""; }; + F60D04761BD137B5003ACB00 /* teams@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "teams@2x.png"; path = "Resources/Icons/teams@2x.png"; sourceTree = ""; }; + F6448CE11BD2E00500C31C8C /* TableViewControllerWithDoneButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableViewControllerWithDoneButton.h; sourceTree = ""; }; + F6448CE21BD2E00500C31C8C /* TableViewControllerWithDoneButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableViewControllerWithDoneButton.m; sourceTree = ""; }; F65724F81B7E784700A86262 /* helpabove.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpabove.png; sourceTree = ""; }; F65724F91B7E784700A86262 /* helpbottom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpbottom.png; sourceTree = ""; }; F65724FA1B7E784700A86262 /* helpleft.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpleft.png; sourceTree = ""; }; @@ -720,6 +764,18 @@ F65E1DBC1B9B95A400A78ADF /* Icon-60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-60@2x.png"; path = "Resources/Icons/Icon-60@2x.png"; sourceTree = ""; }; F65E1DBD1B9B95A400A78ADF /* Icon-76.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-76.png"; path = "Resources/Icons/Icon-76.png"; sourceTree = ""; }; F65E1DBE1B9B95A400A78ADF /* Icon-76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-76@2x.png"; path = "Resources/Icons/Icon-76@2x.png"; sourceTree = ""; }; + F6756D7E1BD8550500B6AB6B /* LabelWithIBLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LabelWithIBLocalization.h; sourceTree = ""; }; + F6756D7F1BD8550500B6AB6B /* LabelWithIBLocalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LabelWithIBLocalization.m; sourceTree = ""; }; + F67FC80F1BEC06E700A9DC75 /* Appirater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Appirater.h; sourceTree = ""; }; + F67FC8101BEC06E700A9DC75 /* Appirater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Appirater.m; sourceTree = ""; }; + F67FC8111BEC06E700A9DC75 /* AppiraterDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppiraterDelegate.h; sourceTree = ""; }; + F67FC8131BEC072B00A9DC75 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; + F67FC8151BEC17AC00A9DC75 /* Appirater.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Appirater.bundle; sourceTree = ""; }; + F67FC81F1BEC280D00A9DC75 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Locale/tr.lproj/About.strings; sourceTree = ""; }; + F67FC8201BEC280D00A9DC75 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Locale/tr.lproj/Localizable.strings; sourceTree = ""; }; + F67FC8211BEC280D00A9DC75 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Locale/tr.lproj/Scheme.strings; sourceTree = ""; }; + F6BA38441BA7A834005D16EA /* GameLogViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameLogViewController.h; sourceTree = ""; }; + F6BA38451BA7A834005D16EA /* GameLogViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GameLogViewController.m; sourceTree = ""; }; F6D7E09E1B76884E004F3BCF /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; F6D7E0BF1B768F19004F3BCF /* uLandGenPerlin.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uLandGenPerlin.pas; path = ../../hedgewars/uLandGenPerlin.pas; sourceTree = ""; }; F6D7E0C01B768F19004F3BCF /* uLandGenTemplateBased.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uLandGenTemplateBased.pas; path = ../../hedgewars/uLandGenTemplateBased.pas; sourceTree = ""; }; @@ -730,6 +786,9 @@ F6F07BDB1B7E72D40010E48F /* HelpPageLobbyViewController-iPhone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "HelpPageLobbyViewController-iPhone.xib"; sourceTree = ""; }; F6F07BDC1B7E72D40010E48F /* HelpPageLobbyViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpPageLobbyViewController.h; sourceTree = ""; }; F6F07BDD1B7E72D40010E48F /* HelpPageLobbyViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HelpPageLobbyViewController.m; sourceTree = ""; }; + F6F7DA8D1BE18F5700432EA7 /* UITableViewCell+FindTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UITableViewCell+FindTable.h"; path = "Classes/UITableViewCell+FindTable.h"; sourceTree = ""; }; + F6F7DA8E1BE18F5700432EA7 /* UITableViewCell+FindTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UITableViewCell+FindTable.m"; path = "Classes/UITableViewCell+FindTable.m"; sourceTree = ""; }; + F6FF25A11BB8AEE300124053 /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -737,6 +796,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F67FC8141BEC072B00A9DC75 /* StoreKit.framework in Frameworks */, + F6FF25A21BB8AEE300124053 /* GameController.framework in Frameworks */, F6D7E0C81B7698BF004F3BCF /* libstdc++.dylib in Frameworks */, F6D7E0C61B769819004F3BCF /* CoreMotion.framework in Frameworks */, 617D791E16D933060091D4D6 /* libPhysfs.a in Frameworks */, @@ -816,8 +877,7 @@ 61F8535314578999002CA294 /* Helpers */, 61641FE21437CD8F006E049C /* Headers */, 61DE91561258B76800B80214 /* Custom UIs */, - 61AC067212B2E32D000B52A2 /* Appirater.h */, - 61AC067312B2E32D000B52A2 /* Appirater.m */, + F67FC80E1BEC06E700A9DC75 /* Appirater */, 61006F93128DE31F00EBA7F7 /* CreationChamber.h */, 61006F94128DE31F00EBA7F7 /* CreationChamber.m */, 6165929C11CA9E2F00D6E256 /* HedgewarsAppDelegate.h */, @@ -852,6 +912,8 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + F67FC8131BEC072B00A9DC75 /* StoreKit.framework */, + F6FF25A11BB8AEE300124053 /* GameController.framework */, 617D78D816D932310091D4D6 /* Physfs.xcodeproj */, 617D794316D933B00091D4D6 /* Physlayer.xcodeproj */, 6195993F1364C82B00B429B6 /* Lua.xcodeproj */, @@ -893,6 +955,8 @@ 61F2E7CB1205EDE0005734F7 /* AboutViewController.h */, 61F2E7CC1205EDE0005734F7 /* AboutViewController.m */, 61F2E7CD1205EDE0005734F7 /* AboutViewController.xib */, + F6BA38441BA7A834005D16EA /* GameLogViewController.h */, + F6BA38451BA7A834005D16EA /* GameLogViewController.m */, 6167A6731391514600AA6D07 /* RestoreViewController.h */, 6167A6741391514600AA6D07 /* RestoreViewController.m */, 6167A6751391514600AA6D07 /* RestoreViewController-iPhone.xib */, @@ -938,8 +1002,6 @@ 6163EE4C11CC2478001C0453 /* Settings Page */ = { isa = PBXGroup; children = ( - 6165920211CA9BA200D6E256 /* SettingsContainerViewController.h */, - 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */, 616591F411CA9BA200D6E256 /* SettingsBaseViewController.h */, 616591F511CA9BA200D6E256 /* SettingsBaseViewController.m */, 6163EE4E11CC248D001C0453 /* First Level */, @@ -968,6 +1030,8 @@ F6F07BDD1B7E72D40010E48F /* HelpPageLobbyViewController.m */, F6F07BDA1B7E72D40010E48F /* HelpPageLobbyViewController-iPad.xib */, F6F07BDB1B7E72D40010E48F /* HelpPageLobbyViewController-iPhone.xib */, + F6756D7E1BD8550500B6AB6B /* LabelWithIBLocalization.h */, + F6756D7F1BD8550500B6AB6B /* LabelWithIBLocalization.m */, ); name = "Game Configuration"; sourceTree = ""; @@ -975,6 +1039,8 @@ 6163EE4E11CC248D001C0453 /* First Level */ = { isa = PBXGroup; children = ( + F6448CE11BD2E00500C31C8C /* TableViewControllerWithDoneButton.h */, + F6448CE21BD2E00500C31C8C /* TableViewControllerWithDoneButton.m */, 616591E811CA9BA200D6E256 /* GeneralSettingsViewController.h */, 616591E911CA9BA200D6E256 /* GeneralSettingsViewController.m */, 6165920611CA9BA200D6E256 /* TeamSettingsViewController.h */, @@ -1113,6 +1179,8 @@ 619C5BA0124FA59000D041AE /* MapPreviewButtonView.h */, 619C5BA1124FA59000D041AE /* MapPreviewButtonView.m */, 61F544C512AF1748007FD913 /* HoldTableViewCell.h */, + F6F7DA8D1BE18F5700432EA7 /* UITableViewCell+FindTable.h */, + F6F7DA8E1BE18F5700432EA7 /* UITableViewCell+FindTable.m */, 61F544C612AF1748007FD913 /* HoldTableViewCell.m */, 6165922A11CA9BD500D6E256 /* SquareButtonView.h */, 6165922B11CA9BD500D6E256 /* SquareButtonView.m */, @@ -1127,6 +1195,7 @@ 61F7A42811E2905C0040BA66 /* Icons */ = { isa = PBXGroup; children = ( + F60D04611BD1378F003ACB00 /* Tabbar */, 61F2E7EB12060E31005734F7 /* checkbox.png */, 615FEAD912A2A4C10098EE92 /* checkbox@2x.png */, 61D3D2A41290E03A003CE7C3 /* irc.png */, @@ -1298,6 +1367,33 @@ name = "Pascal Sources"; sourceTree = ""; }; + F60D04611BD1378F003ACB00 /* Tabbar */ = { + isa = PBXGroup; + children = ( + F60D04631BD137B5003ACB00 /* bullet_filled.png */, + F60D04641BD137B5003ACB00 /* bullet_filled@2x.png */, + F60D04651BD137B5003ACB00 /* bullet.png */, + F60D04661BD137B5003ACB00 /* bullet@2x.png */, + F60D04671BD137B5003ACB00 /* flower_filled.png */, + F60D04681BD137B5003ACB00 /* flower_filled@2x.png */, + F60D04691BD137B5003ACB00 /* flower.png */, + F60D046A1BD137B5003ACB00 /* flower@2x.png */, + F60D046B1BD137B5003ACB00 /* heart_filled.png */, + F60D046C1BD137B5003ACB00 /* heart_filled@2x.png */, + F60D046D1BD137B5003ACB00 /* heart.png */, + F60D046E1BD137B5003ACB00 /* heart@2x.png */, + F60D046F1BD137B5003ACB00 /* target_filled.png */, + F60D04701BD137B5003ACB00 /* target_filled@2x.png */, + F60D04711BD137B5003ACB00 /* target.png */, + F60D04721BD137B5003ACB00 /* target@2x.png */, + F60D04731BD137B5003ACB00 /* teams_filled.png */, + F60D04741BD137B5003ACB00 /* teams_filled@2x.png */, + F60D04751BD137B5003ACB00 /* teams.png */, + F60D04761BD137B5003ACB00 /* teams@2x.png */, + ); + name = Tabbar; + sourceTree = ""; + }; F65724F71B7E784700A86262 /* Help Bubbles */ = { isa = PBXGroup; children = ( @@ -1311,6 +1407,18 @@ path = "Resources/Frontend/Help Bubbles"; sourceTree = ""; }; + F67FC80E1BEC06E700A9DC75 /* Appirater */ = { + isa = PBXGroup; + children = ( + F67FC80F1BEC06E700A9DC75 /* Appirater.h */, + F67FC8101BEC06E700A9DC75 /* Appirater.m */, + F67FC8111BEC06E700A9DC75 /* AppiraterDelegate.h */, + F67FC8151BEC17AC00A9DC75 /* Appirater.bundle */, + ); + name = Appirater; + path = Classes/Appirater; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1365,7 +1473,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0710; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Hedgewars" */; compatibilityVersion = "Xcode 3.2"; @@ -1385,6 +1493,7 @@ Portuguese, Romanian, ru, + tr, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; @@ -1500,23 +1609,33 @@ 611E12FF117BBBDA0044B62F /* Entitlements-Development.plist in Resources */, 6165925311CA9CB400D6E256 /* MainMenuViewController-iPad.xib in Resources */, 6165925511CA9CB400D6E256 /* MapConfigViewController-iPad.xib in Resources */, + F60D04791BD137B5003ACB00 /* bullet.png in Resources */, 61F9040911DF58B00068B24D /* settingsButton.png in Resources */, 61F9040B11DF59370068B24D /* background.png in Resources */, 61EBA62A11DFF2BC0048B68A /* title~iphone.png in Resources */, 61F7A43811E290650040BA66 /* Icon-72.png in Resources */, + F60D04781BD137B5003ACB00 /* bullet_filled@2x.png in Resources */, 61F7A43911E290650040BA66 /* Icon-Small-50.png in Resources */, + F60D04871BD137B5003ACB00 /* teams_filled.png in Resources */, 61F7A43A11E290650040BA66 /* Icon-Small.png in Resources */, 61F7A43C11E290650040BA66 /* Icon.png in Resources */, F65724FE1B7E784700A86262 /* helpbottom.png in Resources */, 61F7A43E11E290650040BA66 /* iTunesArtwork.png in Resources */, + F60D04811BD137B5003ACB00 /* heart.png in Resources */, F65E1DC11B9B95A400A78ADF /* Icon-76@2x.png in Resources */, 6129B9F711EFB04D0017E305 /* denied.png in Resources */, 61F2E7CF1205EDE0005734F7 /* AboutViewController.xib in Resources */, + F60D047C1BD137B5003ACB00 /* flower_filled@2x.png in Resources */, 61F2E7EC12060E31005734F7 /* checkbox.png in Resources */, + F60D04821BD137B5003ACB00 /* heart@2x.png in Resources */, 615AD96212073B4D00F2FF04 /* startGameButton.png in Resources */, + F60D048A1BD137B5003ACB00 /* teams@2x.png in Resources */, F6D7E09F1B76884E004F3BCF /* Default-568h@2x.png in Resources */, + F60D047E1BD137B5003ACB00 /* flower@2x.png in Resources */, + F60D04841BD137B5003ACB00 /* target_filled@2x.png in Resources */, 615AD9E9120764CA00F2FF04 /* backButton.png in Resources */, 615AD9EB1207654E00F2FF04 /* helpButton.png in Resources */, + F60D04891BD137B5003ACB00 /* teams.png in Resources */, 611EE974122A9C4100DF6938 /* clickSound.caf in Resources */, 611EE9DA122AA10A00DF6938 /* selSound.caf in Resources */, 6199E86D12464A8E00DADF8C /* surprise.png in Resources */, @@ -1537,8 +1656,12 @@ 6172FEEF1298D25D00D73365 /* mediumBackground~ipad.png in Resources */, F65E1DBF1B9B95A400A78ADF /* Icon-60@2x.png in Resources */, 6172FEF11298D25D00D73365 /* smallerBackground~ipad.png in Resources */, + F60D047A1BD137B5003ACB00 /* bullet@2x.png in Resources */, + F60D04861BD137B5003ACB00 /* target@2x.png in Resources */, 6172FEF21298D25D00D73365 /* smallerBackground~iphone.png in Resources */, 61889985129995B500D55FD6 /* title~ipad.png in Resources */, + F60D047D1BD137B5003ACB00 /* flower.png in Resources */, + F60D04801BD137B5003ACB00 /* heart_filled@2x.png in Resources */, 615FEAE212A2A6640098EE92 /* localplayButton~ipad.png in Resources */, 615FEAE312A2A6640098EE92 /* localplayButton~iphone.png in Resources */, F65725001B7E784700A86262 /* helpplain.png in Resources */, @@ -1546,6 +1669,9 @@ 61188BF812A6FE5C0026C5DA /* background@2x~iphone.png in Resources */, 61188BF912A6FE5D0026C5DA /* checkbox@2x.png in Resources */, 61188BFB12A6FE610026C5DA /* Default-ipad-Landscape.png in Resources */, + F60D047B1BD137B5003ACB00 /* flower_filled.png in Resources */, + F60D04771BD137B5003ACB00 /* bullet_filled.png in Resources */, + F60D04881BD137B5003ACB00 /* teams_filled@2x.png in Resources */, 61188BFC12A6FE630026C5DA /* Default@2x.png in Resources */, 61188BFD12A6FE730026C5DA /* fb@2x.png in Resources */, 61188BFE12A6FE7C0026C5DA /* irc@2x.png in Resources */, @@ -1554,6 +1680,7 @@ 61188C0412A6FE880026C5DA /* savesButton@2x.png in Resources */, 61188C0512A6FE8F0026C5DA /* Data in Resources */, 61188C0612A6FE950026C5DA /* smallerBackground@2x~iphone.png in Resources */, + F67FC8161BEC17AC00A9DC75 /* Appirater.bundle in Resources */, F65724FD1B7E784700A86262 /* helpabove.png in Resources */, F6F07BDE1B7E72D40010E48F /* HelpPageLobbyViewController-iPad.xib in Resources */, 61188C0712A6FE960026C5DA /* settingsButton@2x.png in Resources */, @@ -1573,12 +1700,15 @@ 6167C8F81429502C003DD50F /* robotBadge@2x.png in Resources */, 6167C8F91429502C003DD50F /* star.png in Resources */, 6167C8FA1429502C003DD50F /* star@2x.png in Resources */, + F60D047F1BD137B5003ACB00 /* heart_filled.png in Resources */, + F60D04831BD137B5003ACB00 /* target_filled.png in Resources */, 6167CA37142A6ED7003DD50F /* bot0.png in Resources */, 6167CA38142A6ED7003DD50F /* bot0@2x.png in Resources */, 6167CA39142A6ED7003DD50F /* bot1.png in Resources */, 6167CA3A142A6ED7003DD50F /* bot1@2x.png in Resources */, 6167CA3B142A6ED7003DD50F /* bot2.png in Resources */, 6167CA3C142A6ED7003DD50F /* bot2@2x.png in Resources */, + F60D04851BD137B5003ACB00 /* target.png in Resources */, 6167CA3D142A6ED7003DD50F /* bot3.png in Resources */, 6167CA3E142A6ED7003DD50F /* bot3@2x.png in Resources */, 6167CA3F142A6ED7003DD50F /* bot4.png in Resources */, @@ -1630,7 +1760,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "SOURCE_DIR=${PROJECT_DIR}/../../\n\n#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\n\necho \"Copying Data...\"\ncp -R ${SOURCE_DIR}/share/hedgewars/Data ${PROJECT_DIR}/Data\n\n#copy some other files\necho \"Fetching additional graphics...\"\nmkdir -p ${PROJECT_DIR}/Data/Graphics/Icons\ncp ${SOURCE_DIR}/QTfrontend/res/{btn*,icon*,StatsMedal*,ammopic*}.png ${PROJECT_DIR}/Data/Graphics/Icons/\ncp -R ${SOURCE_DIR}/project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons ${PROJECT_DIR}/Data/Graphics/\n\necho \"Removing text and dummy files...\"\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg* -delete\nfind ${PROJECT_DIR}/Data -name *.psd -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\nfind ${PROJECT_DIR}/Data -name *.orig -delete\nfind ${PROJECT_DIR}/Data -name *.ts -delete\n\n#delete dummy maps and hats, misc stuff\nrm -rf ${PROJECT_DIR}/Data/Maps/test*\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/{TeamCap,TeamHeadband,TeamHair}\nrm -rf ${PROJECT_DIR}/Data/misc/\n\n#delete forbidden maps and WIP themes (remember to check that no Map uses them)\nrm -rf ${PROJECT_DIR}/Data/Maps/{Cheese,FlightJoust}\nrm -rf ${PROJECT_DIR}/Data/Themes/{Beach,Digital}\n\n#delete all names, reserved hats and unused fonts\nrm -rf ${PROJECT_DIR}/Data/Names/\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/\nrm -rf ${PROJECT_DIR}/Data/Fonts/{wqy-zenhei.ttc,DroidSansFallback.ttf}\n\necho \"Handling audio files...\"\n#copy mono audio\ncp -R ${SOURCE_DIR}/project_files/AudioMono/* ${PROJECT_DIR}/Data/\n#delete the Classic voice\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/Classic\n#delete the main theme file\nrm -rf ${PROJECT_DIR}/Data/Music/main_theme.ogg\n\n#remove unused voices\nfor i in {Amazing,Brilliant,Bugger,Bungee,Cutitout,Drat,Excellent,Fire,FlawlessPossibility,Gonnagetyou,Grenade,Hmm,Justyouwait,Leavemealone,Ohdear,Ouch,Perfect,Revenge,Runaway,Solong,Thisoneismine,VictoryPossibility,Watchthis,Whatthe,Whoopsee}; do find Data/Sounds/voices/ -name $i.ogg -delete; done\n\necho \"Tweaking Data contents...\"\n#move Lua maps in Missions\nmkdir ${PROJECT_DIR}/Data/Missions/Maps/\nfor i in `ls ${PROJECT_DIR}/Data/Maps/`;\ndo \n if [[ `ls -f ${PROJECT_DIR}/Data/Maps/$i/map.lua 2> /dev/null` != '' ]];\n then\n mv ${PROJECT_DIR}/Data/Maps/$i ${PROJECT_DIR}/Data/Missions/Maps/;\n fi;\ndone;\n\n#workaround for missing map in CTF_Blizzard\nln -s ../../../Maps/Blizzard/map.png ${PROJECT_DIR}/Data/Missions/Maps/CTF_Blizzard/map.png\n\n#reduce the number of flakes for City\nsed -i -e 's/1500/50/' ${PROJECT_DIR}/Data/Themes/City/theme.cfg\n\necho \"Done\""; + shellScript = "SOURCE_DIR=${PROJECT_DIR}/../../\n\n#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\n\necho \"Copying Data...\"\ncp -R ${SOURCE_DIR}/share/hedgewars/Data ${PROJECT_DIR}/Data\n\n#copy some other files\necho \"Fetching additional graphics...\"\nmkdir -p ${PROJECT_DIR}/Data/Graphics/Icons\ncp ${SOURCE_DIR}/QTfrontend/res/{btn*,icon*,StatsMedal*,ammopic*}.png ${PROJECT_DIR}/Data/Graphics/Icons/\ncp -R ${SOURCE_DIR}/project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons ${PROJECT_DIR}/Data/Graphics/\n\necho \"Removing text and dummy files...\"\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg* -delete\nfind ${PROJECT_DIR}/Data -name *.psd -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\nfind ${PROJECT_DIR}/Data -name *.orig -delete\nfind ${PROJECT_DIR}/Data -name *.ts -delete\n\n#delete all CMake generated files\nfind ${PROJECT_DIR}/Data -name CMakeFiles -type d -exec rm -r {} +\nfind ${PROJECT_DIR}/Data -name Makefile -delete\nfind ${PROJECT_DIR}/Data -name *.cmake -delete\n\n#delete dummy maps and hats, misc stuff\nrm -rf ${PROJECT_DIR}/Data/Maps/test*\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/{TeamCap,TeamHeadband,TeamHair}\nrm -rf ${PROJECT_DIR}/Data/misc/\n\n#delete forbidden maps and WIP themes (remember to check that no Map uses them)\nrm -rf ${PROJECT_DIR}/Data/Maps/{FlightJoust,ClimbHome}\nrm -rf ${PROJECT_DIR}/Data/Themes/{Beach,Digital}\n\n#delete all names, reserved hats and unused fonts\nrm -rf ${PROJECT_DIR}/Data/Names/\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/\nrm -rf ${PROJECT_DIR}/Data/Fonts/{wqy-zenhei.ttc,DroidSansFallback.ttf}\n\necho \"Handling audio files...\"\n#delete the Classic voice\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/Classic\n#delete the main theme file\nrm -rf ${PROJECT_DIR}/Data/Music/main_theme.ogg\n\n#remove unused voices\nfor i in {Amazing,Brilliant,Bugger,Bungee,Cutitout,Drat,Excellent,Fire,FlawlessPossibility,Gonnagetyou,Grenade,Hmm,Leavemealone,Ohdear,Ouch,Perfect,Revenge,Runaway,Solong,Thisoneismine,VictoryPossibility,Watchthis,Whatthe,Whoopsee}; do find Data/Sounds/voices/ -name $i.ogg -delete; done\n\necho \"Tweaking Data contents...\"\n#move Lua maps in Missions\nmkdir ${PROJECT_DIR}/Data/Missions/Maps/\nfor i in `ls ${PROJECT_DIR}/Data/Maps/`;\ndo \n if [[ `ls -f ${PROJECT_DIR}/Data/Maps/$i/map.lua 2> /dev/null` != '' ]];\n then\n mv ${PROJECT_DIR}/Data/Maps/$i ${PROJECT_DIR}/Data/Missions/Maps/;\n fi;\ndone;\n\n#workaround for missing map in CTF_Blizzard\nln -s ../../../Maps/Blizzard/map.png ${PROJECT_DIR}/Data/Missions/Maps/CTF_Blizzard/map.png\n\n#reduce the number of flakes for City\nsed -i -e 's/1500/50/' ${PROJECT_DIR}/Data/Themes/City/theme.cfg\n\necho \"Done\""; }; 61806B78170B83EA00C601BC /* config.inc */ = { isa = PBXShellScriptBuildPhase; @@ -1676,7 +1806,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Compile Pascal Sources\n# 15sep06,ejo written.\n# 26 April 2007 - Jonas Maebe\n# * support for ppc64 and x86_64\n# * don't run when cleaning (in case running scripts when cleaning is ever fixed by Apple)\n# * split the options in FPC_COMMON_FLAGS (common to all configurations) and FPC_CFG_SPECIFIC_FLAGS (per configuration)\n# 4 January 2009 - Jonas Maebe\n# * support for ARM\n# 24 October 2009 - Jonas Maebe\n# * don't hardcode 2.3.1 in some cases anymore\n# 13 December 2009 (Jonas Maebe)\n# * use new FPC_COMPILER_BINARY_DIR setting to make it easier to change the used FPC version\n\nif [ x\"$ACTION\" != \"xbuild\" ]; then\n # in case running scripts during cleaning gets fixed\n exit 0\nfi\n\nif test ! -e \"$FPC_MAIN_FILE\"\nthen\n\techo error: FPC_MAIN_FILE not found \\($FPC_MAIN_FILE\\)\n\texit 2\nfi\n\nfor variant in $BUILD_VARIANTS\ndo\n\tfor arch in $ARCHS\n\tdo\n\t\ttargetos=darwin;\n\t\tcase $arch in\n arm64) fpc_arch=rossa64; fpc_rtl=aarch64 ;;\n armv7) fpc_arch=rossarm; fpc_rtl=arm ;;\n x86_64) fpc_arch=x64; fpc_rtl=x86_64; targetos=iphonesim ;;\n#\t\t\tppc) fpc_arch=ppc; fpc_rtl=powerpc ;;\n#\t\t\ti386) fpc_arch=386; fpc_rtl=i386; targetos=iphonesim ;;\n#\t\t\tppc64) fpc_arch=ppc64; fpc_rtl=powerpc64 ;;\n#\t\t\tx86_64) fpc_arch=x64; fpc_rtl=x86_64 ;;\n#\t\t\tarm*) fpc_arch=arm; fpc_rtl=arm ;;\n\t\t\t*) continue\n\t\tesac\n\n\t\tapp_target_temp_dir=$CONFIGURATION_TEMP_DIR/`basename \"$PROJECT_TEMP_DIR\"`\n\t\tout_dir=$app_target_temp_dir/`basename \"$DERIVED_SOURCES_DIR\"`-$variant/$arch\n\t\tfpccompiler=\"${FPC_COMPILER_BINARY_DIR}/ppc${fpc_arch}\"\n\t\tif test -e \"$fpccompiler\"\n\t\tthen\n\t\t\tfpcversion=`\"$fpccompiler\" -iV`\n\t\t\tmainunitdir=\"$FPC_RTL_UNITS_BASE/$fpcversion/units/${fpc_rtl}-${targetos}/\"\n\t\t\tmkdir -p \"$out_dir\"\n\t\t\tcd \"$out_dir\"\n\t\t\techo \"Compiling to $out_dir\"\n\t\t\trm -f compilefailed\n\t\n\t\t\t# delete any ppu files for which the \".s\" file was somehow deleted (Xcode does that sometimes in case of errors),\n\t\t\t# so that FPC will recompile the unit\n\t\t\tfor file in *.ppu\n\t\t\tdo\n\t\t\t\tasmname=`basename \"$file\" ppu`s\n\t\t\t\tif [ ! -f \"$asmname\" ]; then\n\t\t\t\t\t# can fail in case there are no .ppu files, since then it will try to erase the file with name '*.ppu'\n\t\t\t\t\t# -> use -f so it won't give an error message\n\t\t\t\t\trm -f \"$file\"\n\t\t\t\tfi\n\t\t\tdone\n\n\t\t\techo $fpccompiler -n -l -viwn -a -s -vbr -FE. $FPC_COMMON_OPTIONS $FPC_SPECIFIC_OPTIONS '\\' >ppccmd.sh\n\t\t\techo -Fi\\\"`dirname \"$FPC_MAIN_FILE\"`\\\" '\\' >>ppccmd.sh\n\t\t\techo -Fu\"$mainunitdir/*\" -Fu\"$mainunitdir/rtl\" '\\' >>ppccmd.sh\n\t\t\t# allow FPC_UNIT_PATHS to override default search directory\n\t\t\techo $FPC_UNIT_PATHS '\\' >>ppccmd.sh\n\t\t\techo \\\"$FPC_MAIN_FILE\\\" >>ppccmd.sh\n\t\t\t# cat ppccmd.sh\n\n\t\t\t/bin/sh ppccmd.sh\n\t\t\tif [ $? != 0 ]; then\n\t\t\t\ttouch \"$out_dir\"/compilefailed\n\t\t\t\texit 1\n\t\t\tfi\n\t\telse\n\t\t\ttouch \"$out_dir\"/compilefailed\n\t\t\techo $FPC_MAIN_FILE:1: error: 1: can\\'t compile for $arch \\(ppc${fpc_arch} not found\\)\n\t\t\texit 2\n\t\tfi\n\tdone\ndone\n"; + shellScript = "# Compile Pascal Sources\n# 15sep06,ejo written.\n# 26 April 2007 - Jonas Maebe\n# * support for ppc64 and x86_64\n# * don't run when cleaning (in case running scripts when cleaning is ever fixed by Apple) (removed)\n# * split the options in FPC_COMMON_FLAGS (common to all configurations) and FPC_CFG_SPECIFIC_FLAGS (per configuration)\n# 4 January 2009 - Jonas Maebe\n# * support for ARM\n# 24 October 2009 - Jonas Maebe\n# * don't hardcode 2.3.1 in some cases anymore\n# 13 December 2009 (Jonas Maebe)\n# * use new FPC_COMPILER_BINARY_DIR setting to make it easier to change the used FPC version\n\nif test ! -e \"$FPC_MAIN_FILE\"\nthen\n\techo error: FPC_MAIN_FILE not found \\($FPC_MAIN_FILE\\)\n\texit 2\nfi\n\nfor variant in $BUILD_VARIANTS\ndo\n\tfor arch in $ARCHS\n\tdo\n\t\ttargetos=darwin;\n\t\tcase $arch in\n arm64) fpc_arch=rossa64; fpc_rtl=aarch64 ;;\n armv7) fpc_arch=rossarm; fpc_rtl=arm ;;\n x86_64) fpc_arch=x64; fpc_rtl=x86_64; targetos=iphonesim ;;\n#\t\t\tppc) fpc_arch=ppc; fpc_rtl=powerpc ;;\n#\t\t\ti386) fpc_arch=386; fpc_rtl=i386; targetos=iphonesim ;;\n#\t\t\tppc64) fpc_arch=ppc64; fpc_rtl=powerpc64 ;;\n#\t\t\tx86_64) fpc_arch=x64; fpc_rtl=x86_64 ;;\n#\t\t\tarm*) fpc_arch=arm; fpc_rtl=arm ;;\n\t\t\t*) continue\n\t\tesac\n\n\t\tapp_target_temp_dir=$CONFIGURATION_TEMP_DIR/`basename \"$PROJECT_TEMP_DIR\"`\n\t\tout_dir=$app_target_temp_dir/`basename \"$DERIVED_SOURCES_DIR\"`-$variant/$arch\n\t\tfpccompiler=\"${FPC_COMPILER_BINARY_DIR}/ppc${fpc_arch}\"\n\t\tif test -e \"$fpccompiler\"\n\t\tthen\n\t\t\tfpcversion=`\"$fpccompiler\" -iV`\n\t\t\tmainunitdir=\"$FPC_RTL_UNITS_BASE/$fpcversion/units/${fpc_rtl}-${targetos}/\"\n\t\t\tmkdir -p \"$out_dir\"\n\t\t\tcd \"$out_dir\"\n\t\t\techo \"Compiling to $out_dir\"\n\t\t\trm -f compilefailed\n\t\n\t\t\t# delete any ppu files for which the \".s\" file was somehow deleted (Xcode does that sometimes in case of errors),\n\t\t\t# so that FPC will recompile the unit\n\t\t\tfor file in *.ppu\n\t\t\tdo\n\t\t\t\tasmname=`basename \"$file\" ppu`s\n\t\t\t\tif [ ! -f \"$asmname\" ]; then\n\t\t\t\t\t# can fail in case there are no .ppu files, since then it will try to erase the file with name '*.ppu'\n\t\t\t\t\t# -> use -f so it won't give an error message\n\t\t\t\t\trm -f \"$file\"\n\t\t\t\tfi\n\t\t\tdone\n\n\t\t\techo $fpccompiler -n -l -viwn -a -s -vbr -FE. $FPC_COMMON_OPTIONS $FPC_SPECIFIC_OPTIONS '\\' >ppccmd.sh\n\t\t\techo -Fi\\\"`dirname \"$FPC_MAIN_FILE\"`\\\" '\\' >>ppccmd.sh\n\t\t\techo -Fu\"$mainunitdir/*\" -Fu\"$mainunitdir/rtl\" '\\' >>ppccmd.sh\n\t\t\t# allow FPC_UNIT_PATHS to override default search directory\n\t\t\techo $FPC_UNIT_PATHS '\\' >>ppccmd.sh\n\t\t\techo \\\"$FPC_MAIN_FILE\\\" >>ppccmd.sh\n\t\t\t# cat ppccmd.sh\n\n\t\t\t/bin/sh ppccmd.sh\n\t\t\tif [ $? != 0 ]; then\n\t\t\t\ttouch \"$out_dir\"/compilefailed\n\t\t\t\texit 1\n\t\t\tfi\n\t\telse\n\t\t\ttouch \"$out_dir\"/compilefailed\n\t\t\techo $FPC_MAIN_FILE:1: error: 1: can\\'t compile for $arch \\(ppc${fpc_arch} not found\\)\n\t\t\texit 2\n\t\tfi\n\tdone\ndone\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -1692,6 +1822,7 @@ 61798820114AA34C00BA94A9 /* uAIActions.pas in Sources */, 61798821114AA34C00BA94A9 /* uAIAmmoTests.pas in Sources */, 61798822114AA34C00BA94A9 /* uAIMisc.pas in Sources */, + F6BA38461BA7A834005D16EA /* GameLogViewController.m in Sources */, 61798823114AA34C00BA94A9 /* uAmmos.pas in Sources */, 61798824114AA34C00BA94A9 /* uChat.pas in Sources */, 61798825114AA34C00BA94A9 /* uCollisions.pas in Sources */, @@ -1704,6 +1835,7 @@ 6179882D114AA34C00BA94A9 /* uLand.pas in Sources */, 6179882E114AA34C00BA94A9 /* uLandGraphics.pas in Sources */, 6179882F114AA34C00BA94A9 /* uLandObjects.pas in Sources */, + F6756D801BD8550500B6AB6B /* LabelWithIBLocalization.m in Sources */, 61798830114AA34C00BA94A9 /* uLandTemplates.pas in Sources */, F6D7E0C31B768F19004F3BCF /* uLandGenTemplateBased.pas in Sources */, 61798831114AA34C00BA94A9 /* uLandTexture.pas in Sources */, @@ -1732,7 +1864,6 @@ 6165921B11CA9BA200D6E256 /* SchemeWeaponConfigViewController.m in Sources */, 6165921C11CA9BA200D6E256 /* SingleSchemeViewController.m in Sources */, 6165921D11CA9BA200D6E256 /* SingleTeamViewController.m in Sources */, - 6165921E11CA9BA200D6E256 /* SettingsContainerViewController.m in Sources */, 6165921F11CA9BA200D6E256 /* TeamConfigViewController.m in Sources */, 6165922011CA9BA200D6E256 /* TeamSettingsViewController.m in Sources */, 6165922111CA9BA200D6E256 /* VoicesViewController.m in Sources */, @@ -1755,10 +1886,12 @@ 61006F95128DE31F00EBA7F7 /* CreationChamber.m in Sources */, 61A4A39412A5CCC2004D81E6 /* uCommandHandlers.pas in Sources */, 61A4A39512A5CCC2004D81E6 /* uCommands.pas in Sources */, + F6448CE31BD2E00500C31C8C /* TableViewControllerWithDoneButton.m in Sources */, 61A4A39612A5CCC2004D81E6 /* uDebug.pas in Sources */, 61A4A39712A5CCC2004D81E6 /* uGearsRender.pas in Sources */, 61A4A39812A5CCC2004D81E6 /* uRender.pas in Sources */, 61A4A39912A5CCC2004D81E6 /* uRenderUtils.pas in Sources */, + F6F7DA8F1BE18F5700432EA7 /* UITableViewCell+FindTable.m in Sources */, 61A4A39A12A5CCC2004D81E6 /* uSinTable.pas in Sources */, 61A4A39B12A5CCC2004D81E6 /* uTextures.pas in Sources */, 61A4A39C12A5CCC2004D81E6 /* uTypes.pas in Sources */, @@ -1767,12 +1900,12 @@ 61A4A3A212A5CD56004D81E6 /* uCaptions.pas in Sources */, 61E5D68D12AB006F00566F29 /* uLandPainted.pas in Sources */, 61F544C712AF1748007FD913 /* HoldTableViewCell.m in Sources */, - 61AC067412B2E32D000B52A2 /* Appirater.m in Sources */, 61E2E12E12BAAEE30051B659 /* ServerProtocolNetwork.m in Sources */, 61B7A33812CC21080086B604 /* StatsPageViewController.m in Sources */, F6D7E0C41B768F19004F3BCF /* uLandUtils.pas in Sources */, 61EDB5B0135B3F97009B29A6 /* GameInterfaceBridge.m in Sources */, 61A976B3136F668500DD9878 /* uCursor.pas in Sources */, + F67FC8121BEC06E700A9DC75 /* Appirater.m in Sources */, 6167A6761391514600AA6D07 /* RestoreViewController.m in Sources */, 61C28D3F142D380400DA16C2 /* AudioManagerController.m in Sources */, 611D7A50142FDCD3006E0798 /* uTouch.pas in Sources */, @@ -1868,6 +2001,7 @@ 61C6783F14B3DD020087425A /* Portuguese */, 6154A53114C37E4A00F6EEF6 /* Romanian */, F65725291B7EB9CC00A86262 /* ru */, + F67FC81F1BEC280D00A9DC75 /* tr */, ); name = About.strings; sourceTree = ""; @@ -1887,6 +2021,7 @@ 61C6784B14B3DD0B0087425A /* Portuguese */, 6154A53E14C37E5400F6EEF6 /* Romanian */, F657252A1B7EB9CC00A86262 /* ru */, + F67FC8201BEC280D00A9DC75 /* tr */, ); name = Localizable.strings; sourceTree = ""; @@ -1906,6 +2041,7 @@ 61C6784C14B3DD140087425A /* Portuguese */, 6154A54014C37EB100F6EEF6 /* Romanian */, F657252B1B7EB9CC00A86262 /* ru */, + F67FC8211BEC280D00A9DC75 /* tr */, ); name = Scheme.strings; sourceTree = ""; @@ -1916,24 +2052,32 @@ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_DYNAMIC_NO_PIC = NO; GCC_GENERATE_TEST_COVERAGE_FILES = YES; GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Hedgewars_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = org.hedgewars.mobile; PRODUCT_NAME = Hedgewars; + PROVISIONING_PROFILE = ""; }; name = Debug; }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Hedgewars_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = org.hedgewars.mobile; PRODUCT_NAME = Hedgewars; + PROVISIONING_PROFILE = ""; }; name = Release; }; @@ -1952,12 +2096,13 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; FPC_COMMON_OPTIONS = "-l- -dIPHONEOS -Cs2000000 -B -vwi -Sgix -Fi${PROJECT_DIR}"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.1.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; FPC_RTL_UNITS_BASE = /usr/local/lib/fpc; - FPC_SPECIFIC_OPTIONS = "-Ci- -Cr- -Co- -Os -Xs -dNOCONSOLE"; + FPC_SPECIFIC_OPTIONS = "-Ci- -Cr- -Co- -O2 -Xs -dNOCONSOLE"; FPC_UNITS_PATH = "-Fu\"$(PROJECT_DIR)\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DEBUGGING_SYMBOLS = default; @@ -1967,7 +2112,6 @@ GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_STRICT_ALIASING = YES; - GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; @@ -1993,14 +2137,11 @@ "\"$(SRCROOT)/../../../Library/SDL_net/\"", "\"$(SRCROOT)/../../../Library/SDL_mixer/\"", ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LLVM_LTO = NO; ONLY_ACTIVE_ARCH = NO; OTHER_CODE_SIGN_FLAGS = ""; - OTHER_LDFLAGS = ( - "-lz", - "-Wl,-no_order_inits", - ); + OTHER_LDFLAGS = "-lz"; PREBINDING = NO; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; @@ -2020,11 +2161,15 @@ 61022D7D12305A2800B08935 /* Distro AppStore */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Hedgewars_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = org.hedgewars.mobile; PRODUCT_NAME = Hedgewars; + PROVISIONING_PROFILE = ""; }; name = "Distro AppStore"; }; @@ -2068,6 +2213,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; FPC_COMMON_OPTIONS = "-l- -dIPHONEOS -Cs2000000 -B -vwi -Sgix -Fi${PROJECT_DIR}"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.1.1; @@ -2077,13 +2223,12 @@ FPC_UNITS_PATH = "-Fu\"$(PROJECT_DIR)\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DEBUGGING_SYMBOLS = full; - GCC_DYNAMIC_NO_PIC = YES; + GCC_DYNAMIC_NO_PIC = NO; GCC_FAST_MATH = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; GCC_STRICT_ALIASING = YES; - GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; @@ -2109,11 +2254,12 @@ "\"$(SRCROOT)/../../../Library/SDL_net/\"", "\"$(SRCROOT)/../../../Library/SDL_mixer/\"", ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ( "-lz", - "-Wl,-no_order_inits", + "-framework", + MessageUI, ); PREBINDING = NO; PROVISIONING_PROFILE = ""; @@ -2134,11 +2280,15 @@ 6137064C117B1CB3004EE44A /* Distro Adhoc */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Hedgewars_Prefix.pch; INFOPLIST_FILE = Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = org.hedgewars.mobile; PRODUCT_NAME = Hedgewars; + PROVISIONING_PROFILE = ""; }; name = "Distro Adhoc"; }; @@ -2227,7 +2377,9 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; FPC_COMMON_OPTIONS = "-l- -dIPHONEOS -Cs2000000 -B -vwi -Sgix -Fi${PROJECT_DIR}"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.1.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; @@ -2242,7 +2394,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; GCC_STRICT_ALIASING = YES; - GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; @@ -2268,11 +2419,12 @@ "\"$(SRCROOT)/../../../Library/SDL_net/\"", "\"$(SRCROOT)/../../../Library/SDL_mixer/\"", ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "-lz", - "-Wl,-no_order_inits", + "-framework", + MessageUI, ); PREBINDING = NO; PROVISIONING_PROFILE = ""; @@ -2306,12 +2458,13 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; FPC_COMMON_OPTIONS = "-l- -dIPHONEOS -Cs2000000 -B -vwi -Sgix -Fi${PROJECT_DIR}"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.1.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; FPC_RTL_UNITS_BASE = /usr/local/lib/fpc; - FPC_SPECIFIC_OPTIONS = "-Ci- -Cr- -Co- -Os -Xs -dDEBUGFILE"; + FPC_SPECIFIC_OPTIONS = "-Ci- -Cr- -Co- -O2 -Xs -dDEBUGFILE"; FPC_UNITS_PATH = "-Fu\"$(PROJECT_DIR)\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DEBUGGING_SYMBOLS = default; @@ -2321,7 +2474,6 @@ GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; GCC_STRICT_ALIASING = YES; - GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; @@ -2347,12 +2499,13 @@ "\"$(SRCROOT)/../../../Library/SDL_net/\"", "\"$(SRCROOT)/../../../Library/SDL_mixer/\"", ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LLVM_LTO = NO; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ( "-lz", - "-Wl,-no_order_inits", + "-framework", + MessageUI, ); PREBINDING = NO; PROVISIONING_PROFILE = ""; diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Info.plist --- a/project_files/HedgewarsMobile/Info.plist Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Info.plist Mon Nov 09 16:34:03 2015 +0000 @@ -21,7 +21,7 @@ Icon-76@2x.png CFBundleIdentifier - com.AC27.Hedgewars + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -40,6 +40,8 @@ Default-ipad UIPrerenderedIcon + UIRequiresFullScreen + UIStatusBarHidden UISupportedInterfaceOrientations~ipad diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/English.lproj/About.strings Binary file project_files/HedgewarsMobile/Locale/English.lproj/About.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/English.lproj/Localizable.strings Binary file project_files/HedgewarsMobile/Locale/English.lproj/Localizable.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/English.lproj/Scheme.strings Binary file project_files/HedgewarsMobile/Locale/English.lproj/Scheme.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/ru.lproj/About.strings Binary file project_files/HedgewarsMobile/Locale/ru.lproj/About.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/ru.lproj/Localizable.strings Binary file project_files/HedgewarsMobile/Locale/ru.lproj/Localizable.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/ru.lproj/Scheme.strings Binary file project_files/HedgewarsMobile/Locale/ru.lproj/Scheme.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/tr.lproj/About.strings Binary file project_files/HedgewarsMobile/Locale/tr.lproj/About.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/tr.lproj/Localizable.strings Binary file project_files/HedgewarsMobile/Locale/tr.lproj/Localizable.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Locale/tr.lproj/Scheme.strings Binary file project_files/HedgewarsMobile/Locale/tr.lproj/Scheme.strings has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/bullet.png Binary file project_files/HedgewarsMobile/Resources/Icons/bullet.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/bullet@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/bullet@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/bullet_filled.png Binary file project_files/HedgewarsMobile/Resources/Icons/bullet_filled.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/bullet_filled@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/bullet_filled@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/flower.png Binary file project_files/HedgewarsMobile/Resources/Icons/flower.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/flower@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/flower@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/flower_filled.png Binary file project_files/HedgewarsMobile/Resources/Icons/flower_filled.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/flower_filled@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/flower_filled@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/heart.png Binary file project_files/HedgewarsMobile/Resources/Icons/heart.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/heart@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/heart@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/heart_filled.png Binary file project_files/HedgewarsMobile/Resources/Icons/heart_filled.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/heart_filled@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/heart_filled@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/target.png Binary file project_files/HedgewarsMobile/Resources/Icons/target.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/target@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/target@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/target_filled.png Binary file project_files/HedgewarsMobile/Resources/Icons/target_filled.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/target_filled@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/target_filled@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/teams.png Binary file project_files/HedgewarsMobile/Resources/Icons/teams.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/teams@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/teams@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/teams_filled.png Binary file project_files/HedgewarsMobile/Resources/Icons/teams_filled.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/Icons/teams_filled@2x.png Binary file project_files/HedgewarsMobile/Resources/Icons/teams_filled@2x.png has changed diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/basicFlags.plist --- a/project_files/HedgewarsMobile/Resources/basicFlags.plist Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Resources/basicFlags.plist Mon Nov 09 16:34:03 2015 +0000 @@ -266,5 +266,41 @@ title Get Away Time (%) + + checkOverMax + + times1000 + + command + e$airmines + default + 0 + image + Mine + max + 80 + min + 0 + title + Air Mines + + + checkOverMax + + times1000 + + command + e$worldedge + default + 0 + image + Earth + max + 3 + min + 0 + title + World Edge + diff -r 5438a3907d59 -r 91370591662b project_files/HedgewarsMobile/Resources/credits.plist --- a/project_files/HedgewarsMobile/Resources/credits.plist Tue Oct 06 13:28:11 2015 +0200 +++ b/project_files/HedgewarsMobile/Resources/credits.plist Mon Nov 09 16:34:03 2015 +0000 @@ -3,9 +3,9 @@ - Andrey "UnC0Rr" Korotaev + Andrey "unC0Rr" Korotaev Igor "Displacer" Ulyanov - Derek "Nemo" Pomery + Derek "nemo" Pomery Martin "Affect" Boze David "Krawek" Cuadrado Martin "Ttsmj" Minarik @@ -13,12 +13,20 @@ Vittorio "Koda" Giovara Mario "Smaxx" Liebisch Carlos "Palewolf" Vives - Richard "Sheepluva" Korlyi + Richard "sheepluva" Karolyi Henning "Prg" Kühn Henrik "Henek" Rostedt - John "Mikade" Lambert + John "mikade" Lambert Mayur "Zorg" Pawashe Richard "Xeli" Deurwaarder + Simeon Maxein + Meng Xiangyun + Stepan Podoskin + Szabolcs Orbàn + Drew Gottlieb + Ondrej Skopek + Julia Struchenko + Anton "antonc27" Malmygin John "Fizzy" Dum @@ -26,7 +34,8 @@ Stanko Tadić Julien Koesten Joshua O'Sullivan - Nils Luck + Nils Lück + Guillaume Englert Trey Perry @@ -42,16 +51,16 @@ Jie Luo Andrey Korotaev Nina Kuisma - Antoine Turmel - Peter Hüwe, Mario Liebisch, Richard Karolyi + Antoine Turmel, Clement Woitrain, Matisumi + Peter Hüwe, Mario Liebisch, Richard Karolyi, Wuzzy Talos Kriti - Luca Bonora, Marco Bresciani - Adam Etienne + Luca Bonora, Marco Bresciani, Gianfranco Costamagna + Adam Etienne, Marco Bresciani Anthony Bellew Lukas Urbonas Maciej Mroziński, Wojciech Latkowski, Piotr Mitana, Maciej Górny Fábio Canário - Andrey Korotaev + Andrey Korotaev, Vitaly Novichkov, Anton Malmygin Jose Riha Carlos Vives Niklas Grahn, Henrik Rostedt @@ -80,6 +89,14 @@ Lua game modes and missions Desktop frontend improvements Android port + Android netplay, portability abstraction + WebGL port, some pas2c and GLES2 work + Video recording + Campaign support, first campaign + Keybinds, feedback, maps and hats interfaces + Login dialogs, frontend improvements + Icegun weapon + Current developer of iPhone/iPad versions Main graphics @@ -88,6 +105,7 @@ + Some hats diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/CMakeLists.txt diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Locale/en.txt --- a/share/hedgewars/Data/Locale/en.txt Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Locale/en.txt Mon Nov 09 16:34:03 2015 +0000 @@ -86,6 +86,7 @@ 01:22=AFK mode 01:23=Auto Camera Off 01:24=Auto Camera On +01:25=Press the target button to mark the target ; Event messages ; Hog (%1) died diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Locale/missions_ru.txt --- a/share/hedgewars/Data/Locale/missions_ru.txt Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Locale/missions_ru.txt Mon Nov 09 16:34:03 2015 +0000 @@ -4,17 +4,23 @@ Basic_Training_-_Grenade.name=Базовое упражнение с гранатой Basic_Training_-_Grenade.desc="Запомни: выдерни чеку и бросай!" +Basic_Training_-_Cluster_Bomb.name=Базовое упражнение с касcетной бомбой +Basic_Training_-_Cluster_Bomb.desc="Кому-то нужен горячий душ!" + Basic_Training_-_Shotgun.name=Базовое упражнение с ружьём Basic_Training_-_Shotgun.desc="Стреляй, все вопросы потом!" Basic_Training_-_Sniper_Rifle.name=Базовое упражнение со снайперской винтовкой Basic_Training_-_Sniper_Rifle.desc="БАХ, в яблочко!" -User_Mission_-_Dangerous_Ducklings.name=Миссия: Dangerous Ducklings +Basic_Training_-_Rope.name=Базовое упражнение с верёвкой +Basic_Training_-_Rope.desc="Раскачивайся и цепляйся!" + +User_Mission_-_Dangerous_Ducklings.name=Миссия: Опасные Утята User_Mission_-_Dangerous_Ducklings.desc="Ну что, новобранцы! Пора на практике проверить, чему вы научились на базовых упражнениях!" User_Mission_-_Diver.name=Миссия: Ныряльщик -User_Mission_-_Diver.desc="This 'amphibious assault' thing is harder than it looks..." +User_Mission_-_Diver.desc="'Морской десант' это сложнее, чем кажется..." User_Mission_-_Teamwork.name=Миссия: Командная работа User_Mission_-_Teamwork.desc="Иногда любовь ранит." @@ -22,11 +28,56 @@ User_Mission_-_Spooky_Tree.name=Миссия: Зловещее дерево User_Mission_-_Spooky_Tree.desc="Здесь много ящиков. Конечно, я уверен, что эта птица не голодна." -User_Mission_-_Bamboo_Thicket.name=Миссия: Bamboo Thicket +User_Mission_-_Bamboo_Thicket.name=Миссия: Заросли Бамбука User_Mission_-_Bamboo_Thicket.desc="Смерть приходит сверху." -User_Mission_-_That_Sinking_Feeling.name=Миссия: That Sinking Feeling +User_Mission_-_That_Sinking_Feeling.name=Миссия: Дед Мазай и Ёжики User_Mission_-_That_Sinking_Feeling.desc="Вода быстро поднимается, а время ограничено. Многие пытались без успеха. Сможешь ли ты спасти всех?" User_Mission_-_Newton_and_the_Hammock.name=Миссия: Ньютон и гамак User_Mission_-_Newton_and_the_Hammock.desc="Ежата, запомните: Скорость тела остаётся постоянной, пока к нему не применяется внешняя сила!" + +User_Mission_-_The_Great_Escape.name=Миссия: Великий Побег +User_Mission_-_The_Great_Escape.desc="Вы думаете, клетка меня остановит!?" + +User_Mission_-_Rope_Knock_Challenge.name=Испытание: Толчок Верёвкой +User_Mission_-_Rope_Knock_Challenge.desc="Оглянись!" + +User_Mission_-_Nobody_Laugh.name=Миссия: Никто не смеётся +User_Mission_-_Nobody_Laugh.desc="Это не шутка ли." + +User_Mission_-_RCPlane_Challenge.name=Испытание: Радиоуправляемый самолёт +User_Mission_-_RCPlane_Challenge.desc="Чувствешь себя довольно уверенно, а, пилотишко?" + +portal.name=Миссия: Портальная головоломка +portal.desc="Используй портал для перемещения, используй его для убийства, используй его с осторожностью!" + +Target_Practice_-_Bazooka_easy.name=Учебная Стрельба: Базука (легко) +Target_Practice_-_Bazooka_easy.desc="Хорошо, солдат, взорви эти цели так быстро, как сможешь!" + +Target_Practice_-_Bazooka_hard.name=Учебная Стрельба: Базука (сложно) +Target_Practice_-_Bazooka_hard.desc="Сможешь ли ты попасть в цели даже если они далеко?" + +Target_Practice_-_Cluster_Bomb.name=Учебная Стрельба: Касcетная бомба +Target_Practice_-_Cluster_Bomb.desc="Кому-то нужен горячий душ!" + +Target_Practice_-_Shotgun.name=Учебная Стрельба: Дробовик +Target_Practice_-_Shotgun.desc="Сначала стреляй, потом спрашивай!" + +Target_Practice_-_Homing_Bee.name=Учебная Стрельба: Пчёлка +Target_Practice_-_Homing_Bee.desc="Использование пчёлки сложнее, чем может показаться на первый взгляд." + +Target_Practice_-_Grenade_easy.name=Учебная Стрельба: Граната (легко) +Target_Practice_-_Grenade_easy.desc="Разминочная тренировка для чистолюбивого гренадера." + +Target_Practice_-_Grenade_hard.name=Учебная Стрельба: Граната (сложно) +Target_Practice_-_Grenade_hard.desc="Это точно не для молокососов! Мы поместили цели в действительно труднодоступные места." + +Challenge_-_Speed_Shoppa_-_Hedgelove.name=Испытание: Shoppa Love +Challenge_-_Speed_Shoppa_-_Hedgelove.desc="Покажите вашу любовь к верёвке и соберите несколько ящиков на маленькой карте." + +Challenge_-_Speed_Shoppa_-_Ropes.name=Испытание: Верёвки и Ящики +Challenge_-_Speed_Shoppa_-_Ropes.desc="Возьмите вашу верёвку и соберите все ящики на этой средних размеров карте." + +Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Испытание: Покупатель это Король +Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Докажите, что вы настоящий король и соберите все ящики на этой огромной карте так быстро, как сможете." \ No newline at end of file diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Locale/ru.lua --- a/share/hedgewars/Data/Locale/ru.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Locale/ru.lua Mon Nov 09 16:34:03 2015 +0000 @@ -4,15 +4,18 @@ -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant --- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant + ["+1 to a Bottom Feeder for killing anyone"] = "+1 Аутсайдеру за убийство", -- Mutant + ["+1 to a Mutant for killing anyone"] = "+1 Мутанту за убийство", -- Mutant + ["-1 to anyone for a suicide"] = "-1 за самоубийство", -- Mutant + ["+2 for becoming a Mutant"] = "+2 за то, что стал Мутантом", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Бонус за аккуратность!", --- ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge --- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler + ["Above-average pilot"] = "Пилот выше среднего", -- User_Mission_-_RCPlane_Challenge + ["Accuracy Bonus!"] = "Бонус за точность!", + ["Accuracy bonus: +%d points"] = "Бонус за точность: +%d очков", -- Basic_Training_-_Sniper_Rifle + ["Ace"] = "Ас", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge + ["Achievement obtained: Lively Lifeguard"] = "Достижение получено: Живучий Спасатель", -- User_Mission_-_That_Sinking_Feeling + ["Achievement Unlocked"] = "Достижение Разблокировано", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler -- ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood -- ["???"] = "", -- A_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow @@ -24,22 +27,23 @@ -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow -- ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge + ["Aggressively removes enemy hedgehogs."] = "Агрессивно уничтожает вражеских ежей.", -- Construction_Mode + ["a Hedgewars challenge"] = "Hedgewars испытание", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge ["a Hedgewars mini-game"] = "Мини-игра в Hedgewars", -- Space_Invasion, The_Specialists --- ["a Hedgewars tag game"] = "", -- Mutant + ["a Hedgewars tag game"] = "Ролевая игра в Hedgewars", -- Mutant -- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Упражнение на точность", --Bazooka, Shotgun, SniperRifle --- ["Air Attack"] = "", -- Construction_Mode + ["Aiming practice"] = "Упражнение на точность", -- TargetPractice + ["Air Attack"] = "Воздушная атака", -- Construction_Mode -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode + ["Allows free teleportation between other nodes."] = "Позволяет телепортироваться между другими узлами.", -- Construction_Mode + ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "Позволяет размещать балки, батуты, мины, мины-липучки и бочки.", -- Construction_Mode -- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode + ["Allows the placement of weapons, utiliites, and health crates."] = "Позволяет размещать ящики с оружием, утилитами и аптечки.", -- Construction_Mode -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey --- ["All walls touched!"] = "", -- WxW + ["All walls touched!"] = "Все стены тронуты!", -- WxW -- ["Ammo"] = "", -- ["Ammo Depleted!"] = "", -- ["ammo extended!"] = "", @@ -62,51 +66,58 @@ -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW + ["a shoppa minigame"] = "shoppa мини-игра", -- WxW -- ["Asia"] = "", -- Continental_supplies -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab -- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW + ["Attack From Rope"] = "Атака с верёвки", -- WxW -- ["Australia"] = "", -- Continental_supplies --- ["Available points remaining: "] = "", + ["Available points remaining: "] = "Осталось точек для размещения: ", + ["Average pilot"] = "Средний Пилот", -- User_Mission_-_RCPlane_Challenge -- ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab -- ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united -- ["[Backspace]"] = "", -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab --- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode --- ["Bamboo Thicket"] = "", + ["Bad Guy"] = "Плохой", -- User_Mission_-_The_Great_Escape + ["badmad"] = "Злодеи", -- portal + ["Bad Team"] = "Злодеи", -- User_Mission_-_The_Great_Escape + ["Ballgun"] = "Шаромёт", -- Construction_Mode + ["Bamboo Thicket"] = "Заросли Бамбука", -- User_Mission_-_Bamboo_Thicket -- ["Barrel Eater!"] = "", -- ["Barrel Launcher"] = "", --- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode + ["Barrel Placement Mode"] = "Режим Размещения Бочек", -- Construction_Mode + ["Baseball Bat"] = "Бейсбольная бита", -- Construction_Mode -- ["Baseballbat"] = "", -- Continental_supplies --- ["Bat balls at your enemies and|push them into the sea!"] = "", --- ["Bat your opponents through the|baskets and out of the map!"] = "", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 - ["Bazooka Training"] = "Упражнение с базукой", + ["Bat balls at your enemies and|push them into the sea!"] = "Сбей своих соберников|бейсбольными мячами в воду!", + ["Bat your opponents through the|baskets and out of the map!"] = "Выбей своих соберников через корзину в воду!", + ["Bazooka"] = "Базука", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 + ["Bazooka Training"] = "Тренировка с базукой", -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen + ["Beginner"] = "Новичок", -- User_Mission_-_RCPlane_Challenge + ["Below-average pilot"] = "Пилот ниже среднего", -- User_Mission_-_RCPlane_Challenge -- ["Best laps per team: "] = "", --- ["Best Team Times: "] = "", + ["Best Team Times: "] = "ЛУЧШЕЕ ВРЕМЯ КОМАНДЫ: ", -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon --- ["Bio-Filter"] = "", -- Construction_Mode + ["Bio-Filter"] = "Био-Фильтр", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode + ["Birdy"] = "Птичка", -- Construction_Mode -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab -- ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow -- ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow --- ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy --- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings + ["Bloody Rookies"] = "Новобранцы", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree + ["Blowtorch"] = "Бур", -- Construction_Mode, Frenzy + ["Blue Team"] = "Синяя Команда", -- User_Mission_-_Dangerous_Ducklings + ["Bobo"] = "Бобо", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow ["BOOM!"] = "БАБАХ!", ["Boom!"] = "Бум!", -- ["Boss defeated!"] = "", -- ["Boss Slayer!"] = "", + ["BOTTOM FEEDER"] = "АУТСАЙДЕР", -- Mutant -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united @@ -114,8 +125,8 @@ -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab --- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode --- ["Build a track and race."] = "", + ["Build a fortress and destroy your enemy."] = "Постройте крепость и уничтожьте своего врага.", -- Construction_Mode + ["Build a track and race."] = "Постройте трек и гоняйте!", -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab @@ -125,64 +136,78 @@ -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal + ["Cake"] = "Торт", -- Construction_Mode -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy ["CAPTURE THE FLAG"] = "ЗАХВАТ ФЛАГА", --- ["Careless"] = "", + ["Careless"] = "Беспечный", -- ["Carol"] = "", -- A_Classic_Fairytale:family --- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge + ["Challenge"] = "Испытание", -- SpeedShoppa + ["CHALLENGE COMPLETE"] = "МИССИЯ ПРОЙДЕНА", -- User_Mission_-_RCPlane_Challenge + ["Challenge completed!"] = "Испытание пройдено!", -- SpeedShoppa + ["Challenge failed!"] = "Испытание провалено!", -- SpeedShoppa ["Change Weapon"] = "Сменить оружие", -- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity + ["Cheater"] = "Читер", -- User_Mission_-_RCPlane_Challenge -- ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow --- ["Cleaver"] = "", -- Construction_Mode + ["Cleaver"] = "Секач", -- Construction_Mode -- ["Cleaver Placement Mode"] = "", -- Construction_Mode -- ["Climber"] = "", -- ClimbHome -- ["Climb Home"] = "", -- ClimbHome --- ["Clowns"] = "", -- User_Mission_-_Nobody_Laugh --- ["Clumsy"] = "", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Codename: Teamwork"] = "", + ["Clowns"] = "Клоуны", -- User_Mission_-_Nobody_Laugh + ["Clumsy"] = "Неуклюжий", + ["Cluster Bomb"] = "Касcетная бомба", -- Construction_Mode + ["Cluster Bomb MASTER!"] = "МАСТЕР Касcетной бомбы", -- Basic_Training_-_Cluster_Bomb + ["Cluster Bomb Training"] = "Тренировка с Касcетной бомбой", -- Basic_Training_-_Cluster_Bomb + ["Codename: Teamwork"] = "Кодовое имя: 'Командная работа'", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood --- ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge + ["Collect or destroy all the health crates."] = "Собери или уничтожь все аптечки.", -- User_Mission_-_RCPlane_Challenge -- ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood -- ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Complete the track as fast as you can!"] = "", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Configuration accepted."] = "", -- WxW --- ["Congratulations"] = "", -- Basic_Training_-_Rope --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- Basic_Training_-_Rope --- ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "", --Bazooka, Shotgun, SniperRifle + ["Compete to use as few planes as possible!"] = "Постарайся использовать как можно меньше самолетов!", -- User_Mission_-_RCPlane_Challenge + ["Complete the track as fast as you can!"] = "Закончите трек так быстро, как сможете!", + ["COMPLETION TIME"] = "ВРЕМЯ ЗАВЕРШЕНИЯ", -- User_Mission_-_Rope_Knock_Challenge + ["Configuration accepted."] = "Конфигурация принята.", -- WxW + ["Congratulations!"] = "Поздравляем!", + ["Congratulations"] = "Поздравляем", -- Basic_Training_-_Rope + ["Congratulations! You have destroyed all targets within the time."] = "Поздравляем! Вы уничтожили все цели во время.", -- TargetPractice + ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "Поздравляем! Вы действительно освоили это испытание!", -- User_Mission_-_RCPlane_Challenge + ["Congratulations! You needed only half of time|to eliminate all targets."] = "Поздравляем! Тебе понадобилась только половина|времени, чтобы уничтожить все цели.", -- Basic_Training_-_Cluster_Bomb + ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "Поздравляем! Ты закончил упражнение с Верёвкой! |- Упражнение завершится через 10 секунд!", -- Basic_Training_-_Rope + ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Поздравляем! Ты уничтожил все цели во время.", --Bazooka, Shotgun, SniperRifle ["Congratulations!"] = "Поздравления!", --- ["CONSTRUCTION MODE"] = "", -- Construction_Mode --- ["Construction Station"] = "", -- Construction_Mode + ["CONSTRUCTION MODE"] = "РЕЖИМ СТРОИТЕЛЬСТВА", -- Construction_Mode + ["Construction Station"] = "Станция Утилит", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies --- ["Control pillars to score points."] = "", --- ["Core"] = "", -- Construction_Mode + ["Copper"] = "Медный", -- User_Mission_-_Nobody_Laugh + ["CONTROL"] = "КОНТРОЛЬ", -- Control + ["Control pillars to score points."] = "Контролируй колонны, чтобы заработать очки.", -- Control + ["Core"] = "Ядро", -- Construction_Mode -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil --- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode - ["Crates Left:"] = "Осталось ящиков:", -- User_Mission_-_RCPlane_Challenge + ["Cost"] = "Стоимость", -- Construction_Mode + ["Crate Placement Tool"] = "Инструмент Размещения Ящиков", -- Construction_Mode + ["Crates left: %d"] = "Осталось ящиков: %d", -- User_Mission_-_RCPlane_Challenge + ["crate(s)"] = "ящиков", -- SpeedShoppa + ["%d crate(s) remaining"] = "%d ящиков осталось", -- SpeedShoppa -- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies -- ["Current setting is "] = "", -- Gravity --- ["Cybernetic Empire"] = "", + ["Cybernetic Empire"] = "Кибер Империя", -- User_Mission_-_Bamboo_Thicket -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab --- ["DAMMIT, ROOKIE!"] = "", --- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "", --- ["Dangerous Ducklings"] = "", --- ["Deadweight"] = "", + ["DAMMIT, ROOKIE!"] = "ЧЁРТ ПОБЕРИ, САЛАГА!", + ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ЧЁРТ ПОБЕРИ! СЛЕЗЬ С МОЕЙ ГОЛОВЫ!", + ["Dangerous Ducklings"] = "Опасные Утята", -- User_Mission_-_Dangerous_Ducklings + ["Deadweight"] = "Балласт", + ["deaths"] = "смертей", -- Mutant -- ["Decrease"] = "", -- Continental_supplies -- ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab -- ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united @@ -190,37 +215,43 @@ -- ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy -- ["Defend your core from the enemy."] = "", -- Construction_Mode -- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode --- ["Demolition is fun!"] = "", + ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "Аннигилирует вражеское оружие и оборудование.", -- Construction_Mode + ["Demo"] = "Демон", -- The_Specialists + ["Demolition is fun!"] = "Разрушать весело!", -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow -- ["Depleted Kamikaze!"] = "", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 + ["Derp"] = "Глупый", -- User_Mission_-_Nobody_Laugh + ["Desert Eagle"] = "Пистолет Desert Eagle", -- Construction_Mode, A_Space_Adventure:death02 -- ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood -- ["Destroy invaders to score points."] = "", -- ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood -- ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood + ["Destroyer of planes"] = "Уничтожитель самолётов", -- User_Mission_-_RCPlane_Challenge -- ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united -- ["Did you see him coming?"] = "", -- A_Classic_Fairytale:shadow -- ["Did you warn the village?"] = "", -- A_Classic_Fairytale:shadow -- ["Die, die, die!"] = "", -- A_Classic_Fairytale:dragon + ["Disabled"] = "Отключено", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies + ["Disqualified!"] = "Дисквалификация!", -- User_Mission_-_That_Sinking_Feeling -- ["Dist: "] = "", -- Space_Invasion -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood -- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood --- ["DOUBLE KILL"] = "", -- Mutant + ["DOUBLE KILL"] = "ДВОЙНОЕ УБИЙСТВО", -- Mutant ["Double Kill!"] = "Двойное убийство!", -- ["Do you have any idea how valuable grass is?"] = "", -- A_Classic_Fairytale:enemy -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode + ["Drill Rocket"] = "Сверлящая ракета", -- Construction_Mode -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode -- ["Drone Hunter!"] = "", -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies --- ["Drowner"] = "", + ["Drowner"] = "Утопающий", -- User_Mission_-_Nobody_Laugh + ["Drunk greenhorn"] = "Пьяный молокосос", -- User_Mission_-_RCPlane_Challenge -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab @@ -231,27 +262,31 @@ -- ["Duration"] = "", -- Continental_supplies -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies --- ["Dynamite"] = "", -- Construction_Mode + ["Dynamite"] = "Динамит", -- Construction_Mode -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy --- ["Each turn you get 1-3 random weapons"] = "", --- ["Each turn you get one random weapon"] = "", + ["Each turn you get 1-3 random weapons"] = "Каждый ход вы получаете 1-3 случайных оружия", + ["Each turn you get one random weapon"] = "Каждый ход вы получаете одно случайное оружие", -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil + ["Eckles"] = "Заика", -- User_Mission_-_Nobody_Laugh -- ["Elderbot"] = "", -- A_Classic_Fairytale:family --- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape --- ["Eliminate all enemies"] = "", --- ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle --- ["Eliminate enemy hogs and take their weapons."] = "", -- Highlander --- ["Eliminate Poison before the time runs out"] = "", --- ["Eliminate the Blue Team"] = "", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock + ["Elimate your captor."] = "Уничтожь твоего похитителя.", -- User_Mission_-_The_Great_Escape + ["Eliminate all enemies"] = "Уничтожьте всех врагов", + ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Уничтожь все цели, пока время не вышло.|Для этой миссии доступен неограниченный боезапас.", --Bazooka, Shotgun, SniperRifle + ["Eliminate enemy hogs and take their weapons."] = "Уничтожьте вражеских ежей и получите их оружие.", -- Highlander + ["Eliminate Poison before the time runs out"] = "Уничтожь Яд пока время не вышло", + ["Eliminate the Blue Team"] = "Уничтожь Синюю Команду", + ["Eliminate the enemy before the time runs out"] = "Уничтожь врага пока время не вышло", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock -- ["Eliminate the enemy hogs to win."] = "", --- ["Eliminate the enemy specialists."] = "", --- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "", + ["Eliminate the enemy specialists."] = "Уничтожьте вражеских специалистов.", + ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Уничтожьте Юнит 3378 |- Слабое Сопротивление должно выжить", + ["Elite pilot"] = "Элитный пилот", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Energetic Engineer"] = "", + ["Enabled"] = "Включено", -- WxW + ["Energetic Engineer"] = "Энергичный Инженер", -- User_Mission_-_Bamboo_Thicket + ["Engineer"] = "Инженер", -- The_Specialists ["Enjoy the swim..."] = "Приятного плавания...", -- ["[Enter]"] = "", -- ["Europe"] = "", -- Continental_supplies @@ -260,119 +295,129 @@ -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode + ["Experienced beginner"] = "Продвинутый новичок", -- User_Mission_-_RCPlane_Challenge + ["Extra Damage"] = "Дополнительный урон", -- Construction_Mode + ["Extra Time"] = "Дополнительное время", -- Construction_Mode -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family --- ["Fastest lap: "] = "", --- ["Feeble Resistance"] = "", + ["Fastest lap: "] = "Лучший круг: ", + ["Feeble Resistance"] = "Слабое Сопротивление", -- ["Fell From Grace"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Fell From Heaven"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow -- ["Fierce Competition!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united --- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings + ["Filthy Blue"] = "Грязный Синяк", -- User_Mission_-_Dangerous_Ducklings -- ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon -- ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood -- ["Fire"] = "", -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant + ["FIRST BLOOD MUTATES"] = "ПЕРВАЯ КРОВЬ МУТИРУЕТ", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood --- ["Flag captured!"] = "", --- ["Flag respawned!"] = "", --- ["Flag returned!"] = "", --- ["Flags, and their home base will be placed where each team ends their first turn."] = "", + ["Flag captured!"] = "Флаг захвачен!", + ["Flag respawned!"] = "Респаун флага!", + ["Flag returned!"] = "Флаг возвращен!", + ["Flags, and their home base will be placed where each team ends their first turn."] = "Флаги и базы будут помещены там, где каждая команда закончила свои первый ход.", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode + ["Flamethrower"] = "Огнемет", -- Construction_Mode -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab + ["Flawless victory!"] = "Безупречная победа!", -- User_Mission_-_RCPlane_Challenge -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy + ["Flying Saucer"] = "Летающая тарелка", -- Construction_Mode, Frenzy -- ["For improved features/stability, play 0.9.18+"] = "", -- WxW + ["Frank"] = "Фрэнк", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode + ["Freezer"] = "Замораживатель", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", -- ["fuel extended!"] = "", --- ["GAME BEGUN!!!"] = "", --- ["Game Modifiers: "] = "", + ["GAME BEGUN!!!"] = "ПОЕХАЛИ!!!", + ["Game Modifiers: "] = "Игровые Модификаторы: ", ["GAME OVER!"] = "ИГРА ОКОНЧЕНА!", --- ["Game Started!"] = "", + ["Game Started!"] = "Игра Началась!", -- ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen -- ["General information"] = "", -- Continental_supplies --- ["Generates power."] = "", -- Construction_Mode --- ["Generator"] = "", -- Construction_Mode + ["Generates power."] = "Генерирует энергию, необходимую для постройки сооружений.", -- Construction_Mode + ["Generator"] = "Генератор", -- Construction_Mode -- ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey --- ["Get on over there and take him out!"] = "", + ["Get on over there and take him out!"] = "Доберись туда и уничтожь его!", -- ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood --- ["Get out of there!"] = "", -- User_Mission_-_The_Great_Escape + ["Get out of there!"] = "Выберись отсюда!", -- User_Mission_-_The_Great_Escape -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope + ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "Доберись до цели, используя верёвку! |Упрвление: Влево и Вправо для раскачивания - Вверх и Вниз для укорочения и удлинения!", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["GG!"] = "GG!", -- User_Mission_-_Rope_Knock_Challenge -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode --- ["Girder Placement Mode"] = "", -- Construction_Mode + ["Girder Placement Mode"] = "Режим Размещения Балок", -- Construction_Mode -- ["Glark"] = "", -- A_Classic_Fairytale:shadow ["Goal"] = "Цель", --- ["GO! GO! GO!"] = "", --- ["Good birdy......"] = "", --- ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape + ["GO! GO! GO!"] = "ВПЕРЁД! ВПЕРЁД! ВПЕРЁД!", + ["Good birdy......"] = "Хорошая птичка...", + ["Good Dude"] = "Хороший", -- User_Mission_-_The_Great_Escape -- ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey --- ["Good luck out there!"] = "", --- ["Good so far!"] = "", --- ["Good to go!"] = "", + ["Good luck out there!"] = "Удачи там!", + ["Good so far!"] = "Пока хорошо!", + ["Good to go!"] = "Пошёл!", -- ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey --- ["Go surf!"] = "", -- WxW + ["Go surf!"] = "Теперь сёрфить!", -- WxW ["GOTCHA!"] = "ПОПАЛСЯ!", -- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode + ["Grants nearby hogs life-regeneration."] = "Восстанавливает здоровье соседних ежей.", -- Construction_Mode -- ["Gravity"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow --- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope + ["GREAT ! Let's kill all this enemies, using portals"] = "ПРЕКРАСНО ! Теперь можно убить всех с помощью порталов", -- portal + ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "Хорошая работа! А теперь ударь его Бейсбольной Битой! |Подсказка: Оружие можно сменить 'Правым кликом'!", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow + ["Greenhorn"] = "Молокосос", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies -- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 --- ["Grenade Training"] = "", -- Basic_Training_-_Grenade --- ["Grenadiers"] = "", -- Basic_Training_-_Grenade + ["Grenade"] = "Граната", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 + ["Grenade Group"] = "Группа Гренадеров", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard + ["Grenade Training"] = "Тренировка с Гранатой", -- Basic_Training_-_Grenade + ["Grenadier"] = "Гренадер", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard + ["Grenadiers"] = "Гренадеры", -- Basic_Training_-_Grenade -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united --- ["Hahahaha!"] = "", --- ["Haha, now THAT would be something!"] = "", --- ["Hammer"] = "", -- Construction_Mode, Continental_supplies + ["Hahahaha!"] = "Хахахаха!", + ["Haha, now THAT would be something!"] = "Хаха, да не гони, ЭТО уже слишком!", + ["Hammer"] = "Молот", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil --- ["Hapless Hogs"] = "", --- [" Hapless Hogs left!"] = "", --- [" HAS MUTATED"] = "", -- Mutant + ["Hapless Hogs"] = "Несчастные Ежи", + ["%d Hapless Hogs left"] = "%d Несчастных Ёжиков осталось", + ["Harry"] = "Гарри", -- User_Mission_-_Nobody_Laugh + [" HAS MUTATED"] = " МУТИРОВАЛ", -- Mutant -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy --- ["Healing Station"] = "", -- Construction_Mode --- ["Health Crate Placement Mode"] = "", -- Construction_Mode + ["Healing Station"] = "Лечебная Станция", -- Construction_Mode + ["Health Crate Placement Mode"] = "Режим Размещения Аптечек", -- Construction_Mode -- ["Health crates extend your time."] = "", --- ["Heavy"] = "", + ["Heartful"] = "Сердечный", -- Challenge_-_Speed_Shoppa_-_Hedgelove + ["Heavy"] = "Тяжёлый", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies --- ["Hedgewars-Basketball"] = "", --- ["Hedgewars-Knockball"] = "", + ["Hedgewars-Basketball"] = "Hedgewars Баскетбол", + ["Hedgewars-Knockball"] = "Hedgewars Вышибалы", -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab --- ["Heh, it's not that bad."] = "", --- ["Hellish Handgrenade"] = "", -- Construction_Mode + ["Heh, it's not that bad."] = "Хех, не так уж всё и плохо.", + ["Hell Army"] = "Армия Ада", -- portal + ["Hellish Handgrenade"] = "Адская граната", -- Construction_Mode -- ["Hello again, "] = "", -- A_Classic_Fairytale:family -- ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey -- ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey @@ -382,13 +427,14 @@ -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape + ["Hero Team"] = "Герои", -- User_Mission_-_The_Great_Escape -- ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood -- ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab -- ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab -- ["Hey guys!"] = "", -- A_Classic_Fairytale:united -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey - ["HIGHLANDER"] = "Царь горы", -- Highlander + ["HIGHLANDER"] = "ЦАРЬ ГОРЫ", -- Highlander + ["hiden"] = "Скрытный", -- portal -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood -- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey @@ -396,17 +442,20 @@ -- ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood -- ["Hit Combo!"] = "", + ["hits"] = "попаданий", -- Basic_Training_-_Bazooka -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal + ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "Хмм, надо придумать как скинуть его с анти-портальной поверхности...", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood ["Hmmm..."] = "Хммм...", -- ["Hogminator"] = "", -- A_Classic_Fairytale:family -- ["Hogs in sight!"] = "", -- Continental_supplies --- ["HOLY SHYTE!"] = "", -- Mutant --- ["Homing Bee"] = "", -- Construction_Mode + ["HOLY SHYTE!"] = "ВОТ ЧЕРТ!", -- Mutant + ["Homing Bee"] = "Пчёлка", -- Construction_Mode -- ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy + ["Hook"] = "Крюк", -- Challenge_-_Speed_Shoppa_-_Ropes ["Hooray!"] = "Ура!", + ["Hopeless case"] = "Безнадежный случай", -- User_Mission_-_RCPlane_Challenge -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon @@ -415,7 +464,7 @@ -- ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey -- ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey -- ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon --- [" HP"] = "", -- Mutant + [" HP"] = " HP", -- Mutant ["Hunter"] = "Охотник", --Bazooka, Shotgun, SniperRifle -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood @@ -426,7 +475,7 @@ -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope + ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "Я не знаю, как ты это сделал... Но ты молодец! |Следующая цель вообще не составит тебе труда!", -- Basic_Training_-_Rope -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood @@ -438,6 +487,7 @@ -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow + ["Igmund"] = "Джокер", -- User_Mission_-_Nobody_Laugh -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow @@ -447,6 +497,7 @@ -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab -- ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family -- ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey + ["Ikeda"] = "Икэда", -- User_Mission_-_Bamboo_Thicket -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab @@ -469,20 +520,25 @@ -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab -- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant + ["INSANITY"] = "БЕЗУМИЕ", -- Mutant ["Instructor"] = "Инструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings + ["Insufficient Power"] = "Недостаточно Энергии", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow -- ["invaders destroyed"] = "", + ["Invalid Placement"] = "Неверное Размещение", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode + ["Invulnerable"] = "Неуязвимость", -- Construction_Mode + ["In your best (and only) flight you took out %d crates with one RC plane!"] = "В вашем лучшем (и единственном) полёте вы достали %d ящиков с одним самолётом.", -- User_Mission_-_RCPlane_Challenge + ["In your best flight you took out %d crates with one RC plane."] = "В вашем лучшем полёте вы достали %d ящиков с одним самолётом.", -- User_Mission_-_RCPlane_Challenge -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab + ["I should get myself a portal gun, maybe this crate has one"] = "Надо достать портальную пушку, может в этом ящике?", -- portal -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon @@ -495,7 +551,7 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab --- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "", + ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Хорошо, что ВНЕЗАПНАЯ СМЕРТЬ аж через 99 ходов...", -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow @@ -521,7 +577,7 @@ -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family -- ["Kamikaze"] = "", -- Construction_Mode -- ["Kamikaze Expert!"] = "", --- ["Keep it up!"] = "", + ["Keep it up!"] = "Так держать!", -- ["Kerguelen"] = "", -- Continental_supplies -- ["Killing spree!"] = "", -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood @@ -529,8 +585,9 @@ -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood -- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode + ["King Customer"] = "Король Покупатель", -- Challenge_-_Speed_Shoppa_-_ShoppaKing + ["Land Sprayer"] = "Распылитель земли", -- Construction_Mode + ["Laser Sight"] = "Лазерный прицел", -- Construction_Mode ["Last Target!"] = "Последняя цель!", -- ["Leader"] = "", -- A_Classic_Fairytale:enemy -- ["Leaderbot"] = "", -- A_Classic_Fairytale:queen @@ -542,6 +599,7 @@ -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["[Left Shift]"] = "", -- ["left shift"] = "", -- Continental_supplies + ["Lestat"] = "Лестат", -- portal -- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey @@ -551,8 +609,8 @@ -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode --- ["Listen up, maggot!!"] = "", + ["Limburger"] = "Старый Лимбургер", -- Construction_Mode + ["Listen up, maggot!!"] = "Слушай сюда, щегол!!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", @@ -562,56 +620,63 @@ -- ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab -- ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy -- ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy + ["Loon"] = "Псих", -- The_Specialists + ["Low Gravity"] = "Слабая гравитация", -- Construction_Mode, Frenzy + ["Lucifer"] = "Люцифер", -- portal -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant + ["LUDICROUS KILL"] = "НЕЛЕПОЕ УБИЙСТВО", -- Mutant -- ["Made it!"] = "", -- ClimbHome -- ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant + ["MEGA KILL"] = "МЕГА УБИЙСТВО", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab + ["milliseconds"] = "миллисекунд", -- SpeedShoppa -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy + ["Mine"] = "Мина", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", -- ["Mine Eater!"] = "", --- ["Mine Placement Mode"] = "", -- Construction_Mode --- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork + ["Mine Placement Mode"] = "Режим Размещения Мин", -- Construction_Mode + ["|- Mines Time:"] = "|- Задержка Мин:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork -- ["Mine Strike"] = "", -- Construction_Mode ["MISSION FAILED"] = "МИССИЯ ПРОВАЛЕНА", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork + ["Mission lost!"] = "Миссия провалена!", -- Basic_Training_-_Grenade -- ["MISSION SUCCESS"] = "", ["MISSION SUCCESSFUL"] = "МИССИЯ УСПЕШНА", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork --- ["Molotov Cocktail"] = "", -- Construction_Mode + ["Mission won!"] = "Миссия успешна!", -- Basic_Training_-_Grenade + ["Molotov Cocktail"] = "Коктейль Молотова", -- Construction_Mode -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant + ["MONSTER KILL"] = "УБИЙСТВО МОНСТРА", -- Mutant -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 + ["Mortar"] = "Миномёт", -- Construction_Mode, A_Space_Adventure:death02 -- ["Movement: [Up], [Down], [Left], [Right]"] = "", --- ["Mudball"] = "", -- Construction_Mode + ["Mudball"] = "Комок грязи", -- Construction_Mode -- ["Multi-shot!"] = "", -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant --- ["Mutant"] = "", -- Mutant --- ["Nade Boy"] = "", -- Basic_Training_-_Grenade + ["-------"] = "-------", -- Mutant + ["MUTANT"] = "МУТАНТ", -- Mutant + ["Mutant"] = "Мутант", -- Mutant + ["Nade Boy"] = "Снайперок", -- Basic_Training_-_Grenade -- ["Name"] = "", -- A_Classic_Fairytale:queen - ["Nameless Heroes"] = "Безымянные герои", + ["Nameless Heroes"] = "Герои Без Имен", -- ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen -- ["Napalm"] = "", -- Construction_Mode -- ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies -- ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings + ["Naughty Ninja"] = "Озорной ниндзя", -- User_Mission_-_Dangerous_Ducklings -- ["New Barrels Per Turn"] = "", ["NEW CLAN RECORD: "] = "НОВЫЙ РЕКОРД КЛАНА: ", --- ["NEW fastest lap: "] = "", + ["NEW fastest lap: "] = "НОВЫЙ лучший круг: ", -- ["New Mines Per Turn"] = "", --- ["NEW RACE RECORD: "] = "", + ["NEW RACE RECORD: "] = "НОВЫЙ РЕКОРД ГОНКИ: ", ["Newton's Hammock"] = "Гамак Ньютона", -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy -- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen --- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh + ["Ninja"] = "Ниндзя", -- The_Specialists + ["Nobody Laugh"] = "Никто не смеётся", -- User_Mission_-_Nobody_Laugh -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey @@ -619,137 +684,155 @@ -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant + ["Normal players can only score points by killing the mutant."] = "Обычные игроки могут получить очки только убив Мутанта.", -- Mutant -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander --- ["NOT ENOUGH WAYPOINTS"] = "", + ["Not all hogs are born equal."] = "Не все ежи рождаются равными.", -- Highlander + ["NOT ENOUGH WAYPOINTS"] = "НЕДОСТАТОЧНО КОНТРОЛЬНЫХ ТОЧЕК", -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab --- ["Not So Friendly Match"] = "", -- Basketball, Knockball + ["Not So Friendly Match"] = "Совсем Не Товарищеский Матч", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united --- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope + ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "Теперь найди следующую цель!|Подсказка: Ты потеряешь здоровье, если упадешь, будь осторожен!", -- Basic_Training_-_Rope -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode + ["Object Placement Tool"] = "Инструмент Размещения Объектов", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey -- ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood -- ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab --- ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork + ["Oh no! Just try again!"] = "О, нет! Попробуй еще раз!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork -- ["Oh no, not "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["Oh no! Time's up! Just try again."] = "", --Bazooka, Shotgun, SniperRifle --- ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb + ["Oh no! Time's up! Just try again."] = "О, нет! Время вышло! Попробуй еще раз.", --Bazooka, Shotgun, SniperRifle + ["Oh no! You failed! Just try again."] = "О, нет! Ты проиграл! Попробуй еще раз.", -- Basic_Training_-_Cluster_Bomb -- ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant + ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "ТОЛЬКО ОДИН ЁЖ НА КОМАНДУ! ИЗБЫТОК ЕЖЕЙ БУДЕТ УДАЛЕН", -- Mutant -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood + ["oneye"] = "Циклоп", -- portal -- ["on Skip"] = "", -- Continental_supplies -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Operation Diver"] = "", --- ["Opposing Team: "] = "", + ["Operation Diver"] = "Операция 'Ныряльщик'", + ["Opposing Team: "] = "Команда Соперника: ", -- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen --- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["Other kills don't give you points."] = "Другие убийства не дадут вам очков.", -- Mutant + ["Ouch!"] = "Ох!", -- User_Mission_-_Rope_Knock_Challenge -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy --- ["Parachute"] = "", -- Continental_supplies --- ["Pathetic Hog #%d"] = "", --- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock + ["Parachute"] = "Парашют", -- Continental_supplies + ["Pathetic Hog #%d"] = "Жалкий Ёж #%d", + ["Pathetic Resistance"] = "Жалкое Сопротивление", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock -- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies -- ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood --- ["Per-Hog Ammo"] = "", --- ["Personal Portal Device"] = "", -- Construction_Mode + ["Per-Hog Ammo"] = "У каждого ежа свое оружие", + ["Personal Portal Device"] = "Портальная Пушка", -- Construction_Mode -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow --- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode + ["phosphatoglucidique"] = "Углеводофосфатный", -- portal + ["Piano Strike"] = "Фортепьяновый удар", -- Construction_Mode + ["Pickhammer"] = "Отбойный молоток", -- Construction_Mode -- ["Pings left:"] = "", -- Space_Invasion --- ["Place more waypoints using the 'Air Attack' weapon."] = "", --- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge + ["Place more waypoints using the 'Air Attack' weapon."] = "Расположите больше контрольных точек, используя 'Воздушную атаку'", + ["Planes used: %d"] = "Использовано самолётов: %d", -- User_Mission_-_RCPlane_Challenge -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer + ["player"] = "игрок", -- portal + ["Please place the way-point further from the waterline."] = "Поместите контрольную точку подальше от воды.", -- Racer + ["Please place the way-point in the open, within the map boundaries."] = "Поместите контрольную точку в открытом месте внутри границ карты.", -- Racer -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow -- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle --- ["POINTS"] = "", -- Mutant + ["points"] = "очки", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle + ["POINTS"] = "ОЧКИ", -- Mutant ["Poison"] = "Яд", -- ["Population"] = "", -- Continental_supplies -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal + ["Portal mission"] = "Портальная миссия", -- portal -- ["Power Remaining"] = "", --- ["Prepare yourself"] = "", + ["Predator"] = "Хищник", -- portal + ["Prepare yourself"] = "Готовься", -- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW + ["Press [Enter] to accept this configuration."] = "Нажмите [Enter] для принятия конфигурации.", -- WxW -- ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood -- ["Press [Precise] to skip intro"] = "", --- ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb + ["Prestigious Pilot"] = "Престижный Пилот", -- User_Mission_-_RCPlane_Challenge + ["Private Nolak"] = "Рядовой Нолак", -- Target_Practice_-_Cluster_Bomb + ["Private Novak"] = "Рядовой Новак", -- Basic_Training_-_Cluster_Bomb + ["Professional pilot"] = "Профессиональный пилот", -- User_Mission_-_RCPlane_Challenge + ["Professional stunt pilot"] = "Профессиональный пилот-трюкач", -- User_Mission_-_RCPlane_Challenge -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow --- ["Race complexity limit reached."] = "", --- ["RACER"] = "", + ["Pyro"] = "Пироман", -- The_Specialists + ["Race complexity limit reached."] = "Лимит сложности гонки достигнут.", + ["RACER"] = "ГОНЩИК", -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Radar Ping"] = "", -- Space_Invasion -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow + ["Rank: %s"] = "Ранк: %s", -- User_Mission_-_RCPlane_Challenge -- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity + ["razac"] = "Чумной", -- portal -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge + ["RC PLANE TRAINING"] = "ТРЕНИРОВКА С РАДИОУПРАВЛЯЕМЫМ САМОЛЕТОМ", -- User_Mission_-_RCPlane_Challenge -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow --- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode + ["Reflector Shield"] = "Щит-Отражатель", -- Construction_Mode + ["Reflects enemy projectiles."] = "Отражает снаряды врагов.", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab --- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope + ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "Помни: Верёвка изгибается только вокруг объекты, |если же она ничего не касается, то всегда остается прямой!", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow -- ["REMOVED"] = "", -- Continental_supplies --- ["Respawner"] = "", -- Construction_Mode + ["rescues"] = "спасено", -- User_Mission_-_That_Sinking_Feeling + ["Respawner"] = "Воскреситель", -- Construction_Mode -- ["Resurrector"] = "", -- Construction_Mode --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode --- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "", + ["Resurrects dead hedgehogs."] = "Возвращает к жизни мертвых ежей.", -- Construction_Mode + [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Доставьте вражеский флаг на вашу базу для получения очков | - Выигрывает команда с 3мя захватами флага | - Вы получаете очки только когда ваш флаг находится на базе | - Убитые/Утонувшие ежи теряют флаг | - Брошенные флаги могут быть возвращены или захвачены повторно | - Убитые ежи воскресают", -- ["Return to Leaks A Lot! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow + ["Rider"] = "Адский Всадник", -- portal -- ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["ronald"] = "Рональд", -- portal + ["Rope"] = "Верёвка", -- Construction_Mode + ["ROPE-KNOCKING"] = "ВЫШИБАНИЕ-ВЕРЁВКОЙ", -- User_Mission_-_Rope_Knock_Challenge + ["Rope Master!"] = "Мастер Верёвки!", -- Basic_Training_-_Rope + ["Roper"] = "Верёвочник", -- SpeedShoppa + ["Ropes and Crates"] = "Верёвки и Ящики", -- Challenge_-_Speed_Shoppa_-_Ropes + ["Rope Team"] = "Верёвочники", -- Basic_Training_-_Rope -- ["Rope to safety"] = "", -- ClimbHome --- ["Rope Training"] = "", -- Basic_Training_-_Rope + ["Rope Training"] = "Тренировка с Верёвкой", -- Basic_Training_-_Rope -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", + ["Round Limit:"] = "Лимит Раундов:", -- ["Round Limit"] = "", --- ["Rounds Complete: "] = "", + ["Rounds Complete: "] = "Раундов Завершено: ", -- ["Rounds Complete"] = "", -- ["Rubber Band"] = "", -- Construction_Mode --- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant --- ["RULES OF THE GAME [Press ESC to view]"] = "", + ["Rubber Placement Mode"] = "Режим Размещения Батутов", -- Construction_Mode + ["RULES"] = "ПРАВИЛА", -- Frenzy, Mutant + ["RULES OF THE GAME [Press ESC to view]"] = "ПРАВИЛА ИГРЫ", -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen -- ["s|"] = "", -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies + ["Saint"] = "Святой", -- The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon --- ["Save as many hapless hogs as possible!"] = "", + ["Save as many hapless hogs as possible!"] = "Спасите как можно больше несчастных ежей!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey -- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab -- ["SCORE"] = "", --- ["Score"] = "", -- Mutant + ["Score"] = "Счет", -- Mutant ["sec"] = "сек", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag --- ["Seduction"] = "", -- Continental_supplies + ["%.1f seconds were remaining."] = "%.1f секунд еще оставалось.", -- Basic_Training_-_Bazooka + ["Seduction"] = "Соблазнение", -- Continental_supplies -- ["Seems like every time you take a \"walk\", the enemy find us!"] = "", -- A_Classic_Fairytale:backstab -- ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood ["See ya!"] = "Увидимся!", @@ -771,17 +854,19 @@ -- ["Shield OFF:"] = "", -- ["Shield ON:"] = "", -- ["Shield Seeker!"] = "", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 --- ["Shotgun"] = "", -- Continental_supplies + ["Shoppa Union"] = "Союз Шоппы", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing + ["Shoppers"] = "Шопперы", -- SpeedShoppa + ["Shoryuken"] = "Восходящий удар Дракона", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 + ["Shotgun"] = "Дробовик", -- Continental_supplies -- ["Shotgun Team"] = "", -- ["Shotgun Training"] = "", -- ["shots remaining."] = "", --- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode --- ["Sinky"] = "", + ["Silly"] = "Глупый", + ["SineGun"] = "Синус-пушка (бета)", -- Construction_Mode + ["Sinky"] = "Утопленник", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy --- ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball --- ["%s is out and Team %d|scored a point!| |Score:"] = "", -- Basketball, Knockball + ["%s is 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 -- ["Slippery"] = "", -- A_Classic_Fairytale:journey -- ["Slot"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy @@ -792,42 +877,46 @@ -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy --- ["Sniper Rifle"] = "", -- Continental_supplies + ["Sniper"] = "Снайпер", -- The_Specialists + ["Sniper Rifle"] = "Снайперская винтовка", -- Continental_supplies -- ["Sniper!"] = "", -- Space_Invasion ["Sniper Training"] = "Тренировка снайпера", --- ["Sniperz"] = "", + ["Sniperz"] = "Снайперы", -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood + ["Soldier"] = "Солдат", -- The_Specialists -- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW + ["Spawn the crate, and attack!"] = "Подбери ящик и атакуй!", -- WxW -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speed Shoppa"] = "", -- SpeedShoppa -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united --- ["Sponge"] = "", --- ["Spooky Tree"] = "", + ["Sponge"] = "Губка", + ["Spooky Tree"] = "Зловещее дерево", -- ["Sprite Placement Mode"] = "", -- Construction_Mode -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion + ["STATUS UPDATE"] = "ОБНОВЛЕНИЕ СТАТУСА", -- GaudyRacer, Space_Invasion -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Sticky Mine"] = "", -- Continental_supplies --- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode + ["Sticky Mine"] = "Мина-Липучка", -- Continental_supplies + ["Sticky Mine Placement Mode"] = "Режим Размещения Мин-Липучек", -- Construction_Mode -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow --- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- Construction_Mode + ["Structure Placement Mode"] = "Режим Размещения Сооружений", -- Construction_Mode + ["Structure Placement Tool"] = "Инструмент Размещения Сооружений", -- Construction_Mode + ["Subject"] = "Испытуемый", -- portal -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW --- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW + ["Super Weapons"] = "Супер Оружие", -- WxW + ["Support Station"] = "Станция Поддержки", -- Construction_Mode + ["Surf Before Crate"] = "Сёрфинг Перед Ящиком", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow -- ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood -- ["switch"] = "", -- Continental_supplies --- ["Switched to "] = "", + ["Switched to "] = "Выбран ", -- ["Switch Hog"] = "", -- Construction_Mode -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon -- ["tab"] = "", -- Continental_supplies @@ -835,14 +924,22 @@ -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon -- ["Tardis"] = "", -- Construction_Mode -- ["Target Placement Mode"] = "", -- Construction_Mode + ["Targets left: %d"] = "Осталось целей: %d", -- TargetPractice + ["Target Practice: Bazooka (easy)"] = "Учебная Стрельба: Базука (легко)", -- Target_Practice_-_Bazooka_easy + ["Target Practice: Bazooka (hard)"] = "Учебная Стрельба: Базука (сложно)", -- Target_Practice_-_Bazooka_hard + ["Target Practice: Grenade (easy)"] = "Учебная Стрельба: Граната (легко)", -- Target_Practice_-_Grenade_easy + ["Target Practice: Grenade (hard)"] = "Учебная Стрельба: Граната (сложно)", -- Target_Practice_-_Grenade_hard + ["Target Practice: Homing Bee"] = "Учебная Стрельба: Пчёлка", -- Target_Practice_-_Homing_Bee + ["Target Practice: Shotgun"] = "Учебная Стрельба: Дробовик", -- Target_Practice_-_Shotgun ["Team %d: "] = "Команда %d: ", - ["Team Scores"] = "Очки команды", -- Control, Space_Invasion --- ["Teleporation Node"] = "", -- Construction_Mode --- ["Teleportation Mode"] = "", -- Construction_Mode --- ["Teleportation Node"] = "", -- Construction_Mode + ["Team of Hearts"] = "Команда сердец", -- Challenge_-_Speed_Shoppa_-_Hedgelove + ["Team Scores"] = "Очки команд", -- Control, Space_Invasion + ["Team Zook"] = "Команда Зуки", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard + ["Teleportation Mode"] = "Режим Телепортации", -- Construction_Mode + ["Teleportation Node"] = "Узел Телепортации", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon --- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode + ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "Неудачная Телепортация. Вы можете телепортироваться только в области влияния ваших телепортов.", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey @@ -852,43 +949,46 @@ -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow --- ["That Sinking Feeling"] = "", + ["That Sinking Feeling"] = "Дед Мазай и Ёжики", -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["That was pointless."] = "", -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant + ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "Весь пол покрыт анти-портальной краской и мне нечем его убить... Может сбросить на него что-то?..", -- portal + ["The Bottom Feeder can score points by killing anyone."] = "Аутсайдер может заработать очки убив любого.", -- Mutant -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood + ["The Customer is King"] = "Покупатель это Король", -- Challenge_-_Speed_Shoppa_-_ShoppaKing -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow -- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon --- ["The enemy is hiding out on yonder ducky!"] = "", + ["The enemy is hiding out on yonder ducky!"] = "Враг прячется на соседней утке!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant --- ["The flag will respawn next round."] = "", + ["The first player to kill someone becomes the Mutant."] = "Первый игрок, убивший кого-либо, становится Мутантом.", -- Mutant + ["The flag will respawn next round."] = "Флаг опять появится в следующем раунде.", + ["The flood has stopped! Challenge over."] = "Наводнение остановилось! Испытание закончено.", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood --- ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape --- ["The Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode + ["The Great Escape"] = "Великий Побег", -- User_Mission_-_The_Great_Escape + ["The Great Hog in the sky sees your sadness and grants you a boon."] = "Великий Ёж на небесах видит вашу печаль и благословляет вас даром.", -- Construction_Mode -- ["The guardian"] = "", -- A_Classic_Fairytale:shadow + ["The Hogies"] = "Боевые Ежи", -- Target_Practice_-_Cluster_Bomb -- ["The Individualist"] = "", -- A_Classic_Fairytale:shadow -- ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey --- ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant --- ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant --- ["The Nameless One"] = "", --- ["The next one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope + ["The Mutant has super-weapons and a lot of health."] = "У Мутанта есть супер-оружие и много здоровья.", -- Mutant + ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "Мутант быстро теряет здоровье, если не зарабатывает очки за убийства.", -- Mutant + ["The Nameless One"] = "Дед Мазай", + ["The next one is pretty hard! |Tip: You have to do multiple swings!"] = "Следующая цель довольно сложна! |Подсказка: Нужно сделать несколько раскачиваний!", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant --- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode + ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "Игрок с наименьшим количеством очков становится Аутсайдером.", -- Mutant + ["There are a variety of structures available to aid you."] = "Множество сооружений доступны вам в помощь.", -- Construction_Mode -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey @@ -900,7 +1000,7 @@ -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["The Showdown"] = "", -- A_Classic_Fairytale:shadow -- ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood --- ["THE SPECIALISTS"] = "", + ["THE SPECIALISTS"] = "СПЕЦИАЛИСТЫ", -- ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey @@ -927,28 +1027,33 @@ -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab --- ["This one's tricky."] = "", --- ["This rain is really something..."] = "", + ["This one's tricky."] = "Это непростая цель.", + ["This rain is really something..."] = "Этот дождь нескончаем...", + ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "Потрясающее исполнение! Но это испытание можно пройти всего с одним самолётом. Знаете как?", -- User_Mission_-_RCPlane_Challenge -- ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family -- ["Timed Kamikaze!"] = "", -- ["Time Extended!"] = "", -- ["Time Extension"] = "", ["TIME: "] = "ВРЕМЯ: ", --- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope + ["Time's up!"] = "Время вышло!", -- Basic_Training_-_Sniper_Rifle + ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "Подсказка: Поведение верёвки отличается от того, что в реальном мире, |используй это как преимущество!", -- Basic_Training_-_Rope -- ["Toggle Shield"] = "", -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey + ["Top-class elite pilot"] = "Элитный пилот топ класса", -- User_Mission_-_RCPlane_Challenge -- ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey -- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["To the caves..."] = "", -- A_Classic_Fairytale:united --- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork --- ["TRACK COMPLETED"] = "", + ["Toxic Team"] = "Токсичные", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork + ["TRACK COMPLETED"] = "ТРЕК ЗАВЕРШЕН", --- ["training"] = "", -- portal + ["Trainee"] = "Ученик", -- TargetPractice + ["training"] = "Тренировка", -- portal + ["Training Team"] = "Обучающиеся", -- TargetPractice -- ["Traitors"] = "", -- A_Classic_Fairytale:epil -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab --- ["TrophyRace"] = "", + ["TrophyRace"] = "Трофейная Гонка", -- ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united -- ["T_T"] = "", -- ["Tumbling Time Extended!"] = "", @@ -958,53 +1063,57 @@ -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant + ["ULTRA KILL"] = "УЛЬТРА УБИЙСТВО", -- Mutant -- ["Under Construction"] = "", -- A_Classic_Fairytale:shadow -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies --- ["Unit"] = "", + ["Unit"] = "Юнит", -- User_Mission_-_Newton_and_the_Hammock -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united --- ["Unit 3378"] = "", --- ["Unit 835"] = "", + ["Unit 3378"] = "Юнит 3378", + ["Unit 835"] = "Юнит 835", -- User_Mission_-_Bamboo_Thicket -- ["United We Stand"] = "", -- A_Classic_Fairytale:united --- ["Unlimited Attacks"] = "", --- ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["Unlimited Attacks"] = "Бесконечные атаки", + ["Unlucky Sods"] = "Неудачники", -- User_Mission_-_Rope_Knock_Challenge -- ["Unstoppable!"] = "", --- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["Unsuspecting Louts"] = "Доверчивые хамы", -- User_Mission_-_Rope_Knock_Challenge -- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood + ["Upper-class elite pilot"] = "Элитный пилот высшего класса", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood --- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode + ["User Challenge"] = "Одиночная Миссия", + ["Use the air-attack weapons and the arrow keys to select structures."] = "Используйте 'Воздушную атаку' и стрелки, чтобы выбрать сооружение.", -- Construction_Mode -- ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge + ["Use the portal to move fast and far, use it to kill, use it with caution!"] = "Используй портал для перемещения, используй его для убийства, используй его с осторожностью!", -- portal + ["Use the rope to knock your enemies to their doom."] = "Используйте веревку, чтобы сбить врагов к их гибели.", -- User_Mission_-_Rope_Knock_Challenge -- ["Use your ready time to think."] = "", -- Frenzy --- ["Use your rope to get from start to finish as fast as you can!"] = "", --- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode + ["Use your rope to collect all crates as fast as possible."] = "Используйте веревку, чтобы собрать все ящики как можно быстрее.", -- SpeedShoppa + ["Use your rope to get from start to finish as fast as you can!"] = "Используй веревку, чтобы добраться от старта до финиша как можно быстрее!", + ["Utility Crate Placement Mode"] = "Режим Размещения Ящиков с Утилитами", -- Construction_Mode + ["Vampirism"] = "Вампиризм", -- Construction_Mode -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy --- ["Victory!"] = "", -- Basic_Training_-_Rope --- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag + ["Victory!"] = "Победа!", -- Basic_Training_-_Rope + ["Victory for the "] = "Победа за ", -- CTF_Blizzard, Capture_the_Flag + ["voldemort"] = "Волан-де-Морт", -- portal -- ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW --- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["Walls Left"] = "Стен осталось", -- WxW + ["Walls Required"] = "Стен Необходимо", -- WxW +-- ["WALL TO WALL"] = "ОТ СТЕНЫ К СТЕНЕ", -- WxW + ["Wannabe Flyboys"] = "Хочу быть Пилотом", -- User_Mission_-_RCPlane_Challenge + ["Wannabe Shoppsta"] = "Хочу быть Шоппером", -- User_Mission_-_Rope_Knock_Challenge -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode --- ["Waypoint placed."] = "", --- ["Way-Points Remaining"] = "", + ["Watermelon Bomb"] = "Арбузная бомба", -- Construction_Mode + ["Waypoint placed."] = "Контрольная Точка добавлена.", + ["Way-Points Remaining"] = "Контрольных Точек осталось", -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood --- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode --- ["Weapon Filter"] = "", -- Construction_Mode + ["Weapon Crate Placement Mode"] = "Режим Размещения Ящиков с Оружием", -- Construction_Mode + ["Weapon Filter"] = "Фильтр Оружия", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies --- ["Weapons Reset"] = "", --- ["Weapons reset."] = "", -- Highlander + ["Weapons Reset"] = "Сброс оружия", + ["Weapons reset."] = "Сброс оружия.", -- Highlander -- ["We are indeed."] = "", -- A_Classic_Fairytale:backstab -- ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united @@ -1014,7 +1123,7 @@ -- ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united -- ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy -- ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey --- ["Well done."] = "", + ["Well done."] = "Отлично.", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon @@ -1037,7 +1146,7 @@ -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal + [" What !! For all of this struggle i just win some ... TIME o0"] = " ЧТО ?! За все эти страдания я выиграл только немного ... ВРЕМЕНИ o0", -- portal -- ["What has "] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy @@ -1055,7 +1164,7 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode + ["Whip"] = "Кнут", -- Construction_Mode -- ["? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["Why "] = "", -- A_Classic_Fairytale:backstab -- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united @@ -1067,14 +1176,15 @@ -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab + ["Will be useful if I need a new plateform or if I want to rise...."] = "Это пригодится, чтобы подняться выше...", -- portal -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies -- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies --- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant --- ["WINNING TIME: "] = "", + ["Will this ever end?"] = "Когда уже конец?", + ["WINNER IS "] = "ПОБЕДИЛ ", -- Mutant + ["WINNING TIME: "] = "ПОБЕДНОЕ ВРЕМЯ: ", -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey -- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon @@ -1095,26 +1205,48 @@ -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy -- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal + ["You can't fire a portal on the blue surface"] = "Нельзя ставить порталы на синюю поверхность", -- portal -- ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey --- ["You'd almost swear the water was rising!"] = "", + ["You'd almost swear the water was rising!"] = "Могу поклясться, что вода прибывает!", -- ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey --- ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope + ["You did not make it in time, try again!"] = "Время вышло, попробуй еще раз!", -- Basic_Training_-_Rope + ["You had %.2fs remaining on the clock (+%d points)."] = "У вас оставалось %.2f секунд на таймере (+%d очков).", -- Basic_Training_-_Sniper_Rifle + ["You had %.1fs remaining on the clock (+%d points)."] = "У вас оставалось %.1f секунд на таймере (+%d очков).", -- TargetPractice -- ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab -- ["You have "] = "", -- A_Classic_Fairytale:dragon -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope + ["You have been respawned, at your last checkpoint!"] = "Ты возродился на последней контрольной точке!", -- Basic_Training_-_Rope + ["You have been respawned, be more carefull next time!"] = "Ты возродился, будь осторожней в следующий раз!", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united + ["You have collected %d out of %d crate(s)."] = "Вы собрали %d из %d ящиков.", -- SpeedShoppa + ["You have destroyed %d of %d targets."] = "Вы уничтожили %d из %d целей.", -- Basic_Training_-_Bazooka + ["You have destroyed %d of %d targets (+%d points)."] = "Вы уничтожили %d из %d целей (+%d очков).", -- Basic_Training_-_Sniper_Rifle + ["You have dropped %d missiles."] = "Вы запустили %d ракет.", -- User_Mission_-_RCPlane_Challenge -- ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey -- ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy + ["You have finished the bazooka training!"] = "Вы прошли тренировку с базукой!", -- Basic_Training_-_Bazooka + ["You have finished the challenge!"] = "Вы прошли испытание!", -- User_Mission_-_RCPlane_Challenge + ["You have finished the challenge in %.3f s."] = "Вы прошли испытание за %.3f сек.", -- SpeedShoppa + ["You have finished the target practice!"] = "Вы завершили учебную стрельбу!", -- TargetPractice + ["You have gained an achievement: %s"] = "Вы получили достижение: %s", -- User_Mission_-_RCPlane_Challenge -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab + ["You have launched %d bazookas."] = "Вы запустили %d базук.", -- Basic_Training_-_Bazooka + ["You have launched %d homing bees."] = "Вы запустили %d пчёлок.", -- Target_Practice_-_Homing_Bee + ["You have made %d shots."] = "Вы сделали %d выстрелов.", -- Basic_Training_-_Sniper_Rifle + ["You haven't rescued anyone."] = "Вы никого не спасли.", -- User_Mission_-_That_Sinking_Feeling + ["You have obtained an achievement: Lively Lifeguard"] = "Вы получили достижение: Живучий Спасатель", -- User_Mission_-_That_Sinking_Feeling + ["You have perfectly beaten the challenge!"] = "Вы прекрасно прошли испытание!", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy --- ["You have SCORED!!"] = "", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb + ["You have SCORED!!"] = "Вы доставили флаг!!", + ["You have shot %d times."] = "Вы выстрелили %d раз.", -- TargetPractice + ["You have thrown %d grenades."] = "Вы бросили %d гранат.", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard + ["You have to destroy 12 targets in 180 seconds"] = "Тебе надо уничтожить 12 целей за 180 секунд", -- Basic_Training_-_Cluster_Bomb + ["You have used only 1 RC plane. Outstanding!"] = "Вы использовали всего 1 самолёт. Выдающееся достижение!", -- User_Mission_-_RCPlane_Challenge + ["You have used %d RC planes."] = "Вы использовали %d самолётов.", -- User_Mission_-_RCPlane_Challenge + ["You have successfully finished the sniper rifle training!"] = "Вы успешно завершили тренировку со снайперской винтовкой!", -- Basic_Training_-_Sniper_Rifle -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow @@ -1122,33 +1254,42 @@ -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab -- ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy --- ["You may only attack from a rope!"] = "", -- WxW --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode + ["You lose!"] = "Вы проиграли!", -- Basic_Training_-_Bazooka + ["You may only attack from a rope!"] = "Вы можете атаковать только с верёвки!", -- WxW + ["You may only spawn 5 crates per turn."] = "Вы можете создавать только 5 ящиков за ход.", -- Construction_Mode + ["You may only use 1 Extra Time per turn."] = "Вы можете использовать Дополнительное Время только один раз за ход.", -- Construction_Mode -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab + ["You must survive the flood in order to score."] = "Вы должны пережить наводнение, чтобы заработать очки.", -- User_Mission_-_That_Sinking_Feeling -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood + ["Your accuracy was %.1f%%."] = "Ваша точность составила %.1f%%.", -- Basic_Training_-_Bazooka + ["Your accuracy was %.1f%% (+%d points)."] = "Ваша точность составила %.1f%% (+%d очков).", -- TargetPractice -- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy -- ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow -- ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope + ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "У тебя хорошо получается! |Подсказка: Когда веревка укорачивается, ты двигаешься быстрее! |А когда удлиняется - медленнее!", -- Basic_Training_-_Rope -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow + ["Your hedgehog died!"] = "Ваш ёж умер!", -- User_Mission_-_That_Sinking_Feeling -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood + ["Your rank: %s"] = "Ваш ранк: %s", -- User_Mission_-_RCPlane_Challenge -- ["You saved"] = "", + ["You saved %d of 8 Hapless Hogs."] = "Вы спасли %d из 8 Несчастных Ёжиков", -- User_Mission_-_That_Sinking_Feeling -- ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy --- ["You've failed. Try again."] = "", --- ["You've reached the goal!| |Time: "] = "", + ["You've failed. Try again."] = "Ты проиграл. Попробуй еще раз.", + ["You've reached the goal!| |Time: "] = "Вы достигли цели!| |Время: ", -- ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow -- ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies -- ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab -- ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family -- ["Zealandia"] = "", -- Continental_supplies --- ["'Zooka Team"] = "", + ["zombi"] = "Зомби", -- portal + ["Zook"] = "Зук", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard + ["'Zooka Team"] = "Команда Зука", -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen } diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Locale/ru.txt --- a/share/hedgewars/Data/Locale/ru.txt Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Locale/ru.txt Mon Nov 09 16:34:03 2015 +0000 @@ -42,7 +42,7 @@ 00:39=Летающая тарелка 00:40=Коктейль Молотова 00:41=Птичка -00:42=Портативный телепорт +00:42=Портальная Пушка 00:43=Фортепьяновый удар 00:44=Старый Лимбургер 00:45=Синус-пушка (бета) @@ -59,6 +59,7 @@ 00:55=Замораживатель 00:56=Секач 00:57=Батут +00:58=Воздушная мина 01:00=Вперёд к победе! 01:01=Ничья @@ -83,6 +84,9 @@ 01:20=%1 отскок 01:21=Звук отключен 01:22=Режим отсутствия +01:23=Авто Камера Выкл. +01:24=Авто Камера Вкл. +01:25=Нажмите кнопку мишени для указания цели ; Event messages ; Hog (%1) died @@ -454,6 +458,10 @@ 03:53=Модель 40 ;03:54=Построй что нибудь 03:54=Полезная вещь +03:55=Холоднее уже не будет! +03:56=Употребляй или злоупотребляй +03:57=Полезная вещь +03:58=Летающая неконтактная бомба ; Weapon Descriptions (use | as line breaks) 04:00=Атакуй своих врагов обычной гранатой.|Она взорвется сразу, как только таймер|достигнет нуля.|1-5: Установить таймер гранаты|Атака: Удерживай для более дальнего броска @@ -506,6 +514,15 @@ 04:47=Удвой веселье с двумя шипованными, коварными,|липучими минами. Устрой цепную реакцию или|защити себя (или то и другое!)|Атака: Удерживай для более дальнего броска|(дважды) 04:48=Почему кротам достаются все оскорбления?|Вакингующий ёж может быть столь забавным!|Хороший удар этого молота сбреет треть|здоровья ежа и погрузит его в землю.|Атака: Ударить молотом 04:49=Воскреси своих друзей!|Но будь осторожен, т.к. оно также воскресит|твоих врагов.|Атака: Удерживай атаку нажатой для медленного|воскрешения|Вверх: Ускорить воскрешение +04:50=Кто-то скрывается под землёй?|Достань их сверлящим ударом!|Таймер контролирует глубину бурения.|Влево/Вправо: Определить направление атаки|1-5: Установить таймер|Курсор: Выбрать бомбардируемую область +04:51=Швырни в противника комок грязи задаром!|Не наносит урона, но сталкивает|ежей и другие объекты назад.|Атака: Удерживай для более дальнего броска +04:52=Не используется +04:53=Проделайте путь сквозь время и пространство,|пока ваши соратники борятся в одиночестве.|Будьте готовы вернуться в любое время,|при Внезапной Смерти или когда все союзники повержены.|Предупреждение. Не работает во время Внезапной Смерти,|если вы один или если вы Король.|Атака: Активировать +04:54=Распыляет поток липких хлопьеы.|Строит мосты, хоронит врагов, перекрывает туннели.|Будьте осторожны - эти хлопья не прилипают к вам!|Атака: Активировать|Вверх/Вниз: Продолжать прицельную стрельбу|Влево/Вправо: Изменить силу (дальность) распыления +04:55=Bерните ледниковый период!|Замораживает ежей, делает пол скользким или|спасает вас от утопления, замораживая воду.|Атака: Включить/Выключить замораживатель|Вверх/Вниз: Продолжать прицельную стрельбу +04:56=Вы можете бросить два секача во врага,|заблокировать проходы и туннели|и даже использовать их для восхождения!|Bострожно! Игры с ножами опасны.|Атака: Удерживай для выстрела с большей силой (дважды) +04:57=Строит ОЧЕНЬ эластичный батут, от которого|ежи и другие объекты будут отскакивать|без получения урона.|Влево/Вправо: Изменить положение батута|Курсор: Разместить батут в нужной позиции +04:58=Эта неконтактная бомба будет свободно летать в воздухе|и следовать за неосторожными ежами,|подходящими к ней слишком близко.|Однако, урон от взрыва слабее урона от обычной мины.|Атака: Удерживай для выстрела с большей силой ; Game goal strings 05:00=Режимы игры diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Locale/stub.lua --- a/share/hedgewars/Data/Locale/stub.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Locale/stub.lua Mon Nov 09 16:34:03 2015 +0000 @@ -10,8 +10,11 @@ -- ["+2 for becoming a Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Accuracy Bonus!"] = "", +-- ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle -- ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["Achievement obtained: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling -- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler -- ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood -- ["???"] = "", -- A_Classic_Fairytale:backstab @@ -30,6 +33,7 @@ -- ["a Hedgewars tag game"] = "", -- Mutant -- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome -- ["Aiming Practice"] = "", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow @@ -71,13 +75,16 @@ -- ["Attack From Rope"] = "", -- WxW -- ["Australia"] = "", -- Continental_supplies -- ["Available points remaining: "] = "", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab -- ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united -- ["[Backspace]"] = "", -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape -- ["Ballgun"] = "", -- Construction_Mode --- ["Bamboo Thicket"] = "", +-- ["Bamboo Thicket"] = "", -- User_Mission_-_Bamboo_Thicket -- ["Barrel Eater!"] = "", -- ["Barrel Launcher"] = "", -- ["Barrel Placement Mode"] = "", -- Construction_Mode @@ -88,6 +95,8 @@ -- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 -- ["Bazooka Training"] = "", -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Best laps per team: "] = "", -- ["Best Team Times: "] = "", -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon @@ -101,12 +110,14 @@ -- ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree -- ["Blowtorch"] = "", -- Construction_Mode, Frenzy -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow -- ["BOOM!"] = "", -- ["Boom!"] = "", -- ["Boss defeated!"] = "", -- ["Boss Slayer!"] = "", +-- ["BOTTOM FEEDER"] = "", -- Mutant -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united @@ -125,6 +136,8 @@ -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal -- ["Cake"] = "", -- Construction_Mode -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood @@ -133,9 +146,13 @@ -- ["CAPTURE THE FLAG"] = "", -- ["Careless"] = "", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge"] = "", -- SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Challenge completed!"] = "", -- SpeedShoppa +-- ["Challenge failed!"] = "", -- SpeedShoppa -- ["Change Weapon"] = "", -- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow -- ["Cleaver"] = "", -- Construction_Mode -- ["Cleaver Placement Mode"] = "", -- Construction_Mode @@ -160,29 +177,36 @@ -- ["Configuration accepted."] = "", -- WxW -- ["Congratulations!"] = "", -- ["Congratulations"] = "", -- Basic_Training_-_Rope +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge -- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb -- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- Basic_Training_-_Rope -- ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "", --Bazooka, Shotgun, SniperRifle -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies --- ["Control pillars to score points."] = "", +-- ["CONTROL"] = "", -- Control +-- ["Control pillars to score points."] = "", -- Control +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh -- ["Core"] = "", -- Construction_Mode -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode -- ["Crate Placement Tool"] = "", -- Construction_Mode --- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["crate(s)"] = "", -- SpeedShoppa +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa -- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies -- ["Current setting is "] = "", -- Gravity --- ["Cybernetic Empire"] = "", +-- ["Cybernetic Empire"] = "", -- User_Mission_-_Bamboo_Thicket -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab -- ["DAMMIT, ROOKIE!"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "", --- ["Dangerous Ducklings"] = "", +-- ["Dangerous Ducklings"] = "", -- User_Mission_-_Dangerous_Ducklings -- ["Deadweight"] = "", +-- ["deaths"] = "", -- Mutant -- ["Decrease"] = "", -- Continental_supplies -- ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab -- ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united @@ -191,20 +215,25 @@ -- ["Defend your core from the enemy."] = "", -- Construction_Mode -- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow -- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Demo"] = "", -- The_Specialists -- ["Demolition is fun!"] = "", -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow -- ["Depleted Kamikaze!"] = "", +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh -- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 -- ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood -- ["Destroy invaders to score points."] = "", -- ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood -- ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood +-- ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united -- ["Did you see him coming?"] = "", -- A_Classic_Fairytale:shadow -- ["Did you warn the village?"] = "", -- A_Classic_Fairytale:shadow -- ["Die, die, die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling -- ["Dist: "] = "", -- Space_Invasion -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood @@ -220,7 +249,8 @@ -- ["Drone Hunter!"] = "", -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies --- ["Drowner"] = "", +-- ["Drowner"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab @@ -239,6 +269,7 @@ -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape -- ["Eliminate all enemies"] = "", @@ -250,8 +281,11 @@ -- ["Eliminate the enemy hogs to win."] = "", -- ["Eliminate the enemy specialists."] = "", -- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "", +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Energetic Engineer"] = "", +-- ["Enabled"] = "", -- WxW +-- ["Energetic Engineer"] = "", -- User_Mission_-_Bamboo_Thicket +-- ["Engineer"] = "", -- The_Specialists -- ["Enjoy the swim..."] = "", -- ["[Enter]"] = "", -- ["Europe"] = "", -- Continental_supplies @@ -260,6 +294,7 @@ -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab +-- ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Extra Damage"] = "", -- Construction_Mode -- ["Extra Time"] = "", -- Construction_Mode -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey @@ -288,10 +323,12 @@ -- ["Flamer"] = "", -- ["Flamethrower"] = "", -- Construction_Mode -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey -- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy -- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey -- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy @@ -338,14 +375,18 @@ -- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode -- ["Gravity"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["GREAT ! Let's kill all this enemies, using portals"] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies -- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow -- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy @@ -355,7 +396,8 @@ -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil -- ["Hapless Hogs"] = "", --- [" Hapless Hogs left!"] = "", +-- ["%d Hapless Hogs left"] = "", +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh -- [" HAS MUTATED"] = "", -- Mutant -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow @@ -363,6 +405,7 @@ -- ["Healing Station"] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode -- ["Health crates extend your time."] = "", +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy"] = "", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy @@ -372,6 +415,7 @@ -- ["Hedgewars-Knockball"] = "", -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab -- ["Heh, it's not that bad."] = "", +-- ["Hell Army"] = "", -- portal -- ["Hellish Handgrenade"] = "", -- Construction_Mode -- ["Hello again, "] = "", -- A_Classic_Fairytale:family -- ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey @@ -389,6 +433,7 @@ -- ["Hey guys!"] = "", -- A_Classic_Fairytale:united -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey -- ["HIGHLANDER"] = "", -- Highlander +-- ["hiden"] = "", -- portal -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood -- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey @@ -396,6 +441,7 @@ -- ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood -- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka -- ["Hmmm..."] = "", -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal @@ -406,7 +452,9 @@ -- ["HOLY SHYTE!"] = "", -- Mutant -- ["Homing Bee"] = "", -- Construction_Mode -- ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy +-- ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes -- ["Hooray!"] = "", +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon @@ -438,6 +486,7 @@ -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow @@ -447,6 +496,7 @@ -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab -- ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family -- ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey +-- ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab @@ -471,18 +521,23 @@ -- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon -- ["INSANITY"] = "", -- Mutant -- ["Instructor"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow -- ["invaders destroyed"] = "", +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united -- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["I should get myself a portal gun, maybe this crate has one"] = "", -- portal -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon @@ -529,6 +584,7 @@ -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood -- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing -- ["Land Sprayer"] = "", -- Construction_Mode -- ["Laser Sight"] = "", -- Construction_Mode -- ["Last Target!"] = "", @@ -542,6 +598,7 @@ -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["[Left Shift]"] = "", -- ["left shift"] = "", -- Continental_supplies +-- ["Lestat"] = "", -- portal -- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey @@ -562,7 +619,9 @@ -- ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab -- ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy -- ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy +-- ["Loon"] = "", -- The_Specialists -- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Lucifer"] = "", -- portal -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united -- ["LUDICROUS KILL"] = "", -- Mutant -- ["Made it!"] = "", -- ClimbHome @@ -571,6 +630,7 @@ -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies -- ["MEGA KILL"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["milliseconds"] = "", -- SpeedShoppa -- ["Mindy"] = "", -- A_Classic_Fairytale:united -- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", @@ -579,8 +639,10 @@ -- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork -- ["Mine Strike"] = "", -- Construction_Mode -- ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["Mission lost!"] = "", -- Basic_Training_-_Grenade -- ["MISSION SUCCESS"] = "", -- ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade -- ["Molotov Cocktail"] = "", -- Construction_Mode -- ["Molotov"] = "", -- Continental_supplies -- ["MONSTER KILL"] = "", -- Mutant @@ -592,6 +654,7 @@ -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow -- ["-------"] = "", -- Mutant +-- ["MUTANT"] = "", -- Mutant -- ["Mutant"] = "", -- Mutant -- ["Nade Boy"] = "", -- Basic_Training_-_Grenade -- ["Name"] = "", -- A_Classic_Fairytale:queen @@ -611,6 +674,7 @@ -- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- The_Specialists -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey @@ -649,6 +713,7 @@ -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood -- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood +-- ["oneye"] = "", -- portal -- ["on Skip"] = "", -- Continental_supplies -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood @@ -669,14 +734,15 @@ -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["phosphatoglucidique"] = "", -- portal -- ["Piano Strike"] = "", -- Construction_Mode -- ["Pickhammer"] = "", -- Construction_Mode -- ["Pings left:"] = "", -- Space_Invasion -- ["Place more waypoints using the 'Air Attack' weapon."] = "", --- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow +-- ["player"] = "", -- portal -- ["Please place the way-point further from the waterline."] = "", -- Racer -- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow @@ -688,21 +754,28 @@ -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon -- ["Portal mission"] = "", -- portal -- ["Power Remaining"] = "", +-- ["Predator"] = "", -- portal -- ["Prepare yourself"] = "", -- ["presice"] = "", -- Continental_supplies -- ["Press [Enter] to accept this configuration."] = "", -- WxW -- ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood -- ["Press [Precise] to skip intro"] = "", -- ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb -- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow +-- ["Pyro"] = "", -- The_Specialists -- ["Race complexity limit reached."] = "", -- ["RACER"] = "", -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Radar Ping"] = "", -- Space_Invasion -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge -- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["razac"] = "", -- portal -- ["RC Plane"] = "", -- Construction_Mode -- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow @@ -713,14 +786,21 @@ -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow -- ["REMOVED"] = "", -- Continental_supplies +-- ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling -- ["Respawner"] = "", -- Construction_Mode -- ["Resurrector"] = "", -- Construction_Mode -- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode -- [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "", -- ["Return to Leaks A Lot! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["Rider"] = "", -- portal -- ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["ronald"] = "", -- portal -- ["Rope"] = "", -- Construction_Mode -- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master!"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope to safety"] = "", -- ClimbHome -- ["Rope Training"] = "", -- Basic_Training_-_Rope -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow @@ -736,6 +816,7 @@ -- ["s|"] = "", -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies +-- ["Saint"] = "", -- The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon @@ -749,6 +830,7 @@ -- ["Score"] = "", -- Mutant -- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka -- ["Seduction"] = "", -- Continental_supplies -- ["Seems like every time you take a \"walk\", the enemy find us!"] = "", -- A_Classic_Fairytale:backstab -- ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood @@ -771,6 +853,8 @@ -- ["Shield OFF:"] = "", -- ["Shield ON:"] = "", -- ["Shield Seeker!"] = "", +-- ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Shoppers"] = "", -- SpeedShoppa -- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 -- ["Shotgun"] = "", -- Continental_supplies -- ["Shotgun Team"] = "", @@ -792,16 +876,19 @@ -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Sniper"] = "", -- The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies -- ["Sniper!"] = "", -- Space_Invasion -- ["Sniper Training"] = "", -- ["Sniperz"] = "", -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood +-- ["Soldier"] = "", -- The_Specialists -- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow -- ["Spawn the crate, and attack!"] = "", -- WxW -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speed Shoppa"] = "", -- SpeedShoppa -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united -- ["Sponge"] = "", @@ -818,6 +905,7 @@ -- ["Structure Placement Mode"] = "", -- Construction_Mode -- ["Structure Placement Tool"] = "", -- Construction_Mode +-- ["Subject"] = "", -- portal -- ["Sundaland"] = "", -- Continental_supplies -- ["Super Weapons"] = "", -- WxW -- ["Support Station"] = "", -- Construction_Mode @@ -835,9 +923,17 @@ -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon -- ["Tardis"] = "", -- Construction_Mode -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice -- ["Team %d: "] = "", +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Team Scores"] = "", -- Control, Space_Invasion --- ["Teleporation Node"] = "", -- Construction_Mode +-- ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Teleportation Mode"] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy @@ -863,6 +959,7 @@ -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow -- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon -- ["The enemy is hiding out on yonder ducky!"] = "", @@ -871,11 +968,13 @@ -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow -- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant -- ["The flag will respawn next round."] = "", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood -- ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape -- ["The Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode -- ["The guardian"] = "", -- A_Classic_Fairytale:shadow +-- ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb -- ["The Individualist"] = "", -- A_Classic_Fairytale:shadow -- ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey @@ -929,15 +1028,18 @@ -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", -- ["This rain is really something..."] = "", +-- ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge -- ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family -- ["TIME: "] = "", -- ["Timed Kamikaze!"] = "", -- ["Time Extended!"] = "", -- ["Time Extension"] = "", +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope -- ["Toggle Shield"] = "", -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey -- [" to save the village."] = "", -- A_Classic_Fairytale:dragon @@ -945,7 +1047,9 @@ -- ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork -- ["TRACK COMPLETED"] = "", +-- ["Trainee"] = "", -- TargetPractice -- ["training"] = "", -- portal +-- ["Training Team"] = "", -- TargetPractice -- ["Traitors"] = "", -- A_Classic_Fairytale:epil -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab -- ["TrophyRace"] = "", @@ -962,25 +1066,28 @@ -- ["Under Construction"] = "", -- A_Classic_Fairytale:shadow -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies --- ["Unit"] = "", +-- ["Unit"] = "", -- User_Mission_-_Newton_and_the_Hammock -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united -- ["Unit 3378"] = "", --- ["Unit 835"] = "", +-- ["Unit 835"] = "", -- User_Mission_-_Bamboo_Thicket -- ["United We Stand"] = "", -- A_Classic_Fairytale:united -- ["Unlimited Attacks"] = "", -- ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["Unstoppable!"] = "", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", -- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode -- ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon +-- ["Use the portal to move fast and far, use it to kill, use it with caution!"] = "", -- portal -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa -- ["Use your rope to get from start to finish as fast as you can!"] = "", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode -- ["Vampirism"] = "", -- Construction_Mode @@ -988,6 +1095,7 @@ -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy -- ["Victory!"] = "", -- Basic_Training_-_Rope -- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag +-- ["voldemort"] = "", -- portal -- ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood -- ["Walls Left"] = "", -- WxW -- ["Walls Required"] = "", -- WxW @@ -1067,6 +1175,7 @@ -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab +-- ["Will be useful if I need a new plateform or if I want to rise...."] = "", -- portal -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies -- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies @@ -1100,21 +1209,43 @@ -- ["You'd almost swear the water was rising!"] = "", -- ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey -- ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope +-- ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice -- ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab -- ["You have "] = "", -- A_Classic_Fairytale:dragon -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab -- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope -- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey -- ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the target practice!"] = "", -- TargetPractice +-- ["You have gained an achievement: %s"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have launched %d bazookas."] = "", -- Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy -- ["You have SCORED!!"] = "", +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard -- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow @@ -1122,13 +1253,17 @@ -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab -- ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy +-- ["You lose!] = "", -- Basic_Training_-_Bazooka -- ["You may only attack from a rope!"] = "", -- WxW -- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode -- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice -- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy -- ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow -- ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab @@ -1138,9 +1273,12 @@ -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood +-- ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You saved"] = "", +-- ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy -- ["You've failed. Try again."] = "", -- ["You've reached the goal!| |Time: "] = "", @@ -1149,6 +1287,8 @@ -- ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab -- ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family -- ["Zealandia"] = "", -- Continental_supplies +-- ["zombi"] = "", -- portal +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["'Zooka Team"] = "", -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen } diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Maps/Control/map.lua --- a/share/hedgewars/Data/Maps/Control/map.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Maps/Control/map.lua Mon Nov 09 16:34:03 2015 +0000 @@ -369,7 +369,7 @@ --AddCaption(zz) -- number of times it took to work end - ShowMission("CONTROL", + ShowMission(loc("CONTROL"), "", loc("Control pillars to score points.") .. "|" .. loc("Goal") .. ": " .. pointLimit .. " " .. loc("points"), 0, 0) @@ -418,7 +418,7 @@ end end - ShowMission("CONTROL", + ShowMission(loc("CONTROL"), loc("Team Scores") .. ":", totalComment, 0, 1600) diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Maps/TrophyRace/map.lua --- a/share/hedgewars/Data/Maps/TrophyRace/map.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Maps/TrophyRace/map.lua Mon Nov 09 16:34:03 2015 +0000 @@ -33,6 +33,7 @@ local worsthog = nil local besthog = nil +local besthogname = '' -- best time local besttime = maxtime + 1 @@ -142,6 +143,7 @@ if ttime < besttime then besttime = ttime besthog = CurrentHedgehog + besthogname = GetHogName(besthog) hscore = hscore .. loc("NEW fastest lap: ") else hscore = hscore .. loc("Fastest lap: ") @@ -150,7 +152,7 @@ worsttime = ttime worsthog = CurrentHedgehog end - hscore = hscore .. GetHogName(besthog) .. " - " .. (besttime / 1000) .. " s | |" .. loc("Best laps per team: ") + hscore = hscore .. besthogname .. " - " .. (besttime / 1000) .. " s | |" .. loc("Best laps per team: ") if clan == ClansCount -1 then -- Time for elimination - worst hog is out and the worst hog vars are reset. diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Mon Nov 09 16:34:03 2015 +0000 @@ -141,7 +141,7 @@ game_lost = true time_goal = 1 AddCaption(loc("You lose!"), 0xFFFFFFFF, capgrpGameState) - ShowMission(loc("Bazooka Training"), loc("Aiming practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0) + ShowMission(loc("Bazooka Training"), loc("Aiming Practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0) end -- If the goal is reached or we've lost ... @@ -162,11 +162,11 @@ SendStat(siCustomAchievement, string.format(loc("Your accuracy was %.1f%%."), (score/shots)*100)) end if score == score_goal then - SendStat(siGameResult, "You have finished the bazooka training!") + SendStat(siGameResult, loc("You have finished the bazooka training!")) SendStat(siCustomAchievement, string.format(loc("%.1f seconds were remaining."), (time_goal/1000), math.ceil(time_goal/12))) end if game_lost then - SendStat(siGameResult, "You lose!") + SendStat(siGameResult, loc("You lose!")) end -- Finally we end the game ... @@ -224,7 +224,7 @@ if not game_lost then game_lost = true AddCaption(loc("You lose!", 0xFFFFFFFF, capgrpGameState)) - ShowMission(loc("Bazooka Training") , loc("Aiming practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0) + ShowMission(loc("Bazooka Training") , loc("Aiming Practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0) time_goal = 1 end diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Mon Nov 09 16:34:03 2015 +0000 @@ -134,9 +134,9 @@ if end_timer == 0 then -- Override the 'Draw' message with the appropriate message. if game_lost then - AddCaption("Mission lost!", 0xffba00ff,capgrpGameState) + AddCaption(loc("Mission lost!"), 0xffba00ff,capgrpGameState) else - AddCaption("Mission won!", 0xffba00ff,capgrpGameState) + AddCaption(loc("Mission won!"), 0xffba00ff,capgrpGameState) end -- Remove the team to end the game. Only do this once. if team_death == false then diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua --- a/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Mon Nov 09 16:34:03 2015 +0000 @@ -1,7 +1,7 @@ HedgewarsScriptLoad("/Scripts/SpeedShoppa.lua") local params = {} -params.missionTitle = loc("The Customor is King") +params.missionTitle = loc("The Customer is King") params.teamName = loc("Shoppa Union") params.hogName = loc("King Customer") params.teamFlag = "cm_shoppa" diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua Mon Nov 09 16:34:03 2015 +0000 @@ -3,7 +3,7 @@ local params = { ammoType = amBazooka, gearType = gtShell, - missionTitle = "Target Practice: Bazooka (easy)", + missionTitle = loc("Target Practice: Bazooka (easy)"), wind = 50, solidLand = true, map = "Lonely_Island", diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua Mon Nov 09 16:34:03 2015 +0000 @@ -3,7 +3,7 @@ local params = { ammoType = amBazooka, gearType = gtShell, - missionTitle = "Target Practice: Bazooka (hard)", + missionTitle = loc("Target Practice: Bazooka (hard)"), wind = 20, solidLand = true, artillery = true, diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua Mon Nov 09 16:34:03 2015 +0000 @@ -3,7 +3,7 @@ local params = { ammoType = amClusterBomb, gearType = gtClusterBomb, - missionTitle = "Cluster Bomb Training", + missionTitle = loc("Cluster Bomb Training"), solidLand = false, map = "Trash", theme = "Golf", diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua Mon Nov 09 16:34:03 2015 +0000 @@ -3,7 +3,7 @@ local params = { ammoType = amGrenade, gearType = gtGrenade, - missionTitle = "Target Practice: Grenade (easy)", + missionTitle = loc("Target Practice: Grenade (easy)"), solidLand = true, artillery = true, map = "SB_Crystal", diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua Mon Nov 09 16:34:03 2015 +0000 @@ -3,7 +3,7 @@ local params = { ammoType = amGrenade, gearType = gtGrenade, - missionTitle = "Target Practice: Grenade (hard)", + missionTitle = loc("Target Practice: Grenade (hard)"), solidLand = true, artillery = true, map = "SB_Crystal", diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua Mon Nov 09 16:34:03 2015 +0000 @@ -3,7 +3,7 @@ local params = { ammoType = amBee, gearType = gtBee, - missionTitle = "Target Practice: Homing Bee", + missionTitle = loc("Target Practice: Homing Bee"), solidLand = true, map = "Hedgewars", theme = "Nature", diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua Mon Nov 09 16:34:03 2015 +0000 @@ -3,7 +3,7 @@ local params = { ammoType = amShotgun, gearType = gtShotgunShot, - missionTitle = "Target Practice: Shotgun", + missionTitle = loc("Target Practice: Shotgun"), solidLand = false, map = "SB_Haunty", theme = "Halloween", diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Mon Nov 09 16:34:03 2015 +0000 @@ -21,7 +21,7 @@ SuddenDeathTurns = 99999 AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default") - player = AddHog("Ikeda", 0, 10, "StrawHat") + player = AddHog(loc("Ikeda"), 0, 10, "StrawHat") AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default") enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg1") diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Mon Nov 09 16:34:03 2015 +0000 @@ -22,7 +22,7 @@ Theme = "Nature" AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default") - player = AddHog("Ikeda", 0, 48, "StrawHat") + player = AddHog(loc("Ikeda"), 0, 48, "StrawHat") AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default") enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg1") diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua Mon Nov 09 16:34:03 2015 +0000 @@ -27,21 +27,21 @@ SetGearPosition(hhs[2], 1332, 451) AddTeam(loc("Clowns"), 1175851, "Duck2", "Tank", "Mobster", "cm_spider") - hhs[3] = AddHog("Poison", 5, 100, "WhySoSerious") + hhs[3] = AddHog(loc("Poison"), 5, 100, "WhySoSerious") SetGearPosition(hhs[3], 1133, 446) - hhs[4] = AddHog("Bobo", 5, 100, "clown") + hhs[4] = AddHog(loc("Bobo"), 5, 100, "clown") SetGearPosition(hhs[4], 1215, 553) - hhs[5] = AddHog("Copper", 5, 10, "clown-copper") + hhs[5] = AddHog(loc("Copper"), 5, 10, "clown-copper") SetGearPosition(hhs[5], 414, 376) - hhs[6] = AddHog("Derp", 5, 100, "clown-crossed") + hhs[6] = AddHog(loc("Derp"), 5, 100, "clown-crossed") SetGearPosition(hhs[6], 1590, 886) - hhs[7] = AddHog("Eckles", 5, 100, "clown-copper") + hhs[7] = AddHog(loc("Eckles"), 5, 100, "clown-copper") SetGearPosition(hhs[7], 772, 754) - hhs[8] = AddHog("Frank", 5, 50, "clown-copper") + hhs[8] = AddHog(loc("Frank"), 5, 50, "clown-copper") SetGearPosition(hhs[8], 1688, 714) - hhs[9] = AddHog("Harry", 5, 50, "clown-copper") + hhs[9] = AddHog(loc("Harry"), 5, 50, "clown-copper") SetGearPosition(hhs[9], 1932, 837) - hhs[10] = AddHog("Igmund", 5, 50, "WhySoSerious") + hhs[10] = AddHog(loc("Igmund"), 5, 50, "WhySoSerious") SetGearPosition(hhs[10], 1601, 733) end diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Mon Nov 09 16:34:03 2015 +0000 @@ -216,10 +216,10 @@ if (waterPix >= 1615) and (GameOver == false) then GameOver = true - AddCaption("The flood has stopped! Challenge over.") + AddCaption(loc("The flood has stopped! Challenge over.")) SendStat(siGameResult, loc("Challenge completed!")) SendStat(siPlayerKills, tostring(hhCount), loc("Nameless Heroes")) - SendStat(siPointType, "rescues") + SendStat(siPointType, loc("rescues")) -- Do not count drowning hedgehogs local hhLeft = hhCount @@ -283,7 +283,7 @@ SendStat(siCustomAchievement, loc("You haven't rescued anyone.")) end SendStat(siPlayerKills, "0", loc("Nameless Heroes")) - SendStat(siPointType, "points") + SendStat(siPointType, loc("points")) SendStat(siGameResult, loc("Disqualified!")) GameOver = true diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua Mon Nov 09 16:34:03 2015 +0000 @@ -20,7 +20,7 @@ player = AddHog(loc("Good Dude"), 0, 80, "NoHat") --NoHat AddTeam(loc("Bad Team"), 1175851, "Simple", "Island", "Default", "Hedgewars") - enemy = AddHog("Bad Guy", 1, 40, "NoHat") + enemy = AddHog(loc("Bad Guy"), 1, 40, "NoHat") end diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Missions/Training/portal.lua --- a/share/hedgewars/Data/Missions/Training/portal.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Missions/Training/portal.lua Mon Nov 09 16:34:03 2015 +0000 @@ -16,29 +16,29 @@ Delay = 10 -- The delay between each round Map = "portal" -- The map to be played Theme = "Hell" -- The theme to be used - Goals = "use the portal to move fast and far, use it to kill, use it with caution !" --the goal ... + Goals = loc("Use the portal to move fast and far, use it to kill, use it with caution!") --the goal ... ----AddTeam(teamname, color, grave, fort, voicepack, flag)-- - AddTeam("Subject", 14483406, "Simple", "Island", "Default", "cm_star") - player = AddHog("player", 0, 10, "Terminator_Glasses") + AddTeam(loc("Subject"), 14483406, "Simple", "Island", "Default", "cm_star") + player = AddHog(loc("player"), 0, 10, "Terminator_Glasses") - AddTeam("Hell Army", 1170801, "Simple", "Island", "Default", "cm_galaxy") - enemy1 = AddHog("Lucifer", 1, 200, "thinkingcap") - enemy2 = AddHog("voldemort", 1, 150, "WizardHat") - enemy3 = AddHog("zombi", 1, 100, "zombi") - enemy4 = AddHog("Predator", 1, 14, "predator") - enemy5 = AddHog("oneye", 1, 50, "cyclops") - enemy6 = AddHog("razac", 1, 50, "plaguemask") - enemy7 = AddHog("C-2", 1, 50, "cyborg1") - enemy8 = AddHog("Rider", 1, 50, "scif_SparkssHelmet") + AddTeam(loc("Hell Army"), 1170801, "Simple", "Island", "Default", "cm_galaxy") + enemy1 = AddHog(loc("Lucifer"), 1, 200, "thinkingcap") + enemy2 = AddHog(loc("voldemort"), 1, 150, "WizardHat") + enemy3 = AddHog(loc("zombi"), 1, 100, "zombi") + enemy4 = AddHog(loc("Predator"), 1, 14, "predator") + enemy5 = AddHog(loc("oneye"), 1, 50, "cyclops") + enemy6 = AddHog(loc("razac"), 1, 50, "plaguemask") + enemy7 = AddHog(loc("C-2"), 1, 50, "cyborg1") + enemy8 = AddHog(loc("Rider"), 1, 50, "scif_SparkssHelmet") - AddTeam("badmad", 1170801, "Simple", "Island", "Default", "cm_jupiter") - enemy9 = AddHog("C-1", 1, 50, "cyborg2") - enemy10 = AddHog("hiden", 1, 40, "daftpunkguymanuel") - enemy11 = AddHog("ronald", 1, 70, "clown") - enemy12 = AddHog("phosphatoglucidique", 1, 50, "chef") - enemy13 = AddHog("Lestat", 1, 30, "draculakz") + AddTeam(loc("badmad"), 1170801, "Simple", "Island", "Default", "cm_jupiter") + enemy9 = AddHog(loc("C-1"), 1, 50, "cyborg2") + enemy10 = AddHog(loc("hiden"), 1, 40, "daftpunkguymanuel") + enemy11 = AddHog(loc("ronald"), 1, 70, "clown") + enemy12 = AddHog(loc("phosphatoglucidique"), 1, 50, "chef") + enemy13 = AddHog(loc("Lestat"), 1, 30, "draculakz") SetGearPosition(player, 350, 1820) SetGearPosition(enemy1, 2037, 1313) @@ -168,7 +168,7 @@ ShowMission (loc("Portal mission"), loc("training"), "", -amPortalGun, 5000) - HogSay(player, "I should get myself a portal gun, maybe this crate has one", SAY_THINK) + HogSay(player, loc("I should get myself a portal gun, maybe this crate has one"), SAY_THINK) @@ -204,11 +204,11 @@ if gear == portalgun then --AddAmmo(player, amPortalGun, 10000) - HogSay(player, "GREAT ! Let's kill all this enemies, using portals", SAY_THINK) + HogSay(player, loc("GREAT ! Let's kill all this enemies, using portals"), SAY_THINK) end if gear == girder then - HogSay(player, "Will be useful if I need a new plateform or if I want to rise....", SAY_THINK) + HogSay(player, loc("Will be useful if I need a new plateform or if I want to rise...."), SAY_THINK) end if gear == parachute then diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Mon Nov 09 16:34:03 2015 +0000 @@ -1517,7 +1517,7 @@ end - AddCaption(cat[cIndex],0xffba00ff,capgrpMessage) + AddCaption(loc(cat[cIndex]),0xffba00ff,capgrpMessage) AddCaption(pMode[pIndex],0xffba00ff,capgrpMessage2) wallsVisible = true else @@ -1791,7 +1791,7 @@ loc("Generator") .. ": " .. loc("Generates power.") .. "|" .. loc("Respawner") .. ": " .. loc("Resurrects dead hedgehogs.") .. "|" .. - loc("Teleporation Node") .. ": " .. loc("Allows free teleportation between other nodes.") .. "|" .. + loc("Teleportation Node") .. ": " .. loc("Allows free teleportation between other nodes.") .. "|" .. loc("Construction Station") .. ": " .. loc("Allows placement of girders, rubber-bands, mines, sticky mines and barrels.") .. "|" .. loc("Support Station") .. ": " .. loc("Allows the placement of weapons, utiliites, and health crates.") .. "|" .. diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Mon Nov 09 16:34:03 2015 +0000 @@ -302,7 +302,7 @@ if teams[i]~= nil then local curr_score = getTeamValue(teams[i], "Score") - showScore = showScore .. teams[i] .. ": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" + showScore = showScore .. teams[i] .. ": " .. curr_score .. " (" .. loc("deaths") .. ": " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" end end @@ -329,7 +329,7 @@ runOnHogsInTeam(removeFeeder, teams[i]) - showScore = showScore .. teams[i] ..": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" + showScore = showScore .. teams[i] ..": " .. curr_score .. " (" .. loc("deaths") .. ": " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" if curr_score >= winScore then gameOver = true @@ -421,7 +421,7 @@ function setFeeder(gear) if gear~= mutant and gear~= nil then - SetHogName(gear,"BOTTOM FEEDER") + SetHogName(gear, loc("BOTTOM FEEDER")) SetHogHat(gear, 'poke_slowpoke') setGearValue(gear,"Feeder", true) end @@ -430,7 +430,7 @@ function setMutantStuff(gear) mutant = gear - SetHogName(gear,"MUTANT") + SetHogName(gear, loc("MUTANT")) SetHogHat(gear,'WhySoSerious') SetHealth(gear, ( mutant_base_health + numhhs*25) ) SetEffect(gear, hePoisoned, 1) diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Mon Nov 09 16:34:03 2015 +0000 @@ -127,48 +127,48 @@ if z == 1 then - SetHogName(hhs[i],"Soldier") + SetHogName(hhs[i],loc("Soldier")) SetHogHat(hhs[i], "sf_vega") SetHealth(hhs[i],200) elseif z == 2 then SetHogHat(hhs[i], "Glasses") - SetHogName(hhs[i],"Engineer") + SetHogName(hhs[i],loc("Engineer")) elseif z == 3 then - SetHogName(hhs[i],"Ninja") + SetHogName(hhs[i],loc("Ninja")) SetHogHat(hhs[i], "NinjaFull") SetHealth(hhs[i],80) elseif z == 4 then - SetHogName(hhs[i],"Demo") + SetHogName(hhs[i],loc("Demo")) SetHogHat(hhs[i], "Skull") SetHealth(hhs[i],200) elseif z == 5 then - SetHogName(hhs[i],"Sniper") + SetHogName(hhs[i],loc("Sniper")) SetHogHat(hhs[i], "Sniper") SetHealth(hhs[i],120) elseif z == 6 then - SetHogName(hhs[i],"Saint") + SetHogName(hhs[i],loc("Saint")) SetHogHat(hhs[i], "angel") SetHealth(hhs[i],300) elseif z == 7 then - SetHogName(hhs[i],"Pyro") + SetHogName(hhs[i],loc("Pyro")) SetHogHat(hhs[i], "Gasmask") SetHealth(hhs[i],150) elseif z == 8 then - SetHogName(hhs[i],"Loon") + SetHogName(hhs[i],loc("Loon")) SetHogHat(hhs[i], "clown") SetHealth(hhs[i],100) diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Scripts/Multiplayer/WxW.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Tue Oct 06 13:28:11 2015 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Mon Nov 09 16:34:03 2015 +0000 @@ -158,9 +158,9 @@ function BoolToCfgTxt(p) if p == false then - return("Disabled") + return loc("Disabled") else - return("Enabled") + return loc("Enabled") end end diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Shaders/CMakeLists.txt diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Shaders/default.fs diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Shaders/default.vs diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Shaders/water.fs diff -r 5438a3907d59 -r 91370591662b share/hedgewars/Data/Shaders/water.vs diff -r 5438a3907d59 -r 91370591662b tools/CMakeLists.txt --- a/tools/CMakeLists.txt Tue Oct 06 13:28:11 2015 +0200 +++ b/tools/CMakeLists.txt Mon Nov 09 16:34:03 2015 +0000 @@ -58,7 +58,7 @@ #create the .dmg for deployment #first make sure .app exists, then remove any old .dmg with same name, finally run the script - add_custom_target(dmg COMMAND "if [ ! -a Hedgewars.app ]; then make install\; fi;" + add_custom_target(dmg COMMAND make install COMMAND rm -f ${CMAKE_BINARY_DIR}/Hedgewars-${HEDGEWARS_VERSION}.dmg COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create-dmg.sh --volname "Hedgewars ${HEDGEWARS_VERSION}"