merging 5 of Wuzzy's 6 patches. review for last patch pending (hwp content changes)
--- a/.hgignore Fri Sep 11 04:05:09 2015 +0200
+++ b/.hgignore Fri Apr 01 15:36:19 2016 +0200
@@ -23,10 +23,9 @@
glob:.DS_Store
glob:*.swp
glob:*.orig
-glob:*.diff
glob:vittorio.*
glob:project_files/HedgewarsMobile/Data/
-glob:project_files/HedgewarsMobile/build/
+glob:project_files/HedgewarsMobile/Build/
glob:gameServer/dist/
glob:misc/liblua/Xcode/build/
glob:misc/libphysfs/Xcode/build/
@@ -35,7 +34,6 @@
relre:^release\/
glob:*.log
glob:*.cmd
-glob:*.diff
glob:*.patch
glob:*.orig
glob:*.bak
@@ -70,3 +68,13 @@
glob:share/Info.plist
glob:CTestTestfile.cmake
glob:arch.c
+glob:*.swp
+glob:*~.nib
+glob:*.pbxuser
+glob:*.perspective
+glob:*.perspectivev3
+glob:*.project.xcworkspace
+glob:*.xcuserdata
+glob:xcuserdata
+glob:*.mode1v3
+glob:*.mode2v3
--- a/.hgtags Fri Sep 11 04:05:09 2015 +0200
+++ b/.hgtags Fri Apr 01 15:36:19 2016 +0200
@@ -63,3 +63,15 @@
af0520a6bf0061b27f8321514d35fcd2b1ef5f9c 0.9.20-release
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
+a0163b8302c592aac60d98134bb6730f390fcaad Hedgewars-iOS-2.0
+7e55468ffe384a3065524c483eb5e3cdb1658fd5 fab746a3597e
+0000000000000000000000000000000000000000 fab746a3597e
+d9622394ec9c2974a84b9b4d9e6c0ac26c4060ff 0.9.22-RC
+0000000000000000000000000000000000000000 0.9.22-RC
--- a/.travis.yml Fri Sep 11 04:05:09 2015 +0200
+++ b/.travis.yml Fri Apr 01 15:36:19 2016 +0200
@@ -1,31 +1,85 @@
language: c
+os:
+ - linux
+ - osx
branches:
- except:
- gh-pages
+ only:
+ master
compiler:
- gcc
- clang
env:
- # Default build. Release.
- BUILD_ARGS="-DCMAKE_BUILD_TYPE=Release"
- # Debug build
- BUILD_ARGS="-DCMAKE_BUILD_TYPE=Debug"
- # Everything that's optional
- - BUILD_ARGS="-DBUILD_ENGINE_C=1"
- - BUILD_ARGS="-DNOPNG=1"
- - BUILD_ARGS="-DNOVIDEOREC=1"
- - BUILD_ARGS="-DNOSERVER=1"
- - BUILD_ARGS="-DLUA_SYSTEM=0"
- - BUILD_ARGS="-DPHYSFS_SYSTEM=0"
- - BUILD_ARGS="-DGL2=1"
+ - BUILD_ARGS="-DNOSERVER=1 -DBUILD_ENGINE_C=1"
+ - BUILD_ARGS="-DNOSERVER=1 -DNOVIDEOREC=1 -DNOPNG=1"
+ - BUILD_ARGS="-DNOSERVER=1 -DLUA_SYSTEM=0 -DPHYSFS_SYSTEM=0"
matrix:
- allow_failures:
- # Failures we expect here
-before_install:
- - sudo apt-get update -qq
- - sudo apt-get install debhelper cmake dpkg-dev libqt4-dev qt4-qmake libphysfs-dev libsdl1.2-dev libsdl-ttf2.0-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsdl-net1.2-dev bzip2 ghc libghc-mtl-dev libghc-parsec3-dev libghc-bytestring-show-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-stm-dev libghc-network-dev libghc-dataenc-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev liblua5.1-0-dev imagemagick fpc fp-compiler fp-units-misc libpng-dev fp-units-gfx libavcodec-dev libavformat-dev freeglut3-dev libglew1.6-dev
-script:
- - mkdir build && cd build && cmake $BUILD_ARGS .. && make VERBOSE=1 && make test_verbose
+ include:
+ - language: objective-c
+ os: osx
+ compiler:
+ env: BUILD_ARGS="IOS" SDL_LIB_PATH="$TRAVIS_BUILD_DIR/../Library"
+ osx_image: xcode7.2
+ sudo: required
+before_install: |
+ if [ "$BUILD_ARGS" == "IOS" ]; then
+ hg clone http://hg.libsdl.org/SDL $SDL_LIB_PATH/SDL/
+ hg clone http://hg.libsdl.org/SDL_image $SDL_LIB_PATH/SDL_image/
+ hg clone http://hg.libsdl.org/SDL_net $SDL_LIB_PATH/SDL_net/
+ hg clone http://hg.libsdl.org/SDL_ttf $SDL_LIB_PATH/SDL_ttf/
+ hg clone http://hg.libsdl.org/SDL_mixer $SDL_LIB_PATH/SDL_mixer/
+ elif [ "$TRAVIS_OS_NAME" == "linux" ]; then
+ sudo add-apt-repository -y ppa:zoogie/sdl2-snapshots
+ sudo apt-get update -qq
+ elif [ "$TRAVIS_OS_NAME" == "osx" ]; then
+ brew update --all
+ fi
+install: |
+ if [ "$BUILD_ARGS" == "IOS" ]; then
+ # FPC 3.0.0 required for using FPC 3.0.1 which contains rtl for ios
+ sudo bash tools/dmg_pkg_install.sh ftp://freepascal.stack.nl/pub/fpc/dist/3.0.0/i386-macosx/fpc-3.0.0.intel-macosx.dmg
+ sudo bash tools/dmg_pkg_install.sh ftp://freepascal.stack.nl/pub/fpc/dist/3.0.0/i386-macosx/fpc-3.0.1.intel-macosx.cross.ios.dmg
+ elif [ "$TRAVIS_OS_NAME" == "linux" ]; then
+ sudo apt-get install debhelper cmake dpkg-dev libqt4-dev qt4-qmake libphysfs-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-net-dev bzip2 ghc libghc-mtl-dev libghc-parsec3-dev libghc-bytestring-show-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-stm-dev libghc-network-dev libghc-dataenc-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev liblua5.1-0-dev imagemagick fpc fp-compiler fp-units-misc libpng-dev fp-units-gfx libavcodec-dev libavformat-dev libglew1.6-dev
+ elif [ "$TRAVIS_OS_NAME" == "osx" ]; then
+ brew install fpc glew qt physfs lua51 sdl2 sdl2_image sdl2_net sdl2_ttf ffmpeg ghc cabal-install
+ brew install sdl2_mixer --with-vorbis
+ # use cabal install haskell deps, pas2c ones are covered by server
+ if [[ "$BUILD_ARGS" != *"NOSERVER"* ]]; then
+ cabal update
+ cabal install --only-dependencies gameServer/hedgewars-server.cabal
+ fi
+ if [[ "$BUILD_ARGS" == *"BUILD_ENGINE_C"* ]]; then
+ cabal update
+ cabal install --only-dependencies tools/pas2c/pas2c.cabal
+ fi
+ # avoid installing Sparkle, add default unit path
+ export BUILD_ARGS="$BUILD_ARGS -DNOAUTOUPDATE=1 -DCMAKE_Pascal_FLAGS=-Fu/usr/local/lib/fpc/$(fpc -iW)/units/x86_64-darwin/*/"
+ fi
+before_script: |
+ if [ "$BUILD_ARGS" == "IOS" ]; then
+ # More or less stable hw iOS version can be compiled with FPC 3.1.1, btw there are no (easy?) way to build it from sources,
+ # so we just temporary switch Xcode project to use FPC 3.0.1
+ git apply tools/fix_fpc_ios_build_patch.diff
+ xctool -project ./project_files/HedgewarsMobile/Hedgewars.xcodeproj -scheme UpdateDataFolder build
+ else
+ mkdir build && cd build && cmake $BUILD_ARGS ..
+ fi
+script: |
+ if [ "$BUILD_ARGS" == "IOS" ]; then
+ xctool -project ./project_files/HedgewarsMobile/Hedgewars.xcodeproj -scheme Hedgewars -configuration Release build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
+ else
+ make VERBOSE=1
+ fi
+after_success: |
+ if [ "$BUILD_ARGS" == "IOS" ]; then
+ :
+ elif [ "$TRAVIS_OS_NAME" == "linux" ]; then
+ make test_verbose
+ elif [ "$TRAVIS_OS_NAME" == "osx" ]; then
+ make install
+ fi
notifications:
email: false
irc:
@@ -36,3 +90,4 @@
- "See details at %{build_url}"
on_success: change
on_failure: always
+ skip_join: false
--- a/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -8,6 +8,12 @@
endif()
endforeach()
+foreach(hwpolicy CMP0026)
+ if(POLICY ${hwpolicy})
+ cmake_policy(SET ${hwpolicy} OLD)
+ endif()
+endforeach()
+
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules")
include(${CMAKE_MODULE_PATH}/utils.cmake)
@@ -52,13 +58,15 @@
#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)
message(STATUS "Building ${HEDGEWARS_VERSION}-r${HEDGEWARS_REVISION} (${HEDGEWARS_HASH})")
+#io library paths
+include(${CMAKE_MODULE_PATH}/paths.cmake)
#general utilities
include(${CMAKE_MODULE_PATH}/utils.cmake)
#paths initialization
@@ -110,18 +118,18 @@
endif()
endif()
-list(APPEND haskell_flags ${ghflags_parsed} "-O2")
#get BUILD_TYPE and enable/disable optimisation
message(STATUS "Using ${CMAKE_BUILD_TYPE} configuration")
if(CMAKE_BUILD_TYPE MATCHES "DEBUG")
list(APPEND haskell_flags "-Wall" # all warnings
"-debug" # debug mode
- "-dcore-lint" # internal sanity check
"-fno-warn-unused-do-bind"
+ "-O0"
)
else()
list(APPEND haskell_flags "-w" # no warnings
+ "-O2"
)
endif()
--- a/ChangeLog.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/ChangeLog.txt Fri Apr 01 15:36:19 2016 +0200
@@ -1,22 +1,54 @@
+ features
* bugfixes
+0.9.22 -> 0.9.23
+ + Improved hedgehog spawns on maps that lack land mass or free space
+ + Highlander mode displays game scheme specifics (mines timer, etc.) in ESC info
+ + AI hedgehogs know how to use Bee now
+ + Small visual effects enhancements
+ * Video recording functionality is restored
+ * Gameplay fix: 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
+ * Fixed screenshots being too bright if taken in quick succession
+ * Fixed hog-speech missing a response type (Justyouwait/"You're gonna pay for that") on some platforms (e.g. Linux)
+ * Various other fixes
+
+Lua-API:
+ + New call: SetCinematicMode(enable) -- e.g. for cutscenes etc.
+
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 functions: 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
+ + Parameters are now optional for the generic gear setters. i.e. - SetVisualGearValues(gear, x, y). nil values are skipped and not set.
+ + PlaceSprite can now set land type (bouncy, indestructible, ice etc), colour the sprite, flip the sprite, and place the sprite behind existing land.
+ + EraseSprite. Can flip and selectively erase based on land flags.
+ + More of the gear structure values are now accessible in the generic gear getter/setter.
+ * 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.
--- a/INSTALL Fri Sep 11 04:05:09 2015 +0200
+++ b/INSTALL Fri Apr 01 15:36:19 2016 +0200
@@ -2,10 +2,10 @@
- CMake >= 2.6.0
- FreePascal >= 2.2.4
- Qt >= 4.7.0
- - SDL >= 1.2.5
- - SDL_net >= 1.2.5
- - SDL_mixer >= 1.2
- - SDL_image >= 1.2
+ - SDL >= 2.0
+ - SDL_net >= 2.0
+ - SDL_mixer >= 2.0
+ - SDL_image >= 2.0
- SDL_ttf >= 2.0
- Lua = 5.1.0
- Physfs >= 2.0.0
@@ -16,7 +16,6 @@
- hslogger package
For videorecording:
- FFmpeg or LibAV
- - GLUT (when SDL < 2)
For compressed screenshots:
- libpng
--- a/QTfrontend/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -20,8 +20,10 @@
message(FATAL_ERROR "This version of Qt is known *not* to work, please update or use a lower version")
endif()
-find_package(SDL1or2) #video in SDLInteraction
-find_package(SDL_mixer REQUIRED) #audio in SDLInteraction
+find_package(SDL2 REQUIRED)
+find_package(SDL2_mixer REQUIRED) #audio in SDLInteraction
+include_directories(${SDL2_INCLUDE_DIR})
+include_directories(${SDL2MIXER_INCLUDE_DIR})
if(LIBAV_FOUND)
add_definitions(-DVIDEOREC -D__STDC_CONSTANT_MACROS)
@@ -60,8 +62,6 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/widget)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/util)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/util/platform)
-include_directories(${SDL_INCLUDE_DIR})
-include_directories(${SDLMIXER_INCLUDE_DIR})
include_directories(BEFORE ${PHYSFS_INCLUDE_DIR})
include_directories(BEFORE ${PHYSLAYER_INCLUDE_DIR})
include_directories(${LUA_INCLUDE_DIR}) #brought by physlayer hwpacksmounter.h
@@ -204,13 +204,16 @@
list(APPEND HW_LINK_LIBS
physfs physlayer
${QT_LIBRARIES}
- ${SDL_LIBRARY}
- ${SDLMIXER_LIBRARY}
+ )
+
+list(APPEND HW_LINK_LIBS
+ ${SDL2_LIBRARY}
+ ${SDL2MIXER_LIBRARY}
)
if(WIN32 AND NOT UNIX)
- if(NOT SDL_LIBRARY)
- list(APPEND HW_LINK_LIBS SDL)
+ if(NOT SDL2_LIBRARY)
+ list(APPEND HW_LINK_LIBS SDL2)
endif()
list(APPEND HW_LINK_LIBS
--- a/QTfrontend/Doxyfile Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/Doxyfile Fri Apr 01 15:36:19 2016 +0200
@@ -190,7 +190,7 @@
# will result in a user-defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
-ALIASES = "repo{1}=http://code.google.com/p/hedgewars/source/browse/QTfrontend/\1"
+ALIASES = "repo{1}=http://hg.hedgewars.org/hedgewars/file/default/QTfrontend/\1"
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
# sources only. Doxygen will then generate output that is more tailored for C.
--- a/QTfrontend/game.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/game.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -17,7 +17,6 @@
*/
#include <QApplication>
-#include <QClipboard>
#include <QString>
#include <QCheckBox>
@@ -261,18 +260,6 @@
.arg(QString::fromUtf8(msg.mid(2).left(size - 4))));
return;
}
- case 'y':
- {
- // copy string to clipboard
- QApplication::clipboard()->setText(QString::fromUtf8(msg.mid(2)));
- break;
- }
- case 'Y':
- {
- // paste clipboard to game
- SendIPC(QString("Y").toAscii() + QApplication::clipboard()->text().toUtf8().left(250).replace('\n', ' '));
- break;
- }
case 'i':
{
emit GameStats(msg.at(2), QString::fromUtf8(msg.mid(3)));
--- a/QTfrontend/gameuiconfig.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/gameuiconfig.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -86,10 +86,11 @@
else Form->ui.pageOptions->CBResolution->setCurrentIndex(t);
// Default the windowed resolution to 5/6 of the screen size
- int screenWidth = SDL_GetVideoInfo()->current_w * 5 / 6;
- int screenHeight = SDL_GetVideoInfo()->current_h * 5 / 6;
- QString widthStr; widthStr.setNum(screenWidth);
- QString heightStr; heightStr.setNum(screenHeight);
+ QSize screenSize = SDLInteraction::instance().getCurrentResolution();
+ screenSize *= 5.0 / 6;
+
+ QString widthStr = QString::number(screenSize.width());
+ QString heightStr = QString::number(screenSize.height());
QString wWidth = value("video/windowedWidth", widthStr).toString();
QString wHeight = value("video/windowedHeight", heightStr).toString();
// If left blank reset the resolution to the default
--- a/QTfrontend/main.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/main.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -28,6 +28,7 @@
#include <QDate>
#include <QDesktopWidget>
#include <QLabel>
+#include <QLibraryInfo>
#include "hwform.h"
#include "hwconsts.h"
@@ -37,6 +38,8 @@
#include "FileEngine.h"
#include "MessageDialog.h"
+#include "SDLInteraction.h"
+
#ifdef _WIN32
#include <Shlobj.h>
#elif defined __APPLE__
@@ -154,6 +157,8 @@
cocoaInit = new CocoaInitializer(); // Creates the autoreleasepool preventing cocoa object leaks on OS X.
#endif
+ SDLInteraction::instance();
+
HWApplication app(argc, argv);
app.setAttribute(Qt::AA_DontShowIconsInMenus,false);
@@ -314,7 +319,8 @@
engine->setWriteDir(cfgdir->absolutePath());
engine->mountPacks();
- QTranslator Translator;
+ QTranslator TranslatorHedgewars;
+ QTranslator TranslatorQt;
{
QSettings settings(DataManager::instance().settingsFileName(), QSettings::IniFormat);
settings.setIniCodec("UTF-8");
@@ -329,10 +335,13 @@
cc = HWApplication::keyboardInputLocale().name();
}
- // load locale file into translator
- if (!Translator.load(QString("physfs://Locale/hedgewars_%1").arg(cc)))
- qWarning("Failed to install translation (%s)", qPrintable(cc));
- app.installTranslator(&Translator);
+ // Load locale files into translators
+ if (!TranslatorHedgewars.load(QString("physfs://Locale/hedgewars_%1").arg(cc)))
+ qWarning("Failed to install Hedgewars translation (%s)", qPrintable(cc));
+ if (!TranslatorQt.load(QString("%1/qt_%2").arg(QLibraryInfo::location(QLibraryInfo::TranslationsPath), cc)))
+ qWarning("Failed to install Qt translation (%s)", qPrintable(cc));
+ app.installTranslator(&TranslatorHedgewars);
+ app.installTranslator(&TranslatorQt);
app.setLayoutDirection(QLocale(cc).textDirection());
}
--- a/QTfrontend/net/newnetclient.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/net/newnetclient.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -183,7 +183,7 @@
void HWNewNet::RawSendNet(const QByteArray & buf)
{
- qDebug() << "Client: " << QString(buf).split("\n");
+ qDebug() << "Client: " << QString(QString::fromUtf8(buf)).split("\n");
NetSocket.write(buf);
NetSocket.write("\n\n", 2);
}
@@ -552,7 +552,7 @@
}
netClientState = InLobby;
- RawSendNet(QString("LIST"));
+ //RawSendNet(QString("LIST")); //deprecated
emit connected();
}
@@ -945,7 +945,7 @@
qWarning("Illegal try to get rooms list!");
return;
}
- RawSendNet(QString("LIST"));
+ //RawSendNet(QString("LIST")); //deprecated
}
HWNewNet::ClientState HWNewNet::clientState()
Binary file QTfrontend/res/StatsBestKiller.png has changed
Binary file QTfrontend/res/StatsCustomAchievement.png has changed
Binary file QTfrontend/res/StatsHedgehogsKilled.png has changed
Binary file QTfrontend/res/StatsMostSelfDamage.png has changed
Binary file QTfrontend/res/StatsSelfKilled.png has changed
Binary file QTfrontend/res/StatsSkipped.png has changed
--- a/QTfrontend/res/html/about.html Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/res/html/about.html Fri Apr 01 15:36:19 2016 +0200
@@ -35,6 +35,7 @@
Keybinds, feedback, maps and hats interfaces: Drew Gottlieb <<a href="mailto:gottlieb.drew@gmail.com">gottlieb.drew@gmail.com</a>><br>
Login dialogs, frontend improvements: Ondrej Skopek <<a href="mailto:skopekondrej@gmail.com">skopekondrej@gmail.com</a>><br>
Icegun weapon: Julia Struchenko <<a href="mailto:urbertar@gmail.com">urbertar@gmail.com</a>><br>
+ iPhone/iPad ports: Anton Malmygin <<a href="mailto:antonc27@mail.ru">antonc27@mail.ru</a>><br>
</p>
<h2>Art:</h2>
@@ -82,7 +83,7 @@
Lithuanian: Lukas Urbonas <<a href="mailto:lukasu08@gmail.com">lukasu08@gmail.com</a>><br>
Polish: Maciej Mroziński <<a href="mailto:mynick2@o2.pl">mynick2@o2.pl</a>>, Wojciech Latkowski <<a href="mailto:magik17l@gmail.com">magik17l@gmail.com</a>>, Piotr Mitana, Maciej Górny<br>
Portuguese: Fábio Canário <<a href="mailto:inufabie@gmail.com">inufabie@gmail.com</a>><br>
- Russian: Andrey Korotaev <<a href="mailto:unC0Rr@gmail.com">unC0Rr@gmail.com</a>>, Vitaly Novichkov <<a href="mailto:admin@wohlnet.ru">admin@wohlnet.ru</a>><br>
+ Russian: Andrey Korotaev <<a href="mailto:unC0Rr@gmail.com">unC0Rr@gmail.com</a>>, Vitaly Novichkov <<a href="mailto:admin@wohlnet.ru">admin@wohlnet.ru</a>>, Anton Malmygin <<a href="mailto:antonc27@mail.ru">antonc27@mail.ru</a>><br>
Slovak: Jose Riha<br>
Spanish: Carlos Vives <<a href="mailto:mail@carlosvives.es">mail@carlosvives.es</a>><br>
Swedish: Niklas Grahn <<a href="mailto:raewolusjoon@yaoo.com">raewolusjoon@yaoo.com</a>>, Henrik Rostedt <<a href="mailto:henrik.rostedt@gmail.com">henrik.rostedt@gmail.com</a>><br>
--- a/QTfrontend/sdlkeys.h Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/sdlkeys.h Fri Apr 01 15:36:19 2016 +0200
@@ -118,8 +118,8 @@
{"insert", QT_TRANSLATE_NOOP("binds (keys)", "Insert")},
{"home", QT_TRANSLATE_NOOP("binds (keys)", "Home")},
{"end", QT_TRANSLATE_NOOP("binds (keys)", "End")},
- {"page up", QT_TRANSLATE_NOOP("binds (keys)", "Page up")},
- {"page down", QT_TRANSLATE_NOOP("binds (keys)", "Page down")},
+ {"page_up", QT_TRANSLATE_NOOP("binds (keys)", "Page up")},
+ {"page_down", QT_TRANSLATE_NOOP("binds (keys)", "Page down")},
{"f1", "F1"},
{"f2", "F2"},
{"f3", "F3"},
--- a/QTfrontend/ui/dialog/bandialog.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/dialog/bandialog.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -58,6 +58,7 @@
connect(btnCancel, SIGNAL(clicked()), this, SLOT(reject()));
this->setWindowModality(Qt::WindowModal);
+ this->setWindowTitle(tr("Ban player"));
}
bool BanDialog::byIP()
--- a/QTfrontend/ui/dialog/input_ip.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/dialog/input_ip.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -63,6 +63,7 @@
connect(pbDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort()));
this->setWindowModality(Qt::WindowModal);
+ this->setWindowTitle(tr("Connect to server"));
}
void HWHostPortDialog::setDefaultPort()
--- a/QTfrontend/ui/page/pagedata.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/page/pagedata.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -85,7 +85,7 @@
{
QUrl finalUrl;
if(url.host().isEmpty())
- finalUrl = QUrl("http://www.hedgewars.org" + url.path());
+ finalUrl = QUrl("https://www.hedgewars.org" + url.path());
else
finalUrl = url;
@@ -195,7 +195,7 @@
void PageDataDownload::fetchList()
{
- request(QUrl("http://hedgewars.org/content.html"));
+ request(QUrl("https://hedgewars.org/content.html"));
}
--- a/QTfrontend/ui/page/pagenetserver.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/page/pagenetserver.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -83,7 +83,7 @@
labelURL->setText(
"<style type=\"text/css\"> a { color: #ffcc00; } </style>"
"<div align=\"center\">"
- "<a href=\"https://code.google.com/p/hedgewars/wiki/HWPlaySchemeSyntax\">" +
+ "<a href=\"hedgewars.org/kb/HWPlaySchemeSyntax\">" +
tr("Click here for details") +
"</a></div>");
labelURL->setOpenExternalLinks(true);
--- a/QTfrontend/ui/widget/about.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/widget/about.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -101,14 +101,17 @@
libinfo.append(QString(tr("Unknown Compiler")).arg(__VERSION__) + QString("<br>"));
#endif
- const SDL_version *sdl_ver = SDL_Linked_Version();
- libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL</a> version: %1.%2.%3<br>")
+ const SDL_version *sdl_ver;
+ SDL_version sdl_version;
+ SDL_GetVersion(&sdl_version);
+ sdl_ver = &sdl_version;
+ libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL2</a> version: %1.%2.%3<br>")
.arg(sdl_ver->major)
.arg(sdl_ver->minor)
.arg(sdl_ver->patch));
const SDL_version *sdlmixer_ver = Mix_Linked_Version();
- libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL_mixer</a> version: %1.%2.%3<br>")
+ libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL2_mixer</a> version: %1.%2.%3<br>")
.arg(sdlmixer_ver->major)
.arg(sdlmixer_ver->minor)
.arg(sdlmixer_ver->patch));
--- a/QTfrontend/ui/widget/chatwidget.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/widget/chatwidget.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -373,7 +373,7 @@
return QString("<span class=\"nick\">%1</span>").arg(Qt::escape(nickname));
}
-const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http(s)?://)?(www\\.)?((hedgewars\\.org|code\\.google\\.com|googlecode\\.com|hh\\.unit22\\.org)(/[^ ]*)?)");
+const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http(s)?://)?(www\\.)?((([^/:?&#]+\\.)?hedgewars\\.org|code\\.google\\.com|googlecode\\.com|hh\\.unit22\\.org)(/[^ ]*)?)");
bool HWChatWidget::containsHighlight(const QString & sender, const QString & message)
{
--- a/QTfrontend/ui/widget/feedbackdialog.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/widget/feedbackdialog.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -60,6 +60,7 @@
setModal(true);
setWindowFlags(Qt::Sheet);
setWindowModality(Qt::WindowModal);
+ setWindowTitle(tr("Feedback"));
setMinimumSize(700, 460);
resize(700, 460);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
@@ -84,7 +85,7 @@
"</style>"
"<div align=\"center\"><h1>%1</h1>"
"<h3>%2<h3>"
- "<h4>%3 <a href=\"http://code.google.com/p/hedgewars/wiki/KnownBugs\">known bugs</a><h4>"
+ "<h4>%3 <a href=\"https://hedgewars.org/kb/KnownBugs\">known bugs</a><h4>"
"<h4>%4<h4>"
"</div>")
.arg(tr("Send us feedback!"))
@@ -386,7 +387,7 @@
return;
}
- QString url = "http://hedgewars.org/feedback/?captcha&id=";
+ QString url = "https://hedgewars.org/feedback/?captcha&id=";
url += QString::number(captchaID);
QNetworkAccessManager *netManager = GetNetManager();
@@ -422,7 +423,7 @@
void FeedbackDialog::LoadCaptchaImage()
{
QNetworkAccessManager *netManager = GetNetManager();
- QUrl captchaURL("http://hedgewars.org/feedback/?gencaptcha");
+ QUrl captchaURL("https://hedgewars.org/feedback/?gencaptcha");
QNetworkRequest req(captchaURL);
genCaptchaRequest = netManager->get(req);
}
@@ -492,7 +493,7 @@
connect(nam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(finishedSlot(QNetworkReply*)));
- QNetworkRequest header(QUrl("http://hedgewars.org/feedback/?submit"));
+ QNetworkRequest header(QUrl("https://hedgewars.org/feedback/?submit"));
header.setRawHeader("Content-Length", QString::number(body.size()).toAscii());
header.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
--- a/QTfrontend/ui/widget/hatprompt.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/widget/hatprompt.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -60,6 +60,7 @@
setModal(true);
setWindowFlags(Qt::Sheet);
setWindowModality(Qt::WindowModal);
+ setWindowTitle(tr("Choose a hat"));
setMinimumSize(550, 430);
resize(550, 430);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
--- a/QTfrontend/ui/widget/roomnameprompt.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/widget/roomnameprompt.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -32,6 +32,7 @@
setModal(true);
setWindowFlags(Qt::Sheet);
setWindowModality(Qt::WindowModal);
+ setWindowTitle(tr("Create room"));
setMinimumSize(360, 130);
resize(360, 180);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
--- a/QTfrontend/ui/widget/seedprompt.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/widget/seedprompt.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -31,6 +31,7 @@
setModal(true);
setWindowFlags(Qt::Sheet);
setWindowModality(Qt::WindowModal);
+ setWindowTitle(tr("Seed"));
setMinimumSize(360, 160);
resize(360, 160);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
--- a/QTfrontend/ui/widget/themeprompt.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/ui/widget/themeprompt.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -61,6 +61,7 @@
setModal(true);
setWindowFlags(Qt::Sheet);
setWindowModality(Qt::WindowModal);
+ setWindowTitle(tr("Choose a theme"));
setMinimumSize(550, 430);
resize(550, 430);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
--- a/QTfrontend/util/LibavInteraction.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/util/LibavInteraction.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -21,7 +21,9 @@
#if VIDEOREC
extern "C"
{
+#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
+#include "libavutil/avutil.h"
}
#include <QVector>
@@ -30,13 +32,28 @@
#include "HWApplication.h"
-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54, 25, 0)
-#define CodecID AVCodecID
+// compatibility section
+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 8, 0)
+#define av_codec_is_encoder(x) x->encode
+#endif
+
+#if LIBAVCODEC_VERSION_MAJOR < 55
+#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 +73,7 @@
QMap<QString,Format> 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 +93,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 +119,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 +134,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 +287,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 +321,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;
}
--- a/QTfrontend/util/SDLInteraction.cpp Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/util/SDLInteraction.cpp Fri Apr 01 15:36:19 2016 +0200
@@ -85,19 +85,15 @@
{
QStringList result;
- SDL_Rect **modes;
+ int modesNumber = SDL_GetNumDisplayModes(0);
+ SDL_DisplayMode mode;
- modes = SDL_ListModes(NULL, SDL_FULLSCREEN);
-
- if((modes == (SDL_Rect **)0) || (modes == (SDL_Rect **)-1))
+ for(int i = 0; i < modesNumber; ++i)
{
- result << "640x480";
- }
- else
- {
- for(int i = 0; modes[i]; ++i)
- if ((modes[i]->w >= 640) && (modes[i]->h >= 480))
- result << QString("%1x%2").arg(modes[i]->w).arg(modes[i]->h);
+ SDL_GetDisplayMode(0, i, &mode);
+
+ if ((mode.w >= 640) && (mode.h >= 480))
+ result << QString("%1x%2").arg(mode.w).arg(mode.h);
}
return result;
@@ -108,6 +104,9 @@
{
QStringList result;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+// TODO or not TODO?
+#else
int i = 0;
while(i < 1024 && sdlkeys[i][1][0] != '\0')
i++;
@@ -181,7 +180,8 @@
// Terminate the list
sdlkeys[i][0][0] = '\0';
- sdlkeys[i][1][0] = '\0';
+ sdlkeys[i][1][0] = '\0';
+#endif
}
@@ -243,7 +243,7 @@
if (!m_audioInitialized) return;
if (m_music == NULL)
- m_music = Mix_LoadMUS_RW(PHYSFSRWOPS_openRead(m_musicTrack.toLocal8Bit().constData()));
+ m_music = Mix_LoadMUS_RW(PHYSFSRWOPS_openRead(m_musicTrack.toLocal8Bit().constData()), 0);
Mix_VolumeMusic(MIX_MAX_VOLUME/4);
Mix_FadeInMusic(m_music, -1, 1750);
@@ -264,3 +264,12 @@
m_isPlayingMusic = false;
}
+
+QSize SDLInteraction::getCurrentResolution()
+{
+ SDL_DisplayMode mode;
+
+ SDL_GetDesktopDisplayMode(0, &mode);
+
+ return QSize(mode.w, mode.h);
+}
--- a/QTfrontend/util/SDLInteraction.h Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/util/SDLInteraction.h Fri Apr 01 15:36:19 2016 +0200
@@ -27,7 +27,15 @@
#include <QMap>
#include <QStringList>
+#include <QSize>
+// workaround some strange Qt and SLD2 interaction
+#ifdef Q_OS_MAC
+# ifdef MAC_OS_X_VERSION_MIN_REQUIRED
+# undef MAC_OS_X_VERSION_MIN_REQUIRED
+# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
+# endif
+#endif
#include "SDL_mixer.h"
/**
@@ -103,6 +111,8 @@
/// Fades out and stops the background music (if playing).
void stopMusic();
+
+ QSize getCurrentResolution();
};
--- a/QTfrontend/weapons.h Fri Sep 11 04:05:09 2015 +0200
+++ b/QTfrontend/weapons.h Fri Apr 01 15:36:19 2016 +0200
@@ -17,11 +17,67 @@
*/
-// TODO: keep on documenting all the weapons
-//skip---------------------------------|
-//structure------------------------------------------------------------------|
+/*
+ AmmoType lookup table (use monospace font / cursor movements)
-
+ amGrenade-----------------------|
+ amClusterBomb--------------------|
+ amBazooka-------------------------|
+ amBee------------------------------|
+ amShotgun---------------------------|
+ amPickHammer-------------------------|
+ amSkip--------------------------------|
+ amRope---------------------------------|
+ amMine----------------------------------|
+ amDEagle---------------------------------|
+ amDynamite--------------------------------|
+ amFirePunch--------------------------------|
+ amWhip--------------------------------------|
+ amBaseballBat--------------------------------|
+ amParachute-----------------------------------|
+ amAirAttack------------------------------------|
+ amMineStrike------------------------------------|
+ amBlowTorch--------------------------------------|
+ amGirder------------------------------------------|
+ amTeleport-----------------------------------------|
+ amSwitch--------------------------------------------|
+ amMortar---------------------------------------------|
+ amKamikaze--------------------------------------------|
+ amCake-------------------------------------------------|
+ amSeduction---------------------------------------------|
+ amWatermelon---------------------------------------------|
+ amHellishBomb---------------------------------------------|
+ amNapalm---------------------------------------------------|
+ amDrill-----------------------------------------------------|
+ amBallgun----------------------------------------------------|
+ amRCPlane-----------------------------------------------------|
+ amLowGravity---------------------------------------------------|
+ amExtraDamage---------------------------------------------------|
+ amInvulnerable---------------------------------------------------|
+ amExtraTime-------------------------------------------------------|
+ amLaserSight-------------------------------------------------------|
+ amVampiric----------------------------------------------------------|
+ amSniperRifle--------------------------------------------------------|
+ amJetpack-------------------------------------------------------------|
+ amMolotov--------------------------------------------------------------|
+ amBirdy-----------------------------------------------------------------|
+ amPortalGun--------------------------------------------------------------|
+ amPiano-------------------------------------------------------------------|
+ amGasBomb------------------------------------------------------------------|
+ amSineGun-------------------------------------------------------------------|
+ amFlamethrower---------------------------------------------------------------|
+ amSMine-----------------------------------------------------------------------|
+ amHammer-----------------------------------------------------------------------|
+ amResurrector-------------------------------------------------------------------|
+ amDrillStrike--------------------------------------------------------------------|
+ amSnowball------------------------------------------------------------------------|
+ amTardis---------------------------------------------------------------------------|
+ amLandGun---------------------------------------------------------------------------|
+ amIceGun-----------------------------------------------------------------------------|
+ amKnife-------------------------------------------------------------------------------|
+ amRubber-------------------------------------------------------------------------------|
+ amAirMine-------------------------------------------------------------------------------|
+*/
#define AMMOLINE_DEFAULT_QT "939192942219912103223511100120000000021110010101111100010"
#define AMMOLINE_DEFAULT_PROB "040504054160065554655446477657666666615551010111541111111"
#define AMMOLINE_DEFAULT_DELAY "000000000000020550000004000700400000000022000000060002000"
--- a/README Fri Sep 11 04:05:09 2015 +0200
+++ b/README Fri Apr 01 15:36:19 2016 +0200
@@ -1,46 +1,1 @@
-Hedgewars - a turn based strategy game.
-=======================================
-
-Copyright 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,48 @@
+Hedgewars - a turn based strategy game.
+=======================================
+
+[![Build Status](https://travis-ci.org/hedgewars/hw.svg)](https://travis-ci.org/hedgewars/hw)
+
+Copyright 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> 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://hedgewars.org/bugs 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
+
--- a/cmake_modules/CheckHaskellModuleExists.cmake Fri Sep 11 04:05:09 2015 +0200
+++ b/cmake_modules/CheckHaskellModuleExists.cmake Fri Apr 01 15:36:19 2016 +0200
@@ -11,7 +11,7 @@
macro(CHECK_HASKELL_MODULE_EXISTS MODULE FUNCTION PARAMCOUNT LIBRARY)
set(VARIABLE "HS_MODULE_${LIBRARY}_${FUNCTION}")
- if("${VARIABLE}" MATCHES "^${VARIABLE}$")
+ if(${VARIABLE} MATCHES ^${VARIABLE}$)
message(STATUS "Looking for ${FUNCTION} in ${MODULE}")
set(PARAMETERS "")
--- a/cmake_modules/FindSDL1or2.cmake Fri Sep 11 04:05:09 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-find_package(SDL QUIET)
-
-if(NOT SDL_FOUND)
- find_package(SDL2 REQUIRED)
- set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIR})
- set(SDL_LIBRARY ${SDL2_LIBRARY})
-endif()
-
-if(NOT SDL_VERSION)
- #find which version of SDL we have
- find_file(sdlversion_h SDL_version.h ${SDL_INCLUDE_DIR})
- if(sdlversion_h)
- file(STRINGS ${sdlversion_h} sdl_majorversion_tmp REGEX "SDL_MAJOR_VERSION[\t' ']+[0-9]+")
- file(STRINGS ${sdlversion_h} sdl_minorversion_tmp REGEX "SDL_MINOR_VERSION[\t' ']+[0-9]+")
- file(STRINGS ${sdlversion_h} sdl_patchversion_tmp REGEX "SDL_PATCHLEVEL[\t' ']+[0-9]+")
- string(REGEX MATCH "([0-9]+)" sdl_majorversion "${sdl_majorversion_tmp}")
- string(REGEX MATCH "([0-9]+)" sdl_minorversion "${sdl_minorversion_tmp}")
- string(REGEX MATCH "([0-9]+)" sdl_patchversion "${sdl_patchversion_tmp}")
- set(SDL_VERSION "${sdl_majorversion}.${sdl_minorversion}.${sdl_patchversion}")
- endif()
-endif()
-
-mark_as_advanced(sdlversion_h sdl_majorversion sdl_minorversion sdl_patchversion)
-
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_image.cmake Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,88 @@
+# - Locate SDL2_image library
+# This module defines:
+# SDL2_IMAGE_LIBRARIES, the name of the library to link against
+# SDL2_IMAGE_INCLUDE_DIRS, where to find the headers
+# SDL2_IMAGE_FOUND, if false, do not try to link against
+# SDL2_IMAGE_VERSION_STRING - human-readable string containing the version of SDL2_image
+#
+# For backward compatiblity the following variables are also set:
+# SDL2IMAGE_LIBRARY (same value as SDL2_IMAGE_LIBRARIES)
+# SDL2IMAGE_INCLUDE_DIR (same value as SDL2_IMAGE_INCLUDE_DIRS)
+# SDL2IMAGE_FOUND (same value as SDL2_IMAGE_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_IMAGE_INCLUDE_DIR AND SDL2IMAGE_INCLUDE_DIR)
+ set(SDL2_IMAGE_INCLUDE_DIR ${SDL2IMAGE_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h
+ HINTS
+ ENV SDL2IMAGEDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_IMAGE_LIBRARY AND SDL2IMAGE_LIBRARY)
+ set(SDL2_IMAGE_LIBRARY ${SDL2IMAGE_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_IMAGE_LIBRARY
+ NAMES SDL2_image
+ HINTS
+ ENV SDL2IMAGEDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h")
+ file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}")
+ set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH})
+ unset(SDL2_IMAGE_VERSION_MAJOR_LINE)
+ unset(SDL2_IMAGE_VERSION_MINOR_LINE)
+ unset(SDL2_IMAGE_VERSION_PATCH_LINE)
+ unset(SDL2_IMAGE_VERSION_MAJOR)
+ unset(SDL2_IMAGE_VERSION_MINOR)
+ unset(SDL2_IMAGE_VERSION_PATCH)
+endif()
+
+set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY})
+set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image
+ REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS
+ VERSION_VAR SDL2_IMAGE_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2IMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES})
+set(SDL2IMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS})
+set(SDL2IMAGE_FOUND ${SDL2_IMAGE_FOUND})
+
+mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_mixer.cmake Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,88 @@
+# - Locate SDL2_mixer library
+# This module defines:
+# SDL2_MIXER_LIBRARIES, the name of the library to link against
+# SDL2_MIXER_INCLUDE_DIRS, where to find the headers
+# SDL2_MIXER_FOUND, if false, do not try to link against
+# SDL2_MIXER_VERSION_STRING - human-readable string containing the version of SDL2_mixer
+#
+# For backward compatiblity the following variables are also set:
+# SDL2MIXER_LIBRARY (same value as SDL2_MIXER_LIBRARIES)
+# SDL2MIXER_INCLUDE_DIR (same value as SDL2_MIXER_INCLUDE_DIRS)
+# SDL2MIXER_FOUND (same value as SDL2_MIXER_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_MIXER_INCLUDE_DIR AND SDL2MIXER_INCLUDE_DIR)
+ set(SDL2_MIXER_INCLUDE_DIR ${SDL2MIXER_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_MIXER_INCLUDE_DIR SDL_mixer.h
+ HINTS
+ ENV SDL2MIXERDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_MIXER_LIBRARY AND SDL2MIXER_LIBRARY)
+ set(SDL2_MIXER_LIBRARY ${SDL2MIXER_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_MIXER_LIBRARY
+ NAMES SDL2_mixer
+ HINTS
+ ENV SDL2MIXERDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h")
+ file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MIXER_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MIXER_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_MIXER_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MAJOR "${SDL2_MIXER_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MINOR "${SDL2_MIXER_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_PATCH "${SDL2_MIXER_VERSION_PATCH_LINE}")
+ set(SDL2_MIXER_VERSION_STRING ${SDL2_MIXER_VERSION_MAJOR}.${SDL2_MIXER_VERSION_MINOR}.${SDL2_MIXER_VERSION_PATCH})
+ unset(SDL2_MIXER_VERSION_MAJOR_LINE)
+ unset(SDL2_MIXER_VERSION_MINOR_LINE)
+ unset(SDL2_MIXER_VERSION_PATCH_LINE)
+ unset(SDL2_MIXER_VERSION_MAJOR)
+ unset(SDL2_MIXER_VERSION_MINOR)
+ unset(SDL2_MIXER_VERSION_PATCH)
+endif()
+
+set(SDL2_MIXER_LIBRARIES ${SDL2_MIXER_LIBRARY})
+set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_MIXER_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_mixer
+ REQUIRED_VARS SDL2_MIXER_LIBRARIES SDL2_MIXER_INCLUDE_DIRS
+ VERSION_VAR SDL2_MIXER_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2MIXER_LIBRARY ${SDL2_MIXER_LIBRARIES})
+set(SDL2MIXER_INCLUDE_DIR ${SDL2_MIXER_INCLUDE_DIRS})
+set(SDL2MIXER_FOUND ${SDL2_MIXER_FOUND})
+
+mark_as_advanced(SDL2_MIXER_LIBRARY SDL2_MIXER_INCLUDE_DIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_net.cmake Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,88 @@
+# - Locate SDL2_net library
+# This module defines:
+# SDL2_NET_LIBRARIES, the name of the library to link against
+# SDL2_NET_INCLUDE_DIRS, where to find the headers
+# SDL2_NET_FOUND, if false, do not try to link against
+# SDL2_NET_VERSION_STRING - human-readable string containing the version of SDL2_net
+#
+# For backward compatiblity the following variables are also set:
+# SDL2NET_LIBRARY (same value as SDL2_NET_LIBRARIES)
+# SDL2NET_INCLUDE_DIR (same value as SDL2_NET_INCLUDE_DIRS)
+# SDL2NET_FOUND (same value as SDL2_NET_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_NET_INCLUDE_DIR AND SDL2NET_INCLUDE_DIR)
+ set(SDL2_NET_INCLUDE_DIR ${SDL2NET_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_NET_INCLUDE_DIR SDL_net.h
+ HINTS
+ ENV SDL2NETDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_NET_LIBRARY AND SDL2NET_LIBRARY)
+ set(SDL2_NET_LIBRARY ${SDL2NET_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_NET_LIBRARY
+ NAMES SDL2_net
+ HINTS
+ ENV SDL2NETDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_NET_INCLUDE_DIR AND EXISTS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h")
+ file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_NET_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_NET_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_NET_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_NET_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MAJOR "${SDL2_NET_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_NET_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MINOR "${SDL2_NET_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_NET_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_PATCH "${SDL2_NET_VERSION_PATCH_LINE}")
+ set(SDL2_NET_VERSION_STRING ${SDL2_NET_VERSION_MAJOR}.${SDL2_NET_VERSION_MINOR}.${SDL2_NET_VERSION_PATCH})
+ unset(SDL2_NET_VERSION_MAJOR_LINE)
+ unset(SDL2_NET_VERSION_MINOR_LINE)
+ unset(SDL2_NET_VERSION_PATCH_LINE)
+ unset(SDL2_NET_VERSION_MAJOR)
+ unset(SDL2_NET_VERSION_MINOR)
+ unset(SDL2_NET_VERSION_PATCH)
+endif()
+
+set(SDL2_NET_LIBRARIES ${SDL2_NET_LIBRARY})
+set(SDL2_NET_INCLUDE_DIRS ${SDL2_NET_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_net
+ REQUIRED_VARS SDL2_NET_LIBRARIES SDL2_NET_INCLUDE_DIRS
+ VERSION_VAR SDL2_NET_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2NET_LIBRARY ${SDL2_NET_LIBRARIES})
+set(SDL2NET_INCLUDE_DIR ${SDL2_NET_INCLUDE_DIRS})
+set(SDL2NET_FOUND ${SDL2_NET_FOUND})
+
+mark_as_advanced(SDL2_NET_LIBRARY SDL2_NET_INCLUDE_DIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_ttf.cmake Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,88 @@
+# - Locate SDL2_ttf library
+# This module defines:
+# SDL2_TTF_LIBRARIES, the name of the library to link against
+# SDL2_TTF_INCLUDE_DIRS, where to find the headers
+# SDL2_TTF_FOUND, if false, do not try to link against
+# SDL2_TTF_VERSION_STRING - human-readable string containing the version of SDL2_ttf
+#
+# For backward compatiblity the following variables are also set:
+# SDL2TTF_LIBRARY (same value as SDL2_TTF_LIBRARIES)
+# SDL2TTF_INCLUDE_DIR (same value as SDL2_TTF_INCLUDE_DIRS)
+# SDL2TTF_FOUND (same value as SDL2_TTF_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_TTF_INCLUDE_DIR AND SDL2TTF_INCLUDE_DIR)
+ set(SDL2_TTF_INCLUDE_DIR ${SDL2TTF_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_TTF_INCLUDE_DIR SDL_ttf.h
+ HINTS
+ ENV SDL2TTFDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_TTF_LIBRARY AND SDL2TTF_LIBRARY)
+ set(SDL2_TTF_LIBRARY ${SDL2TTF_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_TTF_LIBRARY
+ NAMES SDL2_ttf
+ HINTS
+ ENV SDL2TTFDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h")
+ file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_TTF_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_TTF_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_TTF_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MAJOR "${SDL2_TTF_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MINOR "${SDL2_TTF_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_PATCH "${SDL2_TTF_VERSION_PATCH_LINE}")
+ set(SDL2_TTF_VERSION_STRING ${SDL2_TTF_VERSION_MAJOR}.${SDL2_TTF_VERSION_MINOR}.${SDL2_TTF_VERSION_PATCH})
+ unset(SDL2_TTF_VERSION_MAJOR_LINE)
+ unset(SDL2_TTF_VERSION_MINOR_LINE)
+ unset(SDL2_TTF_VERSION_PATCH_LINE)
+ unset(SDL2_TTF_VERSION_MAJOR)
+ unset(SDL2_TTF_VERSION_MINOR)
+ unset(SDL2_TTF_VERSION_PATCH)
+endif()
+
+set(SDL2_TTF_LIBRARIES ${SDL2_TTF_LIBRARY})
+set(SDL2_TTF_INCLUDE_DIRS ${SDL2_TTF_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_ttf
+ REQUIRED_VARS SDL2_TTF_LIBRARIES SDL2_TTF_INCLUDE_DIRS
+ VERSION_VAR SDL2_TTF_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2TTF_LIBRARY ${SDL2_TTF_LIBRARIES})
+set(SDL2TTF_INCLUDE_DIR ${SDL2_TTF_INCLUDE_DIRS})
+set(SDL2TTF_FOUND ${SDL2_TTF_FOUND})
+
+mark_as_advanced(SDL2_TTF_LIBRARY SDL2_TTF_INCLUDE_DIR)
--- a/cmake_modules/paths.cmake Fri Sep 11 04:05:09 2015 +0200
+++ b/cmake_modules/paths.cmake Fri Apr 01 15:36:19 2016 +0200
@@ -15,7 +15,7 @@
#resource paths
if(UNIX AND NOT APPLE)
set(target_binary_install_dir "bin" CACHE PATH "install dest for binaries")
- set(target_library_install_dir "lib" CACHE PATH "install dest for libs")
+ set(target_library_install_dir "lib${LIB_SUFFIX}" CACHE PATH "install dest for libs")
string(SUBSTRING "${DATA_INSTALL_DIR}" 0 1 sharepath_start)
if(${sharepath_start} MATCHES "/")
--- a/gameServer/Actions.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/Actions.hs Fri Apr 01 15:36:19 2016 +0200
@@ -466,12 +466,15 @@
processAction (ProcessAccountInfo info) = do
+ si <- gets serverInfo
case info of
HasAccount passwd isAdmin isContr -> do
b <- isBanned
c <- client's isChecker
when (not b) $ (if c then checkerLogin else playerLogin) passwd isAdmin isContr
- Guest -> do
+ Guest | isRegisteredUsersOnly si -> do
+ processAction $ ByeClient "Registered users only"
+ | otherwise -> do
b <- isBanned
c <- client's isChecker
when (not b) $
@@ -508,6 +511,7 @@
chan <- client's sendChan
rnc <- gets roomsClients
clientNick <- client's nick
+ clProto <- client's clientProto
isAuthenticated <- liftM (not . B.null) $ client's webPassword
isAdmin <- client's isAdministrator
isContr <- client's isContributor
@@ -521,6 +525,13 @@
>>= filterM (liftM ((/=) lobbyId) . clientRoomM rnc)
>>= mapM (client'sM rnc nick)
let clFlags = B.concat . L.concat $ [["u" | isAuthenticated], ["a" | isAdmin], ["c" | isContr]]
+
+ roomsInfoList <- io $ do
+ rooms <- roomsM rnc
+ mapM (\r -> (if isNothing $ masterID r then return "" else client'sM rnc nick (fromJust $ masterID r))
+ >>= \cn -> return $ roomInfo clProto cn r)
+ $ filter (\r -> (roomProto r == clProto)) rooms
+
mapM_ processAction . concat $ [
[AnswerClients clientsChans ["LOBBY:JOINED", clientNick]]
, [AnswerClients [chan] ("LOBBY:JOINED" : clientNick : lobbyNicks)]
@@ -531,6 +542,7 @@
, [AnswerClients (chan : clientsChans) ["CLIENT_FLAGS", B.concat["+" , clFlags], clientNick] | not $ B.null clFlags]
, [ModifyClient (\cl -> cl{logonPassed = True, isVisible = True})]
, [SendServerMessage]
+ , [AnswerClients [chan] ("ROOMS" : concat roomsInfoList)]
]
@@ -716,6 +728,31 @@
processAction $ AnswerClients chans ["CHAT", "[random]", i !! n]
+processAction (LoadGhost location) = do
+ ri <- clientRoomA
+ rnc <- gets roomsClients
+ thisRoomChans <- liftM (map sendChan) $ roomClientsS ri
+#if defined(OFFICIAL_SERVER)
+ rm <- io $ room'sM rnc id ri
+ points <- io $ loadFile (B.unpack $ "ghosts/" `B.append` sanitizeName location)
+ when (roomProto rm > 51) $ do
+ processAction $ ModifyRoom $ \r -> r{params = Map.insert "DRAWNMAP" [prependGhostPoints (toP points) $ head $ (params r) Map.! "DRAWNMAP"] (params r)}
+#endif
+ cl <- client's id
+ rm <- io $ room'sM rnc id ri
+ mapM_ processAction $ map (replaceChans thisRoomChans) $ answerFullConfigParams cl (mapParams rm) (params rm)
+ where
+ loadFile :: String -> IO [Int]
+ loadFile fileName = E.handle (\(e :: SomeException) -> return []) $ do
+ points <- liftM read $ readFile fileName
+ return (points `deepseq` points)
+ replaceChans chans (AnswerClients _ msg) = AnswerClients chans msg
+ replaceChans _ a = a
+ toP [] = []
+ toP (p1:p2:ps) = (fromIntegral p1, fromIntegral p2) : toP ps
+{-
+ let a = map (replaceChans chans) $ answerFullConfigParams cl mp p
+-}
#if defined(OFFICIAL_SERVER)
processAction SaveReplay = do
ri <- clientRoomA
@@ -744,10 +781,6 @@
blackList <- liftM (map (recordFileName . fromJust . checkInfo) . filter (isJust . checkInfo)) allClientsS
- readyCheckersIds <- io $ do
- allci <- allClientsM rnc
- filterM (client'sM rnc (isJust . checkInfo)) allci
-
(cinfo, l) <- io $ loadReplay (fromIntegral p) blackList
when (isJust cinfo) $
mapM_ processAction [
@@ -757,15 +790,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)
@@ -837,4 +871,4 @@
forM_ (actions `deepseq` actions) processAction
processAction CheckVotes =
- checkVotes >>= mapM_ processAction
\ No newline at end of file
+ checkVotes >>= mapM_ processAction
--- a/gameServer/CoreTypes.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/CoreTypes.hs Fri Apr 01 15:36:19 2016 +0200
@@ -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
@@ -93,6 +93,7 @@
| CheckFailed B.ByteString
| CheckSuccess [B.ByteString]
| Random [ClientChan] [B.ByteString]
+ | LoadGhost B.ByteString
| QueryReplay B.ByteString
| ShowReplay B.ByteString
| Cleanup
@@ -119,38 +120,43 @@
CheckInfo
{
recordFileName :: String,
- recordTeams :: [TeamInfo]
+ recordTeams :: [TeamInfo],
+ details :: Maybe GameDetails
}
data ClientInfo =
ClientInfo
{
- clUID :: Unique,
- sendChan :: ClientChan,
- clientSocket :: Socket,
- host :: B.ByteString,
- connectTime :: UTCTime,
- nick :: B.ByteString,
- webPassword :: B.ByteString,
- serverSalt :: B.ByteString,
- logonPassed :: Bool,
- isVisible :: Bool,
+ clUID :: !Unique,
+ sendChan :: !ClientChan,
+ clientSocket :: !Socket,
+ host :: !B.ByteString,
+ connectTime :: !UTCTime,
+ nick :: !B.ByteString,
+ webPassword :: !B.ByteString,
+ serverSalt :: !B.ByteString,
+ logonPassed :: !Bool,
+ isVisible :: !Bool,
clientProto :: !Word16,
pingsQueue :: !Word,
- isMaster :: Bool,
+ isMaster :: !Bool,
isReady :: !Bool,
- isInGame :: Bool,
- isAdministrator :: Bool,
- isChecker :: Bool,
- isContributor :: Bool,
- isKickedFromServer :: Bool,
- isJoinedMidGame :: Bool,
+ isInGame :: !Bool,
+ isAdministrator :: !Bool,
+ hasSuperPower :: !Bool,
+ isChecker :: !Bool,
+ isContributor :: !Bool,
+ isKickedFromServer :: !Bool,
+ isJoinedMidGame :: !Bool,
+ hasAskedList :: !Bool,
clientClan :: !(Maybe B.ByteString),
- checkInfo :: Maybe CheckInfo,
+ checkInfo :: !(Maybe CheckInfo),
eiLobbyChat,
eiEM,
- eiJoin :: EventsInfo,
- teamsInGame :: Word
+ eiJoin :: !EventsInfo,
+ teamsInGame :: !Word,
+ teamIndexes :: ![Word8],
+ pendingActions :: ![Action]
}
instance Eq ClientInfo where
@@ -163,17 +169,17 @@
data TeamInfo =
TeamInfo
{
- teamowner :: B.ByteString,
- teamname :: B.ByteString,
- teamcolor :: B.ByteString,
- teamgrave :: B.ByteString,
- teamfort :: B.ByteString,
- teamvoicepack :: B.ByteString,
- teamflag :: B.ByteString,
- isOwnerRegistered :: Bool,
- difficulty :: Int,
- hhnum :: Int,
- hedgehogs :: [HedgehogInfo]
+ teamowner :: !B.ByteString,
+ teamname :: !B.ByteString,
+ teamcolor :: !B.ByteString,
+ teamgrave :: !B.ByteString,
+ teamfort :: !B.ByteString,
+ teamvoicepack :: !B.ByteString,
+ teamflag :: !B.ByteString,
+ isOwnerRegistered :: !Bool,
+ difficulty :: !Int,
+ hhnum :: !Int,
+ hedgehogs :: ![HedgehogInfo]
}
deriving (Show, Read)
@@ -213,26 +219,26 @@
data RoomInfo =
RoomInfo
{
- masterID :: Maybe ClientIndex,
- name :: B.ByteString,
- password :: B.ByteString,
- roomProto :: Word16,
- teams :: [TeamInfo],
- gameInfo :: Maybe GameInfo,
+ masterID :: !(Maybe ClientIndex),
+ name :: !B.ByteString,
+ password :: !B.ByteString,
+ roomProto :: !Word16,
+ teams :: ![TeamInfo],
+ gameInfo :: !(Maybe GameInfo),
playersIn :: !Int,
readyPlayers :: !Int,
- isRestrictedJoins :: Bool,
- isRestrictedTeams :: Bool,
- isRegisteredOnly :: Bool,
- isSpecial :: Bool,
- defaultHedgehogsNumber :: Int,
- teamsNumberLimit :: Int,
- greeting :: B.ByteString,
- voting :: Maybe Voting,
+ isRestrictedJoins :: !Bool,
+ isRestrictedTeams :: !Bool,
+ isRegisteredOnly :: !Bool,
+ isSpecial :: !Bool,
+ defaultHedgehogsNumber :: !Int,
+ teamsNumberLimit :: !Int,
+ greeting :: !B.ByteString,
+ voting :: !(Maybe Voting),
roomBansList :: ![B.ByteString],
- mapParams :: Map.Map B.ByteString B.ByteString,
- params :: Map.Map B.ByteString [B.ByteString],
- roomSaves :: Map.Map B.ByteString (Map.Map B.ByteString B.ByteString, Map.Map B.ByteString [B.ByteString])
+ mapParams :: !(Map.Map B.ByteString B.ByteString),
+ params :: !(Map.Map B.ByteString [B.ByteString]),
+ roomSaves :: !(Map.Map B.ByteString (B.ByteString, Map.Map B.ByteString B.ByteString, Map.Map B.ByteString [B.ByteString]))
}
newRoom :: RoomInfo
@@ -279,6 +285,7 @@
ServerInfo
{
isDedicated :: Bool,
+ isRegisteredUsersOnly :: Bool,
serverMessage :: B.ByteString,
serverMessageForOldVersions :: B.ByteString,
latestReleaseVersion :: Word16,
@@ -302,9 +309,10 @@
newServerInfo =
ServerInfo
True
+ False
"<h2><p align=center><a href=\"http://www.hedgewars.org/\">http://www.hedgewars.org/</a></p></h2>"
- "<font color=yellow><h3 align=center>Hedgewars 0.9.19 is out! Please update.</h3><p align=center><a href=http://hedgewars.org/download.html>Download page here</a></font>"
- 47 -- latestReleaseVersion
+ "<font color=yellow><h3 align=center>Hedgewars 0.9.22 is out! Please update.</h3><p align=center><a href=http://hedgewars.org/download.html>Download page here</a></font>"
+ 51 -- latestReleaseVersion
41 -- earliestCompatibleVersion
46631
""
@@ -345,10 +353,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])
--- a/gameServer/EngineInteraction.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/EngineInteraction.hs Fri Apr 01 15:36:19 2016 +0200
@@ -19,7 +19,7 @@
{-# LANGUAGE CPP, OverloadedStrings #-}
#if defined(OFFICIAL_SERVER)
-module EngineInteraction(replayToDemo, checkNetCmd, toEngineMsg, drawnMapData) where
+module EngineInteraction(replayToDemo, checkNetCmd, toEngineMsg, drawnMapData, prependGhostPoints) where
#else
module EngineInteraction(checkNetCmd, toEngineMsg) where
#endif
@@ -33,9 +33,12 @@
import qualified Data.Map as Map
import qualified Data.List as L
import Data.Word
+import Data.Int
import Data.Bits
import Control.Arrow
import Data.Maybe
+import Data.Binary
+import Data.Binary.Put
-------------
import CoreTypes
import Utils
@@ -45,12 +48,13 @@
this is snippet from http://stackoverflow.com/questions/10043102/how-to-catch-the-decompress-ioerror
because standard 'catch' doesn't seem to catch decompression errors for some reason
-}
-import qualified Codec.Compression.Zlib.Internal as Z
+import qualified Codec.Compression.Zlib.Internal as ZI
+import qualified Codec.Compression.Zlib as Z
decompressWithoutExceptions :: BL.ByteString -> Either String BL.ByteString
decompressWithoutExceptions = finalise
- . Z.foldDecompressStream cons nil err
- . Z.decompressWithErrors Z.zlibFormat Z.defaultDecompressParams
+ . ZI.foldDecompressStream cons nil err
+ . ZI.decompressWithErrors ZI.zlibFormat ZI.defaultDecompressParams
where err _ msg = Left msg
nil = Right []
cons chunk = right (chunk :)
@@ -78,30 +82,33 @@
splitMessages = L.unfoldr (\b -> if B.null b then Nothing else Just $ B.splitAt (1 + fromIntegral (BW.head b)) b)
-checkNetCmd :: B.ByteString -> (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString))
-checkNetCmd msg = check decoded
+checkNetCmd :: [Word8] -> B.ByteString -> (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString))
+checkNetCmd teamsIndexes msg = check decoded
where
decoded = liftM (splitMessages . BW.pack) $ Base64.decode $ B.unpack msg
check Nothing = (B.empty, B.empty, Nothing)
check (Just msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a)
encode = B.pack . Base64.encode . BW.unpack . B.concat
- isLegal m = (B.length m > 1) && (flip Set.member legalMessages . B.head . B.tail $ m)
+ isLegal m = (B.length m > 1) && (flip Set.member legalMessages . B.head . B.tail $ m) && not (isMalformed (B.head m) (B.tail m))
lft = foldr l Nothing
l m n = let m' = B.head $ B.tail m; tst = flip Set.member in
if not $ tst timedMessages m' then n
else if '+' /= m' then Just Nothing else Just . Just . B.pack . Base64.encode . BW.unpack $ m
isNonEmpty = (/=) '+' . B.head . B.tail
- legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sNpPwtgfhbc12345" ++ slotMessages
+ legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,NpPwtgfhbc12345" ++ slotMessages
slotMessages = "\128\129\130\131\132\133\134\135\136\137\138"
timedMessages = Set.fromList $ "+LlRrUuDdZzAaSjJ,NpPwtgfc12345" ++ slotMessages
+ isMalformed 'h' m | B.length m >= 3 = let hognum = m `B.index` 1; teamnum = m `BW.index` 2 in hognum < '1' || hognum > '8' || teamnum `L.notElem` teamsIndexes
+ | otherwise = True
+ isMalformed _ _ = False
#if defined(OFFICIAL_SERVER)
replayToDemo :: [TeamInfo]
-> 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 +124,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 +133,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/", spaces2Underlining 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"
@@ -142,7 +151,7 @@
schemeFlags = map (\(v, (n, m)) -> eml [n, " ", showB $ (readInt_ v) * m])
$ filter (\(_, (n, _)) -> not $ B.null n)
$ zip (drop (length gameFlagConsts) scheme) schemeParams
- schemeAdditional = let scriptParam = B.tail $ scheme !! 41 in [eml ["e$scriptparam ", scriptParam] | not $ B.null scriptParam]
+ schemeAdditional = let scriptParam = B.tail $ scheme !! 42 in [eml ["e$scriptparam ", scriptParam] | not $ B.null scriptParam]
ammoStr :: B.ByteString
ammoStr = head . tail $ prms Map.! "AMMO"
ammo = let l = B.length ammoStr `div` 4; ((a, b), (c, d)) = (B.splitAt l . fst &&& B.splitAt l . snd) . B.splitAt (l * 2) $ ammoStr in
@@ -161,23 +170,45 @@
])
$ hedgehogs t
)
+ infRopes = ammoStr `B.index` 7 == '9'
+ vamp = gameFlags .&. 0x00000200 /= 0
+ infattacks = gameFlags .&. 0x00100000 /= 0
+ spaces2Underlining = B.map (\c -> if c == ' ' then '_' else c)
drawnMapData :: B.ByteString -> [B.ByteString]
drawnMapData =
L.map (\m -> eml ["edraw ", BW.pack m])
. L.unfoldr by200
. BL.unpack
- . either (const BL.empty) id
+ . unpackDrawnMap
+ where
+ by200 :: [a] -> Maybe ([a], [a])
+ by200 [] = Nothing
+ by200 m = Just $ L.splitAt 200 m
+
+unpackDrawnMap :: B.ByteString -> BL.ByteString
+unpackDrawnMap = either (const BL.empty) id
. decompressWithoutExceptions
. BL.pack
. L.drop 4
. fromMaybe []
. Base64.decode
. B.unpack
- where
- by200 :: [a] -> Maybe ([a], [a])
- by200 [] = Nothing
- by200 m = Just $ L.splitAt 200 m
+
+compressWithLength :: BL.ByteString -> BL.ByteString
+compressWithLength b = BL.drop 8 . encode . runPut $ do
+ put $ ((fromIntegral $ BL.length b)::Word32)
+ mapM_ putWord8 $ BW.unpack $ BL.toStrict $ Z.compress b
+
+packDrawnMap :: BL.ByteString -> B.ByteString
+packDrawnMap = B.pack
+ . Base64.encode
+ . BW.unpack
+ . BL.toStrict
+ . compressWithLength
+
+prependGhostPoints :: [(Int16, Int16)] -> B.ByteString -> B.ByteString
+prependGhostPoints pts dm = packDrawnMap $ (runPut $ forM_ pts $ \(x, y) -> put x >> put y >> putWord8 99) `BL.append` unpackDrawnMap dm
schemeParams :: [(B.ByteString, Int)]
schemeParams = [
@@ -190,6 +221,7 @@
, ("e$minesnum", 1)
, ("e$minedudpct", 1)
, ("e$explosives", 1)
+ , ("e$airmines", 1)
, ("e$healthprob", 1)
, ("e$hcaseamount", 1)
, ("e$waterrise", 1)
--- a/gameServer/FloodDetection.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/FloodDetection.hs Fri Apr 01 15:36:19 2016 +0200
@@ -49,7 +49,7 @@
chat1 = [Warning $ loc "Warning! Chat flood protection activated"]
chat2 = [ByeClient $ loc "Excess flood"]
em1 = [Warning $ loc "Game messages flood detected - 1"]
- em2 = [Warning $ loc "Game messages flood detected - 2"]
+ em2 = [ByeClient $ loc "Excess flood"]
join1 = [Warning $ loc "Warning! Joins flood protection activated"]
join2 = [ByeClient $ loc "Excess flood"]
@@ -69,7 +69,9 @@
else
[]
- return $ (ModifyClient . transformField e . const $ (numPerEntry, curTime) : nei) : actions
+ return $ [ModifyClient . transformField e . const $ (numPerEntry, curTime) : nei
+ , ModifyClient (\c -> c{pendingActions = actions}) -- append? prepend? just replacing for now
+ ]
updateInfo = return [
ModifyClient $ transformField e
--- a/gameServer/HWProtoCore.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/HWProtoCore.hs Fri Apr 01 15:36:19 2016 +0200
@@ -67,7 +67,7 @@
h "DELEGATE" n | not $ B.null n = handleCmd ["DELEGATE", n]
h "SAVEROOM" n | not $ B.null n = handleCmd ["SAVEROOM", n]
h "LOADROOM" n | not $ B.null n = handleCmd ["LOADROOM", n]
- h "SAVE" n | not $ B.null n = handleCmd ["SAVE", n]
+ h "SAVE" n | not $ B.null n = let (sn, ln) = B.break (== ' ') n in if B.null ln then return [] else handleCmd ["SAVE", sn, B.tail ln]
h "DELETE" n | not $ B.null n = handleCmd ["DELETE", n]
h "STATS" _ = handleCmd ["STATS"]
h "PART" m | not $ B.null m = handleCmd ["PART", m]
@@ -75,11 +75,10 @@
h "QUIT" m | not $ B.null m = handleCmd ["QUIT", m]
| otherwise = handleCmd ["QUIT"]
h "RND" p = handleCmd ("RND" : B.words p)
- h "GLOBAL" p = do
- cl <- thisClient
+ h "GLOBAL" p = serverAdminOnly $ do
rnc <- liftM snd ask
let chans = map (sendChan . client rnc) $ allClients rnc
- return [AnswerClients chans ["CHAT", "[global notice]", p] | isAdministrator cl]
+ return [AnswerClients chans ["CHAT", "[global notice]", p]]
h "WATCH" f = return [QueryReplay f]
h "FIX" _ = handleCmd ["FIX"]
h "UNFIX" _ = handleCmd ["UNFIX"]
@@ -92,6 +91,13 @@
h "MAXTEAMS" n | not $ B.null n = handleCmd ["MAXTEAMS", n]
h "INFO" n | not $ B.null n = handleCmd ["INFO", n]
h "RESTART_SERVER" "YES" = handleCmd ["RESTART_SERVER"]
+ h "REGISTERED_ONLY" _ = serverAdminOnly $ do
+ cl <- thisClient
+ return
+ [ModifyServerInfo(\s -> s{isRegisteredUsersOnly = not $ isRegisteredUsersOnly s})
+ , AnswerClients [sendChan cl] ["CHAT", "[server]", "'Registered only' state toggled"]
+ ]
+ h "SUPER_POWER" _ = serverAdminOnly $ return [ModifyClient (\c -> c{hasSuperPower = True})]
h c p = return [Warning $ B.concat ["Unknown cmd: /", c, " ", p]]
extractParameters p = let (a, b) = B.break (== ' ') p in (upperCase a, B.dropWhile (== ' ') b)
--- a/gameServer/HWProtoInRoomState.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/HWProtoInRoomState.hs Fri Apr 01 15:36:19 2016 +0200
@@ -54,7 +54,7 @@
, AnswerClients chans ["RUN_GAME"]
, SendUpdateOnThisRoom
, AnswerClients chans $ "CLIENT_FLAGS" : "+g" : nicks
- , ModifyRoomClients (\c -> c{isInGame = True})
+ , ModifyRoomClients (\c -> c{isInGame = True, teamIndexes = map snd . filter (\(t, _) -> teamowner t == nick c) $ zip (teams rm) [0..]})
]
else
return [Warning $ loc "Less than two clans!"]
@@ -175,11 +175,11 @@
ModifyClient
(\c -> c{
teamsInGame = teamsInGame c - 1,
- clientClan = if teamsInGame c == 1 then Nothing else Just $ anotherTeamClan clNick team r
+ clientClan = if teamsInGame c == 1 then Nothing else anotherTeamClan clNick team r
})
]
where
- anotherTeamClan clNick team = teamcolor . fromMaybe (error "CHECKPOINT 011") . find (\t -> (teamowner t == clNick) && (t /= team)) . teams
+ anotherTeamClan clNick team = liftM teamcolor . find (\t -> (teamowner t == clNick) && (t /= team)) . teams
findTeam = find (\t -> tName == teamname t) . teams
@@ -260,6 +260,8 @@
rm <- thisRoom
chans <- roomOthersChans
+ let (legalMsgs, nonEmptyMsgs, lastFTMsg) = checkNetCmd (teamIndexes cl) msg
+
if teamsInGame cl > 0 && (isJust $ gameInfo rm) && (not $ B.null legalMsgs) then
return $ AnswerClients chans ["EM", legalMsgs]
: [ModifyRoom (\r -> r{gameInfo = liftM
@@ -269,8 +271,6 @@
$ gameInfo r}), RegisterEvent EngineMessage]
else
return []
- where
- (legalMsgs, nonEmptyMsgs, lastFTMsg) = checkNetCmd msg
handleCmd_inRoom ["ROUNDFINISHED", _] = do
@@ -342,6 +342,7 @@
isJust maybeClientId
&& (kickId /= thisClientId)
&& sameRoom
+ && (not $ hasSuperPower kickCl)
&& ((isNothing $ gameInfo rm) || notOnly2Players || teamsInGame kickCl == 0)
]
@@ -491,8 +492,8 @@
return [AnswerClients [sendChan cl] ["CHAT", "[server]", "vote: 'yes' or 'no'"]]
-handleCmd_inRoom ["SAVE", stateName] = serverAdminOnly $ do
- return [ModifyRoom $ \r -> r{roomSaves = Map.insert stateName (mapParams r, params r) (roomSaves r)}]
+handleCmd_inRoom ["SAVE", stateName, location] = serverAdminOnly $ do
+ return [ModifyRoom $ \r -> r{roomSaves = Map.insert stateName (location, mapParams r, params r) (roomSaves r)}]
handleCmd_inRoom ["DELETE", stateName] = serverAdminOnly $ do
return [ModifyRoom $ \r -> r{roomSaves = Map.delete stateName (roomSaves r)}]
--- a/gameServer/HWProtoLobbyState.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/HWProtoLobbyState.hs Fri Apr 01 15:36:19 2016 +0200
@@ -39,7 +39,9 @@
let cl = irnc `client` ci
rooms <- allRoomInfos
let roomsInfoList = concatMap (\r -> roomInfo (clientProto cl) (maybeNick . liftM (client irnc) $ masterID r) r) . filter (\r -> (roomProto r == clientProto cl))
- return [AnswerClients [sendChan cl] ("ROOMS" : roomsInfoList rooms)]
+ return $ if hasAskedList cl then [] else
+ [ ModifyClient (\c -> c{hasAskedList = True})
+ , AnswerClients [sendChan cl] ("ROOMS" : roomsInfoList rooms)]
handleCmd_lobby ["CHAT", msg] = do
n <- clientNick
@@ -91,13 +93,13 @@
[Warning $ loc "No such room"]
else if (not sameProto) && (not $ isAdministrator cl) then
[Warning $ loc "Room version incompatible to your hedgewars version"]
- else if isRestrictedJoins jRoom then
+ else if isRestrictedJoins jRoom && not (hasSuperPower cl) then
[Warning $ loc "Joining restricted"]
else if isRegisteredOnly jRoom && (B.null . webPassword $ cl) && not (isAdministrator cl) then
[Warning $ loc "Registered users only"]
else if isBanned then
[Warning $ loc "You are banned in this room"]
- else if roomPassword /= password jRoom then
+ else if roomPassword /= password jRoom && not (hasSuperPower cl) then
[NoticeMessage WrongPassword]
else
(
--- a/gameServer/NetRoutines.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/NetRoutines.hs Fri Apr 01 15:36:19 2016 +0200
@@ -72,12 +72,16 @@
False
False
False
+ False
+ False
Nothing
Nothing
newEventsInfo
newEventsInfo
newEventsInfo
0
+ []
+ []
)
writeChan chan $ Accept newClient
--- a/gameServer/OfficialServer/GameReplayStore.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/OfficialServer/GameReplayStore.hs Fri Apr 01 15:36:19 2016 +0200
@@ -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
@@ -38,13 +38,13 @@
pickReplayFile :: Int -> [String] -> IO String
pickReplayFile p blackList = do
- files <- liftM (filter (\f -> sameProto f && notBlacklisted f)) $ getDirectoryContents "replays"
+ files <- liftM (filter (\f -> sameProto f && notBlacklisted ("replays/" ++ f))) $ getDirectoryContents "replays"
if (not $ null files) then
return $ "replays/" ++ head files
else
return ""
where
- sameProto = (isSuffixOf ('.' : show p))
+ sameProto = isSuffixOf ('.' : show p)
notBlacklisted = flip notElem blackList
saveReplay :: RoomInfo -> IO ()
@@ -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 ()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gameServer/OfficialServer/Glicko2.hs Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,70 @@
+{-
+ Glicko2, as described in http://www.glicko.net/glicko/glicko2.pdf
+-}
+
+module OfficialServer.Glicko2 where
+
+data RatingData = RatingData {
+ ratingValue
+ , rD
+ , volatility :: Double
+ }
+data GameData = GameData {
+ opponentRating :: RatingData,
+ gameScore :: Double
+ }
+
+τ, ε :: Double
+τ = 0.2
+ε = 0.000001
+
+g_φ :: Double -> Double
+g_φ φ = 1 / sqrt (1 + 3 * φ^2 / pi^2)
+
+calcE :: RatingData -> GameData -> (Double, Double, Double)
+calcE oldRating (GameData oppRating s) = (
+ 1 / (1 + exp (g_φᵢ * (μᵢ - μ)))
+ , g_φᵢ
+ , s
+ )
+ where
+ μ = (ratingValue oldRating - 1500) / 173.7178
+ φ = rD oldRating / 173.7178
+ μᵢ = (ratingValue oppRating - 1500) / 173.7178
+ φᵢ = rD oppRating / 173.7178
+ g_φᵢ = g_φ φᵢ
+
+
+calcNewRating :: RatingData -> [GameData] -> (Int, RatingData)
+calcNewRating oldRating [] = (0, RatingData (ratingValue oldRating) (173.7178 * sqrt (φ ^ 2 + σ ^ 2)) σ)
+ where
+ φ = rD oldRating / 173.7178
+ σ = volatility oldRating
+
+calcNewRating oldRating games = (length games, RatingData (173.7178 * μ' + 1500) (173.7178 * sqrt φ'sqr) σ')
+ where
+ _Es = map (calcE oldRating) games
+ υ = 1 / sum (map υ_p _Es)
+ υ_p (_Eᵢ, g_φᵢ, _) = g_φᵢ ^ 2 * _Eᵢ * (1 - _Eᵢ)
+ _Δ = υ * part1
+ part1 = sum (map _Δ_p _Es)
+ _Δ_p (_Eᵢ, g_φᵢ, sᵢ) = g_φᵢ * (sᵢ - _Eᵢ)
+
+ μ = (ratingValue oldRating - 1500) / 173.7178
+ φ = rD oldRating / 173.7178
+ σ = volatility oldRating
+
+ a = log (σ ^ 2)
+ f :: Double -> Double
+ f x = exp x * (_Δ ^ 2 - φ ^ 2 - υ - exp x) / 2 / (φ ^ 2 + υ + exp x) ^ 2 - (x - a) / τ ^ 2
+
+ _A = a
+ _B = if _Δ ^ 2 > φ ^ 2 + υ then log (_Δ ^ 2 - φ ^ 2 - υ) else head . dropWhile ((>) 0 . f) . map (\k -> a - k * τ) $ [1 ..]
+ fA = f _A
+ fB = f _B
+ σ' = (\(_A, _, _, _) -> exp (_A / 2)) . head . dropWhile (\(_A, _, _B, _) -> abs (_B - _A) > ε) $ iterate step5 (_A, fA, _B, fB)
+ step5 (_A, fA, _B, fB) = let _C = _A + (_A - _B) * fA / (fB - fA); fC = f _C in
+ if fC * fB < 0 then (_B, fB, _C, fC) else (_A, fA / 2, _C, fC)
+
+ φ'sqr = 1 / (1 / (φ ^ 2 + σ' ^ 2) + 1 / υ)
+ μ' = μ + φ'sqr * part1
--- a/gameServer/OfficialServer/checker.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/OfficialServer/checker.hs Fri Apr 01 15:36:19 2016 +0200
@@ -54,7 +54,7 @@
deriving Show
serverAddress = "netserver.hedgewars.org"
-protocolNumber = "49"
+protocolNumber = "51"
getLines :: Handle -> IO [B.ByteString]
getLines h = g
@@ -83,6 +83,7 @@
start = flip L.elem ["WINNERS", "DRAW"]
ps ("DRAW" : bs) = "DRAW" : ps bs
ps ("WINNERS" : n : bs) = let c = readInt_ n in "WINNERS" : n : take c bs ++ (ps $ drop c bs)
+ ps ("GHOST_POINTS" : n : bs) = let c = 2 * (readInt_ n) in "GHOST_POINTS" : n : take c bs ++ (ps $ drop c bs)
ps ("ACHIEVEMENT" : typ : teamname : location : value : bs) =
"ACHIEVEMENT" : typ : teamname : location : value : ps bs
ps _ = []
@@ -153,10 +154,12 @@
CheckFailed msg -> do
warningM "Check" "Check failed"
answer ["CHECKED", "FAIL", msg]
+ threadDelay 1500000
answer ["READY"]
CheckSuccess msgs -> do
warningM "Check" "Check succeeded"
answer ("CHECKED" : "OK" : msgs)
+ threadDelay 1500000
answer ["READY"]
where
answer :: [B.ByteString] -> IO ()
@@ -176,7 +179,7 @@
main :: IO ()
-main = withSocketsDo $ do
+main = withSocketsDo . forever $ do
#if !defined(mingw32_HOST_OS)
installHandler sigPIPE Ignore Nothing
installHandler sigCHLD Ignore Nothing
--- a/gameServer/OfficialServer/extdbinterface.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/OfficialServer/extdbinterface.hs Fri Apr 01 15:36:19 2016 +0200
@@ -23,18 +23,21 @@
import Prelude hiding (catch)
import Control.Monad
import Control.Exception
+import Control.Monad.State
import System.IO
import Data.Maybe
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
+io = liftIO
dbQueryAccount =
"SELECT CASE WHEN users.status = 1 THEN users.pass ELSE '' END, \
@@ -50,8 +53,18 @@
\ 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 = ?"
+dbQueryBestTime = "SELECT MIN(value) FROM achievements WHERE location = ? AND id <> (SELECT MAX(id) FROM achievements)"
dbInteractionLoop dbConn = forever $ do
q <- liftM read getLine
@@ -83,36 +96,73 @@
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 ->
+ 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 ()
+parseStats dbConn p fileName teams (GameDetails script infRopes vamp infAttacks) d = evalStateT (ps d) ("", maxBound)
where
time = readTime fileName
- ps [] = []
- ps ("DRAW" : bs) = ps bs
- ps ("WINNERS" : n : bs) = ps $ drop (readInt_ n) bs
- ps ("ACHIEVEMENT" : typ : teamname : location : value : bs) =
- ( time
- , typ
- , fromMaybe "" (lookup teamname teams)
- , readInt_ value
- , fileName
- , location
- , fromIntegral p
- ) : ps bs
+ ps :: [B.ByteString] -> StateT (B.ByteString, Int) IO ()
+ ps [] = return ()
+ ps ("DRAW" : bs) = do
+ io $ execute dbConn dbQueryGamesHistory (script, (fromIntegral p) :: Int, fileName, time, vamp, infRopes, infAttacks)
+ io $ places (map drawParams teams)
+ ps bs
+ ps ("WINNERS" : n : bs) = do
+ let winNum = readInt_ n
+ io $ execute dbConn dbQueryGamesHistory (script, (fromIntegral p) :: Int, fileName, time, vamp, infRopes, infAttacks)
+ io $ places (map (placeParams (take winNum bs)) teams)
+ ps (drop winNum bs)
+ ps ("ACHIEVEMENT" : typ : teamname : location : value : bs) = do
+ let result = readInt_ value
+ io $ execute dbConn dbQueryAchievement
+ ( time
+ , typ
+ , fromMaybe "" (lookup teamname teams)
+ , result
+ , fileName
+ , location
+ , (fromIntegral p) :: Int
+ )
+ modify $ \st@(l, s) -> if result < s then (location, result) else st
+ ps bs
+ ps ("GHOST_POINTS" : n : bs) = do
+ let pointsNum = readInt_ n
+ (location, time) <- get
+ res <- io $ query dbConn dbQueryBestTime $ Only location
+ let bestTime = case res of
+ [Only a] -> a
+ _ -> maxBound :: Int
+ when (time < bestTime) $ do
+ io $ writeFile (B.unpack $ "ghosts/" `B.append` sanitizeName location) $ show (map readInt_ $ take (2 * pointsNum) bs)
+ return ()
+ ps (drop (2 * pointsNum) 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) $
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gameServer/OfficialServer/updateRating.hs Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,103 @@
+{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
+module Main where
+
+import Data.Maybe
+import Data.TConfig
+import qualified Data.ByteString.Char8 as B
+import Database.MySQL.Simple
+import Database.MySQL.Simple.QueryResults
+import Database.MySQL.Simple.Result
+import Control.Monad
+import Control.Exception
+import System.IO
+import qualified Data.Map as Map
+import Data.Time.Clock
+------
+import OfficialServer.Glicko2
+
+
+queryEpochDates = "SELECT epoch, todatetime, todatetime + INTERVAL 1 week FROM rating_epochs WHERE epoch = (SELECT MAX(epoch) FROM rating_epochs)"
+queryPreviousRatings = "SELECT v.userid, v.rating, v.rd, v.volatility FROM rating_values as v WHERE (v.epoch = (SELECT MAX(epoch) FROM rating_epochs))"
+queryGameResults =
+ "SELECT \
+ \ p.userid \
+ \ , p.place \
+ \ , COALESCE(vp.rating, 1500) \
+ \ , COALESCE(vp.rd, 350) \
+ \ , COALESCE(vp.volatility, 0.06) \
+ \ , COALESCE(vo.rating, 1500) \
+ \ , COALESCE(vo.rd, 350) \
+ \ , COALESCE(vo.volatility, 0.06) \
+ \ FROM \
+ \ (SELECT epoch, todatetime FROM rating_epochs WHERE epoch = (SELECT MAX(epoch) FROM rating_epochs)) as e \
+ \ JOIN rating_games as g ON (g.time BETWEEN e.todatetime AND e.todatetime + INTERVAL 1 WEEK - INTERVAL 1 SECOND) \
+ \ JOIN rating_players as p ON (p.gameid = g.id) \
+ \ JOIN rating_players as o ON (p.gameid = o.gameid AND p.userid <> o.userid AND (p.place = 0 OR (p.place <> o.place))) \
+ \ LEFT OUTER JOIN rating_values as vp ON (vp.epoch = e.epoch AND vp.userid = p.userid) \
+ \ LEFT OUTER JOIN rating_values as vo ON (vo.epoch = e.epoch AND vo.userid = o.userid) \
+ \ GROUP BY p.userid, p.gameid, p.place \
+ \ ORDER BY p.userid"
+insertNewRatings = "INSERT INTO rating_values (userid, epoch, rating, rd, volatility, games) VALUES (?, ?, ?, ?, ?, ?)"
+insertNewEpoch = "INSERT INTO rating_epochs (epoch, todatetime) VALUES (?, ?)"
+
+mergeRatingData :: Map.Map Int (RatingData, [GameData]) -> [(Int, (RatingData, [GameData]))] -> Map.Map Int (RatingData, [GameData])
+mergeRatingData m s = foldr (uncurry (Map.insertWith mf)) m s
+ where
+ mf (rd, gds) (_, gds2) = (rd, gds ++ gds2)
+
+calculateRatings dbConn = do
+ [(epochNum :: Int, fromDate :: UTCTime, toDate :: UTCTime)] <- query_ dbConn queryEpochDates
+ initRatingData <- (Map.fromList . map fromDBrating) `fmap` query_ dbConn queryPreviousRatings
+ gameData <- map fromGameResult `fmap` query_ dbConn queryGameResults
+ let mData = map getNewRating . Map.toList $ mergeRatingData initRatingData gameData
+ executeMany dbConn insertNewRatings $ map (toInsert epochNum) mData
+ execute dbConn insertNewEpoch (epochNum + 1, toDate)
+ return ()
+ where
+ toInsert e (i, (g, RatingData r rd v)) = (i, e + 1, r, rd, v, g)
+ getNewRating (a, d) = (a, uncurry calcNewRating d)
+ convPlace :: Int -> Double
+ convPlace 0 = 0.5
+ convPlace 1 = 1.0
+ convPlace 2 = 0.0
+ convPlace _ = error "Incorrect place value"
+ fromDBrating (a, b, c, d) = (a, (RatingData b c d, []))
+ fromGameResult (pid, place, prating, pRD, pvol, orating, oRD, ovol) =
+ (pid,
+ (RatingData prating pRD pvol
+ , [GameData (RatingData orating oRD ovol) $ convPlace place]))
+
+
+data DBConnectInfo = DBConnectInfo {
+ dbHost
+ , dbName
+ , dbLogin
+ , dbPassword :: B.ByteString
+ }
+
+cfgFileName :: String
+cfgFileName = "hedgewars-server.ini"
+
+
+readServerConfig :: ConnectInfo -> IO ConnectInfo
+readServerConfig ci = do
+ cfg <- readConfig cfgFileName
+ return $ ci{
+ connectHost = value "dbHost" cfg
+ , connectDatabase = value "dbName" cfg
+ , connectUser = value "dbLogin" cfg
+ , connectPassword = value "dbPassword" cfg
+ }
+ where
+ value n c = fromJust2 n $ getValue n c
+ fromJust2 n Nothing = error $ "Missing config entry " ++ n
+ fromJust2 _ (Just a) = a
+
+dbConnectionLoop mySQLConnectionInfo =
+ Control.Exception.handle (\(e :: SomeException) -> hPutStrLn stderr $ show e) $
+ bracket
+ (connect mySQLConnectionInfo)
+ close
+ calculateRatings
+
+main = readServerConfig defaultConnectInfo >>= dbConnectionLoop
--- a/gameServer/ServerCore.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/ServerCore.hs Fri Apr 01 15:36:19 2016 +0200
@@ -23,7 +23,7 @@
import System.Log.Logger
import Control.Monad.Reader
import Control.Monad.State.Strict
-import Data.Set as Set
+import Data.Set as Set hiding (null)
import Data.Unique
import Data.Maybe
--------------------------------------
@@ -55,6 +55,10 @@
unless (ci `Set.member` removed) $ do
modify (\s -> s{clientIndex = Just ci})
processAction $ ReactCmd cmd
+ pa <- client's pendingActions
+ when (not $ null pa) $ do
+ mapM_ processAction pa
+ processAction $ ModifyClient $ \c -> c{pendingActions = []}
Remove ci ->
processAction (DeleteClient ci)
--- a/gameServer/Utils.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/Utils.hs Fri Apr 01 15:36:19 2016 +0200
@@ -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
@@ -239,3 +241,8 @@
deleteFirstsBy2 :: (a -> b -> Bool) -> [a] -> [b] -> [a]
deleteFirstsBy2 eq = foldl (flip (deleteBy2 (flip eq)))
+sanitizeName :: B.ByteString -> B.ByteString
+sanitizeName = B.map sc
+ where
+ sc c | isAlphaNum c = c
+ | otherwise = '_'
--- a/gameServer/Votes.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/gameServer/Votes.hs Fri Apr 01 15:36:19 2016 +0200
@@ -95,17 +95,14 @@
let rs = Map.lookup roomSave (roomSaves rm)
case rs of
Nothing -> return []
- Just (mp, p) -> do
+ Just (location, mp, p) -> do
cl <- thisClient
chans <- roomClientsChans
- let a = map (replaceChans chans) $ answerFullConfigParams cl mp p
- return $
- (ModifyRoom $ \r -> r{params = p, mapParams = mp})
- : SendUpdateOnThisRoom
- : a
- where
- replaceChans chans (AnswerClients _ msg) = AnswerClients chans msg
- replaceChans _ a = a
+ return $
+ [ModifyRoom $ \r -> r{params = p, mapParams = mp}
+ , AnswerClients chans ["CHAT", "[server]", location]
+ , SendUpdateOnThisRoom
+ , LoadGhost location]
act (VotePause) = do
rm <- thisRoom
chans <- roomClientsChans
--- a/hedgewars/ArgParsers.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/ArgParsers.pas Fri Apr 01 15:36:19 2016 +0200
@@ -100,7 +100,7 @@
WriteLn(stdout, ' --help');
WriteLn(stdout, '');
WriteLn(stdout, 'For more detailed help and examples go to:');
- WriteLn(stdout, 'http://code.google.com/p/hedgewars/wiki/CommandLineOptions');
+ WriteLn(stdout, 'http://hedgewars.org/kb/CommandLineOptions');
GameType:= gmtSyntax;
end;
@@ -335,7 +335,7 @@
//var tmpInt: LongInt;
begin
- paramIndex:= 1;
+ paramIndex:= {$IFDEF HWLIBRARY}0{$ELSE}1{$ENDIF};
paramTotal:= ParamCount; //-1 because pascal enumeration is inclusive
(*
WriteLn(stdout, 'total parameters: ' + inttostr(paramTotal));
--- a/hedgewars/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -1,8 +1,10 @@
-find_package(SDL1or2)
-find_package(SDL_image)
-find_package(SDL_net)
-find_package(SDL_ttf)
-find_package(SDL_mixer)
+enable_language(Pascal)
+
+find_package(SDL2 REQUIRED)
+find_package(SDL2_image REQUIRED)
+find_package(SDL2_net REQUIRED)
+find_package(SDL2_ttf REQUIRED)
+find_package(SDL2_mixer REQUIRED)
include(CheckLibraryExists)
include(${CMAKE_MODULE_PATH}/utils.cmake)
@@ -122,22 +124,16 @@
#DEPENDECIES AND EXECUTABLES SECTION
if(APPLE AND (NOT BUILD_ENGINE_LIBRARY))
- #on OSX we need to provide the SDL_main() function when building as
- #executable and the entry point too
- add_subdirectory(sdlmain)
- list(APPEND HW_LINK_LIBS SDLmain)
- add_flag_append(CMAKE_Pascal_FLAGS "-k-lsdlmain")
- add_flag_append(CMAKE_Pascal_FLAGS "-XMSDL_main")
#OpenGL deps
add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kCocoa")
add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kOpenGL")
#set the correct library or framework style depending on the main SDL
- string(FIND "${SDL_LIBRARY}" "dylib" sdl_framework)
+ string(FIND "${SDL2_LIBRARY}" "dylib" sdl_framework)
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")
+ add_flag_append(CMAKE_Pascal_FLAGS "-k-lsdl2 -k-lsdl2_image -k-lsdl2_mixer -k-lsdl2_ttf -k-lsdl2_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 -kSDL2 -k-framework -kSDL2_image -k-framework -kSDL2_mixer -k-framework -kSDL2_net -k-framework -kSDL2_net -k-framework -kSDL2_ttf")
endif()
endif()
@@ -145,8 +141,6 @@
add_subdirectory(avwrapper)
list(APPEND HW_LINK_LIBS avwrapper)
add_definitions(-dUSE_VIDEO_RECORDING)
- #only for SDL < 2, linking carried out by fpc
- find_package_or_disable_msg(GLUT NOVIDEOREC "Video recording will not be built")
endif()
find_package_or_disable_msg(PNG NOPNG "Screenshots will be saved in BMP")
@@ -184,22 +178,6 @@
list(APPEND HW_LINK_LIBS physlayer)
-#Mix_Init/Mix_Quit from SDL_mixer 1.2.10
-check_library_exists(${SDLMIXER_LIBRARY} Mix_Init "" HAVE_MIXINIT)
-if(HAVE_MIXINIT)
- add_definitions(-dSDL_MIXER_NEWER)
-endif(HAVE_MIXINIT)
-
-#IMG_Init/IMG_Quit from SDL_image 1.2.8
-check_library_exists(${SDLIMAGE_LIBRARY} IMG_Init "" HAVE_IMGINIT)
-if(HAVE_IMGINIT)
- add_definitions(-dSDL_IMAGE_NEWER)
-endif(HAVE_IMGINIT)
-
-if(${SDL_VERSION} VERSION_GREATER 1.3)
- add_definitions(-dSDL2)
-endif()
-
#opengl 2
IF(GL2)
add_definitions(-dGL2)
--- a/hedgewars/SDLh.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/SDLh.pas Fri Apr 01 15:36:19 2016 +0200
@@ -57,17 +57,17 @@
(* SDL *)
const
{$IFDEF WIN32}
- SDLLibName = 'SDL.dll';
- SDL_TTFLibName = 'SDL_ttf.dll';
- SDL_MixerLibName = 'SDL_mixer.dll';
- SDL_ImageLibName = 'SDL_image.dll';
- SDL_NetLibName = 'SDL_net.dll';
+ SDLLibName = 'SDL2.dll';
+ SDL_TTFLibName = 'SDL2_ttf.dll';
+ SDL_MixerLibName = 'SDL2_mixer.dll';
+ SDL_ImageLibName = 'SDL2_image.dll';
+ SDL_NetLibName = 'SDL2_net.dll';
{$ELSE}
- SDLLibName = 'libSDL';
- SDL_TTFLibName = 'libSDL_ttf';
- SDL_MixerLibName = 'libSDL_mixer';
- SDL_ImageLibName = 'libSDL_image';
- SDL_NetLibName = 'libSDL_net';
+ SDLLibName = 'libSDL2';
+ SDL_TTFLibName = 'libSDL2_ttf';
+ SDL_MixerLibName = 'libSDL2_mixer';
+ SDL_ImageLibName = 'libSDL2_image';
+ SDL_NetLibName = 'libSDL2_net';
{$ENDIF}
/////////////////////////////////////////////////////////////////
@@ -79,28 +79,33 @@
SDL_INIT_AUDIO = $00000010;
SDL_INIT_VIDEO = $00000020; // implies SDL_INIT_EVENTS (sdl2)
SDL_INIT_JOYSTICK = $00000200; // implies SDL_INIT_EVENTS (sdl2)
-{$IFDEF SDL2}
SDL_INIT_HAPTIC = $00001000;
SDL_INIT_GAMECONTROLLER = $00002000; // implies SDL_INIT_JOYSTICK
SDL_INIT_EVENTS = $00004000;
-{$ELSE}
- SDL_INIT_CDROM = $00000100;
- SDL_INIT_EVENTTHREAD = $01000000;
-{$ENDIF}
SDL_INIT_NOPARACHUTE = $00100000;
//SDL_INIT_EVERYTHING // unsafe, init subsystems one at a time
SDL_ALLEVENTS = $FFFFFFFF; // dummy event type to prevent stack corruption
SDL_APPINPUTFOCUS = $02;
+ // (some) audio formats from SDL_audio.h
+ AUDIO_S16LSB = $8010; // Signed 16-bit samples, in little-endian byte order
+ AUDIO_S16MSB = $9010; // Signed 16-bit samples, in big-endian byte order
+ AUDIO_S16SYS = {$IFDEF ENDIAN_LITTLE}AUDIO_S16LSB{$ELSE}AUDIO_S16MSB{$ENDIF};
+
+ // default audio format from SDL_mixer.h
+ MIX_DEFAULT_FORMAT = AUDIO_S16SYS;
+
SDL_BUTTON_LEFT = 1;
SDL_BUTTON_MIDDLE = 2;
SDL_BUTTON_RIGHT = 3;
- SDL_BUTTON_WHEELUP = 4;
- SDL_BUTTON_WHEELDOWN = 5;
+ SDL_BUTTON_X1 = 4;
+ SDL_BUTTON_X2 = 5;
-{$IFDEF SDL2}
+ SDL_TEXTEDITINGEVENT_TEXT_SIZE = 32;
+ SDL_TEXTINPUTEVENT_TEXT_SIZE = 32;
+
// SDL_Event types
// pascal does not support unions as is, so we list here every possible event
// and later associate a struct type each
@@ -193,39 +198,6 @@
SDL_WINDOWEVENT_FOCUS_GAINED = 12; //*< Window has gained keyboard focus
SDL_WINDOWEVENT_FOCUS_LOST = 13; //*< Window has lost keyboard focus
SDL_WINDOWEVENT_CLOSE = 14; //*< The window manager requests that the window be closed */
-{$ELSE}
- // SDL_Event types
- SDL_NOEVENT = 0;
- SDL_ACTIVEEVENT = 1;
- SDL_KEYDOWN = 2;
- SDL_KEYUP = 3;
- SDL_MOUSEMOTION = 4;
- SDL_MOUSEBUTTONDOWN = 5;
- SDL_MOUSEBUTTONUP = 6;
- SDL_JOYAXISMOTION = 7;
- SDL_JOYBALLMOTION = 8;
- SDL_JOYHATMOTION = 9;
- SDL_JOYBUTTONDOWN = 10;
- SDL_JOYBUTTONUP = 11;
- SDL_QUITEV = 12;
- SDL_VIDEORESIZE = 16;
-
- // SDL_Surface flags
- SDL_SWSURFACE = $00000000;
- SDL_HWSURFACE = $00000001;
- SDL_OPENGL = $00000002;
- SDL_ASYNCBLIT = $00000004;
- SDL_RESIZABLE = $00000010;
- SDL_NOFRAME = $00000020;
- SDL_HWACCEL = $00000100;
- SDL_SRCCOLORKEY = $00001000;
- SDL_RLEACCEL = $00004000;
- SDL_SRCALPHA = $00010000;
- SDL_ANYFORMAT = $00100000;
- SDL_HWPALETTE = $20000000;
- SDL_DOUBLEBUF = $40000000;
- SDL_FULLSCREEN = $80000000;
-{$ENDIF}
{$IFDEF ENDIAN_LITTLE}
RMask = $000000FF;
@@ -261,11 +233,13 @@
KMOD_MODE = $4000;
{* SDL_mixer *}
- MIX_MAX_VOLUME = 128;
- MIX_INIT_FLAC = $00000001;
- MIX_INIT_MOD = $00000002;
- MIX_INIT_MP3 = $00000004;
- MIX_INIT_OGG = $00000008;
+ MIX_MAX_VOLUME = 128;
+ MIX_INIT_FLAC = $00000001;
+ MIX_INIT_MOD = $00000002;
+ MIX_INIT_MODPLUG = $00000004;
+ MIX_INIT_MP3 = $00000008;
+ MIX_INIT_OGG = $00000010;
+ MIX_INIT_FLUIDSYNTH = $00000020;
{* SDL_TTF *}
TTF_STYLE_NORMAL = 0;
@@ -288,7 +262,8 @@
IMG_INIT_PNG = $00000002;
IMG_INIT_TIF = $00000004;
- {* SDL_keysym *}
+ {* SDL_keycode *}
+ SDLK_UNKNOWN = 0;
SDLK_BACKSPACE = 8;
SDLK_RETURN = 13;
SDLK_ESCAPE = 27;
@@ -309,6 +284,250 @@
SDLK_PAGEUP = 280;
SDLK_PAGEDOWN = 281;
+ // special keycodes (for modifier keys etc. will have this bit set)
+ SDLK_SCANCODE_MASK = (1 shl 30);
+
+ SDL_SCANCODE_UNKNOWN = 0;
+ SDL_SCANCODE_A = 4;
+ SDL_SCANCODE_B = 5;
+ SDL_SCANCODE_C = 6;
+ SDL_SCANCODE_D = 7;
+ SDL_SCANCODE_E = 8;
+ SDL_SCANCODE_F = 9;
+ SDL_SCANCODE_G = 10;
+ SDL_SCANCODE_H = 11;
+ SDL_SCANCODE_I = 12;
+ SDL_SCANCODE_J = 13;
+ SDL_SCANCODE_K = 14;
+ SDL_SCANCODE_L = 15;
+ SDL_SCANCODE_M = 16;
+ SDL_SCANCODE_N = 17;
+ SDL_SCANCODE_O = 18;
+ SDL_SCANCODE_P = 19;
+ SDL_SCANCODE_Q = 20;
+ SDL_SCANCODE_R = 21;
+ SDL_SCANCODE_S = 22;
+ SDL_SCANCODE_T = 23;
+ SDL_SCANCODE_U = 24;
+ SDL_SCANCODE_V = 25;
+ SDL_SCANCODE_W = 26;
+ SDL_SCANCODE_X = 27;
+ SDL_SCANCODE_Y = 28;
+ SDL_SCANCODE_Z = 29;
+ SDL_SCANCODE_1 = 30;
+ SDL_SCANCODE_2 = 31;
+ SDL_SCANCODE_3 = 32;
+ SDL_SCANCODE_4 = 33;
+ SDL_SCANCODE_5 = 34;
+ SDL_SCANCODE_6 = 35;
+ SDL_SCANCODE_7 = 36;
+ SDL_SCANCODE_8 = 37;
+ SDL_SCANCODE_9 = 38;
+ SDL_SCANCODE_0 = 39;
+ SDL_SCANCODE_RETURN = 40;
+ SDL_SCANCODE_ESCAPE = 41;
+ SDL_SCANCODE_BACKSPACE = 42;
+ SDL_SCANCODE_TAB = 43;
+ SDL_SCANCODE_SPACE = 44;
+ SDL_SCANCODE_MINUS = 45;
+ SDL_SCANCODE_EQUALS = 46;
+ SDL_SCANCODE_LEFTBRACKET = 47;
+ SDL_SCANCODE_RIGHTBRACKET = 48;
+ SDL_SCANCODE_BACKSLASH = 49;
+ SDL_SCANCODE_NONUSHASH = 50;
+ SDL_SCANCODE_SEMICOLON = 51;
+ SDL_SCANCODE_APOSTROPHE = 52;
+ SDL_SCANCODE_GRAVE = 53;
+ SDL_SCANCODE_COMMA = 54;
+ SDL_SCANCODE_PERIOD = 55;
+ SDL_SCANCODE_SLASH = 56;
+ SDL_SCANCODE_CAPSLOCK = 57;
+ SDL_SCANCODE_F1 = 58;
+ SDL_SCANCODE_F2 = 59;
+ SDL_SCANCODE_F3 = 60;
+ SDL_SCANCODE_F4 = 61;
+ SDL_SCANCODE_F5 = 62;
+ SDL_SCANCODE_F6 = 63;
+ SDL_SCANCODE_F7 = 64;
+ SDL_SCANCODE_F8 = 65;
+ SDL_SCANCODE_F9 = 66;
+ SDL_SCANCODE_F10 = 67;
+ SDL_SCANCODE_F11 = 68;
+ SDL_SCANCODE_F12 = 69;
+ SDL_SCANCODE_PRINTSCREEN = 70;
+ SDL_SCANCODE_SCROLLLOCK = 71;
+ SDL_SCANCODE_PAUSE = 72;
+ SDL_SCANCODE_INSERT = 73;
+ SDL_SCANCODE_HOME = 74;
+ SDL_SCANCODE_PAGEUP = 75;
+ SDL_SCANCODE_DELETE = 76;
+ SDL_SCANCODE_END = 77;
+ SDL_SCANCODE_PAGEDOWN = 78;
+ SDL_SCANCODE_RIGHT = 79;
+ SDL_SCANCODE_LEFT = 80;
+ SDL_SCANCODE_DOWN = 81;
+ SDL_SCANCODE_UP = 82;
+ SDL_SCANCODE_NUMLOCKCLEAR = 83;
+ SDL_SCANCODE_KP_DIVIDE = 84;
+ SDL_SCANCODE_KP_MULTIPLY = 85;
+ SDL_SCANCODE_KP_MINUS = 86;
+ SDL_SCANCODE_KP_PLUS = 87;
+ SDL_SCANCODE_KP_ENTER = 88;
+ SDL_SCANCODE_KP_1 = 89;
+ SDL_SCANCODE_KP_2 = 90;
+ SDL_SCANCODE_KP_3 = 91;
+ SDL_SCANCODE_KP_4 = 92;
+ SDL_SCANCODE_KP_5 = 93;
+ SDL_SCANCODE_KP_6 = 94;
+ SDL_SCANCODE_KP_7 = 95;
+ SDL_SCANCODE_KP_8 = 96;
+ SDL_SCANCODE_KP_9 = 97;
+ SDL_SCANCODE_KP_0 = 98;
+ SDL_SCANCODE_KP_PERIOD = 99;
+ SDL_SCANCODE_NONUSBACKSLASH = 100;
+ SDL_SCANCODE_APPLICATION = 101;
+ SDL_SCANCODE_POWER = 102;
+ SDL_SCANCODE_KP_EQUALS = 103;
+ SDL_SCANCODE_F13 = 104;
+ SDL_SCANCODE_F14 = 105;
+ SDL_SCANCODE_F15 = 106;
+ SDL_SCANCODE_F16 = 107;
+ SDL_SCANCODE_F17 = 108;
+ SDL_SCANCODE_F18 = 109;
+ SDL_SCANCODE_F19 = 110;
+ SDL_SCANCODE_F20 = 111;
+ SDL_SCANCODE_F21 = 112;
+ SDL_SCANCODE_F22 = 113;
+ SDL_SCANCODE_F23 = 114;
+ SDL_SCANCODE_F24 = 115;
+ SDL_SCANCODE_EXECUTE = 116;
+ SDL_SCANCODE_HELP = 117;
+ SDL_SCANCODE_MENU = 118;
+ SDL_SCANCODE_SELECT = 119;
+ SDL_SCANCODE_STOP = 120;
+ SDL_SCANCODE_AGAIN = 121;
+ SDL_SCANCODE_UNDO = 122;
+ SDL_SCANCODE_CUT = 123;
+ SDL_SCANCODE_COPY = 124;
+ SDL_SCANCODE_PASTE = 125;
+ SDL_SCANCODE_FIND = 126;
+ SDL_SCANCODE_MUTE = 127;
+ SDL_SCANCODE_VOLUMEUP = 128;
+ SDL_SCANCODE_VOLUMEDOWN = 129;
+ SDL_SCANCODE_KP_COMMA = 133;
+ SDL_SCANCODE_KP_EQUALSAS400 = 134;
+ SDL_SCANCODE_INTERNATIONAL1 = 135;
+ SDL_SCANCODE_INTERNATIONAL2 = 136;
+ SDL_SCANCODE_INTERNATIONAL3 = 137;
+ SDL_SCANCODE_INTERNATIONAL4 = 138;
+ SDL_SCANCODE_INTERNATIONAL5 = 139;
+ SDL_SCANCODE_INTERNATIONAL6 = 140;
+ SDL_SCANCODE_INTERNATIONAL7 = 141;
+ SDL_SCANCODE_INTERNATIONAL8 = 142;
+ SDL_SCANCODE_INTERNATIONAL9 = 143;
+ SDL_SCANCODE_LANG1 = 144; (*< Hangul/English toggle *)
+ SDL_SCANCODE_LANG2 = 145; (*< Hanja conversion *)
+ SDL_SCANCODE_LANG3 = 146; (*< Katakana *)
+ SDL_SCANCODE_LANG4 = 147; (*< Hiragana *)
+ SDL_SCANCODE_LANG5 = 148; (*< Zenkaku/Hankaku *)
+ SDL_SCANCODE_LANG6 = 149; (*< reserved *)
+ SDL_SCANCODE_LANG7 = 150; (*< reserved *)
+ SDL_SCANCODE_LANG8 = 151; (*< reserved *)
+ SDL_SCANCODE_LANG9 = 152; (*< reserved *)
+ SDL_SCANCODE_ALTERASE = 153;
+ SDL_SCANCODE_SYSREQ = 154;
+ SDL_SCANCODE_CANCEL = 155;
+ SDL_SCANCODE_CLEAR = 156;
+ SDL_SCANCODE_PRIOR = 157;
+ SDL_SCANCODE_RETURN2 = 158;
+ SDL_SCANCODE_SEPARATOR = 159;
+ SDL_SCANCODE_OUT = 160;
+ SDL_SCANCODE_OPER = 161;
+ SDL_SCANCODE_CLEARAGAIN = 162;
+ SDL_SCANCODE_CRSEL = 163;
+ SDL_SCANCODE_EXSEL = 164;
+ SDL_SCANCODE_KP_00 = 176;
+ SDL_SCANCODE_KP_000 = 177;
+ SDL_SCANCODE_THOUSANDSSEPARATOR = 178;
+ SDL_SCANCODE_DECIMALSEPARATOR = 179;
+ SDL_SCANCODE_CURRENCYUNIT = 180;
+ SDL_SCANCODE_CURRENCYSUBUNIT = 181;
+ SDL_SCANCODE_KP_LEFTPAREN = 182;
+ SDL_SCANCODE_KP_RIGHTPAREN = 183;
+ SDL_SCANCODE_KP_LEFTBRACE = 184;
+ SDL_SCANCODE_KP_RIGHTBRACE = 185;
+ SDL_SCANCODE_KP_TAB = 186;
+ SDL_SCANCODE_KP_BACKSPACE = 187;
+ SDL_SCANCODE_KP_A = 188;
+ SDL_SCANCODE_KP_B = 189;
+ SDL_SCANCODE_KP_C = 190;
+ SDL_SCANCODE_KP_D = 191;
+ SDL_SCANCODE_KP_E = 192;
+ SDL_SCANCODE_KP_F = 193;
+ SDL_SCANCODE_KP_XOR = 194;
+ SDL_SCANCODE_KP_POWER = 195;
+ SDL_SCANCODE_KP_PERCENT = 196;
+ SDL_SCANCODE_KP_LESS = 197;
+ SDL_SCANCODE_KP_GREATER = 198;
+ SDL_SCANCODE_KP_AMPERSAND = 199;
+ SDL_SCANCODE_KP_DBLAMPERSAND = 200;
+ SDL_SCANCODE_KP_VERTICALBAR = 201;
+ SDL_SCANCODE_KP_DBLVERTICALBAR = 202;
+ SDL_SCANCODE_KP_COLON = 203;
+ SDL_SCANCODE_KP_HASH = 204;
+ SDL_SCANCODE_KP_SPACE = 205;
+ SDL_SCANCODE_KP_AT = 206;
+ SDL_SCANCODE_KP_EXCLAM = 207;
+ SDL_SCANCODE_KP_MEMSTORE = 208;
+ SDL_SCANCODE_KP_MEMRECALL = 209;
+ SDL_SCANCODE_KP_MEMCLEAR = 210;
+ SDL_SCANCODE_KP_MEMADD = 211;
+ SDL_SCANCODE_KP_MEMSUBTRACT = 212;
+ SDL_SCANCODE_KP_MEMMULTIPLY = 213;
+ SDL_SCANCODE_KP_MEMDIVIDE = 214;
+ SDL_SCANCODE_KP_PLUSMINUS = 215;
+ SDL_SCANCODE_KP_CLEAR = 216;
+ SDL_SCANCODE_KP_CLEARENTRY = 217;
+ SDL_SCANCODE_KP_BINARY = 218;
+ SDL_SCANCODE_KP_OCTAL = 219;
+ SDL_SCANCODE_KP_DECIMAL = 220;
+ SDL_SCANCODE_KP_HEXADECIMAL = 221;
+ SDL_SCANCODE_LCTRL = 224;
+ SDL_SCANCODE_LSHIFT = 225;
+ SDL_SCANCODE_LALT = 226;
+ SDL_SCANCODE_LGUI = 227;
+ SDL_SCANCODE_RCTRL = 228;
+ SDL_SCANCODE_RSHIFT = 229;
+ SDL_SCANCODE_RALT = 230;
+ SDL_SCANCODE_RGUI = 231;
+ SDL_SCANCODE_MODE = 257;
+ SDL_SCANCODE_AUDIONEXT = 258;
+ SDL_SCANCODE_AUDIOPREV = 259;
+ SDL_SCANCODE_AUDIOSTOP = 260;
+ SDL_SCANCODE_AUDIOPLAY = 261;
+ SDL_SCANCODE_AUDIOMUTE = 262;
+ SDL_SCANCODE_MEDIASELECT = 263;
+ SDL_SCANCODE_WWW = 264;
+ SDL_SCANCODE_MAIL = 265;
+ SDL_SCANCODE_CALCULATOR = 266;
+ SDL_SCANCODE_COMPUTER = 267;
+ SDL_SCANCODE_AC_SEARCH = 268;
+ SDL_SCANCODE_AC_HOME = 269;
+ SDL_SCANCODE_AC_BACK = 270;
+ SDL_SCANCODE_AC_FORWARD = 271;
+ SDL_SCANCODE_AC_STOP = 272;
+ SDL_SCANCODE_AC_REFRESH = 273;
+ SDL_SCANCODE_AC_BOOKMARKS = 274;
+ SDL_SCANCODE_BRIGHTNESSDOWN = 275;
+ SDL_SCANCODE_BRIGHTNESSUP = 276;
+ SDL_SCANCODE_DISPLAYSWITCH = 277;
+ SDL_SCANCODE_KBDILLUMTOGGLE = 278;
+ SDL_SCANCODE_KBDILLUMDOWN = 279;
+ SDL_SCANCODE_KBDILLUMUP = 280;
+ SDL_SCANCODE_EJECT = 281;
+ SDL_SCANCODE_SLEEP = 282;
+ SDL_SCANCODE_APP1 = 283;
+ SDL_SCANCODE_APP2 = 284;
/////////////////////////////////////////////////////////////////
/////////////////////// TYPE DEFINITIONS ///////////////////////
@@ -319,25 +538,20 @@
// http://www.freepascal.org/docs-html/prog/progsu144.html
type
-{$IFDEF SDL2}
PSDL_Window = Pointer;
PSDL_Renderer = Pointer;
PSDL_Texture = Pointer;
PSDL_GLContext= Pointer;
TSDL_TouchId = Int64;
-{$ENDIF}
TSDL_FingerId = Int64;
+ TSDL_Keycode = LongInt;
+ TSDL_Scancode = LongInt;
TSDL_eventaction = (SDL_ADDEVENT, SDL_PEEPEVENT, SDL_GETEVENT);
PSDL_Rect = ^TSDL_Rect;
TSDL_Rect = record
-{$IFDEF SDL2}
x, y, w, h: LongInt;
-{$ELSE}
- x, y: SmallInt;
- w, h: Word;
-{$ENDIF}
end;
TPoint = record
@@ -346,7 +560,6 @@
PSDL_PixelFormat = ^TSDL_PixelFormat;
TSDL_PixelFormat = record
-{$IFDEF SDL2}
format: LongWord;
palette: Pointer;
BitsPerPixel : Byte;
@@ -366,25 +579,6 @@
Ashift: Byte;
refcount: LongInt;
next: PSDL_PixelFormat;
-{$ELSE}
- palette: Pointer;
- BitsPerPixel : Byte;
- BytesPerPixel: Byte;
- Rloss : Byte;
- Gloss : Byte;
- Bloss : Byte;
- Aloss : Byte;
- Rshift: Byte;
- Gshift: Byte;
- Bshift: Byte;
- Ashift: Byte;
- RMask : LongWord;
- GMask : LongWord;
- BMask : LongWord;
- AMask : LongWord;
- colorkey: LongWord;
- alpha: Byte;
-{$ENDIF}
end;
PSDL_Surface = ^TSDL_Surface;
@@ -392,7 +586,7 @@
flags : LongWord;
format: PSDL_PixelFormat;
w, h : LongInt;
- pitch : {$IFDEF SDL2}LongInt{$ELSE}Word{$ENDIF};
+ pitch : LongInt;
pixels: Pointer;
{$IFDEF PAS2C}
hwdata : Pointer;
@@ -404,16 +598,12 @@
refcount : LongInt;
offset : LongInt;
{$ELSE}
-{$IFDEF SDL2}
userdata : Pointer;
locked : LongInt;
lock_data : Pointer;
clip_rect : TSDL_Rect;
map : Pointer;
refcount : LongInt;
-{$ELSE}
- offset : LongInt;
-{$ENDIF}
{$ENDIF}
end;
@@ -429,18 +619,14 @@
(* SDL_RWops and friends *)
PSDL_RWops = ^TSDL_RWops;
-{$IFDEF SDL2}
TSize = function( context: PSDL_RWops): Int64; cdecl;
TSeek = function( context: PSDL_RWops; offset: Int64; whence: LongInt ): Int64; cdecl;
-{$ELSE}
- TSeek = function( context: PSDL_RWops; offset: LongInt; whence: LongInt ): LongInt; cdecl;
-{$ENDIF}
TRead = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; maxnum : LongInt ): LongInt; cdecl;
TWrite = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; num: LongInt ): LongInt; cdecl;
TClose = function( context: PSDL_RWops ): LongInt; cdecl;
TStdio = record
- autoclose: {$IFDEF SDL2}Boolean{$ELSE}LongInt{$ENDIF};
+ autoclose: Boolean;
fp: Pointer;
end;
@@ -452,9 +638,7 @@
TUnknown = record
data1: Pointer;
-{$IFDEF SDL2}
data2: Pointer;
-{$ENDIF}
end;
{$IFDEF ANDROID}
@@ -471,7 +655,7 @@
size, left: LongInt;
end;
TWindowsio = record
- append : {$IFDEF SDL2}Boolean{$ELSE}LongInt{$ENDIF};
+ append : Boolean;
h : Pointer;
buffer : TWinbuffer;
end;
@@ -479,9 +663,7 @@
{$ENDIF}
TSDL_RWops = record
-{$IFDEF SDL2}
size: TSize;
-{$ENDIF}
seek: TSeek;
read: TRead;
write: TWrite;
@@ -503,10 +685,9 @@
{* SDL_Event type definition *}
-{$IFDEF SDL2}
TSDL_Keysym = record
- scancode: LongInt;
- sym: LongInt;
+ scancode: TSDL_Scancode;
+ sym: TSDL_Keycode;
modifier: Word;
unused: LongWord;
end;
@@ -520,21 +701,20 @@
data1, data2: LongInt;
end;
- // available in sdl12 but not exposed
TSDL_TextEditingEvent = record
- type_: LongWord;
- timestamp: LongWord;
- windowID: LongWord;
- text: array[0..31] of Byte;
- start, lenght: LongInt;
+ type_: Longword;
+ timestamp: Longword;
+ windowID: Longword;
+ text: array [0..SDL_TEXTEDITINGEVENT_TEXT_SIZE - 1] of char;
+ start: LongInt;
+ length: LongInt;
end;
- // available in sdl12 but not exposed
TSDL_TextInputEvent = record
- type_: LongWord;
- timestamp: LongWord;
- windowID: LongWord;
- text: array[0..31] of Byte;
+ type_: Longword;
+ timestamp: Longword;
+ windowID: Longword;
+ text: array [0..SDL_TEXTINPUTEVENT_TEXT_SIZE - 1] of char;
end;
TSDL_TouchFingerEvent = record
@@ -605,167 +785,92 @@
end;
TSDL_OSEvent = TSDL_CommonEvent;
-{$ELSE}
- TSDL_KeySym = record
- scancode: Byte;
- sym: LongWord;
- modifier: LongWord;
- unicode: Word;
- end;
-
- TSDL_ActiveEvent = record
- type_: Byte;
- gain: Byte;
- state: Byte;
- end;
-
- TSDL_ResizeEvent = record
- type_: Byte;
- w, h: LongInt;
- end;
-{$ENDIF}
TSDL_KeyboardEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
state, repeat_, padding2, padding3: Byte;
-{$ELSE}
- type_, which, state: Byte;
-{$ENDIF}
keysym: TSDL_Keysym;
end;
TSDL_MouseMotionEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
which, state: LongWord;
x, y, xrel, yrel: LongInt;
-{$ELSE}
- type_, which, state: Byte;
- x, y, xrel, yrel: Word;
-{$ENDIF}
end;
TSDL_MouseButtonEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
which: LongWord;
button, state, padding1, padding2: Byte;
x, y: LongInt;
-{$ELSE}
- type_, which, button, state: Byte;
- x, y: Word;
-{$ENDIF}
end;
TSDL_MouseWheelEvent = record
type_: LongWord;
-{$IFDEF SDL2}
timestamp: LongWord;
windowID: LongWord;
which: LongWord;
-{$ELSE}
- which: Byte;
-{$ENDIF}
x, y: LongInt;
end;
TSDL_JoyAxisEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
which: LongWord;
-{$ELSE}
- type_: Byte;
- which: Byte;
-{$ENDIF}
axis: Byte;
-{$IFDEF SDL2}
padding1, padding2, padding3: Byte;
value: LongInt;
padding4: Word;
-{$ELSE}
- value: SmallInt;
-{$ENDIF}
end;
TSDL_JoyBallEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
which: LongWord;
-{$ELSE}
- type_: Byte;
- which: Byte;
-{$ENDIF}
ball: Byte;
-{$IFDEF SDL2}
padding1, padding2, padding3: Byte;
-{$ENDIF}
xrel, yrel: SmallInt;
end;
TSDL_JoyHatEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
which: LongWord;
-{$ELSE}
- type_: Byte;
- which: Byte;
-{$ENDIF}
hat: Byte;
value: Byte;
-{$IFDEF SDL2}
padding1, padding2: Byte;
-{$ENDIF}
end;
TSDL_JoyButtonEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
-{$ELSE}
- type_: Byte;
-{$ENDIF}
which: Byte;
button: Byte;
state: Byte;
-{$IFDEF SDL2}
padding1: Byte;
-{$ENDIF}
end;
TSDL_QuitEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
-{$ELSE}
- type_: Byte;
-{$ENDIF}
end;
TSDL_UserEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
-{$ELSE}
- type_: Byte;
-{$ENDIF}
code: LongInt;
data1, data2: Pointer;
end;
PSDL_Event = ^TSDL_Event;
TSDL_Event = record
-{$IFDEF SDL2}
case LongInt of
SDL_FIRSTEVENT: (type_: LongWord);
SDL_COMMONDEVENT: (common: TSDL_CommonEvent);
@@ -773,7 +878,7 @@
SDL_KEYDOWN,
SDL_KEYUP: (key: TSDL_KeyboardEvent);
SDL_TEXTEDITING: (edit: TSDL_TextEditingEvent);
- SDL_TEXTINPUT: (tedit: TSDL_TextInputEvent);
+ SDL_TEXTINPUT: (text: TSDL_TextInputEvent);
SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent);
SDL_MOUSEBUTTONDOWN,
SDL_MOUSEBUTTONUP: (button: TSDL_MouseButtonEvent);
@@ -801,25 +906,6 @@
SDL_DOLLARGESTURE: (dgesture: TSDL_DollarGestureEvent);
SDL_DROPFILE: (drop: TSDL_DropEvent);
SDL_ALLEVENTS: (foo: shortstring);
-{$ELSE}
- case Byte of
- SDL_NOEVENT: (type_: Byte);
- SDL_ACTIVEEVENT: (active: TSDL_ActiveEvent);
- SDL_KEYDOWN,
- SDL_KEYUP: (key: TSDL_KeyboardEvent);
- SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent);
- SDL_MOUSEBUTTONDOWN,
- SDL_MOUSEBUTTONUP: (button: TSDL_MouseButtonEvent);
- SDL_JOYAXISMOTION: (jaxis: TSDL_JoyAxisEvent);
- SDL_JOYHATMOTION: (jhat: TSDL_JoyHatEvent);
- SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent);
- SDL_JOYBUTTONDOWN,
- SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent);
- SDL_QUITEV: (quit: TSDL_QuitEvent);
- //SDL_SYSWMEVENT,SDL_EVENT_RESERVEDA,SDL_EVENT_RESERVEDB
- SDL_VIDEORESIZE: (resize: TSDL_ResizeEvent);
- SDL_ALLEVENTS: (foo: shortstring);
-{$ENDIF}
end;
TSDL_EventFilter = function( event : PSDL_Event ): Integer; cdecl;
@@ -850,7 +936,6 @@
SDL_GL_MULTISAMPLEBUFFERS,
SDL_GL_MULTISAMPLESAMPLES,
SDL_GL_ACCELERATED_VISUAL,
-{$IFDEF SDL2}
SDL_GL_RETAINED_BACKING,
SDL_GL_CONTEXT_MAJOR_VERSION,
SDL_GL_CONTEXT_MINOR_VERSION,
@@ -858,12 +943,8 @@
SDL_GL_CONTEXT_FLAGS,
SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_SHARE_WITH_CURRENT_CONTEXT
-{$ELSE}
- SDL_GL_SWAP_CONTROL
-{$ENDIF}
);
-{$IFDEF SDL2}
TSDL_ArrayByteOrder = ( // array component order, low Byte -> high Byte
SDL_ARRAYORDER_NONE,
SDL_ARRAYORDER_RGB,
@@ -873,7 +954,6 @@
SDL_ARRAYORDER_BGRA,
SDL_ARRAYORDER_ABGR
);
-{$ENDIF}
// Joystick/Controller support
PSDL_Joystick = ^TSDL_Joystick;
@@ -934,6 +1014,17 @@
sockets: PTCPSocket;
end;
+{$IFDEF WIN32}
+ TThreadFunction = function (p: pointer): Longword; stdcall;
+ pfnSDL_CurrentBeginThread = function (
+ _Security: pointer;
+ _StackSize: LongWord;
+ _StartAddress: TThreadFunction;
+ _ArgList: pointer;
+ _InitFlag: Longword;
+ _ThrdAddr: PLongword): PtrUInt; cdecl;
+ pfnSDL_CurrentEndThread = procedure (_Retval: LongInt); cdecl;
+{$ENDIF}
/////////////////////////////////////////////////////////////////
///////////////////// FUNCTION DEFINITIONS /////////////////////
@@ -945,6 +1036,8 @@
function SDL_InitSubSystem(flags: LongWord): LongInt; cdecl; external SDLLibName;
procedure SDL_Quit; cdecl; external SDLLibName;
+procedure SDL_free(mem: Pointer); cdecl; external SDLLibName;
+
procedure SDL_Delay(msec: LongWord); cdecl; external SDLLibName;
function SDL_GetTicks: LongWord; cdecl; external SDLLibName;
@@ -978,17 +1071,20 @@
function SDL_RWFromFile(filename, mode: PChar): PSDL_RWops; cdecl; external SDLLibName;
function SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: LongInt): LongInt; cdecl; external SDLLibName;
-{$IFDEF SDL2}
function SDL_CreateWindow(title: PChar; x,y,w,h: LongInt; flags: LongWord): PSDL_Window; cdecl; external SDLLibName;
+procedure SDL_SetWindowIcon(window: PSDL_Window; icon: PSDL_Surface); cdecl; external SDLLibName;
+
function SDL_CreateRenderer(window: PSDL_Window; index: LongInt; flags: LongWord): PSDL_Renderer; cdecl; external SDLLibName;
function SDL_DestroyWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName;
function SDL_DestroyRenderer(renderer: PSDL_Renderer): LongInt; cdecl; external SDLLibName;
+procedure SDL_SetWindowPosition(window: PSDL_Window; w, h: LongInt); cdecl; external SDLLibName;
procedure SDL_SetWindowSize(window: PSDL_Window; w, h: LongInt); cdecl; external SDLLibName;
+procedure SDL_SetWindowFullscreen(window: PSDL_Window; flags: LongWord); cdecl; external SDLLibName;
function SDL_GetCurrentVideoDriver:Pchar; cdecl; external SDLLibName;
function SDL_GL_CreateContext(window: PSDL_Window): PSDL_GLContext; cdecl; external SDLLibName;
procedure SDL_GL_DeleteContext(context: PSDL_GLContext); cdecl; external SDLLibName;
-function SDL_GL_SwapWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName;
+procedure SDL_GL_SwapWindow(window: PSDL_Window); cdecl; external SDLLibName;
function SDL_GL_SetSwapInterval(interval: LongInt): LongInt; cdecl; external SDLLibName;
procedure SDL_VideoQuit; cdecl; external SDLLibName;
@@ -1009,25 +1105,19 @@
procedure SDL_WarpMouseInWindow(window: PSDL_Window; x, y: LongInt); cdecl; external SDLLibName;
function SDL_SetHint(name, value: PChar): Boolean; cdecl; external SDLLibName;
procedure SDL_StartTextInput; cdecl; external SDLLibName;
+procedure SDL_StopTextInput; cdecl; external SDLLibName;
function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: TSDL_eventaction; minType, maxType: LongWord): LongInt; cdecl; external SDLLibName;
function SDL_AllocFormat(format: LongWord): PSDL_PixelFormat; cdecl; external SDLLibName;
procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat); cdecl; external SDLLibName;
-{$ELSE}
-function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: TSDL_eventaction; mask: LongWord): LongInt; cdecl; external SDLLibName;
-
-function SDL_EnableUNICODE(enable: LongInt): LongInt; cdecl; external SDLLibName;
-function SDL_EnableKeyRepeat(timedelay, interval: LongInt): LongInt; cdecl; external SDLLibName;
-function SDL_VideoDriverName(namebuf: PChar; maxlen: LongInt): PChar; cdecl; external SDLLibName;
-{$ENDIF}
function SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName;
-function SDL_GetKeyName(key: LongWord): PChar; cdecl; external SDLLibName;
-function SDL_GetScancodeName(key: LongWord): PChar; cdecl; external SDLLibName;
-function SDL_GetKeyFromScancode(key: LongWord): LongInt; cdecl; external SDLLibName;
-
+function SDL_GetKeyName(key: TSDL_Keycode): PChar; cdecl; external SDLLibName;
+function SDL_GetScancodeName(key: TSDL_Scancode): PChar; cdecl; external SDLLibName;
+function SDL_GetKeyFromScancode(key: TSDL_Scancode): TSDL_Keycode; cdecl; external SDLLibName;
+// SDL2 functions has some additional functions (not listed here) for keycode/scancode translation
procedure SDL_PumpEvents; cdecl; external SDLLibName;
function SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;
@@ -1035,8 +1125,9 @@
procedure SDL_SetEventFilter(filter: TSDL_EventFilter); cdecl; external SDLLibName;
function SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName;
-procedure SDL_WarpMouse(x, y: Word); {$IFDEF SDL2}inline{$ELSE}cdecl; external SDLLibName{$ENDIF};
-function SDL_GetKeyState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName {$IFDEF SDL2} name 'SDL_GetKeyboardState'{$ENDIF};
+procedure SDL_WarpMouse(x, y: Word); inline;
+
+function SDL_GetKeyboardState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName;
procedure SDL_WM_SetIcon(icon: PSDL_Surface; mask : Byte); cdecl; external SDLLibName;
procedure SDL_WM_SetCaption(title: PChar; icon: PChar); cdecl; external SDLLibName;
@@ -1045,14 +1136,20 @@
(* remember to mark the threaded functions as 'cdecl; export;'
(or have fun debugging nil arguments) *)
-function SDL_CreateThread(fn: Pointer; {$IFDEF SDL2}name: PChar;{$ENDIF} data: Pointer): PSDL_Thread; cdecl; external SDLLibName;
+{$IFDEF WIN32}
+// SDL uses wrapper in windows
+function SDL_CreateThread(fn: Pointer; name: PChar; data: Pointer; bt: pfnSDL_CurrentBeginThread; et: pfnSDL_CurrentEndThread): PSDL_Thread; cdecl; external SDLLibName;
+function SDL_CreateThread(fn: Pointer; name: PChar; data: Pointer): PSDL_Thread; cdecl; overload;
+{$ELSE}
+function SDL_CreateThread(fn: Pointer; name: PChar; data: Pointer): PSDL_Thread; cdecl; external SDLLibName;
+{$ENDIF}
procedure SDL_WaitThread(thread: PSDL_Thread; status: PLongInt); cdecl; external SDLLibName;
procedure SDL_KillThread(thread: PSDL_Thread); cdecl; external SDLLibName;
function SDL_CreateMutex: PSDL_mutex; cdecl; external SDLLibName;
procedure SDL_DestroyMutex(mutex: PSDL_mutex); cdecl; external SDLLibName;
-function SDL_LockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName {$IFNDEF SDL2}name 'SDL_mutexP'{$ENDIF};
-function SDL_UnlockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName {$IFNDEF SDL2}name 'SDL_mutexV'{$ENDIF};
+function SDL_LockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName;
+function SDL_UnlockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName;
function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: LongInt): LongInt; cdecl; external SDLLibName;
procedure SDL_GL_SwapBuffers; cdecl; external SDLLibName;
@@ -1098,8 +1195,8 @@
procedure TTF_CloseFont(font: PTTF_Font); cdecl; external SDL_TTFLibName;
(* SDL_mixer *)
-function Mix_Init(flags: LongInt): LongInt; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName{$ELSE}inline{$ENDIF};
-procedure Mix_Quit; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName{$ELSE}inline{$ENDIF};
+function Mix_Init(flags: LongInt): LongInt; cdecl; external SDL_MixerLibName;
+procedure Mix_Quit; cdecl; external SDL_MixerLibName;
function Mix_OpenAudio(frequency: LongInt; format: Word; channels: LongInt; chunksize: LongInt): LongInt; cdecl; external SDL_MixerLibName;
procedure Mix_CloseAudio; cdecl; external SDL_MixerLibName;
@@ -1134,8 +1231,8 @@
procedure Mix_SetPostMix( mix_func: TPostMix; arg: Pointer); cdecl; external SDL_MixerLibName;
(* SDL_image *)
-function IMG_Init(flags: LongInt): LongInt; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName{$ELSE}inline{$ENDIF};
-procedure IMG_Quit; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName{$ELSE}inline{$ENDIF};
+function IMG_Init(flags: LongInt): LongInt; cdecl; external SDL_ImageLibName;
+procedure IMG_Quit; cdecl; external SDL_ImageLibName;
function IMG_Load(const _file: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName;
function IMG_Load_RW(rwop: PSDL_RWops; freesrc: LongBool): PSDL_Surface; cdecl; external SDL_ImageLibName;
@@ -1157,6 +1254,12 @@
function SDLNet_AddSocket(_set: PSDLNet_SocketSet; sock: PTCPSocket): LongInt; cdecl; external SDL_NetLibName;
function SDLNet_CheckSockets(_set: PSDLNet_SocketSet; timeout: LongInt): LongInt; cdecl; external SDL_NetLibName;
+// SDL 2 clipboard functions
+function SDL_HasClipboardText(): Boolean; cdecl; external SDLLibName;
+// returns nil if memory for clipboard contents copy couldn't be allocated
+function SDL_GetClipboardText(): PChar; cdecl; external SDLLibName;
+// returns 0 on success or negative error number on failure
+function SDL_SetClipboardText(const text: PChar): LongInt; cdecl; external SDLLibName;
procedure SDLNet_Write16(value: Word; buf: Pointer);
procedure SDLNet_Write32(value: LongWord; buf: Pointer);
@@ -1164,7 +1267,6 @@
function SDLNet_Read32(buf: Pointer): LongWord;
implementation
-{$IFDEF SDL2}
uses uStore;
// for sdl1.2 we directly call SDL_WarpMouse()
@@ -1175,40 +1277,13 @@
begin
WarpMouse(x, y);
end;
-{$ENDIF}
function SDL_MustLock(Surface: PSDL_Surface): Boolean;
begin
SDL_MustLock:=
-{$IFDEF SDL2}
((surface^.flags and SDL_RLEACCEL) <> 0)
-{$ELSE}
- ( surface^.offset <> 0 ) or (( surface^.flags and (SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL)) <> 0)
-{$ENDIF}
-end;
-
-{$IFNDEF SDL_MIXER_NEWER}
-function Mix_Init(flags: LongInt): LongInt; inline;
-begin
- Mix_Init:= flags;
end;
-procedure Mix_Quit; inline;
-begin
-end;
-{$ENDIF}
-
-{$IFNDEF SDL_IMAGE_NEWER}
-function IMG_Init(flags: LongInt): LongInt; inline;
-begin
- IMG_Init:= flags;
-end;
-
-procedure IMG_Quit; inline;
-begin
-end;
-{$ENDIF}
-
procedure SDLNet_Write16(value: Word; buf: Pointer);
begin
PByteArray(buf)^[1]:= value;
@@ -1237,5 +1312,12 @@
(PByteArray(buf)^[0] shl 24)
end;
+{$IFDEF WIN32}
+function SDL_CreateThread(fn: Pointer; name: PChar; data: Pointer): PSDL_Thread; cdecl;
+begin
+ SDL_CreateThread:= SDL_CreateThread(fn, name, data, nil, nil)
+end;
+{$ENDIF}
+
end.
--- a/hedgewars/avwrapper/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/avwrapper/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -1,9 +1,5 @@
#libraries have already been searched in main CMakeLists.txt
-# TODO: this check is only for SDL < 2
-# fpc will take care of linking but we need to have this library installed
-find_package(GLUT REQUIRED)
-
include_directories(${LIBAV_INCLUDE_DIR})
add_library(avwrapper avwrapper.c)
--- a/hedgewars/avwrapper/avwrapper.c Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/avwrapper/avwrapper.c Fri Apr 01 15:36:19 2016 +0200
@@ -21,13 +21,12 @@
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
+
+#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,65 @@
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 < 55
+#define avcodec_default_get_buffer2(x, y ,z) avcodec_default_get_buffer(x, y)
+#endif
+
+#if LIBAVCODEC_VERSION_MAJOR < 56
+#if LIBAVCODEC_VERSION_MAJOR < 55
+#define av_frame_free av_freep
+#else
+#define av_frame_free avcodec_free_frame
+#endif
+
+#define av_frame_alloc avcodec_alloc_frame
+#define av_frame_unref avcodec_get_frame_defaults
+#define av_packet_rescale_ts rescale_ts
+
+static void rescale_ts(AVPacket *pkt, AVRational ctb, AVRational stb)
+{
+ if (pkt->pts != AV_NOPTS_VALUE)
+ pkt->pts = av_rescale_q(pkt->pts, ctb, stb);
+ if (pkt->dts != AV_NOPTS_VALUE)
+ pkt->dts = av_rescale_q(pkt->dts, ctb, stb);
+ if (pkt->duration > 0)
+ pkt->duration = av_rescale_q(pkt->duration, ctb, stb);
+}
+#endif
+
+#ifndef AV_CODEC_CAP_DELAY
+#define AV_CODEC_CAP_DELAY CODEC_CAP_DELAY
+#endif
+#ifndef AV_CODEC_CAP_VARIABLE_FRAME_SIZE
+#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE CODEC_CAP_VARIABLE_FRAME_SIZE
+#endif
+#ifndef AV_CODEC_FLAG_GLOBAL_HEADER
+#define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER
+#endif
+#ifndef AV_CODEC_FLAG_QSCALE
+#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 +158,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");
@@ -127,30 +176,30 @@
g_pAudio->sample_rate = g_Frequency;
g_pAudio->channels = g_Channels;
+ // set time base as invers of sample rate
+ g_pAudio->time_base.den = g_pAStream->time_base.den = g_Frequency;
+ g_pAudio->time_base.num = g_pAStream->time_base.num = 1;
+
// set quality
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 +207,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,8 +221,10 @@
if (!g_pAStream)
return 0;
- AVPacket Packet = { 0 };
+ AVPacket Packet;
av_init_packet(&Packet);
+ Packet.data = NULL;
+ Packet.size = 0;
int NumSamples = fread(g_pSamples, 2*g_Channels, g_NumSamples, g_pSoundFile);
@@ -192,6 +243,8 @@
return FatalError("avcodec_encode_audio2 failed");
if (!got_packet)
return 0;
+
+ av_packet_rescale_ts(&Packet, g_pAudio->time_base, g_pAStream->time_base);
#else
if (NumSamples == 0)
return 0;
@@ -217,11 +270,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");
@@ -238,23 +287,23 @@
of which frame timestamps are represented. for fixed-fps content,
timebase should be 1/framerate and timestamp increments should be
identically 1. */
- 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->time_base.den = g_pVStream->time_base.den = g_Framerate.num;
+ g_pVideo->time_base.num = g_pVStream->time_base.num = g_Framerate.den;
+
+ 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,26 +337,19 @@
#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");
+ av_frame_unref(g_pVFrame);
- g_pVFrame->linesize[0] = g_Width;
- g_pVFrame->linesize[1] = g_Width/2;
- g_pVFrame->linesize[2] = g_Width/2;
- g_pVFrame->linesize[3] = 0;
- return 0;
+ g_pVFrame->width = g_Width;
+ g_pVFrame->height = g_Height;
+ g_pVFrame->format = AV_PIX_FMT_YUV420P;
+
+ return avcodec_default_get_buffer2(g_pVideo, g_pVFrame, 0);
}
static int WriteFrame(AVFrame* pFrame)
@@ -317,10 +359,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);
@@ -337,6 +379,7 @@
Packet.size = 0;
g_pVFrame->pts++;
+#if LIBAVCODEC_VERSION_MAJOR < 58
if (g_pFormat->flags & AVFMT_RAWPICTURE)
{
/* raw video case. The API will change slightly in the near
@@ -351,6 +394,7 @@
return 0;
}
else
+#endif
{
#if LIBAVCODEC_VERSION_MAJOR >= 54
int got_packet;
@@ -359,10 +403,7 @@
if (!got_packet)
return 0;
- if (Packet.pts != AV_NOPTS_VALUE)
- Packet.pts = av_rescale_q(Packet.pts, g_pVideo->time_base, g_pVStream->time_base);
- if (Packet.dts != AV_NOPTS_VALUE)
- Packet.dts = av_rescale_q(Packet.dts, g_pVideo->time_base, g_pVStream->time_base);
+ av_packet_rescale_ts(&Packet, g_pVideo->time_base, g_pVStream->time_base);
#else
Packet.size = avcodec_encode_video(g_pVideo, g_OutBuffer, OUTBUFFER_SIZE, pFrame);
if (Packet.size < 0)
@@ -385,11 +426,47 @@
}
}
-AVWRAP_DECL int AVWrapper_WriteFrame(uint8_t* pY, uint8_t* pCb, uint8_t* pCr)
+AVWRAP_DECL int AVWrapper_WriteFrame(uint8_t *buf)
{
- g_pVFrame->data[0] = pY;
- g_pVFrame->data[1] = pCb;
- g_pVFrame->data[2] = pCr;
+ int x, y, stride = g_Width * 4;
+ uint8_t *data[3];
+
+ // copy pointers, prepare source
+ memcpy(data, g_pVFrame->data, sizeof(data));
+ buf += (g_Height - 1) * stride;
+
+ // convert to YUV 4:2:0
+ for (y = 0; y < g_Height; y++) {
+ for (x = 0; x < g_Width; x++) {
+ int r = buf[x * 4 + 0];
+ int g = buf[x * 4 + 1];
+ int b = buf[x * 4 + 2];
+
+ int luma = (int)(0.299f * r + 0.587f * g + 0.114f * b);
+ data[0][x] = av_clip_uint8(luma);
+
+ if (!(x & 1) && !(y & 1)) {
+ int r = (buf[x * 4 + 0] + buf[(x + 1) * 4 + 0] +
+ buf[x * 4 + 0 + stride] + buf[(x + 1) * 4 + 0 + stride]) / 4;
+ int g = (buf[x * 4 + 1] + buf[(x + 1) * 4 + 1] +
+ buf[x * 4 + 1 + stride] + buf[(x + 1) * 4 + 1 + stride]) / 4;
+ int b = (buf[x * 4 + 2] + buf[(x + 1) * 4 + 2] +
+ buf[x * 4 + 2 + stride] + buf[(x + 1) * 4 + 2 + stride]) / 4;
+
+ int cr = (int)(-0.14713f * r - 0.28886f * g + 0.436f * b);
+ int cb = (int)( 0.615f * r - 0.51499f * g - 0.10001f * b);
+ data[1][x / 2] = av_clip_uint8(128 + cr);
+ data[2][x / 2] = av_clip_uint8(128 + cb);
+ }
+ }
+ buf += -stride;
+ data[0] += g_pVFrame->linesize[0];
+ if (y & 1) {
+ data[1] += g_pVFrame->linesize[1];
+ data[2] += g_pVFrame->linesize[2];
+ }
+ }
+
return WriteFrame(g_pVFrame);
}
@@ -485,22 +562,21 @@
return FatalError("Could not open output file (%s)", g_pContainer->filename);
}
- // write the stream header, if any
- avformat_write_header(g_pContainer, NULL);
+ g_pVFrame->pts = -1;
- g_pVFrame->pts = -1;
- return 0;
+ // write the stream header, if any
+ return avformat_write_header(g_pContainer, NULL);
}
AVWRAP_DECL int AVWrapper_Close()
{
int ret;
// output buffered frames
- if (g_pVCodec->capabilities & CODEC_CAP_DELAY)
+ if (g_pVCodec->capabilities & AV_CODEC_CAP_DELAY)
{
do
ret = WriteFrame(NULL);
- while (ret >= 0);
+ while (ret > 0);
if (ret < 0)
return ret;
}
@@ -509,7 +585,7 @@
{
ret = WriteAudioFrame();
}
- while(ret >= 0);
+ while(ret > 0);
if (ret < 0)
return ret;
@@ -526,14 +602,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);
}
--- a/hedgewars/hwengine.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/hwengine.pas Fri Apr 01 15:36:19 2016 +0200
@@ -29,7 +29,7 @@
program hwengine;
{$ENDIF}
-uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler
+uses {$IFDEF IPHONEOS}cmem, {$ENDIF} SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler
, uSound, uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uAILandMarks, uLandTexture, uCollisions
, SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted
, uPhysFSLayer, uCursor, uRandom, ArgParsers, uVisualGearsHandlers, uTextures, uRender
@@ -80,9 +80,10 @@
AddClouds;
AddFlakes;
SetRandomSeed(cSeed, false);
+ StoreLoad(false);
+ if not allOK then exit;
AssignHHCoords;
AddMiscGears;
- StoreLoad(false);
InitWorld;
ResetKbd;
if GameType = gmtSave then
@@ -99,6 +100,9 @@
end;
gsConfirm, gsGame, gsChat:
begin
+ // disable screenshot flash effect when about to make another screenshot
+ if flagMakeCapture and (ScreenFade = sfFromWhite) then
+ ScreenFade:= sfNone;
if not cOnlyStats then
// never place between ProcessKbd and DoGameTick - bugs due to /put cmd and isCursorVisible
DrawWorld(Lag);
@@ -137,7 +141,7 @@
ScreenFade:= sfFromWhite;
ScreenFadeValue:= sfMax;
ScreenFadeSpeed:= 5;
-
+
if (not flagDumpLand and MakeScreenshot(s, 1, 0)) or
(flagDumpLand and MakeScreenshot(s, 1, 1) and ((cReducedQuality and rqBlurryLand <> 0) or MakeScreenshot(s, 1, 2))) then
WriteLnToConsole('Screenshot saved: ' + s)
@@ -154,27 +158,24 @@
var event: TSDL_Event;
PrevTime, CurrTime: LongWord;
isTerminated: boolean;
-{$IFDEF SDL2}
previousGameState: TGameState;
-{$ELSE}
- prevFocusState: boolean;
-{$ENDIF}
+ wheelEvent: boolean;
begin
isTerminated:= false;
PrevTime:= SDL_GetTicks;
- while isTerminated = false do
+ while (not isTerminated) and allOK do
begin
+ wheelEvent:= false;
SDL_PumpEvents();
- while SDL_PeepEvents(@event, 1, SDL_GETEVENT, {$IFDEF SDL2}SDL_FIRSTEVENT, SDL_LASTEVENT{$ELSE}SDL_ALLEVENTS{$ENDIF}) > 0 do
+ while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 do
begin
case event.type_ of
-{$IFDEF SDL2}
SDL_KEYDOWN:
if GameState = gsChat then
begin
// sdl on iphone supports only ashii keyboards and the unicode field is deprecated in sdl 1.3
- KeyPressChat(SDL_GetKeyFromScancode(event.key.keysym.sym), event.key.keysym.sym, event.key.keysym.modifier);
+ KeyPressChat(event.key.keysym);
end
else
if GameState >= gsGame then ProcessKey(event.key);
@@ -182,31 +183,43 @@
if (GameState <> gsChat) and (GameState >= gsGame) then
ProcessKey(event.key);
+ SDL_TEXTINPUT: if GameState = gsChat then uChat.TextInput(event.text);
+
SDL_WINDOWEVENT:
- if event.window.event = SDL_WINDOWEVENT_SHOWN then
- begin
- cHasFocus:= true;
- onFocusStateChanged()
- end
- else if event.window.event = SDL_WINDOWEVENT_MINIMIZED then
- begin
- previousGameState:= GameState;
- GameState:= gsSuspend;
- end
- else if event.window.event = SDL_WINDOWEVENT_RESTORED then
begin
- GameState:= previousGameState;
+ case event.window.event of
+ SDL_WINDOWEVENT_FOCUS_GAINED:
+ begin
+ cHasFocus:= true;
+ onFocusStateChanged();
+ end;
+ SDL_WINDOWEVENT_FOCUS_LOST:
+ begin
+ cHasFocus:= false;
+ onFocusStateChanged();
+ end;
+ SDL_WINDOWEVENT_MINIMIZED:
+ begin
+ previousGameState:= GameState;
+ GameState:= gsSuspend;
+ end;
+ SDL_WINDOWEVENT_RESTORED:
+ begin
+ GameState:= previousGameState;
{$IFDEF ANDROID}
- //This call is used to reinitialize the glcontext and reload the textures
- ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
+ //This call is used to reinitialize the glcontext and reload the textures
+ ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
{$ENDIF}
- end
- else if event.window.event = SDL_WINDOWEVENT_RESIZED then
- begin
- cNewScreenWidth:= max(2 * (event.window.data1 div 2), cMinScreenWidth);
- cNewScreenHeight:= max(2 * (event.window.data2 div 2), cMinScreenHeight);
- cScreenResizeDelay:= RealTicks + 500{$IFDEF IPHONEOS}div 2{$ENDIF};
+ end;
+ SDL_WINDOWEVENT_RESIZED:
+ begin
+ cNewScreenWidth:= max(2 * (event.window.data1 div 2), cMinScreenWidth);
+ cNewScreenHeight:= max(2 * (event.window.data2 div 2), cMinScreenHeight);
+ cScreenResizeDelay:= RealTicks + 500{$IFDEF IPHONEOS}div 2{$ENDIF};
+ end;
+ end; // case closed
end;
+
{$IFDEF USE_TOUCH_INTERFACE}
SDL_FINGERMOTION:
onTouchMotion(event.tfinger.x, event.tfinger.y, event.tfinger.dx, event.tfinger.dy, event.tfinger.fingerId);
@@ -216,17 +229,7 @@
SDL_FINGERUP:
onTouchUp(event.tfinger.x, event.tfinger.y, event.tfinger.fingerId);
-{$ENDIF}
{$ELSE}
- SDL_KEYDOWN:
- if GameState = gsChat then
- KeyPressChat(event.key.keysym.unicode, event.key.keysym.sym, event.key.keysym.modifier)
- else
- if GameState >= gsGame then ProcessKey(event.key);
- SDL_KEYUP:
- if (GameState <> gsChat) and (GameState >= gsGame) then
- ProcessKey(event.key);
-
SDL_MOUSEBUTTONDOWN:
if GameState = gsConfirm then
ParseCommand('quit', true)
@@ -236,26 +239,13 @@
SDL_MOUSEBUTTONUP:
if (GameState >= gsGame) then ProcessMouse(event.button, false);
- SDL_ACTIVEEVENT:
- if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then
+ SDL_MOUSEWHEEL:
begin
- prevFocusState:= cHasFocus;
- cHasFocus:= event.active.gain = 1;
- if prevFocusState xor cHasFocus then
- onFocusStateChanged()
+ wheelEvent:= true;
+ ProcessMouseWheel(event.wheel.x, event.wheel.y);
end;
+{$ENDIF}
- SDL_VIDEORESIZE:
- begin
- // using lower values than cMinScreenWidth or cMinScreenHeight causes widget overlap and off-screen widget parts
- // Change by sheepluva:
- // Let's only use even numbers for custom width/height since I ran into scaling issues with odd width values.
- // Maybe just fixes the symptom not the actual cause(?), I'm too tired to find out :P
- cNewScreenWidth:= max(2 * (event.resize.w div 2), cMinScreenWidth);
- cNewScreenHeight:= max(2 * (event.resize.h div 2), cMinScreenHeight);
- cScreenResizeDelay:= RealTicks+500;
- end;
-{$ENDIF}
SDL_JOYAXISMOTION:
ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value);
SDL_JOYHATMOTION:
@@ -269,6 +259,9 @@
end; //end case event.type_ of
end; //end while SDL_PollEvent(@event) <> 0 do
+ if (not wheelEvent) then
+ ResetMouseWheel();
+
if (CursorMovementX <> 0) or (CursorMovementY <> 0) then
handlePositionUpdate(CursorMovementX * cameraKeyboardSpeed, CursorMovementY * cameraKeyboardSpeed);
@@ -336,12 +329,11 @@
{$ENDIF}
///////////////////////////////////////////////////////////////////////////////
-procedure Game;
+procedure GameRoutine;
//var p: TPathType;
var s: shortstring;
i: LongInt;
begin
- initEverything(true);
WriteLnToConsole('Hedgewars engine ' + cVersionString + '-r' + cRevisionString +
' (' + cHashString + ') with protocol #' + inttostr(cNetProtoVersion));
AddFileLog('Prefix: "' + shortstring(PathPrefix) +'"');
@@ -351,23 +343,20 @@
AddFileLog(inttostr(i) + ': ' + ParamStr(i));
WriteToConsole('Init SDL... ');
- if not cOnlyStats then SDLTry(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, true);
+ if not cOnlyStats then SDLCheck(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, 'SDL_Init', true);
WriteLnToConsole(msgOK);
-
-{$IFDEF SDL2}
- SDL_StartTextInput();
-{$ELSE}
- SDL_EnableUNICODE(1);
-{$ENDIF}
- SDL_ShowCursor(0);
-
if not cOnlyStats then
begin
WriteToConsole('Init SDL_ttf... ');
- SDLTry(TTF_Init() <> -1, true);
+ SDLCheck(TTF_Init() <> -1, 'TTF_Init', true);
WriteLnToConsole(msgOK);
end;
+ if not allOK then exit;
+ //SDL_StartTextInput();
+ SDL_ShowCursor(0);
+
+
{$IFDEF USE_VIDEO_RECORDING}
if GameType = gmtRecord then
InitOffscreenOpenGL()
@@ -384,6 +373,7 @@
ControllerInit(); // has to happen before InitKbdKeyTable to map keys
InitKbdKeyTable();
AddProgress();
+ if not allOK then exit;
LoadLocale(cPathz[ptLocale] + '/en.txt'); // Do an initial load with english
if cLocaleFName <> 'en.txt' then
@@ -397,6 +387,7 @@
end
else cLocale := 'en';
+ if not allOK then exit;
WriteLnToConsole(msgGettingConfig);
if cTestLua then
@@ -414,6 +405,7 @@
LoadRecordFromFile(recordFileName);
end;
+ if not allOK then exit;
ScriptOnGameInit;
s:= 'eproto ' + inttostr(cNetProtoVersion);
SendIPCRaw(@s[0], Length(s) + 1); // send proto version
@@ -427,8 +419,9 @@
InitSound();
isDeveloperMode:= false;
- TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true);
+ if checkFails(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true) then exit;
//ParseCommand('rotmask', true);
+ if not allOK then exit;
{$IFDEF USE_VIDEO_RECORDING}
if GameType = gmtRecord then
@@ -440,16 +433,22 @@
{$ENDIF}
MainLoop;
+end;
+
+procedure Game;
+begin
+ initEverything(true);
+ GameRoutine;
// clean up all the memory allocated
freeEverything(true);
end;
-
///////////////////////////////////////////////////////////////////////////////
// preInitEverything - init variables that are going to be ovewritten by arguments
// initEverything - init variables only. Should be coupled by below
// freeEverything - free above. Pay attention to the init/free order!
procedure preInitEverything;
begin
+ allOK:= true;
Randomize();
uVariables.preInitModule;
@@ -466,7 +465,13 @@
uLand.initModule; // computes land
uLandPainted.initModule; // computes drawn land
uIO.initModule; // sets up sockets
- uPhysFSLayer.initModule;
+
+ PathPrefix:= PathPrefix + #0;
+ UserPathPrefix:= UserPathPrefix + #0;
+ uPhysFSLayer.initModule(@PathPrefix[1], @UserPathPrefix[1]);
+ PathPrefix:= copy(PathPrefix, 1, length(PathPrefix) - 1);
+ UserPathPrefix:= copy(UserPathPrefix, 1, length(UserPathPrefix) - 1);
+
uScript.initModule;
if complete then
@@ -541,20 +546,32 @@
///////////////////////////////////////////////////////////////////////////////
procedure GenLandPreview;
+{$IFDEF MOBILE}
+var Preview: TPreview;
+{$ELSE}
var Preview: TPreviewAlpha;
+{$ENDIF}
begin
initEverything(false);
InitIPC;
- IPCWaitPongEvent;
- TryDo(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true);
+ if allOK then
+ begin
+ IPCWaitPongEvent;
+ if checkFails(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true) then exit;
- ScriptOnPreviewInit;
- GenPreviewAlpha(Preview);
- WriteLnToConsole('Sending preview...');
- SendIPCRaw(@Preview, sizeof(Preview));
- SendIPCRaw(@MaxHedgehogs, sizeof(byte));
- WriteLnToConsole('Preview sent, disconnect');
+ ScriptOnPreviewInit;
+ {$IFDEF MOBILE}
+ GenPreview(Preview);
+ {$ELSE}
+ GenPreviewAlpha(Preview);
+ {$ENDIF}
+ WriteLnToConsole('Sending preview...');
+ SendIPCRaw(@Preview, sizeof(Preview));
+ SendIPCRaw(@MaxHedgehogs, sizeof(byte));
+ WriteLnToConsole('Preview sent, disconnect');
+ end;
+
freeEverything(false);
end;
@@ -602,9 +619,13 @@
end;
{$IFDEF PAS2C}
- exit(HaltNoError);
+ exit(HaltNoError);
{$ELSE}
- halt(HaltNoError);
+ {$IFDEF IPHONEOS}
+ exit;
+ {$ELSE}
+ halt(HaltNoError);
+ {$ENDIF}
{$ENDIF}
{$IFDEF HWLIBRARY}
end;
--- a/hedgewars/options.inc Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/options.inc Fri Apr 01 15:36:19 2016 +0200
@@ -60,10 +60,6 @@
{$ENDIF}
{$ENDIF}
-{$IFDEF USE_TOUCH_INTERFACE}
- {$DEFINE SDL2}
-{$ENDIF}
-
{$DEFINE _S:=}
{$DEFINE _P:=}
--- a/hedgewars/sdlmain/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-find_package(SDL REQUIRED)
-
-include_directories(${SDL_INCLUDE_DIR})
-
-add_library (SDLmain STATIC SDLMain.m)
-
-
--- a/hedgewars/sdlmain/SDLMain.h Fri Sep 11 04:05:09 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/* SDLMain.m - main entry point for our Cocoa-ized SDL app
- Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
- Non-NIB-Code & other changes: Max Horn <max@quendi.de>
-
- Feel free to customize this file to suit your needs
-*/
-
-#ifndef _SDLMain_h_
-#define _SDLMain_h_
-
-#import <Cocoa/Cocoa.h>
-
-@interface SDLMain : NSObject
-@end
-
-#endif /* _SDLMain_h_ */
--- a/hedgewars/sdlmain/SDLMain.m Fri Sep 11 04:05:09 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-/* SDLMain.m - main entry point for our Cocoa-ized SDL app
- Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
- Non-NIB-Code & other changes: Max Horn <max@quendi.de>
-
- Feel free to customize this file to suit your needs
-*/
-
-#include "SDL.h"
-#include "SDLMain.h"
-#include <sys/param.h> /* for MAXPATHLEN */
-#include <unistd.h>
-
-/* For some reaon, Apple removed setAppleMenu from the headers in 10.4,
- but the method still is there and works. To avoid warnings, we declare
- it ourselves here. */
-@interface NSApplication(SDL_Missing_Methods)
-- (void)setAppleMenu:(NSMenu *)menu;
-@end
-
-/* Use this flag to determine whether we use SDLMain.nib or not */
-#define SDL_USE_NIB_FILE 0
-
-/* Use this flag to determine whether we use CPS (docking) or not */
-#define SDL_USE_CPS 1
-#ifdef SDL_USE_CPS
-/* Portions of CPS.h */
-typedef struct CPSProcessSerNum
-{
- UInt32 lo;
- UInt32 hi;
-} CPSProcessSerNum;
-
-extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn);
-extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5);
-extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn);
-
-#endif /* SDL_USE_CPS */
-
-static int gArgc;
-static char **gArgv;
-static BOOL gFinderLaunch;
-static BOOL gCalledAppMainline = FALSE;
-
-static NSString *getApplicationName(void)
-{
- const NSDictionary *dict;
- NSString *appName = 0;
-
- /* Determine the application name */
- dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
- if (dict)
- appName = [dict objectForKey: @"CFBundleName"];
-
- if (![appName length])
- appName = [[NSProcessInfo processInfo] processName];
-
- return appName;
-}
-
-#if SDL_USE_NIB_FILE
-/* A helper category for NSString */
-@interface NSString (ReplaceSubString)
-- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString;
-@end
-#endif
-
-@interface SDLApplication : NSApplication
-@end
-
-@implementation SDLApplication
-/* Invoked from the Quit menu item */
-- (void)terminate:(id)sender
-{
- /* Post a SDL_QUIT event */
- SDL_Event event;
- event.type = SDL_QUIT;
- SDL_PushEvent(&event);
-}
-@end
-
-/* The main class of the application, the application's delegate */
-@implementation SDLMain
-
-/* Set the working directory to the .app's parent directory */
-- (void) setupWorkingDirectory:(BOOL)shouldChdir
-{
- if (shouldChdir)
- {
- char parentdir[MAXPATHLEN];
- CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
- CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
- if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) {
- chdir(parentdir); /* chdir to the binary app's parent */
- }
- CFRelease(url);
- CFRelease(url2);
- }
-}
-
-#if SDL_USE_NIB_FILE
-
-/* Fix menu to contain the real app name instead of "SDL App" */
-- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName
-{
- NSRange aRange;
- NSEnumerator *enumerator;
- NSMenuItem *menuItem;
-
- aRange = [[aMenu title] rangeOfString:@"SDL App"];
- if (aRange.length != 0)
- [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]];
-
- enumerator = [[aMenu itemArray] objectEnumerator];
- while ((menuItem = [enumerator nextObject]))
- {
- aRange = [[menuItem title] rangeOfString:@"SDL App"];
- if (aRange.length != 0)
- [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]];
- if ([menuItem hasSubmenu])
- [self fixMenu:[menuItem submenu] withAppName:appName];
- }
- [ aMenu sizeToFit ];
-}
-
-#else
-
-static void setApplicationMenu(void)
-{
- /* warning: this code is very odd */
- NSMenu *appleMenu;
- NSMenuItem *menuItem;
- NSString *title;
- NSString *appName;
-
- appName = getApplicationName();
- appleMenu = [[NSMenu alloc] initWithTitle:@""];
-
- /* Add menu items */
- title = [@"About " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
-
- [appleMenu addItem:[NSMenuItem separatorItem]];
-
- title = [@"Hide " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
-
- menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
- [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
-
- [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
-
- [appleMenu addItem:[NSMenuItem separatorItem]];
-
- title = [@"Quit " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
-
-
- /* Put menu into the menubar */
- menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
- [menuItem setSubmenu:appleMenu];
- [[NSApp mainMenu] addItem:menuItem];
-
- /* Tell the application object that this is now the application menu */
- [NSApp setAppleMenu:appleMenu];
-
- /* Finally give up our references to the objects */
- [appleMenu release];
- [menuItem release];
-}
-
-/* Create a window menu */
-static void setupWindowMenu(void)
-{
- NSMenu *windowMenu;
- NSMenuItem *windowMenuItem;
- NSMenuItem *menuItem;
-
- windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
-
- /* "Minimize" item */
- menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
- [windowMenu addItem:menuItem];
- [menuItem release];
-
- /* Put menu into the menubar */
- windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
- [windowMenuItem setSubmenu:windowMenu];
- [[NSApp mainMenu] addItem:windowMenuItem];
-
- /* Tell the application object that this is now the window menu */
- [NSApp setWindowsMenu:windowMenu];
-
- /* Finally give up our references to the objects */
- [windowMenu release];
- [windowMenuItem release];
-}
-
-/* Replacement for NSApplicationMain */
-static void CustomApplicationMain (int argc, char **argv)
-{
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- SDLMain *sdlMain;
-
- /* Ensure the application object is initialised */
- [SDLApplication sharedApplication];
-
-#ifdef SDL_USE_CPS
- {
- CPSProcessSerNum PSN;
- /* Tell the dock about us */
- if (!CPSGetCurrentProcess(&PSN))
- if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103))
- if (!CPSSetFrontProcess(&PSN))
- [SDLApplication sharedApplication];
- }
-#endif /* SDL_USE_CPS */
-
- /* Set up the menubar */
- NSMenu *menu = [[NSMenu alloc] init];
- [NSApp setMainMenu:menu];
- setApplicationMenu();
- setupWindowMenu();
- [menu release];
-
- /* Create SDLMain and make it the app delegate */
- sdlMain = [[SDLMain alloc] init];
- [NSApp setDelegate:sdlMain];
-
- /* Start the main event loop */
- [NSApp run];
-
- [sdlMain release];
- [pool release];
-}
-
-#endif
-
-
-/*
- * Catch document open requests...this lets us notice files when the app
- * was launched by double-clicking a document, or when a document was
- * dragged/dropped on the app's icon. You need to have a
- * CFBundleDocumentsType section in your Info.plist to get this message,
- * apparently.
- *
- * Files are added to gArgv, so to the app, they'll look like command line
- * arguments. Previously, apps launched from the finder had nothing but
- * an argv[0].
- *
- * This message may be received multiple times to open several docs on launch.
- *
- * This message is ignored once the app's mainline has been called.
- */
-- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
-{
- const char *temparg;
- size_t arglen;
- char *arg;
- char **newargv;
-
- if (!gFinderLaunch) /* MacOS is passing command line args. */
- return FALSE;
-
- if (gCalledAppMainline) /* app has started, ignore this document. */
- return FALSE;
-
- temparg = [filename UTF8String];
- arglen = SDL_strlen(temparg) + 1;
- arg = (char *) SDL_malloc(arglen);
- if (arg == NULL)
- return FALSE;
-
- newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2));
- if (newargv == NULL)
- {
- SDL_free(arg);
- return FALSE;
- }
- gArgv = newargv;
-
- SDL_strlcpy(arg, temparg, arglen);
- gArgv[gArgc++] = arg;
- gArgv[gArgc] = NULL;
- return TRUE;
-}
-
-
-/* Called when the internal event loop has just started running */
-- (void) applicationDidFinishLaunching: (NSNotification *) note
-{
- int status;
-
- /* Set the working directory to the .app's parent directory */
- [self setupWorkingDirectory:gFinderLaunch];
-
-#if SDL_USE_NIB_FILE
- /* Set the main menu to contain the real app name instead of "SDL App" */
- [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()];
-#endif
-
- /* Hand off to main application code */
- gCalledAppMainline = TRUE;
- status = SDL_main (gArgc, gArgv);
-
- /* We're done, thank you for playing */
- exit(status);
-}
-@end
-
-
-@implementation NSString (ReplaceSubString)
-
-- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString
-{
- unsigned int bufferSize;
- unsigned int selfLen = [self length];
- unsigned int aStringLen = [aString length];
- unichar *buffer;
- NSRange localRange;
- NSString *result;
-
- bufferSize = selfLen + aStringLen - aRange.length;
- buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar));
-
- /* Get first part into buffer */
- localRange.location = 0;
- localRange.length = aRange.location;
- [self getCharacters:buffer range:localRange];
-
- /* Get middle part into buffer */
- localRange.location = 0;
- localRange.length = aStringLen;
- [aString getCharacters:(buffer+aRange.location) range:localRange];
-
- /* Get last part into buffer */
- localRange.location = aRange.location + aRange.length;
- localRange.length = selfLen - localRange.location;
- [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange];
-
- /* Build output string */
- result = [NSString stringWithCharacters:buffer length:bufferSize];
-
- NSDeallocateMemoryPages(buffer, bufferSize);
-
- return result;
-}
-
-@end
-
-
-
-#ifdef main
-# undef main
-#endif
-
-
-/* Main entry point to executable - should *not* be SDL_main! */
-int main (int argc, char **argv)
-{
- /* Copy the arguments into a global variable */
- /* This is passed if we are launched by double-clicking */
- if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) {
- gArgv = (char **) SDL_malloc(sizeof (char *) * 2);
- gArgv[0] = argv[0];
- gArgv[1] = NULL;
- gArgc = 1;
- gFinderLaunch = YES;
- } else {
- int i;
- gArgc = argc;
- gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1));
- for (i = 0; i <= argc; i++)
- gArgv[i] = argv[i];
- gFinderLaunch = NO;
- }
-
-#if SDL_USE_NIB_FILE
- [SDLApplication poseAsClass:[NSApplication class]];
- NSApplicationMain (argc, argv);
-#else
- CustomApplicationMain (argc, argv);
-#endif
- return 0;
-}
-
--- a/hedgewars/uAI.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uAI.pas Fri Apr 01 15:36:19 2016 +0200
@@ -52,10 +52,11 @@
ThinkThread:= nil;
SDL_UnlockMutex(ThreadLock);
- with CurrentHedgehog^ do
- if Gear <> nil then
- if BotLevel <> 0 then
- StopMessages(Gear^.Message);
+ if CurrentHedgehog <> nil then
+ with CurrentHedgehog^ do
+ if Gear <> nil then
+ if BotLevel <> 0 then
+ StopMessages(Gear^.Message);
BestActions.Count:= 0;
BestActions.Pos:= 0
@@ -162,10 +163,21 @@
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0);
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0);
end;
+ if HHHasAmmo(Me^.Hedgehog^, amVampiric) > 0 then
+ begin
+ AddAction(BestActions, aia_Weapon, Longword(amVampiric), 80, 0, 0);
+ AddAction(BestActions, aia_attack, aim_push, 10, 0, 0);
+ AddAction(BestActions, aia_attack, aim_release, 10, 0, 0);
+ end;
end;
AddAction(BestActions, aia_Weapon, Longword(a), 300 + random(400), 0, 0);
+ if (Ammoz[a].Ammo.Propz and ammoprop_NeedTarget) <> 0 then
+ begin
+ AddAction(BestActions, aia_Put, 0, 8, ap.AttackPutX, ap.AttackPutY)
+ end;
+
if (ap.Angle > 0) then
AddAction(BestActions, aia_LookRight, 0, 200, 0, 0)
else if (ap.Angle < 0) then
@@ -189,11 +201,6 @@
end
end;
- if (Ammoz[a].Ammo.Propz and ammoprop_NeedTarget) <> 0 then
- begin
- AddAction(BestActions, aia_Put, 0, 1, ap.AttackPutX, ap.AttackPutY)
- end;
-
if (Ammoz[a].Ammo.Propz and ammoprop_OscAim) <> 0 then
begin
AddAction(BestActions, aia_attack, aim_push, 350 + random(200), 0, 0);
@@ -530,7 +537,7 @@
FillBonuses(((Me^.State and gstAttacked) <> 0) and (not isInMultiShoot));
SDL_LockMutex(ThreadLock);
-ThinkThread:= SDL_CreateThread(@Think{$IFDEF SDL2}, 'think'{$ENDIF}, Me);
+ThinkThread:= SDL_CreateThread(@Think, PChar('think'), Me);
SDL_UnlockMutex(ThreadLock);
end;
@@ -552,7 +559,7 @@
if Gear^.Message <> 0 then
begin
StopMessages(Gear^.Message);
- TryDo((Gear^.Message and gmAllStoppable) = 0, 'Engine bug: AI may break demos playing', true);
+ if checkFails((Gear^.Message and gmAllStoppable) = 0, 'Engine bug: AI may break demos playing', true) then exit;
end;
if Gear^.Message <> 0 then
--- a/hedgewars/uAIAmmoTests.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uAIAmmoTests.pas Fri Apr 01 15:36:19 2016 +0200
@@ -36,6 +36,7 @@
end;
function TestBazooka(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt;
+function TestBee(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt;
function TestSnowball(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt;
function TestGrenade(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt;
function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt;
@@ -68,7 +69,7 @@
(proc: @TestGrenade; flags: 0), // amGrenade
(proc: @TestClusterBomb; flags: 0), // amClusterBomb
(proc: @TestBazooka; flags: 0), // amBazooka
- (proc: nil; flags: 0), // amBee
+ (proc: @TestBee; flags: amtest_Rare), // amBee
(proc: @TestShotgun; flags: 0), // amShotgun
(proc: nil; flags: 0), // amPickHammer
(proc: nil; flags: 0), // amSkip
@@ -176,7 +177,9 @@
value:= RateExplosion(Me, EX, EY, 101, afTrackFall or afErasesLand)
else value:= RateExplosion(Me, EX, EY, 101);
if (value = 0) and (Targ.Kind = gtHedgehog) and (Targ.Score > 0) then
- value:= 1024 - Metric(Targ.Point.X, Targ.Point.Y, EX, EY) div 64;
+ if GameFlags and gfSolidLand = 0 then
+ value := 1024 - Metric(Targ.Point.X, Targ.Point.Y, EX, EY) div 64
+ else value := BadTurn;
if valueResult <= value then
begin
ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random((Level - 1) * 9));
@@ -192,6 +195,113 @@
TestBazooka:= valueResult
end;
+function calcBeeFlight(Me: PGear; x, y, dx, dy, tX, tY: real; var eX, eY: LongInt): LongInt;
+var t: Longword;
+ f: boolean;
+ speed, d: real;
+begin
+ // parabola flight before activation
+ t:= 500;
+ repeat
+ x:= x + dx;
+ y:= y + dy;
+ dy:= dy + cGravityf;
+ f:= ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
+ ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5));
+ dec(t)
+ until (t = 0) or (y >= cWaterLine) or f;
+
+ if f then
+ begin
+ eX:= trunc(x);
+ eY:= trunc(y);
+ exit(RateExplosion(Me, eX, eY, 101, afTrackFall or afErasesLand));
+ end;
+
+
+ // activated
+ t:= 5000;
+ speed:= sqrt(sqr(dx) + sqr(dy));
+
+ repeat
+ if (t and $F) = 0 then
+ begin
+ dx:= dx + 0.000064 * (tX - x);
+ dy:= dy + 0.000064 * (tY - y);
+ d := speed / sqrt(sqr(dx) + sqr(dy));
+ dx:= dx * d;
+ dy:= dy * d;
+ end;
+
+ x:= x + dx;
+ y:= y + dy;
+ f:= ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
+ ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5));
+ dec(t)
+ until (t = 0) or f;
+
+ if f then
+ begin
+ eX:= trunc(x);
+ eY:= trunc(y);
+ exit(RateExplosion(Me, eX, eY, 101, afTrackFall or afErasesLand));
+ end
+ else
+ calcBeeFlight:= BadTurn
+end;
+
+function TestBee(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt;
+var i, j: LongInt;
+ valueResult, v, a, p: LongInt;
+ mX, mY, dX: real;
+ eX, eY: LongInt;
+begin
+ if Level > 1 then
+ exit(BadTurn);
+
+ eX:= 0;
+ eY:= 0;
+ mX:= hwFloat2Float(Me^.X);
+ mY:= hwFloat2Float(Me^.Y);
+ valueResult:= BadTurn;
+ for i:= 0 to 8 do
+ for j:= 0 to 1 do
+ begin
+ a:= i * 120;
+ p:= random(cMaxPower - 200) + 180;
+
+ if j = 0 then
+ a:= -a;
+
+ v:= calcBeeFlight(Me
+ , mX
+ , mY
+ , sin(a * pi / 2048) * p / cPowerDivisor
+ , -cos(a * pi / 2048) * p / cPowerDivisor
+ , Targ.Point.X
+ , Targ.Point.Y
+ , eX
+ , eY);
+
+ if v > valueResult then
+ begin
+ ap.ExplR:= 100;
+ ap.ExplX:= eX;
+ ap.ExplY:= eY;
+ ap.Angle:= a;
+ ap.Power:= p;
+ valueResult:= v
+ end
+ end;
+
+ ap.AttackPutX:= Targ.Point.X;
+ ap.AttackPutY:= Targ.Point.Y;
+
+ if valueResult > 0 then
+ TestBee:= valueResult - 5000
+ else
+ TestBee:= BadTurn // no digging
+end;
function TestDrillRocket(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt;
var Vx, Vy, r, mX, mY: real;
@@ -668,7 +778,11 @@
valueResult:= RateShotgun(Me, vX, vY, rx, ry);
if (valueResult = 0) and (Targ.Kind = gtHedgehog) and (Targ.Score > 0) then
- valueResult:= 1024 - Metric(Targ.Point.X, Targ.Point.Y, rx, ry) div 64
+ begin
+ if GameFlags and gfSolidLand = 0 then
+ valueResult:= 1024 - Metric(Targ.Point.X, Targ.Point.Y, rx, ry) div 64
+ else valueResult := BadTurn
+ end
else
dec(valueResult, Level * 4000);
// 27/20 is reuse bonus
--- a/hedgewars/uAmmos.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uAmmos.pas Fri Apr 01 15:36:19 2016 +0200
@@ -70,7 +70,7 @@
begin
if newAmmo[a].Count > 0 then
begin
- TryDo(mi[Ammoz[a].Slot] <= cMaxSlotAmmoIndex, 'Ammo slot overflow', true);
+ if checkFails(mi[Ammoz[a].Slot] <= cMaxSlotAmmoIndex, 'Ammo slot overflow', true) then exit;
Ammo^[Ammoz[a].Slot, mi[Ammoz[a].Slot]]:= newAmmo[a];
inc(mi[Ammoz[a].Slot])
end
@@ -85,10 +85,13 @@
ammos: TAmmoCounts;
newAmmos: TAmmoArray;
begin
-TryDo((byte(ammoLoadout[0]) = byte(ord(High(TAmmoType)))) and (byte(ammoProbability[0]) = byte(ord(High(TAmmoType)))) and (byte(ammoDelay[0]) = byte(ord(High(TAmmoType)))) and (byte(ammoReinforcement[0]) = byte(ord(High(TAmmoType)))), 'Incomplete or missing ammo scheme set (incompatible frontend or demo/save?)', true);
+ if checkFails((byte(ammoLoadout[0]) = byte(ord(High(TAmmoType)))) and (byte(ammoProbability[0]) = byte(ord(High(TAmmoType)))) and (byte(ammoDelay[0]) = byte(ord(High(TAmmoType)))) and (byte(ammoReinforcement[0]) = byte(ord(High(TAmmoType))))
+ , 'Incomplete or missing ammo scheme set (incompatible frontend or demo/save?)'
+ , true)
+ then exit;
+if checkFails(StoreCnt < cMaxHHs, 'Ammo stores overflow', true) then exit;
inc(StoreCnt);
-TryDo(StoreCnt <= cMaxHHs, 'Ammo stores overflow', true);
new(StoresList[Pred(StoreCnt)]);
@@ -153,8 +156,10 @@
function GetAmmoByNum(num: LongInt): PHHAmmo;
begin
- TryDo(num < StoreCnt, 'Invalid store number', true);
- GetAmmoByNum:= StoresList[num]
+ if checkFails(num < StoreCnt, 'Invalid store number', true) then
+ GetAmmoByNum:= nil
+ else
+ GetAmmoByNum:= StoresList[num]
end;
function GetCurAmmoEntry(var Hedgehog: THedgehog): PAmmo;
@@ -364,7 +369,7 @@
inc(slot)
end
end;
- TryDo(slot <= cMaxSlotIndex, 'Ammo slot index overflow', true);
+ if checkFails(slot <= cMaxSlotIndex, 'Ammo slot index overflow', true) then exit;
CurAmmoType:= Ammo^[slot, ammoidx].AmmoType;
end
end;
--- a/hedgewars/uChat.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uChat.pas Fri Apr 01 15:36:19 2016 +0200
@@ -21,6 +21,7 @@
unit uChat;
interface
+uses SDLh;
procedure initModule;
procedure freeModule;
@@ -28,12 +29,13 @@
procedure CleanupInput;
procedure AddChatString(s: shortstring);
procedure DrawChat;
-procedure KeyPressChat(Key, Sym: Longword; Modifier: Word);
+procedure KeyPressChat(keysym: TSDL_Keysym);
procedure SendHogSpeech(s: shortstring);
procedure CopyToClipboard(var newContent: shortstring);
+procedure TextInput(var event: TSDL_TextInputEvent);
implementation
-uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils;
+uses uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils;
const MaxStrIndex = 27;
MaxInputStrLen = 200;
@@ -194,7 +196,7 @@
// create and blit text
strSurface:= TTF_RenderUTF8_Blended(Fontz[font].Handle, Str2PChar(str), cl.color);
//SDL_UpperBlit(strSurface, nil, resSurface, @dstrect);
-if strSurface <> nil then copyTOXY(strSurface, resSurface, Padding, Padding);
+if strSurface <> nil then copyToXY(strSurface, resSurface, Padding, Padding);
SDL_FreeSurface(strSurface);
cl.Tex:= Surface2Tex(resSurface, false);
@@ -267,8 +269,6 @@
inc(visibleCount)
end;
-procedure CheckPasteBuffer(); forward;
-
procedure UpdateInputLinePrefix();
begin
if liveLua then
@@ -302,7 +302,6 @@
// draw chat input line first and under all other lines
if (GameState = gsChat) and (InputStr.Tex <> nil) then
begin
- CheckPasteBuffer();
if InputLinePrefix.Tex = nil then
RenderChatLineTex(InputLinePrefix, InputLinePrefix.s);
@@ -571,9 +570,8 @@
begin
FreezeEnterKey;
history:= 0;
-{$IFNDEF SDL2}
- SDL_EnableKeyRepeat(0,0);
-{$ENDIF}
+ SDL_StopTextInput();
+ //SDL_EnableKeyRepeat(0,0);
GameState:= gsGame;
ResetKbd;
end;
@@ -728,7 +726,8 @@
procedure CopyToClipboard(var newContent: shortstring);
begin
- SendIPC(_S'y' + copy(newContent, 1, 253) + #0);
+ // SDL2 clipboard
+ SDL_SetClipboardText(Str2PChar(newContent));
end;
procedure CopySelectionToClipboard();
@@ -782,39 +781,41 @@
end;
procedure PasteFromClipboard();
+var clip: PChar;
begin
- SendIPC(_S'Y');
-end;
-
-procedure CheckPasteBuffer();
-begin
- if Length(ChatPasteBuffer) > 0 then
+ // use SDL2 clipboard functions
+ if SDL_HasClipboardText() then
begin
- InsertIntoInputStr(ChatPasteBuffer);
- ChatPasteBuffer:= '';
+ clip:= SDL_GetClipboardText();
+ // returns NULL if not enough memory for a copy of clipboard content
+ if clip <> nil then
+ begin
+ InsertIntoInputStr(shortstring(clip));
+ SDL_free(Pointer(clip));
+ end;
end;
end;
-procedure KeyPressChat(Key, Sym: Longword; Modifier: Word);
-const firstByteMark: array[0..3] of byte = (0, $C0, $E0, $F0);
- nonStateMask = (not (KMOD_NUM or KMOD_CAPS));
-var i, btw, index: integer;
- utf8: shortstring;
- action, selMode, ctrl, ctrlonly: boolean;
+procedure KeyPressChat(keysym: TSDL_Keysym);
+const nonStateMask = (not (KMOD_NUM or KMOD_CAPS));
+var i, index: integer;
+ selMode, ctrl, ctrlonly: boolean;
skip: TCharSkip;
+ Scancode: TSDL_Scancode;
+ Modifier: Word;
begin
+ Scancode:= keysym.scancode;
+ Modifier:= keysym.modifier;
+
LastKeyPressTick:= RealTicks;
- action:= true;
-
- CheckPasteBuffer();
selMode:= (modifier and (KMOD_LSHIFT or KMOD_RSHIFT)) <> 0;
ctrl:= (modifier and (KMOD_LCTRL or KMOD_RCTRL)) <> 0;
ctrlonly:= ctrl and ((modifier and nonStateMask and (not (KMOD_LCTRL or KMOD_RCTRL))) = 0);
skip:= none;
- case Sym of
- SDLK_BACKSPACE:
+ case Scancode of
+ SDL_SCANCODE_BACKSPACE:
begin
if selectedPos < 0 then
begin
@@ -831,7 +832,7 @@
DeleteSelected();
UpdateCursorCoords();
end;
- SDLK_DELETE:
+ SDL_SCANCODE_DELETE:
begin
if selectedPos < 0 then
begin
@@ -848,7 +849,7 @@
DeleteSelected();
UpdateCursorCoords();
end;
- SDLK_ESCAPE:
+ SDL_SCANCODE_ESCAPE:
begin
if Length(InputStr.s) > 0 then
begin
@@ -857,7 +858,7 @@
end
else CleanupInput
end;
- SDLK_RETURN, SDLK_KP_ENTER:
+ SDL_SCANCODE_RETURN, SDL_SCANCODE_KP_ENTER:
begin
if Length(InputStr.s) > 0 then
begin
@@ -867,10 +868,10 @@
end;
CleanupInput
end;
- SDLK_UP, SDLK_DOWN:
+ SDL_SCANCODE_UP, SDL_SCANCODE_DOWN:
begin
- if (Sym = SDLK_UP) and (history < localLastStr) then inc(history);
- if (Sym = SDLK_DOWN) and (history > 0) then dec(history);
+ if (Scancode = SDL_SCANCODE_UP) and (history < localLastStr) then inc(history);
+ if (Scancode = SDL_SCANCODE_DOWN) and (history > 0) then dec(history);
index:= localLastStr - history + 1;
if (index > localLastStr) then
begin
@@ -884,7 +885,7 @@
ResetSelection();
UpdateCursorCoords();
end;
- SDLK_HOME:
+ SDL_SCANCODE_HOME:
begin
if cursorPos > 0 then
begin
@@ -896,7 +897,7 @@
UpdateCursorCoords();
end;
- SDLK_END:
+ SDL_SCANCODE_END:
begin
i:= Length(InputStr.s);
if cursorPos < i then
@@ -909,7 +910,7 @@
UpdateCursorCoords();
end;
- SDLK_LEFT:
+ SDL_SCANCODE_LEFT:
begin
if cursorPos > 0 then
begin
@@ -938,7 +939,7 @@
UpdateCursorCoords();
end;
- SDLK_RIGHT:
+ SDL_SCANCODE_RIGHT:
begin
if cursorPos < Length(InputStr.s) then
begin
@@ -963,11 +964,12 @@
UpdateCursorCoords();
end;
- SDLK_PAGEUP, SDLK_PAGEDOWN:
+ SDL_SCANCODE_PAGEUP, SDL_SCANCODE_PAGEDOWN:
begin
// ignore me!!!
end;
- SDLK_a:
+ // TODO: figure out how to determine those keys better
+ SDL_SCANCODE_a:
begin
// select all
if ctrlonly then
@@ -978,18 +980,14 @@
cursorPos:= Length(InputStr.s);
UpdateCursorCoords();
end
- else
- action:= false;
end;
- SDLK_c:
+ SDL_SCANCODE_c:
begin
// copy
if ctrlonly then
CopySelectionToClipboard()
- else
- action:= false;
end;
- SDLK_v:
+ SDL_SCANCODE_v:
begin
// paste
if ctrlonly then
@@ -997,10 +995,8 @@
DeleteSelected();
PasteFromClipboard();
end
- else
- action:= false;
end;
- SDLK_x:
+ SDL_SCANCODE_x:
begin
// cut
if ctrlonly then
@@ -1008,51 +1004,32 @@
CopySelectionToClipboard();
DeleteSelected();
end
- else
- action:= false;
end;
- else
- action:= false;
end;
- if not action and (Key <> 0) then
- begin
- DeleteSelected();
+end;
- if (Key < $80) then
- btw:= 1
- else if (Key < $800) then
- btw:= 2
- else if (Key < $10000) then
- btw:= 3
- else
- btw:= 4;
-
- utf8:= '';
+procedure TextInput(var event: TSDL_TextInputEvent);
+var s: shortstring;
+ l: byte;
+begin
+ DeleteSelected();
- for i:= btw downto 2 do
- begin
- utf8:= char((Key or $80) and $BF) + utf8;
- Key:= Key shr 6
- end;
-
- utf8:= char(Key or firstByteMark[Pred(btw)]) + utf8;
-
- if Length(InputStr.s) + btw > MaxInputStrLen then
- exit;
+ l:= 0;
+ while event.text[l] <> #0 do
+ begin
+ s[l + 1]:= event.text[l];
+ inc(l)
+ end;
- // if speech bubble quotes are used as first input, add the closing quote and place cursor inbetween
- if (Length(InputStr.s) = 0) and (Length(utf8) = 1) and (charIsForHogSpeech(utf8[1])) then
- begin
- InsertIntoInputStr(utf8);
- InsertIntoInputStr(utf8);
- cursorPos:= 1;
- UpdateCursorCoords();
- end
- else
- InsertIntoInputStr(utf8);
+ if l > 0 then
+ begin
+ if byte(InputStr.s[0]) + l > 240 then exit;
+ s[0]:= char(l);
+ InsertIntoInputStr(s);
end
end;
+
procedure chChatMessage(var s: shortstring);
begin
AddChatString(s)
@@ -1098,9 +1075,9 @@
begin
s:= s; // avoid compiler hint
GameState:= gsChat;
-{$IFNDEF SDL2}
- SDL_EnableKeyRepeat(200,45);
-{$ENDIF}
+ SDL_StopTextInput();
+ SDL_StartTextInput();
+ //SDL_EnableKeyRepeat(200,45);
if length(s) = 0 then
SetLine(InputStr, '', true)
else
@@ -1140,6 +1117,7 @@
LastKeyPressTick:= 0;
ResetCursor();
+ SDL_StopTextInput();
end;
procedure freeModule;
--- a/hedgewars/uCollisions.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uCollisions.pas Fri Apr 01 15:36:19 2016 +0200
@@ -62,7 +62,7 @@
function CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): boolean;
implementation
-uses uConsts, uLandGraphics, uVariables, uDebug;
+uses uConsts, uLandGraphics, uVariables;
type TCollisionEntry = record
X, Y, Radius: LongInt;
@@ -76,16 +76,16 @@
procedure AddCI(Gear: PGear);
begin
-if (Gear^.CollisionIndex >= 0) or
+if (Gear^.CollisionIndex >= 0) or (Count > MAXRECTSINDEX) or
((Count > MAXRECTSINDEX-200) and ((Gear^.Kind = gtMine) or (Gear^.Kind = gtSMine) or (Gear^.Kind = gtKnife))) then
exit;
-TryDo(Count <= MAXRECTSINDEX, 'Collision rects array overflow', true);
+
with cinfos[Count] do
begin
X:= hwRound(Gear^.X);
Y:= hwRound(Gear^.Y);
Radius:= Gear^.Radius;
- ChangeRoundInLand(X, Y, Radius - 1, true, (Gear = CurrentHedgehog^.Gear) or ((Gear^.Kind = gtCase) and (Gear^.State and gstFrozen = 0)));
+ ChangeRoundInLand(X, Y, Radius - 1, true, ((CurrentHedgehog <> nil) and (Gear = CurrentHedgehog^.Gear)) or ((Gear^.Kind = gtCase) and (Gear^.State and gstFrozen = 0)), Gear^.Kind = gtHedgehog);
cGear:= Gear
end;
Gear^.CollisionIndex:= Count;
@@ -97,7 +97,7 @@
if Gear^.CollisionIndex >= 0 then
begin
with cinfos[Gear^.CollisionIndex] do
- ChangeRoundInLand(X, Y, Radius - 1, false, ((CurrentHedgehog <> nil) and (Gear = CurrentHedgehog^.Gear)) or ((Gear^.Kind = gtCase) and (Gear^.State and gstFrozen = 0)));
+ ChangeRoundInLand(X, Y, Radius - 1, false, ((CurrentHedgehog <> nil) and (Gear = CurrentHedgehog^.Gear)) or ((Gear^.Kind = gtCase) and (Gear^.State and gstFrozen = 0)), Gear^.Kind = gtHedgehog);
cinfos[Gear^.CollisionIndex]:= cinfos[Pred(Count)];
cinfos[Gear^.CollisionIndex].cGear^.CollisionIndex:= Gear^.CollisionIndex;
Gear^.CollisionIndex:= -1;
@@ -211,10 +211,15 @@
i:= y + Gear^.Radius * 2 - 2;
repeat
if (y and LAND_HEIGHT_MASK) = 0 then
- if Land[y, x] and Gear^.CollisionMask > 255 then
- exit(Land[y, x] and Gear^.CollisionMask)
- else if Land[y, x] and Gear^.CollisionMask <> 0 then
- pixel:= Land[y, x] and Gear^.CollisionMask;
+ begin
+ if Land[y, x] and Gear^.CollisionMask <> 0 then
+ begin
+ if Land[y, x] and Gear^.CollisionMask > 255 then
+ exit(Land[y, x] and Gear^.CollisionMask)
+ else
+ pixel:= Land[y, x] and Gear^.CollisionMask;
+ end;
+ end;
inc(y)
until (y > i);
end;
@@ -274,10 +279,12 @@
repeat
if (x and LAND_WIDTH_MASK) = 0 then
if Land[y, x] > 0 then
+ begin
if Land[y, x] and Gear^.CollisionMask > 255 then
exit(Land[y, x] and Gear^.CollisionMask)
- else if Land[y, x] <> 0 then
+ else // if Land[y, x] <> 0 then
pixel:= Land[y, x] and Gear^.CollisionMask;
+ end;
inc(x)
until (x > i);
end;
--- a/hedgewars/uCommandHandlers.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uCommandHandlers.pas Fri Apr 01 15:36:19 2016 +0200
@@ -93,8 +93,8 @@
if isDeveloperMode then
begin
i:= StrToInt(s);
- TryDo(i <= cNetProtoVersion, 'Protocol version mismatch: engine is too old (got '+intToStr(i)+', expecting '+intToStr(cNetProtoVersion)+')', true);
- TryDo(i >= cNetProtoVersion, 'Protocol version mismatch: engine is too new (got '+intToStr(i)+', expecting '+intToStr(cNetProtoVersion)+')', true);
+ checkFails(i <= cNetProtoVersion, 'Protocol version mismatch: engine is too old (got '+intToStr(i)+', expecting '+intToStr(cNetProtoVersion)+')', true);
+ checkFails(i >= cNetProtoVersion, 'Protocol version mismatch: engine is too new (got '+intToStr(i)+', expecting '+intToStr(cNetProtoVersion)+')', true);
end
end;
@@ -379,7 +379,7 @@
begin
s:= s; // avoid compiler hint
- TryDo(AllInactive, '/nextturn called when not all gears are inactive', true);
+ if checkFails(AllInactive, '/nextturn called when not all gears are inactive', true) then exit;
CheckSum:= CheckSum xor GameTicks;
gi := GearsList;
@@ -398,7 +398,7 @@
SendIPC(s)
end
else
- TryDo(CurrentTeam^.hasGone or (CheckSum = lastTurnChecksum), 'Desync detected', true);
+ checkFails(CurrentTeam^.hasGone or (CheckSum = lastTurnChecksum), 'Desync detected', true);
AddFileLog('Next turn: time '+inttostr(GameTicks));
end;
@@ -408,7 +408,7 @@
if CheckNoTeamOrHH then
exit;
-TryDo((s[0] = #1) and (s[1] >= '1') and (s[1] <= '5'), 'Malformed /timer', true);
+if checkFails((s[0] = #1) and (s[1] >= '1') and (s[1] <= '5'), 'Malformed /timer', true) then exit;
if not isExternalSource then
SendIPC(s);
@@ -450,7 +450,7 @@
if CheckNoTeamOrHH then
exit;
- TryDo((s[0] = #1) and (s[1] <= char(High(TAmmoType))), 'Malformed /setweap', true);
+ if checkFails((s[0] = #1) and (s[1] <= char(High(TAmmoType))), 'Malformed /setweap', true) then exit;
if not isExternalSource then
SendIPC('w' + s);
--- a/hedgewars/uConsts.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uConsts.pas Fri Apr 01 15:36:19 2016 +0200
@@ -115,13 +115,24 @@
lfCurrentHog = $0080; // CurrentHog. It is also used to flag crates, for convenience of AI. Since an active hog would instantly collect the crate, this does not impact play
lfNotCurrentMask = $FF7F; // inverse of above. frequently used
- lfObjMask = $007F; // lower 7 bits used for hogs
+ lfObjMask = $007F; // lower 7 bits used for hogs and explosives and mines
lfNotObjMask = $FF80; // inverse of above.
+
+// breaking up hogs would makes it easier to differentiate
+// colliding with a hog from colliding with other things
+// if overlapping hogs are less common than objects, the division can be altered.
+// 3 bits for objects, 4 for hogs, that is, overlap 7 barrels/mines before possible dents, and 15 hogs.
+ lfHHMask = $000F; // lower 4 bits used only for hogs
+ lfNotHHObjMask = $0070; // next 3 bits used for non-hog things
+ lfNotHHObjShift = 4;
+ lfNotHHObjSize = lfNotHHObjMask shr lfNotHHObjShift;
+
// lower byte is for objects.
// consists of 0-127 counted for object checkins and $80 as a bit flag for current hog.
lfAllObjMask = $00FF; // lfCurrentHog or lfObjMask
+
cMaxPower = 1500;
cMaxAngle = 2048;
cPowerDivisor = 1500;
--- a/hedgewars/uDebug.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uDebug.pas Fri Apr 01 15:36:19 2016 +0200
@@ -23,8 +23,12 @@
interface
procedure OutError(Msg: shortstring; isFatalError: boolean);
-procedure TryDo(Assert: boolean; Msg: shortstring; isFatal: boolean); inline;
-procedure SDLTry(Assert: boolean; isFatal: boolean);
+//procedure TryDo(Assert: boolean; Msg: shortstring; isFatal: boolean); inline;
+function checkFails(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean;
+function SDLCheck(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean;
+
+var
+ allOK: boolean;
implementation
uses SDLh, uConsole, uCommands, uConsts;
@@ -47,14 +51,26 @@
OutError(Msg, isFatal)
end;
-procedure SDLTry(Assert: boolean; isFatal: boolean);
+function checkFails(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean;
+begin
+ if not Assert then
+ OutError(Msg, false);
+
+ allOK:= allOK and (Assert or (not isFatal));
+ checkFails:= (not Assert) and isFatal
+end;
+
+function SDLCheck(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean;
var s: shortstring;
begin
-if not Assert then
+ if not Assert then
begin
- s:= SDL_GetError();
- OutError(s, isFatal)
- end
+ s:= SDL_GetError();
+ OutError(Msg + ': ' + s, false)
+ end;
+
+ allOK:= allOK and (Assert or (not isFatal));
+ SDLCheck:= (not Assert) and isFatal
end;
end.
--- a/hedgewars/uGame.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGame.pas Fri Apr 01 15:36:19 2016 +0200
@@ -28,9 +28,10 @@
////////////////////
uses uInputHandler, uTeams, uIO, uAI, uGears, uSound, uLocale, uCaptions,
uTypes, uVariables, uCommands, uConsts, uVisualGearsList, uUtils
- {$IFDEF USE_TOUCH_INTERFACE}, uTouch{$ENDIF};
+ {$IFDEF USE_TOUCH_INTERFACE}, uTouch{$ENDIF}, uDebug;
procedure DoGameTick(Lag: LongInt);
+const maxCheckedGameDuration = 3*60*60*1000;
var i,j : LongInt;
s: ansistring;
begin
@@ -40,6 +41,7 @@
if (not CurrentTeam^.ExtDriven) then
begin
NetGetNextCmd; // its for the case of receiving "/say" message
+ if not allOK then exit;
isInLag:= false;
FlushMessages(Lag)
end;
@@ -62,7 +64,15 @@
else Lag:= Lag*80;
end
else if cOnlyStats then
- Lag:= High(LongInt)
+ begin
+ if GameTicks >= maxCheckedGameDuration then
+ begin
+ gameState:= gsExit;
+ exit;
+ end;
+
+ Lag:= maxCheckedGameDuration + 60000;
+ end;
end;
if cTestLua then
@@ -87,7 +97,7 @@
end;
PlayNextVoice;
i:= 1;
-while (GameState <> gsExit) and (i <= Lag) do
+while (GameState <> gsExit) and (i <= Lag) and allOK do
begin
if not CurrentTeam^.ExtDriven then
begin
@@ -99,6 +109,8 @@
else
begin
NetGetNextCmd;
+ if not allOK then exit;
+
if isInLag then
case GameType of
gmtNet: begin
--- a/hedgewars/uGears.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGears.pas Fri Apr 01 15:36:19 2016 +0200
@@ -168,7 +168,9 @@
i, AliveCount: LongInt;
s: ansistring;
prevtime: LongWord;
+ stirFallers: boolean;
begin
+stirFallers:= false;
prevtime:= TurnTimeLeft;
ScriptCall('onGameTick');
if GameTicks mod 20 = 0 then ScriptCall('onGameTick20');
@@ -199,6 +201,8 @@
begin
curHandledGear:= t;
t:= curHandledGear^.NextGear;
+ if (GameTicks and $1FFF = 0) and (curHandledGear^.Kind = gtCase) and (curHandledGear^.Pos <> posCaseHealth) then
+ stirFallers := true;
if curHandledGear^.Message and gmDelete <> 0 then
DeleteGear(curHandledGear)
@@ -224,6 +228,23 @@
end
end
end;
+if stirFallers then
+ begin
+ t := GearsList;
+ while t <> nil do
+ begin
+ if t^.Kind = gtGenericFaller then
+ begin
+ t^.Active:= true;
+ t^.X:= int2hwFloat(GetRandom(rightX-leftX)+leftX);
+ t^.Y:= int2hwFloat(GetRandom(LAND_HEIGHT-topY)+topY);
+ t^.dX:= _90-(GetRandomf*_360);
+ t^.dY:= _90-(GetRandomf*_360)
+ end;
+ t := t^.NextGear
+ end
+ end;
+
curHandledGear:= nil;
if AllInactive then
@@ -320,6 +341,7 @@
Ammoz[amTardis].Probability:= 0;
end;
AddCaption(trmsg[sidSuddenDeath], cWhiteColor, capgrpGameState);
+ ScriptCall('onSuddenDeath');
playSound(sndSuddenDeath);
StopMusic;
if SDMusicFN <> '' then PlayMusic
@@ -726,7 +748,7 @@
if (ClansCount = 2) and ((GameFlags and gfDivideTeams) <> 0) then
begin
t:= 0;
- TryDo(ClansCount = 2, 'More or less than 2 clans on map in divided teams mode!', true);
+ if checkFails(ClansCount = 2, 'More or less than 2 clans on map in divided teams mode!', true) then exit;
for p:= 0 to 1 do
begin
with ClansArray[p]^ do
@@ -748,7 +770,8 @@
end;
t:= LAND_WIDTH div 2
end
- end else // mix hedgehogs
+ end
+else // mix hedgehogs
begin
Count:= 0;
for p:= 0 to Pred(TeamsCount) do
@@ -777,7 +800,30 @@
ar[i]:= ar[Count - 1];
dec(Count)
end
- end
+ end;
+for p:= 0 to Pred(TeamsCount) do
+ with TeamsArray[p]^ do
+ for i:= 0 to cMaxHHIndex do
+ with Hedgehogs[i] do
+ if (Gear <> nil) and (Gear^.State and gsttmpFlag <> 0) then
+ begin
+ DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50);
+ AddFileLog('Carved a hole for hog at coordinates (' + inttostr(hwRound(Gear^.X)) + ',' + inttostr(hwRound(Gear^.Y)) + ')')
+ end;
+// place flowers after in case holes overlap (we shrink search distance if we are failing to place)
+for p:= 0 to Pred(TeamsCount) do
+ with TeamsArray[p]^ do
+ for i:= 0 to cMaxHHIndex do
+ with Hedgehogs[i] do
+ if (Gear <> nil) and (Gear^.State and gsttmpFlag <> 0) then
+ begin
+ ForcePlaceOnLand(hwRound(Gear^.X) - SpritesData[sprTargetBee].Width div 2,
+ hwRound(Gear^.Y) - SpritesData[sprTargetBee].Height div 2,
+ sprTargetBee, 0, lfBasic, $FFFFFFFF, false, false, false);
+ Gear^.Y:= int2hwFloat(hwRound(Gear^.Y) - 16 - Gear^.Radius);
+ Gear^.State:= Gear^.State and (not gsttmpFlag);
+ AddFileLog('Carved a hole for hog at coordinates (' + inttostr(hwRound(Gear^.X)) + ',' + inttostr(hwRound(Gear^.Y)) + ')')
+ end
end;
--- a/hedgewars/uGearsHandlersMess.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGearsHandlersMess.pas Fri Apr 01 15:36:19 2016 +0200
@@ -86,7 +86,7 @@
procedure doStepKamikaze(Gear: PGear);
procedure doStepCakeExpl(Gear: PGear);
procedure doStepCakeDown(Gear: PGear);
-procedure doStepCakeWork(Gear: PGear);
+procedure doStepCakeWalk(Gear: PGear);
procedure doStepCakeUp(Gear: PGear);
procedure doStepCakeFall(Gear: PGear);
procedure doStepCake(Gear: PGear);
@@ -128,7 +128,7 @@
procedure doStepResurrectorWork(Gear: PGear);
procedure doStepResurrector(Gear: PGear);
procedure doStepNapalmBomb(Gear: PGear);
-procedure doStepStructure(Gear: PGear);
+//procedure doStepStructure(Gear: PGear);
procedure doStepTardisWarp(Gear: PGear);
procedure doStepTardis(Gear: PGear);
procedure updateFuel(Gear: PGear);
@@ -136,7 +136,7 @@
procedure doStepIceGun(Gear: PGear);
procedure doStepAddAmmo(Gear: PGear);
procedure doStepGenericFaller(Gear: PGear);
-procedure doStepCreeper(Gear: PGear);
+//procedure doStepCreeper(Gear: PGear);
procedure doStepKnife(Gear: PGear);
var
@@ -343,7 +343,7 @@
// might need some testing/adjustments - just to avoid projectiles to fly forever (accelerated by wind/skips)
if (gX < min(LAND_WIDTH div -2, -2048))
or (gX > max(LAND_WIDTH * 3 div 2, 6144)) then
- Gear^.State := Gear^.State or gstCollision;
+ Gear^.Message := Gear^.Message or gmDestroy;
if Gear^.dY.isNegative then
begin
@@ -464,11 +464,12 @@
if Gear^.AdvBounce > 1 then
dec(Gear^.AdvBounce);
- if isFalling then
- begin
- if Gear^.State and gstNoGravity = 0 then
- Gear^.dY := Gear^.dY + cGravity;
- if (GameFlags and gfMoreWind) <> 0 then
+ if isFalling and (Gear^.State and gstNoGravity = 0) then
+ begin
+ Gear^.dY := Gear^.dY + cGravity;
+ if (GameFlags and gfMoreWind <> 0) and
+ ((xland or land) = 0) and
+ ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) > _0_02.QWordValue) then
Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density
end;
@@ -482,10 +483,7 @@
Gear^.State := Gear^.State or gstMoving;
if ((xland or land) and lfBouncy <> 0) and (Gear^.dX.QWordValue < _0_15.QWordValue) and (Gear^.dY.QWordValue < _0_15.QWordValue) then
- begin
Gear^.State := Gear^.State or gstCollision;
- AddFileLog('no more bounce for you!');
- end;
if ((xland or land) and lfBouncy <> 0) and (Gear^.Radius >= 3) and
((Gear^.dX.QWordValue > _0_15.QWordValue) or (Gear^.dY.QWordValue > _0_15.QWordValue)) then
@@ -515,10 +513,10 @@
dec(Gear^.Timer);
if Gear^.Timer = 1000 then // might need adjustments
case Gear^.Kind of
- gtGrenade: makeHogsWorry(Gear^.X, Gear^.Y, 50);
- gtClusterBomb: makeHogsWorry(Gear^.X, Gear^.Y, 20);
- gtWatermelon: makeHogsWorry(Gear^.X, Gear^.Y, 75);
- gtHellishBomb: makeHogsWorry(Gear^.X, Gear^.Y, 90);
+ gtGrenade,
+ gtClusterBomb,
+ gtWatermelon,
+ gtHellishBomb: makeHogsWorry(Gear^.X, Gear^.Y, Gear^.Boom);
gtGasBomb: makeHogsWorry(Gear^.X, Gear^.Y, 50);
end;
@@ -526,7 +524,7 @@
begin
CheckCollision(Gear);
if (Gear^.State and gstCollision) <> 0 then
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, Gear^.Hedgehog, EXPLDontDraw or EXPLNoGfx);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLDontDraw or EXPLNoGfx);
end;
if (Gear^.Kind = gtGasBomb) and ((GameTicks mod 200) = 0) then
@@ -539,14 +537,14 @@
if Gear^.Timer = 0 then
begin
case Gear^.Kind of
- gtGrenade: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
- gtBall: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 40, Gear^.Hedgehog, EXPLAutoSound);
+ gtGrenade: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
+ gtBall: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
gtClusterBomb:
begin
x := hwRound(Gear^.X);
y := hwRound(Gear^.Y);
gdX:= Gear^.dX;
- doMakeExplosion(x, y, 20, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(x, y, Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
for i:= 0 to 4 do
begin
dX := rndSign(GetRandomf * _0_1) + gdX / 5;
@@ -559,7 +557,7 @@
x := hwRound(Gear^.X);
y := hwRound(Gear^.Y);
gdX:= Gear^.dX;
- doMakeExplosion(x, y, 75, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(x, y, Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
for i:= 0 to 5 do
begin
dX := rndSign(GetRandomf * _0_1) + gdX / 5;
@@ -572,7 +570,7 @@
begin
x := hwRound(Gear^.X);
y := hwRound(Gear^.Y);
- doMakeExplosion(x, y, 90, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(x, y, Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
for i:= 0 to 127 do
begin
@@ -592,7 +590,7 @@
end;
gtGasBomb:
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
for i:= 0 to 2 do
begin
x:= GetRandom(60);
@@ -701,13 +699,12 @@
doStepFallingGear(Gear);
if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Timer, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
- if (Gear^.Kind = gtMelonPiece)
- or (Gear^.Kind = gtBall) then
+ if (Gear^.Kind = gtMelonPiece) then
CalcRotationDirAngle(Gear)
else if (GameTicks and $1F) = 0 then
AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
@@ -722,7 +719,7 @@
doStepFallingGear(Gear);
if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
@@ -745,7 +742,7 @@
CalcRotationDirAngle(Gear);
if (Gear^.State and gstCollision) <> 0 then
begin
- kick:= hwRound((hwAbs(gdX)+hwAbs(gdY)) * _20);
+ kick:= hwRound((hwAbs(gdX)+hwAbs(gdY)) * Gear^.Boom / 10000);
Gear^.dX:= gdX;
Gear^.dY:= gdY;
AmmoShove(Gear, 0, kick);
@@ -1031,13 +1028,13 @@
end
else
begin
- if (GameTicks and $F) = 0 then
- begin
- if (GameTicks and $30) = 0 then
+ if (Gear^.Timer and $F) = 0 then
+ begin
+ if (Gear^.Timer and $3F) = 0 then
AddVisualGear(gX, gY, vgtBeeTrace);
- Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (Gear^.Target.X - gX));
- Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (Gear^.Target.Y - gY));
+ Gear^.dX := Gear^.dX + _0_000064 * (Gear^.Target.X - gX);
+ Gear^.dY := Gear^.dY + _0_000064 * (Gear^.Target.Y - gY);
// make sure new speed isn't higher than original one (which we stored in Friction variable)
t := Gear^.Friction / Distance(Gear^.dX, Gear^.dY);
Gear^.dX := Gear^.dX * t;
@@ -1054,7 +1051,7 @@
if ((Gear^.State and gstCollision) <> 0) then
begin
StopSoundChan(Gear^.SoundChannel);
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
for i:= 0 to 31 do
begin
flower:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot);
@@ -1094,12 +1091,13 @@
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);
if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
@@ -1281,9 +1279,9 @@
if Gear^.Damage > 5 then
begin
if Gear^.AmmoType = amDEagle then
- AmmoShove(Gear, 7, 20)
+ AmmoShove(Gear, Gear^.Boom, 20)
else
- AmmoShove(Gear, Gear^.Timer, 20);
+ AmmoShove(Gear, Gear^.Timer * Gear^.Boom div 100000, 20);
end;
CheckGearDrowning(Gear);
dec(i)
@@ -1339,10 +1337,15 @@
procedure doStepDEagleShot(Gear: PGear);
begin
+ Gear^.Data:= nil;
+ // remember who fired this
+ if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
+ Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear);
+
PlaySound(sndGun);
- // add 3 initial steps to avoid problem with ammoshove related to calculation of radius + 1 radius as gear widths, and also just plain old weird angles
- Gear^.X := Gear^.X + Gear^.dX * 3;
- Gear^.Y := Gear^.Y + Gear^.dY * 3;
+ // add 2 initial steps to avoid problem with ammoshove related to calculation of radius + 1 radius as gear widths, and also just plain old weird angles
+ Gear^.X := Gear^.X + Gear^.dX * 2;
+ Gear^.Y := Gear^.Y + Gear^.dY * 2;
Gear^.doStep := @doStepBulletWork
end;
@@ -1351,6 +1354,7 @@
HHGear: PGear;
shell: PVisualGear;
begin
+
cArtillery := true;
HHGear := Gear^.Hedgehog^.Gear;
@@ -1360,6 +1364,9 @@
exit
end;
+ // remember who fired this
+ Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear);
+
HHGear^.State := HHGear^.State or gstNotKickable;
HedgehogChAngle(HHGear);
if not cLaserSighting then
@@ -1384,9 +1391,9 @@
Gear^.dX := SignAs(AngleSin(HHGear^.Angle), HHGear^.dX) * _0_5;
Gear^.dY := -AngleCos(HHGear^.Angle) * _0_5;
PlaySound(sndGun);
- // add 3 initial steps to avoid problem with ammoshove related to calculation of radius + 1 radius as gear widths, and also just weird angles
- Gear^.X := Gear^.X + Gear^.dX * 3;
- Gear^.Y := Gear^.Y + Gear^.dY * 3;
+ // add 2 initial steps to avoid problem with ammoshove related to calculation of radius + 1 radius as gear widths, and also just weird angles
+ Gear^.X := Gear^.X + Gear^.dX * 2;
+ Gear^.Y := Gear^.Y + Gear^.dY * 2;
Gear^.doStep := @doStepBulletWork;
end
else
@@ -1472,7 +1479,7 @@
if (Gear^.Timer mod 33) = 0 then
begin
HHGear^.State := HHGear^.State or gstNoDamage;
- doMakeExplosion(x, y + 7, 6, Gear^.Hedgehog, EXPLDontDraw);
+ doMakeExplosion(x, y + 7, Gear^.Boom, Gear^.Hedgehog, EXPLDontDraw);
HHGear^.State := HHGear^.State and (not gstNoDamage)
end;
@@ -1647,7 +1654,7 @@
Gear^.Y := HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC);
end;
HHGear^.State := HHGear^.State or gstNoDamage;
- AmmoShove(Gear, 2, 15);
+ AmmoShove(Gear, Gear^.Boom, 15);
HHGear^.State := HHGear^.State and (not gstNoDamage)
end;
end;
@@ -1732,7 +1739,7 @@
if (Gear^.Damage > 35) then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit
end
@@ -1756,7 +1763,7 @@
or (cMineDudPercent = 0)
or (getRandom(100) > cMineDudPercent) then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear)
end
else
@@ -1780,12 +1787,6 @@
Gear^.State := Gear^.State or gsttmpFlag;
end;
-(*
-Just keeping track for my own benefit.
-Every second, locate new target. Clear if target radius has been set to 0 or no target in range.
-Every... 16 milliseconds? Update vector to target.
-*)
-
procedure doStepAirMine(Gear: PGear);
var i,t,targDist,tmpDist: LongWord;
targ, tmpG: PGear;
@@ -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
@@ -1984,7 +1985,8 @@
if ((Gear^.State and gstAttacking) = 0) then
begin
if ((GameTicks and $1F) = 0) then
- if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then
+// FIXME - values taken from mine. use a gear val and set both to same
+ if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then
Gear^.State := Gear^.State or gstAttacking
end
else // gstAttacking <> 0
@@ -1992,7 +1994,7 @@
AllInactive := false;
if Gear^.Timer = 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit
end
@@ -2010,16 +2012,18 @@
////////////////////////////////////////////////////////////////////////////////
procedure doStepDynamite(Gear: PGear);
+var VGear: PVisualGear;
begin
doStepFallingGear(Gear);
AllInactive := false;
+
if Gear^.Timer mod 166 = 0 then
inc(Gear^.Tag);
if Gear^.Timer = 1000 then // might need better timing
makeHogsWorry(Gear^.X, Gear^.Y, 75);
if Gear^.Timer = 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
@@ -2138,13 +2142,13 @@
if k = gtCase then
begin
- doMakeExplosion(x, y, 25, hog, EXPLAutoSound);
+ doMakeExplosion(x, y, Gear^.Boom, hog, EXPLAutoSound);
for i:= 0 to 63 do
AddGear(x, y, gtFlame, 0, _0, _0, 0);
end
else if k = gtExplosives then
begin
- doMakeExplosion(x, y, 75, hog, EXPLAutoSound);
+ doMakeExplosion(x, y, Gear^.Boom, hog, EXPLAutoSound);
for i:= 0 to 31 do
begin
dX := AngleCos(i * 64) * _0_5 * (getrandomf + _1);
@@ -2176,23 +2180,6 @@
end
else
begin
- if (Gear^.Pos <> posCaseHealth) and (GameTicks and $1FFF = 0) then // stir 'em up periodically
- begin
- gi := GearsList;
- while gi <> nil do
- begin
- if gi^.Kind = gtGenericFaller then
- begin
- gi^.Active:= true;
- gi^.X:= int2hwFloat(GetRandom(rightX-leftX)+leftX);
- gi^.Y:= int2hwFloat(GetRandom(LAND_HEIGHT-topY)+topY);
- gi^.dX:= _90-(GetRandomf*_360);
- gi^.dY:= _90-(GetRandomf*_360)
- end;
- gi := gi^.NextGear
- end
- end;
-
if Gear^.Timer = 500 then
begin
(* Can't make sparkles team coloured without working out what the next team is going to be. This should be solved, really, since it also screws up
@@ -2313,7 +2300,7 @@
HHGear^.State := HHGear^.State or gstNoDamage;
DeleteCI(HHGear);
- AmmoShove(Gear, 30, 115);
+ AmmoShove(Gear, Gear^.Boom, 115);
HHGear^.State := (HHGear^.State and (not gstNoDamage)) or gstMoving;
Gear^.Timer := 250;
@@ -2333,7 +2320,7 @@
for i:= 0 to 3 do
begin
AddVisualGear(hwRound(Gear^.X) + hwSign(Gear^.dX) * (10 + 6 * i), hwRound(Gear^.Y) + 12 + Random(6), vgtDust);
- AmmoShove(Gear, 30, 25);
+ AmmoShove(Gear, Gear^.Boom, 25);
Gear^.X := Gear^.X + Gear^.dX * 5
end;
@@ -2371,7 +2358,7 @@
Gear^.dY.QWordValue:= 429496730;
Gear^.dX.isNegative:= getrandom(2)<>1;
Gear^.dY.isNegative:= true;
- AmmoShove(Gear, 2, 125);
+ AmmoShove(Gear, Gear^.Boom, 125);
Gear^.dX:= tdX;
Gear^.dY:= tdY;
Gear^.Radius := 1
@@ -2450,7 +2437,7 @@
Gear^.dY.QWordValue:= 429496730;
Gear^.dX.isNegative:= getrandom(2)<>1;
Gear^.dY.isNegative:= true;
- AmmoShove(Gear, 2, 125);
+ AmmoShove(Gear, Gear^.Boom, 125);
Gear^.dX:= tdX;
Gear^.dY:= tdY;
Gear^.Radius := 1
@@ -2476,13 +2463,13 @@
Gear^.dY.QWordValue:= 429496730;
Gear^.dX.isNegative:= getrandom(2)<>1;
Gear^.dY.isNegative:= true;
- AmmoShove(Gear, 6, 100);
+ AmmoShove(Gear, Gear^.Boom * 3, 100);
Gear^.dX:= tdX;
Gear^.dY:= tdY;
Gear^.Radius := 1;
end
else if ((GameTicks and $3) = 3) then
- doMakeExplosion(gX, gY, 8, Gear^.Hedgehog, 0);//, EXPLNoDamage);
+ doMakeExplosion(gX, gY, Gear^.Boom * 4, Gear^.Hedgehog, 0);//, EXPLNoDamage);
//DrawExplosion(gX, gY, 4);
if ((GameTicks and $7) = 0) and (Random(2) = 0) then
@@ -2549,7 +2536,7 @@
DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y - _1, _0_5, _0, cHHRadius * 4+2, 2);
HHGear^.State := HHGear^.State or gstNoDamage;
Gear^.Y := HHGear^.Y;
- AmmoShove(Gear, 30, 40);
+ AmmoShove(Gear, Gear^.Boom, 40);
HHGear^.State := HHGear^.State and (not gstNoDamage)
end;
@@ -2649,7 +2636,11 @@
AfterAttack;
- HHGear^.State := HHGear^.State and (not (gstAttacking or gstAttacked or gstMoving));
+ // make sure hog doesn't end up facing in wrong direction due to high jump
+ if (HHGear^.State and gstHHHJump) <> 0 then
+ HHGear^.dX.isNegative := (not HHGear^.dX.isNegative);
+
+ HHGear^.State := HHGear^.State and (not (gstAttacking or gstAttacked or gstMoving or gstHHJumping or gstHHHJump));
HHGear^.Message := HHGear^.Message and (not gmAttack);
Gear^.doStep := @doStepParachuteWork;
@@ -2664,7 +2655,7 @@
AllInactive := false;
Gear^.X := Gear^.X + cAirPlaneSpeed * Gear^.Tag;
- if (Gear^.Health > 0)and(not (Gear^.X < Gear^.dX))and(Gear^.X < Gear^.dX + cAirPlaneSpeed) then
+ if (Gear^.Health > 0) and (not (Gear^.X < Gear^.dX)) and (Gear^.X < Gear^.dX + cAirPlaneSpeed) then
begin
dec(Gear^.Health);
case Gear^.State of
@@ -2675,7 +2666,7 @@
//4: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtWaterMelon, 0, cBombsSpeed *
// Gear^.Tag, _0, 5000);
end;
- Gear^.dX := Gear^.dX + int2hwFloat(30 * Gear^.Tag);
+ Gear^.dX := Gear^.dX + int2hwFloat(Gear^.Damage * Gear^.Tag);
if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then
FollowGear^.State:= FollowGear^.State or gstSubmersible;
StopSoundChan(Gear^.SoundChannel, 4000);
@@ -2708,7 +2699,7 @@
end;
Gear^.Y := int2hwFloat(topY-300);
- Gear^.dX := int2hwFloat(Gear^.Target.X - 5 * Gear^.Tag * 15);
+ Gear^.dX := int2hwFloat(Gear^.Target.X) - int2hwFloat(Gear^.Tag * (Gear^.Health-1) * Gear^.Damage) / 2;
// calcs for Napalm Strike, so that it will hit the target (without wind at least :P)
if (Gear^.State = 2) then
@@ -2718,7 +2709,6 @@
Gear^.dX := Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(Gear^.Target.Y) - Gear^.Y) * 2 /
cGravity) * Gear^.Tag;
- Gear^.Health := 6;
Gear^.doStep := @doStepAirAttackWork;
Gear^.SoundChannel := LoopSound(sndPlane, 4000);
@@ -2732,7 +2722,7 @@
doStepFallingGear(Gear);
if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
{$IFNDEF PAS2C}
with mobileRecord do
@@ -3007,7 +2997,7 @@
doStepFallingGear(Gear);
if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
gdX.isNegative := not gdX.isNegative;
gdY.isNegative := not gdY.isNegative;
gdX:= gdX*_0_2;
@@ -3099,7 +3089,7 @@
Gear^.Pos := 2;
end;
- AmmoShove(Gear, 30, 40);
+ AmmoShove(Gear, Gear^.Boom, 40);
DrawTunnel(HHGear^.X - HHGear^.dX * 10,
HHGear^.Y - _2 - HHGear^.dY * 10 + hwAbs(HHGear^.dY) * 2,
@@ -3113,7 +3103,7 @@
if Gear^.Health < Gear^.Damage then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
if hasWishes then
for i:= 0 to 31 do
begin
@@ -3184,7 +3174,8 @@
if Gear^.Tag < 2250 then
exit;
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), cakeDmg, Gear^.Hedgehog, EXPLAutoSound);
+ InCinematicMode:= false;
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
AfterAttack;
DeleteGear(Gear)
end;
@@ -3192,8 +3183,9 @@
procedure doStepCakeDown(Gear: PGear);
var
gi: PGear;
- dmg, dmgBase: LongInt;
+ dmg, dmgBase, partyEpicness, i: LongInt;
fX, fY, tdX, tdY: hwFloat;
+ sparkles: PVisualGear;
begin
AllInactive := false;
@@ -3212,6 +3204,7 @@
fX:= int2hwFloat(hwRound(Gear^.X));
fY:= int2hwFloat(hwRound(Gear^.Y));
dmgBase:= cakeDmg shl 1 + cHHRadius div 2;
+ partyEpicness:= 0;
gi := GearsList;
while gi <> nil do
begin
@@ -3225,21 +3218,46 @@
if (dmg > 1) then dmg:= ModifyDamage(min(dmg div 2, cakeDmg), gi);
if (dmg > 1) then
if (CurrentHedgehog^.Gear = gi) and (gi^.Hedgehog^.Effects[heInvulnerable] = 0) then
- gi^.State := gi^.State or gstLoser
+ begin
+ gi^.State := gi^.State or gstLoser;
+ // probably not too epic if hitting self too...
+ dec(partyEpicness, 45);
+ end
else
+ begin
gi^.State := gi^.State or gstWinner;
+ if CurrentHedgehog^.Gear = gi then
+ dec(partyEpicness, 45)
+ else
+ inc(partyEpicness);
+ end;
end;
gi := gi^.NextGear
end;
//////////////////////////////////////////////////////////////////////
Gear^.doStep := @doStepCakeExpl;
+ if (partyEpicness > 6) and (abs(90 - abs(trunc(Gear^.DirAngle))) < 20) then
+ begin
+ for i := 0 to (2 * partyEpicness) do
+ begin
+ sparkles:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtEgg, 1);
+ if sparkles <> nil then
+ begin
+ sparkles^.dX:= 0.008 * (random(100) - 50);
+ sparkles^.dY:= -0.3 + 0.002 * (random(100) - 50);
+ sparkles^.Tint:= ((random(210)+45) shl 24) or ((random(210)+45) shl 16) or ((random(210)+45) shl 8) or $FF;
+ sparkles^.Angle:= random(360);
+ end
+ end;
+ InCinematicMode:= true;
+ end;
PlaySound(sndCake)
end
else dec(Gear^.Pos)
end;
-procedure doStepCakeWork(Gear: PGear);
+procedure doStepCakeWalk(Gear: PGear);
var
tdx, tdy: hwFloat;
cakeData: PCakeData;
@@ -3306,7 +3324,7 @@
end;
CakeI := 0;
end;
- Gear^.doStep := @doStepCakeWork
+ Gear^.doStep := @doStepCakeWalk
end
else
inc(Gear^.Pos)
@@ -3508,10 +3526,7 @@
begin
//out of time or exited ground
StopSoundChan(Gear^.SoundChannel);
- if (Gear^.State and gsttmpFlag) <> 0 then
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound)
- else
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit
end
@@ -3535,7 +3550,7 @@
begin
AllInactive := false;
- if (Gear^.State and gsttmpFlag) = 0 then
+ if (Gear^.State and gsttmpFlag = 0) and (GameFlags and gfMoreWind = 0) then
Gear^.dX := Gear^.dX + cWindSpeed;
oldDx := Gear^.dX;
@@ -3571,10 +3586,7 @@
else if (t <> nil) then
begin
//explode right on contact with HH
- if (Gear^.State and gsttmpFlag) <> 0 then
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound)
- else
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
exit;
end;
@@ -3594,7 +3606,7 @@
dec(Gear^.Timer)
else
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
DeleteGear(Gear);
end
end;
@@ -3677,7 +3689,14 @@
FollowGear := Gear;
if Gear^.Timer > 0 then
+ begin
+ if Gear^.Timer = 1 then
+ begin
+ StopSoundChan(Gear^.SoundChannel);
+ Gear^.SoundChannel:= -1;
+ end;
dec(Gear^.Timer);
+ end;
fChanged := false;
if (HHGear = nil) or ((HHGear^.State and gstHHDriven) = 0) or (Gear^.Timer = 0) then
@@ -3738,6 +3757,7 @@
Gear^.State := Gear^.State or gsttmpFlag;
PauseMusic;
playSound(sndRideOfTheValkyries);
+ inCinematicMode:= true;
end;
// pickup bonuses
@@ -3749,13 +3769,14 @@
if ((Gear^.State and gstCollision) <> 0) or CheckGearDrowning(Gear) then
begin
+ inCinematicMode:= false;
StopSoundChan(Gear^.SoundChannel);
StopSound(sndRideOfTheValkyries);
ResumeMusic;
if ((Gear^.State and gstCollision) <> 0) then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, Gear^.Hedgehog, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
for i:= 0 to 15 do
begin
dX := AngleCos(i * 64) * _0_5 * (GetRandomf + _1);
@@ -4176,7 +4197,7 @@
if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 10, Gear^.Hedgehog, EXPLPoisoned, $C0E0FFE0);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLPoisoned, $C0E0FFE0);
PlaySound(sndEggBreak);
AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtEgg);
vg := AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtEgg);
@@ -4345,9 +4366,13 @@
continue;
end;
- // draw bullet trail
- if isbullet then
+ if (iterator^.Kind = gtDEagleShot) or (iterator^.Kind = gtSniperRifleShot) then
+ begin
+ // draw bullet trail
spawnBulletTrail(iterator);
+ // the bullet can now hurt the hog that fired it
+ iterator^.Data:= nil;
+ end;
// calc gear offset in portal vector direction
ox := (iterator^.X - Gear^.X);
@@ -4786,11 +4811,11 @@
end
else if (Gear^.State and gstCollision) <> 0 then
begin
- r0 := GetRandom(21);
- r1 := GetRandom(21);
- doMakeExplosion(hwRound(Gear^.X) - 30 - r0, hwRound(Gear^.Y) + 40, 40 + r1, Gear^.Hedgehog, 0);
- doMakeExplosion(hwRound(Gear^.X) + 30 + r1, hwRound(Gear^.Y) + 40, 40 + r0, Gear^.Hedgehog, 0);
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 80 + r0, Gear^.Hedgehog, EXPLAutoSound);
+ r0 := GetRandom(Gear^.Boom div 4 + 1);
+ r1 := GetRandom(Gear^.Boom div 4 + 1);
+ doMakeExplosion(hwRound(Gear^.X) - 30 - r0, hwRound(Gear^.Y) + 40, Gear^.Boom div 2 + r1, Gear^.Hedgehog, 0);
+ doMakeExplosion(hwRound(Gear^.X) + 30 + r1, hwRound(Gear^.Y) + 40, Gear^.Boom div 2 + r0, Gear^.Hedgehog, 0);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom + r0, Gear^.Hedgehog, EXPLAutoSound);
for r0:= 0 to 4 do
AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote);
Gear^.dY := cGravity * 2 - odY;
@@ -4924,7 +4949,7 @@
end;
// kick nearby hogs
- AmmoShove(Gear, 35, 50);
+ AmmoShove(Gear, Gear^.Boom, 50);
dec(Gear^.Health, Gear^.Damage);
@@ -4994,15 +5019,18 @@
begin
PlaySound(sndSineGun);
- // push the shooting Hedgehog back
- HHGear := CurrentHedgehog^.Gear;
- Gear^.dX.isNegative := not Gear^.dX.isNegative;
- Gear^.dY.isNegative := not Gear^.dY.isNegative;
- HHGear^.dX := Gear^.dX;
- HHGear^.dY := Gear^.dY;
- AmmoShove(Gear, 0, 80);
- Gear^.dX.isNegative := not Gear^.dX.isNegative;
- Gear^.dY.isNegative := not Gear^.dY.isNegative;
+ if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
+ begin
+ HHGear := Gear^.Hedgehog^.Gear;
+ // push the shooting Hedgehog back
+ Gear^.dX.isNegative := not Gear^.dX.isNegative;
+ Gear^.dY.isNegative := not Gear^.dY.isNegative;
+ HHGear^.dX := Gear^.dX;
+ HHGear^.dY := Gear^.dY;
+ AmmoShove(Gear, 0, 80);
+ Gear^.dX.isNegative := not Gear^.dX.isNegative;
+ Gear^.dY.isNegative := not Gear^.dY.isNegative;
+ end;
Gear^.doStep := @doStepSineGunShotWork;
{$IFNDEF PAS2C}
@@ -5191,7 +5219,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);
@@ -5203,7 +5233,7 @@
Gear^.dX := Gear^.dX + cWindSpeed / 4;
Gear^.dY := Gear^.dY + cGravity / 100;
if (GameTicks and $FF) = 0 then
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, Gear^.Hedgehog, EXPLDontDraw or EXPLNoGfx or EXPLNoDamage or EXPLDoNotTouchAny or EXPLPoisoned);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLDontDraw or EXPLNoGfx or EXPLNoDamage or EXPLDoNotTouchAny or EXPLPoisoned);
if Gear^.State and gstTmpFlag = 0 then
AllInactive:= false;
end;
@@ -5242,19 +5272,13 @@
dmg:= (tmp^.Health - tmp^.Damage);
if dmg > 0 then
begin
- // do 1/2 current hp worth of damage if extra damage is enabled (1/3 damage if not)
- if cDamageModifier > _1 then
- 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 Gear^.Boom;
+
+ if dmg > 0 then
+ ApplyDamage(tmp, CurrentHedgehog, dmg, dsUnknown);
end;
+ tmp^.dY:= _0_03 * Gear^.Boom
end;
if (tmp^.Kind <> gtHedgehog) or (dmg > 0) or (tmp^.Health > tmp^.Damage) then
@@ -5423,7 +5447,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;
@@ -5524,6 +5548,7 @@
dec(Gear^.Timer)
end;
+(*
////////////////////////////////////////////////////////////////////////////////
procedure doStepStructure(Gear: PGear);
var
@@ -5615,6 +5640,7 @@
doMakeExplosion(x, y, 50, CurrentHedgehog, EXPLAutoSound);
end;
end;
+*)
////////////////////////////////////////////////////////////////////////////////
(*
@@ -5785,9 +5811,16 @@
All these effects assume the ray's angle is not changed and that the target type was unchanged over a number of ticks. This is a simplifying assumption for "gun was applying freezing effect to the same target".
* When fired at water a layer of ice textured land is added above the water.
* When fired at non-ice land (land and lfLandMask and not lfIce) the land is overlaid with a thin layer of ice textured land around that point (say, 1 or 2px into land, 1px above). For attractiveness, a slope would probably be needed.
- * When fired at a hog (land and $00FF <> 0), while the hog is targetted, the hog's state is set to frozen. As long as the gun is on the hog, a frozen hog sprite creeps up from the feet to the head. If the effect is interrupted before reaching the top, the freezing state is cleared.
-A frozen hog will animate differently. To be decided, but possibly in a similar fashion to a grave when it comes to explosions. The hog might (possibly) not be damaged by explosions. This might make freezing potentially useful for friendlies in a bad position. It might be better to allow damage though.
-A frozen hog stays frozen for a certain number of turns. Each turn the frozen overlay becomes fainter, until it fades and the hog animates normally again.
+ * When fired at a hog (land and $00FF <> 0), while the hog is targetted, the hog's state is set to frozen.
+ As long as the gun is on the hog, a frozen hog sprite creeps up from the feet to the head.
+ If the effect is interrupted before reaching the top, the freezing state is cleared.
+A frozen hog will animate differently.
+ To be decided, but possibly in a similar fashion to a grave when it comes to explosions.
+ The hog might (possibly) not be damaged by explosions.
+ This might make freezing potentially useful for friendlies in a bad position.
+ It might be better to allow damage though.
+A frozen hog stays frozen for a certain number of turns.
+ Each turn the frozen overlay becomes fainter, until it fades and the hog animates normally again.
*)
@@ -6097,7 +6130,7 @@
end;
end
end;
-
+(*
procedure doStepCreeper(Gear: PGear);
var hogs: PGearArrayS;
HHGear: PGear;
@@ -6178,7 +6211,7 @@
end;
end;
end;
-
+*)
////////////////////////////////////////////////////////////////////////////////
procedure doStepKnife(Gear: PGear);
//var ox, oy: LongInt;
@@ -6197,7 +6230,7 @@
DeleteCI(Gear);
Gear^.Radius:= 7;
// used for damage and impact calc. needs balancing I think
- Gear^.Health:= hwRound(hwSqr((hwAbs(Gear^.dY)+hwAbs(Gear^.dX))*_4));
+ Gear^.Health:= hwRound(hwSqr((hwAbs(Gear^.dY)+hwAbs(Gear^.dX))*Gear^.Boom/10000));
doStepFallingGear(Gear);
AllInactive := false;
a:= Gear^.DirAngle;
--- a/hedgewars/uGearsHandlersRope.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGearsHandlersRope.pas Fri Apr 01 15:36:19 2016 +0200
@@ -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
@@ -268,7 +270,7 @@
Gear^.X := Gear^.X + nx * len;
Gear^.Y := Gear^.Y + ny * len;
inc(RopePoints.Count);
- TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true);
+ if checkFails(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true) then exit;
Gear^.Elasticity := Gear^.Elasticity - len;
Gear^.Friction := Gear^.Friction - len;
haveDivided := true;
@@ -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);
@@ -494,7 +498,7 @@
end;
if Gear^.Elasticity < _20 then Gear^.CollisionMask:= lfLandMask
- else Gear^.CollisionMask:= lfNotCurrentMask;
+ else Gear^.CollisionMask:= lfNotObjMask or lfNotHHObjMask;
CheckCollision(Gear);
if (Gear^.State and gstCollision) <> 0 then
--- a/hedgewars/uGearsHedgehog.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGearsHedgehog.pas Fri Apr 01 15:36:19 2016 +0200
@@ -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;
@@ -586,8 +587,11 @@
begin
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;
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, CurrentHedgehog, EXPLAutoSound);
+ 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
@@ -681,6 +685,8 @@
vga: PVisualGear;
ag, gi: PGear;
begin
+if Gear^.State and gstFrozen <> 0 then exit;
+
Gear^.Message:= gmDestroy;
if (Gear^.Pos and posCaseExplode) <> 0 then
if (Gear^.Pos and posCasePoison) <> 0 then
@@ -869,9 +875,59 @@
////////////////////////////////////////////////////////////////////////////////
+procedure moveHedgehogOutOfWall(Gear: PGear);
+var
+ hx: hwFloat;
+ colly, collxl, collxr: boolean;
+begin
+colly:= (TestCollisionYwithGear(Gear, 1) <> 0);
+
+while colly do
+ begin
+ // don't use TestCollisionXwithXYShift, because it checks for gears
+ // save real x-position
+ hx:= Gear^.X;
+
+ Gear^.X:= hx + _1;
+ collxl:= (TestCollisionX(Gear, -1) <> 0);
+
+ Gear^.X:= hx - _1;
+ collxr:= (TestCollisionX(Gear, 1) <> 0);
+
+ // restore original value
+ Gear^.X:= hx;
+
+ // do nothing if trapped between 2 walls
+ if collxl = collxr then
+ break;
+
+ // if we in a wall - fix that
+ if collxl then
+ begin
+ // check for obstacle
+ if (TestCollisionX(Gear, 1) <> 0) then
+ break;
+ Gear^.X:= Gear^.X + _1;
+ end
+ else
+ begin
+ // check for obstacle
+ if (TestCollisionX(Gear, -1) <> 0) then
+ break;
+ Gear^.X:= Gear^.X - _1;
+ end;
+
+ colly:= (TestCollisionYwithGear(Gear, 1) <> 0);
+ end;
+
+
+end;
+
+////////////////////////////////////////////////////////////////////////////////
procedure doStepHedgehogMoving(Gear: PGear);
var isFalling, isUnderwater: boolean;
land: Word;
+ cnt: LongWord;
begin
if Gear^.Hedgehog^.Unplaced then
begin
@@ -888,7 +944,15 @@
if Gear^.dY.QWordValue > 8160437862 then
Gear^.dY.QWordValue:= 8160437862;
-isFalling:= (Gear^.dY.isNegative) or (TestCollisionYKick(Gear, 1) = 0);
+isFalling:= (Gear^.dY.isNegative);
+if (not isFalling) then
+ begin
+ // make sure we're not just stuck in wall
+ moveHedgehogOutOfWall(Gear);
+ // test for floor/obstacle below
+ isFalling:= (TestCollisionYKick(Gear, 1) = 0);
+ end;
+
if isFalling then
begin
land:= TestCollisionYKick(Gear, -1);
@@ -906,6 +970,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?
@@ -930,6 +995,7 @@
land:= TestCollisionYwithGear(Gear, 1);
if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) < _0_55.QWordValue) and ((land and lfIce) = 0)
and ((land and lfBouncy = 0) or (Gear^.State and gstCollision <> 0))
+ and (Gear^.Damage = 0)
and ((Gear^.State and gstHHJumping) <> 0) then
SetLittle(Gear^.dX);
@@ -1032,15 +1098,24 @@
else
begin
Gear^.State:= Gear^.State and (not gstMoving);
- while TestCollisionYWithGear(Gear,1) = 0 do
- Gear^.Y:= Gear^.Y+_1;
+ cnt:= 0;
+ while (cnt < 6) and (not CheckGearDrowning(Gear)) and (Gear <> nil) and (TestCollisionYWithGear(Gear,1) = 0) do
+ begin
+ Gear^.Y:= Gear^.Y + _1;
+ inc(cnt)
+ end;
+
SetLittle(Gear^.dX)
end
else
begin
Gear^.State:= Gear^.State and (not gstMoving);
- while TestCollisionYWithGear(Gear,1) = 0 do
- Gear^.Y:= Gear^.Y+_1;
+ cnt:= 0;
+ while (cnt < 6) and (not CheckGearDrowning(Gear)) and (Gear <> nil) and (TestCollisionYWithGear(Gear,1) = 0) do
+ begin
+ Gear^.Y:= Gear^.Y + _1;
+ inc(cnt)
+ end;
SetLittle(Gear^.dX)
end
else if (hwAbs(Gear^.dX) > cLittle)
@@ -1054,8 +1129,12 @@
begin
Gear^.State:= Gear^.State and (not gstWinner);
Gear^.State:= Gear^.State and (not gstMoving);
- while (not CheckGearDrowning(Gear)) and (Gear <> nil) and (TestCollisionYWithGear(Gear,1) = 0) do
+ cnt:= 0;
+ while (cnt < 6) and (not CheckGearDrowning(Gear)) and (Gear <> nil) and (TestCollisionYWithGear(Gear,1) = 0) do
+ begin
Gear^.Y:= Gear^.Y + _1;
+ inc(cnt)
+ end;
// could become nil in CheckGearDrowning if ai's hog fails to respawn in ai survival
if Gear = nil then exit;
@@ -1176,7 +1255,7 @@
HHGear^.Message:= HHGear^.Message or gmAttack;
// check for case with ammo
t:= CheckGearNear(HHGear, gtCase, 36, 36);
- if (t <> nil) and (t^.State and gstFrozen = 0) then
+ if (t <> nil) then
PickUp(HHGear, t)
end;
--- a/hedgewars/uGearsList.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGearsList.pas Fri Apr 01 15:36:19 2016 +0200
@@ -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);
@@ -149,7 +150,8 @@
AddFileLog('Attempted to remove Gear #'+inttostr(Gear^.uid)+' from the list twice.');
exit
end;
-TryDo((Gear = nil) or (curHandledGear = nil) or (Gear = curHandledGear), 'You''re doing it wrong', true);
+
+checkFails((Gear = nil) or (curHandledGear = nil) or (Gear = curHandledGear), 'You''re doing it wrong', true);
if Gear^.NextGear <> nil then
Gear^.NextGear^.PrevGear:= Gear^.PrevGear;
@@ -164,11 +166,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 +193,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;
@@ -207,6 +216,54 @@
gear^.Z:= cHHZ+1
else gear^.Z:= cUsualZ;
+case Kind of
+ gtFlame: Gear^.Boom := 2; // some additional expl in there are x3, x4 this
+ gtHedgehog: Gear^.Boom := 30;
+ gtMine: Gear^.Boom := 50;
+ gtCase: Gear^.Boom := 25;
+ gtAirMine: Gear^.Boom := 25;
+ gtExplosives: Gear^.Boom := 75;
+ gtGrenade: Gear^.Boom := 50;
+ gtShell: Gear^.Boom := 50;
+ gtBee: Gear^.Boom := 50;
+ gtShotgunShot: Gear^.Boom := 25;
+ gtPickHammer: Gear^.Boom := 6;
+// gtRope: Gear^.Boom := 2; could be funny to have rope attaching to hog deal small amount of dmg?
+ gtDEagleShot: Gear^.Boom := 7;
+ gtDynamite: Gear^.Boom := 75;
+ gtClusterBomb: Gear^.Boom := 20;
+ gtMelonPiece,
+ gtCluster: Gear^.Boom := Timer;
+ gtShover: Gear^.Boom := 30;
+ gtFirePunch: Gear^.Boom := 30;
+ gtAirBomb: Gear^.Boom := 30;
+ gtBlowTorch: Gear^.Boom := 2;
+ gtMortar: Gear^.Boom := 20;
+ gtWhip: Gear^.Boom := 30;
+ gtKamikaze: Gear^.Boom := 30; // both shove and explosion
+ gtCake: Gear^.Boom := cakeDmg; // why is cake damage a global constant
+ gtWatermelon: Gear^.Boom := 75;
+ gtHellishBomb: Gear^.Boom := 90;
+ gtDrill: if Gear^.State and gsttmpFlag = 0 then
+ Gear^.Boom := 50
+ else Gear^.Boom := 30;
+ gtBall: Gear^.Boom := 40;
+ gtRCPlane: Gear^.Boom := 25;
+// sniper rifle is distance linked, this Boom is just an arbitrary scaling factor applied to timer-based-damage
+// because, eh, why not..
+gtSniperRifleShot: Gear^.Boom := 100000;
+ gtEgg: Gear^.Boom := 10;
+ gtPiano: Gear^.Boom := 80;
+ gtGasBomb: Gear^.Boom := 20;
+ gtSineGunShot: Gear^.Boom := 35;
+ gtSMine: Gear^.Boom := 30;
+ gtSnowball: Gear^.Boom := 200000; // arbitrary scaling for the shove
+ gtHammer: if cDamageModifier > _1 then // scale it based on cDamageModifier?
+ Gear^.Boom := 2
+ else Gear^.Boom := 3;
+ gtPoisonCloud: Gear^.Boom := 20;
+ gtKnife: Gear^.Boom := 40000; // arbitrary scaling factor since impact-based
+ end;
case Kind of
gtGrenade,
@@ -319,6 +376,7 @@
gear^.nImpactSounds:= 1;
gear^.Radius:= 10;
gear^.Elasticity:= _0_6;
+ gear^.Z:= 1;
end;
gtBee: begin
gear^.Radius:= 5;
@@ -349,6 +407,7 @@
RopePoints.Count:= 0;
gear^.Tint:= $D8D8D8FF;
gear^.Tag:= 0; // normal rope render
+ gear^.CollisionMask:= lfNotObjMask or lfNotHHObjMask;
end;
gtMine: begin
gear^.ImpactSound:= sndMineImpact;
@@ -466,6 +525,8 @@
gear^.Tag:= Y
end;
gtAirAttack: begin
+ gear^.Health:= 6;
+ gear^.Damage:= 30;
gear^.Z:= cHHZ+2;
gear^.Tint:= gear^.Hedgehog^.Team^.Clan^.Color shl 8 or $FF
end;
--- a/hedgewars/uGearsRender.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGearsRender.pas Fri Apr 01 15:36:19 2016 +0200
@@ -728,7 +728,7 @@
amHellishBomb: DrawSpriteRotated(sprHandHellish, hx, hy, sign, aangle);
amGasBomb: DrawSpriteRotated(sprHandCheese, hx, hy, sign, aangle);
amMine: DrawSpriteRotated(sprHandMine, hx, hy, sign, aangle);
- amAirMine: DrawSpriteRotated(sprHandMine, hx, hy, sign, aangle);
+ amAirMine: DrawSpriteRotated(sprHandAirMine, hx, hy, sign, aangle);
amSMine: DrawSpriteRotated(sprHandSMine, hx, hy, sign, aangle);
amKnife: DrawSpriteRotatedF(sprHandKnife, hx, hy, 0, sign, aangle);
amSeduction: begin
@@ -846,6 +846,7 @@
end else // not gstHHDriven
begin
+ // check if hedgehog is sliding/rolling
if (Gear^.Damage > 0) and (HH^.Effects[heFrozen] = 0)
and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > _0_003) then
begin
@@ -855,6 +856,23 @@
2,
1,
Gear^.DirAngle);
+
+ // dust effect
+ // TODO fix: this gives different results based on framerate
+ if (sx mod 8) = 0 then
+ begin
+ if Gear^.dX.isNegative then
+ tx := hwRound(Gear^.X) + cHHRadius
+ else
+ tx := hwRound(Gear^.X) - cHHRadius;
+ ty:= hwRound(Gear^.Y) + cHHRadius + 2;
+ if ((tx and LAND_WIDTH_MASK) = 0) and
+ ((ty and LAND_HEIGHT_MASK) = 0) and
+ (Land[ty, tx] <> 0) then
+ AddVisualGear(tx - 2 + Random(4), ty - 8, vgtDust);
+ end;
+
+ // draw april's fool hat
if AprilOne and (curhat <> nil) then
DrawTextureRotatedF(curhat, 1.0, -1.0, 0, sx, sy, 18, sign, 32, 32,
sign*Gear^.DirAngle)
@@ -1250,7 +1268,29 @@
else
DrawSpriteRotatedF(sprExplosivesRoll, x, y + 4, 1, 0, Gear^.DirAngle)
end;
- gtDynamite: DrawSprite(sprDynamite, x - 16, y - 25, Gear^.Tag and 1, Gear^.Tag shr 1);
+ gtDynamite: begin
+ DrawSprite(sprDynamite, x - 16, y - 25, Gear^.Tag and 1, Gear^.Tag shr 1);
+ if (random(3) = 0) then
+ begin
+ vg:= AddVisualGear(hwRound(Gear^.X)+12-(Gear^.Tag shr 1), hwRound(Gear^.Y)-16, vgtStraightShot);
+ if vg <> nil then
+ with vg^ do
+ begin
+ Tint:= $FFCC00FF;
+ Angle:= random(360);
+ dx:= 0.0005 * (random(200));
+ dy:= 0.0005 * (random(200));
+ if random(2) = 0 then
+ dx := -dx;
+ if random(2) = 0 then
+ dy := -dy;
+ FrameTicks:= 100+random(300);
+ Scale:= 0.1+1/(random(3)+3);
+ State:= ord(sprStar)
+ end
+ end;
+
+ end;
gtClusterBomb: DrawSpriteRotated(sprClusterBomb, x, y, 0, Gear^.DirAngle);
gtCluster: DrawSprite(sprClusterParticle, x - 8, y - 8, 0);
gtFlame: if Gear^.Tag and 1 = 0 then
--- a/hedgewars/uGearsUtils.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uGearsUtils.pas Fri Apr 01 15:36:19 2016 +0200
@@ -829,7 +829,7 @@
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean);
var x: LongInt;
- y, sy: LongInt;
+ y, sy, dir: LongInt;
ar: array[0..1023] of TPoint;
ar2: array[0..2047] of TPoint;
temp: TPoint;
@@ -850,9 +850,10 @@
delta:= LAND_WIDTH div 16;
cnt2:= 0;
repeat
- x:= Left + max(LAND_WIDTH div 2048, LongInt(GetRandom(Delta)));
+ if GetRandom(2) = 0 then dir:= -1 else dir:= 1;
+ x:= max(LAND_WIDTH div 2048, LongInt(GetRandom(Delta)));
+ if dir = 1 then x:= Left + x else x:= Right - x;
repeat
- inc(x, Delta);
cnt:= 0;
y:= min(1024, topY) - Gear^.Radius shl 1;
while y < cWaterLine do
@@ -901,9 +902,10 @@
ar2[cnt2].x:= x;
ar2[cnt2].y:= y;
inc(cnt2)
- end
- end
- until (x + Delta > Right);
+ end;
+ end;
+ inc(x, Delta*dir)
+ until ((dir = 1) and (x > Right)) or ((dir = -1) and (x < Left));
dec(Delta, 60)
until (cnt2 > 0) or (Delta < 70);
@@ -925,13 +927,42 @@
AddFileLog('Assigned Gear coordinates (' + inttostr(x) + ',' + inttostr(y) + ')');
end
end
- else
+else
begin
OutError('Can''t find place for Gear', false);
if Gear^.Kind = gtHedgehog then
- Gear^.Hedgehog^.Effects[heResurrectable] := 0;
- DeleteGear(Gear);
- Gear:= nil
+ begin
+ cnt:= 0;
+ if GameTicks = 0 then
+ begin
+ //AddFileLog('Trying to make a hole');
+ while (cnt < 1000) do
+ begin
+ inc(cnt);
+ x:= leftX+GetRandom(rightX-leftX-32)+16;
+ y:= topY+GetRandom(LAND_HEIGHT-topY-64)+48;
+ if NoGearsToAvoid(x, y, 100 div max(1,cnt div 100), 100 div max(1,cnt div 100)) then
+ begin
+ Gear^.State:= Gear^.State or gsttmpFlag;
+ Gear^.X:= int2hwFloat(x);
+ Gear^.Y:= int2hwFloat(y);
+ AddFileLog('Picked a spot for hog at coordinates (' + inttostr(hwRound(Gear^.X)) + ',' + inttostr(hwRound(Gear^.Y)) + ')');
+ cnt:= 2000
+ end
+ end;
+ end;
+ if cnt < 2000 then
+ begin
+ Gear^.Hedgehog^.Effects[heResurrectable] := 0;
+ DeleteGear(Gear);
+ Gear:= nil
+ end
+ end
+ else
+ begin
+ DeleteGear(Gear);
+ Gear:= nil
+ end
end
end;
@@ -1072,7 +1103,7 @@
if r-hwRound(dx+dy) > 0 then
begin
dist:= hwRound(Distance(dx, dy));
- dmg:= ModifyDamage(min(r - dist, 25), t);
+ dmg:= ModifyDamage(min(r - dist, Gear^.Boom), t);
end;
if dmg > 0 then
begin
@@ -1100,7 +1131,7 @@
if r-hwRound(dx+dy) > 0 then
begin
dist:= hwRound(Distance(dx, dy));
- dmg:= ModifyDamage(min(r - dist, 25), t);
+ dmg:= ModifyDamage(min(r - dist, Gear^.Boom), t);
end;
if dmg > 0 then
begin
@@ -1139,6 +1170,8 @@
begin
dec(i);
Gear:= t^.ar[i];
+ if (Ammo^.Data <> nil) and (Ammo^.Kind in [gtDEagleShot, gtSniperRifleShot]) and (PGear(Ammo^.Data) = Gear) then
+ continue;
if ((Ammo^.Kind = gtFlame) or (Ammo^.Kind = gtBlowTorch)) and
(Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heFrozen] > 255) then
Gear^.Hedgehog^.Effects[heFrozen]:= max(255,Gear^.Hedgehog^.Effects[heFrozen]-10000);
@@ -1479,6 +1512,9 @@
if (hwRound(Gear^.X) < LongInt(leftX)) or
(hwRound(Gear^.X) > LongInt(rightX)) then
begin
+ // bullets can now hurt the hog that fired them
+ if (WorldEdge <> weSea) and (Gear^.Kind in [gtDEagleShot, gtSniperRifleShot]) then
+ Gear^.Data:= nil;
if WorldEdge = weWrap then
begin
if (hwRound(Gear^.X) < LongInt(leftX)) then
--- a/hedgewars/uIO.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uIO.pas Fri Apr 01 15:36:19 2016 +0200
@@ -72,28 +72,36 @@
function AddCmd(Time: Word; str: shortstring): PCmd;
var command: PCmd;
begin
-new(command);
-FillChar(command^, sizeof(TCmd), 0);
-command^.loTime:= Time;
-command^.str:= str;
-if (command^.cmd <> 'F') and (command^.cmd <> 'G') then dec(command^.len, 2); // cut timestamp
-if headcmd = nil then
+ if (lastcmd <> nil) and (lastcmd^.cmd = '+') then
+ begin
+ command:= lastcmd;
+ end else
begin
- headcmd:= command;
- lastcmd:= command
- end
-else
- begin
- lastcmd^.Next:= command;
- lastcmd:= command
+ new(command);
+
+ if headcmd = nil then
+ begin
+ headcmd:= command;
+ lastcmd:= command
+ end
+ else
+ begin
+ lastcmd^.Next:= command;
+ lastcmd:= command
+ end;
end;
-AddCmd:= command;
+
+ FillChar(command^, sizeof(TCmd), 0);
+ command^.loTime:= Time;
+ command^.str:= str;
+ if (command^.cmd <> 'F') and (command^.cmd <> 'G') then dec(command^.len, 2); // cut timestamp
+
+ AddCmd:= command;
end;
procedure RemoveCmd;
var tmp: PCmd;
begin
-TryDo(headcmd <> nil, 'Engine bug: headcmd = nil', true);
tmp:= headcmd;
headcmd:= headcmd^.Next;
if headcmd = nil then
@@ -105,16 +113,16 @@
var ipaddr: TIPAddress;
begin
WriteToConsole('Init SDL_Net... ');
- SDLTry(SDLNet_Init = 0, true);
+ SDLCheck(SDLNet_Init = 0, 'SDLNet_Init', true);
fds:= SDLNet_AllocSocketSet(1);
- SDLTry(fds <> nil, true);
+ SDLCheck(fds <> nil, 'SDLNet_AllocSocketSet', true);
WriteLnToConsole(msgOK);
WriteToConsole('Establishing IPC connection to tcp 127.0.0.1:' + IntToStr(ipcPort) + ' ');
{$HINTS OFF}
- SDLTry(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, true);
+ SDLCheck(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, 'SDLNet_ResolveHost', true);
{$HINTS ON}
IPCSock:= SDLNet_TCP_Open(ipaddr);
- SDLTry(IPCSock <> nil, true);
+ SDLCheck(IPCSock <> nil, 'SDLNet_TCP_Open', true);
WriteLnToConsole(msgOK)
end;
@@ -163,7 +171,6 @@
ParseChatCommand('chatmsg ' + #4, s, 2)
else
isProcessed:= false;
- 'Y': ChatPasteBuffer:= copy(s, 2, Length(s) - 1);
else
isProcessed:= false;
end;
@@ -216,7 +223,8 @@
{$I-}
assign(f, fileName);
reset(f, 1);
-tryDo(IOResult = 0, 'Error opening file ' + fileName, true);
+if checkFails(IOResult = 0, 'Error opening file ' + fileName, true) then
+ exit;
i:= 0; // avoid compiler hints
s[0]:= #0;
@@ -226,13 +234,13 @@
begin
s[0]:= char(i);
ss:= ss + s;
- while (Length(ss) > 1)and(Length(ss) > byte(ss[1])) do
+ while (Length(ss) > 1)and(Length(ss) > byte(ss[1])) and allOK do
begin
ParseIPCCommand(copy(ss, 2, byte(ss[1])));
Delete(ss, 1, Succ(byte(ss[1])));
end
end
-until i = 0;
+until (i = 0) or (not allOK);
close(f)
{$I+}
@@ -320,7 +328,7 @@
repeat
IPCCheckSock;
SDL_Delay(1)
-until isPonged
+until isPonged or (not allOK)
end;
procedure SendIPCAndWaitReply(s: shortstring);
@@ -427,7 +435,7 @@
end;
if (headcmd <> nil) and tmpflag and (not CurrentTeam^.hasGone) then
- TryDo(GameTicks < LongWord(hiTicks shl 16) + headcmd^.loTime,
+ checkFails(GameTicks < LongWord(hiTicks shl 16) + headcmd^.loTime,
'oops, queue error. in buffer: ' + headcmd^.cmd +
' (' + IntToStr(GameTicks) + ' > ' +
IntToStr(hiTicks shl 16 + headcmd^.loTime) + ')',
@@ -504,6 +512,7 @@
RegisterVariable('fatal', @chFatalError, true );
IPCSock:= nil;
+ fds:= nil;
headcmd:= nil;
lastcmd:= nil;
--- a/hedgewars/uInputHandler.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uInputHandler.pas Fri Apr 01 15:36:19 2016 +0200
@@ -30,10 +30,12 @@
//procedure MaskModifier(var code: LongInt; modifier: LongWord);
procedure MaskModifier(Modifier: shortstring; var code: LongInt);
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
+procedure ProcessMouseWheel(x, y: LongInt);
procedure ProcessKey(event: TSDL_KeyboardEvent); inline;
procedure ProcessKey(code: LongInt; KeyDown: boolean);
procedure ResetKbd;
+procedure ResetMouseWheel;
procedure FreezeEnterKey;
procedure InitKbdKeyTable;
@@ -82,8 +84,8 @@
var code: LongInt;
begin
name:= LowerCase(name);
- code:= cKeyMaxIndex;
- while (code > 0) and (KeyNames[code] <> name) do dec(code);
+ code:= 0;
+ while (code <= cKeyMaxIndex) and (KeyNames[code] <> name) do inc(code);
MaskModifier(Modifier, code);
KeyNameToCode:= code;
@@ -168,7 +170,13 @@
if CurrentBinds[code][0] <> #0 then
begin
- if (code > 3) and KeyDown and (not ((CurrentBinds[code] = 'put')) or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r')) and (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) then bShowAmmoMenu:= false;
+ if (code < cKeyMaxIndex - 2) // means not mouse buttons
+ and KeyDown
+ and (not ((CurrentBinds[code] = 'put')) or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r'))
+ and (CurrentTeam <> nil)
+ and (not CurrentTeam^.ExtDriven)
+ then bShowAmmoMenu:= false;
+
if KeyDown then
begin
Trusted:= Trusted and (not isPaused); //releasing keys during pause should be allowed on the other hand
@@ -203,25 +211,56 @@
procedure ProcessKey(event: TSDL_KeyboardEvent); inline;
var code: LongInt;
begin
- code:= event.keysym.sym;
- //MaskModifier(code, event.keysym.modifier);
+ // TODO
+ code:= LongInt(event.keysym.scancode);
+ //writelntoconsole('[KEY] '+inttostr(code)+ ' -> ''' +KeyNames[code] + ''', type = '+inttostr(event.type_));
ProcessKey(code, event.type_ = SDL_KEYDOWN);
end;
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
begin
-case event.button of
- SDL_BUTTON_LEFT:
- ProcessKey(KeyNameToCode('mousel'), ButtonDown);
- SDL_BUTTON_MIDDLE:
- ProcessKey(KeyNameToCode('mousem'), ButtonDown);
- SDL_BUTTON_RIGHT:
- ProcessKey(KeyNameToCode('mouser'), ButtonDown);
- SDL_BUTTON_WHEELDOWN:
- ProcessKey(KeyNameToCode('wheeldown'), ButtonDown);
- SDL_BUTTON_WHEELUP:
- ProcessKey(KeyNameToCode('wheelup'), ButtonDown);
- end;
+ //writelntoconsole('[MOUSE] '+inttostr(event.button));
+ case event.button of
+ SDL_BUTTON_LEFT:
+ ProcessKey(KeyNameToCode('mousel'), ButtonDown);
+ SDL_BUTTON_MIDDLE:
+ ProcessKey(KeyNameToCode('mousem'), ButtonDown);
+ SDL_BUTTON_RIGHT:
+ ProcessKey(KeyNameToCode('mouser'), ButtonDown);
+ end;
+end;
+
+var mwheelupCode, mwheeldownCode: Integer;
+
+procedure ProcessMouseWheel(x, y: LongInt);
+begin
+ //writelntoconsole('[MOUSEWHEEL] '+inttostr(x)+', '+inttostr(y));
+ if y > 0 then
+ begin
+ // reset other direction
+ if tkbd[mwheeldownCode] then
+ ProcessKey(mwheeldownCode, false);
+ // trigger "button down" event
+ if (not tkbd[mwheelupCode]) then
+ ProcessKey(mwheelupCode, true);
+ end
+ else if y < 0 then
+ begin
+ // reset other direction
+ if tkbd[mwheelupCode] then
+ ProcessKey(mwheelupCode, false);
+ // trigger "button down" event
+ if (not tkbd[mwheeldownCode]) then
+ ProcessKey(mwheeldownCode, true);
+ end;
+end;
+
+procedure ResetMouseWheel();
+begin
+ if tkbd[mwheelupCode] then
+ ProcessKey(mwheelupCode, false);
+ if tkbd[mwheeldownCode] then
+ ProcessKey(mwheeldownCode, false);
end;
procedure ResetKbd;
@@ -232,125 +271,133 @@
ProcessKey(t, False);
end;
+
+procedure InitDefaultBinds;
+var i: Longword;
+begin
+ DefaultBinds[KeyNameToCode('escape')]:= 'quit';
+ DefaultBinds[KeyNameToCode(_S'`')]:= 'history';
+ DefaultBinds[KeyNameToCode('delete')]:= 'rotmask';
+
+ //numpad
+ //DefaultBinds[265]:= '+volup';
+ //DefaultBinds[256]:= '+voldown';
+
+ DefaultBinds[KeyNameToCode(_S'0')]:= '+volup';
+ DefaultBinds[KeyNameToCode(_S'9')]:= '+voldown';
+ DefaultBinds[KeyNameToCode(_S'8')]:= 'mute';
+ DefaultBinds[KeyNameToCode(_S'c')]:= 'capture';
+ DefaultBinds[KeyNameToCode(_S'r')]:= 'record';
+ DefaultBinds[KeyNameToCode(_S'h')]:= 'findhh';
+ DefaultBinds[KeyNameToCode(_S'p')]:= 'pause';
+ DefaultBinds[KeyNameToCode(_S's')]:= '+speedup';
+ DefaultBinds[KeyNameToCode(_S't')]:= 'chat';
+ DefaultBinds[KeyNameToCode(_S'y')]:= 'confirm';
+
+ DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset';
+ DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomin';
+ DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomout';
+
+ DefaultBinds[KeyNameToCode('f12')]:= 'fullscr';
+
+
+ DefaultBinds[KeyNameToCode('mousel')]:= '/put';
+ DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu';
+ DefaultBinds[KeyNameToCode('backspace')]:= 'hjump';
+ DefaultBinds[KeyNameToCode('tab')]:= 'switch';
+ DefaultBinds[KeyNameToCode('return')]:= 'ljump';
+ DefaultBinds[KeyNameToCode('space')]:= '+attack';
+ DefaultBinds[KeyNameToCode('up')]:= '+up';
+ DefaultBinds[KeyNameToCode('down')]:= '+down';
+ DefaultBinds[KeyNameToCode('left')]:= '+left';
+ DefaultBinds[KeyNameToCode('right')]:= '+right';
+ DefaultBinds[KeyNameToCode('left_shift')]:= '+precise';
+
+
+ DefaultBinds[KeyNameToCode('j0a0u')]:= '+left';
+ DefaultBinds[KeyNameToCode('j0a0d')]:= '+right';
+ DefaultBinds[KeyNameToCode('j0a1u')]:= '+up';
+ DefaultBinds[KeyNameToCode('j0a1d')]:= '+down';
+ for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+IntToStr(i);
+ for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i);
+
+ loadBinds('dbind', cPathz[ptData] + '/settings.ini');
+end;
+
+
procedure InitKbdKeyTable;
var i, j, k, t: LongInt;
s: string[15];
begin
-//TODO in sdl13 this overrides some values (A and B) change indices to some other values at the back perhaps?
-KeyNames[1]:= 'mousel';
-KeyNames[2]:= 'mousem';
-KeyNames[3]:= 'mouser';
-KeyNames[4]:= 'wheelup';
-KeyNames[5]:= 'wheeldown';
+ KeyNames[cKeyMaxIndex ]:= 'mousel';
+ KeyNames[cKeyMaxIndex - 1]:= 'mousem';
+ KeyNames[cKeyMaxIndex - 2]:= 'mouser';
+ mwheelupCode:= cKeyMaxIndex - 3;
+ KeyNames[mwheelupCode]:= 'wheelup';
+ mwheeldownCode:= cKeyMaxIndex - 4;
+ KeyNames[mwheeldownCode]:= 'wheeldown';
-for i:= 6 to cKeyMaxIndex do
- begin
- s:= shortstring(sdl_getkeyname(i));
- //WriteLnToConsole('uInputHandler - ' + IntToStr(i) + ': ' + s + ' ' + IntToStr(cKeyMaxIndex));
- if s = 'unknown key' then KeyNames[i]:= ''
- else
+ for i:= 0 to cKeyMaxIndex - 5 do
begin
+ s:= shortstring(SDL_GetScancodeName(TSDL_Scancode(i)));
+
for t:= 1 to Length(s) do
if s[t] = ' ' then
s[t]:= '_';
KeyNames[i]:= LowerCase(s)
end;
- end;
-// get the size of keyboard array
-SDL_GetKeyState(@k);
+ // get the size of keyboard array
+ SDL_GetKeyboardState(@k);
-// Controller(s)
-for j:= 0 to Pred(ControllerNumControllers) do
- begin
- for i:= 0 to Pred(ControllerNumAxes[j]) do
+ // Controller(s)
+ for j:= 0 to Pred(ControllerNumControllers) do
begin
- keynames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u';
- keynames[k + 1]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'd';
- inc(k, 2);
- end;
- for i:= 0 to Pred(ControllerNumHats[j]) do
- begin
- keynames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u';
- keynames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r';
- keynames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd';
- keynames[k + 3]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'l';
- inc(k, 4);
- end;
- for i:= 0 to Pred(ControllerNumButtons[j]) do
- begin
- keynames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i);
- inc(k, 1);
+ for i:= 0 to Pred(ControllerNumAxes[j]) do
+ begin
+ KeyNames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u';
+ KeyNames[k + 1]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'd';
+ inc(k, 2);
+ end;
+ for i:= 0 to Pred(ControllerNumHats[j]) do
+ begin
+ KeyNames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u';
+ KeyNames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r';
+ KeyNames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd';
+ KeyNames[k + 3]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'l';
+ inc(k, 4);
+ end;
+ for i:= 0 to Pred(ControllerNumButtons[j]) do
+ begin
+ KeyNames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i);
+ inc(k, 1);
+ end;
end;
- end;
-DefaultBinds[KeyNameToCode('escape')]:= 'quit';
-DefaultBinds[KeyNameToCode(_S'`')]:= 'history';
-DefaultBinds[KeyNameToCode('delete')]:= 'rotmask';
-
-//numpad
-//DefaultBinds[265]:= '+volup';
-//DefaultBinds[256]:= '+voldown';
-
-DefaultBinds[KeyNameToCode(_S'0')]:= '+volup';
-DefaultBinds[KeyNameToCode(_S'9')]:= '+voldown';
-DefaultBinds[KeyNameToCode(_S'8')]:= 'mute';
-DefaultBinds[KeyNameToCode(_S'c')]:= 'capture';
-DefaultBinds[KeyNameToCode(_S'r')]:= 'record';
-DefaultBinds[KeyNameToCode(_S'h')]:= 'findhh';
-DefaultBinds[KeyNameToCode(_S'p')]:= 'pause';
-DefaultBinds[KeyNameToCode(_S's')]:= '+speedup';
-DefaultBinds[KeyNameToCode(_S't')]:= 'chat';
-DefaultBinds[KeyNameToCode(_S'y')]:= 'confirm';
-
-DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset';
-DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomin';
-DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomout';
-
-DefaultBinds[KeyNameToCode('f12')]:= 'fullscr';
+ InitDefaultBinds
+end;
-DefaultBinds[KeyNameToCode('mousel')]:= '/put';
-DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu';
-DefaultBinds[KeyNameToCode('backspace')]:= 'hjump';
-DefaultBinds[KeyNameToCode('tab')]:= 'switch';
-DefaultBinds[KeyNameToCode('return')]:= 'ljump';
-DefaultBinds[KeyNameToCode('space')]:= '+attack';
-DefaultBinds[KeyNameToCode('up')]:= '+up';
-DefaultBinds[KeyNameToCode('down')]:= '+down';
-DefaultBinds[KeyNameToCode('left')]:= '+left';
-DefaultBinds[KeyNameToCode('right')]:= '+right';
-DefaultBinds[KeyNameToCode('left_shift')]:= '+precise';
-
-DefaultBinds[KeyNameToCode('j0a0u')]:= '+left';
-DefaultBinds[KeyNameToCode('j0a0d')]:= '+right';
-DefaultBinds[KeyNameToCode('j0a1u')]:= '+up';
-DefaultBinds[KeyNameToCode('j0a1d')]:= '+down';
-for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+char(i+48);
-for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i);
-
-loadBinds('dbind', cPathz[ptData] + '/settings.ini');
-end;
-
+{$IFNDEF MOBILE}
procedure SetBinds(var binds: TBinds);
-{$IFNDEF MOBILE}
var
t: LongInt;
-{$ENDIF}
begin
-{$IFDEF MOBILE}
- binds:= binds; // avoid hint
- CurrentBinds:= DefaultBinds;
-{$ELSE}
for t:= 0 to cKbdMaxIndex do
if (CurrentBinds[t] <> binds[t]) and tkbd[t] then
ProcessKey(t, False);
CurrentBinds:= binds;
+end;
+{$ELSE}
+procedure SetBinds(var binds: TBinds);
+begin
+ binds:= binds; // avoid hint
+ CurrentBinds:= DefaultBinds;
+end;
{$ENDIF}
-end;
procedure SetDefaultBinds;
begin
@@ -438,7 +485,7 @@
var
k: LongInt;
begin
- SDL_GetKeyState(@k);
+ SDL_GetKeyboardState(@k);
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2);
ProcessKey(k + axis*2, value > 20000);
ProcessKey(k + (axis*2)+1, value < -20000);
@@ -448,7 +495,7 @@
var
k: LongInt;
begin
- SDL_GetKeyState(@k);
+ SDL_GetKeyboardState(@k);
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2);
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 0, (value and SDL_HAT_UP) <> 0);
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 1, (value and SDL_HAT_RIGHT)<> 0);
@@ -460,7 +507,7 @@
var
k: LongInt;
begin
- SDL_GetKeyState(@k);
+ SDL_GetKeyboardState(@k);
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2);
ProcessKey(k + ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + button, pressed);
end;
@@ -572,6 +619,10 @@
procedure initModule;
begin
+ // assign 0 until InitKbdKeyTable is called
+ mwheelupCode:= 0;
+ mwheeldownCode:= 0;
+
RegisterVariable('dbind', @chDefaultBind, true );
end;
--- a/hedgewars/uLand.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uLand.pas Fri Apr 01 15:36:19 2016 +0200
@@ -260,10 +260,10 @@
var x, y: LongInt;
p: PLongwordArray;
begin
-TryDo(Surface <> nil, 'Assert (LandSurface <> nil) failed', true);
+if checkFails(Surface <> nil, 'Assert (LandSurface <> nil) failed', true) then exit;
if SDL_MustLock(Surface) then
- SDLTry(SDL_LockSurface(Surface) >= 0, true);
+ if SDLCheck(SDL_LockSurface(Surface) >= 0, 'SDL_LockSurface', true) then exit;
p:= Surface^.pixels;
for y:= 0 to LAND_HEIGHT - 1 do
@@ -271,9 +271,9 @@
for x:= 0 to LAND_WIDTH - 1 do
if Land[y, x] <> 0 then
if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[y, x]:= p^[x] or AMask
+ LandPixels[y, x]:= p^[x]// or AMask
else
- LandPixels[y div 2, x div 2]:= p^[x] or AMask;
+ LandPixels[y div 2, x div 2]:= p^[x];// or AMask;
p:= PLongwordArray(@(p^[Surface^.pitch div 4]));
end;
@@ -289,9 +289,9 @@
begin
AddProgress();
- tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, LAND_WIDTH, LAND_HEIGHT, 32, RMask, GMask, BMask, 0);
+ tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, LAND_WIDTH, LAND_HEIGHT, 32, RMask, GMask, BMask, AMask);
- TryDo(tmpsurf <> nil, 'Error creating pre-land surface', true);
+ if checkFails(tmpsurf <> nil, 'Error creating pre-land surface', true) then exit;
ColorizeLand(tmpsurf);
if gameFlags and gfShoppaBorder = 0 then DrawBorderFromImage(tmpsurf);
AddOnLandObjects(tmpsurf);
@@ -451,8 +451,10 @@
cpX:= (LAND_WIDTH - tmpsurf^.w) div 2;
cpY:= LAND_HEIGHT - tmpsurf^.h;
if SDL_MustLock(tmpsurf) then
- SDLTry(SDL_LockSurface(tmpsurf) >= 0, true);
+ SDLCheck(SDL_LockSurface(tmpsurf) >= 0, 'SDL_LockSurface', true);
+ if allOK then
+ begin
p:= tmpsurf^.pixels;
for y:= 0 to Pred(tmpsurf^.h) do
begin
@@ -461,15 +463,16 @@
p:= PLongwordArray(@(p^[tmpsurf^.pitch div 4]));
end;
- if SDL_MustLock(tmpsurf) then
- SDL_UnlockSurface(tmpsurf);
- if not disableLandBack then
- begin
- // freed in freeModule() below
- LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent);
- if (LandBackSurface <> nil) and GrayScale then
- Surface2GrayScale(LandBackSurface)
- end;
+ if SDL_MustLock(tmpsurf) then
+ SDL_UnlockSurface(tmpsurf);
+ if not disableLandBack then
+ begin
+ // freed in freeModule() below
+ LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent);
+ if (LandBackSurface <> nil) and GrayScale then
+ Surface2GrayScale(LandBackSurface)
+ end;
+ end;
end;
if (tmpsurf <> nil) then
SDL_FreeSurface(tmpsurf);
@@ -487,9 +490,11 @@
begin
mapName:= ExtractFileName(cPathz[ptMapCurrent]);
tmpsurf:= LoadDataImage(ptMissionMaps, mapName + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps);
+ if not allOK then exit;
end;
// (bare) Sanity check. Considering possible LongInt comparisons as well as just how much system memoery it would take
-TryDo((tmpsurf^.w < $40000000) and (tmpsurf^.h < $40000000) and (QWord(tmpsurf^.w) * tmpsurf^.h < 6*1024*1024*1024), 'Map dimensions too big!', true);
+if checkFails((tmpsurf^.w < $40000000) and (tmpsurf^.h < $40000000) and (QWord(tmpsurf^.w) * tmpsurf^.h < 6*1024*1024*1024), 'Map dimensions too big!', true)
+ then exit;
ResizeLand(tmpsurf^.w, tmpsurf^.h);
LoadMapConfig;
@@ -500,16 +505,16 @@
rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1;
topY:= LAND_HEIGHT - playHeight;
-TryDo(tmpsurf^.format^.BytesPerPixel = 4, 'Map should be 32bit', true);
+if not checkFails(tmpsurf^.format^.BytesPerPixel = 4, 'Map should be 32bit', true) then
+ BlitImageAndGenerateCollisionInfo(
+ (LAND_WIDTH - tmpsurf^.w) div 2,
+ LAND_HEIGHT - tmpsurf^.h,
+ tmpsurf^.w,
+ tmpsurf);
-BlitImageAndGenerateCollisionInfo(
- (LAND_WIDTH - tmpsurf^.w) div 2,
- LAND_HEIGHT - tmpsurf^.h,
- tmpsurf^.w,
- tmpsurf);
SDL_FreeSurface(tmpsurf);
-LoadMask;
+if allOK then LoadMask;
end;
procedure DrawBottomBorder; // broken out from other borders for doing a floor-only map, or possibly updating bottom during SD
@@ -663,6 +668,8 @@
FreeLandObjects;
+if not allOK then exit;
+
if GrayScale then
begin
if (cReducedQuality and rqBlurryLand) = 0 then
@@ -794,7 +801,7 @@
if digest = '' then
digest:= s
else
- TryDo(s = digest, 'Different maps generated, sorry', true);
+ checkFails(s = digest, 'Different maps generated, sorry', true);
end;
procedure chSendLandDigest(var s: shortstring);
@@ -808,7 +815,7 @@
ScriptSetString('LandDigest', s);
chLandCheck(s);
- SendIPCRaw(@s[0], Length(s) + 1)
+ if allOK then SendIPCRaw(@s[0], Length(s) + 1)
end;
procedure initModule;
--- a/hedgewars/uLandGenTemplateBased.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uLandGenTemplateBased.pas Fri Apr 01 15:36:19 2016 +0200
@@ -9,7 +9,7 @@
var minDistance, dabDiv: LongInt; // different details size
implementation
-uses uVariables, uConsts, uFloat, uLandUtils, uRandom, SDLh, math;
+uses {$IFDEF IPHONEOS}uTypes, {$ENDIF} uVariables, 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;
--- a/hedgewars/uLandGraphics.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uLandGraphics.pas Fri Apr 01 15:36:19 2016 +0200
@@ -23,7 +23,7 @@
uses uFloat, uConsts, uTypes, Math, uRenderUtils;
type
- fillType = (nullPixel, backgroundPixel, ebcPixel, icePixel, setNotCurrentMask, changePixelSetNotCurrent, setCurrentHog, changePixelNotSetNotCurrent);
+ fillType = (nullPixel, backgroundPixel, ebcPixel, icePixel, addNotHHObj, removeNotHHObj, addHH, removeHH, setCurrentHog, removeCurrentHog);
type TRangeArray = array[0..31] of record
Left, Right: LongInt;
@@ -41,7 +41,7 @@
procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt);
function FillRoundInLand(X, Y, Radius: LongInt; Value: Longword): Longword;
function FillRoundInLandFT(X, Y, Radius: LongInt; fill: fillType): Longword;
-procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean);
+procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent, isHH: boolean);
function LandBackPixel(x, y: LongInt): LongWord;
procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword);
function DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword): Longword;
@@ -209,15 +209,28 @@
calculatePixelsCoordinates(i, y, px, py);
DrawPixelIce(i, y, px, py);
end;
- setNotCurrentMask:
+ addNotHHObj:
+ for i:= fromPix to toPix do
+ begin
+ if Land[y, i] and lfNotHHObjMask shr lfNotHHObjShift < lfNotHHObjSize then
+ Land[y, i]:= (Land[y, i] and (not lfNotHHObjMask)) or ((Land[y, i] and lfNotHHObjMask shr lfNotHHObjShift + 1) shl lfNotHHObjShift);
+ end;
+ removeNotHHObj:
for i:= fromPix to toPix do
begin
- Land[y, i]:= Land[y, i] and lfNotCurrentMask;
+ if Land[y, i] and lfNotHHObjMask <> 0 then
+ Land[y, i]:= (Land[y, i] and (not lfNotHHObjMask)) or ((Land[y, i] and lfNotHHObjMask shr lfNotHHObjShift - 1) shl lfNotHHObjShift);
end;
- changePixelSetNotCurrent:
+ addHH:
for i:= fromPix to toPix do
begin
- if Land[y, i] and lfObjMask > 0 then
+ if Land[y, i] and lfHHMask < lfHHMask then
+ Land[y, i]:= Land[y, i] + 1
+ end;
+ removeHH:
+ for i:= fromPix to toPix do
+ begin
+ if Land[y, i] and lfHHMask > 0 then
Land[y, i]:= Land[y, i] - 1;
end;
setCurrentHog:
@@ -225,11 +238,10 @@
begin
Land[y, i]:= Land[y, i] or lfCurrentHog
end;
- changePixelNotSetNotCurrent:
+ removeCurrentHog:
for i:= fromPix to toPix do
begin
- if Land[y, i] and lfObjMask < lfObjMask then
- Land[y, i]:= Land[y, i] + 1
+ Land[y, i]:= Land[y, i] and lfNotCurrentMask;
end;
end;
end;
@@ -360,16 +372,20 @@
inc(FillRoundInLand, FillCircleLines(x, y, dx, dy, Value));
end;
-procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean);
+procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent, isHH: boolean);
begin
if not doSet and isCurrent then
- FillRoundInLandFT(X, Y, Radius, setNotCurrentMask)
-else if not doSet and (not IsCurrent) then
- FillRoundInLandFT(X, Y, Radius, changePixelSetNotCurrent)
+ FillRoundInLandFT(X, Y, Radius, removeCurrentHog)
+else if (not doSet) and (not IsCurrent) and isHH then
+ FillRoundInLandFT(X, Y, Radius, removeHH)
+else if (not doSet) and (not IsCurrent) and (not isHH) then
+ FillRoundInLandFT(X, Y, Radius, removeNotHHObj)
else if doSet and IsCurrent then
FillRoundInLandFT(X, Y, Radius, setCurrentHog)
-else if doSet and (not IsCurrent) then
- FillRoundInLandFT(X, Y, Radius, changePixelNotSetNotCurrent);
+else if doSet and (not IsCurrent) and isHH then
+ FillRoundInLandFT(X, Y, Radius, addHH)
+else if doSet and (not IsCurrent) and (not isHH) then
+ FillRoundInLandFT(X, Y, Radius, addNotHHObj);
end;
procedure DrawIceBreak(x, y, iceRadius, iceHeight: Longint);
@@ -693,7 +709,6 @@
begin
ForcePlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, true, false, true, behind, flipHoriz, flipVert, LandFlags, Tint)
end;
-
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, outOfMap, force, behind, flipHoriz, flipVert: boolean; LandFlags: Word; Tint: LongWord): boolean;
var X, Y, bpp, h, w, row, col, gx, gy, numFramesFirstCol: LongInt;
p: PByteArray;
@@ -705,7 +720,7 @@
if outOfMap then doPlace:= false; // just using for a check
-TryDo(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true);
+if checkFails(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true) then exit;
Image:= SpritesData[Obj].Surface;
w:= SpritesData[Obj].Width;
@@ -716,10 +731,15 @@
col:= Frame div numFramesFirstCol;
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ if SDLCheck(SDL_LockSurface(Image) >= 0, 'TryPlaceOnLand', true) then exit;
bpp:= Image^.format^.BytesPerPixel;
-TryDo(bpp = 4, 'It should be 32 bpp sprite', true);
+if checkFails(bpp = 4, 'It should be 32 bpp sprite', true) then
+begin
+ if SDL_MustLock(Image) then
+ SDL_UnlockSurface(Image);
+ exit
+end;
// Check that sprite fits free space
p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ]));
case bpp of
@@ -760,7 +780,7 @@
begin
for x:= 0 to Pred(w) do
if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then
- begin
+ begin
if (cReducedQuality and rqBlurryLand) = 0 then
begin
gX:= cpX + x;
@@ -771,15 +791,15 @@
gX:= (cpX + x) div 2;
gY:= (cpY + y) div 2;
end;
- if not behind or (Land[cpY + y, cpX + x] and lfLandMask = 0) then
+ if (not behind) or (Land[cpY + y, cpX + x] and lfLandMask = 0) then
begin
if (LandFlags and lfBasic <> 0) or
- (((LandPixels[gY, gX] and AMask) shr AShift = 255) and // This test assumes lfBasic and lfObject differ only graphically
- (LandFlags or lfObject = 0)) then
+ ((LandPixels[gY, gX] and AMask shr AShift > 128) and // This test assumes lfBasic and lfObject differ only graphically
+ (LandFlags and lfObject = 0)) then
Land[cpY + y, cpX + x]:= lfBasic or LandFlags
else Land[cpY + y, cpX + x]:= lfObject or LandFlags
end;
- if not behind or (LandPixels[gY, gX] = 0) then
+ if (not behind) or (LandPixels[gY, gX] = 0) then
begin
if tint = $FFFFFFFF then
LandPixels[gY, gX]:= PLongword(@(p^[x * 4]))^
@@ -824,7 +844,7 @@
begin
numFramesFirstCol:= SpritesData[Obj].imageHeight div SpritesData[Obj].Height;
-TryDo(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true);
+if checkFails(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true) then exit;
Image:= SpritesData[Obj].Surface;
w:= SpritesData[Obj].Width;
@@ -835,14 +855,19 @@
col:= Frame div numFramesFirstCol;
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ if SDLCheck(SDL_LockSurface(Image) >= 0, 'EraseLand', true) then exit;
bpp:= Image^.format^.BytesPerPixel;
-TryDo(bpp = 4, 'It should be 32 bpp sprite', true);
+if checkFails(bpp = 4, 'It should be 32 bpp sprite', true) then
+begin
+ if SDL_MustLock(Image) then
+ SDL_UnlockSurface(Image);
+ exit
+end;
// Check that sprite fits free space
p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ]));
-case bpp of
- 4: for y:= 0 to Pred(h) do
+
+ for y:= 0 to Pred(h) do
begin
for x:= 0 to Pred(w) do
if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then
@@ -854,13 +879,11 @@
exit
end;
p:= PByteArray(@(p^[Image^.pitch]))
- end
- end;
+ end;
// Checked, now place
p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ]));
-case bpp of
- 4: for y:= 0 to Pred(h) do
+ for y:= 0 to Pred(h) do
begin
for x:= 0 to Pred(w) do
if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then
@@ -875,7 +898,7 @@
gX:= (cpX + x) div 2;
gY:= (cpY + y) div 2;
end;
- if (not eraseOnLFMatch or (Land[cpY + y, cpX + x] and LandFlags <> 0)) and
+ if (not eraseOnLFMatch or (Land[cpY + y, cpX + x] and LandFlags <> 0)) and
((PLongword(@(p^[x * 4]))^) and AMask <> 0) then
begin
if not onlyEraseLF then
@@ -888,7 +911,6 @@
end;
p:= PByteArray(@(p^[Image^.pitch]));
end;
- end;
if SDL_MustLock(Image) then
SDL_UnlockSurface(Image);
@@ -910,7 +932,7 @@
GetPlaceCollisionTex:= nil;
numFramesFirstCol:= SpritesData[Obj].imageHeight div SpritesData[Obj].Height;
-TryDo(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true);
+checkFails(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true);
Image:= SpritesData[Obj].Surface;
w:= SpritesData[Obj].Width;
h:= SpritesData[Obj].Height;
@@ -918,19 +940,32 @@
col:= Frame div numFramesFirstCol;
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ if SDLCheck(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true) then
+ exit;
bpp:= Image^.format^.BytesPerPixel;
-TryDo(bpp = 4, 'It should be 32 bpp sprite', true);
+checkFails(bpp = 4, 'It should be 32 bpp sprite', true);
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RMask, GMask, BMask, AMask);
-TryDo(finalSurface <> nil, 'GetPlaceCollisionTex: fail to create surface', true);
+checkFails(finalSurface <> nil, 'GetPlaceCollisionTex: fail to create surface', true);
if SDL_MustLock(finalSurface) then
- SDLTry(SDL_LockSurface(finalSurface) >= 0, true);
+ SDLCheck(SDL_LockSurface(finalSurface) >= 0, 'GetPlaceCollisionTex', true);
+
+if not allOK then
+ begin
+ if SDL_MustLock(Image) then
+ SDL_UnlockSurface(Image);
+
+ if SDL_MustLock(finalSurface) then
+ SDL_UnlockSurface(finalSurface);
+
+ if finalSurface <> nil then
+ SDL_FreeSurface(finalSurface);
+ end;
p:= PLongWordArray(@(PLongWordArray(Image^.pixels)^[ (Image^.pitch div 4) * row * h + col * w ]));
pt:= PLongWordArray(finalSurface^.pixels);
@@ -978,7 +1013,7 @@
yy:= Y div 2;
end;
- pixelsweep:= (Land[Y, X] <= lfAllObjMask) and ((LandPixels[yy, xx] and AMASK) <> 0);
+ pixelsweep:= (Land[Y, X] <= lfAllObjMask) and ((LandPixels[yy, xx] and AMask) <> 0);
if (((Land[Y, X] and lfDamaged) <> 0) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
begin
c:= 0;
--- a/hedgewars/uLandObjects.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uLandObjects.pas Fri Apr 01 15:36:19 2016 +0200
@@ -109,10 +109,14 @@
WriteToConsole('Generating collision info... ');
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ if SDLCheck(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true) then exit;
bpp:= Image^.format^.BytesPerPixel;
-TryDo(bpp = 4, 'Land object should be 32bit', true);
+if checkFails(bpp = 4, 'Land object should be 32bit', true) then
+begin
+if SDL_MustLock(Image) then
+ SDL_UnlockSurface(Image);
+end;
if Width = 0 then
Width:= Image^.w;
@@ -160,10 +164,14 @@
WriteToConsole('Generating collision info... ');
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ if SDLCheck(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true) then exit;
bpp:= Image^.format^.BytesPerPixel;
-TryDo(bpp = 4, 'Land object should be 32bit', true);
+if checkFails(bpp = 4, 'Land object should be 32bit', true) then
+begin
+if SDL_MustLock(Image) then
+ SDL_UnlockSurface(Image);
+end;
p:= Image^.pixels;
mp:= Mask^.pixels;
@@ -203,13 +211,13 @@
h:= h1
end;
inc(RectCount);
-TryDo(RectCount < MaxRects, 'AddRect: overflow', true)
+checkFails(RectCount < MaxRects, 'AddRect: overflow', true)
end;
procedure InitRects;
begin
-RectCount:= 0;
-New(Rects)
+ RectCount:= 0;
+ New(Rects)
end;
procedure FreeRects;
@@ -365,7 +373,7 @@
CheckCanPlace:= bRes;
end;
-function TryPut(var Obj: TThemeObject): boolean; overload;
+function TryPut(var Obj: TThemeObject): boolean;
const MaxPointsIndex = 2047;
var x, y: Longword;
ar: array[0..MaxPointsIndex] of TPoint;
@@ -386,12 +394,12 @@
begin
ar[cnt].x:= x;
ar[cnt].y:= y;
- inc(cnt);
- if cnt > MaxPointsIndex then // buffer is full, do not check the rest land
+ if cnt >= MaxPointsIndex then // buffer is full, do not check the rest land
begin
y:= LAND_HEIGHT;
x:= LAND_WIDTH;
end
+ else inc(cnt);
end;
inc(y, 3);
until y >= LAND_HEIGHT - Height;
@@ -412,7 +420,7 @@
TryPut:= bRes;
end;
-function TryPut(var Obj: TSprayObject; Surface: PSDL_Surface): boolean; overload;
+function TryPut2(var Obj: TSprayObject; Surface: PSDL_Surface): boolean;
const MaxPointsIndex = 8095;
var x, y: Longword;
ar: array[0..MaxPointsIndex] of TPoint;
@@ -420,7 +428,7 @@
r: TSDL_Rect;
bRes: boolean;
begin
-TryPut:= false;
+TryPut2:= false;
cnt:= 0;
with Obj do
begin
@@ -439,18 +447,19 @@
begin
ar[cnt].x:= x;
ar[cnt].y:= y;
- inc(cnt);
- if cnt > MaxPointsIndex then // buffer is full, do not check the rest land
+ if cnt >= MaxPointsIndex then // buffer is full, do not check the rest land
begin
- y:= 5000;
- x:= 5000;
+ y:= $FF000000;
+ x:= $FF000000;
end
+ else inc(cnt);
end;
inc(y, 12);
until y >= LAND_HEIGHT - Height - 8;
inc(x, getrandom(12) + 12)
until x >= LAND_WIDTH - Width;
bRes:= cnt <> 0;
+AddFileLog('CHECKPOINT 004');
if bRes then
begin
i:= getrandom(cnt);
@@ -464,7 +473,7 @@
end
else Maxcnt:= 0
end;
-TryPut:= bRes;
+TryPut2:= bRes;
end;
@@ -511,12 +520,12 @@
s:= cPathz[ptCurrTheme] + '/' + cThemeCFGFilename;
WriteLnToConsole('Reading objects info...');
f:= pfsOpenRead(s);
-TryDo(f <> nil, 'Bad data or cannot access file ' + s, true);
+if checkFails(f <> nil, 'Bad data or cannot access file ' + s, true) then exit;
ThemeObjects.Count:= 0;
SprayObjects.Count:= 0;
-while not pfsEOF(f) do
+while (not pfsEOF(f)) and allOK do
begin
pfsReadLn(f, s);
if Length(s) = 0 then
@@ -845,13 +854,13 @@
exit;
WriteLnToConsole('Adding theme objects...');
- for i:=0 to ThemeObjects.Count do
+ for i:=0 to Pred(ThemeObjects.Count) do
ThemeObjects.objs[i].Maxcnt := max(1, (ThemeObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map
repeat
t := getrandom(ThemeObjects.Count);
b := false;
- for i:=0 to ThemeObjects.Count do
+ for i:= 0 to Pred(ThemeObjects.Count) do
begin
ii := (i+t) mod ThemeObjects.Count;
@@ -869,18 +878,18 @@
exit;
WriteLnToConsole('Adding spray objects...');
- for i:=0 to SprayObjects.Count do
+ for i:= 0 to Pred(SprayObjects.Count) do
SprayObjects.objs[i].Maxcnt := max(1, (SprayObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map
repeat
t := getrandom(SprayObjects.Count);
b := false;
- for i:=0 to SprayObjects.Count do
+ for i:= 0 to Pred(SprayObjects.Count) do
begin
ii := (i+t) mod SprayObjects.Count;
if SprayObjects.objs[ii].Maxcnt <> 0 then
- b := b or TryPut(SprayObjects.objs[ii], Surface)
+ b := b or TryPut2(SprayObjects.objs[ii], Surface)
end;
until not b;
end;
@@ -915,7 +924,6 @@
procedure AddOnLandObjects(Surface: PSDL_Surface);
begin
InitRects;
-//AddSprayObjects(Surface, SprayObjects, 12);
AddSprayObjects(Surface, SprayObjects);
FreeRects
end;
--- a/hedgewars/uLandOutline.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uLandOutline.pas Fri Apr 01 15:36:19 2016 +0200
@@ -30,7 +30,7 @@
procedure Push(_xl, _xr, _y, _dir: LongInt);
begin
- TryDo(Stack.Count <= 8192, 'FillLand: stack overflow', true);
+ if checkFails(Stack.Count <= 8192, 'FillLand: stack overflow', true) then exit;
_y:= _y + _dir;
if (_y < 0) or (_y >= LAND_HEIGHT) then
exit;
--- a/hedgewars/uLandTexture.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uLandTexture.pas Fri Apr 01 15:36:19 2016 +0200
@@ -72,10 +72,11 @@
if cOnlyStats then exit;
if (Width <= 0) or (Height <= 0) then
exit;
- TryDo((X >= 0) and (X < LAND_WIDTH), 'UpdateLandTexture: wrong X parameter', true);
- TryDo(X + Width <= LAND_WIDTH, 'UpdateLandTexture: wrong Width parameter', true);
- TryDo((Y >= 0) and (Y < LAND_HEIGHT), 'UpdateLandTexture: wrong Y parameter', true);
- TryDo(Y + Height <= LAND_HEIGHT, 'UpdateLandTexture: wrong Height parameter', true);
+ checkFails((X >= 0) and (X < LAND_WIDTH), 'UpdateLandTexture: wrong X parameter', true);
+ checkFails(X + Width <= LAND_WIDTH, 'UpdateLandTexture: wrong Width parameter', true);
+ checkFails((Y >= 0) and (Y < LAND_HEIGHT), 'UpdateLandTexture: wrong Y parameter', true);
+ checkFails(Y + Height <= LAND_HEIGHT, 'UpdateLandTexture: wrong Height parameter', true);
+ if not allOK then exit;
tSize:= TEXSIZE;
--- a/hedgewars/uLocale.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uLocale.pas Fri Apr 01 15:36:19 2016 +0200
@@ -30,7 +30,7 @@
function GetEventString(e: TEventId): ansistring;
{$IFDEF HWLIBRARY}
-procedure LoadLocaleWrapper(str: pchar); cdecl; export;
+procedure LoadLocaleWrapper(path: pchar; filename: pchar); cdecl; export;
{$ENDIF}
implementation
@@ -50,7 +50,7 @@
first[e]:= true;
f:= pfsOpenRead(FileName);
-TryDo(f <> nil, 'Cannot load locale "' + FileName + '"', false);
+checkFails(f <> nil, 'Cannot load locale "' + FileName + '"', false);
s:= '';
@@ -63,18 +63,19 @@
continue;
if (s[1] < '0') or (s[1] > '9') then
continue;
- TryDo(Length(s) > 6, 'Load locale: empty string', true);
+ checkFails(Length(s) > 6, 'Load locale: empty string', true);
{$IFNDEF PAS2C}
val(s[1]+s[2], a, c);
- TryDo(c = 0, ansistring('Load locale: numbers should be two-digit: ') + s, true);
+ checkFails(c = 0, ansistring('Load locale: numbers should be two-digit: ') + s, true);
val(s[4]+s[5], b, c);
- TryDo(c = 0, ansistring('Load locale: numbers should be two-digit: ') + s, true);
+ checkFails(c = 0, ansistring('Load locale: numbers should be two-digit: ') + s, true);
{$ELSE}
val(s[1]+s[2], a);
val(s[4]+s[5], b);
{$ENDIF}
- TryDo(s[3] = ':', 'Load locale: ":" expected', true);
- TryDo(s[6] = '=', 'Load locale: "=" expected', true);
+ checkFails(s[3] = ':', 'Load locale: ":" expected', true);
+ checkFails(s[6] = '=', 'Load locale: "=" expected', true);
+ if not allOK then exit;
Delete(s, 1, 6);
case a of
0: if (b >=0) and (b <= ord(High(TAmmoStrId))) then
@@ -83,7 +84,7 @@
trmsg[TMsgStrId(b)]:= s;
2: if (b >=0) and (b <= ord(High(TEventId))) then
begin
- TryDo(trevt_n[TEventId(b)] < MAX_EVENT_STRINGS, 'Too many event strings in ' + IntToStr(a) + ':' + IntToStr(b), false);
+ checkFails(trevt_n[TEventId(b)] < MAX_EVENT_STRINGS, 'Too many event strings in ' + IntToStr(a) + ':' + IntToStr(b), false);
if first[TEventId(b)] then
begin
trevt_n[TEventId(b)]:= 0;
@@ -133,9 +134,19 @@
end;
{$IFDEF HWLIBRARY}
-procedure LoadLocaleWrapper(str: pchar); cdecl; export;
+procedure LoadLocaleWrapper(path: pchar; filename: pchar); cdecl; export;
begin
- LoadLocale(Strpas(str));
+ PathPrefix := Strpas(path);
+
+ uUtils.initModule(false);
+ uVariables.initModule;
+ uPhysFSLayer.initModule;
+
+ LoadLocale(Strpas(filename));
+
+ uPhysFSLayer.freeModule;
+ uVariables.freeModule;
+ uUtils.freeModule;
end;
{$ENDIF}
--- a/hedgewars/uMisc.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uMisc.pas Fri Apr 01 15:36:19 2016 +0200
@@ -30,11 +30,7 @@
function doSurfaceConversion(tmpsurf: PSDL_Surface): PSDL_Surface;
function MakeScreenshot(filename: shortstring; k: LongInt; dump: LongWord): boolean;
function GetTeamStatString(p: PTeam): shortstring;
-{$IFDEF SDL2}
function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; inline;
-{$ELSE}
-function SDL_RectMake(x, y: SmallInt; width, height: Word): TSDL_Rect; inline;
-{$ENDIF}
implementation
uses SysUtils, uVariables, uUtils
@@ -303,7 +299,7 @@
image^.size:= size;
image^.buffer:= p;
-SDL_CreateThread(@SaveScreenshot{$IFDEF SDL2}, 'snapshot'{$ENDIF}, image);
+SDL_CreateThread(@SaveScreenshot, PChar('snapshot'), image);
MakeScreenshot:= true; // possibly it is not true but we will not wait for thread to terminate
end;
@@ -321,11 +317,7 @@
end;
end;
-{$IFDEF SDL2}
function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; inline;
-{$ELSE}
-function SDL_RectMake(x, y: SmallInt; width, height: Word): TSDL_Rect; inline;
-{$ENDIF}
begin
SDL_RectMake.x:= x;
SDL_RectMake.y:= y;
@@ -340,32 +332,15 @@
GetTeamStatString:= s;
end;
-{$IFDEF SDL2}
-// FIXME - pretty sure this is not handling endianness correctly like the SDL1 is
+procedure initModule;
const SDL_PIXELFORMAT_ABGR8888 = (1 shl 28) or (6 shl 24) or (7 shl 20) or (6 shl 16) or (32 shl 8) or 4;
-{$ELSE}
-const format: TSDL_PixelFormat = (
- palette: nil; BitsPerPixel: 32; BytesPerPixel: 4;
- Rloss: 0; Gloss: 0; Bloss: 0; Aloss: 0;
- Rshift: RShift; Gshift: GShift; Bshift: BShift; Ashift: AShift;
- RMask: RMask; GMask: GMask; BMask: BMask; AMask: AMask;
- colorkey: 0; alpha: 255);
-{$ENDIF}
-
-procedure initModule;
begin
-{$IFDEF SDL2}
conversionFormat:= SDL_AllocFormat(SDL_PIXELFORMAT_ABGR8888);
-{$ELSE}
- conversionFormat:= @format;
-{$ENDIF}
end;
procedure freeModule;
begin
-{$IFDEF SDL2}
SDL_FreeFormat(conversionFormat);
-{$ENDIF}
end;
end.
--- a/hedgewars/uPhysFSLayer.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uPhysFSLayer.pas Fri Apr 01 15:36:19 2016 +0200
@@ -13,7 +13,7 @@
{$linklib physlayer}
{$ENDIF}
-procedure initModule;
+procedure initModule(localPrefix, userPrefix: PChar);
procedure freeModule;
type PFSFile = pointer;
@@ -22,14 +22,18 @@
function rwopsOpenWrite(fname: shortstring): PSDL_RWops;
function pfsOpenRead(fname: shortstring): PFSFile;
+function pfsOpenWrite(fname: shortstring): PFSFile;
+function pfsFlush(f: PFSFile): boolean;
function pfsClose(f: PFSFile): boolean;
procedure pfsReadLn(f: PFSFile; var s: shortstring);
procedure pfsReadLnA(f: PFSFile; var s: ansistring);
+procedure pfsWriteLn(f: PFSFile; s: shortstring);
function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
function pfsEOF(f: PFSFile): boolean;
function pfsExists(fname: shortstring): boolean;
+function pfsMakeDir(path: shortstring): boolean;
function physfsReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; cdecl; external PhyslayerLibName;
procedure physfsReaderSetBuffer(buf: pointer); cdecl; external PhyslayerLibName;
@@ -46,11 +50,19 @@
function PHYSFS_deinit(): LongInt; cdecl; external PhysfsLibName;
function PHYSFS_mount(newDir, mountPoint: PChar; appendToPath: LongBool) : LongBool; cdecl; external PhysfsLibName;
function PHYSFS_openRead(fname: PChar): PFSFile; cdecl; external PhysfsLibName;
+function PHYSFS_openWrite(fname: PChar): PFSFile; cdecl; external PhysfsLibName;
+function PHYSFS_setWriteDir(path: PChar): LongBool; cdecl; external PhysfsLibName;
function PHYSFS_eof(f: PFSFile): LongBool; cdecl; external PhysfsLibName;
function PHYSFS_readBytes(f: PFSFile; buffer: pointer; len: Int64): Int64; cdecl; external PhysfsLibName;
+function PHYSFS_writeBytes(f: PFSFile; buffer: pointer; len: Int64): Int64; cdecl; external PhysfsLibName;
+function PHYSFS_seek(f: PFSFile; pos: QWord): LongBool; cdecl; external PhysfsLibName;
+function PHYSFS_flush(f: PFSFile): LongBool; cdecl; external PhysfsLibName;
function PHYSFS_close(f: PFSFile): LongBool; cdecl; external PhysfsLibName;
function PHYSFS_exists(fname: PChar): LongBool; cdecl; external PhysfsLibName;
+function PHYSFS_mkdir(path: PChar): LongBool; cdecl; external PhysfsLibName;
function PHYSFS_getLastError(): PChar; cdecl; external PhysfsLibName;
+function PHYSFS_enumerateFiles(dir: PChar): PPChar; cdecl; external PhysfsLibName;
+procedure PHYSFS_freeList(list: PPChar); cdecl; external PhysfsLibName;
{$ELSE}
function PHYSFS_readBytes(f: PFSFile; buffer: pointer; len: Int64): Int64;
begin
@@ -73,11 +85,21 @@
exit(PHYSFS_openRead(Str2PChar(fname)));
end;
+function pfsOpenWrite(fname: shortstring): PFSFile;
+begin
+ exit(PHYSFS_openWrite(Str2PChar(fname)));
+end;
+
function pfsEOF(f: PFSFile): boolean;
begin
exit(PHYSFS_eof(f))
end;
+function pfsFlush(f: PFSFile): boolean;
+begin
+ exit(PHYSFS_flush(f))
+end;
+
function pfsClose(f: PFSFile): boolean;
begin
exit(PHYSFS_close(f))
@@ -88,6 +110,20 @@
exit(PHYSFS_exists(Str2PChar(fname)))
end;
+function pfsMakeDir(path: shortstring): boolean;
+begin
+ exit(PHYSFS_mkdir(Str2PChar(path)))
+end;
+
+function pfsEnumerateFiles(dir: shortstring): PPChar;
+begin
+ exit(PHYSFS_enumerateFiles(Str2PChar(dir)))
+end;
+
+procedure pfsFreeList(list: PPChar);
+begin
+ PHYSFS_freeList(list)
+end;
procedure pfsReadLn(f: PFSFile; var s: shortstring);
var c: char;
@@ -124,6 +160,14 @@
s:= s + ansistring(b)
end;
+procedure pfsWriteLn(f: PFSFile; s: shortstring);
+var c: char;
+begin
+ c:= #10;
+ PHYSFS_writeBytes(f, @s[1], byte(s[0]));
+ PHYSFS_writeBytes(f, @c, 1);
+end;
+
function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
var r: Int64;
begin
@@ -138,9 +182,9 @@
procedure pfsMount(path: ansistring; mountpoint: PChar);
begin
if PHYSFS_mount(PChar(path), mountpoint, false) then
- AddFileLog('[PhysFS] mount ' + shortstring(path) + ' at ' + shortstring(mountpoint) + ' : ok')
+ //AddFileLog('[PhysFS] mount ' + shortstring(path) + ' at ' + shortstring(mountpoint) + ' : ok')
else
- AddFileLog('[PhysFS] mount ' + shortstring(path) + ' at ' + shortstring(mountpoint) + ' : FAILED ("' + shortstring(PHYSFS_getLastError()) + '")');
+ //AddFileLog('[PhysFS] mount ' + shortstring(path) + ' at ' + shortstring(mountpoint) + ' : FAILED ("' + shortstring(PHYSFS_getLastError()) + '")');
end;
procedure pfsMountAtRoot(path: ansistring);
@@ -148,10 +192,12 @@
pfsMount(path, PChar(_S'/'));
end;
-procedure initModule;
+procedure initModule(localPrefix, userPrefix: PChar);
var i: LongInt;
cPhysfsId: shortstring;
+{$IFNDEF MOBILE}
fp: PChar;
+{$ENDIF}
begin
{$IFDEF HWLIBRARY}
//TODO: http://icculus.org/pipermail/physfs/2011-August/001006.html
@@ -163,21 +209,27 @@
i:= PHYSFS_init(Str2PChar(cPhysfsId));
AddFileLog('[PhysFS] init: ' + inttostr(i));
+{$IFNDEF MOBILE}
// mount system fonts paths first
for i:= low(cFontsPaths) to high(cFontsPaths) do
begin
fp := cFontsPaths[i];
if fp <> nil then
- pfsMount(ansistring(fp), PChar('/Fonts'));
+ pfsMount(ansistring(fp), _P'/Fonts');
end;
+{$ENDIF}
- pfsMountAtRoot(PathPrefix);
- pfsMountAtRoot(UserPathPrefix + ansistring('/Data'));
+ pfsMountAtRoot(localPrefix);
+ pfsMount(userPrefix, PChar('/Config'));
+ pfsMakeDir('/Config/Data');
+ pfsMakeDir('/Config/Logs');
+ pfsMountAtRoot(userPrefix + ansistring('/Data'));
+ PHYSFS_setWriteDir(userPrefix);
hedgewarsMountPackages;
// need access to teams and frontend configs (for bindings)
- pfsMountAtRoot(UserPathPrefix);
+ pfsMountAtRoot(userPrefix);
if cTestLua then
begin
--- a/hedgewars/uRender.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uRender.pas Fri Apr 01 15:36:19 2016 +0200
@@ -104,8 +104,7 @@
implementation
uses {$IFNDEF PAS2C} StrUtils, {$ENDIF}SysUtils, uVariables, uUtils, uConsts
- {$IFDEF GL2}, uMatrix, uConsole{$ENDIF}
- {$IF NOT DEFINED(SDL2) AND DEFINED(USE_VIDEO_RECORDING)}, glut {$ENDIF};
+ {$IFDEF GL2}, uMatrix, uConsole{$ENDIF};
{$IFDEF USE_TOUCH_INTERFACE}
const
@@ -359,25 +358,29 @@
{$ENDIF}
function glLoadExtension(extension : shortstring) : boolean;
+var logmsg: shortstring;
begin
-//TODO: pas2c does not handle {$IF (GLunit = gles11) OR DEFINED(PAS2C)}
-{$IFNDEF PAS2C}
-{$IF GLunit = gles11}
- // FreePascal doesnt come with OpenGL ES 1.1 Extension headers
extension:= extension; // avoid hint
glLoadExtension:= false;
- AddFileLog('OpenGL - "' + extension + '" skipped')
-{$ELSE}
+ logmsg:= 'OpenGL - "' + extension + '" skipped';
+
+{$IFNDEF IPHONEOS}
+//TODO: pas2c does not handle
+{$IFNDEF PAS2C}
+// FreePascal doesnt come with OpenGL ES 1.1 Extension headers
+{$IF GLunit <> gles11}
+
glLoadExtension:= glext_LoadExtension(extension);
+
if glLoadExtension then
- AddFileLog('OpenGL - "' + extension + '" loaded')
+ logmsg:= 'OpenGL - "' + extension + '" loaded'
else
- AddFileLog('OpenGL - "' + extension + '" failed to load');
-{$ENDIF}
+ logmsg:= 'OpenGL - "' + extension + '" failed to load';
-{$ELSE} // pas2c part
- glLoadExtension:= false;
+{$ENDIF}
{$ENDIF}
+{$ENDIF}
+ AddFileLog(logmsg);
end;
{$IFDEF USE_S3D_RENDERING OR USE_VIDEO_RECORDING}
@@ -428,17 +431,6 @@
tmpint: LongInt;
tmpn: LongInt;
begin
-{$IFDEF MOBILE}
- // TODO: this function creates an opengles1.1 context
- // un-comment below and add proper logic to support opengles2.0
- //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
- //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
- if SDLGLcontext = nil then
- SDLGLcontext:= SDL_GL_CreateContext(SDLwindow);
- SDLTry(SDLGLcontext <> nil, true);
- SDL_GL_SetSwapInterval(1);
-{$ENDIF}
-
// suppress hint/warning
AuxBufNum:= AuxBufNum;
--- a/hedgewars/uRenderUtils.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uRenderUtils.pas Fri Apr 01 15:36:19 2016 +0200
@@ -99,7 +99,8 @@
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr);
finalRect.x:= X + cFontBorder + 2;
finalRect.y:= Y + cFontBorder;
- SDLTry(tmpsurf <> nil, true);
+ if SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then
+ exit;
SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect);
SDL_FreeSurface(tmpsurf);
finalRect.x:= X;
@@ -114,7 +115,8 @@
tmpPixel: Longword;
pixels: PLongWordArray;
begin
- TryDo(Surface^.format^.BytesPerPixel = 4, 'flipSurface failed, expecting 32 bit surface', true);
+ if checkFails(Surface^.format^.BytesPerPixel = 4, 'flipSurface failed, expecting 32 bit surface', true) then
+ exit;
SDL_LockSurface(Surface);
pixels:= Surface^.pixels;
if Vertical then
@@ -129,7 +131,7 @@
end
else
for x := 0 to (Surface^.w div 2) - 1 do
- for y := 0 to Surface^.h -1 do
+ for y := 0 to Surface^.h - 1 do
begin
i:= y*Surface^.w + x;
j:= y*Surface^.w + (Surface^.w - x - 1);
@@ -245,8 +247,9 @@
var y, x, i, j: LongInt;
srcPixels, destPixels: PLongWordArray;
begin
- TryDo(src^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true);
- TryDo(dest^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true);
+ checkFails(src^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true);
+ checkFails(dest^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true);
+ if not allOK then exit;
SDL_LockSurface(src);
SDL_LockSurface(dest);
@@ -292,11 +295,12 @@
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w + cFontBorder * 2 + 4, h + cFontBorder * 2,
32, RMask, GMask, BMask, AMask);
- TryDo(finalSurface <> nil, 'RenderString: fail to create surface', true);
+ if checkFails(finalSurface <> nil, 'RenderString: fail to create surface', true) then
+ exit(nil);
WriteInRoundRect(finalSurface, 0, 0, Color, font, s, maxLength);
- TryDo(SDL_SetColorKey(finalSurface, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
+ checkFails(SDL_SetColorKey(finalSurface, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, false);
RenderStringTexLim:= Surface2Tex(finalSurface, false);
@@ -443,7 +447,8 @@
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, rect.w, rect.h, 32, RMask, GMask, BMask, AMask);
- TryDo(finalSurface <> nil, 'RenderString: fail to create surface', true);
+ if checkFails(finalSurface <> nil, 'RenderString: fail to create surface', true) then
+ exit(nil);
//////////////////////////////// CORNERS ///////////////////////////////
copyToXY(SpritesData[corner].Surface, finalSurface, 0, 0); /////////////////// NW
@@ -522,9 +527,11 @@
rect.x:= edgeHeight + 1 + ((i - w) div 2);
// trying to more evenly position the text, vertically
rect.y:= edgeHeight + ((j-(numLines*h)) div 2) + line * h;
- SDLTry(tmpsurf <> nil, true);
- SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect);
- SDL_FreeSurface(tmpsurf);
+ if not SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then
+ begin
+ SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect);
+ SDL_FreeSurface(tmpsurf);
+ end;
inc(line);
end;
--- a/hedgewars/uScript.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uScript.pas Fri Apr 01 15:36:19 2016 +0200
@@ -23,7 +23,7 @@
* This unit defines, implements and registers functions and
* variables/constants bindings for usage in Lua scripts.
*
- * Please keep http://code.google.com/p/hedgewars/wiki/LuaAPI up to date!
+ * Please keep http://hedgewars.org/kb/LuaAPI up to date!
*
* Note: If you add a new function, make sure to test if _all_ parameters
* work as intended! (Especially conversions errors can sneak in
@@ -440,6 +440,19 @@
lc_setweapon:= 0;
end;
+// enable/disable cinematic effects
+function lc_setcinematicmode(L : Plua_State) : LongInt; Cdecl;
+const
+ call = 'SetCinematicMode';
+ params = 'enable';
+begin
+ if (CheckLuaParamCount(L, 1, call, params)) then
+ begin
+ CinematicScript:= lua_toboolean(L, 1);
+ end;
+ lc_setcinematicmode:= 0;
+end;
+
// no parameter means reset to default (and 0 means unlimited)
function lc_setmaxbuilddistance(L : Plua_State) : LongInt; Cdecl;
var np: LongInt;
@@ -628,7 +641,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 +657,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 +673,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 +694,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 +712,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 +730,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);
@@ -917,29 +933,31 @@
lua_pushinteger(L, gear^.AdvBounce);
lua_pushinteger(L, Integer(gear^.ImpactSound));
lua_pushinteger(L, gear^.nImpactSounds);
- lua_pushinteger(L, gear^.Tint)
+ lua_pushinteger(L, gear^.Tint);
+ lua_pushinteger(L, gear^.Damage);
+ lua_pushinteger(L, gear^.Boom)
end
else
begin
lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L);
lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L);
- lua_pushnil(L)
+ lua_pushnil(L); lua_pushnil(L); lua_pushnil(L)
end
end
else
begin
lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L);
lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L);
- lua_pushnil(L)
+ lua_pushnil(L); lua_pushnil(L); lua_pushnil(L)
end;
- lc_getgearvalues:= 11
+ lc_getgearvalues:= 13
end;
function lc_setgearvalues(L : Plua_State) : LongInt; Cdecl;
var gear : PGear;
begin
-// Currently allows 1-12 params
-// if CheckLuaParamCount(L, 12, 'SetGearValues', 'gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, # ImpactSounds, Tint') then
+// Currently allows 1-14 params
+// if CheckLuaParamCount(L, 14, 'SetGearValues', 'gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, # ImpactSounds, Tint, Damage, Boom') then
// begin
gear:= GearByUID(lua_tointeger(L, 1));
if gear <> nil then
@@ -965,7 +983,11 @@
if not lua_isnoneornil(L, 11) then
gear^.nImpactSounds := lua_tointeger(L, 11);
if not lua_isnoneornil(L, 12) then
- gear^.Tint := lua_tointeger(L, 12)
+ gear^.Tint := lua_tointeger(L, 12);
+ if not lua_isnoneornil(L, 13) then
+ gear^.Damage := lua_tointeger(L, 13);
+ if not lua_isnoneornil(L, 14) then
+ gear^.Boom := lua_tointeger(L, 14);
end;
// end
// else
@@ -2189,24 +2211,6 @@
lc_setwind:= 0
end;
-function lc_getdatapath(L : Plua_State) : LongInt; Cdecl;
-begin
- if CheckLuaParamCount(L, 0, 'GetDataPath', '') then
- lua_pushstring(L, str2pchar(cPathz[ptData]))
- else
- lua_pushnil(L);
- lc_getdatapath:= 1
-end;
-
-function lc_getuserdatapath(L : Plua_State) : LongInt; Cdecl;
-begin
- if CheckLuaParamCount(L, 0, 'GetUserDataPath', '') then
- lua_pushstring(L, str2pchar(cPathz[ptData]))
- else
- lua_pushnil(L);
- lc_getuserdatapath:= 1
-end;
-
function lc_maphasborder(L : Plua_State) : LongInt; Cdecl;
begin
if CheckLuaParamCount(L, 0, 'MapHasBorder', '') then
@@ -2522,6 +2526,20 @@
lc_declareachievement:= 0
end;
+function lc_startghostpoints(L : Plua_State) : LongInt; Cdecl;
+begin
+ if CheckLuaParamCount(L, 1, 'StartGhostPoints', 'count') then
+ startGhostPoints(lua_tointeger(L, 1));
+ lc_startghostpoints:= 0
+end;
+
+function lc_dumppoint(L : Plua_State) : LongInt; Cdecl;
+begin
+ if CheckLuaParamCount(L, 2, 'DumpPoint', 'x, y') then
+ dumpPoint(lua_tointeger(L, 1), lua_tointeger(L, 2));
+ lc_dumppoint:= 0
+end;
+
procedure ScriptFlushPoints();
begin
@@ -2585,7 +2603,7 @@
case lua_tointeger(L, 1) of
HaltTestSuccess : rstring:= 'Success';
- HaltTestLuaError: rstring:= 'FAILED';
+ HaltTestFailed: rstring:= 'FAILED';
else
begin
LuaCallError('Parameter must be either ' + params, call, params);
@@ -2885,6 +2903,12 @@
procedure GetGlobals;
begin
+// TODO
+// Use setters instead, because globals should be read-only!
+// Otherwise globals might be changed by Lua, but then unexpectatly overwritten by engine when a ScriptCall is triggered by whatever Lua is doing!
+// Sure, one could work around that in engine (e.g. by setting writable globals in SetGlobals only when their engine-side value has actually changed since SetGlobals was called the last time...), but things just get messier and messier then.
+// It is inconsistent anyway to have some globals be read-only and others not with no indication whatsoever.
+// -- sheepluva
TurnTimeLeft:= ScriptGetInteger('TurnTimeLeft');
end;
@@ -3082,7 +3106,7 @@
begin
// initialize lua
luaState:= lua_open;
-TryDo(luaState <> nil, 'lua_open failed', true);
+if checkFails(luaState <> nil, 'lua_open failed', true) then exit;
// open internal libraries
luaopen_base(luaState);
@@ -3310,8 +3334,6 @@
lua_register(luaState, _P'SetGearCollisionMask', @lc_setgearcollisionmask);
lua_register(luaState, _P'GetRandom', @lc_getrandom);
lua_register(luaState, _P'SetWind', @lc_setwind);
-lua_register(luaState, _P'GetDataPath', @lc_getdatapath);
-lua_register(luaState, _P'GetUserDataPath', @lc_getuserdatapath);
lua_register(luaState, _P'MapHasBorder', @lc_maphasborder);
lua_register(luaState, _P'GetHogHat', @lc_gethoghat);
lua_register(luaState, _P'SetHogHat', @lc_sethoghat);
@@ -3325,6 +3347,7 @@
lua_register(luaState, _P'SetWaterLine', @lc_setwaterline);
lua_register(luaState, _P'SetNextWeapon', @lc_setnextweapon);
lua_register(luaState, _P'SetWeapon', @lc_setweapon);
+lua_register(luaState, _P'SetCinematicMode', @lc_setcinematicmode);
lua_register(luaState, _P'SetMaxBuildDistance', @lc_setmaxbuilddistance);
// drawn map functions
lua_register(luaState, _P'AddPoint', @lc_addPoint);
@@ -3333,6 +3356,8 @@
lua_register(luaState, _P'SetGearAIHints', @lc_setgearaihints);
lua_register(luaState, _P'HedgewarsScriptLoad', @lc_hedgewarsscriptload);
lua_register(luaState, _P'DeclareAchievement', @lc_declareachievement);
+lua_register(luaState, _P'StartGhostPoints', @lc_startghostpoints);
+lua_register(luaState, _P'DumpPoint', @lc_dumppoint);
ScriptSetInteger('TEST_SUCCESSFUL' , HaltTestSuccess);
ScriptSetInteger('TEST_FAILED' , HaltTestFailed);
--- a/hedgewars/uSound.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uSound.pas Fri Apr 01 15:36:19 2016 +0200
@@ -290,10 +290,10 @@
exit(AskForVoicepack('Default'));
end;
- while (voicepacks[i].name <> name) and (voicepacks[i].name <> '') do
+ while (voicepacks[i].name <> name) and (voicepacks[i].name <> '') and (i < cMaxTeams) do
begin
inc(i);
- TryDo(i <= cMaxTeams, 'Engine bug: AskForVoicepack i > cMaxTeams', true)
+ //TryDo(i <= cMaxTeams, 'Engine bug: AskForVoicepack i > cMaxTeams', true)
end;
voicepacks[i].name:= name;
@@ -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
@@ -310,7 +310,7 @@
success:= SDL_InitSubSystem(SDL_INIT_AUDIO) >= 0;
if success then
- success:= Mix_OpenAudio(44100, $8010, channels, 1024) = 0;
+ success:= Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, channels, 1024) = 0;
if success then
WriteLnToConsole(msgOK)
@@ -322,10 +322,11 @@
end;
WriteToConsole('Init SDL_mixer... ');
- SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, true);
+ if SDLCheck(Mix_Init(MIX_INIT_OGG) <> 0, 'Mix_Init', true) then exit;
WriteLnToConsole(msgOK);
Mix_AllocateChannels(Succ(chanTPU));
+ previousVolume:= cInitVolume;
ChangeVolume(cInitVolume);
end;
@@ -424,7 +425,7 @@
s:= cPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName;
WriteToConsole(msgLoading + s + ' ');
defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1);
- SDLTry(defVoicepack^.chunks[snd] <> nil, true);
+ if not SDLCheck(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true) then exit;
WriteLnToConsole(msgOK);
end;
lastChan[snd]:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], 0, -1)
@@ -523,7 +524,7 @@
s:= cPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName;
WriteToConsole(msgLoading + s + ' ');
defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1);
- SDLTry(defVoicepack^.chunks[snd] <> nil, true);
+ if SDLCheck(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true) then exit;
WriteLnToConsole(msgOK);
end;
if fadems > 0 then
@@ -574,10 +575,10 @@
WriteToConsole(msgLoading + s + ' ');
Mus:= Mix_LoadMUS_RW(rwopsOpenRead(s));
- SDLTry(Mus <> nil, false);
+ SDLCheck(Mus <> nil, 'Mix_LoadMUS_RW', false);
WriteLnToConsole(msgOK);
- SDLTry(Mix_FadeInMusic(Mus, -1, 3000) <> -1, false)
+ SDLCheck(Mix_FadeInMusic(Mus, -1, 3000) <> -1, 'Mix_FadeInMusic', false)
end;
procedure SetVolume(vol: LongInt);
--- a/hedgewars/uStats.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uStats.pas Fri Apr 01 15:36:19 2016 +0200
@@ -36,9 +36,11 @@
procedure SendStats;
procedure hedgehogFlight(Gear: PGear; time: Longword);
procedure declareAchievement(id, teamname, location: shortstring; value: LongInt);
+procedure startGhostPoints(n: LongInt);
+procedure dumpPoint(x, y: LongInt);
implementation
-uses uSound, uLocale, uVariables, uUtils, uIO, uCaptions, uDebug, uMisc, uConsole, uScript;
+uses uSound, uLocale, uVariables, uUtils, uIO, uCaptions, uMisc, uConsole, uScript;
var DamageClan : Longword = 0;
DamageTotal : Longword = 0;
@@ -99,7 +101,7 @@
var i, t: LongInt;
s: ansistring;
begin
-TryDo(not bBetweenTurns, 'Engine bug: TurnReaction between turns', true);
+//TryDo(not bBetweenTurns, 'Engine bug: TurnReaction between turns', true);
inc(FinishedTurnsTotal);
if FinishedTurnsTotal <> 0 then
@@ -323,8 +325,32 @@
WriteLnToConsole(inttostr(value));
end;
+procedure startGhostPoints(n: LongInt);
+begin
+ WriteLnToConsole('GHOST_POINTS');
+ WriteLnToConsole(inttostr(n));
+end;
+
+procedure dumpPoint(x, y: LongInt);
+begin
+ WriteLnToConsole(inttostr(x));
+ WriteLnToConsole(inttostr(y));
+end;
+
procedure initModule;
begin
+ DamageClan := 0;
+ DamageTotal := 0;
+ DamageTurn := 0;
+ KillsClan := 0;
+ Kills := 0;
+ KillsTotal := 0;
+ AmmoUsedCount := 0;
+ AmmoDamagingUsed := false;
+ SkippedTurns:= 0;
+ isTurnSkipped:= false;
+ vpHurtSameClan:= nil;
+ vpHurtEnemy:= nil;
TotalRounds:= -1;
FinishedTurnsTotal:= -1;
end;
--- a/hedgewars/uStore.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uStore.pas Fri Apr 01 15:36:19 2016 +0200
@@ -55,25 +55,20 @@
procedure InitOffscreenOpenGL;
{$ENDIF}
-{$IFDEF SDL2}
procedure WarpMouse(x, y: Word); inline;
-{$ENDIF}
procedure SwapBuffers; {$IFDEF USE_VIDEO_RECORDING}cdecl{$ELSE}inline{$ENDIF};
procedure SetSkyColor(r, g, b: real);
implementation
uses uMisc, uConsole, uVariables, uUtils, uTextures, uRender, uRenderUtils,
uCommands, uPhysFSLayer, uDebug
- {$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF}
- {$IF NOT DEFINED(SDL2) AND DEFINED(USE_VIDEO_RECORDING)}, glut {$ENDIF};
+ {$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF};
-var
-{$IFDEF SDL2}
+//type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple);
+
+var
SDLwindow: PSDL_Window;
SDLGLcontext: PSDL_GLContext;
-{$ELSE}
- SDLPrimSurface: PSDL_Surface;
-{$ENDIF}
squaresize : LongInt;
numsquares : LongInt;
ProgrTex: PTexture;
@@ -117,15 +112,19 @@
clr.g:= (Color shr 8) and $FF;
clr.b:= Color and $FF;
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, s, clr);
-SDLTry(tmpsurf <> nil, true);
+if tmpsurf = nil then exit;
tmpsurf:= doSurfaceConversion(tmpsurf);
-SDLTry(tmpsurf <> nil, true);
-SDL_UpperBlit(tmpsurf, nil, Surface, @finalRect);
-SDL_FreeSurface(tmpsurf);
-finalRect.x:= X;
-finalRect.y:= Y;
-finalRect.w:= w + cFontBorder * 2 + 4;
-finalRect.h:= h + cFontBorder * 2;
+
+if tmpsurf <> nil then
+begin
+ SDL_UpperBlit(tmpsurf, nil, Surface, @finalRect);
+ SDL_FreeSurface(tmpsurf);
+ finalRect.x:= X;
+ finalRect.y:= Y;
+ finalRect.w:= w + cFontBorder * 2 + 4;
+ finalRect.h:= h + cFontBorder * 2;
+end;
+
WriteInRect:= finalRect
end;
@@ -150,8 +149,10 @@
rr.h:= h;
texsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RMask, GMask, BMask, AMask);
- TryDo(texsurf <> nil, errmsgCreateSurface, true);
- TryDo(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
+ if not checkFails(texsurf <> nil, errmsgCreateSurface, true) then
+ checkFails(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
+
+ if not allOK then exit(nil);
DrawRoundRect(@rr, cWhiteColor, cNearBlackColor, texsurf, true);
@@ -197,8 +198,9 @@
r.w:= 32;
r.h:= 32;
texsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, r.w, r.h, 32, RMask, GMask, BMask, AMask);
- TryDo(texsurf <> nil, errmsgCreateSurface, true);
- TryDo(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
+ if not checkFails(texsurf <> nil, errmsgCreateSurface, true) then
+ checkFails(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
+ if not allOK then exit;
r.w:= 26;
r.h:= 19;
@@ -230,20 +232,20 @@
Flag:= 'hedgewars';
flagsurf:= LoadDataImageAltFile(ptFlags, Flag, 'hedgewars', ifNone);
- TryDo(flagsurf <> nil, 'Failed to load flag "' + Flag + '" as well as the default flag', true);
+ if not checkFails(flagsurf <> nil, 'Failed to load flag "' + Flag + '" as well as the default flag', true) then
+ begin
+ case maxLevel of
+ 1: copyToXY(SpritesData[sprBotlevels].Surface, flagsurf, 0, 0);
+ 2: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 5, 2, 17, 13, 5, 2);
+ 3: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 9, 5, 13, 10, 9, 5);
+ 4: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 13, 9, 9, 6, 13, 9);
+ 5: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 17, 11, 5, 4, 17, 11)
+ end;
- case maxLevel of
- 1: copyToXY(SpritesData[sprBotlevels].Surface, flagsurf, 0, 0);
- 2: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 5, 2, 17, 13, 5, 2);
- 3: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 9, 5, 13, 10, 9, 5);
- 4: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 13, 9, 9, 6, 13, 9);
- 5: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 17, 11, 5, 4, 17, 11)
- end;
-
- copyToXY(flagsurf, texsurf, 2, 2);
- SDL_FreeSurface(flagsurf);
- flagsurf:= nil;
-
+ copyToXY(flagsurf, texsurf, 2, 2);
+ SDL_FreeSurface(flagsurf);
+ flagsurf:= nil;
+ end;
// restore black border pixels inside the flag
PLongwordArray(texsurf^.pixels)^[32 * 2 + 2]:= cNearBlackColor;
@@ -256,6 +258,8 @@
SDL_FreeSurface(texsurf);
texsurf:= nil;
+ if not allOK then exit;
+
AIKillsTex := RenderStringTex(ansistring(inttostr(stats.AIKills)), Clan^.Color, fnt16);
dec(drY, r.h + 2);
@@ -361,7 +365,7 @@
s:= cPathz[ptFonts] + '/' + Name;
WriteToConsole(msgLoading + s + ' (' + inttostr(Height) + 'pt)... ');
Handle:= TTF_OpenFontRW(rwopsOpenRead(s), true, Height);
- SDLTry(Handle <> nil, true);
+ if SDLCheck(Handle <> nil, 'TTF_OpenFontRW', true) then exit;
TTF_SetFontStyle(Handle, style);
WriteLnToConsole(msgOK)
end;
@@ -370,7 +374,11 @@
begin
MakeCrossHairs;
LoadGraves;
+{$IFDEF IPHONEOS}
+ tmpHatSurf:= LoadDataImage(ptHats, 'chef', ifNone);
+{$ELSE}
tmpHatSurf:= LoadDataImage(ptHats, 'Reserved/chef', ifNone);
+{$ENDIF}
ChefHatTexture:= Surface2Tex(tmpHatSurf, true);
freeTmpHatSurf();
end;
@@ -388,6 +396,7 @@
and ((cCloudsNumber > 0) or (ii <> sprCloud))
and ((vobCount > 0) or (ii <> sprFlake))
and (savesurf or (not cOnlyStats)) // in stats-only only load those which are needed later
+ and allOK
then
begin
if reload then
@@ -446,7 +455,7 @@
Surface:= nil
end;
-if not cOnlyStats then
+if (not cOnlyStats) and allOK then
begin
WriteNames(fnt16);
@@ -472,9 +481,9 @@
for ai:= Low(TAmmoType) to High(TAmmoType) do
with Ammoz[ai] do
begin
- TryDo(length(trAmmo[NameId]) > 0,'No default text/translation found for ammo type #' + intToStr(ord(ai)) + '!',true);
+ if checkFails(length(trAmmo[NameId]) > 0,'No default text/translation found for ammo type #' + intToStr(ord(ai)) + '!',true) then exit;
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[CheckCJKFont(trAmmo[NameId],fnt16)].Handle, PChar(trAmmo[NameId]), cWhiteColorChannels);
- TryDo(tmpsurf <> nil,'Name-texture creation for ammo type #' + intToStr(ord(ai)) + ' failed!',true);
+ if checkFails(tmpsurf <> nil,'Name-texture creation for ammo type #' + intToStr(ord(ai)) + ' failed!',true) then exit;
tmpsurf:= doSurfaceConversion(tmpsurf);
FreeAndNilTexture(NameTex);
NameTex:= Surface2Tex(tmpsurf, false);
@@ -606,7 +615,7 @@
// anounce that loading failed
OutError(msgFailed, false);
- SDLTry(false, (imageFlags and ifCritical) <> 0);
+ if SDLCheck(false, 'LoadImage', (imageFlags and ifCritical) <> 0) then exit;
// rwops was already freed by IMG_Load_RW
rwops:= nil;
end else
@@ -626,7 +635,7 @@
tmpsurf:= doSurfaceConversion(tmpsurf);
if (imageFlags and ifTransparent) <> 0 then
- TryDo(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
+ if checkFails(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true) then exit;
WriteLnToConsole(msgOK + ' (' + inttostr(tmpsurf^.w) + 'x' + inttostr(tmpsurf^.h) + ')');
@@ -719,12 +728,12 @@
{$IFDEF IPHONEOS}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0);
SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 1);
+
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
{$ELSE}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
{$ENDIF}
-{$IFNDEF SDL2} // vsync is default in SDL2
- SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, LongInt((cReducedQuality and rqDesyncVBlank) = 0));
-{$ENDIF}
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
@@ -735,40 +744,23 @@
end;
procedure SetupOpenGL;
-var buf: array[byte] of char;
begin
-
-{$IFDEF SDL2}
AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_GetCurrentVideoDriver()) + ')');
-{$ELSE}
- buf[0]:= char(0); // avoid compiler hint
- AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf))) + ')');
-{$ENDIF}
+
+ // TODO: this function creates an opengles1.1 context
+ // un-comment below and add proper logic to support opengles2.0
+ //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
+ //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
+ if SDLGLcontext = nil then
+ SDLGLcontext:= SDL_GL_CreateContext(SDLwindow);
+ if SDLCheck(SDLGLcontext <> nil, 'SDLGLcontext', true) then exit;
+ SDL_GL_SetSwapInterval(1);
RendererSetup();
+
+// gl2 init/matrix code was here, but removed
end;
-(*
-procedure UpdateProjection;
-var
- s: GLfloat;
-begin
- s:=cScaleFactor;
- mProjection[0,0]:= s/cScreenWidth; mProjection[0,1]:= 0.0; mProjection[0,2]:=0.0; mProjection[0,3]:= 0.0;
- mProjection[1,0]:= 0.0; mProjection[1,1]:= -s/cScreenHeight; mProjection[1,2]:=0.0; mProjection[1,3]:= 0.0;
- mProjection[2,0]:= 0.0; mProjection[2,1]:= 0.0; mProjection[2,2]:=1.0; mProjection[2,3]:= 0.0;
- mProjection[3,0]:= cStereoDepth; mProjection[3,1]:= s/2; mProjection[3,2]:=0.0; mProjection[3,3]:= 1.0;
-
-{$IFDEF GL2}
- UpdateModelviewProjection;
-{$ELSE}
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(@mProjection[0, 0]);
- glMatrixMode(GL_MODELVIEW);
-{$ENDIF}
-end;
-*)
-
////////////////////////////////////////////////////////////////////////////////
procedure AddProgress;
var r: TSDL_Rect;
@@ -792,7 +784,7 @@
{$ENDIF}
end;
- TryDo(ProgrTex <> nil, 'Error - Progress Texure is nil!', true);
+ if checkFails(ProgrTex <> nil, 'Error - Progress Texure is nil!', true) then exit;
RenderClear();
if Step < numsquares then
@@ -893,7 +885,7 @@
inc(h, ha + 8);
tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RMask, GMask, BMask, AMask);
-TryDo(tmpsurf <> nil, 'RenderHelpWindow: fail to create surface', true);
+if checkFails(tmpsurf <> nil, 'RenderHelpWindow: fail to create surface', true) then exit(nil);
// render border and background
r.x:= 0;
@@ -998,41 +990,23 @@
end;
{$IFDEF USE_VIDEO_RECORDING}
-{$IFDEF SDL2}
procedure InitOffscreenOpenGL;
begin
// create hidden window
- SDLwindow:= SDL_CreateWindow('hedgewars video rendering (SDL2 hidden window)',
+ SDLwindow:= SDL_CreateWindow(PChar('hedgewars video rendering (SDL2 hidden window)'),
SDL_WINDOWPOS_CENTERED_MASK, SDL_WINDOWPOS_CENTERED_MASK,
cScreenWidth, cScreenHeight,
SDL_WINDOW_HIDDEN or SDL_WINDOW_OPENGL);
- SDLTry(SDLwindow <> nil, true);
+ if SDLCheck(SDLwindow <> nil, 'SDL_CreateWindow', true) then exit;
SetupOpenGL();
end;
-{$ELSE}
-procedure InitOffscreenOpenGL;
-var ArgCount: LongInt;
- PrgName: pchar;
-begin
- ArgCount:= 1;
- PrgName:= 'hwengine';
- glutInit(@ArgCount, @PrgName);
- glutInitWindowSize(cScreenWidth, cScreenHeight);
- // we do not need a window, but without this call OpenGL will not initialize
- glutCreateWindow('hedgewars video rendering (glut hidden window)');
- glutHideWindow();
- // we do not need to set this callback, but it is required for GLUT3 compat
- glutDisplayFunc(@SwapBuffers);
- RendererSetup();
-end;
-{$ENDIF} // SDL2
{$ENDIF} // USE_VIDEO_RECORDING
procedure chFullScr(var s: shortstring);
var flags: Longword = 0;
reinit: boolean = false;
{$IFNDEF DARWIN}ico: PSDL_Surface;{$ENDIF}
- {$IFDEF SDL2}x, y: LongInt;{$ENDIF}
+ x, y: LongInt;
begin
if cOnlyStats then
begin
@@ -1055,28 +1029,12 @@
end;
AddFileLog('Preparing to change video parameters...');
-{$IFDEF SDL2}
if SDLwindow = nil then
-{$ELSE}
- if SDLPrimSurface = nil then
-{$ENDIF}
begin
// set window title
- {$IFNDEF SDL2}
- SDL_WM_SetCaption(_P'Hedgewars', nil);
- {$ENDIF}
WriteToConsole('Init SDL_image... ');
- SDLTry(IMG_Init(IMG_INIT_PNG) <> 0, true);
+ if SDLCheck(IMG_Init(IMG_INIT_PNG) <> 0, 'IMG_Init', true) then exit;
WriteLnToConsole(msgOK);
- // load engine icon
- {$IFNDEF DARWIN}
- ico:= LoadDataImage(ptGraphics, 'hwengine', ifIgnoreCaps);
- if ico <> nil then
- begin
- SDL_WM_SetIcon(ico, 0);
- SDL_FreeSurface(ico)
- end;
- {$ENDIF}
end
else
begin
@@ -1101,10 +1059,6 @@
//uTextures.freeModule; //DEBUG ONLY
{$ENDIF}
AddFileLog('Freeing old primary surface...');
- {$IFNDEF SDL2}
- SDL_FreeSurface(SDLPrimSurface);
- SDLPrimSurface:= nil;
- {$ENDIF}
{$ENDIF}
end;
@@ -1118,45 +1072,58 @@
*)
SetupOpenGLAttributes();
{$ENDIF}
-{$IFDEF SDL2}
+
// these values in x and y make the window appear in the center
x:= SDL_WINDOWPOS_CENTERED_MASK;
y:= SDL_WINDOWPOS_CENTERED_MASK;
- // SDL_WINDOW_RESIZABLE makes the window resizable and
- // respond to rotation events on mobile devices
- flags:= SDL_WINDOW_OPENGL or SDL_WINDOW_SHOWN or SDL_WINDOW_RESIZABLE;
-
- {$IFDEF MOBILE}
- if isPhone() then
- SDL_SetHint('SDL_IOS_ORIENTATIONS','LandscapeLeft LandscapeRight');
- // no need for borders on mobile devices
- flags:= flags or SDL_WINDOW_BORDERLESS;
- {$ENDIF}
-
- if cFullScreen then
- flags:= flags or SDL_WINDOW_FULLSCREEN;
if SDLwindow = nil then
- SDLwindow:= SDL_CreateWindow('Hedgewars', x, y, cScreenWidth, cScreenHeight, flags);
- SDLTry(SDLwindow <> nil, true);
-{$ELSE}
- flags:= SDL_OPENGL or SDL_RESIZABLE;
- if cFullScreen then
- flags:= flags or SDL_FULLSCREEN;
- if not cOnlyStats then
+ begin
+
+ // SDL_WINDOW_RESIZABLE makes the window resizable and
+ // respond to rotation events on mobile devices
+ flags:= SDL_WINDOW_OPENGL or SDL_WINDOW_SHOWN or SDL_WINDOW_RESIZABLE;
+
+ {$IFDEF MOBILE}
+ if isPhone() then
+ SDL_SetHint('SDL_IOS_ORIENTATIONS','LandscapeLeft LandscapeRight');
+ // no need for borders on mobile devices
+ flags:= flags or SDL_WINDOW_BORDERLESS;
+ {$ENDIF}
+
+ if cFullScreen then
+ flags:= flags or SDL_WINDOW_FULLSCREEN;
+
+ SDLwindow:= SDL_CreateWindow(PChar('Hedgewars'), x, y, cScreenWidth, cScreenHeight, flags);
+ end
+ // we're toggling
+ else if Length(s) = 0 then
begin
- {$IFDEF WIN32}
- s:= SDL_getenv('SDL_VIDEO_CENTERED');
- SDL_putenv('SDL_VIDEO_CENTERED=1');
+ if cFullScreen then
+ begin
+ SDL_SetWindowSize(SDLwindow, cScreenWidth, cScreenHeight);
+ SDL_SetWindowFullscreen(SDLwindow, SDL_WINDOW_FULLSCREEN);
+ end
+ else
+ begin
+ SDL_SetWindowFullscreen(SDLwindow, 0);
+ SDL_SetWindowSize(SDLwindow, cScreenWidth, cScreenHeight);
+ SDL_SetWindowPosition(SDLwindow, x, y);
+ end;
+ updateViewLimits();
+ end;
+
+ if SDLCheck(SDLwindow <> nil, 'SDL_CreateWindow', true) then exit;
+
+ // load engine ico
+ {$IFNDEF DARWIN}
+ ico:= LoadDataImage(ptGraphics, 'hwengine', ifIgnoreCaps);
+ if ico <> nil then
+ begin
+ SDL_SetWindowIcon(SDLwindow, ico);
+ SDL_FreeSurface(ico);
+ end;
{$ENDIF}
- SDLPrimSurface:= SDL_SetVideoMode(cScreenWidth, cScreenHeight, 0, flags);
- SDLTry(SDLPrimSurface <> nil, true);
- {$IFDEF WIN32}
- SDL_putenv(str2pchar('SDL_VIDEO_CENTERED=' + s));
- {$ENDIF}
- end;
-{$ENDIF}
-
SetupOpenGL();
if reinit then
@@ -1179,7 +1146,6 @@
end;
end;
-{$IFDEF SDL2}
// for sdl1.2 we directly call SDL_WarpMouse()
// for sdl2 we provide a SDL_WarpMouse() which just calls this function
// this has the advantage of reducing 'uses' and 'ifdef' statements
@@ -1188,17 +1154,12 @@
begin
SDL_WarpMouseInWindow(SDLwindow, x, y);
end;
-{$ENDIF}
procedure SwapBuffers; {$IFDEF USE_VIDEO_RECORDING}cdecl{$ELSE}inline{$ENDIF};
begin
if GameType = gmtRecord then
exit;
-{$IFDEF SDL2}
SDL_GL_SwapWindow(SDLwindow);
-{$ELSE}
- SDL_GL_SwapBuffers();
-{$ENDIF}
end;
procedure SetSkyColor(r, g, b: real);
@@ -1226,12 +1187,8 @@
// init all count texture pointers
for i:= Low(CountTexz) to High(CountTexz) do
CountTexz[i] := nil;
-{$IFDEF SDL2}
SDLwindow:= nil;
SDLGLcontext:= nil;
-{$ELSE}
- SDLPrimSurface:= nil;
-{$ENDIF}
prevHat:= 'NoHat';
tmpHatSurf:= nil;
@@ -1253,10 +1210,8 @@
end;
TTF_Quit();
-{$IFDEF SDL2}
SDL_GL_DeleteContext(SDLGLcontext);
SDL_DestroyWindow(SDLwindow);
-{$ENDIF}
SDL_Quit();
end;
end.
--- a/hedgewars/uTeams.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uTeams.pas Fri Apr 01 15:36:19 2016 +0200
@@ -119,7 +119,7 @@
PrevHH, PrevTeam : LongWord;
begin
TargetPoint.X:= NoPointX;
-TryDo(CurrentTeam <> nil, 'nil Team', true);
+if checkFails(CurrentTeam <> nil, 'nil Team', true) then exit;
with CurrentHedgehog^ do
if (PreviousTeam <> nil) and PlacingHogs and Unplaced then
begin
@@ -127,7 +127,7 @@
if Gear <> nil then
begin
DeleteCI(Gear);
- FindPlace(Gear, false, 0, LAND_WIDTH);
+ FindPlace(Gear, false, 0, LAND_WIDTH, true);
if Gear <> nil then
AddCI(Gear)
end
@@ -355,9 +355,9 @@
var team: PTeam;
c, t: LongInt;
begin
-TryDo(TeamsCount < cMaxTeams, 'Too many teams', true);
+if checkFails(TeamsCount < cMaxTeams, 'Too many teams', true) then exit(nil);
New(team);
-TryDo(team <> nil, 'AddTeam: team = nil', true);
+if checkFails(team <> nil, 'AddTeam: team = nil', true) then exit(nil);
FillChar(team^, sizeof(TTeam), 0);
team^.AttackBar:= 2;
team^.CurrHedgehog:= 0;
@@ -551,10 +551,10 @@
s:= '';
if (not isDeveloperMode) then
exit;
-TryDo((CurrentTeam <> nil), 'Can''t add hedgehogs yet, add a team first!', true);
+if checkFails((CurrentTeam <> nil), 'Can''t add hedgehogs yet, add a team first!', true) then exit;
with CurrentTeam^ do
begin
- TryDo(HedgehogsNumber<=cMaxHHIndex, 'Can''t add hedgehog to "' + TeamName + '"! (already ' + intToStr(HedgehogsNumber) + ' hogs)', true);
+ if checkFails(HedgehogsNumber<=cMaxHHIndex, 'Can''t add hedgehog to "' + TeamName + '"! (already ' + intToStr(HedgehogsNumber) + ' hogs)', true) then exit;
SplitBySpace(id, s);
SwitchCurrentHedgehog(@Hedgehogs[HedgehogsNumber]);
CurrentHedgehog^.BotLevel:= StrToInt(id);
@@ -562,7 +562,7 @@
Gear:= AddGear(0, 0, gtHedgehog, 0, _0, _0, 0);
SplitBySpace(s, id);
Gear^.Health:= StrToInt(s);
- TryDo(Gear^.Health > 0, 'Invalid hedgehog health', true);
+ if checkFails(Gear^.Health > 0, 'Invalid hedgehog health', true) then exit;
if (GameFlags and gfSharedAmmo) <> 0 then
CurrentHedgehog^.AmmoStore:= Clan^.ClanIndex
else if (GameFlags and gfPerHogAmmo) <> 0 then
@@ -604,19 +604,22 @@
SplitBySpace(s, cs);
SplitBySpace(cs, ts);
Color:= StrToInt(cs);
- TryDo(Color <> 0, 'Error: black team color', true);
// color is always little endian so the mask must be constant also in big endian archs
Color:= Color or $FF000000;
AddTeam(Color);
- CurrentTeam^.TeamName:= ts;
- CurrentTeam^.PlayerHash:= s;
- loadTeamBinds(ts);
+
+ if CurrentTeam <> nil then
+ begin
+ CurrentTeam^.TeamName:= ts;
+ CurrentTeam^.PlayerHash:= s;
+ loadTeamBinds(ts);
- if GameType in [gmtDemo, gmtSave, gmtRecord] then
- CurrentTeam^.ExtDriven:= true;
+ if GameType in [gmtDemo, gmtSave, gmtRecord] then
+ CurrentTeam^.ExtDriven:= true;
- CurrentTeam^.voicepack:= AskForVoicepack('Default')
+ CurrentTeam^.voicepack:= AskForVoicepack('Default')
+ end
end
end;
--- a/hedgewars/uTextures.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uTextures.pas Fri Apr 01 15:36:19 2016 +0200
@@ -176,6 +176,9 @@
r, slr, w, si, li: LongWord;
begin
w:= surf^.w;
+ // just a single pixel, nothing to do here
+ if (w < 2) and (surf^.h < 2) then
+ exit;
slr:= surf^.h - 2;
si:= 0;
li:= w - 1;
@@ -226,7 +229,7 @@
if (surf^.format^.BytesPerPixel <> 4) then
begin
- TryDo(false, 'Surface2Tex failed, expecting 32 bit surface', true);
+ checkFails(false, 'Surface2Tex failed, expecting 32 bit surface', true);
Surface2Tex^.id:= 0;
exit
end;
@@ -236,7 +239,8 @@
glBindTexture(GL_TEXTURE_2D, Surface2Tex^.id);
if SDL_MustLock(surf) then
- SDLTry(SDL_LockSurface(surf) >= 0, true);
+ if SDLCheck(SDL_LockSurface(surf) >= 0, 'Lock surface', true) then
+ exit(nil);
fromP4:= Surf^.pixels;
--- a/hedgewars/uTouch.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uTouch.pas Fri Apr 01 15:36:19 2016 +0200
@@ -63,6 +63,7 @@
const
clickTime = 200;
+ nilFingerId = High(TSDL_FingerId);
baseRectSize = 96;
var
@@ -295,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;
@@ -422,6 +423,7 @@
fingers[index].historicalX := fingers[pointerCount].historicalX;
fingers[index].historicalY := fingers[pointerCount].historicalY;
fingers[index].timeSinceDown := fingers[pointerCount].timeSinceDown;
+ fingers[index].pressedWidget := fingers[pointerCount].pressedWidget;
fingers[pointerCount].id := 0;
end
--- a/hedgewars/uTypes.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uTypes.pas Fri Apr 01 15:36:19 2016 +0200
@@ -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,
@@ -88,7 +89,7 @@
sprBulletHit, sprSnowball, sprHandSnowball, sprSnow,
sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis,
sprSlider, sprBotlevels, sprHandKnife, sprKnife, sprStar, sprIceTexture, sprIceGun,
- sprFrozenHog, sprAmRubber, sprBoing, sprCustom1, sprCustom2, sprAirMine
+ sprFrozenHog, sprAmRubber, sprBoing, sprCustom1, sprCustom2, sprAirMine, sprHandAirMine
);
// Gears that interact with other Gears and/or Land
@@ -272,6 +273,7 @@
// DirAngle is a 'real' - if you do not need it for rotation of sprite in uGearsRender, you can use it for any visual-only value
DirAngle: real;
// These are frequently overridden to serve some other purpose
+ Boom: Longword; // amount of damage caused by the gear
Pos: Longword; // Commonly overridden. Example use is posCase values in uConsts.
Angle, Power : Longword; // Used for hog aiming/firing. Angle is rarely used as an Angle otherwise.
Timer, WDTimer : LongWord; // Typically used for some sort of gear timer. Time to explosion, remaining fuel...
@@ -455,7 +457,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,
--- a/hedgewars/uUtils.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uUtils.pas Fri Apr 01 15:36:19 2016 +0200
@@ -95,10 +95,10 @@
implementation
-uses {$IFNDEF PAS2C}typinfo, {$ENDIF}Math, uConsts, uVariables, SysUtils;
+uses {$IFNDEF PAS2C}typinfo, {$ENDIF}Math, uConsts, uVariables, SysUtils, uPhysFSLayer;
{$IFDEF DEBUGFILE}
-var logFile: textfile;
+var logFile: PFSFile;
{$IFDEF USE_VIDEO_RECORDING}
logMutex: TRTLCriticalSection; // mutex for debug file
{$ENDIF}
@@ -225,17 +225,8 @@
end;
function StrToInt(s: shortstring): LongInt;
-var c: LongInt;
begin
-{$IFDEF PAS2C}
val(s, StrToInt);
-{$ELSE}
-val(s, StrToInt, c);
-{$IFDEF DEBUGFILE}
-if c <> 0 then
- writeln(logFile, 'Error at position ' + IntToStr(c) + ' : ' + s[c])
-{$ENDIF}
-{$ENDIF}
end;
function FloatToStr(n: hwFloat): shortstring;
@@ -361,8 +352,7 @@
{$IFDEF USE_VIDEO_RECORDING}
EnterCriticalSection(logMutex);
{$ENDIF}
-writeln(logFile, inttostr(GameTicks) + ': ' + s);
-flush(logFile);
+pfsWriteLn(logFile, inttostr(GameTicks) + ': ' + s);
{$IFDEF USE_VIDEO_RECORDING}
LeaveCriticalSection(logMutex);
@@ -379,8 +369,9 @@
{$IFDEF USE_VIDEO_RECORDING}
EnterCriticalSection(logMutex);
{$ENDIF}
-write(logFile, s);
-flush(logFile);
+// TODO: uncomment next two lines
+// write(logFile, s);
+// flush(logFile);
{$IFDEF USE_VIDEO_RECORDING}
LeaveCriticalSection(logMutex);
{$ENDIF}
@@ -521,7 +512,6 @@
{$IFDEF DEBUGFILE}
var logfileBase: shortstring;
i: LongInt;
- rwfailed: boolean;
{$ENDIF}
begin
{$IFDEF DEBUGFILE}
@@ -545,35 +535,15 @@
{$IFDEF USE_VIDEO_RECORDING}
InitCriticalSection(logMutex);
{$ENDIF}
-{$I-}
- rwfailed:= false;
- if (length(UserPathPrefix) > 0) then
- begin
- {$IFNDEF PAS2C}
- // create directory if it doesn't exist
- if not FileExists(UserPathPrefix + '/Logs/') then
- CreateDir(UserPathPrefix + '/Logs/');
- {$ENDIF}
- // if log is locked, write to the next one
- i:= 0;
- while(i < 7) do
- begin
- assign(logFile, shortstring(UserPathPrefix) + '/Logs/' + logfileBase + inttostr(i) + '.log');
- Rewrite(logFile);
- // note: IOResult is a function in pascal and a variable in pas2c
- rwfailed:= (IOResult <> 0);
- if (not rwfailed) then
- break;
- inc(i)
- end;
- end;
-
-{$IFNDEF PAS2C}
- // if everything fails, write to stderr
- if (length(UserPathPrefix) = 0) or (rwfailed) then
- logFile:= stderr;
-{$ENDIF}
-{$I+}
+ // if log is locked, write to the next one
+ i:= 0;
+ while(i < 7) do
+ begin
+ logFile:= pfsOpenWrite('/Logs/' + logfileBase + inttostr(i) + '.log');
+ if logFile <> nil then
+ break;
+ inc(i)
+ end;
{$ENDIF}
//mobile stuff
@@ -594,9 +564,9 @@
procedure freeModule;
begin
{$IFDEF DEBUGFILE}
- writeln(logFile, 'halt at ' + inttostr(GameTicks) + ' ticks. TurnTimeLeft = ' + inttostr(TurnTimeLeft));
- flush(logFile);
- close(logFile);
+ pfsWriteLn(logFile, 'halt at ' + inttostr(GameTicks) + ' ticks. TurnTimeLeft = ' + inttostr(TurnTimeLeft));
+ pfsFlush(logFile);
+ pfsClose(logFile);
{$IFDEF USE_VIDEO_RECORDING}
DoneCriticalSection(logMutex);
{$ENDIF}
--- a/hedgewars/uVariables.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uVariables.pas Fri Apr 01 15:36:19 2016 +0200
@@ -21,7 +21,7 @@
unit uVariables;
interface
-uses SDLh, uTypes, uFloat, GLunit, uConsts, Math, uUtils, uMatrix;
+uses SDLh, uTypes, uFloat, GLunit, uConsts, Math, uUtils{$IFDEF GL2}, uMatrix{$ENDIF};
var
/////// init flags ///////
@@ -212,6 +212,10 @@
ScreenFade : TScreenFade;
ScreenFadeValue : LongInt;
ScreenFadeSpeed : LongInt;
+ InCinematicMode : boolean;
+ CinematicSteps : LongInt;
+ CinematicBarH : LongInt;
+ CinematicScript : boolean;
UIDisplay : TUIDisplay;
LocalMessage : LongWord;
@@ -238,14 +242,12 @@
LuaTemplateNumber : LongWord;
- LastVoice : TVoice = ( snd: sndNone; voicepack: nil );
+ LastVoice : TVoice;
mobileRecord: TMobileRecord;
MaxTextureSize: LongInt;
- ChatPasteBuffer: shortstring;
-
/////////////////////////////////////
//Buttons
{$IFDEF USE_TOUCH_INTERFACE}
@@ -259,7 +261,10 @@
var
// these consts are here because they would cause circular dependencies in uConsts/uTypes
- cPathz: array[TPathType] of shortstring = (
+ cPathz: array[TPathType] of shortstring;
+
+const
+ cPathzInit: array[TPathType] of shortstring = (
'', // ptNone
'//', // ptData
'/Graphics', // ptGraphics
@@ -286,7 +291,10 @@
);
var
- Fontz: array[THWFont] of THHFont = (
+ Fontz: array[THWFont] of THHFont;
+
+const
+ FontzInit: array[THWFont] of THHFont = (
(Handle: nil;
Height: 12;
style: TTF_STYLE_NORMAL;
@@ -316,7 +324,10 @@
);
var
- SpritesData: array[TSprite] of TSpriteData = (
+ SpritesData: array[TSprite] of TSpriteData;
+
+const
+ SpritesDataInit: array[TSprite] of TSpriteData = (
(FileName: 'BlueWater'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil;
Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprWater
(FileName: 'Clouds'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil;
@@ -418,13 +429,13 @@
{$IFDEF USE_TOUCH_INTERFACE}
(FileName: 'firebutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprFireButton
- (FileName: 'arrowUp'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
+ (FileName: 'arrowup'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowUp
- (FileName: 'arrowDown'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
+ (FileName: 'arrowdown'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowDown
- (FileName: 'arrowLeft'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
+ (FileName: 'arrowleft'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowLeft
- (FileName: 'arrowRight'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
+ (FileName: 'arrowright'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowRight
(FileName: 'forwardjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprAMWidget
@@ -432,10 +443,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
@@ -614,7 +627,7 @@
(FileName: 'Egg'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprEgg
(FileName: 'TargetBee'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
- Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetBee
+ Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetBee
(FileName: 'amBee'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBee
(FileName: 'Feather'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
@@ -713,7 +726,9 @@
(FileName: 'custom2'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil;
Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom2
(FileName: 'AirMine'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
- Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true)// sprAirMine
+ Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true), // sprAirMine
+ (FileName: 'amAirMine'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
+ Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true) // sprHandAirMine
);
const
@@ -734,8 +749,8 @@
(Sprite: sprJuggle; FramesCount: 49; Interval: 38; cmd: '/juggle'; Voice: sndNone; VoiceDelay: 0)
);
-var
- Ammoz: array [TAmmoType] of record
+type
+ TAmmozRec = record
NameId: TAmmoStrId;
NameTex: PTexture;
Probability, NumberInCase: Longword;
@@ -748,7 +763,13 @@
PosCount: Longword;
PosSprite: TSprite;
ejectX, ejectY: Longint;
- end = (
+ end;
+
+var
+ Ammoz: array [TAmmoType] of TAmmozRec;
+
+const
+ AmmozInit: array [TAmmoType] of TAmmozRec = (
(NameId: sidNothing;
NameTex: nil;
Probability: 0;
@@ -1346,7 +1367,7 @@
NameTex: nil;
Probability: 100;
NumberInCase: 4;
- Ammo: (Propz: 0;
+ Ammo: (Propz: ammoprop_NeedUpDown;
Count: 4;
NumPerTurn: 0;
Timer: 0;
@@ -2137,6 +2158,7 @@
NumberInCase: 1;
Ammo: (Propz: ammoprop_Power or
ammoprop_AltUse or
+ ammoprop_NeedUpDown or
ammoprop_NoRoundEnd;
Count: 2;
NumPerTurn: 0;
@@ -2218,6 +2240,7 @@
Probability: 20;
NumberInCase: 1;
Ammo: (Propz: ammoprop_NoRoundEnd or
+ ammoprop_NeedUpDown or
ammoprop_Utility;
Count: 1;
NumPerTurn: 0;
@@ -2493,7 +2516,19 @@
procedure initModule;
var s: shortstring;
+ i: integer;
begin
+ // init LastVoice
+ LastVoice.snd:= sndNone;
+ LastVoice.voicepack:= nil;
+
+ // init arrays
+ Move(cPathzInit, cPathz, sizeof(cPathz));
+ Move(FontzInit, Fontz, sizeof(Fontz));
+ Move(SpritesDataInit, SpritesData, sizeof(SpritesData));
+ Move(AmmozInit, Ammoz, sizeof(Ammoz));
+
+
cLocale:= cLocaleFName;
SplitByChar(cLocale, s, '.');
@@ -2654,6 +2689,10 @@
disableLandBack := false;
ScreenFade := sfNone;
+ InCinematicMode := false;
+ CinematicSteps := 0;
+ CinematicBarH := 0;
+ CinematicScript := false;
// those values still are not perfect
cLeftScreenBorder:= round(-cMinZoomLevel * cScreenWidth);
@@ -2674,8 +2713,13 @@
vobSDVelocity:= 15;
vobSDFallSpeed:= 250;
+{$IFDEF MOBILE}
+ cMinScreenWidth := min(cScreenWidth, 480);
+ cMinScreenHeight := min(cScreenHeight, 320);
+{$ELSE}
cMinScreenWidth := min(cScreenWidth, 640);
cMinScreenHeight := min(cScreenHeight, 480);
+{$ENDIF}
cNewScreenWidth := cScreenWidth;
cNewScreenHeight := cScreenHeight;
@@ -2701,7 +2745,42 @@
cViewLimitsDebug:= false;
AprilOne := false;
- ChatPasteBuffer:= '';
+ // initialize pointers to nil
+ // (don't rely on implicit init of fpc, because that one only happens ONCE when used as lib)
+ CurAmmoGear:= nil;
+ lastGearByUID:= nil;
+ GearsList:= nil;
+ CurrentTeam:= nil;
+ PreviousTeam:= nil;
+ CurrentHedgehog:= nil;
+ FollowGear:= nil;
+ lastVisualGearByUID:= nil;
+
+ ChefHatTexture:= nil;
+ CrosshairTexture:= nil;
+ GenericHealthTexture:= nil;
+ WeaponTooltipTex:= nil;
+ HHTexture:= nil;
+ LandBackSurface:= nil;
+ ConfirmTexture:= nil;
+ MissionIcons:= nil;
+ ropeIconTex:= nil;
+
+ for i:= Low(ClansArray) to High(ClansArray) do
+ begin
+ ClansArray[i]:= nil;
+ end;
+
+ for i:= Low(TeamsArray) to High(TeamsArray) do
+ begin
+ TeamsArray[i]:= nil;
+ end;
+
+ for i:= Low(CountTexz) to High(CountTexz) do
+ begin
+ CountTexz[i]:= nil;
+ end;
+
end;
procedure freeModule;
--- a/hedgewars/uVideoRec.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uVideoRec.pas Fri Apr 01 15:36:19 2016 +0200
@@ -58,7 +58,7 @@
filename, desc, soundFile, format, vcodec, acodec: PChar;
width, height, framerateNum, framerateDen, vquality: LongInt): LongInt; cdecl; external AvwrapperLibName;
function AVWrapper_Close: LongInt; cdecl; external AvwrapperLibName;
-function AVWrapper_WriteFrame( pY, pCb, pCr: PByte ): LongInt; cdecl; external AvwrapperLibName;
+function AVWrapper_WriteFrame(rgb: PByte): LongInt; cdecl; external AvwrapperLibName;
type TFrame = record
realTicks: LongWord;
@@ -109,7 +109,7 @@
filename:= UserPathPrefix + '/VideoTemp/' + RecPrefix;
soundFilePath:= UserPathPrefix + '/VideoTemp/' + RecPrefix + '.sw';
- TryDo(AVWrapper_Init(@AddFileLogRaw
+ if checkFails(AVWrapper_Init(@AddFileLogRaw
, PChar(ansistring(filename))
, PChar(ansistring(desc))
, PChar(ansistring(soundFilePath))
@@ -118,18 +118,9 @@
, PChar(ansistring(cAudioCodec))
, cScreenWidth, cScreenHeight, cVideoFramerateNum, cVideoFramerateDen, cVideoQuality) >= 0,
'AVWrapper_Init failed',
- true);
+ true) then exit(false);
numPixels:= cScreenWidth*cScreenHeight;
- YCbCr_Planes[0]:= GetMem(numPixels);
- YCbCr_Planes[1]:= GetMem(numPixels div 4);
- YCbCr_Planes[2]:= GetMem(numPixels div 4);
-
- if (YCbCr_Planes[0] = nil) or (YCbCr_Planes[1] = nil) or (YCbCr_Planes[2] = nil) then
- begin
- AddFileLog('Error: Could not allocate memory for video recording (YCbCr buffer).');
- exit(false);
- end;
RGB_Buffer:= GetMem(4*numPixels);
if RGB_Buffer = nil then
@@ -147,9 +138,6 @@
procedure StopVideoRecording;
begin
AddFileLog('StopVideoRecording');
- FreeMem(YCbCr_Planes[0], numPixels);
- FreeMem(YCbCr_Planes[1], numPixels div 4);
- FreeMem(YCbCr_Planes[2], numPixels div 4);
FreeMem(RGB_Buffer, 4*numPixels);
Close(cameraFile);
if AVWrapper_Close() < 0 then
@@ -159,36 +147,13 @@
SendIPC(_S'v'); // inform frontend that we finished
end;
-function pixel(x, y, color: LongInt): LongInt;
-begin
- pixel:= RGB_Buffer[(cScreenHeight-y-1)*cScreenWidth*4 + x*4 + color];
-end;
-
procedure EncodeFrame;
-var x, y, r, g, b: LongInt;
- s: shortstring;
+var s: shortstring;
begin
// read pixels from OpenGL
glReadPixels(0, 0, cScreenWidth, cScreenHeight, GL_RGBA, GL_UNSIGNED_BYTE, RGB_Buffer);
- // convert to YCbCr 4:2:0 format
- // Y
- for y := 0 to cScreenHeight-1 do
- for x := 0 to cScreenWidth-1 do
- YCbCr_Planes[0][y*cScreenWidth + x]:= Byte(16 + ((16828*pixel(x,y,0) + 33038*pixel(x,y,1) + 6416*pixel(x,y,2)) shr 16));
-
- // Cb and Cr
- for y := 0 to cScreenHeight div 2 - 1 do
- for x := 0 to cScreenWidth div 2 - 1 do
- begin
- r:= pixel(2*x,2*y,0) + pixel(2*x+1,2*y,0) + pixel(2*x,2*y+1,0) + pixel(2*x+1,2*y+1,0);
- g:= pixel(2*x,2*y,1) + pixel(2*x+1,2*y,1) + pixel(2*x,2*y+1,1) + pixel(2*x+1,2*y+1,1);
- b:= pixel(2*x,2*y,2) + pixel(2*x+1,2*y,2) + pixel(2*x,2*y+1,2) + pixel(2*x+1,2*y+1,2);
- YCbCr_Planes[1][y*(cScreenWidth div 2) + x]:= Byte(128 + ((-2428*r - 4768*g + 7196*b) shr 16));
- YCbCr_Planes[2][y*(cScreenWidth div 2) + x]:= Byte(128 + (( 7196*r - 6026*g - 1170*b) shr 16));
- end;
-
- if AVWrapper_WriteFrame(YCbCr_Planes[0], YCbCr_Planes[1], YCbCr_Planes[2]) < 0 then
+ if AVWrapper_WriteFrame(RGB_Buffer) < 0 then
halt(-1);
// inform frontend that we have encoded new frame
--- a/hedgewars/uWorld.pas Fri Sep 11 04:05:09 2015 +0200
+++ b/hedgewars/uWorld.pas Fri Apr 01 15:36:19 2016 +0200
@@ -1148,7 +1148,7 @@
procedure ShiftWorld(Dir: LongInt); inline;
begin
preShiftWorldDx:= WorldDx;
- WorldDx:= WorldDx + Dir * LongInt(playWidth);
+ WorldDx:= WorldDx + LongInt(Dir * LongInt(playWidth));
end;
@@ -1382,6 +1382,39 @@
// this scale is used to keep the various widgets at the same dimension at all zoom levels
SetScale(cDefaultZoomLevel);
+// cinematic effects
+if CinematicScript or (InCinematicMode and autoCameraOn
+ and ((CurrentHedgehog = nil) or CurrentHedgehog^.Team^.ExtDriven
+ or (CurrentHedgehog^.BotLevel <> 0) or (GameType = gmtDemo))) then
+ begin
+ if CinematicSteps < 300 then
+ begin
+ inc(CinematicSteps, Lag);
+ if CinematicSteps > 300 then
+ CinematicSteps:= 300;
+ end;
+ end
+else if CinematicSteps > 0 then
+ begin
+ dec(CinematicSteps, Lag);
+ if CinematicSteps < 0 then
+ CinematicSteps:= 0;
+ end;
+
+// render black bars
+if CinematicSteps > 0 then
+ begin
+ r.x:= ViewLeftX;
+ r.w:= ViewWidth;
+ r.y:= ViewTopY;
+ CinematicBarH:= (ViewHeight * CinematicSteps) div 2048;
+ r.h:= CinematicBarH;
+ DrawRect(r, 0, 0, 0, $FF, true);
+ r.y:= ViewBottomY - r.h;
+ DrawRect(r, 0, 0, 0, $FF, true);
+ end;
+
+
// Turn time
if UIDisplay <> uiNone then
begin
@@ -1737,7 +1770,7 @@
CursorPoint.X:= (prevPoint.X * 7 + dstX) div 8;
end;
- if isPhone() or (cScreenHeight < 600) or ((FollowGear^.dY * z).Round < 10) then
+ if isPhone() or (cScreenHeight < 600) or (hwFloat(FollowGear^.dY * z).Round < 10) then
CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y) + WorldDy)) div 8
else
CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y) + hwSign(FollowGear^.dY) * z + WorldDy)) div 8;
@@ -1751,7 +1784,7 @@
WorldDx:= WorldDx + LongInt(rightX) - leftX;
end;
-wdy:= trunc(cScreenHeight / cScaleFactor) + cScreenHeight div 2 - cWaterLine - cVisibleWater;
+wdy:= trunc(cScreenHeight / cScaleFactor) + cScreenHeight div 2 - cWaterLine - (cVisibleWater + trunc(CinematicBarH / (cScaleFactor / 2.0)));
if WorldDy < wdy then
WorldDy:= wdy;
@@ -1930,7 +1963,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 +1975,7 @@
end
else if ammoType = amSwitch then
begin
- utilityWidget.sprite:= sprTargetButton;
+ utilityWidget.sprite:= sprSwitchButton;
animateWidget(@utilityWidget, true, true);
end
else if utilityWidget.show then
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/OfficialChallenges/racer_#18.hwmap Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,1 @@
+AAABrnicJcsxS0JRGMbx55xzzz2ecymJllwCCYeGPoDjJaVR1K0tihoEa2nR1dD6BBdBCDIIahACxwzqonIXDRochIIGh4Yg2ju+d/nx8Od9kymsI/GtctAb/AbuoTyHGcod6KTzBfdU3MJtsgPIFqt1ZMu5QOKEYDVqUEVR76iiSsO7J0SdGvRcNjp6jheoZ0I2qEEGrB3JwLmEHhOsTQ2qh0Gkem4BekpgQA1eX1Qir69SUD4hKtSgN9l+pFedz4lb5d3Qcgf5GNPFssGMnFJoRqIJ80o4JWrwyjwIvbLYhVcgeEANesbsxwOzJ3sqFVp+aMF7khhbEljJxYAa1MJNvstrnhlatiHKMRksG9wrdvymFmJrqv94NjRHPIvEr/Inas2ZTUya+2PzwX0YyfORxa5uTJ4azBnXka7K3+k/hAxnGg==
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/OfficialChallenges/racer_#19.hwmap Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,1 @@
+AAACWHicJdGxS1tRFMfx3825556TtJ0cRdCpFIpLJzOktIUGQZBCh0hLx+IoCoKDFFok2CJFKDilon9AEB/SwRZKhEDiEGhxKTg5+FQchEAtYuh95y2f4TtcOL97b9qNgd/gH7hG1+Az/gx9Ty8QRHZRWpM96CI/QnhcmEvCn8JORh96krODrEHrJInW+Rvkp0FiDdLnqUT6YRj82+Apa5AR6iYy4lcRnhnUtQZ/7MqJP6ZfkFXDla1B9+k80X1+iOKtQefW4C9dJfWX1II8MVzFGkKVBmmo+ivogkEDa+Abnk35JtyBfDd41hr0lT9KIxUUOzlH1qAHhX6qB/QB+s7Izo8NpUm/fBhp4O5MzrI1hKHQPAxD+jK+bISmNciEK7VlAkDoGq5kDf6p225HfoCqOdvW4Feo1Y58gvuY07KG4lu//jWyBlnJWbeWbTC/EdcYhjww3Lw1hPt80WClesNfuecNfo2/vfjxgx5f8JdeaNKgE5q+jOK4kQ0WG2SLNjuyVZiDLBm0aQ06yrWOjvpb6KnBNWv4DxsWmqM=
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/OfficialChallenges/racer_#20.hwmap Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,1 @@
+AAAG73icPdR7bBRFHAfw79zM/Gb3XntQyqNBSAVFm2qlAp4RUDRtA5FCiKASmwaMREs0hIeBIAp4lROKAmLkJWCiRAkGwhlQQ4xajr4o1xY4aGl4GKGPAIZTuFSw6+y2xz+ffH/fmdub3WTXXIHlMIfxNHwpOQGilQ+DWab2A5XYFEOlugmrxwWb3A7BTkWxYKdnOliLiyK3A88X4RjPl70IchcRdjvYt1GZ1FxF6ME+Kt0OVpr9lXSAXZzBHREU05MOCI3J4I4YSOGkA0JDMrgjRqiapIPenMEdrR9UQ9IBvXcyuCObouqSeqwD3tBJcw72F330dcDT+rf2aL2Z6lUq6QBMzuCOVovqSVotxnr0o3r6CAUNT9IB9qsZ3DHkUTtPaA7BKu9jp9vpO1dbTmhWIjSwjy1uB+u2WnvCAcbEDO6Ix9XKEw6wCzK4I55Ti+P2x2o1MNVJL6nFwEWqittTqQrYJK/H7S3yul6VHXH7O9kBPHo/jZfdcfuw7AaznO4xp3tNXo3bG+VVsFUUjdvPUxSoEmWneheKMlgpMa211xTTgGKdBoR1srpYqrV3IdPPqkynAWGdrGbKa/1vBuXpTqcBYZ0MIBUzYBxAP0j1k8UKYkaWvQj9sIJ+JJsWM6T9OWgFK75BC1jBTbOMpdtprZgEMyzC7f4c+Qe8Sylvl5F0/uOILN7lS9Fu+IO0bmtgOKURWKqqz/pzVTWoi/ISBmQWHHRSf8IwVXWCgnrVN1zUJgJhAgIzqCxhJIU+y12Rd9EcIgqumMPFlGuaaftMiEn7zCliyD6zkR/YbjbKHfCu4M3bvStkF7yDqOK0dxA39XPh5mn7XZ3EZU/PNiriIVA2r9hMP3sug857OjaorZ6ZMLNYxQbK55thrmITNxifsCMQZ3jOBf9I+XIi0C1K4Tsv6hKBOOXCHxDHO+R7rGCHr0i2NfmKqByBES6yDU4HXwnNbvKVyBL0Q7PvM1cviNHOrTrQXLeD96gYEPGN5/vh/ZXmRXyvUzO8PbQn4sumg/CmaRu8N2kffNfkU3s145I+JQvrfNWyEOIRZFexTthVZo7wNpk59CHMobSmyStojU4i55x+aprBDjl9aehGc6TI+dRZ+NTZouHttTplwczlnbVmrk5qsDgcpSHiDrgU6SivFHvgEBUPiDTESL4/Ki6IwXCIyt/5JohG3h4VN3gbREqDK3xXlG0WDA5Rz3y+DWwNr42yr3gt2PcaeZr/W0tTxTCwDyh/Nx2hfLBRcmYjG0VtTprVqL6Ws8DuyMURzT14ItIT0UzWp5LHIp57chl4tfgnwg/JZyDelr9ERFh3coQUEZGSRZClMhaRa+VbkH/rq1BYHgV1i3SEfpRPQAl5IKK+lGehIvJmRC0iBTWHRkE9S36oYv3qqgX6vdSpHepheQ7KkqfBFlDbSZZ0DnmJzic8hdRW69lL51s8vdR8is+j5gb+Da1pFEQzGsQceqVetNBnZ2QJ/dYgY7TnFDF6s4Eq6IUENdKSk8qib+tVGS2vV+U0tkaVy1t1aqU8VkOX1Moa9ZP+0qhVomudUSS6YCxTa9cZy4xCGKUytM4oNYKwLK5aQmO4gnVcE7zLg86oF8q56ST9Qoy7v2X0/bSaSydJ+JP0YkugkB6Cv4HKGwLz6RaC2TQZ/o/4O+uDSzyH1ls9LK/KPs7y9Gddp9AYnSiPjW1Rg9hY0EE2pVO+z57cpZmA/wEVf+kG
\ No newline at end of file
--- a/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Fri Sep 11 04:05:09 2015 +0200
+++ b/misc/liblua/Xcode/Lua.xcodeproj/project.pbxproj Fri Apr 01 15:36:19 2016 +0200
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 45;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -289,8 +289,11 @@
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0710;
+ };
buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Lua" */;
- compatibilityVersion = "Xcode 3.1";
+ compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
@@ -354,7 +357,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = NO;
DSTROOT = /tmp/Lua.dst;
GCC_DYNAMIC_NO_PIC = NO;
@@ -365,6 +367,8 @@
GCC_PREFIX_HEADER = Lua_Prefix.pch;
INSTALL_PATH = /usr/local/lib;
PRODUCT_NAME = Lua;
+ SKIP_INSTALL = YES;
+ VALID_ARCHS = "armv7 x86_64 arm64";
};
name = Debug;
};
@@ -372,49 +376,78 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
DSTROOT = /tmp/Lua.dst;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = Lua_Prefix.pch;
INSTALL_PATH = /usr/local/lib;
PRODUCT_NAME = Lua;
+ SKIP_INSTALL = YES;
+ VALID_ARCHS = "armv7 x86_64 arm64";
};
name = Release;
};
1DEB922308733DC00010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ 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;
GCC_THUMB_SUPPORT = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+ ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "-ObjC";
PREBINDING = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
+ VALID_ARCHS = "armv7 armv7s arm64";
};
name = Debug;
};
1DEB922408733DC00010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = c99;
GCC_FAST_MATH = YES;
+ GCC_NO_COMMON_BLOCKS = 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_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
OTHER_LDFLAGS = "-ObjC";
PREBINDING = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
+ VALID_ARCHS = "armv7 armv7s arm64";
};
name = Release;
};
--- a/misc/libphysfs/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/misc/libphysfs/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -148,7 +148,7 @@
if(WINDOWS)
set(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
set(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
- list(APPEND OTHER_LDFLAGS ${SDL_LIBRARY})
+ list(APPEND OTHER_LDFLAGS ${SDL2_LIBRARY})
endif(WINDOWS)
if(NOT PHYSFS_HAVE_CDROM_SUPPORT)
--- a/misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj Fri Sep 11 04:05:09 2015 +0200
+++ b/misc/libphysfs/Xcode/Physfs.xcodeproj/project.pbxproj Fri Apr 01 15:36:19 2016 +0200
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 45;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -178,8 +178,11 @@
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0710;
+ };
buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Physfs" */;
- compatibilityVersion = "Xcode 3.1";
+ compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
@@ -230,7 +233,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = NO;
DSTROOT = /tmp/Physfs.dst;
GCC_DYNAMIC_NO_PIC = NO;
@@ -241,6 +243,7 @@
GCC_PREFIX_HEADER = Physfs_Prefix.pch;
INSTALL_PATH = /usr/local/lib;
PRODUCT_NAME = Physfs;
+ SKIP_INSTALL = YES;
};
name = Debug;
};
@@ -248,13 +251,13 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
DSTROOT = /tmp/Physfs.dst;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = Physfs_Prefix.pch;
INSTALL_PATH = /usr/local/lib;
PRODUCT_NAME = Physfs;
+ SKIP_INSTALL = YES;
};
name = Release;
};
@@ -262,20 +265,36 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ 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;
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = (
"\"$(SRCROOT)/../../liblua\"",
"\"$(SRCROOT)/../../../../Library/SDL/include\"",
);
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+ ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "-ObjC";
PREBINDING = NO;
SDKROOT = iphoneos;
+ VALID_ARCHS = "armv7 x86_64 arm64";
};
name = Debug;
};
@@ -283,19 +302,33 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = (
"\"$(SRCROOT)/../../liblua\"",
"\"$(SRCROOT)/../../../../Library/SDL/include\"",
);
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
OTHER_LDFLAGS = "-ObjC";
PREBINDING = NO;
SDKROOT = iphoneos;
+ VALID_ARCHS = "armv7 x86_64 arm64";
};
name = Release;
};
--- a/misc/libphyslayer/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/misc/libphyslayer/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -1,7 +1,7 @@
+find_package(SDL2 REQUIRED)
-find_package(SDL1or2)
+include_directories(${SDL2_INCLUDE_DIR})
include_directories(${PHYSFS_INCLUDE_DIR})
-include_directories(${SDL_INCLUDE_DIR})
include_directories(${LUA_INCLUDE_DIR})
@@ -15,7 +15,7 @@
#compiles and links actual library
add_library (physlayer ${PHYSLAYER_SRCS})
#TODO: find good VERSION and SOVERSION values
-target_link_libraries(physlayer ${SDL_LIBRARY} lua physfs)
+target_link_libraries(physlayer ${SDL2_LIBRARY} lua physfs)
install(TARGETS physlayer RUNTIME DESTINATION ${target_binary_install_dir}
LIBRARY DESTINATION ${target_library_install_dir}
ARCHIVE DESTINATION ${target_library_install_dir})
--- a/misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj Fri Sep 11 04:05:09 2015 +0200
+++ b/misc/libphyslayer/Xcode/Physlayer.xcodeproj/project.pbxproj Fri Apr 01 15:36:19 2016 +0200
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 45;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -124,8 +124,11 @@
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0710;
+ };
buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Physlayer" */;
- compatibilityVersion = "Xcode 3.1";
+ compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
@@ -162,7 +165,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = NO;
DSTROOT = /tmp/Physlayer.dst;
GCC_DYNAMIC_NO_PIC = NO;
@@ -173,6 +175,7 @@
GCC_PREFIX_HEADER = Physlayer_Prefix.pch;
INSTALL_PATH = /usr/local/lib;
PRODUCT_NAME = Physlayer;
+ SKIP_INSTALL = YES;
};
name = Debug;
};
@@ -180,24 +183,70 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
DSTROOT = /tmp/Physlayer.dst;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = Physlayer_Prefix.pch;
INSTALL_PATH = /usr/local/lib;
PRODUCT_NAME = Physlayer;
+ SKIP_INSTALL = YES;
};
name = Release;
};
1DEB922308733DC00010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ 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;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "\"$(SRCROOT)/../../libphysfs\"",
+ "\"$(SRCROOT)/../../liblua\"",
+ "\"$(SRCROOT)/../../../../Library/SDL/include\"",
+ );
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = "-ObjC";
+ PREBINDING = NO;
+ SDKROOT = iphoneos;
+ VALID_ARCHS = "armv7 x86_64 arm64";
+ };
+ name = Debug;
+ };
+ 1DEB922408733DC00010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = (
"\"$(SRCROOT)/../../libphysfs\"",
@@ -207,25 +256,7 @@
OTHER_LDFLAGS = "-ObjC";
PREBINDING = NO;
SDKROOT = iphoneos;
- };
- name = Debug;
- };
- 1DEB922408733DC00010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
- GCC_C_LANGUAGE_STANDARD = c99;
- GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "\"$(SRCROOT)/../../libphysfs\"",
- "\"$(SRCROOT)/../../liblua\"",
- "\"$(SRCROOT)/../../../../Library/SDL/include\"",
- );
- OTHER_LDFLAGS = "-ObjC";
- PREBINDING = NO;
- SDKROOT = iphoneos;
+ VALID_ARCHS = "armv7 x86_64 arm64";
};
name = Release;
};
--- a/misc/winutils/include/GL/glut.h Fri Sep 11 04:05:09 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,716 +0,0 @@
-#ifndef __glut_h__
-#define __glut_h__
-
-/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */
-
-/* This program is freely distributable without licensing fees and is
- provided without guarantee or warrantee expressed or implied. This
- program is -not- in the public domain. */
-
-#if defined(_WIN32)
-
-/* GLUT 3.7 now tries to avoid including <windows.h>
- to avoid name space pollution, but Win32's <GL/gl.h>
- needs APIENTRY and WINGDIAPI defined properly. */
-# if 0
- /* This would put tons of macros and crap in our clean name space. */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# else
- /* XXX This is from Win32's <windef.h> */
-# ifndef APIENTRY
-# define GLUT_APIENTRY_DEFINED
-# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) || defined(__LCC__)
-# define APIENTRY __stdcall
-# else
-# define APIENTRY
-# endif
-# endif
- /* XXX This is from Win32's <winnt.h> */
-# ifndef CALLBACK
-# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) || defined(__LCC__)
-# define CALLBACK __stdcall
-# else
-# define CALLBACK
-# endif
-# endif
- /* XXX Hack for lcc compiler. It doesn't support __declspec(dllimport), just __stdcall. */
-# if defined( __LCC__ )
-# undef WINGDIAPI
-# define WINGDIAPI __stdcall
-# else
- /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
-# ifndef WINGDIAPI
-# define GLUT_WINGDIAPI_DEFINED
-# define WINGDIAPI __declspec(dllimport)
-# endif
-# endif
- /* XXX This is from Win32's <ctype.h> */
-# ifndef _WCHAR_T_DEFINED
-typedef unsigned short wchar_t;
-# define _WCHAR_T_DEFINED
-# endif
-# endif
-
-/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA
- in your compile preprocessor options. */
-# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA)
-# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */
-/* To enable automatic SGI OpenGL for Windows library usage for GLUT,
- define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */
-# ifdef GLUT_USE_SGI_OPENGL
-# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */
-# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */
-# pragma comment (lib, "glut.lib") /* link with Win32 GLUT for SGI OpenGL lib */
-# else
-# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */
-# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */
-# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */
-# endif
-# endif
-
-/* To disable supression of annoying warnings about floats being promoted
- to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor
- options. */
-# ifndef GLUT_NO_WARNING_DISABLE
-# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */
-# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
-# endif
-
-/* Win32 has an annoying issue where there are multiple C run-time
- libraries (CRTs). If the executable is linked with a different CRT
- from the GLUT DLL, the GLUT DLL will not share the same CRT static
- data seen by the executable. In particular, atexit callbacks registered
- in the executable will not be called if GLUT calls its (different)
- exit routine). GLUT is typically built with the
- "/MD" option (the CRT with multithreading DLL support), but the Visual
- C++ linker default is "/ML" (the single threaded CRT).
-
- One workaround to this issue is requiring users to always link with
- the same CRT as GLUT is compiled with. That requires users supply a
- non-standard option. GLUT 3.7 has its own built-in workaround where
- the executable's "exit" function pointer is covertly passed to GLUT.
- GLUT then calls the executable's exit function pointer to ensure that
- any "atexit" calls registered by the application are called if GLUT
- needs to exit.
-
- Note that the __glut*WithExit routines should NEVER be called directly.
- To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
-
-/* XXX This is from Win32's <process.h> */
-# if !defined(_MSC_VER) && !defined(__cdecl)
- /* Define __cdecl for non-Microsoft compilers. */
-# define __cdecl
-# define GLUT_DEFINED___CDECL
-# endif
-# ifndef _CRTIMP
-# ifdef _NTSDK
- /* Definition compatible with NT SDK */
-# define _CRTIMP
-# else
- /* Current definition */
-# ifdef _DLL
-# define _CRTIMP __declspec(dllimport)
-# else
-# define _CRTIMP
-# endif
-# endif
-# define GLUT_DEFINED__CRTIMP
-# endif
-
-/* GLUT API entry point declarations for Win32. */
-# ifdef GLUT_BUILDING_LIB
-# define GLUTAPI __declspec(dllexport)
-# else
-# ifdef _DLL
-# define GLUTAPI __declspec(dllimport)
-# else
-# define GLUTAPI extern
-# endif
-# endif
-
-/* GLUT callback calling convention for Win32. */
-# define GLUTCALLBACK __cdecl
-
-#endif /* _WIN32 */
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(_WIN32)
-# ifndef GLUT_BUILDING_LIB
-extern _CRTIMP void __cdecl exit(int);
-# endif
-#else
-/* non-Win32 case. */
-/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */
-# define APIENTRY
-# define GLUT_APIENTRY_DEFINED
-# define CALLBACK
-/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */
-# define GLUTAPI extern
-# define GLUTCALLBACK
-/* Prototype exit for the non-Win32 case (see above). */
-extern void exit(int);
-#endif
-
-/**
- GLUT API revision history:
-
- GLUT_API_VERSION is updated to reflect incompatible GLUT
- API changes (interface changes, semantic changes, deletions,
- or additions).
-
- GLUT_API_VERSION=1 First public release of GLUT. 11/29/94
-
- GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling,
- extension. Supports new input devices like tablet, dial and button
- box, and Spaceball. Easy to query OpenGL extensions.
-
- GLUT_API_VERSION=3 glutMenuStatus added.
-
- GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer,
- glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
- video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
- glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
- glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!).
-**/
-#ifndef GLUT_API_VERSION /* allow this to be overriden */
-#define GLUT_API_VERSION 3
-#endif
-
-/**
- GLUT implementation revision history:
-
- GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
- API revisions and implementation revisions (ie, bug fixes).
-
- GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of
- GLUT Xlib-based implementation. 11/29/94
-
- GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of
- GLUT Xlib-based implementation providing GLUT version 2
- interfaces.
-
- GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95
-
- GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95
-
- GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95
-
- GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96
-
- GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner
- and video resize. 1/3/97
-
- GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
-
- GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
-
- GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
-
- GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
-
- GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
-
- GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
-**/
-#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */
-#define GLUT_XLIB_IMPLEMENTATION 15
-#endif
-
-/* Display mode bit masks. */
-#define GLUT_RGB 0
-#define GLUT_RGBA GLUT_RGB
-#define GLUT_INDEX 1
-#define GLUT_SINGLE 0
-#define GLUT_DOUBLE 2
-#define GLUT_ACCUM 4
-#define GLUT_ALPHA 8
-#define GLUT_DEPTH 16
-#define GLUT_STENCIL 32
-#if (GLUT_API_VERSION >= 2)
-#define GLUT_MULTISAMPLE 128
-#define GLUT_STEREO 256
-#endif
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_LUMINANCE 512
-#endif
-
-/* Mouse buttons. */
-#define GLUT_LEFT_BUTTON 0
-#define GLUT_MIDDLE_BUTTON 1
-#define GLUT_RIGHT_BUTTON 2
-
-/* Mouse button state. */
-#define GLUT_DOWN 0
-#define GLUT_UP 1
-
-#if (GLUT_API_VERSION >= 2)
-/* function keys */
-#define GLUT_KEY_F1 1
-#define GLUT_KEY_F2 2
-#define GLUT_KEY_F3 3
-#define GLUT_KEY_F4 4
-#define GLUT_KEY_F5 5
-#define GLUT_KEY_F6 6
-#define GLUT_KEY_F7 7
-#define GLUT_KEY_F8 8
-#define GLUT_KEY_F9 9
-#define GLUT_KEY_F10 10
-#define GLUT_KEY_F11 11
-#define GLUT_KEY_F12 12
-/* directional keys */
-#define GLUT_KEY_LEFT 100
-#define GLUT_KEY_UP 101
-#define GLUT_KEY_RIGHT 102
-#define GLUT_KEY_DOWN 103
-#define GLUT_KEY_PAGE_UP 104
-#define GLUT_KEY_PAGE_DOWN 105
-#define GLUT_KEY_HOME 106
-#define GLUT_KEY_END 107
-#define GLUT_KEY_INSERT 108
-#endif
-
-/* Entry/exit state. */
-#define GLUT_LEFT 0
-#define GLUT_ENTERED 1
-
-/* Menu usage state. */
-#define GLUT_MENU_NOT_IN_USE 0
-#define GLUT_MENU_IN_USE 1
-
-/* Visibility state. */
-#define GLUT_NOT_VISIBLE 0
-#define GLUT_VISIBLE 1
-
-/* Window status state. */
-#define GLUT_HIDDEN 0
-#define GLUT_FULLY_RETAINED 1
-#define GLUT_PARTIALLY_RETAINED 2
-#define GLUT_FULLY_COVERED 3
-
-/* Color index component selection values. */
-#define GLUT_RED 0
-#define GLUT_GREEN 1
-#define GLUT_BLUE 2
-
-#if defined(_WIN32)
-/* Stroke font constants (use these in GLUT program). */
-#define GLUT_STROKE_ROMAN ((void*)0)
-#define GLUT_STROKE_MONO_ROMAN ((void*)1)
-
-/* Bitmap font constants (use these in GLUT program). */
-#define GLUT_BITMAP_9_BY_15 ((void*)2)
-#define GLUT_BITMAP_8_BY_13 ((void*)3)
-#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4)
-#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5)
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_BITMAP_HELVETICA_10 ((void*)6)
-#define GLUT_BITMAP_HELVETICA_12 ((void*)7)
-#define GLUT_BITMAP_HELVETICA_18 ((void*)8)
-#endif
-#else
-/* Stroke font opaque addresses (use constants instead in source code). */
-GLUTAPI void *glutStrokeRoman;
-GLUTAPI void *glutStrokeMonoRoman;
-
-/* Stroke font constants (use these in GLUT program). */
-#define GLUT_STROKE_ROMAN (&glutStrokeRoman)
-#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman)
-
-/* Bitmap font opaque addresses (use constants instead in source code). */
-GLUTAPI void *glutBitmap9By15;
-GLUTAPI void *glutBitmap8By13;
-GLUTAPI void *glutBitmapTimesRoman10;
-GLUTAPI void *glutBitmapTimesRoman24;
-GLUTAPI void *glutBitmapHelvetica10;
-GLUTAPI void *glutBitmapHelvetica12;
-GLUTAPI void *glutBitmapHelvetica18;
-
-/* Bitmap font constants (use these in GLUT program). */
-#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15)
-#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13)
-#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10)
-#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24)
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10)
-#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12)
-#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18)
-#endif
-#endif
-
-/* glutGet parameters. */
-#define GLUT_WINDOW_X ((GLenum) 100)
-#define GLUT_WINDOW_Y ((GLenum) 101)
-#define GLUT_WINDOW_WIDTH ((GLenum) 102)
-#define GLUT_WINDOW_HEIGHT ((GLenum) 103)
-#define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104)
-#define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105)
-#define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106)
-#define GLUT_WINDOW_RED_SIZE ((GLenum) 107)
-#define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108)
-#define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109)
-#define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110)
-#define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111)
-#define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112)
-#define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113)
-#define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114)
-#define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115)
-#define GLUT_WINDOW_RGBA ((GLenum) 116)
-#define GLUT_WINDOW_PARENT ((GLenum) 117)
-#define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118)
-#define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119)
-#if (GLUT_API_VERSION >= 2)
-#define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120)
-#define GLUT_WINDOW_STEREO ((GLenum) 121)
-#endif
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_WINDOW_CURSOR ((GLenum) 122)
-#endif
-#define GLUT_SCREEN_WIDTH ((GLenum) 200)
-#define GLUT_SCREEN_HEIGHT ((GLenum) 201)
-#define GLUT_SCREEN_WIDTH_MM ((GLenum) 202)
-#define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203)
-#define GLUT_MENU_NUM_ITEMS ((GLenum) 300)
-#define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400)
-#define GLUT_INIT_WINDOW_X ((GLenum) 500)
-#define GLUT_INIT_WINDOW_Y ((GLenum) 501)
-#define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502)
-#define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503)
-#define GLUT_INIT_DISPLAY_MODE ((GLenum) 504)
-#if (GLUT_API_VERSION >= 2)
-#define GLUT_ELAPSED_TIME ((GLenum) 700)
-#endif
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-#define GLUT_WINDOW_FORMAT_ID ((GLenum) 123)
-#endif
-
-#if (GLUT_API_VERSION >= 2)
-/* glutDeviceGet parameters. */
-#define GLUT_HAS_KEYBOARD ((GLenum) 600)
-#define GLUT_HAS_MOUSE ((GLenum) 601)
-#define GLUT_HAS_SPACEBALL ((GLenum) 602)
-#define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603)
-#define GLUT_HAS_TABLET ((GLenum) 604)
-#define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605)
-#define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606)
-#define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607)
-#define GLUT_NUM_DIALS ((GLenum) 608)
-#define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609)
-#endif
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-#define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610)
-#define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611)
-#define GLUT_HAS_JOYSTICK ((GLenum) 612)
-#define GLUT_OWNS_JOYSTICK ((GLenum) 613)
-#define GLUT_JOYSTICK_BUTTONS ((GLenum) 614)
-#define GLUT_JOYSTICK_AXES ((GLenum) 615)
-#define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616)
-#endif
-
-#if (GLUT_API_VERSION >= 3)
-/* glutLayerGet parameters. */
-#define GLUT_OVERLAY_POSSIBLE ((GLenum) 800)
-#define GLUT_LAYER_IN_USE ((GLenum) 801)
-#define GLUT_HAS_OVERLAY ((GLenum) 802)
-#define GLUT_TRANSPARENT_INDEX ((GLenum) 803)
-#define GLUT_NORMAL_DAMAGED ((GLenum) 804)
-#define GLUT_OVERLAY_DAMAGED ((GLenum) 805)
-
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-/* glutVideoResizeGet parameters. */
-#define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900)
-#define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901)
-#define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902)
-#define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903)
-#define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904)
-#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905)
-#define GLUT_VIDEO_RESIZE_X ((GLenum) 906)
-#define GLUT_VIDEO_RESIZE_Y ((GLenum) 907)
-#define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908)
-#define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909)
-#endif
-
-/* glutUseLayer parameters. */
-#define GLUT_NORMAL ((GLenum) 0)
-#define GLUT_OVERLAY ((GLenum) 1)
-
-/* glutGetModifiers return mask. */
-#define GLUT_ACTIVE_SHIFT 1
-#define GLUT_ACTIVE_CTRL 2
-#define GLUT_ACTIVE_ALT 4
-
-/* glutSetCursor parameters. */
-/* Basic arrows. */
-#define GLUT_CURSOR_RIGHT_ARROW 0
-#define GLUT_CURSOR_LEFT_ARROW 1
-/* Symbolic cursor shapes. */
-#define GLUT_CURSOR_INFO 2
-#define GLUT_CURSOR_DESTROY 3
-#define GLUT_CURSOR_HELP 4
-#define GLUT_CURSOR_CYCLE 5
-#define GLUT_CURSOR_SPRAY 6
-#define GLUT_CURSOR_WAIT 7
-#define GLUT_CURSOR_TEXT 8
-#define GLUT_CURSOR_CROSSHAIR 9
-/* Directional cursors. */
-#define GLUT_CURSOR_UP_DOWN 10
-#define GLUT_CURSOR_LEFT_RIGHT 11
-/* Sizing cursors. */
-#define GLUT_CURSOR_TOP_SIDE 12
-#define GLUT_CURSOR_BOTTOM_SIDE 13
-#define GLUT_CURSOR_LEFT_SIDE 14
-#define GLUT_CURSOR_RIGHT_SIDE 15
-#define GLUT_CURSOR_TOP_LEFT_CORNER 16
-#define GLUT_CURSOR_TOP_RIGHT_CORNER 17
-#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18
-#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19
-/* Inherit from parent window. */
-#define GLUT_CURSOR_INHERIT 100
-/* Blank cursor. */
-#define GLUT_CURSOR_NONE 101
-/* Fullscreen crosshair (if available). */
-#define GLUT_CURSOR_FULL_CROSSHAIR 102
-#endif
-
-/* GLUT initialization sub-API. */
-GLUTAPI void APIENTRY glutInit(int *argcp, char **argv);
-#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
-GLUTAPI void APIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
-#ifndef GLUT_BUILDING_LIB
-static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
-#define glutInit glutInit_ATEXIT_HACK
-#endif
-#endif
-GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI void APIENTRY glutInitDisplayString(const char *string);
-#endif
-GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y);
-GLUTAPI void APIENTRY glutInitWindowSize(int width, int height);
-GLUTAPI void APIENTRY glutMainLoop(void);
-
-/* GLUT window sub-API. */
-GLUTAPI int APIENTRY glutCreateWindow(const char *title);
-#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
-GLUTAPI int APIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
-#ifndef GLUT_BUILDING_LIB
-static int APIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }
-#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
-#endif
-#endif
-GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
-GLUTAPI void APIENTRY glutDestroyWindow(int win);
-GLUTAPI void APIENTRY glutPostRedisplay(void);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
-GLUTAPI void APIENTRY glutPostWindowRedisplay(int win);
-#endif
-GLUTAPI void APIENTRY glutSwapBuffers(void);
-GLUTAPI int APIENTRY glutGetWindow(void);
-GLUTAPI void APIENTRY glutSetWindow(int win);
-GLUTAPI void APIENTRY glutSetWindowTitle(const char *title);
-GLUTAPI void APIENTRY glutSetIconTitle(const char *title);
-GLUTAPI void APIENTRY glutPositionWindow(int x, int y);
-GLUTAPI void APIENTRY glutReshapeWindow(int width, int height);
-GLUTAPI void APIENTRY glutPopWindow(void);
-GLUTAPI void APIENTRY glutPushWindow(void);
-GLUTAPI void APIENTRY glutIconifyWindow(void);
-GLUTAPI void APIENTRY glutShowWindow(void);
-GLUTAPI void APIENTRY glutHideWindow(void);
-#if (GLUT_API_VERSION >= 3)
-GLUTAPI void APIENTRY glutFullScreen(void);
-GLUTAPI void APIENTRY glutSetCursor(int cursor);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI void APIENTRY glutWarpPointer(int x, int y);
-#endif
-
-/* GLUT overlay sub-API. */
-GLUTAPI void APIENTRY glutEstablishOverlay(void);
-GLUTAPI void APIENTRY glutRemoveOverlay(void);
-GLUTAPI void APIENTRY glutUseLayer(GLenum layer);
-GLUTAPI void APIENTRY glutPostOverlayRedisplay(void);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
-GLUTAPI void APIENTRY glutPostWindowOverlayRedisplay(int win);
-#endif
-GLUTAPI void APIENTRY glutShowOverlay(void);
-GLUTAPI void APIENTRY glutHideOverlay(void);
-#endif
-
-/* GLUT menu sub-API. */
-GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int));
-#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
-GLUTAPI int APIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int));
-#ifndef GLUT_BUILDING_LIB
-static int APIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); }
-#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
-#endif
-#endif
-GLUTAPI void APIENTRY glutDestroyMenu(int menu);
-GLUTAPI int APIENTRY glutGetMenu(void);
-GLUTAPI void APIENTRY glutSetMenu(int menu);
-GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value);
-GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu);
-GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
-GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
-GLUTAPI void APIENTRY glutRemoveMenuItem(int item);
-GLUTAPI void APIENTRY glutAttachMenu(int button);
-GLUTAPI void APIENTRY glutDetachMenu(int button);
-
-/* GLUT window callback sub-API. */
-GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
-GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));
-GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
-GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
-GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
-GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
-GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));
-GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));
-GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));
-GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);
-GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));
-#if (GLUT_API_VERSION >= 2)
-GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
-GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
-GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
-GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state));
-GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state));
-GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value));
-GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
-GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
-#if (GLUT_API_VERSION >= 3)
-GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y));
-GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void));
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state));
-#endif
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
-GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
-GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
-#endif
-#endif
-#endif
-
-/* GLUT color index sub-API. */
-GLUTAPI void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
-GLUTAPI GLfloat APIENTRY glutGetColor(int ndx, int component);
-GLUTAPI void APIENTRY glutCopyColormap(int win);
-
-/* GLUT state retrieval sub-API. */
-GLUTAPI int APIENTRY glutGet(GLenum type);
-GLUTAPI int APIENTRY glutDeviceGet(GLenum type);
-#if (GLUT_API_VERSION >= 2)
-/* GLUT extension support sub-API */
-GLUTAPI int APIENTRY glutExtensionSupported(const char *name);
-#endif
-#if (GLUT_API_VERSION >= 3)
-GLUTAPI int APIENTRY glutGetModifiers(void);
-GLUTAPI int APIENTRY glutLayerGet(GLenum type);
-#endif
-
-/* GLUT font sub-API */
-GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character);
-GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character);
-GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character);
-GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
-GLUTAPI int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
-#endif
-
-/* GLUT pre-built models sub-API */
-GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutWireCube(GLdouble size);
-GLUTAPI void APIENTRY glutSolidCube(GLdouble size);
-GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
-GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
-GLUTAPI void APIENTRY glutWireDodecahedron(void);
-GLUTAPI void APIENTRY glutSolidDodecahedron(void);
-GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);
-GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);
-GLUTAPI void APIENTRY glutWireOctahedron(void);
-GLUTAPI void APIENTRY glutSolidOctahedron(void);
-GLUTAPI void APIENTRY glutWireTetrahedron(void);
-GLUTAPI void APIENTRY glutSolidTetrahedron(void);
-GLUTAPI void APIENTRY glutWireIcosahedron(void);
-GLUTAPI void APIENTRY glutSolidIcosahedron(void);
-
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-/* GLUT video resize sub-API. */
-GLUTAPI int APIENTRY glutVideoResizeGet(GLenum param);
-GLUTAPI void APIENTRY glutSetupVideoResizing(void);
-GLUTAPI void APIENTRY glutStopVideoResizing(void);
-GLUTAPI void APIENTRY glutVideoResize(int x, int y, int width, int height);
-GLUTAPI void APIENTRY glutVideoPan(int x, int y, int width, int height);
-
-/* GLUT debugging sub-API. */
-GLUTAPI void APIENTRY glutReportErrors(void);
-#endif
-
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-/* GLUT device control sub-API. */
-/* glutSetKeyRepeat modes. */
-#define GLUT_KEY_REPEAT_OFF 0
-#define GLUT_KEY_REPEAT_ON 1
-#define GLUT_KEY_REPEAT_DEFAULT 2
-
-/* Joystick button masks. */
-#define GLUT_JOYSTICK_BUTTON_A 1
-#define GLUT_JOYSTICK_BUTTON_B 2
-#define GLUT_JOYSTICK_BUTTON_C 4
-#define GLUT_JOYSTICK_BUTTON_D 8
-
-GLUTAPI void APIENTRY glutIgnoreKeyRepeat(int ignore);
-GLUTAPI void APIENTRY glutSetKeyRepeat(int repeatMode);
-GLUTAPI void APIENTRY glutForceJoystickFunc(void);
-
-/* GLUT game mode sub-API. */
-/* glutGameModeGet. */
-#define GLUT_GAME_MODE_ACTIVE ((GLenum) 0)
-#define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1)
-#define GLUT_GAME_MODE_WIDTH ((GLenum) 2)
-#define GLUT_GAME_MODE_HEIGHT ((GLenum) 3)
-#define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4)
-#define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5)
-#define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6)
-
-GLUTAPI void APIENTRY glutGameModeString(const char *string);
-GLUTAPI int APIENTRY glutEnterGameMode(void);
-GLUTAPI void APIENTRY glutLeaveGameMode(void);
-GLUTAPI int APIENTRY glutGameModeGet(GLenum mode);
-#endif
-
-#ifdef __cplusplus
-}
-
-#endif
-
-#ifdef GLUT_APIENTRY_DEFINED
-# undef GLUT_APIENTRY_DEFINED
-# undef APIENTRY
-#endif
-
-#ifdef GLUT_WINGDIAPI_DEFINED
-# undef GLUT_WINGDIAPI_DEFINED
-# undef WINGDIAPI
-#endif
-
-#ifdef GLUT_DEFINED___CDECL
-# undef GLUT_DEFINED___CDECL
-# undef __cdecl
-#endif
-
-#ifdef GLUT_DEFINED__CRTIMP
-# undef GLUT_DEFINED__CRTIMP
-# undef _CRTIMP
-#endif
-
-#endif /* __glut_h__ */
Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/forwardjump.png has changed
Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/forwardjump_old.png has changed
Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/switchbutton.png has changed
Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/targetbutton.png has changed
Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/timerbutton.png has changed
--- a/project_files/HedgewarsMobile/Classes/AboutViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/AboutViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -27,7 +27,10 @@
return rotationManager(interfaceOrientation);
}
--(void) viewDidLoad {
+-(void) viewDidLoad
+{
+ [super viewDidLoad];
+
[self.tableView setBackgroundColorForAnyTable:[UIColor clearColor]];
self.tableView.allowsSelection = NO;
@@ -48,12 +51,23 @@
[self.view insertSubview:background atIndex:0];
[background release];
- [super viewDidLoad];
+ [self localizeSegmentedControl];
}
-(IBAction) buttonPressed:(id) sender {
[[AudioManagerController mainManager] playBackSound];
- [[self parentViewController] dismissModalViewControllerAnimated:YES];
+ [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 {
@@ -83,7 +97,8 @@
cell.textLabel.text = [[self.people objectAtIndex:self.segmentedControl.selectedSegmentIndex] objectAtIndex:[indexPath row]];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.textLabel.minimumFontSize = 8;
- cell.detailTextLabel.text = [[self.people objectAtIndex:(self.segmentedControl.selectedSegmentIndex + 5)] objectAtIndex:[indexPath row]];
+ NSString *detailsKey = [[self.people objectAtIndex:(self.segmentedControl.selectedSegmentIndex + 5)] objectAtIndex:[indexPath row]];
+ cell.detailTextLabel.text = NSLocalizedStringFromTable(detailsKey, @"About", nil);
return cell;
}
@@ -113,11 +128,12 @@
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width*80/100, 90)];
label.center = CGPointMake(self.tableView.frame.size.width/2, 45);
- label.textAlignment = UITextAlignmentCenter;
+ label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont systemFontOfSize:16];
label.textColor = [UIColor lightGrayColor];
label.numberOfLines = 5;
label.text = footerString;
+ [footerString release];
label.backgroundColor = [UIColor clearColor];
[footer addSubview:label];
--- a/project_files/HedgewarsMobile/Classes/Appirater.h Fri Sep 11 04:05:09 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 <Foundation/Foundation.h>
-
-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 <UIAlertViewDelegate> {
-
-}
-
-+(void) appLaunched;
-
-@end
--- a/project_files/HedgewarsMobile/Classes/Appirater.m Fri Sep 11 04:05:09 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 <SystemConfiguration/SCNetworkReachability.h>
-#import <netinet/in.h>
-
-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 {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- 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
- int launchCount = [userDefaults integerForKey:kAppiraterLaunchCount];
- launchCount++;
- [userDefaults setInteger:launchCount forKey:kAppiraterLaunchCount];
- if (APPIRATER_DEBUG)
- NSLog(@"APPIRATER Launch count: %d", 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];
-
- [pool release];
-}
-
--(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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ar.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ca.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/cs.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/da.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/de.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/el.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/en.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/es.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/fi.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/fr.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/he.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/hu.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/id.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/it.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ja.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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" = "あとで";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ko.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ms.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/nb.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/nl.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pl.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pt-BR.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/pt.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ro.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/ru.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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" = "Напомнить позже";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/sk.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/sv.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/th.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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" = "เตือนฉันภายหลัง";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/tr.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/uk.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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" = "Нагадати пізніше";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/vi.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/zh-Hans.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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" = "稍后提醒我";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.bundle/zh-Hant.lproj/AppiraterLocalizable.strings Fri Apr 01 15:36:19 2016 +0200
@@ -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" = "稍後提醒我";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.h Fri Apr 01 15:36:19 2016 +0200
@@ -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 <Foundation/Foundation.h>
+#import "AppiraterDelegate.h"
+#import <StoreKit/StoreKit.h>
+
+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 <UIAlertViewDelegate, SKStoreProductViewControllerDelegate> {
+
+ UIAlertView *ratingAlert;
+}
+
+@property(nonatomic, strong) UIAlertView *ratingAlert;
+@property(nonatomic) BOOL openInAppStore;
+#if __has_feature(objc_arc_weak)
+@property(nonatomic, weak) NSObject <AppiraterDelegate> *delegate;
+#else
+@property(nonatomic, unsafe_unretained) NSObject <AppiraterDelegate> *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<AppiraterDelegate>)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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/Appirater.m Fri Apr 01 15:36:19 2016 +0200
@@ -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 <SystemConfiguration/SCNetworkReachability.h>
+#include <netinet/in.h>
+
+#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<AppiraterDelegate> _delegate;
+#else
+ __weak static id<AppiraterDelegate> _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<AppiraterDelegate>)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 <AppiraterDelegate> 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 <AppiraterDelegate> 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 <AppiraterDelegate> 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 <AppiraterDelegate> delegate = self.sharedInstance.delegate;
+ if ([delegate respondsToSelector:@selector(appiraterDidDismissModalView:animated:)]) {
+ [delegate appiraterDidDismissModalView:(Appirater *)self animated:usedAnimation];
+ }
+ }];
+ [self.class setStatusBarStyle:(UIStatusBarStyle)nil];
+ }
+}
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/Appirater/AppiraterDelegate.h Fri Apr 01 15:36:19 2016 +0200
@@ -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 <Foundation/Foundation.h>
+
+@class Appirater;
+
+@protocol AppiraterDelegate <NSObject>
+
+@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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignViewController-iPad.xib Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CampaignViewController">
+ <connections>
+ <outlet property="view" destination="BGY-i4-0hN" id="Dvn-DY-Coe"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="BGY-i4-0hN">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="ziw-0v-GnE"/>
+ <outlet property="delegate" destination="-1" id="xbG-8w-TF1"/>
+ </connections>
+ <point key="canvasLocation" x="514" y="414"/>
+ </tableView>
+ </objects>
+</document>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CampaignViewController">
+ <connections>
+ <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="i5M-Pr-FkT">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="Tng-2m-Rnh"/>
+ <outlet property="delegate" destination="-1" id="9aC-8N-iBw"/>
+ </connections>
+ <point key="canvasLocation" x="781" y="482"/>
+ </tableView>
+ </objects>
+</document>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,25 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015-2016 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <UIKit/UIKit.h>
+
+@interface CampaignViewController : UITableViewController
+
+@property (nonatomic, retain) NSString *campaignName;
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,104 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015-2016 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 "CampaignViewController.h"
+#import "IniParser.h"
+#import "GameInterfaceBridge.h"
+
+@interface CampaignViewController ()
+@property (nonatomic, retain) NSArray *campaignMissions;
+@end
+
+@implementation CampaignViewController
+
+#pragma mark - Lazy instantiation
+
+- (NSArray *)campaignMissions {
+ if (!_campaignMissions) {
+ _campaignMissions = [self newParsedMissionsForCurrentCampaign];
+ }
+ return _campaignMissions;
+}
+
+- (NSArray *)newParsedMissionsForCurrentCampaign {
+ NSString *campaignIniPath = [CAMPAIGNS_DIRECTORY() stringByAppendingFormat:@"%@/campaign.ini", self.campaignName];
+
+ IniParser *iniParser = [[IniParser alloc] initWithIniFilePath:campaignIniPath];
+ NSArray *parsedMissions = [iniParser newParsedSections];
+ [iniParser release];
+
+ return parsedMissions;
+}
+
+#pragma mark - View lifecycle
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismiss)];
+ self.navigationItem.rightBarButtonItem = doneButton;
+ [doneButton release];
+
+ [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"campaignMissionCell"];
+}
+
+- (void)dismiss {
+ [self.navigationController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
+}
+
+- (void)didReceiveMemoryWarning {
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+#pragma mark - Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return [self.campaignMissions count];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"campaignMissionCell" forIndexPath:indexPath];
+
+ cell.textLabel.text = self.campaignMissions[indexPath.row][@"Name"];
+
+ return cell;
+}
+
+#pragma mark - Table view delegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+ NSString *campaignMissionScript = self.campaignMissions[indexPath.row][@"Script"];
+
+ [GameInterfaceBridge registerCallingController:self];
+ [GameInterfaceBridge startCampaignMissionGameWithScript:campaignMissionScript forCampaign:self.campaignName];
+}
+
+#pragma mark - Dealloc
+
+- (void)dealloc {
+ [_campaignName release];
+ [_campaignMissions release];
+ [super dealloc];
+}
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignsViewController-iPad.xib Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CampaignsViewController">
+ <connections>
+ <outlet property="view" destination="zXe-Y5-nDC" id="Xzl-t1-QHC"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="zXe-Y5-nDC">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="UCr-h4-2sD"/>
+ <outlet property="delegate" destination="-1" id="sba-bd-bdf"/>
+ </connections>
+ <point key="canvasLocation" x="513" y="343"/>
+ </tableView>
+ </objects>
+</document>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignsViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CampaignsViewController">
+ <connections>
+ <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="i5M-Pr-FkT">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="320"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <simulatedScreenMetrics key="simulatedDestinationMetrics"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="Tng-2m-Rnh"/>
+ <outlet property="delegate" destination="-1" id="9aC-8N-iBw"/>
+ </connections>
+ <point key="canvasLocation" x="520" y="350"/>
+ </tableView>
+ </objects>
+</document>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignsViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,23 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015-2016 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <UIKit/UIKit.h>
+
+@interface CampaignsViewController : UITableViewController
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/CampaignsViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,113 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015-2016 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 "CampaignsViewController.h"
+#import "CampaignViewController.h"
+
+@interface CampaignsViewController ()
+@property (nonatomic, retain) NSArray *campaigns;
+@end
+
+@implementation CampaignsViewController
+
+#pragma mark - Lazy instantiation
+
+- (NSArray *)campaigns {
+ if (!_campaigns) {
+ _campaigns = [self newListOfCampaigns];
+ }
+ return _campaigns;
+}
+
+- (NSArray *)newListOfCampaigns {
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+ NSArray *contents = [fileManager contentsOfDirectoryAtPath:CAMPAIGNS_DIRECTORY() error:nil];
+
+ NSMutableArray *tempCampaigns = [[NSMutableArray alloc] init];
+ for (NSString *item in contents) {
+ NSString *fullItemPath = [CAMPAIGNS_DIRECTORY() stringByAppendingString:item];
+ BOOL isDirectory;
+ if ([fileManager fileExistsAtPath:fullItemPath isDirectory:&isDirectory] && isDirectory) {
+ [tempCampaigns addObject:item];
+ }
+ }
+
+ NSArray *campaigns = [tempCampaigns copy];
+ [tempCampaigns release];
+ return campaigns;
+}
+
+#pragma mark - View lifecycle
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismiss)];
+ self.navigationItem.rightBarButtonItem = doneButton;
+ [doneButton release];
+
+ [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"campaignCell"];
+}
+
+- (void)dismiss {
+ [self.navigationController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
+}
+
+- (void)didReceiveMemoryWarning {
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+#pragma mark - Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return [self.campaigns count];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"campaignCell" forIndexPath:indexPath];
+
+ cell.textLabel.text = self.campaigns[indexPath.row];
+
+ return cell;
+}
+
+#pragma mark - Table view delegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+ NSString *xib = IS_IPAD() ? @"CampaignViewController-iPad" : @"CampaignViewController-iPhone";
+ CampaignViewController *campaign = [[CampaignViewController alloc] initWithNibName:xib bundle:nil];
+
+ campaign.campaignName = self.campaigns[indexPath.row];
+
+ [self.navigationController pushViewController:campaign animated:YES];
+ [campaign release];
+}
+
+#pragma mark - Dealloc
+
+- (void)dealloc {
+ [_campaigns release];
+ [super dealloc];
+}
+
+@end
--- a/project_files/HedgewarsMobile/Classes/CreationChamber.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/CreationChamber.m Fri Apr 01 15:36:19 2016 +0200
@@ -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:
--- a/project_files/HedgewarsMobile/Classes/DefinesAndMacros.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/DefinesAndMacros.h Fri Apr 01 15:36:19 2016 +0200
@@ -66,6 +66,7 @@
#define MAPS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Maps/"]
#define MISSIONS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Missions/Maps/"]
#define TRAININGS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Missions/Training/"]
+#define CAMPAIGNS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Missions/Campaign/"]
#define LOCALE_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Locale/"]
#define SCRIPTS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Scripts/Multiplayer/"]
--- a/project_files/HedgewarsMobile/Classes/EditableCellView.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/EditableCellView.m Fri Apr 01 15:36:19 2016 +0200
@@ -18,7 +18,7 @@
#import "EditableCellView.h"
-
+#import "UITableViewCell+FindTable.h"
@implementation EditableCellView
@synthesize delegate, textField, titleLabel, minimumCharacters, maximumCharacters, respectEditing, oldValue;
@@ -43,7 +43,7 @@
//[textField release];
titleLabel = [[UILabel alloc] init];
- titleLabel.textAlignment = UITextAlignmentLeft;
+ titleLabel.textAlignment = NSTextAlignmentLeft;
titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];
[self.contentView addSubview:titleLabel];
@@ -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 -
--- a/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Fri Apr 01 15:36:19 2016 +0200
@@ -96,8 +96,8 @@
for (int i = 0; i < numberOfPlayingHogs; i++) {
NSDictionary *hog = [hogs objectAtIndex:i];
- NSString *hogLevelHealthAndName = [[NSString alloc] initWithFormat:@"eaddhh %@ %d %@",
- [hog objectForKey:@"level"], initialHealth, [hog objectForKey:@"hogname"]];
+ NSString *hogLevelHealthAndName = [[NSString alloc] initWithFormat:@"eaddhh %@ %ld %@",
+ [hog objectForKey:@"level"], (long)initialHealth, [hog objectForKey:@"hogname"]];
[self sendToEngine: hogLevelHealthAndName];
[hogLevelHealthAndName release];
@@ -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);
@@ -214,7 +214,8 @@
// this is launched as thread and handles all IPC with engine
-(void) engineProtocol:(id) object {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ @autoreleasepool {
+
NSDictionary *gameConfig = (NSDictionary *)object;
NSMutableArray *statsArray = nil;
TCPsocket sd;
@@ -240,7 +241,7 @@
// Open a connection with the IP provided (listen on the host's port)
if (!(sd = SDLNet_TCP_Open(&ip)) && !clientQuit) {
- DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), self.enginePort);
+ DLog(@"SDLNet_TCP_Open: %s %d\n", SDLNet_GetError(), self.enginePort);
clientQuit = YES;
}
@@ -272,13 +273,15 @@
NSString *script = [gameConfig objectForKey:@"mission_command"];
if ([script length] != 0)
[self sendToEngine:script];
- // missions/tranings only need the script configuration set
- if ([gameConfig count] == 1)
- break;
-
+
// seed info
[self sendToEngine:[gameConfig objectForKey:@"seed_command"]];
+ // missions/tranings/campaign only need the script configuration set and seed
+ TGameType currentGameType = [HWUtils gameType];
+ if (currentGameType == gtMission || currentGameType == gtCampaign)
+ break;
+
// dimension of the map
[self sendToEngine:[gameConfig objectForKey:@"templatefilter_command"]];
[self sendToEngine:[gameConfig objectForKey:@"mapgen_command"]];
@@ -340,19 +343,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;
@@ -363,14 +372,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;
@@ -403,8 +421,9 @@
[HWUtils freePort:self.enginePort];
SDLNet_TCP_Close(csd);
SDLNet_Quit();
+
+ }
- [pool release];
// Invoking this method should be avoided as it does not give your thread a chance
// to clean up any resources it allocated during its execution.
//[NSThread exit];
--- a/project_files/HedgewarsMobile/Classes/ExtraCategories.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/ExtraCategories.h Fri Apr 01 15:36:19 2016 +0200
@@ -50,6 +50,9 @@
-(id) initWithFrame:(CGRect) frame andTitle:(NSString *)title;
+- (void)applyBlackQuickStyle;
+- (void)applyDarkBlueQuickStyle;
+
@end
--- a/project_files/HedgewarsMobile/Classes/ExtraCategories.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/ExtraCategories.m Fri Apr 01 15:36:19 2016 +0200
@@ -27,17 +27,18 @@
-(CGFloat) safeScale {
CGFloat theScale = 1.0f;
- if ([self respondsToSelector:@selector(scale)])
- theScale = [self scale];
+// if ([self respondsToSelector:@selector(scale)])
+// theScale = [self scale];
return theScale;
}
-(CGRect) safeBounds {
- CGRect original = [self bounds];
- if (IS_ON_PORTRAIT())
- return original;
- else
- return CGRectMake(original.origin.x, original.origin.y, original.size.height, original.size.width);
+ return [self bounds];
+// CGRect original = [self bounds];
+// if (IS_ON_PORTRAIT())
+// return original;
+// else
+// return CGRectMake(original.origin.x, original.origin.y, original.size.height, original.size.width);
}
@end
@@ -99,17 +100,35 @@
-(id) initWithFrame:(CGRect) frame andTitle:(NSString *)title {
[self initWithFrame:frame];
[self setTitle:title forState:UIControlStateNormal];
+ [self applyBlackQuickStyle];
+
+ return self;
+}
+
+- (void)applyBlackQuickStyle
+{
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[self setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted];
self.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];
self.backgroundColor = [UIColor blackColorTransparent];
-
- [self.layer setBorderWidth:1];
+
+ [self.layer setBorderWidth:1.0f];
[self.layer setBorderColor:[[UIColor darkYellowColor] CGColor]];
[self.layer setCornerRadius:9.0f];
[self.layer setMasksToBounds:YES];
+}
- return self;
+- (void)applyDarkBlueQuickStyle
+{
+ [self setTitleColor:[UIColor darkYellowColor] forState:UIControlStateNormal];
+ [self setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted];
+ self.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];
+ self.backgroundColor = [UIColor darkBlueColorTransparent];
+
+ [self.layer setBorderWidth:2.0f];
+ [self.layer setBorderColor:[[UIColor darkYellowColor] CGColor]];
+ [self.layer setCornerRadius:9.0f];
+ [self.layer setMasksToBounds:YES];
}
@end
@@ -142,7 +161,7 @@
if (title != nil) {
theLabel.text = title;
theLabel.textColor = [UIColor lightYellowColor];
- theLabel.textAlignment = UITextAlignmentCenter;
+ theLabel.textAlignment = NSTextAlignmentCenter;
theLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]*80/100];
}
--- a/project_files/HedgewarsMobile/Classes/FlagsViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/FlagsViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -131,10 +131,10 @@
#pragma mark -
#pragma mark Table view delegate
-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- int newRow = [indexPath row];
- int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
- int newSection = [indexPath section];
- int oldSection = (lastIndexPath != nil) ? [lastIndexPath section] : -1;
+ NSInteger newRow = [indexPath row];
+ NSInteger oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
+ NSInteger newSection = [indexPath section];
+ NSInteger oldSection = (lastIndexPath != nil) ? [lastIndexPath section] : -1;
if (newRow != oldRow || newSection != oldSection) {
NSString *flag = nil;
--- a/project_files/HedgewarsMobile/Classes/FortsViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/FortsViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
}
}
@@ -106,8 +108,8 @@
#pragma mark -
#pragma mark Table view delegate
-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- int newRow = [indexPath row];
- int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
+ 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
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPad.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPad.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,34 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="7.10">
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="8.00">
<data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <int key="IBDocument.SystemTarget">1792</int>
+ <string key="IBDocument.SystemVersion">14E46</string>
+ <string key="IBDocument.InterfaceBuilderVersion">7706</string>
+ <string key="IBDocument.AppKitVersion">1348.17</string>
+ <string key="IBDocument.HIToolboxVersion">758.70</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="2"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">7703</string>
</object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUIButton</string>
+ <string>IBUIImageView</string>
+ <string>IBUISlider</string>
+ <string>IBUIView</string>
+ <string>IBUIViewController</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <dictionary class="NSMutableDictionary" key="IBDocument.Metadata"/>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="IBProxyObject" id="841351856">
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
@@ -38,10 +32,9 @@
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
</object>
<object class="IBUIView" id="766721923">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">292</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="109536142">
<reference key="NSNextResponder" ref="766721923"/>
<int key="NSvFlags">274</int>
@@ -66,7 +59,7 @@
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<object class="NSCustomResource" key="IBUIImage">
<string key="NSClassName">NSImage</string>
- <string key="NSResourceName">title~iphone.png</string>
+ <string key="NSResourceName">title.png</string>
</object>
</object>
<object class="IBUIButton" id="410546531">
@@ -79,19 +72,14 @@
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
- <object class="NSFont" key="IBUIFont" id="243320520">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">15</double>
- <int key="NSfFlags">16</int>
+ <object class="NSColor" key="IBUINormalTitleColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
<object class="NSColor" key="IBUIHighlightedTitleColor" id="473179629">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
<object class="NSColor" key="IBUINormalTitleShadowColor" id="702849038">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC41AA</bytes>
@@ -100,6 +88,17 @@
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">startGameButton.png</string>
</object>
+ <object class="IBUIFontDescription" key="IBUIFontDescription" id="654921024">
+ <string key="name">Helvetica-Bold</string>
+ <string key="family">Helvetica</string>
+ <int key="traits">2</int>
+ <double key="pointSize">15</double>
+ </object>
+ <object class="NSFont" key="IBUIFont" id="243320520">
+ <string key="NSName">Helvetica-Bold</string>
+ <double key="NSSize">15</double>
+ <int key="NSfFlags">16</int>
+ </object>
</object>
<object class="IBUIButton" id="495854712">
<reference key="NSNextResponder" ref="766721923"/>
@@ -110,17 +109,18 @@
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="243320520"/>
- <reference key="IBUIHighlightedTitleColor" ref="473179629"/>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
+ <reference key="IBUIHighlightedTitleColor" ref="473179629"/>
<reference key="IBUINormalTitleShadowColor" ref="702849038"/>
<object class="NSCustomResource" key="IBUINormalImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">backButton.png</string>
</object>
+ <reference key="IBUIFontDescription" ref="654921024"/>
+ <reference key="IBUIFont" ref="243320520"/>
</object>
<object class="IBUIButton" id="688316814">
<reference key="NSNextResponder" ref="766721923"/>
@@ -132,17 +132,18 @@
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="243320520"/>
- <reference key="IBUIHighlightedTitleColor" ref="473179629"/>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
+ <reference key="IBUIHighlightedTitleColor" ref="473179629"/>
<reference key="IBUINormalTitleShadowColor" ref="702849038"/>
<object class="NSCustomResource" key="IBUINormalImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">helpButton.png</string>
</object>
+ <reference key="IBUIFontDescription" ref="654921024"/>
+ <reference key="IBUIFont" ref="243320520"/>
</object>
<object class="IBUIView" id="123574818">
<reference key="NSNextResponder" ref="766721923"/>
@@ -179,27 +180,47 @@
<float key="IBUIValue">0.05000000074505806</float>
<float key="IBUIMaxValue">0.05000000074505806</float>
</object>
- </object>
+ </array>
<string key="NSFrameSize">{1024, 768}</string>
- <reference key="NSSuperview"/>
<reference key="IBUIBackgroundColor" ref="473179629"/>
<bool key="IBUIClipsSubviews">YES</bool>
<object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
+ <int key="IBUIInterfaceOrientation">3</int>
<int key="interfaceOrientation">3</int>
</object>
+ <object class="IBUIScreenMetrics" key="IBUISimulatedDestinationMetrics" id="465546060">
+ <string key="IBUISimulatedSizeMetricsClass">IBUIScreenMetrics</string>
+ <string key="IBUITargetRuntime">IBIPadFramework</string>
+ <string key="IBUIDisplayName">iPad Full Screen</string>
+ <object class="NSMutableDictionary" key="IBUINormalizedOrientationToSizeMap">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="dict.sortedKeys">
+ <integer value="1"/>
+ <integer value="3"/>
+ </array>
+ <array key="dict.values">
+ <string>{768, 1024}</string>
+ <string>{1024, 768}</string>
+ </array>
+ </object>
+ <int key="IBUIType">1</int>
+ </object>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
</object>
<object class="IBUIViewController" id="1023023363">
<bool key="IBUIAutoresizesArchivedViewToFullSize">NO</bool>
<object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics" id="158576700">
+ <int key="IBUIInterfaceOrientation">3</int>
<int key="interfaceOrientation">3</int>
</object>
+ <reference key="IBUISimulatedDestinationMetrics" ref="465546060"/>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<bool key="IBUIHorizontal">YES</bool>
</object>
<object class="IBUIViewController" id="487135035">
<bool key="IBUIAutoresizesArchivedViewToFullSize">NO</bool>
<reference key="IBUISimulatedOrientationMetrics" ref="158576700"/>
+ <reference key="IBUISimulatedDestinationMetrics" ref="465546060"/>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<bool key="IBUIHorizontal">YES</bool>
</object>
@@ -207,13 +228,13 @@
<bool key="IBUIAutoresizesArchivedViewToFullSize">NO</bool>
<string key="IBUINibName">MapConfigViewController-iPad</string>
<reference key="IBUISimulatedOrientationMetrics" ref="158576700"/>
+ <reference key="IBUISimulatedDestinationMetrics" ref="465546060"/>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<bool key="IBUIHorizontal">YES</bool>
</object>
- </object>
+ </array>
<object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">view</string>
@@ -223,6 +244,47 @@
<int key="connectionID">3</int>
</object>
<object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">teamConfigViewController</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="487135035"/>
+ </object>
+ <int key="connectionID">45</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">schemeWeaponConfigViewController</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="1023023363"/>
+ </object>
+ <int key="connectionID">51</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">mapConfigViewController</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="670598485"/>
+ </object>
+ <int key="connectionID">57</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">titleImage</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="533754865"/>
+ </object>
+ <int key="connectionID">68</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchEventConnection" key="connection">
+ <string key="label">buttonPressed:</string>
+ <reference key="source" ref="410546531"/>
+ <reference key="destination" ref="841351856"/>
+ <int key="IBEventType">7</int>
+ </object>
+ <int key="connectionID">36</int>
+ </object>
+ <object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">buttonPressed:</string>
<reference key="source" ref="495854712"/>
@@ -234,15 +296,6 @@
<object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">buttonPressed:</string>
- <reference key="source" ref="410546531"/>
- <reference key="destination" ref="841351856"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">36</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonPressed:</string>
<reference key="source" ref="688316814"/>
<reference key="destination" ref="841351856"/>
<int key="IBEventType">7</int>
@@ -251,14 +304,6 @@
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">teamConfigViewController</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="487135035"/>
- </object>
- <int key="connectionID">45</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">view</string>
<reference key="source" ref="487135035"/>
<reference key="destination" ref="983956256"/>
@@ -275,19 +320,11 @@
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">schemeWeaponConfigViewController</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="1023023363"/>
+ <string key="label">slider</string>
+ <reference key="source" ref="670598485"/>
+ <reference key="destination" ref="1000322445"/>
</object>
- <int key="connectionID">51</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">mapConfigViewController</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="670598485"/>
- </object>
- <int key="connectionID">57</int>
+ <int key="connectionID">69</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
@@ -307,29 +344,12 @@
</object>
<int key="connectionID">67</int>
</object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">titleImage</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="533754865"/>
- </object>
- <int key="connectionID">68</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">slider</string>
- <reference key="source" ref="670598485"/>
- <reference key="destination" ref="1000322445"/>
- </object>
- <int key="connectionID">69</int>
- </object>
- </object>
+ </array>
<object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
- <reference key="object" ref="0"/>
+ <array key="object" id="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
@@ -347,8 +367,7 @@
<object class="IBObjectRecord">
<int key="objectID">2</int>
<reference key="object" ref="766721923"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array class="NSMutableArray" key="children">
<reference ref="109536142"/>
<reference ref="533754865"/>
<reference ref="410546531"/>
@@ -357,7 +376,7 @@
<reference ref="123574818"/>
<reference ref="983956256"/>
<reference ref="1000322445"/>
- </object>
+ </array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
@@ -393,17 +412,13 @@
<object class="IBObjectRecord">
<int key="objectID">44</int>
<reference key="object" ref="487135035"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
+ <array class="NSMutableArray" key="children"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">46</int>
<reference key="object" ref="983956256"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
+ <array class="NSMutableArray" key="children"/>
<reference key="parent" ref="766721923"/>
<string key="objectName">TeamConfigViewController View</string>
</object>
@@ -429,650 +444,52 @@
<reference key="parent" ref="766721923"/>
<string key="objectName">Filter Slider</string>
</object>
- </object>
+ </array>
</object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>2.IBEditorWindowLastContentRect</string>
- <string>2.IBPluginDependency</string>
- <string>30.IBPluginDependency</string>
- <string>30.IBViewBoundsToFrameTransform</string>
- <string>31.IBPluginDependency</string>
- <string>31.IBViewBoundsToFrameTransform</string>
- <string>32.IBPluginDependency</string>
- <string>32.IBViewBoundsToFrameTransform</string>
- <string>33.IBPluginDependency</string>
- <string>33.IBViewBoundsToFrameTransform</string>
- <string>34.IBPluginDependency</string>
- <string>34.IBViewBoundsToFrameTransform</string>
- <string>44.CustomClassName</string>
- <string>44.IBEditorWindowLastContentRect</string>
- <string>44.IBPluginDependency</string>
- <string>46.IBPluginDependency</string>
- <string>46.IBViewBoundsToFrameTransform</string>
- <string>48.CustomClassName</string>
- <string>48.IBEditorWindowLastContentRect</string>
- <string>48.IBPluginDependency</string>
- <string>49.IBPluginDependency</string>
- <string>49.IBViewBoundsToFrameTransform</string>
- <string>55.CustomClassName</string>
- <string>55.IBEditorWindowLastContentRect</string>
- <string>55.IBPluginDependency</string>
- <string>60.CustomClassName</string>
- <string>60.IBPluginDependency</string>
- <string>60.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>GameConfigViewController</string>
- <string>UIResponder</string>
- <string>{{252, 239}, {1024, 768}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABAoAAAxLrgAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDtQAAxGNAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABD3wAAxLqgAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABByAAAxLmAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABEbEAAxLmAAA</bytes>
- </object>
- <string>TeamConfigViewController</string>
- <string>{{63, 355}, {1024, 768}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUOogABDOwAAA</bytes>
- </object>
- <string>SchemeWeaponConfigViewController</string>
- <string>{{84, 388}, {1024, 768}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAAAAAAAAxHqAAA</bytes>
- </object>
- <string>MapConfigViewController</string>
- <string>{{126, 377}, {1024, 768}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>MNEValueTrackingSlider</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUNRAABEMoAAA</bytes>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">GameConfigViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="30.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="31.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="32.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="33.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="34.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="44.CustomClassName">TeamConfigViewController</string>
+ <string key="44.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="46.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="48.CustomClassName">SchemeWeaponConfigViewController</string>
+ <string key="48.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="49.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="55.CustomClassName">MapConfigViewController</string>
+ <string key="55.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="60.CustomClassName">MNEValueTrackingSlider</string>
+ <string key="60.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">69</int>
</object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">GameConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>buttonPressed:</string>
- <string>segmentPressed:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>id</string>
- <string>id</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>buttonPressed:</string>
- <string>segmentPressed:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBActionInfo">
- <string key="name">buttonPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">segmentPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="outlets">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapConfigViewController</string>
- <string>schemeWeaponConfigViewController</string>
- <string>teamConfigViewController</string>
- <string>titleImage</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>MapConfigViewController</string>
- <string>SchemeWeaponConfigViewController</string>
- <string>TeamConfigViewController</string>
- <string>UIImageView</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapConfigViewController</string>
- <string>schemeWeaponConfigViewController</string>
- <string>teamConfigViewController</string>
- <string>titleImage</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBToOneOutletInfo">
- <string key="name">mapConfigViewController</string>
- <string key="candidateClassName">MapConfigViewController</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">schemeWeaponConfigViewController</string>
- <string key="candidateClassName">SchemeWeaponConfigViewController</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">teamConfigViewController</string>
- <string key="candidateClassName">TeamConfigViewController</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">titleImage</string>
- <string key="candidateClassName">UIImageView</string>
- </object>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/GameConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">MNEValueTrackingSlider</string>
- <string key="superclassName">UISlider</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MNEValueTrackingSlider.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">MapConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapButtonPressed:</string>
- <string>segmentedControlChanged:</string>
- <string>sliderChanged:</string>
- <string>sliderEndedChanging:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapButtonPressed:</string>
- <string>segmentedControlChanged:</string>
- <string>sliderChanged:</string>
- <string>sliderEndedChanging:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBActionInfo">
- <string key="name">mapButtonPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">segmentedControlChanged:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">sliderChanged:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">sliderEndedChanging:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="outlets">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>maxLabel</string>
- <string>previewButton</string>
- <string>segmentedControl</string>
- <string>slider</string>
- <string>tableView</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>UILabel</string>
- <string>MapPreviewButtonView</string>
- <string>UISegmentedControl</string>
- <string>MNEValueTrackingSlider</string>
- <string>UITableView</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>maxLabel</string>
- <string>previewButton</string>
- <string>segmentedControl</string>
- <string>slider</string>
- <string>tableView</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBToOneOutletInfo">
- <string key="name">maxLabel</string>
- <string key="candidateClassName">UILabel</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">previewButton</string>
- <string key="candidateClassName">MapPreviewButtonView</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">segmentedControl</string>
- <string key="candidateClassName">UISegmentedControl</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">slider</string>
- <string key="candidateClassName">MNEValueTrackingSlider</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">tableView</string>
- <string key="candidateClassName">UITableView</string>
- </object>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MapConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">MapPreviewButtonView</string>
- <string key="superclassName">UIButton</string>
- <object class="NSMutableDictionary" key="outlets">
- <string key="NS.key.0">delegate</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <string key="NS.key.0">delegate</string>
- <object class="IBToOneOutletInfo" key="NS.object.0">
- <string key="name">delegate</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MapPreviewButtonView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">SchemeWeaponConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/SchemeWeaponConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">TeamConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/TeamConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="106046383">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <reference key="sourceIdentifier" ref="106046383"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <reference key="sourceIdentifier" ref="106046383"/>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="786211723">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIButton.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIControl</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIImageView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIImageView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UILabel.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIResponder</string>
- <string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="786211723"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIScrollView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIScrollView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchBar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchDisplayController</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISegmentedControl</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISegmentedControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISlider</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISlider.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <string key="superclassName">UIScrollView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITableView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
- </object>
- </object>
- </object>
- </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes"/>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
+ <bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3100" key="NS.object.0"/>
+ <integer value="4600" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
- <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>backButton.png</string>
- <string>background.png</string>
- <string>helpButton.png</string>
- <string>startGameButton.png</string>
- <string>title~iphone.png</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>{64, 64}</string>
- <string>{1024, 768}</string>
- <string>{64, 64}</string>
- <string>{142, 64}</string>
- <string>{270, 150}</string>
- </object>
- </object>
- <string key="IBCocoaTouchPluginVersion">132</string>
+ <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="backButton.png">{64, 64}</string>
+ <string key="background.png">{1024, 768}</string>
+ <string key="helpButton.png">{64, 64}</string>
+ <string key="startGameButton.png">{142, 64}</string>
+ <string key="title.png">{540, 300}</string>
+ </dictionary>
</data>
</archive>
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,1014 +1,105 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
- <data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="30"/>
- <integer value="2"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBProxyObject" id="841351856">
- <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBProxyObject" id="606714003">
- <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBUIView" id="766721923">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">292</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIToolbar" id="836721772">
- <reference key="NSNextResponder" ref="766721923"/>
- <int key="NSvFlags">266</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUISegmentedControl" id="563596142">
- <reference key="NSNextResponder" ref="836721772"/>
- <int key="NSvFlags">292</int>
- <string key="NSFrame">{{96, 8}, {270, 30}}</string>
- <reference key="NSSuperview" ref="836721772"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">12345</int>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBSegmentControlStyle">2</int>
- <int key="IBNumberOfSegments">4</int>
- <int key="IBSelectedSegmentIndex">0</int>
- <object class="NSArray" key="IBSegmentTitles">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>Map</string>
- <string>Teams</string>
- <string>Details</string>
- <string>Help</string>
- </object>
- <object class="NSMutableArray" key="IBSegmentWidths">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <real value="0.0"/>
- <real value="0.0"/>
- <real value="0.0"/>
- <real value="0.0"/>
- </object>
- <object class="NSMutableArray" key="IBSegmentEnabledStates">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <boolean value="YES"/>
- <boolean value="YES"/>
- <boolean value="YES"/>
- <boolean value="YES"/>
- </object>
- <object class="NSMutableArray" key="IBSegmentContentOffsets">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>{0, 0}</string>
- <string>{0, 0}</string>
- <string>{0, 0}</string>
- <string>{0, 0}</string>
- </object>
- <object class="NSMutableArray" key="IBSegmentImages">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSNull" id="4"/>
- <reference ref="4"/>
- <reference ref="4"/>
- <reference ref="4"/>
- </object>
- <object class="NSColor" key="IBTintColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC42IDAuNiAwLjYAA</bytes>
- </object>
- </object>
- </object>
- <string key="NSFrame">{{0, 276}, {480, 44}}</string>
- <reference key="NSSuperview" ref="766721923"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIBarStyle">1</int>
- <object class="NSMutableArray" key="IBUIItems">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIBarButtonItem" id="80281356">
- <string key="IBUITitle">Back</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIStyle">1</int>
- <reference key="IBUIToolbar" ref="836721772"/>
- </object>
- <object class="IBUIBarButtonItem" id="716161941">
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <reference key="IBUIToolbar" ref="836721772"/>
- <int key="IBUISystemItemIdentifier">5</int>
- </object>
- <object class="IBUIBarButtonItem" id="530186890">
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <reference key="IBUICustomView" ref="563596142"/>
- <reference key="IBUIToolbar" ref="836721772"/>
- </object>
- <object class="IBUIBarButtonItem" id="188600069">
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <reference key="IBUIToolbar" ref="836721772"/>
- <int key="IBUISystemItemIdentifier">5</int>
- </object>
- <object class="IBUIBarButtonItem" id="919181414">
- <int key="IBUITag">1</int>
- <string key="IBUITitle">Start</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <float key="IBUIWidth">68</float>
- <int key="IBUIStyle">2</int>
- <reference key="IBUIToolbar" ref="836721772"/>
- </object>
- </object>
- </object>
- <object class="IBUIView" id="914954699">
- <reference key="NSNextResponder" ref="766721923"/>
- <int key="NSvFlags">274</int>
- <string key="NSFrameSize">{480, 276}</string>
- <reference key="NSSuperview" ref="766721923"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- <object class="NSColorSpace" key="NSCustomColorSpace" id="9020506">
- <int key="NSID">2</int>
- </object>
- </object>
- <bool key="IBUIClipsSubviews">YES</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBUIView" id="848489667">
- <reference key="NSNextResponder" ref="766721923"/>
- <int key="NSvFlags">274</int>
- <string key="NSFrameSize">{480, 276}</string>
- <reference key="NSSuperview" ref="766721923"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- <reference key="NSCustomColorSpace" ref="9020506"/>
- </object>
- <bool key="IBUIClipsSubviews">YES</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- </object>
- <string key="NSFrameSize">{480, 320}</string>
- <reference key="NSSuperview"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
- <int key="interfaceOrientation">3</int>
- </object>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBUIViewController" id="682131721">
- <string key="IBUINibName">MapConfigViewController-iPhone</string>
- <object class="IBUISimulatedToolbarMetrics" key="IBUISimulatedBottomBarMetrics"/>
- <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics" id="789431191">
- <int key="interfaceOrientation">3</int>
- </object>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <bool key="IBUIHorizontal">YES</bool>
- </object>
- <object class="IBUIViewController" id="508843780">
- <object class="IBUISimulatedToolbarMetrics" key="IBUISimulatedBottomBarMetrics" id="129104688">
- <int key="IBUIBarStyle">1</int>
- </object>
- <reference key="IBUISimulatedOrientationMetrics" ref="789431191"/>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <bool key="IBUIHorizontal">YES</bool>
- </object>
- <object class="IBUIViewController" id="290947091">
- <reference key="IBUISimulatedBottomBarMetrics" ref="129104688"/>
- <reference key="IBUISimulatedOrientationMetrics" ref="789431191"/>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <bool key="IBUIHorizontal">YES</bool>
- </object>
- </object>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="766721923"/>
- </object>
- <int key="connectionID">3</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonPressed:</string>
- <reference key="source" ref="80281356"/>
- <reference key="destination" ref="841351856"/>
- </object>
- <int key="connectionID">17</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonPressed:</string>
- <reference key="source" ref="919181414"/>
- <reference key="destination" ref="841351856"/>
- </object>
- <int key="connectionID">23</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">segmentPressed:</string>
- <reference key="source" ref="563596142"/>
- <reference key="destination" ref="841351856"/>
- <int key="IBEventType">13</int>
- </object>
- <int key="connectionID">29</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">mapConfigViewController</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="682131721"/>
- </object>
- <int key="connectionID">33</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">teamConfigViewController</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="508843780"/>
- </object>
- <int key="connectionID">34</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">schemeWeaponConfigViewController</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="290947091"/>
- </object>
- <int key="connectionID">35</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="508843780"/>
- <reference key="destination" ref="914954699"/>
- </object>
- <int key="connectionID">42</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="290947091"/>
- <reference key="destination" ref="848489667"/>
- </object>
- <int key="connectionID">43</int>
- </object>
- </object>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <reference key="object" ref="0"/>
- <reference key="children" ref="1000"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="841351856"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="606714003"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">2</int>
- <reference key="object" ref="766721923"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="836721772"/>
- <reference ref="914954699"/>
- <reference ref="848489667"/>
- </object>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">15</int>
- <reference key="object" ref="836721772"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="80281356"/>
- <reference ref="919181414"/>
- <reference ref="188600069"/>
- <reference ref="530186890"/>
- <reference ref="716161941"/>
- </object>
- <reference key="parent" ref="766721923"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">16</int>
- <reference key="object" ref="80281356"/>
- <reference key="parent" ref="836721772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">18</int>
- <reference key="object" ref="919181414"/>
- <reference key="parent" ref="836721772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="188600069"/>
- <reference key="parent" ref="836721772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">21</int>
- <reference key="object" ref="530186890"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="563596142"/>
- </object>
- <reference key="parent" ref="836721772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">20</int>
- <reference key="object" ref="563596142"/>
- <reference key="parent" ref="530186890"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">22</int>
- <reference key="object" ref="716161941"/>
- <reference key="parent" ref="836721772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">30</int>
- <reference key="object" ref="682131721"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">31</int>
- <reference key="object" ref="508843780"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">32</int>
- <reference key="object" ref="290947091"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">40</int>
- <reference key="object" ref="914954699"/>
- <reference key="parent" ref="766721923"/>
- <string key="objectName">TeamConfigViewController View</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">41</int>
- <reference key="object" ref="848489667"/>
- <reference key="parent" ref="766721923"/>
- <string key="objectName">SchemeWeaponConfigViewController View</string>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>15.IBPluginDependency</string>
- <string>15.IBViewBoundsToFrameTransform</string>
- <string>16.IBPluginDependency</string>
- <string>18.IBPluginDependency</string>
- <string>19.IBPluginDependency</string>
- <string>2.IBEditorWindowLastContentRect</string>
- <string>2.IBPluginDependency</string>
- <string>20.IBPluginDependency</string>
- <string>22.IBPluginDependency</string>
- <string>30.CustomClassName</string>
- <string>30.IBEditorWindowLastContentRect</string>
- <string>30.IBPluginDependency</string>
- <string>31.CustomClassName</string>
- <string>31.IBEditorWindowLastContentRect</string>
- <string>31.IBPluginDependency</string>
- <string>32.CustomClassName</string>
- <string>32.IBEditorWindowLastContentRect</string>
- <string>32.IBPluginDependency</string>
- <string>40.IBPluginDependency</string>
- <string>40.IBViewBoundsToFrameTransform</string>
- <string>41.IBPluginDependency</string>
- <string>41.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>GameConfigViewController</string>
- <string>UIResponder</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAAAAAAAAw58AAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>{{40, 217}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>MapConfigViewController</string>
- <string>{{0, 825}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>TeamConfigViewController</string>
- <string>{{21, 802}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>SchemeWeaponConfigViewController</string>
- <string>{{42, 779}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAAAAAAAAw5QAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAAAAAAAAw5QAAA</bytes>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="sourceID"/>
- <int key="maxID">45</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">GameConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>buttonPressed:</string>
- <string>segmentPressed:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>id</string>
- <string>id</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>buttonPressed:</string>
- <string>segmentPressed:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBActionInfo">
- <string key="name">buttonPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">segmentPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="outlets">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapConfigViewController</string>
- <string>schemeWeaponConfigViewController</string>
- <string>teamConfigViewController</string>
- <string>titleImage</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>MapConfigViewController</string>
- <string>SchemeWeaponConfigViewController</string>
- <string>TeamConfigViewController</string>
- <string>UIImageView</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapConfigViewController</string>
- <string>schemeWeaponConfigViewController</string>
- <string>teamConfigViewController</string>
- <string>titleImage</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBToOneOutletInfo">
- <string key="name">mapConfigViewController</string>
- <string key="candidateClassName">MapConfigViewController</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">schemeWeaponConfigViewController</string>
- <string key="candidateClassName">SchemeWeaponConfigViewController</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">teamConfigViewController</string>
- <string key="candidateClassName">TeamConfigViewController</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">titleImage</string>
- <string key="candidateClassName">UIImageView</string>
- </object>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/GameConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">MapConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapButtonPressed:</string>
- <string>segmentedControlChanged:</string>
- <string>sliderChanged:</string>
- <string>sliderEndedChanging:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapButtonPressed:</string>
- <string>segmentedControlChanged:</string>
- <string>sliderChanged:</string>
- <string>sliderEndedChanging:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBActionInfo">
- <string key="name">mapButtonPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">segmentedControlChanged:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">sliderChanged:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">sliderEndedChanging:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="outlets">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>maxLabel</string>
- <string>previewButton</string>
- <string>segmentedControl</string>
- <string>slider</string>
- <string>tableView</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>UILabel</string>
- <string>MapPreviewButtonView</string>
- <string>UISegmentedControl</string>
- <string>ValueTrackingSliderView</string>
- <string>UITableView</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>maxLabel</string>
- <string>previewButton</string>
- <string>segmentedControl</string>
- <string>slider</string>
- <string>tableView</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBToOneOutletInfo">
- <string key="name">maxLabel</string>
- <string key="candidateClassName">UILabel</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">previewButton</string>
- <string key="candidateClassName">MapPreviewButtonView</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">segmentedControl</string>
- <string key="candidateClassName">UISegmentedControl</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">slider</string>
- <string key="candidateClassName">ValueTrackingSliderView</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">tableView</string>
- <string key="candidateClassName">UITableView</string>
- </object>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MapConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">MapPreviewButtonView</string>
- <string key="superclassName">UIButton</string>
- <object class="NSMutableDictionary" key="outlets">
- <string key="NS.key.0">delegate</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <string key="NS.key.0">delegate</string>
- <object class="IBToOneOutletInfo" key="NS.object.0">
- <string key="name">delegate</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MapPreviewButtonView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">SchemeWeaponConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/SchemeWeaponConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">TeamConfigViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/TeamConfigViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="910572871">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <reference key="sourceIdentifier" ref="910572871"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">ValueTrackingSliderView</string>
- <string key="superclassName">UISlider</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MNEValueTrackingSlider.h</string>
- </object>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="786211723">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIBarButtonItem</string>
- <string key="superclassName">UIBarItem</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIBarButtonItem.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIBarItem</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIBarItem.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIButton.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIControl</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIImageView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIImageView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UILabel.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIResponder</string>
- <string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="786211723"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIScrollView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIScrollView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchBar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchDisplayController</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISegmentedControl</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISegmentedControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISlider</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISlider.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <string key="superclassName">UIScrollView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITableView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIToolbar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIToolbar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
- </object>
- </object>
- </object>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3100" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <string key="IBCocoaTouchPluginVersion">132</string>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="GameConfigViewController">
+ <connections>
+ <outlet property="backButton" destination="16" id="JdX-PP-V4d"/>
+ <outlet property="mapConfigViewController" destination="30" id="33"/>
+ <outlet property="schemeWeaponConfigViewController" destination="32" id="35"/>
+ <outlet property="startButton" destination="18" id="0Gc-dB-ioC"/>
+ <outlet property="tabsSegmentedControl" destination="20" id="PVz-zB-sKx"/>
+ <outlet property="teamConfigViewController" destination="31" id="34"/>
+ <outlet property="view" destination="2" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="320"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" barStyle="black" id="15">
+ <rect key="frame" x="0.0" y="276" width="480" height="44"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
+ <animations/>
+ <items>
+ <barButtonItem title="Back" id="16">
+ <connections>
+ <action selector="buttonPressed:" destination="-1" id="17"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="22"/>
+ <barButtonItem style="plain" id="21">
+ <segmentedControl key="customView" opaque="NO" tag="12345" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="20">
+ <rect key="frame" x="105" y="7" width="270" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <segments>
+ <segment title="Map"/>
+ <segment title="Teams"/>
+ <segment title="Details"/>
+ <segment title="Help"/>
+ </segments>
+ <color key="tintColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+ <connections>
+ <action selector="segmentPressed:" destination="-1" eventType="valueChanged" id="29"/>
+ </connections>
+ </segmentedControl>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="19"/>
+ <barButtonItem tag="1" title="Start" width="68" style="done" id="18">
+ <connections>
+ <action selector="buttonPressed:" destination="-1" id="23"/>
+ </connections>
+ </barButtonItem>
+ </items>
+ </toolbar>
+ <view clipsSubviews="YES" contentMode="scaleToFill" id="40" userLabel="TeamConfigViewController View">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="276"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ </view>
+ <view clipsSubviews="YES" contentMode="scaleToFill" id="41" userLabel="SchemeWeaponConfigViewController View">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="276"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ </view>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <point key="canvasLocation" x="944" y="504"/>
+ </view>
+ <viewController nibName="MapConfigViewController-iPhone" id="30" customClass="MapConfigViewController">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ </viewController>
+ <viewController id="31" customClass="TeamConfigViewController">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedToolbarMetrics key="simulatedBottomBarMetrics" barStyle="black"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <connections>
+ <outlet property="view" destination="40" id="42"/>
+ </connections>
+ </viewController>
+ <viewController id="32" customClass="SchemeWeaponConfigViewController">
+ <extendedEdge key="edgesForExtendedLayout"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedToolbarMetrics key="simulatedBottomBarMetrics" barStyle="black"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <connections>
+ <outlet property="view" destination="41" id="43"/>
+ </connections>
+ </viewController>
+ </objects>
+</document>
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -23,7 +23,7 @@
@class SchemeWeaponConfigViewController;
@class TeamConfigViewController;
@class MapConfigViewController;
-//@class HelpPageLobbyViewController;
+@class HelpPageLobbyViewController;
@interface GameConfigViewController : UIViewController {
UIView *imgContainer;
@@ -33,16 +33,17 @@
SchemeWeaponConfigViewController *schemeWeaponConfigViewController;
TeamConfigViewController *teamConfigViewController;
MapConfigViewController *mapConfigViewController;
- //HelpPageLobbyViewController *helpPage;
+ 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;
@property (nonatomic,retain) IBOutlet TeamConfigViewController *teamConfigViewController;
@property (nonatomic,retain) IBOutlet MapConfigViewController *mapConfigViewController;
-//@property (nonatomic,retain) HelpPageLobbyViewController *helpPage;
+@property (nonatomic,retain) HelpPageLobbyViewController *helpPage;
-(IBAction) buttonPressed:(id) sender;
-(IBAction) segmentPressed:(id) sender;
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -22,16 +22,25 @@
#import "TeamConfigViewController.h"
#import "SchemeWeaponConfigViewController.h"
#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,
+@synthesize imgContainer, titleImage, sliderBackground, helpPage,
mapConfigViewController, teamConfigViewController, schemeWeaponConfigViewController;
-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return rotationManager(interfaceOrientation);
}
+#pragma mark - Buttons
+
-(IBAction) buttonPressed:(id) sender {
UIButton *theButton = (UIButton *)sender;
@@ -47,7 +56,7 @@
[alert release];
} else {
[[AudioManagerController mainManager] playBackSound];
- [[self parentViewController] dismissModalViewControllerAnimated:YES];
+ [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
}
break;
case 1:
@@ -55,26 +64,20 @@
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;
case 2:
[[AudioManagerController mainManager] playClickSound];
- /*
if (self.helpPage == nil)
self.helpPage = [[HelpPageLobbyViewController alloc] initWithNibName:@"HelpPageLobbyViewController-iPad" bundle:nil];
self.helpPage.view.alpha = 0;
+ self.helpPage.view.frame = self.view.frame;
[self.view addSubview:self.helpPage.view];
- [UIView beginAnimations:@"helplobby" context:NULL];
- self.helpPage.view.alpha = 1;
- [UIView commitAnimations];
- */
+ [UIView animateWithDuration:0.5 animations:^{
+ self.helpPage.view.alpha = 1;
+ }];
break;
default:
DLog(@"Nope");
@@ -82,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;
@@ -104,15 +118,16 @@
[self.view bringSubviewToFront:schemeWeaponConfigViewController.view];
break;
case 3:
- /*
if (helpPage == nil) {
helpPage = [[HelpPageLobbyViewController alloc] initWithNibName:@"HelpPageLobbyViewController-iPhone" bundle:nil];
+ CGRect helpPageFrame = self.view.frame;
+ helpPageFrame.size.height -= 44; //toolbar height
+ self.helpPage.view.frame = helpPageFrame;
[self.view addSubview:helpPage.view];
}
// this message is compulsory otherwise the table won't be loaded at all
[helpPage viewWillAppear:NO];
[self.view bringSubviewToFront:helpPage.view];
- */
break;
default:
DLog(@"Nope");
@@ -121,6 +136,8 @@
}
+#pragma mark -
+
-(BOOL) isEverythingSet {
// don't start playing if the preview is in progress
if ([self.mapConfigViewController busy]) {
@@ -229,71 +246,95 @@
[gameDictionary release];
}
--(void) loadNiceHogs {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- srand(time(NULL));
- NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Hedgehog/Idle.png",GRAPHICS_DIRECTORY()];
- UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:filePath];
- [filePath release];
+-(void) loadNiceHogs
+{
+ @autoreleasepool
+ {
+
+ 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];
- int 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 %d nice hedgehogs", 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];
+ 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;
+ });
}
-
- // 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];
- [pool drain];
}
--(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
@@ -308,25 +349,41 @@
withBorderWidth:2.0f];
maxLabel.font = [UIFont italicSystemFontOfSize:[UIFont labelFontSize]];
maxLabel.textColor = [UIColor whiteColor];
- maxLabel.textAlignment = UITextAlignmentCenter;
+ maxLabel.textAlignment = NSTextAlignmentCenter;
[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 {
if (IS_IPAD() == NO)
return;
- if ((toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
- toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)) {
+ [self updateiPadUIForInterfaceOrientation:toInterfaceOrientation];
+
+ if (self.helpPage)
+ {
+ self.helpPage.view.frame = self.view.frame;
+ }
+}
+
+- (void)updateiPadUIForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ if ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
+ interfaceOrientation == UIInterfaceOrientationLandscapeRight)) {
self.imgContainer.alpha = 1;
self.titleImage.frame = CGRectMake(357, 17, 309, 165);
self.schemeWeaponConfigViewController.view.frame = CGRectMake(0, 60, 320, 620);
@@ -345,46 +402,41 @@
self.sliderBackground.frame = CGRectMake(465, 975, 200, 40);
self.mapConfigViewController.slider.frame = CGRectMake(475, 983, 180, 23);
}
-
- [self.schemeWeaponConfigViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation
- duration:duration];
-}
-
--(void) viewWillAppear:(BOOL)animated {
- if (IS_IPAD())
- [NSThread detachNewThreadSelector:@selector(loadNiceHogs) toTarget:self withObject:nil];
-
- [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) 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())
+ {
+ // we assume here what 'statusBarOrientation' will never be changed manually!
+ UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
+ [self updateiPadUIForInterfaceOrientation:currentOrientation];
+ }
}
--(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;
@@ -397,8 +449,8 @@
self.teamConfigViewController = nil;
if (self.schemeWeaponConfigViewController.view.superview == nil)
self.schemeWeaponConfigViewController = nil;
- //if (self.helpPage.view.superview == nil)
- // self.helpPage = nil;
+ if (self.helpPage.view.superview == nil)
+ self.helpPage = nil;
MSG_MEMCLEAN();
[super didReceiveMemoryWarning];
}
@@ -410,19 +462,22 @@
self.schemeWeaponConfigViewController = nil;
self.teamConfigViewController = nil;
self.mapConfigViewController = nil;
- //self.helpPage = nil;
+ self.helpPage = nil;
MSG_DIDUNLOAD();
[super viewDidUnload];
}
-(void) dealloc {
+ releaseAndNil(_tabsSegmentedControl);
+ releaseAndNil(_backButton);
+ releaseAndNil(_startButton);
releaseAndNil(imgContainer);
releaseAndNil(titleImage);
releaseAndNil(sliderBackground);
releaseAndNil(schemeWeaponConfigViewController);
releaseAndNil(teamConfigViewController);
releaseAndNil(mapConfigViewController);
- //releaseAndNil(helpPage);
+ releaseAndNil(helpPage);
[super dealloc];
}
--- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.h Fri Apr 01 15:36:19 2016 +0200
@@ -34,6 +34,7 @@
+(void) startLocalGame:(NSDictionary *)withOptions;
+(void) startSaveGame:(NSString *)atPath;
+(void) startMissionGame:(NSString *)withScript;
++(void) startCampaignMissionGameWithScript:(NSString *)missionScriptName forCampaign:(NSString *)campaignName;
+(void) startSimpleGame;
+(void) registerCallingController:(UIViewController *)controller;
--- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
@@ -176,7 +178,7 @@
[gameParameters release];
// this is the pascal function that starts the game
- Game(argc, argv);
+ RunEngine(argc, argv);
// cleanup
for (int i = 0; i < argc; i++)
@@ -201,7 +203,7 @@
statsPage.statsArray = stats;
statsPage.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
- [callingController presentModalViewController:statsPage animated:YES];
+ [callingController presentViewController:statsPage animated:YES completion:nil];
[statsPage release];
}
}
@@ -239,27 +241,41 @@
}
+(void) startMissionGame:(NSString *)withScript {
+ NSString *seedCmd = [self seedCommand];
NSString *missionPath = [[NSString alloc] initWithFormat:@"escript Missions/Training/%@.lua",withScript];
- NSDictionary *missionLine = [[NSDictionary alloc] initWithObjectsAndKeys:missionPath,@"mission_command",nil];
+ NSDictionary *missionDict = [[NSDictionary alloc] initWithObjectsAndKeys:missionPath, @"mission_command", seedCmd, @"seed_command", nil];
[missionPath release];
+ [seedCmd release];
- [self startGame:gtMission atPath:nil withOptions:missionLine];
- [missionLine release];
+ [self startGame:gtMission atPath:nil withOptions:missionDict];
+ [missionDict release];
+}
+
++(NSString *) seedCommand {
+ // generate a seed
+ NSString *seed = [HWUtils seed];
+ NSString *seedCmd = [[NSString alloc] initWithFormat:@"eseed {%@}", seed];
+ [seed release];
+ return seedCmd;
+}
+
++(void) startCampaignMissionGameWithScript:(NSString *)missionScriptName forCampaign:(NSString *)campaignName {
+ NSString *seedCmd = [self seedCommand];
+ NSString *campaignMissionPath = [[NSString alloc] initWithFormat:@"escript Missions/Campaign/%@/%@", campaignName, missionScriptName];
+ NSDictionary *campaignMissionDict = [[NSDictionary alloc] initWithObjectsAndKeys:campaignMissionPath, @"mission_command", seedCmd, @"seed_command", nil];
+ [campaignMissionPath release];
+ [seedCmd release];
+
+ [self startGame:gtCampaign atPath:nil withOptions:campaignMissionDict];
+ [campaignMissionDict release];
}
+(void) startSimpleGame {
- srand(time(0));
-
- // generate a seed
- CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
- NSString *seed = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
- CFRelease(uuid);
- NSString *seedCmd = [[NSString alloc] initWithFormat:@"eseed {%@}", seed];
- [seed release];
+ NSString *seedCmd = [self seedCommand];
// 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 +288,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];
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/GameLogViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,23 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <UIKit/UIKit.h>
+
+@interface GameLogViewController : UIViewController
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/GameLogViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,144 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <MessageUI/MFMailComposeViewController.h>
+#endif
+
+@interface GameLogViewController ()
+#ifdef DEBUG
+<MFMailComposeViewControllerDelegate>
+#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
--- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -18,9 +18,9 @@
#import <UIKit/UIKit.h>
-
+#import "TableViewControllerWithDoneButton.h"
-@interface GeneralSettingsViewController : UITableViewController <EditableCellViewDelegate> {
+@interface GeneralSettingsViewController : TableViewControllerWithDoneButton <EditableCellViewDelegate> {
}
--- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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 {
--- a/project_files/HedgewarsMobile/Classes/GravesViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/GravesViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -88,8 +88,8 @@
#pragma mark -
#pragma mark Table view delegate
-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- int newRow = [indexPath row];
- int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
+ NSInteger newRow = [indexPath row];
+ NSInteger oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
if (newRow != oldRow) {
[teamDictionary setObject:[[graveArray objectAtIndex:newRow] stringByDeletingPathExtension] forKey:@"grave"];
--- a/project_files/HedgewarsMobile/Classes/HWUtils.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HWUtils.h Fri Apr 01 15:36:19 2016 +0200
@@ -20,7 +20,7 @@
#import <Foundation/Foundation.h>
-typedef enum {gtNone, gtLocal, gtSave, gtMission, gtNet} TGameType;
+typedef enum {gtNone, gtLocal, gtSave, gtMission, gtCampaign, gtNet} TGameType;
typedef enum {gsNone, gsLoading, gsInGame, gsInterrupted, gsEnded} TGameStatus;
@interface HWUtils : NSObject {
@@ -41,7 +41,9 @@
+(NSInteger) randomPort;
+(void) freePort:(NSInteger) port;
+(BOOL) isNetworkReachable;
++(NSString *) languageID;
//+(UIView *)mainSDLViewInstance;
++(NSString *) seed;
@end
--- a/project_files/HedgewarsMobile/Classes/HWUtils.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HWUtils.m Fri Apr 01 15:36:19 2016 +0200
@@ -103,23 +103,22 @@
+(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;
- } while ([activePorts containsObject:[NSNumber numberWithInt:res]]);
+ res = (arc4random_uniform(64511)) + 1024;
+ } while ([activePorts containsObject:[NSNumber numberWithInteger:res]]);
// add this number to the forbdding list
- [activePorts addObject:[NSNumber numberWithInt:res]];
+ [activePorts addObject:[NSNumber numberWithInteger:res]];
return res;
}
+(void) freePort:(NSInteger) port {
- [activePorts removeObject:[NSNumber numberWithInt:port]];
+ [activePorts removeObject:[NSNumber numberWithInteger:port]];
}
+(BOOL) isNetworkReachable {
@@ -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();
@@ -169,4 +174,12 @@
}
*/
++ (NSString *)seed
+{
+ CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
+ NSString *seed = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
+ CFRelease(uuid);
+ return seed;
+}
+
@end
--- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Fri Apr 01 15:36:19 2016 +0200
@@ -19,7 +19,7 @@
#import "HedgewarsAppDelegate.h"
#import "MainMenuViewController.h"
-
+#import "Appirater.h"
@implementation SDLUIKitDelegate (customDelegate)
@@ -50,7 +50,18 @@
}
// 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];
self.uiwindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
@@ -58,7 +69,7 @@
NSString *controllerName = (IS_IPAD() ? @"MainMenuViewController-iPad" : @"MainMenuViewController-iPhone");
self.mainViewController = [[MainMenuViewController alloc] initWithNibName:controllerName bundle:nil];
- [self.uiwindow addSubview:self.mainViewController.view];
+ self.uiwindow.rootViewController = self.mainViewController;
[self.mainViewController release];
[self.uiwindow makeKeyAndVisible];
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,320 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="HelpPageLobbyViewController">
+ <connections>
+ <outlet property="view" destination="2" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2" customClass="UIControl">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="768"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <view contentMode="scaleToFill" id="69" userLabel="Customize Bubble">
+ <rect key="frame" x="10" y="8" width="278" height="52"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpleft.png" id="58">
+ <rect key="frame" x="0.0" y="1" width="278" height="50"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Did you know you can customize almost everything in the settings page?" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="59" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="22" y="8" width="248" height="36"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Oblique" family="Helvetica" pointSize="14"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="65" userLabel="Map theme Bubble">
+ <rect key="frame" x="742" y="360" width="240" height="102"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpabove.png" id="28">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="102"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Map theme" lineBreakMode="tailTruncation" minimumFontSize="10" id="29" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="11" y="19" width="218" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Here you can choose how your map will appear in game." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="30" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="11" y="43" width="218" height="51"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="66" userLabel="Map type Bubble">
+ <rect key="frame" x="653" y="202" width="240" height="146"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpabove.png" id="52">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="146"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Map type" lineBreakMode="tailTruncation" minimumFontSize="10" id="53" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="11" y="22" width="221" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="54" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="11" y="46" width="218" height="94"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <string key="text">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.</string>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="67" userLabel="Map preview Bubble">
+ <rect key="frame" x="494" y="20" width="240" height="101"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpright.png" id="6">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="101"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Map preview" lineBreakMode="tailTruncation" minimumFontSize="10" id="7" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="7" width="218" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="This is a small preview of your next map. Tap to select / generate a new map." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="8" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="25" width="218" height="65"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="60" userLabel="Teams Bubble">
+ <rect key="frame" x="358" y="389" width="242" height="171"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpabove.png" id="43">
+ <rect key="frame" x="0.0" y="0.0" width="242" height="171"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Teams" lineBreakMode="tailTruncation" minimumFontSize="10" id="44" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="25" width="226" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="45" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="48" width="226" height="115"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <string key="text">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.</string>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="68" userLabel="Schemes & Weapons Bubble">
+ <rect key="frame" x="142" y="160" width="240" height="104"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpleft.png" id="40">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="104"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Schemes and Weapons" lineBreakMode="tailTruncation" minimumFontSize="10" id="41" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="23" y="8" width="204" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Here you can choose which rules and which weapon set will be applied in game." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="42" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="23" y="27" width="210" height="71"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="64" userLabel="Max hogs Bubble">
+ <rect key="frame" x="35" y="590" width="240" height="117"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpbottom.png" id="34">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="117"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Max hedgehogs" lineBreakMode="tailTruncation" minimumFontSize="10" id="35" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="10" y="8" width="219" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="This number is the maximum size for all the hogs playing (in every team)." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="36" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="11" y="32" width="218" height="62"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="63" userLabel="Size slider Bubble">
+ <rect key="frame" x="695" y="598" width="240" height="109"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpbottom.png" id="37">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="109"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Size slider" lineBreakMode="tailTruncation" minimumFontSize="10" id="38" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="6" width="224" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="For Random and Maze maps you can decide to generate only maps of a certain size." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="39" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="29" width="224" height="59"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="61" userLabel="Tap anywere Bubble">
+ <rect key="frame" x="45" y="360" width="240" height="128"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpplain.png" id="25">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="128"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Tap anywhere to dismiss" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="26" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="6" y="7" width="229" height="34"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="27" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="38" width="224" height="81"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <view contentMode="scaleToFill" id="62" userLabel="Start button Bubble">
+ <rect key="frame" x="344" y="646" width="240" height="61"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <subviews>
+ <imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" image="helpbottom.png" id="49">
+ <rect key="frame" x="0.0" y="0.0" width="240" height="61"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Start button" lineBreakMode="tailTruncation" minimumFontSize="10" id="50" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="3" width="224" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="This button starts the game." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="51" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="8" y="25" width="224" height="28"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.40000000000000002" colorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <connections>
+ <action selector="dismiss" destination="-1" eventType="touchUpInside" id="16"/>
+ </connections>
+ <point key="canvasLocation" x="581" y="369"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="helpabove.png" width="295" height="156"/>
+ <image name="helpbottom.png" width="295" height="156"/>
+ <image name="helpleft.png" width="308" height="144"/>
+ <image name="helpplain.png" width="296" height="138"/>
+ <image name="helpright.png" width="308" height="144"/>
+ </resources>
+</document>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15A284" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="HelpPageLobbyViewController">
+ <connections>
+ <outlet property="scrollView" destination="60" id="95"/>
+ <outlet property="view" destination="2" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="276"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="60">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="276"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="61" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="587" width="440" height="52"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Size slider" lineBreakMode="tailTruncation" minimumFontSize="10" id="62" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="279" width="138" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="For Random and Maze maps you can decide to generate only maps of a certain size." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="63" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="298" width="440" height="44"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Schemes and Weapons" lineBreakMode="tailTruncation" minimumFontSize="10" id="64" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="511" width="204" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Here you can choose which rules and which weapon set will be applied in game." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="65" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="530" width="433" height="45"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Map preview" lineBreakMode="tailTruncation" minimumFontSize="10" id="66" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="68" width="109" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="This is a small preview of your next map. Tap to select / generate a new map." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="67" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="88" width="440" height="44"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Map type" lineBreakMode="tailTruncation" minimumFontSize="10" id="68" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="140" width="109" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="69" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="164" width="440" height="58"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <string key="text">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.</string>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Map theme" lineBreakMode="tailTruncation" minimumFontSize="10" id="70" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="229" width="109" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Here you can choose how your map will appear in game." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="71" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="244" width="440" height="33"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Max hedgehogs" lineBreakMode="tailTruncation" minimumFontSize="10" id="72" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="347" width="138" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="This number is the maximum size for all the hogs playing (in every team)." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="73" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="367" width="440" height="41"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Teams" lineBreakMode="tailTruncation" minimumFontSize="10" id="74" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="418" width="109" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="75" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="436" width="433" height="66"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <string key="text">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.</string>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Here you can find help for the game configuration options. You can customize almost everything in the settings page." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="76" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="20" y="3" width="440" height="60"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Oblique" family="Helvetica" pointSize="16"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <animations/>
+ </scrollView>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" red="0.99607849120000003" green="0.98823535439999999" blue="1" alpha="1" colorSpace="deviceRGB"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <point key="canvasLocation" x="505" y="338"/>
+ </view>
+ </objects>
+</document>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,31 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2009-2012 Vittorio Giovara <vittorio.giovara@gmail.com>
+ *
+ * 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 <UIKit/UIKit.h>
+
+
+@interface HelpPageLobbyViewController : UIViewController <UIScrollViewDelegate> {
+ UIScrollView *scrollView;
+}
+
+@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;
+
+-(IBAction) dismiss;
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,65 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2009-2012 Vittorio Giovara <vittorio.giovara@gmail.com>
+ *
+ * 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 "HelpPageLobbyViewController.h"
+
+
+@implementation HelpPageLobbyViewController
+@synthesize scrollView;
+
+-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
+ return rotationManager(interfaceOrientation);
+}
+
+-(void) didReceiveMemoryWarning {
+ [super didReceiveMemoryWarning];
+ self.scrollView = nil;
+}
+
+// on iPhone the XIBs contain UIScrollView
+-(void) viewDidLoad {
+ if (IS_IPAD() == NO){
+ scrollView.contentSize = CGSizeMake(self.view.frame.size.width, 650);
+ scrollView.maximumZoomScale = 4.0;
+ scrollView.minimumZoomScale = 0.75;
+ scrollView.clipsToBounds = YES;
+ scrollView.delegate = self;
+ }
+ [super viewDidLoad];
+}
+
+-(void) viewDidUnload {
+ [super viewDidUnload];
+ self.scrollView = nil;
+}
+
+-(void) dealloc {
+ releaseAndNil(scrollView);
+ [super dealloc];
+}
+
+-(IBAction) dismiss {
+ [UIView animateWithDuration:0.5 animations:^{
+ self.view.alpha = 0;
+ } completion:^(BOOL finished){
+ [self.view performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0];
+ }];
+}
+
+@end
--- a/project_files/HedgewarsMobile/Classes/HogHatViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- a/project_files/HedgewarsMobile/Classes/HogHatViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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 {
- int newRow = [indexPath row];
- int 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];
}
--- a/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Fri Apr 01 15:36:19 2016 +0200
@@ -18,7 +18,7 @@
#import "HoldTableViewCell.h"
-
+#import "UITableViewCell+FindTable.h"
@implementation HoldTableViewCell
@synthesize delegate;
@@ -57,7 +57,13 @@
-(void) holdAction {
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(holdAction:onTable:)])
- [self.delegate holdAction:self.textLabel.text onTable:(UITableView *)self.superview];
+ {
+ UITableView *tableView = [self findTable];
+ if (tableView)
+ {
+ [self.delegate holdAction:self.textLabel.text onTable:tableView];
+ }
+ }
}
-(void) dealloc {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/IniParser.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,27 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015-2016 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <Foundation/Foundation.h>
+
+@interface IniParser : NSObject
+
+- (instancetype)initWithIniFilePath:(NSString *)iniFilePath;
+
+- (NSArray *)newParsedSections;
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/IniParser.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,122 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015-2016 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 "IniParser.h"
+
+#define COMMENTS_START_CHAR ';'
+#define SECTION_START_CHAR '['
+
+@interface IniParser ()
+@property (nonatomic, retain) NSString *iniFilePath;
+
+@property (nonatomic, retain) NSMutableArray *mutableSections;
+@property (nonatomic, retain) NSMutableDictionary *currentSection;
+@end
+
+@implementation IniParser
+
+#pragma mark - Initilisation
+
+- (instancetype)initWithIniFilePath:(NSString *)iniFilePath {
+ self = [super init];
+ if (self) {
+ _iniFilePath = [iniFilePath copy];
+ }
+ return self;
+}
+
+#pragma mark - Parse sections
+
+- (NSArray *)newParsedSections {
+ NSString *iniFileContents = [NSString stringWithContentsOfFile:self.iniFilePath encoding:NSUTF8StringEncoding error:nil];
+
+ [self prepareForParsing];
+ [iniFileContents enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
+ if (![self isNeedToSkipLine:line]) {
+ [self parseLine:line];
+ }
+ }];
+ [self addLastParsedSectionToSections];
+
+ return [self copyParsedSections];
+}
+
+- (void)prepareForParsing {
+ self.mutableSections = [[NSMutableArray alloc] init];
+ self.currentSection = nil;
+}
+
+- (BOOL)isNeedToSkipLine:(NSString *)line {
+ return ([line length] < 1 || [self isLineAComment:line]);
+}
+
+- (BOOL)isLineAComment:(NSString *)line {
+ return ([line characterAtIndex:0] == COMMENTS_START_CHAR);
+}
+
+- (void)parseLine:(NSString *)line {
+ if ([self isLineASectionStart:line]) {
+ [self addPreviousSectionToSectionsIfNecessary];
+ [self createCurrentSection];
+ } else {
+ [self parseAssignmentForCurrentSectionInLine:line];
+ }
+}
+
+- (BOOL)isLineASectionStart:(NSString *)line {
+ return ([line characterAtIndex:0] == SECTION_START_CHAR);
+}
+
+- (void)addPreviousSectionToSectionsIfNecessary {
+ if (self.currentSection != nil) {
+ [self.mutableSections addObject:self.currentSection];
+ [self.currentSection release];
+ }
+}
+
+- (void)createCurrentSection {
+ self.currentSection = [[NSMutableDictionary alloc] init];
+}
+
+- (void)parseAssignmentForCurrentSectionInLine:(NSString *)line {
+ NSArray *components = [line componentsSeparatedByString:@"="];
+ if (components.count > 1) {
+ NSString *key = components[0];
+ NSString *value = components[1];
+ [self.currentSection setObject:value forKey:key];
+ }
+}
+
+- (void)addLastParsedSectionToSections {
+ [self addPreviousSectionToSectionsIfNecessary];
+}
+
+- (NSArray *)copyParsedSections {
+ return [self.mutableSections copy];
+}
+
+#pragma mark - Dealloc
+
+- (void)dealloc {
+ [_iniFilePath release];
+ [_mutableSections release];
+ [_currentSection release];
+ [super dealloc];
+}
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/LabelWithIBLocalization.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,23 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <UIKit/UIKit.h>
+
+@interface LabelWithIBLocalization : UILabel
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/LabelWithIBLocalization.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,41 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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
--- a/project_files/HedgewarsMobile/Classes/LevelViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/LevelViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
@@ -141,9 +136,9 @@
}
[sections release];
- DLog(@"New level is %d",level);
+ DLog(@"New level is %ld", (long)level);
for (NSMutableDictionary *hog in hogs)
- [hog setObject:[NSNumber numberWithInt:level] forKey:@"level"];
+ [hog setObject:[NSNumber numberWithInteger:level] forKey:@"level"];
[self.tableView reloadData];
[[NSNotificationCenter defaultCenter] postNotificationName:@"setWriteNeedTeams" object:nil];
@@ -153,8 +148,8 @@
#pragma mark -
#pragma mark Table view delegate
-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- int newRow = [indexPath row];
- int oldRow = (self.lastIndexPath != nil) ? [self.lastIndexPath row] : -1;
+ NSInteger newRow = [indexPath row];
+ NSInteger oldRow = (self.lastIndexPath != nil) ? [self.lastIndexPath row] : -1;
if ([indexPath section] != 0) {
if (newRow != oldRow) {
@@ -162,8 +157,8 @@
NSInteger level = newRow + 1;
for (NSMutableDictionary *hog in hogs)
- [hog setObject:[NSNumber numberWithInt:level] forKey:@"level"];
- DLog(@"New level is %d",level);
+ [hog setObject:[NSNumber numberWithInteger:level] forKey:@"level"];
+ DLog(@"New level is %ld", (long)level);
// tell our boss to write this new stuff on disk
[[NSNotificationCenter defaultCenter] postNotificationName:@"setWriteNeedTeams" object:nil];
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.h Fri Apr 01 15:36:19 2016 +0200
@@ -9,23 +9,23 @@
#import <UIKit/UIKit.h>
typedef enum _MGCornersPosition {
- MGCornersPositionLeadingVertical = 0, // top of screen for a left/right split.
- MGCornersPositionTrailingVertical = 1, // bottom of screen for a left/right split.
- MGCornersPositionLeadingHorizontal = 2, // left of screen for a top/bottom split.
- MGCornersPositionTrailingHorizontal = 3 // right of screen for a top/bottom split.
+ MGCornersPositionLeadingVertical = 0, // top of screen for a left/right split.
+ MGCornersPositionTrailingVertical = 1, // bottom of screen for a left/right split.
+ MGCornersPositionLeadingHorizontal = 2, // left of screen for a top/bottom split.
+ MGCornersPositionTrailingHorizontal = 3 // right of screen for a top/bottom split.
} MGCornersPosition;
@class MGSplitViewController;
@interface MGSplitCornersView : UIView {
- float cornerRadius;
- MGSplitViewController *splitViewController;
- MGCornersPosition cornersPosition;
- UIColor *cornerBackgroundColor;
+ float cornerRadius;
+ MGSplitViewController *__unsafe_unretained splitViewController;
+ MGCornersPosition cornersPosition;
+ UIColor *cornerBackgroundColor;
}
@property (nonatomic, assign) float cornerRadius;
-@property (nonatomic, assign) MGSplitViewController *splitViewController; // weak ref.
+@property (nonatomic, unsafe_unretained) MGSplitViewController *splitViewController; // weak ref.
@property (nonatomic, assign) MGCornersPosition cornersPosition; // don't change this manually; let the splitViewController manage it.
-@property (nonatomic, retain) UIColor *cornerBackgroundColor;
+@property (nonatomic, strong) UIColor *cornerBackgroundColor;
@end
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m Fri Apr 01 15:36:19 2016 +0200
@@ -7,7 +7,7 @@
//
#import "MGSplitCornersView.h"
-#import "CGPointUtils.h"
+
@implementation MGSplitCornersView
@@ -19,23 +19,32 @@
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
- self.contentMode = UIViewContentModeRedraw;
- self.userInteractionEnabled = NO;
- self.opaque = NO;
- self.backgroundColor = [UIColor clearColor];
- cornerRadius = 0.0; // actual value is set by the splitViewController.
- cornersPosition = MGCornersPositionLeadingVertical;
+ self.contentMode = UIViewContentModeRedraw;
+ self.userInteractionEnabled = NO;
+ self.opaque = NO;
+ self.backgroundColor = [UIColor clearColor];
+ cornerRadius = 0.0; // actual value is set by the splitViewController.
+ cornersPosition = MGCornersPositionLeadingVertical;
}
-
+
return self;
}
- (void)dealloc
{
- self.cornerBackgroundColor = nil;
+ self.cornerBackgroundColor = nil;
+}
+
- [super dealloc];
+#pragma mark -
+#pragma mark Geometry helpers
+
+
+static double deg2Rad(double degrees)
+{
+ // Converts degrees to radians.
+ return degrees * (M_PI / 180.0);
}
@@ -45,131 +54,127 @@
- (void)drawRect:(CGRect)rect
{
- // Draw two appropriate corners, with cornerBackgroundColor behind them.
- if (cornerRadius > 0) {
- if (NO) { // just for debugging.
- [[UIColor redColor] set];
- UIRectFill(self.bounds);
- }
-
- float maxX = CGRectGetMaxX(self.bounds);
- float maxY = CGRectGetMaxY(self.bounds);
- UIBezierPath *path = [UIBezierPath bezierPath];
- CGPoint pt = CGPointZero;
- switch (cornersPosition) {
- case MGCornersPositionLeadingVertical: // top of screen for a left/right split
- [path moveToPoint:pt];
- pt.y += cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(90) endAngle:0 clockwise:YES]];
- pt.x += cornerRadius;
- pt.y -= cornerRadius;
- [path addLineToPoint:pt];
- [path addLineToPoint:CGPointZero];
- [path closePath];
-
- pt.x = maxX - cornerRadius;
- pt.y = 0;
- [path moveToPoint:pt];
- pt.y = maxY;
- [path addLineToPoint:pt];
- pt.x += cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(90) clockwise:YES]];
- pt.y -= cornerRadius;
- [path addLineToPoint:pt];
- pt.x -= cornerRadius;
- [path addLineToPoint:pt];
- [path closePath];
-
- break;
-
- case MGCornersPositionTrailingVertical: // bottom of screen for a left/right split
- pt.y = maxY;
- [path moveToPoint:pt];
- pt.y -= cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(270) endAngle:degreesToRadians(360) clockwise:NO]];
- pt.x += cornerRadius;
- pt.y += cornerRadius;
- [path addLineToPoint:pt];
- pt.x -= cornerRadius;
- [path addLineToPoint:pt];
- [path closePath];
-
- pt.x = maxX - cornerRadius;
- pt.y = maxY;
- [path moveToPoint:pt];
- pt.y -= cornerRadius;
- [path addLineToPoint:pt];
- pt.x += cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(270) clockwise:NO]];
- pt.y += cornerRadius;
- [path addLineToPoint:pt];
- pt.x -= cornerRadius;
- [path addLineToPoint:pt];
- [path closePath];
-
- break;
-
- case MGCornersPositionLeadingHorizontal: // left of screen for a top/bottom split
- pt.x = 0;
- pt.y = cornerRadius;
- [path moveToPoint:pt];
- pt.y -= cornerRadius;
- [path addLineToPoint:pt];
- pt.x += cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(270) clockwise:NO]];
- pt.y += cornerRadius;
- [path addLineToPoint:pt];
- pt.x -= cornerRadius;
- [path addLineToPoint:pt];
- [path closePath];
-
- pt.x = 0;
- pt.y = maxY - cornerRadius;
- [path moveToPoint:pt];
- pt.y = maxY;
- [path addLineToPoint:pt];
- pt.x += cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(90) clockwise:YES]];
- pt.y -= cornerRadius;
- [path addLineToPoint:pt];
- pt.x -= cornerRadius;
- [path addLineToPoint:pt];
- [path closePath];
-
- break;
-
- case MGCornersPositionTrailingHorizontal: // right of screen for a top/bottom split
- pt.y = cornerRadius;
- [path moveToPoint:pt];
- pt.y -= cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(270) endAngle:degreesToRadians(360) clockwise:NO]];
- pt.x += cornerRadius;
- pt.y += cornerRadius;
- [path addLineToPoint:pt];
- pt.x -= cornerRadius;
- [path addLineToPoint:pt];
- [path closePath];
-
- pt.y = maxY - cornerRadius;
- [path moveToPoint:pt];
- pt.y += cornerRadius;
- [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(90) endAngle:0 clockwise:YES]];
- pt.x += cornerRadius;
- pt.y -= cornerRadius;
- [path addLineToPoint:pt];
- pt.x -= cornerRadius;
- [path addLineToPoint:pt];
- [path closePath];
-
- break;
-
- default:
- break;
- }
-
- [self.cornerBackgroundColor set];
- [path fill];
- }
+ // Draw two appropriate corners, with cornerBackgroundColor behind them.
+ if (cornerRadius > 0) {
+
+ float maxX = CGRectGetMaxX(self.bounds);
+ float maxY = CGRectGetMaxY(self.bounds);
+ UIBezierPath *path = [UIBezierPath bezierPath];
+ CGPoint pt = CGPointZero;
+ switch (cornersPosition) {
+ case MGCornersPositionLeadingVertical: // top of screen for a left/right split
+ [path moveToPoint:pt];
+ pt.y += cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(90) endAngle:0 clockwise:YES]];
+ pt.x += cornerRadius;
+ pt.y -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path addLineToPoint:CGPointZero];
+ [path closePath];
+
+ pt.x = maxX - cornerRadius;
+ pt.y = 0;
+ [path moveToPoint:pt];
+ pt.y = maxY;
+ [path addLineToPoint:pt];
+ pt.x += cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(90) clockwise:YES]];
+ pt.y -= cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path closePath];
+
+ break;
+
+ case MGCornersPositionTrailingVertical: // bottom of screen for a left/right split
+ pt.y = maxY;
+ [path moveToPoint:pt];
+ pt.y -= cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(270) endAngle:(float)deg2Rad(360) clockwise:NO]];
+ pt.x += cornerRadius;
+ pt.y += cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path closePath];
+
+ pt.x = maxX - cornerRadius;
+ pt.y = maxY;
+ [path moveToPoint:pt];
+ pt.y -= cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x += cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(270) clockwise:NO]];
+ pt.y += cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path closePath];
+
+ break;
+
+ case MGCornersPositionLeadingHorizontal: // left of screen for a top/bottom split
+ pt.x = 0;
+ pt.y = cornerRadius;
+ [path moveToPoint:pt];
+ pt.y -= cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x += cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(270) clockwise:NO]];
+ pt.y += cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path closePath];
+
+ pt.x = 0;
+ pt.y = maxY - cornerRadius;
+ [path moveToPoint:pt];
+ pt.y = maxY;
+ [path addLineToPoint:pt];
+ pt.x += cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(90) clockwise:YES]];
+ pt.y -= cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path closePath];
+
+ break;
+
+ case MGCornersPositionTrailingHorizontal: // right of screen for a top/bottom split
+ pt.y = cornerRadius;
+ [path moveToPoint:pt];
+ pt.y -= cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(270) endAngle:(float)deg2Rad(360) clockwise:NO]];
+ pt.x += cornerRadius;
+ pt.y += cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path closePath];
+
+ pt.y = maxY - cornerRadius;
+ [path moveToPoint:pt];
+ pt.y += cornerRadius;
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(90) endAngle:0 clockwise:YES]];
+ pt.x += cornerRadius;
+ pt.y -= cornerRadius;
+ [path addLineToPoint:pt];
+ pt.x -= cornerRadius;
+ [path addLineToPoint:pt];
+ [path closePath];
+
+ break;
+
+ default:
+ break;
+ }
+
+ [self.cornerBackgroundColor set];
+ [path fill];
+ }
}
@@ -179,38 +184,37 @@
- (void)setCornerRadius:(float)newRadius
{
- if (newRadius != cornerRadius) {
- cornerRadius = newRadius;
- [self setNeedsDisplay];
- }
+ if (newRadius != cornerRadius) {
+ cornerRadius = newRadius;
+ [self setNeedsDisplay];
+ }
}
- (void)setSplitViewController:(MGSplitViewController *)theController
{
- if (theController != splitViewController) {
- splitViewController = theController;
- [self setNeedsDisplay];
- }
+ if (theController != splitViewController) {
+ splitViewController = theController;
+ [self setNeedsDisplay];
+ }
}
- (void)setCornersPosition:(MGCornersPosition)posn
{
- if (cornersPosition != posn) {
- cornersPosition = posn;
- [self setNeedsDisplay];
- }
+ if (cornersPosition != posn) {
+ cornersPosition = posn;
+ [self setNeedsDisplay];
+ }
}
- (void)setCornerBackgroundColor:(UIColor *)color
{
- if (color != cornerBackgroundColor) {
- [cornerBackgroundColor release];
- cornerBackgroundColor = [color retain];
- [self setNeedsDisplay];
- }
+ if (color != cornerBackgroundColor) {
+ cornerBackgroundColor = color;
+ [self setNeedsDisplay];
+ }
}
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.h Fri Apr 01 15:36:19 2016 +0200
@@ -10,11 +10,11 @@
@class MGSplitViewController;
@interface MGSplitDividerView : UIView {
- MGSplitViewController *splitViewController;
- BOOL allowsDragging;
+ MGSplitViewController *__unsafe_unretained splitViewController;
+ BOOL allowsDragging;
}
-@property (nonatomic, assign) MGSplitViewController *splitViewController; // weak ref.
+@property (nonatomic, unsafe_unretained) MGSplitViewController *splitViewController; // weak ref.
@property (nonatomic, assign) BOOL allowsDragging;
- (void)drawGripThumbInRect:(CGRect)rect;
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m Fri Apr 01 15:36:19 2016 +0200
@@ -19,19 +19,18 @@
- (id)initWithFrame:(CGRect)frame
{
- if ((self = [super initWithFrame:frame])) {
- self.userInteractionEnabled = NO;
- self.allowsDragging = NO;
- self.contentMode = UIViewContentModeRedraw;
- }
- return self;
+ if ((self = [super initWithFrame:frame])) {
+ self.userInteractionEnabled = NO;
+ self.allowsDragging = NO;
+ self.contentMode = UIViewContentModeRedraw;
+ }
+ return self;
}
- (void)dealloc
{
- self.splitViewController = nil;
- [super dealloc];
+ self.splitViewController = nil;
}
@@ -41,139 +40,139 @@
- (void)drawRect:(CGRect)rect
{
- if (splitViewController.dividerStyle == MGSplitViewDividerStyleThin) {
- [super drawRect:rect];
-
- } else if (splitViewController.dividerStyle == MGSplitViewDividerStylePaneSplitter) {
- // Draw gradient background.
- CGRect bounds = self.bounds;
- CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
- CGFloat locations[2] = {0, 1};
- CGFloat components[8] = { 0.988, 0.988, 0.988, 1.0, // light
- 0.875, 0.875, 0.875, 1.0 };// dark
- CGGradientRef gradient = CGGradientCreateWithColorComponents (rgb, components, locations, 2);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGPoint start, end;
- if (splitViewController.vertical) {
- // Light left to dark right.
- start = CGPointMake(CGRectGetMinX(bounds), CGRectGetMidY(bounds));
- end = CGPointMake(CGRectGetMaxX(bounds), CGRectGetMidY(bounds));
- } else {
- // Light top to dark bottom.
- start = CGPointMake(CGRectGetMidX(bounds), CGRectGetMinY(bounds));
- end = CGPointMake(CGRectGetMidX(bounds), CGRectGetMaxY(bounds));
- }
- CGContextDrawLinearGradient(context, gradient, start, end, 0);
- CGColorSpaceRelease(rgb);
- CGGradientRelease(gradient);
-
- // Draw borders.
- float borderThickness = 1.0;
- [[UIColor colorWithWhite:0.7 alpha:1.0] set];
- CGRect borderRect = bounds;
- if (splitViewController.vertical) {
- borderRect.size.width = borderThickness;
- UIRectFill(borderRect);
- borderRect.origin.x = CGRectGetMaxX(bounds) - borderThickness;
- UIRectFill(borderRect);
-
- } else {
- borderRect.size.height = borderThickness;
- UIRectFill(borderRect);
- borderRect.origin.y = CGRectGetMaxY(bounds) - borderThickness;
- UIRectFill(borderRect);
- }
-
- // Draw grip.
- [self drawGripThumbInRect:bounds];
- }
+ if (splitViewController.dividerStyle == MGSplitViewDividerStyleThin) {
+ [super drawRect:rect];
+
+ } else if (splitViewController.dividerStyle == MGSplitViewDividerStylePaneSplitter) {
+ // Draw gradient background.
+ CGRect bounds = self.bounds;
+ CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
+ CGFloat locations[2] = {0, 1};
+ CGFloat components[8] = { 0.988f, 0.988f, 0.988f, 1.0, // light
+ 0.875, 0.875, 0.875, 1.0 };// dark
+ CGGradientRef gradient = CGGradientCreateWithColorComponents (rgb, components, locations, 2);
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ CGPoint start, end;
+ if (splitViewController.vertical) {
+ // Light left to dark right.
+ start = CGPointMake(CGRectGetMinX(bounds), CGRectGetMidY(bounds));
+ end = CGPointMake(CGRectGetMaxX(bounds), CGRectGetMidY(bounds));
+ } else {
+ // Light top to dark bottom.
+ start = CGPointMake(CGRectGetMidX(bounds), CGRectGetMinY(bounds));
+ end = CGPointMake(CGRectGetMidX(bounds), CGRectGetMaxY(bounds));
+ }
+ CGContextDrawLinearGradient(context, gradient, start, end, 0);
+ CGColorSpaceRelease(rgb);
+ CGGradientRelease(gradient);
+
+ // Draw borders.
+ float borderThickness = 1.0;
+ [[UIColor colorWithWhite:0.7f alpha:1.0] set];
+ CGRect borderRect = bounds;
+ if (splitViewController.vertical) {
+ borderRect.size.width = borderThickness;
+ UIRectFill(borderRect);
+ borderRect.origin.x = CGRectGetMaxX(bounds) - borderThickness;
+ UIRectFill(borderRect);
+
+ } else {
+ borderRect.size.height = borderThickness;
+ UIRectFill(borderRect);
+ borderRect.origin.y = CGRectGetMaxY(bounds) - borderThickness;
+ UIRectFill(borderRect);
+ }
+
+ // Draw grip.
+ [self drawGripThumbInRect:bounds];
+ }
}
- (void)drawGripThumbInRect:(CGRect)rect
{
- float width = 9.0;
- float height;
- if (splitViewController.vertical) {
- height = 30.0;
- } else {
- height = width;
- width = 30.0;
- }
-
- // Draw grip in centred in rect.
- CGRect gripRect = CGRectMake(0, 0, width, height);
- gripRect.origin.x = ((rect.size.width - gripRect.size.width) / 2.0);
- gripRect.origin.y = ((rect.size.height - gripRect.size.height) / 2.0);
-
- float stripThickness = 1.0;
- UIColor *stripColor = [UIColor colorWithWhite:0.35 alpha:1.0];
- UIColor *lightColor = [UIColor colorWithWhite:1.0 alpha:1.0];
- float space = 3.0;
- if (splitViewController.vertical) {
- gripRect.size.width = stripThickness;
- [stripColor set];
- UIRectFill(gripRect);
-
- gripRect.origin.x += stripThickness;
- gripRect.origin.y += 1;
- [lightColor set];
- UIRectFill(gripRect);
- gripRect.origin.x -= stripThickness;
- gripRect.origin.y -= 1;
-
- gripRect.origin.x += space + stripThickness;
- [stripColor set];
- UIRectFill(gripRect);
-
- gripRect.origin.x += stripThickness;
- gripRect.origin.y += 1;
- [lightColor set];
- UIRectFill(gripRect);
- gripRect.origin.x -= stripThickness;
- gripRect.origin.y -= 1;
-
- gripRect.origin.x += space + stripThickness;
- [stripColor set];
- UIRectFill(gripRect);
-
- gripRect.origin.x += stripThickness;
- gripRect.origin.y += 1;
- [lightColor set];
- UIRectFill(gripRect);
-
- } else {
- gripRect.size.height = stripThickness;
- [stripColor set];
- UIRectFill(gripRect);
-
- gripRect.origin.y += stripThickness;
- gripRect.origin.x -= 1;
- [lightColor set];
- UIRectFill(gripRect);
- gripRect.origin.y -= stripThickness;
- gripRect.origin.x += 1;
-
- gripRect.origin.y += space + stripThickness;
- [stripColor set];
- UIRectFill(gripRect);
-
- gripRect.origin.y += stripThickness;
- gripRect.origin.x -= 1;
- [lightColor set];
- UIRectFill(gripRect);
- gripRect.origin.y -= stripThickness;
- gripRect.origin.x += 1;
-
- gripRect.origin.y += space + stripThickness;
- [stripColor set];
- UIRectFill(gripRect);
-
- gripRect.origin.y += stripThickness;
- gripRect.origin.x -= 1;
- [lightColor set];
- UIRectFill(gripRect);
- }
+ float width = 9.0;
+ float height;
+ if (splitViewController.vertical) {
+ height = 30.0;
+ } else {
+ height = width;
+ width = 30.0;
+ }
+
+ // Draw grip in centred in rect.
+ CGRect gripRect = CGRectMake(0, 0, width, height);
+ gripRect.origin.x = ((rect.size.width - gripRect.size.width) / 2.f);
+ gripRect.origin.y = ((rect.size.height - gripRect.size.height) / 2.f);
+
+ float stripThickness = 1.0;
+ UIColor *stripColor = [UIColor colorWithWhite:0.35f alpha:1.0];
+ UIColor *lightColor = [UIColor colorWithWhite:1.0 alpha:1.0];
+ float space = 3.0;
+ if (splitViewController.vertical) {
+ gripRect.size.width = stripThickness;
+ [stripColor set];
+ UIRectFill(gripRect);
+
+ gripRect.origin.x += stripThickness;
+ gripRect.origin.y += 1;
+ [lightColor set];
+ UIRectFill(gripRect);
+ gripRect.origin.x -= stripThickness;
+ gripRect.origin.y -= 1;
+
+ gripRect.origin.x += space + stripThickness;
+ [stripColor set];
+ UIRectFill(gripRect);
+
+ gripRect.origin.x += stripThickness;
+ gripRect.origin.y += 1;
+ [lightColor set];
+ UIRectFill(gripRect);
+ gripRect.origin.x -= stripThickness;
+ gripRect.origin.y -= 1;
+
+ gripRect.origin.x += space + stripThickness;
+ [stripColor set];
+ UIRectFill(gripRect);
+
+ gripRect.origin.x += stripThickness;
+ gripRect.origin.y += 1;
+ [lightColor set];
+ UIRectFill(gripRect);
+
+ } else {
+ gripRect.size.height = stripThickness;
+ [stripColor set];
+ UIRectFill(gripRect);
+
+ gripRect.origin.y += stripThickness;
+ gripRect.origin.x -= 1;
+ [lightColor set];
+ UIRectFill(gripRect);
+ gripRect.origin.y -= stripThickness;
+ gripRect.origin.x += 1;
+
+ gripRect.origin.y += space + stripThickness;
+ [stripColor set];
+ UIRectFill(gripRect);
+
+ gripRect.origin.y += stripThickness;
+ gripRect.origin.x -= 1;
+ [lightColor set];
+ UIRectFill(gripRect);
+ gripRect.origin.y -= stripThickness;
+ gripRect.origin.x += 1;
+
+ gripRect.origin.y += space + stripThickness;
+ [stripColor set];
+ UIRectFill(gripRect);
+
+ gripRect.origin.y += stripThickness;
+ gripRect.origin.x -= 1;
+ [lightColor set];
+ UIRectFill(gripRect);
+ }
}
@@ -183,16 +182,16 @@
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
- UITouch *touch = [touches anyObject];
- if (touch) {
- CGPoint lastPt = [touch previousLocationInView:self];
- CGPoint pt = [touch locationInView:self];
- float offset = (splitViewController.vertical) ? pt.x - lastPt.x : pt.y - lastPt.y;
- if (!splitViewController.masterBeforeDetail) {
- offset = -offset;
- }
- splitViewController.splitPosition = splitViewController.splitPosition + offset;
- }
+ UITouch *touch = [touches anyObject];
+ if (touch) {
+ CGPoint lastPt = [touch previousLocationInView:self];
+ CGPoint pt = [touch locationInView:self];
+ float offset = (splitViewController.vertical) ? pt.x - lastPt.x : pt.y - lastPt.y;
+ if (!splitViewController.masterBeforeDetail) {
+ offset = -offset;
+ }
+ splitViewController.splitPosition = splitViewController.splitPosition + offset;
+ }
}
@@ -202,10 +201,10 @@
- (void)setAllowsDragging:(BOOL)flag
{
- if (flag != allowsDragging) {
- allowsDragging = flag;
- self.userInteractionEnabled = allowsDragging;
- }
+ if (flag != allowsDragging) {
+ allowsDragging = flag;
+ self.userInteractionEnabled = allowsDragging;
+ }
}
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -9,31 +9,32 @@
#import <UIKit/UIKit.h>
typedef enum _MGSplitViewDividerStyle {
- // These names have been chosen to be conceptually similar to those of NSSplitView on Mac OS X.
- MGSplitViewDividerStyleThin = 0, // Thin divider, like UISplitViewController (default).
- MGSplitViewDividerStylePaneSplitter = 1 // Thick divider, drawn with a grey gradient and a grab-strip.
+ // These names have been chosen to be conceptually similar to those of NSSplitView on Mac OS X.
+ MGSplitViewDividerStyleThin = 0, // Thin divider, like UISplitViewController (default).
+ MGSplitViewDividerStylePaneSplitter = 1 // Thick divider, drawn with a grey gradient and a grab-strip.
} MGSplitViewDividerStyle;
@class MGSplitDividerView;
@protocol MGSplitViewControllerDelegate;
@interface MGSplitViewController : UIViewController <UIPopoverControllerDelegate> {
- BOOL _showsMasterInPortrait;
- BOOL _showsMasterInLandscape;
- float _splitWidth;
- id _delegate;
- BOOL _vertical;
- BOOL _masterBeforeDetail;
- NSMutableArray *_viewControllers;
- UIBarButtonItem *_barButtonItem; // To be compliant with wacky UISplitViewController behaviour.
+ BOOL _showsMasterInPortrait;
+ BOOL _showsMasterInLandscape;
+ float _splitWidth;
+ id _delegate;
+ BOOL _vertical;
+ BOOL _masterBeforeDetail;
+ NSMutableArray *_viewControllers;
+ UIBarButtonItem *_barButtonItem; // To be compliant with wacky UISplitViewController behaviour.
UIPopoverController *_hiddenPopoverController; // Popover used to hold the master view if it's not always visible.
- MGSplitDividerView *_dividerView; // View that draws the divider between the master and detail views.
- NSArray *_cornerViews; // Views to draw the inner rounded corners between master and detail views.
- float _splitPosition;
- BOOL _reconfigurePopup;
- MGSplitViewDividerStyle _dividerStyle; // Meta-setting which configures several aspects of appearance and behaviour.
+ MGSplitDividerView *_dividerView; // View that draws the divider between the master and detail views.
+ NSArray *_cornerViews; // Views to draw the inner rounded corners between master and detail views.
+ float _splitPosition;
+ BOOL _reconfigurePopup;
+ MGSplitViewDividerStyle _dividerStyle; // Meta-setting which configures several aspects of appearance and behaviour.
+ BOOL togglesMasterPopover;
}
-@property (nonatomic, assign) IBOutlet id <MGSplitViewControllerDelegate> delegate;
+@property (nonatomic, unsafe_unretained) IBOutlet id <MGSplitViewControllerDelegate> delegate;
@property (nonatomic, assign) BOOL showsMasterInPortrait; // applies to both portrait orientations (default NO)
@property (nonatomic, assign) BOOL showsMasterInLandscape; // applies to both landscape orientations (default YES)
@property (nonatomic, assign, getter=isVertical) BOOL vertical; // if NO, split is horizontal, i.e. master above detail (default YES)
@@ -43,31 +44,34 @@
@property (nonatomic, assign) BOOL allowsDraggingDivider; // whether to let the user drag the divider to alter the split position (default NO).
@property (nonatomic, copy) NSArray *viewControllers; // array of UIViewControllers; master is at index 0, detail is at index 1.
-@property (nonatomic, retain) IBOutlet UIViewController *masterViewController; // convenience.
-@property (nonatomic, retain) IBOutlet UIViewController *detailViewController; // convenience.
-@property (nonatomic, retain) MGSplitDividerView *dividerView; // the view which draws the divider/split between master and detail.
+@property (nonatomic, strong) IBOutlet UIViewController *masterViewController; // convenience.
+@property (nonatomic, strong) IBOutlet UIViewController *detailViewController; // convenience.
+@property (nonatomic, strong) MGSplitDividerView *dividerView; // the view which draws the divider/split between master and detail.
@property (nonatomic, assign) MGSplitViewDividerStyle dividerStyle; // style (and behaviour) of the divider between master and detail.
@property (nonatomic, readonly, getter=isLandscape) BOOL landscape; // returns YES if this view controller is in either of the two Landscape orientations, else NO.
+@property (nonatomic, readwrite) BOOL togglesMasterPopover; // default is NO.
+
// Actions
- (IBAction)toggleSplitOrientation:(id)sender; // toggles split axis between vertical (left/right; default) and horizontal (top/bottom).
- (IBAction)toggleMasterBeforeDetail:(id)sender; // toggles position of master view relative to detail view.
- (IBAction)toggleMasterView:(id)sender; // toggles display of the master view in the current orientation.
- (IBAction)showMasterPopover:(id)sender; // shows the master view in a popover spawned from the provided barButtonItem, if it's currently hidden.
+- (IBAction)hideMasterPopover:(id)sender; // hides the master view in a popover spawned from the provided barButtonItem, if it's currently shown.
- (void)notePopoverDismissed; // should rarely be needed, because you should not change the popover's delegate. If you must, then call this when it's dismissed.
// Conveniences for you, because I care.
- (BOOL)isShowingMaster;
- (void)setSplitPosition:(float)posn animated:(BOOL)animate; // Allows for animation of splitPosition changes. The property's regular setter is not animated.
-/* Note: splitPosition is the width (in a left/right split, or height in a top/bottom split) of the master view.
- It is relative to the appropriate side of the splitView, which can be any of the four sides depending on the values in isMasterBeforeDetail and isVertical:
- isVertical = YES, isMasterBeforeDetail = YES: splitPosition is relative to the LEFT edge. (Default)
- isVertical = YES, isMasterBeforeDetail = NO: splitPosition is relative to the RIGHT edge.
- isVertical = NO, isMasterBeforeDetail = YES: splitPosition is relative to the TOP edge.
- isVertical = NO, isMasterBeforeDetail = NO: splitPosition is relative to the BOTTOM edge.
+/* Note: splitPosition is the width (in a left/right split, or height in a top/bottom split) of the master view.
+ It is relative to the appropriate side of the splitView, which can be any of the four sides depending on the values in isMasterBeforeDetail and isVertical:
+ isVertical = YES, isMasterBeforeDetail = YES: splitPosition is relative to the LEFT edge. (Default)
+ isVertical = YES, isMasterBeforeDetail = NO: splitPosition is relative to the RIGHT edge.
+ isVertical = NO, isMasterBeforeDetail = YES: splitPosition is relative to the TOP edge.
+ isVertical = NO, isMasterBeforeDetail = NO: splitPosition is relative to the BOTTOM edge.
- This implementation was chosen so you don't need to recalculate equivalent splitPositions if the user toggles masterBeforeDetail themselves.
+ This implementation was chosen so you don't need to recalculate equivalent splitPositions if the user toggles masterBeforeDetail themselves.
*/
- (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle animated:(BOOL)animate; // Allows for animation of dividerStyle changes. The property's regular setter is not animated.
- (NSArray *)cornerViews;
@@ -76,8 +80,8 @@
The first view is the "leading" corners (top edge of screen for left/right split, left edge of screen for top/bottom split).
The second view is the "trailing" corners (bottom edge of screen for left/right split, right edge of screen for top/bottom split).
Do NOT modify them, except to:
- 1. Change their .cornerBackgroundColor
- 2. Change their .cornerRadius
+ 1. Change their .cornerBackgroundColor
+ 2. Change their .cornerRadius
*/
@end
@@ -88,21 +92,26 @@
@optional
// Called when a button should be added to a toolbar for a hidden view controller.
-- (void)splitViewController:(MGSplitViewController*)svc
- willHideViewController:(UIViewController *)aViewController
- withBarButtonItem:(UIBarButtonItem*)barButtonItem
- forPopoverController: (UIPopoverController*)pc;
+- (void)splitViewController:(MGSplitViewController*)svc
+ willHideViewController:(UIViewController *)aViewController
+ withBarButtonItem:(UIBarButtonItem*)barButtonItem
+ forPopoverController: (UIPopoverController*)pc;
// Called when the master view is shown again in the split view, invalidating the button and popover controller.
-- (void)splitViewController:(MGSplitViewController*)svc
- willShowViewController:(UIViewController *)aViewController
+- (void)splitViewController:(MGSplitViewController*)svc
+ willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem;
// Called when the master view is shown in a popover, so the delegate can take action like hiding other popovers.
-- (void)splitViewController:(MGSplitViewController*)svc
- popoverController:(UIPopoverController*)pc
+- (void)splitViewController:(MGSplitViewController*)svc
+ popoverController:(UIPopoverController*)pc
willPresentViewController:(UIViewController *)aViewController;
+// Called when a popover containing the master view is going to be hidden so the delegate can take action like showing other popovers. This only happens if togglesMasterPopover is set to YES.
+- (void)splitViewController:(MGSplitViewController*)svc
+ popoverController:(UIPopoverController*)pc
+ willDismissViewController:(UIViewController *)aViewController;
+
// Called when the split orientation will change (from vertical to horizontal, or vice versa).
- (void)splitViewController:(MGSplitViewController*)svc willChangeSplitOrientationToVertical:(BOOL)isVertical;
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -10,19 +10,18 @@
#import "MGSplitDividerView.h"
#import "MGSplitCornersView.h"
-#define MG_DEFAULT_SPLIT_POSITION 320.0 // default width of master view in UISplitViewController.
-#define MG_DEFAULT_SPLIT_WIDTH 1.0 // default width of split-gutter in UISplitViewController.
-#define MG_DEFAULT_CORNER_RADIUS 5.0 // default corner-radius of overlapping split-inner corners on the master and detail views.
-#define MG_DEFAULT_CORNER_COLOR [UIColor blackColor] // default color of intruding inner corners (and divider background).
+#define MG_DEFAULT_SPLIT_POSITION 320.0 // default width of master view in UISplitViewController.
+#define MG_DEFAULT_SPLIT_WIDTH 1.0 // default width of split-gutter in UISplitViewController.
+#define MG_DEFAULT_CORNER_RADIUS 5.0 // default corner-radius of overlapping split-inner corners on the master and detail views.
+#define MG_DEFAULT_CORNER_COLOR [UIColor blackColor] // default color of intruding inner corners (and divider background).
-#define MG_PANESPLITTER_CORNER_RADIUS 0.0 // corner-radius of split-inner corners for MGSplitViewDividerStylePaneSplitter style.
-#define MG_PANESPLITTER_SPLIT_WIDTH 25.0 // width of split-gutter for MGSplitViewDividerStylePaneSplitter style.
+#define MG_PANESPLITTER_CORNER_RADIUS 0.0 // corner-radius of split-inner corners for MGSplitViewDividerStylePaneSplitter style.
+#define MG_PANESPLITTER_SPLIT_WIDTH 25.0 // width of split-gutter for MGSplitViewDividerStylePaneSplitter style.
-#define MG_MIN_VIEW_WIDTH 200.0 // minimum width a view is allowed to become as a result of changing the splitPosition.
+#define MG_MIN_VIEW_WIDTH 200.0 // minimum width a view is allowed to become as a result of changing the splitPosition.
-#define MG_ANIMATION_CHANGE_SPLIT_ORIENTATION @"ChangeSplitOrientation" // Animation ID for internal use.
-#define MG_ANIMATION_CHANGE_SUBVIEWS_ORDER @"ChangeSubviewsOrder" // Animation ID for internal use.
-
+#define MG_ANIMATION_CHANGE_SPLIT_ORIENTATION @"ChangeSplitOrientation" // Animation ID for internal use.
+#define MG_ANIMATION_CHANGE_SUBVIEWS_ORDER @"ChangeSubviewsOrder" // Animation ID for internal use.
@interface MGSplitViewController (MGPrivateMethods)
@@ -48,50 +47,50 @@
- (NSString *)nameOfInterfaceOrientation:(UIInterfaceOrientation)theOrientation
{
- NSString *orientationName = nil;
- switch (theOrientation) {
- case UIInterfaceOrientationPortrait:
- orientationName = @"Portrait"; // Home button at bottom
- break;
- case UIInterfaceOrientationPortraitUpsideDown:
- orientationName = @"Portrait (Upside Down)"; // Home button at top
- break;
- case UIInterfaceOrientationLandscapeLeft:
- orientationName = @"Landscape (Left)"; // Home button on left
- break;
- case UIInterfaceOrientationLandscapeRight:
- orientationName = @"Landscape (Right)"; // Home button on right
- break;
- default:
- break;
- }
-
- return orientationName;
+ NSString *orientationName = nil;
+ switch (theOrientation) {
+ case UIInterfaceOrientationPortrait:
+ orientationName = @"Portrait"; // Home button at bottom
+ break;
+ case UIInterfaceOrientationPortraitUpsideDown:
+ orientationName = @"Portrait (Upside Down)"; // Home button at top
+ break;
+ case UIInterfaceOrientationLandscapeLeft:
+ orientationName = @"Landscape (Left)"; // Home button on left
+ break;
+ case UIInterfaceOrientationLandscapeRight:
+ orientationName = @"Landscape (Right)"; // Home button on right
+ break;
+ default:
+ break;
+ }
+
+ return orientationName;
}
- (BOOL)isLandscape
{
- return UIInterfaceOrientationIsLandscape(self.interfaceOrientation);
+ return UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]);
}
- (BOOL)shouldShowMasterForInterfaceOrientation:(UIInterfaceOrientation)theOrientation
{
- // Returns YES if master view should be shown directly embedded in the splitview, instead of hidden in a popover.
- return ((UIInterfaceOrientationIsLandscape(theOrientation)) ? _showsMasterInLandscape : _showsMasterInPortrait);
+ // Returns YES if master view should be shown directly embedded in the splitview, instead of hidden in a popover.
+ return ((UIInterfaceOrientationIsLandscape(theOrientation)) ? _showsMasterInLandscape : _showsMasterInPortrait);
}
- (BOOL)shouldShowMaster
{
- return [self shouldShowMasterForInterfaceOrientation:self.interfaceOrientation];
+ return [self shouldShowMasterForInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
}
- (BOOL)isShowingMaster
{
- return [self shouldShowMaster] && self.masterViewController && self.masterViewController.view && ([self.masterViewController.view superview] == self.view);
+ return [self shouldShowMaster] && self.masterViewController && self.masterViewController.view && ([self.masterViewController.view superview] == self.view);
}
@@ -101,61 +100,58 @@
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
- if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
- [self setup];
- }
-
- return self;
+ if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
+ [self setup];
+ }
+
+ return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
- if ((self = [super initWithCoder:aDecoder])) {
- [self setup];
- }
-
- return self;
+ if ((self = [super initWithCoder:aDecoder])) {
+ [self setup];
+ }
+
+ return self;
}
- (void)setup
{
- // Configure default behaviour.
- _viewControllers = [[NSMutableArray alloc] initWithObjects:[NSNull null], [NSNull null], nil];
- _splitWidth = MG_DEFAULT_SPLIT_WIDTH;
- _showsMasterInPortrait = NO;
- _showsMasterInLandscape = YES;
- _reconfigurePopup = NO;
- _vertical = YES;
- _masterBeforeDetail = YES;
- _splitPosition = MG_DEFAULT_SPLIT_POSITION;
- CGRect divRect = self.view.bounds;
- if ([self isVertical]) {
- divRect.origin.y = _splitPosition;
- divRect.size.height = _splitWidth;
- } else {
- divRect.origin.x = _splitPosition;
- divRect.size.width = _splitWidth;
- }
- _dividerView = [[MGSplitDividerView alloc] initWithFrame:divRect];
- _dividerView.splitViewController = self;
- _dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
- _dividerStyle = MGSplitViewDividerStyleThin;
+ // Configure default behaviour.
+ _viewControllers = [[NSMutableArray alloc] initWithObjects:[NSNull null], [NSNull null], nil];
+ _splitWidth = MG_DEFAULT_SPLIT_WIDTH;
+ _showsMasterInPortrait = NO;
+ _showsMasterInLandscape = YES;
+ _reconfigurePopup = NO;
+ _vertical = YES;
+ _masterBeforeDetail = YES;
+ _splitPosition = MG_DEFAULT_SPLIT_POSITION;
+ CGRect divRect = self.view.bounds;
+ if ([self isVertical]) {
+ divRect.origin.y = _splitPosition;
+ divRect.size.height = _splitWidth;
+ } else {
+ divRect.origin.x = _splitPosition;
+ divRect.size.width = _splitWidth;
+ }
+ _dividerView = [[MGSplitDividerView alloc] initWithFrame:divRect];
+ _dividerView.splitViewController = self;
+ _dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
+ _dividerStyle = MGSplitViewDividerStyleThin;
+
+ // fix for iOS 6 layout
+ self.view.autoresizesSubviews = NO;
}
- (void)dealloc
{
- _delegate = nil;
- [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
- [_viewControllers release];
- [_barButtonItem release];
- [_hiddenPopoverController release];
- [_dividerView release];
- [_cornerViews release];
-
- [super dealloc];
+ _delegate = nil;
+ _viewControllers = nil;
+ [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
}
@@ -165,377 +161,370 @@
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
+ if (self.detailViewController)
+ {
+ return [self.detailViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
+ }
+
return YES;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
- [self.masterViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
- [self.detailViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
+ [self.masterViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
+ [self.detailViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
- [self.masterViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
- [self.detailViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
+ [self.masterViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
+ [self.detailViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}
-- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
- duration:(NSTimeInterval)duration
+- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
+ duration:(NSTimeInterval)duration
{
- [self.masterViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
- [self.detailViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
-
- // Hide popover.
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- // Re-tile views.
- _reconfigurePopup = YES;
- [self layoutSubviewsForInterfaceOrientation:toInterfaceOrientation withAnimation:YES];
-}
-
-
-- (void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
-{
- [self.masterViewController willAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
- [self.detailViewController willAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
-}
-
-
-- (void)didAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
-{
- [self.masterViewController didAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation];
- [self.detailViewController didAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation];
-}
-
-
-- (void)willAnimateSecondHalfOfRotationFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration
-{
- [self.masterViewController willAnimateSecondHalfOfRotationFromInterfaceOrientation:fromInterfaceOrientation duration:duration];
- [self.detailViewController willAnimateSecondHalfOfRotationFromInterfaceOrientation:fromInterfaceOrientation duration:duration];
+ [self.masterViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
+ [self.detailViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
+
+ // Hide popover.
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ // Re-tile views.
+ _reconfigurePopup = YES;
+ [self layoutSubviewsForInterfaceOrientation:toInterfaceOrientation withAnimation:YES];
}
- (CGSize)splitViewSizeForOrientation:(UIInterfaceOrientation)theOrientation
{
- UIScreen *screen = [UIScreen mainScreen];
- CGRect fullScreenRect = screen.bounds; // always implicitly in Portrait orientation.
- CGRect appFrame = screen.applicationFrame;
-
- // Find status bar height by checking which dimension of the applicationFrame is narrower than screen bounds.
- // Little bit ugly looking, but it'll still work even if they change the status bar height in future.
- float statusBarHeight = MAX((fullScreenRect.size.width - appFrame.size.width), (fullScreenRect.size.height - appFrame.size.height));
-
- // Initially assume portrait orientation.
- float width = fullScreenRect.size.width;
- float height = fullScreenRect.size.height;
-
- // Correct for orientation.
- if (UIInterfaceOrientationIsLandscape(theOrientation)) {
- width = height;
- height = fullScreenRect.size.width;
+ UIScreen *screen = [UIScreen mainScreen];
+ CGRect fullScreenRect = screen.bounds; // always implicitly in Portrait orientation.
+ CGRect appFrame = screen.applicationFrame;
+
+ // Find status bar height by checking which dimension of the applicationFrame is narrower than screen bounds.
+ // Little bit ugly looking, but it'll still work even if they change the status bar height in future.
+ float statusBarHeight = MAX((fullScreenRect.size.width - appFrame.size.width), (fullScreenRect.size.height - appFrame.size.height));
+
+ // In iOS 7 the status bar is transparent, so don't adjust for it.
+ if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {
+ statusBarHeight = 0;
}
-
- // Account for status bar, which always subtracts from the height (since it's always at the top of the screen).
- height -= statusBarHeight;
-
- return CGSizeMake(width, height);
+
+ float navigationBarHeight = 0;
+ if ((self.navigationController)&&(!self.navigationController.navigationBarHidden)) {
+ navigationBarHeight = self.navigationController.navigationBar.frame.size.height;
+ }
+
+ // Initially assume portrait orientation.
+ float width = fullScreenRect.size.width;
+ float height = fullScreenRect.size.height;
+
+ // Correct for orientation (only for iOS7.1 and earlier, since iOS8 it will do it automatically).
+ if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1 && UIInterfaceOrientationIsLandscape(theOrientation)) {
+ width = height;
+ height = fullScreenRect.size.width;
+ }
+
+ // Account for status bar, which always subtracts from the height (since it's always at the top of the screen).
+ height -= statusBarHeight;
+ height -= navigationBarHeight;
+
+ return CGSizeMake(width, height);
}
- (void)layoutSubviewsForInterfaceOrientation:(UIInterfaceOrientation)theOrientation withAnimation:(BOOL)animate
{
- if (_reconfigurePopup) {
- [self reconfigureForMasterInPopover:![self shouldShowMasterForInterfaceOrientation:theOrientation]];
- }
-
- // Layout the master, detail and divider views appropriately, adding/removing subviews as needed.
- // First obtain relevant geometry.
- CGSize fullSize = [self splitViewSizeForOrientation:theOrientation];
- float width = fullSize.width;
- float height = fullSize.height;
-
- if (NO) { // Just for debugging.
- NSLog(@"Target orientation is %@, dimensions will be %.0f x %.0f",
- [self nameOfInterfaceOrientation:theOrientation], width, height);
- }
-
- // Layout the master, divider and detail views.
- CGRect newFrame = CGRectMake(0, 0, width, height);
- UIViewController *controller;
- UIView *theView;
- BOOL shouldShowMaster = [self shouldShowMasterForInterfaceOrientation:theOrientation];
- BOOL masterFirst = [self isMasterBeforeDetail];
- if ([self isVertical]) {
- // Master on left, detail on right (or vice versa).
- CGRect masterRect, dividerRect, detailRect;
- if (masterFirst) {
- if (!shouldShowMaster) {
- // Move off-screen.
- newFrame.origin.x -= (_splitPosition + _splitWidth);
- }
-
- newFrame.size.width = _splitPosition;
- masterRect = newFrame;
-
- newFrame.origin.x += newFrame.size.width;
- newFrame.size.width = _splitWidth;
- dividerRect = newFrame;
-
- newFrame.origin.x += newFrame.size.width;
- newFrame.size.width = width - newFrame.origin.x;
- detailRect = newFrame;
-
- } else {
- if (!shouldShowMaster) {
- // Move off-screen.
- newFrame.size.width += (_splitPosition + _splitWidth);
- }
-
- newFrame.size.width -= (_splitPosition + _splitWidth);
- detailRect = newFrame;
-
- newFrame.origin.x += newFrame.size.width;
- newFrame.size.width = _splitWidth;
- dividerRect = newFrame;
-
- newFrame.origin.x += newFrame.size.width;
- newFrame.size.width = _splitPosition;
- masterRect = newFrame;
- }
-
- // Position master.
- controller = self.masterViewController;
- if (controller && [controller isKindOfClass:[UIViewController class]]) {
- theView = controller.view;
- if (theView) {
- theView.frame = masterRect;
- if (!theView.superview) {
- [controller viewWillAppear:NO];
- [self.view addSubview:theView];
- [controller viewDidAppear:NO];
- }
- }
- }
-
- // Position divider.
- theView = _dividerView;
- theView.frame = dividerRect;
- if (!theView.superview) {
- [self.view addSubview:theView];
- }
-
- // Position detail.
- controller = self.detailViewController;
- if (controller && [controller isKindOfClass:[UIViewController class]]) {
- theView = controller.view;
- if (theView) {
- theView.frame = detailRect;
- if (!theView.superview) {
- [self.view insertSubview:theView aboveSubview:self.masterViewController.view];
- } else {
- [self.view bringSubviewToFront:theView];
- }
- }
- }
-
- } else {
- // Master above, detail below (or vice versa).
- CGRect masterRect, dividerRect, detailRect;
- if (masterFirst) {
- if (!shouldShowMaster) {
- // Move off-screen.
- newFrame.origin.y -= (_splitPosition + _splitWidth);
- }
-
- newFrame.size.height = _splitPosition;
- masterRect = newFrame;
-
- newFrame.origin.y += newFrame.size.height;
- newFrame.size.height = _splitWidth;
- dividerRect = newFrame;
-
- newFrame.origin.y += newFrame.size.height;
- newFrame.size.height = height - newFrame.origin.y;
- detailRect = newFrame;
-
- } else {
- if (!shouldShowMaster) {
- // Move off-screen.
- newFrame.size.height += (_splitPosition + _splitWidth);
- }
-
- newFrame.size.height -= (_splitPosition + _splitWidth);
- detailRect = newFrame;
-
- newFrame.origin.y += newFrame.size.height;
- newFrame.size.height = _splitWidth;
- dividerRect = newFrame;
-
- newFrame.origin.y += newFrame.size.height;
- newFrame.size.height = _splitPosition;
- masterRect = newFrame;
- }
-
- // Position master.
- controller = self.masterViewController;
- if (controller && [controller isKindOfClass:[UIViewController class]]) {
- theView = controller.view;
- if (theView) {
- theView.frame = masterRect;
- if (!theView.superview) {
- [controller viewWillAppear:NO];
- [self.view addSubview:theView];
- [controller viewDidAppear:NO];
- }
- }
- }
-
- // Position divider.
- theView = _dividerView;
- theView.frame = dividerRect;
- if (!theView.superview) {
- [self.view addSubview:theView];
- }
-
- // Position detail.
- controller = self.detailViewController;
- if (controller && [controller isKindOfClass:[UIViewController class]]) {
- theView = controller.view;
- if (theView) {
- theView.frame = detailRect;
- if (!theView.superview) {
- [self.view insertSubview:theView aboveSubview:self.masterViewController.view];
- } else {
- [self.view bringSubviewToFront:theView];
- }
- }
- }
- }
-
- // Create corner views if necessary.
- MGSplitCornersView *leadingCorners; // top/left of screen in vertical/horizontal split.
- MGSplitCornersView *trailingCorners; // bottom/right of screen in vertical/horizontal split.
- if (!_cornerViews) {
- CGRect cornerRect = CGRectMake(0, 0, 10, 10); // arbitrary, will be resized below.
- leadingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
- leadingCorners.splitViewController = self;
- leadingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
- leadingCorners.cornerRadius = MG_DEFAULT_CORNER_RADIUS;
- trailingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
- trailingCorners.splitViewController = self;
- trailingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
- trailingCorners.cornerRadius = MG_DEFAULT_CORNER_RADIUS;
- _cornerViews = [[NSArray alloc] initWithObjects:leadingCorners, trailingCorners, nil];
- [leadingCorners release];
- [trailingCorners release];
-
- } else if ([_cornerViews count] == 2) {
- leadingCorners = [_cornerViews objectAtIndex:0];
- trailingCorners = [_cornerViews objectAtIndex:1];
- }
-
- // Configure and layout the corner-views.
- leadingCorners.cornersPosition = (_vertical) ? MGCornersPositionLeadingVertical : MGCornersPositionLeadingHorizontal;
- trailingCorners.cornersPosition = (_vertical) ? MGCornersPositionTrailingVertical : MGCornersPositionTrailingHorizontal;
- leadingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleBottomMargin : UIViewAutoresizingFlexibleRightMargin;
- trailingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleTopMargin : UIViewAutoresizingFlexibleLeftMargin;
-
- float x, y, cornersWidth, cornersHeight;
- CGRect leadingRect, trailingRect;
- float radius = leadingCorners.cornerRadius;
- if (_vertical) { // left/right split
- cornersWidth = (radius * 2.0) + _splitWidth;
- cornersHeight = radius;
- x = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : width - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
- y = 0;
- leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // top corners
- trailingRect = CGRectMake(x, (height - cornersHeight), cornersWidth, cornersHeight); // bottom corners
-
- } else { // top/bottom split
- x = 0;
- y = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : height - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
- cornersWidth = radius;
- cornersHeight = (radius * 2.0) + _splitWidth;
- leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // left corners
- trailingRect = CGRectMake((width - cornersWidth), y, cornersWidth, cornersHeight); // right corners
- }
-
- leadingCorners.frame = leadingRect;
- trailingCorners.frame = trailingRect;
-
- // Ensure corners are visible and frontmost.
- if (!leadingCorners.superview) {
- [self.view insertSubview:leadingCorners aboveSubview:self.detailViewController.view];
- [self.view insertSubview:trailingCorners aboveSubview:self.detailViewController.view];
- } else {
- [self.view bringSubviewToFront:leadingCorners];
- [self.view bringSubviewToFront:trailingCorners];
- }
+ if (_reconfigurePopup) {
+ [self reconfigureForMasterInPopover:![self shouldShowMasterForInterfaceOrientation:theOrientation]];
+ }
+
+ // Layout the master, detail and divider views appropriately, adding/removing subviews as needed.
+ // First obtain relevant geometry.
+ CGSize fullSize = [self splitViewSizeForOrientation:theOrientation];
+ float width = fullSize.width;
+ float height = fullSize.height;
+
+ if (NO) { // Just for debugging.
+ NSLog(@"Target orientation is %@, dimensions will be %.0f x %.0f",
+ [self nameOfInterfaceOrientation:theOrientation], width, height);
+ }
+
+ // Layout the master, divider and detail views.
+ CGRect newFrame = CGRectMake(0, 0, width, height);
+ UIViewController *controller;
+ UIView *theView;
+ BOOL shouldShowMaster = [self shouldShowMasterForInterfaceOrientation:theOrientation];
+ BOOL masterFirst = [self isMasterBeforeDetail];
+ if ([self isVertical]) {
+ // Master on left, detail on right (or vice versa).
+ CGRect masterRect, dividerRect, detailRect;
+ if (masterFirst) {
+ if (!shouldShowMaster) {
+ // Move off-screen.
+ newFrame.origin.x -= (_splitPosition + _splitWidth);
+ }
+
+ newFrame.size.width = _splitPosition;
+ masterRect = newFrame;
+
+ newFrame.origin.x += newFrame.size.width;
+ newFrame.size.width = _splitWidth;
+ dividerRect = newFrame;
+
+ newFrame.origin.x += newFrame.size.width;
+ newFrame.size.width = width - newFrame.origin.x;
+ detailRect = newFrame;
+
+ } else {
+ if (!shouldShowMaster) {
+ // Move off-screen.
+ newFrame.size.width += (_splitPosition + _splitWidth);
+ }
+
+ newFrame.size.width -= (_splitPosition + _splitWidth);
+ detailRect = newFrame;
+
+ newFrame.origin.x += newFrame.size.width;
+ newFrame.size.width = _splitWidth;
+ dividerRect = newFrame;
+
+ newFrame.origin.x += newFrame.size.width;
+ newFrame.size.width = _splitPosition;
+ masterRect = newFrame;
+ }
+
+ // Position master.
+ controller = self.masterViewController;
+ if (controller && [controller isKindOfClass:[UIViewController class]]) {
+ theView = controller.view;
+ if (theView) {
+ theView.frame = masterRect;
+ if (!theView.superview) {
+ [controller viewWillAppear:NO];
+ [self.view addSubview:theView];
+ [controller viewDidAppear:NO];
+ }
+ }
+ }
+
+ // Position divider.
+ theView = _dividerView;
+ theView.frame = dividerRect;
+ if (!theView.superview) {
+ [self.view addSubview:theView];
+ }
+
+ // Position detail.
+ controller = self.detailViewController;
+ if (controller && [controller isKindOfClass:[UIViewController class]]) {
+ theView = controller.view;
+ if (theView) {
+ theView.frame = detailRect;
+ if (!theView.superview) {
+ [self.view insertSubview:theView aboveSubview:self.masterViewController.view];
+ } else {
+ [self.view bringSubviewToFront:theView];
+ }
+ }
+ }
+
+ } else {
+ // Master above, detail below (or vice versa).
+ CGRect masterRect, dividerRect, detailRect;
+ if (masterFirst) {
+ if (!shouldShowMaster) {
+ // Move off-screen.
+ newFrame.origin.y -= (_splitPosition + _splitWidth);
+ }
+
+ newFrame.size.height = _splitPosition;
+ masterRect = newFrame;
+
+ newFrame.origin.y += newFrame.size.height;
+ newFrame.size.height = _splitWidth;
+ dividerRect = newFrame;
+
+ newFrame.origin.y += newFrame.size.height;
+ newFrame.size.height = height - newFrame.origin.y;
+ detailRect = newFrame;
+
+ } else {
+ if (!shouldShowMaster) {
+ // Move off-screen.
+ newFrame.size.height += (_splitPosition + _splitWidth);
+ }
+
+ newFrame.size.height -= (_splitPosition + _splitWidth);
+ detailRect = newFrame;
+
+ newFrame.origin.y += newFrame.size.height;
+ newFrame.size.height = _splitWidth;
+ dividerRect = newFrame;
+
+ newFrame.origin.y += newFrame.size.height;
+ newFrame.size.height = _splitPosition;
+ masterRect = newFrame;
+ }
+
+ // Position master.
+ controller = self.masterViewController;
+ if (controller && [controller isKindOfClass:[UIViewController class]]) {
+ theView = controller.view;
+ if (theView) {
+ theView.frame = masterRect;
+ if (!theView.superview) {
+ [controller viewWillAppear:NO];
+ [self.view addSubview:theView];
+ [controller viewDidAppear:NO];
+ }
+ }
+ }
+
+ // Position divider.
+ theView = _dividerView;
+ theView.frame = dividerRect;
+ if (!theView.superview) {
+ [self.view addSubview:theView];
+ }
+
+ // Position detail.
+ controller = self.detailViewController;
+ if (controller && [controller isKindOfClass:[UIViewController class]]) {
+ theView = controller.view;
+ if (theView) {
+ theView.frame = detailRect;
+ if (!theView.superview) {
+ [self.view insertSubview:theView aboveSubview:self.masterViewController.view];
+ } else {
+ [self.view bringSubviewToFront:theView];
+ }
+ }
+ }
+ }
+
+ // Create corner views if necessary.
+ MGSplitCornersView *leadingCorners = nil; // top/left of screen in vertical/horizontal split.
+ MGSplitCornersView *trailingCorners = nil; // bottom/right of screen in vertical/horizontal split.
+ if (!_cornerViews) {
+ CGRect cornerRect = CGRectMake(0, 0, 10, 10); // arbitrary, will be resized below.
+ leadingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
+ leadingCorners.splitViewController = self;
+ leadingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
+ leadingCorners.cornerRadius = NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0 ? 0 : MG_DEFAULT_CORNER_RADIUS;
+ trailingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
+ trailingCorners.splitViewController = self;
+ trailingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
+ trailingCorners.cornerRadius = NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0 ? 0 : MG_DEFAULT_CORNER_RADIUS;
+ _cornerViews = [[NSArray alloc] initWithObjects:leadingCorners, trailingCorners, nil];
+
+ } else if ([_cornerViews count] == 2) {
+ leadingCorners = [_cornerViews objectAtIndex:0];
+ trailingCorners = [_cornerViews objectAtIndex:1];
+ }
+
+ // Configure and layout the corner-views.
+ leadingCorners.cornersPosition = (_vertical) ? MGCornersPositionLeadingVertical : MGCornersPositionLeadingHorizontal;
+ trailingCorners.cornersPosition = (_vertical) ? MGCornersPositionTrailingVertical : MGCornersPositionTrailingHorizontal;
+ leadingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleBottomMargin : UIViewAutoresizingFlexibleRightMargin;
+ trailingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleTopMargin : UIViewAutoresizingFlexibleLeftMargin;
+
+ float x, y, cornersWidth, cornersHeight;
+ CGRect leadingRect, trailingRect;
+ float radius = leadingCorners.cornerRadius;
+ if (_vertical) { // left/right split
+ cornersWidth = (radius * 2.f) + _splitWidth;
+ cornersHeight = radius;
+ x = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : width - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
+ y = 0;
+ leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // top corners
+ trailingRect = CGRectMake(x, (height - cornersHeight), cornersWidth, cornersHeight); // bottom corners
+
+ } else { // top/bottom split
+ x = 0;
+ y = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : height - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
+ cornersWidth = radius;
+ cornersHeight = (radius * 2.f) + _splitWidth;
+ leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // left corners
+ trailingRect = CGRectMake((width - cornersWidth), y, cornersWidth, cornersHeight); // right corners
+ }
+
+ leadingCorners.frame = leadingRect;
+ trailingCorners.frame = trailingRect;
+
+ // Ensure corners are visible and frontmost.
+ if (!leadingCorners.superview) {
+ [self.view insertSubview:leadingCorners aboveSubview:self.detailViewController.view];
+ [self.view insertSubview:trailingCorners aboveSubview:self.detailViewController.view];
+ } else {
+ [self.view bringSubviewToFront:leadingCorners];
+ [self.view bringSubviewToFront:trailingCorners];
+ }
}
- (void)layoutSubviewsWithAnimation:(BOOL)animate
{
- [self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:animate];
+ [self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:animate];
}
- (void)layoutSubviews
{
- [self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:YES];
+ [self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:YES];
}
- (void)viewWillAppear:(BOOL)animated
{
- [super viewWillAppear:animated];
-
- if ([self isShowingMaster]) {
- [self.masterViewController viewWillAppear:animated];
- }
- [self.detailViewController viewWillAppear:animated];
-
- _reconfigurePopup = YES;
- [self layoutSubviews];
+ [super viewWillAppear:animated];
+
+ if ([self isShowingMaster]) {
+ [self.masterViewController viewWillAppear:animated];
+ }
+ [self.detailViewController viewWillAppear:animated];
+
+ _reconfigurePopup = YES;
}
- (void)viewDidAppear:(BOOL)animated
{
- [super viewDidAppear:animated];
-
- if ([self isShowingMaster]) {
- [self.masterViewController viewDidAppear:animated];
- }
- [self.detailViewController viewDidAppear:animated];
+ [super viewDidAppear:animated];
+
+ if ([self isShowingMaster]) {
+ [self.masterViewController viewDidAppear:animated];
+ }
+ [self.detailViewController viewDidAppear:animated];
+ [self layoutSubviews];
}
- (void)viewWillDisappear:(BOOL)animated
{
- [super viewWillDisappear:animated];
-
- if ([self isShowingMaster]) {
- [self.masterViewController viewWillDisappear:animated];
- }
- [self.detailViewController viewWillDisappear:animated];
+ [super viewWillDisappear:animated];
+
+ if ([self isShowingMaster]) {
+ [self.masterViewController viewWillDisappear:animated];
+ }
+ [self.detailViewController viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
- [super viewDidDisappear:animated];
-
- if ([self isShowingMaster]) {
- [self.masterViewController viewDidDisappear:animated];
- }
- [self.detailViewController viewDidDisappear:animated];
+ [super viewDidDisappear:animated];
+
+ if ([self isShowingMaster]) {
+ [self.masterViewController viewDidDisappear:animated];
+ }
+ [self.detailViewController viewDidDisappear:animated];
}
@@ -545,73 +534,73 @@
- (void)reconfigureForMasterInPopover:(BOOL)inPopover
{
- _reconfigurePopup = NO;
-
- if ((inPopover && _hiddenPopoverController) || (!inPopover && !_hiddenPopoverController) || !self.masterViewController) {
- // Nothing to do.
- return;
- }
-
- if (inPopover && !_hiddenPopoverController && !_barButtonItem) {
- // Create and configure popover for our masterViewController.
- [_hiddenPopoverController release];
- _hiddenPopoverController = nil;
- [self.masterViewController viewWillDisappear:NO];
- _hiddenPopoverController = [[UIPopoverController alloc] initWithContentViewController:self.masterViewController];
- [self.masterViewController viewDidDisappear:NO];
-
- // Create and configure _barButtonItem.
- _barButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Master", nil)
- style:UIBarButtonItemStyleBordered
- target:self
- action:@selector(showMasterPopover:)];
-
- // Inform delegate of this state of affairs.
- if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:)]) {
- [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
- willHideViewController:self.masterViewController
- withBarButtonItem:_barButtonItem
- forPopoverController:_hiddenPopoverController];
+ _reconfigurePopup = NO;
+
+ if ((inPopover && _hiddenPopoverController) || (!inPopover && !_hiddenPopoverController) || !self.masterViewController) {
+ // Nothing to do.
+ return;
+ }
+
+ if (inPopover && !_hiddenPopoverController && !_barButtonItem) {
+ // Create and configure popover for our masterViewController.
+ _hiddenPopoverController = nil;
+ [self.masterViewController viewWillDisappear:NO];
+ _hiddenPopoverController = [[UIPopoverController alloc] initWithContentViewController:self.masterViewController];
+ [self.masterViewController viewDidDisappear:NO];
+
+ // Create and configure _barButtonItem.
+ _barButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Master", nil)
+ style:UIBarButtonItemStyleBordered
+ target:self
+ action:(self.togglesMasterPopover ? @selector(toggleMasterPopover:) : @selector(showMasterPopover:))];
+
+ // Inform delegate of this state of affairs.
+ if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:)]) {
+ [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
+ willHideViewController:self.masterViewController
+ withBarButtonItem:_barButtonItem
+ forPopoverController:_hiddenPopoverController];
+ }
+
+ } else if (!inPopover && _hiddenPopoverController && _barButtonItem) {
+ // I know this looks strange, but it fixes a bizarre issue with UIPopoverController leaving masterViewController's views in disarray.
+ // It does also break stuff on iOS8, so we disable it.
+ if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) {
+ [_hiddenPopoverController presentPopoverFromRect:CGRectZero inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
}
- } else if (!inPopover && _hiddenPopoverController && _barButtonItem) {
- // I know this looks strange, but it fixes a bizarre issue with UIPopoverController leaving masterViewController's views in disarray.
- [_hiddenPopoverController presentPopoverFromRect:CGRectZero inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
-
- // Remove master from popover and destroy popover, if it exists.
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- [_hiddenPopoverController release];
- _hiddenPopoverController = nil;
-
- // Inform delegate that the _barButtonItem will become invalid.
- if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willShowViewController:invalidatingBarButtonItem:)]) {
- [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
- willShowViewController:self.masterViewController
- invalidatingBarButtonItem:_barButtonItem];
- }
-
- // Destroy _barButtonItem.
- [_barButtonItem release];
- _barButtonItem = nil;
-
- // Move master view.
- UIView *masterView = self.masterViewController.view;
- if (masterView && masterView.superview != self.view) {
- [masterView removeFromSuperview];
- }
- }
+ // Remove master from popover and destroy popover, if it exists.
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ _hiddenPopoverController = nil;
+
+ // Inform delegate that the _barButtonItem will become invalid.
+ if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willShowViewController:invalidatingBarButtonItem:)]) {
+ [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
+ willShowViewController:self.masterViewController
+ invalidatingBarButtonItem:_barButtonItem];
+ }
+
+ // Destroy _barButtonItem.
+ _barButtonItem = nil;
+
+ // Move master view.
+ UIView *masterView = self.masterViewController.view;
+ if (masterView && masterView.superview != self.view) {
+ [masterView removeFromSuperview];
+ }
+ }
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
- [self reconfigureForMasterInPopover:NO];
+ [self reconfigureForMasterInPopover:NO];
}
- (void)notePopoverDismissed
{
- [self popoverControllerDidDismissPopover:_hiddenPopoverController];
+ [self popoverControllerDidDismissPopover:_hiddenPopoverController];
}
@@ -621,14 +610,14 @@
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
- if (([animationID isEqualToString:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION] ||
- [animationID isEqualToString:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER])
- && _cornerViews) {
- for (UIView *corner in _cornerViews) {
- corner.hidden = NO;
- }
- _dividerView.hidden = NO;
- }
+ if (([animationID isEqualToString:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION] ||
+ [animationID isEqualToString:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER])
+ && _cornerViews) {
+ for (UIView *corner in _cornerViews) {
+ corner.hidden = NO;
+ }
+ _dividerView.hidden = NO;
+ }
}
@@ -638,83 +627,131 @@
- (IBAction)toggleSplitOrientation:(id)sender
{
- BOOL showingMaster = [self isShowingMaster];
- if (showingMaster) {
- if (_cornerViews) {
- for (UIView *corner in _cornerViews) {
- corner.hidden = YES;
- }
- _dividerView.hidden = YES;
- }
- [UIView beginAnimations:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION context:nil];
- [UIView setAnimationDelegate:self];
- [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
- }
- self.vertical = (!self.vertical);
- if (showingMaster) {
- [UIView commitAnimations];
- }
+ BOOL showingMaster = [self isShowingMaster];
+ if (showingMaster) {
+ if (_cornerViews) {
+ for (UIView *corner in _cornerViews) {
+ corner.hidden = YES;
+ }
+ _dividerView.hidden = YES;
+ }
+ [UIView beginAnimations:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION context:nil];
+ [UIView setAnimationDelegate:self];
+ [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
+ }
+ self.vertical = (!self.vertical);
+ if (showingMaster) {
+ [UIView commitAnimations];
+ }
}
- (IBAction)toggleMasterBeforeDetail:(id)sender
{
- BOOL showingMaster = [self isShowingMaster];
- if (showingMaster) {
- if (_cornerViews) {
- for (UIView *corner in _cornerViews) {
- corner.hidden = YES;
- }
- _dividerView.hidden = YES;
- }
- [UIView beginAnimations:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER context:nil];
- [UIView setAnimationDelegate:self];
- [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
- }
- self.masterBeforeDetail = (!self.masterBeforeDetail);
- if (showingMaster) {
- [UIView commitAnimations];
- }
+ BOOL showingMaster = [self isShowingMaster];
+ if (showingMaster) {
+ if (_cornerViews) {
+ for (UIView *corner in _cornerViews) {
+ corner.hidden = YES;
+ }
+ _dividerView.hidden = YES;
+ }
+ [UIView beginAnimations:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER context:nil];
+ [UIView setAnimationDelegate:self];
+ [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
+ }
+ self.masterBeforeDetail = (!self.masterBeforeDetail);
+ if (showingMaster) {
+ [UIView commitAnimations];
+ }
}
- (IBAction)toggleMasterView:(id)sender
{
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- if (![self isShowingMaster]) {
- // We're about to show the master view. Ensure it's in place off-screen to be animated in.
- _reconfigurePopup = YES;
- [self reconfigureForMasterInPopover:NO];
- [self layoutSubviews];
- }
-
- // This action functions on the current primary orientation; it is independent of the other primary orientation.
- [UIView beginAnimations:@"toggleMaster" context:nil];
- if (self.isLandscape) {
- self.showsMasterInLandscape = !_showsMasterInLandscape;
- } else {
- self.showsMasterInPortrait = !_showsMasterInPortrait;
- }
- [UIView commitAnimations];
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ if (![self isShowingMaster]) {
+ // We're about to show the master view. Ensure it's in place off-screen to be animated in.
+ _reconfigurePopup = YES;
+ [self reconfigureForMasterInPopover:NO];
+ [self layoutSubviews];
+ }
+
+ // This action functions on the current primary orientation; it is independent of the other primary orientation.
+ [UIView beginAnimations:@"toggleMaster" context:nil];
+ if (self.isLandscape) {
+ self.showsMasterInLandscape = !_showsMasterInLandscape;
+ } else {
+ self.showsMasterInPortrait = !_showsMasterInPortrait;
+ }
+ [UIView commitAnimations];
}
-- (IBAction)showMasterPopover:(id) sender
+- (void) setTogglesMasterPopover:(BOOL)flag {
+
+ togglesMasterPopover = flag;
+
+ if (!_barButtonItem)
+ return;
+
+ _barButtonItem.action = flag ? @selector(toggleMasterPopover:) : @selector(showMasterPopover:);
+
+}
+
+- (IBAction)toggleMasterPopover:(id)sender
{
- if (_hiddenPopoverController && !(_hiddenPopoverController.popoverVisible)) {
- // Inform delegate.
- if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:popoverController:willPresentViewController:)]) {
- [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
- popoverController:_hiddenPopoverController
- willPresentViewController:self.masterViewController];
- }
+
+ if (!_hiddenPopoverController)
+ return;
+
+ if (_hiddenPopoverController.popoverVisible) {
+
+ [self hideMasterPopover:sender];
+
+ } else {
+
+ [self showMasterPopover:sender];
+
+ }
+
+}
+
- // Show popover.
- [_hiddenPopoverController presentPopoverFromBarButtonItem:_barButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
- }
+- (IBAction)showMasterPopover:(id)sender
+{
+ if (_hiddenPopoverController && !(_hiddenPopoverController.popoverVisible)) {
+ // Inform delegate.
+ if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:popoverController:willPresentViewController:)]) {
+ [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
+ popoverController:_hiddenPopoverController
+ willPresentViewController:self.masterViewController];
+ }
+
+ // Show popover.
+ [_hiddenPopoverController presentPopoverFromBarButtonItem:(sender ? sender : _barButtonItem) permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
+ }
+}
+
+
+- (IBAction)hideMasterPopover:(id)sender
+{
+
+ if(_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+
+ if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:popoverController:willDismissViewController:)]) {
+
+ [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self popoverController:_hiddenPopoverController willDismissViewController:self.masterViewController];
+
+ }
+
+ [_hiddenPopoverController dismissPopoverAnimated:YES];
+
+ }
+
}
@@ -724,395 +761,393 @@
- (id)delegate
{
- return _delegate;
+ return _delegate;
}
- (void)setDelegate:(id <MGSplitViewControllerDelegate>)newDelegate
{
- if (newDelegate != _delegate &&
- (!newDelegate || [(NSObject *)newDelegate conformsToProtocol:@protocol(MGSplitViewControllerDelegate)])) {
- _delegate = newDelegate;
- }
+ if (newDelegate != _delegate &&
+ (!newDelegate || [(NSObject *)newDelegate conformsToProtocol:@protocol(MGSplitViewControllerDelegate)])) {
+ _delegate = newDelegate;
+ }
}
- (BOOL)showsMasterInPortrait
{
- return _showsMasterInPortrait;
+ return _showsMasterInPortrait;
}
- (void)setShowsMasterInPortrait:(BOOL)flag
{
- if (flag != _showsMasterInPortrait) {
- _showsMasterInPortrait = flag;
-
- if (![self isLandscape]) { // i.e. if this will cause a visual change.
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- // Rearrange views.
- _reconfigurePopup = YES;
- [self layoutSubviews];
- }
- }
+ if (flag != _showsMasterInPortrait) {
+ _showsMasterInPortrait = flag;
+
+ if (![self isLandscape]) { // i.e. if this will cause a visual change.
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ // Rearrange views.
+ _reconfigurePopup = YES;
+ [self layoutSubviews];
+ }
+ }
}
- (BOOL)showsMasterInLandscape
{
- return _showsMasterInLandscape;
+ return _showsMasterInLandscape;
}
- (void)setShowsMasterInLandscape:(BOOL)flag
{
- if (flag != _showsMasterInLandscape) {
- _showsMasterInLandscape = flag;
-
- if ([self isLandscape]) { // i.e. if this will cause a visual change.
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- // Rearrange views.
- _reconfigurePopup = YES;
- [self layoutSubviews];
- }
- }
+ if (flag != _showsMasterInLandscape) {
+ _showsMasterInLandscape = flag;
+
+ if ([self isLandscape]) { // i.e. if this will cause a visual change.
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ // Rearrange views.
+ _reconfigurePopup = YES;
+ [self layoutSubviews];
+ }
+ }
}
- (BOOL)isVertical
{
- return _vertical;
+ return _vertical;
}
- (void)setVertical:(BOOL)flag
{
- if (flag != _vertical) {
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- _vertical = flag;
-
- // Inform delegate.
- if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willChangeSplitOrientationToVertical:)]) {
- [_delegate splitViewController:self willChangeSplitOrientationToVertical:_vertical];
- }
-
- [self layoutSubviews];
- }
+ if (flag != _vertical) {
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ _vertical = flag;
+
+ // Inform delegate.
+ if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willChangeSplitOrientationToVertical:)]) {
+ [_delegate splitViewController:self willChangeSplitOrientationToVertical:_vertical];
+ }
+
+ [self layoutSubviews];
+ }
}
- (BOOL)isMasterBeforeDetail
{
- return _masterBeforeDetail;
+ return _masterBeforeDetail;
}
- (void)setMasterBeforeDetail:(BOOL)flag
{
- if (flag != _masterBeforeDetail) {
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- _masterBeforeDetail = flag;
-
- if ([self isShowingMaster]) {
- [self layoutSubviews];
- }
- }
+ if (flag != _masterBeforeDetail) {
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ _masterBeforeDetail = flag;
+
+ if ([self isShowingMaster]) {
+ [self layoutSubviews];
+ }
+ }
}
- (float)splitPosition
{
- return _splitPosition;
+ return _splitPosition;
}
- (void)setSplitPosition:(float)posn
{
- // Check to see if delegate wishes to constrain the position.
- float newPosn = posn;
- BOOL constrained = NO;
- CGSize fullSize = [self splitViewSizeForOrientation:self.interfaceOrientation];
- if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:constrainSplitPosition:splitViewSize:)]) {
- newPosn = [_delegate splitViewController:self constrainSplitPosition:newPosn splitViewSize:fullSize];
- constrained = YES; // implicitly trust delegate's response.
-
- } else {
- // Apply default constraints if delegate doesn't wish to participate.
- float minPos = MG_MIN_VIEW_WIDTH;
- float maxPos = ((_vertical) ? fullSize.width : fullSize.height) - (MG_MIN_VIEW_WIDTH + _splitWidth);
- constrained = (newPosn != _splitPosition && newPosn >= minPos && newPosn <= maxPos);
- }
-
- if (constrained) {
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- _splitPosition = newPosn;
-
- // Inform delegate.
- if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willMoveSplitToPosition:)]) {
- [_delegate splitViewController:self willMoveSplitToPosition:_splitPosition];
- }
-
- if ([self isShowingMaster]) {
- [self layoutSubviews];
- }
- }
+ // Check to see if delegate wishes to constrain the position.
+ float newPosn = posn;
+ BOOL constrained = NO;
+ CGSize fullSize = [self splitViewSizeForOrientation:self.interfaceOrientation];
+ if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:constrainSplitPosition:splitViewSize:)]) {
+ newPosn = [_delegate splitViewController:self constrainSplitPosition:newPosn splitViewSize:fullSize];
+ constrained = YES; // implicitly trust delegate's response.
+
+ } else {
+ // Apply default constraints if delegate doesn't wish to participate.
+ float minPos = MG_MIN_VIEW_WIDTH;
+ float maxPos = (float) (((_vertical) ? fullSize.width : fullSize.height) - (MG_MIN_VIEW_WIDTH + _splitWidth));
+ constrained = (newPosn != _splitPosition && newPosn >= minPos && newPosn <= maxPos);
+ }
+
+ if (constrained) {
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ _splitPosition = newPosn;
+
+ // Inform delegate.
+ if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willMoveSplitToPosition:)]) {
+ [_delegate splitViewController:self willMoveSplitToPosition:_splitPosition];
+ }
+
+ if ([self isShowingMaster]) {
+ [self layoutSubviews];
+ }
+ }
}
- (void)setSplitPosition:(float)posn animated:(BOOL)animate
{
- BOOL shouldAnimate = (animate && [self isShowingMaster]);
- if (shouldAnimate) {
- [UIView beginAnimations:@"SplitPosition" context:nil];
- }
- [self setSplitPosition:posn];
- if (shouldAnimate) {
- [UIView commitAnimations];
- }
+ BOOL shouldAnimate = (animate && [self isShowingMaster]);
+ if (shouldAnimate) {
+ [UIView beginAnimations:@"SplitPosition" context:nil];
+ }
+ [self setSplitPosition:posn];
+ if (shouldAnimate) {
+ [UIView commitAnimations];
+ }
}
- (float)splitWidth
{
- return _splitWidth;
+ return _splitWidth;
}
- (void)setSplitWidth:(float)width
{
- if (width != _splitWidth && width >= 0) {
- _splitWidth = width;
- if ([self isShowingMaster]) {
- [self layoutSubviews];
- }
- }
+ if (width != _splitWidth && width >= 0) {
+ _splitWidth = width;
+ if ([self isShowingMaster]) {
+ [self layoutSubviews];
+ }
+ }
}
- (NSArray *)viewControllers
{
- return [[_viewControllers copy] autorelease];
+ return [_viewControllers copy];
}
- (void)setViewControllers:(NSArray *)controllers
{
- if (controllers != _viewControllers) {
- for (UIViewController *controller in _viewControllers) {
- if ([controller isKindOfClass:[UIViewController class]]) {
- [controller.view removeFromSuperview];
- }
- }
- [_viewControllers release];
- _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
- if (controllers && [controllers count] >= 2) {
- self.masterViewController = [controllers objectAtIndex:0];
- self.detailViewController = [controllers objectAtIndex:1];
- } else {
- NSLog(@"Error: %@ requires 2 view-controllers. (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
- }
-
- [self layoutSubviews];
- }
+ if (controllers != _viewControllers) {
+ for (UIViewController *controller in _viewControllers) {
+ if ([controller isKindOfClass:[UIViewController class]]) {
+ [controller.view removeFromSuperview];
+ }
+ }
+ _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
+ if (controllers && [controllers count] >= 2) {
+ self.masterViewController = [controllers objectAtIndex:0];
+ self.detailViewController = [controllers objectAtIndex:1];
+ } else {
+ NSLog(@"Error: %@ requires 2 view-controllers. (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
+ }
+
+ [self layoutSubviews];
+ }
}
- (UIViewController *)masterViewController
{
- if (_viewControllers && [_viewControllers count] > 0) {
- NSObject *controller = [_viewControllers objectAtIndex:0];
- if ([controller isKindOfClass:[UIViewController class]]) {
- return [[controller retain] autorelease];
- }
- }
-
- return nil;
+ if (_viewControllers && [_viewControllers count] > 0) {
+ UIViewController *controller = (UIViewController *)[_viewControllers objectAtIndex:0];
+ if ([controller isKindOfClass:[UIViewController class]]) {
+ return controller;
+ }
+ }
+
+ return nil;
}
- (void)setMasterViewController:(UIViewController *)master
{
- if (!_viewControllers) {
- _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
- }
-
- NSObject *newMaster = master;
- if (!newMaster) {
- newMaster = [NSNull null];
- }
-
- BOOL changed = YES;
- if ([_viewControllers count] > 0) {
- if ([_viewControllers objectAtIndex:0] == newMaster) {
- changed = NO;
- } else {
- [_viewControllers replaceObjectAtIndex:0 withObject:newMaster];
- }
-
- } else {
- [_viewControllers addObject:newMaster];
- }
-
- if (changed) {
- [self layoutSubviews];
- }
+ if (!_viewControllers) {
+ _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
+ }
+
+ NSObject *newMaster = master;
+ if (!newMaster) {
+ newMaster = [NSNull null];
+ }
+
+ BOOL changed = YES;
+ if ([_viewControllers count] > 0) {
+ if ([_viewControllers objectAtIndex:0] == newMaster) {
+ changed = NO;
+ } else {
+ [_viewControllers replaceObjectAtIndex:0 withObject:newMaster];
+ }
+
+ } else {
+ [_viewControllers addObject:newMaster];
+ }
+
+ if (changed) {
+ [self layoutSubviews];
+ }
}
- (UIViewController *)detailViewController
{
- if (_viewControllers && [_viewControllers count] > 1) {
- NSObject *controller = [_viewControllers objectAtIndex:1];
- if ([controller isKindOfClass:[UIViewController class]]) {
- return [[controller retain] autorelease];
- }
- }
-
- return nil;
+ if (_viewControllers && [_viewControllers count] > 1) {
+ UIViewController *controller = (UIViewController *)[_viewControllers objectAtIndex:1];
+ if ([controller isKindOfClass:[UIViewController class]]) {
+ return controller;
+ }
+ }
+
+ return nil;
}
- (void)setDetailViewController:(UIViewController *)detail
{
- if (!_viewControllers) {
- _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
- [_viewControllers addObject:[NSNull null]];
- }
-
- BOOL changed = YES;
- if ([_viewControllers count] > 1) {
- if ([_viewControllers objectAtIndex:1] == detail) {
- changed = NO;
- } else {
- [_viewControllers replaceObjectAtIndex:1 withObject:detail];
- }
-
- } else {
- [_viewControllers addObject:detail];
- }
-
- if (changed) {
- [self layoutSubviews];
- }
+ if (!_viewControllers) {
+ _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
+ [_viewControllers addObject:[NSNull null]];
+ }
+
+ BOOL changed = YES;
+ if ([_viewControllers count] > 1) {
+ if ([_viewControllers objectAtIndex:1] == detail) {
+ changed = NO;
+ } else {
+ [_viewControllers replaceObjectAtIndex:1 withObject:detail];
+ }
+
+ } else {
+ [_viewControllers addObject:detail];
+ }
+
+ if (changed) {
+ [self layoutSubviews];
+ }
}
- (MGSplitDividerView *)dividerView
{
- return [[_dividerView retain] autorelease];
+ return _dividerView;
}
- (void)setDividerView:(MGSplitDividerView *)divider
{
- if (divider != _dividerView) {
- [_dividerView removeFromSuperview];
- [_dividerView release];
- _dividerView = [divider retain];
- _dividerView.splitViewController = self;
- _dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
- if ([self isShowingMaster]) {
- [self layoutSubviews];
- }
- }
+ if (divider != _dividerView) {
+ [_dividerView removeFromSuperview];
+ _dividerView = divider;
+ _dividerView.splitViewController = self;
+ _dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
+ if ([self isShowingMaster]) {
+ [self layoutSubviews];
+ }
+ }
}
- (BOOL)allowsDraggingDivider
{
- if (_dividerView) {
- return _dividerView.allowsDragging;
- }
-
- return NO;
+ if (_dividerView) {
+ return _dividerView.allowsDragging;
+ }
+
+ return NO;
}
- (void)setAllowsDraggingDivider:(BOOL)flag
{
- if (self.allowsDraggingDivider != flag && _dividerView) {
- _dividerView.allowsDragging = flag;
- }
+ if (self.allowsDraggingDivider != flag && _dividerView) {
+ _dividerView.allowsDragging = flag;
+ }
}
- (MGSplitViewDividerStyle)dividerStyle
{
- return _dividerStyle;
+ return _dividerStyle;
}
- (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle
{
- if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
- [_hiddenPopoverController dismissPopoverAnimated:NO];
- }
-
- // We don't check to see if newStyle equals _dividerStyle, because it's a meta-setting.
- // Aspects could have been changed since it was set.
- _dividerStyle = newStyle;
-
- // Reconfigure general appearance and behaviour.
- float cornerRadius;
- if (_dividerStyle == MGSplitViewDividerStyleThin) {
- cornerRadius = MG_DEFAULT_CORNER_RADIUS;
- _splitWidth = MG_DEFAULT_SPLIT_WIDTH;
- self.allowsDraggingDivider = NO;
-
- } else if (_dividerStyle == MGSplitViewDividerStylePaneSplitter) {
- cornerRadius = MG_PANESPLITTER_CORNER_RADIUS;
- _splitWidth = MG_PANESPLITTER_SPLIT_WIDTH;
- self.allowsDraggingDivider = YES;
- }
-
- // Update divider and corners.
- [_dividerView setNeedsDisplay];
- if (_cornerViews) {
- for (MGSplitCornersView *corner in _cornerViews) {
- corner.cornerRadius = cornerRadius;
- }
- }
-
- // Layout all views.
- [self layoutSubviews];
+ if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+ [_hiddenPopoverController dismissPopoverAnimated:NO];
+ }
+
+ // We don't check to see if newStyle equals _dividerStyle, because it's a meta-setting.
+ // Aspects could have been changed since it was set.
+ _dividerStyle = newStyle;
+
+ // Reconfigure general appearance and behaviour.
+ float cornerRadius = 0.0f;
+ if (_dividerStyle == MGSplitViewDividerStyleThin) {
+ cornerRadius = NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0 ? 0 : MG_DEFAULT_CORNER_RADIUS;
+ _splitWidth = MG_DEFAULT_SPLIT_WIDTH;
+ self.allowsDraggingDivider = NO;
+
+ } else if (_dividerStyle == MGSplitViewDividerStylePaneSplitter) {
+ cornerRadius = MG_PANESPLITTER_CORNER_RADIUS;
+ _splitWidth = MG_PANESPLITTER_SPLIT_WIDTH;
+ self.allowsDraggingDivider = YES;
+ }
+
+ // Update divider and corners.
+ [_dividerView setNeedsDisplay];
+ if (_cornerViews) {
+ for (MGSplitCornersView *corner in _cornerViews) {
+ corner.cornerRadius = cornerRadius;
+ }
+ }
+
+ // Layout all views.
+ [self layoutSubviews];
}
- (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle animated:(BOOL)animate
{
- BOOL shouldAnimate = (animate && [self isShowingMaster]);
- if (shouldAnimate) {
- [UIView beginAnimations:@"DividerStyle" context:nil];
- }
- [self setDividerStyle:newStyle];
- if (shouldAnimate) {
- [UIView commitAnimations];
- }
+ BOOL shouldAnimate = (animate && [self isShowingMaster]);
+ if (shouldAnimate) {
+ [UIView beginAnimations:@"DividerStyle" context:nil];
+ }
+ [self setDividerStyle:newStyle];
+ if (shouldAnimate) {
+ [UIView commitAnimations];
+ }
}
- (NSArray *)cornerViews
{
- if (_cornerViews) {
- return [[_cornerViews retain] autorelease];
- }
-
- return nil;
+ if (_cornerViews) {
+ return _cornerViews;
+ }
+
+ return nil;
}
@@ -1120,14 +1155,15 @@
@synthesize showsMasterInLandscape;
@synthesize vertical;
@synthesize delegate;
-@synthesize viewControllers;
+@synthesize viewControllers = _viewControllers;
@synthesize masterViewController;
@synthesize detailViewController;
-@synthesize dividerView;
+@synthesize dividerView = _dividerView;
@synthesize splitPosition;
@synthesize splitWidth;
@synthesize allowsDraggingDivider;
@synthesize dividerStyle;
+@synthesize togglesMasterPopover;
@end
--- a/project_files/HedgewarsMobile/Classes/MNEValueTrackingSlider.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MNEValueTrackingSlider.m Fri Apr 01 15:36:19 2016 +0200
@@ -81,7 +81,7 @@
[_text drawInRect:textRect
withFont:self.font
lineBreakMode:UILineBreakModeWordWrap
- alignment:UITextAlignmentCenter];
+ alignment:NSTextAlignmentCenter];
}
}
--- a/project_files/HedgewarsMobile/Classes/MXAudioPlayerFadeOperation.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MXAudioPlayerFadeOperation.m Fri Apr 01 15:36:19 2016 +0200
@@ -79,7 +79,8 @@
}
- (void)main {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ @autoreleasepool {
+
[NSThread sleepForTimeInterval:_delay];
if ([self.audioPlayer isKindOfClass:[AVAudioPlayer class]]) {
[self beginFadeOperation];
@@ -88,7 +89,7 @@
ALog(@"AudioPlayerFadeOperation began with invalid AVAudioPlayer");
}
- [pool release];
+ }
}
- (void)beginFadeOperation {
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,719 +1,138 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="7.10">
- <data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="1"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBProxyObject" id="372490531">
- <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- <object class="IBProxyObject" id="975951072">
- <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- <object class="IBUIView" id="191373211">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">294</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIImageView" id="976741091">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">274</int>
- <string key="NSFrameSize">{1024, 768}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">background.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="867308721">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">301</int>
- <string key="NSFrame">{{383, 389}, {271, 244}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <object class="NSFont" key="IBUIFont" id="917635782">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">15</double>
- <int key="NSfFlags">16</int>
- </object>
- <double key="IBUITitleEdgeInsets.top">215</double>
- <double key="IBUITitleEdgeInsets.bottom">0.0</double>
- <double key="IBUITitleEdgeInsets.left">0.0</double>
- <double key="IBUITitleEdgeInsets.right">0.0</double>
- <object class="NSColor" key="IBUIHighlightedTitleColor" id="918890028">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">2</int>
- <bytes key="NSRGB">MC45OTYwNzg0OTEyIDAuODAwMDAwMDcxNSAwLjAzOTIxNTY4NzY2AA</bytes>
- </object>
- <object class="NSColor" key="IBUINormalTitleShadowColor" id="112471976">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- <object class="NSCustomResource" key="IBUINormalImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">localplayButton~ipad.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="95106947">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">289</int>
- <string key="NSFrame">{{986, 19}, {18, 19}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClipsSubviews">YES</bool>
- <float key="IBUIAlpha">0.31690141558647156</float>
- <int key="IBUITag">3</int>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <int key="IBUIButtonType">3</int>
- <bool key="IBUIShowsTouchWhenHighlighted">YES</bool>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- </object>
- <object class="IBUIButton" id="898948205">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{940, 686}, {64, 64}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">2</int>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- <object class="NSCustomResource" key="IBUINormalImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">settingsButton.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="894101036">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">268</int>
- <string key="NSFrame">{{20, 686}, {64, 64}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">4</int>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- <object class="NSCustomResource" key="IBUINormalImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">savesButton.png</string>
- </object>
- </object>
- <object class="IBUIImageView" id="1019880682">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">301</int>
- <string key="NSFrame">{{242, 43}, {540, 300}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">title~ipad.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="357438048">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">269</int>
- <string key="NSFrame">{{565, 686}, {89, 37}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">5</int>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <int key="IBUIButtonType">1</int>
- <string key="IBUINormalTitle">Missions</string>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- </object>
- <object class="IBUIButton" id="719094980">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">269</int>
- <string key="NSFrame">{{383, 686}, {89, 37}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">6</int>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <int key="IBUIButtonType">1</int>
- <string key="IBUINormalTitle">Simple</string>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- </object>
- </object>
- <string key="NSFrameSize">{1024, 768}</string>
- <reference key="NSSuperview"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MCAwIDAAA</bytes>
- </object>
- <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
- <int key="interfaceOrientation">3</int>
- </object>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- </object>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="191373211"/>
- </object>
- <int key="connectionID">3</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="95106947"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">47</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="867308721"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">48</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="898948205"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">54</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="894101036"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">89</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="357438048"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">92</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="719094980"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">94</int>
- </object>
- </object>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <reference key="object" ref="0"/>
- <reference key="children" ref="1000"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">1</int>
- <reference key="object" ref="191373211"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="976741091"/>
- <reference ref="867308721"/>
- <reference ref="898948205"/>
- <reference ref="894101036"/>
- <reference ref="1019880682"/>
- <reference ref="95106947"/>
- <reference ref="357438048"/>
- <reference ref="719094980"/>
- </object>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="372490531"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="975951072"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">39</int>
- <reference key="object" ref="867308721"/>
- <reference key="parent" ref="191373211"/>
- <string key="objectName">local</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">45</int>
- <reference key="object" ref="95106947"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">52</int>
- <reference key="object" ref="898948205"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">37</int>
- <reference key="object" ref="976741091"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">88</int>
- <reference key="object" ref="894101036"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">90</int>
- <reference key="object" ref="1019880682"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">91</int>
- <reference key="object" ref="357438048"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">93</int>
- <reference key="object" ref="719094980"/>
- <reference key="parent" ref="191373211"/>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>1.IBEditorWindowLastContentRect</string>
- <string>1.IBPluginDependency</string>
- <string>37.IBPluginDependency</string>
- <string>39.IBPluginDependency</string>
- <string>45.IBPluginDependency</string>
- <string>45.IBViewBoundsToFrameTransform</string>
- <string>52.IBPluginDependency</string>
- <string>52.IBViewBoundsToFrameTransform</string>
- <string>88.IBPluginDependency</string>
- <string>88.IBViewBoundsToFrameTransform</string>
- <string>90.IBPluginDependency</string>
- <string>90.IBViewBoundsToFrameTransform</string>
- <string>91.IBPluginDependency</string>
- <string>91.IBViewBoundsToFrameTransform</string>
- <string>93.IBPluginDependency</string>
- <string>93.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>MainMenuViewController</string>
- <string>UIResponder</string>
- <string>{{89, 260}, {1024, 768}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABERsAAw6cAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABEaQAAxDsAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABBoAAAxDsAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDbQAAw6qAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABD6gAAxDRAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDuYAAxDRAAA</bytes>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="sourceID"/>
- <int key="maxID">94</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">MainMenuViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <string key="NS.key.0">switchViews:</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <string key="NS.key.0">switchViews:</string>
- <object class="IBActionInfo" key="NS.object.0">
- <string key="name">switchViews:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MainMenuViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="864669175">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIButton.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIControl</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIImageView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIImageView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIResponder</string>
- <string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="864669175"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchBar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchDisplayController</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
- </object>
- </object>
- </object>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3000" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>background.png</string>
- <string>localplayButton~ipad.png</string>
- <string>savesButton.png</string>
- <string>settingsButton.png</string>
- <string>title~ipad.png</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>{1024, 768}</string>
- <string>{263, 244}</string>
- <string>{64, 64}</string>
- <string>{64, 64}</string>
- <string>{540, 300}</string>
- </object>
- </object>
- <string key="IBCocoaTouchPluginVersion">132</string>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MainMenuViewController">
+ <connections>
+ <outlet property="campaignButton" destination="m3U-KE-tbo" id="iAM-Xf-PsP"/>
+ <outlet property="missionsButton" destination="91" id="96"/>
+ <outlet property="simpleGameButton" destination="93" id="95"/>
+ <outlet property="view" destination="1" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="768"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="background.png" id="37">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="768"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ </imageView>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="39" userLabel="local">
+ <rect key="frame" x="383" y="389" width="271" height="244"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <inset key="titleEdgeInsets" minX="0.0" minY="215" maxX="0.0" maxY="0.0"/>
+ <state key="normal" image="localplayButton.png">
+ <color key="titleColor" red="0.99607849120000003" green="0.80000007149999997" blue="0.039215687659999998" alpha="1" colorSpace="deviceRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="48"/>
+ </connections>
+ </button>
+ <button opaque="NO" clipsSubviews="YES" alpha="0.69999999999999996" tag="3" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="infoLight" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" id="45">
+ <rect key="frame" x="984" y="20" width="22" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <color key="tintColor" red="0.99607843137254903" green="0.85098039215686272" blue="0.039215686274509803" alpha="1" colorSpace="calibratedRGB"/>
+ <state key="normal">
+ <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="47"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="52">
+ <rect key="frame" x="940" y="686" width="64" height="64"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" image="settingsButton.png">
+ <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="54"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="4" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="88">
+ <rect key="frame" x="20" y="686" width="64" height="64"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" image="savesButton.png">
+ <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="89"/>
+ </connections>
+ </button>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="title.png" id="90">
+ <rect key="frame" x="242" y="43" width="540" height="300"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ </imageView>
+ <button opaque="NO" tag="6" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="93">
+ <rect key="frame" x="242" y="686" width="100" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Simple">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="94"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="7" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="m3U-KE-tbo">
+ <rect key="frame" x="682" y="686" width="100" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Campaign">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="OmQ-ow-2f5"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="91">
+ <rect key="frame" x="462" y="686" width="100" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Missions">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="92"/>
+ </connections>
+ </button>
+ </subviews>
+ <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <point key="canvasLocation" x="644" y="499"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="background.png" width="1024" height="768"/>
+ <image name="localplayButton.png" width="263" height="244"/>
+ <image name="savesButton.png" width="64" height="64"/>
+ <image name="settingsButton.png" width="64" height="64"/>
+ <image name="title.png" width="540" height="300"/>
+ </resources>
+</document>
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,734 +1,140 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
- <data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="48"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBProxyObject" id="372490531">
- <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBProxyObject" id="975951072">
- <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBUIView" id="191373211">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">293</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIImageView" id="249993817">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">274</int>
- <string key="NSFrameSize">{480, 320}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MCAwAA</bytes>
- </object>
- <int key="IBUIContentMode">4</int>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">background~iphone.png</string>
- </object>
- </object>
- <object class="IBUIImageView" id="171108356">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">293</int>
- <string key="NSFrame">{{105, 20}, {270, 150}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <int key="IBUIContentMode">4</int>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">title~iphone.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="124270424">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">289</int>
- <string key="NSFrame">{{190, 200}, {100, 100}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MCAwIDAgMAA</bytes>
- </object>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <object class="NSFont" key="IBUIFont" id="917635782">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">15</double>
- <int key="NSfFlags">16</int>
- </object>
- <object class="NSColor" key="IBUIHighlightedTitleColor" id="918890028">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA</bytes>
- </object>
- <object class="NSColor" key="IBUINormalTitleShadowColor" id="112471976">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- <object class="NSCustomResource" key="IBUINormalImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">localplayButton~iphone.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="753723574">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">269</int>
- <string key="NSFrame">{{396, 236}, {64, 64}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <int key="IBUITag">2</int>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- <object class="NSCustomResource" key="IBUINormalImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">settingsButton.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="705508539">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">269</int>
- <string key="NSFrame">{{20, 236}, {64, 64}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <int key="IBUITag">4</int>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- <object class="NSCustomResource" key="IBUINormalImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">savesButton.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="818907840">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">292</int>
- <string key="NSFrame">{{20, 19}, {18, 19}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <float key="IBUIAlpha">0.5</float>
- <int key="IBUITag">3</int>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <int key="IBUIButtonType">3</int>
- <bool key="IBUIShowsTouchWhenHighlighted">YES</bool>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- </object>
- <object class="IBUIButton" id="629390161">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">292</int>
- <string key="NSFrame">{{439, 13}, {29, 31}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">5</int>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <int key="IBUIButtonType">2</int>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- </object>
- <object class="IBUIButton" id="274540289">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">292</int>
- <string key="NSFrame">{{439, 68}, {29, 31}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">6</int>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="917635782"/>
- <int key="IBUIButtonType">2</int>
- <reference key="IBUIHighlightedTitleColor" ref="918890028"/>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
- <reference key="IBUINormalTitleShadowColor" ref="112471976"/>
- </object>
- </object>
- <string key="NSFrameSize">{480, 320}</string>
- <reference key="NSSuperview"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MCAwIDAAA</bytes>
- </object>
- <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
- <int key="interfaceOrientation">3</int>
- </object>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- </object>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="191373211"/>
- </object>
- <int key="connectionID">3</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="753723574"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">30</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="124270424"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">40</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="818907840"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">42</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="705508539"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">44</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="629390161"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">47</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">switchViews:</string>
- <reference key="source" ref="274540289"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">49</int>
- </object>
- </object>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <reference key="object" ref="0"/>
- <reference key="children" ref="1000"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">1</int>
- <reference key="object" ref="191373211"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="249993817"/>
- <reference ref="818907840"/>
- <reference ref="171108356"/>
- <reference ref="705508539"/>
- <reference ref="753723574"/>
- <reference ref="124270424"/>
- <reference ref="629390161"/>
- <reference ref="274540289"/>
- </object>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="372490531"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="975951072"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">23</int>
- <reference key="object" ref="171108356"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">22</int>
- <reference key="object" ref="249993817"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">41</int>
- <reference key="object" ref="818907840"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">43</int>
- <reference key="object" ref="705508539"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">24</int>
- <reference key="object" ref="124270424"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">28</int>
- <reference key="object" ref="753723574"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">46</int>
- <reference key="object" ref="629390161"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">48</int>
- <reference key="object" ref="274540289"/>
- <reference key="parent" ref="191373211"/>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>1.IBEditorWindowLastContentRect</string>
- <string>1.IBPluginDependency</string>
- <string>22.IBPluginDependency</string>
- <string>22.IBViewBoundsToFrameTransform</string>
- <string>23.IBPluginDependency</string>
- <string>23.IBViewBoundsToFrameTransform</string>
- <string>24.IBPluginDependency</string>
- <string>24.IBViewBoundsToFrameTransform</string>
- <string>28.IBPluginDependency</string>
- <string>28.IBViewBoundsToFrameTransform</string>
- <string>41.IBPluginDependency</string>
- <string>41.IBViewBoundsToFrameTransform</string>
- <string>43.IBPluginDependency</string>
- <string>43.IBViewBoundsToFrameTransform</string>
- <string>46.IBPluginDependency</string>
- <string>46.IBViewBoundsToFrameTransform</string>
- <string>48.IBPluginDependency</string>
- <string>48.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>MainMenuViewController</string>
- <string>UIResponder</string>
- <string>{{517, 519}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAAAAAAAAw5UAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABCygAAwzcAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDPgAAw5UAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDxgAAw5iAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwhAAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABBoAAAw5iAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUPbgABBUAAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABD3gAAwjwAAA</bytes>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="sourceID"/>
- <int key="maxID">49</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">MainMenuViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <string key="NS.key.0">switchViews:</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <string key="NS.key.0">switchViews:</string>
- <object class="IBActionInfo" key="NS.object.0">
- <string key="name">switchViews:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MainMenuViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="238583711">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIButton.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIControl</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIImageView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIImageView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIResponder</string>
- <string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="238583711"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchBar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchDisplayController</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
- </object>
- </object>
- </object>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3000" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>background~iphone.png</string>
- <string>localplayButton~iphone.png</string>
- <string>savesButton.png</string>
- <string>settingsButton.png</string>
- <string>title~iphone.png</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>{480, 320}</string>
- <string>{100, 100}</string>
- <string>{64, 64}</string>
- <string>{64, 64}</string>
- <string>{270, 150}</string>
- </object>
- </object>
- <string key="IBCocoaTouchPluginVersion">132</string>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MainMenuViewController">
+ <connections>
+ <outlet property="campaignButton" destination="bc4-Vx-1l9" id="BxT-Y6-DvJ"/>
+ <outlet property="missionsButton" destination="52" id="54"/>
+ <outlet property="simpleGameButton" destination="51" id="56"/>
+ <outlet property="view" destination="1" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="320"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" image="background.png" id="22">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="320"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </imageView>
+ <imageView opaque="NO" clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="center" image="title.png" id="23">
+ <rect key="frame" x="105" y="20" width="270" height="150"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ </imageView>
+ <button opaque="NO" tag="5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="52">
+ <rect key="frame" x="376" y="14" width="96" height="31"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Missions">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="53"/>
+ </connections>
+ </button>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="24">
+ <rect key="frame" x="190" y="200" width="100" height="100"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" image="localplayButton.png">
+ <color key="titleColor" red="0.19607843" green="0.30980393000000001" blue="0.52156866000000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="40"/>
+ </connections>
+ </button>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="28">
+ <rect key="frame" x="396" y="236" width="64" height="64"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" image="settingsButton.png">
+ <color key="titleColor" red="0.19607843" green="0.30980393000000001" blue="0.52156866000000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="30"/>
+ </connections>
+ </button>
+ <button opaque="NO" clearsContextBeforeDrawing="NO" tag="4" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="43">
+ <rect key="frame" x="20" y="236" width="64" height="64"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" image="savesButton.png">
+ <color key="titleColor" red="0.19607843" green="0.30980393000000001" blue="0.52156866000000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="44"/>
+ </connections>
+ </button>
+ <button opaque="NO" alpha="0.69999999999999996" tag="3" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="infoLight" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" id="41">
+ <rect key="frame" x="20" y="20" width="22" height="22"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <color key="tintColor" red="0.99607843137254903" green="0.85098039215686272" blue="0.039215686274509803" alpha="1" colorSpace="calibratedRGB"/>
+ <state key="normal">
+ <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="42"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="6" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="51">
+ <rect key="frame" x="376" y="57" width="96" height="31"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Simple">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="55"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="7" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="bc4-Vx-1l9">
+ <rect key="frame" x="376" y="100" width="96" height="31"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Campaign">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="switchViews:" destination="-1" eventType="touchUpInside" id="11r-ZZ-mUo"/>
+ </connections>
+ </button>
+ </subviews>
+ <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <point key="canvasLocation" x="310" y="551"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="background.png" width="480" height="320"/>
+ <image name="localplayButton.png" width="100" height="100"/>
+ <image name="savesButton.png" width="64" height="64"/>
+ <image name="settingsButton.png" width="64" height="64"/>
+ <image name="title.png" width="270" height="150"/>
+ </resources>
+</document>
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -19,29 +19,7 @@
#import <UIKit/UIKit.h>
-
-@class GameConfigViewController;
-@class SettingsContainerViewController;
-@class AboutViewController;
-@class SavedGamesViewController;
-@class RestoreViewController;
-@class MissionTrainingViewController;
-
-@interface MainMenuViewController : UIViewController <UIAlertViewDelegate> {
- 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 <UIAlertViewDelegate>
-(IBAction) switchViews:(id)sender;
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -20,19 +20,35 @@
#import "MainMenuViewController.h"
#import <QuartzCore/QuartzCore.h>
#import "GameConfigViewController.h"
-#import "SettingsContainerViewController.h"
+#import "MGSplitViewController.h"
+#import "SettingsBaseViewController.h"
#import "AboutViewController.h"
#import "SavedGamesViewController.h"
#import "RestoreViewController.h"
#import "MissionTrainingViewController.h"
+#import "CampaignsViewController.h"
#import "Appirater.h"
#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;
+@property (retain, nonatomic) IBOutlet UIButton *campaignButton;
+@end
@implementation MainMenuViewController
-@synthesize gameConfigViewController, settingsViewController, aboutViewController, savedGamesViewController,
- restoreViewController, missionsViewController;
-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return rotationManager(interfaceOrientation);
@@ -42,7 +58,15 @@
-(void) viewDidLoad {
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.campaignButton setTitle:NSLocalizedString(@"Campaign", nil) forState:UIControlStateNormal];
+
+ [self.simpleGameButton applyDarkBlueQuickStyle];
+ [self.missionsButton applyDarkBlueQuickStyle];
+ [self.campaignButton applyDarkBlueQuickStyle];
+
// get the app's version
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey];
@@ -62,19 +86,18 @@
// 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(presentModalViewController:animated:) 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];
+ 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];
}
/*
@@ -82,6 +105,12 @@
*/
}
+- (void) presentViewController:(UIViewController *)vc
+{
+ [self presentViewController:vc animated:NO completion:nil];
+ [vc release];
+}
+
-(void) viewWillAppear:(BOOL)animated {
[[AudioManagerController mainManager] playBackgroundMusic];
[super viewWillAppear:animated];
@@ -92,104 +121,150 @@
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 presentModalViewController:self.gameConfigViewController animated:YES];
+ 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 presentModalViewController:self.settingsViewController animated:YES];
+ 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:CGRectMake(0, 0, self.view.frame.size.height, self.view.frame.size.width)];
- 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.height-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;
+ about.modalPresentationStyle = UIModalPresentationFormSheet;
+
+ [self presentViewController:about animated:YES completion:nil];
[about release];
}
- [self presentModalViewController:self.aboutViewController animated:YES];
#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;
+ savedgames.modalPresentationStyle = UIModalPresentationPageSheet;
+
+ [self presentViewController:savedgames animated:YES completion:nil];
[savedgames release];
}
- [self presentModalViewController:self.savedGamesViewController animated:YES];
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;
+ missions.modalPresentationStyle = UIModalPresentationPageSheet;
+
+ [self presentViewController:missions animated:YES completion:nil];
[missions release];
}
- [self presentModalViewController:self.missionsViewController animated:YES];
break;
case 6:
[GameInterfaceBridge registerCallingController:self];
[GameInterfaceBridge startSimpleGame];
break;
+ case 7:
+ {
+ xib = IS_IPAD() ? @"CampaignsViewController-iPad" : @"CampaignsViewController-iPhone";
+ CampaignsViewController *campaigns = [[CampaignsViewController alloc] initWithNibName:xib bundle:nil];
+ UINavigationController *campaignNavigationController = [[UINavigationController alloc] initWithRootViewController:campaigns];
+ [campaigns release];
+
+ campaignNavigationController.modalTransitionStyle = IS_IPAD() ? UIModalTransitionStyleCoverVertical : UIModalTransitionStyleCrossDissolve;
+ campaignNavigationController.modalPresentationStyle = UIModalPresentationPageSheet;
+
+ [self presentViewController:campaignNavigationController animated:YES completion:nil];
+ [campaignNavigationController release];
+ }
+ break;
default:
alert = [[UIAlertView alloc] initWithTitle:@"Not Yet Implemented"
message:@"Sorry, this feature is not yet implemented"
@@ -202,42 +277,30 @@
}
}
+- (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];
+ [_campaignButton release];
[super dealloc];
}
--- a/project_files/HedgewarsMobile/Classes/MapConfigViewController-iPhone.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,34 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
<data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <int key="IBDocument.SystemTarget">1792</int>
+ <string key="IBDocument.SystemVersion">14E46</string>
+ <string key="IBDocument.InterfaceBuilderVersion">7706</string>
+ <string key="IBDocument.AppKitVersion">1348.17</string>
+ <string key="IBDocument.HIToolboxVersion">758.70</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="1"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">7703</string>
</object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUIButton</string>
+ <string>IBUIImageView</string>
+ <string>IBUILabel</string>
+ <string>IBUISegmentedControl</string>
+ <string>IBUISlider</string>
+ <string>IBUITableView</string>
+ <string>IBUIView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <dictionary class="NSMutableDictionary" key="IBDocument.Metadata"/>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="IBProxyObject" id="372490531">
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
@@ -40,18 +36,19 @@
<object class="IBUIView" id="191373211">
<reference key="NSNextResponder"/>
<int key="NSvFlags">274</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="574494641">
<reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">292</int>
+ <int key="NSvFlags">274</int>
<string key="NSFrameSize">{480, 276}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
+ <int key="IBUIContentMode">2</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<object class="NSCustomResource" key="IBUIImage">
<string key="NSClassName">NSImage</string>
- <string key="NSResourceName">background~iphone.png</string>
+ <string key="NSResourceName">background.png</string>
</object>
</object>
<object class="IBUISegmentedControl" id="88728219">
@@ -59,46 +56,42 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{9, 14}, {270, 30}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBSegmentControlStyle">2</int>
<int key="IBNumberOfSegments">4</int>
<int key="IBSelectedSegmentIndex">1</int>
- <object class="NSArray" key="IBSegmentTitles">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="IBSegmentTitles">
<string>Random</string>
<string>Map</string>
<string>Maze</string>
<string>Mission</string>
- </object>
- <object class="NSMutableArray" key="IBSegmentWidths">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ </array>
+ <array class="NSMutableArray" key="IBSegmentWidths">
<real value="0.0"/>
<real value="0.0"/>
<real value="0.0"/>
<real value="0.0"/>
- </object>
- <object class="NSMutableArray" key="IBSegmentEnabledStates">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ </array>
+ <array class="NSMutableArray" key="IBSegmentEnabledStates">
<boolean value="YES"/>
<boolean value="YES"/>
<boolean value="YES"/>
<boolean value="YES"/>
- </object>
- <object class="NSMutableArray" key="IBSegmentContentOffsets">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ </array>
+ <array class="NSMutableArray" key="IBSegmentContentOffsets">
<string>{0, 0}</string>
<string>{0, 0}</string>
<string>{0, 0}</string>
<string>{0, 0}</string>
- </object>
- <object class="NSMutableArray" key="IBSegmentImages">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ </array>
+ <array class="NSMutableArray" key="IBSegmentImages">
<object class="NSNull" id="4"/>
<reference ref="4"/>
<reference ref="4"/>
<reference ref="4"/>
- </object>
+ </array>
<object class="NSColor" key="IBTintColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
@@ -109,17 +102,13 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{71, 196}, {145, 44}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">7</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<string key="IBUIText">Loading...</string>
- <object class="NSFont" key="IBUIFont">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">17</double>
- <int key="NSfFlags">16</int>
- </object>
<object class="NSColor" key="IBUITextColor">
<int key="NSColorSpace">2</int>
<bytes key="NSRGB">MC45NDExNzY1MzM3IDAuODE1Njg2MzQ1MSAwAA</bytes>
@@ -128,39 +117,59 @@
<int key="IBUIBaselineAdjustment">1</int>
<float key="IBUIMinimumFontSize">10</float>
<int key="IBUITextAlignment">1</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <string key="name">Helvetica-Bold</string>
+ <string key="family">Helvetica</string>
+ <int key="traits">2</int>
+ <double key="pointSize">17</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica-Bold</string>
+ <double key="NSSize">17</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="useAutomaticPreferredMaxLayoutWidth">YES</bool>
</object>
<object class="IBUIButton" id="326163764">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{16, 58}, {256, 128}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
- <object class="NSFont" key="IBUIFont">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">15</double>
- <int key="NSfFlags">16</int>
+ <object class="NSColor" key="IBUINormalTitleColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
<object class="NSColor" key="IBUIHighlightedTitleColor" id="437070330">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
- <object class="NSColor" key="IBUINormalTitleColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
- </object>
<object class="NSColor" key="IBUINormalTitleShadowColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC41AA</bytes>
</object>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <string key="name">Helvetica-Bold</string>
+ <string key="family">Helvetica</string>
+ <int key="traits">2</int>
+ <double key="pointSize">15</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica-Bold</string>
+ <double key="NSSize">15</double>
+ <int key="NSfFlags">16</int>
+ </object>
</object>
<object class="IBUITableView" id="565214171">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">274</int>
<string key="NSFrame">{{284, 0}, {196, 276}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwAA</bytes>
@@ -183,6 +192,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{52, 239}, {184, 23}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
@@ -190,20 +200,26 @@
<float key="IBUIValue">0.05000000074505806</float>
<float key="IBUIMaxValue">0.05000000074505806</float>
</object>
- </object>
+ </array>
<string key="NSFrameSize">{480, 276}</string>
<reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
<reference key="IBUIBackgroundColor" ref="437070330"/>
+ <bool key="IBUIClipsSubviews">YES</bool>
<object class="IBUISimulatedToolbarMetrics" key="IBUISimulatedBottomBarMetrics"/>
<object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
+ <int key="IBUIInterfaceOrientation">3</int>
<int key="interfaceOrientation">3</int>
</object>
+ <object class="IBUISimulatedSizeMetrics" key="IBUISimulatedDestinationMetrics">
+ <string key="IBUISimulatedSizeMetricsClass">IBUISimulatedFreeformSizeMetricsSentinel</string>
+ <string key="IBUIDisplayName">Freeform</string>
+ </object>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
- </object>
+ </array>
<object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">view</string>
@@ -229,6 +245,39 @@
<int key="connectionID">16</int>
</object>
<object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">segmentedControl</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="88728219"/>
+ </object>
+ <int key="connectionID">21</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">tableView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="565214171"/>
+ </object>
+ <int key="connectionID">32</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">slider</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="938256702"/>
+ </object>
+ <int key="connectionID">38</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchEventConnection" key="connection">
+ <string key="label">segmentedControlChanged:</string>
+ <reference key="source" ref="88728219"/>
+ <reference key="destination" ref="372490531"/>
+ <int key="IBEventType">13</int>
+ </object>
+ <int key="connectionID">22</int>
+ </object>
+ <object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">sliderChanged:</string>
<reference key="source" ref="938256702"/>
@@ -248,47 +297,6 @@
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">segmentedControl</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="88728219"/>
- </object>
- <int key="connectionID">21</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">segmentedControlChanged:</string>
- <reference key="source" ref="88728219"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">13</int>
- </object>
- <int key="connectionID">22</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">dataSource</string>
- <reference key="source" ref="565214171"/>
- <reference key="destination" ref="372490531"/>
- </object>
- <int key="connectionID">26</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="565214171"/>
- <reference key="destination" ref="372490531"/>
- </object>
- <int key="connectionID">27</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">tableView</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="565214171"/>
- </object>
- <int key="connectionID">32</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="326163764"/>
<reference key="destination" ref="372490531"/>
@@ -306,34 +314,40 @@
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">slider</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="938256702"/>
+ <string key="label">dataSource</string>
+ <reference key="source" ref="565214171"/>
+ <reference key="destination" ref="372490531"/>
</object>
- <int key="connectionID">38</int>
+ <int key="connectionID">26</int>
</object>
- </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="565214171"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">27</int>
+ </object>
+ </array>
<object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
- <reference key="object" ref="0"/>
+ <array key="object" id="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="191373211"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array class="NSMutableArray" key="children">
<reference ref="326163764"/>
<reference ref="565214171"/>
<reference ref="574494641"/>
<reference ref="88728219"/>
<reference ref="634417433"/>
<reference ref="938256702"/>
- </object>
+ </array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
@@ -360,9 +374,7 @@
<object class="IBObjectRecord">
<int key="objectID">25</int>
<reference key="object" ref="565214171"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
+ <array class="NSMutableArray" key="children"/>
<reference key="parent" ref="191373211"/>
<string key="objectName">Table View (Themes)</string>
</object>
@@ -381,343 +393,141 @@
<reference key="object" ref="938256702"/>
<reference key="parent" ref="191373211"/>
</object>
- </object>
+ </array>
</object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>1.IBEditorWindowLastContentRect</string>
- <string>1.IBPluginDependency</string>
- <string>11.IBPluginDependency</string>
- <string>11.IBViewBoundsToFrameTransform</string>
- <string>25.IBPluginDependency</string>
- <string>25.IBViewBoundsToFrameTransform</string>
- <string>35.IBPluginDependency</string>
- <string>35.IBViewBoundsToFrameTransform</string>
- <string>7.IBPluginDependency</string>
- <string>7.IBViewBoundsToFrameTransform</string>
- <string>8.CustomClassName</string>
- <string>8.IBPluginDependency</string>
- <string>8.IBViewBoundsToFrameTransform</string>
- <string>9.CustomClassName</string>
- <string>9.IBPluginDependency</string>
- <string>9.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>MapConfigViewController</string>
- <string>UIResponder</string>
- <string>{{790, 298}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUKOAABDRAAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDjgAAw4kAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAAAAAAAAw4kAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABBUAAAwigAAA</bytes>
- </object>
- <string>MNEValueTrackingSlider</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABCWAAAw4IAAA</bytes>
- </object>
- <string>MapPreviewButtonView</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABBgAAAwzgAAA</bytes>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">MapConfigViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="11.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="25.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="35.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="8.CustomClassName">MNEValueTrackingSlider</string>
+ <string key="8.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="9.CustomClassName">MapPreviewButtonView</string>
+ <string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">38</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">MNEValueTrackingSlider</string>
<string key="superclassName">UISlider</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MNEValueTrackingSlider.h</string>
+ <string key="minorKey">../Classes/MNEValueTrackingSlider.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MapConfigViewController</string>
<string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapButtonPressed:</string>
- <string>segmentedControlChanged:</string>
- <string>sliderChanged:</string>
- <string>sliderEndedChanging:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="mapButtonPressed:">id</string>
+ <string key="segmentedControlChanged:">id</string>
+ <string key="sliderChanged:">id</string>
+ <string key="sliderEndedChanging:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="mapButtonPressed:">
+ <string key="name">mapButtonPressed:</string>
+ <string key="candidateClassName">id</string>
</object>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>mapButtonPressed:</string>
- <string>segmentedControlChanged:</string>
- <string>sliderChanged:</string>
- <string>sliderEndedChanging:</string>
+ <object class="IBActionInfo" key="segmentedControlChanged:">
+ <string key="name">segmentedControlChanged:</string>
+ <string key="candidateClassName">id</string>
</object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBActionInfo">
- <string key="name">mapButtonPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">segmentedControlChanged:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">sliderChanged:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">sliderEndedChanging:</string>
- <string key="candidateClassName">id</string>
- </object>
+ <object class="IBActionInfo" key="sliderChanged:">
+ <string key="name">sliderChanged:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="sliderEndedChanging:">
+ <string key="name">sliderEndedChanging:</string>
+ <string key="candidateClassName">id</string>
</object>
- </object>
- <object class="NSMutableDictionary" key="outlets">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>maxLabel</string>
- <string>previewButton</string>
- <string>segmentedControl</string>
- <string>slider</string>
- <string>tableView</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>UILabel</string>
- <string>MapPreviewButtonView</string>
- <string>UISegmentedControl</string>
- <string>MNEValueTrackingSlider</string>
- <string>UITableView</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="maxLabel">UILabel</string>
+ <string key="previewButton">MapPreviewButtonView</string>
+ <string key="segmentedControl">UISegmentedControl</string>
+ <string key="slider">MNEValueTrackingSlider</string>
+ <string key="tableView">UITableView</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="maxLabel">
+ <string key="name">maxLabel</string>
+ <string key="candidateClassName">UILabel</string>
</object>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>maxLabel</string>
- <string>previewButton</string>
- <string>segmentedControl</string>
- <string>slider</string>
- <string>tableView</string>
+ <object class="IBToOneOutletInfo" key="previewButton">
+ <string key="name">previewButton</string>
+ <string key="candidateClassName">MapPreviewButtonView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="segmentedControl">
+ <string key="name">segmentedControl</string>
+ <string key="candidateClassName">UISegmentedControl</string>
</object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBToOneOutletInfo">
- <string key="name">maxLabel</string>
- <string key="candidateClassName">UILabel</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">previewButton</string>
- <string key="candidateClassName">MapPreviewButtonView</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">segmentedControl</string>
- <string key="candidateClassName">UISegmentedControl</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">slider</string>
- <string key="candidateClassName">MNEValueTrackingSlider</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">tableView</string>
- <string key="candidateClassName">UITableView</string>
- </object>
+ <object class="IBToOneOutletInfo" key="slider">
+ <string key="name">slider</string>
+ <string key="candidateClassName">MNEValueTrackingSlider</string>
</object>
- </object>
+ <object class="IBToOneOutletInfo" key="tableView">
+ <string key="name">tableView</string>
+ <string key="candidateClassName">UITableView</string>
+ </object>
+ </dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MapConfigViewController.h</string>
+ <string key="minorKey">../Classes/MapConfigViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MapConfigViewController</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="mapButtonPressed:">id</string>
+ <string key="segmentedControlChanged:">id</string>
+ <string key="sliderChanged:">id</string>
+ <string key="sliderEndedChanging:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="mapButtonPressed:">
+ <string key="name">mapButtonPressed:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="segmentedControlChanged:">
+ <string key="name">segmentedControlChanged:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="sliderChanged:">
+ <string key="name">sliderChanged:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="sliderEndedChanging:">
+ <string key="name">sliderEndedChanging:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../Classes/MapConfigViewController.m</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MapPreviewButtonView</string>
<string key="superclassName">UIButton</string>
- <object class="NSMutableDictionary" key="outlets">
- <string key="NS.key.0">delegate</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <string key="NS.key.0">delegate</string>
- <object class="IBToOneOutletInfo" key="NS.object.0">
- <string key="name">delegate</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MapPreviewButtonView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="67684033">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <reference key="sourceIdentifier" ref="67684033"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <reference key="sourceIdentifier" ref="67684033"/>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+ <string key="minorKey">../Classes/MapPreviewButtonView.h</string>
</object>
</object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="567455553">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
+ </array>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
<object class="IBPartialClassDescription">
<string key="className">UIButton</string>
<string key="superclassName">UIControl</string>
@@ -735,6 +545,14 @@
</object>
</object>
<object class="IBPartialClassDescription">
+ <string key="className">UIGestureRecognizer</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIGestureRecognizer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
<string key="className">UIImageView</string>
<string key="superclassName">UIView</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@@ -753,7 +571,10 @@
<object class="IBPartialClassDescription">
<string key="className">UIResponder</string>
<string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="567455553"/>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
+ </object>
</object>
<object class="IBPartialClassDescription">
<string key="className">UIScrollView</string>
@@ -805,20 +626,6 @@
</object>
<object class="IBPartialClassDescription">
<string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
<string key="superclassName">UIResponder</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBFrameworkSource</string>
@@ -827,59 +634,26 @@
</object>
<object class="IBPartialClassDescription">
<string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
<string key="superclassName">UIResponder</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBFrameworkSource</string>
<string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
</object>
</object>
- </object>
+ </array>
</object>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
+ <bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3000" key="NS.object.0"/>
+ <integer value="4600" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
<object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <string key="NS.key.0">background~iphone.png</string>
+ <string key="NS.key.0">background.png</string>
<string key="NS.object.0">{480, 320}</string>
</object>
- <string key="IBCocoaTouchPluginVersion">132</string>
</data>
</archive>
--- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -45,9 +45,7 @@
return;
// generate a seed
- CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
- NSString *seed = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
- CFRelease(uuid);
+ NSString *seed = [HWUtils seed];
NSString *seedCmd = [[NSString alloc] initWithFormat:@"eseed {%@}", seed];
self.seedCommand = seedCmd;
[seedCmd release];
@@ -62,7 +60,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];
@@ -179,8 +177,8 @@
#pragma mark -
#pragma mark Table view delegate
-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- int newRow = [indexPath row];
- int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
+ NSInteger newRow = [indexPath row];
+ NSInteger oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
if (newRow != oldRow) {
NSArray *source = [self.dataSourceArray objectAtIndex:scIndex];
@@ -352,6 +350,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 +410,9 @@
-(void) viewDidLoad {
[super viewDidLoad];
- srandom(time(NULL));
-
+
+ [self localizeSegmentedControl];
+
// initialize some "default" values
self.slider.value = 0.05f;
self.slider.enabled = NO;
--- a/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Fri Apr 01 15:36:19 2016 +0200
@@ -24,6 +24,10 @@
#define INDICATOR_TAG 7654
+@interface MapPreviewButtonView ()
+@property (nonatomic) NSInteger port;
+@end
+
@implementation MapPreviewButtonView
@synthesize delegate;
@@ -54,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);
@@ -64,7 +68,7 @@
IPaddress ip;
BOOL serverQuit = NO;
uint8_t packedMap[128*32];
- int port = [HWUtils randomPort];
+ self.port = [HWUtils randomPort];
if (SDLNet_Init() < 0) {
DLog(@"SDLNet_Init: %s", SDLNet_GetError());
@@ -72,23 +76,45 @@
}
// Resolving the host using NULL make network interface to listen
- if (SDLNet_ResolveHost(&ip, NULL, port) < 0) {
+ if (SDLNet_ResolveHost(&ip, NULL, self.port) < 0) {
DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
serverQuit = YES;
}
// Open a connection with the IP provided (listen on the host's port)
if (!(sd = SDLNet_TCP_Open(&ip))) {
- DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), port);
+ DLog(@"SDLNet_TCP_Open: %s %ld\n", SDLNet_GetError(), (long)self.port);
serverQuit = YES;
}
- // launch the preview here so that we're sure the tcp channel is open
- pthread_t thread_id;
- pthread_create(&thread_id, NULL, (void *(*)(void *))GenLandPreview, (void *)port);
- pthread_detach(thread_id);
-
- DLog(@"Waiting for a client on port %d", port);
+ // launch the preview in background here so that we're sure the tcp channel is open
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
+ NSString *ipcString = [[NSString alloc] initWithFormat:@"%ld", (long)self.port];
+ NSString *documentsDirectory = DOCUMENTS_FOLDER();
+
+ NSMutableArray *gameParameters = [[NSMutableArray alloc] initWithObjects:
+ @"--internal",
+ @"--port", ipcString,
+ @"--user-prefix", documentsDirectory,
+ @"--landpreview",
+ nil];
+ [ipcString release];
+
+ int argc = [gameParameters count];
+ const char **argv = (const char **)malloc(sizeof(const char*)*argc);
+ for (int i = 0; i < argc; i++)
+ argv[i] = strdup([[gameParameters objectAtIndex:i] UTF8String]);
+ [gameParameters release];
+
+ RunEngine(argc, argv);
+
+ // cleanup
+ for (int i = 0; i < argc; i++)
+ free((void *)argv[i]);
+ free(argv);
+ });
+
+ DLog(@"Waiting for a client on port %ld", (long)self.port);
while (!serverQuit) {
/* This check the sd if there is a pending connection.
* If there is one, accept that, and open a new socket for communicating */
@@ -111,7 +137,7 @@
serverQuit = YES;
}
}
- [HWUtils freePort:port];
+ [HWUtils freePort:self.port];
SDLNet_TCP_Close(sd);
SDLNet_Quit();
@@ -129,13 +155,14 @@
}
-(void) drawingThread {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ @autoreleasepool {
+
uint8_t unpackedMap[128*32*8];
[self engineProtocol:unpackedMap];
// http://developer.apple.com/mac/library/qa/qa2001/qa1037.html
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
- CGContextRef bitmapImage = CGBitmapContextCreate(unpackedMap, 256, 128, 8, 256, colorspace, kCGImageAlphaNone);
+ CGContextRef bitmapImage = CGBitmapContextCreate(unpackedMap, 256, 128, 8, 256, colorspace, (CGBitmapInfo)kCGImageAlphaNone);
CGColorSpaceRelease(colorspace);
CGImageRef previewCGImage = CGBitmapContextCreateImage(bitmapImage);
@@ -149,7 +176,7 @@
waitUntilDone:NO];
[previewImage release];
[self performSelectorOnMainThread:@selector(setLabelText:)
- withObject:[NSString stringWithFormat:@"%d", maxHogs]
+ withObject:[NSString stringWithFormat:@"%ld", (long)maxHogs]
waitUntilDone:NO];
[self performSelectorOnMainThread:@selector(turnOnWidgets)
withObject:nil
@@ -157,8 +184,8 @@
[self performSelectorOnMainThread:@selector(removeIndicator)
withObject:nil
waitUntilDone:NO];
-
- [pool release];
+
+ }
}
-(void) updatePreviewWithSeed:(NSString *)seed {
--- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController-iPhone.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,34 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
<data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <int key="IBDocument.SystemTarget">1792</int>
+ <string key="IBDocument.SystemVersion">14E46</string>
+ <string key="IBDocument.InterfaceBuilderVersion">7706</string>
+ <string key="IBDocument.AppKitVersion">1348.17</string>
+ <string key="IBDocument.HIToolboxVersion">758.70</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="1"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">7703</string>
</object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUIButton</string>
+ <string>IBUIImageView</string>
+ <string>IBUITableView</string>
+ <string>IBUIView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <dictionary class="NSMutableDictionary" key="IBDocument.Metadata"/>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="IBProxyObject" id="372490531">
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
@@ -40,18 +33,19 @@
<object class="IBUIView" id="191373211">
<reference key="NSNextResponder"/>
<int key="NSvFlags">274</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="474863980">
<reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">292</int>
+ <int key="NSvFlags">274</int>
<string key="NSFrameSize">{480, 320}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
+ <int key="IBUIContentMode">2</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<object class="NSCustomResource" key="IBUIImage">
<string key="NSClassName">NSImage</string>
- <string key="NSResourceName">smallerBackground~iphone.png</string>
+ <string key="NSResourceName">smallerBackground.png</string>
</object>
</object>
<object class="IBUITableView" id="609221433">
@@ -59,6 +53,7 @@
<int key="NSvFlags">274</int>
<string key="NSFrame">{{180, 0}, {300, 320}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<object class="NSColor" key="IBUIBackgroundColor" id="76134506">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
@@ -80,6 +75,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{11, 19}, {157, 130}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<bool key="IBUIClipsSubviews">YES</bool>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
@@ -89,20 +85,16 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{57, 245}, {64, 64}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
- <object class="NSFont" key="IBUIFont" id="1000305902">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">15</double>
- <int key="NSfFlags">16</int>
- </object>
- <reference key="IBUIHighlightedTitleColor" ref="76134506"/>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
+ <reference key="IBUIHighlightedTitleColor" ref="76134506"/>
<object class="NSColor" key="IBUINormalTitleShadowColor" id="181044244">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC41AA</bytes>
@@ -111,32 +103,46 @@
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">backButton.png</string>
</object>
+ <object class="IBUIFontDescription" key="IBUIFontDescription" id="128202473">
+ <string key="name">Helvetica-Bold</string>
+ <string key="family">Helvetica</string>
+ <int key="traits">2</int>
+ <double key="pointSize">15</double>
+ </object>
+ <object class="NSFont" key="IBUIFont" id="1000305902">
+ <string key="NSName">Helvetica-Bold</string>
+ <double key="NSSize">15</double>
+ <int key="NSfFlags">16</int>
+ </object>
</object>
<object class="IBUIButton" id="1068873625">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{18, 164}, {142, 64}}</string>
<reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
<bool key="IBUIOpaque">NO</bool>
<int key="IBUITag">1</int>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="1000305902"/>
- <reference key="IBUIHighlightedTitleColor" ref="76134506"/>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
+ <reference key="IBUIHighlightedTitleColor" ref="76134506"/>
<reference key="IBUINormalTitleShadowColor" ref="181044244"/>
<object class="NSCustomResource" key="IBUINormalImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">startGameButton.png</string>
</object>
+ <reference key="IBUIFontDescription" ref="128202473"/>
+ <reference key="IBUIFont" ref="1000305902"/>
</object>
- </object>
+ </array>
<string key="NSFrameSize">{480, 320}</string>
<reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
@@ -145,14 +151,18 @@
</object>
</object>
<object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
+ <int key="IBUIInterfaceOrientation">3</int>
<int key="interfaceOrientation">3</int>
</object>
+ <object class="IBUISimulatedSizeMetrics" key="IBUISimulatedDestinationMetrics">
+ <string key="IBUISimulatedSizeMetricsClass">IBUISimulatedFreeformSizeMetricsSentinel</string>
+ <string key="IBUIDisplayName">Freeform</string>
+ </object>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
- </object>
+ </array>
<object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">view</string>
@@ -163,6 +173,22 @@
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">previewImage</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="776434219"/>
+ </object>
+ <int key="connectionID">13</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">tableView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="609221433"/>
+ </object>
+ <int key="connectionID">14</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">dataSource</string>
<reference key="source" ref="609221433"/>
<reference key="destination" ref="372490531"/>
@@ -178,22 +204,6 @@
<int key="connectionID">12</int>
</object>
<object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">previewImage</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="776434219"/>
- </object>
- <int key="connectionID">13</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">tableView</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="609221433"/>
- </object>
- <int key="connectionID">14</int>
- </object>
- <object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">buttonPressed:</string>
<reference key="source" ref="1038942684"/>
@@ -211,27 +221,25 @@
</object>
<int key="connectionID">20</int>
</object>
- </object>
+ </array>
<object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
- <reference key="object" ref="0"/>
+ <array key="object" id="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="191373211"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array class="NSMutableArray" key="children">
<reference ref="609221433"/>
<reference ref="776434219"/>
<reference ref="1038942684"/>
<reference ref="1068873625"/>
<reference ref="474863980"/>
- </object>
+ </array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
@@ -248,9 +256,7 @@
<object class="IBObjectRecord">
<int key="objectID">9</int>
<reference key="object" ref="609221433"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
+ <array class="NSMutableArray" key="children"/>
<reference key="parent" ref="191373211"/>
</object>
<object class="IBObjectRecord">
@@ -273,72 +279,28 @@
<reference key="object" ref="474863980"/>
<reference key="parent" ref="191373211"/>
</object>
- </object>
+ </array>
</object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>1.IBEditorWindowLastContentRect</string>
- <string>1.IBPluginDependency</string>
- <string>10.IBPluginDependency</string>
- <string>10.IBViewBoundsToFrameTransform</string>
- <string>17.IBPluginDependency</string>
- <string>17.IBViewBoundsToFrameTransform</string>
- <string>18.IBPluginDependency</string>
- <string>18.IBViewBoundsToFrameTransform</string>
- <string>23.IBPluginDependency</string>
- <string>9.IBPluginDependency</string>
- <string>9.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>MissionTrainingViewController</string>
- <string>UIResponder</string>
- <string>{{492, 751}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABAoAAAwwYAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABChAAAw5eAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABB2AAAw2cAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDUAAAw5UAAA</bytes>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">MissionTrainingViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="10.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="17.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="18.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">23</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">MissionTrainingViewController</string>
<string key="superclassName">UIViewController</string>
@@ -353,173 +315,50 @@
<string key="candidateClassName">id</string>
</object>
</object>
- <object class="NSMutableDictionary" key="outlets">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>descriptionLabel</string>
- <string>previewImage</string>
- <string>tableView</string>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="descriptionLabel">UILabel</string>
+ <string key="previewImage">UIImageView</string>
+ <string key="tableView">UITableView</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="descriptionLabel">
+ <string key="name">descriptionLabel</string>
+ <string key="candidateClassName">UILabel</string>
</object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>UILabel</string>
- <string>UIImageView</string>
- <string>UITableView</string>
+ <object class="IBToOneOutletInfo" key="previewImage">
+ <string key="name">previewImage</string>
+ <string key="candidateClassName">UIImageView</string>
</object>
+ <object class="IBToOneOutletInfo" key="tableView">
+ <string key="name">tableView</string>
+ <string key="candidateClassName">UITableView</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../Classes/MissionTrainingViewController.h</string>
</object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>descriptionLabel</string>
- <string>previewImage</string>
- <string>tableView</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBToOneOutletInfo">
- <string key="name">descriptionLabel</string>
- <string key="candidateClassName">UILabel</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">previewImage</string>
- <string key="candidateClassName">UIImageView</string>
- </object>
- <object class="IBToOneOutletInfo">
- <string key="name">tableView</string>
- <string key="candidateClassName">UITableView</string>
- </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MissionTrainingViewController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">buttonPressed:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <string key="NS.key.0">buttonPressed:</string>
+ <object class="IBActionInfo" key="NS.object.0">
+ <string key="name">buttonPressed:</string>
+ <string key="candidateClassName">id</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/MissionTrainingViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="249392476">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <reference key="sourceIdentifier" ref="249392476"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <reference key="sourceIdentifier" ref="249392476"/>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+ <string key="minorKey">../Classes/MissionTrainingViewController.m</string>
</object>
</object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="6906421">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
+ </array>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
<object class="IBPartialClassDescription">
<string key="className">UIButton</string>
<string key="superclassName">UIControl</string>
@@ -537,6 +376,14 @@
</object>
</object>
<object class="IBPartialClassDescription">
+ <string key="className">UIGestureRecognizer</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIGestureRecognizer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
<string key="className">UIImageView</string>
<string key="superclassName">UIView</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@@ -555,7 +402,10 @@
<object class="IBPartialClassDescription">
<string key="className">UIResponder</string>
<string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="6906421"/>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
+ </object>
</object>
<object class="IBPartialClassDescription">
<string key="className">UIScrollView</string>
@@ -591,20 +441,6 @@
</object>
<object class="IBPartialClassDescription">
<string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
<string key="superclassName">UIResponder</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBFrameworkSource</string>
@@ -613,70 +449,27 @@
</object>
<object class="IBPartialClassDescription">
<string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
<string key="superclassName">UIResponder</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBFrameworkSource</string>
<string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
</object>
</object>
- </object>
+ </array>
</object>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
+ <bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3000" key="NS.object.0"/>
+ <integer value="4600" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
- <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>backButton.png</string>
- <string>smallerBackground~iphone.png</string>
- <string>startGameButton.png</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>{64, 64}</string>
- <string>{480, 320}</string>
- <string>{142, 64}</string>
- </object>
- </object>
- <string key="IBCocoaTouchPluginVersion">132</string>
+ <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="backButton.png">{64, 64}</string>
+ <string key="smallerBackground.png">{480, 320}</string>
+ <string key="startGameButton.png">{142, 64}</string>
+ </dictionary>
</data>
</archive>
--- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -20,18 +20,12 @@
#import <UIKit/UIKit.h>
-@interface MissionTrainingViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
- NSArray *listOfMissions;
- NSArray *listOfDescriptions;
- NSString *missionName;
- UIImageView *previewImage;
- UITableView *tableView;
- UILabel *descriptionLabel;
-}
+@interface MissionTrainingViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
-@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;
--- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
}
@@ -65,43 +66,136 @@
if (button.tag == 0) {
[[AudioManagerController mainManager] playBackSound];
- [[self parentViewController] dismissModalViewControllerAnimated:YES];
+ [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
} else {
[GameInterfaceBridge registerCallingController:self];
[GameInterfaceBridge startMissionGame:self.missionName];
}
}
-#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)
- if ([str hasPrefix:desc] && [str hasSuffix:@"\""]) {
- NSArray *descriptionText = [str componentsSeparatedByString:@"\""];
- [filteredArray insertObject:[descriptionText objectAtIndex:1] atIndex:i];
- break;
- }
+- (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])
+ {
+ 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];
+ }
+
+ NSMutableDictionary *missionDict = [missionsDict objectForKey:missionID];
+
+ if (missionParsedName)
+ {
+ [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 -
@@ -111,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 {
@@ -126,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.textAlignment = (IS_IPAD()) ? NSTextAlignmentCenter : NSTextAlignmentLeft;
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;
}
@@ -150,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];
@@ -158,24 +259,26 @@
[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 {
- self.previewImage = nil;
+
+-(void) didReceiveMemoryWarning
+{
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;
@@ -185,13 +288,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];
}
--- a/project_files/HedgewarsMobile/Classes/PascalImports.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/PascalImports.h Fri Apr 01 15:36:19 2016 +0200
@@ -28,9 +28,8 @@
* that you want to use in your non-Pascal code
*/
- void Game(const int argc, const char *argv[]);
- void GenLandPreview(void);
- void LoadLocaleWrapper(const char *filename);
+ void RunEngine(const int argc, const char *argv[]);
+ void LoadLocaleWrapper(const char *filepath, const char *filename);
void HW_versionInfo(int *protoNum, char **versionStr);
void *HW_getSDLWindow(void);
--- a/project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,654 +1,92 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="7.10">
- <data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="1"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBProxyObject" id="372490531">
- <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- <object class="IBProxyObject" id="975951072">
- <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- <object class="IBUIView" id="191373211">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">274</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIImageView" id="138553579">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">319</int>
- <string key="NSFrameSize">{540, 640}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">smallerBackground~ipad.png</string>
- </object>
- </object>
- <object class="IBUIButton" id="155385540">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">302</int>
- <string key="NSFrame">{{84, 517}, {151, 37}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <object class="NSFont" key="IBUIFont" id="204967016">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">15</double>
- <int key="NSfFlags">16</int>
- </object>
- <int key="IBUIButtonType">1</int>
- <string key="IBUINormalTitle">Dismiss</string>
- <object class="NSColor" key="IBUIHighlightedTitleColor" id="790402446">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <object class="NSColor" key="IBUINormalTitleColor" id="829178890">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MCAwIDAuNTAxOTYwODE0AA</bytes>
- </object>
- <object class="NSColor" key="IBUINormalTitleShadowColor" id="644451038">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- </object>
- <object class="IBUIButton" id="202794507">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">299</int>
- <string key="NSFrame">{{308, 517}, {151, 37}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">1</int>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="204967016"/>
- <int key="IBUIButtonType">1</int>
- <string key="IBUINormalTitle">Restore</string>
- <reference key="IBUIHighlightedTitleColor" ref="790402446"/>
- <reference key="IBUINormalTitleColor" ref="829178890"/>
- <reference key="IBUINormalTitleShadowColor" ref="644451038"/>
- </object>
- <object class="IBUILabel" id="655269955">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">295</int>
- <string key="NSFrame">{{216, 35}, {108, 29}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClipsSubviews">YES</bool>
- <int key="IBUIContentMode">7</int>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <string key="IBUIText">Hmm...</string>
- <object class="NSFont" key="IBUIFont">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">24</double>
- <int key="NSfFlags">16</int>
- </object>
- <object class="NSColor" key="IBUITextColor">
- <int key="NSColorSpace">2</int>
- <bytes key="NSRGB">MSAwLjc4MDM5MjIyOTYgMAA</bytes>
- </object>
- <reference key="IBUIHighlightedColor" ref="790402446"/>
- <int key="IBUIBaselineAdjustment">1</int>
- <float key="IBUIMinimumFontSize">10</float>
- <int key="IBUITextAlignment">1</int>
- </object>
- <object class="IBUILabel" id="19933541">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">282</int>
- <string key="NSFrame">{{80, 375}, {380, 96}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClipsSubviews">YES</bool>
- <int key="IBUIContentMode">7</int>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <string key="IBUIText">Would you like to restore it?</string>
- <object class="NSFont" key="IBUIFont" id="276115526">
- <string key="NSName">Helvetica</string>
- <double key="NSSize">18</double>
- <int key="NSfFlags">16</int>
- </object>
- <object class="NSColor" key="IBUITextColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA</bytes>
- </object>
- <reference key="IBUIHighlightedColor" ref="790402446"/>
- <int key="IBUIBaselineAdjustment">1</int>
- <float key="IBUIMinimumFontSize">10</float>
- <int key="IBUINumberOfLines">4</int>
- <int key="IBUITextAlignment">1</int>
- </object>
- <object class="IBUILabel" id="151967545">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">306</int>
- <string key="NSFrame">{{80, 87}, {380, 96}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClipsSubviews">YES</bool>
- <int key="IBUIContentMode">7</int>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <string key="IBUIText">It appears you didn't complete your last game!</string>
- <reference key="IBUIFont" ref="276115526"/>
- <object class="NSColor" key="IBUITextColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA</bytes>
- </object>
- <reference key="IBUIHighlightedColor" ref="790402446"/>
- <int key="IBUIBaselineAdjustment">1</int>
- <float key="IBUIMinimumFontSize">10</float>
- <int key="IBUINumberOfLines">4</int>
- <int key="IBUITextAlignment">1</int>
- </object>
- <object class="IBUIImageView" id="129485928">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">301</int>
- <string key="NSFrame">{{150, 191}, {240, 160}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">denied.png</string>
- </object>
- </object>
- </object>
- <string key="NSFrameSize">{540, 640}</string>
- <reference key="NSSuperview"/>
- <reference key="IBUIBackgroundColor" ref="790402446"/>
- <int key="IBUIContentMode">4</int>
- <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
- <int key="interfaceOrientation">3</int>
- </object>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- </object>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="191373211"/>
- </object>
- <int key="connectionID">3</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonReleased:</string>
- <reference key="source" ref="155385540"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">21</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonReleased:</string>
- <reference key="source" ref="202794507"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">22</int>
- </object>
- </object>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <reference key="object" ref="0"/>
- <reference key="children" ref="1000"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">1</int>
- <reference key="object" ref="191373211"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="155385540"/>
- <reference ref="202794507"/>
- <reference ref="655269955"/>
- <reference ref="19933541"/>
- <reference ref="151967545"/>
- <reference ref="129485928"/>
- <reference ref="138553579"/>
- </object>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="372490531"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="975951072"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">15</int>
- <reference key="object" ref="155385540"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">16</int>
- <reference key="object" ref="202794507"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">18</int>
- <reference key="object" ref="655269955"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="19933541"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">20</int>
- <reference key="object" ref="129485928"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">23</int>
- <reference key="object" ref="151967545"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">24</int>
- <reference key="object" ref="138553579"/>
- <reference key="parent" ref="191373211"/>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>1.IBEditorWindowLastContentRect</string>
- <string>1.IBPluginDependency</string>
- <string>15.IBPluginDependency</string>
- <string>15.IBViewBoundsToFrameTransform</string>
- <string>16.IBPluginDependency</string>
- <string>16.IBViewBoundsToFrameTransform</string>
- <string>18.IBPluginDependency</string>
- <string>18.IBViewBoundsToFrameTransform</string>
- <string>19.IBPluginDependency</string>
- <string>19.IBViewBoundsToFrameTransform</string>
- <string>20.IBPluginDependency</string>
- <string>20.IBViewBoundsToFrameTransform</string>
- <string>23.IBPluginDependency</string>
- <string>23.IBViewBoundsToFrameTransform</string>
- <string>24.IBPluginDependency</string>
- <string>24.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>RestoreViewController</string>
- <string>UIResponder</string>
- <string>{{650, 289}, {540, 640}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDlIAAw2gAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABEAkAAw2gAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDXAAAw3UAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUKgAABDmYAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABDFgAAw8cAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">P4AAAL+AAABCoAAAw9uAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform"/>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="sourceID"/>
- <int key="maxID">24</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">RestoreViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <string key="NS.key.0">buttonReleased:</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <string key="NS.key.0">buttonReleased:</string>
- <object class="IBActionInfo" key="NS.object.0">
- <string key="name">buttonReleased:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/RestoreViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="749404015">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIButton.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIControl</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIImageView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIImageView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UILabel.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIResponder</string>
- <string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="749404015"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchBar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchDisplayController</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
- </object>
- </object>
- </object>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3000" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>denied.png</string>
- <string>smallerBackground~ipad.png</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>{240, 160}</string>
- <string>{540, 640}</string>
- </object>
- </object>
- <string key="IBCocoaTouchPluginVersion">132</string>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="RestoreViewController">
+ <connections>
+ <outlet property="dismissButton" destination="15" id="kms-tp-evE"/>
+ <outlet property="restoreButton" destination="16" id="iH9-dH-DWf"/>
+ <outlet property="view" destination="1" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="center" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="640"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="smallerBackground.png" id="24">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="640"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </imageView>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="15">
+ <rect key="frame" x="84" y="517" width="151" height="37"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Dismiss">
+ <color key="titleColor" red="0.0" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="buttonReleased:" destination="-1" eventType="touchUpInside" id="21"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="16">
+ <rect key="frame" x="308" y="517" width="151" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Restore">
+ <color key="titleColor" red="0.0" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="buttonReleased:" destination="-1" eventType="touchUpInside" id="22"/>
+ </connections>
+ </button>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Would you like to restore it?" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="4" minimumFontSize="10" id="19" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="80" y="375" width="380" height="96"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="It appears you didn't complete your last game!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="4" minimumFontSize="10" id="23" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="80" y="87" width="380" height="96"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </label>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="denied.png" id="20">
+ <rect key="frame" x="150" y="191" width="240" height="160"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Hmm..." textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" id="18" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="80" y="35" width="380" height="29"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="24"/>
+ <color key="textColor" red="1" green="0.78039222959999999" blue="0.0" alpha="1" colorSpace="deviceRGB"/>
+ <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="denied.png" width="240" height="160"/>
+ <image name="smallerBackground.png" width="540" height="640"/>
+ </resources>
+</document>
--- a/project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,620 +1,93 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
- <data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="1"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBProxyObject" id="372490531">
- <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBProxyObject" id="975951072">
- <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBUIView" id="191373211">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">274</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIImageView" id="396922791">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">319</int>
- <string key="NSFrameSize">{480, 320}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">smallerBackground~iphone.png</string>
- </object>
- </object>
- <object class="IBUIImageView" id="508553704">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">300</int>
- <string key="NSFrame">{{20, 20}, {240, 160}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">denied.png</string>
- </object>
- </object>
- <object class="IBUILabel" id="531154203">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">315</int>
- <string key="NSFrame">{{310, 32}, {108, 29}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClipsSubviews">YES</bool>
- <int key="IBUIContentMode">7</int>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <string key="IBUIText">Hmm...</string>
- <object class="NSFont" key="IBUIFont">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">24</double>
- <int key="NSfFlags">16</int>
- </object>
- <object class="NSColor" key="IBUITextColor">
- <int key="NSColorSpace">2</int>
- <bytes key="NSRGB">MSAwLjgyNzQ1MTA1MDMgMAA</bytes>
- </object>
- <object class="NSColor" key="IBUIHighlightedColor" id="790402446">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <int key="IBUIBaselineAdjustment">1</int>
- <float key="IBUIMinimumFontSize">10</float>
- <int key="IBUITextAlignment">1</int>
- </object>
- <object class="IBUILabel" id="785455561">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">307</int>
- <string key="NSFrame">{{268, 74}, {192, 96}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClipsSubviews">YES</bool>
- <int key="IBUIContentMode">7</int>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <string key="IBUIText">It appears you didn't complete your last game! Would you like to restore it?</string>
- <object class="NSFont" key="IBUIFont">
- <string key="NSName">Helvetica</string>
- <double key="NSSize">18</double>
- <int key="NSfFlags">16</int>
- </object>
- <object class="NSColor" key="IBUITextColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA</bytes>
- </object>
- <reference key="IBUIHighlightedColor" ref="790402446"/>
- <int key="IBUIBaselineAdjustment">1</int>
- <float key="IBUIMinimumFontSize">10</float>
- <int key="IBUINumberOfLines">4</int>
- <int key="IBUITextAlignment">1</int>
- </object>
- <object class="IBUIButton" id="472385208">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">302</int>
- <string key="NSFrame">{{53, 229}, {151, 37}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <object class="NSFont" key="IBUIFont" id="204967016">
- <string key="NSName">Helvetica-Bold</string>
- <double key="NSSize">15</double>
- <int key="NSfFlags">16</int>
- </object>
- <int key="IBUIButtonType">1</int>
- <string key="IBUINormalTitle">Dismiss</string>
- <reference key="IBUIHighlightedTitleColor" ref="790402446"/>
- <object class="NSColor" key="IBUINormalTitleColor" id="734262812">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MCAwIDAuNTAxOTYwODE0AA</bytes>
- </object>
- <object class="NSColor" key="IBUINormalTitleShadowColor" id="644451038">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- </object>
- <object class="IBUIButton" id="923913762">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">299</int>
- <string key="NSFrame">{{277, 229}, {151, 37}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <bool key="IBUIOpaque">NO</bool>
- <int key="IBUITag">1</int>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <int key="IBUIContentHorizontalAlignment">0</int>
- <int key="IBUIContentVerticalAlignment">0</int>
- <reference key="IBUIFont" ref="204967016"/>
- <int key="IBUIButtonType">1</int>
- <string key="IBUINormalTitle">Restore</string>
- <reference key="IBUIHighlightedTitleColor" ref="790402446"/>
- <reference key="IBUINormalTitleColor" ref="734262812"/>
- <reference key="IBUINormalTitleShadowColor" ref="644451038"/>
- </object>
- </object>
- <string key="NSFrameSize">{480, 320}</string>
- <reference key="NSSuperview"/>
- <reference key="IBUIBackgroundColor" ref="790402446"/>
- <int key="IBUIContentMode">4</int>
- <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
- <int key="interfaceOrientation">3</int>
- </object>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- </object>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="191373211"/>
- </object>
- <int key="connectionID">3</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonReleased:</string>
- <reference key="source" ref="923913762"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">11</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonReleased:</string>
- <reference key="source" ref="472385208"/>
- <reference key="destination" ref="372490531"/>
- <int key="IBEventType">7</int>
- </object>
- <int key="connectionID">12</int>
- </object>
- </object>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <reference key="object" ref="0"/>
- <reference key="children" ref="1000"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">1</int>
- <reference key="object" ref="191373211"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="508553704"/>
- <reference ref="923913762"/>
- <reference ref="785455561"/>
- <reference ref="531154203"/>
- <reference ref="472385208"/>
- <reference ref="396922791"/>
- </object>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="372490531"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="975951072"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">5</int>
- <reference key="object" ref="508553704"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">6</int>
- <reference key="object" ref="531154203"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">7</int>
- <reference key="object" ref="785455561"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">8</int>
- <reference key="object" ref="472385208"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">10</int>
- <reference key="object" ref="923913762"/>
- <reference key="parent" ref="191373211"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">15</int>
- <reference key="object" ref="396922791"/>
- <reference key="parent" ref="191373211"/>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>1.IBEditorWindowLastContentRect</string>
- <string>1.IBPluginDependency</string>
- <string>10.IBPluginDependency</string>
- <string>10.IBViewBoundsToFrameTransform</string>
- <string>15.IBPluginDependency</string>
- <string>15.IBViewBoundsToFrameTransform</string>
- <string>5.IBPluginDependency</string>
- <string>5.IBViewBoundsToFrameTransform</string>
- <string>6.IBPluginDependency</string>
- <string>6.IBViewBoundsToFrameTransform</string>
- <string>7.IBPluginDependency</string>
- <string>7.IBViewBoundsToFrameTransform</string>
- <string>8.IBPluginDependency</string>
- <string>8.IBViewBoundsToFrameTransform</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>RestoreViewController</string>
- <string>UIResponder</string>
- <string>{{206, 423}, {480, 320}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUOKgABDZQAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform"/>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUGgAABBoAAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUObAABCAAAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUOGAABClAAAA</bytes>
- </object>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <object class="NSAffineTransform">
- <bytes key="NSTransformStruct">AUJUAABDZQAAA</bytes>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="sourceID"/>
- <int key="maxID">15</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">RestoreViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <string key="NS.key.0">buttonReleased:</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <string key="NS.key.0">buttonReleased:</string>
- <object class="IBActionInfo" key="NS.object.0">
- <string key="name">buttonReleased:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/RestoreViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="749404015">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIButton</string>
- <string key="superclassName">UIControl</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIButton.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIControl</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIControl.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIImageView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIImageView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UILabel</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UILabel.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIResponder</string>
- <string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="749404015"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchBar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchDisplayController</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
- </object>
- </object>
- </object>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3000" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>denied.png</string>
- <string>smallerBackground~iphone.png</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>{240, 160}</string>
- <string>{480, 320}</string>
- </object>
- </object>
- <string key="IBCocoaTouchPluginVersion">132</string>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="RestoreViewController">
+ <connections>
+ <outlet property="dismissButton" destination="8" id="0AU-TL-3aN"/>
+ <outlet property="restoreButton" destination="10" id="V8J-Ke-DQd"/>
+ <outlet property="view" destination="1" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="center" id="1">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="320"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="smallerBackground.png" id="15">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="320"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </imageView>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="denied.png" id="5">
+ <rect key="frame" x="20" y="20" width="240" height="160"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <animations/>
+ </imageView>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Hmm..." textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" id="6" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="268" y="32" width="192" height="29"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="24"/>
+ <color key="textColor" red="1" green="0.82745105029999999" blue="0.0" alpha="1" colorSpace="deviceRGB"/>
+ <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="It appears you didn't complete your last game!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="4" minimumFontSize="10" id="7" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="268" y="74" width="192" height="70"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </label>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="8">
+ <rect key="frame" x="53" y="229" width="151" height="37"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Dismiss">
+ <color key="titleColor" red="0.0" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="buttonReleased:" destination="-1" eventType="touchUpInside" id="12"/>
+ </connections>
+ </button>
+ <button opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="10">
+ <rect key="frame" x="277" y="229" width="151" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
+ <state key="normal" title="Restore">
+ <color key="titleColor" red="0.0" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="buttonReleased:" destination="-1" eventType="touchUpInside" id="11"/>
+ </connections>
+ </button>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Would you like to restore it?" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="4" minimumFontSize="10" id="GnJ-yZ-dpc" customClass="LabelWithIBLocalization">
+ <rect key="frame" x="268" y="152" width="192" height="59"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="18"/>
+ <color key="textColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </label>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <point key="canvasLocation" x="870" y="246"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="denied.png" width="240" height="160"/>
+ <image name="smallerBackground.png" width="480" height="320"/>
+ </resources>
+</document>
--- a/project_files/HedgewarsMobile/Classes/RestoreViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/RestoreViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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 {
@@ -32,18 +37,31 @@
if (theButton.tag != 0) {
[[AudioManagerController mainManager] playClickSound];
- [GameInterfaceBridge registerCallingController:self.parentViewController];
- [GameInterfaceBridge startSaveGame:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedGamePath"]];
+ [GameInterfaceBridge registerCallingController:self.presentingViewController];
+
+ // 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"];
[defaults synchronize];
}
- [self.parentViewController dismissModalViewControllerAnimated:YES];
+ [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
-(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];
}
--- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -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;
--- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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 {
@@ -68,7 +74,7 @@
if (button.tag == 0) {
[[AudioManagerController mainManager] playBackSound];
[self.tableView setEditing:NO animated:YES];
- [[self parentViewController] dismissModalViewControllerAnimated:YES];
+ [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
} else {
NSString *titleStr, *cancelStr, *confirmStr;
titleStr = NSLocalizedString(@"Are you reeeeeally sure?", @"");
@@ -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;
@@ -140,7 +144,7 @@
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width*60/100, 60)];
label.center = CGPointMake(self.tableView.frame.size.width/2, 30);
- label.textAlignment = UITextAlignmentCenter;
+ label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont italicSystemFontOfSize:16];
label.textColor = [UIColor lightGrayColor];
label.numberOfLines = 5;
@@ -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];
}
--- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib Fri Apr 01 15:36:19 2016 +0200
@@ -1,553 +1,56 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="7.10">
- <data>
- <int key="IBDocument.SystemTarget">1056</int>
- <string key="IBDocument.SystemVersion">10K549</string>
- <string key="IBDocument.InterfaceBuilderVersion">823</string>
- <string key="IBDocument.AppKitVersion">1038.36</string>
- <string key="IBDocument.HIToolboxVersion">461.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">132</string>
- </object>
- <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="7"/>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBProxyObject" id="841351856">
- <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- <object class="IBProxyObject" id="606714003">
- <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- <object class="IBUIView" id="766721923">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">292</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIToolbar" id="832454237">
- <reference key="NSNextResponder" ref="766721923"/>
- <int key="NSvFlags">290</int>
- <string key="NSFrameSize">{768, 44}</string>
- <reference key="NSSuperview" ref="766721923"/>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <int key="IBUITag">458912</int>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSMutableArray" key="IBUIItems">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIBarButtonItem" id="422926197">
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIStyle">1</int>
- <reference key="IBUIToolbar" ref="832454237"/>
- <int key="IBUISystemItemIdentifier">0</int>
- </object>
- <object class="IBUIBarButtonItem" id="881124109">
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <reference key="IBUIToolbar" ref="832454237"/>
- <int key="IBUISystemItemIdentifier">5</int>
- </object>
- <object class="IBUIBarButtonItem" id="882246004">
- <int key="IBUITag">1</int>
- <string key="IBUITitle">Clear All</string>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIStyle">1</int>
- <reference key="IBUIToolbar" ref="832454237"/>
- </object>
- </object>
- </object>
- <object class="IBUITableView" id="399289716">
- <reference key="NSNextResponder" ref="766721923"/>
- <int key="NSvFlags">274</int>
- <string key="NSFrame">{{0, 44}, {768, 724}}</string>
- <reference key="NSSuperview" ref="766721923"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MCAwAA</bytes>
- </object>
- <bool key="IBUIClipsSubviews">YES</bool>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <bool key="IBUIAlwaysBounceVertical">YES</bool>
- <int key="IBUIStyle">1</int>
- <int key="IBUISeparatorStyle">2</int>
- <int key="IBUISectionIndexMinimumDisplayRowCount">0</int>
- <bool key="IBUIShowsSelectionImmediatelyOnTouchBegin">YES</bool>
- <float key="IBUIRowHeight">44</float>
- <float key="IBUISectionHeaderHeight">10</float>
- <float key="IBUISectionFooterHeight">10</float>
- </object>
- </object>
- <string key="NSFrameSize">{768, 768}</string>
- <reference key="NSSuperview"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
- <int key="interfaceOrientation">3</int>
- </object>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- </object>
- </object>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="766721923"/>
- </object>
- <int key="connectionID">3</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonPressed:</string>
- <reference key="source" ref="422926197"/>
- <reference key="destination" ref="841351856"/>
- </object>
- <int key="connectionID">6</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">dataSource</string>
- <reference key="source" ref="399289716"/>
- <reference key="destination" ref="841351856"/>
- </object>
- <int key="connectionID">8</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="399289716"/>
- <reference key="destination" ref="841351856"/>
- </object>
- <int key="connectionID">9</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">tableView</string>
- <reference key="source" ref="841351856"/>
- <reference key="destination" ref="399289716"/>
- </object>
- <int key="connectionID">10</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">buttonPressed:</string>
- <reference key="source" ref="882246004"/>
- <reference key="destination" ref="841351856"/>
- </object>
- <int key="connectionID">17</int>
- </object>
- </object>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <reference key="object" ref="0"/>
- <reference key="children" ref="1000"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="841351856"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="606714003"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">2</int>
- <reference key="object" ref="766721923"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="832454237"/>
- <reference ref="399289716"/>
- </object>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">4</int>
- <reference key="object" ref="832454237"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="422926197"/>
- <reference ref="881124109"/>
- <reference ref="882246004"/>
- </object>
- <reference key="parent" ref="766721923"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">5</int>
- <reference key="object" ref="422926197"/>
- <reference key="parent" ref="832454237"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">7</int>
- <reference key="object" ref="399289716"/>
- <reference key="parent" ref="766721923"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">13</int>
- <reference key="object" ref="881124109"/>
- <reference key="parent" ref="832454237"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">15</int>
- <reference key="object" ref="882246004"/>
- <reference key="parent" ref="832454237"/>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.CustomClassName</string>
- <string>-2.CustomClassName</string>
- <string>13.IBPluginDependency</string>
- <string>15.IBPluginDependency</string>
- <string>2.IBEditorWindowLastContentRect</string>
- <string>2.IBPluginDependency</string>
- <string>4.IBPluginDependency</string>
- <string>5.IBPluginDependency</string>
- <string>7.IBPluginDependency</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>SavedGamesViewController</string>
- <string>UIResponder</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>{{467, 276}, {768, 768}}</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- </object>
- <nil key="sourceID"/>
- <int key="maxID">17</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">SavedGamesViewController</string>
- <string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <string key="NS.key.0">buttonPressed:</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <string key="NS.key.0">buttonPressed:</string>
- <object class="IBActionInfo" key="NS.object.0">
- <string key="name">buttonPressed:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="outlets">
- <string key="NS.key.0">tableView</string>
- <string key="NS.object.0">UITableView</string>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <string key="NS.key.0">tableView</string>
- <object class="IBToOneOutletInfo" key="NS.object.0">
- <string key="name">tableView</string>
- <string key="candidateClassName">UITableView</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/SavedGamesViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">Classes/ExtraCategories.h</string>
- </object>
- </object>
- </object>
- <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier" id="786211723">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIBarButtonItem</string>
- <string key="superclassName">UIBarItem</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIBarButtonItem.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIBarItem</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIBarItem.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIResponder</string>
- <string key="superclassName">NSObject</string>
- <reference key="sourceIdentifier" ref="786211723"/>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIScrollView</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIScrollView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchBar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UISearchDisplayController</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UITableView</string>
- <string key="superclassName">UIScrollView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITableView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIToolbar</string>
- <string key="superclassName">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIToolbar.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPrintFormatter.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIView</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">UIViewController</string>
- <string key="superclassName">UIResponder</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
- </object>
- </object>
- </object>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
- <integer value="1056" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
- <integer value="3100" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../Hedgewars.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <string key="IBCocoaTouchPluginVersion">132</string>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="9059" systemVersion="15B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9049"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SavedGamesViewController">
+ <connections>
+ <outlet property="clearAllButton" destination="15" id="txV-uc-ITF"/>
+ <outlet property="tableView" destination="7" id="10"/>
+ <outlet property="view" destination="2" id="3"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="768"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <toolbar clearsContextBeforeDrawing="NO" tag="458912" contentMode="scaleToFill" id="4">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="44"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+ <animations/>
+ <items>
+ <barButtonItem systemItem="done" id="5">
+ <connections>
+ <action selector="buttonPressed:" destination="-1" id="6"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="13"/>
+ <barButtonItem tag="1" title="Clear All" id="15">
+ <connections>
+ <action selector="buttonPressed:" destination="-1" id="17"/>
+ </connections>
+ </barButtonItem>
+ </items>
+ </toolbar>
+ <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="7">
+ <rect key="frame" x="0.0" y="44" width="768" height="724"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <animations/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ <connections>
+ <outlet property="dataSource" destination="-1" id="8"/>
+ <outlet property="delegate" destination="-1" id="9"/>
+ </connections>
+ </tableView>
+ </subviews>
+ <animations/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </view>
+ </objects>
+</document>
--- a/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -18,13 +18,10 @@
#import <UIKit/UIKit.h>
-
-
-@class SingleSchemeViewController;
+#import "TableViewControllerWithDoneButton.h"
-@interface SchemeSettingsViewController : UITableViewController {
+@interface SchemeSettingsViewController : TableViewControllerWithDoneButton {
NSMutableArray *listOfSchemes;
- SingleSchemeViewController *childController;
}
@property (nonatomic, retain) NSMutableArray *listOfSchemes;
--- a/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
}
--- a/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -20,6 +20,7 @@
#import "SchemeWeaponConfigViewController.h"
#import <QuartzCore/QuartzCore.h>
+#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;
}
@@ -125,6 +126,8 @@
} else {
UIImage *backgroundImage = [[UIImage alloc] initWithContentsOfFile:@"background~iphone.png"];
UIImageView *background = [[UIImageView alloc] initWithImage:backgroundImage];
+ background.contentMode = UIViewContentModeScaleAspectFill;
+ background.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[backgroundImage release];
[self.view addSubview:background];
[background release];
@@ -164,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.
@@ -203,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;
+ }
}
}
@@ -248,14 +268,14 @@
footer.backgroundColor = [UIColor clearColor];
footer.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, aTableView.frame.size.width*80/100, height)];
+ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, aTableView.frame.size.width*90/100, height)];
label.center = CGPointMake(aTableView.frame.size.width/2, height/2);
- label.textAlignment = UITextAlignmentCenter;
+ label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont italicSystemFontOfSize:12];
label.textColor = [UIColor whiteColor];
label.numberOfLines = 2;
label.backgroundColor = [UIColor clearColor];
- label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
+ label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
label.text = NSLocalizedString(@"Setting a Style might force a particular Scheme or Weapon configuration.",@"");
@@ -276,8 +296,8 @@
else
lastIndexPath = self.lastIndexPath_lu;
- int newRow = [indexPath row];
- int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
+ NSInteger newRow = [indexPath row];
+ NSInteger oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
if (newRow != oldRow) {
//TODO: this code works only for a single section table
@@ -297,7 +317,7 @@
if ([[settings objectForKey:@"sync_ws"] boolValue]) {
for (NSString *str in self.listOfWeapons) {
if ([str isEqualToString:self.selectedScheme]) {
- int row = [self.listOfSchemes indexOfObject:str];
+ NSInteger row = [self.listOfSchemes indexOfObject:str];
self.selectedWeapon = str;
self.lastIndexPath_we = [NSIndexPath indexPathForRow:row inSection:1];
break;
@@ -309,32 +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];
- } else {
- self.selectedScheme = [NSString stringWithFormat:@"%@.plist",scheme];
[self.topControl setEnabled:YES forSegmentAtIndex:0];
+
+ self.selectedWeapon = @"Default.plist";
+ [self.topControl setEnabled:YES forSegmentAtIndex:1];
}
-
- NSString *weapon = [scriptOptions objectAtIndex:1];
- if ([weapon isEqualToString:@"locked"]) {
- self.selectedWeapon = @"Default.plist";
- [self.topControl setEnabled:NO forSegmentAtIndex:1];
- } else {
- self.selectedWeapon = [NSString stringWithFormat:@"%@.plist",weapon];
- [self.topControl setEnabled:YES forSegmentAtIndex:1];
+ else
+ {
+ 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 = @"Default.plist";
+ [self.topControl setEnabled:NO forSegmentAtIndex:0];
+ }
+ 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 = @"Default.plist";
+ [self.topControl setEnabled:NO forSegmentAtIndex:1];
+ }
+ else
+ {
+ if (weapon && ![weapon isEqualToString:@"*"])
+ {
+ NSString *correctWeapon = [weapon stringByReplacingOccurrencesOfString:@"_" withString:@" "];
+ self.selectedWeapon = [NSString stringWithFormat:@"%@.plist", correctWeapon];
+ }
+ [self.topControl setEnabled:YES forSegmentAtIndex:1];
+ }
}
}
@@ -382,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;
@@ -400,7 +441,6 @@
}
-(void) viewDidUnload {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
self.listOfSchemes = nil;
self.listOfWeapons = nil;
self.listOfScripts = nil;
@@ -416,7 +456,9 @@
[super viewDidUnload];
}
--(void) dealloc {
+-(void) dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
releaseAndNil(listOfSchemes);
releaseAndNil(listOfWeapons);
releaseAndNil(listOfScripts);
--- a/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m Fri Apr 01 15:36:19 2016 +0200
@@ -69,20 +69,21 @@
#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;
}
-(void) serverProtocol {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ @autoreleasepool {
+
IPaddress ip;
BOOL clientQuit = NO;
char *buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE);
@@ -206,7 +207,7 @@
SDLNet_TCP_Close(self.ssd);
SDLNet_Quit();
- [pool release];
+ }
}
@end
--- a/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -19,29 +19,16 @@
#import <UIKit/UIKit.h>
-
-@class GeneralSettingsViewController;
-@class TeamSettingsViewController;
-@class WeaponSettingsViewController;
-@class SchemeSettingsViewController;
-@class SupportViewController;
-
@interface SettingsBaseViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITabBarControllerDelegate> {
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;
--- a/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -26,7 +26,7 @@
@implementation SettingsBaseViewController
-@synthesize tabController, targetController, controllerNames, lastIndexPath;
+@synthesize targetController, controllerNames, lastIndexPath;
-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return rotationManager(interfaceOrientation);
@@ -45,105 +45,40 @@
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 {
[[AudioManagerController mainManager] playBackSound];
- [[[HedgewarsAppDelegate sharedAppDelegate] mainViewController] dismissModalViewControllerAnimated:YES];
-}
-
--(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);
- }
+ [[[HedgewarsAppDelegate sharedAppDelegate] mainViewController] dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark -
@@ -197,40 +132,33 @@
#pragma mark -
#pragma mark Table view delegate
--(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- int newRow = [indexPath row];
- int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
+-(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
--- a/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.h Fri Sep 11 04:05:09 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 <vittorio.giovara@gmail.com>
- *
- * 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 <UIKit/UIKit.h>
-
-
-@class SettingsBaseViewController;
-@class MGSplitViewController;
-
-@interface SettingsContainerViewController : UIViewController {
- SettingsBaseViewController *baseController;
- MGSplitViewController *splitViewRootController;
-}
-
-@property (nonatomic,retain) SettingsBaseViewController *baseController;
-@property (nonatomic,retain) MGSplitViewController *splitViewRootController;
-
-@end
--- a/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.m Fri Sep 11 04:05:09 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 <vittorio.giovara@gmail.com>
- *
- * 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
--- a/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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;
@@ -190,7 +178,8 @@
[img release];
UILabel *cellLabel = (UILabel *)[cell.contentView viewWithTag:LABEL_TAG];
- cellLabel.text = [[self.basicSettingList objectAtIndex:row] objectForKey:@"title"];
+ NSString *basicSettingTitleKey = [[self.basicSettingList objectAtIndex:row] objectForKey:@"title"];
+ cellLabel.text = NSLocalizedStringFromTable(basicSettingTitleKey, @"Scheme", nil);
cellLabel.adjustsFontSizeToFitWidth = YES;
// can't use the viewWithTag method because row is dynamic
@@ -220,8 +209,7 @@
}
cellSlider.frame = CGRectMake(hOffset, vOffset, sliderLength, 23);
- NSString *prestring = nil;
- checkValueString(prestring,cellLabel.text,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)
@@ -251,8 +239,10 @@
[image release];
cell.imageView.layer.cornerRadius = 6.0f;
cell.imageView.layer.masksToBounds = YES;
- cell.textLabel.text = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"title"];
- cell.detailTextLabel.text = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"description"];
+ NSString *gameModTitleKey = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"title"];
+ cell.textLabel.text = NSLocalizedStringFromTable(gameModTitleKey, @"Scheme", nil);
+ NSString *gameModDescKey = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"description"];
+ cell.detailTextLabel.text = NSLocalizedStringFromTable(gameModDescKey, @"Scheme", nil);
cell.detailTextLabel.adjustsFontSizeToFitWidth = YES;
cell.detailTextLabel.minimumFontSize = 6;
@@ -277,14 +267,14 @@
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"];
- [array replaceObjectAtIndex:theSlider.tag-SLIDER_TAG withObject:[NSNumber numberWithInt:(NSInteger) theSlider.value]];
+ [array replaceObjectAtIndex:theSlider.tag-SLIDER_TAG withObject:[NSNumber numberWithInteger:theSlider.value]];
}
#pragma mark -
@@ -345,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 {
--- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -19,14 +19,6 @@
#import <UIKit/UIKit.h>
-
-@class HogHatViewController;
-@class GravesViewController;
-@class VoicesViewController;
-@class FortsViewController;
-@class FlagsViewController;
-@class LevelViewController;
-
@interface SingleTeamViewController : UITableViewController <EditableCellViewDelegate> {
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;
--- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
}
--- a/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -19,6 +19,10 @@
#import "SingleWeaponViewController.h"
+@interface SingleWeaponViewController ()
+@property (nonatomic, retain) NSString *trPath;
+@property (nonatomic, retain) NSString *trFileName;
+@end
@implementation SingleWeaponViewController
@synthesize weaponName, description, ammoStoreImage;
@@ -32,9 +36,10 @@
-(void) viewDidLoad {
[super viewDidLoad];
- NSString *trFilePath = [NSString stringWithFormat:@"%@/%@.txt",LOCALE_DIRECTORY(),[[NSLocale preferredLanguages] objectAtIndex:0]];
+ self.trPath = [NSString stringWithFormat:@"%@", LOCALE_DIRECTORY()];
+ self.trFileName = [NSString stringWithFormat:@"%@.txt", [HWUtils languageID]];
// fill the data structure that we are going to read
- LoadLocaleWrapper([trFilePath UTF8String]);
+ LoadLocaleWrapper([self.trPath UTF8String], [self.trFileName UTF8String]);
quantity = (char *)malloc(sizeof(char)*(HW_getNumberOfWeapons()+1));
probability = (char *)malloc(sizeof(char)*(HW_getNumberOfWeapons()+1));
@@ -261,6 +266,9 @@
-(void) dealloc {
+ releaseAndNil(_trPath);
+ releaseAndNil(_trFileName);
+
releaseAndNil(weaponName);
releaseAndNil(description);
releaseAndNil(ammoStoreImage);
--- a/project_files/HedgewarsMobile/Classes/SquareButtonView.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SquareButtonView.m Fri Apr 01 15:36:19 2016 +0200
@@ -61,7 +61,7 @@
-(void) selectColor:(NSUInteger) color {
if (color != self.selectedColor) {
self.selectedColor = color;
- self.colorIndex = [self.colorArray indexOfObject:[NSNumber numberWithUnsignedInt:color]];
+ self.colorIndex = [self.colorArray indexOfObject:[NSNumber numberWithUnsignedInteger:color]];
self.backgroundColor = [UIColor colorWithRed:((color & 0x00FF0000) >> 16)/255.0f
green:((color & 0x0000FF00) >> 8)/255.0f
--- a/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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";
@@ -44,13 +45,29 @@
aTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
aTableView.delegate = self;
aTableView.dataSource = self;
-
+
+ aTableView.rowHeight = 44;
+
[self.view addSubview:aTableView];
[aTableView release];
[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 {
@@ -90,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";
@@ -107,7 +124,7 @@
cell.accessoryView = imgView;
[imgView release];
- cell.textLabel.textAlignment = UITextAlignmentCenter;
+ cell.textLabel.textAlignment = NSTextAlignmentCenter;
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.backgroundColor = [UIColor blackColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
@@ -116,7 +133,7 @@
}
-(CGFloat) tableView:(UITableView *)aTableView heightForHeaderInSection:(NSInteger)section {
- return 160;
+ return (section == 0) ? 160 : 40;
}
-(UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section {
@@ -162,7 +179,7 @@
#pragma mark button delegate
-(void) dismissView {
[[AudioManagerController mainManager] playClickSound];
- [self dismissModalViewControllerAnimated:YES];
+ [self dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark -
--- a/project_files/HedgewarsMobile/Classes/SupportViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SupportViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -18,9 +18,9 @@
#import <UIKit/UIKit.h>
-
+#import "TableViewControllerWithDoneButton.h"
-@interface SupportViewController : UITableViewController {
+@interface SupportViewController : TableViewControllerWithDoneButton {
NSArray *waysToSupport;
}
--- a/project_files/HedgewarsMobile/Classes/SupportViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/SupportViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -18,7 +18,7 @@
#import "SupportViewController.h"
-
+#import "Appirater.h"
@implementation SupportViewController
@synthesize waysToSupport;
@@ -74,10 +74,10 @@
if (section == 0) {
imgName = @"star";
- cell.textLabel.textAlignment = UITextAlignmentCenter;
+ cell.textLabel.textAlignment = NSTextAlignmentCenter;
cell.imageView.image = nil;
} else {
- cell.textLabel.textAlignment = UITextAlignmentLeft;
+ cell.textLabel.textAlignment = NSTextAlignmentLeft;
switch (row) {
case 0:
imgName = @"fb";
@@ -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 {
@@ -153,8 +160,8 @@
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.textAlignment = NSTextAlignmentCenter;
+ 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 -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/TableViewControllerWithDoneButton.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,23 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <UIKit/UIKit.h>
+
+@interface TableViewControllerWithDoneButton : UITableViewController
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/TableViewControllerWithDoneButton.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,52 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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
--- a/project_files/HedgewarsMobile/Classes/TeamConfigViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/TeamConfigViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -45,6 +45,8 @@
} else {
UIImage *backgroundImage = [[UIImage alloc] initWithContentsOfFile:@"background~iphone.png"];
UIImageView *background = [[UIImageView alloc] initWithImage:backgroundImage];
+ background.contentMode = UIViewContentModeScaleAspectFill;
+ background.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[backgroundImage release];
[self.view addSubview:background];
[background release];
@@ -192,23 +194,23 @@
}
-(CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
- return IS_IPAD() ? 40 : 20;
+ return IS_IPAD() ? 40 : 30;
}
-(UIView *)tableView:(UITableView *)aTableView viewForFooterInSection:(NSInteger) section {
- NSInteger height = IS_IPAD() ? 40 : 20;
+ NSInteger height = IS_IPAD() ? 40 : 30;
UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, aTableView.frame.size.width, height)];
footer.backgroundColor = [UIColor clearColor];
footer.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, aTableView.frame.size.width*80/100, height)];
+ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, aTableView.frame.size.width*90/100, height)];
label.center = CGPointMake(aTableView.frame.size.width/2, height/2);
- label.textAlignment = UITextAlignmentCenter;
+ label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont italicSystemFontOfSize:12];
label.textColor = [UIColor whiteColor];
label.numberOfLines = 2;
label.backgroundColor = [UIColor clearColor];
- label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
+ label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
if (section == 0)
label.text = NSLocalizedString(@"Tap to add hogs or change color, touch and hold to remove a team.",@"");
@@ -245,7 +247,7 @@
SquareButtonView *squareButton = (SquareButtonView *)cell.accessoryView;
NSInteger increaseNumber = [[selectedRow objectForKey:@"number"] intValue] + 1;
- NSNumber *newNumber = [NSNumber numberWithInt:[self filterNumberOfHogs:increaseNumber]];
+ NSNumber *newNumber = [NSNumber numberWithInteger:[self filterNumberOfHogs:increaseNumber]];
[squareButton setTitle:[newNumber stringValue] forState:UIControlStateNormal];
[selectedRow setObject:newNumber forKey:@"number"];
--- a/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -18,13 +18,10 @@
#import <UIKit/UIKit.h>
-
-
-@class SingleTeamViewController;
+#import "TableViewControllerWithDoneButton.h"
-@interface TeamSettingsViewController : UITableViewController {
+@interface TeamSettingsViewController : TableViewControllerWithDoneButton {
NSMutableArray *listOfTeams;
- SingleTeamViewController *childController;
}
@property (nonatomic, retain) NSMutableArray *listOfTeams;
--- a/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/UITableViewCell+FindTable.h Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,25 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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 <UIKit/UIKit.h>
+
+@interface UITableViewCell (FindTable)
+
+- (UITableView *)findTable;
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/UITableViewCell+FindTable.m Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,39 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2015 Anton Malmygin <antonc27@mail.ru>
+ *
+ * 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
--- a/project_files/HedgewarsMobile/Classes/VoicesViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/VoicesViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -32,7 +32,6 @@
#pragma mark View lifecycle
-(void) viewDidLoad {
[super viewDidLoad];
- srandom(time(NULL));
voiceBeingPlayed = NULL;
@@ -104,8 +103,8 @@
#pragma mark -
#pragma mark Table view delegate
-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- int newRow = [indexPath row];
- int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
+ NSInteger newRow = [indexPath row];
+ NSInteger oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
if (newRow != oldRow) {
[teamDictionary setObject:[voiceArray objectAtIndex:newRow] forKey:@"voicepack"];
@@ -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];
--- a/project_files/HedgewarsMobile/Classes/WeaponCellView.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/WeaponCellView.m Fri Apr 01 15:36:19 2016 +0200
@@ -81,27 +81,27 @@
initialLab = [[UILabel alloc] init];
initialLab.backgroundColor = [UIColor clearColor];
initialLab.textColor = [UIColor grayColor];
- initialLab.textAlignment = UITextAlignmentCenter;
+ initialLab.textAlignment = NSTextAlignmentCenter;
probabilityLab = [[UILabel alloc] init];
probabilityLab.backgroundColor = [UIColor clearColor];
probabilityLab.textColor = [UIColor grayColor];
- probabilityLab.textAlignment = UITextAlignmentCenter;
+ probabilityLab.textAlignment = NSTextAlignmentCenter;
delayLab = [[UILabel alloc] init];
delayLab.backgroundColor = [UIColor clearColor];
delayLab.textColor = [UIColor grayColor];
- delayLab.textAlignment = UITextAlignmentCenter;
+ delayLab.textAlignment = NSTextAlignmentCenter;
crateLab = [[UILabel alloc] init];
crateLab.backgroundColor = [UIColor clearColor];
crateLab.textColor = [UIColor grayColor];
- crateLab.textAlignment = UITextAlignmentCenter;
+ crateLab.textAlignment = NSTextAlignmentCenter;
helpLabel = [[UILabel alloc] init];
helpLabel.backgroundColor = [UIColor clearColor];
helpLabel.textColor = [UIColor darkGrayColor];
- helpLabel.textAlignment = UITextAlignmentRight;
+ helpLabel.textAlignment = NSTextAlignmentRight;
helpLabel.font = [UIFont italicSystemFontOfSize:[UIFont systemFontSize]];
helpLabel.adjustsFontSizeToFitWidth = YES;
@@ -200,10 +200,10 @@
crateLab.text = ((int)crateSli.value == 9) ? @"∞" : [NSString stringWithFormat:@"%d",(int)crateSli.value];
[delegate updateValues:[NSArray arrayWithObjects:
- [NSNumber numberWithInt:(int)initialSli.value],
- [NSNumber numberWithInt:(int)probabilitySli.value],
- [NSNumber numberWithInt:(int)delaySli.value],
- [NSNumber numberWithInt:(int)crateSli.value], nil]
+ [NSNumber numberWithInteger:initialSli.value],
+ [NSNumber numberWithInteger:probabilitySli.value],
+ [NSNumber numberWithInteger:delaySli.value],
+ [NSNumber numberWithInteger:crateSli.value], nil]
atIndex:self.tag];
} else
DLog(@"error - delegate = nil!");
--- a/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.h Fri Apr 01 15:36:19 2016 +0200
@@ -18,13 +18,10 @@
#import <UIKit/UIKit.h>
-
-
-@class SingleWeaponViewController;
+#import "TableViewControllerWithDoneButton.h"
-@interface WeaponSettingsViewController : UITableViewController {
+@interface WeaponSettingsViewController : TableViewControllerWithDoneButton {
NSMutableArray *listOfWeapons;
- SingleWeaponViewController *childController;
}
@property (nonatomic, retain) NSMutableArray *listOfWeapons;
--- a/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Fri Apr 01 15:36:19 2016 +0200
@@ -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];
}
Binary file project_files/HedgewarsMobile/Default-568h@2x.png has changed
--- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Fri Apr 01 15:36:19 2016 +0200
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 45;
+ objectVersion = 46;
objects = {
/* Begin PBXAggregateTarget section */
@@ -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,58 @@
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 */; };
+ F60ACBB71C7BC08B00385701 /* IniParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F60ACBB61C7BC08B00385701 /* IniParser.m */; };
+ 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 */; };
+ F6338CC81C7A53C100353945 /* CampaignsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F6338CC61C7A53C100353945 /* CampaignsViewController.m */; };
+ F6338CC91C7A53C100353945 /* CampaignsViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6338CC71C7A53C100353945 /* CampaignsViewController-iPhone.xib */; };
+ F6338CCC1C7A542C00353945 /* CampaignsViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6338CCB1C7A542C00353945 /* CampaignsViewController-iPad.xib */; };
+ F6338CD81C7A702B00353945 /* CampaignViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F6338CD61C7A702B00353945 /* CampaignViewController.m */; };
+ F6338CD91C7A702B00353945 /* CampaignViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6338CD71C7A702B00353945 /* CampaignViewController-iPhone.xib */; };
+ F6338CDB1C7A709600353945 /* CampaignViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6338CDA1C7A709600353945 /* CampaignViewController-iPad.xib */; };
+ 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 */; };
+ F65725001B7E784700A86262 /* helpplain.png in Resources */ = {isa = PBXBuildFile; fileRef = F65724FB1B7E784700A86262 /* helpplain.png */; };
+ F65725011B7E784700A86262 /* helpright.png in Resources */ = {isa = PBXBuildFile; fileRef = F65724FC1B7E784700A86262 /* helpright.png */; };
+ 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 */; };
+ F6D7E0C41B768F19004F3BCF /* uLandUtils.pas in Sources */ = {isa = PBXBuildFile; fileRef = F6D7E0C11B768F19004F3BCF /* uLandUtils.pas */; };
+ F6D7E0C61B769819004F3BCF /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F6D7E0C51B769819004F3BCF /* CoreMotion.framework */; };
+ F6D7E0C81B7698BF004F3BCF /* libstdc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F6D7E0C71B7698BE004F3BCF /* libstdc++.dylib */; };
+ 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 */
@@ -416,9 +466,6 @@
61177BA7148A658900686905 /* German */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = German; path = Locale/German.lproj/Localizable.strings; sourceTree = "<group>"; };
61177BA9148A660C00686905 /* German */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = German; path = Locale/German.lproj/Scheme.strings; sourceTree = "<group>"; };
61177BAA148A661600686905 /* German */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = German; path = Locale/German.lproj/About.strings; sourceTree = "<group>"; };
- 61177BAC148A671600686905 /* Turkish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Turkish; path = Locale/Turkish.lproj/About.strings; sourceTree = "<group>"; };
- 61177BAD148A672000686905 /* Turkish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Turkish; path = Locale/Turkish.lproj/Localizable.strings; sourceTree = "<group>"; };
- 61177BAE148A672C00686905 /* Turkish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Turkish; path = Locale/Turkish.lproj/Scheme.strings; sourceTree = "<group>"; };
61177BE4148B881C00686905 /* Danish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Danish; path = Locale/Danish.lproj/About.strings; sourceTree = "<group>"; };
61177BF0148B882500686905 /* Danish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Danish; path = Locale/Danish.lproj/Localizable.strings; sourceTree = "<group>"; };
61177BF1148B882F00686905 /* Danish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Danish; path = Locale/Danish.lproj/Scheme.strings; sourceTree = "<group>"; };
@@ -493,8 +540,6 @@
616591FF11CA9BA200D6E256 /* SingleSchemeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SingleSchemeViewController.m; sourceTree = "<group>"; };
6165920011CA9BA200D6E256 /* SingleTeamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SingleTeamViewController.h; sourceTree = "<group>"; };
6165920111CA9BA200D6E256 /* SingleTeamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SingleTeamViewController.m; sourceTree = "<group>"; };
- 6165920211CA9BA200D6E256 /* SettingsContainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsContainerViewController.h; sourceTree = "<group>"; };
- 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsContainerViewController.m; sourceTree = "<group>"; };
6165920411CA9BA200D6E256 /* TeamConfigViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TeamConfigViewController.h; sourceTree = "<group>"; };
6165920511CA9BA200D6E256 /* TeamConfigViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TeamConfigViewController.m; sourceTree = "<group>"; };
6165920611CA9BA200D6E256 /* TeamSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TeamSettingsViewController.h; sourceTree = "<group>"; };
@@ -638,8 +683,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 = "<group>"; };
- 61AC067312B2E32D000B52A2 /* Appirater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Appirater.m; path = Classes/Appirater.m; sourceTree = "<group>"; };
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; };
@@ -695,6 +738,74 @@
61F904D611DF7DA30068B24D /* WeaponCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WeaponCellView.m; path = Classes/WeaponCellView.m; sourceTree = "<group>"; };
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
928301170F10CAFC00CC5A3C /* libfpc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfpc.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ F60ACBB51C7BC08B00385701 /* IniParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IniParser.h; path = Classes/IniParser.h; sourceTree = "<group>"; };
+ F60ACBB61C7BC08B00385701 /* IniParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IniParser.m; path = Classes/IniParser.m; sourceTree = "<group>"; };
+ F60D04631BD137B5003ACB00 /* bullet_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = bullet_filled.png; path = Resources/Icons/bullet_filled.png; sourceTree = "<group>"; };
+ F60D04641BD137B5003ACB00 /* bullet_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bullet_filled@2x.png"; path = "Resources/Icons/bullet_filled@2x.png"; sourceTree = "<group>"; };
+ F60D04651BD137B5003ACB00 /* bullet.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = bullet.png; path = Resources/Icons/bullet.png; sourceTree = "<group>"; };
+ F60D04661BD137B5003ACB00 /* bullet@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bullet@2x.png"; path = "Resources/Icons/bullet@2x.png"; sourceTree = "<group>"; };
+ F60D04671BD137B5003ACB00 /* flower_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = flower_filled.png; path = Resources/Icons/flower_filled.png; sourceTree = "<group>"; };
+ F60D04681BD137B5003ACB00 /* flower_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "flower_filled@2x.png"; path = "Resources/Icons/flower_filled@2x.png"; sourceTree = "<group>"; };
+ F60D04691BD137B5003ACB00 /* flower.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = flower.png; path = Resources/Icons/flower.png; sourceTree = "<group>"; };
+ F60D046A1BD137B5003ACB00 /* flower@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "flower@2x.png"; path = "Resources/Icons/flower@2x.png"; sourceTree = "<group>"; };
+ F60D046B1BD137B5003ACB00 /* heart_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = heart_filled.png; path = Resources/Icons/heart_filled.png; sourceTree = "<group>"; };
+ F60D046C1BD137B5003ACB00 /* heart_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "heart_filled@2x.png"; path = "Resources/Icons/heart_filled@2x.png"; sourceTree = "<group>"; };
+ F60D046D1BD137B5003ACB00 /* heart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = heart.png; path = Resources/Icons/heart.png; sourceTree = "<group>"; };
+ F60D046E1BD137B5003ACB00 /* heart@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "heart@2x.png"; path = "Resources/Icons/heart@2x.png"; sourceTree = "<group>"; };
+ F60D046F1BD137B5003ACB00 /* target_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = target_filled.png; path = Resources/Icons/target_filled.png; sourceTree = "<group>"; };
+ F60D04701BD137B5003ACB00 /* target_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "target_filled@2x.png"; path = "Resources/Icons/target_filled@2x.png"; sourceTree = "<group>"; };
+ F60D04711BD137B5003ACB00 /* target.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = target.png; path = Resources/Icons/target.png; sourceTree = "<group>"; };
+ F60D04721BD137B5003ACB00 /* target@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "target@2x.png"; path = "Resources/Icons/target@2x.png"; sourceTree = "<group>"; };
+ F60D04731BD137B5003ACB00 /* teams_filled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = teams_filled.png; path = Resources/Icons/teams_filled.png; sourceTree = "<group>"; };
+ F60D04741BD137B5003ACB00 /* teams_filled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "teams_filled@2x.png"; path = "Resources/Icons/teams_filled@2x.png"; sourceTree = "<group>"; };
+ F60D04751BD137B5003ACB00 /* teams.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = teams.png; path = Resources/Icons/teams.png; sourceTree = "<group>"; };
+ F60D04761BD137B5003ACB00 /* teams@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "teams@2x.png"; path = "Resources/Icons/teams@2x.png"; sourceTree = "<group>"; };
+ F6338CC51C7A53C100353945 /* CampaignsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CampaignsViewController.h; sourceTree = "<group>"; };
+ F6338CC61C7A53C100353945 /* CampaignsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CampaignsViewController.m; sourceTree = "<group>"; };
+ F6338CC71C7A53C100353945 /* CampaignsViewController-iPhone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CampaignsViewController-iPhone.xib"; sourceTree = "<group>"; };
+ F6338CCB1C7A542C00353945 /* CampaignsViewController-iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CampaignsViewController-iPad.xib"; sourceTree = "<group>"; };
+ F6338CD51C7A702B00353945 /* CampaignViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CampaignViewController.h; sourceTree = "<group>"; };
+ F6338CD61C7A702B00353945 /* CampaignViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CampaignViewController.m; sourceTree = "<group>"; };
+ F6338CD71C7A702B00353945 /* CampaignViewController-iPhone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CampaignViewController-iPhone.xib"; sourceTree = "<group>"; };
+ F6338CDA1C7A709600353945 /* CampaignViewController-iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CampaignViewController-iPad.xib"; sourceTree = "<group>"; };
+ F6448CE11BD2E00500C31C8C /* TableViewControllerWithDoneButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableViewControllerWithDoneButton.h; sourceTree = "<group>"; };
+ F6448CE21BD2E00500C31C8C /* TableViewControllerWithDoneButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableViewControllerWithDoneButton.m; sourceTree = "<group>"; };
+ F65724F81B7E784700A86262 /* helpabove.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpabove.png; sourceTree = "<group>"; };
+ F65724F91B7E784700A86262 /* helpbottom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpbottom.png; sourceTree = "<group>"; };
+ F65724FA1B7E784700A86262 /* helpleft.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpleft.png; sourceTree = "<group>"; };
+ F65724FB1B7E784700A86262 /* helpplain.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpplain.png; sourceTree = "<group>"; };
+ F65724FC1B7E784700A86262 /* helpright.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = helpright.png; sourceTree = "<group>"; };
+ F65725291B7EB9CC00A86262 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Locale/ru.lproj/About.strings; sourceTree = "<group>"; };
+ F657252A1B7EB9CC00A86262 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Locale/ru.lproj/Localizable.strings; sourceTree = "<group>"; };
+ F657252B1B7EB9CC00A86262 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Locale/ru.lproj/Scheme.strings; sourceTree = "<group>"; };
+ F65E1DBC1B9B95A400A78ADF /* Icon-60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-60@2x.png"; path = "Resources/Icons/Icon-60@2x.png"; sourceTree = "<group>"; };
+ F65E1DBD1B9B95A400A78ADF /* Icon-76.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-76.png"; path = "Resources/Icons/Icon-76.png"; sourceTree = "<group>"; };
+ F65E1DBE1B9B95A400A78ADF /* Icon-76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-76@2x.png"; path = "Resources/Icons/Icon-76@2x.png"; sourceTree = "<group>"; };
+ F6756D7E1BD8550500B6AB6B /* LabelWithIBLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LabelWithIBLocalization.h; sourceTree = "<group>"; };
+ F6756D7F1BD8550500B6AB6B /* LabelWithIBLocalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LabelWithIBLocalization.m; sourceTree = "<group>"; };
+ F67FC80F1BEC06E700A9DC75 /* Appirater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Appirater.h; sourceTree = "<group>"; };
+ F67FC8101BEC06E700A9DC75 /* Appirater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Appirater.m; sourceTree = "<group>"; };
+ F67FC8111BEC06E700A9DC75 /* AppiraterDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppiraterDelegate.h; sourceTree = "<group>"; };
+ 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 = "<group>"; };
+ F67FC81F1BEC280D00A9DC75 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Locale/tr.lproj/About.strings; sourceTree = "<group>"; };
+ F67FC8201BEC280D00A9DC75 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Locale/tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+ F67FC8211BEC280D00A9DC75 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Locale/tr.lproj/Scheme.strings; sourceTree = "<group>"; };
+ F6BA38441BA7A834005D16EA /* GameLogViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameLogViewController.h; sourceTree = "<group>"; };
+ F6BA38451BA7A834005D16EA /* GameLogViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GameLogViewController.m; sourceTree = "<group>"; };
+ F6D7E09E1B76884E004F3BCF /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ F6D7E0BF1B768F19004F3BCF /* uLandGenPerlin.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uLandGenPerlin.pas; path = ../../hedgewars/uLandGenPerlin.pas; sourceTree = "<group>"; };
+ F6D7E0C01B768F19004F3BCF /* uLandGenTemplateBased.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uLandGenTemplateBased.pas; path = ../../hedgewars/uLandGenTemplateBased.pas; sourceTree = "<group>"; };
+ F6D7E0C11B768F19004F3BCF /* uLandUtils.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uLandUtils.pas; path = ../../hedgewars/uLandUtils.pas; sourceTree = "<group>"; };
+ F6D7E0C51B769819004F3BCF /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
+ F6D7E0C71B7698BE004F3BCF /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; };
+ F6F07BDA1B7E72D40010E48F /* HelpPageLobbyViewController-iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "HelpPageLobbyViewController-iPad.xib"; sourceTree = "<group>"; };
+ F6F07BDB1B7E72D40010E48F /* HelpPageLobbyViewController-iPhone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "HelpPageLobbyViewController-iPhone.xib"; sourceTree = "<group>"; };
+ F6F07BDC1B7E72D40010E48F /* HelpPageLobbyViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpPageLobbyViewController.h; sourceTree = "<group>"; };
+ F6F07BDD1B7E72D40010E48F /* HelpPageLobbyViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HelpPageLobbyViewController.m; sourceTree = "<group>"; };
+ F6F7DA8D1BE18F5700432EA7 /* UITableViewCell+FindTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UITableViewCell+FindTable.h"; path = "Classes/UITableViewCell+FindTable.h"; sourceTree = "<group>"; };
+ F6F7DA8E1BE18F5700432EA7 /* UITableViewCell+FindTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UITableViewCell+FindTable.m"; path = "Classes/UITableViewCell+FindTable.m"; sourceTree = "<group>"; };
+ 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 */
@@ -702,6 +813,10 @@
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 */,
617D795716D9345F0091D4D6 /* libPhyslayer.a in Frameworks */,
922F64900F10F53100DC6EC0 /* libfpc.a in Frameworks */,
@@ -779,8 +894,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 */,
@@ -794,6 +908,7 @@
29B97317FDCFA39411CA2CEA /* Resources */ = {
isa = PBXGroup;
children = (
+ F6D7E09E1B76884E004F3BCF /* Default-568h@2x.png */,
6129B9F611EFB04D0017E305 /* denied.png */,
6167C88B14294738003DD50F /* denied@2x.png */,
6199E86C12464A8E00DADF8C /* surprise.png */,
@@ -814,6 +929,8 @@
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
+ F67FC8131BEC072B00A9DC75 /* StoreKit.framework */,
+ F6FF25A11BB8AEE300124053 /* GameController.framework */,
617D78D816D932310091D4D6 /* Physfs.xcodeproj */,
617D794316D933B00091D4D6 /* Physlayer.xcodeproj */,
6195993F1364C82B00B429B6 /* Lua.xcodeproj */,
@@ -822,6 +939,7 @@
61A19C1E14D20F51004B1E6D /* SDL_mixer.xcodeproj */,
61A19BF414D20D83004B1E6D /* SDL_net.xcodeproj */,
61A19BC114D20CDA004B1E6D /* SDL_ttf.xcodeproj */,
+ F6D7E0C71B7698BE004F3BCF /* libstdc++.dylib */,
61798934114AB25F00BA94A9 /* AudioToolbox.framework */,
612CABAA1391CE68005E9596 /* AVFoundation.framework */,
61A117FE1168322700359010 /* CoreGraphics.framework */,
@@ -833,6 +951,7 @@
61272338117DF778005B90CF /* MobileCoreServices.framework */,
6199E81512463EA800DADF8C /* CFNetwork.framework */,
6199E81912463EC400DADF8C /* SystemConfiguration.framework */,
+ F6D7E0C51B769819004F3BCF /* CoreMotion.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -853,6 +972,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 */,
@@ -866,6 +987,7 @@
61915D59143A4E2C00299991 /* MissionTrainingViewController.m */,
61915D5A143A4E2C00299991 /* MissionTrainingViewController-iPhone.xib */,
61077E86143FB09800645B29 /* MissionTrainingViewController-iPad.xib */,
+ F6338CDC1C7A721B00353945 /* Campaigns */,
);
name = "Satellite Controllers";
sourceTree = "<group>";
@@ -898,8 +1020,6 @@
6163EE4C11CC2478001C0453 /* Settings Page */ = {
isa = PBXGroup;
children = (
- 6165920211CA9BA200D6E256 /* SettingsContainerViewController.h */,
- 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */,
616591F411CA9BA200D6E256 /* SettingsBaseViewController.h */,
616591F511CA9BA200D6E256 /* SettingsBaseViewController.m */,
6163EE4E11CC248D001C0453 /* First Level */,
@@ -924,6 +1044,12 @@
616591F311CA9BA200D6E256 /* MapConfigViewController.m */,
6165924D11CA9CB400D6E256 /* MapConfigViewController-iPad.xib */,
6165924E11CA9CB400D6E256 /* MapConfigViewController-iPhone.xib */,
+ F6F07BDC1B7E72D40010E48F /* HelpPageLobbyViewController.h */,
+ F6F07BDD1B7E72D40010E48F /* HelpPageLobbyViewController.m */,
+ F6F07BDA1B7E72D40010E48F /* HelpPageLobbyViewController-iPad.xib */,
+ F6F07BDB1B7E72D40010E48F /* HelpPageLobbyViewController-iPhone.xib */,
+ F6756D7E1BD8550500B6AB6B /* LabelWithIBLocalization.h */,
+ F6756D7F1BD8550500B6AB6B /* LabelWithIBLocalization.m */,
);
name = "Game Configuration";
sourceTree = "<group>";
@@ -931,6 +1057,8 @@
6163EE4E11CC248D001C0453 /* First Level */ = {
isa = PBXGroup;
children = (
+ F6448CE11BD2E00500C31C8C /* TableViewControllerWithDoneButton.h */,
+ F6448CE21BD2E00500C31C8C /* TableViewControllerWithDoneButton.m */,
616591E811CA9BA200D6E256 /* GeneralSettingsViewController.h */,
616591E911CA9BA200D6E256 /* GeneralSettingsViewController.m */,
6165920611CA9BA200D6E256 /* TeamSettingsViewController.h */,
@@ -1069,6 +1197,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 */,
@@ -1083,6 +1213,7 @@
61F7A42811E2905C0040BA66 /* Icons */ = {
isa = PBXGroup;
children = (
+ F60D04611BD1378F003ACB00 /* Tabbar */,
61F2E7EB12060E31005734F7 /* checkbox.png */,
615FEAD912A2A4C10098EE92 /* checkbox@2x.png */,
61D3D2A41290E03A003CE7C3 /* irc.png */,
@@ -1120,6 +1251,9 @@
61F7A43411E290650040BA66 /* Icon-Small@2x.png */,
61F7A43511E290650040BA66 /* Icon.png */,
61F7A43611E290650040BA66 /* Icon@2x.png */,
+ F65E1DBC1B9B95A400A78ADF /* Icon-60@2x.png */,
+ F65E1DBD1B9B95A400A78ADF /* Icon-76.png */,
+ F65E1DBE1B9B95A400A78ADF /* Icon-76@2x.png */,
61F7A43711E290650040BA66 /* iTunesArtwork.png */,
);
name = Icons;
@@ -1140,6 +1274,8 @@
6165922611CA9BD500D6E256 /* HWUtils.m */,
6165922C11CA9BD500D6E256 /* UIImageExtra.h */,
6165922D11CA9BD500D6E256 /* UIImageExtra.m */,
+ F60ACBB51C7BC08B00385701 /* IniParser.h */,
+ F60ACBB61C7BC08B00385701 /* IniParser.m */,
);
name = Helpers;
sourceTree = "<group>";
@@ -1172,6 +1308,7 @@
6172FEEC1298D25D00D73365 /* smallerBackground@2x~iphone.png */,
6172FEEE1298D25D00D73365 /* smallerBackground~iphone.png */,
6172FEED1298D25D00D73365 /* smallerBackground~ipad.png */,
+ F65724F71B7E784700A86262 /* Help Bubbles */,
);
name = Frontend;
sourceTree = "<group>";
@@ -1229,10 +1366,13 @@
617987FC114AA34C00BA94A9 /* uGears.pas */,
617987FD114AA34C00BA94A9 /* uIO.pas */,
617987FF114AA34C00BA94A9 /* uLand.pas */,
+ F6D7E0BF1B768F19004F3BCF /* uLandGenPerlin.pas */,
+ F6D7E0C01B768F19004F3BCF /* uLandGenTemplateBased.pas */,
61798800114AA34C00BA94A9 /* uLandGraphics.pas */,
61798801114AA34C00BA94A9 /* uLandObjects.pas */,
61798802114AA34C00BA94A9 /* uLandTemplates.pas */,
61798803114AA34C00BA94A9 /* uLandTexture.pas */,
+ F6D7E0C11B768F19004F3BCF /* uLandUtils.pas */,
61798804114AA34C00BA94A9 /* uLocale.pas */,
61798805114AA34C00BA94A9 /* uMisc.pas */,
61798806114AA34C00BA94A9 /* uRandom.pas */,
@@ -1247,6 +1387,73 @@
name = "Pascal Sources";
sourceTree = "<group>";
};
+ 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 = "<group>";
+ };
+ F6338CDC1C7A721B00353945 /* Campaigns */ = {
+ isa = PBXGroup;
+ children = (
+ F6338CC51C7A53C100353945 /* CampaignsViewController.h */,
+ F6338CC61C7A53C100353945 /* CampaignsViewController.m */,
+ F6338CC71C7A53C100353945 /* CampaignsViewController-iPhone.xib */,
+ F6338CCB1C7A542C00353945 /* CampaignsViewController-iPad.xib */,
+ F6338CD51C7A702B00353945 /* CampaignViewController.h */,
+ F6338CD61C7A702B00353945 /* CampaignViewController.m */,
+ F6338CD71C7A702B00353945 /* CampaignViewController-iPhone.xib */,
+ F6338CDA1C7A709600353945 /* CampaignViewController-iPad.xib */,
+ );
+ name = Campaigns;
+ sourceTree = "<group>";
+ };
+ F65724F71B7E784700A86262 /* Help Bubbles */ = {
+ isa = PBXGroup;
+ children = (
+ F65724F81B7E784700A86262 /* helpabove.png */,
+ F65724F91B7E784700A86262 /* helpbottom.png */,
+ F65724FA1B7E784700A86262 /* helpleft.png */,
+ F65724FB1B7E784700A86262 /* helpplain.png */,
+ F65724FC1B7E784700A86262 /* helpright.png */,
+ );
+ name = "Help Bubbles";
+ path = "Resources/Frontend/Help Bubbles";
+ sourceTree = "<group>";
+ };
+ F67FC80E1BEC06E700A9DC75 /* Appirater */ = {
+ isa = PBXGroup;
+ children = (
+ F67FC80F1BEC06E700A9DC75 /* Appirater.h */,
+ F67FC8101BEC06E700A9DC75 /* Appirater.m */,
+ F67FC8111BEC06E700A9DC75 /* AppiraterDelegate.h */,
+ F67FC8151BEC17AC00A9DC75 /* Appirater.bundle */,
+ );
+ name = Appirater;
+ path = Classes/Appirater;
+ sourceTree = "<group>";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -1301,9 +1508,10 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 0710;
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Hedgewars" */;
- compatibilityVersion = "Xcode 3.1";
+ compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
@@ -1319,6 +1527,8 @@
Bulgarian,
Portuguese,
Romanian,
+ ru,
+ tr,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
projectDirPath = "";
@@ -1433,28 +1643,45 @@
61370653117B1D50004EE44A /* Entitlements-Distribution.plist in Resources */,
611E12FF117BBBDA0044B62F /* Entitlements-Development.plist in Resources */,
6165925311CA9CB400D6E256 /* MainMenuViewController-iPad.xib in Resources */,
+ F6338CCC1C7A542C00353945 /* CampaignsViewController-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 */,
+ F6338CDB1C7A709600353945 /* CampaignViewController-iPad.xib 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 */,
611D9BFC12497E9800008271 /* SavedGamesViewController.xib in Resources */,
6147DAD31253DCDE0010357E /* savesButton.png in Resources */,
610D5FB21270E2660033333A /* Icon-Small@2x.png in Resources */,
+ F6F07BDF1B7E72D40010E48F /* HelpPageLobbyViewController-iPhone.xib in Resources */,
610D5FB31270E26C0033333A /* Icon@2x.png in Resources */,
+ F65E1DC01B9B95A400A78ADF /* Icon-76.png in Resources */,
61A670C012747D9B00B06CE7 /* Default.png in Resources */,
61A670C112747DB900B06CE7 /* MainMenuViewController-iPhone.xib in Resources */,
61A670C212747DBD00B06CE7 /* MapConfigViewController-iPhone.xib in Resources */,
@@ -1462,17 +1689,27 @@
61E2F7451283752C00E12521 /* tw.png in Resources */,
61808A5D128C930A005D0E2F /* backSound.caf in Resources */,
61D3D2A51290E03A003CE7C3 /* irc.png in Resources */,
+ F6338CC91C7A53C100353945 /* CampaignsViewController-iPhone.xib in Resources */,
6172FED91298CF9800D73365 /* background~iphone.png in Resources */,
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 */,
61188BF712A6FE5A0026C5DA /* backButton@2x.png in Resources */,
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 */,
@@ -1481,10 +1718,16 @@
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 */,
+ F6338CD91C7A702B00353945 /* CampaignViewController-iPhone.xib in Resources */,
61188C0712A6FE960026C5DA /* settingsButton@2x.png in Resources */,
61188C0812A6FE9A0026C5DA /* title@2x~iphone.png in Resources */,
+ F65724FF1B7E784700A86262 /* helpleft.png in Resources */,
61188C0912A6FE9C0026C5DA /* tw@2x.png in Resources */,
6174F7C812CD62E300205D6F /* smallerTitle.png in Resources */,
+ F65725011B7E784700A86262 /* helpright.png in Resources */,
6174F7C912CD62E300205D6F /* smallerTitle@2x.png in Resources */,
6167A6771391514600AA6D07 /* RestoreViewController-iPhone.xib in Resources */,
6167A72D13919E6800AA6D07 /* RestoreViewController-iPad.xib in Resources */,
@@ -1496,12 +1739,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 */,
@@ -1553,7 +1799,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;
@@ -1568,7 +1814,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "HG=/usr/local/bin/hg\nSOURCE_DIR=${PROJECT_DIR}/../../\n\n#create config.inc\necho \"Updating config file...\"\nPRON=`grep HEDGEWARS_PROTO_VER ${SOURCE_DIR}/CMakeLists.txt | grep -o -E [0-9]+`\nMAJN=`grep CPACK_PACKAGE_VERSION_MAJOR ${SOURCE_DIR}/CMakeLists.txt | grep -o -E \"[0-9]+\"`\nMINN=`grep CPACK_PACKAGE_VERSION_MINOR ${SOURCE_DIR}/CMakeLists.txt | grep -o -E \"[0-9]+\"`\nPATN=`grep CPACK_PACKAGE_VERSION_PATCH ${SOURCE_DIR}/CMakeLists.txt | grep -o -E \"[0-9]+\"`\nREVN=`$HG id -n ${SOURCE_DIR}`\nHASH=`$HG id -i ${SOURCE_DIR}`\n\necho \"{Do not change this file, use the project target to regenerate}\" > ${PROJECT_DIR}/config.inc\necho \"const cNetProtoVersion = $PRON;\" >> ${PROJECT_DIR}/config.inc\necho \"const cVersionString = '$MAJN.$MINN.$PATN';\" >> ${PROJECT_DIR}/config.inc\necho \"const cRevisionString = '$REVN';\" >> ${PROJECT_DIR}/config.inc\necho \"const cHashString = '$HASH';\" >> ${PROJECT_DIR}/config.inc\n";
+ shellScript = "HG=/usr/local/bin/hg\nSOURCE_DIR=${PROJECT_DIR}/../../\n\n#create config.inc\necho \"Updating config file...\"\nPRON=`grep HEDGEWARS_PROTO_VER ${SOURCE_DIR}/CMakeLists.txt | grep -o -E [0-9]+`\nMAJN=`grep CPACK_PACKAGE_VERSION_MAJOR ${SOURCE_DIR}/CMakeLists.txt | grep -o -E \"[0-9]+\"`\nMINN=`grep CPACK_PACKAGE_VERSION_MINOR ${SOURCE_DIR}/CMakeLists.txt | grep -o -E \"[0-9]+\"`\nPATN=`grep CPACK_PACKAGE_VERSION_PATCH ${SOURCE_DIR}/CMakeLists.txt | grep -o -E \"[0-9]+\"`\nREVN=`$HG id -n ${SOURCE_DIR}`\nHASH=`$HG id -i ${SOURCE_DIR}`\n\necho \"{Do not change this file, use the project target to regenerate}\" > ${PROJECT_DIR}/config.inc\necho \"const cNetProtoVersion = $PRON;\" >> ${PROJECT_DIR}/config.inc\necho \"const cVersionString = '$MAJN.$MINN.$PATN';\" >> ${PROJECT_DIR}/config.inc\necho \"const cRevisionString = '$REVN';\" >> ${PROJECT_DIR}/config.inc\necho \"const cHashString = '$HASH';\" >> ${PROJECT_DIR}/config.inc\necho \"const cDefaultPathPrefix = '';\" >> ${PROJECT_DIR}/config.inc\n";
};
9283011B0F10CB2D00CC5A3C /* Build libfpc.a */ = {
isa = PBXShellScriptBuildPhase;
@@ -1584,7 +1830,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "# Build libfpc.a\n# 9 July 2006 (Jonas Maebe)\n# * original version\n# 15 September 2006 (Erling Johansen)\n# * simplified\n# 26 April 2007 (Jonas Maebe)\n# * added support for ppc64/x86_64 (future proofing)\n# 4 August 2007 (Jonas Maebe)\n# * call ranlib after ar so the toc of the library is up-to-date\n# 3 January 2009 (Jonas Maebe)\n# * support for ARM\n# 24 October 2009 (Jonas Maebe)\n# * don't hardcode version 2.3.1 anymore under certain circumstances\n# * use the FPC_RTL_UNITS_BASE setting\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\nrm -f \"$TARGET_TEMP_DIR\"/*.a\nnarch=\n\ntemparchs=`echo $ARCHS|sed -e 's/arm[^\\w]*/arm\\\n/'|sort -u`\nfor arch in $temparchs\ndo\n\ttargetos=darwin;\n\tcase $arch in\n\t\tppc) fpc_arch=ppc; fpc_rtl=powerpc ;;\n\t\ti386) fpc_arch=386; fpc_rtl=i386; targetos=iphonesim ;;\n\t\tppc64) fpc_arch=ppc64; fpc_rtl=powerpc64 ;;\n\t\tx86_64) fpc_arch=x64; fpc_rtl=x86_64 ;;\n\t\tarm*) fpc_arch=arm; fpc_rtl=arm ;;\n\t\t*) continue\n\tesac\n\tif test -e \"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch}\n\tthen\n\t\tupath=\"$FPC_RTL_UNITS_BASE\"/`\"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch} -iV`/units/${fpc_rtl}-${targetos}\n\t\tar -q \"$TARGET_TEMP_DIR\"/libfpc${narch}.a `ls \"$upath\"/*/*.o | grep -v 'darwin/fv/'`\n\t\tranlib \"$TARGET_TEMP_DIR\"/libfpc${narch}.a\n\t\tnarch=${narch}x\n\telse\n\t\techo error: can\\'t build libfpc.a for $arch \\(${FPC_COMPILER_BINARY_DIR}/ppc${fpc_arch} not found, derived from FPC_COMPILER_BINARY_DIR project setting\\)\n\tfi\ndone\n\nif test ${#narch} -gt 1\nthen\n\tlipo -create \"$TARGET_TEMP_DIR\"/libfpc*.a -output \"$TARGET_BUILD_DIR\"/libfpc.a\n\trm -f \"$TARGET_TEMP_DIR\"/*.a\nelse\n\tmv \"$TARGET_TEMP_DIR\"/libfpc.a \"$TARGET_BUILD_DIR\"\nfi\n";
+ shellScript = "# Build libfpc.a\n# 9 July 2006 (Jonas Maebe)\n# * original version\n# 15 September 2006 (Erling Johansen)\n# * simplified\n# 26 April 2007 (Jonas Maebe)\n# * added support for ppc64/x86_64 (future proofing)\n# 4 August 2007 (Jonas Maebe)\n# * call ranlib after ar so the toc of the library is up-to-date\n# 3 January 2009 (Jonas Maebe)\n# * support for ARM\n# 24 October 2009 (Jonas Maebe)\n# * don't hardcode version 2.3.1 anymore under certain circumstances\n# * use the FPC_RTL_UNITS_BASE setting\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\nrm -f \"$TARGET_TEMP_DIR\"/*.a\nnarch=\n\n#temparchs=`echo $ARCHS|sed -e 's/arm[^\\w]*/arm\\\n#/'|sort -u`\ntemparchs=`echo $ARCHS|sort -u`\necho $temparchs\nfor arch in $temparchs\ndo\n\ttargetos=darwin;\n\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# ppc) fpc_arch=ppc; fpc_rtl=powerpc ;;\n#\t\ti386) fpc_arch=386; fpc_rtl=i386; targetos=iphonesim ;;\n#\t\tppc64) fpc_arch=ppc64; fpc_rtl=powerpc64 ;;\n#\t\tx86_64) fpc_arch=x64; fpc_rtl=x86_64 ;;\n#\t\tarm*) fpc_arch=arm; fpc_rtl=arm ;;\n\t\t*) continue\n\tesac\n\tif test -e \"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch}\n\tthen\n\t\tupath=\"$FPC_RTL_UNITS_BASE\"/`\"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch} -iV`/units/${fpc_rtl}-${targetos}\n\t\tar -q \"$TARGET_TEMP_DIR\"/libfpc${narch}.a `ls \"$upath\"/*/*.o | grep -v 'darwin/fv/'`\n\t\tranlib \"$TARGET_TEMP_DIR\"/libfpc${narch}.a\n\t\tnarch=${narch}x\n\telse\n\t\techo error: can\\'t build libfpc.a for $arch \\(${FPC_COMPILER_BINARY_DIR}/ppc${fpc_arch} not found, derived from FPC_COMPILER_BINARY_DIR project setting\\)\n\tfi\ndone\n \nif test ${#narch} -gt 1\nthen\n\tlipo -create \"$TARGET_TEMP_DIR\"/libfpc*.a -output \"$TARGET_BUILD_DIR\"/libfpc.a\n\trm -f \"$TARGET_TEMP_DIR\"/*.a\nelse\n\tmv \"$TARGET_TEMP_DIR\"/libfpc.a \"$TARGET_BUILD_DIR\"\nfi\n";
};
928301560F10E04C00CC5A3C /* Compile Pascal Sources */ = {
isa = PBXShellScriptBuildPhase;
@@ -1599,7 +1845,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\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 */
@@ -1615,6 +1861,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 */,
@@ -1627,7 +1874,9 @@
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 */,
61798832114AA34C00BA94A9 /* uLocale.pas in Sources */,
61798833114AA34C00BA94A9 /* uMisc.pas in Sources */,
@@ -1636,6 +1885,7 @@
61798838114AA34C00BA94A9 /* uStats.pas in Sources */,
61798839114AA34C00BA94A9 /* uStore.pas in Sources */,
6179883A114AA34C00BA94A9 /* uTeams.pas in Sources */,
+ F6338CD81C7A702B00353945 /* CampaignViewController.m in Sources */,
6179883C114AA34C00BA94A9 /* uVisualGears.pas in Sources */,
6179883D114AA34C00BA94A9 /* uWorld.pas in Sources */,
611F4D4B11B27A9900F9759A /* uScript.pas in Sources */,
@@ -1654,8 +1904,8 @@
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 */,
+ F60ACBB71C7BC08B00385701 /* IniParser.m in Sources */,
6165922011CA9BA200D6E256 /* TeamSettingsViewController.m in Sources */,
6165922111CA9BA200D6E256 /* VoicesViewController.m in Sources */,
6165922211CA9BA200D6E256 /* WeaponSettingsViewController.m in Sources */,
@@ -1674,13 +1924,16 @@
619C5AF4124F7E3100D041AE /* LuaPas.pas in Sources */,
619C5BA2124FA59000D041AE /* MapPreviewButtonView.m in Sources */,
61D205A1127CDD1100ABD83E /* ObjcExports.m in Sources */,
+ F6338CC81C7A53C100353945 /* CampaignsViewController.m in Sources */,
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 */,
@@ -1689,11 +1942,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 */,
@@ -1709,11 +1963,13 @@
615E76BC14E4421200FBA131 /* MGSplitCornersView.m in Sources */,
615E76BD14E4421200FBA131 /* MGSplitDividerView.m in Sources */,
615E76BE14E4421200FBA131 /* MGSplitViewController.m in Sources */,
+ F6F07BE01B7E72D40010E48F /* HelpPageLobbyViewController.m in Sources */,
615BE3D4155C5DDF003CA34D /* uInputHandler.pas in Sources */,
619349C8160BAF3E00A08518 /* uAILandMarks.pas in Sources */,
619349C9160BAF3E00A08518 /* uGearsHandlers.pas in Sources */,
619349CA160BAF3E00A08518 /* uGearsHandlersRope.pas in Sources */,
610FB7C81661390E002FB2A7 /* uPhysFSLayer.pas in Sources */,
+ F6D7E0C21B768F19004F3BCF /* uLandGenPerlin.pas in Sources */,
61B37A1F17837C78009F283D /* ArgParsers.pas in Sources */,
61B37A2017837C78009F283D /* uVisualGearsList.pas in Sources */,
61B37A80178381DB009F283D /* uGearsHandlersMess.pas in Sources */,
@@ -1780,13 +2036,14 @@
6115652D147F4C52006729A9 /* French */,
61156530147F4D10006729A9 /* Polish */,
61177BAA148A661600686905 /* German */,
- 61177BAC148A671600686905 /* Turkish */,
61177BE4148B881C00686905 /* Danish */,
617BC22D1490210E00E1C294 /* Italian */,
619BCEC41495615700C1C409 /* Bulgarian */,
61D08D8714AEA9670007C078 /* Japanese */,
61C6783F14B3DD020087425A /* Portuguese */,
6154A53114C37E4A00F6EEF6 /* Romanian */,
+ F65725291B7EB9CC00A86262 /* ru */,
+ F67FC81F1BEC280D00A9DC75 /* tr */,
);
name = About.strings;
sourceTree = "<group>";
@@ -1799,13 +2056,14 @@
6115652C147F4C4C006729A9 /* French */,
61156531147F4D17006729A9 /* Polish */,
61177BA7148A658900686905 /* German */,
- 61177BAD148A672000686905 /* Turkish */,
61177BF0148B882500686905 /* Danish */,
617BC2391490211500E1C294 /* Italian */,
619BCED01495615F00C1C409 /* Bulgarian */,
61D08D8814AEA9700007C078 /* Japanese */,
61C6784B14B3DD0B0087425A /* Portuguese */,
6154A53E14C37E5400F6EEF6 /* Romanian */,
+ F657252A1B7EB9CC00A86262 /* ru */,
+ F67FC8201BEC280D00A9DC75 /* tr */,
);
name = Localizable.strings;
sourceTree = "<group>";
@@ -1818,13 +2076,14 @@
6115652B147F4C45006729A9 /* French */,
61156532147F4D1E006729A9 /* Polish */,
61177BA9148A660C00686905 /* German */,
- 61177BAE148A672C00686905 /* Turkish */,
61177BF1148B882F00686905 /* Danish */,
617BC23A1490211F00E1C294 /* Italian */,
619BCED11495616700C1C409 /* Bulgarian */,
61D08D8914AEA9780007C078 /* Japanese */,
61C6784C14B3DD140087425A /* Portuguese */,
6154A54014C37EB100F6EEF6 /* Romanian */,
+ F657252B1B7EB9CC00A86262 /* ru */,
+ F67FC8211BEC280D00A9DC75 /* tr */,
);
name = Scheme.strings;
sourceTree = "<group>";
@@ -1835,24 +2094,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;
};
@@ -1861,23 +2128,32 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
APPLY_RULES_IN_COPY_FILES = YES;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
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/2.7.1;
+ 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 -Cfvfpv3 -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;
GCC_DYNAMIC_NO_PIC = NO;
GCC_FAST_MATH = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
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;
@@ -1892,6 +2168,7 @@
GCC_WARN_SHADOW = YES;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
@@ -1902,21 +2179,18 @@
"\"$(SRCROOT)/../../../Library/SDL_net/\"",
"\"$(SRCROOT)/../../../Library/SDL_mixer/\"",
);
- IPHONEOS_DEPLOYMENT_TARGET = 3.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*]" = "";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
- VALID_ARCHS = "armv7 armv6";
+ VALID_ARCHS = "armv7 x86_64 arm64";
WARNING_CFLAGS = (
"-Wall",
"-Wbad-function-cast",
@@ -1929,11 +2203,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";
};
@@ -1945,6 +2223,7 @@
GCC_ENABLE_FIX_AND_CONTINUE = NO;
PREBINDING = NO;
PRODUCT_NAME = fpc;
+ SKIP_INSTALL = YES;
ZERO_LINK = NO;
};
name = "Distro AppStore";
@@ -1965,24 +2244,33 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
APPLY_RULES_IN_COPY_FILES = YES;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "Entitlements-Distribution.plist";
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/2.7.1;
+ 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 = "-dDEBUGFILE -O- -g -gl -gw2 -gt -ghttt -Xs- -Cfvfpv3";
+ FPC_SPECIFIC_OPTIONS = "-dDEBUGFILE -O- -g -gl -gw2 -gt -ghttt -Xs-";
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;
@@ -1997,6 +2285,7 @@
GCC_WARN_SHADOW = YES;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
@@ -2007,11 +2296,12 @@
"\"$(SRCROOT)/../../../Library/SDL_net/\"",
"\"$(SRCROOT)/../../../Library/SDL_mixer/\"",
);
- IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = (
"-lz",
- "-Wl,-no_order_inits",
+ "-framework",
+ MessageUI,
);
PREBINDING = NO;
PROVISIONING_PROFILE = "";
@@ -2019,7 +2309,7 @@
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
- VALID_ARCHS = "armv7 armv6";
+ VALID_ARCHS = "armv7 x86_64 arm64";
WARNING_CFLAGS = (
"-Wall",
"-Wbad-function-cast",
@@ -2032,11 +2322,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";
};
@@ -2048,6 +2342,7 @@
GCC_ENABLE_FIX_AND_CONTINUE = NO;
PREBINDING = NO;
PRODUCT_NAME = fpc;
+ SKIP_INSTALL = YES;
ZERO_LINK = NO;
};
name = "Distro Adhoc";
@@ -2092,6 +2387,7 @@
GCC_OPTIMIZATION_LEVEL = 0;
PREBINDING = NO;
PRODUCT_NAME = fpc;
+ SKIP_INSTALL = YES;
};
name = Debug;
};
@@ -2103,6 +2399,7 @@
GCC_ENABLE_FIX_AND_CONTINUE = NO;
PREBINDING = NO;
PRODUCT_NAME = fpc;
+ SKIP_INSTALL = YES;
ZERO_LINK = NO;
};
name = Release;
@@ -2112,12 +2409,21 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
APPLY_RULES_IN_COPY_FILES = YES;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ 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/2.6.0;
+ 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 = "-Tiphonesim -dDEBUGFILE -O- -g -gl -gw2 -gt -ghttt -Xs-";
@@ -2126,10 +2432,10 @@
GCC_DEBUGGING_SYMBOLS = full;
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;
@@ -2144,6 +2450,7 @@
GCC_WARN_SHADOW = YES;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
@@ -2154,11 +2461,12 @@
"\"$(SRCROOT)/../../../Library/SDL_net/\"",
"\"$(SRCROOT)/../../../Library/SDL_mixer/\"",
);
- IPHONEOS_DEPLOYMENT_TARGET = 3.0;
- ONLY_ACTIVE_ARCH = NO;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = (
"-lz",
- "-Wl,-no_order_inits",
+ "-framework",
+ MessageUI,
);
PREBINDING = NO;
PROVISIONING_PROFILE = "";
@@ -2166,7 +2474,7 @@
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = NO;
- VALID_ARCHS = "armv7 armv6";
+ VALID_ARCHS = "armv7 x86_64 arm64";
WARNING_CFLAGS = (
"-Wall",
"-Wbad-function-cast",
@@ -2181,24 +2489,33 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
APPLY_RULES_IN_COPY_FILES = YES;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "Entitlements-Development.plist";
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/2.6.0;
+ 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 -Cfvfpv3 -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;
- GCC_DYNAMIC_NO_PIC = YES;
+ GCC_DYNAMIC_NO_PIC = NO;
GCC_FAST_MATH = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
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;
@@ -2213,6 +2530,7 @@
GCC_WARN_SHADOW = YES;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
@@ -2223,12 +2541,13 @@
"\"$(SRCROOT)/../../../Library/SDL_net/\"",
"\"$(SRCROOT)/../../../Library/SDL_mixer/\"",
);
- IPHONEOS_DEPLOYMENT_TARGET = 3.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 = "";
@@ -2236,7 +2555,7 @@
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = NO;
- VALID_ARCHS = "armv7 armv6";
+ VALID_ARCHS = "armv7 x86_64 arm64";
WARNING_CFLAGS = (
"-Wall",
"-Wbad-function-cast",
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.xcworkspace/contents.xcworkspacedata Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:">
+ </FileRef>
+</Workspace>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/xcshareddata/xcschemes/Hedgewars.xcscheme Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0710"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
+ BuildableName = "Hedgewars.app"
+ BlueprintName = "Hedgewars"
+ ReferencedContainer = "container:Hedgewars.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
+ BuildableName = "Hedgewars.app"
+ BlueprintName = "Hedgewars"
+ ReferencedContainer = "container:Hedgewars.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </TestAction>
+ <LaunchAction
+ buildConfiguration = "Release"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ debugServiceExtension = "internal"
+ allowLocationSimulation = "YES"
+ language = "ru">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
+ BuildableName = "Hedgewars.app"
+ BlueprintName = "Hedgewars"
+ ReferencedContainer = "container:Hedgewars.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ buildConfiguration = "Debug"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
+ BuildableName = "Hedgewars.app"
+ BlueprintName = "Hedgewars"
+ ReferencedContainer = "container:Hedgewars.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Distro AppStore"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/xcshareddata/xcschemes/UpdateDataFolder.xcscheme Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0710"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "6179928B114AE0C800BA94A9"
+ BuildableName = "UpdateDataFolder"
+ BlueprintName = "UpdateDataFolder"
+ ReferencedContainer = "container:Hedgewars.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES">
+ <Testables>
+ </Testables>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </TestAction>
+ <LaunchAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ debugServiceExtension = "internal"
+ allowLocationSimulation = "YES">
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "6179928B114AE0C800BA94A9"
+ BuildableName = "UpdateDataFolder"
+ BlueprintName = "UpdateDataFolder"
+ ReferencedContainer = "container:Hedgewars.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ buildConfiguration = "Release"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ debugDocumentVersioning = "YES">
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "6179928B114AE0C800BA94A9"
+ BuildableName = "UpdateDataFolder"
+ BlueprintName = "UpdateDataFolder"
+ ReferencedContainer = "container:Hedgewars.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
--- a/project_files/HedgewarsMobile/Info.plist Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Info.plist Fri Apr 01 15:36:19 2016 +0200
@@ -16,34 +16,34 @@
<string>Icon-Small.png</string>
<string>Icon-Small-50.png</string>
<string>Icon-Small@2x.png</string>
+ <string>Icon-60@2x.png</string>
+ <string>Icon-76.png</string>
+ <string>Icon-76@2x.png</string>
</array>
<key>CFBundleIdentifier</key>
- <string>org.hedgewars.mobile</string>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>2.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${HEDGEWARS_REVISION}</string>
- <key>CFBundleShortVersionString</key>
- <string>1.3.2</string>
<key>LSRequiresIPhoneOS</key>
<true/>
+ <key>UILaunchImageFile~ipad</key>
+ <string>Default-ipad</string>
<key>UIPrerenderedIcon</key>
<true/>
+ <key>UIRequiresFullScreen</key>
+ <true/>
<key>UIStatusBarHidden</key>
<true/>
- <key>UILaunchImageFile~ipad</key>
- <string>Default-ipad</string>
- <key>UISupportedInterfaceOrientations~iphone</key>
- <array>
- <string>UIInterfaceOrientationLandscapeLeft</string>
- <string>UIInterfaceOrientationLandscapeRight</string>
- </array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
@@ -51,5 +51,10 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
+ <key>UISupportedInterfaceOrientations~iphone</key>
+ <array>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
</dict>
</plist>
Binary file project_files/HedgewarsMobile/Locale/English.lproj/About.strings has changed
Binary file project_files/HedgewarsMobile/Locale/English.lproj/Localizable.strings has changed
Binary file project_files/HedgewarsMobile/Locale/English.lproj/Scheme.strings has changed
Binary file project_files/HedgewarsMobile/Locale/Turkish.lproj/About.strings has changed
Binary file project_files/HedgewarsMobile/Locale/Turkish.lproj/Localizable.strings has changed
Binary file project_files/HedgewarsMobile/Locale/Turkish.lproj/Scheme.strings has changed
Binary file project_files/HedgewarsMobile/Locale/ru.lproj/About.strings has changed
Binary file project_files/HedgewarsMobile/Locale/ru.lproj/Localizable.strings has changed
Binary file project_files/HedgewarsMobile/Locale/ru.lproj/Scheme.strings has changed
Binary file project_files/HedgewarsMobile/Locale/tr.lproj/About.strings has changed
Binary file project_files/HedgewarsMobile/Locale/tr.lproj/Localizable.strings has changed
Binary file project_files/HedgewarsMobile/Locale/tr.lproj/Scheme.strings has changed
Binary file project_files/HedgewarsMobile/Resources/Frontend/Help Bubbles/helpabove.png has changed
Binary file project_files/HedgewarsMobile/Resources/Frontend/Help Bubbles/helpbottom.png has changed
Binary file project_files/HedgewarsMobile/Resources/Frontend/Help Bubbles/helpleft.png has changed
Binary file project_files/HedgewarsMobile/Resources/Frontend/Help Bubbles/helpplain.png has changed
Binary file project_files/HedgewarsMobile/Resources/Frontend/Help Bubbles/helpright.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/Icon-60@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/Icon-76.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/Icon-76@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet_filled.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/bullet_filled@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/flower.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/flower@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/flower_filled.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/flower_filled@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/heart.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/heart@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/heart_filled.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/heart_filled@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/target.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/target@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/target_filled.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/target_filled@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/teams.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/teams@2x.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/teams_filled.png has changed
Binary file project_files/HedgewarsMobile/Resources/Icons/teams_filled@2x.png has changed
--- a/project_files/HedgewarsMobile/Resources/basicFlags.plist Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Resources/basicFlags.plist Fri Apr 01 15:36:19 2016 +0200
@@ -266,5 +266,41 @@
<key>title</key>
<string>Get Away Time (%)</string>
</dict>
+ <dict>
+ <key>checkOverMax</key>
+ <false/>
+ <key>times1000</key>
+ <false/>
+ <key>command</key>
+ <string>e$airmines</string>
+ <key>default</key>
+ <integer>0</integer>
+ <key>image</key>
+ <string>Mine</string>
+ <key>max</key>
+ <integer>80</integer>
+ <key>min</key>
+ <integer>0</integer>
+ <key>title</key>
+ <string>Air Mines</string>
+ </dict>
+ <dict>
+ <key>checkOverMax</key>
+ <false/>
+ <key>times1000</key>
+ <false/>
+ <key>command</key>
+ <string>e$worldedge</string>
+ <key>default</key>
+ <integer>0</integer>
+ <key>image</key>
+ <string>Earth</string>
+ <key>max</key>
+ <integer>3</integer>
+ <key>min</key>
+ <integer>0</integer>
+ <key>title</key>
+ <string>World Edge</string>
+ </dict>
</array>
</plist>
--- a/project_files/HedgewarsMobile/Resources/credits.plist Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/HedgewarsMobile/Resources/credits.plist Fri Apr 01 15:36:19 2016 +0200
@@ -3,9 +3,9 @@
<plist version="1.0">
<array>
<array>
- <string>Andrey "UnC0Rr" Korotaev</string>
+ <string>Andrey "unC0Rr" Korotaev</string>
<string>Igor "Displacer" Ulyanov</string>
- <string>Derek "Nemo" Pomery</string>
+ <string>Derek "nemo" Pomery</string>
<string>Martin "Affect" Boze</string>
<string>David "Krawek" Cuadrado</string>
<string>Martin "Ttsmj" Minarik</string>
@@ -13,12 +13,20 @@
<string>Vittorio "Koda" Giovara</string>
<string>Mario "Smaxx" Liebisch</string>
<string>Carlos "Palewolf" Vives</string>
- <string>Richard "Sheepluva" Korlyi</string>
+ <string>Richard "sheepluva" Karolyi</string>
<string>Henning "Prg" Kühn</string>
<string>Henrik "Henek" Rostedt</string>
- <string>John "Mikade" Lambert</string>
+ <string>John "mikade" Lambert</string>
<string>Mayur "Zorg" Pawashe</string>
<string>Richard "Xeli" Deurwaarder</string>
+ <string>Simeon Maxein</string>
+ <string>Meng Xiangyun</string>
+ <string>Stepan Podoskin</string>
+ <string>Szabolcs Orbàn</string>
+ <string>Drew Gottlieb</string>
+ <string>Ondrej Skopek</string>
+ <string>Julia Struchenko</string>
+ <string>Anton "antonc27" Malmygin</string>
</array>
<array>
<string>John "Fizzy" Dum</string>
@@ -26,7 +34,8 @@
<string>Stanko Tadić</string>
<string>Julien Koesten</string>
<string>Joshua O'Sullivan</string>
- <string>Nils Luck</string>
+ <string>Nils Lück</string>
+ <string>Guillaume Englert</string>
<string>Trey Perry</string>
</array>
<array>
@@ -42,16 +51,16 @@
<string>Jie Luo</string>
<string>Andrey Korotaev</string>
<string>Nina Kuisma</string>
- <string>Antoine Turmel</string>
- <string>Peter Hüwe, Mario Liebisch, Richard Karolyi</string>
+ <string>Antoine Turmel, Clement Woitrain, Matisumi</string>
+ <string>Peter Hüwe, Mario Liebisch, Richard Karolyi, Wuzzy</string>
<string>Talos Kriti</string>
- <string>Luca Bonora, Marco Bresciani</string>
- <string>Adam Etienne</string>
+ <string>Luca Bonora, Marco Bresciani, Gianfranco Costamagna</string>
+ <string>Adam Etienne, Marco Bresciani</string>
<string>Anthony Bellew</string>
<string>Lukas Urbonas</string>
<string>Maciej Mroziński, Wojciech Latkowski, Piotr Mitana, Maciej Górny</string>
<string>Fábio Canário</string>
- <string>Andrey Korotaev</string>
+ <string>Andrey Korotaev, Vitaly Novichkov, Anton Malmygin</string>
<string>Jose Riha</string>
<string>Carlos Vives</string>
<string>Niklas Grahn, Henrik Rostedt</string>
@@ -80,6 +89,14 @@
<string>Lua game modes and missions</string>
<string>Desktop frontend improvements</string>
<string>Android port</string>
+ <string>Android netplay, portability abstraction</string>
+ <string>WebGL port, some pas2c and GLES2 work</string>
+ <string>Video recording</string>
+ <string>Campaign support, first campaign</string>
+ <string>Keybinds, feedback, maps and hats interfaces</string>
+ <string>Login dialogs, frontend improvements</string>
+ <string>Icegun weapon</string>
+ <string>Current developer of iPhone/iPad versions</string>
</array>
<array>
<string>Main graphics</string>
@@ -88,6 +105,7 @@
<string></string>
<string></string>
<string></string>
+ <string></string>
<string>Some hats</string>
</array>
<array>
--- a/project_files/hedgewars.pro Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/hedgewars.pro Fri Apr 01 15:36:19 2016 +0200
@@ -277,8 +277,8 @@
}
!macx {
- LIBS += -lSDL -lSDL_mixer -lSDL_net
+ LIBS += -lSDL2 -lSDL2_mixer -lSDL2_net
!win32 {
- INCLUDEPATH += /usr/local/include/SDL /usr/include/SDL
+ INCLUDEPATH += /usr/local/include/SDL2 /usr/include/SDL2
}
}
--- a/project_files/hwc/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/hwc/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -1,11 +1,11 @@
#the usual set of dependencies
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
-find_package(SDL REQUIRED)
-find_package(SDL_mixer REQUIRED)
-find_package(SDL_net REQUIRED)
-find_package(SDL_image REQUIRED)
-find_package(SDL_ttf REQUIRED)
+find_package(SDL2 REQUIRED)
+find_package(SDL2_mixer REQUIRED)
+find_package(SDL2_net REQUIRED)
+find_package(SDL2_image REQUIRED)
+find_package(SDL2_ttf REQUIRED)
#compile our rtl implementation
include_directories(${GLEW_INCLUDE_DIR})
@@ -13,7 +13,7 @@
include_directories(${PHYSFS_INCLUDE_DIR})
include_directories(${PHYSLAYER_INCLUDE_DIR})
include_directories(${LUA_INCLUDE_DIR})
-include_directories(${SDL_INCLUDE_DIR})
+include_directories(${SDL2_INCLUDE_DIR})
add_subdirectory(rtl)
# convert list into pascal array
@@ -40,6 +40,7 @@
list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/pas2cSystem.pas")
list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/pas2cRedo.pas")
list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/hwLibrary.pas")
+list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/uMatrix.pas")
#remove and readd hwengine so that it is compiled first, compiling every other file in the process
list(REMOVE_ITEM engine_sources_pas ${CMAKE_SOURCE_DIR}/hedgewars/hwengine.pas)
@@ -82,20 +83,16 @@
target_link_libraries(hwengine fpcrtl
${LUA_LIBRARY}
${OPENGL_LIBRARY}
- ${SDL_LIBRARY}
- ${SDLMIXER_LIBRARY}
- ${SDLNET_LIBRARY}
- ${SDLIMAGE_LIBRARY}
- ${SDLTTF_LIBRARY}
+ ${SDL2_LIBRARY}
+ ${SDL2_MIXER_LIBRARY}
+ ${SDL2_NET_LIBRARY}
+ ${SDL2_IMAGE_LIBRARY}
+ ${SDL2_TTF_LIBRARY}
${GLEW_LIBRARY}
physfs
physlayer
m
#TODO: add other libraries
)
-if(APPLE)
- target_link_libraries(hwengine IOKit SDLmain)
-endif()
-
install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/hwengine${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION ${target_binary_install_dir})
--- a/project_files/hwc/rtl/fpcrtl.h Fri Sep 11 04:05:09 2015 +0200
+++ b/project_files/hwc/rtl/fpcrtl.h Fri Apr 01 15:36:19 2016 +0200
@@ -14,9 +14,6 @@
#include "pmath.h"
#ifndef EMSCRIPTEN
-#if __APPLE__
-#define main SDL_main
-#endif
#include "GL/glew.h"
#endif
@@ -110,6 +107,7 @@
#define sdlh_Mix_VolumeMusic stub_Mix_VolumeMusic
#endif
+#define sdlh_SDL_free SDL_free
#define sdlh_SDL_ConvertSurface SDL_ConvertSurface
#define sdlh_SDL_CreateRGBSurface SDL_CreateRGBSurface
#define sdlh_SDL_CreateThread SDL_CreateThread
@@ -120,7 +118,7 @@
#define sdlh_SDL_FreeSurface SDL_FreeSurface
#define sdlh_SDL_GetError SDL_GetError
#define sdlh_SDL_GetKeyName SDL_GetKeyName
-#define sdlh_SDL_GetKeyState SDL_GetKeyState
+#define sdlh_SDL_GetKeyboardState SDL_GetKeyboardState
#define sdlh_SDL_GetMouseState SDL_GetMouseState
#define sdlh_SDL_GetRGBA SDL_GetRGBA
#define sdlh_SDL_GetTicks SDL_GetTicks
@@ -148,8 +146,8 @@
#define sdlh_SDL_WaitThread SDL_WaitThread
#define sdlh_SDL_CreateMutex SDL_CreateMutex
#define sdlh_SDL_DestroyMutex SDL_DestroyMutex
-#define SDL_LockMutex SDL_mutexP
-#define SDL_UnlockMutex SDL_mutexV
+#define sdlh_SDL_LockMutex SDL_LockMutex
+#define sdlh_SDL_UnlockMutex SDL_UnlockMutex
#ifndef EMSCRIPTEN
#define sdlh_SDL_ShowCursor SDL_ShowCursor
#else
--- a/share/Info.plist.in Fri Sep 11 04:05:09 2015 +0200
+++ b/share/Info.plist.in Fri Apr 01 15:36:19 2016 +0200
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSApplicationCategoryType</key>
@@ -9,7 +9,7 @@
<key>CFBundleExecutable</key>
<string>hedgewars</string>
<key>CFBundleGetInfoString</key>
- <string>http://www.hedgewars.org</string>
+ <string>https://www.hedgewars.org</string>
<key>CFBundleIconFile</key>
<string>Icon.icns</string>
<key>CFBundleIdentifier</key>
@@ -50,7 +50,7 @@
<key>SUPublicDSAKeyFile</key>
<string>dsa_pub.pem</string>
<key>SUFeedURL</key>
- <string>http://www.hedgewars.org/download/appcast.xml</string>
+ <string>https://www.hedgewars.org/download/appcast.xml</string>
<key>CFBundleLocalizations</key>
<array>
<string>ar</string>
@@ -88,7 +88,7 @@
<key>UTTypeIdentifier</key>
<string>org.hedgewars.desktop.hws</string>
<key>UTTypeReferenceURL</key>
- <string>http://www.hedgewars.org/demos/</string>
+ <string>https://www.hedgewars.org/demos/</string>
<key>UTTypeDescription</key>
<string>Hedgewars Save Game</string>
<key>UTTypeIconFile</key>
@@ -111,7 +111,7 @@
<key>UTTypeIdentifier</key>
<string>org.hedgewars.desktop.hwd</string>
<key>UTTypeReferenceURL</key>
- <string>http://www.hedgewars.org/demos/</string>
+ <string>https://www.hedgewars.org/demos/</string>
<key>UTTypeIconFile</key>
<string>public.text.icns</string>
<key>UTTypeDescription</key>
--- a/share/hedgewars.appdata.xml Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars.appdata.xml Fri Apr 01 15:36:19 2016 +0200
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<application>
<id type="desktop">hedgewars.desktop</id>
- <licence>GFDL</licence>
+ <metadata_license>GFDL</metadata_license>
+ <name>Hedgewars</name>
+ <summary>Funny turn-based artillery game, featuring fighting Hedgehogs!</summary>
<description>
<p>
Hedgewars is a turn based strategy, artillery, action and comedy game, featuring the antics of pink hedgehogs with attitude as they battle from the depths of hell to the depths of space.
--- a/share/hedgewars/Data/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -1,4 +1,17 @@
-foreach(dir "Fonts" "Forts" "Graphics" "Locale" "Maps" "Music" "Sounds" "Themes" "Missions" "Names" "misc" "Scripts")
+foreach(dir
+ Fonts
+ Forts
+ Graphics
+ Locale
+ Maps
+ Missions
+ Music
+ Names
+ Scripts
+ Sounds
+ Themes
+ misc
+ )
add_subdirectory(${dir})
endforeach(dir)
Binary file share/hedgewars/Data/Graphics/Flags/cm_cyborg.png has changed
Binary file share/hedgewars/Data/Graphics/Flags/cm_fcw.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amAirMine.png has changed
Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Flying_Saucer@2x.png has changed
--- a/share/hedgewars/Data/Locale/de.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/de.lua Fri Apr 01 15:36:19 2016 +0200
@@ -1,776 +1,101 @@
locale = {
[""]="",
-["Feeble Resistance"]="Kraftloser Widerstand",
-["Pathetic Hog #%d"]="Erbärmlicher Igel #%d",
-["Cybernetic Empire"]="Kybernetisches Imperium",
-["Unit 3378"]="Einheit 3378",
-["Codename: Teamwork"]="Code-Name: Teamwork",
-["- Eliminate Unit 3378 |- Feeble Resistance must survive"]="- Vernichte Einheit 3378 |- Kraftloser Widerstand muss überleben",
-["|- Mines Time:"]="|- Minenzündzeit:",
-["sec"]="s",
-["T_T"]="T_T",
-["Hmmm..."]="Hmmm …",
-["MISSION SUCCESSFUL"]="MISSION ERFOLGREICH",
-["Congratulations!"]="Gratulation!",
-["MISSION FAILED"]="MISSION GESCHEITERT",
-["Oh no! Just try again!"]="Oh nein! Versuch's nochmal!",
-["Grenadier"]="Grenadier",
-["Grenade Group"]="Granatengruppe",
-["You have thrown %d grenades."]="Du hast %d Granaten geworfen.",
-["Sniperz"]="Heckenschützen",
-["Hunter"]="Jäger",
-["Sniper Training"]="Scharfschützen-Training",
-["Aiming Practice"]="Zielübung",
-["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."]="Eliminiere alle Ziele, bevor die Zeit ausläuft.|Du hast in dieser Mission unbegrenzte Munition.",
-["Time's up!"]="Die Zeit ist um!",
-["Oh no! Time's up! Just try again."]="Oh nein! Die Zeit ist um! Versuche es nochmal.",
-["Good so far!"]="Gut soweit!",
-["Keep it up!"]="Weiter so!",
-["This one's tricky."]="Der hier ist knifflig.",
-["Well done."]="Gut gemacht.",
-["Demolition is fun!"]="Zerstörung macht Spaß!",
-["Will this ever end?"]="Wird dies je enden?",
-["Last Target!"]="Letzte Zielscheibe!",
-["Congratulations! You've eliminated all targets|within the allowed time frame."]="Gratulation! Du hast alle Ziele innerhalb der|verfügbaren Zeit ausgeschaltet.",
-["You have successfully finished the sniper rifle training!"]="Du hast das Scharfschützentraining abgeschlossen!",
-["You have destroyed %d of %d targets (+%d points)."]="Du hast %d von %d Zielen zerstört (+%d Punkte).",
-["You have made %d shots."]="Du hast %d Schüsse abgegeben.",
-["Accuracy bonus: +%d points"]="Präzisions-Bonus: +%d Punkte",
-["You had %.2fs remaining on the clock (+%d points)."]="Verbleibende Zeit: %.2fs (+%d Punkte).",
-["You lose!"]="Du verlierst!",
-["points"]="Punkte",
-["Shotgun Team"]="Schrotflinten-Team",
-["Shotgun Training"]="Schrotflinten-Training",
-["Wannabe Flyboys"]="Möchtegernflieger",
-["Ace"]="Ass",
-["RC PLANE TRAINING"]="FUNKFLUGZEUGSTRAINING",
-["a Hedgewars challenge"]="eine Hedgewars-Herausforderung",
-["Collect or destroy all the health crates."]="Sammle oder zerstöre alle Gesundheitskisten.",
-["Compete to use as few planes as possible!"]="Verwende so wenige Flugzeuge wie möglich!",
-["Planes used: %d"]="Verwendete Flugzeuge: %d",
-["Crates left: %d"]="Verbleibende Kisten: %d",
-["Destroyer of planes"]="Flugzeug-Zerstörer",
-["Hopeless case"]="Hoffnungsloser Fall",
-["Drunk greenhorn"]="Betrunkener Grünschnabel",
-["Greenhorn"]="Grünschnabel",
-["Beginner"]="Anfänger",
-["Experienced beginner"]="Erfahrener Anfänger",
-["Below-average pilot"]="Unterdurchschnittlicher Pilot",
-["Average pilot"]="Durchschnittlicher Pilot",
-["Above-average pilot"]="Überdurchschnittlicher Pilot",
-["Professional pilot"]="Profipilot",
-["Professional stunt pilot"]="Profi-Stuntpilot",
-["Elite pilot"]="Elitepilot",
-["Upper-class elite pilot"]="Elitepilot der Oberklasse",
-["Top-class elite pilot"]="Elitepilot der Spitzenklasse",
-["Cheater"]="Cheater",
-["Rank: %s"]="Rang: %s",
-["Your rank: %s"]="Dein Rang: %s",
-["Flawless victory!"]="Perfekter Sieg!",
-["You have perfectly beaten the challenge!"]="Du hast die Herausforderung gemeistert!",
-["You have used only 1 RC plane. Outstanding!"]="Du hast nur ein Funkflugzeug gebraucht. Ausgezeichnet!",
+["Bat your opponents through the|baskets and out of the map!"]="Schlage deine Widersacher durch|die Körbe und aus der Karte hinaus!",
+["Hedgewars-Basketball"]="Hedgewars-Basketball",
+["Not So Friendly Match"]="Kein-so-Freundschaftsspiel",
+["%s is out and Team %d|scored a point!| |Score:"]="%s ist draußen und Team %d|erhält einen Punkt!| |Punktestand:",
+["%s is out and Team %d|scored a penalty!| |Score:"]="%s ist draußen und Team %d|erhält eine Strafe!| |Punktestand:",
+["GAME OVER!"]="SPIEL ZU ENDE!",
+["Hooray!"]="Hurra!",
+["Victory for the "]="Sieg für ",
+["Flag respawned!"]="Fahne wieder erschienen!",
+["Opposing Team: "]="Gegnerisches Team: ",
+["You have SCORED!!"]="Du hast GEPUNKTET!",
+["Flag returned!"]="Fahne zurückgebracht!",
+["That was pointless."]="Das war sinnlos.",
+["The flag will respawn next round."]="Die Fahne wird nächste Runde wieder auftauchen.",
+["Flag captured!"]="Flagge genommen!",
+["Boom!"]="Bumm!",
+[" - 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"]=" – Bringe die gegnerische Flagge zu deiner Heimatbasis, um zu punkten. | – Das Team, das zuerst 3 Flaggen erobert, gewinnt. | – Du kannst nur punkten, wenn deine eigene Flagge in deiner Basis ist | – Igel lassen die Flagge fallen, wenn sie sterben oder ertrinken | – Fallengelassene Flaggen können zurückgebracht oder wieder gestohlen werden | – Igel tauchen nach ihrem Tod wieder auf",
+["Climb Home"]="Nach Hause klettern",
+["Rope to safety"]="Schwing dich in Sicherheit",
+["You are far from home, and the water is rising, climb up as high as you can!|Your score will be based on your height."]="Du bist weit weg von Zuhause, und das Wasser steigt, klettere so hoch, wie du kannst!|Deine Punktzahl wird von deiner Höhe abhängen.",
["Victory!"]="Sieg!",
-["You have finished the challenge!"]="Du hast die Herausforderung gemeistert!",
-["You have used %d RC planes."]="Du hast %d Funkflugzeuge benutzt.",
-["You have dropped %d missiles."]="Du hast %d Bomben abgeworfen.",
-["In your best (and only) flight you took out %d crates with one RC plane!"]="In deinem besten (und einzigem) Flug hast du %d Kisten mit einem Funkflugzeug zerstört!",
-["In your best flight you took out %d crates with one RC plane."]="In deinem besten Flug hast du %d Kisten mit einem Funkflugzeug zerstört.",
-["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"]="Das war eine großartige Vorstellung! Aber diese Herausforderung kann sogar mit nur einem Funkflugzeug gemeistert werden. Kannst du herausfinden, wie?",
-["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."]="Gratulation! Du hast diese Herausforderung wahrhaft gemeistert! Vergiss nicht, die Wiederholung zu speichern.",
-["You have gained an achievement: %s"]="Du hast eine Errungenschaft erhalten: %s",
-["Prestigious Pilot"]="Prestigeträchtiger Pilot",
-["CHALLENGE COMPLETE"]="HERAUSFORDERUNG ABGESCHLOSSEN",
-["Grenadiers"]="Grenadiere",
-["Nade Boy"]="Granatenjunge",
-["Grenade Training"]="Granatentraining",
-["Zook"]="Zook",
-["Team Zook"]="Team Zook",
-["You have launched %d bazookas."]="Du hast %d Bazookas abgefeuert.",
-["Portal mission"]="Portalmission",
-["training"]="Training",
-["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."]="Hmmm, ich muss einen Weg finden, um ihn von dieser Antiportaloberfläche zu schubsen …",
-["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..."]="Die Antiportalzone ist über den ganzen Boden und ich habe nichts, um ihn zu töten. Vielleicht könnte ich ihn genug verletzen, wenn ich etwas fallenlasse.",
-["You can't fire a portal on the blue surface"]="Du kannst kein Portal auf der blauen Fläche öffnen.",
-[" What !! For all of this struggle i just win some ... TIME o0"]="Was?! Für all die Mühen gewinne ich nur etwas … ZEIT?",
-["Bloody Rookies"]="Blutige Anfänger",
-["Toxic Team"]="Giftige Gegner",
-["Poison"]="Gift",
-["Operation Diver"]="Taucher",
-["Eliminate Poison before the time runs out"]="Neutralisiere das Gift, bevor die Zeit abgelaufen ist.",
-["Private Novak"]="Gefreiter Novak",
-["Cluster Bomb Training"]="Splittergranatentraining",
-["You have to destroy 12 targets in 180 seconds"]="Du musst 12 Ziele in 180 Sekunden zerstören",
-["Cluster Bomb MASTER!"]="Clusterbombenmeister!",
-["Congratulations! You needed only half of time|to eliminate all targets."]="Gratulation! Du hast nur die Hälfte der Zeig benötigt,|um alle Ziele zu eliminieren.",
-["Oh no! You failed! Just try again."]="Oh nein! Du hast versagt! Versuch es nochmal.",
-["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"]="Nun finde das nächste Ziel! |Tipp: Normalerweise verlierst du Gesundheit, wenn du herunterfällst, also pass auf!",
-["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"]="Du wirst ziemlich gut! |Tipp: Wenn du dein Seil verkürzt, bewegst du dich schneller! |Und wenn du es verlängerst, wirst du langsamer.",
-["The next one is pretty hard! |Tip: You have to do multiple swings!"]="Die Nächste ist ziemlich schwer! |Tipp: Du musst mehrmals schwingen!",
-["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"]="Ich weiß nicht, wie du das getan hast. Aber gute Arbeit! |Die Nächste solle idiotensicher für dich sein!",
-["Congratulations"]="Gratulation",
-["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"]="Gratulation! Du hast die Seil-Einführung abgeschlossen! |- Die Einführung wird in 10 Sekunden beendet.",
-["Achievement Unlocked"]="Neue Errungenschaft",
-["Rope Master!"]="Seilmeister!",
-["Rope Training"]="Seiltraining",
-["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"]="Gute Arbeit! Nun triff es mit deinem Baseballschläger! |Tipp: Du kannst die Waffe mit [Rechtsklick] wechseln!",
-["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"]="Denk dran: Das Seil verbiegt sich nur um Objekte, |wenn es nichts trifft, wird es immer gerade sein.",
-["Rope Team"]="Seilteam",
-["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"]="Gelange zum Ziel mit deinem Seil! |Steuerung: Links/Rechts zum Schwingen – Hoch/Runter zum Ein- und Ausfahren!",
-["Tip: The rope physics are different than in the real world, |use it to your advantage!"]="Tipp: Die Seilphysik ist anders als in der realen Welt, |nutze das zu deinem Vorteil aus!",
-["You did not make it in time, try again!"]="Du hast es nicht rechtzeitig geschafft, versuch es nochmal!",
-["You have been respawned, at your last checkpoint!"]="Du wurdest zum letzten Kontrollpunkt zurückgesetzt!",
-["You have been respawned, be more carefull next time!"]="Du wurdest wiederbelebt, sei beim nächsten Mal vorsichtiger!",
-["Private Nolak"]="Gefreiter Nolak",
-["The Hogies"]="Die Igelinge",
-["You have thrown %d cluster bombs."]="Du hast %d Splitterbomben geworfen.",
-["Hero Team"]="Heldenteam",
-["Good Dude"]="Guter Junge",
-["Bad Team"]="Böses Team",
-["The Great Escape"]="Gesprengte Ketten",
-["Get out of there!"]="Geh weg!",
-["Elimate your captor."]="Eliminiere deinen",
-["'Zooka Team"]="Die Knalltüten",
-["Bazooka Training"]="Bazooka-Training",
-["Aiming practice"]="Zielübung",
-["hits"]="Treffer",
-["You have destroyed %d of %d targets."]="Du hast %d von %d Zielen zerstört.",
-["Your accuracy was %.1f%%."]="Deine Treffgenauigkeit betrug %.1f%%.",
-["%.1f seconds were remaining."]="Es verblieben %.1f.",
-["Pathetic Resistance"]="Erbärmlicher Widerstand",
-["Unit"]="Einheit",
-["Newton's Hammock"]="Newtons Hängematte",
-["User Challenge"]="Benutzerherausforderung",
-["Eliminate the enemy before the time runs out"]="Vernichte den Feind, bevor die Zeit abgelaufen ist",
-["Lonely Hog"]="Einsamer Igel",
-["Climber"]="Kletterer",
-["Water Gods"]="Wassergötter",
-["Nameless Heroes"]="Namenlose Helden",
-["Drowner"]="Absäufer",
-["Clowns"]="Clowns",
-["Nobody Laugh"]="Niemand darf lachen",
-["Spooky Tree"]="Spukiger Baum",
-["Eliminate all enemies"]="Vernichte alle Gegner",
-["Good birdy......"]="Braver Vogel …",
-["You have launched %d homing bees."]="Du hast %d zielsuchende Bienen abgefeuert.",
-["Unit 835"]="Einheit 835",
-["Bamboo Thicket"]="Bambusdickicht",
-["Energetic Engineer"]="Energetischer Ingenieur",
-["Wannabe Shoppsta"]="Möchtegernkäufer",
-["Unsuspecting Louts"]="Nichtsahnende Lümmel",
-["Unlucky Sods"]="Arme Schweine",
-["ROPE-KNOCKING"]="SEILSCHUBSEN",
-["MISSION SUCCESS"]="MISSIONSERFOLG",
-["COMPLETION TIME"]="ZEIT",
-["Use the rope to knock your enemies to their doom."]="Benutze das Seil, um deine Gegner in ihr Verderben zu stürzen!",
-["GG!"]="Gut gemacht!",
-["Ouch!"]="Autsch!",
-["Instructor"]="Ausbilder",
-["Blue Team"]="Blaues Team",
-["Filthy Blue"]="Blödblau",
-["Dangerous Ducklings"]="Gefährliche Entchen",
-["Eliminate the Blue Team"]="Lösche das Blaue Team aus",
-["Listen up, maggot!!"]="Aufgepasst, du Made!!",
-["!!!"]="!!!",
-["The enemy is hiding out on yonder ducky!"]="Der Feind versteckt sich auf dem Entlein dort drüben!",
-["Get on over there and take him out!"]="Mach, dass du hinüber kommst und schalte ihn aus!",
-["GO! GO! GO!"]="Los, los, los!",
-["DAMMIT, ROOKIE!"]="VERDAMMT, REKRUT!",
-["DAMMIT, ROOKIE! GET OFF MY HEAD!"]="VERDAMMT, REKRUT! RUNTER VON MEINEM KOPF!",
-[":("]=":(",
-["You've failed. Try again."]="Du bist gescheitert. Versuche es nochmal.",
-["See ya!"]="Mach's gut!",
-["Naughty Ninja"]="Böser Ninja",
-["Enjoy the swim..."]="Viel Spaß beim Schwimmen …",
-["Good luck out there!"]="Viel Glück da draußen!",
-["That Sinking Feeling"]="Land unter",
-["Save as many hapless hogs as possible!"]="Rette so viele glücklose Igel wie möglich!",
-["The Nameless One"]="Der Namenlose",
-["Hapless Hogs"]="Glücklose Igel",
-["Sinky"]="Blubb",
-["Heavy"]="Schwierig",
-["Clumsy"]="Hoppla",
-["Silly"]="Doofi",
-["Careless"]="Achtlos",
-["Sponge"]="Schwamm",
-["Deadweight"]="Gravitus",
-["Press [Precise] to skip intro"]="Drücke [Genaues Zielen], um das Intro zu überspringen",
-["This rain is really something..."]="Das nenne ich mal einen Regenschauer...",
-["Heh, it's not that bad."]="Hehe, so schlimm ist es nicht.",
-["You'd almost swear the water was rising!"]="Man könnte fast schwören das Wasser würde steigen!",
-["Haha, now THAT would be something!"]="Haha, na DAS wär ja was!",
-["Hahahaha!"]="Hahahaha!",
-["..."]="…",
-["It's a good thing SUDDEN DEATH is 99 turns away..."]="Gut, dass SUDDEN DEATH in 99 Runden ist …",
-["A frozen adventure"]="Ein frostiges Abenteuer",
-["Getting ready"]="Bereitmachen",
-["Collect the icegun and get the device part from Thanta"]="Sammle die Eiskanone ein und besorge das Bauteil von Thanta",
-["Win"]="Sieg",
-["Congratulations, you collected the device part!"]="Gratulation, du hast das Bauteil eingesammelt!",
-["Hog Solo"]="Igel Einsam",
-["Paul McHoggy"]="Paul McIgel",
-["Thanta"]="Thanta",
-["Billy Frost"]="Bernd Frost",
-["Ice Jake"]="Eis-Jakob",
-["John Snow"]="Jonas Schnee",
-["White Tee"]="Schneeweiß",
-["Allies"]="Verbündete",
-["Frozen Bandits"]="Frostbanditen",
-["Go to Thanta and get the device part!"]="Gehe zu Thanta und ergattere das Bauteil!",
-["Hog Solo lost, try again!"]="Igel Einsam hat verloren, versuch es nochmal!",
-["To win the game you have to go next to Thanta"]="Um das Spiel zu gewinnen, muss du neben Thanta stehen",
-["Most of the time you'll be able to use only the icegun"]="Die meiste Zeit wirst du nur die Eiskanone benutzen können",
-["Use the bazooka and the flying saucer to get the icegun"]="Benutze die Bazooka und die fliegende Untertasse, um die Eiskanone zu ergattern",
-["Checkpoint reached!"]="Kontrollpunkt erreicht!",
-["Noooo, Thanta has to stay alive!"]="Nein, Thanta muss am Leben bleiben!",
-["On the Ice Planet, where ice rules..."]="Auf dem Eisplaneten, wo das Eis herrscht …",
-["Finally you are here..."]="Endlich bist du hier …",
-["Hi! Nice to meet you"]="Hi! Schön, dich zu sehen.",
-["Listen carefully! The bandit leader, Thanta, has recently found a very strange device"]="Hör gut zu! Der Anführer der Banditen, Thanta, hat neulich ein sehr seltsames Gerät gefunden.",
-["He doesn't know it but this device is a part of the anti-gravity device"]="Er weiß es nicht, aber dieses Bauteil ist ein Teil des Antischwerkraftgeräts.",
-["Nice, then I should get the part as soon as possible!"]="Interessant, dann sollte ich besser das Teil so früh wie möglich holen!",
-["Be careful, your gadgets won't work in the bandit area. You should get an ice gun"]="Sei vorsichtig, deine Apparate werden im Banditenland nicht funktionieren. Du solltest eine Eiskanone holen.",
-["There is one below us!"]="Da ist eine unter uns!",
-["Congratulations, now you can take Thanta's device part..."]="Gratulation, nun kannst du dir Thantas Bauteil nehmen …",
-["Oh! Please spare me. You can take all my treasures!"]="Oh, bitte verschone mich! Du kannst all meine Schätze nehmen.",
-["I just want the strange device you found!"]="Ich will nur das seltsame Teil, das du gefunden hast.",
-["Here! Take it..."]="Hier, nimm es …",
-["Congratulations, you acquired the device part!"]="Gratulation, du hast das Bauteil erhalten!",
-["At the end of the game your health was "]="Am Ende des Spiels war deine Gesundheit ",
-["A Space Adventure"]="Ein Weltraumabenteuer",
-["The first stop"]="Der erste Halt",
-["Go to the upper platform and get the weapons in the crates!"]="Geh zur oberen Plattform und nimm dir die Waffen in den Kisten!",
-["Prepare to fight"]="Bereitmachen zum Kämpfen",
-["Go down and save these PAotH hogs!"]="Geh runter und rette diese PAdI-Igel!",
-["The fight begins!"]="Die Schlacht beginnt!",
-["Neutralize your enemies and be careful!"]="Neutralisiere deine Gegner und sei vorsichtig!",
-["Joe"]="Sepp",
-["Bruce"]="Brutus",
-["Helena"]="Helena",
-["Boris"]="Boris",
-["Prof. Hogevil"]="Prof. Bösigel",
-["Minion"]="Lakai",
-["PAotH"]="PAdI",
-["Minions"]="Lakaien",
-["Professor"]="Professor",
-["Hog Solo has to refuel his saucer."]="Igel Einsam muss seine Untertasse auftanken.",
-["Rescue the imprisoned PAotH team and get the fuel!"]="Rette das gefangene PAdI-Team und hol dir den Treibstoff!",
-["You have to get the weapons and rescue the PAotH researchers"]="Wir müssen die Waffen besorgen und die PAdI-Forscher retten.",
-["Don't hit me you fools!"]="Trefft mich nicht, ihr Idioten!",
-["The boss has fallen! Retreat!"]="Der Anführer ist gefallen! Rückzug!",
-["Congrats! You made them run away!"]="Gratulation! Du hast sie in die Flucht geschlagen!",
-["Hog Solo wins, congratulations!"]="Igel Einsam gewinnt, Gratulation!",
-["Eliminated the Professor Hogevil"]="Professor Bösigel eliminiert",
-["Drove the minions away"]="Seine Lakaien vertrieben",
-["I may lost this battle, but I haven't lost the war yet!"]="Ich mag vielleicht diese Schlacht verloren haben, aber ich habe den Krieg noch nicht verloren!",
-["Congrats! You won!"]="Gratulation! Du hast gewonnen!",
-["Congratulations, you won!"]="Gratulation, du hast gewonnen!",
-["Eliminated the evil minions"]="Die bösen Lakaien eliminiert",
-["Drove the Professor away"]="Den Professor vertrieben",
-["Near PAotH base at moon..."]="In der Nähe der PAdI-Basis am Mond …",
-["Hey Hog Solo! Finally you have come..."]="Hey, Igel Einsam! Endlich bist du angekommen …",
-["It seems that Professor Hogevil has prepared for your arrival!"]="Es scheint, dass sich Professor Bösigel sich auf deine Ankunft vorbereitet hat!",
-["He has captured the rest of the PAotH team and awaits to capture you!"]="Er hat den Rest des PAdI-Teams gefangen und wartet auf deine Gefangennahme!",
-["We have to hurry! Are you armed?"]="Wir müssen uns beeilen! Bist du bewaffnet?",
-["No, I am afraid I had to travel light"]="Nein, ich fürchte, dass ich mit wenig Gepäck reisen musste.",
-["Ok, then you have to go and take some of the weapons we have hidden in case of an emergency!"]="Okay, dann musst du gehen und ein paar der Waffen, die wir für den Notfall versteckt haben, nehmen.",
-["They are up there! Take this rope and hurry!"]="Sie sind da oben! Nimm dieses Seil und beeil dich!",
-["Ehm... ok..."]="Aha, okay …",
-["I've made it! YEAAAAAH!"]="Ich hab's geschafft! HURRA!",
-["Nice! Now hurry and get down! You have to rescue my friends!"]="Nett! Nun beeil dich und komm runter! Du musst meine Freunde retten!",
-["Get ready to fight!"]="Bereitmachen zum Kämpfen!",
-["Look boss! There is the target!"]="Sieh, Boss! Hier ist das Ziel!",
-["Prepare for battle!"]="Bereitmachen zum Kämpfen!",
-["Oops, I've been spotted and I have no weapons! I am doomed!"]="Upps! Ich wurde entdeckt und ich habe keine Waffen! Ich bin verloren!",
-["Here we go!"]="Auf geht's!",
-["Running for survival"]="Ums Überleben laufen",
-["Use the rope to quickly get to the surface!"]="Benutze das Seil, um schnell zur Oberfläche zu gelangen!",
-["To win the game you have to go to the surface"]="Um zu gewinnen, musst du zur Oberfläche gehen.",
-["Most mines are not active"]="Die meisten Minen sind Blindgänger.",
-["From the second turn and beyond the water rises"]="Vom 2. Zug an wird das Wasser steigen.",
-["You have escaped successfully"]="Du bist erfolgreich geflohen.",
-["Your escape took you "]="Deine Flucht dauerte ",
-["Many meters below the surface..."]="Viele Meter unter der Oberfläche …",
-["The tunnel is about to get flooded..."]="Der Tunnel wird gleich geflutet!",
-["I have to reach the surface as quickly as I can..."]="Du muss die Oberfläche so schnell wie möglich erreichen.",
-["Spacetrip"]="Weltraumreise",
-["Go to the moon by using the flying saucer and complete the main mission"]="Komm zum Mond, indem du die fliegende Untertasse benutzt und die Hauptmission beendest.",
-["Come back to this mission and visit the other planets to collect the crates"]="Kehre zu dieser Mission zurück und besuche die anderen Planeten, um die Kisten einzusammeln.",
-["Visit the Death Planet after completing all the other planets' main missions"]="Besuche den Todesplaneten, nachdem du die Hauptmissionen aller anderen Planeten fertiggestellt hast.",
-["Come back to this mission after collecting all the device parts"]="Kehre zu dieser Mission zurück, nachdem du alle Bauteile eingesammelt hast.",
-["Go and collect the crate"]="Geh und sammle die Kiste.",
-["Try not to get spotted by the guards!"]="Versuch, nicht von den Wächtern entdeckt zu werden!",
-["The adventure begins!"]="Das Abenteuer beginnt!",
-["Use the saucer and fly to the moon"]="Benutze die Untertasse und flieg zum Mond.",
-["Travel carefully as your fuel is limited"]="Reise vorsichtig, da dein Treibstoff begrenzt ist.",
-["An unexpected event!"]="Ein unerwartetes Ereignis!",
-["Use the saucer and fly away"]="Benutze die Untertasse und flieg davon!",
-["Beware, any damage taken will stay until you complete the moon's main mission"]="Achtung, jeglicher Schaden, den du nimmst, wird bleiben, bis du die Hauptmission des Mondes fertiggestellt hast.",
-["Objectives"]="Ziele",
-["Searching the stars!"]="Suche in den Sternen",
-["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"]="Besuche den Eis-, Wüsten- und Fruchtplaneten, bevor du mit dem Todesplaneten fortfährst.",
-["Saving Hogera"]="Hogera retten",
-["Fly to the meteorite and detonate the explosives"]="Fliege zum Meteroiten und sprenge die Bomben.",
-["H"]="H",
-["Dr.Cornelius"]="Dr. Cornelius",
-["Bob"]="Bert",
-["Sam"]="Steffen",
-["Guards"]="Wächter",
-["Help Hog Solo to find all the parts of the anti-gravity device."]="Hilf Igel Einsam, alle Bauteile des Antischwerkraftgerätes zu finden.",
-["Travel to all the neighbor planets and collect all the pieces"]="Reise zu allen Nachbarplaneten und sammle alle Bauteile ein.",
-["Now I have to climb these trees"]="Jetzt muss ich diese Bäume hochklettern.",
-["Use the rope to get to the crate"]="Benutze das Seil, um zur Kiste zu gelangen.",
-["One cannot simply walk in moon with rope!"]="Man kann nicht einfach so im Mond mit dem Seil spazieren!",
-["This is the wrong way!"]="Das ist die falsche Richtung!",
-["Collect the crate with the flying saucer"]="Sammle die Kiste mit der fliegenden Untertasse ein.",
-["Fly to the moon"]="Flieg zum Mond.",
-["Welcome to the moon!"]="Willkommen auf dem Mond!",
-["the moon"]="der Mond",
-["Welcome to the Fruit Planet!"]="Willkommen auf dem Fruchtplaneten!",
-["the Fruit Planet"]="der Fruchtplanet",
-["Welcome to the Desert Planet!"]="Willkommen auf dem Wüstenplaneten!",
-["the Desert Planet"]="der Wüstenplanet",
-["Welcome to the Planet of Ice!"]="Willkommen auf dem Eisplaneten!",
-["the Ice Planet"]="der Eisplanet",
-["Welcome to the Death Planet!"]="Willkommen auf dem Todesplaneten!",
-["the Planet of Death"]="der Todesplanet!",
-["Welcome to the meteorite!"]="Willkommen auf dem Meteorit!",
-["the meteorite"]="der Meteorit",
-["Near secret base 17 of PAotH in the rural Hogland..."]="In der Nähe der geheimen Basis 17 der PAdI im ländlichen Igelland …",
-["So Hog Solo, here we are..."]="Also, Igel Einsam, da wären wir!",
-["Behind these trees on the east side there is secret base 17"]="Hinter diesen Bäumen auf der Ostseite liegt die geheime Basis 17.",
-["You have to continue alone from now on."]="Von hier an musst du alleine fortfahren.",
-["Be careful, the future of Hogera is in your hands!"]="Sei vorsichtig, die Zukunft von Hogera liegt in deinen Händen!",
-["We'll use our communicators to contact you"]="Wir werden unsere Kommunikatoren benutzen, um dich zu kontaktieren.",
-["In am also entrusting you with some rope"]="Ich werde dir auch etwas Seil anvertrauen.",
-["You may find it handy"]="Du könntest es gebrauchen.",
-["Thank you Dr.Cornelius"]="Danke, Dr. Cornelius!",
-["I'll make good use of it"]="Ich werde es klug anwenden.",
-["It would be wiser to steal the space ship while PAotH guards are taking a brake!"]="Es wäre schlauer, das Raumschiff zu stehlen, während die PAdI-Wächter eine Pause machen!",
-["Remember! Many will seek the anti-gravity device! Now go, hurry up!"]="Denk dran: Viele werden das Antischwerkraftgerät begehren! Geh jetzt! Beeilung!",
-["CheckPoint reached!"]="Kontrollpunkt erreicht!",
-["Got the saucer!"]="Ich hab die Untertasse!",
-["Nice!"]="Nett!",
-["Now use it and go to the moon PAotH station to get more fuel!"]="Benutze es jetzt und komme zur PAdI-Mondbasis, um mehr Treibstoff zu holen!",
-["Prepare to flee!"]="Bereitmachen zum Fliehen!",
-["Hey"]="Hey",
-["Look, someone is stealing the saucer!"]="Sieh, jemand stiehlt die Untertasse!",
-["I'll get him!"]="Den schnapp ich mir!",
-["You are out of danger, time to go to the moon!"]="Du bist in Sicherheit. Zeit, zum Mond zu gelangen!",
-["I guess we lost him!"]="Ich glaube, wir haben ihn verloren!",
-["We should better report this and continue our watch!"]="Wir sollten dies besser melden und unsere Wache fortsetzen.",
-["I guess I can't go far without fuels!"]="Ich fürchte, ohne Treibstoff komme ich nicht weit.",
-["Go to go back"]="Ich muss umkehren.",
-["You have to try again!"]="Du muss es nochmal versuchen!",
-["Hm... Now I ran out of fuel..."]="Hmm … Jetzt ist mein Treibstoff alle.",
-["This planet seems dangerous!"]="Dieser Planet scheint gefährlich zu sein!",
-["I am not ready for this planet yet. I should visit it when I have found all the other device parts"]="Ich bin für diesen Planeten noch nicht bereit. Ich sollte ihn besuchen, sobald ich alle anderen Bauteile gefunden habe.",
-["Under the meteorite shadow..."]="Unter dem Schatten des Meteorits …",
-["You did great Hog Solo! However we aren't out of danger yet!"]="Du hast dich wacker geschlagen, Igel Einsam! Aber wir haben die Gefahren noch nicht überstanden.",
-["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now"]="Der Meteorit kam zu nah und das Antischwerkraftgerät ist zu schwach, um ihn jetzt zu stoppen.",
-["We need it to get split into at least two parts"]="Wir müssen ihn in mindestens zwei Teile zerbrechen.",
-["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"]="PAdI hat Sprengstoffe geschickt, aber leider scheint der Auslöser defekt zu sein.",
-["We need you to go there and detonate them yourself! Good luck!"]="Du musst dorthin gehen und sie selbst detonieren. Viel Glück!",
-["Hog Solo arrived at "]="Igel Einsam ist angekommen an ",
-["Return to the mission menu by pressing the \"Go back\" button"]="Kehre zum Missionsmenü zurück, indem du den »Zurück«-Knopf drückst.",
-["You can choose another planet by replaying this mission"]="Du kannst einen anderen Planeten auswählen, indem du diese Mission erneut spielst.",
-["Planets with completed main missions will be marked with a flower"]="Planeten, bei denen die Hauptmissionen erledigt wurden, werden mit einer Blume markiert.",
-["You have to travel again"]="Du musst erneut reisen.",
-["Your first destination is the moon in order to get more fuel"]="Dein erstes Ziel ist der Mond, um mehr Treibstoff zu erhalten.",
-["You have to complete the main mission on moon in order to travel to other planets"]="Du musst die Hauptmission auf dem Mond erledigen, damit du zu den anderen Planeten reisen kannst.",
-["You have to be careful and not die!"]="Du musst vorsichtig sein und darfst nicht sterben!",
-["Getting to the device"]="Zum Greifen nah",
-["Exploring the tunnel"]="Höhlenforscher",
-["Search for the device with the help of the other hedgehogs "]="Such nach dem Gerät mit der Hilfe der anderen Igel.",
-["Hog Solo has to reach the last crates"]="Igel Einsam muss die letzten Kisten erreichen.",
-["Explore the tunnel with the other hedgehogs and search for the device"]="Erforsche den Tunnel mit den anderen Igeln und such nach dem Gerät.",
-["Return to the Surface"]="Zurück an die Oberfläche",
-["Go to the surface!"]="Geh an die Oberfläche!",
-["Attack Captain Lime before he attacks back"]="Greif Leutnant Limone an, bevor er angreift.",
-["Attack the assassins before they attack back"]="Greif die Assassinen an, bevor sie angreifen.",
-["Captain Lime"]="Leutnant Limone",
-["Mister Pear"]="Herr Birne",
-["Lady Mango"]="Frau Mango",
-["Poisonous Apple"]="Giftapfel",
-["Dark Strawberry"]="Dunkle Erdbeere",
-["Watermelon Heart"]="Wassermelonenherz",
-["Deadly Grape"]="Traube des Todes",
-["Hog Solo and GB"]="Igel Einsam und GB",
-["Fruit Assassins"]="Fruchtassassinen",
-["To win the game, Hog Solo has to get the bottom crates and come back to the surface"]="Um das Spiel zu gewinnen, muss Igel Einsam zu den unteren Kisten gelangen und wieder zurück zur Oberfläche kommen.",
-["You can use the other 2 hogs to assist you"]="Du kannst die anderen beiden Igel benutzen, um dich zu unterstützen.",
-["Do not destroy the crates"]="Zerstöre nicht die Kisten.",
-["You'll have to eliminate the Strawberry Assassins at the end"]="Am Ende musst du die Erdbeerassassinen eliminieren.",
-["You'll have to eliminate Captain Lime at the end"]="Am Ende musst du Leutnant Limone eliminieren.",
-["Don't eliminate Captain Lime before collecting the last crate!"]="Eliminiere Leutnant Limone nicht, bevor du die letzte Kiste eingesammelt hast!",
-["You retrieved the lost part"]="Du hast das verlorene Teil ergattert",
-["You defended yourself against Captain Lime"]="Du hast dich gegen Leutnant Limone gewehrt",
-["You defended yourself against Strawberry Assassins"]="Du hast dich gegen die Erdbeerassassinen gewehrt",
-["Somewhere else on the planet of fruits Captain Lime helps Hog Solo..."]="Irgendwo anders auf dem Planeten der Früchte hilft Leutnant Limone Igel Einsam.",
-["You fought bravely and you helped us win this battle!"]="Du hast mutig gekämpft und uns geholfen, diese Schlacht zu gewinnen!",
-["So, as promised I have brought you where I think that the device you are looking for is hidden."]="Nun, wie versprochen habe ich dich an den Ort gebracht, von dem ich glaube, dass das Gerät dort versteckt ist.",
-["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."]="Ich weiß, dass deine Ressourcen aufgrund der Schlacht begrenzt sind, aber ich werde dir zwei meiner besten Igel schicken, um die zu helfen.",
-["Good luck!"]="Viel Glück!",
-["Somewhere else on the planet of fruits Hog Solo gets closer to the device..."]="Anderswo auf dem Planeten der Früchte kommt Igel Einsam näher an das Gerät.",
-["You are the one who fled! So, you are alive..."]="Du bist der, der floh! Du lebst also …",
-["I'm still low on hogs. If you are not afraid I could use a set of extra hands"]="Ich habe immer noch wenige Igel. Wenn du keine Angst hast, könnte ich etwas Unterstützung gebrauchen.",
-["I am sorry but I was looking for a device that may be hidden somewhere around here"]="Tut mir Leid, aber ich suchte nach einem Gerät, das hier irgendwo versteckt sein könnte.",
-["Many long forgotten things can be found in the same tunnels that we are about to explore!"]="Viele vergessene Dinge können in denselben Tunneln, die wir gleich erforschen werden, finden.",
-["If you help us you can keep the device if you find it but we'll keep everything else"]="Wenn du uns hilfst, darfst du das Gerät behalten, wenn du es findest, aber wir werden alles andere behalten.",
-["What do you say? Are you in?"]="Was sagst du? Bist du dabei?",
-["Ok then!"]="Alles klar!",
-["Hoorah! I've found it, now I have to get back to Captain Lime!"]="Hurra! Ich habe es gefunden, nun muss ich zurück zu Leutnant Limone!",
-["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"]="Dieser Igel Einsam ist so naiv! Wenn er zurückkehrt, werde ich ihn erschießen und das Gerät für mich selbst behalten!",
-["We have spotted the enemy! We'll attack when the enemies start gathering!"]="Wir haben den Feind gesichtet! Wir werden angreifen, sobald sich die Feinde versammeln.",
-["Hard flying"]="Schwerer Flug",
-["To win the game you have to pass into the rings in time"]="Um dieses Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen.",
-["You'll get extra time in case you need it when you pass a ring"]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst.",
-["Every 2 rings, the ring color will be green and you'll get an extra flying saucer"]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse",
-["Use space button twice to change flying saucer while floating in mid-air"]="Drücke die Leertaste 2 mal, um die fliegende Untertasse im Flug zu wechseln.",
-["Challenge Objectives"]="Herausforderungsziele",
-["Hoorah! You are a champion!"]="Hurra! Du bist ein Champion!",
-["You completed the mission in "]="Du hast die Mission fertiggestellt in ",
-["You have used "]="Du hast benutzt ",
-["You had "]="Du hattest ",
-["In the Ice Planet flying saucer stadium..."]="Im Stadion der fliegenden Untertassen auf dem Eisplaneten …",
-["This is the Olympic stadium of saucer flying..."]="Das ist das olympische Stadion des Untertassenflugs.",
-["All the saucer pilots dream to come here one day in order to compete with the best!"]="Alle Untertassenpiloten träumen davon, hier eines Tages herzukommen, um gegen die Besten um die Wette zu fliegen!",
-["Now you have the chance to try and claim the place that you deserve among the best..."]="Jetzt hast du die Gelegenheit, es selbst zu versuchen, und dir einen Rang unter den Besten zu verdienen.",
-["Use the saucer and pass through the rings..."]="Benutze die Untertasse und passiere die Ringe.",
-["Pause the game by pressing the pause key (default \"P\") for more details"]="Pausiere das Spiel, indem du die Pausetaste (standardmäßig »P«) drückst, um mehr zu erfahren.",
-["... can you do it?"]="Kannst du es schaffen?",
-["Got 1 more saucer"]="1 neue Untertasse",
-[" and 8 more seconds added to the clock"]=" und 8 Bonussekunden auf die Uhr",
-["6 more seconds added to the clock"]="6 Bonussekunden auf die Uhr",
-["Oh man! Learn how to fly!"]="Oh, Mann! Lern erstmal fliegen!",
-["Every 2 rings you'll get extra flying saucers"]="Alle 2 Ringe erhälst du neue fliegende Untertassen",
-["Use space button twice to change flying saucer while being on air"]="Drücke die Leertaste 2 mal, um die fliegende Untertasse im Flug zu wechseln",
-["The last encounter"]="Das letzte Gefecht",
-["The final part"]="Das letzte Bauteil",
-["Defeat Professor Hogevil!"]="Besiege Professor Bösigel!",
-["thug"]="Rowdy",
-["To win the game you have to eliminate all your enemies"]="Um das Spiel zu gewinnen, musst du all deine Gegner eliminieren",
-["You have successfully eliminated Professor Hogevil"]="Du hast Professor Bösigel erfolgreich eliminiert!",
-["You have rescued H and Dr.Cornelius"]="Du hast H und Dr. Cornelius gerettet.",
-["You have acquired the last device part"]="Du hast das letzte Bauteil erhalten.",
-["Now go and play the menu mission to complete the campaign"]="Geh jetzt und spiele die Menümission, um die Kampagne zu beenden.",
-["Somewhere in the uninhabitable Death Planet..."]="Irgendwo auf dem unbewohnbaren Todesplaneten …",
-["Welcome Hog Solo, surprised to see me?"]="Hallo, Igel Einsam! Bist du überrascht, mich zu sehen?",
-["As you can see I have survived our last encounter and I had time to plot my master plan!"]="Wie du sehen kannst, habe ich unser letztes Zusammentreffen überlebt und ich hatte Zeit, meinen Masterplan auszuhecken.",
-["I've thought that the best way to get the device is to let you collect most of the parts for me!"]="Ich dachte mir, dass es am einfachsten ist, wenn ich dich einfach die meisten Bauteile für mich sammeln lasse.",
-["So, now I got the last part and I have your friends captured..."]="Und jetzt habe ich das letzte Teil und deine Freunde gefangengenommen.",
-["Will you give me the other parts?"]="Wirst du mir die anderen Teile geben?",
-["I will never hand you the parts!"]="Niemals gebe ich dir die Teile!",
-["Then prepare for battle!"]="Dann mach dich bereit für die Schlacht!",
-["Searching in the dust"]="Suche im Staub",
-["The device part is hidden in one of the crates! Go and get it!"]="Das Bauteil ist in einer der Kisten versteckt. Geh und hole es!",
-["Most of the destructible terrain in marked with blue color"]="Das meiste des zerstörbaren Geländes ist mit einer blauen Farbe markiert.",
-["Chief Sandologist"]="Haupt-Sandologe",
-["Sandy"]="Sandi",
-["Spike"]="Stachel",
-["Sandstorm"]="Sandsturm",
-["Smugglers"]="Schmuggler",
-["The part device is hidden in one of the crates! Go and get it!"]="Das Bauteil ist in einer der Kisten versteckt. Geh und hole es!",
-["A smuggler! Prepare for battle"]="Ein Schmuggler! Bereitmachen zum Kämpfen!",
-["Run away you coward!"]="Lauf weg, du Feigling!",
-["Who's there?! I'll get you..."]="Wer ist da? Ich krieg dich …",
-["In the Planet of Sand, you have to double check your moves..."]="Auf dem Sandplaneten musst du deine Züge gut überlegen …",
-["Thank you for meeting me on such a short notice!"]="Danke, dass du mich so kurzfristig getroffen hast!",
-["No problem, I would do anything for H!"]="Kein Problem, ich würde alles für H tun!",
-["Now listen carefully! Below us there are tunnels that have been created naturally over the years"]="Jetzt hör gut zu! Unter uns sind Tunnel, welche über die Jahre natürlich entstanden sind.",
-["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here"]="Ich hörte, dass die örtlichen Stämme sagen, dass vor vielen Jahren einige PAdI-Wissenschaftler ihren Müll dort abgeliefert haben.",
-["H confirmed that there isn't such a PAotH activity logged"]="H bestätigte, dass eine solche PAdI-Aktivität nicht protokolliert ist.",
-["So, I believe that it's a good place to start"]="Also glaube ich, dass es ein guter Ort zum Anfangen ist.",
-["Beware though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find"]="Aber Vorsicht! Viele Schmuggler kommen oft hier her, um diese Tunnel zu durchsuchen und alles mögliche, was sie finden, zu sammeln.",
-["They won't hesitate to attack you in order to rob you!"]="Sie werden nicht zögern, dich anzugreifen, um dich auszurauben!",
-["OK, I'll be extra careful!"]="Okay, ich werde besonders vorsichtig sein!",
-["There is the tunnel entrance"]="Hier ist der Tunneleingang.",
-["Get him Spike!"]="Hol ihn, Stachel!",
-["This is seems like a wealthy hedgehog, nice..."]="Das sieht wie ein reicher Igel aus, nett.",
-["Haven't found it yet..."]="Ich hab es noch nicht gefunden.",
-["Hoorah!!!"]="Hurra!",
-["To win the game you had to collect the 2 crates with no specific order"]="Um das Spiel zu gewinnen, musst du die 2 Kisten in beliebiger Reihenfolge einsammeln.",
-["To win the game you have to find the right crate"]="Um das Spiel zu gewinnen, musst du die richtige Kiste finden.",
-["You can avoid some battles"]="Du kannst einige Kämpfe vermeiden.",
-["Use your ammo wisely"]="Benutze deine Munition weise.",
-["Don't destroy the device crate!"]="Zerstöre nicht die Kiste mit dem Bauteil!",
-["Precise shooting"]="Präzisionsschießen",
-["Use your available weapons in order to eliminate the enemies"]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren.",
-["You can only use the Sniper Rifle or the Watermelon bomb"]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen.",
-["You'll have only 2 watermelon bombs during the game"]="Du hast nur 2 Wassermelonenbomben während des Spiels.",
-["You'll get an extra Sniper Rifle every time you kill an enemy hog with a limit of max 4 rifles"]="Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre).",
-["You'll get an extra Teleport every time you kill an enemy hog with a limit of max 2 teleports"]="Du erhältst einen zusätzlichen Teleporter für jeden Igel (max. 2 Teleporter).",
-["The first turn will last 25 sec and every other turn 15 sec"]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern.",
-["If you skip a turn then the turn time left will be added to your next turn"]="Wenn du einen Zug überspringst, wird die Zugzeit auf deinen nächsten Zug addiert.",
-["Some parts of the land are indestructible"]="Einige Teile des Landes sind unzerstörbar.",
-["Hog 1"]="Igel 1",
-["Hog III"]="Igel III",
-["Hog 100"]="Igel 100",
-["Hog Saturn"]="Igel Saturn",
-["Hog nueve"]="Igel nueve",
-["Hog onze"]="Igel onze",
-["Hog dertien"]="Igel dertien",
-["Hog 3x5"]="Igel 3x5",
-["Hog two"]="Igel zwei",
-["Hog D"]="Igel D",
-["Hog exi"]="Igel exi",
-["Hog octo"]="Igel octo",
-["Hog decar"]="Igel decar",
-["Hog Hephaestus"]="Igel Hephaestus",
-["Hog 7+7"]="Igel 7+7",
-["Hog EOF"]="Igel EOF",
-["RS1"]="RS1",
-["RS2"]="RS2",
-["You have to eliminate all the enemies"]="Du musst alle Gegner eliminieren.",
-["Read the Challenge Objectives from within the mission for more details"]="Lies die Herausforderungsziele in der Mission für mehr Details.",
-["You complete the mission in "]="Du hast die Mission abgeschlossen in ",
-["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission"]="Du wirst etwas zusätzliche Munition aus den Kisten erhalten, wenn du das nächste mal die Mission »Zum Greifen nah« spielst",
-["Somewhere in the Fruit Planet Hog Solo got lost..."]="Irgendwo im Fruchtplaneten hat sich Igel Einsam verlaufen.",
-["...and got ambushed by the Red Strawberries"]="… und von den Roten Erdbeeren überfallen wurdest.",
-["If you skip the game your time left will be added to your next turn"]="Wenn du das Spiel überspringst, wird deine verbleibende Zeit für deinen nächsten Zug addiert.",
-["Bad timing"]="Schlechtes Timing",
-["Ready for Battle?"]="Bereit für die Schlacht?",
-["Walk left if you want to join Captain Lime or right if you want to decline his offer"]="Geh nach links, wenn du Leutnant Limone beitreten willst, oder nach rechts, wenn du sein Angebot ablehnen möchtest.",
-["Battle Starts Now!"]="Jetzt beginnt die Schlacht!",
-["You have chosen to fight! Lead the Green Bananas to battle and eliminate all the enemies"]="Du hast dich für die Schlacht entschieden! Führe die Grünen Bananen in die Schlacht und eliminiere alle Feinde.",
-["Time to run!"]="Zeit, zu fliehen!",
-["You have chosen to flee... Unfortunately the only place where you can launch your saucer is the left-most place on the map"]="Du hast dich für die Flucht entschieden. Leider ist der einzige Ort, wo du deine Untertasse starten kannst, ganz links auf der Karte.",
-["Green Hog Grape"]="Grünigeltraube",
-["Mr Mango"]="Mister Mango",
-["General Lemon"]="General Limone",
-["Robert Yellow Apple"]="Robert Gelbapfel",
-["Summer Squash"]="Sommerkürbis",
-["Tall Potato"]="Großkartoffel",
-["Yellow Pepper"]="Gelbpaprika",
-["Corn"]="Mais",
-["Max Citrus"]="Max Zitron",
-["Naranja Jed"]="Orangus Otus",
-["Green Bananas"]="Grüne Bananen",
-["Yellow Watermelons"]="Gelbe Wassermelonen",
-["Green Bananas won!"]="Die Grünen Bananen haben gewonnen!",
-["You have eliminated all visible enemy hedgehogs!"]="Du hast alle sichtbaren feindlichen Igel besiegt!",
-["Hog Solo escaped successfully!"]="Igel Einsam ist erfolgreich geflohen!",
-["You have reached the take-off area successfully!"]="Du hast das Startfeld erfolgreich erreicht!",
-["Somewhere on the Planet of Fruits a terrible war is about to begin..."]="Irgendwo auf dem Planeten der Früchte steht ein fürchterlicher Krieg bevor.",
-["I was told that as the leader of the king's guard, no one knows this world better than you!"]="Mir wurde gesagt, dass, als der Führer der königlichen Garde, niemand diese Welt besser als du kennst!",
-["So, I kindly ask for your help"]="Also bitte ich dich ergebenst um Hilfe.",
-["You couldn't have come to a worse time Hog Solo!"]="Du könntest du einer kaum schlechteren Zeit ankommen, Igel Einsam!",
-["The clan of the Red Strawberry wants to take over the dominion and overthrone king Pineapple."]="Der Klan der Roten Erdbeere will die Herrschaft an sich reißen und König Ananas stürzen.",
-["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the kingdom of Sand to help to the annual dusting of the king's palace."]="Unter normalen Bedingungen könnten wir sie leicht besiegen, aber wir hatten freundlicherweise die Meisten unserer Männer zum Sandkönigreich geschickt, um bei der jährlichen Entstaubung des Königspalasts zu helfen.",
-["However the army of Yellow Watermelons is about to attack any moment now."]="Aber die Armee der Gelben Wassermelonen wird jeden Moment angreifen.",
-["I would gladly help you if we won this battle but under these circumstances I'll only help you if you fight for our side."]="Ich würde dir gerne helfen, wenn wir diese Schlacht gewinnen, aber unter diesen Bedingungen kann ich dir nur helfen, wenn du an unserer Seite kämpfst.",
-["What do you say? Will you fight for us?"]="Was sagst du? Wirst du für uns kämpfen?",
-["You choose well Hog Solo!"]="Gute Wahl, Igel Einsam!",
-["I have only 3 hogs available and they are all cadets"]="Ich habe nur 3 Igel, uns sie sind alle Kadetten.",
-["As you are more experienced, I want you to lead them to the battle"]="Da du erfahrener bist, will ich, dass du sie in der Schlacht anführst.",
-["I of course will observe the battle and intervene if necessary"]="Ich werde natürlich die Schlacht beobachten und, wenn nötig, einschreiten.",
-["No problem Captain!"]="Kein Problem, Leutnant!",
-["The enemies aren't many anyway, it is going to be easy!"]="Es sind eh nicht so viele Feinde, es wird einfach sein!",
-["Don't be foolish son, there will be more"]="Sei kein Idiot, Sohn, es werden mehr kommen.",
-["Try to be smart and eliminate them quickly. This way you might scare off the rest!"]="Versuch, schlau zu sein und sie schnell zu erledigen. Auf diese Weise könntest du den Rest abschrecken!",
-["Too bad... Then you should really leave!"]="Schade. Dann solltest du wirklich gehen!",
-["Things are going to get messy around here"]="Es wird hier gleich richtig hässlich werden.",
-["Also, you should know that the only place where you can fly is the left-most part of this area"]="Außerdem solltest du wissen, dass der einzige Ort, wo du fliegen kannst, ganz links in diesem Gebiet ist.",
-["All the other places are protected by our flight-inhibiting weapons"]="Alle anderen Orte sind von unseren flugverhindernden Waffen geschützt.",
-["Now go and don't waste more of my time you coward..."]="Jetzt geh, und vergeude meine Zeit nicht noch weiter, du Feigling!",
-["The Green Bananas lost, try again!"]="Die Grünen Bananen haben verloren, versuche es nochmal!",
-["You have to eliminate all the visible enemies"]="Du musst alle sichtbaren Gegner eliminieren.",
-["5 additional enemies will be spawned during the game"]="5 weitere Gegner werden während des Spiels auftauchen.",
-["You are in control of all the active ally units"]="Du hast die Kontrolle über alle aktive verbündete Einheiten.",
-["The ally units share their ammo"]="Die verbündeten Einheiten teilen ihre Munition.",
-["Try to keep as many allies alive as possible"]="Versuch, so viele Verbündete wie möglich am Leben zu erhalten.",
-["Hog Solo couldn't escape, try again!"]="Igel Einsam konnte nicht fliehen, versuch es nochmal!",
-["You have to get to the left-most land and remove any enemy hog from there"]="Du musst zum linken Rand gelangen und von dort alle feindlichen Igel beseitigen.",
-["You will play every 3 turns"]="Du wirst alle 3 Züge spielen.",
-["Green hogs won't intentionally hurt you"]="Grüne Igel werden dich nicht absichtlich verletzen.",
-["Next wave in 3 turns"]="Nächte Welle in 3 Zügen",
-["Last wave in 3 turns"]="Letzte Welle in 3 Zügen",
-["Killing the specialists"]="Die Spezialisten töten",
-["Each time you play this missions enemy hogs will play in a random order"]="Jedes mal, wenn du diese Mission spielst, werden die feindlichen Igel in einer zufälligen Reihenfolge spielen.",
-["At the start of the game each enemy hog has only the weapon that he is named after"]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nachdem er benannt wurde.",
-["A random hedgehog will inherit the weapons of his deceased team-mates"]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben.",
-["If you kill a hedgehog with the respective weapon your health points will be set to 100"]="Wenn du einen Igel mit der entsprechenden Waffe tötest, wird deine Gesundheit auf 100 gesetzt.",
-["If you injure a hedgehog you'll get 35% of the damage dealt"]="Wenn du einen Igel verletzt, wirst du 35% des angerichteten Schadens erhalten.",
-["Every time you kill an enemy hog your ammo will get reset"]="Bei jedem Mal, in dem du einen feindlichen Igel tötest, wird deine Munition zurückgesetzt.",
-["Rope won't get reset"]="Seil wird nicht zurückgesetzt.",
-["Mortar"]="Mörser",
-["Desert Eagle"]="Desert Eagle",
-["Grenade"]="Granate",
-["Shoryuken"]="Shoryuken",
-["Bazooka"]="Bazooka",
-["5 deadly hogs"]="5 tödliche Igel",
-["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a Laser Sight"]="Die nächsten 4 Male, die du die Mission »Das letzte Gefecht« spielst, wirst du 20 weitere Trefferpunkte und ein Laservisier erhalten.",
-["Somewhere in the Planet of Death..."]="Irgendwo auf dem Todesplaneten …",
-["...Hog Solo fights for his life"]="… kämpft Igel Einsam ums Überleben.",
-["Precise flying"]="Präzisionsfliegen",
-["Use the RC plane and destroy the all the targets"]="Benutze das Funkflugzeug und zerstöre alle Ziele.",
-["Each time you destroy all the targets on your current level you'll get teleported to the next level"]="Jedes mal, wenn du alle Ziele im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert",
-["You'll have only one RC plane at the start of the mission"]="Am Anfang der Mission hast du nur ein Funkflugzeug.",
-["During the game you can get new RC planes by collecting the weapon crates"]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammest.",
-["On the Desert Planet, Hog Solo found some time to play with his RC plane..."]="Auf dem Wüstenplaneten hat Igel Einsam etwas Zeit gefunden, um mit seinem Funkflugzeug zu spielen.",
-["Level 1 clear!"]="Level 1 abgeschlossen!",
-["Level 2 clear!"]="Level 2 abgeschlossen!",
-["Congratulations, you are the best!"]="Gratulation, du bist der Beste!",
-["You have destroyed all the targets"]="Du hast alle Ziele zerstört.",
-["You are indeed the best PAotH pilot"]="Du bist wirklich der beste PAdI-Pilot.",
-["Next time you play \"Searching in the dust\" you'll have an RC plane available"]="Das nächste Mal, wenn du die Mission »Suche im Staub« spielst, bekommst du ein Funkflugzeug.",
-["You have to destroy all the targets"]="Du musst alle Ziele zerstören.",
-["You will fail if you run out of ammo and there are still targets available"]="Du wirst verlieren, wenn du keine Munition mehr hast und immer noch Ziele übrigbleiben.",
-["The big bang"]="Der Urknall",
-["Find a way to detonate all the explosives and stay alive!"]="Finde einen Weg, alle Sprengstoffe zu detonieren und bleib am Leben!",
-["Red areas are indestructible"]="Rote Bereiche sind unzerstörbar.",
-["Green areas aren't portal enabled"]="Grüne Bereiche sind portalabweisend.",
-["You have to destroy all the explosives without dying!"]="Du musst alle Sprengstoffe zerstören, ohne zu sterben!",
-["Congratulations, you have saved Hogera!"]="Gratulation, du hast Hogera gerettet!",
-["Hogera is safe!"]="Hogera ist in Sicherheit!",
-["Chasing the blue hog"]="Jag' den blauen Igel",
-["Use the rope in order to catch the blue hedgehog"]="Benutze das Seil, um den blauen Igel zu fangen.",
-["You have to stand very close to him"]="Du musst sehr nahe an ihm stehen.",
-["Crazy Runner"]="Verrückter Renner",
-["On the other side of the moon..."]="Auf der anderen Seite des Mondes …",
-["So you are interested in Professor Hogevil"]="Also bist du in Professor Bösigel interessiert.",
-["We'll play a game first"]="Wir spielen zuerst ein Spiel.",
-["I'll let you know whatever I know about him if you manage to catch me 3 times"]="Ich lass dich wissen, was ich über ihn weiß, wenn du es schaffst, mich 3 mal zu fangen.",
-["Let's go!"]="Los geht's!",
-["The truth about Professor Hogevil"]="Die Wahrheit über Professor Bösigel",
-["Amazing! I was never beaten in a race before!"]="Großartig! Ich wurde zuvor noch nie in einem Wettlauf geschlagen!",
-["So, let me tell you what I know about Professor Hogevil..."]="Also, lass mich erzählen, was ich über Professor Bösigel weiß.",
-["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time"]="Professor Bösigel, früher bekannt als Jakobus Iglus, arbeitete in meiner Zeit für PAdI.",
-["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device"]="Er war der Laborassistent von Dr. Gutigeln, dem Erfinder des Antischwerkraftgeräts.",
-["During the final testing of the device an accident happened"]="Während des letzten Tests des Gerätes ist ein Unfall passiert.",
-["In this accident Professor Hogevil lost all his spines on his head!"]="Bei diesem Unfall hat Professor Bösigel all seine Stacheln auf seinem Kopf verloren!",
-["That's why he always wears a hat since then"]="Deshalb trägt er seit dem immer einen Hut.",
-["After that incident he went underground and started working on his plan to steal the device"]="Nach dem Unfall ging er in den Untergrund und arbeitete an seinem Plan, um das Gerät zu stehlen.",
-["He is a very tough and very determined hedgehog. I would be extremely careful if I were you"]="Er ist ein sehr starker und willensstarker Igel. An deiner Stelle wäre ich sehr vorsichtig.",
-["I should go now, goodbye!"]="Ich sollte jetzt gehen. Tschüss!",
-["Go get him again"]="Los, hol ihn dir wieder!",
-["You got me"]="Du hast mich.",
-["Too slow! Try again..."]="Zu langsam! Versuch es nochmal.",
-["You have to catch the other hog 3 times"]="Du musst den anderen Igel 3 mal fangen.",
-["The time that you have left when you reach the blue hedgehog will be added to the next turn"]="Deine Verbleibende Zeit wird zu deinem nächsten Zug addiert, sobald du den blauen Igel erreichst.",
-["Each turn you'll have only one rope to use"]="In jedem Zug kannst du nur ein Seil benutzen.",
-["You'll lose if you die or if your time is up"]="Du verlierst, wenn du stirbst oder deine Zeit abläuft.",
-["Congratulations, you are the fastest!"]="Gratulation, du bist der Schnellste!",
-["You have managed to catch the blue hedgehog in time"]="Du hast es geschafft, den blauen Igel rechtzeitig zu fangen.",
-["Brainiac"]="Hirni",
-["Corpsemonger"]="Leichenschänder",
-["Femur Lover"]="Schenkellieber",
-["Glark"]="Glark",
-["Bonely"]="Knochi",
-["Rot Molester"]="Rottiger Störenfried",
-["Bloodrocutor"]="Blutfrierer",
-["Muscle Dissolver"]="Muskellöser",
-["Bloodsucker"]="Blutsauger",
-["The Shadow Falls"]="Die Schattenfälle",
-["The Showdown"]="Das Showdown",
-["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."]="Rette Undichte Stelle!|Tipp: Die Igelwahl könnte behilflich sein.",
-["Play with me!"]="Spiel mit mir!",
-["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"]="Verteidige dich!|Tipp: Du kannst Tipps über die Benutzung der Waffen erhalten, indem du im Waffenauswahlmenü mit dem Mauszeiger auf sie zeigst.",
-["Why do you not like me?"]="Warum magst du mich nicht?",
-["Obliterate them!|Hint: You might want to take cover..."]="Vernichte sie!|Tipp: Du solltest in Deckung gehen.",
-["The Dilemma"]="Das Dilemma",
-["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..."]="Wähl deine Seite! Wenn du dem seltsamen Mann beitreten willst, geh zu ihm hin.|Geh ansonsten von ihm fort. Wenn du angr… Vergiss es!",
-["The walk of Fame"]="Die Ruhmesmeile",
-["Return to Leaks A Lot! If you get stuck, press [Precise] to try again!"]="Kehr zu Undichte Stelle zurück! Wenn du steckenbleibst, drücke [Genaues Zielen], um es erneut zu versuchen!",
-["The Individualist"]="Der Individualist",
-["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"]="Besiege die Kannibalen!|Granatentipp: Setze den Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.",
-["Pfew! That was close!"]="Puh! Das war knapp!",
-["Where did you get the exploding apples and the magic bow that shoots many arrows?"]="Woher hast du die explodierenden Äpfel und den magischen Bogen, der so viele Pfeile verschießt?",
-["Where did you get the exploding apples?"]="Woher hast du den explodierenden Apfel?",
-["Where did you get the magic bow that shoots many arrows?"]="Woher hast du den magischen Bogen, der so viele Pfeile verschießt?",
-["Did you warn the village?"]="Hast du das Dorf gewarnt?",
-["No, I came back to help you out..."]="Nein, ich kam zurück, um dir zu helfen.",
-["Uhm...I met one of them and took his weapons."]="Ähm, ich hab einen von ihnen getroffen und nahm seine Waffen.",
-["We should head back to the village now."]="Wir sollten zum Dorf zurückkehren.",
-["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."]="Nach dem Schock, der vom feindlichen Spion ausgelöst wurde, gingen Undichte Stelle und Dichte Wolke zur Entspannung auf die Jagd.",
-["Little did they know that this hunt will mark them forever..."]="Sie ahnten nicht, dass diese Jagd sie für immer zusammenschweißen würde.",
-["I have no idea where that mole disappeared...Can you see it?"]="Ich habe keine Ahnung, wohin dieser Maulwurf verschwand. Kannst du ihn sehen?",
-["Nope. It was one fast mole, that's for sure."]="Nee. Es war ein schneller Maulwurf, das ist klar.",
-["Please, stop releasing your \"smoke signals\"!"]="Bitte hör mit deinen »Rauchzeichen« auf!",
-["You're terrorizing the forest...We won't catch anything like this!"]="Du terrorisierst den Wald. Wir werden auf diese Weise nichts fangen!",
-["I can't believe it worked!"]="Ich kann nicht glauben, dass es funktioniert hat!",
-["That shaman sure knows what he's doing!"]="Dieser Schamane weiß genau, was er tut!",
-["Yeah...I think it's a 'he', lol."]="Ja, ich glaube, dass es ein »er« ist. (lach)",
-["It wants our brains!"]="Es will unsere Gehirne!",
-["Not you again! My head still hurts from last time!"]="Nicht du schon wieder! Mein Kopf tut mir immer noch vom letzten Mal weh!",
-["Did you see him coming?"]="Hast du ihn kommen sehen?",
-["No. Where did he come from?"]="Nein. Woher kam er?",
-["Are we there yet?"]="Sind wir schon da?",
-["This must be some kind of sorcery!"]="Das muss wohl eine Art Zauberei sein!",
-["I thought their shaman died when he tried our medicine!"]="Ich dachte, ihr Schamane starb, als er unsere Medizin probierte.",
-["I saw it with my own eyes!"]="Ich sah es mit meinen eigenen Augen!",
-["Then how do they keep appearing?"]="Also woher kommen sie?",
-["It's impossible to communicate with the spirits without a shaman."]="Es ist unmöglich, ohne einen Schamanen mit den Geistern zu kommunizieren.",
-["We need to warn the village."]="Ich muss das Dorf warnen.",
-["What a ride!"]="Was für eine Reise!",
-["We can't defeat them!"]="Wir können sie nicht besiegen!",
-["I'll hold them off while you return to the village!"]="Ich halte sie zurück, während du zum Dorf zurückkehrst.",
-["30 minutes later..."]="30 Minuten später …",
-["Greetings, cloudy one!"]="Grüße, du Wolkiger!",
-["I have come to make you an offering..."]="Ich kam, um dir ein Angebot zu machen.",
-["You are given the chance to turn your life around..."]="Ich gebe dir die Chance, dein Leben auf den Kopf zu stellen.",
-["If you agree to provide the information we need, you will be spared!"]="Wenn du einverstanden bist, uns die Information, die wir brauchen, zu geben, wirst du verschont!",
-["Have no illusions, your tribe is dead, indifferent of your choice."]="Mach dir keine Hoffnungen, dein Stamm ist tot, unabhängig von deiner Entscheidung.",
-["If you decide to help us, though, we will no longer need to find a new governor for the island."]="Wenn du uns helfen willst, brauchen wir für diese Insel keinen neuen Anführer zu suchen.",
-["If you know what I mean..."]="Wenn du verstehst, was ich meine.",
-["So? What will it be?"]="Also? Was ist deine Entscheidung?",
-["Great choice, Steve! Mind if I call you that?"]="Großartige Entscheidung, Stefan! Stört es dich, wenn ich dich so nenne?",
-["Whatever floats your boat..."]="Worauf immer du Lust hast.",
-["Great! You will be contacted soon for assistance."]="Gut! Du wirst schon bald für Unterstützung benachrichtigt.",
-["In the meantime, take these and return to your \"friend\"!"]="In der Zwischenzeit, nimm diese und kehre zu deinem »Freund« zurück!",
-["Your death will not be in vain, Dense Cloud!"]="Dein Tod wird nicht ungesühnt bleiben, Dichte Wolke!",
-["You will be avenged!"]="Du wirst gerächt!",
-["I see..."]="Ich verstehe …",
-["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"]="Denk dran, du erbärmliches Tier: Wenn der Tag gekommen ist, wirst du deine blinde Loyalität bereuen!",
-["You just committed suicide..."]="Du hast gerade Selbstmord begangen.",
-["If you say so..."]="Wenn du es sagst …",
-["Dude, we really need a new shaman..."]="Mann, wir brauchen wirklich einen neuen Schamanen.",
-["It's over..."]="Es ist vorbei.",
-["Let's head back to the village!"]="Lass uns zurück zum Dorf gehen!",
-["Really?! You thought you could harm me with your little toys?"]="Wirklich? Du dachtest, du könntest mich mit deinen kleinen Spielzeugen verletzen?",
-["You're pathetic! You are not worthy of my attention..."]="Du bist erbärmlich! Du hast meine Aufmerksamkeit nicht verdient.",
-["Actually, you aren't worthy of life! Take this..."]="Eigentlich hast du nicht das Recht, zu leben! Nimm das!",
-["Incredible..."]="Unglaublich.",
-["I wonder where Dense Cloud is..."]="Ich frag mich, wo Dichte Wolke ist.",
-["I can't wait any more, I have to save myself!"]="Ich kann nicht länger waren, ich muss selber zur Hilfe eilen!",
-["Where are all these crates coming from?!"]="Woher kommen all die Kisten?!",
-["I have to get back to the village!"]="Ich muss zum Dorf zurückkehren!",
-["Dense Cloud must have already told them everything..."]="Dichte Wolke muss ihnen bereits alles gesagt haben.",
-["Natives"]="Eingeborene",
-["Ramon"]="Ramon",
+["Made it!"]="Geschafft!",
+["Ahhh, home, sweet home. Made it in %d seconds."]="Ah, trautes Heim, Glück allein! Geschafft in %d Sekunden.",
+["You have beaten the challenge!"]="Du hast die Herausforderung gemeistert!",
+["Your height over time"]="Deine Höhe über die Zeit",
+["%s reached home in %.3f seconds. Congratulations!"]="%s has das Zuhause in %.3f Sekunden erreicht. Gratulation!",
+["%s bravely climbed up to a dizzy height of %d to reach home."]="Mutig erklomm %s eine schwindelerregende Höhe von %d, um das Zuhause zu erreichen.",
+["seconds"]="Sekunden",
+["%s has passed the best height of %s!"]="%s hat die beste Höhe von %s überschritten!",
+["%s never got the ninja diploma."]="%s ist bei der Ninjaprüfung durchgefallen.",
+["You have to move upwards, not downwards, %s!"]="Du musst nach oben, nicht nach unten, %s!",
+["%s never wanted to reach for the sky in the first place."]="%s wollte nie nach den Sternen greifen.",
+["%s should try the rope training mission first."]="%s sollte wohl zuerst das Seiltraining absolvieren.",
+["%s skipped ninja classes."]="%s hat den Ninjaunterricht geschwänzt.",
+["%s doesn’t really know how to handle a rope properly."]="%s weiß nicht, wie man mit einem Seil umgeht.",
+["Better luck next time!"]="Vielleicht klappt's beim nächsten Mal!",
+["It was all just bad luck!"]="So ein Pech!",
+["Well, that escalated quickly!"]="Das ging aber schnell in die Hose!",
+["What? Is it over already?"]="Wie? Ist es schon vorbei?",
+["You lose!"]="Du verlierst!",
+["%s was damn close to home."]="%s war verdammt nah an Zuhause.",
+["%s was close to home."]="%s war nah an Zuhause.",
+["%s was good, but not good enough."]="%s war gut, aber nicht gut genug.",
+["%s managed to pass half of the distance towards home."]="%s hat die Hälfte des Weges nach Hause absolviert.",
+["%s went over a quarter of the way towards home."]="%s hat über die Hälfte des Weges nach Hause absolviert.",
+["%s still had a long way to go."]="%s hatte noch einen langen Weg.",
+["%s made it past the hogosphere."]="%s hat es über die Igelspähre geschafft.",
+["%s barely made it past the hogosphere."]="%s hat es so gerade noch über die Igelsphäre geschafft.",
+["points"]="Punkte",
+["%s wins!"]="%s gewinnt!",
+["Team’s best heights per round"]="Die Besthöhen der Teams pro Runde",
+["This round’s award for ultimate disappointment goes to: Everyone!"]="Der ultimative Enttäuschungspreis geht in dieser Runde an: alle!",
+["%s (%s) reached for the sky and beyond with a height of %d!"]="%s (%s) griff nach den Sternen mit einer Höhe von %d!",
+["%s (%s) was certainly not afraid of heights: Peak height of %d!"]="%s (%s) hatte ganz bestimmt keine Höhenangst: Besthöhe von %d!",
+["%s (%s) does not have to feel ashamed for their best height of %d."]="%s (%s) braucht sich für die Besthöhe von %d nicht zu schämen.",
+["%s (%s) reached a decent peak height of %d."]="%s (%s) erreichte eine gute Besthöhe von %d.",
+["%s (%s) reached a peak height of %d."]="%s (%s) erreichte eine Besthöhe von %d.",
+["The Navy greets %s for managing to get in a distance of %d away from the mainland!"]="Die Marine grüßt %s für einen Abstand von %d vom Festland!",
+["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"]="Grüße von der Marine, %s (%s), für einen Abstand von %d vom Festland!",
+["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."]="Dein Igel hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.",
+["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."]="%s (%s) hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.",
+["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."]="Autsch! Das muss wehgetan haben. Du hast deinen armen Igel mit %d verstümmelt.",
+["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."]="Autsch! Das muss wehgetan haben. %s (%s) ist mit %d auf den Boden aufgeschlagen.",
+["Control pillars to score points."]="Behalte die Kontrolle über die Säulen, um Punkte zu erhalten.",
+["Goal"]="Ziel",
+["Team Scores"]="Teampunktestand",
+["Bat balls at your enemies and|push them into the sea!"]="Schlage Bälle auf deine Widersacher|und lass sie ins Meer fallen!",
+["Hedgewars-Knockball"]="Hedgewars-Schlagball",
+["TrophyRace"]="TrophyRace",
+["Use your rope to get from start to finish as fast as you can!"]="Nutze das Seil um von Start zu Ziel zu gelangen - so schnell du kannst!",
+["NEW fastest lap: "]="NEUE schnellste Runde: ",
+["Fastest lap: "]="Schnellste Runde: ",
+["Best laps per team: "]="Beste Rundenzeiten pro Team: ",
+["Team %d: "]="Team %d: ",
+["You've reached the goal!| |Time: "]="Ziel erreicht!| |Zeit: ",
+["Dense Cloud"]="Dichte Wolke",
+["Fiery Water"]="Feuerwasser",
["Leaks A Lot"]="Undichte Stelle",
-["Dense Cloud"]="Dichte Wolke",
-["Spiky Cheese"]="Stachliger Käse",
-["Weaklings"]="Schwächlinge",
-["Stronglings"]="Stärklinge",
-["011101001"]="011101001",
-["Y3K1337"]="Y3K1337",
-["Under Construction"]="Baustelle",
-["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"]="Um einen Träger zu platzieren, wähle ihn, benutze [Links] und [Rechts], um den Winkel und die Länge zu wählen, platziere ihn mit [Linksklick].",
-["A little gift from the cyborgs"]="Ein kleines Geschenk von den Cyborgs",
-["The guardian"]="Der Wächter",
-["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"]="Beschütze dich!|Granatentipp: Setze den Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.",
-["...and so the cyborgs took over the world..."]="Und so eroberten die Cyborgs die Welt …",
-["The First Encounter"]="Das erste Zusammentreffen",
-["Survive!|Hint: Cinematics can be skipped with the [Precise] key."]="Überlebe!|Tipp: Zwischensequenzen können mit der [Genaues Zielen]-Taste übersprungen werden.",
-["Fiery Water"]="Feuerwasser",
+["Fell From Grace"]="Fiel in Ungnade",
["Raging Buffalo"]="Wütender Büffel",
["Righteous Beard"]="Redlicher Bart",
-["Fell From Grace"]="Fiel in Ungnade",
-["Wise Oak"]="Weise Eiche",
["Eagle Eye"]="Adlerauge",
["Flaming Worm"]="Flammenwurm",
+["Wise Oak"]="Weise Eiche",
+["Bone Jackson"]="Knochen-Ede",
["Brain Teaser"]="Hirnreiz",
-["Bone Jackson"]="Knochen-Ede",
["Gimme Bones"]="Gib Knochen",
+["Bloodpie"]="Blutkuchen",
["Hedgibal Lecter"]="Iglibal Lector",
-["Bloodpie"]="Blutkuchen",
["Scalp Muncher"]="Skalpknabberer",
["Back Breaker"]="Rückenbrecher",
["Dahmer"]="Dahmer",
["Meiwes"]="Meiwes",
["Ear Sniffer"]="Ohrenschnüffler",
+["Muriel"]="Muriel",
["Regurgitator"]="Hochwürger",
-["Muriel"]="Muriel",
["Let them have a taste of my fury!"]="Lasst sie von meinem Zorn kosten!",
["There's more of them? When did they become so hungry?"]="Es gibt mehr von ihnen? Seit wann wurden sie so hungrig?",
["We are indeed."]="Das sind wir in der Tat.",
@@ -844,25 +169,27 @@
["I just don't want to sink to your level."]="Ich will nicht auf dein Niveau herabsinken.",
["Let us help, too!"]="Lass uns auch helfen!",
["No. You and the rest of the tribe are safer there!"]="Nein. Du und der Rest deines Stammes sind hier sicherer!",
+["! You bastards!"]="! Ihr Bastarde!",
["They killed "]="Sie töteten ",
-["! You bastards!"]="! Ihr Bastarde!",
["! Why?!"]="! Wieso?",
["That was just mean!"]="Das war einfach nur gemein!",
["Oh no, not "]="Oh nein, nicht ",
+["? Why?"]="? Warum",
["Why "]="Warum, ",
-["? Why?"]="? Warum",
-["What has "]="Was hat dir ",
[" ever done to you?!"]=" jemals angetan?!",
+["What has "]="Was hat dir ",
["Backstab"]="Verrat",
+["Defeat the cannibals"]="Besiege die Kannibalen",
["The food bites back"]="Das Essen beißt zurück",
-["Defeat the cannibals"]="Besiege die Kannibalen",
["Drills"]="Bohrer",
["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..."]="Du hast 7 Züge, bis die nächste Welle ankommt.|Stell sicher, dass die ankommenden Kannibalen auf die passende Weise begrüßt werden.|Wenn der Igel stirbst, die die Mission verloren.|Tipp: Vielleicht solltest du ein paar Minen benutzen.",
["Judas"]="Judas",
["Kill the traitor...or spare his life!|Kill him or press [Precise]!"]="Töte den Verräter … oder verschone ihn!|Töte ihn oder drücke [Genaues Zielen]!",
["Brutus"]="Brutus",
["You have failed to save the tribe!"]="Du hast es nicht geschafft, den Stamm zu retten!",
+["Natives"]="Eingeborene",
["Tribe"]="Stamm",
+["011101001"]="011101001",
["You have killed an innocent hedgehog!"]="Du hast einen unschuldigen Igel getötet!",
["That ought to show them!"]="Das wird ihnen eine Lehre sein!",
["Guys, do you think there's more of them?"]="Leute, glaubt ihr, dass es noch mehr von ihnen gibt?",
@@ -873,27 +200,212 @@
["Assault Team"]="Sturmtruppe",
["Reinforcements"]="Verstärkung",
["Unit 334a$7%;.*"]="Einheit 334a$7%;,*",
+["Jack"]="Jochen",
+["Steve"]="Steffen",
+["Zork"]="Zork",
+["Elmo"]="Elmo",
+["Lee"]="Leo",
+["Rachel"]="Ramona",
+["Jeremiah"]="Jeremias",
+["Segmentation Paul"]="Se Gmentf Ehler",
+["Syntax Errol"]="Syntaxfehlel",
+["Unexpected Igor"]="Ausnahmefelix",
+["Bullseye"]="Volltreffer!",
+["Die, die, die!"]="Stirb, stirb, stirb!",
+["Yeah, take that!"]="Jawohl, nimm das!",
+[" to save the village."]=" ab, um das Dorf zu retten.",
+["With the rest of the tribe gone, it was up to "]="Ohne den Rest des Stammes, hing es von ",
+["But it proved to be no easy task!"]="Aber es war keine einfache Aufgabe!",
+["What a strange cave!"]="Was für eine seltsame Höhle!",
+["Now how do I get on the other side?!"]="Aber wie komme ich auf die andere Seite?!",
+["Dude, what's this place?!"]="Junge, was ist das für ein Ort?!",
+["And where's all the weed?"]="Und wo ist all das Gras?",
+["Is this place in my head?"]="Ist dieser Ort in meinem Kopf?",
+["I shouldn't have drunk that last pint."]="Ich sollte nicht die ganze Flasche ausgetrunken haben.",
+["Where did that alien run?"]="Wohin ist dieser Außerirdische gelaufen?",
+["When I find it..."]="Wenn ich ihn in die Finger kriege …",
+["This is typical!"]="Typisch!",
+["It's always up to women to clear up the mess men created!"]="Es bleibt immer an Frauen hängen, das Chaos, das Männer hinterlassen haben, aufzuräumen!",
+["What is this place?"]="Was ist dieser Ort?",
+["It doesn't matter. I won't let that alien hurt my daughter!"]="Es ist egal. Ich werde diesen Außerirdischen nicht meine Tochter weh tun lassen!",
+["Every single time!"]="Jedes Mal!",
+["How come in a village full of warriors, it's up to me to save it?"]="Wie kommt es, dass es immer an mir liegt, ein Dorf voller Krieger zu retten?",
+["Greetings, "]="Grüße, ",
+["As you can see, there is no way to get on the other side!"]="Wie du siehst, gibt es keinen Weg, um auf die andere Seite zu kommen.",
+["I wish to help you, "]="Ich möchte dir helfen, ",
+["Beware, though! If you are slow, you die!"]="Aber Vorsicht! Wenn du langsam bist, wirst du sterben!",
+["Talk about mixed signals..."]="Zuckerbrot und Peitsche …",
+["Well, that was a waste of time."]="Tja, das war wohl Zeitverschwendung.",
+["You bear impressive skills, "]="Du hast großartige Fähigkeiten, ",
+["However, my mates don't agree with me on letting you go..."]="Aber meine Freunde wollen dich nicht gehen lassen …",
+["I guess you'll have to kill them."]="Ich fürchte, du musst sie töten.",
+["Nice work, "]="Gute Arbeit, ",
+["As a reward for your performance, here's some new technology!"]="Als Belohnung für deine Leistung gebe ich dir eine neue Technologie!",
+["Use it wisely!"]="Benutze sie weise!",
+["Dragon's Lair"]="Die Höhle des Löwen",
+["In order to get to the other side, you need to collect the crates first.|"]="Um auf die andere Seite zu gelangen, musst du zuerst die Kisten einsammeln.|",
+["Obstacle course"]="Hindernislauf",
+["As the ammo is sparse, you might want to reuse ropes while mid-air.|"]="Da die Munition knapp ist, solltest du vielleicht Seile in der Luft wiederverwenden.|",
+["If you wish to restart the course, hold [Precise] while your turn ends (e.g with Skip)!|"]="Wenn du den Hindernislauf neustarten willst, drücke [Genaues Zielen], während dein Zug endet (z.B. mit Überspringen)!|",
+["The enemy can't move but it might be a good idea to stay out of sight!|"]="Der Feind kann sich nicht bewegen, aber es wäre besser, aus seiner Schusslinie zu bleiben!|",
+[" turns until Sudden Death! Better hurry!"]=" Züge bis zum Sudden Death! Beeilung!",
+["You have "]="Du hast ",
+["Kill the aliens!"]="Töte die Außerirdischen!",
+["The Slaughter"]="Die Schlachtung",
+["The what?!"]="Die was?!",
+["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"]="Benutze das Portalgewehr, um zur nächsten Kiste zu kommen, dann benutze das nächste Gewehr, um zum letzten Ziel zu kommen.|",
+["Portal hint: one goes to the destination, and one is the entrance.|"]="Portaltipp: Eins geht zum Ziel, und das andere ist der Eingang.|",
+["Teleport hint: just use the mouse to select the destination!"]="Teleportertipp: Benutze einfach die Maus, um das Ziel auszuwählen.",
+["I'm a ninja."]="Ich bin ein Ninja.",
+["Salvation was one step closer now..."]="Die Erlösung war nun einen Schritt näher.",
+["011101000"]="011101000",
+["Find your tribe!|Cross the lake!"]="Finde deinen Stamm!|Überquere den Fluss!",
+["Y Chwiliad"]="Y Chwiliad",
+["Turns until Sudden Death: "]="Züge bis zum Sudden Death: ",
+["Ramon"]="Ramon",
+["Spiky Cheese"]="Stachliger Käse",
+["Honest Lee"]="Leo Ehrlich",
+["Sirius Lee"]="Leo Ernst",
+["Vegan Jack"]="Veganer-Jochen",
+["Brutal Lily"]="Brutalo-Lilie",
+["Smith 0.97"]="Smith 0.97",
+["Smith 0.98"]="Smith 0.98",
+["Smith 0.99a"]="Smith 0.99a",
+["Smith 0.99b"]="Smith 0.99b",
+["Smith 0.99f"]="Smith 0.99f",
+["Smith 1.0"]="Smith 1.0",
+["Everything looks OK..."]="Alles sieht gut aus.",
+["This will be fun!"]="Das wird Spaß machen!",
+["HAHA!"]="HAHA!",
+["And how am I alive?!"]="Und wie kann es sein, dass ich am Leben bin?",
+["It must be the cyborgs again!"]="Das müssen wohl wieder diese Cyborgs sein!",
+["Looks like the whole world is falling apart!"]="Es scheint, als würde die ganze Welt auseinanderfallen!",
+["Look out! We're surrounded by cannibals!"]="Passt auf! Wir sind von Kannibalen umzingelt!",
+["Cannibals?! You're the cannibals!"]="Kannibalen?! Ihr seid die Kannibalen!",
+["WHAT?! You're the ones attacking us!"]="WAS?! Ihr seid diejenigen, die uns angreifen!",
+["You have kidnapped our whole tribe!"]="Ihr habt unseren ganzen Stamm entführt!",
+["You've been assaulting us, we have been just defending ourselves!"]="Ihr habt uns überfallen, wir haben uns nur verteidigt!",
+["I can't believe this!"]="Ich kann es nicht glauben!",
+["Have we ever attacked you first?"]="Haben wir euch jemals zuerst angegriffen?",
+["Yes!"]="Ja!",
+["When?"]="Wann?",
+["Uhmm...ok no."]="Ähm, okay, nein.",
+["But you're cannibals. It's what you do."]="Aber ihr seid Kannibalen. Das ist, was ihr tut.",
+["Again with the 'cannibals' thing!"]="Nicht schon wieder dieser »Kannibalen«-Unfug!",
+["Where do you get that?!"]="Wo habt ihr das her?",
+["Everyone knows this."]="Das weiß jeder.",
+["I didn't until about a month ago."]="Ich wusste es nicht vor einem Monat.",
+["Hmmm...actually...I didn't either."]="Hmmm, ich … eigentlich auch nicht.",
+["About a month ago, a cyborg came and told us that you're the cannibals!"]="Vor etwa einem Monat kam ein Cyborg und erzählte uns, dass ihr die Kannibalen seid.",
+["A cy-what?"]="Ein Cy-was?",
+["Cyborg. It's what the aliens call themselves."]="Cyborg. So nennen sich die Außerirdischen selbst.",
+["They told us to wear these clothes. They said that this is the newest trend."]="Sie sagten uns, dass wir diese Kleidung tragen sollten. Sie sagten, dass es der neueste Trend sei.",
+["They've been manipulating us all this time!"]="Sie haben uns die ganze Zeit manipuliert!",
+["They must be trying to weaken us!"]="Sie müssen versuchen, uns zu schwächen!",
+["We have to unite and defeat those cylergs!"]="Wir müssen uns zusammentun, und diese Cylergs besiegen!",
+["We can't let them take over our little island!"]="Wir können sie nicht unsere kleine Insel erobern lassen!",
+["You have finally figured it out!"]="Ihr habt es endlich gemerkt!",
+["You meatbags are pretty slow, you know!"]="Ihr Fleischklumpen seid ziemlich langsam, wisst ihr?",
+["Why do you want to take over our island?"]="Warum wollt ihr unsere Insel erobern?",
+["Do you have any idea how valuable grass is?"]="Habt ihr überhaupt eine Ahnung darüber, wie wertvoll Gras ist?",
+["This island is the only place left on Earth with grass on it!"]="Diese Insel ist der einzige Ort auf der Welt, der noch Gras hat.",
+["It's worth more than wood!"]="Es ist wertvoller als Holz!",
+["That makes it almost invaluable!"]="Das macht es fast unbezahlbar!",
+["We have nowhere else to live!"]="Wir haben sonst keinen Ort zu leben!",
+["That's not our problem!"]="Das ist nicht unser Problem!",
+["We'll give you a problem then!"]="Dann geben wir euch ein Problem!",
+["Nicely done, meatbags!"]="Gut gemacht, Fleischkugeln!",
+["You have won the game by proving true cooperative skills!"]="Ihr hab das Spiel gewonnen, indem ihr wahre kooperative Fähigkeiten gezeigt habt!",
+["You have proven yourselves worthy!"]="Ihr habt euch bewährt.",
+["Game? Was this a game to you?!"]="Spiel? War das ein Spiel für dich?!",
+["Well, yes. This was a cyborg television show."]="Ähm, ja. Es war eine Cyborg-Fernsehsendung.",
+["It is called 'Hogs of Steel'."]="Sie heißt »Igel aus Stahl«.",
+["Are you saying that many of us have died for your entertainment?"]="Willst du damit sagen, dass viele von uns nur für eure Unterhaltung gestorben sind?",
+["Our tribe, our beautiful island!"]="Unser Stamm, unsere schöne Insel!",
+["All gone...everything!"]="Alles fort, alles!",
+["But the ones alive are stronger in their heart!"]="Aber die Lebendigen sind in ihrem Herzen stärker.",
+["Just kidding, none of you have died!"]="Nur ein Witz! Niemand von euch ist gestorben!",
+["I mean, none of you ceased to live."]="Ich meine, niemand von euch hat aufgehört, zu leben.",
+["You'll see what I mean!"]="Du wirst verstehen, was ich meine.",
+["They are all waiting back in the village, haha."]="Sie warten alle im Dorf, haha.",
+["You are playing with our lives here!"]="Du spielst mit unseren Leben!",
+["Do you think you're some kind of god?"]="Hältst du dich für eine Art Gott?",
+["Interesting idea, haha!"]="Interessanter Gedanke, haha!",
+["What a douche!"]="Was für ein Blödian!",
+["Defeat the cyborgs!"]="Besiege die Cyborgs!",
+["The Enemy Of My Enemy"]="Der Feind meines Feindes",
+["The Union"]="Die Einheit",
+["Hmmm...it's a draw. How unfortunate!"]="Hmmm … Es ist unentschieden. Wie blöd!",
+["Yay, we won!"]="Hurra, wir haben gewonnen!",
+["Nice work!"]="Gute Arbeit!",
+["Cannibals"]="Kannibalen",
+["Fell From Heaven"]="Fiel Vom Himmel",
+["Hedge-cogs"]="Stachelräder",
+["Leader"]="Führer",
+["Nancy Screw"]="Lockere Schraube",
+["Your deaths will be avenged, cannibals!"]="Eure Tode werden gerächt sein, Kannibalen!",
+["Brainiac"]="Hirni",
+["Corpse Thrower"]="Leichenschmeißer",
+["Hannibal"]="Hannibal",
+["More Natives"]="Mehr Ureinwohner",
+["Traitors"]="Verräter",
+["Carol"]="Karol",
+["Hogminator"]="Iglinator",
+["Unit 0x0007"]="Einheit 0x0007",
+["Blender"]="Blender",
+["Elderbot"]="Altbot",
+["Those aliens are destroying the island!"]="Diese Außerirdischen zerstören die Insel!",
+["Dude, all the plants are gone!"]="Mann, all die Pflanzen sind fort!",
+["What am I gonna...eat, yo?"]="Was werde ich … essen?",
+["Fell From Heaven is the best! Fell From Heaven is the greatest!"]="Fiel Vom Himmel ist die Beste! Fiel Vom Himmel ist die Größte!",
+["Yuck! I bet they'll keep worshipping her even after I save the village!"]="Pfui! Ich wette, sie werden sie verehren, selbst, wenn ich das Dorf rette.",
+["I'm getting old for this!"]="Ich werd zu alt dafür!",
+["I'm getting thirsty..."]="Ich hab Durst.",
+["I wonder why I'm so angry all the time..."]="Ich frag mich, warum ich die ganze Zeit so wütend bin.",
+["It must be a childhood trauma..."]="Es muss ein Kindheitstrauma sein.",
+["Just wait till I get my hands on that trauma! ARGH!"]="Warte nur, bis ich mein Trauma in die Finger kriege! ARGH!",
+["I could just teleport myself there..."]="Ich könnte mich einfach dorthin teleportieren.",
+["It's a shame, I forgot how to do that!"]="Zu dumm, ich habe vergessen, wie man das macht.",
+["Hello again, "]="Hallo, ",
+["I just found out that they have captured your princess!"]="Ich habe gerade herausgefunden, dass sie deine Prinzessin gefangen haben!",
+["Of course I have to save her. What did I expect?!"]="Natürlich muss ich sie retten. Was habe ich erwartet?",
+["She's behind that tall thingy."]="Sie ist hinter diesem großen Dingsda.",
+["I'm here to help you rescue her."]="Ich bin hier, um dir bei ihrer Rettung zu helfen.",
+["Yo, dude, we're here, too!"]="Heda, wir sind auch da!",
+["We were trying to save her and we got lost."]="Wir versuchten, sie zu retten, aber haben uns verlaufen.",
+["That's typical of you!"]="Das ist so typisch für dich!",
+["Why are you helping us, uhm...?"]="Warum hilfst du uns, äh, …?",
+["Call me Beep! Well, 'cause I'm such a nice...person!"]="Nenn mich »Pieps«! Weil ich so eine nette … Person bin!",
+["Here, let me help you save her!"]="Hier, lass mich dir helfen, sie zu retten!",
+["Thanks!"]="Danke!",
+["Why can't he just let her go?!"]="Warum kann er sie nicht einfach freilassen?",
+["Family Reunion"]="Familientreffen",
+["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!"]="Befrei deine Teamkollegen aus ihrem natürlichen Gefängnis und rette die Prinzessin!|Tipp: Löcher bohren sollte alle Probleme lösen.|Tipp: Es könnte eine gute Idee sein, vor dem Bohren einen Träger zu platzieren. Ich mein ja nur.|Tipp: All deine Igel müssen sich über der markierten Höhe befinden.|Tipp: Undichte Stelle muss sich sehr nahe an der Prinzessin befinden.",
+["Salvation"]="Erlösung",
+["Hostage Situation"]="Geiselrettung",
+["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!"]="Rette die Prinzessin! All deine Igel müssen überleben!|Tipp: Töte die Cyborgs zuerst! Benutze die Munition sehr vorsichtig!|Tipp: Du solltest vielleicht einen Träger als Deckung behalten!",
+["Thank you, my hero!"]="Danke dir, mein Held!",
+["Biomechanic Team"]="Biomechanisches Team",
["First Blood"]="Der erste Zusammenstoß",
["First Steps"]="Erste Schritte",
["Press [Left] or [Right] to move around, [Enter] to jump"]="Drücke [Links] oder [Rechts] zum Bewegen, [Eingabe] zum Springen.",
["A leap in a leap"]="Ein Sprung in einem Sprung",
["Go on top of the flower"]="Geh auf die Spitze der Blume",
+["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!"]="Sammle die Kiste auf der rechten Seite ein.|Tipp: Wähle das Seil, [Hoch] oder [Runter] zum Zielen, [Leer] zum feuern, Richtungstasten zum bewegen.|Seile können in der Luft erneut geschossen werden.",
["Hightime"]="Hoch hinaus",
-["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!"]="Sammle die Kiste auf der rechten Seite ein.|Tipp: Wähle das Seil, [Hoch] oder [Runter] zum Zielen, [Leer] zum feuern, Richtungstasten zum bewegen.|Seile können in der Luft erneut geschossen werden.",
+["Get on the head of the mole"]="Geh auf den Kopf des Maulwurfs",
["Omnivore"]="Allesfresser",
-["Get on the head of the mole"]="Geh auf den Kopf des Maulwurfs",
["The Leap of Faith"]="Der Mutsprung",
["Use the parachute ([Space] while in air) to get the next crate"]="Benutze den Fallschirm ([Leer] drücken, wenn in der Luft), um die nächste Kiste zu erhalten.",
+["Do the deed"]="Tu deine Pflicht",
["The Rising"]="Der Aufstieg",
-["Do the deed"]="Tu deine Pflicht",
-["The Slaughter"]="Die Schlachtung",
["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."]="Zerstör die Ziele!|Tipp: Wähle das Shoryuken und drücke [Leertaste]|PS: Du kannst es in der Luft benutzen.",
+["Collect the crates within the time limit!|If you fail, you'll have to try again."]="Sammle die Kisten innerhalb der Zeitbegrenzung ein!|Wenn du versagst, musst es erneut versuchen.",
["The Crate Frenzy"]="Der Kistenrausch",
-["Collect the crates within the time limit!|If you fail, you'll have to try again."]="Sammle die Kisten innerhalb der Zeitbegrenzung ein!|Wenn du versagst, musst es erneut versuchen.",
+["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"]="Zerstöre die Ziele!|Tipp: [Hoch], [Runter] zum Zielen, [Leer] zum Schießen",
["The Ultimate Weapon"]="Die Ultimative Waffe",
-["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"]="Zerstöre die Ziele!|Tipp: [Hoch], [Runter] zum Zielen, [Leer] zum Schießen",
+["Kill the cannibal!"]="Töte den Kannibalen!",
["The First Blood"]="Der erste Zusammenstoß",
-["Kill the cannibal!"]="Töte den Kannibalen!",
["KILL IT!"]="TÖTE ES!",
["Watch your steps, young one!"]="Pass auf deine Schritte auf, Jüngling!",
["Why do men keep hurting me?"]="Warum tun mir Männer ständig weh?",
@@ -944,93 +456,30 @@
["Here...pick your weapon!"]="Hier … wähl deine Waffe!",
["Yes, yeees! You are now ready to enter the real world!"]="Ja, Jaaa! Jetzt bist du bereit, die wirkliche Welt zu betreten!",
["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."]="Was?! Ein Kannibale? Hier? Es gibt keine Zeit zu verlieren! Komm, du bist vorbereitet.",
+["Leaks A Lot gave his life for his tribe! He should have survived!"]="Undichte Stelle gab sein Leben für seinen Stamm! Er hätte überleben sollen!",
["The wasted youth"]="Die vergeudete Jugend",
-["Leaks A Lot gave his life for his tribe! He should have survived!"]="Undichte Stelle gab sein Leben für seinen Stamm! Er hätte überleben sollen!",
["After Leaks A Lot betrayed his tribe, he joined the cannibals..."]="Nachdem Undichte Stelle seinen Stamm betrogen hatte, trat er den Kannibalen bei.",
+["Hint: Double Jump - Press [Backspace] twice"]="Tipp: Doppelsprung – Drück [Rücktaste] 2 Mal",
["Step By Step"]="Schritt für Schritt",
-["Hint: Double Jump - Press [Backspace] twice"]="Tipp: Doppelsprung – Drück [Rücktaste] 2 Mal",
["As the challenge was completed, Leaks A Lot set foot on the ground..."]="Nachdem die Herausforderung abgeschlossen war, setzte Undichte Stelle einen Fuß auf den Boden.",
["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."]="Und somit versagte Undichte Stelle dabei, die Herausforderung abzuschließen. Unter Schande landete er.",
["The Bull's Eye"]="Ins Schwarze",
["[Up], [Down] to aim, [Space] to shoot!"]="[Hoch], [Runter] zum Zielen, [Leer] zum Schießen.",
+["Select difficulty: [Left] - easier or [Right] - harder"]="Wähl einen Schwierigkeitsgrad: [Links] – leichter oder [Rechts] – schwerer",
["The Torment"]="Die Pein",
-["Select difficulty: [Left] - easier or [Right] - harder"]="Wähl einen Schwierigkeitsgrad: [Links] – leichter oder [Rechts] – schwerer",
-["Fell From Heaven"]="Fiel Vom Himmel",
-["Cannibals"]="Kannibalen",
["A Classic Fairytale"]="Ein typisches Märchen",
["Finish your training|Hint: Animations can be skipped with the [Precise] key."]="Schließe deine Übungen ab.|Tipp: Animationen können mit der [Genaues Zielen]-Taste übersprungen werden.",
-["Zork"]="Zork",
-["Steve"]="Steffen",
-["Jack"]="Jochen",
-["Lee"]="Leo",
-["Elmo"]="Elmo",
-["Rachel"]="Ramona",
-["Syntax Errol"]="Syntaxfehlel",
-["Segmentation Paul"]="Se Gmentf Ehler",
-["Unexpected Igor"]="Ausnahmefelix",
-["Jeremiah"]="Jeremias",
-["Yeah, take that!"]="Jawohl, nimm das!",
-["Bullseye"]="Volltreffer!",
-["Die, die, die!"]="Stirb, stirb, stirb!",
-["With the rest of the tribe gone, it was up to "]="Ohne den Rest des Stammes, hing es von ",
-[" to save the village."]=" ab, um das Dorf zu retten.",
-["But it proved to be no easy task!"]="Aber es war keine einfache Aufgabe!",
-["What a strange cave!"]="Was für eine seltsame Höhle!",
-["Now how do I get on the other side?!"]="Aber wie komme ich auf die andere Seite?!",
-["Dude, what's this place?!"]="Junge, was ist das für ein Ort?!",
-["And where's all the weed?"]="Und wo ist all das Gras?",
-["Is this place in my head?"]="Ist dieser Ort in meinem Kopf?",
-["I shouldn't have drunk that last pint."]="Ich sollte nicht die ganze Flasche ausgetrunken haben.",
-["Where did that alien run?"]="Wohin ist dieser Außerirdische gelaufen?",
-["When I find it..."]="Wenn ich ihn in die Finger kriege …",
-["This is typical!"]="Typisch!",
-["It's always up to women to clear up the mess men created!"]="Es bleibt immer an Frauen hängen, das Chaos, das Männer hinterlassen haben, aufzuräumen!",
-["What is this place?"]="Was ist dieser Ort?",
-["It doesn't matter. I won't let that alien hurt my daughter!"]="Es ist egal. Ich werde diesen Außerirdischen nicht meine Tochter weh tun lassen!",
-["Every single time!"]="Jedes Mal!",
-["How come in a village full of warriors, it's up to me to save it?"]="Wie kommt es, dass es immer an mir liegt, ein Dorf voller Krieger zu retten?",
-["Greetings, "]="Grüße, ",
-["As you can see, there is no way to get on the other side!"]="Wie du siehst, gibt es keinen Weg, um auf die andere Seite zu kommen.",
-["I wish to help you, "]="Ich möchte dir helfen, ",
-["Beware, though! If you are slow, you die!"]="Aber Vorsicht! Wenn du langsam bist, wirst du sterben!",
-["Talk about mixed signals..."]="Zuckerbrot und Peitsche …",
-["Well, that was a waste of time."]="Tja, das war wohl Zeitverschwendung.",
-["You bear impressive skills, "]="Du hast großartige Fähigkeiten, ",
-["However, my mates don't agree with me on letting you go..."]="Aber meine Freunde wollen dich nicht gehen lassen …",
-["I guess you'll have to kill them."]="Ich fürchte, du musst sie töten.",
-["Nice work, "]="Gute Arbeit, ",
-["As a reward for your performance, here's some new technology!"]="Als Belohnung für deine Leistung gebe ich dir eine neue Technologie!",
-["Use it wisely!"]="Benutze sie weise!",
-["Dragon's Lair"]="Die Höhle des Löwen",
-["Obstacle course"]="Hindernislauf",
-["In order to get to the other side, you need to collect the crates first.|"]="Um auf die andere Seite zu gelangen, musst du zuerst die Kisten einsammeln.|",
-["As the ammo is sparse, you might want to reuse ropes while mid-air.|"]="Da die Munition knapp ist, solltest du vielleicht Seile in der Luft wiederverwenden.|",
-["If you wish to restart the course, hold [Precise] while your turn ends (e.g with Skip)!|"]="Wenn du den Hindernislauf neustarten willst, drücke [Genaues Zielen], während dein Zug endet (z.B. mit Überspringen)!|",
-["The enemy can't move but it might be a good idea to stay out of sight!|"]="Der Feind kann sich nicht bewegen, aber es wäre besser, aus seiner Schusslinie zu bleiben!|",
-["You have "]="Du hast ",
-[" turns until Sudden Death! Better hurry!"]=" Züge bis zum Sudden Death! Beeilung!",
-["Kill the aliens!"]="Töte die Außerirdischen!",
-["The what?!"]="Die was?!",
-["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"]="Benutze das Portalgewehr, um zur nächsten Kiste zu kommen, dann benutze das nächste Gewehr, um zum letzten Ziel zu kommen.|",
-["Portal hint: one goes to the destination, and one is the entrance.|"]="Portaltipp: Eins geht zum Ziel, und das andere ist der Eingang.|",
-["Teleport hint: just use the mouse to select the destination!"]="Teleportertipp: Benutze einfach die Maus, um das Ziel auszuwählen.",
-["I'm a ninja."]="Ich bin ein Ninja.",
-["Salvation was one step closer now..."]="Die Erlösung war nun einen Schritt näher.",
-["011101000"]="011101000",
-["Y Chwiliad"]="Y Chwiliad",
-["Find your tribe!|Cross the lake!"]="Finde deinen Stamm!|Überquere den Fluss!",
-["Turns until Sudden Death: "]="Züge bis zum Sudden Death: ",
+["Eye Chewer"]="Augenkauer",
+["Flesh for Brainz"]="Fleisch gegen Hirn",
["John"]="Jonas",
-["Flesh for Brainz"]="Fleisch gegen Hirn",
-["Eye Chewer"]="Augenkauer",
["Torn Muscle"]="Loser Muskel",
+["Brain Blower"]="Hirnpuster",
+["Gorkij"]="Gorkidsch",
["Nom-Nom"]="Mjam-Mjam",
["Vedgies"]="Früchties",
-["Brain Blower"]="Hirnpuster",
-["Gorkij"]="Gorkidsch",
-["The Journey Back"]="Die Rückreise",
["Collateral Damage"]="Kollateralschaden",
["Save the princess by collecting the crate in under 12 turns!"]="Rette die Prinzessin, indem du die Kiste vor Ablauf von 12 Zügen einsammelst!",
+["The Journey Back"]="Die Rückreise",
["Collateral Damage II"]="Kollateralschaden II",
["Save Fell From Heaven!"]="Rette Fiel Vom Himmel!",
["Get the crate on the other side of the island!|"]="Hol dir die Kiste auf der anderen Seite der Insel!|",
@@ -1039,11 +488,12 @@
["Leaks A Lot must survive!"]="Undichte Stelle muss überleben!",
["Your hogs must survive!"]="Deine Igel müssen überleben.",
["Adventurous"]="Abenteuerlich",
+["Get Dense Cloud out of the pit!"]="Hol Dichte Wolke aus der Grube!",
["The Savior"]="Der Erlöser",
-["Get Dense Cloud out of the pit!"]="Hol Dichte Wolke aus der Grube!",
+["Free Dense Cloud and continue the mission!"]="Befrei Dichte Wolke und setze die Mission fort!",
["They never learn"]="Sie lernen es nie.",
-["Free Dense Cloud and continue the mission!"]="Befrei Dichte Wolke und setze die Mission fort!",
["I just wonder where Ramon and Spiky disappeared..."]="Ich frage mich lediglich, wohin Ramon und Stachli verschwunden sind.",
+["I wonder where Dense Cloud is..."]="Ich frag mich, wo Dichte Wolke ist.",
["He must be in the village already."]="Er muss schon im Dorf sein.",
["I'd better get going myself."]="Ich geh jetzt besser weiter.",
["Welcome, Leaks A Lot!"]="Willkommen, Undichte Stelle!",
@@ -1093,37 +543,130 @@
["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"]="Es gibt nichts befriedigenderes für uns, als dich jeden Morgen zu sehen, wie du deine Schönheit mit dem Rest der Welt teilst, meine Prinzessin!",
["Cannibal Sentry"]="Kannibalenwache",
["The village, unprepared, was destroyed by the cyborgs..."]="Das unvorbereitete Dorf wurde von den Cyborgs zerstört.",
+["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."]="Tipp: Wähle den Schweißbrenner, ziele und drücke [Feuern]. Drücke [Feuern] erneut, um aufzuhören.|Spreng nicht die Kiste.",
["The Tunnel Maker"]="Der Tunnelbauer",
-["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."]="Tipp: Wähle den Schweißbrenner, ziele und drücke [Feuern]. Drücke [Feuern] erneut, um aufzuhören.|Spreng nicht die Kiste.",
+["Hint: Select the LowGravity and press [Fire]."]="Tipp: Wähle die niedrige Schwerkraft und drücke [Feuern].",
["The Moonwalk"]="Der Mondspaziergang",
-["Hint: Select the LowGravity and press [Fire]."]="Tipp: Wähle die niedrige Schwerkraft und drücke [Feuern].",
["Slippery"]="Rutschig",
["You'd better watch your steps..."]="Pass besser auf, wohin du trittst.",
+["Y3K1337"]="Y3K1337",
["Artur Detour"]="Artus Rück",
["Led Heart"]="Geführtes Herz",
+["Nilarian"]="Nilarian",
["Orlando Boom!"]="Orlando Bumm!",
-["Nilarian"]="Nilarian",
-["Steel Eye"]="Stahlauge",
+["Gas Gargler"]="Gasgurgler",
+["Hatless Jerry"]="Hutloser Igor",
["Rusty Joe"]="Rostjonas",
-["Hatless Jerry"]="Hutloser Igor",
-["Gas Gargler"]="Gasgurgler",
+["Steel Eye"]="Stahlauge",
["Leaderbot"]="Führboter",
-["Nancy Screw"]="Lockere Schraube",
["Beep Loopers"]="Piepskreisler",
["Corporationals"]="Kapitalista",
["Name"]="Name",
-["Olive"]="Olive",
+["Bloodrocutor"]="Blutfrierer",
+["Bloodsucker"]="Blutsauger",
+["Bonely"]="Knochi",
+["Corpsemonger"]="Leichenschänder",
+["Femur Lover"]="Schenkellieber",
+["Glark"]="Glark",
+["Muscle Dissolver"]="Muskellöser",
+["Rot Molester"]="Rottiger Störenfried",
+["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."]="Rette Undichte Stelle!|Tipp: Die Igelwahl könnte behilflich sein.",
+["The Shadow Falls"]="Die Schattenfälle",
+["The Showdown"]="Das Showdown",
+["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"]="Verteidige dich!|Tipp: Du kannst Tipps über die Benutzung der Waffen erhalten, indem du im Waffenauswahlmenü mit dem Mauszeiger auf sie zeigst.",
+["Play with me!"]="Spiel mit mir!",
+["Obliterate them!|Hint: You might want to take cover..."]="Vernichte sie!|Tipp: Du solltest in Deckung gehen.",
+["Why do you not like me?"]="Warum magst du mich nicht?",
+["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..."]="Wähl deine Seite! Wenn du dem seltsamen Mann beitreten willst, geh zu ihm hin.|Geh ansonsten von ihm fort. Wenn du angr… Vergiss es!",
+["The Dilemma"]="Das Dilemma",
+["Return to Leaks A Lot! If you get stuck, press [Precise] to try again!"]="Kehr zu Undichte Stelle zurück! Wenn du steckenbleibst, drücke [Genaues Zielen], um es erneut zu versuchen!",
+["The walk of Fame"]="Die Ruhmesmeile",
+["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"]="Besiege die Kannibalen!|Granatentipp: Setze den Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.",
+["The Individualist"]="Der Individualist",
+["Pfew! That was close!"]="Puh! Das war knapp!",
+["Where did you get the exploding apples and the magic bow that shoots many arrows?"]="Woher hast du die explodierenden Äpfel und den magischen Bogen, der so viele Pfeile verschießt?",
+["Where did you get the exploding apples?"]="Woher hast du den explodierenden Apfel?",
+["Where did you get the magic bow that shoots many arrows?"]="Woher hast du den magischen Bogen, der so viele Pfeile verschießt?",
+["Did you warn the village?"]="Hast du das Dorf gewarnt?",
+["No, I came back to help you out..."]="Nein, ich kam zurück, um dir zu helfen.",
+["Uhm...I met one of them and took his weapons."]="Ähm, ich hab einen von ihnen getroffen und nahm seine Waffen.",
+["We should head back to the village now."]="Wir sollten zum Dorf zurückkehren.",
+["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."]="Nach dem Schock, der vom feindlichen Spion ausgelöst wurde, gingen Undichte Stelle und Dichte Wolke zur Entspannung auf die Jagd.",
+["Little did they know that this hunt will mark them forever..."]="Sie ahnten nicht, dass diese Jagd sie für immer zusammenschweißen würde.",
+["I have no idea where that mole disappeared...Can you see it?"]="Ich habe keine Ahnung, wohin dieser Maulwurf verschwand. Kannst du ihn sehen?",
+["Nope. It was one fast mole, that's for sure."]="Nee. Es war ein schneller Maulwurf, das ist klar.",
+["Please, stop releasing your \"smoke signals\"!"]="Bitte hör mit deinen »Rauchzeichen« auf!",
+["You're terrorizing the forest...We won't catch anything like this!"]="Du terrorisierst den Wald. Wir werden auf diese Weise nichts fangen!",
+["..."]="…",
+["I can't believe it worked!"]="Ich kann nicht glauben, dass es funktioniert hat!",
+["That shaman sure knows what he's doing!"]="Dieser Schamane weiß genau, was er tut!",
+["Yeah...I think it's a 'he', lol."]="Ja, ich glaube, dass es ein »er« ist. (lach)",
+["It wants our brains!"]="Es will unsere Gehirne!",
+["Not you again! My head still hurts from last time!"]="Nicht du schon wieder! Mein Kopf tut mir immer noch vom letzten Mal weh!",
+["Did you see him coming?"]="Hast du ihn kommen sehen?",
+["No. Where did he come from?"]="Nein. Woher kam er?",
+["Are we there yet?"]="Sind wir schon da?",
+["This must be some kind of sorcery!"]="Das muss wohl eine Art Zauberei sein!",
+["I thought their shaman died when he tried our medicine!"]="Ich dachte, ihr Schamane starb, als er unsere Medizin probierte.",
+["I saw it with my own eyes!"]="Ich sah es mit meinen eigenen Augen!",
+["Then how do they keep appearing?"]="Also woher kommen sie?",
+["It's impossible to communicate with the spirits without a shaman."]="Es ist unmöglich, ohne einen Schamanen mit den Geistern zu kommunizieren.",
+["We need to warn the village."]="Ich muss das Dorf warnen.",
+["What a ride!"]="Was für eine Reise!",
+["We can't defeat them!"]="Wir können sie nicht besiegen!",
+["I'll hold them off while you return to the village!"]="Ich halte sie zurück, während du zum Dorf zurückkehrst.",
+["30 minutes later..."]="30 Minuten später …",
+["Greetings, cloudy one!"]="Grüße, du Wolkiger!",
+["I have come to make you an offering..."]="Ich kam, um dir ein Angebot zu machen.",
+["You are given the chance to turn your life around..."]="Ich gebe dir die Chance, dein Leben auf den Kopf zu stellen.",
+["If you agree to provide the information we need, you will be spared!"]="Wenn du einverstanden bist, uns die Information, die wir brauchen, zu geben, wirst du verschont!",
+["Have no illusions, your tribe is dead, indifferent of your choice."]="Mach dir keine Hoffnungen, dein Stamm ist tot, unabhängig von deiner Entscheidung.",
+["If you decide to help us, though, we will no longer need to find a new governor for the island."]="Wenn du uns helfen willst, brauchen wir für diese Insel keinen neuen Anführer zu suchen.",
+["If you know what I mean..."]="Wenn du verstehst, was ich meine.",
+["So? What will it be?"]="Also? Was ist deine Entscheidung?",
+["Great choice, Steve! Mind if I call you that?"]="Großartige Entscheidung, Stefan! Stört es dich, wenn ich dich so nenne?",
+["Whatever floats your boat..."]="Worauf immer du Lust hast.",
+["Great! You will be contacted soon for assistance."]="Gut! Du wirst schon bald für Unterstützung benachrichtigt.",
+["In the meantime, take these and return to your \"friend\"!"]="In der Zwischenzeit, nimm diese und kehre zu deinem »Freund« zurück!",
+["Your death will not be in vain, Dense Cloud!"]="Dein Tod wird nicht ungesühnt bleiben, Dichte Wolke!",
+["You will be avenged!"]="Du wirst gerächt!",
+["I see..."]="Ich verstehe …",
+["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"]="Denk dran, du erbärmliches Tier: Wenn der Tag gekommen ist, wirst du deine blinde Loyalität bereuen!",
+["You just committed suicide..."]="Du hast gerade Selbstmord begangen.",
+["If you say so..."]="Wenn du es sagst …",
+["Dude, we really need a new shaman..."]="Mann, wir brauchen wirklich einen neuen Schamanen.",
+["It's over..."]="Es ist vorbei.",
+["Let's head back to the village!"]="Lass uns zurück zum Dorf gehen!",
+["Really?! You thought you could harm me with your little toys?"]="Wirklich? Du dachtest, du könntest mich mit deinen kleinen Spielzeugen verletzen?",
+["You're pathetic! You are not worthy of my attention..."]="Du bist erbärmlich! Du hast meine Aufmerksamkeit nicht verdient.",
+["Actually, you aren't worthy of life! Take this..."]="Eigentlich hast du nicht das Recht, zu leben! Nimm das!",
+["Incredible..."]="Unglaublich.",
+["I can't wait any more, I have to save myself!"]="Ich kann nicht länger waren, ich muss selber zur Hilfe eilen!",
+["Where are all these crates coming from?!"]="Woher kommen all die Kisten?!",
+["I have to get back to the village!"]="Ich muss zum Dorf zurückkehren!",
+["Dense Cloud must have already told them everything..."]="Dichte Wolke muss ihnen bereits alles gesagt haben.",
+["Weaklings"]="Schwächlinge",
+["Stronglings"]="Stärklinge",
+["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"]="Um einen Träger zu platzieren, wähle ihn, benutze [Links] und [Rechts], um den Winkel und die Länge zu wählen, platziere ihn mit [Linksklick].",
+["Under Construction"]="Baustelle",
+["A little gift from the cyborgs"]="Ein kleines Geschenk von den Cyborgs",
+["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"]="Beschütze dich!|Granatentipp: Setze den Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.",
+["The guardian"]="Der Wächter",
+["...and so the cyborgs took over the world..."]="Und so eroberten die Cyborgs die Welt …",
+["Survive!|Hint: Cinematics can be skipped with the [Precise] key."]="Überlebe!|Tipp: Zwischensequenzen können mit der [Genaues Zielen]-Taste übersprungen werden.",
+["The First Encounter"]="Das erste Zusammentreffen",
["Brain Stu"]="Hirntopf",
["Brainila"]="Hirnilia",
+["Olive"]="Olive",
["Salivaslurper"]="Speichelschlürfer",
+["Mindy"]="Intellekta",
+["NomNom"]="Mjamjam",
["Spleenlover"]="Milzlieber",
["Thighlicker"]="Schenkelschlecker",
-["NomNom"]="Mjamjam",
-["Mindy"]="Intellekta",
["Defeat the cannibals!|"]="Besiege die Kannibalen!|",
["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."]="Versuche, den Häuptling zu beschützen! Du wirst nicht verlieren, wenn er stirbt, aber es ist ratsam, dass er überlebt.",
+["Invasion"]="Invasion",
["United We Stand"]="Gemeinsam sind wir stark",
-["Invasion"]="Invasion",
["I'm so scared!"]="Ich hab solche Angst!",
["Back in the village, after telling the villagers about the threat..."]="Zurück im Dorf, nachdem die Dorfbewohner vor der Gefahr gewarnt worden sind …",
["Their buildings were very primitive back then, even for an uncivilised island."]="Ihre Gebäude waren damals sehr primitiv, selbst für eine unzivilisierte Insel.",
@@ -1155,222 +698,756 @@
["The caves are well hidden, they won't find us there!"]="Die Höhlen sind gut versteckt, sie werden uns hier nicht finden!",
["Light Cannfantry"]="Leichte Kannfantrie",
["Heavy Cannfantry"]="Schwere Kannfantrie",
-["Corpse Thrower"]="Leichenschmeißer",
-["Brutal Lily"]="Brutalo-Lilie",
-["Hannibal"]="Hannibal",
-["More Natives"]="Mehr Ureinwohner",
-["Traitors"]="Verräter",
-["Honest Lee"]="Leo Ehrlich",
-["Vegan Jack"]="Veganer-Jochen",
-["Sirius Lee"]="Leo Ernst",
-["Smith 0.97"]="Smith 0.97",
-["Smith 0.98"]="Smith 0.98",
-["Smith 0.99a"]="Smith 0.99a",
-["Smith 0.99b"]="Smith 0.99b",
-["Smith 0.99f"]="Smith 0.99f",
-["Smith 1.0"]="Smith 1.0",
-["Everything looks OK..."]="Alles sieht gut aus.",
-["This will be fun!"]="Das wird Spaß machen!",
-["HAHA!"]="HAHA!",
-["And how am I alive?!"]="Und wie kann es sein, dass ich am Leben bin?",
-["It must be the cyborgs again!"]="Das müssen wohl wieder diese Cyborgs sein!",
-["Looks like the whole world is falling apart!"]="Es scheint, als würde die ganze Welt auseinanderfallen!",
-["Look out! We're surrounded by cannibals!"]="Passt auf! Wir sind von Kannibalen umzingelt!",
-["Cannibals?! You're the cannibals!"]="Kannibalen?! Ihr seid die Kannibalen!",
-["WHAT?! You're the ones attacking us!"]="WAS?! Ihr seid diejenigen, die uns angreifen!",
-["You have kidnapped our whole tribe!"]="Ihr habt unseren ganzen Stamm entführt!",
-["You've been assaulting us, we have been just defending ourselves!"]="Ihr habt uns überfallen, wir haben uns nur verteidigt!",
-["I can't believe this!"]="Ich kann es nicht glauben!",
-["Have we ever attacked you first?"]="Haben wir euch jemals zuerst angegriffen?",
-["Yes!"]="Ja!",
-["When?"]="Wann?",
-["Uhmm...ok no."]="Ähm, okay, nein.",
-["But you're cannibals. It's what you do."]="Aber ihr seid Kannibalen. Das ist, was ihr tut.",
-["Again with the 'cannibals' thing!"]="Nicht schon wieder dieser »Kannibalen«-Unfug!",
-["Where do you get that?!"]="Wo habt ihr das her?",
-["Everyone knows this."]="Das weiß jeder.",
-["I didn't until about a month ago."]="Ich wusste es nicht vor einem Monat.",
-["Hmmm...actually...I didn't either."]="Hmmm, ich … eigentlich auch nicht.",
-["About a month ago, a cyborg came and told us that you're the cannibals!"]="Vor etwa einem Monat kam ein Cyborg und erzählte uns, dass ihr die Kannibalen seid.",
-["A cy-what?"]="Ein Cy-was?",
-["Cyborg. It's what the aliens call themselves."]="Cyborg. So nennen sich die Außerirdischen selbst.",
-["They told us to wear these clothes. They said that this is the newest trend."]="Sie sagten uns, dass wir diese Kleidung tragen sollten. Sie sagten, dass es der neueste Trend sei.",
-["They've been manipulating us all this time!"]="Sie haben uns die ganze Zeit manipuliert!",
-["They must be trying to weaken us!"]="Sie müssen versuchen, uns zu schwächen!",
-["We have to unite and defeat those cylergs!"]="Wir müssen uns zusammentun, und diese Cylergs besiegen!",
-["We can't let them take over our little island!"]="Wir können sie nicht unsere kleine Insel erobern lassen!",
-["You have finally figured it out!"]="Ihr habt es endlich gemerkt!",
-["You meatbags are pretty slow, you know!"]="Ihr Fleischklumpen seid ziemlich langsam, wisst ihr?",
-["Why do you want to take over our island?"]="Warum wollt ihr unsere Insel erobern?",
-["Do you have any idea how valuable grass is?"]="Habt ihr überhaupt eine Ahnung darüber, wie wertvoll Gras ist?",
-["This island is the only place left on Earth with grass on it!"]="Diese Insel ist der einzige Ort auf der Welt, der noch Gras hat.",
-["It's worth more than wood!"]="Es ist wertvoller als Holz!",
-["That makes it almost invaluable!"]="Das macht es fast unbezahlbar!",
-["We have nowhere else to live!"]="Wir haben sonst keinen Ort zu leben!",
-["That's not our problem!"]="Das ist nicht unser Problem!",
-["We'll give you a problem then!"]="Dann geben wir euch ein Problem!",
-["Nicely done, meatbags!"]="Gut gemacht, Fleischkugeln!",
-["You have won the game by proving true cooperative skills!"]="Ihr hab das Spiel gewonnen, indem ihr wahre kooperative Fähigkeiten gezeigt habt!",
-["You have proven yourselves worthy!"]="Du hast dich bewährt.",
-["Game? Was this a game to you?!"]="Spiel? War das ein Spiel für dich?!",
-["Well, yes. This was a cyborg television show."]="Ähm, ja. Es war eine Cyborg-Fernsehsendung.",
-["It is called 'Hogs of Steel'."]="Sie heißt »Igel aus Stahl«.",
-["Are you saying that many of us have died for your entertainment?"]="Willst du damit sagen, dass viele von uns nur für eure Unterhaltung gestorben sind?",
-["Our tribe, our beautiful island!"]="Unser Stamm, unsere schöne Insel!",
-["All gone...everything!"]="Alles fort, alles!",
-["But the ones alive are stronger in their heart!"]="Aber die Lebendigen sind in ihrem Herzen stärker.",
-["Just kidding, none of you have died!"]="Nur ein Witz! Niemand von euch ist gestorben!",
-["I mean, none of you ceased to live."]="Ich meine, niemand von euch hat aufgehört, zu leben.",
-["You'll see what I mean!"]="Du wirst verstehen, was ich meine.",
-["They are all waiting back in the village, haha."]="Sie warten alle im Dorf, haha.",
-["You are playing with our lives here!"]="Du spielst mit unseren Leben!",
-["Do you think you're some kind of god?"]="Hältst du dich für eine Art Gott?",
-["Interesting idea, haha!"]="Interessanter Gedanke, haha!",
-["What a douche!"]="Was für ein Blödian!",
-["The Enemy Of My Enemy"]="Der Feind meines Feindes",
-["The Union"]="Die Einheit",
-["Defeat the cyborgs!"]="Besiege die Cyborgs!",
-["Hmmm...it's a draw. How unfortunate!"]="Hmmm … Es ist unentschieden. Wie blöd!",
-["Yay, we won!"]="Hurra, wir haben gewonnen!",
-["Nice work!"]="Gute Arbeit!",
-["Hedge-cogs"]="Stachelräder",
-["Leader"]="Führer",
-["Your deaths will be avenged, cannibals!"]="Eure Tode werden gerächt sein, Kannibalen!",
-["Unit 0x0007"]="Einheit 0x0007",
-["Hogminator"]="Iglinator",
-["Carol"]="Karol",
-["Blender"]="Blender",
-["Elderbot"]="Altbot",
-["Those aliens are destroying the island!"]="Diese Außerirdischen zerstören die Insel!",
-["Dude, all the plants are gone!"]="Mann, all die Pflanzen sind fort!",
-["What am I gonna...eat, yo?"]="Was werde ich … essen?",
-["Fell From Heaven is the best! Fell From Heaven is the greatest!"]="Fiel Vom Himmel ist die Beste! Fiel Vom Himmel ist die Größte!",
-["Yuck! I bet they'll keep worshipping her even after I save the village!"]="Pfui! Ich wette, sie werden sie verehren, selbst, wenn ich das Dorf rette.",
-["I'm getting old for this!"]="Ich werd zu alt dafür!",
-["I'm getting thirsty..."]="Ich hab Durst.",
-["I wonder why I'm so angry all the time..."]="Ich frag mich, warum ich die ganze Zeit so wütend bin.",
-["It must be a childhood trauma..."]="Es muss ein Kindheitstrauma sein.",
-["Just wait till I get my hands on that trauma! ARGH!"]="Warte nur, bis ich mein Trauma in die Finger kriege! ARGH!",
-["I could just teleport myself there..."]="Ich könnte mich einfach dorthin teleportieren.",
-["It's a shame, I forgot how to do that!"]="Zu dumm, ich habe vergessen, wie man das macht.",
-["Hello again, "]="Hallo, ",
-["I just found out that they have captured your princess!"]="Ich habe gerade herausgefunden, dass sie deine Prinzessin gefangen haben!",
-["Of course I have to save her. What did I expect?!"]="Natürlich muss ich sie retten. Was habe ich erwartet?",
-["She's behind that tall thingy."]="Sie ist hinter diesem großen Dingsda.",
-["I'm here to help you rescue her."]="Ich bin hier, um dir bei ihrer Rettung zu helfen.",
-["Yo, dude, we're here, too!"]="Heda, wir sind auch da!",
-["We were trying to save her and we got lost."]="Wir versuchten, sie zu retten, aber haben uns verlaufen.",
-["That's typical of you!"]="Das ist so typisch für dich!",
-["Why are you helping us, uhm...?"]="Warum hilfst du uns, äh, …?",
-["Call me Beep! Well, 'cause I'm such a nice...person!"]="Nenn mich »Pieps«! Weil ich so eine nette … Person bin!",
-["Here, let me help you save her!"]="Hier, lass mich dir helfen, sie zu retten!",
-["Thanks!"]="Danke!",
-["Why can't he just let her go?!"]="Warum kann er sie nicht einfach freilassen?",
-["Family Reunion"]="Familientreffen",
-["Salvation"]="Erlösung",
-["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!"]="Befrei deine Teamkollegen aus ihrem natürlichen Gefängnis und rette die Prinzessin!|Tipp: Löcher bohren sollte alle Probleme lösen.|Tipp: Es könnte eine gute Idee sein, vor dem Bohren einen Träger zu platzieren. Ich mein ja nur.|Tipp: All deine Igel müssen sich über der markierten Höhe befinden.|Tipp: Undichte Stelle muss sich sehr nahe an der Prinzessin befinden.",
-["Hostage Situation"]="Geiselrettung",
-["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!"]="Rette die Prinzessin! All deine Igel müssen überleben!|Tipp: Töte die Cyborgs zuerst! Benutze die Munition sehr vorsichtig!|Tipp: Du solltest vielleicht einen Träger als Deckung behalten!",
-["Thank you, my hero!"]="Danke dir, mein Held!",
-["Biomechanic Team"]="Biomechanisches Team",
-["Climb Home"]="Nach Hause klettern",
-["Rope to safety"]="Schwing dich in Sicherheit",
-["You are far from home, and the water is rising, climb up as high as you can!|Your score will be based on your height."]="Du bist weit weg von Zuhause, und das Wasser steigt, klettere so hoch, wie du kannst!|Deine Punktzahl wird von deiner Höhe abhängen.",
-["Made it!"]="Geschafft!",
-["Ahhh, home, sweet home. Made it in %d seconds."]="Ah, trautes Heim, Glück allein! Geschafft in %d Sekunden.",
-["You have beaten the challenge!"]="Du hast die Herausforderung gemeistert!",
-["Your height over time"]="Deine Höhe über die Zeit",
-["%s reached home in %.3f seconds. Congratulations!"]="%s has das Zuhause in %.3f Sekunden erreicht. Gratulation!",
-["%s bravely climbed up to a dizzy height of %d to reach home."]="Mutig erklomm %s eine schwindelerregende Höhe von %d, um das Zuhause zu erreichen.",
-["seconds"]="Sekunden",
-["%s has passed the best height of %s!"]="%s hat die beste Höhe von %s überschritten!",
-["%s never got the ninja diploma."]="%s ist bei der Ninjaprüfung durchgefallen.",
-["You have to move upwards, not downwards, %s!"]="Du musst nach oben, nicht nach unten, %s!",
-["%s never wanted to reach for the sky in the first place."]="%s wollte nie nach den Sternen greifen.",
-["%s should try the rope training mission first."]="%s sollte wohl zuerst das Seiltraining absolvieren.",
-["%s skipped ninja classes."]="%s hat den Ninjaunterricht geschwänzt.",
-["%s doesn’t really know how to handle a rope properly."]="%s weiß nicht, wie man mit einem Seil umgeht.",
-["Better luck next time!"]="Vielleicht klappt's beim nächsten Mal!",
-["It was all just bad luck!"]="So ein Pech!",
-["Well, that escalated quickly!"]="Das ging aber schnell in die Hose!",
-["What? Is it over already?"]="Wie? Ist es schon vorbei?",
-["%s was damn close to home."]="%s war verdammt nah an Zuhause.",
-["%s was close to home."]="%s war nah an Zuhause.",
-["%s was good, but not good enough."]="%s war gut, aber nicht gut genug.",
-["%s managed to pass half of the distance towards home."]="%s hat die Hälfte des Weges nach Hause absolviert.",
-["%s went over a quarter of the way towards home."]="%s hat über die Hälfte des Weges nach Hause absolviert.",
-["%s still had a long way to go."]="%s hatte noch einen langen Weg.",
-["%s made it past the hogosphere."]="%s hat es über die Igelspähre geschafft.",
-["%s barely made it past the hogosphere."]="%s hat es so gerade noch über die Igelsphäre geschafft.",
-["%s wins!"]="%s gewinnt!",
-["Team’s best heights per round"]="Die Besthöhen der Teams pro Runde",
-["This round’s award for ulitmate disappointment goes to: Everyone!"]="Der ultimative Enttäuschungspreis geht in dieser Runde an: alle!",
-["%s (%s) reached for the sky and beyond with a height of %d!"]="%s (%s) griff nach den Sternen mit einer Höhe von %d!",
-["%s (%s) was certainly not afraid of heights: Peak height of %d!"]="%s (%s) hatte ganz bestimmt keine Höhenangst: Besthöhe von %d!",
-["%s (%s) does not have to feel ashamed for their best height of %d."]="%s (%s) braucht sich für die Besthöhe von %d nicht zu schämen.",
-["%s (%s) reached a decent peak height of %d."]="%s (%s) erreichte eine gute Besthöhe von %d.",
-["%s (%s) reached a peak height of %d."]="%s (%s) erreichte eine Besthöhe von %d.",
-["The Navy greets %s for managing to get in a distance of %d away from the mainland!"]="Die Marine grüßt %s für einen Abstand von %d vom Festland!",
-["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"]="Grüße von der Marine, %s (%s), für einen Abstand von %d vom Festland!",
-["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."]="Dein Igel hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.",
-["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."]="%s (%s) hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.",
-["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."]="Autsch! Das muss wehgetan haben. Du hast deinen armen Igel mit %d verstümmelt.",
-["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."]="Autsch! Das muss wehgetan haben. %s (%s) ist mit %d auf den Boden aufgeschlagen.",
-["Hedgewars-Basketball"]="Hedgewars-Basketball",
-["Not So Friendly Match"]="Kein-so-Freundschaftsspiel",
-["Bat your opponents through the|baskets and out of the map!"]="Schlage deine Widersacher durch|die Körbe und aus der Karte hinaus!",
-["%s is out and Team %d|scored a point!| |Score:"]="%s ist draußen und Team %d|erhält einen Punkt!| |Punktestand:",
-["%s is out and Team %d|scored a penalty!| |Score:"]="%s ist draußen und Team %d|erhält eine Strafe!| |Punktestand:",
-["TrophyRace"]="TrophyRace",
-["Use your rope to get from start to finish as fast as you can!"]="Nutze das Seil um von Start zu Ziel zu gelangen - so schnell du kannst!",
-["NEW fastest lap: "]="NEUE schnellste Runde: ",
-["Fastest lap: "]="Schnellste Runde: ",
-["Best laps per team: "]="Beste Rundenzeiten pro Team: ",
-["Team %d: "]="Team %d: ",
-["You've reached the goal!| |Time: "]="Ziel erreicht!| |Zeit: ",
-["Control pillars to score points."]="Behalte die Kontrolle über die Säulen, um Punkte zu erhalten.",
-["Goal"]="Ziel",
-["Team Scores"]="Teampunktestand",
-["GAME OVER!"]="SPIEL ZU ENDE!",
-["Victory for the "]="Sieg für ",
-["Hooray!"]="Hurra!",
-["Flag respawned!"]="Fahne wieder erschienen!",
-["You have SCORED!!"]="Du hast GEPUNKTET!",
-["Opposing Team: "]="Gegnerisches Team: ",
-["Flag returned!"]="Fahne zurückgebracht!",
-["That was pointless."]="Das war sinnlos.",
-["The flag will respawn next round."]="Die Fahne wird nächste Runde wieder auftauchen.",
-["Flag captured!"]="Fahne erobert!",
-["Boom!"]="Bumm!",
-[" - 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"]=" - Bringe die gegnerische Flagge zu deiner Heimatbasis, um zu punkten. | - Das Team, das zuerst 3 Flaggen erobert, gewinnt. | - Du kannst nur punkten, wenn deine eigene Flagge in deiner Basis ist | - Igel lassen die Flagge fallen, wenn sie sterben oder ertrinken | - Fallengelassene Flaggen können zurückgebracht oder wieder gestohlen werden | - Igel tauchen nach ihrem Tod wieder auf",
-["Hedgewars-Knockball"]="Hedgewars-Schlagball",
-["Bat balls at your enemies and|push them into the sea!"]="Schlage Bälle auf deine Widersacher|und lass sie ins Meer fallen!",
-["Trainee"]="Azubi",
-["Training Team"]="Traningsteam",
-["You have shot %d times."]="Du hast %d mal geschossen.",
-["Time’s up!"]="Die Zeit ist um!",
-["Targets left: %d"]="Verbleibende Ziele: %d",
-["You have destroyed all targets!"]="Du hast alle Ziele zerstört!",
-["Congratulations! You have destroyed all targets within the time."]="Gratulation! Du hast alle Ziele innerhalb der verfügbaren Zeit ausgeschaltet.",
-["You have finished the target practice!"]="Du hast die Zielübung abgeschlossen!",
-["Your accuracy was %.1f%% (+%d points)."]="Deine Treffgenauigkeit betrug %.1f%% (+%d Punkte).",
-["You had %.1fs remaining on the clock (+%d points)."]="Du hattest eine verbleibende Zeit von %.1fs (+%d Punkte).",
-["HIGHLANDER"]="HOCHLÄNDER",
-["Not all hogs are born equal."]="Nicht alle Igel werden gleich geboren.",
-["Eliminate enemy hogs and take their weapons."]="Vernichte alle gegnerischen Igel und nimm ihre Waffen.",
-["Per-Hog Ammo"]="Munition pro Igel",
-["Weapons reset."]="Waffen werden zurückgesetzt.",
-["Unlimited Attacks"]="Unbegrenzte Angriffe",
-["Jumping is disabled"]="Sprünge sind deaktiviert!",
+["Spacetrip"]="Weltraumreise",
+["Go to the moon by using the flying saucer and complete the main mission"]="Komm zum Mond, indem du die fliegende Untertasse benutzt und die Hauptmission beendest.",
+["Come back to this mission and visit the other planets to collect the crates"]="Kehre zu dieser Mission zurück und besuche die anderen Planeten, um die Kisten einzusammeln.",
+["Visit the Death Planet after completing all the other planets' main missions"]="Besuche den Todesplaneten, nachdem du die Hauptmissionen aller anderen Planeten fertiggestellt hast.",
+["Come back to this mission after collecting all the device parts"]="Kehre zu dieser Mission zurück, nachdem du alle Bauteile eingesammelt hast.",
+["Getting ready"]="Bereitmachen",
+["Go and collect the crate"]="Geh und sammle die Kiste.",
+["Try not to get spotted by the guards!"]="Versuch, nicht von den Wächtern entdeckt zu werden!",
+["The adventure begins!"]="Das Abenteuer beginnt!",
+["Travel carefully as your fuel is limited"]="Reise vorsichtig, da dein Treibstoff begrenzt ist.",
+["Use the saucer and fly to the moon"]="Benutze die Untertasse und flieg zum Mond.",
+["An unexpected event!"]="Ein unerwartetes Ereignis!",
+["Beware, any damage taken will stay until you complete the moon's main mission"]="Achtung, jeglicher Schaden, den du nimmst, wird bleiben, bis du die Hauptmission des Mondes fertiggestellt hast.",
+["Use the saucer and fly away"]="Benutze die Untertasse und flieg davon!",
+["Objectives"]="Ziele",
+["Searching the stars!"]="Suche in den Sternen",
+["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"]="Besuche den Eis-, Wüsten- und Fruchtplaneten, bevor du mit dem Todesplaneten fortfährst.",
+["Fly to the meteorite and detonate the explosives"]="Fliege zum Meteroiten und sprenge die Bomben.",
+["Saving Hogera"]="Hogera retten",
+["Hog Solo"]="Igel Einsam",
+["H"]="H",
+["Dr.Cornelius"]="Dr. Cornelius",
+["Bob"]="Bert",
+["Sam"]="Steffen",
+["PAotH"]="PAdI",
+["Guards"]="Wächter",
+["Help Hog Solo to find all the parts of the anti-gravity device."]="Hilf Igel Einsam, alle Bauteile des Antischwerkraftgerätes zu finden.",
+["Travel to all the neighbor planets and collect all the pieces"]="Reise zu allen Nachbarplaneten und sammle alle Bauteile ein.",
+["Now I have to climb these trees"]="Jetzt muss ich diese Bäume hochklettern.",
+["Use the rope to get to the crate"]="Benutze das Seil, um zur Kiste zu gelangen.",
+["One cannot simply walk in moon with rope!"]="Man kann nicht einfach so im Mond mit dem Seil spazieren!",
+["This is the wrong way!"]="Das ist die falsche Richtung!",
+["Collect the crate with the flying saucer"]="Sammle die Kiste mit der fliegenden Untertasse ein.",
+["Fly to the moon"]="Flieg zum Mond.",
+["Welcome to the moon!"]="Willkommen auf dem Mond!",
+["the moon"]="der Mond",
+["Welcome to the Fruit Planet!"]="Willkommen auf dem Fruchtplaneten!",
+["the Fruit Planet"]="der Fruchtplanet",
+["Welcome to the Desert Planet!"]="Willkommen auf dem Wüstenplaneten!",
+["the Desert Planet"]="der Wüstenplanet",
+["Welcome to the Planet of Ice!"]="Willkommen auf dem Eisplaneten!",
+["the Ice Planet"]="der Eisplanet",
+["Welcome to the Death Planet!"]="Willkommen auf dem Todesplaneten!",
+["the Planet of Death"]="der Todesplanet!",
+["Welcome to the meteorite!"]="Willkommen auf dem Meteorit!",
+["the meteorite"]="der Meteorit",
+["Near secret base 17 of PAotH in the rural Hogland..."]="In der Nähe der geheimen Basis 17 der PAdI im ländlichen Igelland …",
+["So Hog Solo, here we are..."]="Also, Igel Einsam, da wären wir!",
+["Behind these trees on the east side there is secret base 17"]="Hinter diesen Bäumen auf der Ostseite liegt die geheime Basis 17.",
+["You have to continue alone from now on."]="Von hier an musst du alleine fortfahren.",
+["Be careful, the future of Hogera is in your hands!"]="Sei vorsichtig, die Zukunft von Hogera liegt in deinen Händen!",
+["We'll use our communicators to contact you"]="Wir werden unsere Kommunikatoren benutzen, um dich zu kontaktieren.",
+["In am also entrusting you with some rope"]="Ich werde dir auch etwas Seil anvertrauen.",
+["You may find it handy"]="Du könntest es gebrauchen.",
+["Thank you Dr.Cornelius"]="Danke, Dr. Cornelius!",
+["I'll make good use of it"]="Ich werde es klug anwenden.",
+["It would be wiser to steal the space ship while PAotH guards are taking a brake!"]="Es wäre schlauer, das Raumschiff zu stehlen, während die PAdI-Wächter eine Pause machen!",
+["Remember! Many will seek the anti-gravity device! Now go, hurry up!"]="Denk dran: Viele werden das Antischwerkraftgerät begehren! Geh jetzt! Beeilung!",
+["CheckPoint reached!"]="Kontrollpunkt erreicht!",
+["Got the saucer!"]="Ich hab die Untertasse!",
+["Nice!"]="Nett!",
+["Now use it and go to the moon PAotH station to get more fuel!"]="Benutze es jetzt und komme zur PAdI-Mondbasis, um mehr Treibstoff zu holen!",
+["Prepare to flee!"]="Bereitmachen zum Fliehen!",
+["Hey"]="Hey",
+["Look, someone is stealing the saucer!"]="Sieh, jemand stiehlt die Untertasse!",
+["I'll get him!"]="Den schnapp ich mir!",
+["You are out of danger, time to go to the moon!"]="Du bist in Sicherheit. Zeit, zum Mond zu gelangen!",
+["I guess we lost him!"]="Ich glaube, wir haben ihn verloren!",
+["We should better report this and continue our watch!"]="Wir sollten dies besser melden und unsere Wache fortsetzen.",
+["I guess I can't go far without fuels!"]="Ich fürchte, ohne Treibstoff komme ich nicht weit.",
+["Go to go back"]="Ich muss umkehren.",
+["You have to try again!"]="Du muss es nochmal versuchen!",
+["Hm... Now I ran out of fuel..."]="Hmm … Jetzt ist mein Treibstoff alle.",
+["This planet seems dangerous!"]="Dieser Planet scheint gefährlich zu sein!",
+["I am not ready for this planet yet. I should visit it when I have found all the other device parts"]="Ich bin für diesen Planeten noch nicht bereit. Ich sollte ihn besuchen, sobald ich alle anderen Bauteile gefunden habe.",
+["Under the meteorite shadow..."]="Unter dem Schatten des Meteorits …",
+["You did great Hog Solo! However we aren't out of danger yet!"]="Du hast dich wacker geschlagen, Igel Einsam! Aber wir haben die Gefahren noch nicht überstanden.",
+["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now"]="Der Meteorit kam zu nah und das Antischwerkraftgerät ist zu schwach, um ihn jetzt zu stoppen.",
+["We need it to get split into at least two parts"]="Wir müssen ihn in mindestens zwei Teile zerbrechen.",
+["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"]="PAdI hat Sprengstoffe geschickt, aber leider scheint der Auslöser defekt zu sein.",
+["We need you to go there and detonate them yourself! Good luck!"]="Du musst dorthin gehen und sie selbst detonieren. Viel Glück!",
+["Hog Solo arrived at "]="Igel Einsam ist angekommen an ",
+["Return to the mission menu by pressing the \"Go back\" button"]="Kehre zum Missionsmenü zurück, indem du den »Zurück«-Knopf drückst.",
+["You can choose another planet by replaying this mission"]="Du kannst einen anderen Planeten auswählen, indem du diese Mission erneut spielst.",
+["Planets with completed main missions will be marked with a flower"]="Planeten, bei denen die Hauptmissionen erledigt wurden, werden mit einer Blume markiert.",
+["You have to travel again"]="Du musst erneut reisen.",
+["Your first destination is the moon in order to get more fuel"]="Dein erstes Ziel ist der Mond, um mehr Treibstoff zu erhalten.",
+["You have to complete the main mission on moon in order to travel to other planets"]="Du musst die Hauptmission auf dem Mond erledigen, damit du zu den anderen Planeten reisen kannst.",
+["You have to be careful and not die!"]="Du musst vorsichtig sein und darfst nicht sterben!",
+["The last encounter"]="Das letzte Gefecht",
+["Defeat Professor Hogevil!"]="Besiege Professor Bösigel!",
+["The final part"]="Das letzte Bauteil",
+["Professor"]="Professor",
+["thug"]="Rowdy",
+["Hog Solo lost, try again!"]="Igel Einsam hat verloren, versuch es nochmal!",
+["To win the game you have to eliminate all your enemies"]="Um das Spiel zu gewinnen, musst du all deine Gegner eliminieren",
+["Congratulations, you won!"]="Gratulation, du hast gewonnen!",
+["You have successfully eliminated Professor Hogevil"]="Du hast Professor Bösigel erfolgreich eliminiert!",
+["You have rescued H and Dr.Cornelius"]="Du hast H und Dr. Cornelius gerettet.",
+["You have acquired the last device part"]="Du hast das letzte Bauteil erhalten.",
+["Now go and play the menu mission to complete the campaign"]="Geh jetzt und spiele die Menümission, um die Kampagne zu beenden.",
+["Somewhere in the uninhabitable Death Planet..."]="Irgendwo auf dem unbewohnbaren Todesplaneten …",
+["Welcome Hog Solo, surprised to see me?"]="Hallo, Igel Einsam! Bist du überrascht, mich zu sehen?",
+["As you can see I have survived our last encounter and I had time to plot my master plan!"]="Wie du sehen kannst, habe ich unser letztes Zusammentreffen überlebt und ich hatte Zeit, meinen Masterplan auszuhecken.",
+["I've thought that the best way to get the device is to let you collect most of the parts for me!"]="Ich dachte mir, dass es am einfachsten ist, wenn ich dich einfach die meisten Bauteile für mich sammeln lasse.",
+["So, now I got the last part and I have your friends captured..."]="Und jetzt habe ich das letzte Teil und deine Freunde gefangengenommen.",
+["Will you give me the other parts?"]="Wirst du mir die anderen Teile geben?",
+["I will never hand you the parts!"]="Niemals gebe ich dir die Teile!",
+["Then prepare for battle!"]="Dann mach dich bereit für die Schlacht!",
+["Killing the specialists"]="Die Spezialisten töten",
+["Use your available weapons in order to eliminate the enemies"]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren.",
+["Each time you play this missions enemy hogs will play in a random order"]="Jedes mal, wenn du diese Mission spielst, werden die feindlichen Igel in einer zufälligen Reihenfolge spielen.",
+["At the start of the game each enemy hog has only the weapon that he is named after"]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nachdem er benannt wurde.",
+["A random hedgehog will inherit the weapons of his deceased team-mates"]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben.",
+["If you kill a hedgehog with the respective weapon your health points will be set to 100"]="Wenn du einen Igel mit der entsprechenden Waffe tötest, wird deine Gesundheit auf 100 gesetzt.",
+["If you injure a hedgehog you'll get 35% of the damage dealt"]="Wenn du einen Igel verletzt, wirst du 35% des angerichteten Schadens erhalten.",
+["Every time you kill an enemy hog your ammo will get reset"]="Bei jedem Mal, in dem du einen feindlichen Igel tötest, wird deine Munition zurückgesetzt.",
+["Rope won't get reset"]="Seil wird nicht zurückgesetzt.",
+["Challenge Objectives"]="Herausforderungsziele",
+["Mortar"]="Mörser",
+["Desert Eagle"]="Desert Eagle",
+["Grenade"]="Granate",
+["Shoryuken"]="Shoryuken",
+["Bazooka"]="Bazooka",
+["5 deadly hogs"]="5 tödliche Igel",
+["You have to eliminate all the enemies"]="Du musst alle Gegner eliminieren.",
+["Read the Challenge Objectives from within the mission for more details"]="Lies die Herausforderungsziele in der Mission für mehr Details.",
+["You complete the mission in "]="Du hast die Mission abgeschlossen in ",
+["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a Laser Sight"]="Die nächsten 4 Male, die du die Mission »Das letzte Gefecht« spielst, wirst du 20 weitere Trefferpunkte und ein Laservisier erhalten.",
+["Somewhere in the Planet of Death..."]="Irgendwo auf dem Todesplaneten …",
+["...Hog Solo fights for his life"]="… kämpft Igel Einsam ums Überleben.",
+["A Space Adventure"]="Ein Weltraumabenteuer",
+["Searching in the dust"]="Suche im Staub",
+["The device part is hidden in one of the crates! Go and get it!"]="Das Bauteil ist in einer der Kisten versteckt. Geh und hole es!",
+["Most of the destructible terrain in marked with blue color"]="Das meiste des zerstörbaren Geländes ist mit einer blauen Farbe markiert.",
+["Chief Sandologist"]="Haupt-Sandologe",
+["Sandy"]="Sandi",
+["Spike"]="Stachel",
+["Sandstorm"]="Sandsturm",
+["Smugglers"]="Schmuggler",
+["The part device is hidden in one of the crates! Go and get it!"]="Das Bauteil ist in einer der Kisten versteckt. Geh und hole es!",
+["A smuggler! Prepare for battle"]="Ein Schmuggler! Bereitmachen zum Kämpfen!",
+["Run away you coward!"]="Lauf weg, du Feigling!",
+["Who's there?! I'll get you..."]="Wer ist da? Ich krieg dich …",
+["In the Planet of Sand, you have to double check your moves..."]="Auf dem Sandplaneten musst du deine Züge gut überlegen …",
+["Finally you are here..."]="Endlich bist du hier …",
+["Thank you for meeting me on such a short notice!"]="Danke, dass du mich so kurzfristig getroffen hast!",
+["No problem, I would do anything for H!"]="Kein Problem, ich würde alles für H tun!",
+["Now listen carefully! Below us there are tunnels that have been created naturally over the years"]="Jetzt hör gut zu! Unter uns sind Tunnel, welche über die Jahre natürlich entstanden sind.",
+["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here"]="Ich hörte, dass die örtlichen Stämme sagen, dass vor vielen Jahren einige PAdI-Wissenschaftler ihren Müll dort abgeliefert haben.",
+["H confirmed that there isn't such a PAotH activity logged"]="H bestätigte, dass eine solche PAdI-Aktivität nicht protokolliert ist.",
+["So, I believe that it's a good place to start"]="Also glaube ich, dass es ein guter Ort zum Anfangen ist.",
+["Beware though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find"]="Aber Vorsicht! Viele Schmuggler kommen oft hier her, um diese Tunnel zu durchsuchen und alles mögliche, was sie finden, zu sammeln.",
+["They won't hesitate to attack you in order to rob you!"]="Sie werden nicht zögern, dich anzugreifen, um dich auszurauben!",
+["OK, I'll be extra careful!"]="Okay, ich werde besonders vorsichtig sein!",
+["There is the tunnel entrance"]="Hier ist der Tunneleingang.",
+["Good luck!"]="Viel Glück!",
+["Get him Spike!"]="Hol ihn, Stachel!",
+["This is seems like a wealthy hedgehog, nice..."]="Das sieht wie ein reicher Igel aus, nett.",
+["Checkpoint reached!"]="Kontrollpunkt erreicht!",
+["Haven't found it yet..."]="Ich hab es noch nicht gefunden.",
+["Hoorah!!!"]="Hurra!",
+["To win the game you had to collect the 2 crates with no specific order"]="Um das Spiel zu gewinnen, musst du die 2 Kisten in beliebiger Reihenfolge einsammeln.",
+["To win the game you have to find the right crate"]="Um das Spiel zu gewinnen, musst du die richtige Kiste finden.",
+["You can avoid some battles"]="Du kannst einige Kämpfe vermeiden.",
+["Use your ammo wisely"]="Benutze deine Munition weise.",
+["Don't destroy the device crate!"]="Zerstöre nicht die Kiste mit dem Bauteil!",
+["Running for survival"]="Ums Überleben laufen",
+["Use the rope to quickly get to the surface!"]="Benutze das Seil, um schnell zur Oberfläche zu gelangen!",
+["To win the game you have to go to the surface"]="Um zu gewinnen, musst du zur Oberfläche gehen.",
+["Most mines are not active"]="Die meisten Minen sind Blindgänger.",
+["From the second turn and beyond the water rises"]="Vom 2. Zug an wird das Wasser steigen.",
+["You have escaped successfully"]="Du bist erfolgreich geflohen.",
+["Your escape took you "]="Deine Flucht dauerte ",
+["Many meters below the surface..."]="Viele Meter unter der Oberfläche …",
+["The tunnel is about to get flooded..."]="Der Tunnel wird gleich geflutet!",
+["I have to reach the surface as quickly as I can..."]="Du muss die Oberfläche so schnell wie möglich erreichen.",
+["Precise flying"]="Präzisionsfliegen",
+["Use the RC plane and destroy the all the targets"]="Benutze das Funkflugzeug und zerstöre alle Ziele.",
+["Each time you destroy all the targets on your current level you'll get teleported to the next level"]="Jedes mal, wenn du alle Ziele im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert",
+["You'll have only one RC plane at the start of the mission"]="Am Anfang der Mission hast du nur ein Funkflugzeug.",
+["During the game you can get new RC planes by collecting the weapon crates"]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammest.",
+["On the Desert Planet, Hog Solo found some time to play with his RC plane..."]="Auf dem Wüstenplaneten hat Igel Einsam etwas Zeit gefunden, um mit seinem Funkflugzeug zu spielen.",
+["Level 1 clear!"]="Level 1 abgeschlossen!",
+["Level 2 clear!"]="Level 2 abgeschlossen!",
+["Congratulations, you are the best!"]="Gratulation, du bist der Beste!",
+["You have destroyed all the targets"]="Du hast alle Ziele zerstört.",
+["You are indeed the best PAotH pilot"]="Du bist wirklich der beste PAdI-Pilot.",
+["Next time you play \"Searching in the dust\" you'll have an RC plane available"]="Das nächste Mal, wenn du die Mission »Suche im Staub« spielst, bekommst du ein Funkflugzeug.",
+["You have to destroy all the targets"]="Du musst alle Ziele zerstören.",
+["You will fail if you run out of ammo and there are still targets available"]="Du wirst verlieren, wenn du keine Munition mehr hast und immer noch Ziele übrigbleiben.",
+["The big bang"]="Der Urknall",
+["Find a way to detonate all the explosives and stay alive!"]="Finde einen Weg, alle Sprengstoffe zu detonieren und bleib am Leben!",
+["Red areas are indestructible"]="Rote Bereiche sind unzerstörbar.",
+["Green areas aren't portal enabled"]="Grüne Bereiche sind portalabweisend.",
+["You have to destroy all the explosives without dying!"]="Du musst alle Sprengstoffe zerstören, ohne zu sterben!",
+["Congratulations, you have saved Hogera!"]="Gratulation, du hast Hogera gerettet!",
+["Hogera is safe!"]="Hogera ist in Sicherheit!",
+["Bad timing"]="Schlechtes Timing",
+["Ready for Battle?"]="Bereit für die Schlacht?",
+["Walk left if you want to join Captain Lime or right if you want to decline his offer"]="Geh nach links, wenn du Leutnant Limone beitreten willst, oder nach rechts, wenn du sein Angebot ablehnen möchtest.",
+["Battle Starts Now!"]="Jetzt beginnt die Schlacht!",
+["You have chosen to fight! Lead the Green Bananas to battle and eliminate all the enemies"]="Du hast dich für die Schlacht entschieden! Führe die Grünen Bananen in die Schlacht und eliminiere alle Feinde.",
+["Time to run!"]="Zeit, zu fliehen!",
+["You have chosen to flee... Unfortunately the only place where you can launch your saucer is the left-most place on the map"]="Du hast dich für die Flucht entschieden. Leider ist der einzige Ort, wo du deine Untertasse starten kannst, ganz links auf der Karte.",
+["Captain Lime"]="Leutnant Limone",
+["Mister Pear"]="Herr Birne",
+["Lady Mango"]="Frau Mango",
+["Green Hog Grape"]="Grünigeltraube",
+["Mr Mango"]="Mister Mango",
+["General Lemon"]="General Limone",
+["Robert Yellow Apple"]="Robert Gelbapfel",
+["Summer Squash"]="Sommerkürbis",
+["Tall Potato"]="Großkartoffel",
+["Yellow Pepper"]="Gelbpaprika",
+["Corn"]="Mais",
+["Max Citrus"]="Max Zitron",
+["Naranja Jed"]="Orangus Otus",
+["Green Bananas"]="Grüne Bananen",
+["Yellow Watermelons"]="Gelbe Wassermelonen",
+["Green Bananas won!"]="Die Grünen Bananen haben gewonnen!",
+["You have eliminated all visible enemy hedgehogs!"]="Du hast alle sichtbaren feindlichen Igel besiegt!",
+["Hog Solo escaped successfully!"]="Igel Einsam ist erfolgreich geflohen!",
+["You have reached the take-off area successfully!"]="Du hast das Startfeld erfolgreich erreicht!",
+["Somewhere on the Planet of Fruits a terrible war is about to begin..."]="Irgendwo auf dem Planeten der Früchte steht ein fürchterlicher Krieg bevor.",
+["I was told that as the leader of the king's guard, no one knows this world better than you!"]="Mir wurde gesagt, dass, als der Führer der königlichen Garde, niemand diese Welt besser als du kennst!",
+["So, I kindly ask for your help"]="Also bitte ich dich ergebenst um Hilfe.",
+["You couldn't have come to a worse time Hog Solo!"]="Du könntest du einer kaum schlechteren Zeit ankommen, Igel Einsam!",
+["The clan of the Red Strawberry wants to take over the dominion and overthrone king Pineapple."]="Der Klan der Roten Erdbeere will die Herrschaft an sich reißen und König Ananas stürzen.",
+["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the kingdom of Sand to help to the annual dusting of the king's palace."]="Unter normalen Bedingungen könnten wir sie leicht besiegen, aber wir hatten freundlicherweise die Meisten unserer Männer zum Sandkönigreich geschickt, um bei der jährlichen Entstaubung des Königspalasts zu helfen.",
+["However the army of Yellow Watermelons is about to attack any moment now."]="Aber die Armee der Gelben Wassermelonen wird jeden Moment angreifen.",
+["I would gladly help you if we won this battle but under these circumstances I'll only help you if you fight for our side."]="Ich würde dir gerne helfen, wenn wir diese Schlacht gewinnen, aber unter diesen Bedingungen kann ich dir nur helfen, wenn du an unserer Seite kämpfst.",
+["What do you say? Will you fight for us?"]="Was sagst du? Wirst du für uns kämpfen?",
+["You choose well Hog Solo!"]="Gute Wahl, Igel Einsam!",
+["I have only 3 hogs available and they are all cadets"]="Ich habe nur 3 Igel, uns sie sind alle Kadetten.",
+["As you are more experienced, I want you to lead them to the battle"]="Da du erfahrener bist, will ich, dass du sie in der Schlacht anführst.",
+["I of course will observe the battle and intervene if necessary"]="Ich werde natürlich die Schlacht beobachten und, wenn nötig, einschreiten.",
+["No problem Captain!"]="Kein Problem, Leutnant!",
+["The enemies aren't many anyway, it is going to be easy!"]="Es sind eh nicht so viele Feinde, es wird einfach sein!",
+["Don't be foolish son, there will be more"]="Sei kein Idiot, Sohn, es werden mehr kommen.",
+["Try to be smart and eliminate them quickly. This way you might scare off the rest!"]="Versuch, schlau zu sein und sie schnell zu erledigen. Auf diese Weise könntest du den Rest abschrecken!",
+["Too bad... Then you should really leave!"]="Schade. Dann solltest du wirklich gehen!",
+["Things are going to get messy around here"]="Es wird hier gleich richtig hässlich werden.",
+["Also, you should know that the only place where you can fly is the left-most part of this area"]="Außerdem solltest du wissen, dass der einzige Ort, wo du fliegen kannst, ganz links in diesem Gebiet ist.",
+["All the other places are protected by our flight-inhibiting weapons"]="Alle anderen Orte sind von unseren flugverhindernden Waffen geschützt.",
+["Now go and don't waste more of my time you coward..."]="Jetzt geh, und vergeude meine Zeit nicht noch weiter, du Feigling!",
+["The Green Bananas lost, try again!"]="Die Grünen Bananen haben verloren, versuche es nochmal!",
+["You have to eliminate all the visible enemies"]="Du musst alle sichtbaren Gegner eliminieren.",
+["5 additional enemies will be spawned during the game"]="5 weitere Gegner werden während des Spiels auftauchen.",
+["You are in control of all the active ally units"]="Du hast die Kontrolle über alle aktive verbündete Einheiten.",
+["The ally units share their ammo"]="Die verbündeten Einheiten teilen ihre Munition.",
+["Try to keep as many allies alive as possible"]="Versuch, so viele Verbündete wie möglich am Leben zu erhalten.",
+["Hog Solo couldn't escape, try again!"]="Igel Einsam konnte nicht fliehen, versuch es nochmal!",
+["You have to get to the left-most land and remove any enemy hog from there"]="Du musst zum linken Rand gelangen und von dort alle feindlichen Igel beseitigen.",
+["You will play every 3 turns"]="Du wirst alle 3 Züge spielen.",
+["Green hogs won't intentionally hurt you"]="Grüne Igel werden dich nicht absichtlich verletzen.",
+["Next wave in 3 turns"]="Nächte Welle in 3 Zügen",
+["Last wave in 3 turns"]="Letzte Welle in 3 Zügen",
+["Getting to the device"]="Zum Greifen nah",
+["Exploring the tunnel"]="Höhlenforscher",
+["Hog Solo has to reach the last crates"]="Igel Einsam muss die letzten Kisten erreichen.",
+["Search for the device with the help of the other hedgehogs "]="Such nach dem Gerät mit der Hilfe der anderen Igel.",
+["Explore the tunnel with the other hedgehogs and search for the device"]="Erforsche den Tunnel mit den anderen Igeln und such nach dem Gerät.",
+["Attack Captain Lime before he attacks back"]="Greif Leutnant Limone an, bevor er angreift.",
+["Go to the surface!"]="Geh an die Oberfläche!",
+["Return to the Surface"]="Zurück an die Oberfläche",
+["Attack the assassins before they attack back"]="Greif die Assassinen an, bevor sie angreifen.",
+["Poisonous Apple"]="Giftapfel",
+["Dark Strawberry"]="Dunkle Erdbeere",
+["Watermelon Heart"]="Wassermelonenherz",
+["Deadly Grape"]="Traube des Todes",
+["Hog Solo and GB"]="Igel Einsam und GB",
+["Fruit Assassins"]="Fruchtassassinen",
+["To win the game, Hog Solo has to get the bottom crates and come back to the surface"]="Um das Spiel zu gewinnen, muss Igel Einsam zu den unteren Kisten gelangen und wieder zurück zur Oberfläche kommen.",
+["You can use the other 2 hogs to assist you"]="Du kannst die anderen beiden Igel benutzen, um dich zu unterstützen.",
+["Do not destroy the crates"]="Zerstöre nicht die Kisten.",
+["You'll have to eliminate the Strawberry Assassins at the end"]="Am Ende musst du die Erdbeerassassinen eliminieren.",
+["You'll have to eliminate Captain Lime at the end"]="Am Ende musst du Leutnant Limone eliminieren.",
+["Don't eliminate Captain Lime before collecting the last crate!"]="Eliminiere Leutnant Limone nicht, bevor du die letzte Kiste eingesammelt hast!",
+["You retrieved the lost part"]="Du hast das verlorene Teil ergattert",
+["You defended yourself against Captain Lime"]="Du hast dich gegen Leutnant Limone gewehrt",
+["You defended yourself against Strawberry Assassins"]="Du hast dich gegen die Erdbeerassassinen gewehrt",
+["Somewhere else on the planet of fruits Captain Lime helps Hog Solo..."]="Irgendwo anders auf dem Planeten der Früchte hilft Leutnant Limone Igel Einsam.",
+["You fought bravely and you helped us win this battle!"]="Du hast mutig gekämpft und uns geholfen, diese Schlacht zu gewinnen!",
+["So, as promised I have brought you where I think that the device you are looking for is hidden."]="Nun, wie versprochen habe ich dich an den Ort gebracht, von dem ich glaube, dass das Gerät dort versteckt ist.",
+["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."]="Ich weiß, dass deine Ressourcen aufgrund der Schlacht begrenzt sind, aber ich werde dir zwei meiner besten Igel schicken, um die zu helfen.",
+["Somewhere else on the planet of fruits Hog Solo gets closer to the device..."]="Anderswo auf dem Planeten der Früchte kommt Igel Einsam näher an das Gerät.",
+["You are the one who fled! So, you are alive..."]="Du bist der, der floh! Du lebst also …",
+["I'm still low on hogs. If you are not afraid I could use a set of extra hands"]="Ich habe immer noch wenige Igel. Wenn du keine Angst hast, könnte ich etwas Unterstützung gebrauchen.",
+["I am sorry but I was looking for a device that may be hidden somewhere around here"]="Tut mir Leid, aber ich suchte nach einem Gerät, das hier irgendwo versteckt sein könnte.",
+["Many long forgotten things can be found in the same tunnels that we are about to explore!"]="Viele vergessene Dinge können in denselben Tunneln, die wir gleich erforschen werden, finden.",
+["If you help us you can keep the device if you find it but we'll keep everything else"]="Wenn du uns hilfst, darfst du das Gerät behalten, wenn du es findest, aber wir werden alles andere behalten.",
+["What do you say? Are you in?"]="Was sagst du? Bist du dabei?",
+["Ok then!"]="Alles klar!",
+["Hoorah! I've found it, now I have to get back to Captain Lime!"]="Hurra! Ich habe es gefunden, nun muss ich zurück zu Leutnant Limone!",
+["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"]="Dieser Igel Einsam ist so naiv! Wenn er zurückkehrt, werde ich ihn erschießen und das Gerät für mich selbst behalten!",
+["We have spotted the enemy! We'll attack when the enemies start gathering!"]="Wir haben den Feind gesichtet! Wir werden angreifen, sobald sich die Feinde versammeln.",
+["Precise shooting"]="Präzisionsschießen",
+["You can only use the Sniper Rifle or the Watermelon bomb"]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen.",
+["You'll have only 2 watermelon bombs during the game"]="Du hast nur 2 Wassermelonenbomben während des Spiels.",
+["You'll get an extra Sniper Rifle every time you kill an enemy hog with a limit of max 4 rifles"]="Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre).",
+["You'll get an extra Teleport every time you kill an enemy hog with a limit of max 2 teleports"]="Du erhältst einen zusätzlichen Teleporter für jeden Igel (max. 2 Teleporter).",
+["The first turn will last 25 sec and every other turn 15 sec"]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern.",
+["If you skip a turn then the turn time left will be added to your next turn"]="Wenn du einen Zug überspringst, wird die Zugzeit auf deinen nächsten Zug addiert.",
+["Some parts of the land are indestructible"]="Einige Teile des Landes sind unzerstörbar.",
+["Hog 1"]="Igel 1",
+["Hog III"]="Igel III",
+["Hog 100"]="Igel 100",
+["Hog Saturn"]="Igel Saturn",
+["Hog nueve"]="Igel nueve",
+["Hog onze"]="Igel onze",
+["Hog dertien"]="Igel dertien",
+["Hog 3x5"]="Igel 3x5",
+["Hog two"]="Igel zwei",
+["Hog D"]="Igel D",
+["Hog exi"]="Igel exi",
+["Hog octo"]="Igel octo",
+["Hog decar"]="Igel decar",
+["Hog Hephaestus"]="Igel Hephaestus",
+["Hog 7+7"]="Igel 7+7",
+["Hog EOF"]="Igel EOF",
+["RS1"]="RS1",
+["RS2"]="RS2",
+["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission"]="Du wirst etwas zusätzliche Munition aus den Kisten erhalten, wenn du das nächste mal die Mission »Zum Greifen nah« spielst",
+["Somewhere in the Fruit Planet Hog Solo got lost..."]="Irgendwo im Fruchtplaneten hat sich Igel Einsam verlaufen.",
+["...and got ambushed by the Red Strawberries"]="… und von den Roten Erdbeeren überfallen wurdest.",
+["If you skip the game your time left will be added to your next turn"]="Wenn du das Spiel überspringst, wird deine verbleibende Zeit für deinen nächsten Zug addiert.",
+["A frozen adventure"]="Ein frostiges Abenteuer",
+["Collect the icegun and get the device part from Thanta"]="Sammle die Eiskanone ein und besorge das Bauteil von Thanta",
+["Congratulations, you collected the device part!"]="Gratulation, du hast das Bauteil eingesammelt!",
+["Win"]="Sieg",
+["Paul McHoggy"]="Paul McIgel",
+["Thanta"]="Thanta",
+["Billy Frost"]="Bernd Frost",
+["Ice Jake"]="Eis-Jakob",
+["John Snow"]="Jonas Schnee",
+["White Tee"]="Schneeweiß",
+["Allies"]="Verbündete",
+["Frozen Bandits"]="Frostbanditen",
+["Go to Thanta and get the device part!"]="Gehe zu Thanta und ergattere das Bauteil!",
+["To win the game you have to go next to Thanta"]="Um das Spiel zu gewinnen, muss du neben Thanta stehen",
+["Most of the time you'll be able to use only the icegun"]="Die meiste Zeit wirst du nur die Eiskanone benutzen können",
+["Use the bazooka and the flying saucer to get the icegun"]="Benutze die Bazooka und die fliegende Untertasse, um die Eiskanone zu ergattern",
+["Noooo, Thanta has to stay alive!"]="Nein, Thanta muss am Leben bleiben!",
+["On the Ice Planet, where ice rules..."]="Auf dem Eisplaneten, wo das Eis herrscht …",
+["Hi! Nice to meet you"]="Hi! Schön, dich zu sehen.",
+["Listen carefully! The bandit leader, Thanta, has recently found a very strange device"]="Hör gut zu! Der Anführer der Banditen, Thanta, hat neulich ein sehr seltsames Gerät gefunden.",
+["He doesn't know it but this device is a part of the anti-gravity device"]="Er weiß es nicht, aber dieses Bauteil ist ein Teil des Antischwerkraftgeräts.",
+["Nice, then I should get the part as soon as possible!"]="Interessant, dann sollte ich besser das Teil so früh wie möglich holen!",
+["Be careful, your gadgets won't work in the bandit area. You should get an ice gun"]="Sei vorsichtig, deine Apparate werden im Banditenland nicht funktionieren. Du solltest eine Eiskanone holen.",
+["There is one below us!"]="Da ist eine unter uns!",
+["Congratulations, now you can take Thanta's device part..."]="Gratulation, nun kannst du dir Thantas Bauteil nehmen …",
+["Oh! Please spare me. You can take all my treasures!"]="Oh, bitte verschone mich! Du kannst all meine Schätze nehmen.",
+["I just want the strange device you found!"]="Ich will nur das seltsame Teil, das du gefunden hast.",
+["Here! Take it..."]="Hier, nimm es …",
+["Congratulations, you acquired the device part!"]="Gratulation, du hast das Bauteil erhalten!",
+["At the end of the game your health was "]="Am Ende des Spiels war deine Gesundheit ",
+["Hard flying"]="Schwerer Flug",
+["To win the game you have to pass into the rings in time"]="Um dieses Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen.",
+["You'll get extra time in case you need it when you pass a ring"]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst.",
+["Every 2 rings, the ring color will be green and you'll get an extra flying saucer"]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse",
+["Use space button twice to change flying saucer while floating in mid-air"]="Drücke die Leertaste 2 mal, um die fliegende Untertasse im Flug zu wechseln.",
+["Hoorah! You are a champion!"]="Hurra! Du bist ein Champion!",
+["You completed the mission in "]="Du hast die Mission fertiggestellt in ",
+["You have used "]="Du hast benutzt ",
+["You had "]="Du hattest ",
+["In the Ice Planet flying saucer stadium..."]="Im Stadion der fliegenden Untertassen auf dem Eisplaneten …",
+["This is the Olympic stadium of saucer flying..."]="Das ist das olympische Stadion des Untertassenflugs.",
+["All the saucer pilots dream to come here one day in order to compete with the best!"]="Alle Untertassenpiloten träumen davon, hier eines Tages herzukommen, um gegen die Besten um die Wette zu fliegen!",
+["Now you have the chance to try and claim the place that you deserve among the best..."]="Jetzt hast du die Gelegenheit, es selbst zu versuchen, und dir einen Rang unter den Besten zu verdienen.",
+["Use the saucer and pass through the rings..."]="Benutze die Untertasse und passiere die Ringe.",
+["Pause the game by pressing the pause key (default \"P\") for more details"]="Pausiere das Spiel, indem du die Pausetaste (standardmäßig »P«) drückst, um mehr zu erfahren.",
+["... can you do it?"]="Kannst du es schaffen?",
+["Got 1 more saucer"]="1 neue Untertasse",
+[" and 8 more seconds added to the clock"]=" und 8 Bonussekunden auf die Uhr",
+["6 more seconds added to the clock"]="6 Bonussekunden auf die Uhr",
+["Oh man! Learn how to fly!"]="Oh, Mann! Lern erstmal fliegen!",
+["Every 2 rings you'll get extra flying saucers"]="Alle 2 Ringe erhälst du neue fliegende Untertassen",
+["Use space button twice to change flying saucer while being on air"]="Drücke die Leertaste 2 mal, um die fliegende Untertasse im Flug zu wechseln",
+["The first stop"]="Der erste Halt",
+["Go to the upper platform and get the weapons in the crates!"]="Geh zur oberen Plattform und nimm dir die Waffen in den Kisten!",
+["Go down and save these PAotH hogs!"]="Geh runter und rette diese PAdI-Igel!",
+["Prepare to fight"]="Bereitmachen zum Kämpfen",
+["Neutralize your enemies and be careful!"]="Neutralisiere deine Gegner und sei vorsichtig!",
+["The fight begins!"]="Die Schlacht beginnt!",
+["Joe"]="Sepp",
+["Bruce"]="Brutus",
+["Helena"]="Helena",
+["Boris"]="Boris",
+["Prof. Hogevil"]="Prof. Bösigel",
+["Minion"]="Lakai",
+["Minions"]="Lakaien",
+["Hog Solo has to refuel his saucer."]="Igel Einsam muss seine Untertasse auftanken.",
+["Rescue the imprisoned PAotH team and get the fuel!"]="Rette das gefangene PAdI-Team und hol dir den Treibstoff!",
+["You have to get the weapons and rescue the PAotH researchers"]="Wir müssen die Waffen besorgen und die PAdI-Forscher retten.",
+["Don't hit me you fools!"]="Trefft mich nicht, ihr Idioten!",
+["The boss has fallen! Retreat!"]="Der Anführer ist gefallen! Rückzug!",
+["Congrats! You made them run away!"]="Gratulation! Du hast sie in die Flucht geschlagen!",
+["Hog Solo wins, congratulations!"]="Igel Einsam gewinnt, Gratulation!",
+["Eliminated the Professor Hogevil"]="Professor Bösigel eliminiert",
+["Drove the minions away"]="Seine Lakaien vertrieben",
+["I may lost this battle, but I haven't lost the war yet!"]="Ich mag vielleicht diese Schlacht verloren haben, aber ich habe den Krieg noch nicht verloren!",
+["Congrats! You won!"]="Gratulation! Du hast gewonnen!",
+["Eliminated the evil minions"]="Die bösen Lakaien eliminiert",
+["Drove the Professor away"]="Den Professor vertrieben",
+["Near PAotH base at moon..."]="In der Nähe der PAdI-Basis am Mond …",
+["Hey Hog Solo! Finally you have come..."]="Hey, Igel Einsam! Endlich bist du angekommen …",
+["It seems that Professor Hogevil has prepared for your arrival!"]="Es scheint, dass sich Professor Bösigel sich auf deine Ankunft vorbereitet hat!",
+["He has captured the rest of the PAotH team and awaits to capture you!"]="Er hat den Rest des PAdI-Teams gefangen und wartet auf deine Gefangennahme!",
+["We have to hurry! Are you armed?"]="Wir müssen uns beeilen! Bist du bewaffnet?",
+["No, I am afraid I had to travel light"]="Nein, ich fürchte, dass ich mit wenig Gepäck reisen musste.",
+["Ok, then you have to go and take some of the weapons we have hidden in case of an emergency!"]="Okay, dann musst du gehen und ein paar der Waffen, die wir für den Notfall versteckt haben, nehmen.",
+["They are up there! Take this rope and hurry!"]="Sie sind da oben! Nimm dieses Seil und beeil dich!",
+["Ehm... ok..."]="Aha, okay …",
+["I've made it! YEAAAAAH!"]="Ich hab's geschafft! HURRA!",
+["Nice! Now hurry and get down! You have to rescue my friends!"]="Nett! Nun beeil dich und komm runter! Du musst meine Freunde retten!",
+["Get ready to fight!"]="Bereitmachen zum Kämpfen!",
+["Look boss! There is the target!"]="Sieh, Boss! Hier ist das Ziel!",
+["Prepare for battle!"]="Bereitmachen zum Kämpfen!",
+["Oops, I've been spotted and I have no weapons! I am doomed!"]="Upps! Ich wurde entdeckt und ich habe keine Waffen! Ich bin verloren!",
+["Here we go!"]="Auf geht's!",
+["Chasing the blue hog"]="Jag' den blauen Igel",
+["Use the rope in order to catch the blue hedgehog"]="Benutze das Seil, um den blauen Igel zu fangen.",
+["You have to stand very close to him"]="Du musst sehr nahe an ihm stehen.",
+["Crazy Runner"]="Verrückter Renner",
+["On the other side of the moon..."]="Auf der anderen Seite des Mondes …",
+["So you are interested in Professor Hogevil"]="Also bist du in Professor Bösigel interessiert.",
+["We'll play a game first"]="Wir spielen zuerst ein Spiel.",
+["I'll let you know whatever I know about him if you manage to catch me 3 times"]="Ich lass dich wissen, was ich über ihn weiß, wenn du es schaffst, mich 3 mal zu fangen.",
+["Let's go!"]="Los geht's!",
+["The truth about Professor Hogevil"]="Die Wahrheit über Professor Bösigel",
+["Amazing! I was never beaten in a race before!"]="Großartig! Ich wurde zuvor noch nie in einem Wettlauf geschlagen!",
+["So, let me tell you what I know about Professor Hogevil..."]="Also, lass mich erzählen, was ich über Professor Bösigel weiß.",
+["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time"]="Professor Bösigel, früher bekannt als Jakobus Iglus, arbeitete in meiner Zeit für PAdI.",
+["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device"]="Er war der Laborassistent von Dr. Gutigeln, dem Erfinder des Antischwerkraftgeräts.",
+["During the final testing of the device an accident happened"]="Während des letzten Tests des Gerätes ist ein Unfall passiert.",
+["In this accident Professor Hogevil lost all his spines on his head!"]="Bei diesem Unfall hat Professor Bösigel all seine Stacheln auf seinem Kopf verloren!",
+["That's why he always wears a hat since then"]="Deshalb trägt er seit dem immer einen Hut.",
+["After that incident he went underground and started working on his plan to steal the device"]="Nach dem Unfall ging er in den Untergrund und arbeitete an seinem Plan, um das Gerät zu stehlen.",
+["He is a very tough and very determined hedgehog. I would be extremely careful if I were you"]="Er ist ein sehr starker und willensstarker Igel. An deiner Stelle wäre ich sehr vorsichtig.",
+["I should go now, goodbye!"]="Ich sollte jetzt gehen. Tschüss!",
+["Go get him again"]="Los, hol ihn dir wieder!",
+["You got me"]="Du hast mich.",
+["Too slow! Try again..."]="Zu langsam! Versuch es nochmal.",
+["You have to catch the other hog 3 times"]="Du musst den anderen Igel 3 mal fangen.",
+["The time that you have left when you reach the blue hedgehog will be added to the next turn"]="Deine Verbleibende Zeit wird zu deinem nächsten Zug addiert, sobald du den blauen Igel erreichst.",
+["Each turn you'll have only one rope to use"]="In jedem Zug kannst du nur ein Seil benutzen.",
+["You'll lose if you die or if your time is up"]="Du verlierst, wenn du stirbst oder deine Zeit abläuft.",
+["Congratulations, you are the fastest!"]="Gratulation, du bist der Schnellste!",
+["You have managed to catch the blue hedgehog in time"]="Du hast es geschafft, den blauen Igel rechtzeitig zu fangen.",
+["'Zooka Team"]="Die Knalltüten",
+["Hunter"]="Jäger",
+["Aiming Practice"]="Zielübung",
+["Bazooka Training"]="Bazooka-Training",
+["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."]="Eliminiere alle Ziele, bevor die Zeit ausläuft.|Du hast in dieser Mission unbegrenzte Munition.",
+["Oh no! Time's up! Just try again."]="Oh nein! Die Zeit ist um! Versuche es nochmal.",
+["Aiming practice"]="Zielübung",
+["Oh no! You failed! Just try again."]="Oh nein! Du hast versagt! Versuch es nochmal.",
+["hits"]="Treffer",
+["You have destroyed %d of %d targets."]="Du hast %d von %d Zielen zerstört.",
+["You have launched %d bazookas."]="Du hast %d Bazookas abgefeuert.",
+["Your accuracy was %.1f%%."]="Deine Treffgenauigkeit betrug %.1f%%.",
+["%.1f seconds were remaining."]="Es verblieben %.1f.",
+["Congratulations! You've eliminated all targets|within the allowed time frame."]="Gratulation! Du hast alle Ziele innerhalb der|verfügbaren Zeit ausgeschaltet.",
+["Grenadiers"]="Grenadiere",
+["Nade Boy"]="Granatenjunge",
+["Grenade Training"]="Granatentraining",
+["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"]="Nun finde das nächste Ziel! |Tipp: Normalerweise verlierst du Gesundheit, wenn du herunterfällst, also pass auf!",
+["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"]="Du wirst ziemlich gut! |Tipp: Wenn du dein Seil verkürzt, bewegst du dich schneller! |Und wenn du es verlängerst, wirst du langsamer.",
+["The next one is pretty hard! |Tip: You have to do multiple swings!"]="Die Nächste ist ziemlich schwer! |Tipp: Du musst mehrmals schwingen!",
+["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"]="Ich weiß nicht, wie du das getan hast. Aber gute Arbeit! |Die Nächste solle idiotensicher für dich sein!",
+["Congratulations"]="Gratulation",
+["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"]="Gratulation! Du hast die Seil-Einführung abgeschlossen! |- Die Einführung wird in 10 Sekunden beendet.",
+["Achievement Unlocked"]="Neue Errungenschaft",
+["Rope Master!"]="Seilmeister!",
+["Rope Training"]="Seiltraining",
+["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"]="Gute Arbeit! Nun triff es mit deinem Baseballschläger! |Tipp: Du kannst die Waffe mit [Rechtsklick] wechseln!",
+["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"]="Denk dran: Das Seil verbiegt sich nur um Objekte, |wenn es nichts trifft, wird es immer gerade sein.",
+["Rope Team"]="Seilteam",
+["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"]="Gelange zum Ziel mit deinem Seil! |Steuerung: Links/Rechts zum Schwingen – Hoch/Runter zum Ein- und Ausfahren!",
+["Tip: The rope physics are different than in the real world, |use it to your advantage!"]="Tipp: Die Seilphysik ist anders als in der realen Welt, |nutze das zu deinem Vorteil aus!",
+["You did not make it in time, try again!"]="Du hast es nicht rechtzeitig geschafft, versuch es nochmal!",
+["You have been respawned, at your last checkpoint!"]="Du wurdest zum letzten Kontrollpunkt zurückgesetzt!",
+["You have been respawned, be more carefull next time!"]="Du wurdest wiederbelebt, sei beim nächsten Mal vorsichtiger!",
+["Sniperz"]="Heckenschützen",
+["Sniper Training"]="Scharfschützen-Training",
+["Time's up!"]="Die Zeit ist um!",
+["Good so far!"]="Gut soweit!",
+["Keep it up!"]="Weiter so!",
+["This one's tricky."]="Der hier ist knifflig.",
+["Well done."]="Gut gemacht.",
+["Demolition is fun!"]="Zerstörung macht Spaß!",
+["Will this ever end?"]="Wird dies je enden?",
+["Last Target!"]="Letzte Zielscheibe!",
+["You have successfully finished the sniper rifle training!"]="Du hast das Scharfschützentraining abgeschlossen!",
+["You have destroyed %d of %d targets (+%d points)."]="Du hast %d von %d Zielen zerstört (+%d Punkte).",
+["You have made %d shots."]="Du hast %d Schüsse abgegeben.",
+["Accuracy bonus: +%d points"]="Präzisions-Bonus: +%d Punkte",
+["You had %.2fs remaining on the clock (+%d points)."]="Verbleibende Zeit: %.2fs (+%d Punkte).",
+["Shoppa Love"]="Seilliebe",
+["Team of Hearts"]="Team der Herzen",
+["Heartful"]="Herzlich",
+["Ropes and Crates"]="Seile und Kisten",
+["Shoppa Union"]="Konsumentenunion",
+["Hook"]="Haken",
+["The Customor is King"]="Der Kunde ist König",
+["King Customer"]="König Kunde",
+["Lonely Hog"]="Einsamer Igel",
+["Climber"]="Kletterer",
+["Zook"]="Zook",
+["Team Zook"]="Team Zook",
+["Private Nolak"]="Gefreiter Nolak",
+["The Hogies"]="Die Igelinge",
+["You have thrown %d cluster bombs."]="Du hast %d Splitterbomben geworfen.",
+["Grenadier"]="Grenadier",
+["Grenade Group"]="Granatengruppe",
+["You have thrown %d grenades."]="Du hast %d Granaten geworfen.",
+["You have launched %d homing bees."]="Du hast %d zielsuchende Bienen abgefeuert.",
+["Pathetic Resistance"]="Erbärmlicher Widerstand",
+["Cybernetic Empire"]="Kybernetisches Imperium",
+["Unit 835"]="Einheit 835",
+["Bamboo Thicket"]="Bambusdickicht",
+["Eliminate the enemy before the time runs out"]="Vernichte den Feind, bevor die Zeit abgelaufen ist",
+["User Challenge"]="Benutzerherausforderung",
+["Congratulations!"]="Gratulation!",
+["MISSION SUCCESSFUL"]="MISSION ERFOLGREICH",
+["Energetic Engineer"]="Energetischer Ingenieur",
+["MISSION FAILED"]="MISSION GESCHEITERT",
+["Oh no! Just try again!"]="Oh nein! Versuch's nochmal!",
+["Bloody Rookies"]="Blutige Anfänger",
+["Instructor"]="Ausbilder",
+["Blue Team"]="Blaues Team",
+["Filthy Blue"]="Blödblau",
+["Dangerous Ducklings"]="Gefährliche Entchen",
+["Eliminate the Blue Team"]="Lösche das Blaue Team aus",
+["Listen up, maggot!!"]="Aufgepasst, du Made!!",
+["!!!"]="!!!",
+["The enemy is hiding out on yonder ducky!"]="Der Feind versteckt sich auf dem Entlein dort drüben!",
+["Get on over there and take him out!"]="Mach, dass du hinüber kommst und schalte ihn aus!",
+["GO! GO! GO!"]="Los, los, los!",
+["DAMMIT, ROOKIE!"]="VERDAMMT, REKRUT!",
+["DAMMIT, ROOKIE! GET OFF MY HEAD!"]="VERDAMMT, REKRUT! RUNTER VON MEINEM KOPF!",
+[":("]=":(",
+["You've failed. Try again."]="Du bist gescheitert. Versuche es nochmal.",
+["See ya!"]="Mach's gut!",
+["Naughty Ninja"]="Böser Ninja",
+["Enjoy the swim..."]="Viel Spaß beim Schwimmen …",
+["Toxic Team"]="Giftige Gegner",
+["Poison"]="Gift",
+["Eliminate Poison before the time runs out"]="Neutralisiere das Gift, bevor die Zeit abgelaufen ist.",
+["Operation Diver"]="Taucher",
+["sec"]="s",
+["|- Mines Time:"]="|- Minenzündzeit:",
+["Unit"]="Einheit",
+["Newton's Hammock"]="Newtons Hängematte",
+["Nameless Heroes"]="Namenlose Helden",
+["Drowner"]="Absäufer",
+["Clowns"]="Clowns",
+["Nobody Laugh"]="Niemand darf lachen",
+["Wannabe Flyboys"]="Möchtegernflieger",
+["Ace"]="Ass",
+["RC PLANE TRAINING"]="FUNKFLUGZEUGSTRAINING",
+["a Hedgewars challenge"]="eine Hedgewars-Herausforderung",
+["Collect or destroy all the health crates."]="Sammle oder zerstöre alle Gesundheitskisten.",
+["Compete to use as few planes as possible!"]="Verwende so wenige Flugzeuge wie möglich!",
+["Planes used: %d"]="Verwendete Flugzeuge: %d",
+["Crates left: %d"]="Verbleibende Kisten: %d",
+["Destroyer of planes"]="Flugzeug-Zerstörer",
+["Hopeless case"]="Hoffnungsloser Fall",
+["Drunk greenhorn"]="Betrunkener Grünschnabel",
+["Greenhorn"]="Grünschnabel",
+["Beginner"]="Anfänger",
+["Experienced beginner"]="Erfahrener Anfänger",
+["Below-average pilot"]="Unterdurchschnittlicher Pilot",
+["Average pilot"]="Durchschnittlicher Pilot",
+["Above-average pilot"]="Überdurchschnittlicher Pilot",
+["Professional pilot"]="Profipilot",
+["Professional stunt pilot"]="Profi-Stuntpilot",
+["Elite pilot"]="Elitepilot",
+["Upper-class elite pilot"]="Elitepilot der Oberklasse",
+["Top-class elite pilot"]="Elitepilot der Spitzenklasse",
+["Cheater"]="Cheater",
+["Rank: %s"]="Rang: %s",
+["Your rank: %s"]="Dein Rang: %s",
+["Flawless victory!"]="Perfekter Sieg!",
+["You have perfectly beaten the challenge!"]="Du hast die Herausforderung gemeistert!",
+["You have used only 1 RC plane. Outstanding!"]="Du hast nur ein Funkflugzeug gebraucht. Ausgezeichnet!",
+["You have finished the challenge!"]="Du hast die Herausforderung gemeistert!",
+["You have used %d RC planes."]="Du hast %d Funkflugzeuge benutzt.",
+["You have dropped %d missiles."]="Du hast %d Bomben abgeworfen.",
+["In your best (and only) flight you took out %d crates with one RC plane!"]="In deinem besten (und einzigem) Flug hast du %d Kisten mit einem Funkflugzeug zerstört!",
+["In your best flight you took out %d crates with one RC plane."]="In deinem besten Flug hast du %d Kisten mit einem Funkflugzeug zerstört.",
+["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"]="Das war eine großartige Vorstellung! Aber diese Herausforderung kann sogar mit nur einem Funkflugzeug gemeistert werden. Kannst du herausfinden, wie?",
+["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."]="Gratulation! Du hast diese Herausforderung wahrhaft gemeistert! Vergiss nicht, die Wiederholung zu speichern.",
+["Prestigious Pilot"]="Prestigeträchtiger Pilot",
+["You have gained an achievement: %s"]="Du hast eine Errungenschaft erhalten: %s",
+["CHALLENGE COMPLETE"]="HERAUSFORDERUNG ABGESCHLOSSEN",
+["Wannabe Shoppsta"]="Möchtegernkäufer",
+["Unsuspecting Louts"]="Nichtsahnende Lümmel",
+["Unlucky Sods"]="Arme Schweine",
+["ROPE-KNOCKING"]="SEILSCHUBSEN",
+["COMPLETION TIME"]="ZEIT",
+["MISSION SUCCESS"]="MISSIONSERFOLG",
+["Use the rope to knock your enemies to their doom."]="Benutze das Seil, um deine Gegner in ihr Verderben zu stürzen!",
+["GG!"]="Gut gemacht!",
+["Ouch!"]="Autsch!",
+["Eliminate all enemies"]="Vernichte alle Gegner",
+["Spooky Tree"]="Spukiger Baum",
+["Good birdy......"]="Braver Vogel …",
+["Feeble Resistance"]="Kraftloser Widerstand",
+["Pathetic Hog #%d"]="Erbärmlicher Igel #%d",
+["Unit 3378"]="Einheit 3378",
+["- Eliminate Unit 3378 |- Feeble Resistance must survive"]="- Vernichte Einheit 3378 |- Kraftloser Widerstand muss überleben",
+["Codename: Teamwork"]="Code-Name: Teamwork",
+["T_T"]="T_T",
+["Hmmm..."]="Hmmm …",
+["Good luck out there!"]="Viel Glück da draußen!",
+["Challenge"]="Herausforderung",
+["Save as many hapless hogs as possible!"]="Rette so viele glücklose Igel wie möglich!",
+["That Sinking Feeling"]="Land unter",
+["Hapless Hogs"]="Glücklose Igel",
+["Sinky"]="Blubb",
+["Heavy"]="Schwierig",
+["Clumsy"]="Hoppla",
+["Silly"]="Doofi",
+["Careless"]="Achtlos",
+["Sponge"]="Schwamm",
+["Deadweight"]="Gravitus",
+["The Nameless One"]="Der Namenlose",
+["Press [Precise] to skip intro"]="Drücke [Genaues Zielen], um das Intro zu überspringen",
+["This rain is really something..."]="Das nenne ich mal einen Regenschauer...",
+["Heh, it's not that bad."]="Hehe, so schlimm ist es nicht.",
+["You'd almost swear the water was rising!"]="Man könnte fast schwören das Wasser würde steigen!",
+["Haha, now THAT would be something!"]="Haha, na DAS wär ja was!",
+["Hahahaha!"]="Hahahaha!",
+["It's a good thing SUDDEN DEATH is 99 turns away..."]="Gut, dass SUDDEN DEATH in 99 Runden ist …",
+["Challenge completed!"]="Herausforderung bewältigt!",
+["You saved %d of 8 Hapless Hogs."]="Du hast %d von 8 Glücklosen Igeln gerettet.",
+["Achievement obtained: Lively Lifeguard"]="Errungenschaft erhalten: Lebhafter Lebensretter",
+["You have obtained an achievement: Lively Lifeguard"]="Du hast eine Errungenschaft erhalten: Lebhafter Lebensretter",
+["%d Hapless Hogs left"]="%d Glücklose Igel verbleibend",
+["Disqualified!"]="Disqualifiziert!",
+["Your hedgehog died!"]="Dein Igel ist gestorben!",
+["You must survive the flood in order to score."]="Du musst das Hochwasser überleben um zu punkten.",
+["You haven't rescued anyone."]="Du hast niemanden gerettet.",
+["Hero Team"]="Heldenteam",
+["Good Dude"]="Guter Junge",
+["Bad Team"]="Böses Team",
+["Elimate your captor."]="Eliminiere deinen",
+["Get out of there!"]="Geh weg!",
+["The Great Escape"]="Gesprengte Ketten",
+["Portal mission"]="Portalmission",
+["training"]="Training",
+["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."]="Hmmm, ich muss einen Weg finden, um ihn von dieser Antiportaloberfläche zu schubsen …",
+["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..."]="Die Antiportalzone ist über den ganzen Boden und ich habe nichts, um ihn zu töten. Vielleicht könnte ich ihn genug verletzen, wenn ich etwas fallenlasse.",
+["You can't fire a portal on the blue surface"]="Du kannst kein Portal auf der blauen Fläche öffnen.",
+[" What !! For all of this struggle i just win some ... TIME o0"]="Was?! Für all die Mühen gewinne ich nur etwas … ZEIT?",
["Each turn you get 1-3 random weapons"]="Du bekommst jede Runde 1-3 zufällig gewählte Waffen",
+["Game Started!"]="Spiel gestartet!",
+["CAPTURE THE FLAG"]="SCHNAPP DIR DIE FLAGGE",
+["Flags, and their home base will be placed where each team ends their first turn."]="Fahnen und deren Heimatstandort werden dort plaziert, wo jedes Team deren ersten Zug beendet.",
+["RULES OF THE GAME [Press ESC to view]"]="SPIELREGELN (Drücke [Esc] zum Anzeigen)",
+["Reflector Shield"]="Reflektorschild",
+["Bio-Filter"]="Biofilter",
+["Healing Station"]="Heilstation",
+["Respawner"]="Wiederbeleber",
+["Teleportation Node"]="Teleportationsstation",
+["Core"]="Kern",
+["Generator"]="Generator",
+["Support Station"]="Waffenstation",
+["Construction Station"]="Baustation",
+["Weapon Filter"]="Waffenfilter",
+["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."]="Teleportation fehlgeschlagen. Bitte teleportiere nur innerhalb des Einzugsgebiets deiner Klanteleporter.",
+["Teleportation Mode"]="Teleportationsmodus",
+["Girder Placement Mode"]="Trägerplatzierungsmodus",
+["Rubber Placement Mode"]="Gummiplatzierungsmodus",
+["Mine Placement Mode"]="Minenplatzierungsmodus",
+["Sticky Mine Placement Mode"]="Haftminenplatzierungsmodus",
+["Barrel Placement Mode"]="Pulverfassplatzierungsmodus",
+["Health Crate Placement Mode"]="Gesundheitskistenplatzierungsmodus",
+["Weapon Crate Placement Mode"]="Waffenkistenplatzierungsmodus",
+["Utility Crate Placement Mode"]="Werkzeugkistenplatzierungsmodus",
+["Structure Placement Mode"]="Gebäudeplatzierungsmodus",
+["Structure Placement Tool"]="Gebäudeplatzierungswerkzeug",
+["Object Placement Tool"]="Objektplatzierungswerkzeug",
+["Crate Placement Tool"]="Kistenplatzierungswerkzeug",
+["Drill Rocket"]="Bohrkopfrakete",
+["Mudball"]="Schlammball",
+["Cluster Bomb"]="Splittergranate",
+["Molotov Cocktail"]="Molotowcocktail",
+["Watermelon Bomb"]="Wassermelonenbombe",
+["Hellish Handgrenade"]="Höllische Handgranate",
+["Limburger"]="Limburger",
+["Shotgun"]="Schrotflinte",
+["Flamethrower"]="Flammenwerfer",
+["Sniper Rifle"]="Scharfschützengewehr",
+["Freezer"]="Eiskanone",
+["Land Sprayer"]="Landkanone",
+["Whip"]="Peitsche",
+["Baseball Bat"]="Baseballschläger",
+["Seduction"]="Verführung",
+["Hammer"]="Hammer",
+["Mine"]="Mine",
+["Dynamite"]="Dynamit",
+["Cake"]="Kuchen",
+["Ballgun"]="Ballkanone",
+["Sticky Mine"]="Haftmine",
+["Cleaver"]="Hackebeil",
+["Birdy"]="Vogli",
+["Blowtorch"]="Schweißbrenner",
+["Pickhammer"]="Presslufthammer",
+["Personal Portal Device"]="Portalgerät",
+["Rope"]="Seil",
+["Parachute"]="Fallschirm",
+["Flying Saucer"]="Fliegende Untertasse",
+["Invulnerable"]="Unverwundbar",
+["Laser Sight"]="Laservisier",
+["Vampirism"]="Vampirismus",
+["Low Gravity"]="Niedrige Schwerkraft",
+["Extra Damage"]="Extraschaden",
+["Extra Time"]="Zusatzzeit",
+["You may only use 1 Extra Time per turn."]="Du darfst pro Zug nur einmal Zusatzzeit benutzen.",
+["You may only spawn 5 crates per turn."]="Du darfst pro Zug nur 5 Kisten platizeren.",
+["Invalid Placement"]="Ungültige Position",
+["Insufficient Power"]="Unzureichende Energie",
+["The Great Hog in the sky sees your sadness and grants you a boon."]="Der Große Igel im Himmel sieht deine Traurigkeit und leistet dir eine Gabe.",
+["Cost"]="Kosten",
+["CONSTRUCTION MODE"]="BAUMODUS",
+["a Hedgewars mini-game"]="ein Hedgewars Mini-Spiel",
+["Build a fortress and destroy your enemy."]="Baue ein Fort und zerstöre deinen Feind.",
+["There are a variety of structures available to aid you."]="Es gibt verschiedene Gebäude, um dich zu unterstützen.",
+["Use the air-attack weapons and the arrow keys to select structures."]="Benutze die Luftangriffswaffen und die Pfeiltasten, um Gebäude auszuwählen.",
+["Grants nearby hogs life-regeneration."]="Spendet nahen Igeln Lebensenergie.",
+["Aggressively removes enemy hedgehogs."]="Entfernt feindliche Igel aggressiv.",
+["Dematerializes weapons and equipment carried by enemy hedgehogs."]="Demateralisiert Waffen und Equipment, das von feindlichen Igeln getragen wird.",
+["Reflects enemy projectiles."]="Stößt feindliche Projektile ab.",
+["Generates power."]="Erzeugt Energie.",
+["Resurrects dead hedgehogs."]="Belebt tote Igel wieder.",
+["Allows free teleportation between other nodes."]="Ermöglicht kostenlose Teleportationen zwischen anderen Stationen.",
+["Teleporation Node"]="Teleporterstation",
+["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."]="Ermöglicht die Platzierung von Trägern, Gummibändern, Minen, Haftminen und Pulverfässern.",
+["Allows the placement of weapons, utiliites, and health crates."]="Ermöglicht die Platzierung von Waffen-, Werkzeug- und Gesundheitskisten",
+["Note: Some weapons have a second option (See continent information). Find and use them with the \""]="Beachte: Einige Waffen haben eine Zweitoption (Siehe Kontinentinformationen). Finde und benutze sie mit \"",
["Per team weapons"]="Waffen pro Team",
-["weaponschemes"]="Waffenschemata",
-["Unique new weapons"]="Einzigartige neue Waffen",
["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."]="Wähle deinen Kontinent/Waffensatz mit den [Hoch]- oder [Runter]-Tasten. Du kannst ihn auch mit dem Waffenmenü auswählen.",
-["Note: Some weapons have a second option (See continent information). Find and use them with the \""]="Beachte: Einige Waffen haben eine Zweitoption (Siehe Kontinentinformationen). Finde und benutze sie mit \"",
+["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."]="Tipp: Benutze die [Esc]-Taste (dieses Menü), wenn du den Kontinent des aktuellen Teams sehen willst, oder die Besonderheiten dieses Kontinents sehen willst.",
+["Unique new weapons"]="Einzigartige neue Waffen",
+["key."]="Taste.",
["switch"]="Schalter",
-["key."]="Taste.",
-["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."]="Tipp: Benutze die [Esc]-Taste (dieses Menü), wenn du den Kontinent des aktuellen Teams sehen willst, oder die Besonderheiten dieses Kontinents sehen willst.",
+["weaponschemes"]="Waffenschemata",
["Green lipstick bullet: [Poisonous, deals no damage]"]="Grüne Lippenstiftpatrone: (giftig, kein Schaden)",
["Cluck-cluck time: [Fire an egg ~ Sabotages and cures poison ~ Cannot be fired close to another hog]"]="Gackerzeit: (Schieß ein Ei – Sabotiert und kuriert Gift – kann nicht in der nähe anderer Igel gefeuert werden)",
["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"]="Anno 1032: (Die Explosion wird stark schubsen – Große Reichweite, betrifft Igel in der Nähe des Ziels nicht)",
@@ -1385,39 +1462,33 @@
["Eagle Eye: [Blink to the impact ~ One shot]"]="Adlerauge: (Teleportiere dich zum Einschlagspunkt – ein Schuss)",
["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"]="Medizin: (Feuere eine explodierende Medizin, die alle Igel im Explosionsradius heilen wird)",
["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"]="Sabotage/Fackel: (Sabotiere alle Igel im Kreis und richte ca. 1 Schaden an, ODER feuer eine Splittergranate in die Luft)",
-["North America"]="Nordamerika",
+["- You can switch between hogs at the start of your turns. (Not first one)"]="- Du kannst deinen Igel am Zugbeginn aussuchen (aber nicht am 1. Zug).",
+["Area"]="Gebiet",
["Difficulty: "]="Schwierigkeitsgrad: ",
["EASY"]="EINFACH",
-["Area"]="Gebiet",
+["North America"]="Nordamerika",
["Population"]="Einwohnerzahl",
-["- You can switch between hogs at the start of your turns. (Not first one)"]="- Du kannst deinen Igel am Zugbeginn aussuchen (aber nicht am 1. Zug).",
["Special Weapons:"]="Sonderwaffen:",
-["Shotgun"]="Schrotflinte",
-["Sniper Rifle"]="Scharfschützengewehr",
+["GasBomb"]="Gasbombe",
+["MEDIUM"]="MITTEL",
["South America"]="Südamerika",
-["MEDIUM"]="MITTEL",
-["GasBomb"]="Gasbombe",
["Europe"]="Europa",
["Molotov"]="Molotowcocktail",
["Africa"]="Afrika",
-["Seduction"]="Verführung",
-["Sticky Mine"]="Haftmine",
+["- Will give you a parachute every second turn."]="- Wird dir jeden 2. Zug einen Fallschirm geben",
["Asia"]="Asien",
-["- Will give you a parachute every second turn."]="- Wird dir jeden 2. Zug einen Fallschirm geben",
-["Parachute"]="Fallschirm",
["Australia"]="Australien",
["Baseballbat"]="Baseballschläger",
+["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."]="Antarktischer Sommer: – Wird dir einen Träger/Schlammball und zwei Sinuskanonen/Portalgeräte jeden 4. Zug geben",
["Antarctica"]="Antarktika",
["HARD"]="SCHWER",
-["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."]="Antarktischer Sommer: – Wird dir einen Träger/Schlammball und zwei Sinuskanonen/Portalgeräte jeden 4. Zug geben",
+["Duration"]="Dauer",
["Kerguelen"]="Kerguelen",
-["Hammer"]="Hammer",
-["Duration"]="Dauer",
+["- Massive weapon bonus on first turn"]="- Großer Waffenbonus am ersten Zug",
+["- Will Get 1-3 random weapons"]="- wird 1–3 zufällige Waffen erhalten",
["Zealandia"]="Neuseeland-Kontinent",
-["- Will Get 1-3 random weapons"]="- wird 1–3 zufällige Waffen erhalten",
-["- Massive weapon bonus on first turn"]="- Großer Waffenbonus am ersten Zug",
+["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"]="- Du wirst 2–4 Waffen für jeden Abschuss erhalten (sogar für eigene Igel)!",
["Sundaland"]="Sunda",
-["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"]="- Du wirst 2–4 Waffen für jeden Abschuss erhalten (sogar für eigene Igel)!",
["General information"]="Allgemeine Informationen",
[" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"]=" wurde vom Schema extahiert|– Dieser Kontinent wird alle Besonderheiten von den anderen Kontinenten benutzen können!",
["Continental supplies"]="Kontinentallieferungen",
@@ -1427,28 +1498,15 @@
["You are sabotaged, RUN!"]="Du wurdest sabotiert, LAUF!",
["WARNING: Sabotage detected!"]="WARNUNG: Sabotage erkannt!",
["Hogs in sight!"]="Igel in Sicht!",
-["Way-Points Remaining"]="Wegpunkte verbleibend",
-["s"]="s",
-["RACER"]="WETTRENNEN",
-["TRACK COMPLETED"]="STRECKENLAUF BEENDET",
-["NEW RACE RECORD: "]="NEUER RENNREKORD: ",
-["WINNING TIME: "]="BESTZEIT: ",
-["NEW CLAN RECORD: "]="NEUER KLAN-REKORD",
-["TIME: "]="ZEIT: ",
-["s|"]="s|",
-["STATUS UPDATE"]="STATUSAKTUALISIERUNG",
-["Rounds Complete: "]="Runden gespielt: ",
-["Best Team Times: "]="Beste Team-Zeiten: ",
-["a Hedgewars mini-game"]="ein Hedgewars Mini-Spiel",
-["Build a track and race."]="Konstruiere eine Strecke und mach ein Wettrennen.",
-["Round Limit:"]="Rundenbegrenzung:",
-["You can further customize the race by changing the scheme script paramater."]="Du kannst das Renner ferner bearbeiten, indem du den Skriptparameter im Schema änderst.",
-["GAME BEGUN!!!"]="SPIEL GESTARTET!!!",
-["Complete the track as fast as you can!"]="Durchlaufe die Strecke so schnell du kannst!",
-["Please place the way-point in the open, within the map boundaries."]="Bitte platziere den Wegpunkt in der Luft, innerhalb der Kartengrenzen.",
-["Please place the way-point further from the waterline."]="Bitte platziere den Wegpunkt weiter weg vom Wasser.",
-["Race complexity limit reached."]="Rennkomplexitätslimit erreicht.",
-["Good to go!"]="Startklar!",
+["RULES"]="REGELN",
+["Each turn is only ONE SECOND!"]="Jeder Zug dauert nur EINE SEKUNDE!",
+["Use your ready time to think."]="Benutze deine Vorbereitungszeit zum Denken.",
+["Slot keys save time! (F1-F10 by default)"]="Schnelltasten, um Zeit zu sparen! (standardmäßig F1–F10)",
+["SLOTS"]="SLOTS",
+["Slot"]="Slot",
+["Teleport"]="Teleporter",
+["FRENZY"]="WAHNSINN",
+["a frenetic Hedgewars mini-game"]="ein hektisches Hedgewars-Minispiel",
["random in range from %i%% to %i%% with period of %i msec"]="Zufällig von %i%% bis %i%% mit einer Periode von %i ms",
["changing range from %i%% to %i%% with period of %i msec"]="Sich verändernde Grenzen von %i%% bis %i%% mit einer Periode von %i ms",
["Gravity"]="Schwerkraft",
@@ -1456,19 +1514,151 @@
["Setup:|'g=150', where 150 is 150% of normal gravity"]="Syntax:|»g=150«, wobei »150« für 150% der normalen Schwerkraft steht.",
["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"]="Oder »g=50, g2=150, period=4000« für eine Schwerkraft,|die von 50 bis 150 vor und zurück mit einer Periode von 4000 ms oszilliert.",
["Set period to negative value for random gravity"]="Setze period auf einen negativen Werd für eine zufällige Schwerkraft",
-["RULES"]="REGELN",
-["Each turn is only ONE SECOND!"]="Jeder Zug dauert nur EINE SEKUNDE!",
-["Use your ready time to think."]="Benutze deine Vorbereitungszeit zum Denken.",
-["Slot keys save time! (F1-F10 by default)"]="Schnelltasten, um Zeit zu sparen! (standardmäßig F1–F10)",
-["SLOTS"]="SLOTS",
-["Slot"]="Slot",
-["Mine"]="Mine",
-["Teleport"]="Teleporter",
-["Blowtorch"]="Schweißbrenner",
-["Flying Saucer"]="Fliegende Untertasse",
-["Low Gravity"]="Niedrige Schwerkraft",
-["FRENZY"]="WAHNSINN",
-["a frenetic Hedgewars mini-game"]="ein hektisches Hedgewars-Minispiel",
+["Homing Bee"]="Zielsuchende Biene",
+["SineGun"]="Sinuskanone",
+["Land Spray"]="Landkanone",
+["Kamikaze"]="Kamikaze",
+["RC Plane"]="Funkflugzeug",
+["Air Attack"]="Luftangriff",
+["Mine Strike"]="Minen-Luftangriff",
+["Drill Strike"]="Bohr-Luftangriff",
+["Air Mine"]="Luftmine",
+["Napalm"]="Napalm-Luftangriff",
+["Piano Strike"]="Piano-Angriff",
+["BlowTorch"]="Schweißbrenner",
+["PickHammer"]="Presslufthammer",
+["Girder"]="Bauträger",
+["Rubber"]="Gummi",
+["Resurrector"]="Totenbeschwörung",
+["Tardis"]="Zeitkasten",
+["Switch Hog"]="Igel wechseln",
+["Air Mine Placement Mode"]="Luftminenplatzierungsmodus",
+["Target Placement Mode"]="Zielscheibenplatzierungsmodus",
+["Cleaver Placement Mode"]="Hackebeilplatzierungsmodus",
+["Advanced Repositioning Mode"]="Fortgeschrittner Verlegungsmodus",
+["Tagging Mode"]="Markierungsmodus",
+["Hog Identity Mode"]="Igelidentitätsmodus",
+["Team Identity Mode"]="Team-Identitätsmodus",
+["Health Modification Mode"]="Gesundheitsmodifikationsmodus",
+["Sprite Placement Mode"]="Sprite-Platzierungsmodus",
+["Sprite Modification Mode"]="Sprite-Modifikationsmodus",
+["Waypoint Placement Mode"]="Wegpunktplatzierungsmodus",
+["Selection Mode"]="Auswahlmodus",
+["Placement Mode"]="Platzierungsmodus",
+["Deletion Mode"]="Löschmodus",
+["Please click on a hedgehog."]="Bitte klick auf einen Igel.",
+["LandFlag Modification Mode"]="LandFlag-Modifikationsmodus",
+["Sprite Erasure Mode"]="Sprite-Löschmodus",
+["Tag Collection Mode"]="Markiermodus: Einsammeln",
+["Please click on a crate."]="Bitte klick auf eine Kiste.",
+["Tag Victory Mode"]="Markiermodus: Sieg",
+["Tag Failure Mode"]="Markiermodus: Niederlage",
+["Waypoint Deletion Mode"]="Wegpunktlöschmodus",
+["Standard Target"]="Standardziel",
+["Standard Cleaver"]="Standardhackebeil",
+["Normal Sticky Mine"]="Normale Haftmine",
+["Chef"]="Chefkoch",
+["Clown"]="Clown",
+["Commander"]="Kommandant",
+["Engineer"]="Ingenieur",
+["Ninja"]="Ninja",
+["Physicist"]="Physiker",
+["Pyro"]="Pyromane",
+["Saint"]="Sankt",
+["Sniper"]="Heckenschütze",
+["Soldier"]="Soldat",
+["Trapper"]="Trapper",
+["Sprite Testing Mode"]="Sprite-Testmodus",
+["Standard Waypoint"]="Standard-Wegpunkt",
+["Level Data Saved!"]="Leveldaten gesichert!",
+["HEDGE EDITOR"]="HEDGE EDITOR",
+["(well... kind of...)"]="(naja, sozusagen …)",
+["Place Girder: Girder"]="Bauträger platzieren: Bauträger",
+["Place Rubber: Rubber"]="Gummi platzieren: Gummi",
+["Place Gear: Air Attack"]="Gear platzieren: Luftangriff",
+["Change Selection: [Up], [Down], [Left], [Right]"]="Auswahl ändern: [Hoch], [Runter], [Links], [Rechts]",
+["Toggle Help: Precise+1 (While a tool is selected)"]="Hilfe umschalten: Genaues Zielen + 1 (Während ein Werkzeug ausgewählt ist)",
+["COMMANDS: (Use while no weapon is selected)"]="BEFEHLE: (Benutzen, wenn keine Waffe gewählt ist)",
+["Save Level: Precise+4"]="Level sichern: Genaues Zielen + 4",
+["Toggle Editing Weapons and Tools: Precise+2"]="Waffen- und Werkzeugbearbeitung umschalten: Genaues Zielen + 2",
+["GIRDER PLACEMENT MODE"]="BAUTRÄGERPLATZIERUNGSMODUS",
+["Use this mode to place girders"]="Benutze diesen Modus, um Bauträger zu platzieren",
+["Place Girder: [Left Click]"]="Bauträger platzieren: [Linksklick]",
+["Change Rotation: [Left], [Right]"]="Rotieren: [Links], [Rechts]",
+["Change LandFlag: [1], [2], [3], [4]"]="LandFlag ändern: [1], [2], [3], [4]",
+["1 - Normal Girder"]="1 – Normaler Bauträger",
+["2 - Indestructible Girder"]="2 – Unzerstörbarer Bauträger",
+["3 - Icy Girder"]="3 – Eisiger Bauträger",
+["4 - Bouncy Girder"]="4 – Elastischer Bauträger",
+["Deletion Mode: [5]"]="Löschmodus: [5]",
+["Toggle Help: Precise+1"]="Hilfe umschalten: Genaues Zielen + 1",
+["RUBBER PLACEMENT MODE"]="GUMMIPLATZIERUNGSMODUS",
+["Use this mode to place rubberbands"]="Benutze diesen Modus, um Gummibalken zu platzieren",
+["Place Object: [Left Click]"]="Objekt platzieren: [Linksklick]",
+["1 - Normal Rubber"]="1 – Normales Gummi",
+["BARREL PLACEMENT MODE"]="FASSPLATZIERUNGSMODUS",
+["Use this mode to place barrels"]="Benutze diesen Modus, um Pulverfässer zu platzieren",
+["Change Health: [Left], [Right]"]="Gesundheit ändern: [Links], [Rechts]",
+["Change Placement Mode: [Up], [Down]"]="Platzierungsmodus ändern: [Hoch], [Runter]",
+["CLEAVER MINE PLACEMENT MODE"]="HACKEBEILPLATZIERUNGSMODUS",
+["Use this mode to place cleavers"]="Benutze diesen Modus, um Hackebeile zu platzieren",
+["TARGET MINE PLACEMENT MODE"]="ZIELSCHEIBENPLATZIERUNGSMODUS",
+["Use this mode to place targets"]="Benutze diesen Modus, um Zielscheiben zu platzieren",
+["WAYPOINT PLACEMENT MODE"]="WEGPUNKTPLATZIERUNGSMODUS",
+["Use this mode to waypoints"]="Benutze diesen Modus, um Wegpunkte zu platzieren",
+["Place Waypoint: [Left Click]"]="Wegpunkt platzieren: [Linksklick]",
+["MINE PLACEMENT MODE"]="MINENPLATZIERUNGSMODUS",
+["Use this mode to place mines"]="Benutze diesen Modus, um Minen zu platzieren",
+["Change Timer (in milliseconds): [Left], [Right]"]="Zeitzünder (in Millisekunden) ändern: [Links], [Rechts]",
+["STiCKY MINE PLACEMENT MODE"]="HAFTMINENPLATZIERUNGSMODUS",
+["Use this mode to place sticky mines"]="Benutze diesen Modus, um Haftminen zu platzieren",
+["AIR MINE PLACEMENT MODE"]="LUFTMINENPLATZIERUNGSMODUS",
+["Use this mode to place air mines"]="Benutze diesen Modus, um Luftminen zu platzieren",
+["Use this mode to place weapon crates"]="Benutze diesen Modus, um Waffenkisten zu platzieren",
+["Change Content: [Left], [Right]"]="Inhalt ändern: [Links], [Rechts]",
+["UTILITY CRATE PLACEMENT MODE"]="WERKZEUGKISTENPLATZIERUNGSMODUS",
+["Use this mode to place utility crates"]="Benutze diesen Modus, um Werkzeugkisten zu platzieren",
+["HEALTH CRATE PLACEMENT MODE"]="GESUNDHEITSKISTENPLATZIERUNGSMODUS",
+["Change Health Boost: [Left], [Right]"]="Gesundheitsschub ändern: [Links], [Rechts]",
+["ADVANCED REPOSITIONING MODE"]="FORTGESCHRITTENER VERLEGUNGSMODUS",
+["Use this mode to select and reposition gears"]="Benutze diesen Modus, um Gears auszuwählen und zu verlegen",
+["[Left], [Right]: Change between selection and placement mode."]="[Links], [Rechts]: Zwischen Auswahl- und Verlegungsmodus wechseln.",
+["SPRITE MODIFICATION MODE"]="SPRITE-MODIFIKATIONSMODUS",
+["Set LandFlag: [1], [2], [3], [4]"]="LandFlag setzen: [1], [2], [3], [4]",
+["1 - Normal Land"]="1 – Normales Gelände",
+["2 - Indestructible Land"]="2 – Unzerstörbares Gelände",
+["3 - Icy Land"]="3 – Eisiges Gelände",
+["4 - Bouncy Land"]="4 – Elastisches Gelände",
+["SPRITE PLACEMENT MODE"]="SPRITE-PLATZIERUNGSMODUS",
+["Use this mode to place custom sprites."]="Benutze diesen Modus, um benutzerdefinierte Sprites zu platzieren.",
+["[Left], [Right]: Change sprite selection"]="[Links], [Rechts]: Sprite-Auswahl ändern",
+["TAGGING MODE"]="MARKIERUNGSMODUS",
+["Use this mode to tag gears for win/lose conditions."]="Benutze diesen Modus, um Gears für Sieg-/Niederlagebedingungen zu markieren.",
+["Tag Gear: [Left Click]"]="Gear markieren: [Linksklick]",
+["[Left], [Right]: Change between tagging modes."]="[Links], [Rechts]: Zwischen Markierungsmodi wechseln.",
+["HOG IDENTITY MODE"]="IGELIDENTITÄTSMODUS",
+["Use this mode to give a hog a preset identity and weapons."]="Benutze diesen Modus, um einem Igel ein voreingestelle Idendität sowie Waffen zu geben.",
+["Set Identity: [Left Click]"]="Identität setzen: [Linksklick]",
+["[Left], [Right]: Change between identities."]="[Links], [Rechts]: Identitäten wechseln.",
+["TEAM IDENTITY MODE"]="TEAMIDENTITÄTSMODUS",
+["Use this mode to give an entire team themed hats and names."]="Benutze diesen Modus, um einem Team einen Satz Hüte und Namen zu geben.",
+["HEALTH MODIFICATION MODE"]="GESUNDHEITSMODIFIKATIONSMODUS",
+["Use this mode to set the health of hogs."]="Benutze diesen Modus, um die Igelgesundheit einzustellen.",
+["Set Health: [Left Click]"]="Gesundheit setzen: [Linksklick]",
+["[Left], [Right]: Change health value."]="[Links], [Rechts]: Gesundheitswert auswählen",
+["Warning: Deletition Mode Active"]="Achtung: Löschmodus aktiv",
+["The editor weapons and tools have been removed!"]="Die Editorwaffen und -werkzeuge wurden entfernt!",
+["The editor weapons and tools have been added!"]="Die Editorwaffen und -werkzeuge wurden hinzugefügt!",
+["Bouncy Land"]="Sprunghaftes Gelände",
+["Normal Land"]="Normales Gelände",
+["Indestructible Land"]="Unzerstörbares Gelände",
+["Icy Land"]="Eisiges Gelände",
+["HIGHLANDER"]="HOCHLÄNDER",
+["Not all hogs are born equal."]="Nicht alle Igel werden gleich geboren.",
+["Eliminate enemy hogs and take their weapons."]="Vernichte alle gegnerischen Igel und nimm ihre Waffen.",
+["Per-Hog Ammo"]="Munition pro Igel",
+["Weapons reset."]="Waffen werden zurückgesetzt.",
+["Unlimited Attacks"]="Unbegrenzte Angriffe",
["The first player to kill someone becomes the Mutant."]="Der erste Spieler, der einen umbringt, wird zum Mutanten.",
["The Mutant has super-weapons and a lot of health."]="Der Mutant hat Superwaffen und eine hohe Gesundheit.",
["The Mutant loses health quickly if he doesn't keep scoring kills."]="Der Mutant verliert schnell an Gesundheit, wenn er nicht schnell andere Igel tötet.",
@@ -1497,6 +1687,32 @@
["-------"]="-------",
[" HAS MUTATED"]=" MUTIERTE",
[" HP"]=" TP",
+["Jumping is disabled"]="Sprünge sind deaktiviert!",
+["Way-Points Remaining"]="Wegpunkte verbleibend",
+["s"]="s",
+["RACER"]="WETTRENNEN",
+["TRACK COMPLETED"]="STRECKENLAUF BEENDET",
+["NEW RACE RECORD: "]="NEUER RENNREKORD: ",
+["WINNING TIME: "]="BESTZEIT: ",
+["NEW CLAN RECORD: "]="NEUER KLAN-REKORD",
+["TIME: "]="ZEIT: ",
+["s|"]="s|",
+["STATUS UPDATE"]="STATUSAKTUALISIERUNG",
+["Rounds Complete: "]="Runden gespielt: ",
+["Best Team Times: "]="Beste Team-Zeiten: ",
+["Build a track and race."]="Konstruiere eine Strecke und mach ein Wettrennen.",
+["Round Limit:"]="Rundenbegrenzung:",
+["Available points remaining: "]="Verfügbare Punkte verbleibend:",
+["Waypoint placed."]="Wegpunkt gesetzt",
+["GAME BEGUN!!!"]="SPIEL GESTARTET!!!",
+["Complete the track as fast as you can!"]="Durchlaufe die Strecke so schnell du kannst!",
+["NOT ENOUGH WAYPOINTS"]="NICHT GENUG WEGPUNKTE",
+["Place more waypoints using the 'Air Attack' weapon."]="Platziere mehr Wegpunkte durch Verwenden der »Luftangriff«-Waffe",
+["Please place the way-point in the open, within the map boundaries."]="Bitte platziere den Wegpunkt in der Luft, innerhalb der Kartengrenzen.",
+["Please place the way-point further from the waterline."]="Bitte platziere den Wegpunkt weiter weg vom Wasser.",
+["Race complexity limit reached."]="Rennkomplexitätslimit erreicht.",
+["Good to go!"]="Startklar!",
+["Each turn you get one random weapon"]="Du bekommst jede Runde eine zufällig gewählte Waffe.",
["BOOM!"]="KABUMM!",
["SCORE"]="PUNKTZAHL",
["KILLS"]="ABSCHÜSSE",
@@ -1509,8 +1725,8 @@
["Ammo Depleted!"]="Munition erschöpft!",
["Mine Deployer"]="Minenleger",
["Shield Depleted"]="Schild aufgebraucht!",
+["Power Remaining"]="Verbleibende Energie",
["Shield ON:"]="Schild AN:",
-["Power Remaining"]="Verbleibende Energie",
["Shield OFF:"]="Schild AUS:",
["Pings left:"]="Verbleibende Pings:",
["Destroy invaders to score points."]="Zerstöre die Angreifer um Punkte zu erhalten.",
@@ -1546,35 +1762,13 @@
["Kamikaze Expert!"]="Kamikazeexperte!",
["Depleted Kamikaze!"]="Munitionsloses Kamikaze!",
["Timed Kamikaze!"]="Pünktliches Kamikaze!",
-["For improved features/stability, play 0.9.18+"]="Für bessere Features/Stabilität, spiele 0.9.18 oder später",
-["Surfer!"]="Surfer!",
-["All walls touched!"]="Alle Wände berührt!",
-["Go surf!"]="Los, surfe!",
-["Walls Left"]="Verbleibende Wände",
-["Configuration accepted."]="Konfiguration akzeptiert.",
-["You may only attack from a rope!"]="Du darfst nur von einem Seil angreifen!",
-["Spawn the crate, and attack!"]="Lass die Kiste auftauchen und greif an!",
-["Press [Enter] to accept this configuration."]="Drücke [Eingabe], um diese Konfiguration zu akzeptieren.",
-["Walls Required"]="Wände benötigt",
-["Surf Before Crate"]="Surfen Vor Kiste",
-["Attack From Rope"]="Angriff Vom Seil",
-["Super Weapons"]="Superwaffen",
-["WALL TO WALL"]="WAND-ZU-WAND",
-["a shoppa minigame"]="ein Einkaufs-Minispiel",
-["Waypoint placed."]="Wegpunkt gesetzt",
-["Available points remaining: "]="Verfügbare Punkte verbleibend:",
-["NOT ENOUGH WAYPOINTS"]="NICHT GENUG WEGPUNKTE",
-["Place more waypoints using the 'Air Attack' weapon."]="Platziere mehr Wegpunkte durch Verwenden der »Luftangriff«-Waffe",
+["You can further customize the race by changing the scheme script paramater."]="Du kannst das Renner ferner bearbeiten, indem du den Skriptparameter im Schema änderst.",
["THE SPECIALISTS"]="DIE SPEZIALISTEN",
["Eliminate the enemy specialists."]="Vernichte die gegnerischen Spezialisten",
["Game Modifiers: "]="Spiel-Modifikatoren",
["Weapons Reset"]="Waffenzurücksetzung",
["Switched to "]="Gewechselt zu ",
["Prepare yourself"]="Mach dich bereit",
-["Game Started!"]="Spiel gestartet!",
-["CAPTURE THE FLAG"]="EROBERE DIE FAHNE",
-["Flags, and their home base will be placed where each team ends their first turn."]="Fahnen und deren Heimatstandort werden dort plaziert, wo jedes Team deren ersten Zug beendet.",
-["RULES OF THE GAME [Press ESC to view]"]="SPIELREGELN (Drücke [Esc] zum Anzeigen)",
["ammo extended!"]="Munition aufgestockt!",
["Barrel Eater!"]="Fassfresser!",
["Mine Eater!"]="Minenfresser!",
@@ -1592,84 +1786,39 @@
["Killing spree!"]="Blutrausch!",
["Unstoppable!"]="Unaufhaltsam!",
["Friendly Fire!"]="Eigenbeschuss!",
-["Each turn you get one random weapon"]="Du bekommst jede Runde eine zufällig gewählte Waffe.",
-["Reflector Shield"]="Reflektorschild",
-["Bio-Filter"]="Biofilter",
-["Healing Station"]="Heilstation",
-["Respawner"]="Wiederbeleber",
-["Teleportation Node"]="Teleportationsstation",
-["Core"]="Kern",
-["Generator"]="Generator",
-["Support Station"]="Waffenstation",
-["Construction Station"]="Baustation",
-["Weapon Filter"]="Waffenfilter",
-["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."]="Teleportation fehlgeschlagen. Bitte teleportiere nur innerhalb des Einzugsgebiets deiner Klanteleporter.",
-["Teleportation Mode"]="Teleportationsmodus",
-["Girder Placement Mode"]="Trägerplatzierungsmodus",
-["Rubber Placement Mode"]="Gummiplatzierungsmodus",
-["Mine Placement Mode"]="Minenplatzierungsmodus",
-["Sticky Mine Placement Mode"]="Haftminenplatzierungsmodus",
-["Barrel Placement Mode"]="Pulverfassplatzierungsmodus",
-["Health Crate Placement Mode"]="Gesundheitskistenplatzierungsmodus",
-["Weapon Crate Placement Mode"]="Waffenkistenplatzierungsmodus",
-["Utility Crate Placement Mode"]="Werkzeugkistenplatzierungsmodus",
-["Structure Placement Mode"]="Gebäudeplatzierungsmodus",
-["Structure Placement Tool"]="Gebäudeplatzierungswerkzeug",
-["Object Placement Tool"]="Objektplatzierungswerkzeug",
-["Crate Placement Tool"]="Kistenplatzierungswerkzeug",
-["Drill Rocket"]="Bohrkopfrakete",
-["Mudball"]="Schlammball",
-["Cluster Bomb"]="Splittergranate",
-["Molotov Cocktail"]="Molotowcocktail",
-["Watermelon Bomb"]="Wassermelonenbombe",
-["Hellish Handgrenade"]="Höllische Handgranate",
-["Limburger"]="Limburger",
-["Flamethrower"]="Flammenwerfer",
-["Freezer"]="Eiskanone",
-["Land Sprayer"]="Landkanone",
-["Whip"]="Peitsche",
-["Baseball Bat"]="Baseballschläger",
-["Dynamite"]="Dynamit",
-["Cake"]="Kuchen",
-["Ballgun"]="Ballkanone",
-["Cleaver"]="Hackebeil",
-["Birdy"]="Birdy",
-["Pickhammer"]="Presslufthammer",
-["Personal Portal Device"]="Portalgerät",
-["Rope"]="Seil",
-["Invulnerable"]="Unverwundbar",
-["Laser Sight"]="Laservisier",
-["Vampirism"]="Vampirismus",
-["Extra Damage"]="Extraschaden",
-["Extra Time"]="Zusatzzeit",
-["You may only use 1 Extra Time per turn."]="Du darfst pro Zug nur einmal Zusatzzeit benutzen.",
-["You may only spawn 5 crates per turn."]="Du darfst pro Zug nur 5 Kisten platizeren.",
-["Invalid Placement"]="Ungültige Position",
-["Insufficient Power"]="Unzureichende Energie",
-["The Great Hog in the sky sees your sadness and grants you a boon."]="Der Große Igel im Himmel sieht deine Traurigkeit und leistet dir eine Gabe.",
-["Cost"]="Kosten",
-["CONSTRUCTION MODE"]="BAUMODUS",
-["Build a fortress and destroy your enemy."]="Baue ein Fort und zerstöre deinen Feind.",
-["There are a variety of structures available to aid you."]="Es gibt verschiedene Gebäude, um dich zu unterstützen.",
-["Use the air-attack weapons and the arrow keys to select structures."]="Benutze die Luftangriffswaffen und die Pfeiltasten, um Gebäude auszuwählen.",
-["Grants nearby hogs life-regeneration."]="Spendet nahen Igeln Lebensenergie.",
-["Aggressively removes enemy hedgehogs."]="Entfernt feindliche Igel aggressiv.",
-["Dematerializes weapons and equipment carried by enemy hedgehogs."]="Demateralisiert Waffen und Equipment, das von feindlichen Igeln getragen wird.",
-["Reflects enemy projectiles."]="Stößt feindliche Projektile ab.",
-["Generates power."]="Erzeugt Energie.",
-["Resurrects dead hedgehogs."]="Belebt tote Igel wieder.",
-["Teleporation Node"]="Teleporterstation",
-["Allows free teleportation between other nodes."]="Ermöglicht kostenlose Teleportationen zwischen anderen Stationen.",
-["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."]="Ermöglicht die Platzierung von Trägern, Gummibändern, Minen, Haftminen und Pulverfässern.",
-["Allows the placement of weapons, utiliites, and health crates."]="Ermöglicht die Platzierung von Waffen-, Werkzeug- und Gesundheitskisten",
-["Achievement obtained: Lively Lifeguard"]="Errungenschaft erhalten: Lebhafter Lebensretter",
-["Challenge completed!"]="Herausforderung bewältigt!",
-["Challenge"]="Herausforderung",
-["%d Hapless Hogs left"]="%d Glücklose Igel verbleibend",
-["Disqualified!"]="Disqualifiziert!",
-["You haven't rescued anyone."]="Du hast niemanden gerettet.",
-["You have obtained an achievement: Lively Lifeguard"]="Du hast eine Errungenschaft erhalten: Lebhafter Lebensretter",
-["You must survive the flood in order to score."]="Du musst das Hochwasser überleben um zu punkten.",
-["Your hedgehog died!"]="Dein Igel ist gestorben!",
-["You saved %d of 8 Hapless Hogs."]="Du hast %d von 8 Glücklosen Igeln gerettet."
+["For improved features/stability, play 0.9.18+"]="Für bessere Features/Stabilität, spiele 0.9.18 oder später",
+["Surfer!"]="Surfer!",
+["All walls touched!"]="Alle Wände berührt!",
+["Go surf!"]="Los, surfe!",
+["Walls Left"]="Verbleibende Wände",
+["Configuration accepted."]="Konfiguration akzeptiert.",
+["You may only attack from a rope!"]="Du darfst nur von einem Seil angreifen!",
+["Spawn the crate, and attack!"]="Lass die Kiste auftauchen und greif an!",
+["Press [Enter] to accept this configuration."]="Drücke [Eingabe], um diese Konfiguration zu akzeptieren.",
+["Walls Required"]="Wände benötigt",
+["Surf Before Crate"]="Surfen Vor Kiste",
+["Attack From Rope"]="Angriff Vom Seil",
+["Super Weapons"]="Superwaffen",
+["WALL TO WALL"]="WAND-ZU-WAND",
+["a shoppa minigame"]="ein Einkaufs-Minispiel",
+["Roper"]="Seiler",
+["Shoppers"]="Käufer",
+["Use your rope to collect all crates as fast as possible."]="Benutze dein Seil, um alle Kisten so schnell wie möglich einzusammeln.",
+["Speed Shoppa"]="Rasender Kistensammler",
+["%d crate(s) remaining"]="Verbleibende Kisten: %d",
+["milliseconds"]="Millisekunden",
+["You have finished the challenge in %.3f s."]="Du hast die Herausforderung in %.3fs gemeistert.",
+["Challenge failed!"]="Herausforderung gescheitert!",
+["crate(s)"]="Kiste(n)",
+["You have collected %d out of %d crate(s)."]="Du hast %d von %d Kiste(n) eingesammelt.",
+["Trainee"]="Azubi",
+["Training Team"]="Traningsteam",
+["You have shot %d times."]="Du hast %d mal geschossen.",
+["Time’s up!"]="Die Zeit ist um!",
+["Targets left: %d"]="Verbleibende Ziele: %d",
+["You have destroyed all targets!"]="Du hast alle Ziele zerstört!",
+["Congratulations! You have destroyed all targets within the time."]="Gratulation! Du hast alle Ziele innerhalb der verfügbaren Zeit ausgeschaltet.",
+["You have finished the target practice!"]="Du hast die Zielübung abgeschlossen!",
+["Your accuracy was %.1f%% (+%d points)."]="Deine Treffgenauigkeit betrug %.1f%% (+%d Punkte).",
+["You had %.1fs remaining on the clock (+%d points)."]="Du hattest eine verbleibende Zeit von %.1fs (+%d Punkte)."
}
--- a/share/hedgewars/Data/Locale/de.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/de.txt Fri Apr 01 15:36:19 2016 +0200
@@ -29,7 +29,7 @@
00:26=Wassermelonenbombe
00:27=Höllische Handgranate
00:28=Bohrkopfrakete
-00:29=Ballpistole
+00:29=Ballkanone
00:30=Napalm-Luftangriff
00:31=Funkflugzeug
00:32=Schwerkraft verringern
@@ -41,7 +41,7 @@
00:38=Scharfschützengewehr
00:39=Fliegende Untertasse
00:40=Molotowcocktail
-00:41=Birdy
+00:41=Vogli
00:42=Tragbares Portalgerät
00:43=Piano-Angriff
00:44=Alter Limburger
@@ -538,19 +538,19 @@
03:08=Annäherungsmine
03:09=Pistole (mehrere Schüsse)
03:10=BUMM!
-03:11=Bonk!
+03:11=Voll auf die Zwölf!
03:12=Kampfkunst
03:13=NICHT IN VERWENDUNG
03:14=Fortbewegungsmittel
03:15=Luftschlag
03:16=Luftschlag
-03:17=Grabwerkzeug
+03:17=Grabewerkzeug
03:18=Werkzeug
03:19=Fortbewegungsmittel
03:20=Aktion
03:21=Ballistische Waffe
03:22=Nenn mich Indiana!
-03:23=Kampfkunst
+03:23=Tödliche Kampfkunst
03:24=Der Kuchen ist keine Lüge!
03:25=Verkleidung
03:26=Saftige Granate
@@ -568,15 +568,15 @@
03:38=Gewehr (mehrere Schüsse)
03:39=Fortbewegungsmittel
03:40=Brandbombe
-03:41=Riesiger Squawks-Fan
+03:41=Mach die Flatter!
03:42=Portalöffner
; the misspelled "Beethoven" is intentional (-> to beat)
03:43=Spiele Beathovens tödliche Sonate!
03:44=Ziemlich alt und stinkig
03:45=Die Macht der Wissenschaft
03:46=Heiß, heiß, heiß!
-03:47=Mach es weg!
-03:48=Stop! Hammer time!
+03:47=Klebt (fast) überall
+03:48=In-den-Boden-Stampfer
03:49=Tut, was man vermutet
03:50=Maulwurfsfreund
03:51=Am Boden gefunden
@@ -587,66 +587,68 @@
03:55=Cooler wird’s nicht
03:56=Bitte ge- oder missbrauchen
03:57=Werkzeug
+03:58=Schwebende Annäherungsmine
; Weapon Descriptions (use | as line breaks)
-04:00=Greife deine Feinde mit einfachen Granaten an.|Der Zeitzünder steuert den Explosionszeitpunkt.|1–5: Zeitzünder einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
-04:01=Greife deine Feinde mit Splittergranaten an.|Der Zeitzünder wird die Granate in mehrere|kleine Bomben zerspringen lassen.|1–5: Zeitzünder einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
+04:00=Greife deine Feinde mit einfachen Granaten an.|Der Zeitzünder steuert den Explosionszeitpunkt.|1–5: Zeitzünder einstellen|Genaues Zielen + 1-5: Sprungkraft einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
+04:01=Greife deine Feinde mit Splittergranaten an.|Der Zeitzünder wird die Granate in mehrere|kleine Bomben zerspringen lassen.|1–5: Zeitzünder einstellen|Genaues Zielen + 1-5: Sprungkraft einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
04:02=Greife deine Feinde mit einem ballistischen|Projektil an, das vom Wind beeinflusst wird.|Angriff: Halten, um mit mehr Kraft zu feuern
04:03=Starte eine explosive Biene, die auf ein gewähltes|Ziel zusteuern wird. Feuere nicht mit voller Kraft,|um die Zielgenauigkeit zu verbessern.|Cursor: Ziel wählen|Angriff: Halten, um mit mehr Kraft zu feuern
04:04=Greife deine Feinde mit einer Schrotflinte und|zwei Schüssen an. Durch die Streuung musst du|nicht genau zielen, um trotzdem zu treffen.|Angriff: Feuern (mehrfach)
-04:05=Ab in den Untergrund! Benutze den Presslufthammer,|um einen Schacht nach unten zu graben und so|andere Gebiete zu erreichen.|Angriff: Presslufthammer ein- oder ausschalten
+04:05=Ab in den Untergrund! Benutze den Presslufthammer,|um einen Schacht nach unten zu graben und so|andere Gebiete zu erreichen.|Angriff: Presslufthammer ein- oder ausschalten|Links/Rechts: Schräg bohren
04:06=Gelangweilt? Keine Optionen? Munition sparen?|Kein Problem! Passe einfach diese Runde, Feigling!|Angriff: Runde ohne Angriff aussetzen
-04:07=Überbrücke große Distanzen mit gezielt abgefeuerten|Seilschüssen. Benutze deine Bewegungsenergie, um|andere Igel zu schubsen oder wirf vom Seil aus Granaten|und ähnliche Waffen.|Angriff: Seil abfeuern oder lösen|Weitsprung: Waffe benutzen
-04:08=Halte dir deine Feinde fern oder blockiere sie,|indem du ihnen Minen vor die Beine wirfst.|Sei aber schnell genug, damit du sie nicht noch|selbst auslöst!|Angriff: Mine legen
+04:07=Überbrücke große Distanzen mit gezielt abgefeuerten|Seilschüssen. Benutze deine Bewegungsenergie, um|andere Igel zu schubsen oder wirf vom Seil aus Granaten|und ähnliche Waffen.|Angriff: Seil abfeuern oder lösen|Hoch/Runter: Seil verkürzen/verlängern|Weitsprung: Waffe benutzen
+04:08=Halte dir deine Feinde fern oder blockiere sie,|indem du ihnen Minen vor die Beine wirfst.|Sei aber schnell genug, damit du sie nicht noch|selbst auslöst!|Angriff: Mine legen|Genaues Zielen + 1-5: Sprungkraft einstellen
04:09=Nicht so ganz zielsicher? Versuche es mit der|Desert Eagle, denn diese bietet dir vier Schuss.|Angriff: Feuern (mehrfach)
04:10=Rohe Gewalt ist immer eine Lösung. Lege einfach|diesen klassischen Sprengsatz neben deinen Feinden|ab und mach dich aus dem Staub.|Angriff: Dynamitstange legen
04:11=Beseitige Feinde, indem du diese mit dem|Baseballschläger einfach von der Karte fegst.|Oder wie wäre es, wenn du deinen Freunden ein|paar Minen vor die Beine schlägst?|Angriff: Alles vor dem Igel schlagen
-04:12=Rücke mit deinen Feinden näher zusammen und|entfessle die Kraft dieser so gut wie tödlichen|Kampftechnik.|Angriff: Feuerfaust einsetzen
+04:12=Rücke mit deinen Feinden näher zusammen und|entfessle die Kraft dieser so gut wie tödlichen|Kampftechnik.|Angriff: Alles vor dem Igel schlagen
04:13=UNUSED
-04:14=Höhenangst? Greif besser zum Fallschirm.|Er wird sich von alleine entfalten, wenn du|zu lange oder zu tief fällst, und so deinem|Igel den Hals retten.|Angriff: Fallschirm öffnen|Weitsprung: Waffe benutzen
+04:14=Höhenangst? Greif besser zum Fallschirm.|Er wird sich von alleine entfalten, wenn du|zu lange oder zu tief fällst, und so deinem|Igel den Hals retten.|Angriff: Fallschirm manuell öffnen oder entfernen|Links/Rechts/Hoch/Runter: Flug steuern|Weitsprung: Waffe benutzen
04:15=Rufe ein Flugzeug, um deine Feinde mit einem|Bombenteppich einzudecken.|Links/Rechts: Angriffsrichtung wählen|Cursor: Zielgebiet wählen und Angriff starten
04:16=Rufe ein Flugzeug, um mehrere Minen im|Zielgebiet abwerfen zu lassen.|Links/Rechts: Angriffsrichtung wählen|Cursor: Zielgebiet wählen und Angriff starten
-04:17=Unterschlupf gefällig? Benutze den Schweißbrenner,|um einen Tunnel in festen Untergrund zu graben|oder einem Feind eine heiße Bekanntschaft machen|zu lassen.|Angriff: Brenner ein- oder ausschalten
+04:17=Unterschlupf gefällig? Benutze den Schweißbrenner,|um einen Tunnel in festen Untergrund zu graben|oder einem Feind eine heiße Bekanntschaft machen|zu lassen.|Angriff: Brenner ein- oder ausschalten|Hoch/Runter: Graberichtung ändern
04:18=Brauchst du Schutz oder eine Möglichkeit, einen|Abgrund zu überwinden? Platziere einige Bauträger,|um dir zu helfen.|Links/Rechts: Bauform und Ausrichtung wählen|Cursor: Bauträger platzieren
-04:19=Im richtigen Moment kann sich eine Teleportation|mächtiger als jede Waffe erweisen, da sich so ein|Igel gezielt einer gefährlichen Situation binnen|Sekunden entziehen kann.|Cursor: Zielposition wählen
-04:20=Erlaubt es dir, den aktiven Igel zu wechseln|und mit einem anderen Igel fortzufahren.|Angriff: Wechsel aktivieren
-04:21=Feuere ein granatenartiges Projektil in die|Richtung deines Gegners. Es wird beim Aufschlag|mehrere kleine Bomben freisetzen.|Angriff: Mit voller Kraft feuern
+04:19=Im richtigen Moment kann sich eine Teleportation|mächtiger als jede Waffe erweisen, da sich so ein|Igel gezielt einer gefährlichen Situation binnen|Sekunden entziehen kann.|Cursor: Zielposition wählen|Links/Rechts: Blickrichtung wählen
+04:20=Ermöglicht es dir, den aktiven Igel zu wechseln|und mit einem anderen Igel fortzufahren.|Angriff: Igelwechsel aktivieren|Wechseln: Nächten Igel wählen|Genaues Zielen + Wechseln: Vorherigen Igel wählen
+04:21=Feuere ein Projektil, welches mehrere Splitter|beim Einschlag freisetzen wird. Sie werden|zurückgeschleudert und sind gefährlicher|als das Hauptprojektil.|Angriff: Mit voller Kraft feuern
04:22=Nicht nur etwas für Indiana Jones! Die Peitsche|eignet sich besonders gut, um ungezogene Igel|eine Klippe hinunter zu treiben.|Angriff: Alles vor dem Igel schlagen
04:23=Wenn man nichts mehr zu verlieren hat …|Opfere deinen Igel, indem du ihn in eine|festgelegte Richtung losstürmen lässt.|Er wird alles auf dem Weg treffen und am|Ende selbst explodieren.|Angriff: Tödlichen Angriff starten
04:24=Alles Gute! Schick diesen Kuchen auf den Weg,|damit er deinen lieben Feinden eine explosive|Party beschert. Die Torte überwindet fast jedes|Terrain, verliert dabei aber an Laufzeit.|Angriff: Torte losschicken / explodieren lassen
04:25=Benutze diese Verkleidung, um einen Feind blind|vor Liebe in deine Richtung (und damit in einen|Abgrund oder ähnliches) springen zu lassen.|Angriff: Verkleiden und verführen
-04:26=Wirf diese saftige Wassermelone auf deine Feinde.|Sobald die Zeit abgelaufen ist, wird sie in|einzelne und explosive Stücke zerspringen.|Angriff: Halten, um mit mehr Kraft zu werfen
+04:26=Wirf diese saftige (und sprunghafte) Wassermelone auf|deine Feinde. Sobald die Zeit abgelaufen ist, wird|sie in einzelne und explosive Stücke zerspringen.|1-5: Zeitzünder einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
04:27=Entfessle das Höllenfeuer und umgebe deine|Widersacher damit, indem du diesen teuflischen|Sprengsatz gegen sie einsetzt. Komm ihm aber|nicht zu nahe, denn die Flammen könnten|länger bestehen bleiben.|Angriff: Halten, um mit mehr Kraft zu werfen
04:28=Kurz nach dem Start wird diese Rakete beginnen,|sich durch soliden Grund zu graben. Sobald sie|wieder austritt oder der Zeitzünder abläuft,|wird sie explodieren.|Angriff: Halten, um mit mehr Kraft zu feuern
-04:29=Das ist nichts für kleine Kinder! Die Ballpistole|feuert Tonnen kleiner farbiger Bälle, die mit|Sprengstoff gefüllt sind.|Angriff: Mit voller Kraft feuern|Hoch/Runter: Im Feuern zielen
+04:29=Das ist nichts für kleine Kinder! Die Ballkanone|feuert Tonnen kleiner farbiger Bälle, die mit|Sprengstoff gefüllt sind.|Angriff: Losballern|Hoch/Runter: Weiterzielen
04:30=Rufe ein Flugzeug, um ein Areal gezielt mit|tödlichem Napalm einzudecken. Gut gezielt|lassen sich so große Teile der Karte auslöschen.|Links/Rechts: Angriffsrichtung wählen|Cursor: Zielgebiet wählen und Angriff starten
-04:31=Das Funkflugzeug kann Kisten einsammeln und weit|entfernte Igel angreifen. Steuere es direkt in|ein Opfer oder wirf erst einige Bomben ab.|Angriff: Flugzeug starten und Bomben abwerfen|Weitsprung: »Ritt der Walküren«|Hoch/Runter: Flugzeug lenken
+04:31=Das Funkflugzeug kann Kisten einsammeln und weit|entfernte Igel angreifen. Steuere es direkt in|ein Opfer oder wirf erst einige Bomben ab.|Angriff: Flugzeug starten und Bomben abwerfen|Weitsprung: »Ritt der Walküren«|Links/Rechts: Flugzeug lenken
04:32=Niedrige Schwerkraft ist effektiver als jede|Diät! Springe höher und weiter oder lass|einfach deine Gegner noch weiter fliegen.|Angriff: Aktivieren
-04:33=Manchmal muss es eben doch ein bisschen|mehr sein …|Angriff: Aktivieren
-04:34=Can’t touch me!|Angriff: Aktivieren
-04:35=Manchmal vergeht die Zeit einfach zu schnell.|Schnapp dir einige zusätzliche Sekunden, um|deinen Angriff abzuschließen.|Angriff: Aktivieren
+04:33=Manchmal muss es eben doch ein bisschen|mehr sein … Erhöhe den verursachten Schaden|um 50% für den Rest des Zuges.|Angriff: Aktivieren
+04:34=Dies macht dich immun gegenüber Schaden für den Rest|des Zuges. Aber sei nicht zu übermütig, denn du könntest|immer noch ertrinken.|Angriff: Aktivieren
+04:35=Manchmal vergeht die Zeit einfach zu schnell.|Schnapp dir 30 zusätzliche Sekunden, um|deinen Angriff abzuschließen.|Angriff: Aktivieren
04:36=Nun, manchmal trifft man einfach nicht. In solchen|Fällen kann die moderne Technik natürlich nachhelfen.|Angriff: Aktivieren
-04:37=Fürchte nicht das Tageslicht! Die Wirkung hält|nur eine Runde an, aber sie erlaubt es deinem|Igel, den Schaden, den er direkt verursacht|als Leben zu absorbieren.|Angriff: Aktivieren
-04:38=Das Scharfschützengewehr kann die vernichtendste|Waffe im gesamten Arsenal sein, allerdings ist|es auf kurze Distanz sehr ineffektiv. Der|verursachte Schaden nimmt mit der Distanz zu.|Angriff: Feuern (mehrfach)
-04:39=Fliege mit der fliegenden Untertasse in andere|Teile der Karte. Sie ist schwer zu beherrschen,|bringt dich aber an so gut wie jeden Ort.|Angriff: Aktivieren|Hoch/Links/Rechts: Beschleunigen|Weitsprung: Waffe benutzen
+04:37=Fürchte nicht das Tageslicht! Die Wirkung hält|nur eine Runde an, aber sie erlaubt es deinem|Igel, 80% des Schadens, den andere Igel während|seines Zuges erleiden, als Leben zu absorbieren.|Angriff: Aktivieren
+04:38=Das Scharfschützengewehr kann die vernichtendste|Waffe im gesamten Arsenal sein, allerdings ist|sie auf kurze Distanz sehr ineffektiv. Der|verursachte Schaden nimmt mit der Distanz zu.|Das Zielen ist schwierig, und du musst deine|Stellung halten, sobald die Waffe aktiviert wurde.|Angriff: Zielvisier aktivieren, dann feuern (zwei mal)|Links/Rechts: Umdrehen (zwischen Schüssen)
+04:39=Fliege mit der fliegenden Untertasse in andere|Teile der Karte. Sie ist schwer zu beherrschen,|bringt dich aber an so gut wie jeden Ort.|Angriff: Aktivieren/Deaktivieren|Hoch/Links/Rechts: Einmalig in eine Richtung beschleunigen|Weitsprung: Waffe fallen lassen|Genaues Zielen + Weitsprung: Waffe in Zielrichtung feuern|Genaues Zielen + Hoch/Runter: Zielen
04:40=Entzünde einen Teil der Landschaft oder auch etwas|mehr mit dieser (schon bald) brennenden Flüssigkeit.|Angriff: Halten, um mit mehr Kraft zu werfen
-04:41=Der Beweis, dass die Natur sogar die fliegende|Untertasse übertreffen könnte. Birdy kann|deinen Igel herumtragen und zudem Eier auf|deine Feinde fallen lassen.|Angriff: Aktivieren und Eier fallen lassen|Hoch/Links/Rechts: In eine Richtung flattern
-04:42=Das tragbare Portalgerät ermöglicht es dir,|dich, deine Feinde oder Waffen direkt zwischen|zwei Punkten auf der Karte zu|teleportieren.|Benutze es weise und deine Kampagne wird ein …|RIESENERFOLG!|Angriff: Öffnet ein Portal|Wechsel: Wechsle die Portalfarbe
-04:43=Lass dein musikalisches Debüt einschlagen wie eine Bombe!|Lass ein Piano vom Himmel fallen, aber pass auf …|jemand muss es spielen und das könnte dich |dein Leben kosten!|Cursor: Zielgebiet wählen und Angriff starten|F1–F9: Das Piano spielen
-04:44=Das ist nicht nur Käse, das ist biologische Kriegsführung!|Er wird nicht viel Schaden verursachen, sobald der Zünder|abgelaufen ist, aber er wird garantiert jeden in der Nähe|vergiften!|1–5: Zeitzünder einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
-04:45=All die Physikstunden haben sich endlich|bezahlt gemacht: Entfessle eine zerstörerische Sinuswelle|gegen deine Feinde.|Pass auf, die Waffe erzeugt einen ordentlichen Rückstoß.|(Diese Waffe ist unvollständig)|Angriff: Sinuswellen erzeugen
-04:46=Brutzle deine Feinde mit fließenden Flammen.|Herzerwärmend!|Angriff: Aktivieren|Hoch/Runter: Im Feuern zielen|Links/Rechts: Durchfluss ändern
-04:47=Verdopple den Spaß mit zwei spitzigen, schicken, klebrigen Minen.|Löse eine Kettenreaktion aus oder beschütze dich (oder beides).|Angriff: Halten, um mit mehr Kraft zu feuern (zweimal)
-04:48=Warum sind Maulwürfe verhasst? Einen|Igel in den Boden zu stampfen kann sehr lustig sein!|Ein guter Treffer des Hammers wird ein Drittel|der Lebenspunkte eines Igels abziehen und ihn|im Boden versenken.|Angriff: Aktivieren
-04:49=Hol deine Freunde zurück!|Aber pass auf, dass du keine Feinde beschwörst.|Angriff: Gedrückt halten, um Igel langsam wiederauferstehen zu lassen.|Hoch: Beschleunige Totenbeschwörung
-04:50=Verstecken sich Feinde im Untergrund?|Grabe sie aus mit dem Bohr-Luftangriff!|Der Zeitzünder bestimmt, wie tief dieser graben wird.
-04:51=Wirf mit Dreck um dich!|Schubst Igel weg.
+04:41=Der Beweis, dass die Natur sogar die fliegende|Untertasse übertreffen könnte. Vogli kann|deinen Igel herumtragen und zudem faule Eier|auf deine Feinde fallen lassen, um sie zu vergiften.|Angriff: Aktivieren und Eier fallen lassen|Hoch/Links/Rechts: In eine Richtung flattern
+04:42=Das tragbare Portalgerät ermöglicht es dir,|dich, deine Feinde oder Waffen direkt zwischen|zwei Punkten auf der Karte zu teleportieren.|Benutze es weise und deine Kampagne wird ein …|RIESENERFOLG!|Haftungsausschluss. Funktioniert nicht auf Gummi.|Angriff: Öffnet ein Portal|Wechseln: Wechselt die Portalfarbe
+04:43=Lass dein musikalisches Debüt einschlagen wie eine Bombe!|Lass ein mächtiges Piano vom Himmel fallen, das alles|im Weg zerstampfen wird, aber beachte:|Dein Igel muss sein Leben geben, um das Piano zu spielen.|Cursor: Zielgebiet wählen und Angriff starten|F1–F9: Das Piano spielen
+04:44=Das ist nicht nur Käse, das ist biologische Kriegsführung!|Er wird nicht viel Schaden verursachen, sobald der Zünder|abgelaufen ist, aber er wird garantiert jeden in der Nähe|vergiften!|1–5: Zeitzünder einstellen|Genaues Zielen + 1-5: Sprungkraft einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
+04:45=All die Physikstunden haben sich endlich bezahlt gemacht!|Entfessle eine zerstörerische Sinuswelle, die sich durch|das Gelände (und deine Feinde) brennen wird.|Pass auf, die Waffe erzeugt einen ordentlichen Rückstoß.|Angriff: Feuern
+04:46=Brutzle deine Feinde mit fließenden Flammen.|Herzerwärmend!|Angriff: Aktivieren|Hoch/Runter: Beim Feuern zielen|Links/Rechts: Durchfluss ändern
+04:47=Verdopple den Spaß mit zwei spitzigen, schicken, klebrigen Minen.|Löse eine Kettenreaktion aus oder beschütze dich (oder beides).|Angriff: Halten, um mit mehr Kraft zu feuern (zwei mal)
+04:48=Warum sind Maulwürfe verhasst? Igel, Minen|oder Fässer in den Boden zu stampfen, kann|auch sehr lustig sein! Ein guter Treffer des Hammers wird|ein Drittel (mit Zusatzschaden sogar die Hälfte) der|Lebenspunkte eines Igels abziehen und ihn im Boden|versenken.|Angriff: Zuschlagen
+04:49=Opfere deine Gesundheit, um deine Freunde zurückzuholen!|Aber pass auf, dass du keine Feinde beschwörst.|Angriff: Gedrückt halten, um Igel langsam wiederauferstehen zu lassen.|Hoch: Totenbeschwörung beschleunigen
+04:50=Verstecken sich Feinde im Untergrund?|Grabe sie aus mit dem Bohr-Luftangriff!|Der Zeitzünder bestimmt, wie tief dieser graben wird.|Links/Rechts: Angriffsrichtung wählen|1-5: Zeitzünder einstellen|Cursor: Zielgebiet wählen und Angriff starten
+04:51=Wirf mit Dreck um dich! Der Schlammball|schubst Igel und andere Dinge weg,|aber richtet keinen Schaden an.|Angriff: Halten, um mit mehr Kraft zu werfen
04:52=NICHT IN VERWENDUNG
-04:53=Unternimm eine Reise durch Zeit und Raum,|während du deine Kameraden alleine am Schlachtfeld zurücklässt.|Sei darauf vorbereitet jederzeit wieder zurückzukommen,|oder auf Sudden Death wenn sie alle besiegt wurden.|Haftungsausschluss: Nicht funktionstüchtig, wenn in Sudden Death,|wenn du alleine bist – oder der König.
-04:54=Versprühe einen Strahl klebriger Flocken.|Baue Brücken, begrabe Gegner, versiegle Tunnel.|Pass auf, dass du selbst nichts abbekommst!
-04:55=Hol die Eiszeit zurück! Friere Igel ein, mach den Boden rutschig oder|rette dich selbst vor dem Ertrinken,|indem du das Wasser einfrierst.|Angriff: Schießen
+04:53=Unternimm eine Reise durch Zeit und Raum,|während du deine Kameraden alleine am Schlachtfeld zurücklässt.|Sei darauf vorbereitet, jederzeit wieder zurückzukommen,|oder auf Sudden Death, oder wenn sie alle besiegt wurden.|Haftungsausschluss. Nicht funktionstüchtig, wenn in Sudden Death,|wenn du alleine bist – oder der König.|Angriff: Aktivieren
+04:54=Versprühe einen Strahl klebriger Flocken.|Baue Brücken, begrabe Gegner, versiegle Tunnel.|Pass auf, dass du selbst nichts abbekommst!|Angriff: Aktivieren|Hoch/Runter: Beim Feuern zielen|Links/Rechts: Schussweite einstellen
+04:55=Hol die Eiszeit zurück! Friere Igel ein,|mach den Boden rutschig oder|rette dich selbst vor dem Ertrinken,|indem du das Wasser einfrierst.|Angriff: Aktivieren/Deaktivieren|Hoch/Runter: Beim Feuern zielen
04:56=Du kannst zwei Hackebeile auf deinen Feind schleudern,|Passagen und Tunnel blockieren, und sie sogar zum Klettern benutzen!|Sei vorsichtig! Es ist gefährlich, mit Messern zu spielen.|Angriff: Gedrückt halten, um mit mehr Schwung zu werfen (zwei mal)
04:57=Bau einen SEHR elastischen Balken aus Gummi,|von dem Igel und andere Sachen abprallen,|ohne Fallschaden zu nehmen.|Links/Rechts: Ausrichtung des Gummis wählen|Cursor: Gummi platzieren
+04:58=Diese Annäherungsmine wird frei in der Luft schweben und|verfolgt törichte Igel, die dumm genug sind, ihr zu nahe zu|kommen. Allerdings ist ihre Explosion schwächer als|die der Landmine.|Angriff: Halten, um mit mehr Kraft zu werfen
; Game goal strings
05:00=Spielmodifikationen
@@ -654,18 +656,18 @@
05:02=Festungen: Verteidige deine Festung; vertreibe deine Feinde!
05:03=Niedrige Schwerkraft: Pass auf, wo du hintrittst
05:04=Unverwundbarkeit: Igel sind (so gut wie) unkaputtbar
-05:05=Vampirismus: Igel heilen sich um den von ihnen verursachten Schaden
+05:05=Vampirismus: Igel heilen sich um 80% von dem von ihnen verursachten Schaden
05:06=Karma: Igel leiden an dem von ihnen verursachten Schaden
-05:07=Schützt den König: Beschütze ihn um jeden Preis!|König platzieren: Wähle einen sicheren Startpunkt für deinen König
+05:07=Schützt den König: Lass deinen König nicht sterben!|König platzieren: Wähle einen sicheren Startpunkt für deinen König
05:08=Igel platzieren: Wähle vor dem Spielstart die Positionen deiner Igel
05:09=Artillerie: Deine Igel können nicht laufen
-05:10=Unzerstörbares Terrain: Explosionen zerstören den Boden nicht
+05:10=Unzerstörbares Terrain: Die meisten Waffen zerstören das Gelände nicht
05:11=Gemeinsames Arsenal: Alle Teams gleicher Farbe teilen sich ihr Arsenal
05:12=Minenzünder: Minen explodieren nach %1 Sekunde(n)
05:13=Minenzünder: Minen explodieren sofort
-05:14=Minenzünder: Minen explodieren nach 0–3 Sekunden
+05:14=Minenzünder: Minen explodieren nach 0–5 Sekunden
05:15=Prozentualer Schaden: Alle Waffen verursachen %1 % Schaden
-05:16=Lebenspunkte aller Igel werden am Ende jeder Runde zurückgesetzt
+05:16=Alle Igel werden am Ende der Zuges bis zum Anfangswert geheilt
05:17=Computergesteuerte Igel erscheinen nach dem Tod wieder
05:18=Unbegrenzte Attacken
05:19=Waffen werden am Ende jedes Zuges zurückgesetzt
--- a/share/hedgewars/Data/Locale/en.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/en.txt Fri Apr 01 15:36:19 2016 +0200
@@ -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
@@ -103,7 +104,6 @@
02:00=%1 has timed out!
02:00=%1 says peace out!
02:00=%1 will be fondly remembered!
-02:00=%1 has an aneurysm!
02:00=%1 leaves behind a wife and child
02:00=%1 has launched his last bazooka
02:00=%1 has tossed his last grenade
--- a/share/hedgewars/Data/Locale/fr.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/fr.lua Fri Apr 01 15:36:19 2016 +0200
@@ -7,8 +7,8 @@
-- ["011101001"] = "",
-- ["+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 anyone for a suicide"] = "-1 pour cause de suicide",
+ ["+2 for becoming a Mutant"] = "+2 pour être devenu un Mutant",
["30 minutes later..."] = "30 minutes plus tard...",
["About a month ago, a cyborg came and told us that you're the cannibals!"] = "Il y a un mois, un cyborg est venu et nous a dit que vous étiez des cannibales !",
["Accuracy Bonus!"] = "Bonus précision",
@@ -17,29 +17,29 @@
["A Classic Fairytale"] = "Un conte classique de fée",
["Actually, you aren't worthy of life! Take this..."] = "En fait, tu n'es pas digne de vivre ! Prends ça....",
["A cy-what?"] = "Un cy-quoi ?",
--- ["Advanced Repositioning Mode"] = "", -- Construction_Mode
+ ["Advanced Repositioning Mode"] = "Mode de repositionnement avancé"
["Adventurous"] = "Aventurier",
--- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy
--- ["Africa"] = "", -- Continental_supplies
+ ["a frenetic Hedgewars mini-game"] = "un mini-jeu frénétique d'HedgeWars", -- Frenzy
+ ["Africa"] = "Afrique", -- Continental_supplies
["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "Après que Grosse Fuite ait trahit sa tribu, il rejoignât les cannibales... ",
["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "Après le choc causé par l'espion ennemi, Grosse Fuite et Nuage Dense partirent chasser pour se détendre.",
["Again with the 'cannibals' thing!"] = "Encore avec votre 'cannibale' truc",
-- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode
--- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
+ ["a Hedgewars challenge"] = "un challenge d'Hegdewars", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
["a Hedgewars mini-game"] = "Un mini jeux d'Hedgewars", -- Space_Invasion, The_Specialists
-- ["a Hedgewars tag game"] = "", -- Mutant
--- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome
+ ["AHHh, home sweet home. Made it in %d seconds."] = "AHHh qu'il est bon d'être à la maison. Fait en %d secondes.", -- ClimbHome
["Aiming Practice"] = "Entraînement de tir", --Bazooka, Shotgun, SniperRifle
--- ["Air Attack"] = "", -- Construction_Mode
- ["A leap in a leap"] = "Un bond dans un bond",
+ ["Air Attack"] = "Attaque Aérienne", -- Construction_Mode
+ ["A leap in a leap"] = "Un bond dans un bond",
["A little gift from the cyborgs"] = "Un petit cadeau de la part des cyborgs",
["All gone...everything!"] = "Évaporé...plus rien !",
--- ["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 free teleportation between other nodes."] = "Autorise gratuitement une téléportation vers d'autres noeuds", -- Construction_Mode
+ ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "Autorise le placement de poutres, d'élastiques, de mines, de mines collantes et de tonneaux", -- Construction_Mode
+ ["Allows placement of structures."] = "Autorise le placement de structures", -- Construction_Mode
+ ["Allows the placement of weapons, utiliites, and health crates."] = "Autorise le placement d'armes, d'utilitaires et de caisse de soin", -- Construction_Mode
["All right, we just need to get to the other side of the island!"] = "Très bien, nous devons juste rejoindre l'autre côté de l'île !",
--- ["All walls touched!"] = "", -- WxW
+ ["All walls touched!"] = "Tous les murs sont touchés", -- WxW
["Ammo Depleted!"] = "Munitions épuisées !",
["ammo extended!"] = "Munitions en plus !",
["Ammo is reset at the end of your turn."] = "Les munitions sont réinitialisées à la fin du tour",
@@ -54,53 +54,53 @@
["And you believed me? Oh, god, that's cute!"] = "Et tu m'as cru ? Oh mon dieu, c'est mignon !",
-- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies
--- ["Antarctica"] = "", -- Continental_supplies
+ ["Antarctica"] = "Antarctique", -- Continental_supplies
-- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies
--- ["Area"] = "", -- Continental_supplies
+ ["Area"] = "Zone", -- Continental_supplies
["Are we there yet?"] = "Sommes-nous toujours là ?",
["Are you accusing me of something?"] = "Es-tu en train de m'accuser de quelque chose ? ",
["Are you saying that many of us have died for your entertainment?"] = "Vous dites que beaucoup d'entre nous sont morts pour votre divertissement ? ",
--- ["Artur Detour"] = "",
+ ["Artur Detour"] = "Arthur Detour",
["As a reward for your performance, here's some new technology!"] = "Comme récompense, voici une nouvelle technologie !",
-- ["a shoppa minigame"] = "", -- WxW
--- ["Asia"] = "", -- Continental_supplies
--- ["Assault Team"] = "",
+ ["Asia"] = "Asie", -- Continental_supplies
+ ["Assault Team"] = "Equipe d'assault",
["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "Vu que les munitions sont éparpillées tu devrais relancer le grappin en plein vol",
["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "Comme le défi était accompli, Grosse Fuite posa les pieds sur le sol...",
["As you can see, there is no way to get on the other side!"] = "Comme tu peux le voir, il n'y a pas de moyen d'atteindre l'autre côté !",
--- ["Attack From Rope"] = "", -- WxW
--- ["Australia"] = "", -- Continental_supplies
- ["Available points remaining: "] = "Points restant disponibles", -- need the situation of when this sentence is used
+ ["Attack From Rope"] = "Attaquer d'une corde", -- WxW
+ ["Australia"] = "Australie", -- Continental_supplies
+ ["Available points remaining: "] = "Points restants disponibles", -- need the situation of when this sentence is used
-- ["Back Breaker"] = "",
["Back in the village, after telling the villagers about the threat..."] = "De retour au village, après avoir averti les villageois de la menace...",
-- ["[Backspace]"] = "effacement arrière", --maybe the original name is better...
["Backstab"] = "Coup de poignard dans le dos",
--- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape
+ ["Bad Team"] = "Mauvaise équipe", -- User_Mission_-_The_Great_Escape
-- ["Ballgun"] = "", -- Construction_Mode
-- ["Bamboo Thicket"] = "", --really, i don't know the good translation for this
- ["Barrel Eater!"] = "Mangeur de barrils",
- ["Barrel Launcher"] = "Lanceur de barrils", --need the situation for me to understand sens of sentence
--- ["Barrel Placement Mode"] = "", -- Construction_Mode
--- ["Baseball Bat"] = "", -- Construction_Mode
+ ["Barrel Eater!"] = "Mangeur de barile",
+ ["Barrel Launcher"] = "Lanceur de barile", --need the situation for me to understand sens of sentence
+ ["Barrel Placement Mode"] = "Mode de placement de barile", -- Construction_Mode
+ ["Baseball Bat"] = "Batte de Baseball", -- Construction_Mode
-- ["Baseballbat"] = "", -- Continental_supplies
["Bat balls at your enemies and|push them into the sea!"] = "Frappez vos ennemis à la batte|et envoyez-les à la mer !",
["Bat your opponents through the|baskets and out of the map!"] = "Frappez vos ennemis à la batte|, marquez des paniers ou envoyez-les à la mer !",
-- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02
["Bazooka Training"] = "Entraînement au Bazooka",
-- ["Beep Loopers"] = "",
- ["Best laps per team: "] = "Meilleur temps par équipe",
--- ["Best Team Times: "] = "",
- ["Beware, though! If you are slow, you die!"] = "Attention tout de même ! si tu es lent, tu meurt !",
--- ["Bio-Filter"] = "", -- Construction_Mode
+ ["Best laps per team: "] = "Meilleurs tours par équipe",
+ ["Best Team Times: "] = "Meilleurs temps d'équipe",
+ ["Beware, though! If you are slow, you die!"] = "Attention tout de même ! Si tu es lent, tu meurs !",
+ ["Bio-Filter"] = "Filtre Biologique", -- Construction_Mode
-- ["Biomechanic Team"] = "",
-- ["Birdy"] = "", -- Construction_Mode
--- ["Blender"] = "",
+ ["Blender"] = "Mixeur",
-- ["Bloodpie"] = "",
-- ["Bloodrocutor"] = "",
--- ["Bloodsucker"] = "",
+ ["Bloodsucker"] = "Sangsue",
["Bloody Rookies"] = "Nouvelles recrues", -- 01#Boot_Çamp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
--- ["Blowtorch"] = "", -- Construction_Mode, Frenzy
--- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
+ ["Blowtorch"] = "Chalumeau", -- Construction_Mode, Frenzy
+ ["Blue Team"] = "Team Bleue", -- User_Mission_-_Dangerous_Ducklings
-- ["Bone Jackson"] = "",
["Bonely"] = "Bonely",
-- ["BOOM!"] = "",
@@ -114,7 +114,7 @@
-- ["Brain Teaser"] = "",
-- ["Brutal Lily"] = "",
-- ["Brutus"] = "",
--- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode
+ ["Build a fortress and destroy your enemy."] = "Cronstruit une forteresse et décime ton ennemi", -- Construction_Mode
["Build a track and race."] = "Construisez un parcours et faites la course.",
["Bullseye"] = "Dans le mille",
["But it proved to be no easy task!"] = "Mais cela ne s'avéra pas être une tâche facile !",
@@ -125,74 +125,74 @@
["But why would they help us?"] = "Mais pourquoi nous aideraient-ils ? ",
["But you're cannibals. It's what you do."] = "Mais vous êtes cannibales. C'est ce que vous faites.",
["But you said you'd let her go!"] = "Mais vous aviez dit que vous la laisseriez partir !",
--- ["Cake"] = "", -- Construction_Mode
+ ["Cake"] = "Gâteau", -- Construction_Mode
["Çall me Beep! Well, 'cause I'm such a nice...person!"] = "Appelle-moi Beep ! Hum, parce que je suis du genre sympa !",
["Çannibals"] = "Çannibales",
["Çannibal Sentry"] = "Sentinelle cannibale",
["Çannibals?! You're the cannibals!"] = "Çannibales ? C'est vous les cannibales !",
["CAPTURE THE FLAG"] = "Çapturez le drapeau !",
["Çareless"] = "Imprudent",
--- ["Careless"] = "", -- User_Mission_-_That_Sinking_Feeling
+ ["Careless"] = "Imprudent", -- User_Mission_-_That_Sinking_Feeling
-- ["Çarol"] = "",
--- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge
+ ["CHALLENGE COMPLETE"] = "Challenge Réussi", -- User_Mission_-_RCPlane_Challenge
["Change Weapon"] = "Changez d'arme",
--- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity
+ ["changing range from %i%% to %i%% with period of %i msec"] = "modification de la portée de %i%% à %i%% à une période de %i msec", -- Gravity
["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..."] = "Choisis ton côté ! Si tu veux rejoindre l'étranger, marche vers lui. |Dans le cas contraire, éloigne toi de lui. Si tu décide de l'att...non laisse tomber...",
--- ["Cleaver"] = "", -- Construction_Mode
--- ["Cleaver Placement Mode"] = "", -- Construction_Mode
--- ["Climber"] = "", -- ClimbHome
+ ["Cleaver"] = "Couperet", -- Construction_Mode
+ ["Cleaver Placement Mode"] = "Mode de placement de couperet", -- Construction_Mode
+ ["Climber"] = "Escaladeur", -- ClimbHome
-- ["Climb Home"] = "", -- ClimbHome
-- ["Clowns"] = "", -- User_Mission_-_Nobody_Laugh
["Clumsy"] = "Maladroit",
--- ["Cluster Bomb"] = "", -- Construction_Mode
--- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb
--- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
+ ["Cluster Bomb"] = "Bombe à fragmentation", -- Construction_Mode
+ ["Cluster Bomb MASTER!"] = "Maitre de la bombe à fragmentation", -- Basic_Training_-_Cluster_Bomb
+ ["Cluster Bomb Training"] = "Entrainement à la bombe à fragmentation", -- Basic_Training_-_Cluster_Bomb
["Codename: Teamwork"] = "Nom de code : Travail d'équipe",
["Collateral Damage"] = "Dommages collatéraux",
["Collateral Damage II"] = "Dommages collatéraux II",
["Collect all the crates, but remember, our time in this life is limited!"] = "Collecte toutes les caisses mais souviens toi, notre temps dans cette vie est limité !",
--- ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
+ ["Collect or destroy all the health crates."] = "Récupère ou détruit toutes les caisses de soin", -- 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!"] = "Collecte les caisses à droite. |Astuce : sélectionne le grappin, [haut] ou [bas] pour viser, flèches directionnelles pour bouger. |Le grappin peut etre relancé en plein vol !",
["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "Collecte les caisses dans le temps imparti ! |Si tu rates, tu devras réessayer.",
["Come closer, so that your training may continue!"] = "Rapproche-toi, ainsi ton entraînement pourra continuer !",
-- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge
["Complete the track as fast as you can!"] = "Finissez la course aussi vite que possible !",
--- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge
--- ["Configuration accepted."] = "", -- WxW
--- ["Congratulations"] = "", -- Basic_Training_-_Rope
- ["Congratulations!"] = "Félicitations !",
--- ["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
+ ["COMPLETION TIME"] = "Temps d'achèvement", -- User_Mission_-_Rope_Knock_Challenge
+ ["Configuration accepted."] = "Configuration acceptée", -- WxW
+ ["Congratulations"] = "Félicitations", -- Basic_Training_-_Rope
+ ["Congratulations!"] = "Félicitations!",
+ ["Congratulations! You needed only half of time|to eliminate all targets."] = "Félicitations! Tu n'as eu besoin que de la moitié du temps pour éliminer toutes tes cibles.", -- Basic_Training_-_Cluster_Bomb
+ ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "Félicitations! Vous avez complété le tutoriel de la corde ! |- Tutoriel terminé en 10 secondes!", -- Basic_Training_-_Rope
["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Félicitations ! Vous avez éliminé toutes les cibles|dans le temps alloué.", --Bazooka, Shotgun, SniperRifle
--- ["CONSTRUCTION MODE"] = "", -- Construction_Mode
--- ["Construction Station"] = "", -- Construction_Mode
+ ["CONSTRUCTION MODE"] = "MODE DE CONSTRUCTION", -- Construction_Mode
+ ["Construction Station"] = "Station de construction", -- Construction_Mode
-- ["Continental supplies"] = "", -- Continental_supplies
["Control pillars to score points."] = "Contrôlez les piliers pour marquer des points",
--- ["Core"] = "", -- Construction_Mode
--- ["Corporationals"] = "",
+ ["Core"] = "Noyau", -- Construction_Mode
+ ["Corporationals"] = "Organismes",
-- ["Corpsemonger"] = "",
-- ["Corpse Thrower"] = "",
--- ["Cost"] = "", -- Construction_Mode
--- ["Crate Placement Tool"] = "", -- Construction_Mode
--- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
+ ["Cost"] = "Coût", -- Construction_Mode
+ ["Crate Placement Tool"] = "Outil de placement de caisse", -- Construction_Mode
+ ["Crates Left:"] = "Caisses restantes:", -- User_Mission_-_RCPlane_Challenge
-- ["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
+ ["Current setting is "] = "Le paramètre actuel est ", -- Gravity
["Cybernetic Empire"] = "Empire cybernétique",
["Cyborg. It's what the aliens call themselves."] = "Cyborg. C'est ainsi que s'appellent les aliens entre eux.",
-- ["Dahmer"] = "",
["DAMMIT, ROOKIE!"] = "Et merde, recrue",
["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "Et merde, recrue ! Dégage de ma tête !",
["Dangerous Ducklings"] = "Çanetons dangereux",
--- ["Deadweight"] = "poids mort/boulet",
--- ["Decrease"] = "", -- Continental_supplies
- ["Defeat the cannibals!|"] = "Bats les cannibales",
+ ["Deadweight"] = "poids mort",
+ ["Decrease"] = "Diminuer", -- Continental_supplies
+ ["Defeat the cannibals!|"] = "Décime les cannibales",
["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Bat les cannibales ! |Astuce Grenade : règles le compte à rebour avec [1-5], vises avec [haut]/[bas] et maintiens [Espace] pour la puissance",
["Defeat the cyborgs!"] = "Bats les cyborgs !",
--- ["Defend your core from the enemy."] = "", -- Construction_Mode
+ ["Defend your core from the enemy."] = "Prôtège ton noyau des ennemis", -- Construction_Mode
["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon sélection menu"] = "Défends toi ! |Conseil : Tu peux obtenir des astuces sur l'utilisation des armes en plaçant ta souris dessus dans le menu de sélection des armes",
--- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode
+ ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "Dématérialise les armes et l'équipement portés par les hedgehogs ennemis", -- Construction_Mode
["Demolition is fun!"] = "La démolition c'est marrant",
--- ["Dense Cloud"] = "",
+ ["Dense Cloud"] = "Nuage épais",
["Dense Cloud must have already told them everything..."] = "Nuage Dense leur a sûrement déjà tout raconté...",
-- ["Depleted Kamikaze!"] = "Kamikaze ... !",
-- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02
@@ -209,13 +209,13 @@
["Do not laugh, inexperienced one, for he speaks the truth!"] = "Ne ris pas le bleu, car il dit la vérité ! ",
["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "Ne laisses pas ses mots te distraire, petit scarabée ! Il te poignardera dès que tu auras le dos tourné !",
["Do the deed"] = "Accomplir l'acte",
- ["Double Kill!"] = "Double meurtre",
--- ["DOUBLE KILL"] = "", -- Mutant
+ ["Double Kill!"] = "Double meurtre !",
+ ["DOUBLE KILL"] = "DOUBLE MEURTRE", -- Mutant
["Do you have any idea how valuable grass is?"] = "Est-ce que vous avez une idée de la valeur de votre herbe ?",
["Do you think you're some kind of god?"] = "Vous vous prenez pour un genre de dieu ?",
["Dragon's Lair"] = "La tanière du dragon",
--- ["Drill Rocket"] = "", -- Construction_Mode
--- ["Drills"] = "",
+ ["Drill Rocket"] = "Missile forant", -- Construction_Mode
+ ["Drills"] = "Perce",
-- ["Drill Strike"] = "", -- Construction_Mode
["Drone Hunter!"] = "Chasseur de drône",
-- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies
@@ -228,22 +228,22 @@
["Dude, what's this place?!"] = "Mec, quel est cet endroit?",
["Dude, where are we?"] = "Mec, on est où ? ",
-- ["Dude, wow! I just had the weirdest high!"] = "",
--- ["Duration"] = "", -- Continental_supplies
--- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies
+ ["Duration"] = "Durée", -- Continental_supplies
+ ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "Tempête de sable: [Inflige 15 dégâts à tous les ennemis dans le cercle]", -- Continental_supplies
-- ["Dynamite"] = "", -- Construction_Mode
--- ["Each turn is only ONE SECOND!"] = "", -- Frenzy
+ ["Each turn is only ONE SECOND!"] = "Chaque tour dure seulement UNE SECONDE!", -- Frenzy
["Each turn you get 1-3 random weapons"] = "À chaque tour, tu as 1 à 3 armes aléatoires",
["Each turn you get one random weapon"] = "À chaque tour, tu as une arme aléatoire",
--- ["Eagle Eye"] = "",
+ ["Eagle Eye"] = "Oeil d'aigle",
-- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies
-- ["Ear Sniffer"] = "",
-- ["Elderbot"] = "",
--- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
+ ["Eliminate your captor."] = "Éliminez votre capteur", -- User_Mission_-_The_Great_Escape
["Eliminate all enemies"] = "Éliminez tous les ennemis",
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Éliminez toutes les cibles avant d'être à cours de temps.|Vos munitions sont illimitées pour cette mission.", --Bazooka, Shotgun, SniperRifle
--- ["Eliminate enemy hogs and take their weapons."] = "", -- Highlander
+ ["Eliminate enemy hogs and take their weapons."] = "Éliminez les hogs ennemis and prenez leurs armes.", -- Highlander
["Eliminate Poison before the time runs out"] = "Éliminez tout le Poison avant d'être à cours de temps.",
["Eliminate the Blue Team"] = "Éliminez l'équipe bleue",
["Eliminate the enemy before the time runs out"] = "Eliminez les ennemis avant que le temps ne soit épuisé", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
@@ -251,7 +251,7 @@
["Eliminate the enemy specialists."] = "Eliminez les spécialists ennemis",
["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "Éliminez l'unité 3378|- Résistance Futile doit survivre",
-- ["Elmo"] = "",
--- ["Energetic Engineer"] = "",
+ ["Energetic Engineer"] = "Ingénieur énergique",
["Enjoy the swim..."] = "Profitez du bain ...",
-- ["[Enter]"] = "",
-- ["Europe"] = "", -- Continental_supplies
@@ -260,42 +260,42 @@
["Every single time!"] = "À chaque fois !",
["Everything looks OK..."] = "Tout a l'air d'être OK ...",
["Exactly, man! That was my dream."] = "Exactement, mec ! C'était mon rêve.",
--- ["Extra Damage"] = "", -- Construction_Mode
--- ["Extra Time"] = "", -- Construction_Mode
- ["Eye Chewer"] = "Mâcheur d'oeilr",
+ ["Extra Damage"] = "Dégâts supplémentaires", -- Construction_Mode
+ ["Extra Time"] = "Temps Supplémentaire", -- Construction_Mode
+ ["Eye Chewer"] = "Mâcheur d'oeil",
["Family Reunion"] = "Réunion de famille ",
["Fastest lap: "] = "Meilleur tour : ",
["Feeble Resistance"] = "Résistance Futile",
-- ["Fell From Grace"] = "",
--- ["Fell From Heaven"] = "",
+ ["Fell From Heaven"] = "Est tombé du Ciel",
["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "Tombée de l'Enfer est la meilleure ! Tombée de l'Enfer est la meilleure !",
--- ["Femur Lover"] = "",
--- ["Fierce Competition!"] = "", -- Space_Invasion
--- ["Fiery Water"] = "",
--- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings
+ ["Femur Lover"] = "Amoureux du fémur",
+ ["Fierce Competition!"] = "Compétition féroce!", -- Space_Invasion
+ ["Fiery Water"] = "Eau bouillante",
+ ["Filthy Blue"] = "Bleu dégueulasse", -- User_Mission_-_Dangerous_Ducklings
["Find your tribe!|Cross the lake!"] = "Trouve ta tribue ! |Traverse le lac !",
["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "Finis ton entraînement ! |Astuce : Les animations peuvent être passées en appuyant sur la touche [Precise]",
--- ["Fire"] = "",
+ ["Fire"] = "Feu",
-- ["Fire a mine: [Does what it says ~ Çant be dropped close to an enemy ~ 1 sec]"] = "", -- Continental_supplies
["First aid kits?!"] = "Des kits de premiers secours ?!",
-- ["FIRST BLOOD MUTATES"] = "", -- Mutant
["First Blood"] = "Premier sang",
- ["First Steps"] = "Premiers pas",
+ ["First Steps"] = "Premiers pas",
["Flag captured!"] = "Drapeau capturé !",
["Flag respawned!"] = "Drapeau réapparu",
["Flag returned!"] = "Drapeau récupéré",
["Flags, and their home base will be placed where each team ends their first turn."] = "Les drapeaux et leur base seront placés là où chaque équipe finit son premier tour",
--- ["Flamer"] = "",
--- ["Flamethrower"] = "", -- Construction_Mode
--- ["Flaming Worm"] = "",
+ ["Flamer"] = "Flambeur",
+ ["Flamethrower"] = "Lance-flammes", -- Construction_Mode
+ ["Flaming Worm"] = "Ver flamboyant",
["Flesh for Brainz"] = "Flesh for Brainz",
--- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy
--- ["For improved features/stability, play 0.9.18+"] = "", -- WxW
+ ["Flying Saucer"] = "Soucoupe volante", -- Construction_Mode, Frenzy
+ ["For improved features/stability, play 0.9.18+"] = "Pour de meilleurs fonctionnalités/stabilité, jouez en 0.9.18+", -- WxW
["Free Dense Cloud and continue the mission!"] = "Libérez Nuage Dense et continuez la mission !",
-- ["Freezer"] = "", -- Construction_Mode
-- ["FRENZY"] = "", -- Frenzy
--- ["Friendly Fire!"] = "",
+ ["Friendly Fire!"] = "Feu allié!",
["fuel extended!"] = "Le plein d'essence !",
["GAME BEGUN!!!"] = "Le jeu a commencé !!!",
-- ["Game Modifiers: "] = "",
@@ -304,67 +304,67 @@
["Game? Was this a game to you?!"] = "Jeu ? Etait-ce un jeu pour vous ?!",
-- ["GasBomb"] = "", -- Continental_supplies
-- ["Gas Gargler"] = "",
--- ["General information"] = "", -- Continental_supplies
--- ["Generates power."] = "", -- Construction_Mode
--- ["Generator"] = "", -- Construction_Mode
+ ["General information"] = "Informations générales", -- Continental_supplies
+ ["Generates power."] = "Génère de l'énergie", -- Construction_Mode
+ ["Generator"] = "Générateur", -- Construction_Mode
["Get Dense Cloud out of the pit!"] = "Sortez Nuage Dense de la fosse",
["Get on over there and take him out!"] = "Viens par ici et débarrasse-toi de lui ! ",
["Get on the head of the mole"] = "Va sur la tête de la taupe",
--- ["Get out of there!"] = "", -- User_Mission_-_The_Great_Escape
+ ["Get out of there!"] = "Sors d'ici !", -- User_Mission_-_The_Great_Escape
["Get that crate!"] = "Prends cette caisse",
["Get the crate on the other side of the island!|"] = "Prends la caisse de l'autre côté de l'île !",
-- ["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
["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!"] = "Fais sortir tes coéquipiers de leur prison naturelle et sauve la princesse ! |Percer des trous résoudrait tout. |Ce serait une bonne idée de placer quelques poutres avant de commencer à percer. Moi j'dis ça mais j'dis rien. |Tous vos hérissons doivent être au dessus de la hauteur marquée ! | Grosse Fuite doit être très proche de la princesse ! ",
--- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge
+ ["GG!"] = "Bien joué!", -- User_Mission_-_Rope_Knock_Challenge
-- ["Gimme Bones"] = "",
-- ["Girder"] = "", -- Construction_Mode
-- ["Girder Placement Mode"] = "", -- Construction_Mode
-- ["Glark"] = "",
--- ["Goal"] = "",
--- ["GO! GO! GO!"] = "",
+ ["Goal"] = "But",
+ ["GO! GO! GO!"] = "Allez! Allez! Allez!",
["Good birdy......"] = "Gentil oiseau ...",
--- ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
+ ["Good Dude"] = "Bravo !", -- User_Mission_-_The_Great_Escape
["Good idea, they'll never find us there!"] = "Bonne idée, ils ne nous trouverons jamais là bas !",
["Good luck...or else!"] = "Bonne chance.... ou pas !",
["Good luck out there!"] = "Bonne chance pour sortir d'ici",
--- ["Good so far!"] = "",
--- ["Good to go!"] = "",
+ ["Good so far!"] = "Pas mal jusqu'ici!",
+ ["Good to go!"] = "C'est pret!",
["Go on top of the flower"] = "Atteins le dessus de la fleur",
["Go, quick!"] = "Va ! Vite !",
["Gorkij"] = "Gorkij",
--- ["Go surf!"] = "", -- WxW
--- ["GOTCHA!"] = "je t'ai eu !", is this good ?
+ ["Go surf!"] = "Va faire du surf", -- WxW
+ ["GOTCHA!"] = "je t'ai eu !",
["Grab Mines/Explosives"] = "Emparez vous des Mines/Explosifs",
--- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode
--- ["Gravity"] = "", -- Gravity
+ ["Grants nearby hogs life-regeneration."] = "Confère de la régénération de vie aux hogs proches", -- Construction_Mode
+ ["Gravity"] = "Gravité", -- Gravity
["Great choice, Steve! Mind if I call you that?"] = "Bon choix, Steve ! Ça t'ennuie si je t'appele comme ça ?",
--- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope
+ ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "Bien joué! Maintenant, fracasse le avec une batte de baseball ! Astuce: Tu peux changer d'arme avec un 'clique droit'!", -- Basic_Training_-_Rope
["Great! You will be contacted soon for assistance."] = "Super ! Tu seras bientot contacté pour de l'aide.",
-- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies
["Greetings, cloudy one!"] = "Salutation, le nuageux !",
["Greetings, "] = "Salutations, ",
-- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02
--- ["Grenade Training"] = "", -- Basic_Training_-_Grenade
+ ["Grenade Training"] = "Entrainement à la grenade", -- Basic_Training_-_Grenade
-- ["Grenadiers"] = "", -- Basic_Training_-_Grenade
["Guys, do you think there's more of them?"] = "Les gars, vous pensez qu'il y en a encore plus ?",
-- ["HAHA!"] = "",
-- ["Haha!"] = "",
-- ["Hahahaha!"] = "",
["Haha, now THAT would be something!"] = "Haha, maintenant ÇA, ça va être quelquechose !",
--- ["Hammer"] = "", -- Construction_Mode, Continental_supplies
+ ["Hammer"] = "Marteau", -- Construction_Mode, Continental_supplies
["Hannibal"] = "Hannibal",
-- ["Hapless Hogs"] = "",
-- [" Hapless Hogs left!"] = "",
--- [" HAS MUTATED"] = "", -- Mutant
+ [" HAS MUTATED"] = " a muté", -- Mutant
-- ["Hatless Jerry"] = "",
["Have no illusions, your tribe is dead, indifferent of your choice."] = "N'aies pas d'illusion, ta tribue est morte, quel que soit ton choix",
["Have we ever attacked you first?"] = "Avons-nous jamais attaqué en premier ? ",
--- ["Healing Station"] = "", -- Construction_Mode
--- ["Health Crate Placement Mode"] = "", -- Construction_Mode
+ ["Healing Station"] = "Station de soignement", -- Construction_Mode
+ ["Health Crate Placement Mode"] = "Mode de placement de caisse de soin", -- Construction_Mode
["Health crates extend your time."] = "Les caisses de vie augmentent votre temps.",
--- ["Heavy"] = "",
+ ["Heavy"] = "Lourd",
-- ["Heavy Çannfantry"] = "",
-- ["Hedge-cogs"] = "",
-- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
@@ -373,7 +373,7 @@
-- ["Hedgewars-Knockball"] = "",
-- ["Hedgibal Lecter"] = "",
["Heh, it's not that bad."] = "Hé, c'est pas si mal.",
--- ["Hellish Handgrenade"] = "", -- Construction_Mode
+ ["Hellish Handgrenade"] = "Grenade de la mort", -- Construction_Mode
["Hello again, "] = "Re-bonjour,",
["Help me, Leaks!"] = "Aide moi, Fuite !",
["Help me, please!!!"] = "Aide moi, s'il te plaît !!!",
@@ -382,11 +382,11 @@
["He must be in the village already."] = "Il doit déjà être au village",
["Here, let me help you!"] = "Laissez-moi vous aider !",
["Here, let me help you save her!"] = "Laissez-moi vous aider à la sauver !",
- ["Here...pick your weapon!"] = "Ici...choisis ton arme !",
--- ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
+ ["Here...pick your weapon!"] = "Ici...prend ton arme !",
+ ["Hero Team"] = "Equipe de héros", -- User_Mission_-_The_Great_Escape
["He's so brave..."] = "Il est si courageux",
["He won't be selling us out anymore!"] = "Il ne nous vendra plus !",
--- ["Hey, guys!"] = "",
+ ["Hey, guys!"] = "Salut les gars",
["Hey guys!"] = "Salut les gars !",
["Hey! This is cheating!"] = "Hé ! C'est de la triche !",
-- ["HIGHLANDER"] = "", -- Highlander
@@ -399,13 +399,13 @@
-- ["Hit Combo!"] = "",
-- ["Hmmm..."] = "",
["Hmmm...actually...I didn't either."] = "Humm... en fait...je ne savais pas non plus.",
--- ["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..."] = "Hmmm, je vais devoir trouver un moyen de le faire partir de la plateforme anti-portail", -- portal
["Hmmm...it's a draw. How unfortunate!"] = "Hmmm... C'est un ex-aequo. Pas de chance !",
["Hmmm...perhaps a little more time will help."] = "Humm...Peut être qu'un peu plus de temps aiderait",
-- ["Hogminator"] = "",
--- ["Hogs in sight!"] = "", -- Continental_supplies
--- ["HOLY SHYTE!"] = "", -- Mutant
--- ["Homing Bee"] = "", -- Construction_Mode
+ ["Hogs in sight!"] = "Hogs en vue !", -- Continental_supplies
+ ["HOLY SHYTE!"] = "Mère de dieu !", -- Mutant
+ ["Homing Bee"] = "Abeille téléguidée", -- Construction_Mode
-- ["Honest Lee"] = "",
["Hooray!"] = "Hourra ! ",
["Hostage Situation"] = "Situation d'otage",
@@ -426,7 +426,7 @@
["I could just teleport myself there..."] = "Je pourrais juste me téléporter là-bas...",
["I'd better get going myself."] = "Je ferais mieux de rentrer.",
["I didn't until about a month ago."] = "Je ne savais pas jusqu'à il y a un mois",
--- ["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!"] = "Je ne sais pas comment tu as fait ca... Mais bravo ! Le prochain devrai être facile!", -- Basic_Training_-_Rope
["I feel something...a place! They will arrive near the circles!"] = "Je sens quelque chose... une localisation ! Ils vont arriver près des cercles !",
["If only I had a way..."] = "Si seulement j'avais un moyen...",
["If only I were given a chance to explain my being here..."] = "Si seulement vous me laissiez une chance d'expliquer ce que je fais ici...",
@@ -444,9 +444,9 @@
["I have no idea where that mole disappeared...Çan you see it?"] = "Je n'ai aucune idée où cette taupe a bien pu aller... Peux-tu la voir ?",
["I have to follow that alien."] = "Je dois suivre cet extraterrestre",
["I have to get back to the village!"] = "Je dois retourner au village !",
- ["I hope you are prepared for a small challenge, young one."] = "J'espere que tu es préparé pour un petit défi, petit scarabée",
- ["I just don't want to sink to your level."] = "Je ne veux pas m'abaisser à votre niveau.",
- ["I just found out that they have captured your princess!"] = "Je viens de m'apercevoir qu'ils ont capturé votre princesse !",
+ ["I hope you are prepared for a small challenge, young one."] = "J'espère que tu es préparé pour un petit défi, petit scarabée",
+ ["I just don't want to sink to your level."] = "Je ne veux pas m'abaisser à ton niveau.",
+ ["I just found out that they have captured your princess!"] = "Je viens de m'apercevoir qu'ils ont capturé ta princesse !",
["I just wonder where Ramon and Spiky disappeared..."] = "Je me demande seulement où Ramon et Spiky ont disparu",
["I'll hold them off while you return to the village!"] = "Je vais les retenir pendant que tu retournes au village",
["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "Imagines que ces cibles sont les loups qui ont tués tes parents ! Défoule ta colère sur eux !",
@@ -461,7 +461,7 @@
["I'm not sure about that!"] = "Je n'en suis pas si sûr !",
["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "Impressionnant...tu es aussi sec que le cadavre d'un faucon après une semaine dans le désert...",
["I'm so scared!"] = "J'ai tellement peur !",
--- ["Increase"] = "", -- Continental_supplies
+ ["Increase"] = "Augmente", -- Continental_supplies
["Incredible..."] = "Incroyable...",
["I need to find the others!"] = "Je dois trouver les autres !",
["I need to get to the other side of this island, fast!"] = "Je dois aller sur l'autre côté de cette île, rapidemment !",
@@ -470,7 +470,7 @@
["I need to warn the others."] = "Je dois avertir les autres.",
["In fact, you are the only one that's been acting strangely."] = "En fait, tu es le seul qui ait agi étrangement.",
["In order to get to the other side, you need to collect the crates first.|"] = "Dans le but d'atteindre l'autre coté, tu dois d'abord collecter les caisses ",
--- ["INSANITY"] = "", -- Mutant
+ ["INSANITY"] = "FOLIE", -- Mutant
["Instructor"] = "Instructeur", -- 01#Boot_Çamp, User_Mission_-_Dangerous_Ducklings
["Interesting idea, haha!"] = "Idee intéressante, haha !",
["Interesting! Last time you said you killed a cannibal!"] = "Intéressant ! La dernière fois tu as dit que tu avais tué un cannibale !",
@@ -521,18 +521,18 @@
["Just wait till I get my hands on that trauma! ARGH!"] = "Attends un peu que je mette la main sur ce traumatisme ! ARGH !",
-- ["Kamikaze"] = "", -- Construction_Mode
-- ["Kamikaze Expert!"] = "",
--- ["Keep it up!"] = "",
+ ["Keep it up!"] = "Continue !",
-- ["Kerguelen"] = "", -- Continental_supplies
["Killing spree!"] = "Massacre",
["KILL IT!"] = "TUE LE !",
["KILLS"] = "Meurtres",
--- ["Kill the aliens!"] = "",
+ ["Kill the aliens!"] = "Tue les aliens !",
["Kill the cannibal!"] = "Tue le cannibale !",
["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "Tue le traître... ou épargne sa vie ! |Tue le ou appuie sur [Precise] !",
-- ["Land Sprayer"] = "", -- Construction_Mode
--- ["Laser Sight"] = "", -- Construction_Mode
+ ["Laser Sight"] = "Visée laser", -- Construction_Mode
["Last Target!"] = "Dernière cible !",
--- ["Leader"] = "",
+ ["Leader"] = "Chef",
-- ["Leaderbot"] = "",
-- ["Leaks A Lot"] = "",
["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "Grosse Fuite, déprimé d'avoir tué l'élue de son coeur, échoua à sauver le village...",
@@ -557,18 +557,18 @@
-- ["Lively Lifeguard"] = "",
-- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- Continental_supplies
--- ["Lonely Hog"] = "", -- ClimbHome
+ ["Lonely Hog"] = "Hog tout seul", -- ClimbHome
["Look, I had no choice!"] = "Écoute, je n'avais pas le choix !",
["Look out! There's more of them!"] = "Regarde, il y en a encore plus !",
["Look out! We're surrounded by cannibals!"] = "Regarde ! Nous sommes entourés par les cannibales !",
["Looks like the whole world is falling apart!"] = "On dirait que le monde entier tombe en morceaux !",
--- ["Low Gravity"] = "", -- Construction_Mode, Frenzy
+ ["Low Gravity"] = "Peu de gravité", -- Construction_Mode, Frenzy
["Luckily, I've managed to snatch some of them."] = "Heureusement, j'ai réussi à en avoir quelques unes",
-- ["LUDICROUS KILL"] = "", -- Mutant
--- ["Made it!"] = "", -- ClimbHome
--- ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
+ ["Made it!"] = "Je l'ai fait !", -- ClimbHome
+ ["- Massive weapon bonus on first turn"] = "- Gros bonus d'arme au premier tour !", -- Continental_supplies
["May the spirits aid you in all your quests!"] = "Puissent les esprits t'aider dans tes quêtes !",
--- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies
+ ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "Soin: [Tire un kit de survie explosif qui soigne tous les hogs dans le rayon de l'explosion]", -- Continental_supplies
-- ["MEGA KILL"] = "", -- Mutant
-- ["Meiwes"] = "",
-- ["Mindy"] = "",
--- a/share/hedgewars/Data/Locale/hedgewars_ar.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_ar.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -464,6 +472,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -689,6 +704,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -722,6 +741,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1675,6 +1698,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2161,6 +2192,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2628,6 +2663,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2698,6 +2737,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3462,10 +3505,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3473,5 +3512,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_bg.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_bg.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -467,6 +475,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -692,6 +707,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -725,6 +744,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1694,6 +1717,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2196,6 +2227,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2664,6 +2699,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2738,6 +2777,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3502,10 +3545,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3513,5 +3552,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_cs.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_cs.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -473,6 +481,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -698,6 +713,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -731,6 +750,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1710,6 +1733,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2212,6 +2243,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2681,6 +2716,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Semínko</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2755,6 +2794,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3519,10 +3562,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3530,5 +3569,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_da.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_da.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -471,6 +479,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -696,6 +711,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -729,6 +748,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1698,6 +1721,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2204,6 +2235,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2672,6 +2707,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Spire</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2746,6 +2785,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3510,10 +3553,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3521,5 +3560,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_de.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_de.ts Fri Apr 01 15:36:19 2016 +0200
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.1" language="de">
+<TS version="2.0" language="de">
<context>
<name>About</name>
<message>
@@ -38,7 +38,7 @@
<name>BanDialog</name>
<message>
<location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="41"/>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>IP</source>
<translation>IP-Adresse</translation>
</message>
@@ -73,22 +73,27 @@
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="80"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="61"/>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="81"/>
<source>you know why</source>
<translation>du weißt schon, warum</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Warning</source>
<translation>Warnung</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Please, specify %1</source>
<translation>Bitte leg %1 fest</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>nickname</source>
<translation>Spitzname</translation>
</message>
@@ -109,17 +114,22 @@
<context>
<name>FeedbackDialog</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="63"/>
+ <source>Feedback</source>
+ <translation type="unfinished">Feedback</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="125"/>
<source>View</source>
<translation>Ansehen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="150"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="151"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="178"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="179"/>
<source>Send Feedback</source>
<translation>Feedback senden</translation>
</message>
@@ -128,7 +138,7 @@
<translation type="obsolete">Bitte gib uns Feedback!</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
<source>We are always happy about suggestions, ideas, or bug reports.</source>
<translation>Wir freuen uns immer über Vorschläge, Ideen oder Fehlerberichte.</translation>
</message>
@@ -141,17 +151,17 @@
<translation type="obsolete">Deine E-Mail-Adresse ist optional, aber wir könnten sie brauchen, um dich zu kontaktieren.</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="90"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
<source>Send us feedback!</source>
<translation>Schicke uns dein Feedback!</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
- <source>If you found a bug, you can see if it's already been reported here: </source>
- <translation>Falls du einen Fehler gefunden hast, kannst du hier sehen, ob er bereits bekannt is (auf Englisch):</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="93"/>
+ <source>If you found a bug, you can see if it's already been reported here: </source>
+ <translation>Falls du einen Fehler gefunden hast, kannst du hier sehen, ob er bereits bekannt is (auf Englisch):</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="94"/>
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>Deine E-Mail-Adresse ist optional, es sei denn du möchtest, dass wir dir antworten.</translation>
</message>
@@ -207,7 +217,7 @@
<context>
<name>GameUIConfig</name>
<message>
- <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="115"/>
+ <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="116"/>
<source>Guest</source>
<translation>Gast</translation>
</message>
@@ -265,12 +275,12 @@
<translation>Das Spielprofil »%1« wird nicht unterstützt</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="102"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="105"/>
<source>Cannot create directory %1</source>
<translation>Das Verzeichnis %1 konnte nicht angelegt werden</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="310"/>
<source>Failed to open data directory:
%1
@@ -281,62 +291,62 @@
Bitte überprüfe deine Installation!</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="138"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="141"/>
<source>Usage</source>
<comment>command-line</comment>
<translation>Verwendung</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="139"/>
- <source>OPTION</source>
- <comment>command-line</comment>
- <translation>SCHALTER</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="140"/>
- <location filename="../../../../QTfrontend/main.cpp" line="145"/>
- <source>CONNECTSTRING</source>
- <comment>command-line</comment>
- <translation>VERBINDUNGSTEXT</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="141"/>
- <source>Options</source>
- <comment>command-line</comment>
- <translation>Schalter</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/main.cpp" line="142"/>
- <source>Display this help</source>
+ <source>OPTION</source>
<comment>command-line</comment>
- <translation>Diese Hilfe anzeigen</translation>
+ <translation>SCHALTER</translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="143"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
+ <source>CONNECTSTRING</source>
+ <comment>command-line</comment>
+ <translation>VERBINDUNGSTEXT</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="144"/>
+ <source>Options</source>
+ <comment>command-line</comment>
+ <translation>Schalter</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="145"/>
+ <source>Display this help</source>
+ <comment>command-line</comment>
+ <translation>Diese Hilfe anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="146"/>
<source>Custom path for configuration data and user data</source>
<comment>command-line</comment>
<translation>Benutzerdefinierter Pfad für Konfigurations- und Benutzerdaten</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="144"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="147"/>
<source>Custom path to the game data folder</source>
<comment>command-line</comment>
<translation>Benutzerdefinierter Pfad für das Spieldatenverzeichnis</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="145"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
<source>Hedgewars can use a %1 (e.g. "%2") to connect on start.</source>
<comment>command-line</comment>
<translation>Hedgewars kann ein %1 (z.B. »%2«) verwenden, um beim Start zu verbinden.</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="191"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="196"/>
<source>Malformed option argument: %1</source>
<comment>command-line</comment>
<translation>Fehlerhaftes Schalterargument: %1</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="231"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="236"/>
<source>Unknown option argument: %1</source>
<comment>command-line</comment>
<translation>Unbekannter Schalter: %1</translation>
@@ -578,18 +588,18 @@
<context>
<name>HWGame</name>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="399"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="386"/>
<location filename="../../../../QTfrontend/net/recorder.cpp" line="113"/>
<source>en.txt</source>
<translation>de.txt</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="449"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="436"/>
<source>Cannot open demofile %1</source>
<translation>Wiederholungsdatei »%1« konnte nicht geöffnet werden</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="256"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="255"/>
<source>A Fatal ERROR occured! - The game engine had to stop.
We are very sorry for the inconvenience :(
@@ -609,6 +619,14 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="66"/>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="203"/>
@@ -927,17 +945,22 @@
<context>
<name>HatPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="119"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="63"/>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="120"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="123"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="124"/>
<source>Use selected hat</source>
<translation>Gewählten Hut auswählen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="83"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="84"/>
<source>Search for a hat:</source>
<translation>Nach einem Hut suchen:</translation>
</message>
@@ -973,27 +996,27 @@
<translation type="obsolete">%1 Bilder pro Sekunde, </translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="314"/>
<source>Audio: </source>
<translation>Audio: </translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="309"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="318"/>
<source>unknown</source>
<translation>unbekannt</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="285"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="294"/>
<source>Duration: %1m %2s</source>
<translation>Dauer: %1m %2s</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="297"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="306"/>
<source>Video: %1x%2</source>
<translation>Video: %1x%2</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="301"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="310"/>
<source>%1 fps</source>
<translation>%1 Hz</translation>
</message>
@@ -2683,7 +2706,7 @@
<translation>Tags (durch Kommas getrennt): </translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="136"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="137"/>
<source>Description</source>
<translation>Beschreibung</translation>
</message>
@@ -2738,22 +2761,22 @@
<translation>Fenster-Auflösung</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="103"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="104"/>
<source>Your Email</source>
<translation>Deine E-Mail-Adresse</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="111"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="112"/>
<source>Summary</source>
<translation>Zusammenfassung</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="121"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="122"/>
<source>Send system information</source>
<translation>Systeminformation senden</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="164"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="165"/>
<source>Type the security code:</source>
<translation>Gib den Sicherheitscode ein:</translation>
</message>
@@ -2884,14 +2907,14 @@
<translation>Server konnte nicht gestartet werden</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="349"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="350"/>
<location filename="../../../../QTfrontend/util/MessageDialog.cpp" line="26"/>
<source>Hedgewars - Error</source>
<translation>Hedgewars – Fehler</translation>
</message>
<message>
<location filename="../../../../QTfrontend/hwform.cpp" line="2028"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="436"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="437"/>
<source>Hedgewars - Success</source>
<translation>Hedgewars – Erfolg</translation>
</message>
@@ -3097,23 +3120,23 @@
<translation>Hedgewars – Spitzname nicht registriert</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="359"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="360"/>
<source>System Information Preview</source>
<translation>Systeminformations-Vorschau</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="374"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="385"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="375"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="386"/>
<source>Failed to generate captcha</source>
<translation>Captcha-Generierung fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="402"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="403"/>
<source>Failed to download captcha</source>
<translation>Captcha-Download fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="466"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="467"/>
<source>Please fill out all fields. Email is optional.</source>
<translation>Bitte füll alle Felder aus. Das Feld »E-Mail« ist optional.</translation>
</message>
@@ -3316,22 +3339,23 @@
<context>
<name>RoomNamePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="43"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="44"/>
<source>Enter a name for your room.</source>
<translation>Gib einen Namen für deinen Raum ein.</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="72"/>
- <source>Cancel</source>
- <translation>Abbrechen</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="73"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="35"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="74"/>
<source>Create room</source>
<translation>Raum erstellen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="56"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="57"/>
<source>set password</source>
<translation>Kennwort setzen</translation>
</message>
@@ -3407,22 +3431,27 @@
<context>
<name>SeedPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="42"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="34"/>
+ <source>Seed</source>
+ <translation type="unfinished">Seed</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="43"/>
<source>The map seed is the basis for all random values generated by the game.</source>
<translation>Der sog. Seed (wörtlich übersetzt: engl. für »Saat«) ist die Basis für alle Zufallswerte, die vom Spiel generiert werden.</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="61"/>
- <source>Cancel</source>
- <translation>Abbrechen</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="62"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="63"/>
<source>Set seed</source>
<translation>Seed setzen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="76"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="77"/>
<source>Close</source>
<translation>Schließen</translation>
</message>
@@ -3516,17 +3545,22 @@
<context>
<name>ThemePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="120"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="121"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="84"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="85"/>
<source>Search for a theme:</source>
<translation>Nach einer Szenerie suchen:</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="64"/>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="125"/>
<source>Use selected theme</source>
<translation>Ausgewählte Szenerie benutzen</translation>
</message>
@@ -3880,39 +3914,39 @@
<context>
<name>binds (keys)</name>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="134"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="133"/>
<source>Axis</source>
<translation>Achse</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="138"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="153"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="137"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="152"/>
<source>(Up)</source>
<translation>(Hoch)</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="142"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="157"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="141"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="156"/>
<source>(Down)</source>
<translation>(Runter)</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="149"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="148"/>
<source>Hat</source>
<translation>Cooliehat</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="161"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="160"/>
<source>(Left)</source>
<translation>(Links)</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="165"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="164"/>
<source>(Right)</source>
<translation>(Rechts)</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="173"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="172"/>
<source>Button</source>
<translation>Taste</translation>
</message>
@@ -4280,280 +4314,279 @@
<context>
<name>server</name>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
<source>Authentication failed</source>
<translation>Authentifizierung fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
- <source>60 seconds cooldown after kick</source>
- <translation>60 Sekunden Abkühlzeit nach Hinauswurf</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
- <source>kicked</source>
- <translation>hinausgeworfen</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="17"/>
- <source>Ping timeout</source>
- <translation>Ping-Timeout</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="18"/>
- <source>bye</source>
- <translation>tschüss</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
- <source>Your vote counted</source>
- <translation>Deine Stimme zählte</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
- <source>Pause toggled</source>
- <translation>Pause umgeschaltet</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="29"/>
- <source>new seed</source>
- <translation>Neuer Seed</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="30"/>
- <source>number of hedgehogs in team</source>
- <translation>Anzahl der Igel im Team</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
- <source>Empty config entry</source>
- <translation>Leerer Konfigurations-Eintrag</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
- <source>Corrupted hedgehogs info</source>
- <translation>Kaputte Igel-Info</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/servermessages.h" line="41"/>
- <source>too many teams</source>
- <translation>zu viele Teams</translation>
+ <source>60 seconds cooldown after kick</source>
+ <translation>60 Sekunden Abkühlzeit nach Hinauswurf</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="42"/>
- <source>too many hedgehogs</source>
- <translation>zu viele Igel</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="43"/>
- <source>There's already a team with same name in the list</source>
- <translation>Es gibt bereits ein Team mit dem selben Namen in der Liste</translation>
+ <source>kicked</source>
+ <translation>hinausgeworfen</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="44"/>
- <source>round in progress</source>
- <translation>laufende Runde</translation>
+ <source>Ping timeout</source>
+ <translation>Ping-Timeout</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="45"/>
+ <source>bye</source>
+ <translation>tschüss</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="3"/>
+ <source>Your vote counted</source>
+ <translation>Deine Stimme zählte</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="5"/>
+ <source>Pause toggled</source>
+ <translation>Pause umgeschaltet</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
+ <source>new seed</source>
+ <translation>Neuer Seed</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
+ <source>number of hedgehogs in team</source>
+ <translation>Anzahl der Igel im Team</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
+ <source>Empty config entry</source>
+ <translation>Leerer Konfigurations-Eintrag</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="17"/>
+ <source>Corrupted hedgehogs info</source>
+ <translation>Kaputte Igel-Info</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="18"/>
+ <source>too many teams</source>
+ <translation>zu viele Teams</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="19"/>
+ <source>too many hedgehogs</source>
+ <translation>zu viele Igel</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="20"/>
+ <source>There's already a team with same name in the list</source>
+ <translation>Es gibt bereits ein Team mit dem selben Namen in der Liste</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
+ <source>round in progress</source>
+ <translation>laufende Runde</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
<source>restricted</source>
<translation>eingeschränkt</translation>
</message>
<message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+ <source>REMOVE_TEAM: no such team</source>
+ <translation>REMOVE_TEAM: kein solches Team</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
+ <source>Not team owner!</source>
+ <translation>Nicht Team-Besitzer*In!</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
+ <source>Less than two clans!</source>
+ <translation>Weniger als zwei Klans!</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="26"/>
+ <source>Room with such name already exists</source>
+ <translation>ein Raum mit einem solchen Namen existiert bereits</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="27"/>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation>/maxteams: Zahl zwischen 2 und 8 wählen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="28"/>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation>Verfügbare »callvote«-Befehle: kick <Spitzname>, map <Name>, pause, newseed, hedgehogs</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="29"/>
+ <source>callvote kick: specify nickname</source>
+ <translation>callvote kick: Spitznamen festlegen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="30"/>
+ <source>callvote kick: no such user</source>
+ <translation>callvote kick: Benutzer existiert nicht</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="31"/>
+ <source>callvote map: no such map</source>
+ <translation>callvote map: Karte existiert nicht</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="32"/>
+ <source>callvote pause: no game in progress</source>
+ <translation>callvote pause: es läuft kein Spiel</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation>callvote hedgehogs: Zahl zwischen 1 und 8 wählen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
+ <source>Illegal room name</source>
+ <translation>Verbotener Raumname</translation>
+ </message>
+ <message>
<location filename="../../../../QTfrontend/servermessages.h" line="46"/>
- <source>REMOVE_TEAM: no such team</source>
- <translation>REMOVE_TEAM: kein solches Team</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
- <source>Not team owner!</source>
- <translation>Nicht Team-Besitzer*In!</translation>
+ <source>No such room</source>
+ <translation>Ein solcher Raum existiert nicht</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
+ <source>Joining restricted</source>
+ <translation>Zutritt verboten</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
+ <source>Registered users only</source>
+ <translation>Nur für registrierte Benutzer</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
+ <source>You are banned in this room</source>
+ <translation>Du wurdest aus diesem Raum verbannt</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
+ <source>Nickname already chosen</source>
+ <translation>Spitzname bereits gewählt</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="35"/>
+ <source>Illegal nickname</source>
+ <translation>Verbotener Spitzname</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="36"/>
- <source>Less than two clans!</source>
- <translation>Weniger als zwei Klans!</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
- <source>Room with such name already exists</source>
- <translation>ein Raum mit einem solchen Namen existiert bereits</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
- <source>/maxteams: specify number from 2 to 8</source>
- <translation>/maxteams: Zahl zwischen 2 und 8 wählen</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
- <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
- <translation>Verfügbare »callvote«-Befehle: kick <Spitzname>, map <Name>, pause, newseed, hedgehogs</translation>
+ <source>Protocol already known</source>
+ <translation>Protokoll bereits bekannt</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
+ <source>Bad number</source>
+ <translation>Schlechte Zahl</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
+ <source>Nickname is already in use</source>
+ <translation>Spitzname bereits in Benutzung</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
+ <source>Restricted</source>
+ <translation>Eingeschränkt</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="16"/>
+ <source>Not room master</source>
+ <translation>Nicht Gastgeber</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="39"/>
+ <source>No checker rights</source>
+ <translation>Keine Rechte zum Benutzen des Inspektionshilfsprogramms</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
+ <source>Room version incompatible to your hedgewars version</source>
+ <translation>Die Raumversion ist inkompatibel zu deiner Hedgewars-Version</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="2"/>
+ <source>You already have voted</source>
+ <translation>Du hast bereits deine Stimme abgegeben</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="4"/>
+ <source>Voting closed</source>
+ <translation>Abstimmung abgeschlossen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="6"/>
+ <source>New voting started</source>
+ <translation>Neue Abstimmung gestartet</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="7"/>
+ <source>Voting expired</source>
+ <translation>Abstimmung abgelaufen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="8"/>
+ <source>kick</source>
+ <translation>hinauswerfen</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
+ <source>map</source>
+ <translation>Karte</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
+ <source>pause</source>
+ <translation>pausieren</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="43"/>
+ <source>Reconnected too fast</source>
+ <translation>Zu schnell wieder verbunden</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="51"/>
- <source>callvote kick: specify nickname</source>
- <translation>callvote kick: Spitznamen festlegen</translation>
+ <source>Warning! Chat flood protection activated</source>
+ <translatorcomment>Nicht jeder weiß, was »Flooding« heißt, daher ist die Übersetzung etwas ausführlicher.</translatorcomment>
+ <translation>Achtung! Chat-Flood-Schutz ist aktiv. Bitte red etwas langsamer.</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="52"/>
- <source>callvote kick: no such user</source>
- <translation>callvote kick: Benutzer existiert nicht</translation>
+ <source>Excess flood</source>
+ <translatorcomment>Nicht jeder weiß, was »Flooding« heißt, daher wird es hier umschrieben.</translatorcomment>
+ <translation>Zu viele Nachrichten in kurzer Zeit abgeschickt</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="53"/>
- <source>callvote map: no such map</source>
- <translation>callvote map: Karte existiert nicht</translation>
+ <source>Game messages flood detected - 1</source>
+ <translation>Zu viele Spielnachrichten in kurzer Zeit ermittelt – 1</translation>
+ </message>
+ <message>
+ <source>Game messages flood detected - 2</source>
+ <translation type="obsolete">Zu viele Spielnachrichten in kurzer Zeit ermittelt – 2</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="54"/>
- <source>callvote pause: no game in progress</source>
- <translation>callvote pause: es läuft kein Spiel</translation>
+ <source>Warning! Joins flood protection activated</source>
+ <translatorcomment>Nicht jeder weiß, was »Flooding« heißt, daher ist die Übersetzung etwas ausführlicher und umschreibend.</translatorcomment>
+ <translation>Achtung! Der Server wird ein zu schnelles Beitreten in kurzer Zeit nicht akzeptieren</translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="55"/>
- <source>callvote hedgehogs: specify number from 1 to 8</source>
- <translation>callvote hedgehogs: Zahl zwischen 1 und 8 wählen</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="56"/>
- <source>Illegal room name</source>
- <translation>Verbotener Raumname</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="2"/>
- <source>No such room</source>
- <translation>Ein solcher Raum existiert nicht</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="4"/>
- <source>Joining restricted</source>
- <translation>Zutritt verboten</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="5"/>
- <source>Registered users only</source>
- <translation>Nur für registrierte Benutzer</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="6"/>
- <source>You are banned in this room</source>
- <translation>Du wurdest aus diesem Raum verbannt</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="7"/>
- <source>Nickname already chosen</source>
- <translation>Spitzname bereits gewählt</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="8"/>
- <source>Illegal nickname</source>
- <translation>Verbotener Spitzname</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
- <source>Protocol already known</source>
- <translation>Protokoll bereits bekannt</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
- <source>Bad number</source>
- <translation>Schlechte Zahl</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
- <source>Nickname is already in use</source>
- <translation>Spitzname bereits in Benutzung</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
- <source>Restricted</source>
- <translation>Eingeschränkt</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="39"/>
- <source>Not room master</source>
- <translation>Nicht Gastgeber</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
- <source>No checker rights</source>
- <translation>Keine Rechte zum Benutzen des Inspektionshilfsprogramms</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="3"/>
- <source>Room version incompatible to your hedgewars version</source>
- <translation>Die Raumversion ist inkompatibel zu deiner Hedgewars-Version</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="20"/>
- <source>You already have voted</source>
- <translation>Du hast bereits deine Stimme abgegeben</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
- <source>Voting closed</source>
- <translation>Abstimmung abgeschlossen</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
- <source>New voting started</source>
- <translation>Neue Abstimmung gestartet</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
- <source>Voting expired</source>
- <translation>Abstimmung abgelaufen</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="26"/>
- <source>kick</source>
- <translation>hinauswerfen</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="27"/>
- <source>map</source>
- <translation>Karte</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="28"/>
- <source>pause</source>
- <translation>pausieren</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="16"/>
- <source>Reconnected too fast</source>
- <translation>Zu schnell wieder verbunden</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="31"/>
- <source>Warning! Chat flood protection activated</source>
- <translatorcomment>Nicht jeder weiß, was »Flooding« heißt, daher ist die Übersetzung etwas ausführlicher.</translatorcomment>
- <translation>Achtung! Chat-Flood-Schutz ist aktiv. Bitte red etwas langsamer.</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="32"/>
- <source>Excess flood</source>
- <translatorcomment>Nicht jeder weiß, was »Flooding« heißt, daher wird es hier umschrieben.</translatorcomment>
- <translation>Zu viele Nachrichten in kurzer Zeit abgeschickt</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
- <source>Game messages flood detected - 1</source>
- <translation>Zu viele Spielnachrichten in kurzer Zeit ermittelt – 1</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
- <source>Game messages flood detected - 2</source>
- <translation>Zu viele Spielnachrichten in kurzer Zeit ermittelt – 2</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="35"/>
- <source>Warning! Joins flood protection activated</source>
- <translatorcomment>Nicht jeder weiß, was »Flooding« heißt, daher ist die Übersetzung etwas ausführlicher und umschreibend.</translatorcomment>
- <translation>Achtung! Der Server wird ein zu schnelles Beitreten in kurzer Zeit nicht akzeptieren</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="19"/>
<source>There's no voting going on</source>
<translation>Zur Zeit findet keine Abstimmung statt</translation>
</message>
--- a/share/hedgewars/Data/Locale/hedgewars_el.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_el.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -465,6 +473,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -690,6 +705,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -723,6 +742,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1692,6 +1715,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2194,6 +2225,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2662,6 +2697,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2732,6 +2771,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3496,10 +3539,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3507,5 +3546,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_en.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_en.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -463,6 +471,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -688,6 +703,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -721,6 +740,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1674,6 +1697,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2160,6 +2191,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2628,6 +2663,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2698,6 +2737,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3462,10 +3505,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3473,5 +3512,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_es.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_es.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -471,6 +479,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -696,6 +711,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -729,6 +748,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1698,6 +1721,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2200,6 +2231,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2668,6 +2703,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Semilla</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2742,6 +2781,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3506,10 +3549,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3517,5 +3556,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_fi.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_fi.ts Fri Apr 01 15:36:19 2016 +0200
@@ -1,15 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="fi">
-
-<!-- Finnish translation updated by Janne Uusitupa <ju@cockli> on 2014/11/23. -->
-<!-- Based on the older translation. -->
-
<context>
<name>About</name>
<message>
<source>Unknown Compiler</source>
- <translation>Tuntematon kääntäjä</translation>
+ <translation>Tuntematon kääntäjä</translation>
</message>
</context>
<context>
@@ -27,7 +23,7 @@
</message>
<message>
<source>copy of %1</source>
- <translation>%1 kopio</translation>
+ <translation>%1 kopio</translation>
</message>
</context>
<context>
@@ -42,7 +38,7 @@
</message>
<message>
<source>IP/Nick</source>
- <translation>IP/Nimi</translation>
+ <translation>IP/Nimi</translation>
</message>
<message>
<source>Reason</source>
@@ -70,7 +66,7 @@
</message>
<message>
<source>Please, specify %1</source>
- <translation>Tarkenna: %1</translation>
+ <translation>Tarkenna: %1</translation>
</message>
<message>
<source>nickname</source>
@@ -80,6 +76,10 @@
<source>permanent</source>
<translation>ikuinen</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>Sähköposti on valinnainen, jos et halua meidän ottavan yhteyttä.</translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Palaute</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -202,7 +206,7 @@
</message>
<message>
<source>Scheme '%1' not supported</source>
- <translation>Säännöille '%1' ei ole tukea</translation>
+ <translation>Säännöille '%1' ei ole tukea</translation>
</message>
<message>
<source>Cannot create directory %1</source>
@@ -213,7 +217,7 @@
%1
Please check your installation!</source>
- <translation>Hakemiston avaaminen epäonnistui:
+ <translation>Hakemiston avaaminen epäonnistui:
%1
Tarkista, että peli on asennettu oikein!</translation>
@@ -374,7 +378,7 @@
<message>
<source>Someone already uses your nickname %1 on the server.
Please pick another nickname:</source>
- <translation>Nimimerkkisi %1 on jo käytössä.
+ <translation>Nimimerkkisi %1 on jo käytössä.
Valiste jokin muu:</translation>
</message>
<message>
@@ -391,7 +395,7 @@
If this nick isn't yours, please register your own nick at www.hedgewars.org
Password:</source>
- <translation>Tämä nimimerkki on rekisteröity, etkä antanut salasanaa.
+ <translation>Tämä nimimerkki on rekisteröity, etkä antanut salasanaa.
Jos tämä ei ole nimesi, rekisteröi omasi osoitteessa hedgewars.org
@@ -401,7 +405,7 @@
<source>Your nickname is not registered.
To prevent someone else from using it,
please register it at www.hedgewars.org</source>
- <translation>Nimimerkkiäsi ei ole rekisteröity.
+ <translation>Nimimerkkiäsi ei ole rekisteröity.
Estääksesi muita käyttämästä sitä,
voit rekisteröidä sen osoitteessa hedgewars.org</translation>
</message>
@@ -409,7 +413,7 @@
<source>
Your password wasn't saved either.</source>
- <translation>
+ <translation>
Salasanaasi ei tallennettu.</translation>
</message>
@@ -436,7 +440,7 @@
<message>
<source>You reconnected too fast.
Please wait a few seconds and try again.</source>
- <translation>Yhdistit uudelleen liian pian.
+ <translation>Yhdistit uudelleen liian pian.
Odota hetki ja yritä uudelleen.</translation>
</message>
<message>
@@ -454,7 +458,7 @@
<message>
<source>The room is protected with password.
Please, enter the password:</source>
- <translation>Huoneeseen pääsee vain salasanalla.
+ <translation>Huoneeseen pääsee vain salasanalla.
Salasana:</translation>
</message>
</context>
@@ -477,7 +481,7 @@
Last two engine messages:
%2</source>
- <translation>Vakava virhe tapahtui, ja pelimoottori kaatui!
+ <translation>Vakava virhe tapahtui, ja pelimoottori kaatui!
Olemme pahoillamme, että näin pääsi käymään :(
@@ -488,6 +492,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -703,7 +714,7 @@
If you don't have an account on www.hedgewars.org,
just enter your nickname.</source>
- <translation>Kirjaudu yhdistääksesi palvelimelle.
+ <translation>Kirjaudu yhdistääksesi palvelimelle.
Jos et ole rekisteröitynyt,
pelkkä nimimerkki riittää.</translation>
@@ -718,7 +729,7 @@
</message>
<message>
<source>New Account</source>
- <translation>Rekisteröidy</translation>
+ <translation>Rekisteröidy</translation>
</message>
</context>
<context>
@@ -753,6 +764,10 @@
<source>Search for a hat:</source>
<translation>Etsi hattua:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -788,7 +803,7 @@
</message>
<message>
<source>%1 fps</source>
- <translation>%1 kuvaa/s</translation>
+ <translation>%1 kuvaa/s</translation>
</message>
</context>
<context>
@@ -838,7 +853,7 @@
</message>
<message>
<source>IP/Nick</source>
- <translation>IP/Nimim</translation>
+ <translation>IP/Nimim</translation>
</message>
<message>
<source>Expiration</source>
@@ -1106,7 +1121,7 @@
</message>
<message>
<source>Manage videos recorded from game</source>
- <translation>Hallinnoi peleistä nauhoitettuja videoita</translation>
+ <translation>Hallinnoi peleistä nauhoitettuja videoita</translation>
</message>
<message>
<source>Edit game preferences</source>
@@ -1604,7 +1619,7 @@
</message>
<message>
<source>Load a previously saved game</source>
- <translation>Avaa tallennettu peli</translation>
+ <translation>Avaa tallennettu peli</translation>
</message>
</context>
<context>
@@ -1722,6 +1737,14 @@
<source>Show games in-progress</source>
<translation>Näytä alkaneet pelit</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -1866,27 +1889,27 @@
</message>
<message>
<source>Red/Cyan</source>
- <translation>Punainen/Syaani</translation>
+ <translation>Punainen/Syaani</translation>
</message>
<message>
<source>Cyan/Red</source>
- <translation>Syaani/Punainen</translation>
+ <translation>Syaani/Punainen</translation>
</message>
<message>
<source>Red/Blue</source>
- <translation>Punainen/Sininen</translation>
+ <translation>Punainen/Sininen</translation>
</message>
<message>
<source>Blue/Red</source>
- <translation>Sininen/Punainen</translation>
+ <translation>Sininen/Punainen</translation>
</message>
<message>
<source>Red/Green</source>
- <translation>Punainen/Vihreä</translation>
+ <translation>Punainen/Vihreä</translation>
</message>
<message>
<source>Green/Red</source>
- <translation>Vihreä/Punainen</translation>
+ <translation>Vihreä/Punainen</translation>
</message>
<message>
<source>Side-by-side</source>
@@ -1898,27 +1921,27 @@
</message>
<message>
<source>Red/Cyan grayscale</source>
- <translation>Punainen/Syaani harmaasävy</translation>
+ <translation>Punainen/Syaani harmaasävy</translation>
</message>
<message>
<source>Cyan/Red grayscale</source>
- <translation>Syaani/Punainen harmaasävy</translation>
+ <translation>Syaani/Punainen harmaasävy</translation>
</message>
<message>
<source>Red/Blue grayscale</source>
- <translation>Punainen/Sininen harmaasävy</translation>
+ <translation>Punainen/Sininen harmaasävy</translation>
</message>
<message>
<source>Blue/Red grayscale</source>
- <translation>Sininen/Punainen harmaasävy</translation>
+ <translation>Sininen/Punainen harmaasävy</translation>
</message>
<message>
<source>Red/Green grayscale</source>
- <translation>Punainen/Vihreä harmaasävy</translation>
+ <translation>Punainen/Vihreä harmaasävy</translation>
</message>
<message>
<source>Green/Red grayscale</source>
- <translation>Vihreä/Punainen harmaasävy</translation>
+ <translation>Vihreä/Punainen harmaasävy</translation>
</message>
</context>
<context>
@@ -2110,7 +2133,7 @@
<source>There are videos that are currently being processed.
Exiting now will abort them.
Do you really want to quit?</source>
- <translation>Videoiden prosessointi on käynnissä.
+ <translation>Videoiden prosessointi on käynnissä.
Sulkeminen keskeyttää tämän.
Haluatko varmasti lopettaa?</translation>
</message>
@@ -2136,7 +2159,7 @@
</message>
<message>
<source>Tags (comma separated): </source>
- <translation>Hakusanat (pilkulla eroteltuna): </translation>
+ <translation>Hakusanat (pilkulla eroteltuna): </translation>
</message>
<message>
<source>Description</source>
@@ -2196,7 +2219,7 @@
</message>
<message>
<source>Type the security code:</source>
- <translation>Todista, että olet ihminen:</translation>
+ <translation>Todista, että olet ihminen:</translation>
</message>
<message>
<source>Revision</source>
@@ -2226,6 +2249,10 @@
<source>Script parameter</source>
<translation>Skriptin parametri</translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2266,7 +2293,7 @@
<message>
<source>Error while authenticating at google.com:
</source>
- <translation>Virhe kirjautuessa google.comiin:
+ <translation>Virhe kirjautuessa google.comiin:
</translation>
</message>
<message>
@@ -2276,7 +2303,7 @@
<message>
<source>Error while sending metadata to youtube.com:
</source>
- <translation>Virhe lähetettäessä oheistietoja youtube.comiin:
+ <translation>Virhe lähetettäessä oheistietoja youtube.comiin:
</translation>
</message>
<message>
@@ -2410,7 +2437,7 @@
</message>
<message>
<source>Cannot open '%1' for reading</source>
- <translation>Ei voi avata '%1' lukua varten</translation>
+ <translation>Ei voi avata '%1' lukua varten</translation>
</message>
<message>
<source>Cannot use the ammo '%1'!</source>
@@ -2471,7 +2498,7 @@
<message>
<source>Are you sure you want to start this game?
Not all players are ready.</source>
- <translation>Haluatko varmasti aloittaa pelin?
+ <translation>Haluatko varmasti aloittaa pelin?
Kaikki pelaajat eivät ole valmiita.</translation>
</message>
</context>
@@ -2697,6 +2724,10 @@
<source>Close</source>
<translation>Sulje</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Siemen</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2734,7 +2765,7 @@
<message>
<source>Unable to run engine at %1
Error code: %2</source>
- <translation>Pelimoottorin käynnistäminen %1:ssä epäonnistui
+ <translation>Pelimoottorin käynnistäminen %1:ssä epäonnistui
Vikakoodi: %2</translation>
</message>
<message>
@@ -2744,7 +2775,7 @@
We are very sorry for the inconvenience :(
If this keeps happening, please click the '%2' button in the main menu!</source>
- <translation>Pelimoottori kaatui yllättäen!
+ <translation>Pelimoottori kaatui yllättäen!
(Vikakoodi: %1)
Olemme pahoillamme tapahtuneesta :(
@@ -2773,6 +2804,10 @@
<source>Use selected theme</source>
<translation>Käytä valittua teemaa</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -2794,7 +2829,7 @@
</message>
<message>
<source>attack</source>
- <translation>hyökkäys</translation>
+ <translation>hyökkäys</translation>
</message>
<message>
<source>precise aim</source>
@@ -2946,7 +2981,7 @@
</message>
<message>
<source>autocam / find hedgehog</source>
- <translation>automaattikamera / etsi siili</translation>
+ <translation>automaattikamera / etsi siili</translation>
</message>
<message>
<source>speed up replay</source>
@@ -3450,7 +3485,7 @@
</message>
<message>
<source>Authentication failed</source>
- <translation>Tunnistautuminen epäonnistui</translation>
+ <translation>Tunnistautuminen epäonnistui</translation>
</message>
<message>
<source>60 seconds cooldown after kick</source>
@@ -3514,7 +3549,7 @@
</message>
<message>
<source>map</source>
- <translation>kartta</translation>
+ <translation>kartta</translation>
</message>
<message>
<source>pause</source>
@@ -3538,7 +3573,7 @@
</message>
<message>
<source>Game messages flood detected - 2</source>
- <translation>Peliviestien tulva havaittu - 2</translation>
+ <translation type="obsolete">Peliviestien tulva havaittu - 2</translation>
</message>
<message>
<source>Warning! Joins flood protection activated</source>
@@ -3548,5 +3583,49 @@
<source>There's no voting going on</source>
<translation>Äänestyksiä ei ole meneillään</translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
-</TS>
\ No newline at end of file
+</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_fr.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_fr.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation>Permanent</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -130,6 +134,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>L'adresse email est optionnelle, mais nécessaire si vous voulez que l'on vous recontacte.</translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Contact</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -492,6 +500,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -724,6 +739,10 @@
<source>Password:</source>
<translation>Mot de passe:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -757,6 +776,10 @@
<source>Search for a hat:</source>
<translation>Chercher un chapeau:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1754,6 +1777,14 @@
<source>Show games in-progress</source>
<translation>Parties en cours</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2258,6 +2289,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2733,6 +2768,10 @@
<source>Close</source>
<translation>Fermer</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Graine</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2815,6 +2854,10 @@
<source>Use selected theme</source>
<translation>Utiliser le thème séléctionné</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3580,10 +3623,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3591,5 +3630,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_gl.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_gl.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -463,6 +471,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -688,6 +703,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -721,6 +740,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1678,6 +1701,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2164,6 +2195,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2631,6 +2666,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2701,6 +2740,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3465,10 +3508,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3476,5 +3515,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_hu.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_hu.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -457,6 +465,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -682,6 +697,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -715,6 +734,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1662,6 +1685,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2148,6 +2179,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2614,6 +2649,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2684,6 +2723,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3448,10 +3491,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3459,5 +3498,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_it.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_it.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation>permanente</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>Il tuo indirizzo di posta elettronica è opzionale, ma potremmo volerti contattare.</translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Opinioni</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -252,7 +260,7 @@
<message>
<source>Hedgewars can use a %1 (e.g. "%2") to connect on start.</source>
<comment>command-line</comment>
- <translation>Hedgewars può usare un %1 (per esempio "%2") per connettersi all'avvio.</translation>
+ <translation>Hedgewars può usare un %1 (per esempio "%2") per connettersi all'avvio.</translation>
</message>
<message>
<source>Malformed option argument: %1</source>
@@ -475,7 +483,7 @@
%2</source>
<translation>ERRORE non recuperabile! Il motore di gioco si è dovuto arrestare.
-Ci dispiace molto per l'inconveniente :(
+Ci dispiace molto per l'inconveniente :(
Se continua a succedere, per piacere clicca il bottone '%1' nel menu principale!
@@ -484,6 +492,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -708,6 +723,10 @@
<source>Password:</source>
<translation>Password:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -741,6 +760,10 @@
<source>Search for a hat:</source>
<translation>Cerca un cappello:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KeyBinder</name>
@@ -1667,6 +1690,14 @@
<source>Show games in-progress</source>
<translation>Mostra partite in corso</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2151,6 +2182,10 @@
<source>Script parameter</source>
<translation>Parametro dello script</translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2612,6 +2647,10 @@
<source>Close</source>
<translation>Chiudi</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Seed</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2662,7 +2701,7 @@
<translation>Il motore del gioco è morto inaspettatamente!
(codice di uscita %1)
-Ci dispiace molto per l'inconveniente :(
+Ci dispiace molto per l'inconveniente :(
Se questo continua a succedere, per piacere clicca il bottone '%2' nel menu principale!</translation>
</message>
@@ -2688,6 +2727,10 @@
<source>Use selected theme</source>
<translation>Usa tema selezionato</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3445,7 +3488,7 @@
</message>
<message>
<source>Game messages flood detected - 2</source>
- <translation>Rilevato numero messaggi di gioco eccessivo - 2</translation>
+ <translation type="obsolete">Rilevato numero messaggi di gioco eccessivo - 2</translation>
</message>
<message>
<source>Warning! Joins flood protection activated</source>
@@ -3455,5 +3498,49 @@
<source>There's no voting going on</source>
<translation>Non ci sono votazioni in questo momento</translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ja.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_ja.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -461,6 +469,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -686,6 +701,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -719,6 +738,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1662,6 +1685,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2148,6 +2179,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2614,6 +2649,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">乱数シード</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2688,6 +2727,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3448,10 +3491,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3459,5 +3498,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ko.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_ko.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -457,6 +465,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -678,6 +693,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -711,6 +730,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KeyBinder</name>
@@ -1627,6 +1650,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2109,6 +2140,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2567,6 +2602,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2637,6 +2676,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3393,10 +3436,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3404,5 +3443,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_lt.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_lt.ts Fri Apr 01 15:36:19 2016 +0200
@@ -20,12 +20,12 @@
<context>
<name>AmmoSchemeModel</name>
<message>
- <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="697"/>
+ <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="758"/>
<source>new</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="703"/>
+ <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="764"/>
<source>copy of %1</source>
<translation type="unfinished"></translation>
</message>
@@ -39,7 +39,7 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="41"/>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>IP</source>
<translation type="unfinished"></translation>
</message>
@@ -74,22 +74,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="80"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="61"/>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="81"/>
<source>you know why</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Please, specify %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>nickname</source>
<translation type="unfinished"></translation>
</message>
@@ -105,37 +110,42 @@
<context>
<name>FeedbackDialog</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
<source>We are always happy about suggestions, ideas, or bug reports.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="90"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
<source>Send us feedback!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
- <source>If you found a bug, you can see if it's already been reported here: </source>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="63"/>
+ <source>Feedback</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="93"/>
+ <source>If you found a bug, you can see if it's already been reported here: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="94"/>
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="125"/>
<source>View</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="150"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="151"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="178"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="179"/>
<source>Send Feedback</source>
<translation type="unfinished"></translation>
</message>
@@ -188,7 +198,7 @@
<context>
<name>GameUIConfig</name>
<message>
- <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="115"/>
+ <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="116"/>
<source>Guest</source>
<translation type="unfinished"></translation>
</message>
@@ -251,72 +261,73 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="102"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="105"/>
<source>Cannot create directory %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="138"/>
- <source>Usage</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="139"/>
- <source>OPTION</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="140"/>
- <source>CONNECTSTRING</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/main.cpp" line="141"/>
- <source>Options</source>
+ <source>Usage</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="142"/>
- <source>Display this help</source>
+ <source>OPTION</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="143"/>
- <source>Custom path for configuration data and user data</source>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
+ <source>CONNECTSTRING</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="144"/>
- <source>Custom path to the game data folder</source>
+ <source>Options</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="145"/>
+ <source>Display this help</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="146"/>
+ <source>Custom path for configuration data and user data</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="147"/>
+ <source>Custom path to the game data folder</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
<source>Hedgewars can use a %1 (e.g. "%2") to connect on start.</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="191"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="196"/>
<source>Malformed option argument: %1</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="231"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="236"/>
<source>Unknown option argument: %1</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="310"/>
<source>Failed to open data directory:
%1
@@ -335,67 +346,67 @@
<context>
<name>HWChatWidget</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="505"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="509"/>
<source>%1 has joined</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="526"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="530"/>
<source>%1 has left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="528"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="532"/>
<source>%1 has left (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="657"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="661"/>
<source>%1 has been removed from your ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="667"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="671"/>
<source>%1 has been added to your ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="697"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="701"/>
<source>%1 has been removed from your friends list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="706"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="710"/>
<source>%1 has been added to your friends list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="772"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="776"/>
<source>Stylesheet imported from %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="773"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="777"/>
<source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="781"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="785"/>
<source>Couldn't read %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="789"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="793"/>
<source>StyleSheet discarded</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="813"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="817"/>
<source>StyleSheet saved to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="816"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="820"/>
<source>Failed to save StyleSheet to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -403,52 +414,52 @@
<context>
<name>HWForm</name>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="481"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="479"/>
<source>DefaultTeam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="641"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="639"/>
<source>Game aborted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1124"/>
<source>Nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1131"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1452"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1129"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1450"/>
<source>No nickname supplied.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1124"/>
<source>Someone already uses your nickname %1 on the server.
Please pick another nickname:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/hwform.cpp" line="156"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="476"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1399"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1418"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="474"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1397"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1416"/>
<source>Guest</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="485"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="483"/>
<source>%1's Team</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1080"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1078"/>
<source>Hedgewars - Nick registered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1081"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1079"/>
<source>This nick is registered, and you haven't specified a password.
If this nick isn't yours, please register your own nick at www.hedgewars.org
@@ -457,92 +468,92 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1109"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1107"/>
<source>Your nickname is not registered.
To prevent someone else from using it,
please register it at www.hedgewars.org</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1114"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1112"/>
<source>
Your password wasn't saved either.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1131"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1452"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1129"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1450"/>
<source>Hedgewars - Empty nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1158"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1156"/>
<source>Hedgewars - Wrong password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1158"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1156"/>
<source>You entered a wrong password.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1170"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1168"/>
<source>Room password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1170"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1168"/>
<source>The room is protected with password.
Please, enter the password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1186"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1184"/>
<source>Try Again</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1556"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1554"/>
<source>Hedgewars - Connection error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1556"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1554"/>
<source>You reconnected too fast.
Please wait a few seconds and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1713"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2060"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1711"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2058"/>
<source>Cannot save record to file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1990"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1988"/>
<source>Hedgewars Demo File</source>
<comment>File Types</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1991"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1989"/>
<source>Hedgewars Save File</source>
<comment>File Types</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2052"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2050"/>
<source>Demo name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2052"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2050"/>
<source>Demo name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2120"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2118"/>
<source>This page requires an internet connection.</source>
<translation type="unfinished"></translation>
</message>
@@ -550,7 +561,7 @@
<context>
<name>HWGame</name>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="252"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="255"/>
<source>A Fatal ERROR occured! - The game engine had to stop.
We are very sorry for the inconvenience :(
@@ -562,182 +573,190 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="383"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="386"/>
<location filename="../../../../QTfrontend/net/recorder.cpp" line="113"/>
<source>en.txt</source>
<translation>lt.txt</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="433"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="436"/>
<source>Cannot open demofile %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="66"/>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="100"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="103"/>
<source>Map type:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="103"/>
- <source>Image map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="104"/>
- <source>Mission map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="105"/>
- <source>Hand-drawn</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="106"/>
- <source>Randomly generated</source>
+ <source>Image map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="107"/>
- <source>Random maze</source>
+ <source>Mission map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="108"/>
+ <source>Hand-drawn</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="109"/>
+ <source>Randomly generated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="110"/>
+ <source>Random maze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="111"/>
<source>Random perlin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="118"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="121"/>
<source>Random</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="142"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="145"/>
<source>Map preview:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="181"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="184"/>
<source>Load map drawing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="187"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="190"/>
<source>Edit map drawing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="200"/>
- <source>All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="201"/>
- <source>Small</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="202"/>
- <source>Medium</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="203"/>
- <source>Large</source>
+ <source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="204"/>
- <source>Cavern</source>
+ <source>Small</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="205"/>
+ <source>Medium</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="206"/>
+ <source>Large</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="207"/>
+ <source>Cavern</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="208"/>
<source>Wacky</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="215"/>
- <source>Large tunnels</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="216"/>
- <source>Small islands</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="217"/>
- <source>Medium islands</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="218"/>
+ <source>Large tunnels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="219"/>
+ <source>Small islands</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="220"/>
+ <source>Medium islands</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="221"/>
<source>Large islands</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="726"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="760"/>
<source>Map size:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="733"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="767"/>
<source>Maze style:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="740"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="774"/>
<source>Style:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="754"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="789"/>
<source>Mission:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="765"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="801"/>
<source>Map:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="829"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="960"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="884"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1012"/>
<source>Theme: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>Load drawn map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>Drawn Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="213"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="216"/>
<source>Small tunnels</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="214"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="217"/>
<source>Medium tunnels</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="133"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="136"/>
<source>Seed</source>
<translation type="unfinished"></translation>
</message>
@@ -819,7 +838,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1576"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1574"/>
<source>Quit reason: </source>
<translation type="unfinished"></translation>
</message>
@@ -849,6 +868,11 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/input_password.cpp" line="59"/>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -874,17 +898,22 @@
<context>
<name>HatPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="83"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="63"/>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="84"/>
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="119"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="120"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="123"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="124"/>
<source>Use selected hat</source>
<translation type="unfinished"></translation>
</message>
@@ -900,27 +929,27 @@
<context>
<name>LibavInteraction</name>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="285"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="294"/>
<source>Duration: %1m %2s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="297"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="306"/>
<source>Video: %1x%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="301"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="310"/>
<source>%1 fps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="314"/>
<source>Audio: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="309"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="318"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@@ -1075,34 +1104,34 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="48"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="49"/>
<source>Load</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="49"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="50"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
<source>Load drawn map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>Drawn Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>Save drawn map</source>
<translation type="unfinished"></translation>
</message>
@@ -1629,17 +1658,17 @@
<context>
<name>PageRoomsList</name>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="85"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="93"/>
<source>Search for a room:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="112"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="120"/>
<source>Create room</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="116"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="124"/>
<source>Join room</source>
<translation type="unfinished"></translation>
</message>
@@ -1649,17 +1678,17 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="169"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="177"/>
<source>Admin features</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="171"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="179"/>
<source>Open server administration page</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="531"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="541"/>
<source>%1 players online</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -1806,37 +1835,37 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="395"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="409"/>
<source>None (Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="396"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="410"/>
<source>Wrap (World wraps)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="397"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="411"/>
<source>Bounce (Edges reflect)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="398"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="412"/>
<source>Sea (Edges connect to sea)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="434"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="448"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="435"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="449"/>
<source>New</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="436"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="450"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
@@ -1970,44 +1999,44 @@
<context>
<name>QAction</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="256"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="258"/>
<source>Info</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="260"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="262"/>
<source>Kick</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="264"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="266"/>
<source>Ban</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="268"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="270"/>
<source>Follow</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="272"/>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="895"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="274"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="905"/>
<source>Ignore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="276"/>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="907"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="278"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="917"/>
<source>Add friend</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="890"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="900"/>
<source>Unignore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="902"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="912"/>
<source>Remove friend</source>
<translation type="unfinished"></translation>
</message>
@@ -2036,6 +2065,16 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="80"/>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="83"/>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2534,21 +2573,26 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="372"/>
- <source>% Get Away Time</source>
+ <source>Air Mines</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="386"/>
+ <source>% Get Away Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="400"/>
<source>World Edge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="404"/>
- <source>Script parameter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="418"/>
+ <source>Script parameter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="432"/>
<source>Scheme Name:</source>
<translation type="unfinished"></translation>
</message>
@@ -2590,27 +2634,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="103"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="104"/>
<source>Your Email</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="111"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="112"/>
<source>Summary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="121"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="122"/>
<source>Send system information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="136"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="137"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="164"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="165"/>
<source>Type the security code:</source>
<translation type="unfinished"></translation>
</message>
@@ -2643,7 +2687,7 @@
<context>
<name>QLineEdit</name>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="957"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="955"/>
<source>unnamed</source>
<translation type="unfinished"></translation>
</message>
@@ -2680,92 +2724,92 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="986"/>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="534"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="984"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="549"/>
<source>Cannot delete default scheme '%1'!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1012"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1010"/>
<source>Please select a record from the list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1107"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1105"/>
<source>Hedgewars - Nick not registered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1515"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1513"/>
<source>Unable to start server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1576"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1574"/>
<source>Connection to server is lost</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2127"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2125"/>
<source>Not all players are ready</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2128"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2126"/>
<source>Are you sure you want to start this game?
Not all players are ready.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="349"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="350"/>
<location filename="../../../../QTfrontend/util/MessageDialog.cpp" line="26"/>
<source>Hedgewars - Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="359"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="360"/>
<source>System Information Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="374"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="385"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="375"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="386"/>
<source>Failed to generate captcha</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="402"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="403"/>
<source>Failed to download captcha</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="466"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="467"/>
<source>Please fill out all fields. Email is optional.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2030"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="436"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2028"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="437"/>
<source>Hedgewars - Success</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2031"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2029"/>
<source>All file associations have been set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2036"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2034"/>
<source>File association failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="370"/>
+ <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="373"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="371"/>
+ <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="374"/>
<source>Cannot use the ammo '%1'!</source>
<translation type="unfinished"></translation>
</message>
@@ -2833,38 +2877,38 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="492"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="502"/>
<source>Room Name - Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="493"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="503"/>
<source>Please select room from the list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="518"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="528"/>
<source>Room Name - Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="519"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="529"/>
<source>The game you are trying to join has started.
Do you still want to join the room?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="533"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="548"/>
<source>Schemes - Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="542"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="557"/>
<source>Schemes - Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="543"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="558"/>
<source>Do you really want to delete the game scheme '%1'?</source>
<translation type="unfinished"></translation>
</message>
@@ -2897,7 +2941,7 @@
<message>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="146"/>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="166"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="921"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="973"/>
<source>File error</source>
<translation type="unfinished"></translation>
</message>
@@ -2908,7 +2952,7 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="167"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="922"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="974"/>
<source>Cannot open '%1' for reading</source>
<translation type="unfinished"></translation>
</message>
@@ -3121,22 +3165,23 @@
<context>
<name>RoomNamePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="43"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="44"/>
<source>Enter a name for your room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="56"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="57"/>
<source>set password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="72"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="73"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="35"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="74"/>
<source>Create room</source>
<translation type="unfinished"></translation>
</message>
@@ -3189,22 +3234,22 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="133"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="149"/>
<source>Random Map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="134"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="150"/>
<source>Random Maze</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="135"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="151"/>
<source>Random Perlin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="136"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="152"/>
<source>Hand-drawn</source>
<translation type="unfinished"></translation>
</message>
@@ -3212,22 +3257,27 @@
<context>
<name>SeedPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="42"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="34"/>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="43"/>
<source>The map seed is the basis for all random values generated by the game.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="61"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="62"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="63"/>
<source>Set seed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="76"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="77"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -3302,17 +3352,22 @@
<context>
<name>ThemePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="84"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="64"/>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="85"/>
<source>Search for a theme:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="120"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="121"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="125"/>
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
@@ -3658,39 +3713,39 @@
<context>
<name>binds (keys)</name>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="134"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="133"/>
<source>Axis</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="138"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="153"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="137"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="152"/>
<source>(Up)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="142"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="157"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="141"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="156"/>
<source>(Down)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="149"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="148"/>
<source>Hat</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="161"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="160"/>
<source>(Left)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="165"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="164"/>
<source>(Right)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="173"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="172"/>
<source>Button</source>
<translation type="unfinished"></translation>
</message>
@@ -4058,57 +4113,57 @@
<context>
<name>server</name>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
<source>Restricted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
- <source>Not room master</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
- <source>Corrupted hedgehogs info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
- <source>too many teams</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
- <source>too many hedgehogs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/servermessages.h" line="16"/>
- <source>There's already a team with same name in the list</source>
+ <source>Not room master</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="17"/>
- <source>round in progress</source>
+ <source>Corrupted hedgehogs info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="18"/>
- <source>restricted</source>
+ <source>too many teams</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="19"/>
- <source>REMOVE_TEAM: no such team</source>
+ <source>too many hedgehogs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="20"/>
+ <source>There's already a team with same name in the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
+ <source>round in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
+ <source>restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+ <source>REMOVE_TEAM: no such team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
<source>Not team owner!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
<source>Less than two clans!</source>
<translation type="unfinished"></translation>
</message>
@@ -4119,161 +4174,211 @@
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="3"/>
- <source>Voting closed</source>
+ <source>Your vote counted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="4"/>
- <source>New voting started</source>
+ <source>Voting closed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="5"/>
- <source>Voting expired</source>
+ <source>Pause toggled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="6"/>
- <source>kick</source>
+ <source>New voting started</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="7"/>
- <source>map</source>
+ <source>Voting expired</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="8"/>
+ <source>kick</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
+ <source>map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
<source>pause</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
- <source>Illegal room name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
- <source>Room with such name already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
- <source>Nickname already chosen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
- <source>Illegal nickname</source>
+ <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
+ <source>number of hedgehogs in team</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="25"/>
- <source>Protocol already known</source>
+ <source>Illegal room name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="26"/>
- <source>Bad number</source>
+ <source>Room with such name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="27"/>
- <source>Nickname is already in use</source>
+ <source>/maxteams: specify number from 2 to 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="28"/>
- <source>No checker rights</source>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="29"/>
- <source>Authentication failed</source>
+ <source>callvote kick: specify nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="30"/>
- <source>60 seconds cooldown after kick</source>
+ <source>callvote kick: no such user</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="31"/>
- <source>kicked</source>
+ <source>callvote map: no such map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="32"/>
- <source>Reconnected too fast</source>
+ <source>callvote pause: no game in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="33"/>
- <source>Ping timeout</source>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="34"/>
- <source>bye</source>
+ <source>Nickname already chosen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="35"/>
- <source>No such room</source>
+ <source>Illegal nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="36"/>
- <source>Room version incompatible to your hedgewars version</source>
+ <source>Protocol already known</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="37"/>
- <source>Joining restricted</source>
+ <source>Bad number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="38"/>
- <source>Registered users only</source>
+ <source>Nickname is already in use</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="39"/>
- <source>You are banned in this room</source>
+ <source>No checker rights</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="40"/>
- <source>Warning! Chat flood protection activated</source>
+ <source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="41"/>
- <source>Excess flood</source>
+ <source>60 seconds cooldown after kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="42"/>
- <source>Game messages flood detected - 1</source>
+ <source>kicked</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="43"/>
- <source>Game messages flood detected - 2</source>
+ <source>Reconnected too fast</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="44"/>
- <source>Warning! Joins flood protection activated</source>
+ <source>Ping timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="45"/>
+ <source>bye</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
+ <source>No such room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
+ <source>Room version incompatible to your hedgewars version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
+ <source>Joining restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
+ <source>Registered users only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
+ <source>You are banned in this room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="51"/>
+ <source>Warning! Chat flood protection activated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="52"/>
+ <source>Excess flood</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="53"/>
+ <source>Game messages flood detected - 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="54"/>
+ <source>Warning! Joins flood protection activated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="55"/>
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
<source>Empty config entry</source>
<translation type="unfinished"></translation>
</message>
--- a/share/hedgewars/Data/Locale/hedgewars_ms.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_ms.ts Fri Apr 01 15:36:19 2016 +0200
@@ -20,12 +20,12 @@
<context>
<name>AmmoSchemeModel</name>
<message>
- <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="697"/>
+ <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="758"/>
<source>new</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="703"/>
+ <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="764"/>
<source>copy of %1</source>
<translation type="unfinished"></translation>
</message>
@@ -39,7 +39,7 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="41"/>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>IP</source>
<translation type="unfinished"></translation>
</message>
@@ -74,22 +74,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="80"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="61"/>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="81"/>
<source>you know why</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Please, specify %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>nickname</source>
<translation type="unfinished"></translation>
</message>
@@ -105,37 +110,42 @@
<context>
<name>FeedbackDialog</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
<source>We are always happy about suggestions, ideas, or bug reports.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="90"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
<source>Send us feedback!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
- <source>If you found a bug, you can see if it's already been reported here: </source>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="63"/>
+ <source>Feedback</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="93"/>
+ <source>If you found a bug, you can see if it's already been reported here: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="94"/>
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="125"/>
<source>View</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="150"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="151"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="178"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="179"/>
<source>Send Feedback</source>
<translation type="unfinished"></translation>
</message>
@@ -186,7 +196,7 @@
<context>
<name>GameUIConfig</name>
<message>
- <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="115"/>
+ <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="116"/>
<source>Guest</source>
<translation type="unfinished"></translation>
</message>
@@ -239,72 +249,73 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="102"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="105"/>
<source>Cannot create directory %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="138"/>
- <source>Usage</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="139"/>
- <source>OPTION</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="140"/>
- <source>CONNECTSTRING</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/main.cpp" line="141"/>
- <source>Options</source>
+ <source>Usage</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="142"/>
- <source>Display this help</source>
+ <source>OPTION</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="143"/>
- <source>Custom path for configuration data and user data</source>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
+ <source>CONNECTSTRING</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="144"/>
- <source>Custom path to the game data folder</source>
+ <source>Options</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="145"/>
+ <source>Display this help</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="146"/>
+ <source>Custom path for configuration data and user data</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="147"/>
+ <source>Custom path to the game data folder</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
<source>Hedgewars can use a %1 (e.g. "%2") to connect on start.</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="191"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="196"/>
<source>Malformed option argument: %1</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="231"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="236"/>
<source>Unknown option argument: %1</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="310"/>
<source>Failed to open data directory:
%1
@@ -323,67 +334,67 @@
<context>
<name>HWChatWidget</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="505"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="509"/>
<source>%1 has joined</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="526"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="530"/>
<source>%1 has left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="528"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="532"/>
<source>%1 has left (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="657"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="661"/>
<source>%1 has been removed from your ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="667"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="671"/>
<source>%1 has been added to your ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="697"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="701"/>
<source>%1 has been removed from your friends list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="706"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="710"/>
<source>%1 has been added to your friends list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="772"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="776"/>
<source>Stylesheet imported from %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="773"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="777"/>
<source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="781"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="785"/>
<source>Couldn't read %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="789"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="793"/>
<source>StyleSheet discarded</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="813"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="817"/>
<source>StyleSheet saved to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="816"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="820"/>
<source>Failed to save StyleSheet to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -392,34 +403,34 @@
<name>HWForm</name>
<message>
<location filename="../../../../QTfrontend/hwform.cpp" line="156"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="476"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1399"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1418"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="474"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1397"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1416"/>
<source>Guest</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="481"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="479"/>
<source>DefaultTeam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="485"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="483"/>
<source>%1's Team</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="641"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="639"/>
<source>Game aborted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1080"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1078"/>
<source>Hedgewars - Nick registered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1081"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1079"/>
<source>This nick is registered, and you haven't specified a password.
If this nick isn't yours, please register your own nick at www.hedgewars.org
@@ -428,109 +439,109 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1109"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1107"/>
<source>Your nickname is not registered.
To prevent someone else from using it,
please register it at www.hedgewars.org</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1114"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1112"/>
<source>
Your password wasn't saved either.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1124"/>
<source>Nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1124"/>
<source>Someone already uses your nickname %1 on the server.
Please pick another nickname:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1131"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1452"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1129"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1450"/>
<source>No nickname supplied.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1131"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1452"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1129"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1450"/>
<source>Hedgewars - Empty nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1158"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1156"/>
<source>Hedgewars - Wrong password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1158"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1156"/>
<source>You entered a wrong password.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1170"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1168"/>
<source>Room password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1170"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1168"/>
<source>The room is protected with password.
Please, enter the password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1186"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1184"/>
<source>Try Again</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1556"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1554"/>
<source>Hedgewars - Connection error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1556"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1554"/>
<source>You reconnected too fast.
Please wait a few seconds and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1713"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2060"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1711"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2058"/>
<source>Cannot save record to file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1990"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1988"/>
<source>Hedgewars Demo File</source>
<comment>File Types</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1991"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1989"/>
<source>Hedgewars Save File</source>
<comment>File Types</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2052"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2050"/>
<source>Demo name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2052"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2050"/>
<source>Demo name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2120"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2118"/>
<source>This page requires an internet connection.</source>
<translation type="unfinished"></translation>
</message>
@@ -538,7 +549,7 @@
<context>
<name>HWGame</name>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="252"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="255"/>
<source>A Fatal ERROR occured! - The game engine had to stop.
We are very sorry for the inconvenience :(
@@ -550,182 +561,190 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="383"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="386"/>
<location filename="../../../../QTfrontend/net/recorder.cpp" line="113"/>
<source>en.txt</source>
<translation>ms.txt</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="433"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="436"/>
<source>Cannot open demofile %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="66"/>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="100"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="103"/>
<source>Map type:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="103"/>
- <source>Image map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="104"/>
- <source>Mission map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="105"/>
- <source>Hand-drawn</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="106"/>
- <source>Randomly generated</source>
+ <source>Image map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="107"/>
- <source>Random maze</source>
+ <source>Mission map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="108"/>
+ <source>Hand-drawn</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="109"/>
+ <source>Randomly generated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="110"/>
+ <source>Random maze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="111"/>
<source>Random perlin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="118"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="121"/>
<source>Random</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="142"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="145"/>
<source>Map preview:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="181"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="184"/>
<source>Load map drawing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="187"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="190"/>
<source>Edit map drawing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="200"/>
- <source>All</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="201"/>
- <source>Small</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="202"/>
- <source>Medium</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="203"/>
- <source>Large</source>
+ <source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="204"/>
- <source>Cavern</source>
+ <source>Small</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="205"/>
+ <source>Medium</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="206"/>
+ <source>Large</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="207"/>
+ <source>Cavern</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="208"/>
<source>Wacky</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="215"/>
- <source>Large tunnels</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="216"/>
- <source>Small islands</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="217"/>
- <source>Medium islands</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="218"/>
+ <source>Large tunnels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="219"/>
+ <source>Small islands</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="220"/>
+ <source>Medium islands</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="221"/>
<source>Large islands</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="726"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="760"/>
<source>Map size:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="733"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="767"/>
<source>Maze style:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="740"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="774"/>
<source>Style:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="754"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="789"/>
<source>Mission:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="765"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="801"/>
<source>Map:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="829"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="960"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="884"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1012"/>
<source>Theme: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>Load drawn map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>Drawn Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="213"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="216"/>
<source>Small tunnels</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="214"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="217"/>
<source>Medium tunnels</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="133"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="136"/>
<source>Seed</source>
<translation type="unfinished"></translation>
</message>
@@ -751,7 +770,7 @@
<context>
<name>HWNewNet</name>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1576"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1574"/>
<source>Quit reason: </source>
<translation type="unfinished"></translation>
</message>
@@ -837,6 +856,11 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/input_password.cpp" line="59"/>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -862,17 +886,22 @@
<context>
<name>HatPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="83"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="63"/>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="84"/>
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="119"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="120"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="123"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="124"/>
<source>Use selected hat</source>
<translation type="unfinished"></translation>
</message>
@@ -888,27 +917,27 @@
<context>
<name>LibavInteraction</name>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="285"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="294"/>
<source>Duration: %1m %2s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="297"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="306"/>
<source>Video: %1x%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="301"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="310"/>
<source>%1 fps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="314"/>
<source>Audio: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="309"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="318"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@@ -1063,34 +1092,34 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="48"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="49"/>
<source>Load</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="49"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="50"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
<source>Load drawn map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>Drawn Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>Save drawn map</source>
<translation type="unfinished"></translation>
</message>
@@ -1601,17 +1630,17 @@
<context>
<name>PageRoomsList</name>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="85"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="93"/>
<source>Search for a room:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="112"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="120"/>
<source>Create room</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="116"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="124"/>
<source>Join room</source>
<translation type="unfinished"></translation>
</message>
@@ -1621,17 +1650,17 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="169"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="177"/>
<source>Admin features</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="171"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="179"/>
<source>Open server administration page</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="531"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="541"/>
<source>%1 players online</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -1776,37 +1805,37 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="395"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="409"/>
<source>None (Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="396"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="410"/>
<source>Wrap (World wraps)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="397"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="411"/>
<source>Bounce (Edges reflect)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="398"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="412"/>
<source>Sea (Edges connect to sea)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="434"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="448"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="435"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="449"/>
<source>New</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="436"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="450"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
@@ -1953,44 +1982,44 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="256"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="258"/>
<source>Info</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="260"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="262"/>
<source>Kick</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="264"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="266"/>
<source>Ban</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="268"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="270"/>
<source>Follow</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="272"/>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="895"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="274"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="905"/>
<source>Ignore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="276"/>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="907"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="278"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="917"/>
<source>Add friend</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="890"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="900"/>
<source>Unignore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="902"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="912"/>
<source>Remove friend</source>
<translation type="unfinished"></translation>
</message>
@@ -2004,6 +2033,16 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="80"/>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="83"/>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2362,27 +2401,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="103"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="104"/>
<source>Your Email</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="111"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="112"/>
<source>Summary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="121"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="122"/>
<source>Send system information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="136"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="137"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="164"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="165"/>
<source>Type the security code:</source>
<translation type="unfinished"></translation>
</message>
@@ -2544,21 +2583,26 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="372"/>
- <source>% Get Away Time</source>
+ <source>Air Mines</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="386"/>
+ <source>% Get Away Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="400"/>
<source>World Edge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="404"/>
- <source>Script parameter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="418"/>
+ <source>Script parameter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="432"/>
<source>Scheme Name:</source>
<translation type="unfinished"></translation>
</message>
@@ -2611,7 +2655,7 @@
<context>
<name>QLineEdit</name>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="957"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="955"/>
<source>unnamed</source>
<translation type="unfinished"></translation>
</message>
@@ -2648,82 +2692,82 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="986"/>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="534"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="984"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="549"/>
<source>Cannot delete default scheme '%1'!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1012"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1010"/>
<source>Please select a record from the list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1107"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1105"/>
<source>Hedgewars - Nick not registered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1515"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1513"/>
<source>Unable to start server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1576"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1574"/>
<source>Connection to server is lost</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2127"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2125"/>
<source>Not all players are ready</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2128"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2126"/>
<source>Are you sure you want to start this game?
Not all players are ready.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="349"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="350"/>
<location filename="../../../../QTfrontend/util/MessageDialog.cpp" line="26"/>
<source>Hedgewars - Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="359"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="360"/>
<source>System Information Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="374"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="385"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="375"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="386"/>
<source>Failed to generate captcha</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="402"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="403"/>
<source>Failed to download captcha</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="466"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="467"/>
<source>Please fill out all fields. Email is optional.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2030"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="436"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2028"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="437"/>
<source>Hedgewars - Success</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2031"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2029"/>
<source>All file associations have been set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2036"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2034"/>
<source>File association failed.</source>
<translation type="unfinished"></translation>
</message>
@@ -2791,38 +2835,38 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="492"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="502"/>
<source>Room Name - Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="493"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="503"/>
<source>Please select room from the list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="518"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="528"/>
<source>Room Name - Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="519"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="529"/>
<source>The game you are trying to join has started.
Do you still want to join the room?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="533"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="548"/>
<source>Schemes - Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="542"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="557"/>
<source>Schemes - Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="543"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="558"/>
<source>Do you really want to delete the game scheme '%1'?</source>
<translation type="unfinished"></translation>
</message>
@@ -2853,7 +2897,7 @@
<message>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="146"/>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="166"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="921"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="973"/>
<source>File error</source>
<translation type="unfinished"></translation>
</message>
@@ -2864,17 +2908,17 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="167"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="922"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="974"/>
<source>Cannot open '%1' for reading</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="370"/>
+ <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="373"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="371"/>
+ <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="374"/>
<source>Cannot use the ammo '%1'!</source>
<translation type="unfinished"></translation>
</message>
@@ -3087,22 +3131,23 @@
<context>
<name>RoomNamePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="43"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="44"/>
<source>Enter a name for your room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="56"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="57"/>
<source>set password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="72"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="73"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="35"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="74"/>
<source>Create room</source>
<translation type="unfinished"></translation>
</message>
@@ -3155,22 +3200,22 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="133"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="149"/>
<source>Random Map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="134"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="150"/>
<source>Random Maze</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="135"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="151"/>
<source>Random Perlin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="136"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="152"/>
<source>Hand-drawn</source>
<translation type="unfinished"></translation>
</message>
@@ -3178,22 +3223,27 @@
<context>
<name>SeedPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="42"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="34"/>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="43"/>
<source>The map seed is the basis for all random values generated by the game.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="61"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="62"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="63"/>
<source>Set seed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="76"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="77"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -3268,17 +3318,22 @@
<context>
<name>ThemePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="84"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="64"/>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="85"/>
<source>Search for a theme:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="120"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="121"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="125"/>
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
@@ -3984,39 +4039,39 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="134"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="133"/>
<source>Axis</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="138"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="153"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="137"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="152"/>
<source>(Up)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="142"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="157"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="141"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="156"/>
<source>(Down)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="149"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="148"/>
<source>Hat</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="161"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="160"/>
<source>(Left)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="165"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="164"/>
<source>(Right)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="173"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="172"/>
<source>Button</source>
<translation type="unfinished"></translation>
</message>
@@ -4024,57 +4079,57 @@
<context>
<name>server</name>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
<source>Restricted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
- <source>Not room master</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
- <source>Corrupted hedgehogs info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
- <source>too many teams</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
- <source>too many hedgehogs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/servermessages.h" line="16"/>
- <source>There's already a team with same name in the list</source>
+ <source>Not room master</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="17"/>
- <source>round in progress</source>
+ <source>Corrupted hedgehogs info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="18"/>
- <source>restricted</source>
+ <source>too many teams</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="19"/>
- <source>REMOVE_TEAM: no such team</source>
+ <source>too many hedgehogs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="20"/>
+ <source>There's already a team with same name in the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
+ <source>round in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
+ <source>restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+ <source>REMOVE_TEAM: no such team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
<source>Not team owner!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
<source>Less than two clans!</source>
<translation type="unfinished"></translation>
</message>
@@ -4085,161 +4140,211 @@
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="3"/>
- <source>Voting closed</source>
+ <source>Your vote counted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="4"/>
- <source>New voting started</source>
+ <source>Voting closed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="5"/>
- <source>Voting expired</source>
+ <source>Pause toggled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="6"/>
- <source>kick</source>
+ <source>New voting started</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="7"/>
- <source>map</source>
+ <source>Voting expired</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="8"/>
+ <source>kick</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
+ <source>map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
<source>pause</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
- <source>Illegal room name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
- <source>Room with such name already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
- <source>Nickname already chosen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
- <source>Illegal nickname</source>
+ <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
+ <source>number of hedgehogs in team</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="25"/>
- <source>Protocol already known</source>
+ <source>Illegal room name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="26"/>
- <source>Bad number</source>
+ <source>Room with such name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="27"/>
- <source>Nickname is already in use</source>
+ <source>/maxteams: specify number from 2 to 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="28"/>
- <source>No checker rights</source>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="29"/>
- <source>Authentication failed</source>
+ <source>callvote kick: specify nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="30"/>
- <source>60 seconds cooldown after kick</source>
+ <source>callvote kick: no such user</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="31"/>
- <source>kicked</source>
+ <source>callvote map: no such map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="32"/>
- <source>Reconnected too fast</source>
+ <source>callvote pause: no game in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="33"/>
- <source>Ping timeout</source>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="34"/>
- <source>bye</source>
+ <source>Nickname already chosen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="35"/>
- <source>No such room</source>
+ <source>Illegal nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="36"/>
- <source>Room version incompatible to your hedgewars version</source>
+ <source>Protocol already known</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="37"/>
- <source>Joining restricted</source>
+ <source>Bad number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="38"/>
- <source>Registered users only</source>
+ <source>Nickname is already in use</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="39"/>
- <source>You are banned in this room</source>
+ <source>No checker rights</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="40"/>
- <source>Warning! Chat flood protection activated</source>
+ <source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="41"/>
- <source>Excess flood</source>
+ <source>60 seconds cooldown after kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="42"/>
- <source>Game messages flood detected - 1</source>
+ <source>kicked</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="43"/>
- <source>Game messages flood detected - 2</source>
+ <source>Reconnected too fast</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="44"/>
- <source>Warning! Joins flood protection activated</source>
+ <source>Ping timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="45"/>
+ <source>bye</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
+ <source>No such room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
+ <source>Room version incompatible to your hedgewars version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
+ <source>Joining restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
+ <source>Registered users only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
+ <source>You are banned in this room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="51"/>
+ <source>Warning! Chat flood protection activated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="52"/>
+ <source>Excess flood</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="53"/>
+ <source>Game messages flood detected - 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="54"/>
+ <source>Warning! Joins flood protection activated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="55"/>
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
<source>Empty config entry</source>
<translation type="unfinished"></translation>
</message>
--- a/share/hedgewars/Data/Locale/hedgewars_nl.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_nl.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -463,6 +471,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -684,6 +699,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -717,6 +736,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KeyBinder</name>
@@ -1643,6 +1666,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2125,6 +2156,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2584,6 +2619,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2654,6 +2693,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3410,10 +3453,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3421,5 +3460,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_pl.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation>dożywotni</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>E-mail jest opcjonalny chyba, że chcesz byśmy się z tobą skontaktowali.</translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Twoja opinia</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -490,6 +498,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -718,6 +733,10 @@
<source>Password:</source>
<translation>Hasło:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -751,6 +770,10 @@
<source>Search for a hat:</source>
<translation>Szukaj czapki:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1757,6 +1780,14 @@
<source>Show games in-progress</source>
<translation>Pokaż trwające gry</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2265,6 +2296,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2765,6 +2800,10 @@
<source>Close</source>
<translation>Zamknij</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Ziarno</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2847,6 +2886,10 @@
<source>Use selected theme</source>
<translation>Użyj wybranego motywu</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3611,10 +3654,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3622,5 +3661,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation>permanente</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>Seu endereço de e-mail é opcional, mas é necessário se quiser que lhe dermos um retorno. </translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Retorno</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -480,6 +488,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -709,6 +724,10 @@
<source>Password:</source>
<translation>Senha:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -742,6 +761,10 @@
<source>Search for a hat:</source>
<translation>Buscar por um chapéu:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1738,6 +1761,14 @@
<source>Show games in-progress</source>
<translation>Mostrar jogos em andamento</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2242,6 +2273,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2715,6 +2750,10 @@
<source>Close</source>
<translation>Fechar</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Semear</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2797,6 +2836,10 @@
<source>Use selected theme</source>
<translation>Usar o tema selecionado</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3563,10 +3606,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3574,5 +3613,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation>permanente</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>O teu e-mail é opcional, mas necessário se quiseres que te contactemos de volta.</translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Feedback</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -484,6 +492,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -716,6 +731,10 @@
<source>Password:</source>
<translation>Password:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -749,6 +768,10 @@
<source>Search for a hat:</source>
<translation>Procurar:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1722,6 +1745,14 @@
<source>Show games in-progress</source>
<translation>Mostrar jogos em progresso</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2214,6 +2245,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2719,6 +2754,10 @@
<source>Close</source>
<translation>Fechar</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Semente</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2801,6 +2840,10 @@
<source>Use selected theme</source>
<translation>Utilizar o tema selecionado</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3565,10 +3608,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3576,5 +3615,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ro.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_ro.ts Fri Apr 01 15:36:19 2016 +0200
@@ -76,6 +76,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -114,6 +118,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -469,6 +477,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -694,6 +709,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -727,6 +746,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1690,6 +1713,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2176,6 +2207,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2645,6 +2680,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2715,6 +2754,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3479,10 +3522,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3490,5 +3529,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ru.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_ru.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation>постоянный</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>Адрес e-mail необязателен, но необходим, если вы хотите получить ответ.</translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Отзыв</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -489,6 +497,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -717,6 +732,10 @@
<source>Password:</source>
<translation>Пароль:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -750,6 +769,10 @@
<source>Search for a hat:</source>
<translation>Поиск по шляпам:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1073,6 +1096,8 @@
<source>(%1 %2)</source>
<translation type="unfinished">
<numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
</translation>
</message>
</context>
@@ -1754,6 +1779,14 @@
<source>Show games in-progress</source>
<translation>Показывать текущие игры</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2262,6 +2295,10 @@
<source>Script parameter</source>
<translation>Параметр скрипта</translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2427,6 +2464,8 @@
<source>Do you really want to remove %1 file(s)?</source>
<translation type="unfinished">
<numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
</translation>
</message>
<message>
@@ -2730,6 +2769,10 @@
<source>Close</source>
<translation>Закрыть</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Зерно</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2811,6 +2854,10 @@
<source>Use selected theme</source>
<translation>Использовать выбранную тему</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3575,10 +3622,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3586,5 +3629,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_sk.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_sk.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -480,6 +488,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -705,6 +720,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -738,6 +757,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1730,6 +1753,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2236,6 +2267,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2731,6 +2766,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Zrno</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2805,6 +2844,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3569,10 +3612,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3580,5 +3619,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_sv.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_sv.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -471,6 +479,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -696,6 +711,10 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -729,6 +748,10 @@
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1698,6 +1721,14 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2200,6 +2231,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2668,6 +2703,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Frö</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2742,6 +2781,10 @@
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3506,10 +3549,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3517,5 +3556,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation>kalıcı</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -130,6 +134,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Geri Bildirim</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -489,6 +497,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -721,6 +736,10 @@
<source>Password:</source>
<translation>Parola:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -754,6 +773,10 @@
<source>Search for a hat:</source>
<translation>Şapka ara:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1733,6 +1756,14 @@
<source>Show games in-progress</source>
<translation>Süren oyunları göster</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2229,6 +2260,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2731,6 +2766,10 @@
<source>Close</source>
<translation>Kapat</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Besleme</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2813,6 +2852,10 @@
<source>Use selected theme</source>
<translation>Seçili temayı kullan</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3577,10 +3620,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3588,5 +3627,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_uk.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts Fri Apr 01 15:36:19 2016 +0200
@@ -80,6 +80,10 @@
<source>permanent</source>
<translation>постійний</translation>
</message>
+ <message>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DataManager</name>
@@ -118,6 +122,10 @@
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation>Ваша електронна адреса не є обов'язковою, але потрібною, якщо ви хочете, щоб ми з вами зв'язались.</translation>
</message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">Відгук</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -491,6 +499,13 @@
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
<source>All</source>
@@ -719,6 +734,10 @@
<source>Password:</source>
<translation>Пароль:</translation>
</message>
+ <message>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -752,6 +771,10 @@
<source>Search for a hat:</source>
<translation>Шукати капелюх:</translation>
</message>
+ <message>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>KB</name>
@@ -1731,6 +1754,14 @@
<source>Show games in-progress</source>
<translation>Показувати триваючі ігри</translation>
</message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2235,6 +2266,10 @@
<source>Script parameter</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Air Mines</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -2707,6 +2742,10 @@
<source>Close</source>
<translation>Закрити</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">Висів</translation>
+ </message>
</context>
<context>
<name>SelWeaponWidget</name>
@@ -2782,6 +2821,10 @@
<source>Use selected theme</source>
<translation>Використати вибрану тему</translation>
</message>
+ <message>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>binds</name>
@@ -3546,10 +3589,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Warning! Joins flood protection activated</source>
<translation type="unfinished"></translation>
</message>
@@ -3557,5 +3596,49 @@
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Fri Apr 01 15:36:19 2016 +0200
@@ -20,12 +20,12 @@
<context>
<name>AmmoSchemeModel</name>
<message>
- <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="697"/>
+ <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="758"/>
<source>new</source>
<translation type="unfinished">新</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="703"/>
+ <location filename="../../../../QTfrontend/model/ammoSchemeModel.cpp" line="764"/>
<source>copy of %1</source>
<translation type="unfinished"></translation>
</message>
@@ -39,7 +39,7 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="41"/>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>IP</source>
<translation type="unfinished">IP</translation>
</message>
@@ -74,22 +74,27 @@
<translation type="unfinished">取消</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="80"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="61"/>
+ <source>Ban player</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="81"/>
<source>you know why</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>Please, specify %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="87"/>
+ <location filename="../../../../QTfrontend/ui/dialog/bandialog.cpp" line="88"/>
<source>nickname</source>
<translation type="unfinished"></translation>
</message>
@@ -105,37 +110,42 @@
<context>
<name>FeedbackDialog</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
<source>We are always happy about suggestions, ideas, or bug reports.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="90"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="91"/>
<source>Send us feedback!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="92"/>
- <source>If you found a bug, you can see if it's already been reported here: </source>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="63"/>
+ <source>Feedback</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="93"/>
+ <source>If you found a bug, you can see if it's already been reported here: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="94"/>
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="125"/>
<source>View</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="150"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="151"/>
<source>Cancel</source>
<translation type="unfinished">取消</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="178"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="179"/>
<source>Send Feedback</source>
<translation type="unfinished"></translation>
</message>
@@ -186,7 +196,7 @@
<context>
<name>GameUIConfig</name>
<message>
- <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="115"/>
+ <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="116"/>
<source>Guest</source>
<translation type="unfinished"></translation>
</message>
@@ -239,72 +249,73 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="102"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="105"/>
<source>Cannot create directory %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="138"/>
- <source>Usage</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="139"/>
- <source>OPTION</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/main.cpp" line="140"/>
- <source>CONNECTSTRING</source>
- <comment>command-line</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/main.cpp" line="141"/>
- <source>Options</source>
+ <source>Usage</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="142"/>
- <source>Display this help</source>
+ <source>OPTION</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="143"/>
- <source>Custom path for configuration data and user data</source>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
+ <source>CONNECTSTRING</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="144"/>
- <source>Custom path to the game data folder</source>
+ <source>Options</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/main.cpp" line="145"/>
+ <source>Display this help</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="146"/>
+ <source>Custom path for configuration data and user data</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="147"/>
+ <source>Custom path to the game data folder</source>
+ <comment>command-line</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/main.cpp" line="148"/>
<source>Hedgewars can use a %1 (e.g. "%2") to connect on start.</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="191"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="196"/>
<source>Malformed option argument: %1</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="231"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="236"/>
<source>Unknown option argument: %1</source>
<comment>command-line</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/main.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/main.cpp" line="310"/>
<source>Failed to open data directory:
%1
@@ -323,67 +334,67 @@
<context>
<name>HWChatWidget</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="505"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="509"/>
<source>%1 has joined</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="526"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="530"/>
<source>%1 has left</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="528"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="532"/>
<source>%1 has left (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="657"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="661"/>
<source>%1 has been removed from your ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="667"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="671"/>
<source>%1 has been added to your ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="697"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="701"/>
<source>%1 has been removed from your friends list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="706"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="710"/>
<source>%1 has been added to your friends list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="772"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="776"/>
<source>Stylesheet imported from %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="773"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="777"/>
<source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="781"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="785"/>
<source>Couldn't read %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="789"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="793"/>
<source>StyleSheet discarded</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="813"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="817"/>
<source>StyleSheet saved to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="816"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="820"/>
<source>Failed to save StyleSheet to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -392,34 +403,34 @@
<name>HWForm</name>
<message>
<location filename="../../../../QTfrontend/hwform.cpp" line="156"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="476"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1399"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1418"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="474"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1397"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1416"/>
<source>Guest</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="481"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="479"/>
<source>DefaultTeam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="485"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="483"/>
<source>%1's Team</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="641"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="639"/>
<source>Game aborted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1080"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1078"/>
<source>Hedgewars - Nick registered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1081"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1079"/>
<source>This nick is registered, and you haven't specified a password.
If this nick isn't yours, please register your own nick at www.hedgewars.org
@@ -428,109 +439,109 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1109"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1107"/>
<source>Your nickname is not registered.
To prevent someone else from using it,
please register it at www.hedgewars.org</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1114"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1112"/>
<source>
Your password wasn't saved either.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1124"/>
<source>Nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1124"/>
<source>Someone already uses your nickname %1 on the server.
Please pick another nickname:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1131"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1452"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1129"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1450"/>
<source>No nickname supplied.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1131"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1452"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1129"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1450"/>
<source>Hedgewars - Empty nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1158"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1156"/>
<source>Hedgewars - Wrong password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1158"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1156"/>
<source>You entered a wrong password.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1170"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1168"/>
<source>Room password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1170"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1168"/>
<source>The room is protected with password.
Please, enter the password:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1186"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1184"/>
<source>Try Again</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1556"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1554"/>
<source>Hedgewars - Connection error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1556"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1554"/>
<source>You reconnected too fast.
Please wait a few seconds and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1990"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1988"/>
<source>Hedgewars Demo File</source>
<comment>File Types</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1991"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1989"/>
<source>Hedgewars Save File</source>
<comment>File Types</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2052"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2050"/>
<source>Demo name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2052"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2050"/>
<source>Demo name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2120"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2118"/>
<source>This page requires an internet connection.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1713"/>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2060"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1711"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2058"/>
<source>Cannot save record to file %1</source>
<translation>无法录入文件 %1</translation>
</message>
@@ -538,7 +549,7 @@
<context>
<name>HWGame</name>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="252"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="255"/>
<source>A Fatal ERROR occured! - The game engine had to stop.
We are very sorry for the inconvenience :(
@@ -550,182 +561,190 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="383"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="386"/>
<location filename="../../../../QTfrontend/net/recorder.cpp" line="113"/>
<source>en.txt</source>
<translation>zh_CN.txt</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/game.cpp" line="433"/>
+ <location filename="../../../../QTfrontend/game.cpp" line="436"/>
<source>Cannot open demofile %1</source>
<translation>DEMO %1 打不开</translation>
</message>
</context>
<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="66"/>
+ <source>Connect to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>HWMapContainer</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="213"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="216"/>
<source>Small tunnels</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="214"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="217"/>
<source>Medium tunnels</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="133"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="136"/>
<source>Seed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="100"/>
- <source>Map type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="103"/>
- <source>Image map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="104"/>
- <source>Mission map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="105"/>
- <source>Hand-drawn</source>
+ <source>Map type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="106"/>
- <source>Randomly generated</source>
+ <source>Image map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="107"/>
- <source>Random maze</source>
+ <source>Mission map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="108"/>
+ <source>Hand-drawn</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="109"/>
+ <source>Randomly generated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="110"/>
+ <source>Random maze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="111"/>
<source>Random perlin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="118"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="121"/>
<source>Random</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="142"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="145"/>
<source>Map preview:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="181"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="184"/>
<source>Load map drawing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="187"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="190"/>
<source>Edit map drawing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="200"/>
- <source>All</source>
- <translation>全部</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="201"/>
- <source>Small</source>
- <translation>小型</translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="202"/>
- <source>Medium</source>
- <translation>中型</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="203"/>
- <source>Large</source>
- <translation>大型</translation>
+ <source>All</source>
+ <translation>全部</translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="204"/>
- <source>Cavern</source>
- <translation>洞穴</translation>
+ <source>Small</source>
+ <translation>小型</translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="205"/>
+ <source>Medium</source>
+ <translation>中型</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="206"/>
+ <source>Large</source>
+ <translation>大型</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="207"/>
+ <source>Cavern</source>
+ <translation>洞穴</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="208"/>
<source>Wacky</source>
<translation>曲折</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="215"/>
- <source>Large tunnels</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="216"/>
- <source>Small islands</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="217"/>
- <source>Medium islands</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="218"/>
+ <source>Large tunnels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="219"/>
+ <source>Small islands</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="220"/>
+ <source>Medium islands</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="221"/>
<source>Large islands</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="726"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="760"/>
<source>Map size:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="733"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="767"/>
<source>Maze style:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="740"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="774"/>
<source>Style:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="754"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="789"/>
<source>Mission:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="765"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="801"/>
<source>Map:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="829"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="960"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="884"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1012"/>
<source>Theme: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>Load drawn map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>Drawn Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="911"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="963"/>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
@@ -797,7 +816,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1576"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1574"/>
<source>Quit reason: </source>
<translation>退出原因:</translation>
</message>
@@ -837,6 +856,11 @@
<source>Password:</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/dialog/input_password.cpp" line="59"/>
+ <source>New Account</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWUploadVideoDialog</name>
@@ -862,17 +886,22 @@
<context>
<name>HatPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="83"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="63"/>
+ <source>Choose a hat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="84"/>
<source>Search for a hat:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="119"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="120"/>
<source>Cancel</source>
<translation type="unfinished">取消</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="123"/>
+ <location filename="../../../../QTfrontend/ui/widget/hatprompt.cpp" line="124"/>
<source>Use selected hat</source>
<translation type="unfinished"></translation>
</message>
@@ -895,27 +924,27 @@
<context>
<name>LibavInteraction</name>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="285"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="294"/>
<source>Duration: %1m %2s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="297"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="306"/>
<source>Video: %1x%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="301"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="310"/>
<source>%1 fps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="305"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="314"/>
<source>Audio: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="309"/>
+ <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="318"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@@ -1070,34 +1099,34 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="48"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="49"/>
<source>Load</source>
<translation type="unfinished">读取</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="49"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="50"/>
<source>Save</source>
<translation type="unfinished">保存</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
<source>Load drawn map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>Drawn Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="78"/>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="79"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="86"/>
+ <location filename="../../../../QTfrontend/ui/page/pagedrawmap.cpp" line="87"/>
<source>Save drawn map</source>
<translation type="unfinished"></translation>
</message>
@@ -1612,17 +1641,17 @@
<context>
<name>PageRoomsList</name>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="85"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="93"/>
<source>Search for a room:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="112"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="120"/>
<source>Create room</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="116"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="124"/>
<source>Join room</source>
<translation type="unfinished"></translation>
</message>
@@ -1632,7 +1661,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="171"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="179"/>
<source>Open server administration page</source>
<translation type="unfinished"></translation>
</message>
@@ -1645,14 +1674,14 @@
<translation type="obsolete">加入</translation>
</message>
<message numerus="yes">
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="531"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="541"/>
<source>%1 players online</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="169"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="177"/>
<source>Admin features</source>
<translation>管理员功能</translation>
</message>
@@ -1795,37 +1824,37 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="395"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="409"/>
<source>None (Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="396"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="410"/>
<source>Wrap (World wraps)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="397"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="411"/>
<source>Bounce (Edges reflect)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="398"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="412"/>
<source>Sea (Edges connect to sea)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="434"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="448"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="435"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="449"/>
<source>New</source>
<translation>新游戏</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="436"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="450"/>
<source>Delete</source>
<translation>删除</translation>
</message>
@@ -1957,7 +1986,7 @@
<context>
<name>QAction</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="260"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="262"/>
<source>Kick</source>
<translation>踢</translation>
</message>
@@ -1981,39 +2010,39 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="256"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="258"/>
<source>Info</source>
<translation>信息</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="264"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="266"/>
<source>Ban</source>
<translation>屏蔽</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="268"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="270"/>
<source>Follow</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="272"/>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="895"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="274"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="905"/>
<source>Ignore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="276"/>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="907"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="278"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="917"/>
<source>Add friend</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="890"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="900"/>
<source>Unignore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="902"/>
+ <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="912"/>
<source>Remove friend</source>
<translation type="unfinished"></translation>
</message>
@@ -2027,6 +2056,16 @@
<source>Show games in-progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="80"/>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="83"/>
+ <source>Show join restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QCheckBox</name>
@@ -2478,21 +2517,26 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="372"/>
- <source>% Get Away Time</source>
+ <source>Air Mines</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="386"/>
+ <source>% Get Away Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="400"/>
<source>World Edge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="404"/>
- <source>Script parameter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="418"/>
+ <source>Script parameter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="432"/>
<source>Scheme Name:</source>
<translation>设置名称:</translation>
</message>
@@ -2564,27 +2608,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="103"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="104"/>
<source>Your Email</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="111"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="112"/>
<source>Summary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="121"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="122"/>
<source>Send system information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="136"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="137"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="164"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="165"/>
<source>Type the security code:</source>
<translation type="unfinished"></translation>
</message>
@@ -2638,7 +2682,7 @@
<context>
<name>QLineEdit</name>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="957"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="955"/>
<source>unnamed</source>
<translation>无名</translation>
</message>
@@ -2665,12 +2709,12 @@
<context>
<name>QMessageBox</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="370"/>
+ <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="373"/>
<source>Error</source>
<translation>错误</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="371"/>
+ <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="374"/>
<source>Cannot use the ammo '%1'!</source>
<translation type="unfinished"></translation>
</message>
@@ -2685,82 +2729,82 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="986"/>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="534"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="984"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="549"/>
<source>Cannot delete default scheme '%1'!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1012"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1010"/>
<source>Please select a record from the list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1107"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1105"/>
<source>Hedgewars - Nick not registered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1515"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1513"/>
<source>Unable to start server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="1576"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="1574"/>
<source>Connection to server is lost</source>
<translation>服务器连接丢失</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2127"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2125"/>
<source>Not all players are ready</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2128"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2126"/>
<source>Are you sure you want to start this game?
Not all players are ready.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="349"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="350"/>
<location filename="../../../../QTfrontend/util/MessageDialog.cpp" line="26"/>
<source>Hedgewars - Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="359"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="360"/>
<source>System Information Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="374"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="385"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="375"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="386"/>
<source>Failed to generate captcha</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="402"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="403"/>
<source>Failed to download captcha</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="466"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="467"/>
<source>Please fill out all fields. Email is optional.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2030"/>
- <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="436"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2028"/>
+ <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="437"/>
<source>Hedgewars - Success</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2031"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2029"/>
<source>All file associations have been set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/hwform.cpp" line="2036"/>
+ <location filename="../../../../QTfrontend/hwform.cpp" line="2034"/>
<source>File association failed.</source>
<translation type="unfinished"></translation>
</message>
@@ -2828,38 +2872,38 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="492"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="502"/>
<source>Room Name - Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="493"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="503"/>
<source>Please select room from the list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="518"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="528"/>
<source>Room Name - Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="519"/>
+ <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="529"/>
<source>The game you are trying to join has started.
Do you still want to join the room?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="533"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="548"/>
<source>Schemes - Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="542"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="557"/>
<source>Schemes - Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="543"/>
+ <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="558"/>
<source>Do you really want to delete the game scheme '%1'?</source>
<translation type="unfinished"></translation>
</message>
@@ -2890,7 +2934,7 @@
<message>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="146"/>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="166"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="921"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="973"/>
<source>File error</source>
<translation type="unfinished"></translation>
</message>
@@ -2901,7 +2945,7 @@
</message>
<message>
<location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="167"/>
- <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="922"/>
+ <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="974"/>
<source>Cannot open '%1' for reading</source>
<translation type="unfinished"></translation>
</message>
@@ -3114,22 +3158,23 @@
<context>
<name>RoomNamePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="43"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="44"/>
<source>Enter a name for your room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="56"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="57"/>
<source>set password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="72"/>
- <source>Cancel</source>
- <translation type="unfinished">取消</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="73"/>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="35"/>
+ <location filename="../../../../QTfrontend/ui/widget/roomnameprompt.cpp" line="74"/>
<source>Create room</source>
<translation type="unfinished"></translation>
</message>
@@ -3182,22 +3227,22 @@
<translation type="unfinished">武器</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="133"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="149"/>
<source>Random Map</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="134"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="150"/>
<source>Random Maze</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="135"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="151"/>
<source>Random Perlin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="136"/>
+ <location filename="../../../../QTfrontend/model/roomslistmodel.cpp" line="152"/>
<source>Hand-drawn</source>
<translation type="unfinished"></translation>
</message>
@@ -3205,22 +3250,27 @@
<context>
<name>SeedPrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="42"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="34"/>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="43"/>
<source>The map seed is the basis for all random values generated by the game.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="61"/>
- <source>Cancel</source>
- <translation type="unfinished">取消</translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="62"/>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="63"/>
<source>Set seed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="76"/>
+ <location filename="../../../../QTfrontend/ui/widget/seedprompt.cpp" line="77"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -3295,17 +3345,22 @@
<context>
<name>ThemePrompt</name>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="84"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="64"/>
+ <source>Choose a theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="85"/>
<source>Search for a theme:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="120"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="121"/>
<source>Cancel</source>
<translation type="unfinished">取消</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="124"/>
+ <location filename="../../../../QTfrontend/ui/widget/themeprompt.cpp" line="125"/>
<source>Use selected theme</source>
<translation type="unfinished"></translation>
</message>
@@ -4015,39 +4070,39 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="134"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="133"/>
<source>Axis</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="138"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="153"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="137"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="152"/>
<source>(Up)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="142"/>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="157"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="141"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="156"/>
<source>(Down)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="149"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="148"/>
<source>Hat</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="161"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="160"/>
<source>(Left)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="165"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="164"/>
<source>(Right)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="173"/>
+ <location filename="../../../../QTfrontend/util/SDLInteraction.cpp" line="172"/>
<source>Button</source>
<translation type="unfinished"></translation>
</message>
@@ -4055,57 +4110,57 @@
<context>
<name>server</name>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
<source>Restricted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
- <source>Not room master</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
- <source>Corrupted hedgehogs info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
- <source>too many teams</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
- <source>too many hedgehogs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../../../QTfrontend/servermessages.h" line="16"/>
- <source>There's already a team with same name in the list</source>
+ <source>Not room master</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="17"/>
- <source>round in progress</source>
+ <source>Corrupted hedgehogs info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="18"/>
- <source>restricted</source>
+ <source>too many teams</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="19"/>
- <source>REMOVE_TEAM: no such team</source>
+ <source>too many hedgehogs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="20"/>
+ <source>There's already a team with same name in the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
+ <source>round in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
+ <source>restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+ <source>REMOVE_TEAM: no such team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
<source>Not team owner!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="13"/>
<source>Less than two clans!</source>
<translation type="unfinished"></translation>
</message>
@@ -4116,161 +4171,211 @@
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="3"/>
- <source>Voting closed</source>
+ <source>Your vote counted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="4"/>
- <source>New voting started</source>
+ <source>Voting closed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="5"/>
- <source>Voting expired</source>
+ <source>Pause toggled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="6"/>
- <source>kick</source>
+ <source>New voting started</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="7"/>
- <source>map</source>
+ <source>Voting expired</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="8"/>
+ <source>kick</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="9"/>
+ <source>map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
<source>pause</source>
<translation type="unfinished">暂停</translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
- <source>Illegal room name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
- <source>Room with such name already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
- <source>Nickname already chosen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
- <source>Illegal nickname</source>
+ <location filename="../../../../QTfrontend/servermessages.h" line="11"/>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="12"/>
+ <source>number of hedgehogs in team</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="25"/>
- <source>Protocol already known</source>
+ <source>Illegal room name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="26"/>
- <source>Bad number</source>
+ <source>Room with such name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="27"/>
- <source>Nickname is already in use</source>
+ <source>/maxteams: specify number from 2 to 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="28"/>
- <source>No checker rights</source>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="29"/>
- <source>Authentication failed</source>
+ <source>callvote kick: specify nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="30"/>
- <source>60 seconds cooldown after kick</source>
+ <source>callvote kick: no such user</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="31"/>
- <source>kicked</source>
+ <source>callvote map: no such map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="32"/>
- <source>Reconnected too fast</source>
+ <source>callvote pause: no game in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="33"/>
- <source>Ping timeout</source>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="34"/>
- <source>bye</source>
+ <source>Nickname already chosen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="35"/>
- <source>No such room</source>
+ <source>Illegal nickname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="36"/>
- <source>Room version incompatible to your hedgewars version</source>
+ <source>Protocol already known</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="37"/>
- <source>Joining restricted</source>
+ <source>Bad number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="38"/>
- <source>Registered users only</source>
+ <source>Nickname is already in use</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="39"/>
- <source>You are banned in this room</source>
+ <source>No checker rights</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="40"/>
- <source>Warning! Chat flood protection activated</source>
+ <source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="41"/>
- <source>Excess flood</source>
+ <source>60 seconds cooldown after kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="42"/>
- <source>Game messages flood detected - 1</source>
+ <source>kicked</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="43"/>
- <source>Game messages flood detected - 2</source>
+ <source>Reconnected too fast</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="44"/>
- <source>Warning! Joins flood protection activated</source>
+ <source>Ping timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../../QTfrontend/servermessages.h" line="45"/>
+ <source>bye</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
+ <source>No such room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
+ <source>Room version incompatible to your hedgewars version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
+ <source>Joining restricted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
+ <source>Registered users only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
+ <source>You are banned in this room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="51"/>
+ <source>Warning! Chat flood protection activated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="52"/>
+ <source>Excess flood</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="53"/>
+ <source>Game messages flood detected - 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="54"/>
+ <source>Warning! Joins flood protection activated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../QTfrontend/servermessages.h" line="55"/>
<source>There's no voting going on</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../../../QTfrontend/servermessages.h" line="10"/>
+ <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
<source>Empty config entry</source>
<translation type="unfinished"></translation>
</message>
--- a/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Fri Apr 01 15:36:19 2016 +0200
@@ -5,14 +5,14 @@
<name>About</name>
<message>
<source>Unknown Compiler</source>
- <translation type="unfinished"></translation>
+ <translation>未知的編譯器</translation>
</message>
</context>
<context>
<name>AbstractPage</name>
<message>
<source>Go back</source>
- <translation type="unfinished"></translation>
+ <translation>退回</translation>
</message>
</context>
<context>
@@ -23,57 +23,61 @@
</message>
<message>
<source>copy of %1</source>
- <translation type="unfinished"></translation>
+ <translation>%1的拷貝</translation>
</message>
</context>
<context>
<name>BanDialog</name>
<message>
<source>IP</source>
- <translation type="unfinished">IP</translation>
+ <translation>IP</translation>
</message>
<message>
<source>Nick</source>
- <translation type="unfinished"></translation>
+ <translation>暱稱</translation>
</message>
<message>
<source>IP/Nick</source>
- <translation type="unfinished"></translation>
+ <translation>IP/暱稱</translation>
</message>
<message>
<source>Reason</source>
- <translation type="unfinished"></translation>
+ <translation>原因</translation>
</message>
<message>
<source>Duration</source>
- <translation type="unfinished"></translation>
+ <translation>持續時間</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished"></translation>
+ <translation>確定</translation>
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">取消</translation>
+ <translation>取消</translation>
</message>
<message>
<source>you know why</source>
- <translation type="unfinished"></translation>
+ <translation>你知道為什麼</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished"></translation>
+ <translation>警告</translation>
</message>
<message>
<source>Please, specify %1</source>
- <translation type="unfinished"></translation>
+ <translation>請指定%1</translation>
</message>
<message>
<source>nickname</source>
- <translation type="unfinished"></translation>
+ <translation>暱稱</translation>
</message>
<message>
<source>permanent</source>
+ <translation>永久</translation>
+ </message>
+ <message>
+ <source>Ban player</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -81,38 +85,42 @@
<name>DataManager</name>
<message>
<source>Use Default</source>
- <translation type="unfinished"></translation>
+ <translation>使用預設值</translation>
</message>
</context>
<context>
<name>FeedbackDialog</name>
<message>
<source>View</source>
- <translation type="unfinished"></translation>
+ <translation>查看</translation>
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">取消</translation>
+ <translation>取消</translation>
</message>
<message>
<source>Send Feedback</source>
- <translation type="unfinished"></translation>
+ <translation>發送反饋</translation>
</message>
<message>
<source>We are always happy about suggestions, ideas, or bug reports.</source>
- <translation type="unfinished"></translation>
+ <translation>我們很樂意收到建議,想法,或是bug回報。</translation>
</message>
<message>
<source>Send us feedback!</source>
- <translation type="unfinished"></translation>
+ <translation>給我們反饋!</translation>
</message>
<message>
<source>If you found a bug, you can see if it's already been reported here: </source>
- <translation type="unfinished"></translation>
+ <translation>如果你發現了一個bug,可以先檢查它是否已經被回報過:</translation>
</message>
<message>
<source>Your email address is optional, but necessary if you want us to get back at you.</source>
- <translation type="unfinished"></translation>
+ <translation>如果希望我們回覆你, 請留下你的電子郵件地址。</translation>
+ </message>
+ <message>
+ <source>Feedback</source>
+ <translation type="unfinished">信息反饋</translation>
</message>
</context>
<context>
@@ -132,244 +140,246 @@
<name>GameCFGWidget</name>
<message>
<source>Edit weapons</source>
- <translation type="unfinished">改變武器設置</translation>
+ <translation type="unfinished">修改武器</translation>
</message>
<message>
<source>Edit schemes</source>
- <translation type="unfinished">修改遊戲設置</translation>
+ <translation type="unfinished">修改方案</translation>
</message>
<message>
<source>Game scheme will auto-select a weapon</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">遊戲方案將自動選擇武器</translation>
</message>
<message>
<source>Map</source>
- <translation type="unfinished">地圖</translation>
+ <translation>地圖</translation>
</message>
<message>
<source>Game options</source>
- <translation type="unfinished"></translation>
+ <translation>遊戲選項</translation>
</message>
</context>
<context>
<name>GameUIConfig</name>
<message>
<source>Guest</source>
- <translation type="unfinished"></translation>
+ <translation>遊客</translation>
</message>
</context>
<context>
<name>HWApplication</name>
<message numerus="yes">
<source>%1 minutes</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 分鐘</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 hour</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 小時</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 hours</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 小時</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 day</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 天</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 days</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 天</numerusform>
</translation>
</message>
<message>
<source>Scheme '%1' not supported</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不支持遊戲方案“%1”</translation>
</message>
<message>
<source>Cannot create directory %1</source>
- <translation type="unfinished">無法創建路徑 %1</translation>
+ <translation>不能建立目錄 %1</translation>
</message>
<message>
<source>Failed to open data directory:
%1
Please check your installation!</source>
- <translation type="unfinished"></translation>
+ <translation>無法打開數據目錄:%1
+請檢查你的安裝!</translation>
</message>
<message>
<source>Usage</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>用法</translation>
</message>
<message>
<source>OPTION</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>選項</translation>
</message>
<message>
<source>CONNECTSTRING</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">連接字串</translation>
</message>
<message>
<source>Options</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>選項</translation>
</message>
<message>
<source>Display this help</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>顯示此幫助</translation>
</message>
<message>
<source>Custom path for configuration data and user data</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>自定義路徑用於儲存配置和用戶數據</translation>
</message>
<message>
<source>Custom path to the game data folder</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>自定義路徑相對於遊戲數據文件夾</translation>
</message>
<message>
<source>Hedgewars can use a %1 (e.g. "%2") to connect on start.</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">啟動刺蝟大作戰能使用%1(例如 "%2")來連線</translation>
</message>
<message>
<source>Malformed option argument: %1</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>格式不正確的選項參數:%1</translation>
</message>
<message>
<source>Unknown option argument: %1</source>
<comment>command-line</comment>
- <translation type="unfinished"></translation>
+ <translation>未知的選項參數:%1</translation>
</message>
</context>
<context>
<name>HWAskQuitDialog</name>
<message>
<source>Do you really want to quit?</source>
- <translation type="unfinished"></translation>
+ <translation>你真的要退出嗎?</translation>
</message>
</context>
<context>
<name>HWChatWidget</name>
<message>
<source>%1 has been removed from your ignore list</source>
- <translation type="unfinished"></translation>
+ <translation>%1已從你的忽略列表中刪除</translation>
</message>
<message>
<source>%1 has been added to your ignore list</source>
- <translation type="unfinished"></translation>
+ <translation>%1已添加到你的忽略列表</translation>
</message>
<message>
<source>%1 has been removed from your friends list</source>
- <translation type="unfinished"></translation>
+ <translation>%1已從你的好友列表中刪除</translation>
</message>
<message>
<source>%1 has been added to your friends list</source>
- <translation type="unfinished"></translation>
+ <translation>%1已添加到你的好友列表</translation>
</message>
<message>
<source>Stylesheet imported from %1</source>
- <translation type="unfinished"></translation>
+ <translation>樣式表已從%1導入</translation>
</message>
<message>
<source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
- <translation type="unfinished"></translation>
+ <translation>如果你未來想使用當前的樣式表,請輸入%1 ;重置,請輸入%2!</translation>
</message>
<message>
<source>Couldn't read %1</source>
- <translation type="unfinished"></translation>
+ <translation>無法讀取 %1</translation>
</message>
<message>
<source>StyleSheet discarded</source>
- <translation type="unfinished"></translation>
+ <translation>樣式表被丟棄</translation>
</message>
<message>
<source>StyleSheet saved to %1</source>
- <translation type="unfinished"></translation>
+ <translation>樣式表保存到%1</translation>
</message>
<message>
<source>Failed to save StyleSheet to %1</source>
- <translation type="unfinished"></translation>
+ <translation>無法保存樣式表%1</translation>
</message>
<message>
<source>%1 has joined</source>
- <translation type="unfinished"></translation>
+ <translation>%1已經加入</translation>
</message>
<message>
<source>%1 has left</source>
- <translation type="unfinished"></translation>
+ <translation>%1已經離開</translation>
</message>
<message>
<source>%1 has left (%2)</source>
- <translation type="unfinished"></translation>
+ <translation>%1已經離開(%2)</translation>
</message>
</context>
<context>
<name>HWForm</name>
<message>
<source>Cannot save record to file %1</source>
- <translation>無法錄入檔 %1</translation>
+ <translation>無法保存記錄到文件%1</translation>
</message>
<message>
<source>DefaultTeam</source>
- <translation type="unfinished"></translation>
+ <translation>預設隊伍</translation>
</message>
<message>
<source>Hedgewars Demo File</source>
<comment>File Types</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰演示檔</translation>
</message>
<message>
<source>Hedgewars Save File</source>
<comment>File Types</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰存檔</translation>
</message>
<message>
<source>Demo name</source>
- <translation type="unfinished"></translation>
+ <translation>演示名稱</translation>
</message>
<message>
<source>Demo name:</source>
- <translation type="unfinished"></translation>
+ <translation>演示名稱:</translation>
</message>
<message>
<source>Game aborted</source>
- <translation type="unfinished"></translation>
+ <translation>比賽中止</translation>
</message>
<message>
<source>Nickname</source>
- <translation type="unfinished">匿稱</translation>
+ <translation>匿稱</translation>
</message>
<message>
<source>No nickname supplied.</source>
- <translation type="unfinished"></translation>
+ <translation>沒有暱稱供應。</translation>
</message>
<message>
<source>Someone already uses your nickname %1 on the server.
Please pick another nickname:</source>
- <translation type="unfinished"></translation>
+ <translation>在伺服器上已經有人使用你的暱稱(%1)
+請選擇另一個暱稱:</translation>
</message>
<message>
<source>%1's Team</source>
- <translation type="unfinished"></translation>
+ <translation>%1的隊伍</translation>
</message>
<message>
<source>Hedgewars - Nick registered</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 暱稱註冊</translation>
</message>
<message>
<source>This nick is registered, and you haven't specified a password.
@@ -377,61 +387,67 @@
If this nick isn't yours, please register your own nick at www.hedgewars.org
Password:</source>
- <translation type="unfinished"></translation>
+ <translation>這個暱稱被註冊,並且你還沒有指定密碼
+如果這個暱稱是不是你的,請上www.hedgewars.org註冊自己的暱稱
+密碼:</translation>
</message>
<message>
<source>Your nickname is not registered.
To prevent someone else from using it,
please register it at www.hedgewars.org</source>
- <translation type="unfinished"></translation>
+ <translation>你的暱稱未註冊。
+要防止其他人使用它,
+請上www.hedgewars.org進行註冊</translation>
</message>
<message>
<source>
Your password wasn't saved either.</source>
- <translation type="unfinished"></translation>
+ <translation>未保存任何你的密碼。</translation>
</message>
<message>
<source>Hedgewars - Empty nickname</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 空的暱稱</translation>
</message>
<message>
<source>Hedgewars - Wrong password</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 密碼錯誤</translation>
</message>
<message>
<source>You entered a wrong password.</source>
- <translation type="unfinished"></translation>
+ <translation>你輸入了錯誤的密碼。</translation>
</message>
<message>
<source>Try Again</source>
- <translation type="unfinished"></translation>
+ <translation>再試一次</translation>
</message>
<message>
<source>Hedgewars - Connection error</source>
- <translation type="unfinished"></translation>
+ <translation>刺蝟大作戰 - 連接錯誤</translation>
</message>
<message>
<source>You reconnected too fast.
Please wait a few seconds and try again.</source>
- <translation type="unfinished"></translation>
+ <translation>你太快重新連接了。
+請等待幾秒鐘,然後再試一次。</translation>
</message>
<message>
<source>This page requires an internet connection.</source>
- <translation type="unfinished"></translation>
+ <translation>此頁面需要連接網際網路。</translation>
</message>
<message>
<source>Guest</source>
- <translation type="unfinished"></translation>
+ <translation>遊客</translation>
</message>
<message>
<source>Room password</source>
- <translation type="unfinished"></translation>
+ <translation>房間密碼</translation>
</message>
<message>
<source>The room is protected with password.
Please, enter the password:</source>
- <translation type="unfinished"></translation>
+ <translation>房間使用密碼保護
+請輸入密碼:</translation>
</message>
</context>
<context>
@@ -442,7 +458,7 @@
</message>
<message>
<source>Cannot open demofile %1</source>
- <translation>DEMO %1 打不開</translation>
+ <translation>無法打開 演示檔案 %1</translation>
</message>
<message>
<source>A Fatal ERROR occured! - The game engine had to stop.
@@ -453,6 +469,17 @@
Last two engine messages:
%2</source>
+ <translation>一個致命的錯誤! - 遊戲引擎不得不停止
+我們很抱歉給你帶來不便:(
+如果這一情況持續發生,請點擊主菜單中的“%1”按鈕
+上次兩款發動機的消息:
+%2</translation>
+ </message>
+</context>
+<context>
+ <name>HWHostPortDialog</name>
+ <message>
+ <source>Connect to server</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -484,103 +511,103 @@
</message>
<message>
<source>Small tunnels</source>
- <translation type="unfinished"></translation>
+ <translation>小隧道</translation>
</message>
<message>
<source>Medium tunnels</source>
- <translation type="unfinished"></translation>
+ <translation>中隧道</translation>
</message>
<message>
<source>Seed</source>
- <translation type="unfinished"></translation>
+ <translation>種子</translation>
</message>
<message>
<source>Map type:</source>
- <translation type="unfinished"></translation>
+ <translation>地圖類型:</translation>
</message>
<message>
<source>Image map</source>
- <translation type="unfinished"></translation>
+ <translation>圖片地圖</translation>
</message>
<message>
<source>Mission map</source>
- <translation type="unfinished"></translation>
+ <translation>任務地圖</translation>
</message>
<message>
<source>Hand-drawn</source>
- <translation type="unfinished"></translation>
+ <translation>手繪</translation>
</message>
<message>
<source>Randomly generated</source>
- <translation type="unfinished"></translation>
+ <translation>隨機產生</translation>
</message>
<message>
<source>Random maze</source>
- <translation type="unfinished"></translation>
+ <translation>隨機迷宮</translation>
</message>
<message>
<source>Random</source>
- <translation type="unfinished">隨機</translation>
+ <translation>隨機</translation>
</message>
<message>
<source>Map preview:</source>
- <translation type="unfinished"></translation>
+ <translation>地圖預覽:</translation>
</message>
<message>
<source>Load map drawing</source>
- <translation type="unfinished"></translation>
+ <translation>加載地圖繪製</translation>
</message>
<message>
<source>Edit map drawing</source>
- <translation type="unfinished"></translation>
+ <translation>編輯地圖繪製</translation>
</message>
<message>
<source>Small islands</source>
- <translation type="unfinished"></translation>
+ <translation>小島嶼</translation>
</message>
<message>
<source>Medium islands</source>
- <translation type="unfinished"></translation>
+ <translation>中島嶼</translation>
</message>
<message>
<source>Large islands</source>
- <translation type="unfinished"></translation>
+ <translation>大島嶼</translation>
</message>
<message>
<source>Map size:</source>
- <translation type="unfinished"></translation>
+ <translation>地圖尺寸:</translation>
</message>
<message>
<source>Maze style:</source>
- <translation type="unfinished"></translation>
+ <translation>迷宮的風格:</translation>
</message>
<message>
<source>Mission:</source>
- <translation type="unfinished"></translation>
+ <translation>任務:</translation>
</message>
<message>
<source>Map:</source>
- <translation type="unfinished"></translation>
+ <translation>地圖:</translation>
</message>
<message>
<source>Load drawn map</source>
- <translation type="unfinished"></translation>
+ <translation>加載繪製的地圖</translation>
</message>
<message>
<source>Drawn Maps</source>
- <translation type="unfinished"></translation>
+ <translation>繪製地圖</translation>
</message>
<message>
<source>All files</source>
- <translation type="unfinished"></translation>
+ <translation>所有文件</translation>
</message>
<message>
<source>Large tunnels</source>
- <translation type="unfinished"></translation>
+ <translation>大隧道</translation>
</message>
<message>
<source>Theme: %1</source>
- <translation type="unfinished"></translation>
+ <translation>主題:%1</translation>
</message>
<message>
<source>Random perlin</source>
@@ -588,7 +615,7 @@
</message>
<message>
<source>Style:</source>
- <translation type="unfinished"></translation>
+ <translation>風格:</translation>
</message>
</context>
<context>
@@ -603,14 +630,14 @@
</message>
<message>
<source>Port</source>
- <translation>埠</translation>
+ <translation>端口</translation>
</message>
</context>
<context>
<name>HWNewNet</name>
<message>
<source>The host was not found. Please check the host name and port settings.</source>
- <translation>錯誤沒找到這個主機。請檢查主機名稱和埠設置。</translation>
+ <translation>錯誤沒找到這個主機。請檢查主機名稱和端口設置。</translation>
</message>
<message>
<source>Connection refused</source>
@@ -646,40 +673,47 @@
</message>
<message>
<source>User quit</source>
- <translation type="unfinished"></translation>
+ <translation>用戶退出</translation>
</message>
<message>
<source>Remote host has closed connection</source>
- <translation type="unfinished"></translation>
+ <translation>遠程主機已關閉連接</translation>
</message>
<message>
<source>The server is too old. Disconnecting now.</source>
- <translation type="unfinished"></translation>
+ <translation>伺服器太舊。立即斷線。</translation>
</message>
<message>
<source>Server authentication error</source>
- <translation type="unfinished"></translation>
+ <translation>伺服器身份驗證錯誤</translation>
</message>
</context>
<context>
<name>HWPasswordDialog</name>
<message>
<source>Login</source>
- <translation type="unfinished"></translation>
+ <translation>登入</translation>
</message>
<message>
<source>To connect to the server, please log in.
If you don't have an account on www.hedgewars.org,
just enter your nickname.</source>
- <translation type="unfinished"></translation>
+ <translation>要連接到伺服器,請登錄。
+
+如果你在www.hedgewars.org沒有一個的帳號,
+只需輸入你的暱稱。</translation>
</message>
<message>
<source>Nickname:</source>
- <translation type="unfinished"></translation>
+ <translation>暱稱:</translation>
</message>
<message>
<source>Password:</source>
+ <translation>密碼:</translation>
+ </message>
+ <message>
+ <source>New Account</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -687,32 +721,36 @@
<name>HWUploadVideoDialog</name>
<message>
<source>Upload video</source>
- <translation type="unfinished"></translation>
+ <translation>上傳視頻</translation>
</message>
<message>
<source>Upload</source>
- <translation type="unfinished"></translation>
+ <translation>上傳</translation>
</message>
</context>
<context>
<name>HatButton</name>
<message>
<source>Change hat (%1)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">改變帽子(%1)</translation>
</message>
</context>
<context>
<name>HatPrompt</name>
<message>
<source>Cancel</source>
- <translation type="unfinished">取消</translation>
+ <translation>取消</translation>
</message>
<message>
<source>Use selected hat</source>
- <translation type="unfinished"></translation>
+ <translation>使用選定的帽子</translation>
</message>
<message>
<source>Search for a hat:</source>
+ <translation>搜索一頂帽子:</translation>
+ </message>
+ <message>
+ <source>Choose a hat</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -727,7 +765,7 @@
<name>KeyBinder</name>
<message>
<source>Category</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">分類</translation>
</message>
</context>
<context>
@@ -738,26 +776,26 @@
</message>
<message>
<source>unknown</source>
- <translation type="unfinished"></translation>
+ <translation>未知</translation>
</message>
<message>
<source>Duration: %1m %2s</source>
- <translation type="unfinished"></translation>
+ <translation>持續時間:%1分 %2秒</translation>
</message>
<message>
<source>Video: %1x%2</source>
- <translation type="unfinished"></translation>
+ <translation>視頻:%1X%2</translation>
</message>
<message>
<source>%1 fps</source>
- <translation type="unfinished"></translation>
+ <translation>%1 FPS</translation>
</message>
</context>
<context>
<name>MapModel</name>
<message>
<source>No description available.</source>
- <translation type="unfinished"></translation>
+ <translation>沒有可用的描述。</translation>
</message>
</context>
<context>
@@ -768,27 +806,27 @@
</message>
<message>
<source>Fetch data</source>
- <translation type="unfinished"></translation>
+ <translation>獲取數據</translation>
</message>
<message>
<source>Server message for latest version:</source>
- <translation type="unfinished"></translation>
+ <translation>對於最新版本的伺服器消息:</translation>
</message>
<message>
<source>Server message for previous versions:</source>
- <translation type="unfinished"></translation>
+ <translation>以前版本的伺服器消息:</translation>
</message>
<message>
<source>Latest version protocol number:</source>
- <translation type="unfinished"></translation>
+ <translation>最新版本協議號:</translation>
</message>
<message>
<source>MOTD preview:</source>
- <translation type="unfinished"></translation>
+ <translation>今日消息預覽:</translation>
</message>
<message>
<source>Set data</source>
- <translation type="unfinished"></translation>
+ <translation>設置數據</translation>
</message>
<message>
<source>General</source>
@@ -796,31 +834,31 @@
</message>
<message>
<source>Bans</source>
- <translation type="unfinished"></translation>
+ <translation>封鎖</translation>
</message>
<message>
<source>IP/Nick</source>
- <translation type="unfinished"></translation>
+ <translation>IP/暱稱</translation>
</message>
<message>
<source>Expiration</source>
- <translation type="unfinished"></translation>
+ <translation>期滿</translation>
</message>
<message>
<source>Reason</source>
- <translation type="unfinished"></translation>
+ <translation>原因</translation>
</message>
<message>
<source>Refresh</source>
- <translation type="unfinished"></translation>
+ <translation>刷新</translation>
</message>
<message>
<source>Add</source>
- <translation type="unfinished"></translation>
+ <translation>增加</translation>
</message>
<message>
<source>Remove</source>
- <translation type="unfinished"></translation>
+ <translation>刪除</translation>
</message>
</context>
<context>
@@ -834,145 +872,145 @@
<name>PageDataDownload</name>
<message>
<source>Loading, please wait.</source>
- <translation type="unfinished"></translation>
+ <translation>載入中,請稍候。</translation>
</message>
<message>
<source>This page requires an internet connection.</source>
- <translation type="unfinished"></translation>
+ <translation>此頁面需要連接網際網路。</translation>
</message>
<message>
<source>Open packages directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">打開組件目錄</translation>
</message>
</context>
<context>
<name>PageDrawMap</name>
<message>
<source>Undo</source>
- <translation type="unfinished"></translation>
+ <translation>復原</translation>
</message>
<message>
<source>Clear</source>
- <translation type="unfinished">清除</translation>
+ <translation>清除</translation>
</message>
<message>
<source>Load</source>
- <translation type="unfinished">讀取</translation>
+ <translation>讀取</translation>
</message>
<message>
<source>Save</source>
- <translation type="unfinished"></translation>
+ <translation>保存</translation>
</message>
<message>
<source>Load drawn map</source>
- <translation type="unfinished"></translation>
+ <translation>讀取繪製的地圖</translation>
</message>
<message>
<source>Save drawn map</source>
- <translation type="unfinished"></translation>
+ <translation>保存繪製的地圖</translation>
</message>
<message>
<source>Drawn Maps</source>
- <translation type="unfinished"></translation>
+ <translation>繪製地圖</translation>
</message>
<message>
<source>All files</source>
- <translation type="unfinished"></translation>
+ <translation>所有文件</translation>
</message>
<message>
<source>Eraser</source>
- <translation type="unfinished"></translation>
+ <translation>黑板擦</translation>
</message>
<message>
<source>Polyline</source>
- <translation type="unfinished"></translation>
+ <translation>折線</translation>
</message>
<message>
<source>Rectangle</source>
- <translation type="unfinished"></translation>
+ <translation>矩形</translation>
</message>
<message>
<source>Ellipse</source>
- <translation type="unfinished"></translation>
+ <translation>橢圓</translation>
</message>
<message>
<source>Optimize</source>
- <translation type="unfinished"></translation>
+ <translation>優化</translation>
</message>
</context>
<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
- <translation>常規</translation>
+ <translation type="unfinished">常規</translation>
</message>
<message>
<source>Select an action to choose a custom key bind for this team</source>
- <translation type="unfinished"></translation>
+ <translation>點動作,來替隊伍選擇自定義的按鍵綁定</translation>
</message>
<message>
<source>Use my default</source>
- <translation type="unfinished"></translation>
+ <translation>使用我的預設值</translation>
</message>
<message>
<source>Reset all binds</source>
- <translation type="unfinished"></translation>
+ <translation>重置全部綁定</translation>
</message>
<message>
<source>Custom Controls</source>
- <translation type="unfinished"></translation>
+ <translation>自定義控制</translation>
</message>
<message>
<source>Hat</source>
- <translation type="unfinished">帽子</translation>
+ <translation>帽子</translation>
</message>
<message>
<source>Name</source>
- <translation type="unfinished"></translation>
+ <translation>名字</translation>
</message>
<message>
<source>This hedgehog's name</source>
- <translation type="unfinished"></translation>
+ <translation>這隻刺猬的名字</translation>
</message>
<message>
<source>Randomize this hedgehog's name</source>
- <translation type="unfinished"></translation>
+ <translation>隨機選擇這隻刺猬的名字</translation>
</message>
<message>
<source>Random Team</source>
- <translation type="unfinished">隨機隊伍分配</translation>
+ <translation>隨機隊伍分配</translation>
</message>
</context>
<context>
<name>PageGameStats</name>
<message>
<source>Details</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">細節</translation>
</message>
<message>
<source>Health graph</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">生命圖</translation>
</message>
<message>
<source>Ranking</source>
- <translation type="unfinished"></translation>
+ <translation>排行</translation>
</message>
<message numerus="yes">
<source>The best shot award was won by <b>%1</b> with <b>%2</b> pts.</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform><b>%1%n</b>的<b>%2</b>傷害獲得最佳攻擊獎。</numerusform>
</translation>
</message>
<message numerus="yes">
<source>The best killer is <b>%1</b> with <b>%2</b> kills in a turn.</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform>最佳殺手為<b>%1</b>在一回合<b>%2</b>殺。</numerusform>
</translation>
</message>
<message numerus="yes">
<source>A total of <b>%1</b> hedgehog(s) were killed during this round.</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform>這場總共<b>%1</b>隻刺蝟死亡。</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -984,28 +1022,28 @@
<message numerus="yes">
<source><b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts.</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform><b>%1</b>認為攻擊自己的刺猬<b>%2</b>傷害是很好的。</numerusform>
</translation>
</message>
<message numerus="yes">
<source><b>%1</b> killed <b>%2</b> of his own hedgehogs.</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform><b>%1</b>殺了<b>%2</b>隻自己的刺蝟。</numerusform>
</translation>
</message>
<message numerus="yes">
<source><b>%1</b> was scared and skipped turn <b>%2</b> times.</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform><b>%1</b>很慌張,跳過<b>%2</b>次。</numerusform>
</translation>
</message>
<message>
<source>Play again</source>
- <translation type="unfinished"></translation>
+ <translation>再玩一次</translation>
</message>
<message>
<source>Save</source>
- <translation type="unfinished"></translation>
+ <translation>存檔</translation>
</message>
<message numerus="yes">
<source>(%1 %2)</source>
@@ -1018,73 +1056,73 @@
<name>PageInGame</name>
<message>
<source>In game...</source>
- <translation type="unfinished"></translation>
+ <translation>在遊戲中...</translation>
</message>
</context>
<context>
<name>PageInfo</name>
<message>
<source>Open the snapshot folder</source>
- <translation type="unfinished"></translation>
+ <translation>打開快照文件夾</translation>
</message>
</context>
<context>
<name>PageMain</name>
<message>
<source>Downloadable Content</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">可下載的內容</translation>
</message>
<message>
<source>Play a game on a single computer</source>
- <translation type="unfinished"></translation>
+ <translation>開始一個單機版遊戲</translation>
</message>
<message>
<source>Play a game across a network</source>
- <translation type="unfinished"></translation>
+ <translation>開始一個網路對戰遊戲</translation>
</message>
<message>
<source>Read about who is behind the Hedgewars Project</source>
- <translation type="unfinished"></translation>
+ <translation>看看刺蝟大作戰背後的功臣們</translation>
</message>
<message>
<source>Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars</source>
- <translation type="unfinished"></translation>
+ <translation>在這裡可以回報問題,提出建議,或是說說你多麼喜歡刺蝟大作戰</translation>
</message>
<message>
<source>Access the user created content downloadable from our website</source>
- <translation type="unfinished"></translation>
+ <translation>從我們的網站訪問用戶創建的內容</translation>
</message>
<message>
<source>Exit game</source>
- <translation type="unfinished"></translation>
+ <translation>退出遊戲</translation>
</message>
<message>
<source>Manage videos recorded from game</source>
- <translation type="unfinished"></translation>
+ <translation>管理從遊戲中錄製的視頻</translation>
</message>
<message>
<source>Edit game preferences</source>
- <translation type="unfinished"></translation>
+ <translation>編輯遊戲偏好設定</translation>
</message>
<message>
<source>Play a game across a local area network</source>
- <translation type="unfinished"></translation>
+ <translation>跨內網玩遊戲</translation>
</message>
<message>
<source>Play a game on an official server</source>
- <translation type="unfinished"></translation>
+ <translation>在官方伺服器上玩遊戲</translation>
</message>
<message>
<source>Feedback</source>
- <translation type="unfinished"></translation>
+ <translation>信息反饋</translation>
</message>
<message>
<source>Play local network game</source>
- <translation type="unfinished"></translation>
+ <translation>玩內網遊戲</translation>
</message>
<message>
<source>Play official network game</source>
- <translation type="unfinished"></translation>
+ <translation>玩官網遊戲</translation>
</message>
</context>
<context>
@@ -1095,7 +1133,7 @@
</message>
<message>
<source>Edit game preferences</source>
- <translation type="unfinished"></translation>
+ <translation>編輯遊戲偏好設定</translation>
</message>
</context>
<context>
@@ -1106,37 +1144,37 @@
</message>
<message>
<source>Edit game preferences</source>
- <translation type="unfinished"></translation>
+ <translation>編輯遊戲偏好設定</translation>
</message>
<message>
<source>Start</source>
- <translation type="unfinished">開始</translation>
+ <translation>開始</translation>
</message>
<message>
<source>Update</source>
- <translation type="unfinished">更新</translation>
+ <translation>更新</translation>
</message>
<message>
<source>Room controls</source>
- <translation type="unfinished"></translation>
+ <translation>房間管理</translation>
</message>
</context>
<context>
<name>PageNetServer</name>
<message>
<source>Click here for details</source>
- <translation type="unfinished"></translation>
+ <translation>點擊查看詳情</translation>
</message>
<message>
<source>Insert your address here</source>
- <translation type="unfinished"></translation>
+ <translation>在此處插入你的地址</translation>
</message>
</context>
<context>
<name>PageOptions</name>
<message>
<source>New team</source>
- <translation>新隊伍</translation>
+ <translation>新增隊伍</translation>
</message>
<message>
<source>Edit team</source>
@@ -1144,163 +1182,163 @@
</message>
<message>
<source>Delete team</source>
- <translation type="unfinished"></translation>
+ <translation>刪除隊伍</translation>
</message>
<message>
<source>You can't edit teams from team selection. Go back to main menu to add, edit or delete teams.</source>
- <translation type="unfinished"></translation>
+ <translation>你不能在隊伍選單中修改隊伍。回到主選單上,新增,編輯或刪除隊伍.</translation>
</message>
<message>
<source>New scheme</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">新增方案</translation>
</message>
<message>
<source>Edit scheme</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">修改方案</translation>
</message>
<message>
<source>Delete scheme</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刪除方案</translation>
</message>
<message>
<source>New weapon set</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">新增武器組合</translation>
</message>
<message>
<source>Edit weapon set</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">修改武器組合</translation>
</message>
<message>
<source>Delete weapon set</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刪除武器組合</translation>
</message>
<message>
<source>Advanced</source>
- <translation type="unfinished">進階</translation>
+ <translation>進階</translation>
</message>
<message>
<source>Reset to default colors</source>
- <translation type="unfinished"></translation>
+ <translation>重置為預設顏色</translation>
</message>
<message>
<source>Proxy host</source>
- <translation type="unfinished"></translation>
+ <translation>代理伺服器主機</translation>
</message>
<message>
<source>Proxy port</source>
- <translation type="unfinished"></translation>
+ <translation>代理伺服器端口</translation>
</message>
<message>
<source>Proxy login</source>
- <translation type="unfinished"></translation>
+ <translation>代理伺服器帳號</translation>
</message>
<message>
<source>Proxy password</source>
- <translation type="unfinished"></translation>
+ <translation>代理伺服器密碼</translation>
</message>
<message>
<source>No proxy</source>
- <translation type="unfinished"></translation>
+ <translation>無代理</translation>
</message>
<message>
<source>Socks5 proxy</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Socks5代理</translation>
</message>
<message>
<source>HTTP proxy</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">HTTP代理</translation>
</message>
<message>
<source>System proxy settings</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">系統代理設置</translation>
</message>
<message>
<source>Select an action to change what key controls it</source>
- <translation type="unfinished"></translation>
+ <translation>點動作,來改變控制它的按鍵</translation>
</message>
<message>
<source>Reset to default</source>
- <translation type="unfinished"></translation>
+ <translation>重置為預設值</translation>
</message>
<message>
<source>Reset all binds</source>
- <translation type="unfinished"></translation>
+ <translation>重置所有的綁定</translation>
</message>
<message>
<source>Game</source>
- <translation type="unfinished"></translation>
+ <translation>遊戲</translation>
</message>
<message>
<source>Graphics</source>
- <translation type="unfinished"></translation>
+ <translation>圖像</translation>
</message>
<message>
<source>Audio</source>
- <translation type="unfinished"></translation>
+ <translation>聲音</translation>
</message>
<message>
<source>Controls</source>
- <translation type="unfinished"></translation>
+ <translation>控制</translation>
</message>
<message>
<source>Video Recording</source>
- <translation type="unfinished"></translation>
+ <translation>錄像</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished"></translation>
+ <translation>網路</translation>
</message>
<message>
<source>Teams</source>
- <translation type="unfinished">隊伍</translation>
+ <translation>隊伍</translation>
</message>
<message>
<source>Schemes</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">方案</translation>
</message>
<message>
<source>Weapons</source>
- <translation type="unfinished">武器</translation>
+ <translation>武器</translation>
</message>
<message>
<source>Frontend</source>
- <translation type="unfinished"></translation>
+ <translation>前端</translation>
</message>
<message>
<source>Custom colors</source>
- <translation type="unfinished"></translation>
+ <translation>自定義顏色</translation>
</message>
<message>
<source>Game audio</source>
- <translation type="unfinished"></translation>
+ <translation>遊戲音效</translation>
</message>
<message>
<source>Frontend audio</source>
- <translation type="unfinished"></translation>
+ <translation>前端音效</translation>
</message>
<message>
<source>Account</source>
- <translation type="unfinished"></translation>
+ <translation>帳戶</translation>
</message>
<message>
<source>Proxy settings</source>
- <translation type="unfinished"></translation>
+ <translation>代理伺服器設置</translation>
</message>
<message>
<source>Miscellaneous</source>
- <translation type="unfinished"></translation>
+ <translation>雜項</translation>
</message>
<message>
<source>Updates</source>
- <translation type="unfinished"></translation>
+ <translation>更新</translation>
</message>
<message>
<source>Check for updates</source>
- <translation type="unfinished"></translation>
+ <translation>檢查更新</translation>
</message>
<message>
<source>Video recording options</source>
- <translation type="unfinished"></translation>
+ <translation>視頻錄製選項</translation>
</message>
</context>
<context>
@@ -1339,35 +1377,35 @@
<message numerus="yes">
<source>%1 players online</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform>%1%n 玩家在線</numerusform>
</translation>
</message>
<message>
<source>Search for a room:</source>
- <translation type="unfinished"></translation>
+ <translation>搜索房間:</translation>
</message>
<message>
<source>Create room</source>
- <translation type="unfinished"></translation>
+ <translation>創建房間</translation>
</message>
<message>
<source>Join room</source>
- <translation type="unfinished"></translation>
+ <translation>加入房間</translation>
</message>
<message>
<source>Room state</source>
- <translation type="unfinished"></translation>
+ <translation>房間狀態</translation>
</message>
<message>
<source>Open server administration page</source>
- <translation type="unfinished"></translation>
+ <translation>打開伺服器管理頁面</translation>
</message>
</context>
<context>
<name>PageScheme</name>
<message>
<source>New</source>
- <translation>新模式</translation>
+ <translation type="unfinished">新增</translation>
</message>
<message>
<source>Delete</source>
@@ -1375,7 +1413,7 @@
</message>
<message>
<source>Gain 80% of the damage you do back in health</source>
- <translation>傷害的80%變成自身力量</translation>
+ <translation type="unfinished">傷害的80%成為自身生命</translation>
</message>
<message>
<source>Share your opponents pain, share their damage</source>
@@ -1395,7 +1433,7 @@
</message>
<message>
<source>Defend your fort and destroy the opponents, two team colours max!</source>
- <translation>保衛你的城堡,破壞對手的,努力吧!</translation>
+ <translation type="unfinished">保衛你的堡壘,破壞對手的,努力吧!</translation>
</message>
<message>
<source>Teams will start on opposite sides of the terrain, two team colours max!</source>
@@ -1427,86 +1465,86 @@
</message>
<message>
<source>Take turns placing your hedgehogs before the start of play.</source>
- <translation>在開局前手動放置刺猬</translation>
+ <translation>在開局前手動放置刺猬。</translation>
</message>
<message>
<source>Ammo is shared between all teams that share a colour.</source>
- <translation type="unfinished"></translation>
+ <translation>同一個顏色的所有隊伍之間共享彈藥。</translation>
</message>
<message>
<source>Disable girders when generating random maps.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">生成隨機地圖時,禁用橋樑。</translation>
</message>
<message>
<source>Disable land objects when generating random maps.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">生成隨機地圖時,禁用地面物體。</translation>
</message>
<message>
<source>AI respawns on death.</source>
- <translation type="unfinished"></translation>
+ <translation>AI死亡後重生。</translation>
</message>
<message>
<source>All (living) hedgehogs are fully restored at the end of turn</source>
- <translation type="unfinished"></translation>
+ <translation>所有(活的)刺猬在回合結束時完全恢復</translation>
</message>
<message>
<source>Attacking does not end your turn.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">進攻後不會自動結束你的回合。</translation>
</message>
<message>
<source>Weapons are reset to starting values each turn.</source>
- <translation type="unfinished"></translation>
+ <translation>每回合武器被重置為初始值。</translation>
</message>
<message>
<source>Each hedgehog has its own ammo. It does not share with the team.</source>
- <translation type="unfinished"></translation>
+ <translation>每個刺猬有它自己的彈藥。它不與隊伍分享。</translation>
</message>
<message>
<source>You will not have to worry about wind anymore.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">禁風,你將不用擔心風了。</translation>
</message>
<message>
<source>Wind will affect almost everything.</source>
- <translation type="unfinished"></translation>
+ <translation>風將影響幾乎所有東西。</translation>
</message>
<message>
<source>Copy</source>
- <translation type="unfinished"></translation>
+ <translation>複製</translation>
</message>
<message>
<source>Teams in each clan take successive turns sharing their turn time.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">同一顏色的每個隊伍採取連續輪流分享他們的回合時間。</translation>
</message>
<message>
<source>Add an indestructible border around the terrain</source>
- <translation>添加不可毀壞地邊界</translation>
+ <translation>在地型周圍添加一個堅不可摧的邊界</translation>
</message>
<message>
<source>Add an indestructible border along the bottom</source>
- <translation type="unfinished"></translation>
+ <translation>沿著底部添加一個堅不可摧的邊界</translation>
</message>
<message>
<source>None (Default)</source>
- <translation type="unfinished"></translation>
+ <translation>沒有(預設值)</translation>
</message>
<message>
<source>Wrap (World wraps)</source>
- <translation type="unfinished"></translation>
+ <translation>重疊(世界重疊)</translation>
</message>
<message>
<source>Bounce (Edges reflect)</source>
- <translation type="unfinished"></translation>
+ <translation>彈跳(邊緣反射)</translation>
</message>
<message>
<source>Sea (Edges connect to sea)</source>
- <translation type="unfinished"></translation>
+ <translation>海水(邊緣連接到海)</translation>
</message>
</context>
<context>
<name>PageSelectWeapon</name>
<message>
<source>Default</source>
- <translation>默認</translation>
+ <translation>預設值</translation>
</message>
<message>
<source>Delete</source>
@@ -1514,68 +1552,68 @@
</message>
<message>
<source>New</source>
- <translation type="unfinished">新模式</translation>
+ <translation>新增</translation>
</message>
<message>
<source>Copy</source>
- <translation type="unfinished"></translation>
+ <translation>複製</translation>
</message>
</context>
<context>
<name>PageSinglePlayer</name>
<message>
<source>Play a quick game against the computer with random settings</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">使用隨機設置與電腦快速開始遊戲</translation>
</message>
<message>
<source>Play a hotseat game against your friends, or AI teams</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">與你的朋友或AI隊伍進行遊戲</translation>
</message>
<message>
<source>Campaign Mode</source>
- <translation type="unfinished"></translation>
+ <translation>戰役模式</translation>
</message>
<message>
<source>Practice your skills in a range of training missions</source>
- <translation type="unfinished"></translation>
+ <translation>透過一系列的培訓任務,練習你的技能</translation>
</message>
<message>
<source>Watch recorded demos</source>
- <translation type="unfinished"></translation>
+ <translation>觀看錄製的演示</translation>
</message>
<message>
<source>Load a previously saved game</source>
- <translation type="unfinished"></translation>
+ <translation>讀取以前保存的遊戲</translation>
</message>
</context>
<context>
<name>PageTraining</name>
<message>
<source>No description available</source>
- <translation type="unfinished"></translation>
+ <translation>沒有可用的描述</translation>
</message>
<message>
<source>Select a mission!</source>
- <translation type="unfinished"></translation>
+ <translation>選擇一個任務!</translation>
</message>
<message>
<source>Pick the mission or training to play</source>
- <translation type="unfinished"></translation>
+ <translation>選擇要玩的任務或培訓</translation>
</message>
<message>
<source>Start fighting</source>
- <translation type="unfinished"></translation>
+ <translation>開始戰鬥</translation>
</message>
</context>
<context>
<name>PageVideos</name>
<message>
<source>Name</source>
- <translation type="unfinished"></translation>
+ <translation>名稱</translation>
</message>
<message>
<source>Size</source>
- <translation type="unfinished"></translation>
+ <translation>大小</translation>
</message>
<message numerus="yes">
<source>%1 bytes</source>
@@ -1585,23 +1623,23 @@
</message>
<message>
<source>(in progress...)</source>
- <translation type="unfinished"></translation>
+ <translation>(處理中...)</translation>
</message>
<message>
<source>encoding</source>
- <translation type="unfinished"></translation>
+ <translation>編碼</translation>
</message>
<message>
<source>uploading</source>
- <translation type="unfinished"></translation>
+ <translation>上傳</translation>
</message>
<message>
<source>Date: %1</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">日期:%1</translation>
</message>
<message>
<source>Size: %1</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">大小:%1</translation>
</message>
</context>
<context>
@@ -1620,7 +1658,7 @@
</message>
<message>
<source>Restrict Team Additions</source>
- <translation>限制團隊外掛程式</translation>
+ <translation>限制隊伍外掛程式</translation>
</message>
<message>
<source>Ban</source>
@@ -1632,19 +1670,19 @@
</message>
<message>
<source>Ignore</source>
- <translation type="unfinished"></translation>
+ <translation>忽略</translation>
</message>
<message>
<source>Add friend</source>
- <translation type="unfinished"></translation>
+ <translation>加為好友</translation>
</message>
<message>
<source>Unignore</source>
- <translation type="unfinished"></translation>
+ <translation>不忽略</translation>
</message>
<message>
<source>Remove friend</source>
- <translation type="unfinished"></translation>
+ <translation>刪除好友</translation>
</message>
<message>
<source>Update</source>
@@ -1652,14 +1690,22 @@
</message>
<message>
<source>Restrict Unregistered Players Join</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">限制未註冊的玩家加入</translation>
</message>
<message>
<source>Show games in lobby</source>
- <translation type="unfinished"></translation>
+ <translation>顯示遊戲大廳</translation>
</message>
<message>
<source>Show games in-progress</source>
+ <translation>顯示正在進行的遊戲</translation>
+ </message>
+ <message>
+ <source>Show password protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show join restricted</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1667,7 +1713,7 @@
<name>QCheckBox</name>
<message>
<source>Fullscreen</source>
- <translation>遊戲全螢幕</translation>
+ <translation>全螢幕</translation>
</message>
<message>
<source>Show FPS</source>
@@ -1679,11 +1725,11 @@
</message>
<message>
<source>Append date and time to record file name</source>
- <translation>記錄名稱中包含具體時間日期</translation>
+ <translation type="unfinished">記錄檔名中包含具體時間日期</translation>
</message>
<message>
<source>Check for updates at startup</source>
- <translation>啟動時檢查程式升級</translation>
+ <translation>啟動時檢查更新</translation>
</message>
<message>
<source>Show ammo menu tooltips</source>
@@ -1691,83 +1737,83 @@
</message>
<message>
<source>Save password</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">保存密碼</translation>
</message>
<message>
<source>Save account name and password</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">保存帳戶名和密碼</translation>
</message>
<message>
<source>Video is private</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">視頻是私人</translation>
</message>
<message>
<source>Record audio</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">錄製音頻</translation>
</message>
<message>
<source>Use game resolution</source>
- <translation type="unfinished"></translation>
+ <translation>套用遊戲解析度</translation>
</message>
<message>
<source>Visual effects</source>
- <translation type="unfinished"></translation>
+ <translation>視覺效果</translation>
</message>
<message>
<source>Sound</source>
- <translation type="unfinished"></translation>
+ <translation>音效</translation>
</message>
<message>
<source>In-game sound effects</source>
- <translation type="unfinished"></translation>
+ <translation>在遊戲中的聲音效果</translation>
</message>
<message>
<source>Music</source>
- <translation type="unfinished"></translation>
+ <translation>音樂</translation>
</message>
<message>
<source>In-game music</source>
- <translation type="unfinished"></translation>
+ <translation>在遊戲中的音樂</translation>
</message>
<message>
<source>Frontend sound effects</source>
- <translation type="unfinished"></translation>
+ <translation>前端音效</translation>
</message>
<message>
<source>Frontend music</source>
- <translation type="unfinished"></translation>
+ <translation>前端的音樂</translation>
</message>
<message>
<source>Team</source>
- <translation type="unfinished"></translation>
+ <translation>隊伍</translation>
</message>
<message>
<source>Enable team tags by default</source>
- <translation type="unfinished"></translation>
+ <translation>預設顯示隊伍名標示</translation>
</message>
<message>
<source>Hog</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟</translation>
</message>
<message>
<source>Enable hedgehog tags by default</source>
- <translation type="unfinished"></translation>
+ <translation>預設顯示刺猬名標示</translation>
</message>
<message>
<source>Health</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">生命</translation>
</message>
<message>
<source>Enable health tags by default</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">預設顯示生命值標示</translation>
</message>
<message>
<source>Translucent</source>
- <translation type="unfinished"></translation>
+ <translation>半透明</translation>
</message>
<message>
<source>Enable translucent tags by default</source>
- <translation type="unfinished"></translation>
+ <translation>預設啟用半透明顯示</translation>
</message>
</context>
<context>
@@ -1778,11 +1824,11 @@
</message>
<message>
<source>Level</source>
- <translation>Lv 級別</translation>
+ <translation type="unfinished">AI等級</translation>
</message>
<message>
<source>(System default)</source>
- <translation type="unfinished"></translation>
+ <translation>(系統預設值)</translation>
</message>
<message>
<source>Community</source>
@@ -1790,31 +1836,31 @@
</message>
<message>
<source>Disabled</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">關閉</translation>
</message>
<message>
<source>Red/Cyan</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">紅色/青色</translation>
</message>
<message>
<source>Cyan/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">青色/紅</translation>
</message>
<message>
<source>Red/Blue</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">紅/藍</translation>
</message>
<message>
<source>Blue/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">藍/紅</translation>
</message>
<message>
<source>Red/Green</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">紅/綠</translation>
</message>
<message>
<source>Green/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">綠/紅</translation>
</message>
<message>
<source>Side-by-side</source>
@@ -1826,42 +1872,42 @@
</message>
<message>
<source>Red/Cyan grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">紅/青色灰度</translation>
</message>
<message>
<source>Cyan/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">青色/紅灰度</translation>
</message>
<message>
<source>Red/Blue grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">紅/藍灰度</translation>
</message>
<message>
<source>Blue/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">藍/紅灰度</translation>
</message>
<message>
<source>Red/Green grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">紅/綠灰度</translation>
</message>
<message>
<source>Green/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">綠/紅灰度</translation>
</message>
</context>
<context>
<name>QGroupBox</name>
<message>
<source>Team Members</source>
- <translation>成員</translation>
+ <translation>隊伍成員</translation>
</message>
<message>
<source>Fort</source>
- <translation>城堡模式</translation>
+ <translation>堡壘</translation>
</message>
<message>
<source>Playing teams</source>
- <translation>玩家隊伍</translation>
+ <translation type="unfinished">玩家隊伍</translation>
</message>
<message>
<source>Net game</source>
@@ -1877,15 +1923,15 @@
</message>
<message>
<source>Team Settings</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">隊伍設置</translation>
</message>
<message>
<source>Videos</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">視頻</translation>
</message>
<message>
<source>Description</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">描述</translation>
</message>
</context>
<context>
@@ -1900,11 +1946,11 @@
</message>
<message>
<source>Server name:</source>
- <translation>伺服器名:</translation>
+ <translation>伺服器名稱:</translation>
</message>
<message>
<source>Server port:</source>
- <translation>伺服器埠:</translation>
+ <translation>伺服器端口:</translation>
</message>
<message>
<source>Host:</source>
@@ -1912,7 +1958,7 @@
</message>
<message>
<source>Port:</source>
- <translation>埠:</translation>
+ <translation>端口:</translation>
</message>
<message>
<source>Weapons</source>
@@ -1928,7 +1974,7 @@
</message>
<message>
<source>Damage Modifier</source>
- <translation>傷害修改</translation>
+ <translation type="unfinished">傷害修正</translation>
</message>
<message>
<source>Turn Time</source>
@@ -1940,11 +1986,11 @@
</message>
<message>
<source>Sudden Death Timeout</source>
- <translation>死亡模式倒計時</translation>
+ <translation type="unfinished">意外死亡倒數</translation>
</message>
<message>
<source>Scheme Name:</source>
- <translation>設置名稱:</translation>
+ <translation type="unfinished">方案名稱:</translation>
</message>
<message>
<source>Crate Drops</source>
@@ -1952,7 +1998,7 @@
</message>
<message>
<source>Mines Time</source>
- <translation>佈雷時間</translation>
+ <translation type="unfinished">地雷爆炸緩衝</translation>
</message>
<message>
<source>Mines</source>
@@ -1960,192 +2006,198 @@
</message>
<message>
<source>% Dud Mines</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">地雷啞彈率(%)</translation>
</message>
<message>
<source>Name</source>
- <translation type="unfinished"></translation>
+ <translation>名稱</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished"></translation>
+ <translation>類型</translation>
</message>
<message>
<source>Grave</source>
- <translation type="unfinished"></translation>
+ <translation>墳墓</translation>
</message>
<message>
<source>Flag</source>
- <translation type="unfinished"></translation>
+ <translation>旗幟</translation>
</message>
<message>
<source>Voice</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">語音</translation>
</message>
<message>
<source>Locale</source>
- <translation type="unfinished"></translation>
+ <translation>語言環境</translation>
</message>
<message>
<source>Explosives</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">炸藥桶</translation>
</message>
<message>
<source>Quality</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">品質</translation>
</message>
<message>
<source>% Health Crates</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">急救箱率(%)</translation>
</message>
<message>
<source>Health in Crates</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">急救箱生命</translation>
</message>
<message>
<source>Sudden Death Water Rise</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">意外死亡水上升</translation>
</message>
<message>
<source>Sudden Death Health Decrease</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">意外死亡生命減少</translation>
</message>
<message>
<source>% Rope Length</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">繩長(%)</translation>
</message>
<message>
<source>Stereo rendering</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">立體渲染</translation>
</message>
<message>
<source>Style</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">風格</translation>
</message>
<message>
<source>Scheme</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">方案</translation>
</message>
<message>
<source>% Get Away Time</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">爆炸逃離緩衝(%)</translation>
</message>
<message>
<source>There are videos that are currently being processed.
Exiting now will abort them.
Do you really want to quit?</source>
- <translation type="unfinished"></translation>
+ <translation>有視頻正在處理中
+現在離開將中止它
+你確定要離開嗎?</translation>
</message>
<message>
<source>Please provide either the YouTube account name or the email address associated with the Google Account.</source>
- <translation type="unfinished"></translation>
+ <translation>請提供YouTube帳戶名稱或與Google帳戶關聯的電子郵件地址。</translation>
</message>
<message>
<source>Account name (or email): </source>
- <translation type="unfinished"></translation>
+ <translation>賬戶名(或電子郵件):</translation>
</message>
<message>
<source>Password: </source>
- <translation type="unfinished"></translation>
+ <translation>密碼:</translation>
</message>
<message>
<source>Video title: </source>
- <translation type="unfinished"></translation>
+ <translation>視頻標題:</translation>
</message>
<message>
<source>Video description: </source>
- <translation type="unfinished"></translation>
+ <translation>視頻說明:</translation>
</message>
<message>
<source>Tags (comma separated): </source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">標籤(以逗號分隔):</translation>
</message>
<message>
<source>Description</source>
- <translation type="unfinished"></translation>
+ <translation>描寫</translation>
</message>
<message>
<source>Nickname</source>
- <translation type="unfinished">匿稱</translation>
+ <translation>暱稱</translation>
</message>
<message>
<source>Format</source>
- <translation type="unfinished"></translation>
+ <translation>格式</translation>
</message>
<message>
<source>Audio codec</source>
- <translation type="unfinished"></translation>
+ <translation>音頻編解碼器</translation>
</message>
<message>
<source>Video codec</source>
- <translation type="unfinished"></translation>
+ <translation>視頻編解碼器</translation>
</message>
<message>
<source>Framerate</source>
- <translation type="unfinished"></translation>
+ <translation>畫面刷新率</translation>
</message>
<message>
<source>Bitrate (Kbps)</source>
- <translation type="unfinished"></translation>
+ <translation>位元速率 (Kbps)</translation>
</message>
<message>
<source>This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete!</source>
- <translation type="unfinished"></translation>
+ <translation>這個開發版本是“尚未完成的”,可能不與其他的版本兼容,同時一些功能可能被破壞或殘缺!</translation>
</message>
<message>
<source>Fullscreen</source>
- <translation type="unfinished">遊戲全螢幕</translation>
+ <translation>全螢幕</translation>
</message>
<message>
<source>Fullscreen Resolution</source>
- <translation type="unfinished"></translation>
+ <translation>全螢幕解析度</translation>
</message>
<message>
<source>Windowed Resolution</source>
- <translation type="unfinished"></translation>
+ <translation>視窗解析度</translation>
</message>
<message>
<source>Your Email</source>
- <translation type="unfinished"></translation>
+ <translation>你的電子郵件</translation>
</message>
<message>
<source>Summary</source>
- <translation type="unfinished"></translation>
+ <translation>摘要</translation>
</message>
<message>
<source>Send system information</source>
- <translation type="unfinished"></translation>
+ <translation>發送系統信息</translation>
</message>
<message>
<source>Type the security code:</source>
- <translation type="unfinished"></translation>
+ <translation>鍵入安全碼:</translation>
</message>
<message>
<source>Revision</source>
- <translation type="unfinished"></translation>
+ <translation>版本</translation>
</message>
<message>
<source>This program is distributed under the %1</source>
- <translation type="unfinished"></translation>
+ <translation>此程序使用%1釋出</translation>
</message>
<message>
<source>This setting will be effective at next restart.</source>
- <translation type="unfinished"></translation>
+ <translation>該設置將在下次重啟時生效。</translation>
</message>
<message>
<source>Tip: %1</source>
- <translation type="unfinished"></translation>
+ <translation>提示:%1</translation>
</message>
<message>
<source>Displayed tags above hogs and translucent tags</source>
- <translation type="unfinished"></translation>
+ <translation>刺蝟頭上顯示的標籤和半透明的標籤</translation>
</message>
<message>
<source>World Edge</source>
- <translation type="unfinished"></translation>
+ <translation>世界邊緣</translation>
</message>
<message>
<source>Script parameter</source>
+ <translation type="unfinished">腳本參數</translation>
+ </message>
+ <message>
+ <source>Air Mines</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -2157,11 +2209,11 @@
</message>
<message>
<source>hedgehog %1</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟 %1</translation>
</message>
<message>
<source>anonymous</source>
- <translation type="unfinished"></translation>
+ <translation>匿名</translation>
</message>
</context>
<context>
@@ -2183,53 +2235,53 @@
</message>
<message>
<source>File association failed.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">檔案關聯失敗。</translation>
</message>
<message>
<source>Error while authenticating at google.com:
</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">在google.com認證時錯誤:</translation>
</message>
<message>
<source>Login or password is incorrect</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">登錄或密碼不正確</translation>
</message>
<message>
<source>Error while sending metadata to youtube.com:
</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">傳送中繼資料給youtube.com時錯誤:</translation>
</message>
<message>
<source>Teams - Are you sure?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">隊伍 - 你確定嗎?</translation>
</message>
<message>
<source>Do you really want to delete the team '%1'?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你確定要刪除隊伍'%1'?</translation>
</message>
<message>
<source>Cannot delete default scheme '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能刪除預設方案 "%1"!</translation>
</message>
<message>
<source>Please select a record from the list</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">請從列表中選擇一個紀錄</translation>
</message>
<message>
<source>Unable to start server</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">無法開啟伺服器</translation>
</message>
<message>
<source>Hedgewars - Error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 錯誤</translation>
</message>
<message>
<source>Hedgewars - Success</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 成功</translation>
</message>
<message>
<source>All file associations have been set</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">所有檔案關聯已經被設定</translation>
</message>
<message>
<source>Cannot create directory %1</source>
@@ -2237,19 +2289,19 @@
</message>
<message>
<source>Unable to start the server: %1.</source>
- <translation type="obsolete">無法開始服務端: %1.</translation>
+ <translation type="obsolete">無法開啟伺服器: %1.</translation>
</message>
<message>
<source>Video upload - Error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">視頻上錯 - 錯誤</translation>
</message>
<message>
<source>Netgame - Error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">網路遊戲 - 錯誤</translation>
</message>
<message>
<source>Please select a server from the list</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">請從列表中選擇一個伺服器</translation>
</message>
<message>
<source>Please enter room name</source>
@@ -2257,23 +2309,23 @@
</message>
<message>
<source>Record Play - Error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">記錄播放 - 錯誤</translation>
</message>
<message>
<source>Please select record from the list</source>
- <translation type="unfinished">請從清單選擇記錄</translation>
+ <translation type="unfinished">請從列表選擇記錄</translation>
</message>
<message>
<source>Cannot rename to </source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能改名</translation>
</message>
<message>
<source>Cannot delete file </source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能刪除檔案</translation>
</message>
<message>
<source>Room Name - Error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">房間名 - 錯誤</translation>
</message>
<message>
<source>Please select room from the list</source>
@@ -2281,129 +2333,131 @@
</message>
<message>
<source>Room Name - Are you sure?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">房間名 - 你確定嗎?</translation>
</message>
<message>
<source>The game you are trying to join has started.
Do you still want to join the room?</source>
- <translation type="unfinished"></translation>
+ <translation>你試著加入的遊戲已經開始了。
+你仍要加入這個房間嗎?</translation>
</message>
<message>
<source>Schemes - Warning</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">方案 - 警告</translation>
</message>
<message>
<source>Schemes - Are you sure?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">方案 - 你確定嗎?</translation>
</message>
<message>
<source>Do you really want to delete the game scheme '%1'?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你真的確定要刪除遊戲方案 '%1'?</translation>
</message>
<message>
<source>Videos - Are you sure?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">視頻 - 你確定嗎?</translation>
</message>
<message>
<source>Do you really want to delete the video '%1'?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你確定要刪除視頻 '%1'嗎?</translation>
</message>
<message numerus="yes">
<source>Do you really want to remove %1 file(s)?</source>
<translation type="unfinished">
- <numerusform></numerusform>
+ <numerusform>你確定要移除檔案%1%n嗎?</numerusform>
</translation>
</message>
<message>
<source>Do you really want to cancel uploading %1?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你確定要取消上傳%1嗎?</translation>
</message>
<message>
<source>File error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">檔案 - 錯誤</translation>
</message>
<message>
<source>Cannot open '%1' for writing</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能開啟'%1'</translation>
</message>
<message>
<source>Cannot open '%1' for reading</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能開啟'%1'</translation>
</message>
<message>
<source>Cannot use the ammo '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能使用武器 '%1'!</translation>
</message>
<message>
<source>Weapons - Warning</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">武器 - 警告</translation>
</message>
<message>
<source>Cannot overwrite default weapon set '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能複寫預設武器設定'%1'!</translation>
</message>
<message>
<source>Cannot delete default weapon set '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不能刪除預設武器設定'%1'!</translation>
</message>
<message>
<source>Weapons - Are you sure?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">武器 - 你確定嗎?</translation>
</message>
<message>
<source>Do you really want to delete the weapon set '%1'?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你確定要刪除武器設定'%1'嗎?</translation>
</message>
<message>
<source>Hedgewars - Nick not registered</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 暱稱已經被註冊</translation>
</message>
<message>
<source>System Information Preview</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">系統資訊預覽</translation>
</message>
<message>
<source>Failed to generate captcha</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">產生驗證碼失敗</translation>
</message>
<message>
<source>Failed to download captcha</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">下載驗證碼失敗</translation>
</message>
<message>
<source>Please fill out all fields. Email is optional.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">請填寫所有欄位. 電子郵件地址是選填的. </translation>
</message>
<message>
<source>Hedgewars - Warning</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 警告</translation>
</message>
<message>
<source>Hedgewars - Information</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刺蝟大作戰 - 資訊</translation>
</message>
<message>
<source>Not all players are ready</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">並不是所有的玩家都準備就緒</translation>
</message>
<message>
<source>Are you sure you want to start this game?
Not all players are ready.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你確定要啟動這個遊戲嗎?
+並不是所有的玩家都準備就緒。</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<source>No description available</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">沒有可用的描述</translation>
</message>
</context>
<context>
<name>QPushButton</name>
<message>
<source>Play demo</source>
- <translation>播放 demo</translation>
+ <translation type="unfinished">播放演示</translation>
</message>
<message>
<source>Connect</source>
@@ -2419,7 +2473,7 @@
</message>
<message>
<source>Start server</source>
- <translation>開始服務端</translation>
+ <translation type="unfinished">啟動伺服器</translation>
</message>
<message>
<source>Update</source>
@@ -2435,11 +2489,11 @@
</message>
<message>
<source>default</source>
- <translation>默認</translation>
+ <translation>預設值</translation>
</message>
<message>
<source>Rename</source>
- <translation>重命名</translation>
+ <translation type="unfinished">更名</translation>
</message>
<message>
<source>OK</source>
@@ -2455,97 +2509,97 @@
</message>
<message>
<source>Associate file extensions</source>
- <translation type="unfinished"></translation>
+ <translation>關聯副檔名</translation>
</message>
<message>
<source>More info</source>
- <translation type="unfinished"></translation>
+ <translation>更多信息</translation>
</message>
<message>
<source>Set default options</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">回到預設值</translation>
</message>
<message>
<source>Open videos directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">打開視頻目錄</translation>
</message>
<message>
<source>Play</source>
- <translation type="unfinished"></translation>
+ <translation>播放</translation>
</message>
<message>
<source>Upload to YouTube</source>
- <translation type="unfinished"></translation>
+ <translation>上傳到YouTube</translation>
</message>
<message>
<source>Cancel uploading</source>
- <translation type="unfinished"></translation>
+ <translation>取消上傳</translation>
</message>
<message>
<source>Restore default coding parameters</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">恢復預設的編碼參數</translation>
</message>
<message>
<source>Open the video directory in your system</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">打開你系統上的視頻目錄</translation>
</message>
<message>
<source>Play this video</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">播放此視頻</translation>
</message>
<message>
<source>Delete this video</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">刪除此視頻</translation>
</message>
<message>
<source>Upload this video to your Youtube account</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">上傳視頻到你的YouTube帳戶</translation>
</message>
<message>
<source>Reset</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">重置</translation>
</message>
<message>
<source>Set the default server port for Hedgewars</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">設置為刺猬大作戰預設的伺服器端口</translation>
</message>
<message>
<source>Invite your friends to your server in just 1 click!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">只要1個點擊就可以邀請你的朋友到你的伺服器!</translation>
</message>
<message>
<source>Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">點擊複製你獨特的伺服器URL到剪貼簿。將此鏈接發送給你的朋友,他們就可以加入你。</translation>
</message>
<message>
<source>Start private server</source>
- <translation type="unfinished"></translation>
+ <translation>啟動私人伺服器</translation>
</message>
</context>
<context>
<name>RoomNamePrompt</name>
<message>
<source>Enter a name for your room.</source>
- <translation type="unfinished"></translation>
+ <translation>為你的房間輸入一個名稱。</translation>
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">取消</translation>
+ <translation>取消</translation>
</message>
<message>
<source>Create room</source>
- <translation type="unfinished"></translation>
+ <translation>創建房間</translation>
</message>
<message>
<source>set password</source>
- <translation type="unfinished"></translation>
+ <translation>設定密碼</translation>
</message>
</context>
<context>
<name>RoomsListModel</name>
<message>
<source>In progress</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">進行中</translation>
</message>
<message>
<source>Room Name</source>
@@ -2581,15 +2635,15 @@
</message>
<message>
<source>Random Maze</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">隨機迷宮</translation>
</message>
<message>
<source>Hand-drawn</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">手繪</translation>
</message>
<message>
<source>Script</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">腳本</translation>
</message>
<message>
<source>Random Perlin</source>
@@ -2600,38 +2654,42 @@
<name>SeedPrompt</name>
<message>
<source>The map seed is the basis for all random values generated by the game.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">地圖種子是基礎由遊戲生成的所有隨機值。</translation>
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">取消</translation>
+ <translation>取消</translation>
</message>
<message>
<source>Set seed</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">給定種子</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished"></translation>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished">種子</translation>
</message>
</context>
<context>
<name>SelWeaponWidget</name>
<message>
<source>Weapon set</source>
- <translation type="unfinished">武器設置</translation>
+ <translation type="unfinished">武器組合</translation>
</message>
<message>
<source>Probabilities</source>
- <translation type="unfinished">幾率</translation>
+ <translation>機率</translation>
</message>
<message>
<source>Ammo in boxes</source>
- <translation type="unfinished"></translation>
+ <translation>箱中彈藥</translation>
</message>
<message>
<source>Delays</source>
- <translation type="unfinished"></translation>
+ <translation>延遲</translation>
</message>
<message>
<source>new</source>
@@ -2639,19 +2697,20 @@
</message>
<message>
<source>copy of %1</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">%1的拷貝</translation>
</message>
</context>
<context>
<name>TCPBase</name>
<message>
<source>Unable to start server at %1.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">無法在%1,啟動伺服器。</translation>
</message>
<message>
<source>Unable to run engine at %1
Error code: %2</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">無法在%1,運行引擎
+錯誤代碼:%2</translation>
</message>
<message>
<source>The game engine died unexpectedly!
@@ -2660,28 +2719,37 @@
We are very sorry for the inconvenience :(
If this keeps happening, please click the '%2' button in the main menu!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">遊戲引擎意外死亡
+(退出代碼為%1)
+
+我們很抱歉給你帶來不便! :(
+
+如果這一情況持續發生,請點擊主菜單中的“%2”按鈕!</translation>
</message>
</context>
<context>
<name>TeamSelWidget</name>
<message>
<source>At least two teams are required to play!</source>
- <translation type="unfinished"></translation>
+ <translation>至少要有兩隻隊伍才能玩!</translation>
</message>
</context>
<context>
<name>ThemePrompt</name>
<message>
<source>Cancel</source>
- <translation type="unfinished">取消</translation>
+ <translation>取消</translation>
</message>
<message>
<source>Search for a theme:</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">搜索主題:</translation>
</message>
<message>
<source>Use selected theme</source>
+ <translation type="unfinished">使用選定的主題</translation>
+ </message>
+ <message>
+ <source>Choose a theme</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -2717,35 +2785,35 @@
</message>
<message>
<source>slot 1</source>
- <translation>slot 1</translation>
+ <translation type="unfinished">第1類</translation>
</message>
<message>
<source>slot 2</source>
- <translation>slot 2</translation>
+ <translation type="unfinished">第2類</translation>
</message>
<message>
<source>slot 3</source>
- <translation>slot 3</translation>
+ <translation type="unfinished">第3類</translation>
</message>
<message>
<source>slot 4</source>
- <translation>slot 4</translation>
+ <translation type="unfinished">第4類</translation>
</message>
<message>
<source>slot 5</source>
- <translation>slot 5</translation>
+ <translation type="unfinished">第5類</translation>
</message>
<message>
<source>slot 6</source>
- <translation>slot 6</translation>
+ <translation type="unfinished">第6類</translation>
</message>
<message>
<source>slot 7</source>
- <translation>slot 7</translation>
+ <translation type="unfinished">第7類</translation>
</message>
<message>
<source>slot 8</source>
- <translation>slot 8</translation>
+ <translation type="unfinished">第8類</translation>
</message>
<message>
<source>timer 1 sec</source>
@@ -2769,7 +2837,7 @@
</message>
<message>
<source>capture</source>
- <translation>奪取</translation>
+ <translation>抓取</translation>
</message>
<message>
<source>quit</source>
@@ -2801,11 +2869,11 @@
</message>
<message>
<source>slot 9</source>
- <translation>slot 9</translation>
+ <translation type="unfinished">第9類</translation>
</message>
<message>
<source>precise aim</source>
- <translation>練習瞄準</translation>
+ <translation>精細瞄準</translation>
</message>
<message>
<source>chat</source>
@@ -2821,180 +2889,180 @@
</message>
<message>
<source>zoom in</source>
- <translation type="unfinished">放大</translation>
+ <translation>放大</translation>
</message>
<message>
<source>zoom out</source>
- <translation type="unfinished">縮小</translation>
+ <translation>縮小</translation>
</message>
<message>
<source>reset zoom</source>
- <translation type="unfinished">重置</translation>
+ <translation>重置</translation>
</message>
<message>
<source>long jump</source>
- <translation type="unfinished">跳遠</translation>
+ <translation>跳遠</translation>
</message>
<message>
<source>high jump</source>
- <translation type="unfinished">跳高</translation>
+ <translation>跳高</translation>
</message>
<message>
<source>slot 10</source>
- <translation type="unfinished">slot 10</translation>
+ <translation type="unfinished">第10類</translation>
</message>
<message>
<source>mute audio</source>
- <translation type="unfinished"></translation>
+ <translation>靜音</translation>
</message>
<message>
<source>record</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">錄像切換</translation>
</message>
<message>
<source>hedgehog info</source>
- <translation type="unfinished"></translation>
+ <translation>刺蝟資訊</translation>
</message>
<message>
<source>autocam / find hedgehog</source>
- <translation type="unfinished"></translation>
+ <translation>自動鏡頭/搜尋刺蝟</translation>
</message>
<message>
<source>speed up replay</source>
- <translation type="unfinished"></translation>
+ <translation>加速播放</translation>
</message>
</context>
<context>
<name>binds (categories)</name>
<message>
<source>Movement</source>
- <translation type="unfinished"></translation>
+ <translation>移動</translation>
</message>
<message>
<source>Weapons</source>
- <translation type="unfinished">武器</translation>
+ <translation>武器</translation>
</message>
<message>
<source>Camera</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">鏡頭</translation>
</message>
<message>
<source>Miscellaneous</source>
- <translation type="unfinished"></translation>
+ <translation>雜項</translation>
</message>
</context>
<context>
<name>binds (descriptions)</name>
<message>
<source>Traverse gaps and obstacles by jumping:</source>
- <translation type="unfinished">越過障礙:</translation>
+ <translation>藉由跳躍通過間隙與障礙:</translation>
</message>
<message>
<source>Fire your selected weapon or trigger an utility item:</source>
- <translation type="unfinished">開火、使用物品:</translation>
+ <translation>開火或使用物品:</translation>
</message>
<message>
<source>Pick a weapon or a target location under the cursor:</source>
- <translation type="unfinished">選取武器、目的地:</translation>
+ <translation>選取游標下的武器或是目標位置:</translation>
</message>
<message>
<source>Switch your currently active hog (if possible):</source>
- <translation type="unfinished">切換刺蝟(如果可用):</translation>
+ <translation>切換現在能動的刺蝟(如果可能):</translation>
</message>
<message>
<source>Pick a weapon or utility item:</source>
- <translation type="unfinished">選取武器、物品:</translation>
+ <translation>挑武器或物品:</translation>
</message>
<message>
<source>Set the timer on bombs and timed weapons:</source>
- <translation type="unfinished">設置定時炸彈等武器時間:</translation>
+ <translation>設置定時炸彈和限時武器的時間:</translation>
</message>
<message>
<source>Move the camera to the active hog:</source>
- <translation type="obsolete">移動鏡頭到選中刺蝟:</translation>
+ <translation type="obsolete">移動鏡頭到能動的刺蝟:</translation>
</message>
<message>
<source>Move the cursor or camera without using the mouse:</source>
- <translation type="unfinished">不用滑鼠移動遊標或鏡頭:</translation>
+ <translation>不用滑鼠移動游標或鏡頭:</translation>
</message>
<message>
<source>Modify the camera's zoom level:</source>
- <translation type="unfinished">調整鏡頭放大倍數:</translation>
+ <translation>調整鏡頭放大倍數:</translation>
</message>
<message>
<source>Talk to your team or all participants:</source>
- <translation type="unfinished">同隊友或全部參與者對話:</translation>
+ <translation>同隊友或全部參與者對話:</translation>
</message>
<message>
<source>Pause, continue or leave your game:</source>
- <translation type="unfinished">暫停、繼續或離開遊戲:</translation>
+ <translation>暫停、繼續或離開遊戲:</translation>
</message>
<message>
<source>Modify the game's volume while playing:</source>
- <translation type="unfinished">調整遊戲時音量:</translation>
+ <translation>調整遊戲時音量:</translation>
</message>
<message>
<source>Toggle fullscreen mode:</source>
- <translation type="unfinished">全屏模式:</translation>
+ <translation>切換全屏模式:</translation>
</message>
<message>
<source>Take a screenshot:</source>
- <translation type="unfinished">截圖:</translation>
+ <translation>截圖:</translation>
</message>
<message>
<source>Toggle labels above hedgehogs:</source>
- <translation type="unfinished">切換刺蝟標籤顯示方式:</translation>
+ <translation>切換刺蝟頭上標籤的顯示方式:</translation>
</message>
<message>
<source>Record video:</source>
- <translation type="unfinished"></translation>
+ <translation>錄像:</translation>
</message>
<message>
<source>Hedgehog movement</source>
- <translation type="unfinished"></translation>
+ <translation>刺蝟移動</translation>
</message>
<message>
<source>Toggle automatic camera / refocus on active hedgehog:</source>
- <translation type="unfinished"></translation>
+ <translation>切換自動鏡頭/重新關注能動的刺蝟:</translation>
</message>
<message>
<source>Demo replay:</source>
- <translation type="unfinished"></translation>
+ <translation>播放演示:</translation>
</message>
</context>
<context>
<name>binds (keys)</name>
<message>
<source>Axis</source>
- <translation type="unfinished">軸</translation>
+ <translation>軸</translation>
</message>
<message>
<source>(Up)</source>
- <translation type="unfinished">上</translation>
+ <translation>(上)</translation>
</message>
<message>
<source>(Down)</source>
- <translation type="unfinished">下</translation>
+ <translation>(下)</translation>
</message>
<message>
<source>Hat</source>
- <translation type="unfinished">帽子</translation>
+ <translation>帽子</translation>
</message>
<message>
<source>(Left)</source>
- <translation type="unfinished">左</translation>
+ <translation>(左)</translation>
</message>
<message>
<source>(Right)</source>
- <translation type="unfinished">右</translation>
+ <translation>(右)</translation>
</message>
<message>
<source>Button</source>
- <translation type="unfinished">按鍵</translation>
+ <translation>按鈕</translation>
</message>
<message>
<source>Keyboard</source>
- <translation type="unfinished">鍵盤</translation>
+ <translation>鍵盤</translation>
</message>
<message>
<source>Mouse: Left button</source>
@@ -3018,27 +3086,27 @@
</message>
<message>
<source>Backspace</source>
- <translation>倒退鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Tab</source>
- <translation>製錶鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Clear</source>
- <translation>清除</translation>
+ <translation></translation>
</message>
<message>
<source>Return</source>
- <translation>返回</translation>
+ <translation></translation>
</message>
<message>
<source>Pause</source>
- <translation>暫停鍵</translation>
+ <translation>Pause/Break</translation>
</message>
<message>
<source>Escape</source>
- <translation>逸出鍵</translation>
+ <translation>Esc</translation>
</message>
<message>
<source>Space</source>
@@ -3046,7 +3114,7 @@
</message>
<message>
<source>Delete</source>
- <translation>刪除鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Numpad 0</source>
@@ -3110,11 +3178,11 @@
</message>
<message>
<source>Enter</source>
- <translation>回車鍵</translation>
+ <translation>Enter</translation>
</message>
<message>
<source>Equals</source>
- <translation>等於</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<source>Up</source>
@@ -3134,23 +3202,23 @@
</message>
<message>
<source>Insert</source>
- <translation>插入鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Home</source>
- <translation>Home鍵</translation>
+ <translation></translation>
</message>
<message>
<source>End</source>
- <translation>End鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Page up</source>
- <translation>向上翻頁鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Page down</source>
- <translation>向下翻頁鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Num lock</source>
@@ -3162,7 +3230,7 @@
</message>
<message>
<source>Scroll lock</source>
- <translation>Scroll Lock鍵</translation>
+ <translation></translation>
</message>
<message>
<source>Right shift</source>
@@ -3198,265 +3266,309 @@
</message>
<message>
<source>A button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A鈕</translation>
</message>
<message>
<source>B button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">B鈕</translation>
</message>
<message>
<source>X button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">X鈕</translation>
</message>
<message>
<source>Y button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Y鈕</translation>
</message>
<message>
<source>LB button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">LB鈕</translation>
</message>
<message>
<source>RB button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">RB鈕</translation>
</message>
<message>
<source>Back button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Back鈕</translation>
</message>
<message>
<source>Start button</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Start鈕</translation>
</message>
<message>
<source>Left stick</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">左搖桿</translation>
</message>
<message>
<source>Right stick</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">右搖桿</translation>
</message>
<message>
<source>Left stick (Right)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">左搖桿(右)</translation>
</message>
<message>
<source>Left stick (Left)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">左搖桿(左)</translation>
</message>
<message>
<source>Left stick (Down)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">左搖桿(下)</translation>
</message>
<message>
<source>Left stick (Up)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">左搖桿(上)</translation>
</message>
<message>
<source>Left trigger</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">LT鈕</translation>
</message>
<message>
<source>Right trigger</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">RT鈕</translation>
</message>
<message>
<source>Right stick (Down)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">右搖桿(下)</translation>
</message>
<message>
<source>Right stick (Up)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">右搖桿(上)</translation>
</message>
<message>
<source>Right stick (Right)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">右搖桿(右)</translation>
</message>
<message>
<source>Right stick (Left)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">右搖桿(左)</translation>
</message>
<message>
<source>DPad</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">十字键</translation>
</message>
</context>
<context>
<name>server</name>
<message>
<source>Restricted</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">限制</translation>
</message>
<message>
<source>Not room master</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不是房間主人</translation>
</message>
<message>
<source>Corrupted hedgehogs info</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">錯誤的刺蝟資訊</translation>
</message>
<message>
<source>too many teams</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">太多隊伍</translation>
</message>
<message>
<source>too many hedgehogs</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">太多隻刺蝟</translation>
</message>
<message>
<source>There's already a team with same name in the list</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">已經有一個同樣名稱的隊伍在列表中</translation>
</message>
<message>
<source>round in progress</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">遊戲正在進行</translation>
</message>
<message>
<source>restricted</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">限制</translation>
</message>
<message>
<source>REMOVE_TEAM: no such team</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">移除隊伍: 沒有這樣的隊伍</translation>
</message>
<message>
<source>Not team owner!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不是隊伍的擁有者!</translation>
</message>
<message>
<source>Less than two clans!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">少於兩個家族!</translation>
</message>
<message>
<source>Illegal room name</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不合法的房間名</translation>
</message>
<message>
<source>Room with such name already exists</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">這樣名稱的房間已經存在</translation>
</message>
<message>
<source>Nickname already chosen</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">暱稱已經選擇</translation>
</message>
<message>
<source>Illegal nickname</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">不合法的暱稱</translation>
</message>
<message>
<source>Protocol already known</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">已知協議</translation>
</message>
<message>
<source>Bad number</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">壞數字</translation>
</message>
<message>
<source>Nickname is already in use</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">暱稱已經被使用</translation>
</message>
<message>
<source>No checker rights</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">沒有檢查權</translation>
</message>
<message>
<source>Authentication failed</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">驗證失敗</translation>
</message>
<message>
<source>60 seconds cooldown after kick</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">被踢出後60秒冷卻時間</translation>
</message>
<message>
<source>kicked</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">被踢出</translation>
</message>
<message>
<source>Ping timeout</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ping超時</translation>
</message>
<message>
<source>bye</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">再見</translation>
</message>
<message>
<source>No such room</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">沒有這樣的房間</translation>
</message>
<message>
<source>Room version incompatible to your hedgewars version</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">房間版本不兼容你的刺猬大作戰版本</translation>
</message>
<message>
<source>Joining restricted</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">加入限制</translation>
</message>
<message>
<source>Registered users only</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">僅已經註冊的使用者</translation>
</message>
<message>
<source>You are banned in this room</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你被這個房間封鎖</translation>
</message>
<message>
<source>Empty config entry</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">空的設定項目</translation>
</message>
<message>
<source>You already have voted</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">你已經投過票了</translation>
</message>
<message>
<source>Voting closed</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">投票已經關閉</translation>
</message>
<message>
<source>New voting started</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">新的投票開始</translation>
</message>
<message>
<source>Voting expired</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">投票已經過期</translation>
</message>
<message>
<source>kick</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">踢</translation>
</message>
<message>
<source>map</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">地圖</translation>
</message>
<message>
<source>pause</source>
- <translation type="unfinished">暫停</translation>
+ <translation>暫停</translation>
</message>
<message>
<source>Reconnected too fast</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">太快重新連線</translation>
</message>
<message>
<source>Warning! Chat flood protection activated</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">警告! 避免聊天氾濫的防護機制被啟動</translation>
</message>
<message>
<source>Excess flood</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">超額洪水</translation>
</message>
<message>
<source>Game messages flood detected - 1</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">已經偵測到遊戲訊息氾濫 - 1</translation>
</message>
<message>
<source>Game messages flood detected - 2</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">已經偵測到遊戲訊息氾濫 - 2</translation>
</message>
<message>
<source>Warning! Joins flood protection activated</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">警告! 避免加入氾濫的防護機制被啟動</translation>
</message>
<message>
<source>There's no voting going on</source>
+ <translation type="unfinished">沒有正在進行的投票</translation>
+ </message>
+ <message>
+ <source>Your vote counted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pause toggled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new seed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>number of hedgehogs in team</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/maxteams: specify number from 2 to 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: specify nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote kick: no such user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote map: no such map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote pause: no game in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>callvote hedgehogs: specify number from 1 to 8</source>
<translation type="unfinished"></translation>
</message>
</context>
--- a/share/hedgewars/Data/Locale/missions_de.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/missions_de.txt Fri Apr 01 15:36:19 2016 +0200
@@ -16,6 +16,9 @@
Basic_Training_-_Rope.name=Grundlagentraining: Seil
Basic_Training_-_Rope.desc="Raus da und schwing!"
+Basic_Training_-_Flying_Saucer.name=Grundlagentraining: Fliegende Untertasse
+Basic_Training_-_Flying_Saucer.desc="Du willst also ausgerechnet Astronaut werden, wie? Dann lern erstmal fliegen!"
+
User_Mission_-_Dangerous_Ducklings.name=Mission: Gefährliche Entchen
User_Mission_-_Dangerous_Ducklings.desc="Nun gut, Rekrut! Es ist Zeit, dass du das im Grundlagentraining Gelernte in die Tag umsetzt!"
--- a/share/hedgewars/Data/Locale/missions_en.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/missions_en.txt Fri Apr 01 15:36:19 2016 +0200
@@ -16,6 +16,9 @@
Basic_Training_-_Rope.name=Basic Rope Training
Basic_Training_-_Rope.desc="Get out there and swing!"
+Basic_Training_-_Flying_Saucer.name=Basic Flying Saucer Training
+Basic_Training_-_Flying_Saucer.desc="So you really want to become an astronaut, eh? You should learn how to fly first!"
+
User_Mission_-_Dangerous_Ducklings.name=Mission: Dangerous Ducklings
User_Mission_-_Dangerous_Ducklings.desc="Alright, rookie! Time to put what we learned in Basic Training into practice!"
@@ -80,4 +83,4 @@
Challenge_-_Speed_Shoppa_-_Ropes.desc="Take your rope and collect all crates on this medium-sized map."
Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Challenge: The Customer is King
-Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Show you're worthy of a true king and collect all crates as fast as possible on this large map."
\ No newline at end of file
+Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Show you're worthy of a true king and collect all crates as fast as possible on this large map."
--- a/share/hedgewars/Data/Locale/missions_it.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/missions_it.txt Fri Apr 01 15:36:19 2016 +0200
@@ -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."
--- a/share/hedgewars/Data/Locale/missions_ru.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/missions_ru.txt Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- a/share/hedgewars/Data/Locale/ru.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/ru.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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
}
--- a/share/hedgewars/Data/Locale/ru.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/ru.txt Fri Apr 01 15:36:19 2016 +0200
@@ -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=Режимы игры
--- a/share/hedgewars/Data/Locale/stub.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/stub.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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
}
--- a/share/hedgewars/Data/Locale/tips_de.xml Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/tips_de.xml Fri Apr 01 15:36:19 2016 +0200
@@ -6,15 +6,15 @@
<tip>Wähl einfach die selbe Farbe wie die eines Freundes aus, um gemeinsam als ein Klan zu spielen. Jeder von euch wird immer noch Kontrolle über seine eigenen Igel haben, aber sie werden gemeinsam siegen oder verlieren.</tip>
<tip>Einige Waffen mögen zwar nur geringfügigen Schaden anrichten, aber sie können in der passenden Sitation verheerend sein. Versuche, die Desert Eagle zu benutzen, um mehrere Igel ins Wasser zu schubsen.</tip>
<tip>Falls du dir unsicher darüber bist, was du tun sollst und du keine Munition verschwenden willst, überspring die Runde. Aber lass nicht zu viel Zeit verstreichen, weil irgendwann der Sudden Death kommt.</tip>
- <tip>Willst du Seile sparen? Lass das Seil im Flug los und schieß erneut. Solange du den Boden nicht berührst oder ein Schuss daneben geht, wirst du dein Seil wiederverwenden, ohne Vorräte zu vergeuden.</tip>
- <tip>Wenn du Andere davon abhalten willst, deinen Lieblingsspitznamen auf dem offiziellen Server zu benutzen, registiere ein Benutzerkonto auf http://www.hedgewars.org/.</tip>
+ <tip>Willst du Seile sparen? Lass das Seil im Flug los und schieß erneut. Solange du den Boden nicht berührst und kein Schuss daneben geht, wirst du dein Seil wiederverwenden, ohne Vorräte zu vergeuden.</tip>
+ <tip>Wenn du Andere davon abhalten willst, deinen Lieblingsspitznamen auf dem offiziellen Server zu benutzen, registiere ein Benutzerkonto auf <a href="http://www.hedgewars.org/">http://www.hedgewars.org/</a>.</tip>
<tip>Bist du vom Standardspiel gelangweilt? Dann probier eine der Missionen aus – sie spielen sich anders, je nach dem, welche Mission du ausgewählt hast.</tip>
<tip>Standardmäßig wird das Programm immer vom letzten Spiel eine Wiederholung abspeichern. Wähle »Auf einen einzelnen Computer spielen« und dann den »Aufgezeichnete Wiederholungen ansehen«-Knopf auf der rechten unteren Ecke, um sie abzuspielen oder zu verwalten.</tip>
<tip>Hedgewars ist freie Open-Source-Software, die wir in unserer Freizeit erstellen. Falls du Probleme hast, frag uns in unseren Foren oder besuch unseren IRC-Channel!</tip>
<tip>Hedgewars ist freie Open-Source-Software, die wir in unserer Freizeit erstellen. Wenn es dir gefällt, hilf uns mit einer kleinen Spende oder steuere deine eigenen Werke bei!</tip>
<tip>Hedgewars ist freie Open-Source-Software, die wir in unserer Freizeit erstellen. Teile es mit deiner Famlie und deinen Freunden, wie es dir gefällt!</tip>
<tip>Hedgewars ist freie Open-Source-Software, die wir in unserer Freizeit nur so zum Spaß erstellen. Triff die Entwickler auf <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
- <tip>Von Zeit zu Zeit wird es offizielle Turniere geben. Bevorstehende Ereignisse werden auf http://www.hedgewars.org/ ein paar Tage im voraus angekündigt.</tip>
+ <tip>Von Zeit zu Zeit wird es offizielle Turniere geben. Bevorstehende Ereignisse werden auf <a href="http://www.hedgewars.org/">http://www.hedgewars.org/</a> ein paar Tage im Voraus angekündigt.</tip>
<tip>Hedgewars ist in vielen Sprachen verfügbar. Wenn die Übersetzung deiner Sprache zu fehlen oder veraltet zu sein scheint, nimm ruhig mit uns Kontakt auf!</tip>
<tip>Hedgewars läuft auf vielen verschiedenen Betriebssystemem, unter anderen Microsoft Windows, Mac OS X und GNU/Linux.</tip>
<tip>Denk immer daran, dass du in der Lage bist, deine eigenen Spiele in lokalen Spielen und Netzwerkspielen aufzusetzen. Du musst nicht zwangsläufig nur einfache Spiele spielen.</tip>
@@ -30,7 +30,7 @@
<tip>Hedgewars kann perfekt für kurze Spiele in Pausen sein. Stell nur sicher, dass du nicht zu viele Igel hinzufügst oder eine gigantische Karte benutzt. Das Verringern der Zeit und Anfangsgesundheit kann ebenfalls helfen.</tip>
<tip>Bei der Erstellung dieses Spiels wurden keine Igel verletzt.</tip>
<tip>Drei verschiedene Sprünge sind verfügbar. Drücke [Hochsprung] doppelt, um einen sehr hohen Rückwärtssprung zu machen.</tip>
- <tip>Hast du Angst, von einer Klippe zu stürzen? Halte [Genau zielen], um dich nach [links] oder [rechts], ohne dich tatsächlich zu bewegen, umzudrehen.</tip>
+ <tip>Hast du Angst, von einer Klippe zu stürzen? Halte [Genaues Zielen], um dich nach [Links] oder [Rechts], ohne dich tatsächlich zu bewegen, umzudrehen.</tip>
<tip>Ein paar Waffen erfordern besondere Strategien oder einfach nur sehr viel Training, also gib ein bestimmtes Werkzeug nicht auf, wenn du einen Gegner mal verfehlt haben solltest.</tip>
<tip>Die meisten Waffen würden nicht funktionieren, sobald sie das Wasser berührt haben. Die zielsuchende Biene sowie der Kuchen sind Ausnahmen davon.</tip>
<tip>Der alte Limburger verursacht nur eine kleine Explosion. Allerdings kann die vom Wind beeinflusste Stinkewolke viele Igel auf einmal vergiften.</tip>
@@ -48,6 +48,24 @@
<tip>Halte deine Grafikkartentreiber auf dem neuesten Stand, um Probleme beim Spielen des Spiels zu vermeiden.</tip>
<tip>Kopf oder Zahl? Gib »/rnd« in der Lobby ein und finde es heraus. »/rnd Schere Stein Papier« funktioniert auch!</tip>
<tip>Du kannst Hedgewars-bezogene Dateien (Spielstände und Wiederholungen) mit dem Spiel assoziieren, um sie direkt von deinem Lieblingsdateiverwaltungsprogramm oder Webbrowser starten zu können.</tip>
+ <tip>Blindgängerminen sind nicht harmlos: Obwohl ihr Zeitzünder defekt ist, können sie immer noch explodieren, wenn ihnen zu stark zugerichtet wurde.</tip>
+ <tip>Liebe ist heiß! Benutze die Verführung, um eingefrorene Igel sofort aufzutauen.</tip>
+ <tip>Rauch, der aus einem Pulverfass aufsteigt, ist ein Hinweis darauf, dass es beschädigt wurde. In diesem Zustand kann auch geringfügiger Schaden das Fass sprengen.</tip>
+ <tip>Pulverfässer starten mit 60 Gesundheitspunkten und nehmen Schaden wie Igel, also muss ihnen schon etwas zugerichtet werden, um sie zu zerstören</tip>
+ <tip>Mehr Sprungkraft gefällig? Ändere die Sprungstärke von Granaten, Splittergranaten, alten Limburgern und Minen, während du [Genaues Zielen] gedrückt hälst und gleichzeitig eine der Zeitzündertasten drückst.</tip>
+ <tip>Hast du die Spielziele oder -regeln im Spiel vergessen? Drück die Pause- oder Verlassentaste, um sie wieder sichtbar zu machen!</tip>
+ <tip>Du kannst nicht nur Igel, sondern auch einige Gegenstände verprügeln, auspeitschen oder mit dem Hammer in den Boden stampfen. Hau alles zu Klump!</tip>
+ <tip>Wenn es nicht anders geschrieben steht, werden Minen normalerweise nach 3 Sekunden explodieren.</tip>
+ <tip>Im Königsmodus wird dein König gesünder, stärker und widerstandsfähiger gegenüber Schaden und Schubser sein als seine Untertanen.</tip>
+ <tip>Im Königsmodus wird der König nach jedem Zug Schaden nehmen, wenn er alleine im Team ist.</tip>
+ <tip>Die Peitsche kann auch Igel und Gegenstände hinter einer dünnen Wand treffen.</tip>
+ <tip>Der Schaden eines Hackebeils vergrößert sich mit der Fluggeschwindigkeit.</tip>
+ <tip>Du kannst Torten von Klippen fallen lassen, aber du musst schon sehr nahe am Rand stehen, also sei vorsichtig.</tip>
+ <tip>Benutze dein Seil, um andere Igel wegzuschubsen, zum Beispiel, indem du auf dem Boden rutschst. Diese Technik ist bekannt als »Seilschubsen«.</tip>
+ <tip>Bleib auf einem eisigen Abhang nicht still stehen, sonst wirst du wegrutschen. Alternativ kannst du [Genaues Zielen] gedrückt halten.</tip>
+ <tip>In den Ländern des Schnees und der Weihnacht wird der Schnee langsam und allmählich die Landschaft bedecken, es sei denn, das Land ist unzerstörbar.</tip>
+ <tip>Sei vorsichtig in den Ländern des Schnees und der Weihnacht, weil die Träger aus rutschigem Eis bestehen.</tip>
+ <tip>Die Rückzugszeit hängt ab von der Waffe, die du benutzt hast. Sei vorsichtig, einige Waffen haben keine Rückzugszeit und beenden deinen Zug sofort!</tip>
<windows-only>
<tip>Diese Hedgewars-Version unterstützt <a href="http://www.xfire.com/">Xfire</a>. Stell sicher, Hedgewars dessen Spielliste hinzuzufügen, damit deine Freunde dich beim Spielen sehen können.</tip>
<tip>Du kannst deine Hedgewars-Einstellungsdateien unter »Eigene Dokumente\Hedgewars« finden. Erstelle Backups oder nimm die Dateien mit, aber bitte bearbeite sie nicht von Hand.</tip>
--- a/share/hedgewars/Data/Locale/tips_en.xml Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/tips_en.xml Fri Apr 01 15:36:19 2016 +0200
@@ -11,7 +11,7 @@
<tip>You're bored of default gameplay? Try one of the missions — they'll offer different gameplay depending on the one you picked.</tip>
<tip>By default the game will always record the last game played as a demo. Select “Local Game” and pick the “Demos” button on the lower right corner to play or manage them.</tip>
<tip>Hedgewars is free software (Open Source) we create in our spare time. If you’ve got problems, ask on our forums or visit our IRC room!</tip>
- <tip>Hedgewars is free software (Open Source) we create in our spare time. If you like it, help us with a small donation or contribute your own work!</tip>
+ <tip>Hedgewars is free software (Open Source) we create in our spare time. If you like it, feel free to help us with a small donation or contribute your own work!</tip>
<tip>Hedgewars is free software (Open Source) we create in our spare time. Share it with your family and friends as you like!</tip>
<tip>Hedgewars is free software (Open Source) we create in our spare time, just for fun! Meet the devs in <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
<tip>From time to time there will be official tournaments. Upcoming events will be announced at <a href="http://www.hedgewars.org/">http://www.hedgewars.org/</a> some days in advance.</tip>
@@ -19,14 +19,13 @@
<tip>Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and GNU/Linux.</tip>
<tip>Always remember you’re able to set up your own games in local and network/online play. You’re not restricted to the “Simple Game” option.</tip>
<tip>Connect one or more gamepads before starting the game to be able to assign their controls to your teams.</tip>
- <tip>Create an account on <a href="http://www.hedgewars.org/">http://www.hedgewars.org/</a> to keep others from using your most favourite nickname while playing on the official server.</tip>
- <tip>While playing you should give yourself a short break at least once an hour.</tip>
+ <tip>Consider giving yourself a short break at least once an hour to guard against strain from playing.</tip>
<tip>If your graphics card isn’t able to provide hardware accelerated OpenGL, try to enable the low quality mode to improve performance.</tip>
<tip>If your graphics card isn’t able to provide hardware accelerated OpenGL, try to update the associated drivers.</tip>
<tip>We’re open to suggestions and constructive feedback. If you don’t like something or got a great idea, let us know!</tip>
- <tip>Especially while playing online be polite and always remember there might be some minors playing with or against you as well!</tip>
+ <tip>For your own benefit we'd like you to be polite and friendly while playing on our server. Also please keep in mind that some players are minors!</tip>
<tip>Special game modes such as “Vampirism” or “Karma” allow you to develop completely new tactics. Try them in a custom game!</tip>
- <tip>You should never install Hedgewars on computers you don’t own (school, university, work, etc.). Please ask the responsible person instead!</tip>
+ <tip>Please don't install Hedgewars on computers you don’t own (school, university, work, etc.) unless you got permission. We don't want you to get into any trouble.</tip>
<tip>Hedgewars can be perfect for short games during breaks. Just ensure you don’t add too many hedgehogs or use an huge map. Reducing time and health might help as well.</tip>
<tip>No hedgehogs were harmed in making this game.</tip>
<tip>There are three different jumps available. Tap [high jump] twice to do a very high/backwards jump.</tip>
--- a/share/hedgewars/Data/Locale/tips_it.xml Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Locale/tips_it.xml Fri Apr 01 15:36:19 2016 +0200
@@ -6,52 +6,73 @@
<tip>Scegli lo stesso colore di un amico per giocare in squadra. Ciascuno controllerà i propri ricci ma la vittoria o la sconfitta saranno comuni.</tip>
<tip>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.</tip>
<tip>Se non sai cosa fare e non vuoi sprecare munizioni, salta il turno. Ma non farlo troppe volte perché c'è il Sudden Death!</tip>
+ <tip>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!</tip>
<tip>Se vuoi evitare che altri possano impersonarti, utilizzando il tuo nickname, sul server ufficiale, registrati su http://www.hedgewars.org/.</tip>
<tip>Sei stanco delle partite preimpostate? Prova una missione - le missioni offrono interessanti modalità differenti di partite in base alle tue scelte.</tip>
<tip>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.</tip>
- <tip>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!</tip>
+ <tip>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!</tip>
<tip>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!</tip>
- <tip>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!</tip>
- <tip>Di tanto in tanto ci saranno tornei ufficiali. Gli eventi saranno annunciati su http://www.hedgewars.org/ con qualche giorno di anticipo.</tip>
+ <tip>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!</tip>
+ <tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Incontra gli sviluppatori sul canale <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
+ <tip>Di tanto in tanto ci saranno tornei ufficiali. Gli eventi saranno annunciati su <a href="http://www.hedgewars.org/">http://www.hedgewars.org/</a> con qualche giorno di anticipo.</tip>
<tip>Hedgewars è disponibile in molte lingue. Se la traduzione nella tua lingua sembra mancante o non aggiornata, sentiti libero di contattaci!</tip>
- <tip>Hedgewars può essere usato su molti sistemi operativi differenti come Microsoft Windows - XP, Vista, 7 -, Mac OS X e Linux.</tip>
+ <tip>Hedgewars può essere usato su molti sistemi operativi differenti come Microsoft Windows, Mac OS X e GNU/Linux.</tip>
<tip>Ricordati che sei sempre in grado di configurare partire personalizzate in locale e online. Non devi sentirti limitato alle opzioni predefinite!</tip>
- <tip>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!</tip>
+ <tip>Collega uno o più gamepad prima di iniziare il gioco per poterli assegnare alle tue squadra.</tip>
+ <tip>Durante il gioco dovresti fare una breve pausa almeno ogni ora per evitare la stanchezza da gioco eccessivo.</tip>
<tip>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.</tip>
+ <tip>Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad aggiornarne i driver.</tip>
<tip>Siamo aperti a suggerimenti e consigli costruttivi. Se non ti piace qualcosa o hai una buona idea, comunicacelo!</tip>
<tip>In particolare quando giochi online sii educato e ricorda che potrebbero esserci dei minorenni che stanno giocando con te o contro di te!</tip>
- <tip>Le modalità di gioco speciali, come 'Vampirismo' o 'Karma' ti permettono di sviluppare nuove tattiche. Provale in una partita personalizzata!</tip>
+ <tip>Le modalità di gioco speciali, come “Vampirismo” o “Karma” ti permettono di sviluppare nuove tattiche. Provale in una partita personalizzata!</tip>
<tip>Non dovresti mai installare Hedgewars su computer che non possiedi (scuola, università, lavoro, ecc.). Per favore, chiedi ai responsabili!</tip>
<tip>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.</tip>
<tip>Nessun riccio è stato maltrattato durante lo sviluppo di questo gioco.</tip>
- <tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Se qualcuno ti ha venduto il gioco, dovresti chiedere un rimborso!</tip>
- <tip>Collega uno o più gamepad prima di iniziare il gioco per poterli assegnare alle tue squadra.</tip>
- <tip>Crea un account su %1 per evitare che altri possano usare il tuo nickname preferito mentre giochi sul server ufficiale.</tip>
- <tip>Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad aggiornarne i driver.</tip>
- <tip>Ci sono tre salti disponibili. Premi [salto in alto] due volte per eseguire un salto in alto all'indietro.</tip>
+ <tip>Ci sono tre tipi di salto disponibili. Premi [salto in alto] due volte per eseguire un salto in alto all'indietro.</tip>
<tip>Paura di cadere da un dirupo? Premi [mirino di precisione] per girare a [sinistra] o a [destra] senza muoverti.</tip>
<tip>Alcune armi richiedono strategie particolari o semplicemente molto allenamento, quindi non arrenderti nell'utilizzo di un'arma specifica se manchi il nemico una volta.</tip>
<tip>Molte armi non funzionano quando toccano l'acqua. L'Ape a Ricerca così come la Torta sono delle eccezioni.</tip>
<tip>Il vecchio Limburger causa solo una piccola esplosione. Tuttavia il vento influisce sulla nuvola puzzolente e può avvelenare più ricci contemporaneamente.</tip>
- <tip>L'Ultima Sonata è l'attacco aereo più dannoso. Perderai il tuo riccio, eseguendolo, quindi ci sono anche delle grosse controindicazioni.</tip>
- <tip>Le Mine Adesive sono lo strumento perfetto per creare piccole reazioni a catena e spingere i ricci nemici in situazioni difficili... o in acqua.</tip>
+ <tip>L'Ultima Sonata è l'attacco aereo più dannoso. Perderai il tuo riccio, eseguendolo, quindi c'è anche una grossa controindicazione.</tip>
+ <tip>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.</tip>
+ <tip>Le Mine Adesive sono lo strumento perfetto per creare piccole reazioni a catena e spingere i ricci nemici in situazioni difficili … o in acqua.</tip>
<tip>Il Martello è più efficate se usato su ponti o travi. Colpire i ricci li farà sprofondare attraverso il terreno.</tip>
<tip>Se sei bloccato dietro un riccio nemico, usa il Martello per liberarti senza essere danneggiato da un'esplosione.</tip>
<tip>La distanza massima di cammino della Torta dipende dal terreno che deve attraversare. Usa [attacca] per farla esplodere prima.</tip>
<tip>Il Lanciafiamme è un'arma che può essere usata anche per scavare gallerie.</tip>
+ <tip>Usa la Bomba Molotov o il Lanciafiamme per impedire temporaneamente ai ricci di attraversare terreni pianeggianti, tunnel o collinette.</tip>
<tip>Vuoi sapere chi c'è dietro il gioco? Clicca sul logo Hedgewars nel menu principale per vederne gli autori e sviluppatori.</tip>
- <tip>Ti piace Hedgewars? Diventa fan su %1 o seguici su %2!</tip>
- <tip>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.</tip>
- <tip>Vuoi proprio un cappello specifico? Facci una piccola donazione e riceverai un cappello esclusivo a tua scelta!</tip>
+ <tip>Ti piace Hedgewars? Diventa fan su <a href="http://www.facebook.com/Hedgewars">Facebook</a> oppure seguici su <a href="http://twitter.com/hedgewars">Twitter</a></tip>
+ <tip>Sentiti libero di disegnare tombe, cappelli, bandiere o anche mappe e temi personalizzati! Ma nota che dovrai condividerli in qualche modo per usarli online.</tip>
<tip>Mantieni aggiornati i driver della tua scheda video, per evitare problemi durante il gioco.</tip>
- <tip>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!</tip>
- <tip>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.</tip>
- <tip>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!</tip>
- <tip>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.</tip>
- <tip>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.</tip>
- <tip>Usa la Bomba Molotov o il Lanciafiamme per impedire temporaneamente ai ricci di attraversari terreni pianeggianti, tunnel o collinette.</tip>
- <tip>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.</tip>
+ <tip>Testa o croce? Scrivi “/rnd” nella schermata LOBBY e lo scoprirai. Funziona anche “/rnd carta sasso forbice”!</tip>
+ <tip>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.</tip>
+ <tip>Le mine Dud non sono innocue: Anche se il loro timer è rotto, possono ancora esplodere se vengono abusate troppo!</tip>
+ <tip>L'amore è caldo! Utilizza Seduzione per scongelare ricci congelati.</Tip>
+ <tip>Il fumo proveniente da un barile è un indicatore che è basso di “salute” e che anche piccole quantità di danno potrebbe farlo scoppiare.</tip>
+ <tip>I barili iniziano con 60 salute e subiscono danni come ricci, quindi hanno bisogno di un po' di danno per esplodere</tip>
+ <tip>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.</tip>
+ <tip>Hai dimenticato gli obiettivi o modificatori di gioco mentre stai giocando? Premi il pulsante pausa o esci per rivederli di nuovo!</tip>
+ <tip>Puoi prendere a pugni, frustare, e martellare anche altre cose e non solo ricci. Colpiscili tutti!</tip>
+ <tip> Se non menzionato altrimenti, le mine normalmente esplodono dopo 3 secondi.</tip>
+ <tip>In modalità Re, il tuo re partirà più sano, più forte e più resistente ai danni e colpi rispetto ai servi.</tip>
+ <tip>In modalità Re, il re si danneggerà in ogni turno quando non ci saranno più servi nella sua squadra.</tip>
+ <tip>La frusta colpisce anche i ricci e gli oggetti anche dietro una parete sottile.</tip>
+ <tip>La mannaia aumenta il danno con l'aumentare della velocità.</tip>
+ <tip>Puoi far cadere torte dalle scogliere, ma per farlo bisogna stare molto vicino al bordo, quindi stai attento.</tip>
+ <tip>Usa la tua corda per allontanare altri ricci ad esempio facendola scorrere sul terreno. Questa tecnica è nota come “rope-knocking”.</tip>
+ <tip>Non fermarti su un pendio ghiacciato, o scivolerai via. In alternativa, è possibile tenere premuto [mirino di precisione].</tip>
+ <tip>Nelle terre innevate Natalizie, i mucchi di neve aumentano nel corso del tempo, a meno che la terra non sia indistruttibile.</tip>
+ <tip>Fai attenzione nelle terre innevate e Natalizie, perché le travi sono fatte di ghiaccio scivoloso.</tip>
+ <tip>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!</tip>
<windows-only>
- <tip>La versione Windows di Hedgewars supporta Xfire. Assicurati di aggiungere Hedgewars alla sua lista giochi, così i tuoi amici potranno vederti giocare.</tip>
+ <tip>Questa versione di Hedgewars supporta <a href="http://www.xfire.com">Xfire</a>. Assicurati di aggiungere Hedgewars alla sua lista giochi, cosi i tuoi amici potranno vederti giocare.</tip>
+ <tip>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.</tip>
</windows-only>
+ <mac-only>
+ <tip>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.</tip>
+ </mac-only>
+ <linux-only>
+ <tip>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.</tip>
+ </linux-only>
</tips>
--- a/share/hedgewars/Data/Maps/Basketball/map.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Maps/Basketball/map.lua Fri Apr 01 15:36:19 2016 +0200
@@ -54,3 +54,7 @@
end
end
end
+
+function onNewTurn()
+ SetWeapon(amBaseballBat)
+end
--- a/share/hedgewars/Data/Maps/ClimbHome/map.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Maps/ClimbHome/map.lua Fri Apr 01 15:36:19 2016 +0200
@@ -19,6 +19,7 @@
local teams = {}
local teamScoreStats = {}
local teamBests = {}
+local teamTimes = {}
local MrMine -- in honour of sparkle's first arrival in the cabin
local YouWon = false
local YouLost = false
@@ -61,7 +62,7 @@
if params["delaytime"] ~= nil then
delayTime = params["delaytime"]
end
- if params["delaytime"] ~= nil then
+ if params["delayheight"] ~= nil then
delayHeight = 32768-params["delayheight"]
end
if params["nocake"] ~= nil then addCake = false end
@@ -390,6 +391,7 @@
SendStat(siPlayerKills, tostring(roundedFinishTime), loc(GetHogTeamName(CurrentHedgehog)))
EndGame()
+ onAchievementsDeclaration()
YouWon = true
end
elseif distanceFromWater < 0 and not YouLost then
@@ -399,6 +401,7 @@
if deadHedgehogs >= totalHedgehogs then
makeFinalMultiPlayerStats()
EndGame()
+ onAchievementsDeclaration()
end
end
@@ -445,8 +448,15 @@
end
if (y > 286) or (y < 286 and MaxHeight > 286) then
+ if MaxHeight > 286 and y <= 286 then
+ -- wow, reached top
+ local teamName = GetHogTeamName(CurrentHedgehog)
+ if teamTimes[teamName] == nil or teamTimes[teamName] > GameTime - startTime then
+ teamTimes[teamName] = GameTime - startTime
+ end
+ MaxHeight = 286
+ end
if y < MaxHeight and y > 286 then MaxHeight = y end
- if y < 286 then MaxHeight = 286 end
if MaxHeight < hTagHeight then
hTagHeight = MaxHeight
if hTag ~= nil then DeleteVisualGear(hTag) end
@@ -550,6 +560,7 @@
if deadHedgehogs >= totalHedgehogs then
makeFinalMultiPlayerStats()
EndGame()
+ onAchievementsDeclaration()
end
makeMultiPlayerLoserStat(gear)
end
@@ -598,6 +609,7 @@
SendStat(siPointType, loc("points"))
SendStat(siPlayerKills, actualHeight, loc(GetHogTeamName(CurrentHedgehog)))
EndGame()
+ onAchievementsDeclaration()
end
function makeMultiPlayerLoserStat(gear)
@@ -678,3 +690,12 @@
function getActualHeight(height)
return 32640-height
end
+
+function onAchievementsDeclaration()
+ for teamname, score in pairs(teamBests) do
+ DeclareAchievement("height reached", teamname, "ClimbHome", -score)
+ end
+ for teamname, score in pairs(teamTimes) do
+ DeclareAchievement("rope race", teamname, "ClimbHome", score)
+ end
+end
--- a/share/hedgewars/Data/Maps/Control/map.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Maps/Control/map.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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)
--- a/share/hedgewars/Data/Maps/Knockball/map.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Maps/Knockball/map.lua Fri Apr 01 15:36:19 2016 +0200
@@ -68,3 +68,7 @@
end
end
end
+
+function onNewTurn()
+ SetWeapon(amBaseballBat)
+end
--- a/share/hedgewars/Data/Maps/TrophyRace/map.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Maps/TrophyRace/map.lua Fri Apr 01 15:36:19 2016 +0200
@@ -33,6 +33,7 @@
local worsthog = nil
local besthog = nil
+local besthogname = ''
-- best time
local besttime = maxtime + 1
@@ -78,7 +79,8 @@
SetHealth(CurrentHedgehog, 0)
SetEffect(CurrentHedgehog, heInvulnerable, 0)
x, y = GetGearPosition(CurrentHedgehog)
- AddGear(x, y, gtShell, 0, 0, 0, 0)
+ AddGear(x, y-2, gtGrenade, 0, 0, 0, 2)
+ SetGearVelocity(CurrentHedgehog, 0, 0)
worsttime = 99999
worsthog = nil
lasthog = nil
@@ -141,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: ")
@@ -149,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.
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon02.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon02.lua Fri Apr 01 15:36:19 2016 +0200
@@ -184,7 +184,8 @@
------------- other functions ---------------
function isHeroNextToRunner()
- if GetHealth(hero.gear) and math.abs(GetX(hero.gear) - GetX(runner.gear)) < 75 and
+ if GetGearType(hero.gear) == gtHedgehog and GetGearType(runner.gear) == gtHedgehog and
+ math.abs(GetX(hero.gear) - GetX(runner.gear)) < 75 and
math.abs(GetY(hero.gear) - GetY(runner.gear)) < 75 and StoppedGear(hero.gear) then
return true
end
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Flying_Saucer.lua Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,558 @@
+--[[
+ Flying Saucer Training
+ This is a training mission which teaches many basic (and not-so-basic) moves
+ with the flying saucer.
+
+ Lesson plan:
+ - Taking off
+ - Basic flight
+ - Landing safely
+ - Managing fuel
+ - Changing saucers in mid-flight
+ - Diving
+ - Dropping weapons from flying saucer
+ - Firing from flying saucer with [Precise] + [Attack]
+ - Aiming in flying saucer with [Precise] + [Up]/[Down]
+ - Underwater attack
+ - Free flight with inf. fuel and some weapons at end of training
+
+ FIXME:
+ - Bad respawn animation ("explosion" just happens randomly because of the way the resurrection effect works)
+ - Hide fuel if infinite (probably needs engine support)
+]]
+
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Tracker.lua")
+
+local Player = nil -- Pointer to hog created in: onGameInit
+local Target = nil -- Pointer to target hog
+local Objective = false -- Get to the target
+
+local TargetNumber = 0 -- The current target number
+local GrenadeThrown = false -- Used for the Boom Target
+local BazookasLeft = 0 -- Used by the Launch Target and the Unterwater Attack Target
+
+local InfFuel = false -- If true, flying saucer has infinite fuel
+local SaucerGear = nil -- Store flying saucer gear here (if one exists)
+local TargetGears = {} -- List of remaining gears to collect or destroy in the current round
+local TargetsRemaining = 0
+local Barrels = {} -- Table contraining the explosive barrel gears
+
+local CheckTimer = 500 -- Time to wait at least before checking safe landing
+local Check = false -- The last target has recently been collected/destroyed and the CheckTimer is running
+local GrenadeTimer = 0 -- Time after a grenade has been thrown
+
+local TargetPos = {} -- Table of targets
+
+local StartPos = { X = 742, Y = 290 }
+
+--[[
+List of all targets (or "objectives"). The player has to complete them one-by-one and must always land safely afterwards.
+Some target numbers have names for easier reference.
+]]
+TargetPos[1] = {
+ Targets = {{ X = 1027, Y = 217 }},
+ Ammo = { },
+ Message = loc("Here you will learn how to fly the flying saucer|and get so learn some cool tricks.") .. "|" ..
+ loc("Collect the first crate to begin!"),
+ MessageIcon = -amJetpack, }
+TargetPos[2] = {
+ Targets = {{ X = 1369, Y = 265 }},
+ Ammo = { [amJetpack] = 100 },
+ InfFuel = true,
+ MessageTime = 10000,
+ Message = loc("Get to the crate using your flying saucer!") .. "|" ..
+ loc("Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate.") .. "|" ..
+ loc("Try to land softly, as you can still take fall damage!"), }
+TargetPos[3] = {
+ Targets = {{ X = 689, Y = 58 }},
+ Ammo = { [amJetpack] = 100 },
+ MessageTime = 5000,
+ Message = loc("Now collect the next crate!") .. "|" .. loc("Be careful, your fuel is limited from now on!") .."|" ..
+ loc("Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective.") }
+
+-- The Double Target
+local DoubleTarget = 4
+TargetPos[4] = {
+ Targets = { { X = 84, Y = -20 }, { X = 1980 , Y = -20 } },
+ Ammo = { [amJetpack] = 2 },
+ MessageTime = 9000,
+ Message = loc("Now collect the 2 crates to the far left and right.") .. "|" ..
+ loc("You only have 2 flying saucers this time.") .. "|" ..
+ loc("Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."), }
+TargetPos[5] = {
+ Targets = {{ X = 47, Y = 804 }},
+ Ammo = { [amJetpack] = 100 },
+ MessageTime = 5000,
+ Message = loc("Time for a more interesting stunt, but first just collect the next crate!"), }
+TargetPos[6] = {
+ Targets = {{ X = 604, Y = 871}},
+ MessageTime = 15000,
+ Message = loc("You can dive with your flying saucer!") .. "|" ..
+ loc("Try it now and dive here to collect the crate on the right girder.") .. "|" ..
+ loc("You only have one flying saucer this time.") .. "|" ..
+ loc("Beware, though, you will only be able to move slowly through the water.") .. "|" ..
+ loc("Warning: Never ever leave the flying saucer while in water!"),
+ Ammo = { [amJetpack] = 1 }, }
+
+TargetPos[7] = {
+ Targets = {{ X = 1884, Y = 704 }},
+ MessageTime = 6500,
+ Message = loc("Now dive just one more time and collect the next crate." .. "|" ..
+ loc("Tip: Don't remain for too long in the water, or you won't make it.")),
+ Ammo = { [amJetpack] = 1}, }
+
+-- The Boom Target
+local BoomTarget = 8
+TargetPos[8] = {
+ Modifier = true, Func = function()
+ Info(loc("Instructions"),
+ loc("Now let's try to drop weapons while flying!") .. "|" ..
+ loc("You have to destroy the target above by dropping a grenade on it from your flying saucer.") .. "|" ..
+ loc("It's not that easy, so listen carefully:") .. "|" ..
+ loc("Step 1: Activate your flying saucer but do NOT move yet!") .. "|" ..
+ loc("Step 2: Select your grenade.") .. "|" ..
+ loc("Step 3: Start flying and get yourself right above the target.") .. "|" ..
+ loc("Step 4: Drop your grenade by pressing the [Long jump] key.") .. "|" ..
+ loc("Step 5: Get away quickly and land safely anywhere." .. "| |" ..
+ loc("Note: We only give you grenades if you stay in your flying saucer.")), nil, 20000)
+
+ SpawnBoomTarget()
+
+ if SaucerGear ~= nil then
+ AddAmmo(Player, amGrenade, 1)
+ else
+ AddAmmo(Player, amGrenade, 0)
+ end
+ GrenadeThrown = false
+
+ end,
+ Ammo = { [amJetpack] = 100 },
+ Respawn = { X = 2000, Y = 742 }, }
+
+-- The Launch Target
+local LaunchTarget = 9
+TargetPos[9] = {
+ Targets = {{ X = 1700, Y = 640, Type = gtTarget }, { X = 1460, Y = 775, Type = gtTarget }},
+ MessageTime = 20000,
+ Message = loc("Only the best pilots can master the following stunts.") .. "|" ..
+ loc("As you've seen, the dropped grenade roughly fell into your flying direction.") .. "|" ..
+ loc("You have to destroy two targets, but the previous technique would be very difficult or dangerous to use.") .. "|" ..
+ loc("So you are able to launch projectiles into your aiming direction, always at full power.") .."|"..
+ loc("To launch a projectile in mid-flight, hold [Precise] and press [Long jump].") .. "|" ..
+ loc("You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down].") .. "|" ..
+ loc("Tip: Changing your aim while flying is very difficult, so adjust it before you take off."),
+ Ammo = { [amJetpack] = 1, },
+ Respawn = { X = 1764, Y = 916 },
+ ExtraFunc = function()
+ HogTurnLeft(Player, true)
+ if SaucerGear ~= nil then
+ AddAmmo(Player, amBazooka, 2)
+ else
+ AddAmmo(Player, amBazooka, 0)
+ end
+ BazookasLeft = 2
+
+ end }
+
+-- The Underwater Attack Target
+local UnderwaterAttackTarget = 10
+TargetPos[10] = {
+ MessageTime = 17000,
+ Message = loc("Now for the supreme discipline of saucer flying, the underwater attack.") .. "|" ..
+ loc("Basically this is a combination of diving and launching.") .. "|" ..
+ loc("Dropping a weapon while in water would just drown it, but launching one would work.") .."|" ..
+ loc("Based on what you've learned, destroy the target on the girder and as always, land safely!"),
+ Targets = {{ X = 1200, Y = 930, Type = gtTarget }},
+ Ammo = { [amJetpack] = 1, },
+ Respawn = { X = 1027, Y = 217 },
+ ExtraFunc = function()
+ if SaucerGear ~= nil then
+ AddAmmo(Player, amBazooka, 1)
+ else
+ AddAmmo(Player, amBazooka, 0)
+ end
+ BazookasLeft = 1
+ end }
+TargetPos[11] = {
+ Targets = {{ X = 742, Y = 290 }},
+ MessageTime = 5000,
+ Message = loc("This almost concludes our tutorial.") .. "|" ..
+ loc("You now have infinite fuel, grenades and bazookas for fun.") .. "|" ..
+ loc("Collect or destroy the final crate to finish the training."),
+ Ammo = { [amJetpack] = 100, [amGrenade] = 100, [amBazooka] = 100 },
+ InfFuel = true, }
+TargetPos[12] = { Modifier = true, Func = function()
+ Objective = true
+ AddCaption(loc("Training complete!"), 0xFFFFFFFF, capgrpGameState)
+ Info(loc("Training complete!"), loc("Good bye!"), 4, 5000)
+
+ if SaucerGear ~= nil then
+ DeleteGear(SaucerGear)
+ end
+ SetState(Player, band(GetState(Player), bnot(gstHHDriven)))
+ SetState(Player, bor(GetState(Player), gstWinner))
+ PlaySound(sndVictory, Player)
+
+ SendStat(siGameResult, loc("You have finished the Flying Saucer Training!"))
+ SendStat(siCustomAchievement, loc("Good job!"))
+ SendStat(siPlayerKills, "0", loc("Hogonauts"))
+
+ TurnTimeLeft = 0
+ EndGame()
+end,
+}
+
+-- Just a wrapper for ShowMission
+function Info(Title, Text, Icon, Time)
+ if Time == nil then Time = 0 end
+ if Icon == nil then Icon = 2 end
+ ShowMission(loc("Flying Saucer Training"), Title, Text, Icon, Time)
+end
+
+-- Spawn all the gears for the Boom Target
+function SpawnBoomTarget()
+ if TargetsRemaining < 1 then
+ TargetGears[1] = AddGear(1602, 507, gtTarget, 0, 0, 0, 0)
+ TargetsRemaining = TargetsRemaining + 1
+ end
+
+ if Barrels[1] == nil then
+ Barrels[1] = AddGear(1563, 532, gtExplosives, 0, 0, 0, 0)
+ end
+ if Barrels[2] == nil then
+ Barrels[2] = AddGear(1648, 463, gtExplosives, 0, 0, 0, 0)
+ end
+
+ for i=1,#Barrels do
+ SetHealth(Barrels[i], 1)
+ end
+end
+
+-- Generic target spawning for the current target
+function SpawnTargets()
+ for i=1,#TargetPos[TargetNumber].Targets do
+ if TargetGears[i] == nil then
+ SpawnTarget(TargetPos[TargetNumber].Targets[i].X, TargetPos[TargetNumber].Targets[i].Y,
+ TargetPos[TargetNumber].Targets[i].Type, i)
+ end
+ end
+end
+
+function SpawnTarget( PosX, PosY, Type, ID )
+ if Type ~= nil and Type ~= gtCase then
+ if Type == gtTarget then
+ TargetGears[ID] = AddGear(PosX, PosY, gtTarget, 0, 0, 0, 0)
+ end
+ else
+ TargetGears[ID] = SpawnFakeUtilityCrate(PosX, PosY, false, false)
+ end
+ TargetsRemaining = TargetsRemaining + 1
+end
+
+function AutoSpawn() -- Auto-spawn the next target after you've obtained the current target!
+ TargetNumber = TargetNumber + 1
+ TargetsRemaining = 0
+
+ if TargetPos[TargetNumber].Ammo then
+ for ammoType, count in pairs(TargetPos[TargetNumber].Ammo) do
+ AddAmmo(Player, ammoType, count)
+ end
+ if GetCurAmmoType() ~= amJetpack then
+ SetWeapon(amJetpack)
+ end
+ end
+ if TargetPos[TargetNumber].InfFuel then
+ InfFuel = true
+ else
+ InfFuel = false
+ end
+
+ -- Func (if present) will be run instead of the ordinary spawning handling
+ if TargetPos[TargetNumber].Modifier then -- If there is a modifier, run the function
+ TargetPos[TargetNumber].Func()
+ return true
+ end
+
+ -- ExtraFunc is for additional events for a target
+ if TargetPos[TargetNumber].ExtraFunc ~= nil then
+ TargetPos[TargetNumber].ExtraFunc()
+ end
+
+ local subcap
+ if TargetNumber == 1 then
+ subcap = loc("Training")
+ else
+ subcap = loc("Instructions")
+ end
+ Info(subcap, TargetPos[TargetNumber].Message, TargetPos[TargetNumber].MessageIcon, TargetPos[TargetNumber].MessageTime)
+
+ -- Spawn targets on the next position
+ SpawnTargets()
+
+ if TargetNumber > 1 then
+ AddCaption(loc("Next target is ready!"), 0xFFFFFFFF, capgrpMessage2)
+ end
+end
+
+-- Returns true if the hedgehog has safely "landed" (alive, no flying saucer gear and not moving)
+-- This is to ensure the training only continues when the player didn't screw up and to restart the current target
+function HasHedgehogLandedYet()
+ if band(GetState(Player), gstMoving) == 0 and SaucerGear == nil and GetHealth(Player) > 0 then
+ return true
+ else
+ return false
+ end
+end
+
+-- Clean up the gear mess left behind when the player failed to get a clean state after restarting
+function CleanUpGears()
+ -- (We track flames, grenades, bazooka shells)
+ runOnGears(DeleteGear)
+end
+
+-- Completely restarts the current target/objective; the hedgehog is spawned at the last "checkpoint"
+-- Called when hedgeghog is resurrected or skips turn
+function ResetCurrentTarget()
+ GrenadeThrown = false
+ GrenadeTimer = 0
+ if TargetNumber == LaunchTarget then
+ BazookasLeft = 2
+ elseif TargetNumber == UnderwaterAttackTarget then
+ BazookasLeft = 1
+ else
+ BazookasLeft = 0
+ end
+ Check = false
+
+ CleanUpGears()
+
+ local X, Y
+ if TargetNumber == 1 then
+ X, Y = StartPos.X, StartPos.Y
+ else
+ if TargetPos[TargetNumber-1].Modifier or TargetPos[TargetNumber-1].Respawn ~= nil then
+ X, Y = TargetPos[TargetNumber-1].Respawn.X, TargetPos[TargetNumber-1].Respawn.Y
+ else
+ X, Y = TargetPos[TargetNumber-1].Targets[1].X, TargetPos[TargetNumber-1].Targets[1].Y
+ end
+ end
+ if TargetNumber == BoomTarget then
+ SpawnBoomTarget()
+ end
+ if TargetPos[TargetNumber].Modifier ~= true then
+ SpawnTargets()
+ end
+ if TargetPos[TargetNumber].Ammo then
+ for ammoType, count in pairs(TargetPos[TargetNumber].Ammo) do
+ AddAmmo(Player, ammoType, count)
+ end
+ if GetCurAmmoType() ~= amJetpack then
+ SetWeapon(amJetpack)
+ end
+ end
+ if TargetPos[TargetNumber].InfFuel then
+ InfFuel = true
+ else
+ InfFuel = false
+ end
+
+ SetGearPosition(Player, X, Y)
+end
+
+function onGameInit()
+ Seed = 1
+ GameFlags = gfInfAttack + gfOneClanMode + gfSolidLand + gfDisableWind
+ TurnTime = 2000000 --[[ This rffectively hides the turn time; a turn time above 1000s is not displayed.
+ We will also ensure this timer always stays above 999s later ]]
+ CaseFreq = 0
+ MinesNum = 0
+ Explosives = 0
+ Map = "Eyes"
+ Theme = "EarthRise"
+ SuddenDeathTurns = 50
+ WaterRise = 0
+ HealthDecrease = 0
+
+ -- Team name is a pun on “hedgehog” and “astronauts”
+ AddTeam( loc( "Hogonauts" ), 0xDDDD00, "earth", "Earth", "Default", "cm_galaxy" )
+
+ -- Hedgehog name is a pun on “Neil Armstrong”
+ Player = AddHog( loc( "Neil Hogstrong" ), 0, 1, "NoHat" )
+ SetGearPosition( Player, StartPos.X, StartPos.Y)
+ SetEffect( Player, heResurrectable, 1 )
+end
+
+function onGameStart()
+ SendHealthStatsOff()
+
+ -- Girder near first crate
+ PlaceGirder(1257, 204, 6)
+
+ -- The upper girders
+ PlaceGirder(84, 16, 0)
+ PlaceGirder(1980, 16, 0)
+
+ -- The lower girder platform at the water pit
+ PlaceGirder(509, 896, 4)
+ PlaceGirder(668, 896, 4)
+ PlaceGirder(421, 896, 2)
+ PlaceGirder(758, 896, 2)
+
+ -- Girders for the Launch Target and the Underwater Attack Target
+ PlaceGirder(1191, 960, 4)
+ PlaceGirder(1311, 960, 0)
+ PlaceGirder(1460, 827, 3)
+ PlaceGirder(1509, 763, 2)
+ PlaceGirder(1605, 672, 4)
+ PlaceGirder(1764, 672, 4)
+ PlaceGirder(1803, 577, 6)
+
+ -- Spawn our 1st target using the wrapper function
+ AutoSpawn()
+end
+
+function onAmmoStoreInit()
+ SetAmmo(amJetpack, 0, 0, 0, 0)
+ SetAmmo(amGrenade, 0, 0, 0, 0)
+ SetAmmo(amBazooka, 0, 0, 0, 0)
+
+ -- Added for resetting current target/objective when player is stuck somehow
+ SetAmmo(amSkip, 9, 0, 0, 0)
+end
+
+function onGearAdd(Gear)
+ if GetGearType(Gear) == gtJetpack then
+ SaucerGear = Gear
+ if TargetNumber == BoomTarget and GrenadeThrown == false then
+ AddAmmo(Player, amGrenade, 1)
+ end
+ if (TargetNumber == LaunchTarget or TargetNumber == UnderwaterAttackTarget) and BazookasLeft > 0 then
+ AddAmmo(Player, amBazooka, BazookasLeft)
+ end
+ end
+ if GetGearType(Gear) == gtGrenade then
+ GrenadeThrown = true
+ GrenadeTimer = 0
+ end
+ if GetGearType(Gear) == gtShell then
+ BazookasLeft = BazookasLeft - 1
+ end
+ if GetGearType(Gear) == gtFlame or GetGearType(Gear) == gtGrenade or GetGearType(Gear) == gtShell then
+ trackGear(Gear)
+ end
+end
+
+function onGearDelete(Gear)
+ if GetGearType(Player) ~= nil and (GetGearType(Gear) == gtTarget or GetGearType(Gear) == gtCase) then
+ for i=1, #TargetGears do
+ if Gear == TargetGears[i] then
+ TargetGears[i] = nil
+ TargetsRemaining = TargetsRemaining - 1
+ end
+ end
+ if TargetsRemaining <= 0 then
+ if TargetNumber == BoomTarget or not HasHedgehogLandedYet() then
+ if SaucerGear then
+ AddCaption(loc("Objective completed! Now land safely."), 0xFFFFFFFF, capgrpMessage2)
+ end
+ Check = true
+ CheckTimer = 500
+ else
+ AutoSpawn()
+ end
+ end
+ end
+ if GetGearType(Gear) == gtGrenade then
+ GrenadeTimer = 0
+ GrenadeExploded = true
+ end
+ if GetGearType(Gear) == gtJetpack then
+ SaucerGear = nil
+ if TargetNumber == BoomTarget then
+ AddAmmo(Player, amGrenade, 0)
+ end
+ if TargetNumber == LaunchTarget or TargetNumber == UnderwaterAttackTarget then
+ AddAmmo(Player, amBazooka, 0)
+ end
+ end
+ if GetGearType(Gear) == gtCase and GetGearType(Player) ~= nil then
+ PlaySound(sndShotgunReload)
+ end
+ if Gear == Barrels[1] then
+ Barrels[1] = nil
+ end
+ if Gear == Barrels[2] then
+ Barrels[2] = nil
+ AddCaption(loc("Kaboom!"), 0xFFFFFFFF, capgrpMessage)
+ end
+end
+
+
+
+function onNewTurn()
+ SetWeapon(amJetpack)
+end
+
+function onGameTick20()
+ if (TurnTimeLeft < 1500000 and not Objective) then
+ TurnTimeLeft = TurnTime
+ end
+ if Check then
+ CheckTimer = CheckTimer - 20
+ if CheckTimer <= 0 then
+ if HasHedgehogLandedYet() then
+ AutoSpawn()
+ Check = false
+ GrenadeThrown = false
+ end
+ end
+ end
+ if GrenadeExploded and TargetNumber == BoomTarget then
+ GrenadeTimer = GrenadeTimer + 20
+ if GrenadeTimer > 1500 then
+ GrenadeTimer = 0
+ GrenadeThrown = false
+ GrenadeExploded = false
+ if SaucerGear and TargetNumber == BoomTarget and TargetsRemaining > 0 then
+ PlaySound(sndShotgunReload)
+ AddCaption(loc("+1 Grenade"), 0xDDDD00FF, capgrpAmmoinfo)
+ AddAmmo(Player, amGrenade, 1)
+ end
+ end
+ end
+ ResetFuel()
+end
+
+-- Used to ensure infinite fuel
+function ResetFuel()
+ if SaucerGear and InfFuel then
+ SetHealth(SaucerGear, 2000)
+ end
+end
+
+onUp = ResetFuel
+onLeft = ResetFuel
+onRight = ResetFuel
+
+function onGearDamage(Gear)
+ if Gear == Player then
+ CleanUpGears()
+ GrenadeThrown = false
+ Check = false
+ end
+end
+
+function onGearResurrect(Gear)
+ if Gear == Player then
+ AddCaption(loc("Oh no! You have died. Try again!"), 0xFFFFFFFF, capgrpMessage2)
+ ResetCurrentTarget()
+ end
+end
+
+function onHogAttack(ammoType)
+ if ammoType == amSkip then
+ AddCaption(loc("Try again!"), 0xFFFFFFFF, capgrpMessage2)
+ ResetCurrentTarget()
+ end
+end
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua Fri Apr 01 15:36:19 2016 +0200
@@ -36,6 +36,9 @@
local target = nil
local last_hit_time = 0
+
+local cinematic = false
+
-- This is a custom function to make it easier to
-- spawn more targets with just one line of code
-- You may define as many custom functions as you
@@ -48,6 +51,10 @@
end
function blowUp(x, y)
+ if cinematic == false then
+ cinematic = true
+ SetCinematicMode(true)
+ end
-- adds some TNT
gear = AddGear(x, y, gtDynamite, 0, 0, 0, 0)
end
@@ -178,13 +185,20 @@
-- This function is called before a gear is destroyed.
-- We use it to count the number of targets destroyed.
function onGearDelete(gear)
+ local gt = GetGearType(gear)
- if GetGearType(gear) == gtCase then
+ if gt == gtCase then
game_lost = true
return
end
- if (GetGearType(gear) == gtTarget) then
+ if (gt == gtDynamite) and cinematic then
+ cinematic = false
+ SetCinematicMode(false)
+ return
+ end
+
+ if gt == gtTarget then
-- remember when the target was hit for adjusting the camera
last_hit_time = TurnTimeLeft
-- Add one point to our score/counter
--- a/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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"
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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",
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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,
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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",
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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",
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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",
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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",
--- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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",
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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")
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Fri Apr 01 15:36:19 2016 +0200
@@ -12,6 +12,7 @@
local waterPix = 0
local frig = 0
local watGear = nil
+local cinematic = false
-- allow skipping of the intro via hitting precise key
function onPrecise()
@@ -68,6 +69,8 @@
function onGameStart()
+ cinematic = true
+ SetCinematicMode(true)
SendHealthStatsOff()
ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!"), 4, 1)
@@ -207,6 +210,11 @@
-- start the water rising when the intro is finished
if introStage == 110 then
+ if cinematic then
+ SetCinematicMode(false)
+ cinematic = false
+ end
+
waterCounter = waterCounter + 1
if (waterCounter == 100) and (waterPix < 1615) then
waterCounter = 0
@@ -216,10 +224,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 +291,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
--- a/share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- a/share/hedgewars/Data/Missions/Training/portal.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Missions/Training/portal.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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
--- a/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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.") .. "|" ..
--- a/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua Fri Apr 01 15:36:19 2016 +0200
@@ -727,7 +727,7 @@
--============================================================================
--for custom made continent, follows the same standards as the globalism one. You can make your continent with <Name>~<Information>~<Weapons>. Take the weapons generated from globalism, if you want a GUI :P
---weapons=<ammo><types>, ammo = ascii[116(1 ammo) to 125(inf ammo)] types = ascii[36(Grenade), 37(Clusterbomb) to 90(knife)] see https://code.google.com/p/hedgewars/wiki/AmmoTypes
+--weapons=<ammo><types>, ammo = ascii[116(1 ammo) to 125(inf ammo)] types = ascii[36(Grenade), 37(Clusterbomb) to 90(knife)] see http://hedgewars.org/kb/AmmoTypes
--ex "Own continent~this continent rocks!~tZ}$" will get 1 knife and inf grenades
function onParameters()
--- a/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua Fri Apr 01 15:36:19 2016 +0200
@@ -242,6 +242,8 @@
EnableGameFlags(gfInfAttack, gfRandomOrder, gfPerHogAmmo)
DisableGameFlags(gfResetWeps, gfSharedAmmo)
HealthCaseProb = 100
+ Goals = loc("Highlander: Eliminate enemy hogs and take their weapons.") .."|" ..
+ loc("Weapons are reset on end of turn.")
end
function onGameStart()
@@ -271,16 +273,6 @@
--WriteLnToConsole('utiltot:'..utiltot..' atktot:'..atktot)
- ShowMission (
- loc("HIGHLANDER"),
- loc("Not all hogs are born equal."),
-
- "- " .. loc("Eliminate enemy hogs and take their weapons.") .. "|" ..
- "- " .. loc("Per-Hog Ammo") .. "|" ..
- "- " .. loc("Weapons reset.") .. "|" ..
- "- " .. loc("Unlimited Attacks") .. "|" ..
- "", 4, 4000
- )
runOnGears(StartingSetUp)
runOnGears(ConvertValues)
--- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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)
--- a/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Fri Apr 01 15:36:19 2016 +0200
@@ -94,7 +94,7 @@
local fastY = {}
local fastCount = 0
local fastIndex = 0
-local fastColour
+local fastColour = 0xffffffff
local currX = {}
local currY = {}
@@ -540,7 +540,7 @@
wpY[wpCount] = y
wpCol[wpCount] = 0xffffffff
wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)
-
+
SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 1, 10, 0, wpRad, 5, wpCol[wpCount])
wpCount = wpCount + 1
@@ -551,9 +551,18 @@
end
function onSpecialPoint(x,y,flag)
- specialPointsX[specialPointsCount] = x
- specialPointsY[specialPointsCount] = y
- specialPointsCount = specialPointsCount + 1
+ if flag == 99 then
+ fastX[fastCount] = x
+ fastY[fastCount] = y
+ fastCount = fastCount + 1
+ else
+ addHashData(x)
+ addHashData(y)
+ addHashData(flag)
+ specialPointsX[specialPointsCount] = x
+ specialPointsY[specialPointsCount] = y
+ specialPointsCount = specialPointsCount + 1
+ end
end
function onNewTurn()
@@ -743,17 +752,18 @@
function onAttack()
at = GetCurAmmoType()
-
+
usedWeapons[at] = 0
end
function onAchievementsDeclaration()
usedWeapons[amSkip] = nil
-
+ usedWeapons[amExtraTime] = nil
+
usedRope = usedWeapons[amRope] ~= nil
usedPortal = usedWeapons[amPortalGun] ~= nil
usedSaucer = usedWeapons[amJetpack] ~= nil
-
+
usedWeapons[amNothing] = nil
usedWeapons[amRope] = nil
usedWeapons[amPortalGun] = nil
@@ -775,11 +785,19 @@
raceType = "mixed race"
end
- map = detectMap()
-
+ map = detectMapWithDigest()
+
for i = 0, (numTeams-1) do
if teamScore[i] < 100000 then
DeclareAchievement(raceType, teamNameArr[i], map, teamScore[i])
end
end
+
+ if map ~= nil and fastCount > 0 then
+ StartGhostPoints(fastCount)
+
+ for i = 0, (fastCount - 1) do
+ DumpPoint(fastX[i], fastY[i])
+ end
+ end
end
--- a/share/hedgewars/Data/Scripts/Multiplayer/ShoppaMap.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/ShoppaMap.lua Fri Apr 01 15:36:19 2016 +0200
@@ -4,14 +4,26 @@
-- Overall padding for roping freedom
local Padding = 430
+local TeamRope = false
function onParameters()
parseParams()
if params["pad"] ~= nil then
Padding = params["pad"]
end
+ if params["teamrope"] ~= nil then
+ TeamRope = true
+ end
end
+function onGearAdd(gear)
+ if GetGearType(gear) == gtRope and TeamRope then
+ SetTag(gear,1)
+ SetGearValues(gear,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,GetClanColor(GetHogClan(CurrentHedgehog)))
+ end
+end
+
+
-- This could probably use less points and more precision
-- 700x700 for object space
function DrawStar(x, y, d, f)
--- a/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Fri Apr 01 15:36:19 2016 +0200
@@ -173,7 +173,7 @@
local fastY = {}
local fastCount = 0
local fastIndex = 0
-local fastColour
+local fastColour = 0xffffffff
local currX = {}
local currY = {}
@@ -246,7 +246,7 @@
teamNameArr[i] = " " -- = i
teamSize[i] = 0
teamIndex[i] = 0
- teamScore[i] = 100000
+ teamScore[i] = 1000000
end
numTeams = 0
@@ -350,7 +350,7 @@
function AdjustScores()
if bestTime == nil then
- bestTime = 100000
+ bestTime = 1000000
bestClan = 10
bestTimeComment = "N/A"
end
@@ -380,7 +380,7 @@
end
end
- if bestTime ~= 100000 then
+ if bestTime ~= 1000000 then
bestTimeComment = (bestTime/1000) ..loc("s")
end
@@ -690,10 +690,11 @@
end
function onGameInit()
+ if mapID == nil then
+ mapID = 2 + GetRandom(7)
+ end
- if mapID == nil then
- mapID = 2 + GetRandom(7)
- end
+ addHashData(mapID)
Theme = "Cave"
@@ -724,10 +725,22 @@
end
function onSpecialPoint(x,y,flag)
- specialPointsX[specialPointsCount] = x
- specialPointsY[specialPointsCount] = y
- specialPointsFlag[specialPointsCount] = flag
- specialPointsCount = specialPointsCount + 1
+ if flag == 99 then
+ fastX[fastCount] = x
+ fastY[fastCount] = y
+ fastCount = fastCount + 1
+ elseif flag == 0 then
+ techX[techCount], techY[techCount] = x, y
+ techCount = techCount + 1
+ else
+ addHashData(x)
+ addHashData(y)
+ addHashData(flag)
+ specialPointsX[specialPointsCount] = x
+ specialPointsY[specialPointsCount] = y
+ specialPointsFlag[specialPointsCount] = flag
+ specialPointsCount = specialPointsCount + 1
+ end
end
function InterpretPoints()
@@ -1245,6 +1258,7 @@
function onAchievementsDeclaration()
usedWeapons[amSkip] = nil
+ usedWeapons[amExtraTime] = nil
usedRope = usedWeapons[amRope] ~= nil
usedPortal = usedWeapons[amPortalGun] ~= nil
@@ -1270,13 +1284,22 @@
raceType = "mixed race"
end
- map = detectMap()
+ map = detectMapWithDigest()
for i = 0, (numTeams-1) do
- if teamScore[i] < 100000 then
+ if teamScore[i] < 1000000 then
DeclareAchievement(raceType, teamNameArr[i], map, teamScore[i])
end
end
+
+ if map ~= nil and fastCount > 0 then
+ StartGhostPoints(fastCount)
+
+ for i = 0, (fastCount - 1) do
+ DumpPoint(fastX[i], fastY[i])
+ end
+ end
+
end
function onAmmoStoreInit()
--- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Fri Apr 01 15:36:19 2016 +0200
@@ -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)
--- a/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Fri Apr 01 15:36:19 2016 +0200
@@ -158,9 +158,9 @@
function BoolToCfgTxt(p)
if p == false then
- return("Disabled")
+ return loc("Disabled")
else
- return("Enabled")
+ return loc("Enabled")
end
end
--- a/share/hedgewars/Data/Scripts/OfficialChallenges.lua Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Scripts/OfficialChallenges.lua Fri Apr 01 15:36:19 2016 +0200
@@ -1,41 +1,63 @@
-function detectMap()
+local maps = {
+ ["Border,60526986531,M838018718Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #1"
+ , ["Border,71022545335,M-490229244Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #2"
+ , ["Border,40469748943,M806689586Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #3"
+ , ["85940488650,M-134869715Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #4"
+ , ["62080348735,M-661895109Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #5"
+ , ["56818170733,M479034891Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #6"
+ , ["Border,25372705797,M1770509913Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #7"
+ , ["Border,10917540013,M1902370941Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #8"
+ , ["Border,43890274319,M185940363Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #9"
+ , ["Border,27870148394,M751885839Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #10"
+ , ["Border,22647869226,M178845011Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #11"
+ , ["Border,46954401793,M706743197Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #12"
+ , ["Border,60760377667,M157242054Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #13"
+ , ["Border,51825989393,M-1585582638Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #14"
+ , ["81841189250,M256715557Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #15"
+ , ["Border,44246064625,M-528106034Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #16"
+ , ["60906776802,M-1389184823Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #17"
+ , ["Border,70774747774,M-534640804Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #18"
+ , ["Border,50512019610,M-1839546856Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #19"
+ , ["60715683005,M-281312897Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #20"
+-- tech racer
+ , ["Border,19661006772,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #1"
+ , ["Border,19661306766,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #2"
+ , ["Border,19661606760,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #3"
+ , ["Border,19661906754,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #4"
+ , ["Border,19662206748,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #5"
+ , ["Border,19662506742,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #6"
+ , ["Border,19662806736,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #7"
+ , ["Border,19663106730,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #8"
+ }
+
+-- modified Adler hash
+local hashA = 0
+local hashB = 0
+local hashModule = 299993
+
+function resetHash()
+ hashA = 0
+ hashB = 0
+end
+
+function addHashData(i)
+ hashA = (hashA + i + 65536) % hashModule
+ hashB = (hashB + hashA) % hashModule
+end
+
+function hashDigest()
+ return(hashB * hashModule + hashA)
+end
+
+function detectMapWithDigest()
if RopePercent == 100 and MinesNum == 0 then
--- challenges with border
+ mapString = hashDigest() .. "," .. LandDigest
+
if band(GameFlags, gfBorder) ~= 0 then
- if LandDigest == "M838018718Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #1")
- elseif LandDigest == "M-490229244Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #2")
- elseif LandDigest == "M806689586Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #3")
- elseif LandDigest == "M1770509913Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #7")
- elseif LandDigest == "M1902370941Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #8")
- elseif LandDigest == "M185940363Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #9")
- elseif LandDigest == "M751885839Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #10")
- elseif LandDigest == "M178845011Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #11")
- elseif LandDigest == "M706743197Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #12")
- elseif LandDigest == "M157242054Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #13")
- elseif LandDigest == "M-1585582638Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #14")
- elseif LandDigest == "M-528106034Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #16")
- end
--- challenges without border
- elseif LandDigest == "M-134869715Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #4")
- elseif LandDigest == "M-661895109Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #5")
- elseif LandDigest == "M479034891Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #6")
- elseif LandDigest == "M256715557Scripts/Multiplayer/Racer.lua" then
- return("Racer Challenge #15")
+ mapString = "Border," .. mapString
end
+
+ --WriteLnToConsole(mapString)
+ return(maps[mapString])
end
end
--- a/share/hedgewars/Data/Sounds/voices/British/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/British/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Classic/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Classic/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Default/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Default/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Default_es/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Default_es/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Default_ru/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Default_ru/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Default_uk/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Default_uk/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/HillBilly/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/HillBilly/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Mobster/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Mobster/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Pirate/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Pirate/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Robot/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Robot/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Russian/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Russian/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Singer/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Singer/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- a/share/hedgewars/Data/Sounds/voices/Surfer/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/share/hedgewars/Data/Sounds/voices/Surfer/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -12,7 +12,7 @@
Illgetyou.ogg
Incoming.ogg
Jump*.ogg
-JustYouwait.ogg
+Justyouwait.ogg
Kamikaze.ogg
Laugh.ogg
Melon.ogg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Hoggywood/clapper.svg Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,599 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="263.15494"
+ height="232.02"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="movie-clapper-board_hedgewars3.svg"
+ inkscape:export-filename="/home/wuzzy/gfx/Bastelstube/SVG/Hedgewars/movie-clapper-board_hedgewars3.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4409">
+ <stop
+ style="stop-color:#888a85;stop-opacity:1"
+ offset="0"
+ id="stop4411" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1"
+ offset="1"
+ id="stop4413" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3054"
+ inkscape:collect="always">
+ <stop
+ id="stop3056"
+ offset="0"
+ style="stop-color:#eeeeec;stop-opacity:1" />
+ <stop
+ id="stop3058"
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:1" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective2884"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3054"
+ id="linearGradient3052"
+ x1="91.5"
+ y1="302.86218"
+ x2="94.710091"
+ y2="348.36218"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4409"
+ id="linearGradient4415"
+ x1="23.25"
+ y1="61.851837"
+ x2="20.1875"
+ y2="78.976837"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4142136"
+ inkscape:cx="127.11688"
+ inkscape:cy="135.35939"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1678"
+ inkscape:window-height="1020"
+ inkscape:window-x="0"
+ inkscape:window-y="28"
+ inkscape:window-maximized="0"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-33.598147,-319.47374)">
+ <g
+ id="g4158"
+ transform="matrix(0.7513627,-0.2590358,0.2590358,0.7513627,-99.065833,184.12438)">
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="rect2890"
+ d="m 74.549263,331.92139 248.497547,0 0,171.72593 -248.497547,-6 0,-165.72593 z"
+ style="fill:#212121;fill-opacity:1;stroke:none"
+ transform="matrix(0.97560976,0.21951219,0,1,0,0)"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="translate(71.84007,273.08322)"
+ id="rect2892"
+ d="M 260.80263,118.37736 243.3125,129.75 l 0,171.71875 17.49013,-11.37264 z"
+ style="fill:#393939;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="rect2911"
+ d="m 72.21875,326 0,22 242.4375,54.5625 0,-22 L 72.21875,326 z"
+ style="fill:#e4e4e4;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path2913"
+ d="m 332.9552,369.74183 -17.49013,11.37264 0,22 17.49013,-11.37264 z"
+ style="fill:#cecece;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ id="path2940"
+ d="m 332.99625,390.97222 -17.49013,11.37264 0,2 17.49013,-11.37264 z"
+ style="fill:#eeeeec;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ id="path2949"
+ d="m 72.71875,348 0,2 242.4375,54.5625 0,-2 L 72.71875,348 z"
+ style="fill:#eeeeec;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path2965"
+ transform="translate(71.84007,273.08322)"
+ d="M 15.78125,38.1875 0,52.78125 244.15625,107.8125 260.51954,96.980912 z"
+ style="fill:#a2a2a2;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#e4e4e4;fill-opacity:1;stroke:none"
+ d="m 73.21875,300.92609 0,22.37617 242.6875,7.86605 2.02774,-23.0891 z"
+ id="path2977"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path2981"
+ d="M 23.09375,17.3125 1,27.78125 l 244.15625,7.375 16.70276,-12.823405 z"
+ style="fill:#a6a6a6;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ transform="translate(71.84007,273.08322)" />
+ <path
+ id="path2987"
+ transform="translate(71.84007,273.08322)"
+ d="M 261.54651,23.395345 244.8125,35.96875 243.91526,58.158514 261.54651,45.395345 z"
+ style="fill:#cfcfcf;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ d="m 72.71875,326 0,2 242.4375,54.5625 0,-2 L 72.71875,326 z"
+ id="path2991"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path2993"
+ d="m 74.71875,299.5 0,2 242.1875,7.0625 0.25,-1.5 L 74.71875,299.5 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path2995"
+ d="m 332.92855,369.57946 -17.49013,11.37264 0,2 17.49013,-11.37264 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path2997"
+ d="m 333.04651,294.95785 -15.89026,12.10465 -0.41656,2.30349 16.30682,-12.40814 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="matrix(0.97574199,0.21892367,-0.63217637,0.77482452,0,0)"
+ sodipodi:nodetypes="ccccc"
+ id="rect3000"
+ d="m 510.80396,339.64962 29,0 -2.00797,21.71248 -29,0 2.00797,-21.71248 z"
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ d="m 224.94441,362.24593 28.29652,6.34879 -15.68538,16.38377 -28.29652,-6.34879 15.68538,-16.38377 z"
+ id="path3003"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3005"
+ d="m 171.94441,350.24593 28.29652,6.34879 -15.68538,16.38377 -28.29652,-6.34879 15.68538,-16.38377 z"
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ d="m 119.94441,338.24593 28.29652,6.34879 -15.68538,16.38377 -28.29652,-6.34879 15.68538,-16.38377 z"
+ id="path3007"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ <g
+ style="fill:#222222;fill-opacity:1"
+ transform="matrix(-0.97167754,-0.23631071,-0.23631071,0.97167754,491.09772,45.499878)"
+ id="g3017">
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3009"
+ d="m 283.69441,334.99593 28.29652,6.34879 -15.68538,16.38377 -28.29652,-6.34879 15.68538,-16.38377 z"
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ d="m 224.94441,322.24593 28.29652,6.34879 -15.68538,16.38377 -28.29652,-6.34879 15.68538,-16.38377 z"
+ id="path3011"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3013"
+ d="m 171.80598,310.81513 28.29652,6.34879 -15.68538,16.38377 -28.29652,-6.34879 15.68538,-16.38377 z"
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ d="m 119.94441,300.24593 28.29652,6.34879 -15.68538,16.38377 -28.29652,-6.34879 15.68538,-16.38377 z"
+ id="path3015"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3633"
+ d="m 92.876497,301.97039 2.474874,0.35356 0.883883,21.03643 -2.12132,0.35355 -1.237437,-21.74354 z"
+ style="fill:#888a85;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ transform="translate(71.84007,273.08322)"
+ id="path4407"
+ d="M 22.25,59.476837 23.033952,57.81859 24.650974,58.249664 24,60.101837 23.982153,60.97634 23.75,72.351837 c -1.155586,3.813307 -4.625,5.625 -7.375,6.625 l 4,-4 2.25,-4.5 -0.375,-11 z"
+ style="fill:url(#linearGradient4415);fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <rect
+ ry="9.8783865"
+ y="297.17215"
+ x="74.953316"
+ height="55.154331"
+ width="19.756773"
+ id="rect3029"
+ style="fill:url(#linearGradient3052);fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#b0b0b0;fill-opacity:1;stroke:none"
+ id="rect3031"
+ width="19.756773"
+ height="55.154331"
+ x="72.203316"
+ y="297.67215"
+ ry="9.8783865" />
+ <path
+ transform="matrix(1.2333333,0,0,1.2333333,-20.706443,-69.493373)"
+ d="m 88.741899,309.19296 c 0,2.92893 -2.374368,5.3033 -5.3033,5.3033 -2.928933,0 -5.303301,-2.37437 -5.303301,-5.3033 0,-2.92893 2.374368,-5.3033 5.303301,-5.3033 2.928932,0 5.3033,2.37437 5.3033,5.3033 z"
+ sodipodi:ry="5.3033009"
+ sodipodi:rx="5.3033009"
+ sodipodi:cy="309.19296"
+ sodipodi:cx="83.438599"
+ id="path3033"
+ style="fill:#c7c7c7;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ id="path3035"
+ d="m 82.0625,305.3125 c -3.61235,0 -6.53125,2.9189 -6.53125,6.53125 0,3.61235 2.9189,6.53125 6.53125,6.53125 0.397358,0 0.809681,-0.0259 1.1875,-0.0937 -3.04205,-0.56127 -5.34375,-3.23304 -5.34375,-6.4375 0,-3.20446 2.3017,-5.87623 5.34375,-6.4375 -0.377819,-0.0679 -0.790142,-0.0937 -1.1875,-0.0937 z"
+ style="fill:#eeeeec;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#c7c7c7;fill-opacity:1;stroke:none"
+ id="path3040"
+ sodipodi:cx="83.438599"
+ sodipodi:cy="309.19296"
+ sodipodi:rx="5.3033009"
+ sodipodi:ry="5.3033009"
+ d="m 88.741899,309.19296 c 0,2.92893 -2.374368,5.3033 -5.3033,5.3033 -2.928933,0 -5.303301,-2.37437 -5.303301,-5.3033 0,-2.92893 2.374368,-5.3033 5.303301,-5.3033 2.928932,0 5.3033,2.37437 5.3033,5.3033 z"
+ transform="matrix(1.2333333,0,0,1.2333333,-20.706443,-41.493373)" />
+ <path
+ style="fill:#eeeeec;fill-opacity:1;stroke:none"
+ d="m 82.0625,333.3125 c -3.61235,0 -6.53125,2.9189 -6.53125,6.53125 0,3.61235 2.9189,6.53125 6.53125,6.53125 0.397358,0 0.809681,-0.0259 1.1875,-0.0937 -3.04205,-0.56127 -5.34375,-3.23304 -5.34375,-6.4375 0,-3.20446 2.3017,-5.87623 5.34375,-6.4375 -0.377819,-0.0679 -0.790142,-0.0937 -1.1875,-0.0937 z"
+ id="path3042"
+ inkscape:connector-curvature="0" />
+ <rect
+ transform="matrix(0.92692657,0.37524278,-0.37524278,0.92692657,0,0)"
+ ry="0.35355338"
+ y="253.08765"
+ x="193.77713"
+ height="10.076272"
+ width="0.70710677"
+ id="rect3060"
+ style="fill:#eeeeec;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#eeeeec;fill-opacity:1;stroke:none"
+ id="rect3062"
+ width="0.70710677"
+ height="10.076272"
+ x="-19.074697"
+ y="344.5889"
+ ry="0.35355338"
+ transform="matrix(0.95705785,-0.289897,0.289897,0.95705785,0,0)" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3073"
+ d="m 196.65378,423.92642 -3,-1.03302 0,70.11585 3,1.03301 0,-70.11584 z"
+ style="fill:#d3d7cf;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <g
+ id="flowRoot3503"
+ style="font-size:22px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Yanone Kaffeesatz;-inkscape-font-specification:Yanone Kaffeesatz Italic"
+ transform="matrix(1,0.24437865,0,1,67.379915,132.57853)">
+ <path
+ id="path4418"
+ d="m 27.946,245.65888 c 4.165956,-0.73319 0.979346,-7.45774 6.438837,-7.00784 6.25548,-2.99217 -0.495673,-12.94697 -3.796936,-6.48784 -0.77856,4.51661 -1.76571,8.99668 -2.641901,13.49568 z m 6.864,-11.242 c -1.085236,5.55419 -4.972574,1.82473 -2.608483,-1.82948 0.872401,-2.12766 3.786489,0.20047 2.608483,1.82948 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4420"
+ d="m 35.85225,245.65888 c 3.786318,0.54391 2.193618,-11.06307 4.965719,-3.47614 -0.884277,4.68516 3.096349,3.65823 1.342695,0.0213 1.61249,-4.03741 5.018029,-15.05963 -3.31497,-11.049 -1.183067,4.70375 -1.941516,9.68667 -2.993444,14.50387 z m 6.842,-11.132 c -1.71836,7.3358 -5.767737,-1.56607 -1.110806,-2.72062 1.223268,0.19985 1.622503,1.72511 1.110806,2.72062 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4422"
+ d="m 45.206375,237.87088 c -4.491034,6.33305 6.283437,11.689 7.512441,3.19167 4.856224,-6.46773 -3.370911,-16.19735 -6.703763,-6.36733 -0.344445,1.03806 -0.580807,2.10735 -0.808678,3.17566 z m 1.914,0.44 c -1.221241,-4.62101 6.604307,-9.26967 4.804247,-1.70953 0.625425,4.63069 -6.38054,10.65718 -4.99346,2.74731 0.06307,-0.34592 0.126142,-0.69185 0.189213,-1.03778 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4424"
+ d="m 57.036531,230.25888 c -2.017283,3.39148 -1.819472,7.69984 -2.895475,11.50165 -2.711118,4.76588 2.821134,5.20974 5.424838,1.86825 2.887298,-3.61074 5.907465,-15.11511 -2.529363,-13.3699 z m 3.058,6.732 c 0.980164,5.09225 -6.920094,9.65426 -3.622789,2.00607 0.474263,-2.36269 0.948526,-4.72538 1.422789,-7.08807 3.287293,-0.7764 2.681998,3.20818 2.2,5.082 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4426"
+ d="m 66.90525,230.25888 c -4.195326,1.73864 -3.280773,9.71794 -4.00635,13.87903 5.27612,5.89965 8.583454,-2.62168 8.572527,-7.45944 -0.139284,-1.92696 2.855086,-7.46947 -0.420095,-5.9793 -1.234084,4.2331 -1.822107,8.76015 -2.804082,13.13371 -6.49981,1.23023 -2.069127,-7.54291 -1.777311,-11.40615 0.145104,-0.72262 0.290207,-1.44523 0.435311,-2.16785 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4428"
+ d="m 78.81825,229.97288 c -6.658812,0.84492 -9.971702,17.31201 -1.832102,15.3658 2.471758,-3.16461 -4.537896,-0.38626 -2.7763,-4.72459 -1.073332,-4.6141 5.202587,-8.71726 5.652545,-10.51728 l -1.044143,-0.12393 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4430"
+ d="m 88.538813,231.93088 c 2.065332,-4.003 -12.486984,-0.94415 -4.79378,0.46318 -0.40553,4.42036 -1.689154,8.83235 -2.44422,13.26482 3.963721,-1.11595 2.46831,-7.21642 3.918296,-10.66954 0.448236,-2.65355 0.143226,-3.56462 3.319704,-3.05846 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4432"
+ d="m 87.285844,245.65888 c 3.932605,-0.90043 2.440269,-6.96944 3.860047,-10.28771 1.113345,-2.63198 1.080698,-8.04024 -1.371614,-2.74064 -0.567448,4.37297 -1.704289,8.67431 -2.488433,13.02835 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4434"
+ d="m 92.257156,237.87088 c -4.491032,6.33305 6.283436,11.689 7.512445,3.19167 4.856229,-6.46773 -3.370917,-16.19735 -6.703767,-6.36733 -0.344445,1.03806 -0.580807,2.10735 -0.808678,3.17566 z m 1.914,0.44 c -1.221242,-4.62101 6.604304,-9.26967 4.804247,-1.70953 0.625425,4.63069 -6.38054,10.65718 -4.99346,2.74731 0.06307,-0.34592 0.126142,-0.69185 0.189213,-1.03778 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4436"
+ d="m 106.55131,245.65888 c 3.68185,-0.73214 2.29018,-6.47899 3.6188,-9.5226 0.31608,-2.01583 2.45038,-8.50441 -1.02109,-4.47138 -0.56294,2.04177 -1.17875,10.64926 -2.08932,9.17804 -0.0133,-2.95417 -1.79979,-15.23698 -4.16826,-7.8761 -0.72182,4.23632 -1.69495,8.45562 -2.50013,12.69204 4.39559,0.0231 2.25186,-11.80895 4.31159,-10.52945 0.18409,3.57514 1.13669,7.03801 1.84841,10.52945 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="flowRoot3511"
+ style="font-size:16px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Yanone Kaffeesatz;-inkscape-font-specification:Yanone Kaffeesatz Italic"
+ transform="matrix(1,0.24437865,0,1,64.662401,208.7501)">
+ <path
+ id="path4489"
+ d="m 28.824,237.38303 c -1.210367,3.55365 4.563103,1.87482 1.425285,0.0706 -0.495272,-4.24777 3.347371,-4.50436 1.258838,-7.87088 -1.699685,-1.36243 -2.154297,5.08688 -2.684123,7.80025 l 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4491"
+ d="m 33.59225,232.32703 c 4.260352,0.759 3.071539,2.50379 -0.325763,3.20539 -2.609512,5.80395 5.343822,5.2284 4.463632,-0.16818 1.059266,-3.51294 -1.135135,-5.31123 -4.137869,-3.03721 z m 2.576,3.504 c 0.14877,7.29746 -5.408542,-0.45751 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4493"
+ d="m 38.0485,239.60703 c 1.912521,-1.04096 3.617859,-6.47247 3.685722,-0.57256 3.037831,0.39894 -0.196737,-4.69042 2.308579,-6.29894 -2.509467,-1.57908 -2.787262,-1.50254 -2.920364,-4.47623 -2.016165,1.68143 -1.512117,5.55617 -2.437594,8.17511 -0.212114,1.05754 -0.424229,2.11508 -0.636343,3.17262 z m 4.496,-6.336 c -1.66719,4.82605 -3.604489,-1.26593 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4495"
+ d="m 48.24125,231.44703 c -6.033295,-0.86373 -3.83258,12.65499 0.512,6.56 -3.908235,2.38813 -3.06022,-3.77903 0.416,-1.904 0.479886,-1.35852 1.664544,-4.65686 -0.928,-4.656 z m -0.368,1.136 c 3.244921,3.64972 -6.08819,3.49259 0,0 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="flowRoot3539"
+ style="font-size:18px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Yanone Kaffeesatz;-inkscape-font-specification:Yanone Kaffeesatz Italic"
+ transform="matrix(1,0.24437865,0,1,64.172808,234.959)">
+ <path
+ id="path4476"
+ d="m 33.966,233.25431 c -7.936781,-4.47738 -4.489506,12.66652 -2.997388,7.0963 -3.373769,-1.03242 0.318615,-7.9376 2.997388,-7.0963 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4478"
+ d="m 34.803,233.43431 c 4.420034,0.61938 3.921994,2.94214 -0.06857,3.37613 -4.172366,5.44909 5.261045,7.20031 4.431273,1.04391 1.389823,-3.58409 -0.03027,-7.81162 -4.362706,-4.42004 z m 2.898,3.942 c -0.362538,7.37224 -5.54219,-0.73357 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4480"
+ d="m 43.380281,241.62431 c 3.268076,0.0699 2.019548,-10.82844 4.731312,-6.22317 -0.960172,2.52828 -1.103022,9.35074 1.026609,3.32478 4.281743,-6.05258 -6.539914,-9.3157 -8.06824,-3.39641 0.110847,1.72709 -2.695568,7.67594 0.266077,5.49927 -0.03443,-2.17699 2.711428,-10.55406 3.152167,-4.49097 -0.181558,1.80273 -0.836143,3.49917 -1.107925,5.2865 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4482"
+ d="m 54.693281,232.44431 c -6.272424,-0.44857 -5.105588,13.37554 0.40666,8.09747 -8.237109,-1.68008 3.351448,-1.90542 1.32097,-6.81957 l -0.621654,-0.84415 -1.105976,-0.43375 0,0 z m -0.414,1.278 c 3.432529,4.45447 -5.875109,2.82423 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4484"
+ d="m 56.427188,241.62431 c 3.563025,-1.32562 1.536619,-7.58805 4.954261,-8.90619 -5.113578,-1.13277 -3.670013,6.01372 -4.954261,8.90619 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4486"
+ d="m 62.541281,233.43431 c 4.420034,0.61938 3.921994,2.94214 -0.06857,3.37613 -4.172366,5.44909 5.261045,7.20031 4.431273,1.04391 1.258781,-3.77684 0.235895,-7.69024 -4.362706,-4.42004 z m 2.898,3.942 c -0.362538,7.37224 -5.54219,-0.73357 0,0 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ id="path3547"
+ d="m 72.91976,394.88478 0,2.43305 241.91193,54.43961 0,-2.43306 -241.91193,-54.4396 z"
+ style="fill:#babdb6;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <g
+ id="flowRoot3551"
+ style="font-size:18px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Yanone Kaffeesatz;-inkscape-font-specification:Yanone Kaffeesatz Italic"
+ transform="matrix(1,0.24437865,0,1,173.09238,192.97371)">
+ <path
+ id="path4450"
+ d="m 31.914,240.22031 c -6.284388,-0.0746 3.4278,-11.0388 0.483941,-2.44074 -0.161314,0.81358 -0.322627,1.62716 -0.483941,2.44074 z m 1.476,-7.416 c -8.417709,-2.33776 -4.302403,15.81866 0.224345,6.16816 0.705211,-3.52605 1.410421,-7.05211 2.115632,-10.57816 -2.548931,-0.44439 -1.605894,3.09722 -2.339977,4.41 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4452"
+ d="m 36.138937,233.43431 c 4.420035,0.61929 3.922153,2.94206 -0.06857,3.37613 -4.17236,5.44911 5.261058,7.20029 4.431285,1.04388 1.389857,-3.58411 -0.03028,-7.81155 -4.362719,-4.42001 z m 2.898,3.942 c -0.362392,7.37198 -5.542311,-0.73331 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4454"
+ d="m 42.059812,239.12231 c -1.440029,3.97811 5.167813,2.11302 1.606406,0.15636 -0.64212,-4.59898 3.792909,-5.11039 1.361251,-8.88332 -0.312649,-2.46604 -3.536035,3.90157 -2.237506,5.56279 -0.274209,1.0481 -0.743501,2.0528 -0.730151,3.16417 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4456"
+ d="m 50.404219,232.44431 c -6.272424,-0.44857 -5.105588,13.37554 0.40666,8.09747 -8.23711,-1.68008 3.351447,-1.90542 1.320969,-6.81957 l -0.621653,-0.84415 -1.105976,-0.43375 0,0 z m -0.414,1.278 c 3.432529,4.45447 -5.875109,2.82423 0,0 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="flowRoot3573"
+ style="font-size:16px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Yanone Kaffeesatz;-inkscape-font-specification:Yanone Kaffeesatz Italic"
+ transform="matrix(1,0.24437865,0,1,65.879915,170.07853)">
+ <path
+ id="path4439"
+ d="m 31.736,231.44703 c -6.682976,-1.02543 2.683563,8.68105 -3.744,6.752 1.537656,4.88367 7.281978,-3.21183 2.421673,-4.66183 0.581467,-1.39944 5.377008,-1.09873 1.322327,-2.09017 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4441"
+ d="m 38.72325,232.16703 c -7.162147,-3.91491 -3.794508,11.16808 -2.695521,6.37286 -3.07283,-0.66967 0.372905,-7.38057 2.695521,-6.37286 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4443"
+ d="m 42.24125,231.44703 c -6.033295,-0.86373 -3.83258,12.65499 0.512,6.56 -3.908235,2.38813 -3.06022,-3.77903 0.416,-1.904 0.479886,-1.35852 1.664544,-4.65686 -0.928,-4.656 z m -0.368,1.136 c 3.244921,3.64972 -6.08819,3.49259 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4445"
+ d="m 43.7825,239.60703 c 2.677057,-0.63475 2.613566,-11.06316 4.440641,-4.53618 -1.840832,3.12089 -0.173355,6.54511 1.035243,1.76061 2.829468,-4.66239 -3.601232,-8.02696 -4.665218,-2.14823 -0.379016,1.63021 -0.36804,3.29818 -0.810666,4.9238 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4447"
+ d="m 54.1475,231.44703 c -6.033295,-0.86373 -3.83258,12.65499 0.512,6.56 -3.908235,2.38813 -3.06022,-3.77903 0.416,-1.904 0.479886,-1.35852 1.664544,-4.65686 -0.928,-4.656 z m -0.368,1.136 c 3.244921,3.64972 -6.08819,3.49259 0,0 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="flowRoot3583"
+ style="font-size:18px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Yanone Kaffeesatz;-inkscape-font-specification:Yanone Kaffeesatz Italic"
+ transform="matrix(1,0.24437865,0,1,173.09238,224.97371)">
+ <path
+ id="path4459"
+ d="m 31.914,240.22031 c -6.284388,-0.0746 3.4278,-11.0388 0.483941,-2.44074 -0.161314,0.81358 -0.322627,1.62716 -0.483941,2.44074 z m 1.476,-7.416 c -8.417709,-2.33776 -4.302403,15.81866 0.224345,6.16816 0.705211,-3.52605 1.410421,-7.05211 2.115632,-10.57816 -2.548931,-0.44439 -1.605894,3.09722 -2.339977,4.41 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4461"
+ d="m 38.082937,232.62431 c -3.784154,0.53444 -3.387639,14.0264 -0.888632,5.55083 -0.06459,-1.87789 0.610176,-3.70302 0.888632,-5.55083 z m -0.899999,-2.862 c 1.24187,3.86507 2.167372,-3.78367 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4463"
+ d="m 37.935,241.62431 c 3.561033,-1.32832 1.541637,-7.59041 4.952728,-8.90737 -5.112111,-1.12917 -3.668161,6.01557 -4.952728,8.90737 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4465"
+ d="m 47.064375,232.44431 c -6.272424,-0.44857 -5.105588,13.37554 0.40666,8.09747 -8.23711,-1.68008 3.351448,-1.90542 1.32097,-6.81957 l -0.621654,-0.84415 -1.105976,-0.43375 0,0 z m -0.414,1.278 c 3.432529,4.45447 -5.875109,2.82423 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4467"
+ d="m 54.954281,233.25431 c -7.936781,-4.47738 -4.489507,12.66652 -2.997388,7.0963 -3.37377,-1.03242 0.318615,-7.9376 2.997388,-7.0963 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4469"
+ d="m 55.77075,239.12231 c -1.440029,3.97812 5.167811,2.11302 1.606405,0.15636 -0.642121,-4.59898 3.792911,-5.11039 1.36125,-8.88332 -0.312648,-2.46604 -3.536033,3.90157 -2.237506,5.56279 -0.274209,1.0481 -0.743501,2.0528 -0.730149,3.16417 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4471"
+ d="m 59.972625,237.12431 c -2.040739,10.52258 12.356152,-2.03657 3.914434,-4.72518 -2.08751,0.43111 -4.060868,2.50867 -3.914434,4.72518 z m 1.584,0.036 c 1.904706,-8.62593 4.846366,5.06948 -0.205424,2.87845 -0.261102,-0.94945 0.07393,-1.93907 0.205424,-2.87845 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4473"
+ d="m 66.06,241.62431 c 3.561033,-1.32832 1.541637,-7.59041 4.952728,-8.90737 -5.112111,-1.12917 -3.668161,6.01557 -4.952728,8.90737 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ style="fill:#d3d7cf;fill-opacity:1;stroke:none"
+ d="m 72.91976,462.88478 0,2.41793 242.61903,58.10117 0,-2.41793 -242.61903,-58.10117 z"
+ id="path3593"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="rect2937"
+ d="m 314.2288,380.50902 1.4855,-0.50508 0,193.91552 -1.4855,-1.51523 0,-191.89521 z"
+ style="fill:#eeeeec;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#babdb6;fill-opacity:1;stroke:none"
+ d="m 72.91976,428.88478 0,2.43305 241.91193,54.43961 0,-2.43306 -241.91193,-54.4396 z"
+ id="path3595"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="matrix(0.97274579,0.23187417,-0.23187417,0.97274579,0,0)"
+ sodipodi:linespacing="125%"
+ id="text4083"
+ y="428.94635"
+ x="309.94272"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Aller;-inkscape-font-specification:Aller"
+ xml:space="preserve"><tspan
+ style="font-size:12px;font-style:normal;font-variant:normal;font-stretch:normal;fill:#e70000;fill-opacity:1;font-family:Nina;-inkscape-font-specification:Nina Semi-Light"
+ y="428.94635"
+ x="309.94272"
+ id="tspan4085"
+ sodipodi:role="line">Steven Hogberg</tspan></text>
+ <text
+ transform="matrix(0.9864405,0.1641193,-0.1641193,0.9864405,0,0)"
+ sodipodi:linespacing="125%"
+ id="text4087"
+ y="410.62582"
+ x="211.82132"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Aller;-inkscape-font-specification:Aller"
+ xml:space="preserve"><tspan
+ style="font-size:28px;font-style:normal;font-variant:normal;font-stretch:normal;fill:#e70000;fill-opacity:1;font-family:Nina;-inkscape-font-specification:Nina Semi-Light"
+ y="410.62582"
+ x="211.82132"
+ id="tspan4089"
+ sodipodi:role="line">13</tspan></text>
+ <text
+ transform="matrix(0.97003802,0.24295317,-0.24295317,0.97003802,0,0)"
+ sodipodi:linespacing="125%"
+ id="text4087-8"
+ y="351.01086"
+ x="295.98285"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Aller;-inkscape-font-specification:Aller"
+ xml:space="preserve"><tspan
+ style="font-size:26px;font-style:normal;font-variant:normal;font-stretch:normal;fill:#e70000;fill-opacity:1;font-family:Nina;-inkscape-font-specification:Nina Semi-Light"
+ y="351.01086"
+ x="295.98285"
+ id="tspan4089-9"
+ sodipodi:role="line">HW-003</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Aller;-inkscape-font-specification:Aller"
+ x="65.25"
+ y="195.16431"
+ id="text4133"
+ sodipodi:linespacing="125%"
+ transform="translate(71.84007,290.39572)"><tspan
+ sodipodi:role="line"
+ id="tspan4135"
+ x="65.25"
+ y="195.16431" /></text>
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Hoggywood/palm.svg Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,784 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg3804"
+ sodipodi:docname="Palm2_brighter.svg"
+ viewBox="0 0 587.47424 799.56228"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="100%"
+ height="100%">
+ <defs
+ id="defs3806">
+ <filter
+ id="filter5796"
+ inkscape:menu="ABCs"
+ inkscape:menu-tooltip="Draws a black outline around"
+ inkscape:label="Black outline"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur5798"
+ result="result0"
+ stdDeviation="2"
+ in="SourceAlpha" />
+ <feComposite
+ id="feComposite5800"
+ k4="0"
+ in2="result0"
+ k3="10"
+ k2="1"
+ k1="0"
+ result="result3"
+ in="SourceGraphic"
+ operator="arithmetic" />
+ <feComposite
+ id="feComposite5802"
+ operator="in"
+ result="result4"
+ in2="result3"
+ in="result3" />
+ </filter>
+ <filter
+ id="filter5796-4"
+ inkscape:menu="ABCs"
+ inkscape:menu-tooltip="Draws a black outline around"
+ inkscape:label="Black outline"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur5798-2"
+ result="result0"
+ stdDeviation="2"
+ in="SourceAlpha" />
+ <feComposite
+ id="feComposite5800-2"
+ k4="0"
+ in2="result0"
+ k3="10"
+ k2="1"
+ k1="0"
+ result="result3"
+ in="SourceGraphic"
+ operator="arithmetic" />
+ <feComposite
+ id="feComposite5802-6"
+ operator="in"
+ result="result4"
+ in2="result3"
+ in="result3" />
+ </filter>
+ <filter
+ id="filter5796-4-3"
+ inkscape:menu="ABCs"
+ inkscape:menu-tooltip="Draws a black outline around"
+ inkscape:label="Black outline"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur5798-2-3"
+ result="result0"
+ stdDeviation="2"
+ in="SourceAlpha" />
+ <feComposite
+ id="feComposite5800-2-8"
+ k4="0"
+ in2="result0"
+ k3="10"
+ k2="1"
+ k1="0"
+ result="result3"
+ in="SourceGraphic"
+ operator="arithmetic" />
+ <feComposite
+ id="feComposite5802-6-0"
+ operator="in"
+ result="result4"
+ in2="result3"
+ in="result3" />
+ </filter>
+ <filter
+ id="filter5796-3"
+ inkscape:menu="ABCs"
+ inkscape:menu-tooltip="Draws a black outline around"
+ inkscape:label="Black outline"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur5798-26"
+ result="result0"
+ stdDeviation="2"
+ in="SourceAlpha" />
+ <feComposite
+ id="feComposite5800-5"
+ k4="0"
+ in2="result0"
+ k3="10"
+ k2="1"
+ k1="0"
+ result="result3"
+ in="SourceGraphic"
+ operator="arithmetic" />
+ <feComposite
+ id="feComposite5802-2"
+ operator="in"
+ result="result4"
+ in2="result3"
+ in="result3" />
+ </filter>
+ <filter
+ id="filter4137"
+ inkscape:menu="ABCs"
+ inkscape:menu-tooltip="Draws a black outline around"
+ inkscape:label="Black outline"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur4139"
+ result="result0"
+ stdDeviation="2"
+ in="SourceAlpha" />
+ <feComposite
+ id="feComposite4141"
+ k4="0"
+ in2="result0"
+ k3="10"
+ k2="1"
+ k1="0"
+ result="result3"
+ in="SourceGraphic"
+ operator="arithmetic" />
+ <feComposite
+ id="feComposite4143"
+ operator="in"
+ result="result4"
+ in2="result3"
+ in="result3" />
+ </filter>
+ <filter
+ id="filter5796-5"
+ inkscape:menu="ABCs"
+ inkscape:menu-tooltip="Draws a black outline around"
+ inkscape:label="Black outline"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur5798-7"
+ result="result0"
+ stdDeviation="2"
+ in="SourceAlpha" />
+ <feComposite
+ id="feComposite5800-0"
+ k4="0"
+ in2="result0"
+ k3="10"
+ k2="1"
+ k1="0"
+ result="result3"
+ in="SourceGraphic"
+ operator="arithmetic" />
+ <feComposite
+ id="feComposite5802-8"
+ operator="in"
+ result="result4"
+ in2="result3"
+ in="result3" />
+ </filter>
+ <filter
+ id="filter5796-5-7"
+ inkscape:menu="ABCs"
+ inkscape:menu-tooltip="Draws a black outline around"
+ inkscape:label="Black outline"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur5798-7-8"
+ result="result0"
+ stdDeviation="2"
+ in="SourceAlpha" />
+ <feComposite
+ id="feComposite5800-0-2"
+ k4="0"
+ in2="result0"
+ k3="10"
+ k2="1"
+ k1="0"
+ result="result3"
+ in="SourceGraphic"
+ operator="arithmetic" />
+ <feComposite
+ id="feComposite5802-8-5"
+ operator="in"
+ result="result4"
+ in2="result3"
+ in="result3" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ bordercolor="#666666"
+ inkscape:pageshadow="2"
+ inkscape:window-y="28"
+ pagecolor="#ffffff"
+ inkscape:window-height="1020"
+ inkscape:window-maximized="1"
+ inkscape:zoom="0.73168726"
+ inkscape:window-x="0"
+ showgrid="false"
+ borderopacity="1.0"
+ inkscape:current-layer="g4851"
+ inkscape:cx="-20.682719"
+ inkscape:cy="363.45645"
+ inkscape:window-width="1678"
+ inkscape:pageopacity="0.0"
+ inkscape:document-units="px"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ transform="translate(-39.288146,327.20004)">
+ <g
+ id="g5756"
+ style="filter:url(#filter5796)"
+ transform="matrix(0.53134,0,0,0.36275,181.14,206.22)">
+ <g
+ id="g4851"
+ transform="matrix(0.99383,-0.16246,0.07572,0.99383,-58.806,-270.08)">
+ <g
+ id="g4726-9-1-3"
+ style="filter:url(#filter5796-5-7)"
+ transform="matrix(0.79180082,0.17224303,-0.10334103,1.1377779,62.49366,821.2771)">
+ <path
+ id="path4212-4-9-4"
+ sodipodi:nodetypes="ccccc"
+ style="fill:#795c2e;fill-opacity:1;stroke:#000000;stroke-width:2.54508829;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 356,567.36 c 0.61728,48.872 -2.7133,96.429 -18,140 42.755,8.7732 82.841,4.2042 123,0 -6.0524,-44.824 -13.282,-93.179 -22,-146 -27.667,6.6315 -55.333,9.9979 -83,6 z"
+ inkscape:connector-curvature="0"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)" />
+ <path
+ id="path4214-5-9-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#66471b;fill-opacity:1"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 437,589.36 c 6.435,37.435 13.139,75.139 17,110 -36.113,4.929 -69.856,6.6965 -98,1 102.97,-4.151 80.099,-67.18 81,-111 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4726-9-1"
+ style="filter:url(#filter5796-5)"
+ transform="matrix(0.72004489,0.02894322,-0.05606789,1.0509142,111.93384,580.82233)">
+ <path
+ id="path4212-4-9"
+ sodipodi:nodetypes="ccccc"
+ style="fill:#795c2e;fill-opacity:1;stroke:#000000;stroke-width:2.80129933;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 356,567.36 c 0.61728,48.872 -2.7133,96.429 -18,140 42.755,8.7732 82.841,4.2042 123,0 -6.0524,-44.824 -13.282,-93.179 -22,-146 -27.667,6.6315 -55.333,9.9979 -83,6 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4214-5-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#66471b;fill-opacity:1"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 437,589.36 c 6.435,37.435 13.139,75.139 17,110 -36.113,4.929 -69.856,6.6965 -98,1 102.97,-4.151 80.099,-67.18 81,-111 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4726-9"
+ style="stroke-width:6.83318567;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter5796)"
+ transform="matrix(0.66575704,-0.07051223,-0.02098224,0.99539132,148.78587,269.37658)">
+ <path
+ id="path4212-4"
+ sodipodi:nodetypes="ccccc"
+ style="fill:#795c2e;fill-opacity:1;stroke:#000000;stroke-width:2.99998212;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 356,567.36 c 0.61728,48.872 -2.7133,96.429 -18,140 42.755,8.7732 82.841,4.2042 123,0 -6.0524,-44.824 -13.282,-93.179 -22,-146 -27.667,6.6315 -55.333,9.9979 -83,6 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4214-5"
+ sodipodi:nodetypes="cccc"
+ style="fill:#66471b;fill-opacity:1;stroke-width:2.99998212;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 437,589.36 c 6.435,37.435 13.139,75.139 17,110 -36.113,4.929 -69.856,6.6965 -98,1 102.97,-4.151 80.099,-67.18 81,-111 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4726-1"
+ style="stroke-width:7.01094675;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter5796)"
+ transform="matrix(0.63278557,-0.18825803,0.01500065,0.98813992,163.57685,-6.8300338)">
+ <path
+ id="path4212-5"
+ sodipodi:nodetypes="ccccc"
+ style="fill:#795c2e;fill-opacity:1;stroke:#000000;stroke-width:3.07802486;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 356,567.36 c 0.61728,48.872 -2.7133,96.429 -18,140 42.755,8.7732 82.841,4.2042 123,0 -6.0524,-44.824 -13.282,-93.179 -22,-146 -27.667,6.6315 -55.333,9.9979 -83,6 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4214-4"
+ sodipodi:nodetypes="cccc"
+ style="fill:#66471b;fill-opacity:1;stroke-width:3.07802486;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 437,589.36 c 6.435,37.435 13.139,75.139 17,110 -36.113,4.929 -69.856,6.6965 -98,1 102.97,-4.151 80.099,-67.18 81,-111 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4726"
+ transform="matrix(0.59170949,-0.25059655,0.03084756,0.98159008,173.91981,-295.50208)"
+ style="stroke-width:7.24273014;stroke-miterlimit:4;stroke-dasharray:none">
+ <path
+ id="path4212"
+ sodipodi:nodetypes="ccccc"
+ style="fill:#795c2e;fill-opacity:1;stroke:#000000;stroke-width:3.17978501;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 356,567.36 c 0.61728,48.872 -2.7133,96.429 -18,140 42.755,8.7732 82.841,4.2042 123,0 -6.0524,-44.824 -13.282,-93.179 -22,-146 -27.667,6.6315 -55.333,9.9979 -83,6 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4214"
+ sodipodi:nodetypes="cccc"
+ style="fill:#66471b;fill-opacity:1;stroke-width:3.17978501;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.882,0,0,2.7567,-340.91,-1815.5)"
+ d="m 437,589.36 c 6.435,37.435 13.139,75.139 17,110 -36.113,4.929 -69.856,6.6965 -98,1 102.97,-4.151 80.099,-67.18 81,-111 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4145"
+ transform="translate(-48.933,-791.17)">
+ <g
+ id="g3855-2-6"
+ style="filter:url(#filter5796-3)"
+ transform="matrix(0.76972,1.1934,-0.55489,0.75779,208.29,-627.32)">
+ <path
+ id="path5074-5-5"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccc"
+ style="fill:#447821;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:6.12295344;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 517.24,88.147 C 467.94,71.008 422.05,59.145 379.7,53.367 L 365.41,101.76 350.55,50.329 c -47.15,-3.341 -89.49,1.746 -126.8,16.582 l 9.1333,61.158 -48.778,-40.379 c -23.73,15.76 -44.9,36.62 -63.44,63.07 l 40.682,53.414 -55.855,-29.52 c -12.488,21.73 -23.553,46.49 -33.153,74.52 l 34.363,35.07 -40.833,-15.08 c -9.1473,30.285 -16.752,64.022 -22.788,101.4 38.79,4.409 74.739,8.1644 108.02,10.742 l -0.61253,-52.329 35.629,54.634 c 39.627,2.0831 75.136,1.9701 106.83,-1.4391 l -9.1239,-53.742 55.307,45.653 c 32.079,-8.1796 59.375,-21.451 82.42,-41.513 l -37.796,-57.807 62.024,32.164 c 16.826,-21.447 30.781,-48.157 42.163,-81.157 l -43.637,-26.896 50.659,4.7003 c 9.4361,-32.767 16.779,-70.976 22.279,-115.42 l 10e-6,4.1e-5 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-4-8"
+ sodipodi:nodetypes="ccc"
+ style="fill:#112b00"
+ d="M 450.74,155.18 C 322.93,159.12 219.98,230.2 122.35,315.61 211.9,200.7 320.77,145.41 450.74,155.18 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-6-4-7"
+ sodipodi:nodetypes="ccc"
+ style="fill:#2d5016"
+ d="M 445.82,158.67 C 316.85,171.79 217.17,236.9 123.74,313.1 207.18,213.85 351.22,139.77 445.82,158.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-9-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 229.76,70.823 11.62,90.357 C 222.53,66.66 283.97,62.884 342.06,55.33 303.02,54.097 265.35,58.305 229.76,70.823 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-1-9-6"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 128.01,154.35 42.808,46.749 c -48.39,-46.12 -16.82,-73.9 11.41,-102.44 -21.52,15.57 -40.11,33.69 -54.22,55.69 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-3-3-0"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 385.13,59.849 -31,86.821 C 379.74,53.027 444.1,75.523 506.85,93.187 467.68,75.598 427.32,63.518 385.13,59.849 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-8-6-4"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 80.586,251.48 60.196,29.579 c -65.726,-26.93 -42.714,-65.32 -23.4,-103.25 -16.85,22.93 -29.796,47.24 -36.794,73.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5679-0-1"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 73.574,281.22 c -8.055,26.8 -18.939,50.76 -20.652,83.9 27.335,10.07 59.958,4.28 90.358,5.16 -102.82,0.16 -70.468,-50.37 -69.706,-89.06 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-5-0"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 190.37,378.32 -52.133,-75.798 c 49.882,80.447 95.133,72.91 140.58,69.033 -26.33,7.7581 -55.341,10.834 -88.444,6.7651 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-0-4"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="M 340.94,365.27 273.3,310.13 c 67.292,60.417 102.18,37.373 138.42,17.801 -19.206,16.669 -42.146,29.745 -70.784,37.337 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-4-2-87"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 440.38,298.06 -88.177,-47.368 c 90.652,54.328 109.04,12.082 130.43,-26.146 -8.024,28.415 -21.204,53.503 -42.255,73.514 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-5-9-0"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 488.3,198.23 -58.095,-12.073 c 59.885,19.303 70.524,-41.967 83.213,-99.884 -4.3608,38.95 -12.135,76.512 -25.118,111.96 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g3855-2"
+ style="filter:url(#filter5796)"
+ transform="matrix(1.1038,0.2853,-0.13674,1.093,-76.225,-262.68)">
+ <path
+ id="path5074-5"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccc"
+ style="fill:#447821;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:6.12301864;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 517.24,88.147 C 467.94,71.008 422.05,59.145 379.7,53.367 L 365.41,101.76 350.55,50.329 c -47.15,-3.341 -89.49,1.746 -126.8,16.582 l 9.1333,61.158 -48.778,-40.379 c -23.73,15.76 -44.9,36.62 -63.44,63.07 l 40.682,53.414 -55.855,-29.52 c -12.488,21.73 -23.553,46.49 -33.153,74.52 l 34.363,35.07 -40.833,-15.08 c -9.1473,30.285 -16.752,64.022 -22.788,101.4 38.79,4.409 74.739,8.1644 108.02,10.742 l -0.61253,-52.329 35.629,54.634 c 39.627,2.0831 75.136,1.9701 106.83,-1.4391 l -9.1239,-53.742 55.307,45.653 c 32.079,-8.1796 59.375,-21.451 82.42,-41.513 l -37.796,-57.807 62.024,32.164 c 16.826,-21.447 30.781,-48.157 42.163,-81.157 l -43.637,-26.896 50.659,4.7003 c 9.4361,-32.767 16.779,-70.976 22.279,-115.42 l 10e-6,4.1e-5 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-4"
+ sodipodi:nodetypes="ccc"
+ style="fill:#112b00"
+ d="M 450.74,155.18 C 322.93,159.12 219.98,230.2 122.35,315.61 211.9,200.7 320.77,145.41 450.74,155.18 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-6-4"
+ sodipodi:nodetypes="ccc"
+ style="fill:#2d5016"
+ d="M 445.82,158.67 C 316.85,171.79 217.17,236.9 123.74,313.1 207.18,213.85 351.22,139.77 445.82,158.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 229.76,70.823 11.62,90.357 C 222.53,66.66 283.97,62.884 342.06,55.33 303.02,54.097 265.35,58.305 229.76,70.823 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-1-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 128.01,154.35 42.808,46.749 c -48.39,-46.12 -16.82,-73.9 11.41,-102.44 -21.52,15.57 -40.11,33.69 -54.22,55.69 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-3-3"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 385.13,59.849 -31,86.821 C 379.74,53.027 444.1,75.523 506.85,93.187 467.68,75.598 427.32,63.518 385.13,59.849 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-8-6"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 80.586,251.48 60.196,29.579 c -65.726,-26.93 -42.714,-65.32 -23.4,-103.25 -16.85,22.93 -29.796,47.24 -36.794,73.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5679-0"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 73.574,281.22 c -8.055,26.8 -18.939,50.76 -20.652,83.9 27.335,10.07 59.958,4.28 90.358,5.16 -102.82,0.16 -70.468,-50.37 -69.706,-89.06 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-5"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 190.37,378.32 -52.133,-75.798 c 49.882,80.447 95.133,72.91 140.58,69.033 -26.33,7.7581 -55.341,10.834 -88.444,6.7651 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-0"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="M 340.94,365.27 273.3,310.13 c 67.292,60.417 102.18,37.373 138.42,17.801 -19.206,16.669 -42.146,29.745 -70.784,37.337 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-4-2"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 440.38,298.06 -88.177,-47.368 c 90.652,54.328 109.04,12.082 130.43,-26.146 -8.024,28.415 -21.204,53.503 -42.255,73.514 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-5-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 488.3,198.23 -58.095,-12.073 c 59.885,19.303 70.524,-41.967 83.213,-99.884 -4.3608,38.95 -12.135,76.512 -25.118,111.96 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g3855-2-4"
+ style="filter:url(#filter5796-4)"
+ transform="matrix(-1.0036,-0.73104,-0.33334,0.99822,1030.7,278.5)">
+ <path
+ id="path5074-5-1"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccc"
+ style="fill:#447821;fill-opacity:1;stroke-width:6.12293717000000015;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ d="M 517.24,88.147 C 467.94,71.008 422.05,59.145 379.7,53.367 L 365.41,101.76 350.55,50.329 c -47.15,-3.341 -89.49,1.746 -126.8,16.582 l 9.1333,61.158 -48.778,-40.379 c -23.73,15.76 -44.9,36.62 -63.44,63.07 l 40.682,53.414 -55.855,-29.52 c -12.488,21.73 -23.553,46.49 -33.153,74.52 l 34.363,35.07 -40.833,-15.08 c -9.1473,30.285 -16.752,64.022 -22.788,101.4 38.79,4.409 74.739,8.1644 108.02,10.742 l -0.61253,-52.329 35.629,54.634 c 39.627,2.0831 75.136,1.9701 106.83,-1.4391 l -9.1239,-53.742 55.307,45.653 c 32.079,-8.1796 59.375,-21.451 82.42,-41.513 l -37.796,-57.807 62.024,32.164 c 16.826,-21.447 30.781,-48.157 42.163,-81.157 l -43.637,-26.896 50.659,4.7003 c 9.4361,-32.767 16.779,-70.976 22.279,-115.42 l 10e-6,4.1e-5 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-4-2"
+ sodipodi:nodetypes="ccc"
+ style="fill:#112b00"
+ d="M 450.74,155.18 C 322.93,159.12 219.98,230.2 122.35,315.61 211.9,200.7 320.77,145.41 450.74,155.18 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-6-4-8"
+ sodipodi:nodetypes="ccc"
+ style="fill:#2d5016"
+ d="M 445.82,158.67 C 316.85,171.79 217.17,236.9 123.74,313.1 207.18,213.85 351.22,139.77 445.82,158.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-9-8"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 229.76,70.823 11.62,90.357 C 222.53,66.66 283.97,62.884 342.06,55.33 303.02,54.097 265.35,58.305 229.76,70.823 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-1-9-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 128.01,154.35 42.808,46.749 c -48.39,-46.12 -16.82,-73.9 11.41,-102.44 -21.52,15.57 -40.11,33.69 -54.22,55.69 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-3-3-2"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 385.13,59.849 -31,86.821 C 379.74,53.027 444.1,75.523 506.85,93.187 467.68,75.598 427.32,63.518 385.13,59.849 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-8-6-8"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 80.586,251.48 60.196,29.579 c -65.726,-26.93 -42.714,-65.32 -23.4,-103.25 -16.85,22.93 -29.796,47.24 -36.794,73.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5679-0-8"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 73.574,281.22 c -8.055,26.8 -18.939,50.76 -20.652,83.9 27.335,10.07 59.958,4.28 90.358,5.16 -102.82,0.16 -70.468,-50.37 -69.706,-89.06 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-5-8"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 190.37,378.32 -52.133,-75.798 c 49.882,80.447 95.133,72.91 140.58,69.033 -26.33,7.7581 -55.341,10.834 -88.444,6.7651 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-0-6"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="M 340.94,365.27 273.3,310.13 c 67.292,60.417 102.18,37.373 138.42,17.801 -19.206,16.669 -42.146,29.745 -70.784,37.337 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-4-2-8"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 440.38,298.06 -88.177,-47.368 c 90.652,54.328 109.04,12.082 130.43,-26.146 -8.024,28.415 -21.204,53.503 -42.255,73.514 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-5-9-3"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 488.3,198.23 -58.095,-12.073 c 59.885,19.303 70.524,-41.967 83.213,-99.884 -4.3608,38.95 -12.135,76.512 -25.118,111.96 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g3855-2-4-4"
+ style="filter:url(#filter5796-4-3);stroke:#000000;stroke-opacity:1"
+ transform="matrix(1.1207,-0.023115,0.0077797,0.93015,415.55,-252.7)">
+ <path
+ id="path5074-5-1-7"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccc"
+ style="fill:#447821;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:6.69225935;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 517.24,88.147 C 467.94,71.008 422.05,59.145 379.7,53.367 L 365.41,101.76 350.55,50.329 c -47.15,-3.341 -89.49,1.746 -126.8,16.582 l 9.1333,61.158 -48.778,-40.379 c -23.73,15.76 -44.9,36.62 -63.44,63.07 l 40.682,53.414 -55.855,-29.52 c -12.488,21.73 -23.553,46.49 -33.153,74.52 l 34.363,35.07 -40.833,-15.08 c -9.1473,30.285 -16.752,64.022 -22.788,101.4 38.79,4.409 74.739,8.1644 108.02,10.742 l -0.61253,-52.329 35.629,54.634 c 39.627,2.0831 75.136,1.9701 106.83,-1.4391 l -9.1239,-53.742 55.307,45.653 c 32.079,-8.1796 59.375,-21.451 82.42,-41.513 l -37.796,-57.807 62.024,32.164 c 16.826,-21.447 30.781,-48.157 42.163,-81.157 l -43.637,-26.896 50.659,4.7003 c 9.4361,-32.767 16.779,-70.976 22.279,-115.42 l 10e-6,4.1e-5 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-4-2-6"
+ sodipodi:nodetypes="ccc"
+ style="fill:#112b00;stroke:#000000;stroke-opacity:1"
+ d="M 450.74,155.18 C 322.93,159.12 219.98,230.2 122.35,315.61 211.9,200.7 320.77,145.41 450.74,155.18 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-6-4-8-8"
+ sodipodi:nodetypes="ccc"
+ style="fill:#2d5016;stroke:#000000;stroke-opacity:1"
+ d="M 445.82,158.67 C 316.85,171.79 217.17,236.9 123.74,313.1 207.18,213.85 351.22,139.77 445.82,158.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-9-8-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+ d="m 229.76,70.823 11.62,90.357 C 222.53,66.66 283.97,62.884 342.06,55.33 303.02,54.097 265.35,58.305 229.76,70.823 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-1-9-9-0"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+ d="m 128.01,154.35 42.808,46.749 c -48.39,-46.12 -16.82,-73.9 11.41,-102.44 -21.52,15.57 -40.11,33.69 -54.22,55.69 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-3-3-2-6"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+ d="m 385.13,59.849 -31,86.821 C 379.74,53.027 444.1,75.523 506.85,93.187 467.68,75.598 427.32,63.518 385.13,59.849 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-8-6-8-8"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+ d="m 80.586,251.48 60.196,29.579 c -65.726,-26.93 -42.714,-65.32 -23.4,-103.25 -16.85,22.93 -29.796,47.24 -36.794,73.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5679-0-8-7"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+ d="m 73.574,281.22 c -8.055,26.8 -18.939,50.76 -20.652,83.9 27.335,10.07 59.958,4.28 90.358,5.16 -102.82,0.16 -70.468,-50.37 -69.706,-89.06 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-5-8-9"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016;stroke:#000000;stroke-opacity:1"
+ d="m 190.37,378.32 -52.133,-75.798 c 49.882,80.447 95.133,72.91 140.58,69.033 -26.33,7.7581 -55.341,10.834 -88.444,6.7651 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-0-6-0"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016;stroke:#000000;stroke-opacity:1"
+ d="M 340.94,365.27 273.3,310.13 c 67.292,60.417 102.18,37.373 138.42,17.801 -19.206,16.669 -42.146,29.745 -70.784,37.337 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-4-2-8-3"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016;stroke:#000000;stroke-opacity:1"
+ d="m 440.38,298.06 -88.177,-47.368 c 90.652,54.328 109.04,12.082 130.43,-26.146 -8.024,28.415 -21.204,53.503 -42.255,73.514 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-5-9-3-3"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016;stroke:#000000;stroke-opacity:1"
+ d="m 488.3,198.23 -58.095,-12.073 c 59.885,19.303 70.524,-41.967 83.213,-99.884 -4.3608,38.95 -12.135,76.512 -25.118,111.96 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g3855"
+ style="filter:url(#filter4137)"
+ transform="matrix(1.1397,-0.53578,0.19152,1.3022,-133.58,212.76)">
+ <path
+ id="path5074"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccc"
+ style="fill:#447821;fill-opacity:1;stroke-width:5.42475208000000020;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ d="M 517.24,88.147 C 467.94,71.008 422.05,59.145 379.7,53.367 L 365.41,101.76 350.55,50.329 c -47.15,-3.341 -89.49,1.746 -126.8,16.582 l 9.1333,61.158 -48.778,-40.379 c -23.73,15.76 -44.9,36.62 -63.44,63.07 l 40.682,53.414 -55.855,-29.52 c -12.488,21.73 -23.553,46.49 -33.153,74.52 l 34.363,35.07 -40.833,-15.08 c -9.1473,30.285 -16.752,64.022 -22.788,101.4 38.79,4.409 74.739,8.1644 108.02,10.742 l -0.61253,-52.329 35.629,54.634 c 39.627,2.0831 75.136,1.9701 106.83,-1.4391 l -9.1239,-53.742 55.307,45.653 c 32.079,-8.1796 59.375,-21.451 82.42,-41.513 l -37.796,-57.807 62.024,32.164 c 16.826,-21.447 30.781,-48.157 42.163,-81.157 l -43.637,-26.896 50.659,4.7003 c 9.4361,-32.767 16.779,-70.976 22.279,-115.42 l 10e-6,4.1e-5 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103"
+ sodipodi:nodetypes="ccc"
+ style="fill:#112b00"
+ d="M 450.74,155.18 C 322.93,159.12 219.98,230.2 122.35,315.61 211.9,200.7 320.77,145.41 450.74,155.18 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5103-6"
+ sodipodi:nodetypes="ccc"
+ style="fill:#2d5016"
+ d="M 445.82,158.67 C 316.85,171.79 217.17,236.9 123.74,313.1 207.18,213.85 351.22,139.77 445.82,158.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 229.76,70.823 11.62,90.357 C 222.53,66.66 283.97,62.884 342.06,55.33 303.02,54.097 265.35,58.305 229.76,70.823 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-1"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 128.01,154.35 42.808,46.749 c -48.39,-46.12 -16.82,-73.9 11.41,-102.44 -21.52,15.57 -40.11,33.69 -54.22,55.69 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-3"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 385.13,59.849 -31,86.821 C 379.74,53.027 444.1,75.523 506.85,93.187 467.68,75.598 427.32,63.518 385.13,59.849 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-8"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;fill-opacity:1"
+ d="m 80.586,251.48 60.196,29.579 c -65.726,-26.93 -42.714,-65.32 -23.4,-103.25 -16.85,22.93 -29.796,47.24 -36.794,73.67 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5679"
+ sodipodi:nodetypes="cccc"
+ style="fill:#5aa02c;stroke:none;stroke-opacity:1;fill-opacity:1"
+ d="m 73.574,281.22 c -8.055,26.8 -18.939,50.76 -20.652,83.9 27.335,10.07 59.958,4.28 90.358,5.16 -102.82,0.16 -70.468,-50.37 -69.706,-89.06 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 190.37,378.32 -52.133,-75.798 c 49.882,80.447 95.133,72.91 140.58,69.033 -26.33,7.7581 -55.341,10.834 -88.444,6.7651 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="M 340.94,365.27 273.3,310.13 c 67.292,60.417 102.18,37.373 138.42,17.801 -19.206,16.669 -42.146,29.745 -70.784,37.337 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-4"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 440.38,298.06 -88.177,-47.368 c 90.652,54.328 109.04,12.082 130.43,-26.146 -8.024,28.415 -21.204,53.503 -42.255,73.514 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5637-5-7-5"
+ sodipodi:nodetypes="cccc"
+ style="fill:#2d5016"
+ d="m 488.3,198.23 -58.095,-12.073 c 59.885,19.303 70.524,-41.967 83.213,-99.884 -4.3608,38.95 -12.135,76.512 -25.118,111.96 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <metadata
+ id="metadata3255">
+ <rdf:RDF>
+ <cc:Work>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:publisher>
+ <cc:Agent
+ rdf:about="http://openclipart.org/">
+ <dc:title>Openclipart</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:title></dc:title>
+ <dc:date>2010-09-25T12:42:13</dc:date>
+ <dc:description>Palm Tree, made with another file I made called Jungle Leaf.</dc:description>
+ <dc:source>https://openclipart.org/detail/86761/palm-tree-by-stevepetmonkey</dc:source>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>stevepetmonkey</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>Coconut Tree</rdf:li>
+ <rdf:li>Jungle</rdf:li>
+ <rdf:li>Jungle Leaf</rdf:li>
+ <rdf:li>Palm</rdf:li>
+ <rdf:li>Palm Tree</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+</svg>
--- a/tools/CMakeLists.txt Fri Sep 11 04:05:09 2015 +0200
+++ b/tools/CMakeLists.txt Fri Apr 01 15:36:19 2016 +0200
@@ -8,13 +8,14 @@
if(APPLE AND NOT SKIPBUNDLE)
find_package(Qt4 REQUIRED QUIET)
+ find_package(SDL2 REQUIRED)
+ find_package(SDL2_image REQUIRED)
+ find_package(SDL2_net REQUIRED)
+ find_package(SDL2_ttf REQUIRED)
+ find_package(SDL2_mixer REQUIRED)
+ find_package(OggVorbis REQUIRED)
find_package(PNG REQUIRED)
- find_package(SDL REQUIRED)
- find_package(SDL_image REQUIRED)
- find_package(SDL_net REQUIRED)
- find_package(SDL_ttf REQUIRED)
- find_package(SDL_mixer REQUIRED)
- find_package(OggVorbis REQUIRED)
+
if(NOT NOAUTOUPDATE)
find_package(Sparkle) #needed for SPARKLE_FOUND variable
#needed because the 'if' clause in the script prints silly policy warnings
@@ -28,9 +29,9 @@
#use the associated tool from the libraries we've selected
string(REGEX REPLACE "(.*)/include.*" "\\1" qt_base_dir "${QT_INCLUDE_DIR}")
- #remove the ";-framework Cocoa" from the SDL_LIBRARY variable
- string(REGEX REPLACE "(.*);-.*" "\\1" sdl_library_only "${SDL_LIBRARY}")
- #remove the "libSDLmain.a" from the SDL_LIBRARY variable
+ #remove the ";-framework Cocoa" from the SDL2_LIBRARY variable
+ string(REGEX REPLACE "(.*);-.*" "\\1" sdl_library_only "${SDL2_LIBRARY}")
+ #remove the "libSDLmain.a" from the SDL2_LIBRARY variable
string(REGEX REPLACE ".*;(.*)" "\\1" sdl_library_only "${sdl_library_only}")
#get the neme of the library (harmelss if it is static)
@@ -58,7 +59,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}"
--- a/tools/CreateMacBundle.cmake.in Fri Sep 11 04:05:09 2015 +0200
+++ b/tools/CreateMacBundle.cmake.in Fri Apr 01 15:36:19 2016 +0200
@@ -1,33 +1,36 @@
-
-execute_process(COMMAND stat ${frameworks_dir}/SDL.framework RESULT_VARIABLE doBundle OUTPUT_QUIET ERROR_QUIET)
+# check for a well known-framework
+execute_process(COMMAND stat ${frameworks_dir}/QtCore.framework RESULT_VARIABLE doBundle OUTPUT_QUIET ERROR_QUIET)
+# prepare Frameworks directory
execute_process(COMMAND mkdir -p ${frameworks_dir})
# macdeployqt will convert safely any absolute path library for 'hedgewars'
execute_process(COMMAND ${macdeployqt_executable} ${CMAKE_BINARY_DIR}/Hedgewars.app OUTPUT_QUIET ERROR_QUIET)
-if(NOT ${NOVIDEOREC})
- # but macdeployqt will not work for 'hwengine'; luckily the dylibs were already updated before
- execute_process(COMMAND install_name_tool -change ${LIBAVCODEC_LIBRARY} @executable_path/../Frameworks/libavcodec.dylib ${engine_full_path})
- execute_process(COMMAND install_name_tool -change ${LIBAVFORMAT_LIBRARY} @executable_path/../Frameworks/libavformat.dylib ${engine_full_path})
- execute_process(COMMAND install_name_tool -change ${LIBAVUTIL_LIBRARY} @executable_path/../Frameworks/libavutil.dylib ${engine_full_path})
-endif()
+if(doBundle EQUAL 1)
+ if(NOT ${NOVIDEOREC})
+ # but macdeployqt will not work for 'hwengine'
+ # luckily most the dylibs are already updated before
+ execute_process(COMMAND install_name_tool -change ${LIBAVCODEC_LIBRARY} @executable_path/../Frameworks/libavcodec.dylib ${engine_full_path})
+ execute_process(COMMAND install_name_tool -change ${LIBAVFORMAT_LIBRARY} @executable_path/../Frameworks/libavformat.dylib ${engine_full_path})
+ execute_process(COMMAND install_name_tool -change ${LIBAVUTIL_LIBRARY} @executable_path/../Frameworks/libavutil.dylib ${engine_full_path})
+ endif()
-if(NOT ${NOPNG})
- #same here, for libpng and hwengine, let's assume the version pulled by macdeployqt is the same
- #(yes libpng is pulled by macdeployqt even when NOVIDEOREC is active)
- execute_process(COMMAND install_name_tool -change ${PNG_LIBRARY} @executable_path/../Frameworks/${PNG_LIBNAME} ${engine_full_path})
- execute_process(COMMAND install_name_tool -change ${ZLIB_LIBRARY} @executable_path/../Frameworks/${ZLIB_LIBNAME} ${engine_full_path})
-endif()
+ if(NOT ${NOPNG})
+ # same here, for libpng and hwengine, let's assume the version pulled
+ # by macdeployqt matches (yes, libpng is pulled in by macdeployqt even
+ # when NOVIDEOREC is ON)
+ execute_process(COMMAND install_name_tool -change ${PNG_LIBRARY} @executable_path/../Frameworks/${PNG_LIBNAME} ${engine_full_path})
+ execute_process(COMMAND install_name_tool -change ${ZLIB_LIBRARY} @executable_path/../Frameworks/${ZLIB_LIBNAME} ${engine_full_path})
+ endif()
-if(doBundle EQUAL 1)
execute_process(COMMAND cp ${PNG_LIBRARY} ${frameworks_dir})
- execute_process(COMMAND cp -pPR ${sdl_library_only} ${frameworks_dir})
- execute_process(COMMAND cp -pPR ${SDLIMAGE_LIBRARY} ${frameworks_dir})
- execute_process(COMMAND cp -pPR ${SDLNET_LIBRARY} ${frameworks_dir})
- execute_process(COMMAND cp -pPR ${SDLTTF_LIBRARY} ${frameworks_dir})
- execute_process(COMMAND cp -pPR ${SDLMIXER_LIBRARY} ${frameworks_dir})
- execute_process(COMMAND cp -pPR ${OGG_LIBRARY} ${frameworks_dir})
- execute_process(COMMAND cp -pPR ${VORBIS_LIBRARY} ${frameworks_dir})
+ execute_process(COMMAND cp -pPR ${sdl_library_only} ${frameworks_dir})
+ execute_process(COMMAND cp -pPR ${SDL2IMAGE_LIBRARY} ${frameworks_dir})
+ execute_process(COMMAND cp -pPR ${SDL2NET_LIBRARY} ${frameworks_dir})
+ execute_process(COMMAND cp -pPR ${SDL2TTF_LIBRARY} ${frameworks_dir})
+ execute_process(COMMAND cp -pPR ${SDL2MIXER_LIBRARY} ${frameworks_dir})
+ execute_process(COMMAND cp -pPR ${OGG_LIBRARY} ${frameworks_dir})
+ execute_process(COMMAND cp -pPR ${VORBIS_LIBRARY} ${frameworks_dir})
if(${SPARKLE_FOUND})
execute_process(COMMAND cp -pPR ${SPARKLE_LIBRARY} ${frameworks_dir})
--- a/tools/build_windows.bat Fri Sep 11 04:05:09 2015 +0200
+++ b/tools/build_windows.bat Fri Apr 01 15:36:19 2016 +0200
@@ -27,8 +27,6 @@
::for video recording
if not exist %CD%\misc\winutils\bin\avformat-54.dll cscript %CD%\tools\w32DownloadUnzip.vbs http://hedgewars.googlecode.com/files/libav-win32-20121022-dll.zip %CD%\misc\winutils\bin
-if not exist %CD%\misc\winutils\bin\glut32.dll cscript %CD%\tools\w32DownloadUnzip.vbs https://user.xmission.com/~nate/glut/glut-3.7.6-bin.zip %CD%\misc\winutils\bin
-copy /y %CD%\misc\winutils\bin\glut-3.7.6-bin\glut32.dll %CD%\misc\winutils\bin\glut32.dll
::this is needed because fpc png unit hardcodes libpng-1.2.12
if not exist %CD%\misc\winutils\bin\libpng13.dll copy /y %CD%\misc\winutils\bin\libpng15-15.dll %CD%\misc\winutils\bin\libpng13.dll
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/dmg_pkg_install.sh Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# Downloads and install a .dmg from a URL
+#
+# Usage
+# $ dmg_pkg_install [url]
+#
+# Adopted from https://gist.github.com/afgomez/4172338
+
+
+if [[ $# -lt 1 ]]; then
+ echo "Usage: dmg_pkg_install [url]"
+ exit 1
+fi
+
+url=$*
+
+# Generate a random file name
+tmp_file=/tmp/`openssl rand -base64 10 | tr -dc '[:alnum:]'`.dmg
+
+# Download file
+echo "Downloading $url..."
+curl -# -L -o $tmp_file $url
+
+echo "Mounting image..."
+volume=`hdiutil mount $tmp_file | tail -n1 | perl -nle '/(\/Volumes\/[^ ]+)/; print $1'`
+
+# Locate .pkg
+app_pkg=`find $volume/. -name *.pkg -maxdepth 1 -print0`
+echo "Install pkg..."
+installer -pkg $app_pkg -target /
+
+# Unmount volume, delete temporal file
+echo "Cleaning up..."
+hdiutil unmount $volume -quiet
+rm $tmp_file
+
+echo "Done!"
+exit 0
\ No newline at end of file
--- a/tools/docgen.sh Fri Sep 11 04:05:09 2015 +0200
+++ b/tools/docgen.sh Fri Apr 01 15:36:19 2016 +0200
@@ -25,13 +25,7 @@
branch=$(hg identify -b)
rev=$(hg identify -rdefault -i)
-#branchurl="<a href=http://code.google.com/p/hedgewars/source/list?name=${branch}>${branch}</a>"
-#revurl="<a href=http://code.google.com/p/hedgewars/source/detail?r=${rev}>${rev}</a>"
-
-branchurl="$branch"
-revurl="$rev"
-
-export PROJECT_NUMBER="${branchurl} branch, ${revurl}"
+export PROJECT_NUMBER="${branch} branch, ${rev}"
export OUTPUT_DIRECTORY
fi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/fix_fpc_ios_build_patch.diff Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,57 @@
+diff --git a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj
+--- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj
++++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj
+@@ -1830,7 +1830,7 @@
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+- shellScript = "# Build libfpc.a\n# 9 July 2006 (Jonas Maebe)\n# * original version\n# 15 September 2006 (Erling Johansen)\n# * simplified\n# 26 April 2007 (Jonas Maebe)\n# * added support for ppc64/x86_64 (future proofing)\n# 4 August 2007 (Jonas Maebe)\n# * call ranlib after ar so the toc of the library is up-to-date\n# 3 January 2009 (Jonas Maebe)\n# * support for ARM\n# 24 October 2009 (Jonas Maebe)\n# * don't hardcode version 2.3.1 anymore under certain circumstances\n# * use the FPC_RTL_UNITS_BASE setting\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\nrm -f \"$TARGET_TEMP_DIR\"/*.a\nnarch=\n\n#temparchs=`echo $ARCHS|sed -e 's/arm[^\\w]*/arm\\\n#/'|sort -u`\ntemparchs=`echo $ARCHS|sort -u`\necho $temparchs\nfor arch in $temparchs\ndo\n\ttargetos=darwin;\n\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# ppc) fpc_arch=ppc; fpc_rtl=powerpc ;;\n#\t\ti386) fpc_arch=386; fpc_rtl=i386; targetos=iphonesim ;;\n#\t\tppc64) fpc_arch=ppc64; fpc_rtl=powerpc64 ;;\n#\t\tx86_64) fpc_arch=x64; fpc_rtl=x86_64 ;;\n#\t\tarm*) fpc_arch=arm; fpc_rtl=arm ;;\n\t\t*) continue\n\tesac\n\tif test -e \"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch}\n\tthen\n\t\tupath=\"$FPC_RTL_UNITS_BASE\"/`\"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch} -iV`/units/${fpc_rtl}-${targetos}\n\t\tar -q \"$TARGET_TEMP_DIR\"/libfpc${narch}.a `ls \"$upath\"/*/*.o | grep -v 'darwin/fv/'`\n\t\tranlib \"$TARGET_TEMP_DIR\"/libfpc${narch}.a\n\t\tnarch=${narch}x\n\telse\n\t\techo error: can\\'t build libfpc.a for $arch \\(${FPC_COMPILER_BINARY_DIR}/ppc${fpc_arch} not found, derived from FPC_COMPILER_BINARY_DIR project setting\\)\n\tfi\ndone\n \nif test ${#narch} -gt 1\nthen\n\tlipo -create \"$TARGET_TEMP_DIR\"/libfpc*.a -output \"$TARGET_BUILD_DIR\"/libfpc.a\n\trm -f \"$TARGET_TEMP_DIR\"/*.a\nelse\n\tmv \"$TARGET_TEMP_DIR\"/libfpc.a \"$TARGET_BUILD_DIR\"\nfi\n";
++ shellScript = "# Build libfpc.a\n# 9 July 2006 (Jonas Maebe)\n# * original version\n# 15 September 2006 (Erling Johansen)\n# * simplified\n# 26 April 2007 (Jonas Maebe)\n# * added support for ppc64/x86_64 (future proofing)\n# 4 August 2007 (Jonas Maebe)\n# * call ranlib after ar so the toc of the library is up-to-date\n# 3 January 2009 (Jonas Maebe)\n# * support for ARM\n# 24 October 2009 (Jonas Maebe)\n# * don't hardcode version 2.3.1 anymore under certain circumstances\n# * use the FPC_RTL_UNITS_BASE setting\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\nrm -f \"$TARGET_TEMP_DIR\"/*.a\nnarch=\n\n#temparchs=`echo $ARCHS|sed -e 's/arm[^\\w]*/arm\\\n#/'|sort -u`\ntemparchs=`echo $ARCHS|sort -u`\necho $temparchs\nfor arch in $temparchs\ndo\n\ttargetos=darwin;\n\tcase $arch in\n arm64) fpc_arch=a64; fpc_rtl=aarch64 ;;\n armv7) fpc_arch=arm; fpc_rtl=arm ;;\n x86_64) fpc_arch=x64; fpc_rtl=x86_64; targetos=iphonesim ;;\n# ppc) fpc_arch=ppc; fpc_rtl=powerpc ;;\n#\t\ti386) fpc_arch=386; fpc_rtl=i386; targetos=iphonesim ;;\n#\t\tppc64) fpc_arch=ppc64; fpc_rtl=powerpc64 ;;\n#\t\tx86_64) fpc_arch=x64; fpc_rtl=x86_64 ;;\n#\t\tarm*) fpc_arch=arm; fpc_rtl=arm ;;\n\t\t*) continue\n\tesac\n\tif test -e \"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch}\n\tthen\n\t\tupath=\"$FPC_RTL_UNITS_BASE\"/`\"${FPC_COMPILER_BINARY_DIR}\"/ppc${fpc_arch} -iV`/units/${fpc_rtl}-${targetos}\n\t\tar -q \"$TARGET_TEMP_DIR\"/libfpc${narch}.a `ls \"$upath\"/*/*.o | grep -v 'darwin/fv/'`\n\t\tranlib \"$TARGET_TEMP_DIR\"/libfpc${narch}.a\n\t\tnarch=${narch}x\n\telse\n\t\techo error: can\\'t build libfpc.a for $arch \\(${FPC_COMPILER_BINARY_DIR}/ppc${fpc_arch} not found, derived from FPC_COMPILER_BINARY_DIR project setting\\)\n\tfi\ndone\n \nif test ${#narch} -gt 1\nthen\n\tlipo -create \"$TARGET_TEMP_DIR\"/libfpc*.a -output \"$TARGET_BUILD_DIR\"/libfpc.a\n\trm -f \"$TARGET_TEMP_DIR\"/*.a\nelse\n\tmv \"$TARGET_TEMP_DIR\"/libfpc.a \"$TARGET_BUILD_DIR\"\nfi\n";
+ };
+ 928301560F10E04C00CC5A3C /* Compile Pascal Sources */ = {
+ isa = PBXShellScriptBuildPhase;
+@@ -1845,7 +1845,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) (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";
++ 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=a64; fpc_rtl=aarch64 ;;\n armv7) fpc_arch=arm; 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 */
+
+@@ -2141,7 +2141,7 @@
+ 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_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.0.1;
+ FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas";
+ FPC_RTL_UNITS_BASE = /usr/local/lib/fpc;
+ FPC_SPECIFIC_OPTIONS = "-Ci- -Cr- -Co- -O2 -Xs -dNOCONSOLE";
+@@ -2258,7 +2258,7 @@
+ 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_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.0.1;
+ FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas";
+ FPC_RTL_UNITS_BASE = /usr/local/lib/fpc;
+ FPC_SPECIFIC_OPTIONS = "-dDEBUGFILE -O- -g -gl -gw2 -gt -ghttt -Xs-";
+@@ -2423,7 +2423,7 @@
+ 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_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.0.1;
+ FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas";
+ FPC_RTL_UNITS_BASE = /usr/local/lib/fpc;
+ FPC_SPECIFIC_OPTIONS = "-Tiphonesim -dDEBUGFILE -O- -g -gl -gw2 -gt -ghttt -Xs-";
+@@ -2503,7 +2503,7 @@
+ 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_COMPILER_BINARY_DIR = /usr/local/lib/fpc/3.0.1;
+ FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas";
+ FPC_RTL_UNITS_BASE = /usr/local/lib/fpc;
+ FPC_SPECIFIC_OPTIONS = "-Ci- -Cr- -Co- -O2 -Xs -dDEBUGFILE";
--- a/tools/pas2c/Pas2C.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/tools/pas2c/Pas2C.hs Fri Apr 01 15:36:19 2016 +0200
@@ -1,4 +1,5 @@
{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE FlexibleContexts #-}
module Pas2C where
import Text.PrettyPrint.HughesPJ
--- a/tools/pas2c/PascalParser.hs Fri Sep 11 04:05:09 2015 +0200
+++ b/tools/pas2c/PascalParser.hs Fri Apr 01 15:36:19 2016 +0200
@@ -239,10 +239,10 @@
] <?> "range declaration"
where
rangeft = do
- e1 <- initExpression
- string' ".."
- e2 <- initExpression
- return $ RangeFromTo e1 e2
+ e1 <- initExpression
+ string' ".."
+ e2 <- initExpression
+ return $ RangeFromTo e1 e2
typeVarDeclaration :: Bool -> Parsec String u [TypeVarDeclaration]
typeVarDeclaration isImpl = (liftM concat . many . choice) [
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/pas2c/pas2c.cabal Fri Apr 01 15:36:19 2016 +0200
@@ -0,0 +1,30 @@
+Name: pas2c
+Version: 0.1
+Synopsis: pas2c
+Description: pas2c
+Homepage: http://www.hedgewars.org/
+License: GPL-2
+Author: unC0Rr
+Maintainer: unC0Rr@hedgewars.org
+Category: Converter
+Build-type: Simple
+Cabal-version: >=1.10
+
+
+Executable pas2c
+ main-is: Main.hs
+
+ default-language: Haskell2010
+
+ build-depends:
+ base >= 4.3,
+ containers,
+ mtl >= 2,
+ parsec,
+ pretty,
+ transformers
+
+ if !os(windows)
+ build-depends: unix
+
+ ghc-options: -O2
--- a/tools/rgit2hg.sh Fri Sep 11 04:05:09 2015 +0200
+++ b/tools/rgit2hg.sh Fri Apr 01 15:36:19 2016 +0200
@@ -26,7 +26,7 @@
echo "Checking $url ..."
echo
page=$(wget -q -O- "$url")
- author=$(echo "$page" | sed -rn 's/^.*"author-name">(<[^>]*>)*([^ <]*).*/\2/ p')
+ author=$(echo "$page" | sed -rn '1,/"user-mention"/{s/^.*"user-mention"( *[^>]*)?> *([^ <]*).*$/\2/ p}')
if [ -z "$author" ]; then
echo 'Couldn'\''t find author! Skipping '"$1"' ...' >&2
shift
@@ -45,13 +45,18 @@
echo
result=$(hg log -R "$HW_HG" -u "$author" -d "$date" -v -l1)
if [ -z "$result" ]; then
+ echo 'No match with this author'\''s name. It might differ, so let'\''s try using date only ...'
+ echo
+ result=$(hg log -R "$HW_HG" -d "$date" -v)
+ fi
+ if [ -z "$result" ]; then
echo 'No match :('
shift
continue
fi
rev=$(echo "$result" | sed 's/^.*://;q')
echo 'Found match: r'"$rev"
- echo 'Link: https://code.google.com/p/hedgewars/source/detail?r='"$rev"
+ echo 'Link: http://hg.hedgewars.org/hedgewars/rev/'"$rev"
echo
echo "$result"
# proceed to next parameter