# HG changeset patch
# User hwmirror
# Date 1447086872 0
# Node ID 14de659a4b796775d8b1b154d082c9b7b57b6bf3
# Parent 91370591662bead0e825fa4fd5116f05ffd22186# Parent 721210d689a569038188485eceb8cfc9fd84bff7
Merge with github pull requests
diff -r 721210d689a5 -r 14de659a4b79 .hgtags
--- a/.hgtags Thu Oct 01 12:17:42 2015 +0200
+++ b/.hgtags Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 CMakeLists.txt
--- a/CMakeLists.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/CMakeLists.txt Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 ChangeLog.txt
--- a/ChangeLog.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/ChangeLog.txt Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 QTfrontend/res/html/about.html
--- a/QTfrontend/res/html/about.html Thu Oct 01 12:17:42 2015 +0200
+++ b/QTfrontend/res/html/about.html Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 QTfrontend/util/LibavInteraction.cpp
--- a/QTfrontend/util/LibavInteraction.cpp Thu Oct 01 12:17:42 2015 +0200
+++ b/QTfrontend/util/LibavInteraction.cpp Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 README
--- a/README Thu Oct 01 12:17:42 2015 +0200
+++ b/README Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 README.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 gameServer/Actions.hs
--- a/gameServer/Actions.hs Thu Oct 01 12:17:42 2015 +0200
+++ b/gameServer/Actions.hs Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 gameServer/CoreTypes.hs
--- a/gameServer/CoreTypes.hs Thu Oct 01 12:17:42 2015 +0200
+++ b/gameServer/CoreTypes.hs Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 gameServer/EngineInteraction.hs
--- a/gameServer/EngineInteraction.hs Thu Oct 01 12:17:42 2015 +0200
+++ b/gameServer/EngineInteraction.hs Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 gameServer/OfficialServer/GameReplayStore.hs
--- a/gameServer/OfficialServer/GameReplayStore.hs Thu Oct 01 12:17:42 2015 +0200
+++ b/gameServer/OfficialServer/GameReplayStore.hs Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 gameServer/OfficialServer/extdbinterface.hs
--- a/gameServer/OfficialServer/extdbinterface.hs Thu Oct 01 12:17:42 2015 +0200
+++ b/gameServer/OfficialServer/extdbinterface.hs Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 gameServer/Utils.hs
--- a/gameServer/Utils.hs Thu Oct 01 12:17:42 2015 +0200
+++ b/gameServer/Utils.hs Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/CMakeLists.txt
--- a/hedgewars/CMakeLists.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/CMakeLists.txt Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/avwrapper/avwrapper.c
--- a/hedgewars/avwrapper/avwrapper.c Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/avwrapper/avwrapper.c Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/hwengine.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/options.inc
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uChat.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uGears.pas
--- a/hedgewars/uGears.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uGears.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uGearsHandlersMess.pas
--- a/hedgewars/uGearsHandlersMess.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uGearsHandlersMess.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uGearsHandlersRope.pas
--- a/hedgewars/uGearsHandlersRope.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uGearsHandlersRope.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uGearsHedgehog.pas
--- a/hedgewars/uGearsHedgehog.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uGearsHedgehog.pas Mon Nov 09 16:34:32 2015 +0000
@@ -451,7 +451,7 @@
if CurAmmoType = amAirMine then newGear^.Hedgehog:= nil;
if ((CurAmmoType = amMine) or (CurAmmoType = amSMine) or (CurAmmoType = amAirMine)) and (GameFlags and gfInfAttack <> 0) then
- newGear^.FlightTime:= GameTicks + 1000
+ newGear^.FlightTime:= GameTicks + min(TurnTimeLeft,1000)
else if CurAmmoType = amDrill then
newGear^.FlightTime:= GameTicks + 250;
if Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0 then
@@ -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 721210d689a5 -r 14de659a4b79 hedgewars/uGearsList.pas
--- a/hedgewars/uGearsList.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uGearsList.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uGearsRender.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uLandGenTemplateBased.pas
--- a/hedgewars/uLandGenTemplateBased.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uLandGenTemplateBased.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uLandTexture.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uLocale.pas
--- a/hedgewars/uLocale.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uLocale.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uMatrix.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uRender.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uRenderUtils.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uScript.pas
--- a/hedgewars/uScript.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uScript.pas Mon Nov 09 16:34:32 2015 +0000
@@ -628,7 +628,9 @@
begin
gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
HealthCrate, 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);
@@ -642,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);
@@ -656,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);
@@ -675,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);
@@ -694,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);
@@ -713,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 721210d689a5 -r 14de659a4b79 hedgewars/uSound.pas
--- a/hedgewars/uSound.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uSound.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uStore.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uTextures.pas
diff -r 721210d689a5 -r 14de659a4b79 hedgewars/uTouch.pas
--- a/hedgewars/uTouch.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uTouch.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uTypes.pas
--- a/hedgewars/uTypes.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uTypes.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uVariables.pas
--- a/hedgewars/uVariables.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uVariables.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 hedgewars/uWorld.pas
--- a/hedgewars/uWorld.pas Thu Oct 01 12:17:42 2015 +0200
+++ b/hedgewars/uWorld.pas Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj
--- a/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Thu Oct 01 12:17:42 2015 +0200
+++ b/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj
--- a/misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj Thu Oct 01 12:17:42 2015 +0200
+++ b/misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj
--- a/misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj Thu Oct 01 12:17:42 2015 +0200
+++ b/misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 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 721210d689a5 -r 14de659a4b79 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 721210d689a5 -r 14de659a4b79 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/AboutViewController.m
--- a/project_files/HedgewarsMobile/Classes/AboutViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/AboutViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/Appirater.h
--- a/project_files/HedgewarsMobile/Classes/Appirater.h Thu Oct 01 12:17:42 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/Appirater.m
--- a/project_files/HedgewarsMobile/Classes/Appirater.m Thu Oct 01 12:17:42 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/CreationChamber.m
--- a/project_files/HedgewarsMobile/Classes/CreationChamber.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/CreationChamber.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/EditableCellView.m
--- a/project_files/HedgewarsMobile/Classes/EditableCellView.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/EditableCellView.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m
--- a/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/FortsViewController.m
--- a/project_files/HedgewarsMobile/Classes/FortsViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/FortsViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/GameConfigViewController.h
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/GameConfigViewController.m
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m
--- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h
--- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h Mon Nov 09 16:34:32 2015 +0000
@@ -18,9 +18,9 @@
#import
-
+#import "TableViewControllerWithDoneButton.h"
-@interface GeneralSettingsViewController : UITableViewController {
+@interface GeneralSettingsViewController : TableViewControllerWithDoneButton {
}
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m
--- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HWUtils.h
--- a/project_files/HedgewarsMobile/Classes/HWUtils.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HWUtils.h Mon Nov 09 16:34:32 2015 +0000
@@ -41,6 +41,7 @@
+(NSInteger) randomPort;
+(void) freePort:(NSInteger) port;
+(BOOL) isNetworkReachable;
++(NSString *) languageID;
//+(UIView *)mainSDLViewInstance;
@end
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HWUtils.m
--- a/project_files/HedgewarsMobile/Classes/HWUtils.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HWUtils.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m
--- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib
--- a/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib Mon Nov 09 16:34:32 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}
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib
--- a/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib Mon Nov 09 16:34:32 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
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HogHatViewController.h
--- a/project_files/HedgewarsMobile/Classes/HogHatViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HogHatViewController.m
--- a/project_files/HedgewarsMobile/Classes/HogHatViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/HoldTableViewCell.m
--- a/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/LevelViewController.m
--- a/project_files/HedgewarsMobile/Classes/LevelViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/LevelViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m Mon Nov 09 16:34:32 2015 +0000
@@ -34,8 +34,6 @@
- (void)dealloc
{
self.cornerBackgroundColor = nil;
-
- [super dealloc];
}
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m Mon Nov 09 16:34:32 2015 +0000
@@ -31,8 +31,6 @@
- (void)dealloc
{
self.splitViewController = nil;
-
- [super dealloc];
}
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m Mon Nov 09 16:34:32 2015 +0000
@@ -152,8 +152,6 @@
_delegate = nil;
_viewControllers = nil;
[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
-
- [super dealloc];
}
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MainMenuViewController.h
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MainMenuViewController.m
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MapConfigViewController.m
--- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m
--- a/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h
--- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m
--- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib
--- a/project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib
--- a/project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/RestoreViewController.m
--- a/project_files/HedgewarsMobile/Classes/RestoreViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/RestoreViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SavedGamesViewController.h
--- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SavedGamesViewController.m
--- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib
--- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h
--- a/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m
--- a/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m
--- a/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m
--- a/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h
--- a/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m
--- a/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SettingsContainerViewController.h
--- a/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.h Thu Oct 01 12:17:42 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SettingsContainerViewController.m
--- a/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.m Thu Oct 01 12:17:42 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m
--- a/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SingleTeamViewController.h
--- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SingleTeamViewController.m
--- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m
--- a/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/StatsPageViewController.m
--- a/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SupportViewController.h
--- a/project_files/HedgewarsMobile/Classes/SupportViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SupportViewController.h Mon Nov 09 16:34:32 2015 +0000
@@ -18,9 +18,9 @@
#import
-
+#import "TableViewControllerWithDoneButton.h"
-@interface SupportViewController : UITableViewController {
+@interface SupportViewController : TableViewControllerWithDoneButton {
NSArray *waysToSupport;
}
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/SupportViewController.m
--- a/project_files/HedgewarsMobile/Classes/SupportViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SupportViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h
--- a/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m
--- a/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 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:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/VoicesViewController.m
--- a/project_files/HedgewarsMobile/Classes/VoicesViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/VoicesViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h
--- a/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m
--- a/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj
--- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Info.plist
--- a/project_files/HedgewarsMobile/Info.plist Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Info.plist Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/English.lproj/About.strings
Binary file project_files/HedgewarsMobile/Locale/English.lproj/About.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/English.lproj/Localizable.strings
Binary file project_files/HedgewarsMobile/Locale/English.lproj/Localizable.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/English.lproj/Scheme.strings
Binary file project_files/HedgewarsMobile/Locale/English.lproj/Scheme.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/ru.lproj/About.strings
Binary file project_files/HedgewarsMobile/Locale/ru.lproj/About.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/ru.lproj/Localizable.strings
Binary file project_files/HedgewarsMobile/Locale/ru.lproj/Localizable.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/ru.lproj/Scheme.strings
Binary file project_files/HedgewarsMobile/Locale/ru.lproj/Scheme.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/tr.lproj/About.strings
Binary file project_files/HedgewarsMobile/Locale/tr.lproj/About.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/tr.lproj/Localizable.strings
Binary file project_files/HedgewarsMobile/Locale/tr.lproj/Localizable.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Locale/tr.lproj/Scheme.strings
Binary file project_files/HedgewarsMobile/Locale/tr.lproj/Scheme.strings has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/bullet.png
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/bullet@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/bullet_filled.png
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet_filled.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/bullet_filled@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet_filled@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/flower.png
Binary file project_files/HedgewarsMobile/Resources/Icons/flower.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/flower@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/flower@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/flower_filled.png
Binary file project_files/HedgewarsMobile/Resources/Icons/flower_filled.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/flower_filled@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/flower_filled@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/heart.png
Binary file project_files/HedgewarsMobile/Resources/Icons/heart.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/heart@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/heart@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/heart_filled.png
Binary file project_files/HedgewarsMobile/Resources/Icons/heart_filled.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/heart_filled@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/heart_filled@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/target.png
Binary file project_files/HedgewarsMobile/Resources/Icons/target.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/target@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/target@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/target_filled.png
Binary file project_files/HedgewarsMobile/Resources/Icons/target_filled.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/target_filled@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/target_filled@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/teams.png
Binary file project_files/HedgewarsMobile/Resources/Icons/teams.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/teams@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/teams@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/teams_filled.png
Binary file project_files/HedgewarsMobile/Resources/Icons/teams_filled.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/Icons/teams_filled@2x.png
Binary file project_files/HedgewarsMobile/Resources/Icons/teams_filled@2x.png has changed
diff -r 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/basicFlags.plist
--- a/project_files/HedgewarsMobile/Resources/basicFlags.plist Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Resources/basicFlags.plist Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 project_files/HedgewarsMobile/Resources/credits.plist
--- a/project_files/HedgewarsMobile/Resources/credits.plist Thu Oct 01 12:17:42 2015 +0200
+++ b/project_files/HedgewarsMobile/Resources/credits.plist Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/CMakeLists.txt
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Locale/en.txt
--- a/share/hedgewars/Data/Locale/en.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Locale/en.txt Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Locale/missions_it.txt
--- a/share/hedgewars/Data/Locale/missions_it.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Locale/missions_it.txt Mon Nov 09 16:34:32 2015 +0000
@@ -43,5 +43,41 @@
User_Mission_-_Rope_Knock_Challenge.name=Sfida: a colpi di corda
User_Mission_-_Rope_Knock_Challenge.desc="Guarda sempre dietro di te!"
+User_Mission_-_Nobody_Laugh.name=Missione: Nessuno ride
+User_Mission_-_Nobody_Laugh.desc="Questo non è un gioco."
+
User_Mission_-_RCPlane_Challenge.name=Sfida: aereo radiocomandato
-User_Mission_-_RCPlane_Challenge.desc="Ti senti abbastanza sicuro, eh, aviatore?"
\ No newline at end of file
+User_Mission_-_RCPlane_Challenge.desc="Ti senti abbastanza sicuro, eh, aviatore?"
+
+portal.name=Missione: Sfida il portale della mente
+portal.desc="Usa il portale per muoverti velocemente e lontano, usalo per uccidere, ma usalo con cauzione!"
+
+Target_Practice_-_Bazooka_easy.name=Tiro al Bersaglio: Bazooka (facile)
+Target_Practice_-_Bazooka_easy.desc="Ok, soldati, fate saltare questi bersagli più in fretta che potete!"
+
+Target_Practice_-_Bazooka_hard.name=Tiro al Bersaglio: Bazooka (difficile)
+Target_Practice_-_Bazooka_hard.desc="Puoi colpire i bersagli anche quando sono molto lontani?"
+
+Target_Practice_-_Cluster_Bomb.name=Tiro al Bersaglio: Bomba Cluster
+Target_Practice_-_Cluster_Bomb.desc="A qualcuno serve una doccia calda!"
+
+Target_Practice_-_Shotgun.name=Tiro al Bersaglio: Shotgun
+Target_Practice_-_Shotgun.desc="Prima spara, poi fai le domande!"
+
+Target_Practice_-_Homing_Bee.name=Tiro al Bersaglio: Ape a ricerca
+Target_Practice_-_Homing_Bee.desc="Usare l'ape a ricerca è più complicato di quello che sembra."
+
+Target_Practice_-_Grenade_easy.name=Tiro al Bersagio: Granata (facile)
+Target_Practice_-_Grenade_easy.desc="Un training di riscaldamento per aspiranti granatieri."
+
+Target_Practice_-_Grenade_hard.name=Tiro al Bersagio: Granata (difficile)
+Target_Practice_-_Grenade_hard.desc="Questo non è per novellini! Piazzeremo i bersagli in posti veramente difficili."
+
+Challenge_-_Speed_Shoppa_-_Hedgelove.name=Sfida: Amo Shoppa
+Challenge_-_Speed_Shoppa_-_Hedgelove.desc="Fai vedere il tuo amore e colleziona alcune casse in una mappa piccola."
+
+Challenge_-_Speed_Shoppa_-_Ropes.name=Sfida: Funi e Casse
+Challenge_-_Speed_Shoppa_-_Ropes.desc="Prendi la tua fune e colleziona tutte le casse in questa mappa media."
+
+Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Sfida: Il Cliente è il Re
+Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Fai vedere che sei degno di un vero re e colleziona tutte le casse più in fretta che puoi in questa mappa grande."
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Locale/missions_ru.txt
--- a/share/hedgewars/Data/Locale/missions_ru.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Locale/missions_ru.txt Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Locale/ru.lua
--- a/share/hedgewars/Data/Locale/ru.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Locale/ru.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Locale/ru.txt
--- a/share/hedgewars/Data/Locale/ru.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Locale/ru.txt Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Locale/stub.lua
--- a/share/hedgewars/Data/Locale/stub.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Locale/stub.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Locale/tips_it.xml
--- a/share/hedgewars/Data/Locale/tips_it.xml Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Locale/tips_it.xml Mon Nov 09 16:34:32 2015 +0000
@@ -6,52 +6,73 @@
Scegli lo stesso colore di un amico per giocare in squadra. Ciascuno controllerà i propri ricci ma la vittoria o la sconfitta saranno comuni.
Alcune armi potrebbero fare pochi danni ma possono essere devastanti se usate al momento giusto. Prova ad esempio ad utilizzare la Desert Eagle per spingere più ricci in acqua.
Se non sai cosa fare e non vuoi sprecare munizioni, salta il turno. Ma non farlo troppe volte perché c'è il Sudden Death!
+ Vuoi utilizzare più a lungo la corda? Rilascia la corda a mezz'aria e spara di nuovo. Finché non tocchi il terreno potrai riusare la corda senza sprecare munizioni!
Se vuoi evitare che altri possano impersonarti, utilizzando il tuo nickname, sul server ufficiale, registrati su http://www.hedgewars.org/.
Sei stanco delle partite preimpostate? Prova una missione - le missioni offrono interessanti modalità differenti di partite in base alle tue scelte.
Il gioco salverà sempre l'ultima partita giocata come demo. Seleziona 'Gioco locale' e clicca il bottone 'Demos' nell'angolo in basso a destra per gestirle.
- Hedgewars è un programma Open Source e gratuito che noi creiamo nel nostro tempo libero. Se hai problemi, chiedi nei nostri forum ma, per favore, non aspettarti un supporto 24/7!
+ Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Se hai problemi, chiedi nei nostri forum oppure visita il nostro canale IRC!
Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Se ti piace, aiutaci con una piccola donazione o contribuisci con il tuo lavoro!
- Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Condividilo con tutta la famiglia e e con gli amici come più ti piace!
- Di tanto in tanto ci saranno tornei ufficiali. Gli eventi saranno annunciati su http://www.hedgewars.org/ con qualche giorno di anticipo.
+ Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Condividilo con tutta la famiglia e con gli amici come più ti piace!
+ Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Incontra gli sviluppatori sul canale #hedgewars !
+ Di tanto in tanto ci saranno tornei ufficiali. Gli eventi saranno annunciati su http://www.hedgewars.org/ con qualche giorno di anticipo.
Hedgewars è disponibile in molte lingue. Se la traduzione nella tua lingua sembra mancante o non aggiornata, sentiti libero di contattaci!
- Hedgewars può essere usato su molti sistemi operativi differenti come Microsoft Windows - XP, Vista, 7 -, Mac OS X e Linux.
+ Hedgewars può essere usato su molti sistemi operativi differenti come Microsoft Windows, Mac OS X e GNU/Linux.
Ricordati che sei sempre in grado di configurare partire personalizzate in locale e online. Non devi sentirti limitato alle opzioni predefinite!
- Durante il gioco dovresti fare una breve pausa almeno ogni ora. In caso di partite più lunghe, sospendi l'attività per almeno 30 minuti al termine del gioco!
+ Collega uno o più gamepad prima di iniziare il gioco per poterli assegnare alle tue squadra.
+ Durante il gioco dovresti fare una breve pausa almeno ogni ora per evitare la stanchezza da gioco eccessivo.
Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad abilitare la modalità a bassa qualità per migliorare le prestazioni.
+ Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad aggiornarne i driver.
Siamo aperti a suggerimenti e consigli costruttivi. Se non ti piace qualcosa o hai una buona idea, comunicacelo!
In particolare quando giochi online sii educato e ricorda che potrebbero esserci dei minorenni che stanno giocando con te o contro di te!
- Le modalità di gioco speciali, come 'Vampirismo' o 'Karma' ti permettono di sviluppare nuove tattiche. Provale in una partita personalizzata!
+ Le modalità di gioco speciali, come “Vampirismo” o “Karma” ti permettono di sviluppare nuove tattiche. Provale in una partita personalizzata!
Non dovresti mai installare Hedgewars su computer che non possiedi (scuola, università, lavoro, ecc.). Per favore, chiedi ai responsabili!
Hedgewars può essere perfetto per brevi partite durante le pause. Assicurati solamente di non aver aggiunto troppi ricci o di usare una mappa troppo grande. Ridurre tempo e vita può aiutare allo stesso modo.
Nessun riccio è stato maltrattato durante lo sviluppo di questo gioco.
- Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Se qualcuno ti ha venduto il gioco, dovresti chiedere un rimborso!
- Collega uno o più gamepad prima di iniziare il gioco per poterli assegnare alle tue squadra.
- Crea un account su %1 per evitare che altri possano usare il tuo nickname preferito mentre giochi sul server ufficiale.
- Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad aggiornarne i driver.
- Ci sono tre salti disponibili. Premi [salto in alto] due volte per eseguire un salto in alto all'indietro.
+ Ci sono tre tipi di salto disponibili. Premi [salto in alto] due volte per eseguire un salto in alto all'indietro.
Paura di cadere da un dirupo? Premi [mirino di precisione] per girare a [sinistra] o a [destra] senza muoverti.
Alcune armi richiedono strategie particolari o semplicemente molto allenamento, quindi non arrenderti nell'utilizzo di un'arma specifica se manchi il nemico una volta.
Molte armi non funzionano quando toccano l'acqua. L'Ape a Ricerca così come la Torta sono delle eccezioni.
Il vecchio Limburger causa solo una piccola esplosione. Tuttavia il vento influisce sulla nuvola puzzolente e può avvelenare più ricci contemporaneamente.
- L'Ultima Sonata è l'attacco aereo più dannoso. Perderai il tuo riccio, eseguendolo, quindi ci sono anche delle grosse controindicazioni.
- Le Mine Adesive sono lo strumento perfetto per creare piccole reazioni a catena e spingere i ricci nemici in situazioni difficili... o in acqua.
+ L'Ultima Sonata è l'attacco aereo più dannoso. Perderai il tuo riccio, eseguendolo, quindi c'è anche una grossa controindicazione.
+ L'Ape a Ricerca può essere difficile da usare. Il suo raggio di curvatura dipende dalla sua velocità, quindi cerca di non usarla a piena potenza.
+ Le Mine Adesive sono lo strumento perfetto per creare piccole reazioni a catena e spingere i ricci nemici in situazioni difficili … o in acqua.
Il Martello è più efficate se usato su ponti o travi. Colpire i ricci li farà sprofondare attraverso il terreno.
Se sei bloccato dietro un riccio nemico, usa il Martello per liberarti senza essere danneggiato da un'esplosione.
La distanza massima di cammino della Torta dipende dal terreno che deve attraversare. Usa [attacca] per farla esplodere prima.
Il Lanciafiamme è un'arma che può essere usata anche per scavare gallerie.
+ Usa la Bomba Molotov o il Lanciafiamme per impedire temporaneamente ai ricci di attraversare terreni pianeggianti, tunnel o collinette.
Vuoi sapere chi c'è dietro il gioco? Clicca sul logo Hedgewars nel menu principale per vederne gli autori e sviluppatori.
- Ti piace Hedgewars? Diventa fan su %1 o seguici su %2!
- Sentiti libero di disegnare tombe, cappelli, bandiere o anche mappe e temi personalizzati - lo puoi fare con TheGIMP! Ma nota che dovrai condividerli in qualche modo per usarli online.
- Vuoi proprio un cappello specifico? Facci una piccola donazione e riceverai un cappello esclusivo a tua scelta!
+ Ti piace Hedgewars? Diventa fan su Facebook oppure seguici su Twitter
+ Sentiti libero di disegnare tombe, cappelli, bandiere o anche mappe e temi personalizzati! Ma nota che dovrai condividerli in qualche modo per usarli online.
Mantieni aggiornati i driver della tua scheda video, per evitare problemi durante il gioco.
- Puoi trovare i file di configurazione del gioco in "Documenti\Hedgewars". Crea delle copie di sicurezza o prendi i file con te, ma non modificarli manualmente!
- Puoi associare i file relativi a Hedgewars (partite salvate e registrazioni demo) al gioco, in modo da lanciarli direttamente dal tuo gestore file o browser Internet.
- Vuoi utilizzare più a lungo la corda? Rilascia la corda a mezz'aria e spara di nuovo. Finché non tocchi il terreno potrai riusare la corda senza sprecare munizioni!
- Puoi trovare i file di configurazione del gioco in "Library/Application Support/Hedgewars" nella tua cartella utente. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.
- Puoi trovare i file di configurazione del gioco in ".hedgewars" nella tua cartella home. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.
- Usa la Bomba Molotov o il Lanciafiamme per impedire temporaneamente ai ricci di attraversari terreni pianeggianti, tunnel o collinette.
- L'Ape a Ricerca può essere difficile da usare. Il suo raggio di curvatura dipende dalla sua velocità, quindi cerca di non usarla a piena potenza.
+ Testa o croce? Scrivi “/rnd” nella schermata LOBBY e lo scoprirai. Funziona anche “/rnd carta sasso forbice”!
+ Puoi associare i file relativi a Hedgewars (partite salvate e registrazioni demo) al gioco, in modo da lanciarli direttamente dal tuo gestore file o browser web.
+ Le mine Dud non sono innocue: Anche se il loro timer è rotto, possono ancora esplodere se vengono abusate troppo!
+ L'amore è caldo! Utilizza Seduzione per scongelare ricci congelati.
+ Il fumo proveniente da un barile è un indicatore che è basso di “salute” e che anche piccole quantità di danno potrebbe farlo scoppiare.
+ I barili iniziano con 60 salute e subiscono danni come ricci, quindi hanno bisogno di un po' di danno per esplodere
+ Hai bisogno di più forza di rimbalzo? Modifica la forza di rimbalzo di granate, bombe a grappolo, vecchi limburgers e mine tenendo premuto [mirino di precisione] e premendo uno dei tasti del timer.
+ Hai dimenticato gli obiettivi o modificatori di gioco mentre stai giocando? Premi il pulsante pausa o esci per rivederli di nuovo!
+ Puoi prendere a pugni, frustare, e martellare anche altre cose e non solo ricci. Colpiscili tutti!
+ Se non menzionato altrimenti, le mine normalmente esplodono dopo 3 secondi.
+ In modalità Re, il tuo re partirà più sano, più forte e più resistente ai danni e colpi rispetto ai servi.
+ In modalità Re, il re si danneggerà in ogni turno quando non ci saranno più servi nella sua squadra.
+ La frusta colpisce anche i ricci e gli oggetti anche dietro una parete sottile.
+ La mannaia aumenta il danno con l'aumentare della velocità.
+ Puoi far cadere torte dalle scogliere, ma per farlo bisogna stare molto vicino al bordo, quindi stai attento.
+ Usa la tua corda per allontanare altri ricci ad esempio facendola scorrere sul terreno. Questa tecnica è nota come “rope-knocking”.
+ Non fermarti su un pendio ghiacciato, o scivolerai via. In alternativa, è possibile tenere premuto [mirino di precisione].
+ Nelle terre innevate Natalizie, i mucchi di neve aumentano nel corso del tempo, a meno che la terra non sia indistruttibile.
+ Fai attenzione nelle terre innevate e Natalizie, perché le travi sono fatte di ghiaccio scivoloso.
+ Il tempo di fuga dipende dall'arma che hai usato. Fai attenzione, alcune armi non hanno un tempo di fuga e finiscono subito il tuo turno!
- La versione Windows di Hedgewars supporta Xfire. Assicurati di aggiungere Hedgewars alla sua lista giochi, così i tuoi amici potranno vederti giocare.
+ Questa versione di Hedgewars supporta Xfire . Assicurati di aggiungere Hedgewars alla sua lista giochi, cosi i tuoi amici potranno vederti giocare.
+ Puoi trovare i file di configurazione di Hedgewars in “My Documents\Hedgewars”. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.
+
+ Puoi trovare i file di configurazione di Hedgewars in “Library/Application Support/Hedgewars” nella tua cartella utente. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.
+
+
+ Puoi trovare i file di configurazione di Hedgewars in “.hedgewars” nella tua cartella utente. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.
+
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Maps/Basketball/map.lua
--- a/share/hedgewars/Data/Maps/Basketball/map.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Maps/Basketball/map.lua Mon Nov 09 16:34:32 2015 +0000
@@ -54,3 +54,7 @@
end
end
end
+
+function onNewTurn()
+ SetWeapon(amBaseballBat)
+end
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Maps/Control/map.lua
--- a/share/hedgewars/Data/Maps/Control/map.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Maps/Control/map.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Maps/Knockball/map.lua
--- a/share/hedgewars/Data/Maps/Knockball/map.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Maps/Knockball/map.lua Mon Nov 09 16:34:32 2015 +0000
@@ -68,3 +68,7 @@
end
end
end
+
+function onNewTurn()
+ SetWeapon(amBaseballBat)
+end
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Maps/TrophyRace/map.lua
--- a/share/hedgewars/Data/Maps/TrophyRace/map.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Maps/TrophyRace/map.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua
--- a/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Missions/Training/portal.lua
--- a/share/hedgewars/Data/Missions/Training/portal.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/portal.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua
--- a/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua
--- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua
--- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Scripts/Multiplayer/WxW.lua
--- a/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Thu Oct 01 12:17:42 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Mon Nov 09 16:34:32 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 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Shaders/CMakeLists.txt
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Shaders/default.fs
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Shaders/default.vs
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Shaders/water.fs
diff -r 721210d689a5 -r 14de659a4b79 share/hedgewars/Data/Shaders/water.vs
diff -r 721210d689a5 -r 14de659a4b79 tools/CMakeLists.txt
--- a/tools/CMakeLists.txt Thu Oct 01 12:17:42 2015 +0200
+++ b/tools/CMakeLists.txt Mon Nov 09 16:34:32 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}"