Merge pull request #2 from supertuxkart/master

Update fork
This commit is contained in:
Alayan-stk-2 2018-04-11 02:06:19 +02:00 committed by GitHub
commit ee0b64eb69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
90 changed files with 3581 additions and 1241 deletions

View File

@ -106,7 +106,7 @@ location, specify `CMAKE_INSTALL_PREFIX` when running cmake, e.g.:
To Build SuperTuxKart on Windows, follow these instructions:
1. Download and install Visual Studio from here: [Visual Studio - Download](https://www.visualstudio.com/downloads/). The free Visual Studio Community edition works fine.
2. Download the SuperTuxKart source package from either [SuperTuxKart download area - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/0.9.2) or [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), and unpack it.
2. Download the SuperTuxKart source package from either [SuperTuxKart download area - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/) or [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), and unpack it.
*Note: If you downloaded the source package from here: [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), then both `stk-code` and `stk-assets` **must** be in the same directory, otherwise the build can result in failure*
3. Download the Windows dependencies package from either [SuperTuxKart download area: Dependencies - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart%20Dependencies/Windows/)
or [SuperTuxKart on GitHub - Dependencies](https://github.com/supertuxkart/dependencies), and unpack it; then, copy the `dependencies` directory from either the `windows` or the `windows_64bit` directories into the `stk-code` directory, rename it to `dependencies-64bit` if you want to compile a 64bit build.

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.supertuxkart.stk"
package="org.supertuxkart.stk_dbg"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto">
@ -12,7 +12,8 @@
android:hasCode="false"
android:isGame="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:hardwareAccelerated="true">
android:hardwareAccelerated="true"
android:resizeableActivity="false">
<activity android:name="android.app.NativeActivity"
android:label="@string/app_name"
@ -32,7 +33,7 @@
</application>
<uses-sdk android:minSdkVersion="19"
android:targetSdkVersion="21" />
android:targetSdkVersion="26" />
<uses-feature android:glEsVersion="0x00020000" />
<uses-feature android:name="android.software.leanback" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

View File

@ -23,32 +23,32 @@ export ARCH_ARMV7=arm
export HOST_ARMV7=arm-linux-androideabi
export NDK_PLATFORM_ARMV7=android-19
export MIN_SDK_VERSION_ARMV7=19
export TARGET_SDK_VERSION_ARMV7=21
export COMPILE_SDK_VERSION_ARMV7=21
export TARGET_SDK_VERSION_ARMV7=26
export COMPILE_SDK_VERSION_ARMV7=26
export NDK_ABI_AARCH64=arm64-v8a
export ARCH_AARCH64=arm64
export HOST_AARCH64=aarch64-linux-android
export NDK_PLATFORM_AARCH64=android-21
export MIN_SDK_VERSION_AARCH64=21
export TARGET_SDK_VERSION_AARCH64=21
export COMPILE_SDK_VERSION_AARCH64=21
export TARGET_SDK_VERSION_AARCH64=26
export COMPILE_SDK_VERSION_AARCH64=26
export NDK_ABI_X86=x86
export ARCH_X86=x86
export HOST_X86=i686-linux-android
export NDK_PLATFORM_X86=android-19
export MIN_SDK_VERSION_X86=19
export TARGET_SDK_VERSION_X86=21
export COMPILE_SDK_VERSION_X86=21
export TARGET_SDK_VERSION_X86=26
export COMPILE_SDK_VERSION_X86=26
export NDK_ABI_X86_64=x86_64
export ARCH_X86_64=x86_64
export HOST_X86_64=x86_64-linux-android
export NDK_PLATFORM_X86_64=android-21
export MIN_SDK_VERSION_X86_64=21
export TARGET_SDK_VERSION_X86_64=21
export COMPILE_SDK_VERSION_X86_64=21
export TARGET_SDK_VERSION_X86_64=26
export COMPILE_SDK_VERSION_X86_64=26
export APP_NAME_RELEASE="SuperTuxKart"
export PACKAGE_NAME_RELEASE="org.supertuxkart.stk"

View File

@ -13,7 +13,7 @@ SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
execute_process(COMMAND sh -c "ls /usr/lib/gcc/x86_64-w64-mingw32/ | grep posix | tr -d '\n'" OUTPUT_VARIABLE MINGW_DEPS_FOLDER)
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32 /usr/lib/gcc/x86_64-w64-mingw32/${MINGW_DEPS_FOLDER}/ ${PROJECT_SOURCE_DIR}/dependencies-64bit)
SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32 /usr/lib/gcc/x86_64-w64-mingw32/${MINGW_DEPS_FOLDER}/ ${PROJECT_SOURCE_DIR}/dependencies-mingw-64bit ${PROJECT_SOURCE_DIR}/dependencies-64bit)
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search

View File

@ -13,7 +13,7 @@ SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
execute_process(COMMAND sh -c "ls /usr/lib/gcc/i686-w64-mingw32/ | grep posix | tr -d '\n'" OUTPUT_VARIABLE MINGW_DEPS_FOLDER)
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr/lib/gcc/i686-w64-mingw32/${MINGW_DEPS_FOLDER}/ ${PROJECT_SOURCE_DIR}/dependencies)
SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr/lib/gcc/i686-w64-mingw32/${MINGW_DEPS_FOLDER}/ ${PROJECT_SOURCE_DIR}/dependencies-mingw ${PROJECT_SOURCE_DIR}/dependencies)
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search

View File

@ -2,7 +2,7 @@
Icons firstly made for SuperTuxKart UI on Android.
Files: blur_bg_button ; blur_bg_button_focus ; directionnal_wheel ; drift ; nitro ; nitro_empty ; pause ; thunderbird_reset ; wing_mirror
Files: blur_bg_button ; blur_bg_button_focus ; steering_wheel ; drift ; nitro ; nitro_empty ; pause ; thunderbird_reset ; wing_mirror
- CC BY-SA 4.0 / author: Néd J. Édoire
# License information:

View File

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -3,15 +3,15 @@
<div x="2%" y="2%" width="96%" height="96%" layout="vertical-row" >
<spacer height="2%" width="25"/>
<box width="100%" height="fit" padding="10" layout="vertical-row">
<box width="100%" height="75%" padding="10" layout="vertical-row">
<bright width="100%" text="Select a type of control that you prefer" align="center" text_align="left" />
<spacer height="15%" width="10"/>
<ribbon id="control_type" height="135" width="100%" align="center">
<icon-button id="accelerometer" width="128" height="128" icon="gui/difficulty_medium.png"
<ribbon id="control_type" height="60%" width="100%" align="center">
<icon-button id="accelerometer" width="fit" height="fit" icon="gui/difficulty_medium.png"
I18N="Control type" text="Accelerometer"/>
<icon-button id="steering_wheel" width="128" height="128" icon="gui/difficulty_hard.png"
<icon-button id="steering_wheel" width="fit" height="fit" icon="gui/difficulty_hard.png"
I18N="Control type" text="Steering wheel"/>
</ribbon>
</box>

View File

@ -5,10 +5,11 @@
<header height="5%" width="80%" text="Race Setup" align="center" text_align="center" />
<spacer height="5%" width="25"/>
<box width="100%" height="40%" padding="10" layout="vertical-row">
<bright width="100%" text="Select a difficulty" align="center" text_align="left" />
<ribbon id="difficulty" height="60%" width="100%" align="center">
<bright width="100%" text="Select a difficulty" align="center" text_align="left" />
<spacer height="10" width="25"/>
<box width="100%" proportion="3" padding="10" layout="vertical-row">
<ribbon id="difficulty" height="85%" width="100%" align="center">
<icon-button id="novice" width="fit" height="fit" icon="gui/difficulty_easy.png"
I18N="Difficulty" text="Novice"/>
<icon-button id="intermediate" width="fit" height="fit" icon="gui/difficulty_medium.png"
@ -21,10 +22,12 @@
</box>
<spacer height="5%" width="25"/>
<box width="100%" height="40%" padding="10" layout="vertical-row">
<bright width="100%" text="Select a game mode" align="center" text_align="left" />
<scrollable_toolbar id="gamemode" height="60%" width="85%" label_location="bottom" align="center"
<bright width="100%" text="Select a game mode" align="center" text_align="left" />
<spacer height="10" width="25"/>
<box width="100%" proportion="4" padding="10" layout="vertical-row">
<spacer height="5%" width="25" />
<scrollable_toolbar id="gamemode" height="60%" width="95%" label_location="bottom" align="center"
child_width="256" child_height="256" />
<spacer proportion="1" width="25" />
</box>

File diff suppressed because it is too large Load Diff

View File

@ -4,14 +4,14 @@
#
# Translators:
# , 2015
# Viktar Vauchkevich, 2017
# Viktar Vauchkevich, 2017-2018
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-01-18 18:02+0000\n"
"Last-Translator: Viktar Vauchkevich\n"
"Language-Team: Belarusian (http://www.transifex.com/supertuxkart/supertuxkart/language/be/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -49,7 +49,7 @@ msgstr "Марафонец"
#. I18N: ./data/achievements.xml
msgid "Make a race with 5 laps or more."
msgstr "Зрабі гонку на 5 ці больш кругоў."
msgstr "Зрабі гонку на 5 ці больш колаў."
#. I18N: ./data/achievements.xml
msgid "Skid-row"
@ -57,7 +57,7 @@ msgstr "Дрыфтэр"
#. I18N: ./data/achievements.xml
msgid "Make 5 skidding in a single lap."
msgstr "Зрабі 5 заносаў за 1 круг."
msgstr "Зрабі 5 заносаў за 1 кола."
#. I18N: ./data/achievements.xml
msgid "Gold driver"
@ -274,7 +274,7 @@ msgstr "Стваральнікі"
#. I18N: ./data/gui/custom_video_settings.stkgui
msgid "Graphics Settings"
msgstr "Настаўленні графікі"
msgstr "Налады графікі"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
@ -299,7 +299,7 @@ msgstr "Зіхаценне (Bloom)"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Light shaft (God rays)"
msgstr "Промні святла"
msgstr "Промні святла (гало)"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
@ -354,17 +354,17 @@ msgstr "Анімацыя персанажаў"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Rendered image quality"
msgstr ""
msgstr "Якасць апрацаванай выявы"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Geometry detail"
msgstr ""
msgstr "Дэталі геаметрыі"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "* Restart STK to apply new settings"
msgstr "* Перазапусціце STK, каб ужыць новыя настаўленні"
msgstr "* Перазапусціце STK, каб ужыць новыя налады"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: ./data/gui/multitouch_settings.stkgui
@ -620,11 +620,11 @@ msgstr "Сумесная гульня"
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Bananas"
msgstr ""
msgstr "Бананы"
#. I18N: ./data/gui/help1.stkgui
msgid "Start the tutorial"
msgstr ""
msgstr "Пачаць навучанне"
#. I18N: ./data/gui/help1.stkgui
#. I18N: In the help menu
@ -656,7 +656,7 @@ msgstr "Калі вы бачыце замок, то гэта азначае, ш
#. I18N: ./data/gui/help1.stkgui
#. I18N: in the help menu
msgid "The 'skidding' key allows you to skid in sharp turns and get a boost."
msgstr "Кнопка «заноса» дазваляе слізгаць у крутым павароце і атрымаць паскарэнне."
msgstr "Кнопка «заносу» дазваляе слізгаць у крутым павароце і атрымаць паскарэнне."
#. I18N: ./data/gui/help1.stkgui
#. I18N: in the help screen
@ -796,24 +796,24 @@ msgstr "Пасля настройкі прылад увода вы гатовы
msgid ""
"Hitting a banana can result in one of the following being attached to the "
"kart:"
msgstr ""
msgstr "Наезд на банан прывядзе да далучэння да карта аднаго з наступных прадметаў:"
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid "Anchor - slows down the kart."
msgstr ""
msgstr "Якар запавольвае карт."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid "Parachute - slows down the kart less than the anchor."
msgstr ""
msgstr "Парашут запавольвае карт менш, чым якар."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid ""
"Bomb - detonates after a short amount of time to throw the kart up in the "
"air. Bump into another kart to transfer the bomb to another player."
msgstr ""
msgstr "Бомба ўзрываецца пасля кароткага прамежку часу і падкідвае карт у паветра. Ударце іншы карт каб перадаць бомбу іншаму гульцу."
#. I18N: ./data/gui/karts.stkgui
#. I18N: In the kart selection (player setup) screen
@ -902,46 +902,46 @@ msgstr "Выйсці"
#. I18N: ./data/gui/multitouch_settings.stkgui
msgid "Touch Device Settings"
msgstr ""
msgstr "Налады сэнсарнай прылады"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Device enabled"
msgstr ""
msgstr "Пралада ўключаная"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Inverted buttons"
msgstr ""
msgstr "Інвертаваныя кнопкі"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Buttons scale"
msgstr ""
msgstr "Маштаб кнопак"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Accelerometer"
msgstr ""
msgstr "Паскарэнне"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Advanced"
msgstr ""
msgstr "Пашыраныя"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Deadzone"
msgstr ""
msgstr "Мёртвая зона"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Sensitivity"
msgstr ""
msgstr "Адчувальнасць"
#. I18N: ./data/gui/multitouch_settings.stkgui
msgid "Restore defaults"
msgstr ""
msgstr "Аднавіць агаданыя"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
@ -1232,7 +1232,7 @@ msgstr "Хуткая гульня"
#. I18N: Section in the profile screen
#: src/states_screens/online_profile_base.cpp:113
msgid "Account Settings"
msgstr "Настаўленні конта"
msgstr "Налады конту"
#. I18N: ./data/gui/online/profile_settings.stkgui
#. I18N: In the online account settings screen
@ -1248,7 +1248,7 @@ msgstr "Змяніць"
#. I18N: ./data/gui/online/recovery_input.stkgui
#. I18N: In the recovery dialog
msgid "Account Recovery"
msgstr "Аднаўленне конта"
msgstr "Аднаўленне конту"
#. I18N: ./data/gui/online/recovery_info.stkgui
#. I18N: In the recovery dialog
@ -1326,7 +1326,7 @@ msgid ""
"You can play without creating an online account by selecting an offline "
"account. Though then you can not connect to friends, vote for addons etc. "
"Please read our privacy statement at http://privacy.supertuxkart.net"
msgstr "Вы можаце гуляць без стварэння анлайн-конта, выбраўшы афлайн-конт. Але пры гэтым вы не зможаце злучыцца з сябрамі, галасаваць за дадаткі і інш. Азнаёмцеся з нашай заявай аб канфідэнцыйнасці на http://privacy.supertuxkart.net"
msgstr "Вы можаце гуляць без стварэння анлайн-конту, выбраўшы афлайн-конт. Але пры гэтым вы не зможаце злучыцца з сябрамі, галасаваць за дадаткі і інш. Азнаёмцеся з нашай заявай аб канфідэнцыйнасці на http://privacy.supertuxkart.net"
#. I18N: ./data/gui/online/registration_terms.stkgui
#. I18N: In the registration dialog
@ -1564,7 +1564,7 @@ msgstr "Узровень графічных эфектаў"
#. I18N: ./data/gui/options_video.stkgui
#. I18N: In the video settings
msgid "Custom settings..."
msgstr "Свае настаўленні"
msgstr "Асабістыя налады…"
#. I18N: ./data/gui/options_video.stkgui
#. I18N: In the video settings
@ -1762,7 +1762,7 @@ msgstr "Баявая выспа"
#. I18N: ../stk-assets/tracks/candela_city/track.xml
msgid "Candela City"
msgstr ""
msgstr "Горад Кандэла"
#. I18N: ../stk-assets/tracks/cave/track.xml
msgid "Cave X"
@ -1774,7 +1774,7 @@ msgstr "Храм какавы"
#. I18N: ../stk-assets/tracks/cornfield_crossing/track.xml
msgid "Cornfield Crossing"
msgstr ""
msgstr "Кукурузнае перакрыжаванне"
#. I18N: ../stk-assets/tracks/fortmagma/track.xml
msgid "Fort Magma"
@ -1799,7 +1799,7 @@ msgstr "Ледзяное футбольнае поле"
#. I18N: Cutscene subtitle from ../stk-assets/tracks/introcutscene2/scene.xml
#. I18N: ../stk-assets/tracks/introcutscene2/scene.xml
msgid "What's wrong, little hippies? Your great gnu leader is missing?"
msgstr "Штосці не так, маленькі хіпі? Твой вялікі гну лідар знік?"
msgstr "Штосці не так, маленькі хіпі? Твой вялікі лідар гну знік?"
#. I18N: Cutscene subtitle from ../stk-assets/tracks/introcutscene2/scene.xml
#. I18N: ../stk-assets/tracks/introcutscene2/scene.xml
@ -1825,7 +1825,7 @@ msgstr "Але ты, гаротны валацуга, ніколі не змож
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
msgstr ""
msgstr "Лас-Дунас-Арэна"
#. I18N: ../stk-assets/tracks/lighthouse/track.xml
msgid "Around the lighthouse"
@ -1921,7 +1921,7 @@ msgstr "Хекслі"
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
msgstr ""
msgstr "Кікі"
#. I18N: ../stk-assets/karts/konqi/kart.xml
msgid "Konqi"
@ -1970,7 +1970,7 @@ msgstr "Завершанае дасягненне «%s»."
#: src/addons/addons_manager.cpp:104 src/addons/news_manager.cpp:322
msgid "Failed to connect to the SuperTuxKart add-ons server."
msgstr ""
msgstr "Не атрымалася злучыцца з северам дадаткаў SuperTuxKart."
#: src/addons/news_manager.cpp:179
#, c-format
@ -2042,16 +2042,16 @@ msgstr "Ваш файл канфігурацыі занадта стары. Ён
#: src/graphics/irr_driver.cpp:535
msgid "Video recording started."
msgstr ""
msgstr "Пачаўся запіс відэа."
#: src/graphics/irr_driver.cpp:541
#, c-format
msgid "Video saved in \"%s\"."
msgstr ""
msgstr "Відэа захаванае ў «%s»."
#: src/graphics/irr_driver.cpp:545
msgid "Encoding progress:"
msgstr ""
msgstr "Прагрэс кадавання:"
#: src/graphics/irr_driver.cpp:1682
#, c-format
@ -2726,11 +2726,11 @@ msgstr "Не едзьце да сігналу!"
#: src/karts/controller/spare_tire_ai.cpp:147
msgid "You can have at most 3 lives!"
msgstr ""
msgstr "Вы можаце мець максімум 3 жыцці!"
#: src/karts/controller/spare_tire_ai.cpp:153
msgid "+1 life."
msgstr ""
msgstr "+1 жыццё."
#: src/karts/kart.cpp:908 src/karts/kart.cpp:913
msgid "You won the race!"
@ -2753,7 +2753,7 @@ msgstr "SuperTuxKart можа падлучацца да сервера, каб
#: src/main.cpp:1654
msgid "Your screen resolution is too low to run STK."
msgstr ""
msgstr "Разрозненне вашага экрана занадта малое для STK."
#: src/main.cpp:1668
msgid ""
@ -2803,10 +2803,10 @@ msgstr "НЯПРАВІЛЬНЫ НАПРАМАК!"
#, c-format
msgid "%i spare tire kart has been spawned!"
msgid_plural "%i spare tire karts have been spawned!"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[0] "%i запаска для карта з'явілася!"
msgstr[1] "%i запаскі для карта з'явіліся!"
msgstr[2] "%i запасак для карта з'явілася!"
msgstr[3] "%i запасак для карта з'явілася!"
#: src/modes/world.cpp:1202
msgid "You have been eliminated!"
@ -2820,7 +2820,7 @@ msgstr "«%s» дыскваліфікаваны."
#: src/network/protocols/server_lobby.cpp:318
#, c-format
msgid "Failed to register server: %s"
msgstr ""
msgstr "Не атрымалася зарэгістраваць сервер: %s"
#: src/network/servers_manager.cpp:198
msgid "No LAN server detected"
@ -3149,7 +3149,7 @@ msgstr "Адключана"
#: src/states_screens/dialogs/custom_video_settings.cpp:67
#: src/states_screens/options_screen_video.cpp:462
msgid "Important only"
msgstr ""
msgstr "Толькі важнае"
#. I18N: animations setting (only karts with human players are animated)
#: src/states_screens/dialogs/custom_video_settings.cpp:74
@ -3168,7 +3168,7 @@ msgstr "Для ўсіх"
#: src/states_screens/dialogs/custom_video_settings.cpp:102
#: src/states_screens/options_screen_video.cpp:469
msgid "Low"
msgstr ""
msgstr "Нізкі"
#. I18N: Geometry level high : everything is displayed
#. I18N: in the graphical options tooltip;
@ -3178,21 +3178,21 @@ msgstr ""
#: src/states_screens/dialogs/custom_video_settings.cpp:103
#: src/states_screens/options_screen_video.cpp:472
msgid "High"
msgstr ""
msgstr "Высокі"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very low
#: src/states_screens/dialogs/custom_video_settings.cpp:94
#: src/states_screens/options_screen_video.cpp:466
msgid "Very Low"
msgstr ""
msgstr "Вельмі нізкі"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very high
#: src/states_screens/dialogs/custom_video_settings.cpp:97
#: src/states_screens/options_screen_video.cpp:475
msgid "Very High"
msgstr ""
msgstr "Вельмі высокі"
#: src/states_screens/dialogs/message_dialog.cpp:129
#: src/states_screens/edit_gp_screen.cpp:257
@ -3202,11 +3202,11 @@ msgstr "Не"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:60
msgid "Tablet"
msgstr ""
msgstr "Планшэт"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:61
msgid "Phone"
msgstr ""
msgstr "Тэлефон"
#: src/states_screens/dialogs/recovery_dialog.cpp:121
msgid "Username and/or email address invalid."
@ -3220,7 +3220,7 @@ msgid ""
"the box below, you are confirming that you understand these terms. If you "
"have any questions or comments regarding these terms, one of the members of "
"the development team would gladly assist you."
msgstr ""
msgstr "Калі ласка, азнаёмцеся з умовамі карыстання SuperTuxKart на «%s». Вы павінны пагадзіцца з гэтымі ўмовамі для таго, каб зарэгістраваць конт для STK. Усталяваўшы сцяжок ніжэй, вы пацвярджаеце, што вы разумееце гэтыя ўмовы. Калі вы маеце пытанні ці каменты адносна ўмоў, адзін з чальцоў каманды распрацоўнікаў з задавальненнем дапаможа вам."
#: src/states_screens/dialogs/select_challenge.cpp:52
#, c-format
@ -3390,7 +3390,7 @@ msgstr "Час фінішу"
#: src/states_screens/ghost_replay_selection.cpp:83
msgid "User"
msgstr ""
msgstr "Карыстальнік"
#: src/states_screens/gp_info_screen.cpp:74
msgid "Default"
@ -3674,7 +3674,7 @@ msgstr "Клавіятура %i"
#: src/states_screens/options_screen_input.cpp:138
msgid "Touch Device"
msgstr ""
msgstr "Сэнсарная прылада"
#: src/states_screens/options_screen_ui.cpp:159
msgid ""
@ -3785,7 +3785,7 @@ msgstr "Глабальнае асвятленне: %s"
#: src/states_screens/options_screen_video.cpp:534
#, c-format
msgid "Rendered image quality: %s"
msgstr ""
msgstr "Якасць апрацаванай выявы: %s"
#: src/states_screens/race_gui.cpp:358 src/states_screens/race_gui.cpp:360
msgid "Challenge Failed"
@ -3842,7 +3842,7 @@ msgstr "Ранг"
#: src/states_screens/race_gui_overworld.cpp:518
msgid "Press fire to start the tutorial"
msgstr ""
msgstr "Націсніце Атаку, каб пачаць навучанне"
#: src/states_screens/race_gui_overworld.cpp:557
msgid "Type: Grand Prix"
@ -3989,7 +3989,7 @@ msgstr "Некарэктны Email!"
msgid ""
"You will receive an email with further instructions regarding account "
"activation. Please be patient and be sure to check your spam folder."
msgstr "Вы атрымаеце электронны ліст з далейшымі інструкцыямі для актывацыі конта. Калі ласка, будзьце церпялівымі і не забудзьце праверыць тэчку са спамам."
msgstr "Вы атрымаеце электронны ліст з далейшымі інструкцыямі для актывацыі конту. Калі ласка, будзьце церпялівымі і не забудзьце праверыць тэчку са спамам."
#: src/states_screens/register_screen.cpp:402
#: src/states_screens/user_screen.cpp:338
@ -4133,7 +4133,7 @@ msgstr "Ой! Калі ў вас праблемы, націсніце <%s> дл
msgid ""
"Accelerate and press the <%s> key while turning to skid. Skidding for a "
"short while can help you turn faster to take sharp turns."
msgstr "Разганіцеся і націсніце <%s> пад час заноса. Коўзанне дапаможа вам прайсць крутыя павароты хутчэй."
msgstr "Разганіцеся і націсніце <%s> пад час заносу. Коўзанне дапаможа вам прайсць крутыя павароты хутчэй."
#: ../stk-assets/tracks/tutorial/scripting.as:77
#: ../stk-assets/tracks/tutorial/triggers.as:78

View File

@ -6,7 +6,7 @@
# Alan Monfort <alan.monfort@free.fr>, 2015-2016
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013
# Gwenn M <tornoz@laposte.net>, 2015
# Irriep Nala Novram <allannkorh@yahoo.fr>, 2017
# Irriep Nala Novram <allannkorh@yahoo.fr>, 2017-2018
# Irriep Nala Novram <allannkorh@yahoo.fr>, 2016
# Irriep Nala Novram <allannkorh@yahoo.fr>, 2016
msgid ""
@ -14,8 +14,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-01-08 18:45+0000\n"
"Last-Translator: Irriep Nala Novram <allannkorh@yahoo.fr>\n"
"Language-Team: Breton (http://www.transifex.com/supertuxkart/supertuxkart/language/br/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -624,11 +624,11 @@ msgstr "Liesc'hoarier"
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Bananas"
msgstr ""
msgstr "Bananez"
#. I18N: ./data/gui/help1.stkgui
msgid "Start the tutorial"
msgstr ""
msgstr "Kregiñ gant an tutorial"
#. I18N: ./data/gui/help1.stkgui
#. I18N: In the help menu
@ -931,21 +931,21 @@ msgstr ""
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Advanced"
msgstr ""
msgstr "Aroakaet"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Deadzone"
msgstr ""
msgstr "Zonennvarv"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Sensitivity"
msgstr ""
msgstr "Kizidigezh"
#. I18N: ./data/gui/multitouch_settings.stkgui
msgid "Restore defaults"
msgstr ""
msgstr "Adderaouekaat"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
@ -1766,7 +1766,7 @@ msgstr "Enezenn ar gad"
#. I18N: ../stk-assets/tracks/candela_city/track.xml
msgid "Candela City"
msgstr ""
msgstr "Kêr Gandela"
#. I18N: ../stk-assets/tracks/cave/track.xml
msgid "Cave X"
@ -1925,7 +1925,7 @@ msgstr "Heksley"
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
msgstr ""
msgstr "Kiki"
#. I18N: ../stk-assets/karts/konqi/kart.xml
msgid "Konqi"
@ -2732,7 +2732,7 @@ msgstr ""
#: src/karts/controller/spare_tire_ai.cpp:153
msgid "+1 life."
msgstr ""
msgstr "+1 vuhez."
#: src/karts/kart.cpp:908 src/karts/kart.cpp:913
msgid "You won the race!"
@ -3160,7 +3160,7 @@ msgstr "Gweredekaet evit an holl anezho"
#: src/states_screens/dialogs/custom_video_settings.cpp:102
#: src/states_screens/options_screen_video.cpp:469
msgid "Low"
msgstr ""
msgstr "Izel"
#. I18N: Geometry level high : everything is displayed
#. I18N: in the graphical options tooltip;
@ -3170,21 +3170,21 @@ msgstr ""
#: src/states_screens/dialogs/custom_video_settings.cpp:103
#: src/states_screens/options_screen_video.cpp:472
msgid "High"
msgstr ""
msgstr "Uhel"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very low
#: src/states_screens/dialogs/custom_video_settings.cpp:94
#: src/states_screens/options_screen_video.cpp:466
msgid "Very Low"
msgstr ""
msgstr "Izel-kenañ"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very high
#: src/states_screens/dialogs/custom_video_settings.cpp:97
#: src/states_screens/options_screen_video.cpp:475
msgid "Very High"
msgstr ""
msgstr "Uhel-kenañ"
#: src/states_screens/dialogs/message_dialog.cpp:129
#: src/states_screens/edit_gp_screen.cpp:257
@ -3194,11 +3194,11 @@ msgstr "Ket"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:60
msgid "Tablet"
msgstr ""
msgstr "Tabletezenn"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:61
msgid "Phone"
msgstr ""
msgstr "Pellgomz"
#: src/states_screens/dialogs/recovery_dialog.cpp:121
msgid "Username and/or email address invalid."
@ -3382,7 +3382,7 @@ msgstr "Amzer echuiñ"
#: src/states_screens/ghost_replay_selection.cpp:83
msgid "User"
msgstr ""
msgstr "Implijer"
#: src/states_screens/gp_info_screen.cpp:74
msgid "Default"

View File

@ -4,7 +4,7 @@
#
# Translators:
# Jakub Vaněk <vanek.jakub4@seznam.cz>, 2015-2016
# Pavel Borecki <pavel.borecki@gmail.com>, 2015-2017
# Pavel Borecki <pavel.borecki@gmail.com>, 2015-2018
# ToMáš Marný, 2015
# ToMáš Marný, 2015-2016
msgid ""
@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: ToMáš Marný\n"
"PO-Revision-Date: 2018-01-02 07:15+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech (http://www.transifex.com/supertuxkart/supertuxkart/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -2049,7 +2049,7 @@ msgstr "Zahájeno nahrávání videa."
#: src/graphics/irr_driver.cpp:541
#, c-format
msgid "Video saved in \"%s\"."
msgstr "Video uloženo do \"%s\"."
msgstr "Video uloženo do „%s“."
#: src/graphics/irr_driver.cpp:545
msgid "Encoding progress:"
@ -2058,7 +2058,7 @@ msgstr "Průběh enkódování:"
#: src/graphics/irr_driver.cpp:1682
#, c-format
msgid "FPS: %d/%d/%d - %d KTris"
msgstr "FPS: %d/%d/%d - %d tisíc trojúhelníků"
msgstr "Sním./s.: %d/%d/%d %d tisíc trojúhelníků"
#: src/guiengine/engine.cpp:1296
msgid "Loading"
@ -2687,7 +2687,7 @@ msgstr "Levý palec nahoru"
#: src/input/input_manager.cpp:807
#, c-format
msgid "Ignoring '%s'. You needed to join earlier to play!"
msgstr "Ignoruji '%s'. Musíte se do hry připojit dříve!"
msgstr "„%s“ je ignorováno. Abyste se mohli zúčastnit, je třeba se do hry připojit dříve!"
#: src/input/input_manager.cpp:837
msgid "Only the Game Master may act at this point!"
@ -2697,13 +2697,13 @@ msgstr "V tomto okamžiku může jednat pouze hráč zakládající hru!"
msgid ""
"Connect your wiimote to the Bluetooth manager, then click on Ok. Detailed "
"instructions at supertuxkart.net/Wiimote"
msgstr "Připojte svůj Wiimote ovladač do správce Bluetooth a poté klikněte na tlačítko Budiž. Podrobný návod je na supertuxkart.net/Wiimote"
msgstr "Připojte svůj Wiimote ovladač do správce Bluetooth a poté klikněte na tlačítko OK. Podrobný návod je na supertuxkart.net/Wiimote"
#: src/input/wiimote_manager.cpp:391
msgid ""
"Press the buttons 1+2 simultaneously on your wiimote to put it in discovery "
"mode, then click on Ok. Detailed instructions at supertuxkart.net/Wiimote"
msgstr "Stiskněte současně tlačítka 1 + 2 na vašem Wiimote ovladači, přepnete jej do režimu vyhledávání, poté klikněte na tlačítko Budiž. Podrobný návod je na supertuxkart.net/Wiimote"
msgstr "Stiskněte současně tlačítka 1 + 2 na svém Wiimote ovladači, přepnete jej do režimu vyhledávání, poté klikněte na tlačítko Budiž. Podrobný návod je na supertuxkart.net/Wiimote"
#: src/input/wiimote_manager.cpp:414
#, c-format
@ -2775,7 +2775,7 @@ msgstr "Vejce: %d / %d"
#: src/modes/follow_the_leader.cpp:62 src/modes/follow_the_leader.cpp:285
msgid "Leader"
msgstr "Vůdce"
msgstr "Vedoucí"
#: src/modes/linear_world.cpp:287
msgid "Final lap!"
@ -2866,7 +2866,7 @@ msgstr "Máte novou žádost o kamarádství!"
msgid ""
"Unable to connect to the server. Check your internet connection or try again"
" later."
msgstr "Nelze se připojit k serveru. Zkontrolujte své připojení k internetu a případně\npřed dalším pokusem zkuste počkat."
msgstr "Nelze se připojit k serveru. Zkontrolujte své připojení k Internetu a případně\npřed dalším pokusem zkuste počkat."
#: src/race/grand_prix_data.hpp:171
msgid "Random Grand Prix"
@ -2881,7 +2881,7 @@ msgstr "Soubor s nejvyšším skóre byl příliš starý,\nvšechna nejvyšší
#. I18N: Game mode
#: src/race/race_manager.hpp:179
msgid "Follow the Leader"
msgstr "Následujte vůdce"
msgstr "Následujte vedoucího"
#. I18N: Game mode
#: src/race/race_manager.hpp:181
@ -2991,7 +2991,7 @@ msgstr "standardní"
#: src/states_screens/kart_selection.cpp:1481
#: src/states_screens/race_setup_screen.cpp:99
msgid "Locked : solve active challenges to gain access to more!"
msgstr "Zamčeno: splň aktivní výzvy k získání přístupu!"
msgstr "Zamčeno: splňte aktivní výzvy k získání přístupu!"
#: src/states_screens/arenas_screen.cpp:339
msgid "Random Arena"

View File

@ -9,7 +9,7 @@
# Flakebi, 2015
# hiker <joerg@chiu-henrichs.id.au>, 2015
# konstin <konsti.schuetze@t-online.de>, 2015
# Maximilian Wagenbach <foaly.f@web.de>, 2016
# Maximilian Wagenbach <foaly@posteo.de>, 2016
# Tobias Markus <tobbi@supertuxproject.org>, 2015-2016
# Wasilis Mandratzis-Walz, 2015
# wesen <yannick.lapp@web.de>, 2016
@ -18,7 +18,7 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"PO-Revision-Date: 2017-11-26 08:20+0000\n"
"Last-Translator: Wuzzy <almikes@aol.com>\n"
"Language-Team: German (http://www.transifex.com/supertuxkart/supertuxkart/language/de/)\n"
"MIME-Version: 1.0\n"
@ -439,7 +439,7 @@ msgstr "Anzahl der Runden:"
#. I18N: ./data/gui/edit_track.stkgui
#. I18N: In the edit track screen
msgid "Reverse:"
msgstr "Umkehren:"
msgstr "Rückwärts:"
#. I18N: ./data/gui/edit_track.stkgui
#. I18N: ./data/gui/general_text_field_dialog.stkgui
@ -3324,7 +3324,7 @@ msgstr "Runden"
#: src/states_screens/edit_gp_screen.cpp:68
msgid "Reversed"
msgstr "Umgekehrt"
msgstr "Rückwärts"
#: src/states_screens/edit_gp_screen.cpp:124
#: src/states_screens/ghost_replay_selection.cpp:177
@ -4031,7 +4031,7 @@ msgstr "Maximal unterstützte Spieler: %d"
#. I18N: In the track info screen
#: src/states_screens/track_info_screen.cpp:213
msgid "Drive in reverse"
msgstr "Spiegelverkehrte Strecke"
msgstr "Rückwärts fahren"
#. I18N: In the track info screen
#: src/states_screens/track_info_screen.cpp:218

View File

@ -13,8 +13,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2017-11-21 20:34+0000\n"
"Last-Translator: Vangelis Skarmoutsos <skarmoutsosv@gmail.com>\n"
"Language-Team: Greek (http://www.transifex.com/supertuxkart/supertuxkart/language/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -1828,7 +1828,7 @@ msgstr "Είσαι λίγο αξιολύπητος twerps δεν θα είσαι
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
msgstr ""
msgstr "Λας Ντούνας Αρένα"
#. I18N: ../stk-assets/tracks/lighthouse/track.xml
msgid "Around the lighthouse"
@ -1924,7 +1924,7 @@ msgstr "Έξλι"
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
msgstr ""
msgstr "Kiki"
#. I18N: ../stk-assets/karts/konqi/kart.xml
msgid "Konqi"

View File

@ -5,6 +5,7 @@
# Translators:
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
# Jonas Marx <hallo@jonas-marx.com>, 2017
# Rachel Singh <rachel@moosader.com>, 2018
# Robin van der Vliet <info@robinvandervliet.nl>, 2015
# Любомир Василев, 2016
# Любомир Василев, 2016-2017
@ -13,8 +14,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-04-06 18:13+0000\n"
"Last-Translator: Rachel Singh <rachel@moosader.com>\n"
"Language-Team: Esperanto (http://www.transifex.com/supertuxkart/supertuxkart/language/eo/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -3159,7 +3160,7 @@ msgstr "Enŝaltita por ĉiuj"
#: src/states_screens/dialogs/custom_video_settings.cpp:102
#: src/states_screens/options_screen_video.cpp:469
msgid "Low"
msgstr ""
msgstr "Malalta"
#. I18N: Geometry level high : everything is displayed
#. I18N: in the graphical options tooltip;
@ -3169,21 +3170,21 @@ msgstr ""
#: src/states_screens/dialogs/custom_video_settings.cpp:103
#: src/states_screens/options_screen_video.cpp:472
msgid "High"
msgstr ""
msgstr "Alta"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very low
#: src/states_screens/dialogs/custom_video_settings.cpp:94
#: src/states_screens/options_screen_video.cpp:466
msgid "Very Low"
msgstr ""
msgstr "Malaltega"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very high
#: src/states_screens/dialogs/custom_video_settings.cpp:97
#: src/states_screens/options_screen_video.cpp:475
msgid "Very High"
msgstr ""
msgstr "Altega"
#: src/states_screens/dialogs/message_dialog.cpp:129
#: src/states_screens/edit_gp_screen.cpp:257
@ -3193,11 +3194,11 @@ msgstr "Ne"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:60
msgid "Tablet"
msgstr ""
msgstr "Tabulkomputilo"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:61
msgid "Phone"
msgstr ""
msgstr "Poŝtelefono"
#: src/states_screens/dialogs/recovery_dialog.cpp:121
msgid "Username and/or email address invalid."
@ -3381,7 +3382,7 @@ msgstr "Fina tempo"
#: src/states_screens/ghost_replay_selection.cpp:83
msgid "User"
msgstr ""
msgstr "Uzanto"
#: src/states_screens/gp_info_screen.cpp:74
msgid "Default"
@ -3958,7 +3959,7 @@ msgstr "Ne sukcesis krei ludiston '%s'."
#: src/states_screens/register_screen.cpp:277
msgid "Emails don't match!"
msgstr ""
msgstr "Retpoŝtadresoj ne estas sama!"
#: src/states_screens/register_screen.cpp:281
msgid "Online username has to be between 3 and 30 characters long!"

View File

@ -3,7 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Marc Coll Carrillo <marc.coll.carrillo@gmail.com>, 2015-2017
# Marc Coll Carrillo <marc.coll.carrillo@gmail.com>, 2015-2018
# Veronica Sanchez, 2017
# William Beltrán <wbeltranc@gmail.com>, 2016
# William Beltrán <wbeltranc@gmail.com>, 2017
@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Veronica Sanchez\n"
"PO-Revision-Date: 2018-04-07 11:31+0000\n"
"Last-Translator: Marc Coll Carrillo <marc.coll.carrillo@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/supertuxkart/supertuxkart/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -23,7 +23,7 @@ msgstr ""
#. I18N: ./data/achievements.xml
msgid "Christoffel Columbus"
msgstr "Cristófal Colón"
msgstr "Cristóbal Colón"
#. I18N: ./data/achievements.xml
msgid "Play every official track at least once."
@ -1208,7 +1208,7 @@ msgstr "Servidores"
#. I18N: ./data/gui/online/profile_servers.stkgui
msgid "Local Networking"
msgstr "Red Local"
msgstr "Red local"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: In the online multiplayer screen
@ -1223,7 +1223,7 @@ msgstr "Crear servidor"
#. I18N: ./data/gui/online/profile_servers.stkgui
msgid "Global Networking"
msgstr "Red Global"
msgstr "Red global"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: In the online multiplayer screen
@ -1395,7 +1395,7 @@ msgstr "Votar"
#. I18N: ./data/gui/online/waiting_for_others.stkgui
#. I18N: Networking screen
msgid "Waiting for the others..."
msgstr "Esperando a los otros..."
msgstr "Esperando a los demás..."
#. I18N: ./data/gui/options_audio.stkgui
#. I18N: ./data/gui/options_device.stkgui
@ -3376,7 +3376,7 @@ msgstr "Has desbloqueado el campeonato %0"
#: src/states_screens/ghost_replay_selection.cpp:82
msgid "Finish Time"
msgstr "Tiempo de Llegada"
msgstr "Tiempo de llegada"
#: src/states_screens/ghost_replay_selection.cpp:83
msgid "User"
@ -3895,7 +3895,7 @@ msgstr "Empatados"
#: src/states_screens/race_result_gui.cpp:1098
#: src/states_screens/race_result_gui.cpp:1154
msgid "(Own Goal)"
msgstr "(Autogol)"
msgstr "(En propia puerta)"
#: src/states_screens/race_result_gui.cpp:1220
#, c-format
@ -4020,7 +4020,7 @@ msgstr "Circuito creado por %s"
#: src/states_screens/track_info_screen.cpp:120
#, c-format
msgid "Max players supported: %d"
msgstr "Jugadores máximos soportados: %d"
msgstr "Máximos jugadores permitidos: %d"
#. I18N: In the track info screen
#: src/states_screens/track_info_screen.cpp:213

View File

@ -3,14 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Aaron Kearns <ajkearns6@gmail.com>, 2017
# Aaron Kearns <ajkearns6@gmail.com>, 2017-2018
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-02-21 22:27+0000\n"
"Last-Translator: Aaron Kearns <ajkearns6@gmail.com>\n"
"Language-Team: Irish (http://www.transifex.com/supertuxkart/supertuxkart/language/ga/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -20,7 +20,7 @@ msgstr ""
#. I18N: ./data/achievements.xml
msgid "Christoffel Columbus"
msgstr ""
msgstr "Christoffel Columbus"
#. I18N: ./data/achievements.xml
msgid "Play every official track at least once."
@ -544,7 +544,7 @@ msgstr "Athainmnigh"
#. I18N: ./data/gui/grand_prix_lose.stkgui
#. I18N: ./data/gui/grand_prix_win.stkgui
msgid "Save Grand Prix"
msgstr ""
msgstr "Sábháil Grand Prix"
#. I18N: ./data/gui/help1.stkgui
#. I18N: ./data/gui/help2.stkgui
@ -1892,7 +1892,7 @@ msgstr "Gairdín Zen"
#. I18N: ../stk-assets/karts/adiumy/kart.xml
msgid "Adiumy"
msgstr ""
msgstr "Adiumy"
#. I18N: ../stk-assets/karts/amanda/kart.xml
msgid "Amanda"
@ -1904,7 +1904,7 @@ msgstr ""
#. I18N: ../stk-assets/karts/emule/kart.xml
msgid "Emule"
msgstr ""
msgstr "Emule"
#. I18N: ../stk-assets/karts/gavroche/kart.xml
msgid "Gavroche"
@ -1916,7 +1916,7 @@ msgstr "Gnu"
#. I18N: ../stk-assets/karts/hexley/kart.xml
msgid "Hexley"
msgstr ""
msgstr "Hexley"
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
@ -1936,7 +1936,7 @@ msgstr "Pidgin"
#. I18N: ../stk-assets/karts/puffy/kart.xml
msgid "Puffy"
msgstr ""
msgstr "Puffy"
#. I18N: ../stk-assets/karts/sara_the_racer/kart.xml
msgid "Sara the Racer"
@ -2172,13 +2172,13 @@ msgstr ""
#: src/input/binding.cpp:144
msgctxt "input_key"
msgid "Kana"
msgstr ""
msgstr "Kana"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:146
msgctxt "input_key"
msgid "Junja"
msgstr ""
msgstr "Junja"
#. I18N: input configuration screen: keyboard key
#. I18N: input configuration screen: keyboard key

View File

@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"PO-Revision-Date: 2017-11-15 14:31+0000\n"
"Last-Translator: GunChleoc\n"
"Language-Team: Gaelic, Scottish (http://www.transifex.com/supertuxkart/supertuxkart/language/gd/)\n"
"MIME-Version: 1.0\n"
@ -608,7 +608,7 @@ msgstr "Modhan-\r\ngeama"
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Multi-player"
msgstr "Ioma-chluicheadair"
msgstr "Ioma-\nchluicheadair"
#. I18N: ./data/gui/help1.stkgui
#. I18N: Tab in help menu

View File

@ -8,6 +8,7 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010
# GenghisKhan <genghiskhan@gmx.ca>, 2015-2016
# Liran <liranvaknin@gmail.com>, 2016-2017
# Yaroslav Serhieiev <noomorph@gmail.com>, 2018
# Yevgney Sliosarenko, 2015
# ‫רואי לוי‬‎ <roei1234567@gmail.com>, 2016
msgid ""
@ -15,8 +16,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Liran <liranvaknin@gmail.com>\n"
"PO-Revision-Date: 2018-03-25 14:36+0000\n"
"Last-Translator: Yaroslav Serhieiev <noomorph@gmail.com>\n"
"Language-Team: Hebrew (http://www.transifex.com/supertuxkart/supertuxkart/language/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -937,7 +938,7 @@ msgstr "מתקדם"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Deadzone"
msgstr ""
msgstr "שטח מת"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
@ -1830,7 +1831,7 @@ msgstr " אבל טיפשים קטנים ועלובים שכמותכם לעולם
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
msgstr ""
msgstr "ארנה לאס דונאס"
#. I18N: ../stk-assets/tracks/lighthouse/track.xml
msgid "Around the lighthouse"
@ -1926,7 +1927,7 @@ msgstr "הקסלי"
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
msgstr ""
msgstr "קיקי"
#. I18N: ../stk-assets/karts/konqi/kart.xml
msgid "Konqi"

View File

@ -7,14 +7,15 @@
# Christian "crse" Elbrianno, 2017
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
# Icho Yulian Chandra <icho.yulian@gmail.com>, 2016
# Iwan Rahardi Putra <iwan.rahardi.putra@gmail.com>, 2017
# Raja Sulaiman <wormsplaycheats@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Christian \"crse\" Elbrianno\n"
"PO-Revision-Date: 2017-12-30 04:05+0000\n"
"Last-Translator: Iwan Rahardi Putra <iwan.rahardi.putra@gmail.com>\n"
"Language-Team: Indonesian (http://www.transifex.com/supertuxkart/supertuxkart/language/id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -930,7 +931,7 @@ msgstr "Akselerometer"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Advanced"
msgstr ""
msgstr "Tingkat lanjut"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
@ -3412,7 +3413,7 @@ msgstr ""
#: src/states_screens/grand_prix_editor_screen.cpp:351
msgid "Name is empty."
msgstr ""
msgstr "Nama kosong."
#: src/states_screens/grand_prix_editor_screen.cpp:359
msgid "Another grand prix with this name already exists."
@ -3420,7 +3421,7 @@ msgstr ""
#: src/states_screens/grand_prix_editor_screen.cpp:365
msgid "Name is too long."
msgstr ""
msgstr "Nama terlalu panjang."
#. I18N: when failing a GP
#: src/states_screens/grand_prix_lose.cpp:155
@ -3827,11 +3828,11 @@ msgstr "Peringkat"
#: src/states_screens/race_gui_overworld.cpp:518
msgid "Press fire to start the tutorial"
msgstr ""
msgstr "Tekan tombol tembak untuk mulai latihan"
#: src/states_screens/race_gui_overworld.cpp:557
msgid "Type: Grand Prix"
msgstr ""
msgstr "Tipe: Grand Prix"
#: src/states_screens/race_gui_overworld.cpp:594
msgid "Press fire to start the challenge"
@ -3839,7 +3840,7 @@ msgstr "Tekan tembak untuk memulai tantangan"
#: src/states_screens/race_result_gui.cpp:175
msgid "Continue."
msgstr ""
msgstr "Lanjutkan."
#: src/states_screens/race_result_gui.cpp:178
msgid "Quit the server."
@ -3859,7 +3860,7 @@ msgstr "Mulai Ulang"
#: src/states_screens/race_result_gui.cpp:224
msgid "Back to challenge selection"
msgstr ""
msgstr "Kembali ke pilihan tantangan"
#: src/states_screens/race_result_gui.cpp:230
msgid "Back to the menu"
@ -3895,7 +3896,7 @@ msgstr ""
#: src/states_screens/race_result_gui.cpp:1220
#, c-format
msgid "Track %i/%i"
msgstr ""
msgstr "Putaran %i/%i"
#: src/states_screens/race_result_gui.cpp:1304
msgid "Grand Prix progress:"
@ -3908,12 +3909,12 @@ msgstr "Highscores"
#: src/states_screens/race_result_gui.cpp:1432
#, c-format
msgid "Difficulty: %s"
msgstr ""
msgstr "Tingkat kesulitan: %s"
#: src/states_screens/race_result_gui.cpp:1440
#, c-format
msgid "Best lap time: %s"
msgstr ""
msgstr "Waktu lintasan terbaik: %s"
#: src/states_screens/race_setup_screen.cpp:87
msgid "All blows allowed, so catch weapons and make clever use of them!"
@ -3930,11 +3931,11 @@ msgstr "Selalu buntuti sang pemimpin tapi jangan didahului!"
#: src/states_screens/race_setup_screen.cpp:114
msgid "Hit others with weapons until they lose all their lives."
msgstr ""
msgstr "Serang yang lain dengan senjata sampai mereka kehabisan nyawa."
#: src/states_screens/race_setup_screen.cpp:119
msgid "Push the ball into the opposite cage to score goals."
msgstr ""
msgstr "Dorong bola ke dalam gawang lawan untuk membuat gol."
#: src/states_screens/race_setup_screen.cpp:129
msgid "Explore tracks to find all hidden eggs"
@ -3942,17 +3943,17 @@ msgstr "Eksplorasi jalur untuk menemukan semua telur tersembunyi"
#: src/states_screens/race_setup_screen.cpp:137
msgid "Race against ghost karts and try to beat them!"
msgstr ""
msgstr "Berlomba dan coba kalahkan mobil hantu!"
#: src/states_screens/register_screen.cpp:218
#: src/states_screens/register_screen.cpp:225
#, c-format
msgid "Could not create player '%s'."
msgstr ""
msgstr "Tidak bisa membuat pemain '%s'."
#: src/states_screens/register_screen.cpp:277
msgid "Emails don't match!"
msgstr ""
msgstr "Email tidak sama!"
#: src/states_screens/register_screen.cpp:281
msgid "Online username has to be between 3 and 30 characters long!"
@ -3964,11 +3965,11 @@ msgstr ""
#: src/states_screens/register_screen.cpp:293
msgid "Email has to be between 5 and 254 characters long!"
msgstr ""
msgstr "Panjang email harus diantara 5 sampai 254 karakter."
#: src/states_screens/register_screen.cpp:299
msgid "Email is invalid!"
msgstr ""
msgstr "Email salah!"
#: src/states_screens/register_screen.cpp:362
msgid ""
@ -3989,7 +3990,7 @@ msgstr ""
#. I18N: track group name
#: src/states_screens/tracks_and_gp_screen.cpp:144
msgid "all"
msgstr ""
msgstr "semua"
#: src/states_screens/tracks_and_gp_screen.cpp:195
msgid "Locked!"
@ -3998,11 +3999,11 @@ msgstr "Dikunci!"
#: src/states_screens/tracks_and_gp_screen.cpp:278
#: src/states_screens/tracks_screen.cpp:227
msgid "Locked: solve active challenges to gain access to more!"
msgstr ""
msgstr "Dikunci: selesaikan tantangan yang ada untuk akses lintasan yang lain!"
#: src/states_screens/tracks_screen.cpp:194
msgid "Only official tracks are supported."
msgstr ""
msgstr "Hanya mendukung lintasan resmi."
#. I18N: when showing who is the author of track '%s'
#. I18N: (place %s where the name of the author should appear)
@ -4015,25 +4016,25 @@ msgstr "Lintasan oleh %s"
#: src/states_screens/track_info_screen.cpp:120
#, c-format
msgid "Max players supported: %d"
msgstr ""
msgstr "Maksimal pemain: %d"
#. I18N: In the track info screen
#: src/states_screens/track_info_screen.cpp:213
msgid "Drive in reverse"
msgstr ""
msgstr "Lintasan dibalik"
#. I18N: In the track info screen
#: src/states_screens/track_info_screen.cpp:218
msgid "Random item location"
msgstr ""
msgstr "Acak lokasi benda"
#: src/states_screens/user_screen.cpp:111
msgid "Exit game"
msgstr ""
msgstr "Keluar permainan"
#: src/states_screens/user_screen.cpp:484
msgid "You need to enter a password."
msgstr ""
msgstr "Kamu harus masukan password."
#: src/states_screens/user_screen.cpp:505
#, c-format
@ -4056,7 +4057,7 @@ msgstr "Apakah anda benar-benar ingin menghapus pemain '%s' ?"
#. formats.
#: src/utils/time.cpp:50
msgid "%d/%m/%Y"
msgstr ""
msgstr "%d/%m/%Y"
#. I18N: Do NOT literally translate this string!! Please enter Y as the
#. translation if your language is a RTL (right-to-left) language,
@ -4067,7 +4068,7 @@ msgstr " N"
#: ../stk-assets/tracks/overworld/scripting.as:15
msgid "Complete all challenges to unlock the big door!"
msgstr ""
msgstr "Selesaikan semua tantangan untuk membuka pintu besar!"
#: ../stk-assets/tracks/overworld/scripting.as:63
msgid ""
@ -4075,19 +4076,19 @@ msgid ""
"to enter this challenge!\n"
"Check the minimap for\n"
"available challenges."
msgstr ""
msgstr "Butuh lebih banyak angka\nuntuk mengambil tantangan ini!\nPeriksa peta kecil untuk lihat\ntantangan yang ada."
#: ../stk-assets/tracks/tutorial/scripting.as:21
#, c-format
msgid "Accelerate with <%s>, and steer with <%s> and <%s>."
msgstr ""
msgstr "Maju dengan <%s>, dan menyetir dengan <%s> dan <%s>."
#: ../stk-assets/tracks/tutorial/scripting.as:37
#: ../stk-assets/tracks/tutorial/triggers.as:38
#, c-format
msgid ""
"Collect gift boxes, and fire the weapon with <%s> to blow away these boxes!"
msgstr ""
msgstr "Ambil kotak hadiah, dan tembakan senjata dengan <%s> untuk menghancurkan peti-peti ini!"
#: ../stk-assets/tracks/tutorial/scripting.as:43
#: ../stk-assets/tracks/tutorial/triggers.as:44
@ -4095,7 +4096,7 @@ msgstr ""
msgid ""
"Press <%s> to look behind. Fire the weapon with <%s> while pressing <%s> to "
"fire behind!"
msgstr ""
msgstr "Tekan <%s> untuk lihat ke belakang. Tembakan senjata dengan <%s> saat menekan <%s> untuk menembak ke belakang!"
#: ../stk-assets/tracks/tutorial/scripting.as:53
#: ../stk-assets/tracks/tutorial/triggers.as:54
@ -4105,12 +4106,12 @@ msgstr "Gunakan nitro yang anda kumpulkan dengan menekan <%s>!"
#: ../stk-assets/tracks/tutorial/scripting.as:58
msgid "Collect nitro bottles (we will use them after the curve)."
msgstr ""
msgstr "Kumpulkan botol nitro (akan kita pakai setelah tikungan)."
#: ../stk-assets/tracks/tutorial/scripting.as:63
#, c-format
msgid "Oops! When you're in trouble, press <%s> to be rescued."
msgstr ""
msgstr "Oops! Saat dalam masalah, tekan <%s> supaya diselamatkan."
#: ../stk-assets/tracks/tutorial/scripting.as:69
#: ../stk-assets/tracks/tutorial/triggers.as:70
@ -4118,14 +4119,14 @@ msgstr ""
msgid ""
"Accelerate and press the <%s> key while turning to skid. Skidding for a "
"short while can help you turn faster to take sharp turns."
msgstr ""
msgstr "Maju dan tekan <%s> saat berbelok untuk ngesot. Ngesot beberapa saat akan membuat kamu berbelok lebih cepat pada belokan tajam."
#: ../stk-assets/tracks/tutorial/scripting.as:77
#: ../stk-assets/tracks/tutorial/triggers.as:78
msgid ""
"Note that if you manage to skid for several seconds, you will receive a "
"bonus speedup as a reward!"
msgstr ""
msgstr "Kalau kamu berhasil ngesot untuk beberapa detik, kamu akan mendapat bonus tambahan kecepatan sebagai hadiah."
#: ../stk-assets/tracks/tutorial/scripting.as:82
#: ../stk-assets/tracks/tutorial/triggers.as:83
@ -4135,7 +4136,7 @@ msgstr "Kini anda siap untuk balapan. Semoga beruntung!"
#: ../stk-assets/tracks/tutorial/triggers.as:28
#, c-format
msgid "Accelerate with <%s> and steer with <%s> and <%s>"
msgstr ""
msgstr "Maju dengan <%s> dan belok dengan <%s> dan <%s>"
#: ../stk-assets/tracks/tutorial/triggers.as:59
msgid "Collect nitro bottles (we will use them after the curve)"

View File

@ -6,7 +6,7 @@
# Davide Depau <me@davideddu.org>, 2015
# Enrico B. <enricobe@hotmail.com>, 2015
# Giuseppe Pignataro (Fasbyte01) <rogepix@gmail.com>, 2015
# Ioma Taani, 2016
# Ioma Taani, 2016,2018
# lorenzo mijorus <lorenzo.mijorus@gmail.com>, 2015
# Luca Argentieri <luca.argentieri@openmailbox.org>, 2015
# mattia_b89 <mattia.b89@gmail.com>, 2017
@ -15,8 +15,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: mattia_b89 <mattia.b89@gmail.com>\n"
"PO-Revision-Date: 2018-01-04 07:19+0000\n"
"Last-Translator: Ioma Taani\n"
"Language-Team: Italian (http://www.transifex.com/supertuxkart/supertuxkart/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -922,7 +922,7 @@ msgstr "Pulsanti invertiti"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Buttons scale"
msgstr ""
msgstr "Dimensione pulsanti"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
@ -2806,8 +2806,8 @@ msgstr "DIREZIONE ERRATA!"
#, c-format
msgid "%i spare tire kart has been spawned!"
msgid_plural "%i spare tire karts have been spawned!"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%i ruota del kart è stata creata!"
msgstr[1] "%i ruote del kart sono state create!"
#: src/modes/world.cpp:1202
msgid "You have been eliminated!"

View File

@ -3,6 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# David Blaszyk <david@sudomail.ne.jp>, 2017
# lindwurm, 2015
# Sugahara Masayuki <brindflontia@gmail.com>, 2015
# lip_of_cygnus <Shinya1248@gmail.com>, 2015
@ -12,8 +13,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2017-11-21 21:28+0000\n"
"Last-Translator: David Blaszyk <david@sudomail.ne.jp>\n"
"Language-Team: Japanese (http://www.transifex.com/supertuxkart/supertuxkart/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -992,7 +993,7 @@ msgstr "閉じる"
#. I18N: ./data/gui/online/create_server.stkgui
#. I18N: In the server creation screen
msgid "Server Creation"
msgstr ""
msgstr "サーバー創造"
#. I18N: ./data/gui/online/create_server.stkgui
#. I18N: In the server creation screen
@ -1011,7 +1012,7 @@ msgstr ""
#. I18N: ./data/gui/online/create_server.stkgui
#. I18N: In the server creation screen
msgid "Password (optional)"
msgstr ""
msgstr "パスワード (任意)"
#. I18N: ./data/gui/online/create_server.stkgui
#. I18N: In the server creation screen
@ -1161,7 +1162,7 @@ msgstr "ゲームモード"
#. I18N: ./data/gui/online/networking_lobby.stkgui
#. I18N: In the networking lobby
msgid "Exit"
msgstr ""
msgstr "終了"
#. I18N: ./data/gui/online/notification_dialog.stkgui
#. I18N: User info dialog
@ -1219,7 +1220,7 @@ msgstr "サーバーを見つける"
#. I18N: In the online multiplayer screen
#: src/states_screens/create_server_screen.cpp:83
msgid "Create Server"
msgstr ""
msgstr "サーバーを創造する"
#. I18N: ./data/gui/online/profile_servers.stkgui
msgid "Global Networking"
@ -1243,7 +1244,7 @@ msgstr "パスワード:"
#. I18N: ./data/gui/online/profile_settings.stkgui
msgid "Change"
msgstr ""
msgstr "変更"
#. I18N: ./data/gui/online/recovery_info.stkgui
#. I18N: In the recovery dialog
@ -1291,12 +1292,12 @@ msgstr "ユーザーを作成"
#. I18N: ./data/gui/online/register.stkgui
#. I18N: Section in the register screen
msgid "New Online Account"
msgstr ""
msgstr "新しいオンラインアカウント"
#. I18N: ./data/gui/online/register.stkgui
#. I18N: Section in the register screen
msgid "Existing Online Account"
msgstr ""
msgstr "現存のオンラインアカウント"
#. I18N: ./data/gui/online/register.stkgui
#. I18N: Section in the register screen
@ -1345,7 +1346,7 @@ msgstr ""
#. I18N: ./data/gui/online/user_info_dialog.stkgui
#. I18N: User info dialog
msgid "Accept"
msgstr ""
msgstr "受け付ける"
#. I18N: ./data/gui/online/server_info_dialog.stkgui
#. I18N: In the server info dialog
@ -1381,7 +1382,7 @@ msgstr "フレンドを追加"
#. I18N: ./data/gui/online/user_info_dialog.stkgui
#. I18N: User info dialog
msgid "Decline"
msgstr ""
msgstr "断る"
#. I18N: ./data/gui/online/user_search.stkgui
msgid "User search"
@ -1531,7 +1532,7 @@ msgstr "FPS 表示"
#. I18N: ./data/gui/options_ui.stkgui
#. I18N: In the ui settings
msgid "Always show login screen"
msgstr ""
msgstr "いつもログイン画面を表示"
#. I18N: ./data/gui/options_ui.stkgui
#. I18N: In the ui settings
@ -1680,7 +1681,7 @@ msgstr "タイプ:"
#. I18N: ./data/gui/soccer_setup.stkgui
#. I18N: In soccer setup screen
msgid "Number of goals to win"
msgstr ""
msgstr "ゴールの勝ち数"
#. I18N: ./data/gui/soccer_setup.stkgui
#. I18N: In soccer setup screen
@ -1690,7 +1691,7 @@ msgstr ""
#. I18N: ./data/gui/soccer_setup.stkgui
#. I18N: In soccer setup screen
msgid "Game type (Goals limit / Time limit)"
msgstr ""
msgstr "ゲームタイプ (ゴール限定 / 時間限定)"
#. I18N: ./data/gui/soccer_setup.stkgui
#. I18N: In soccer setup screen
@ -1977,14 +1978,14 @@ msgstr ""
#: src/addons/news_manager.cpp:179
#, c-format
msgid "Error downloading news: '%s'."
msgstr ""
msgstr "ニューズをダウンロードエラー: '1%s'"
#. I18N: number of laps to race in a challenge
#: src/challenges/challenge_data.cpp:266
#: src/states_screens/race_result_gui.cpp:1424
#, c-format
msgid "Laps: %i"
msgstr ""
msgstr "ラップ: 1%i"
#: src/challenges/challenge_data.cpp:272
msgid "Follow the leader"
@ -2044,12 +2045,12 @@ msgstr "設定したコンフィグファイルが古すぎます。削除して
#: src/graphics/irr_driver.cpp:535
msgid "Video recording started."
msgstr ""
msgstr "録画を始めた"
#: src/graphics/irr_driver.cpp:541
#, c-format
msgid "Video saved in \"%s\"."
msgstr ""
msgstr "ビデオは \"%s\" に保存しました"
#: src/graphics/irr_driver.cpp:545
msgid "Encoding progress:"
@ -2121,43 +2122,43 @@ msgstr ""
#: src/input/binding.cpp:126
msgctxt "input_key"
msgid "Backspace"
msgstr ""
msgstr "バックスペース"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:128
msgctxt "input_key"
msgid "Tab"
msgstr ""
msgstr "タブ"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:130
msgctxt "input_key"
msgid "Clear"
msgstr ""
msgstr "消す"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:132
msgctxt "input_key"
msgid "Return"
msgstr ""
msgstr "リターンキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:134
msgctxt "input_key"
msgid "Shift"
msgstr ""
msgstr "シフトキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:136
msgctxt "input_key"
msgid "Control"
msgstr ""
msgstr "コントロールキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:138
msgctxt "input_key"
msgid "Alt/Menu"
msgstr ""
msgstr "Altキー/メニュー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:140
@ -2169,7 +2170,7 @@ msgstr "ポーズ"
#: src/input/binding.cpp:142
msgctxt "input_key"
msgid "Caps Lock"
msgstr ""
msgstr "キャプスロックキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:144
@ -2194,7 +2195,7 @@ msgstr ""
#: src/input/binding.cpp:151
msgctxt "input_key"
msgid "Escape"
msgstr ""
msgstr "エスケープキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:153
@ -2224,7 +2225,7 @@ msgstr ""
#: src/input/binding.cpp:161
msgctxt "input_key"
msgid "Space"
msgstr ""
msgstr "スペースキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:163
@ -2242,43 +2243,43 @@ msgstr ""
#: src/input/binding.cpp:167
msgctxt "input_key"
msgid "End"
msgstr ""
msgstr "エンドキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:169
msgctxt "input_key"
msgid "Home"
msgstr ""
msgstr "ホームキー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:171
msgctxt "input_key"
msgid "Left"
msgstr ""
msgstr "左キー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:173
msgctxt "input_key"
msgid "Up"
msgstr ""
msgstr "上キー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:175
msgctxt "input_key"
msgid "Right"
msgstr ""
msgstr "右キー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:177
msgctxt "input_key"
msgid "Down"
msgstr ""
msgstr "下キー"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:179
msgctxt "input_key"
msgid "Select"
msgstr ""
msgstr "選択"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:181
@ -2576,12 +2577,12 @@ msgstr "入力したコンフィグファイルはこのバージョンのSTKと
#. I18N: Name of the black button on xbox controller
#: src/input/gamepad_config.cpp:167
msgid "Black"
msgstr ""
msgstr "黒い"
#. I18N: Name of the white button on xbox controller
#: src/input/gamepad_config.cpp:171
msgid "White"
msgstr ""
msgstr "白い"
#. I18N: name of buttons on gamepads
#. I18N: name of stick on gamepads
@ -2652,7 +2653,7 @@ msgstr ""
#. I18N: name of buttons on gamepads
#: src/input/gamepad_config.cpp:218
msgid "Start"
msgstr ""
msgstr "スタート"
#. I18N: name of buttons on gamepads
#: src/input/gamepad_config.cpp:220
@ -3133,7 +3134,7 @@ msgstr "無効"
#: src/states_screens/dialogs/custom_video_settings.cpp:67
#: src/states_screens/options_screen_video.cpp:462
msgid "Important only"
msgstr ""
msgstr "大体だけ"
#. I18N: animations setting (only karts with human players are animated)
#: src/states_screens/dialogs/custom_video_settings.cpp:74
@ -3182,19 +3183,19 @@ msgstr ""
#: src/states_screens/edit_gp_screen.cpp:257
#: src/states_screens/ghost_replay_selection.cpp:117
msgid "No"
msgstr ""
msgstr "いいえ"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:60
msgid "Tablet"
msgstr ""
msgstr "タブレット"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:61
msgid "Phone"
msgstr ""
msgstr "スマホ"
#: src/states_screens/dialogs/recovery_dialog.cpp:121
msgid "Username and/or email address invalid."
msgstr ""
msgstr "ユーザー名またはメールアドレスは無効"
#: src/states_screens/dialogs/registration_dialog.cpp:42
#, c-format
@ -3246,7 +3247,7 @@ msgstr "リクエストを取り消す"
#: src/states_screens/dialogs/user_info_dialog.cpp:154
#: src/states_screens/dialogs/user_info_dialog.cpp:211
msgid "Today"
msgstr ""
msgstr "今日"
#: src/states_screens/dialogs/user_info_dialog.cpp:158
msgid "Friend request sent!"
@ -3308,7 +3309,7 @@ msgstr "コース"
#: src/states_screens/edit_gp_screen.cpp:67
#: src/states_screens/ghost_replay_selection.cpp:81
msgid "Laps"
msgstr ""
msgstr "ラップ"
#: src/states_screens/edit_gp_screen.cpp:68
msgid "Reversed"
@ -3374,7 +3375,7 @@ msgstr ""
#: src/states_screens/ghost_replay_selection.cpp:83
msgid "User"
msgstr ""
msgstr "ユーザー"
#: src/states_screens/gp_info_screen.cpp:74
msgid "Default"
@ -3793,7 +3794,7 @@ msgstr "スタート!"
#. I18N: Shown when a goal is scored
#: src/states_screens/race_gui_base.cpp:71
msgid "GOAL!"
msgstr ""
msgstr "ゴール!"
#. I18N: string used to show the author of the music. (e.g. "Sunny Song" by
#. "John Doe")
@ -3838,7 +3839,7 @@ msgstr "アイテムボタンを押してチャレンジを開始"
#: src/states_screens/race_result_gui.cpp:175
msgid "Continue."
msgstr ""
msgstr "続く"
#: src/states_screens/race_result_gui.cpp:178
msgid "Quit the server."
@ -3907,12 +3908,12 @@ msgstr "ハイスコア"
#: src/states_screens/race_result_gui.cpp:1432
#, c-format
msgid "Difficulty: %s"
msgstr ""
msgstr "難しさ: %s"
#: src/states_screens/race_result_gui.cpp:1440
#, c-format
msgid "Best lap time: %s"
msgstr ""
msgstr "ベストラップ時間: %s"
#: src/states_screens/race_setup_screen.cpp:87
msgid "All blows allowed, so catch weapons and make clever use of them!"

View File

@ -5,6 +5,8 @@
# Translators:
# Bruno Ramalhete <bram.512@gmail.com>, 2015
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010
# Pedro TheGamerOficialTM <pedromiguelafonso4@gmail.com>, 2017
# Pedro TheGamerOficialTM <pedromiguelafonso4@gmail.com>, 2017
# Rui <xymarior@yandex.com>, 2016-2017
# Rui <xymarior@yandex.com>, 2016
msgid ""
@ -12,8 +14,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Rui <xymarior@yandex.com>\n"
"PO-Revision-Date: 2017-11-25 11:08+0000\n"
"Last-Translator: Pedro TheGamerOficialTM <pedromiguelafonso4@gmail.com>\n"
"Language-Team: Portuguese (http://www.transifex.com/supertuxkart/supertuxkart/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -95,11 +97,11 @@ msgstr "Apanhar um mínimo de 5 bananas por corrida."
#. I18N: ./data/achievements.xml
msgid "It's secret"
msgstr "É segredo"
msgstr "É um segredo"
#. I18N: ./data/achievements.xml
msgid "Really ... a secret."
msgstr "Realmente... um segredo."
msgstr "Realmente... é um segredo."
#. I18N: ./data/achievements.xml
msgid "Mosquito Hunter"
@ -121,7 +123,7 @@ msgstr "Fora do circuito habitual"
#. I18N: ./data/grandprix/3_tothemoonandback.grandprix
msgid "To the moon and back"
msgstr "Ira à Lua e voltar"
msgstr "Ir à Lua e voltar"
#. I18N: ./data/grandprix/4_atworldsend.grandprix
msgid "At World's End"
@ -385,7 +387,7 @@ msgstr "Todas as Pistas"
#. I18N: ./data/gui/edit_gp.stkgui
#. I18N: Title in edit grand prix screen
msgid "Edit Grand Prix"
msgstr "Editar Grande Prémio"
msgstr "Editar o grande prémio"
#. I18N: ./data/gui/edit_gp.stkgui
#. I18N: Menu item
@ -481,7 +483,7 @@ msgstr "Visualizar apenas o rever"
#. I18N: ./data/gui/track_info.stkgui
#. I18N: In the track info screen
msgid "Start Race"
msgstr "Iniciar corrida"
msgstr "Iniciar a corrida"
#. I18N: ./data/gui/ghost_replay_selection.stkgui
#. I18N: In the ghost replay selection screen
@ -491,7 +493,7 @@ msgstr "Seleção de Rever Fantasma"
#. I18N: ./data/gui/ghost_replay_selection.stkgui
#. I18N: In the ghost replay selection screen
msgid "Only show replays matching the current difficulty"
msgstr "Mostrar rever apenas na dificuldade atual"
msgstr "Mostrar apenas na dificuldade atual"
#. I18N: ./data/gui/ghost_replay_selection.stkgui
#. I18N: In the ghost replay selection screen
@ -523,7 +525,7 @@ msgstr "Continuar o Grande Prémio gravado"
#. I18N: ./data/gui/grand_prix_editor.stkgui
#. I18N: Title in grand prix editor screen
msgid "Grand Prix editor"
msgstr "Editor de Grande Prémio"
msgstr "Editor do grande prémio"
#. I18N: ./data/gui/grand_prix_editor.stkgui
#. I18N: Menu item
@ -646,19 +648,19 @@ msgid ""
"Collecting nitro allows you to get speed boosts whenever you wish by "
"pressing the appropriate key. You can see your current level of nitro in the"
" bar at the right of the game screen."
msgstr "Se apanhares garrafas de nitro podes conseguir velocidades estonteantes sempre que carregares na tecla apropriada. Podes ver o quantidade de nitro na barra à direita do ecrã de jogo."
msgstr "Se apanhares garrafas de nitro podes conseguir velocidades brutais sempre que carregares na tecla apropriada. Podes ver a quantidade de nitro na barra à direita do ecrã do jogo."
#. I18N: ./data/gui/help1.stkgui
#. I18N: In the help menu
msgid ""
"If you see a button with a lock like this one, you need to complete a "
"challenge to unlock it."
msgstr "Se vires um botão com um cadeado destes, é porque tens que completar um desafio para o desbloquear."
msgstr "Se vires um botão com um cadeado destes, é porque tens que completar uma corrida para o desbloquear."
#. I18N: ./data/gui/help1.stkgui
#. I18N: in the help menu
msgid "The 'skidding' key allows you to skid in sharp turns and get a boost."
msgstr "A tecla \"Derrapar\" permite derrapar em curvas apertadas e ganhar aceleração."
msgstr "A tecla \"Derrapar\" permite derrapar em curvas apertadas e ganhar velocidade."
#. I18N: ./data/gui/help1.stkgui
#. I18N: in the help screen
@ -679,7 +681,7 @@ msgstr "Pastilha Elástica - protege-te com um escudo ou utiliza-a quando olhare
#. I18N: ./data/gui/help2.stkgui
msgid ""
"Cake - thrown at the closest rival, best on short ranges and long straights."
msgstr "Bolo - é atirado ao rival mais próximo. Deve ser utilizado para pequenas distâncias e em reta."
msgstr "Bolo - é atirado ao rival mais próximo. Deve ser utilizado para distâncias pequenas e em reta."
#. I18N: ./data/gui/help2.stkgui
msgid ""
@ -729,7 +731,7 @@ msgstr "Corrida Normal: todas as armas são permitidas. Apanha-as e utiliza-as!"
msgid ""
"Time Trial: Contains no powerups, so only your driving skills matter! This "
"mode allows you to record the race for replaying."
msgstr "Corrida Contra o Tempo: não existem powerups por isso apenas contam as tuas capacidades de condução. Este modo permite gravar a corrida para poderes revê-la."
msgstr "Corrida Contra o Tempo: não existem powerups por isso, apenas contam as tuas capacidades de condução. Este modo permite gravar a corrida para poderes revê-la."
#. I18N: ./data/gui/help3.stkgui
#. I18N: In the help menu
@ -737,7 +739,7 @@ msgid ""
"Follow the leader: Run for second place, as the last kart will be "
"disqualified every time the counter hits zero. Beware: going in front of the"
" leader will get you eliminated too!"
msgstr "Seguir o Líder: disputa o segundo lugar, porque o último carro será desqualificado sempre que o cronómetro atinja o valor zero. Atenção: não deves ultrapassar o líder ou serás também eliminado."
msgstr "Seguir o Líder: Disputa o segundo lugar, porque o último carro será desqualificado sempre que o cronómetro atinja o valor zero. Atenção: não deves ultrapassar o líder ou serás também eliminado."
#. I18N: ./data/gui/help3.stkgui
#. I18N: In the help menu
@ -762,7 +764,7 @@ msgid ""
"instead of playing a single race, you play many in a row. The better you "
"rank, the more points you get. In the end, the player with the most points "
"wins the cup."
msgstr "* Grande parte destes modos também podem ser jogados como Grande Prémio. Em vez de fazer uma corrida, joga várias de seguida. Quanto melhor for a tua posição, mais pontos ganhas. No fim, o jogador que tiver mais pontos ganha a taça."
msgstr "* Grande parte destes modos também podem ser jogados como Grande Prémio. Em vez de fazeres uma corrida, jogas várias de seguida. Quanto melhor for a tua posição, mais pontos ganhas. No fim, o jogador que tiver mais pontos ganha a taça."
#. I18N: ./data/gui/help4.stkgui
msgid "SuperTuxKart can be played in multiplayer mode on the same computer"
@ -781,7 +783,7 @@ msgid ""
"keyboard(s), however each player will need a different set of keys, and keep"
" in mind that most keyboards are not appropriate for multiplayer gameplay "
"because they do not support large number of keypresses."
msgstr "Precisas de diversos dispositivos (ter diversos comandos ou joysticks é a melhor maneira para jogos multi-jogadores). Acede às definições e configura os comandos. Também podem jogar no teclado, mas neste caso, cada jogador terá que usar diversas teclas e esta não é a melhor forma de jogar, uma vez que a maioria dos teclados não permitem que se primam várias teclas ao mesmo tempo."
msgstr "Primeiro, precisas de diversos dispositivos (ter diversos comandos ou joysticks é a melhor maneira para jogos multi-jogadores). Acede às definições e configura os comandos. Também podes jogar no teclado, mas neste caso, cada jogador terá que usar diversas teclas e esta não é a melhor forma de jogar, uma vez que a maioria dos teclados não permitem que se primam várias teclas ao mesmo tempo."
#. I18N: ./data/gui/help4.stkgui
#. I18N: In the help menu
@ -792,7 +794,7 @@ msgid ""
" the game. Each player can use their input device to select their kart. The "
"game continues when everyone selected their kart. Note that the mouse may "
"not be used for this operation."
msgstr "Assim que configurares os dispositivos, podes jogar. Escolhe uma corrida multi-jogador no menu principal. Para escolher um veículo, cada jogador tem que pressionar a tecla de \"Disparo\" do comando, joystick ou teclado para entrar no jogo. Cada jogador pode usar o seu dispositivo para escolher o veículo. O jogo começará assim que todos os jogadores escolham o veículo. Para esta operação, não se pode utilizar o rato."
msgstr "Assim que configurares os dispositivos, podes jogar. Escolhe uma corrida multi-jogador no menu principal. Para escolher um veículo, cada jogador tem que pressionar a tecla de \"Disparo\" do comando, joystick ou teclado para entrar no jogo. Cada jogador pode usar o seu dispositivo para escolher o veículo. O jogo começará assim que todos os jogadores escolherem um veículo. Para esta operação, não podes utilizar o rato."
#. I18N: ./data/gui/help5.stkgui
msgid ""
@ -808,7 +810,7 @@ msgstr "Âncora - reduz a velocidade do kart."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid "Parachute - slows down the kart less than the anchor."
msgstr "Pára-quedas - reduz a velocidade do kart, mas menos que a âncora."
msgstr "Pára-quedas - reduz a velocidade do kart, mas reduz menos que a âncora."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
@ -948,24 +950,24 @@ msgstr "Restaurar padrão"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
msgid "Password Change"
msgstr "Alterar Palavra-chave"
msgstr "Alterar a palavra-passe"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
msgid "Current Password"
msgstr "Palavra-chave atual"
msgstr "Palavra-passe atual"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
msgid "New Password"
msgstr "Nova Palavra-chave"
msgstr "Nova palavra-passe"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
#. I18N: ./data/gui/online/register.stkgui
#. I18N: In the registration dialog
msgid "Confirm"
msgstr "Confirmação"
msgstr "Confirmar"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
@ -992,7 +994,7 @@ msgstr "Fechar"
#. I18N: ./data/gui/online/create_server.stkgui
#. I18N: In the server creation screen
msgid "Server Creation"
msgstr "Criação de Servidor"
msgstr "Criação do Servidor"
#. I18N: ./data/gui/online/create_server.stkgui
#. I18N: In the server creation screen
@ -1073,7 +1075,7 @@ msgstr "Modo de jogo"
#. I18N: Game mode
#: src/race/race_manager.hpp:175
msgid "Normal Race"
msgstr "Corrida simples"
msgstr "Corrida normal"
#. I18N: ./data/gui/online/create_server.stkgui
#. I18N: Multiplayer game mode
@ -1188,7 +1190,7 @@ msgstr "Amigos"
#. I18N: ./data/gui/online/profile_friends.stkgui
#. I18N: In the profile screen
msgid "Look for more friends:"
msgstr "Porcurar mais amigos:"
msgstr "Procurar mais amigos:"
#. I18N: ./data/gui/online/profile_friends.stkgui
#. I18N: ./data/gui/online/user_search.stkgui
@ -1213,7 +1215,7 @@ msgstr "Rede Local"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: In the online multiplayer screen
msgid "Find Server"
msgstr "Localizar Servidor"
msgstr "Encontrar Servidor"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: In the online multiplayer screen
@ -1223,7 +1225,7 @@ msgstr "Criar Servidor"
#. I18N: ./data/gui/online/profile_servers.stkgui
msgid "Global Networking"
msgstr "Rede Mundial"
msgstr "Rede Global"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: In the online multiplayer screen
@ -1239,7 +1241,7 @@ msgstr "Definições da Conta"
#. I18N: ./data/gui/online/profile_settings.stkgui
#. I18N: In the online account settings screen
msgid "Password:"
msgstr "Palavra-chave:"
msgstr "Palavra-passe:"
#. I18N: ./data/gui/online/profile_settings.stkgui
msgid "Change"
@ -1250,20 +1252,20 @@ msgstr "Alterar"
#. I18N: ./data/gui/online/recovery_input.stkgui
#. I18N: In the recovery dialog
msgid "Account Recovery"
msgstr "Recuperação de Conta"
msgstr "Recuperação da Conta"
#. I18N: ./data/gui/online/recovery_info.stkgui
#. I18N: In the recovery dialog
msgid ""
"You will receive an email with further instructions on how to reset your "
"password. Please be patient and be sure to check your spam folder."
msgstr "Vais receber um email com informações detalhadas sobre como repôr a palavra-chave. Por favor tem paciência e lembra-te de verificar a pasta de emails indesejados ou spam."
msgstr "Vais receber um email com informações detalhadas sobre como alterar a palavra-chave. Por favor tem paciência e lembra-te de verificar a pasta de emails indesejados ou spam."
#. I18N: ./data/gui/online/recovery_input.stkgui
msgid ""
"Fill in the username and email address you supplied at registration to be "
"able to reset your password."
msgstr "Preenche o nome de utilizador e o endereço de email que introduziste ao criar a conta para poderes repôr a tua palavra-passe."
msgstr "Preenche o nome de utilizador e o endereço de email que introduziste ao criar a conta para poderes alterar a tua palavra-passe."
#. I18N: ./data/gui/online/recovery_input.stkgui
#. I18N: In the recovery dialog
@ -1526,7 +1528,7 @@ msgstr "Tema"
#. I18N: ./data/gui/options_ui.stkgui
#. I18N: In the ui settings
msgid "Display FPS"
msgstr "Mostrar Quadros Por Segundo"
msgstr "Mostrar FPS"
#. I18N: ./data/gui/options_ui.stkgui
#. I18N: In the ui settings
@ -1581,7 +1583,7 @@ msgstr "Resolução"
#. I18N: ./data/gui/options_video.stkgui
#. I18N: In the video settings
msgid "Fullscreen"
msgstr "Ecrã total"
msgstr "Ecrã inteiro"
#. I18N: ./data/gui/options_video.stkgui
#. I18N: In the video settings
@ -1711,7 +1713,7 @@ msgstr "Equipa Azul"
#. I18N: In the track and grand prix selection screen
#: src/states_screens/dialogs/select_challenge.cpp:147
msgid "Grand Prix"
msgstr "Grande prémio"
msgstr "Grande Prémio"
#. I18N: ./data/gui/track_info.stkgui
msgid "= Highscores ="
@ -1811,12 +1813,12 @@ msgstr "Sim, ele está no meu castelo e servir-me-á para sempre..."
#. I18N: Cutscene subtitle from ../stk-assets/tracks/introcutscene2/scene.xml
#. I18N: ../stk-assets/tracks/introcutscene2/scene.xml
msgid "But I'm a fair creature, so I'll make you a deal."
msgstr "Mas como sou uma criatura justa, proponho um acordo."
msgstr "Mas como sou uma criatura justa, proponho-te um acordo."
#. I18N: Cutscene subtitle from ../stk-assets/tracks/introcutscene2/scene.xml
#. I18N: ../stk-assets/tracks/introcutscene2/scene.xml
msgid "If you can beat me at racing, I will free the old codger."
msgstr "Se me conseguires vencer na corrida, eu liberto-o."
msgstr "Se me conseguires vencer na corrida, eu liberto o teu líder."
#. I18N: Cutscene subtitle from ../stk-assets/tracks/introcutscene2/scene.xml
#. I18N: ../stk-assets/tracks/introcutscene2/scene.xml
@ -1935,7 +1937,7 @@ msgstr "Nolok"
#. I18N: ../stk-assets/karts/pidgin/kart.xml
msgid "Pidgin"
msgstr "Pombo"
msgstr "Pidgin"
#. I18N: ../stk-assets/karts/puffy/kart.xml
msgid "Puffy"
@ -1943,11 +1945,11 @@ msgstr "Puffy"
#. I18N: ../stk-assets/karts/sara_the_racer/kart.xml
msgid "Sara the Racer"
msgstr "Sara a Corredora"
msgstr "Sara The Racer"
#. I18N: ../stk-assets/karts/sara_the_wizard/kart.xml
msgid "Sara the Wizard"
msgstr "Sara a Feiticeira"
msgstr "Sara The Wizard"
#. I18N: ../stk-assets/karts/suzanne/kart.xml
msgid "Suzanne"
@ -1977,7 +1979,7 @@ msgstr "Não foi possível ligar ao servidor de extras do SuperTuxKart."
#: src/addons/news_manager.cpp:179
#, c-format
msgid "Error downloading news: '%s'."
msgstr "Erro ao descarregar notícias: '%s'."
msgstr "Erro ao descarregar as notícias: '%s'."
#. I18N: number of laps to race in a challenge
#: src/challenges/challenge_data.cpp:266
@ -2139,7 +2141,7 @@ msgstr "Clear"
#: src/input/binding.cpp:132
msgctxt "input_key"
msgid "Return"
msgstr "Mudar de linha"
msgstr "Return"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:134
@ -2169,7 +2171,7 @@ msgstr "Pausa"
#: src/input/binding.cpp:142
msgctxt "input_key"
msgid "Caps Lock"
msgstr "Maiúsculas"
msgstr "Caps Lock"
#. I18N: input configuration screen: keyboard key
#: src/input/binding.cpp:144
@ -2571,7 +2573,7 @@ msgstr "Configura os atalhos de teclado."
#: src/input/device_manager.cpp:544
msgid "Your input config file is not compatible with this version of STK."
msgstr "O ficheiro de configuração não é compatível com esta versão do SuperTuxKart."
msgstr "O teu ficheiro de configuração não é compatível com esta versão do SuperTuxKart."
#. I18N: Name of the black button on xbox controller
#: src/input/gamepad_config.cpp:167

View File

@ -3,7 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# André Marcelo Alvarenga <alvarenga@kde.org>, 2017
# André Marcelo Alvarenga <alvarenga@kde.org>, 2017-2018
# flaviozavan <flaviozavan@gmail.com>, 2015-2017
# Laete Meireles <laetemn@gmail.com>, 2015
# Pablo do Amaral Ferreira <pabloferreira1407@gmail.com>, 2015
@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-01-18 01:12+0000\n"
"Last-Translator: André Marcelo Alvarenga <alvarenga@kde.org>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/supertuxkart/supertuxkart/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -1827,7 +1827,7 @@ msgstr " Mas você, pequeno patético imbecil, nunca será capaz de me derrotar
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
msgstr ""
msgstr "Arena Las Dunas"
#. I18N: ../stk-assets/tracks/lighthouse/track.xml
msgid "Around the lighthouse"
@ -2941,7 +2941,7 @@ msgstr "Nome do complemento"
#: src/states_screens/addons_screen.cpp:116
msgid "Updated date"
msgstr "Atualizar data"
msgstr "Data de atualização"
#: src/states_screens/addons_screen.cpp:147
msgid ""
@ -3918,7 +3918,7 @@ msgstr "Dificuldade: %s"
#: src/states_screens/race_result_gui.cpp:1440
#, c-format
msgid "Best lap time: %s"
msgstr "Melhor tempo de volta: %s"
msgstr "Tempo da melhor volta: %s"
#: src/states_screens/race_setup_screen.cpp:87
msgid "All blows allowed, so catch weapons and make clever use of them!"
@ -4003,7 +4003,7 @@ msgstr "Bloqueado!"
#: src/states_screens/tracks_and_gp_screen.cpp:278
#: src/states_screens/tracks_screen.cpp:227
msgid "Locked: solve active challenges to gain access to more!"
msgstr "Bloqueado : ganhe os desafios ativos para ter acesso a mais!"
msgstr "Bloqueado: ganhe os desafios ativos para ter acesso a mais!"
#: src/states_screens/tracks_screen.cpp:194
msgid "Only official tracks are supported."
@ -4054,7 +4054,7 @@ msgstr "Entrando '%s'"
#: src/states_screens/user_screen.cpp:595
#, c-format
msgid "Do you really want to delete player '%s' ?"
msgstr "Você realmente quer exlcuir o jogador '%s' ?"
msgstr "Deseja realmente excluir o jogador '%s' ?"
#. I18N: Format for dates (%d = day, %m = month, %Y = year). See
#. http://www.cplusplus.com/reference/ctime/strftime/ for more info about date

View File

@ -3,14 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Nicolae Crefelean, 2015,2017
# Nicolae Crefelean, 2015,2017-2018
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-03-02 21:38+0000\n"
"Last-Translator: Nicolae Crefelean\n"
"Language-Team: Romanian (http://www.transifex.com/supertuxkart/supertuxkart/language/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -100,13 +100,13 @@ msgstr "Serios... e secret."
#. I18N: ./data/achievements.xml
msgid "Mosquito Hunter"
msgstr ""
msgstr "Vânătoarea de țânțari"
#. I18N: ./data/achievements.xml
msgid ""
"Take your opponents for mosquitos! With the swatter, squash at least 5 of "
"them in a race."
msgstr ""
msgstr "Tratează adversarii ca pe țânțari! Lovește-i cu pliciul de cel puțin 5 ori într-o cursă."
#. I18N: ./data/grandprix/1_penguinplayground.grandprix
msgid "Penguin Playground"

View File

@ -7,14 +7,15 @@
# Dmitry Dubrov <dimprogpro@hotmail.ru>, 2015
# Oleg <laol-tomsk@mail.ru>, 2015
# Val Och <v19930312@gmail.com>, 2016
# Vladislav Tananaev <vlad.tananaev@gmail.com>, 2018
# Олег Лазарев <laoltomsk@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Олег Лазарев <laoltomsk@gmail.com>\n"
"PO-Revision-Date: 2018-03-07 14:35+0000\n"
"Last-Translator: Andrei Stepanov\n"
"Language-Team: Russian (http://www.transifex.com/supertuxkart/supertuxkart/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -597,7 +598,7 @@ msgstr "Оружие"
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Game Modes"
msgstr "Режим игры"
msgstr "Режимы игры"
#. I18N: ./data/gui/help1.stkgui
#. I18N: Tab in help menu
@ -744,7 +745,7 @@ msgstr "Следуйте за лидером: будьте на втором м
#. I18N: In the help menu
msgid ""
"3 Strikes Battle: Hit others with weapons until they lose all their lives."
msgstr "Битва Трех Ударов: атакуйте других с помощью оружия до тех пор, пока они не потеряют все свои жизни."
msgstr "Битва трёх ударов: атакуйте других с помощью оружия до тех пор, пока они не потеряют все свои жизни."
#. I18N: ./data/gui/help3.stkgui
#. I18N: In the help menu
@ -1178,7 +1179,7 @@ msgstr "Вид"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: ./data/gui/online/profile_settings.stkgui
msgid "..."
msgstr "..."
msgstr ""
#. I18N: ./data/gui/online/profile_friends.stkgui
#. I18N: Section in the profile screen
@ -1334,7 +1335,7 @@ msgstr "Вы можете играть без создания сетевого
#. I18N: ./data/gui/online/registration_terms.stkgui
#. I18N: In the registration dialog
msgid "Terms and Agreement"
msgstr "Условия и Соглашение"
msgstr "Условия и соглашение"
#. I18N: ./data/gui/online/registration_terms.stkgui
#. I18N: In the registration dialog
@ -1467,7 +1468,7 @@ msgstr "Вернуться к списку устройств"
#. I18N: ./data/gui/options_input.stkgui
#. I18N: In the input configuration screen
msgid "Press enter or double-click on a device to configure it"
msgstr "Нажмите Enter или дважды кликните по устройству, чтобы настроить его"
msgstr "Нажмите «Enter» или дважды кликните по устройству, чтобы настроить его"
#. I18N: ./data/gui/options_input.stkgui
#. I18N: In the input configuration screen
@ -1479,7 +1480,7 @@ msgstr "Добавить устройство"
msgid ""
"* Which config to use will be inferred from which 'Select' key is pressed to"
" join the game."
msgstr "* Выбор конфигурации будет зависеть от того, с какого устройства нажата кнопка \"Выбрать\" при соединении к игре."
msgstr "* Выбор конфигурации будет зависеть от того, с какого устройства нажата кнопка «Выбрать» при соединении к игре."
#. I18N: ./data/gui/options_players.stkgui
#. I18N: Section in the settings menu
@ -1502,7 +1503,7 @@ msgstr "Вы играете за"
#. I18N: ./data/gui/options_players.stkgui
#. I18N: In the player configuration screen
msgid "Press enter or double-click on a player to edit their settings"
msgstr "Нажмите Enter или дважды кликните по игроку для редактирования его настроек"
msgstr "Нажмите «Enter» или дважды кликните по игроку для редактирования его настроек"
#. I18N: ./data/gui/options_players.stkgui
#. I18N: In the player configuration screen
@ -1686,7 +1687,7 @@ msgstr "Количество голов для победы"
#. I18N: ./data/gui/soccer_setup.stkgui
#. I18N: In soccer setup screen
msgid "Maximum time (min.)"
msgstr "Максимальное время (мин)"
msgstr "Максимальное время (мин.)"
#. I18N: ./data/gui/soccer_setup.stkgui
#. I18N: In soccer setup screen
@ -1824,7 +1825,7 @@ msgstr "Если ты победишь меня в гонке, то я осво
msgid ""
" But you pathetic little twerps will never be able to beat me - King of the "
"Karts!"
msgstr "Но вы, жалкие дурачки, никогда не сможете победить меня — Короля Картов !"
msgstr "Но вы, жалкие дурачки, никогда не сможете победить меня — Короля Картов!"
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
@ -1964,28 +1965,28 @@ msgstr "Вильбер"
#. I18N: ../stk-assets/karts/xue/kart.xml
msgid "Xue"
msgstr "XFCE-мышь"
msgstr "Ксю"
#: src/achievements/achievement.cpp:209
#, c-format
msgid "Completed achievement \"%s\"."
msgstr "Получено достижение \"%s\"."
msgstr "Получено достижение «%s»."
#: src/addons/addons_manager.cpp:104 src/addons/news_manager.cpp:322
msgid "Failed to connect to the SuperTuxKart add-ons server."
msgstr "Не удалось подключиться к серверу аддонов SuperTuxKart."
msgstr "Не удалось подключиться к серверу дополнений SuperTuxKart."
#: src/addons/news_manager.cpp:179
#, c-format
msgid "Error downloading news: '%s'."
msgstr "Ошибка при получении новостей: %s."
msgstr "Ошибка при получении новостей: «%s»."
#. I18N: number of laps to race in a challenge
#: src/challenges/challenge_data.cpp:266
#: src/states_screens/race_result_gui.cpp:1424
#, c-format
msgid "Laps: %i"
msgstr "Кругов: %i"
msgstr "Кол-во кругов: %i"
#: src/challenges/challenge_data.cpp:272
msgid "Follow the leader"
@ -2050,7 +2051,7 @@ msgstr "Началась запись видео."
#: src/graphics/irr_driver.cpp:541
#, c-format
msgid "Video saved in \"%s\"."
msgstr "Видео сохранено в \"%s\"."
msgstr "Видео сохранено в «%s»."
#: src/graphics/irr_driver.cpp:545
msgid "Encoding progress:"
@ -2698,13 +2699,13 @@ msgstr "Это может делать только хозяин игры!"
msgid ""
"Connect your wiimote to the Bluetooth manager, then click on Ok. Detailed "
"instructions at supertuxkart.net/Wiimote"
msgstr "Подсоедините wiimote к менеджеру Bluetooth, затем нажмите Ок. Подробную инструкцию смотрите на supertuxkart.net/Wiimote"
msgstr "Подсоедините контроллер Wii к менеджеру Bluetooth, затем нажмите ОК. Подробную инструкцию смотрите на supertuxkart.net/Wiimote"
#: src/input/wiimote_manager.cpp:391
msgid ""
"Press the buttons 1+2 simultaneously on your wiimote to put it in discovery "
"mode, then click on Ok. Detailed instructions at supertuxkart.net/Wiimote"
msgstr "Чтобы попасть в меню поиска, одновременно нажмите кнопки 1+2 на своем wiimote, затем нажмите ОК. Подробную инструкцию смотрите на supertuxkart.net/Wiimote"
msgstr "Чтобы попасть в меню поиска, одновременно нажмите кнопки 1+2 на своём контроллере Wii, затем нажмите ОК. Подробную инструкцию смотрите на supertuxkart.net/Wiimote"
#: src/input/wiimote_manager.cpp:414
#, c-format
@ -2725,7 +2726,7 @@ msgstr "Штрафное время!!!"
#: src/karts/controller/local_player_controller.cpp:243
msgid "Don't accelerate before go"
msgstr "Не жмите газ до слова \"Вперёд\"!"
msgstr "Не жмите газ до слова «Вперёд»!"
#: src/karts/controller/spare_tire_ai.cpp:147
msgid "You can have at most 3 lives!"
@ -2818,7 +2819,7 @@ msgstr "Вы дисквалифицированы!"
#: src/modes/world.cpp:1205
#, c-format
msgid "'%s' has been eliminated."
msgstr "'%s' выбыл из гонки."
msgstr "'%s' выбыл(-а) из гонки."
#: src/network/protocols/server_lobby.cpp:318
#, c-format
@ -2886,12 +2887,12 @@ msgstr "Таблица результатов устарела,\nвсе резу
#. I18N: Game mode
#: src/race/race_manager.hpp:179
msgid "Follow the Leader"
msgstr "Следуйте за Лидером"
msgstr "Следуйте за лидером"
#. I18N: Game mode
#: src/race/race_manager.hpp:181
msgid "3 Strikes Battle"
msgstr "Битва Трёх Ударов"
msgstr "Битва трёх ударов"
#. I18N: Game mode
#: src/race/race_manager.hpp:183
@ -2956,7 +2957,7 @@ msgstr "Дата обновления"
msgid ""
"Access to the Internet is disabled. (To enable it, go to options and select "
"tab 'User Interface')"
msgstr "Доступ в Интернет отсутствует. (Для включения доступа, перейдите в настройки и выберите вкладку \"Интерфейс\")"
msgstr "Доступ в Интернет отсутствует. (Для включения доступа, перейдите в настройки и выберите вкладку «Интерфейс»)"
#. I18N: as in: The Old Island by Johannes Sjolund
#: src/states_screens/addons_screen.cpp:343
@ -3052,13 +3053,13 @@ msgstr "избранное"
#: src/states_screens/dialogs/addons_loading.cpp:166
#, c-format
msgid "%s MB"
msgstr "%s Мбайт"
msgstr "%s МБ"
#: src/states_screens/dialogs/addons_loading.cpp:173
#: src/states_screens/dialogs/addons_loading.cpp:177
#, c-format
msgid "%s KB"
msgstr "%s Кбайт"
msgstr "%s КБ"
#: src/states_screens/dialogs/addons_loading.cpp:178
#, c-format
@ -3089,7 +3090,7 @@ msgid ""
"To add a new Gamepad/Joystick device, simply start SuperTuxKart with it connected and it will appear in the list.\n"
"\n"
"To add a keyboard config, you can use the button below, HOWEVER please note that most keyboards only support a limited amount of simultaneous keypresses and are thus inappropriate for multiplayer gameplay. (You can, however, connect multiple keyboards to the computer. Remember that everyone still needs different keybindings in this case.)"
msgstr "Для того, чтобы добавить Геймпад/Джойстик, просто запустите SuperTuxKart, когда он подключен. Он автоматически появится в списке устройств.\n\nЧтобы добавить настройки клавиатуры, вы можете нажать на кнопку, находящуюся ниже. Но учтите, что большинство клавиатур поддерживают только ограниченное количество одновременных нажатий клавиш и поэтому не подходят для многопользовательской игры. (Однако вы можете решить эту проблему подключением нескольких клавиатур к компьютеру. Но даже в этом случае нужно назначать различные сочетания клавиш.)"
msgstr "Для того, чтобы добавить Геймпад/Джойстик, просто запустите SuperTuxKart, когда он подключён. Он автоматически появится в списке устройств.\n\nЧтобы добавить настройки клавиатуры, вы можете нажать на кнопку, находящуюся ниже. Но учтите, что большинство клавиатур поддерживают только ограниченное количество одновременных нажатий клавиш и поэтому не подходят для многопользовательской игры. (Однако вы можете решить эту проблему подключением нескольких клавиатур к компьютеру. Но даже в этом случае нужно назначать различные сочетания клавиш.)"
#. I18N: In the 'add new input device' dialog
#: src/states_screens/dialogs/add_device_dialog.cpp:90
@ -3434,7 +3435,7 @@ msgstr "Имя не задано."
#: src/states_screens/grand_prix_editor_screen.cpp:359
msgid "Another grand prix with this name already exists."
msgstr "Уже существует Гран-при с таким же названием."
msgstr "Гран-при с таким же названием уже существует."
#: src/states_screens/grand_prix_editor_screen.cpp:365
msgid "Name is too long."
@ -3467,7 +3468,7 @@ msgstr "Заблокировано"
msgid ""
"Everyone:\n"
"Press the 'Select' button to join the game"
msgstr "Всем:\nДля присоединения к игре нажмите клавишу \"Выбрать\" "
msgstr "Всем:\nДля присоединения к игре нажмите клавишу «Выбрать»"
#: src/states_screens/main_menu_screen.cpp:510
msgid ""
@ -3512,7 +3513,7 @@ msgstr "Профиль %s"
#: src/states_screens/online_profile_friends.cpp:75
msgid "Since"
msgstr "С"
msgstr " Дата"
#: src/states_screens/online_profile_friends.cpp:76
msgid "Status"
@ -3683,7 +3684,7 @@ msgstr "Сенсорное устройство"
msgid ""
"In multiplayer mode, players can select handicapped (more difficult) "
"profiles on the kart selection screen"
msgstr "В многопользовательском режиме игроки могут выбрать профили гандикапа (сложности) на экране выбора карта."
msgstr "В многопользовательском режиме игроки могут выбрать профили гандикапа (сложности) на экране выбора карта"
#. I18N: in the language choice, to select the same language as the OS
#: src/states_screens/options_screen_ui.cpp:191
@ -3731,7 +3732,7 @@ msgstr "Динамическое освещение: %s"
#: src/states_screens/options_screen_video.cpp:498
#, c-format
msgid "Motion blur: %s"
msgstr "Размытие при движении: %s"
msgstr "Размытие в движении: %s"
#. I18N: in graphical options
#: src/states_screens/options_screen_video.cpp:501
@ -3890,7 +3891,7 @@ msgstr "Вы действительно хотите прервать Гран-
#: src/states_screens/race_result_gui.cpp:499
#: src/states_screens/race_result_gui.cpp:865
msgid "Eliminated"
msgstr "Выбыл из гонки"
msgstr "Выбыл(-а) из гонки"
#: src/states_screens/race_result_gui.cpp:1012
msgid "Red Team Wins"
@ -3939,7 +3940,7 @@ msgstr "Все возможности доступны, так что собир
#: src/states_screens/race_setup_screen.cpp:94
msgid "Contains no powerups, so only your driving skills matter!"
msgstr "Не содержит бонусов, только ваши навыки вождения имеют значение!"
msgstr "Никаких бонусов, важны только ваши навыки вождения!"
#. I18N: short definition for follow-the-leader game mode
#: src/states_screens/race_setup_screen.cpp:107
@ -3986,7 +3987,7 @@ msgstr "Электронная почта должна содержать от 4
#: src/states_screens/register_screen.cpp:299
msgid "Email is invalid!"
msgstr "Недоступная электронная почта!"
msgstr "Недействительная электронная почта!"
#: src/states_screens/register_screen.cpp:362
msgid ""
@ -4074,7 +4075,7 @@ msgstr "Вы действительно хотите удалить игрока
#. formats.
#: src/utils/time.cpp:50
msgid "%d/%m/%Y"
msgstr "%д.%м.%Г"
msgstr "%d.%m.%Y"
#. I18N: Do NOT literally translate this string!! Please enter Y as the
#. translation if your language is a RTL (right-to-left) language,

View File

@ -7,13 +7,14 @@
# Dušan Kazik <prescott66@gmail.com>, 2015
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010
# MiroslavR <miroslavr256@gmail.com>, 2015-2016
# Vladimír Záhradník <vladimir.zahradnik@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-01-05 11:47+0000\n"
"Last-Translator: Vladimír Záhradník <vladimir.zahradnik@gmail.com>\n"
"Language-Team: Slovak (http://www.transifex.com/supertuxkart/supertuxkart/language/sk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -296,7 +297,7 @@ msgstr "Osvetlenie založené na obrázku"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Bloom"
msgstr ""
msgstr "Bloom (rozptýlené svetlo)"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
@ -306,7 +307,7 @@ msgstr "Svetelné lúče"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Ambient Occlusion"
msgstr ""
msgstr "Zatienenie okolím"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
@ -356,12 +357,12 @@ msgstr "Animácia postáv"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Rendered image quality"
msgstr ""
msgstr "Kvalita vykresľovaného obrazu"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Geometry detail"
msgstr ""
msgstr "Geometrické podrobnosti"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
@ -465,12 +466,12 @@ msgstr "Pokračovať"
#. I18N: ./data/gui/track_info.stkgui
#. I18N: In the track info screen
msgid "Record the race for ghost replay"
msgstr ""
msgstr "Nahrať pretek pre opakovačku s duchom"
#. I18N: ./data/gui/ghost_replay_info_dialog.stkgui
#. I18N: Ghost replay info action
msgid "Watch replay only"
msgstr ""
msgstr "Iba pozrieť opakovačku"
#. I18N: ./data/gui/ghost_replay_info_dialog.stkgui
#. I18N: Ghost replay info screen action
@ -486,17 +487,17 @@ msgstr "Začať preteky"
#. I18N: ./data/gui/ghost_replay_selection.stkgui
#. I18N: In the ghost replay selection screen
msgid "Ghost Replay Selection"
msgstr ""
msgstr "Výber opakovačky s duchom"
#. I18N: ./data/gui/ghost_replay_selection.stkgui
#. I18N: In the ghost replay selection screen
msgid "Only show replays matching the current difficulty"
msgstr ""
msgstr "Zobrazovať iba opakovačky odpovedajúce aktuálnej obtiažnosti"
#. I18N: ./data/gui/ghost_replay_selection.stkgui
#. I18N: In the ghost replay selection screen
msgid "Record ghost replay"
msgstr ""
msgstr "Nahrať pre opakovačku s duchom"
#. I18N: ./data/gui/gp_info.stkgui
#. I18N: In the grand prix info screen
@ -609,7 +610,7 @@ msgstr "Herné režimy"
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Multi-player"
msgstr ""
msgstr "Hra viac hráčov"
#. I18N: ./data/gui/help1.stkgui
#. I18N: Tab in help menu
@ -622,11 +623,11 @@ msgstr ""
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Bananas"
msgstr ""
msgstr "Banány"
#. I18N: ./data/gui/help1.stkgui
msgid "Start the tutorial"
msgstr ""
msgstr "Spustiť výuku"
#. I18N: ./data/gui/help1.stkgui
#. I18N: In the help menu
@ -729,7 +730,7 @@ msgstr "Obyčajné preteky: Povoľujú sa všetky údery, tak sa chopte zbraní
msgid ""
"Time Trial: Contains no powerups, so only your driving skills matter! This "
"mode allows you to record the race for replaying."
msgstr ""
msgstr "Pretek na čas: Neobsahuje žiadne bonusy, záleží iba na vašich vodičských schopnostiach! Tento režim umožňuje nahrávať pretek pre neskoršie spätné prehrávanie."
#. I18N: ./data/gui/help3.stkgui
#. I18N: In the help menu
@ -748,7 +749,7 @@ msgstr "Bitka na 3 údery: Triafajte ostatných hráčov zbraňami, kým nepríd
#. I18N: ./data/gui/help3.stkgui
#. I18N: In the help menu
msgid "Soccer: Use your kart to push the ball into the goal."
msgstr ""
msgstr "Futbal: Použite svoju motokáru na natlačenie lopty do bránky."
#. I18N: ./data/gui/help3.stkgui
#. I18N: In the help menu
@ -798,24 +799,24 @@ msgstr "Po nakonfigurovaní vstupných zariadení môžete začať hrať. V hlav
msgid ""
"Hitting a banana can result in one of the following being attached to the "
"kart:"
msgstr ""
msgstr "Náraz do banánu môže mať za následok, že sa pripojí k motokáre jedna z nasledujúcich položiek:"
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid "Anchor - slows down the kart."
msgstr ""
msgstr "Kotva - spomaľuje motokáru."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid "Parachute - slows down the kart less than the anchor."
msgstr ""
msgstr "Padák - spomaľuje motokáru menej než kotva."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid ""
"Bomb - detonates after a short amount of time to throw the kart up in the "
"air. Bump into another kart to transfer the bomb to another player."
msgstr ""
msgstr "Bomba - po chvíli vybuchne a vyhodí motokáru do vzduchu. Nárazom do inej motokáry prehodíte bombu inému hráčovi."
#. I18N: ./data/gui/karts.stkgui
#. I18N: In the kart selection (player setup) screen
@ -904,46 +905,46 @@ msgstr "Ukončiť"
#. I18N: ./data/gui/multitouch_settings.stkgui
msgid "Touch Device Settings"
msgstr ""
msgstr "Nastavenia dotykového zariadenia"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Device enabled"
msgstr ""
msgstr "Zariadenie je povolené"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Inverted buttons"
msgstr ""
msgstr "Prehodené tlačidlá"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Buttons scale"
msgstr ""
msgstr "Rozsah tlačidiel"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Accelerometer"
msgstr ""
msgstr "Akcelerometer"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Advanced"
msgstr ""
msgstr "Pokročilé"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Deadzone"
msgstr ""
msgstr "Zóna smrti"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Sensitivity"
msgstr ""
msgstr "Citlivosť"
#. I18N: ./data/gui/multitouch_settings.stkgui
msgid "Restore defaults"
msgstr ""
msgstr "Obnoviť predvolené nastavenia"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
@ -1208,7 +1209,7 @@ msgstr "Servery"
#. I18N: ./data/gui/online/profile_servers.stkgui
msgid "Local Networking"
msgstr ""
msgstr "Lokálna sieť"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: In the online multiplayer screen
@ -1223,7 +1224,7 @@ msgstr "Vytvoriť server"
#. I18N: ./data/gui/online/profile_servers.stkgui
msgid "Global Networking"
msgstr ""
msgstr "Globálna sieť"
#. I18N: ./data/gui/online/profile_servers.stkgui
#. I18N: In the online multiplayer screen
@ -1501,7 +1502,7 @@ msgstr "Hráte ako"
#. I18N: ./data/gui/options_players.stkgui
#. I18N: In the player configuration screen
msgid "Press enter or double-click on a player to edit their settings"
msgstr ""
msgstr "Stlačte enter alebo dvakrát rýchlo kliknite na hráča, aby ste upravili jeho nastavenia"
#. I18N: ./data/gui/options_players.stkgui
#. I18N: In the player configuration screen
@ -1756,7 +1757,7 @@ msgstr "Vymazať"
#. I18N: ../stk-assets/tracks/abyss/track.xml
msgid "Antediluvian Abyss"
msgstr ""
msgstr "Predpotopná priepasť"
#. I18N: ../stk-assets/tracks/battleisland/track.xml
msgid "Battle Island"
@ -1764,7 +1765,7 @@ msgstr "Boj na ostrove"
#. I18N: ../stk-assets/tracks/candela_city/track.xml
msgid "Candela City"
msgstr ""
msgstr "Mesto Candela"
#. I18N: ../stk-assets/tracks/cave/track.xml
msgid "Cave X"
@ -1776,7 +1777,7 @@ msgstr "Kakaový chrám"
#. I18N: ../stk-assets/tracks/cornfield_crossing/track.xml
msgid "Cornfield Crossing"
msgstr ""
msgstr "Kros kukuričným poľom"
#. I18N: ../stk-assets/tracks/fortmagma/track.xml
msgid "Fort Magma"
@ -1796,7 +1797,7 @@ msgstr "Hacienda"
#. I18N: ../stk-assets/tracks/icy_soccer_field/track.xml
msgid "Icy Soccer Field"
msgstr ""
msgstr "Ľadové futbalové ihrisko"
#. I18N: Cutscene subtitle from ../stk-assets/tracks/introcutscene2/scene.xml
#. I18N: ../stk-assets/tracks/introcutscene2/scene.xml
@ -1827,7 +1828,7 @@ msgstr "No poraziť mňa kráľa motokár sa vám úbohým krpcom nikdy
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
msgstr ""
msgstr "Piesočné duny"
#. I18N: ../stk-assets/tracks/lighthouse/track.xml
msgid "Around the lighthouse"
@ -1883,7 +1884,7 @@ msgstr "Chrám"
#. I18N: ../stk-assets/tracks/volcano_island/track.xml
msgid "Volcan Island"
msgstr ""
msgstr "Sopečný ostrov"
#. I18N: ../stk-assets/tracks/xr591/track.xml
msgid "XR591"
@ -1923,7 +1924,7 @@ msgstr "Hexley"
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
msgstr ""
msgstr "Kiki"
#. I18N: ../stk-assets/karts/konqi/kart.xml
msgid "Konqi"
@ -1972,7 +1973,7 @@ msgstr "Dokončili ste úspech „%s“."
#: src/addons/addons_manager.cpp:104 src/addons/news_manager.cpp:322
msgid "Failed to connect to the SuperTuxKart add-ons server."
msgstr ""
msgstr "Nepodarilo sa pripojiť k serveru doplnkov SuperTuxKart."
#: src/addons/news_manager.cpp:179
#, c-format
@ -2044,16 +2045,16 @@ msgstr "Váš konfiguračný súbor bol príliš starý, takže bol zmazaný a v
#: src/graphics/irr_driver.cpp:535
msgid "Video recording started."
msgstr ""
msgstr "Začalo nahrávanie videa."
#: src/graphics/irr_driver.cpp:541
#, c-format
msgid "Video saved in \"%s\"."
msgstr ""
msgstr "Video uložené do „%s“."
#: src/graphics/irr_driver.cpp:545
msgid "Encoding progress:"
msgstr ""
msgstr "Priebeh kódovania:"
#: src/graphics/irr_driver.cpp:1682
#, c-format
@ -2593,25 +2594,25 @@ msgstr "Ľavá spúšť"
#. I18N: name of stick on gamepads
#: src/input/gamepad_config.cpp:181 src/input/gamepad_config.cpp:244
msgid "Right thumb right"
msgstr ""
msgstr "Pravý palec doprava"
#. I18N: name of buttons on gamepads
#. I18N: name of stick on gamepads
#: src/input/gamepad_config.cpp:183 src/input/gamepad_config.cpp:246
msgid "Right thumb left"
msgstr ""
msgstr "Pravý palec doľava"
#. I18N: name of buttons on gamepads
#. I18N: name of trigger on gamepads
#: src/input/gamepad_config.cpp:185 src/input/gamepad_config.cpp:240
msgid "Right thumb down"
msgstr ""
msgstr "Pravý palec nadol"
#. I18N: name of buttons on gamepads
#. I18N: name of stick on gamepads
#: src/input/gamepad_config.cpp:187 src/input/gamepad_config.cpp:242
msgid "Right thumb up"
msgstr ""
msgstr "Pravý palec nahor"
#. I18N: name of buttons on gamepads
#: src/input/gamepad_config.cpp:189 src/input/gamepad_config.cpp:248
@ -2657,32 +2658,32 @@ msgstr "Start"
#. I18N: name of buttons on gamepads
#: src/input/gamepad_config.cpp:220
msgid "Left thumb button"
msgstr ""
msgstr "Tlačidlo ľavého palca"
#. I18N: name of buttons on gamepads
#: src/input/gamepad_config.cpp:222
msgid "Right thumb button"
msgstr ""
msgstr "Tlačidlo pravého palca"
#. I18N: name of stick on gamepads
#: src/input/gamepad_config.cpp:231
msgid "Left thumb right"
msgstr ""
msgstr "Ľavý palec doprava"
#. I18N: name of stick on gamepads
#: src/input/gamepad_config.cpp:233
msgid "Left thumb left"
msgstr ""
msgstr "Ľavý palec doľava"
#. I18N: name of stick on gamepads
#: src/input/gamepad_config.cpp:235
msgid "Left thumb down"
msgstr ""
msgstr "Ľavý palec nadol"
#. I18N: name of stick on gamepads
#: src/input/gamepad_config.cpp:237
msgid "Left thumb up"
msgstr ""
msgstr "Ľavý palec nahor"
#: src/input/input_manager.cpp:807
#, c-format
@ -2697,13 +2698,13 @@ msgstr "V tejto chvíli môže vykonávať činnosť iba vlastník hry!"
msgid ""
"Connect your wiimote to the Bluetooth manager, then click on Ok. Detailed "
"instructions at supertuxkart.net/Wiimote"
msgstr ""
msgstr "Pripojte svoj Wiimote ovládač v Správe Bluetooth zariadení a potom kliknite na tlačidlo OK. Podrobný návod je na supertuxkart.net/Wiimote"
#: src/input/wiimote_manager.cpp:391
msgid ""
"Press the buttons 1+2 simultaneously on your wiimote to put it in discovery "
"mode, then click on Ok. Detailed instructions at supertuxkart.net/Wiimote"
msgstr ""
msgstr "Súčasne na svojom Wiimote ovládači stlačte tlačidlá 1+2, čím ho prepnete do režimu vyhľadávania. Potom kliknite na tlačidlo Ok. Podrobný návod je na supertuxkart.net/Wiimote"
#: src/input/wiimote_manager.cpp:414
#, c-format
@ -2727,11 +2728,11 @@ msgstr "Nepridávajte plyn pred štartom"
#: src/karts/controller/spare_tire_ai.cpp:147
msgid "You can have at most 3 lives!"
msgstr ""
msgstr "Môžete mať najviac 3 životy!"
#: src/karts/controller/spare_tire_ai.cpp:153
msgid "+1 life."
msgstr ""
msgstr "+1 život."
#: src/karts/kart.cpp:908 src/karts/kart.cpp:913
msgid "You won the race!"
@ -2754,7 +2755,7 @@ msgstr "SuperTuxKart sa môže pripájať na server s cieľom sťahovať doplnky
#: src/main.cpp:1654
msgid "Your screen resolution is too low to run STK."
msgstr ""
msgstr "Rozlíšenie vašej obrazovky je príliš nízke na spustenie STK."
#: src/main.cpp:1668
msgid ""
@ -2766,7 +2767,7 @@ msgstr "Verzia ovládača grafickej karty je príliš stará. Prosím, nainštal
msgid ""
"Your OpenGL version appears to be too old. Please verify if an update for "
"your video driver is available. SuperTuxKart requires %s or better."
msgstr ""
msgstr "Verzia vášho OpenGL sa zdá byť príliš stará. Overte, prosím, či nie je k dispozícii aktualizácia ovládača vašej grafickej karty. SuperTuxKart vyžaduje verziu %s alebo vyššiu."
#: src/modes/easter_egg_hunt.cpp:202
#, c-format
@ -2804,9 +2805,9 @@ msgstr "ZLÁ CESTA!"
#, c-format
msgid "%i spare tire kart has been spawned!"
msgid_plural "%i spare tire karts have been spawned!"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "Vznikla %i náhradná pneumatika pre motokáru!"
msgstr[1] "Vznikli %i náhradné pneumatiky pre motokáru!"
msgstr[2] "Vzniklo %i náhradných pneumatík pre motokáru!"
#: src/modes/world.cpp:1202
msgid "You have been eliminated!"
@ -2820,7 +2821,7 @@ msgstr "'%s' bol(a) vyradený(á)."
#: src/network/protocols/server_lobby.cpp:318
#, c-format
msgid "Failed to register server: %s"
msgstr ""
msgstr "Nepodarilo sa zaregistrovať server: %s"
#: src/network/servers_manager.cpp:198
msgid "No LAN server detected"
@ -2900,12 +2901,12 @@ msgstr "Futbal"
#: src/replay/replay_recorder.cpp:183
msgid "Incomplete replay file will not be saved."
msgstr ""
msgstr "Neúplný súbor s opakovačkou nebude uložený."
#: src/replay/replay_recorder.cpp:219
#, c-format
msgid "Replay saved in \"%s\"."
msgstr ""
msgstr "Opakovačka uložená do „%s\"."
#: src/states_screens/addons_screen.cpp:50
msgid "1 week"
@ -2951,7 +2952,7 @@ msgstr "Dátum aktualizácie"
msgid ""
"Access to the Internet is disabled. (To enable it, go to options and select "
"tab 'User Interface')"
msgstr ""
msgstr "Prístup k internetu je zakázaný. (Pokiaľ ho chcete povoliť, prejdite do ponuky Možnosti a vyberte kartu „Používateľské rozhranie“)"
#. I18N: as in: The Old Island by Johannes Sjolund
#: src/states_screens/addons_screen.cpp:343
@ -3001,9 +3002,9 @@ msgstr "Náhodná aréna"
#, c-format
msgid "%d arena unavailable in single player."
msgid_plural "%d arenas unavailable in single player."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "%d aréna nie je k dispozícii v režime jedného hráča."
msgstr[1] "%d arény nie sú k dispozícii v režime jedného hráča."
msgstr[2] "%d arén nie je k dispozícii v režime jedného hráča."
#: src/states_screens/create_server_screen.cpp:82
msgid "Create LAN Server"
@ -3145,7 +3146,7 @@ msgstr "Zakázané"
#: src/states_screens/dialogs/custom_video_settings.cpp:67
#: src/states_screens/options_screen_video.cpp:462
msgid "Important only"
msgstr ""
msgstr "Iba dôležité"
#. I18N: animations setting (only karts with human players are animated)
#: src/states_screens/dialogs/custom_video_settings.cpp:74
@ -3164,7 +3165,7 @@ msgstr "Povolená pre všetky"
#: src/states_screens/dialogs/custom_video_settings.cpp:102
#: src/states_screens/options_screen_video.cpp:469
msgid "Low"
msgstr ""
msgstr "Nízka"
#. I18N: Geometry level high : everything is displayed
#. I18N: in the graphical options tooltip;
@ -3174,21 +3175,21 @@ msgstr ""
#: src/states_screens/dialogs/custom_video_settings.cpp:103
#: src/states_screens/options_screen_video.cpp:472
msgid "High"
msgstr ""
msgstr "Vysoká"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very low
#: src/states_screens/dialogs/custom_video_settings.cpp:94
#: src/states_screens/options_screen_video.cpp:466
msgid "Very Low"
msgstr ""
msgstr "Veľmi nízka"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very high
#: src/states_screens/dialogs/custom_video_settings.cpp:97
#: src/states_screens/options_screen_video.cpp:475
msgid "Very High"
msgstr ""
msgstr "Veľmi vysoká"
#: src/states_screens/dialogs/message_dialog.cpp:129
#: src/states_screens/edit_gp_screen.cpp:257
@ -3198,11 +3199,11 @@ msgstr "Nie"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:60
msgid "Tablet"
msgstr ""
msgstr "Tablet"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:61
msgid "Phone"
msgstr ""
msgstr "Telefón"
#: src/states_screens/dialogs/recovery_dialog.cpp:121
msgid "Username and/or email address invalid."
@ -3216,7 +3217,7 @@ msgid ""
"the box below, you are confirming that you understand these terms. If you "
"have any questions or comments regarding these terms, one of the members of "
"the development team would gladly assist you."
msgstr ""
msgstr "Prečítajte si, prosím, zmluvné podmienky pre SuperTuxKart na adrese '%s'. S týmito podmienkami musíte súhlasiť, aby ste si mohli zaregistrovať účet pre STK. Zaškrtnutím políčka nižšie potvrdzujete, že týmto podmienkam rozumiete. Pokiaľ máte akékoľvek otázky alebo pripomienky k týmto podmienkam, niektorý z členov vývojového tímu vám rád pomôže."
#: src/states_screens/dialogs/select_challenge.cpp:52
#, c-format
@ -3245,7 +3246,7 @@ msgstr "Zber nitra"
#: src/states_screens/dialogs/select_challenge.cpp:151
#: src/states_screens/race_setup_screen.cpp:136
msgid "Ghost replay race"
msgstr ""
msgstr "Opakovaný pretek s duchom"
#: src/states_screens/dialogs/server_info_dialog.cpp:75
msgid "Server successfully created. You can now join it."
@ -3382,11 +3383,11 @@ msgstr "Odomkli ste grand prix %0"
#: src/states_screens/ghost_replay_selection.cpp:82
msgid "Finish Time"
msgstr ""
msgstr "Konečný čas"
#: src/states_screens/ghost_replay_selection.cpp:83
msgid "User"
msgstr ""
msgstr "Používateľ"
#: src/states_screens/gp_info_screen.cpp:74
msgid "Default"
@ -3405,7 +3406,7 @@ msgstr "Náhodné"
#: src/states_screens/gp_info_screen.cpp:154
#: src/states_screens/gp_info_screen.cpp:179
msgid "Reload"
msgstr ""
msgstr "Znovu načítať"
#: src/states_screens/grand_prix_cutscene.cpp:75
#: src/states_screens/grand_prix_editor_screen.cpp:101
@ -3454,7 +3455,7 @@ msgstr "Náhodná motokára"
#: src/states_screens/kart_selection.cpp:859
msgid "Locked"
msgstr ""
msgstr "Uzamknuté"
#: src/states_screens/kart_selection.cpp:961
msgid ""
@ -3478,7 +3479,7 @@ msgstr "Bez prístupu k internetu nemožno sťahovať doplnky. Ak chcete sťahov
#: src/states_screens/main_menu_screen.cpp:566
msgid "The add-ons module is currently disabled in the Options screen"
msgstr ""
msgstr "Modul „Doplnky“ je momentálne vypnutý v ponuke Možnosti"
#: src/states_screens/main_menu_screen.cpp:578
msgid "Please wait while the add-ons are loading"
@ -3670,13 +3671,13 @@ msgstr "Klávesnica %i"
#: src/states_screens/options_screen_input.cpp:138
msgid "Touch Device"
msgstr ""
msgstr "Dotykové zariadenie"
#: src/states_screens/options_screen_ui.cpp:159
msgid ""
"In multiplayer mode, players can select handicapped (more difficult) "
"profiles on the kart selection screen"
msgstr ""
msgstr "V režime viac hráčov si hráči môžu vybrať profil „hendikepovaný“ (náročnejší) na obrazovke výberu motokár"
#. I18N: in the language choice, to select the same language as the OS
#: src/states_screens/options_screen_ui.cpp:191
@ -3736,7 +3737,7 @@ msgstr "Antialiasing: %s"
#: src/states_screens/options_screen_video.cpp:504
#, c-format
msgid "Ambient occlusion: %s"
msgstr ""
msgstr "Zatienenie okolím: %s"
#: src/states_screens/options_screen_video.cpp:508
#, c-format
@ -3752,7 +3753,7 @@ msgstr "Tiene: %i"
#: src/states_screens/options_screen_video.cpp:513
#, c-format
msgid "Bloom: %s"
msgstr ""
msgstr "Bloom (rozptýlené svetlo): %s"
#. I18N: in graphical options
#: src/states_screens/options_screen_video.cpp:517
@ -3781,7 +3782,7 @@ msgstr "Globálne osvetlenie: %s"
#: src/states_screens/options_screen_video.cpp:534
#, c-format
msgid "Rendered image quality: %s"
msgstr ""
msgstr "Kvalita vykresľovaného obrazu: %s"
#: src/states_screens/race_gui.cpp:358 src/states_screens/race_gui.cpp:360
msgid "Challenge Failed"
@ -3838,7 +3839,7 @@ msgstr "Poradie"
#: src/states_screens/race_gui_overworld.cpp:518
msgid "Press fire to start the tutorial"
msgstr ""
msgstr "Stlačte tlačidlo streľby pre zahájenie výuky"
#: src/states_screens/race_gui_overworld.cpp:557
msgid "Type: Grand Prix"
@ -3850,7 +3851,7 @@ msgstr "Výzvu začnete stlačením tlačidla na útok"
#: src/states_screens/race_result_gui.cpp:175
msgid "Continue."
msgstr ""
msgstr "Pokračovať."
#: src/states_screens/race_result_gui.cpp:178
msgid "Quit the server."
@ -3945,7 +3946,7 @@ msgstr "Triafajte ostatných hráčov zbraňami, kým neprídu o všetky životy
#: src/states_screens/race_setup_screen.cpp:119
msgid "Push the ball into the opposite cage to score goals."
msgstr ""
msgstr "Dotlačte loptu do bránky protihráča."
#: src/states_screens/race_setup_screen.cpp:129
msgid "Explore tracks to find all hidden eggs"
@ -3953,7 +3954,7 @@ msgstr "Nájdite všetky vajíčka poskrývané na tratiach"
#: src/states_screens/race_setup_screen.cpp:137
msgid "Race against ghost karts and try to beat them!"
msgstr ""
msgstr "Pretekajte proti motokáram duchov a skúste ich poraziť!"
#: src/states_screens/register_screen.cpp:218
#: src/states_screens/register_screen.cpp:225
@ -4036,7 +4037,7 @@ msgstr "Jazda naopak"
#. I18N: In the track info screen
#: src/states_screens/track_info_screen.cpp:218
msgid "Random item location"
msgstr ""
msgstr "Náhodné rozmiestnenie položky"
#: src/states_screens/user_screen.cpp:111
msgid "Exit game"

View File

@ -4,13 +4,14 @@
#
# Translators:
# Andrej Znidarsic <andrej.znidarsic@gmail.com>, 2015-2016
# Sasa Batistic <sasa.batistic@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-02-28 13:25+0000\n"
"Last-Translator: Sasa Batistic <sasa.batistic@gmail.com>\n"
"Language-Team: Slovenian (http://www.transifex.com/supertuxkart/supertuxkart/language/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -619,11 +620,11 @@ msgstr "Več igralski način."
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Bananas"
msgstr ""
msgstr "Banane"
#. I18N: ./data/gui/help1.stkgui
msgid "Start the tutorial"
msgstr ""
msgstr "Začni z vodnikom"
#. I18N: ./data/gui/help1.stkgui
#. I18N: In the help menu
@ -800,12 +801,12 @@ msgstr ""
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid "Anchor - slows down the kart."
msgstr ""
msgstr "Sidro - upočasni vozilo."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu
msgid "Parachute - slows down the kart less than the anchor."
msgstr ""
msgstr "Padalo - manj upočasni dirkalnik kot sidro."
#. I18N: ./data/gui/help5.stkgui
#. I18N: In the help menu

View File

@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"PO-Revision-Date: 2017-12-06 00:21+0000\n"
"Last-Translator: yakup <mutouk@yandex.ru>\n"
"Language-Team: Turkish (http://www.transifex.com/supertuxkart/supertuxkart/language/tr/)\n"
"MIME-Version: 1.0\n"
@ -1923,11 +1923,11 @@ msgstr ""
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
msgstr ""
msgstr "Kiki"
#. I18N: ../stk-assets/karts/konqi/kart.xml
msgid "Konqi"
msgstr ""
msgstr "Konqi"
#. I18N: ../stk-assets/karts/nolok/kart.xml
msgid "Nolok"
@ -1935,11 +1935,11 @@ msgstr "Nolok"
#. I18N: ../stk-assets/karts/pidgin/kart.xml
msgid "Pidgin"
msgstr ""
msgstr "Pidgin"
#. I18N: ../stk-assets/karts/puffy/kart.xml
msgid "Puffy"
msgstr ""
msgstr "Puffy"
#. I18N: ../stk-assets/karts/sara_the_racer/kart.xml
msgid "Sara the Racer"
@ -1959,7 +1959,7 @@ msgstr "Tux"
#. I18N: ../stk-assets/karts/wilber/kart.xml
msgid "Wilber"
msgstr ""
msgstr "Wilber"
#. I18N: ../stk-assets/karts/xue/kart.xml
msgid "Xue"

View File

@ -5,13 +5,14 @@
# Translators:
# fedik <fedikw@gmail.com>, 2015-2017
# Max Lyashuk <m_lyashuk@ukr.net>, 2015-2016
# Yaroslav Serhieiev <noomorph@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2018-03-25 14:40+0000\n"
"Last-Translator: Yaroslav Serhieiev <noomorph@gmail.com>\n"
"Language-Team: Ukrainian (http://www.transifex.com/supertuxkart/supertuxkart/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -912,7 +913,7 @@ msgstr "Пристрій увімкнено"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Inverted buttons"
msgstr ""
msgstr "Інвертовані кнопки"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
@ -1825,7 +1826,7 @@ msgstr "Але ви, жалюгідні волоцюги, ніколи не зм
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
msgstr ""
msgstr "Арена Лас Дунас"
#. I18N: ../stk-assets/tracks/lighthouse/track.xml
msgid "Around the lighthouse"

View File

@ -7,13 +7,14 @@
# Benau, 2016
# Benau, 2015-2016
# Jin Zhang <zhangxjin@gmail.com>, 2015
# Jz Pan <acme.pjz@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: SuperTuxKart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-04 20:58-0400\n"
"PO-Revision-Date: 2017-11-13 00:19+0000\n"
"Last-Translator: Auria <auria.mg@gmail.com>\n"
"PO-Revision-Date: 2017-11-14 04:13+0000\n"
"Last-Translator: Jz Pan <acme.pjz@gmail.com>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/supertuxkart/supertuxkart/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -356,12 +357,12 @@ msgstr "角色动画"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Rendered image quality"
msgstr ""
msgstr "渲染图像质量"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
msgid "Geometry detail"
msgstr ""
msgstr "几何细节"
#. I18N: ./data/gui/custom_video_settings.stkgui
#. I18N: Video settings
@ -622,11 +623,11 @@ msgstr "多人游戏"
#. I18N: ./data/gui/help5.stkgui
#. I18N: Tab in help menu
msgid "Bananas"
msgstr ""
msgstr "香蕉"
#. I18N: ./data/gui/help1.stkgui
msgid "Start the tutorial"
msgstr ""
msgstr "开始教学关"
#. I18N: ./data/gui/help1.stkgui
#. I18N: In the help menu
@ -904,46 +905,46 @@ msgstr "退出"
#. I18N: ./data/gui/multitouch_settings.stkgui
msgid "Touch Device Settings"
msgstr ""
msgstr "触屏设备设置"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Device enabled"
msgstr ""
msgstr "设备启用"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Inverted buttons"
msgstr ""
msgstr "反转按键"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Buttons scale"
msgstr ""
msgstr "按键大小"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Accelerometer"
msgstr ""
msgstr "加速计"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Advanced"
msgstr ""
msgstr "高级"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Deadzone"
msgstr ""
msgstr "死区"
#. I18N: ./data/gui/multitouch_settings.stkgui
#. I18N: In the multitouch settings screen
msgid "Sensitivity"
msgstr ""
msgstr "灵敏度"
#. I18N: ./data/gui/multitouch_settings.stkgui
msgid "Restore defaults"
msgstr ""
msgstr "恢复默认"
#. I18N: ./data/gui/online/change_password.stkgui
#. I18N: In the change password dialog
@ -1764,7 +1765,7 @@ msgstr "战斗之岛"
#. I18N: ../stk-assets/tracks/candela_city/track.xml
msgid "Candela City"
msgstr ""
msgstr "坎德拉城"
#. I18N: ../stk-assets/tracks/cave/track.xml
msgid "Cave X"
@ -1776,7 +1777,7 @@ msgstr "可可寺院"
#. I18N: ../stk-assets/tracks/cornfield_crossing/track.xml
msgid "Cornfield Crossing"
msgstr ""
msgstr "玉米地穿越"
#. I18N: ../stk-assets/tracks/fortmagma/track.xml
msgid "Fort Magma"
@ -1827,7 +1828,7 @@ msgstr " 不过你们这些可怜的小蠢货是永远不可能打败我这个
#. I18N: ../stk-assets/tracks/lasdunasarena/track.xml
msgid "Las Dunas Arena"
msgstr ""
msgstr "Las Dunas 竞技场"
#. I18N: ../stk-assets/tracks/lighthouse/track.xml
msgid "Around the lighthouse"
@ -1923,7 +1924,7 @@ msgstr "Hexley"
#. I18N: ../stk-assets/karts/kiki/kart.xml
msgid "Kiki"
msgstr ""
msgstr "Kiki"
#. I18N: ../stk-assets/karts/konqi/kart.xml
msgid "Konqi"
@ -1972,7 +1973,7 @@ msgstr "完成成就 “%s”。"
#: src/addons/addons_manager.cpp:104 src/addons/news_manager.cpp:322
msgid "Failed to connect to the SuperTuxKart add-ons server."
msgstr ""
msgstr "无法连接到 SuperTuxKart 附加组件服务器。"
#: src/addons/news_manager.cpp:179
#, c-format
@ -2044,16 +2045,16 @@ msgstr "你的配置文件太旧了,新的配置文件已经创建。"
#: src/graphics/irr_driver.cpp:535
msgid "Video recording started."
msgstr ""
msgstr "视频录制开始。"
#: src/graphics/irr_driver.cpp:541
#, c-format
msgid "Video saved in \"%s\"."
msgstr ""
msgstr "视频已保存到 \"%s\"。"
#: src/graphics/irr_driver.cpp:545
msgid "Encoding progress:"
msgstr ""
msgstr "编码进度:"
#: src/graphics/irr_driver.cpp:1682
#, c-format
@ -2725,11 +2726,11 @@ msgstr "请不要在“开始”显示之前加速"
#: src/karts/controller/spare_tire_ai.cpp:147
msgid "You can have at most 3 lives!"
msgstr ""
msgstr "你最多可以有 3 条命!"
#: src/karts/controller/spare_tire_ai.cpp:153
msgid "+1 life."
msgstr ""
msgstr "+1 命"
#: src/karts/kart.cpp:908 src/karts/kart.cpp:913
msgid "You won the race!"
@ -2752,7 +2753,7 @@ msgstr "SuperTuxKart 可能會连接到服务器下载插件并通知你更新
#: src/main.cpp:1654
msgid "Your screen resolution is too low to run STK."
msgstr ""
msgstr "你的屏幕分辨率太低, 无法运行 STK。"
#: src/main.cpp:1668
msgid ""
@ -3133,7 +3134,7 @@ msgstr "已禁用"
#: src/states_screens/dialogs/custom_video_settings.cpp:67
#: src/states_screens/options_screen_video.cpp:462
msgid "Important only"
msgstr ""
msgstr "只有重要的"
#. I18N: animations setting (only karts with human players are animated)
#: src/states_screens/dialogs/custom_video_settings.cpp:74
@ -3152,7 +3153,7 @@ msgstr "启用所有"
#: src/states_screens/dialogs/custom_video_settings.cpp:102
#: src/states_screens/options_screen_video.cpp:469
msgid "Low"
msgstr ""
msgstr ""
#. I18N: Geometry level high : everything is displayed
#. I18N: in the graphical options tooltip;
@ -3162,21 +3163,21 @@ msgstr ""
#: src/states_screens/dialogs/custom_video_settings.cpp:103
#: src/states_screens/options_screen_video.cpp:472
msgid "High"
msgstr ""
msgstr ""
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very low
#: src/states_screens/dialogs/custom_video_settings.cpp:94
#: src/states_screens/options_screen_video.cpp:466
msgid "Very Low"
msgstr ""
msgstr "非常低"
#. I18N: in the graphical options tooltip;
#. indicates the rendered image quality is very high
#: src/states_screens/dialogs/custom_video_settings.cpp:97
#: src/states_screens/options_screen_video.cpp:475
msgid "Very High"
msgstr ""
msgstr "非常高"
#: src/states_screens/dialogs/message_dialog.cpp:129
#: src/states_screens/edit_gp_screen.cpp:257
@ -3186,11 +3187,11 @@ msgstr "否"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:60
msgid "Tablet"
msgstr ""
msgstr "平板电脑"
#: src/states_screens/dialogs/multitouch_settings_dialog.cpp:61
msgid "Phone"
msgstr ""
msgstr "手机"
#: src/states_screens/dialogs/recovery_dialog.cpp:121
msgid "Username and/or email address invalid."
@ -3374,7 +3375,7 @@ msgstr "完成时间"
#: src/states_screens/ghost_replay_selection.cpp:83
msgid "User"
msgstr ""
msgstr "用户"
#: src/states_screens/gp_info_screen.cpp:74
msgid "Default"
@ -3658,7 +3659,7 @@ msgstr "键盘 %i"
#: src/states_screens/options_screen_input.cpp:138
msgid "Touch Device"
msgstr ""
msgstr "触屏设备"
#: src/states_screens/options_screen_ui.cpp:159
msgid ""
@ -3769,7 +3770,7 @@ msgstr "全域照明:%s"
#: src/states_screens/options_screen_video.cpp:534
#, c-format
msgid "Rendered image quality: %s"
msgstr ""
msgstr "渲染图像质量: %s"
#: src/states_screens/race_gui.cpp:358 src/states_screens/race_gui.cpp:360
msgid "Challenge Failed"
@ -3826,7 +3827,7 @@ msgstr "排名"
#: src/states_screens/race_gui_overworld.cpp:518
msgid "Press fire to start the tutorial"
msgstr ""
msgstr "按使用道具键开始教学关"
#: src/states_screens/race_gui_overworld.cpp:557
msgid "Type: Grand Prix"

View File

@ -37,6 +37,7 @@ out vec2 uv;
out vec2 uv_two;
out vec4 color;
out vec4 world_position;
out vec3 world_normal;
out float camdist;
out float hue_change;
@ -52,15 +53,15 @@ void main()
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w));
vec4 v_world_position = getWorldPosition(i_origin, quaternion, i_scale.xyz,
i_position);
vec3 world_normal = rotateVector(quaternion, i_normal.xyz);
vec3 v_world_normal = rotateVector(quaternion, i_normal.xyz);
vec3 world_tangent = rotateVector(quaternion, i_tangent.xyz);
tangent = (u_view_matrix * vec4(world_tangent, 0.0)).xyz;
bitangent = (u_view_matrix *
// bitangent sign
vec4(cross(world_normal, world_tangent) * i_tangent.w, 0.0)
vec4(cross(v_world_normal, world_tangent) * i_tangent.w, 0.0)
).xyz;
normal = (u_view_matrix * vec4(world_normal, 0.0)).xyz;
normal = (u_view_matrix * vec4(v_world_normal, 0.0)).xyz;
uv = vec2(i_uv.x + (i_texture_trans.x * i_normal.w),
i_uv.y + (i_texture_trans.y * i_normal.w));
@ -71,4 +72,5 @@ void main()
hue_change = float(i_misc_data.y) * 0.01;
gl_Position = u_projection_view_matrix * v_world_position;
world_position = v_world_position;
world_normal = v_world_normal;
}

View File

@ -0,0 +1,57 @@
in vec3 bitangent;
in vec4 color;
in float hue_change;
in vec3 normal;
in vec3 tangent;
in vec2 uv;
in float camdist;
layout(location = 0) out vec4 o_diffuse_color;
layout(location = 1) out vec4 o_normal_color;
#stk_include "utils/encode_normal.frag"
#stk_include "utils/rgb_conversion.frag"
#stk_include "utils/sp_texture_sampling.frag"
void main()
{
vec4 col = multi_sampleTextureLayer0(uv, camdist);
if (hue_change > 0.0)
{
float mask = col.a;
vec3 old_hsv = rgbToHsv(col.rgb);
float mask_step = step(mask, 0.5);
#if !defined(Advanced_Lighting_Enabled)
// For similar color
float saturation = mask * 1.825; // 2.5 * 0.5 ^ (1. / 2.2)
#else
float saturation = mask * 2.5;
#endif
vec2 new_xy = mix(vec2(old_hsv.x, old_hsv.y), vec2(hue_change,
max(old_hsv.y, saturation)), vec2(mask_step, mask_step));
vec3 new_color = hsvToRgb(vec3(new_xy.x, new_xy.y, old_hsv.z));
col = vec4(new_color.r, new_color.g, new_color.b, 1.0);
}
vec3 final_color = col.xyz * color.xyz;
#if defined(Advanced_Lighting_Enabled)
vec4 layer_2 = multi_sampleTextureLayer2(uv, camdist);
vec4 layer_3 = multi_sampleTextureLayer3(uv, camdist);
o_diffuse_color = vec4(final_color, layer_2.z);
vec3 tangent_space_normal = 2.0 * layer_3.xyz - 1.0;
vec3 frag_tangent = normalize(tangent);
vec3 frag_bitangent = normalize(bitangent);
vec3 frag_normal = normalize(normal);
mat3 t_b_n = mat3(frag_tangent, frag_bitangent, frag_normal);
vec3 world_normal = t_b_n * tangent_space_normal;
o_normal_color.xy = 0.5 * EncodeNormal(normalize(world_normal)) + 0.5;
o_normal_color.zw = layer_2.xy;
#else
o_diffuse_color = vec4(final_color, 1.0);
#endif
}

View File

@ -0,0 +1,63 @@
in vec3 bitangent;
in vec4 color;
in float hue_change;
in vec3 normal;
in vec3 world_normal;
in vec3 tangent;
in vec2 uv;
layout(location = 0) out vec4 o_diffuse_color;
layout(location = 1) out vec4 o_normal_color;
#stk_include "utils/encode_normal.frag"
#stk_include "utils/rgb_conversion.frag"
#stk_include "utils/sp_texture_sampling.frag"
void main()
{
vec4 col = sampleTextureLayer4(uv * 2.0);
//col = vec4(1.0, 0.0, 0.0, 1.0);
vec4 col_2 = sampleTextureLayer5(uv * 2.0);//vec4(0.0, 1.0, 0.0, 1.0);
float factor = dot(vec3(0.,1.,1.), world_normal);
factor = clamp(factor, 0.0, 1.0);
col = mix(col_2, col, factor);
if (hue_change > 0.0)
{
float mask = col.a;
vec3 old_hsv = rgbToHsv(col.rgb);
float mask_step = step(mask, 0.5);
#if !defined(Advanced_Lighting_Enabled)
// For similar color
float saturation = mask * 1.825; // 2.5 * 0.5 ^ (1. / 2.2)
#else
float saturation = mask * 2.5;
#endif
vec2 new_xy = mix(vec2(old_hsv.x, old_hsv.y), vec2(hue_change,
max(old_hsv.y, saturation)), vec2(mask_step, mask_step));
vec3 new_color = hsvToRgb(vec3(new_xy.x, new_xy.y, old_hsv.z));
col = vec4(new_color.r, new_color.g, new_color.b, 1.0);
}
vec3 final_color = col.xyz * color.xyz;
#if defined(Advanced_Lighting_Enabled)
vec4 layer_2 = sampleTextureLayer2(uv);
vec4 layer_3 = sampleTextureLayer3(uv);
o_diffuse_color = vec4(final_color, layer_2.z);
vec3 tangent_space_normal = 2.0 * layer_3.xyz - 1.0;
vec3 frag_tangent = normalize(tangent);
vec3 frag_bitangent = normalize(bitangent);
vec3 frag_normal = normalize(normal);
mat3 t_b_n = mat3(frag_tangent, frag_bitangent, frag_normal);
vec3 world_normal = t_b_n * tangent_space_normal;
o_normal_color.xy = 0.5 * EncodeNormal(normalize(world_normal)) + 0.5;
o_normal_color.zw = layer_2.xy;
#else
o_diffuse_color = vec4(final_color, 1.0);
#endif
}

View File

@ -0,0 +1,15 @@
<spshader>
<shader-info name="tillingMitigation" fallback-shader="solid" use-tangents="Y"/>
<first-pass vertex-shader="sp_pass.vert"
fragment-shader="sp_tilling_mitigation.frag"
skinned-mesh-shader="sp_skinning.vert">
</first-pass>
<shadow-pass vertex-shader="sp_shadow.vert"
fragment-shader="white.frag"
skinned-mesh-shader="sp_skinning_shadow.vert">
</shadow-pass>
<uniform-assigners>
<uniform-assigner name="layer"
function="shadowCascadeUniformAssigner"/>
</uniform-assigners>
</spshader>

View File

@ -0,0 +1,15 @@
<spshader>
<shader-info name="verticalMapping" fallback-shader="solid" use-tangents="Y"/>
<first-pass vertex-shader="sp_pass.vert"
fragment-shader="sp_vertical_mapping.frag"
skinned-mesh-shader="sp_skinning.vert">
</first-pass>
<shadow-pass vertex-shader="sp_shadow.vert"
fragment-shader="white.frag"
skinned-mesh-shader="sp_skinning_shadow.vert">
</shadow-pass>
<uniform-assigners>
<uniform-assigner name="layer"
function="shadowCascadeUniformAssigner"/>
</uniform-assigners>
</spshader>

View File

@ -6,11 +6,43 @@ uniform sampler2D tex_layer_3;
uniform sampler2D tex_layer_4;
uniform sampler2D tex_layer_5;
#define HIGH_SAMPLING 4.0
#define MEDIUM_SAMPLING 2.0
#define LOW_SAMPLING 1.0
vec4 sampleTextureLayer0(vec2 uv)
{
return texture(tex_layer_0, uv);
}
vec4 multi_sampleTextureLayer0(vec2 uv, float distance)
{
vec4 l_col = sampleTextureLayer0(uv * LOW_SAMPLING);
vec4 m_col = sampleTextureLayer0(uv * MEDIUM_SAMPLING);
vec4 h_col = sampleTextureLayer0(uv * HIGH_SAMPLING);
/* debug
l_col = vec4(1.0, 0.0, 0.0, 1.0);
m_col = vec4(0.0, 1.0, 0.0, 1.0);
h_col = vec4(0.0, 0.0, 1.0, 1.0);*/
// From Low to medium
float factor = distance * 0.02;
factor = pow(factor, 2.5);
factor = clamp(factor, 0.0, 1.0);
vec4 f_col = mix(m_col, l_col, factor);
// From medium to high
factor = distance * 0.1;
factor = pow(factor, 2.5);
factor = clamp(factor, 0.0, 1.0);
f_col = mix(h_col, f_col, factor);
return f_col;
}
vec4 sampleTextureLayer1(vec2 uv)
{
return texture(tex_layer_1, uv);
@ -21,11 +53,57 @@ vec4 sampleTextureLayer2(vec2 uv)
return texture(tex_layer_2, uv);
}
vec4 multi_sampleTextureLayer2(vec2 uv, float distance)
{
vec4 l_col = sampleTextureLayer2(uv * LOW_SAMPLING);
vec4 m_col = sampleTextureLayer2(uv * MEDIUM_SAMPLING);
vec4 h_col = sampleTextureLayer2(uv * HIGH_SAMPLING);
// From Low to medium
float factor = distance * 0.02;
factor = pow(factor, 2.5);
factor = clamp(factor, 0.0, 1.0);
vec4 f_col = mix(m_col, l_col, factor);
// From medium to high
factor = distance * 0.1;
factor = pow(factor, 2.5);
factor = clamp(factor, 0.0, 1.0);
f_col = mix(h_col, f_col, factor);
return f_col;
}
vec4 sampleTextureLayer3(vec2 uv)
{
return texture(tex_layer_3, uv);
}
vec4 multi_sampleTextureLayer3(vec2 uv, float distance)
{
vec4 l_col = sampleTextureLayer3(uv * LOW_SAMPLING);
vec4 m_col = sampleTextureLayer3(uv * MEDIUM_SAMPLING);
vec4 h_col = sampleTextureLayer3(uv * HIGH_SAMPLING);
// From Low to medium
float factor = distance * 0.02;
factor = pow(factor, 2.5);
factor = clamp(factor, 0.0, 1.0);
vec4 f_col = mix(m_col, l_col, factor);
// From medium to high
factor = distance * 0.1;
factor = pow(factor, 2.5);
factor = clamp(factor, 0.0, 1.0);
f_col = mix(h_col, f_col, factor);
return f_col;
}
vec4 sampleTextureLayer4(vec2 uv)
{
return texture(tex_layer_4, uv);

View File

@ -225,10 +225,12 @@
min/max-start-delay: Minimum and maximum start delay.
See http://www.humanbenchmark.com/tests/reactiontime/stats.php
Average reaction time is around 0.215 s.
nitro-usage: "none", "some", "all": if nitro should be used, and
how much the AI should try to use it good.
non-random-item-usage: If true, use items in a sophisticated way,
otherwise use items randomly.
nitro-usage: Integer determining how well the AI uses nitro, from 0 to 4
0 corresponds to no use ; while 1 to 4 corresponds to various degrees
of quality use (using it immediately for 1 to more context-aware strategies)
item-skill: Integer determining how well the AI use items, from 0 to 5
0 corresponds to no use ; 1 to use after a random time ; while 2 to 5 use
more advanced tactics
collect-avoid-items: if the AI should collect and avoid items,
or just ignore them.
handle-bomb: If the AI should actively try to pass on a bomb.
@ -287,8 +289,8 @@
shield-incoming-radius="0"
false-start-probability="0.08"
min-start-delay="0.3" max-start-delay="0.5"
nitro-usage="none"
non-random-item-usage="false"
nitro-usage="0"
item-skill="1"
collect-avoid-items="false"
handle-bomb="false"
speed-cap="-10:1.0 -5:0.9 5:0.8 20:0.7 50:0.6"
@ -305,8 +307,8 @@
shield-incoming-radius="10"
false-start-probability="0.04"
min-start-delay="0.25" max-start-delay="0.4"
nitro-usage="some"
non-random-item-usage="true"
nitro-usage="1"
item-skill="2"
collect-avoid-items="true"
handle-bomb="false"
speed-cap="10:1.0 50:0.8"
@ -320,11 +322,11 @@
straight-length-for-zipper="35"
use-slipstream="true"
disable-slipstream-usage="false"
shield-incoming-radius="10"
shield-incoming-radius="8"
false-start-probability="0.01"
min-start-delay="0.15" max-start-delay="0.28"
nitro-usage="all"
non-random-item-usage="true"
nitro-usage="2"
item-skill="3"
collect-avoid-items="true"
handle-bomb="true"
speed-cap="20:1.0 50:0.8"
@ -338,11 +340,11 @@
straight-length-for-zipper="35"
use-slipstream="true"
disable-slipstream-usage="false"
shield-incoming-radius="10"
shield-incoming-radius="6"
false-start-probability="0.0"
min-start-delay="0.15" max-start-delay="0.2"
nitro-usage="all"
non-random-item-usage="true"
nitro-usage="3"
item-skill="4"
collect-avoid-items="true"
handle-bomb="true"
speed-cap="0:1.0"

View File

@ -48,6 +48,8 @@ CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param)
: CIrrDeviceStub(param),
Accelerometer(0),
Gyroscope(0),
AccelerometerActive(false),
GyroscopeActive(false),
IsMousePressed(false),
GamepadAxisX(0),
GamepadAxisY(0),
@ -246,14 +248,14 @@ bool CIrrDeviceAndroid::run()
accEvent.AccelerometerEvent.X = event.acceleration.x;
accEvent.AccelerometerEvent.Y = event.acceleration.y;
}
accEvent.AccelerometerEvent.Z = event.acceleration.z;
if (accEvent.AccelerometerEvent.X < 0)
{
accEvent.AccelerometerEvent.X *= -1;
accEvent.AccelerometerEvent.Y *= -1;
accEvent.AccelerometerEvent.Z *= -1;
}
accEvent.AccelerometerEvent.Z = event.acceleration.z;
postEventFromUser(accEvent);
break;
@ -769,7 +771,7 @@ s32 CIrrDeviceAndroid::handleGamepad(AInputEvent* androidEvent)
{
event.KeyInput.PressedDown = true;
event.KeyInput.Key = axis_x < 0 ? IRR_KEY_BUTTON_LEFT
: IRR_KEY_BUTTON_RIGHT;
: IRR_KEY_BUTTON_RIGHT;
postEventFromUser(event);
}
@ -790,7 +792,7 @@ s32 CIrrDeviceAndroid::handleGamepad(AInputEvent* androidEvent)
{
event.KeyInput.PressedDown = true;
event.KeyInput.Key = axis_y < 0 ? IRR_KEY_BUTTON_UP
: IRR_KEY_BUTTON_DOWN;
: IRR_KEY_BUTTON_DOWN;
postEventFromUser(event);
}
@ -1210,12 +1212,19 @@ bool CIrrDeviceAndroid::activateAccelerometer(float updateInterval)
DefaultOrientation = getDefaultOrientation();
}
ASensorEventQueue_enableSensor(SensorEventQueue, Accelerometer);
ASensorEventQueue_setEventRate(SensorEventQueue, Accelerometer,
int err = ASensorEventQueue_enableSensor(SensorEventQueue, Accelerometer);
if (err == 0)
{
AccelerometerActive = true;
ASensorEventQueue_setEventRate(SensorEventQueue, Accelerometer,
(int32_t)(updateInterval*1000.f*1000.f)); // in microseconds
os::Printer::log("Activated accelerometer", ELL_DEBUG);
}
os::Printer::log("Activated accelerometer", ELL_DEBUG);
return true;
return AccelerometerActive;
}
bool CIrrDeviceAndroid::deactivateAccelerometer()
@ -1223,15 +1232,20 @@ bool CIrrDeviceAndroid::deactivateAccelerometer()
if (!Accelerometer)
return false;
ASensorEventQueue_disableSensor(SensorEventQueue, Accelerometer);
Accelerometer = 0;
os::Printer::log("Deactivated accelerometer", ELL_DEBUG);
return true;
int err = ASensorEventQueue_disableSensor(SensorEventQueue, Accelerometer);
if (err == 0)
{
AccelerometerActive = false;
os::Printer::log("Deactivated accelerometer", ELL_DEBUG);
}
return !AccelerometerActive;
}
bool CIrrDeviceAndroid::isAccelerometerActive()
{
return (Accelerometer != NULL);
return AccelerometerActive;
}
bool CIrrDeviceAndroid::isAccelerometerAvailable()
@ -1250,12 +1264,19 @@ bool CIrrDeviceAndroid::activateGyroscope(float updateInterval)
if (!isGyroscopeAvailable())
return false;
ASensorEventQueue_enableSensor(SensorEventQueue, Gyroscope);
ASensorEventQueue_setEventRate(SensorEventQueue, Gyroscope,
int err = ASensorEventQueue_enableSensor(SensorEventQueue, Gyroscope);
if (err == 0)
{
GyroscopeActive = true;
ASensorEventQueue_setEventRate(SensorEventQueue, Gyroscope,
(int32_t)(updateInterval*1000.f*1000.f)); // in microseconds
os::Printer::log("Activated gyroscope", ELL_DEBUG);
return true;
os::Printer::log("Activated gyroscope", ELL_DEBUG);
}
return GyroscopeActive;
}
bool CIrrDeviceAndroid::deactivateGyroscope()
@ -1263,15 +1284,20 @@ bool CIrrDeviceAndroid::deactivateGyroscope()
if (!Gyroscope)
return false;
ASensorEventQueue_disableSensor(SensorEventQueue, Gyroscope);
Gyroscope = 0;
os::Printer::log("Deactivated gyroscope", ELL_DEBUG);
return true;
int err = ASensorEventQueue_disableSensor(SensorEventQueue, Gyroscope);
if (err == 0)
{
GyroscopeActive = false;
os::Printer::log("Deactivated gyroscope", ELL_DEBUG);
}
return !GyroscopeActive;
}
bool CIrrDeviceAndroid::isGyroscopeActive()
{
return (Gyroscope != NULL);
return GyroscopeActive;
}
bool CIrrDeviceAndroid::isGyroscopeAvailable()

View File

@ -111,6 +111,8 @@ namespace irr
ASensorEventQueue* SensorEventQueue;
const ASensor* Accelerometer;
const ASensor* Gyroscope;
bool AccelerometerActive;
bool GyroscopeActive;
static bool IsPaused;
static bool IsFocused;

View File

@ -163,7 +163,7 @@ void STKConfig::init_defaults()
UNDEFINED;
m_physics_fps = -100;
m_bubblegum_counter = -100;
m_shield_restrict_weapos = false;
m_shield_restrict_weapons = false;
m_max_karts = -100;
m_max_skidmarks = -100;
m_min_kart_version = -100;
@ -342,8 +342,8 @@ void STKConfig::getAllData(const XMLNode * root)
if(const XMLNode *bubblegum_node= root->getNode("bubblegum"))
{
bubblegum_node->get("disappear-counter", &m_bubblegum_counter );
bubblegum_node->get("restrict-weapons", &m_shield_restrict_weapos);
bubblegum_node->get("disappear-counter", &m_bubblegum_counter );
bubblegum_node->get("restrict-weapons", &m_shield_restrict_weapons);
}
if(const XMLNode *explosion_node= root->getNode("explosion"))

View File

@ -72,7 +72,7 @@ public:
float m_item_switch_time; /**< Time items will be switched. */
int m_bubblegum_counter; /**< How many times bubble gums must be
driven over before they disappear. */
bool m_shield_restrict_weapos; /**<Wether weapon usage is punished. */
bool m_shield_restrict_weapons; /**<Wether weapon usage is punished. */
float m_explosion_impulse_objects; /**<Impulse of explosion on moving
objects, e.g. road cones, ... */
float m_penalty_time; /**< Penalty time when starting too

View File

@ -37,23 +37,23 @@ typedef std::string KeyboardLayout[KEYBOARD_ROWS_NUM][KEYBOARD_COLS_NUM];
KeyboardLayout layout_lower =
{{"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "123" },
{"a", "s", "d", "f", "g", "h", "j", "k", "l", "Back", "Shift"},
{"a", "s", "d", "f", "g", "h", "j", "k", "l", "Shift", "Back" },
{"z", "x", "c", "v", "b", "n", "m", ",", ".", "Space", "Enter"}};
KeyboardLayout layout_upper =
{{"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "123" },
{"A", "S", "D", "F", "G", "H", "J", "K", "L", "Back", "Shift"},
{"A", "S", "D", "F", "G", "H", "J", "K", "L", "Shift", "Back" },
{"Z", "X", "C", "V", "B", "N", "M", ",", ".", "Space", "Enter"}};
KeyboardLayout layout_digits =
{{"1", "2", "3", "!", "@", "#", "$", "%", "^", "&", "Text" },
{"4", "5", "6", "*", "(", ")", "-", "_", "=", "Back", "Shift"},
{"7", "8", "9", "0", "+", "/", "?", ",", ".", "Space", "Enter"}};
{{"1", "2", "3", "!", "@", "#", "$", "%", "^", "&", "Text" },
{"4", "5", "6", "*", "(", ")", "-", "+", "?", "Shift", "Back" },
{"7", "8", "9", "0", "\"", ";", ":", ",", ".", "Space", "Enter"}};
KeyboardLayout layout_digits2 =
{{"1", "2", "3", "[", "]", "{", "}", ";", ":", "\\", "Text" },
{"4", "5", "6", "|", "\'", "\"", "<", ">", "`", "Back", "Shift"},
{"7", "8", "9", "0", "~", "/", "?", ",", ".", "Space", "Enter"}};
{{"1", "2", "3", "[", "]", "{", "}", "~", "`", "\\", "Text" },
{"4", "5", "6", "|", "<", ">", "_", "=", "/", "Shift", "Back" },
{"7", "8", "9", "0", "\'", ";", ":", ",", ".", "Space", "Enter"}};
ScreenKeyboard* ScreenKeyboard::m_screen_keyboard = NULL;

View File

@ -29,9 +29,13 @@
*/
void Binding::save(std::ofstream& stream) const
{
stream << "id=\"" << m_id << "\" "
<< "event=\"" << m_type << "\" "
<< "character=\"" << m_character << "\" ";
stream << "event=\"" << m_type << "\" ";
stream << "id=\"" << m_id << "\" ";
if (m_type == Input::IT_KEYBOARD)
{
stream << "character=\"" << m_character << "\" ";
}
// Only serialize the direction and the range for stick motions
if (m_type == Input::IT_STICKMOTION)

View File

@ -459,6 +459,8 @@ void DeviceManager::updateMultitouchDevice()
{
m_multitouch_device->setPlayer(NULL);
}
m_multitouch_device->updateController();
} // updateMultitouchDevice
//-----------------------------------------------------------------------------
@ -641,6 +643,18 @@ void DeviceManager::save()
configfile << "<input version=\"" << INPUT_FILE_VERSION << "\">\n\n";
configfile << "<!--\n"
<< "Event 1 : Keyboard button press\n"
<< " 'id' indicates which button, as defined by irrlicht's EKEY_CODE enum\n"
<< " 'character' contains the associated unicode character.\n"
<< " Only used as fallback when displaying special characters in the UI.\n"
<< "Event 2 : Gamepad stick motion\n"
<< " 'id' indicates which stick, starting from 0\n"
<< " 'direction' 0 means negative, 1 means positive\n"
<< "Event 3 : Gamepad button press\n"
<< " 'id' indicates which button, starting from 0\n"
<< "-->\n\n";
for(unsigned int n=0; n<m_keyboard_configs.size(); n++)
{
m_keyboard_configs[n].save(configfile);

View File

@ -1192,20 +1192,10 @@ EventPropagation InputManager::input(const SEvent& event)
if (device && device->isAccelerometerActive())
{
m_device_manager->updateMultitouchDevice();
for (unsigned int i = 0; i < device->getButtonsCount(); i++)
{
MultitouchButton* button = device->getButton(i);
if (button->type != BUTTON_STEERING)
continue;
float factor = UserConfigParams::m_multitouch_tilt_factor;
factor = std::max(factor, 0.1f);
button->axis_x = (float)event.AccelerometerEvent.Y / factor;
device->handleControls(button);
}
float factor = UserConfigParams::m_multitouch_tilt_factor;
factor = std::max(factor, 0.1f);
device->updateAxisX(event.AccelerometerEvent.Y / factor);
}
}

View File

@ -36,7 +36,7 @@ MultitouchDevice::MultitouchDevice()
m_type = DT_MULTITOUCH;
m_name = "Multitouch";
m_player = NULL;
m_accelerometer_active = false;
m_controller = NULL;
#ifdef ANDROID
m_android_device = dynamic_cast<CIrrDeviceAndroid*>(
irr_driver->getDevice());
@ -136,22 +136,6 @@ void MultitouchDevice::addButton(MultitouchButtonType type, int x, int y,
}
m_buttons.push_back(button);
#ifdef ANDROID
if (button->type == MultitouchButtonType::BUTTON_STEERING)
{
if (UserConfigParams::m_multitouch_controls == 2 &&
!m_android_device->isAccelerometerActive())
{
m_android_device->activateAccelerometer(1.0f / 30);
if (m_android_device->isAccelerometerActive())
{
m_accelerometer_active = true;
}
}
}
#endif
} // addButton
// ----------------------------------------------------------------------------
@ -159,15 +143,6 @@ void MultitouchDevice::addButton(MultitouchButtonType type, int x, int y,
*/
void MultitouchDevice::clearButtons()
{
#ifdef ANDROID
if (m_accelerometer_active == true &&
m_android_device->isAccelerometerActive())
{
m_android_device->deactivateAccelerometer();
m_accelerometer_active = false;
}
#endif
for (MultitouchButton* button : m_buttons)
{
delete button;
@ -198,6 +173,45 @@ void MultitouchDevice::reset()
}
} // reset
// ----------------------------------------------------------------------------
/** Activates accelerometer
*/
void MultitouchDevice::activateAccelerometer()
{
#ifdef ANDROID
if (!m_android_device->isAccelerometerActive())
{
m_android_device->activateAccelerometer(1.0f / 30);
}
#endif
}
// ----------------------------------------------------------------------------
/** Deativates accelerometer
*/
void MultitouchDevice::deactivateAccelerometer()
{
#ifdef ANDROID
if (m_android_device->isAccelerometerActive())
{
m_android_device->deactivateAccelerometer();
}
#endif
}
// ----------------------------------------------------------------------------
/** Get accelerometer state
* \return true if accelerometer is active
*/
bool MultitouchDevice::isAccelerometerActive()
{
#ifdef ANDROID
return m_android_device->isAccelerometerActive();
#endif
return false;
}
// ----------------------------------------------------------------------------
/** The function that is executed when touch event occurs. It updates the
* buttons state when it's needed.
@ -237,21 +251,39 @@ void MultitouchDevice::updateDeviceState(unsigned int event_id)
if (button->type == MultitouchButtonType::BUTTON_STEERING)
{
float prev_axis_x = button->axis_x;
if (button->pressed == true)
{
button->axis_x =
(float)(event.x - button->x) / (button->width/2) - 1;
}
else
{
button->axis_x = 0.0f;
}
if (prev_axis_x != button->axis_x)
{
update_controls = true;
}
}
if (button->type == MultitouchButtonType::BUTTON_STEERING ||
button->type == MultitouchButtonType::BUTTON_UP_DOWN)
{
float prev_axis_y = button->axis_y;
if (button->pressed == true)
{
updateButtonAxes(button,
(float)(event.x - button->x) / (button->width/2) - 1,
(float)(event.y - button->y) / (button->height/2) - 1);
button->axis_y =
(float)(event.y - button->y) / (button->height/2) - 1;
}
else
{
updateButtonAxes(button, 0.0f, 0.0f);
button->axis_y = 0.0f;
}
if (prev_axis_x != button->axis_x ||
prev_axis_y != button->axis_y)
if (prev_axis_y != button->axis_y)
{
update_controls = true;
}
@ -298,35 +330,93 @@ float MultitouchDevice::getSteeringFactor(float value)
m_deadzone_center), 1.0f);
}
/** Updates the button axes. It leaves X axis untouched if the accelerometer is
* used for turning left/right
* \param button A button that should be updated
* \param x A value from 0 to 1
* \param y A value from 0 to 1
*/
void MultitouchDevice::updateButtonAxes(MultitouchButton* button, float x,
float y)
{
if (m_accelerometer_active == false)
{
button->axis_x = x;
}
// ----------------------------------------------------------------------------
button->axis_y = y;
void MultitouchDevice::updateAxisX(float value)
{
if (m_controller == NULL)
return;
if (value < -m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(value));
m_controller->action(PA_STEER_LEFT, int(factor * Input::MAX_VALUE));
}
else if (value > m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(value));
m_controller->action(PA_STEER_RIGHT, int(factor * Input::MAX_VALUE));
}
else
{
m_controller->action(PA_STEER_LEFT, 0);
m_controller->action(PA_STEER_RIGHT, 0);
}
}
// ----------------------------------------------------------------------------
void MultitouchDevice::updateAxisY(float value)
{
if (m_controller == NULL)
return;
if (value < -m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(value));
m_controller->action(PA_ACCEL, int(factor * Input::MAX_VALUE));
}
else if (value > m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(value));
m_controller->action(PA_BRAKE, int(factor * Input::MAX_VALUE));
}
else
{
m_controller->action(PA_BRAKE, 0);
m_controller->action(PA_ACCEL, 0);
}
}
// ----------------------------------------------------------------------------
/** Sends proper action for player controller depending on the button type
* and state.
* \param button The button that should be handled.
*/
void MultitouchDevice::handleControls(MultitouchButton* button)
{
if (m_player == NULL)
if (m_controller == NULL)
return;
if (button->type == MultitouchButtonType::BUTTON_STEERING)
{
updateAxisX(button->axis_x);
updateAxisY(button->axis_y);
}
else if (button->type == MultitouchButtonType::BUTTON_UP_DOWN)
{
updateAxisY(button->axis_y);
}
else
{
if (button->action != PA_BEFORE_FIRST)
{
int value = button->pressed ? Input::MAX_VALUE : 0;
m_controller->action(button->action, value);
}
}
}
// ----------------------------------------------------------------------------
void MultitouchDevice::updateController()
{
if (m_player == NULL)
{
m_controller = NULL;
return;
}
// Handle multitouch events only when race is running. It avoids to process
// it when pause dialog is active during the race. And there is no reason
@ -335,60 +425,20 @@ void MultitouchDevice::handleControls(MultitouchButton* button)
GUIEngine::ModalDialog::isADialogActive() ||
GUIEngine::ScreenKeyboard::isActive() ||
race_manager->isWatchingReplay())
{
m_controller = NULL;
return;
}
AbstractKart* pk = m_player->getKart();
if (pk == NULL)
return;
Controller* controller = pk->getController();
if (controller == NULL)
return;
if (button->type == MultitouchButtonType::BUTTON_STEERING)
{
if (button->axis_y < -m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(button->axis_y));
controller->action(PA_ACCEL, int(factor * Input::MAX_VALUE));
}
else if (button->axis_y > m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(button->axis_y));
controller->action(PA_BRAKE, int(factor * Input::MAX_VALUE));
}
else
{
controller->action(PA_BRAKE, 0);
controller->action(PA_ACCEL, 0);
}
m_controller = NULL;
return;
}
if (button->axis_x < -m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(button->axis_x));
controller->action(PA_STEER_LEFT, int(factor * Input::MAX_VALUE));
}
else if (button->axis_x > m_deadzone_center)
{
float factor = getSteeringFactor(std::abs(button->axis_x));
controller->action(PA_STEER_RIGHT, int(factor * Input::MAX_VALUE));
}
else
{
controller->action(PA_STEER_LEFT, 0);
controller->action(PA_STEER_RIGHT, 0);
}
}
else
{
if (button->action != PA_BEFORE_FIRST)
{
int value = button->pressed ? Input::MAX_VALUE : 0;
controller->action(button->action, value);
}
}
} // handleControls
m_controller = pk->getController();
}
// ----------------------------------------------------------------------------

View File

@ -34,6 +34,7 @@
enum MultitouchButtonType
{
BUTTON_STEERING,
BUTTON_UP_DOWN,
BUTTON_FIRE,
BUTTON_NITRO,
BUTTON_SKIDDING,
@ -68,11 +69,15 @@ struct MultitouchButton
float axis_y;
};
class Controller;
class MultitouchDevice : public InputDevice
{
private:
/** The list of pointers to all created buttons */
std::vector<MultitouchButton*> m_buttons;
Controller* m_controller;
/** The parameter that is used for steering button and determines dead area
* in a center of button */
@ -82,16 +87,13 @@ private:
* at the edge of button */
float m_deadzone_edge;
/** True if accelerometer is in use */
bool m_accelerometer_active;
#ifdef ANDROID
/** Pointer to the Android irrlicht device */
CIrrDeviceAndroid* m_android_device;
#endif
float getSteeringFactor(float value);
void updateButtonAxes(MultitouchButton* button, float x, float y);
void handleControls(MultitouchButton* button);
public:
/** The array that contains data for all multitouch input events */
@ -119,12 +121,14 @@ public:
/** Returns pointer to the selected button */
MultitouchButton* getButton(unsigned int i) {return m_buttons.at(i);}
/** True if accelerometer is in use */
bool isAccelerometerActive() {return m_accelerometer_active;}
void activateAccelerometer();
void deactivateAccelerometer();
bool isAccelerometerActive();
void updateAxisX(float value);
void updateAxisY(float value);
void updateDeviceState(unsigned int event_id);
void handleControls(MultitouchButton* button);
void updateController();
void updateConfigParams();
}; // MultitouchDevice

View File

@ -58,13 +58,13 @@ void AssetsAndroid::init()
if (getenv("SUPERTUXKART_DATADIR"))
paths.push_back(getenv("SUPERTUXKART_DATADIR"));
if (getenv("EXTERNAL_STORAGE"))
paths.push_back(getenv("EXTERNAL_STORAGE"));
if (getenv("SECONDARY_STORAGE"))
paths.push_back(getenv("SECONDARY_STORAGE"));
if (global_android_app->activity->externalDataPath)
paths.push_back(global_android_app->activity->externalDataPath);
@ -88,6 +88,12 @@ void AssetsAndroid::init()
for (std::string path : paths)
{
Log::info("AssetsAndroid", "Check data files in: %s", path.c_str());
if (!isWritable(path))
{
Log::info("AssetsAndroid", "Path doesn't have write access.");
continue;
}
if (m_file_manager->fileExists(path + "/" + app_dir_name + "/data/" + version))
{
@ -113,6 +119,12 @@ void AssetsAndroid::init()
{
Log::info("AssetsAndroid", "Check data files for different STK "
"version in: %s", path.c_str());
if (!isWritable(path))
{
Log::info("AssetsAndroid", "Path doesn't have write access.");
continue;
}
if (m_file_manager->fileExists(path + "/" + app_dir_name + "/.extracted"))
{
@ -498,6 +510,20 @@ void AssetsAndroid::touchFile(std::string path)
#endif
}
//-----------------------------------------------------------------------------
/** Checks if there is write access for selected path
* \param path A path that should be checked
* \return True if there is write access
*/
bool AssetsAndroid::isWritable(std::string path)
{
#ifdef ANDROID
return access(path.c_str(), R_OK) == 0 && access(path.c_str(), W_OK) == 0;
#endif
return false;
}
//-----------------------------------------------------------------------------
/** Determines best path for extracting assets, depending on available disk
* space.
@ -519,6 +545,9 @@ std::string AssetsAndroid::getPreferredPath(const std::vector<std::string>&
// to clean up device
if (path.find("/data") == 0)
continue;
if (!isWritable(path))
continue;
struct statfs stat;

View File

@ -34,6 +34,7 @@ private:
bool extractDir(std::string dir_name);
void removeData();
void touchFile(std::string path);
bool isWritable(std::string path);
std::string getPreferredPath(const std::vector<std::string>& paths);
public:

View File

@ -257,7 +257,7 @@ void Powerup::use()
case PowerupManager::POWERUP_RUBBERBALL:
case PowerupManager::POWERUP_BOWLING:
case PowerupManager::POWERUP_PLUNGER:
if(stk_config->m_shield_restrict_weapos)
if(stk_config->m_shield_restrict_weapons)
m_kart->setShieldTime(0.0f); // make weapon usage destroy the shield
Powerup::adjustSound();
m_sound_use->play();

View File

@ -153,3 +153,32 @@ bool ProjectileManager::projectileIsClose(const AbstractKart * const kart,
}
return false;
} // projectileIsClose
// -----------------------------------------------------------------------------
/** Returns an int containing the numbers of a given flyable in a given radius
* around the kart
* \param kart The kart for which the test is done.
* \param radius Distance within which the projectile must be.
* \param type The type of projectile checked
*/
int ProjectileManager::getNearbyProjectileCount(const AbstractKart * const kart,
float radius, PowerupManager::PowerupType type)
{
float r2 = radius*radius;
int projectileCount = 0;
for(Projectiles::iterator i = m_active_projectiles.begin();
i != m_active_projectiles.end(); i++)
{
if ((*i)->getType() == type)
{
float dist2 = (*i)->getXYZ().distance2(kart->getXYZ());
if(dist2<r2)
{
projectileCount++;
}
}
}
return projectileCount;
} // getNearbyProjectileCount

View File

@ -65,6 +65,9 @@ public:
void removeTextures ();
bool projectileIsClose(const AbstractKart * const kart,
float radius);
int getNearbyProjectileCount(const AbstractKart * const kart,
float radius, PowerupManager::PowerupType type);
// ------------------------------------------------------------------------
/** Adds a special hit effect to be shown.
* \param hit_effect The hit effect to be added. */

View File

@ -636,8 +636,8 @@ void RubberBall::updateDistanceToTarget()
const LinearWorld *world = dynamic_cast<LinearWorld*>(World::getWorld());
float target_distance =
world->getDistanceDownTrackForKart(m_target->getWorldKartId());
float ball_distance = getDistanceFromStart();
world->getDistanceDownTrackForKart(m_target->getWorldKartId(), true);
float ball_distance = getDistanceFromStart(true);
m_distance_to_target = target_distance - ball_distance;
if(m_distance_to_target < 0)

View File

@ -286,7 +286,20 @@ public:
* e.g. in Ghost.
* \param category Which category to report on. */
virtual float getSpeedIncreaseTimeLeft(unsigned int category) const = 0;
// ------------------------------------------------------------------------
/** Sets the kart AI boost state.
* Not pure abstract, since there is no need to implement this e.g. in Ghost.
* \param boosted True if a boost should be applied. */
virtual void setBoostAI(bool boosted) = 0;
// ------------------------------------------------------------------------
/** Returns the kart AI boost state.
* Not pure abstract, since there is no need to implement this e.g. in Ghost. */
virtual bool getBoostAI() const = 0;
// ------------------------------------------------------------------------
/** Sets an increased maximum speed for a category.
* \param category The category for which to set the higher maximum speed.
* \param add_speed How much speed (in m/s) is added to the maximum speed.
@ -379,6 +392,9 @@ public:
/** Returns the current powerup. */
virtual Powerup *getPowerup() = 0;
// ------------------------------------------------------------------------
/** Returns the last used powerup type. */
virtual PowerupManager::PowerupType getLastUsedPowerup() = 0;
// ------------------------------------------------------------------------
/** Returns a points to this kart's graphical effects. */
virtual KartGFX* getKartGFX() = 0;
// ------------------------------------------------------------------------

View File

@ -43,9 +43,9 @@ AIProperties::AIProperties(RaceManager::Difficulty difficulty)
m_make_use_of_slipstream = false;
m_collect_avoid_items = false;
m_handle_bomb = false;
m_item_usage_non_random = false;
m_item_usage_skill = 0;
m_disable_slipstream_usage = false;
m_nitro_usage = NITRO_NONE;
m_nitro_usage = 0;
} // AIProperties
@ -65,7 +65,7 @@ void AIProperties::load(const XMLNode *ai_node)
ai_node->get("straight-length-for-zipper",&m_straight_length_for_zipper);
ai_node->get("rb-skid-probability", &m_skid_probability );
ai_node->get("speed-cap", &m_speed_cap );
ai_node->get("non-random-item-usage", &m_item_usage_non_random );
ai_node->get("item-skill", &m_item_usage_skill );
ai_node->get("collect-avoid-items", &m_collect_avoid_items );
ai_node->get("handle-bomb", &m_handle_bomb );
ai_node->get("skidding-threshold", &m_skidding_threshold );
@ -73,21 +73,8 @@ void AIProperties::load(const XMLNode *ai_node)
ai_node->get("false-start-probability", &m_false_start_probability );
ai_node->get("min-start-delay", &m_min_start_delay );
ai_node->get("max-start-delay", &m_max_start_delay );
ai_node->get("nitro-usage", &m_nitro_usage );
std::string s;
ai_node->get("nitro-usage", &s);
if(s=="none")
m_nitro_usage = NITRO_NONE;
else if(s=="some")
m_nitro_usage = NITRO_SOME;
else if(s=="all")
m_nitro_usage = NITRO_ALL;
else
{
Log::fatal("AIProperties",
"Incorrect nitro-usage '%s' in AI '%s'.",s.c_str(),
m_ident.c_str());
}
// We actually need the square of the distance later
m_bad_item_closeness_2 *= m_bad_item_closeness_2;

View File

@ -111,11 +111,15 @@ protected:
/** If the AI should actively try to pass on a bomb. */
bool m_handle_bomb;
/** True if items should be used better (i.e. non random). */
bool m_item_usage_non_random;
/** Determines the strategies used by the AI for items. 0 is no use,
1 is random use ; 2 to 5 use varying tactics, with 2 having the worst
and 5 the best. */
int m_item_usage_skill;
/** How the AI uses nitro. */
enum {NITRO_NONE, NITRO_SOME, NITRO_ALL} m_nitro_usage;
/** How the AI uses nitro. 0 correspond to no use ; 1 to immediate use
2 to 4 to various levels of mastery (the AI tries to accumulate a reserve
and to use bursts whose size/spacing varies according to the level). */
int m_nitro_usage;
/** TODO: ONLY USE FOR OLD SKIDDING! CAN BE REMOVED once the new skidding
* works as expected.

View File

@ -318,38 +318,41 @@ void SkiddingAI::update(float dt)
// of us.
bool commands_set = false;
if(m_ai_properties->m_handle_bomb &&
m_kart->getAttachment()->getType()==Attachment::ATTACH_BOMB &&
m_kart_ahead )
m_kart->getAttachment()->getType()==Attachment::ATTACH_BOMB)
{
// Use nitro if the kart is far ahead, or faster than this kart
m_controls->setNitro(m_distance_ahead>10.0f ||
m_kart_ahead->getSpeed() > m_kart->getSpeed());
// If we are close enough, try to hit this kart
if(m_distance_ahead<=10)
{
Vec3 target = m_kart_ahead->getXYZ();
//TODO : add logic to allow an AI kart to pass the bomb to a kart
// close behind by slowing/steering slightly
if ( m_kart_ahead != m_kart->getAttachment()->getPreviousOwner())
{
// Use nitro if the kart is far ahead, or faster than this kart
handleNitroAndZipper();
// If we are close enough, try to hit this kart
if(m_distance_ahead<=10)
{
Vec3 target = m_kart_ahead->getXYZ();
// If we are faster, try to predict the point where we will hit
// the other kart
if((m_kart_ahead->getSpeed() < m_kart->getSpeed()) &&
!m_kart_ahead->isGhostKart())
{
float time_till_hit = m_distance_ahead
/ (m_kart->getSpeed()-m_kart_ahead->getSpeed());
target += m_kart_ahead->getVelocity()*time_till_hit;
}
float steer_angle = steerToPoint(target);
setSteering(steer_angle, dt);
commands_set = true;
}
handleRescue(dt);
// If we are faster, try to predict the point where we will hit
// the other kart
if((m_kart_ahead->getSpeed() < m_kart->getSpeed()) &&
!m_kart_ahead->isGhostKart())
{
float time_till_hit = m_distance_ahead
/ (m_kart->getSpeed()-m_kart_ahead->getSpeed());
target += m_kart_ahead->getVelocity()*time_till_hit;
}
float steer_angle = steerToPoint(target);
setSteering(steer_angle, dt);
commands_set = true;
}
handleRescue(dt);
}
}
if(!commands_set)
{
/*Response handling functions*/
handleAcceleration(dt);
handleSteering(dt);
handleItems(dt);
handleSteering(dt); //Item handling relocated there to be direction aware
handleRescue(dt);
handleBraking();
// If a bomb is attached, nitro might already be set.
@ -489,6 +492,8 @@ void SkiddingAI::handleSteering(float dt)
}
//If we are going to crash against a kart, avoid it if it doesn't
//drives the kart out of the road
//TODO : adds item handling to use a cake if available to
//open the road
else if( m_crashes.m_kart != -1 && !m_crashes.m_road )
{
//-1 = left, 1 = right, 0 = no crash.
@ -550,6 +555,9 @@ void SkiddingAI::handleSteering(float dt)
m_curve[CURVE_AIM]->addPoint(aim_point);
#endif
//Manage item utilisation
handleItems(dt, &aim_point, last_node);
// Potentially adjust the point to aim for in order to either
// aim to collect item, or steer to avoid a bad item.
if(m_ai_properties->m_collect_avoid_items)
@ -1132,16 +1140,19 @@ void SkiddingAI::evaluateItems(const Item *item, Vec3 kart_aim_direction,
//-----------------------------------------------------------------------------
/** Handle all items depending on the chosen strategy.
* Either (low level AI) just use an item after 10 seconds, or do a much
* better job on higher level AI - e.g. aiming at karts ahead/behind, wait an
* appropriate time before using multiple items etc.
* Level 0 "AI" : do nothing (not used by default)
* Level 1 "AI" : use items after a random time
* Level 2 to 5 AI : strategy detailed before each item
* Each successive level is overall stronger (5 the strongest, 2 the weakest of
* non-random strategies), but two levels may share a strategy for a given item.
* (level 5 is not yet used ; meant for SuperTux GP preferred karts or boss races)
* \param dt Time step size.
* TODO: Implications of Bubble-Shield for AI's powerup-handling
* STATE: shield on -> avoid usage of offensive items (with certain tolerance)
* STATE: swatter on -> avoid usage of shield
*/
void SkiddingAI::handleItems(const float dt)
void SkiddingAI::handleItems(const float dt, const Vec3 *aim_point, int last_node)
{
m_controls->setFire(false);
if(m_kart->getKartAnimation() ||
@ -1149,7 +1160,15 @@ void SkiddingAI::handleItems(const float dt)
return;
m_time_since_last_shot += dt;
//time since last shot is meant to avoid using the same item
//several times in rapid succession ; not to wait to use a useful
//collected item
if ( m_kart->getPowerup()->getType() != m_kart->getLastUsedPowerup() )
{
m_time_since_last_shot = 50.0f; //The AI may wait if the value is low, so set a high value
}
if (m_superpower == RaceManager::SUPERPOWER_NOLOK_BOSS)
{
m_controls->setLookBack(m_kart->getPowerup()->getType() ==
@ -1172,12 +1191,41 @@ void SkiddingAI::handleItems(const float dt)
}
return;
}
int ai_skill = 0;
if (m_ai_properties->m_item_usage_skill > 0)
{
if (m_ai_properties->m_item_usage_skill > 5)
{
ai_skill = 5;
}
else
{
ai_skill = m_ai_properties->m_item_usage_skill;
}
}
if (m_kart->getBoostAI() == true && ai_skill < 5)
{
ai_skill++; //possible improvement : make the boost amplitude pulled from config
}
// Tactic 1: wait ten seconds, then use item
// Tactic 0: don't use item
// -----------------------------------------
if(!m_ai_properties->m_item_usage_non_random)
if(ai_skill == 0)
{
if( m_time_since_last_shot > 10.0f )
return;
}
// Tactic 1: wait between 5 and 10 seconds, then use item
// ------------------------------------------------------
if(ai_skill == 1)
{
int random_t = 0;
random_t = m_random_skid.get(6); //Reuse the random skid generator
random_t = random_t + 5;
if( m_time_since_last_shot > random_t )
{
m_controls->setFire(true);
m_time_since_last_shot = 0.0f;
@ -1185,67 +1233,206 @@ void SkiddingAI::handleItems(const float dt)
return;
}
// Tactic 2: calculate
// -------------------
// Tactics 2 to 5: calculate
// -----------------------------------------
float min_bubble_time = 2.0f;
int projectile_types[4]; //[3] basket, [2] cakes, [1] plunger, [0] bowling
projectile_types[0] = projectile_manager->getNearbyProjectileCount(m_kart,
m_ai_properties->m_shield_incoming_radius, PowerupManager::POWERUP_BOWLING);
projectile_types[1] = projectile_manager->getNearbyProjectileCount(m_kart,
m_ai_properties->m_shield_incoming_radius, PowerupManager::POWERUP_PLUNGER);
projectile_types[2] = projectile_manager->getNearbyProjectileCount(m_kart,
m_ai_properties->m_shield_incoming_radius, PowerupManager::POWERUP_CAKE);
projectile_types[3] = projectile_manager->getNearbyProjectileCount(m_kart,
m_ai_properties->m_shield_incoming_radius, PowerupManager::POWERUP_RUBBERBALL);
bool projectile_is_close = false;
float shield_radius = m_ai_properties->m_shield_incoming_radius;
if (m_kart->getBoostAI() == true)
{
if (shield_radius == 0)
{
shield_radius = 15;
}
else if (shield_radius >= 3)
{
shield_radius = shield_radius - 2;
}
}
projectile_is_close = projectile_manager->projectileIsClose(m_kart, shield_radius);
// Preparing item list for item aware actions
// Angle to aim_point
Vec3 kart_aim_direction = *aim_point - m_kart->getXYZ();
// Make sure we have a valid last_node
if(last_node==Graph::UNKNOWN_SECTOR)
last_node = m_next_node_index[m_track_node];
int node = m_track_node;
float distance = 0;
std::vector<const Item *> items_to_collect;
std::vector<const Item *> items_to_avoid;
// 1) Filter and sort all items close by
// -------------------------------------
const float max_item_lookahead_distance = 20.0f;
while(distance < max_item_lookahead_distance)
{
int n_index= DriveGraph::get()->getNode(node)->getIndex();
const std::vector<Item *> &items_ahead =
ItemManager::get()->getItemsInQuads(n_index);
for(unsigned int i=0; i<items_ahead.size(); i++)
{
evaluateItems(items_ahead[i], kart_aim_direction,
&items_to_avoid, &items_to_collect);
} // for i<items_ahead;
distance += DriveGraph::get()->getDistanceToNext(node,
m_successor_index[node]);
node = m_next_node_index[node];
// Stop when we have reached the last quad
if(node==last_node) break;
} // while (distance < max_item_lookahead_distance)
//items_to_avoid and items_to_collect now contain the closest item information needed after
//What matters is (a) if the lists are void ; (b) if they are not, what kind of item it is
switch( m_kart->getPowerup()->getType() )
{
// Level 2 : Use the shield immediately after a wait time
// Level 3 : Use the shield against flyables except cakes. Use the shield against bad attachments.
// Use the bubble gum against an enemy close behind, except if holding a swatter.
// Level 4 : Level 3, and protect against cakes too, and use before hitting gum/banana
// Level 5 : Level 4, and use before hitting item box, and let plunger hit
// (can use the shield after)
case PowerupManager::POWERUP_BUBBLEGUM:
{
Attachment::AttachmentType type = m_kart->getAttachment()->getType();
// Don't use shield when we have a swatter.
if( type == Attachment::ATTACH_SWATTER)
break;
Attachment::AttachmentType type = m_kart->getAttachment()->getType();
if((ai_skill == 2) && (m_time_since_last_shot > 2.0f))
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
// Check if a flyable (cake, ...) is close. If so, use bubblegum
// as shield
if(ai_skill == 3) //don't protect against cakes
{
if( !m_kart->isShielded() && projectile_is_close
&& projectile_types[2] == 0)
{
//don't discard swatter against plunger
if( projectile_types[1] == 0
|| (projectile_types[1] >= 1 && type != Attachment::ATTACH_SWATTER))
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
}
}
else if(ai_skill == 4)
{
if( !m_kart->isShielded() && projectile_is_close)
{
//don't discard swatter against plunger
if( projectile_types[1] == 0
|| (projectile_types[1] >= 1 && type != Attachment::ATTACH_SWATTER))
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
}
}
else if (ai_skill == 5) //don't protect against plungers alone TODO : activate after plunger hit
{
if( !m_kart->isShielded() && projectile_is_close)
{
if (projectile_types[0] >=1 || projectile_types[2] >=1 || projectile_types[3] >=1 )
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
}
}
// Check if a flyable (cake, ...) is close. If so, use bubblegum
// as shield
if( !m_kart->isShielded() &&
projectile_manager->projectileIsClose(m_kart,
m_ai_properties->m_shield_incoming_radius) )
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
// Use shield to remove bad attachments
if( type == Attachment::ATTACH_BOMB
|| type == Attachment::ATTACH_PARACHUTE
|| type == Attachment::ATTACH_ANVIL )
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
// Use shield if kart is going to hit a bad item (banana or bubblegum)
if((ai_skill == 4) || (ai_skill == 5))
{
if( !m_kart->isShielded() && items_to_avoid.size()>0)
{
float d = (items_to_avoid[0]->getXYZ() - m_kart->getXYZ()).length2();
if ((ai_skill == 4 && d < 1.5f) || (ai_skill == 5 && d < 0.7f))
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
}
}
// Use shield if kart is going to hit an item box
if (ai_skill == 5)
{
if( !m_kart->isShielded() && items_to_collect.size()>0)
{
float d = (items_to_collect[0]->getXYZ() - m_kart->getXYZ()).length2();
if ((items_to_collect[0]->getType() == Item::ITEM_BONUS_BOX) && (d < 0.7f))
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
}
}
// Avoid dropping all bubble gums one after another
if( m_time_since_last_shot < 2.0f) break;
// Avoid dropping all bubble gums one after another
if( m_time_since_last_shot < 3.0f) break;
// Use bubblegum if the next kart behind is 'close' but not too close
// (too close likely means that the kart is not behind but more to the
// side of this kart and so won't be hit by the bubble gum anyway).
// Should we check the speed of the kart as well? I.e. only drop if
// the kart behind is faster? Otoh this approach helps preventing an
// overtaken kart to overtake us again.
if(m_distance_behind < 15.0f && m_distance_behind > 3.0f )
{
m_controls->setFire(true);
m_controls->setLookBack(true);
break;
}
// If this kart is in its last lap, drop bubble gums at every
// opportunity, since this kart won't envounter them anymore.
LinearWorld *lin_world = dynamic_cast<LinearWorld*>(World::getWorld());
if(m_time_since_last_shot > 3.0f &&
lin_world &&
lin_world->getKartLaps(m_kart->getWorldKartId())
== race_manager->getNumLaps()-1)
{
m_controls->setFire(true);
m_controls->setLookBack(true);
break;
}
break; // POWERUP_BUBBLEGUM
}
// Use bubblegum if the next kart behind is 'close' but not too close
// (too close likely means that the kart is not behind but more to the
// side of this kart and so won't be hit by the bubble gum anyway).
// Should we check the speed of the kart as well? I.e. only drop if
// the kart behind is faster? Otoh this approach helps preventing an
// overtaken kart to overtake us again.
if(m_distance_behind < 10.0f && m_distance_behind > 3.0f )
{
m_controls->setFire(true);
m_controls->setLookBack(true);
break;
}
break; // POWERUP_BUBBLEGUM
}
// Level 2 : Use the cake against any close enemy, with priority to those ahead
// Level 3 : Don't fire on slower karts
// Level 4 : Same as level 3 TODO : Fire if the kart has a swatter which may hit us
// Level 5 : Same as level 4 TODO : Don't fire on a shielded kart if we're just behind (gum)
case PowerupManager::POWERUP_CAKE:
{
// if the kart has a shield, do not break it by using a cake.
if(m_kart->getShieldTime() > min_bubble_time)
if((m_kart->getShieldTime() > min_bubble_time) && (stk_config->m_shield_restrict_weapons == true))
break;
// Leave some time between shots
if(m_time_since_last_shot<3.0f) break;
if(m_time_since_last_shot<2.0f) break;
// Do not fire if the kart is driving too slow
bool kart_behind_is_slow =
@ -1267,9 +1454,12 @@ void SkiddingAI::handleItems(const float dt)
// the kart anyway, or that this might force the kart ahead to
// use its nitro/zipper (and then we will shoot since then the
// kart is faster).
if ((fire_backwards && kart_behind_is_slow) ||
(!fire_backwards && kart_ahead_is_slow) )
break;
if(ai_skill >= 3)
{
if ((fire_backwards && kart_behind_is_slow) ||
(!fire_backwards && kart_ahead_is_slow) )
break;
}
// Don't fire if the kart we are aiming at is invulnerable.
if ((fire_backwards && m_kart_behind && m_kart_behind->isInvulnerable()) ||
@ -1287,15 +1477,20 @@ void SkiddingAI::handleItems(const float dt)
break;
} // POWERUP_CAKE
// Level 2 : Use the bowling ball against enemies with a 5 second delay
// Level 3 : Only 3 seconds of delay
// Level 4 : Same as level 3
// Level 5 : Same as level 4
case PowerupManager::POWERUP_BOWLING:
{
// if the kart has a shield, do not break it by using a bowling ball.
if(m_kart->getShieldTime() > min_bubble_time)
if((m_kart->getShieldTime() > min_bubble_time) && (stk_config->m_shield_restrict_weapons == true))
break;
// Leave more time between bowling balls, since they are
// slower, so it should take longer to hit something which
// can result in changing our target.
if(m_time_since_last_shot < 5.0f) break;
if(ai_skill == 2 && m_time_since_last_shot < 5.0f) break;
if(ai_skill >= 3 && m_time_since_last_shot < 3.0f) break;
// Consider angle towards karts
bool straight_behind = false;
bool straight_ahead = false;
@ -1347,7 +1542,7 @@ void SkiddingAI::handleItems(const float dt)
case PowerupManager::POWERUP_PLUNGER:
{
// if the kart has a shield, do not break it by using a plunger.
if(m_kart->getShieldTime() > min_bubble_time)
if((m_kart->getShieldTime() > min_bubble_time) && (stk_config->m_shield_restrict_weapons == true))
break;
// Leave more time after a plunger, since it will take some
@ -1368,14 +1563,131 @@ void SkiddingAI::handleItems(const float dt)
break;
} // POWERUP_PLUNGER
// Level 2 : Use the switch after a wait time
// Level 3 : Same as level 2 but don't fire if close to a good item
// Level 4 : Same as level 3 and fire if very close to a bad item
// Level 5 : Use if it makes a better item available, or if very close
// to a bad item. Don't use it if too close of a good item.
case PowerupManager::POWERUP_SWITCH:
// For now don't use a switch if this kart is first (since it's more
// likely that this kart then gets a good iteam), otherwise use it
// after a waiting an appropriate time
if(m_kart->getPosition()>1 &&
m_time_since_last_shot > stk_config->m_item_switch_time+2.0f)
m_controls->setFire(true);
break; // POWERUP_SWITCH
{
// It's extremely unlikely two switches are used close one after another
if(ai_skill == 2)
{
if (m_time_since_last_shot > 2.0f)
{
m_controls->setFire(true);
break;
}
}
else if((ai_skill == 3) || (ai_skill == 4))
{
if( (ai_skill == 4) && items_to_avoid.size() > 0)
{
float d = (items_to_avoid[0]->getXYZ() - m_kart->getXYZ()).length2();
if (d < 2.0f)
{
m_controls->setFire(true);
break;
}
}
else if (items_to_collect.size() > 0)
{
float d = (items_to_collect[0]->getXYZ() - m_kart->getXYZ()).length2();
if (d > 10.0f)
{
m_controls->setFire(true);
break;
}
}
else if (m_time_since_last_shot > 2.0f)
{
m_controls->setFire(true);
break;
}
}
//TODO : retrieve ranking powerup class and use it to evaluate the best item
// available depending of if the switch is used or not
// In the mean time big nitro > item box > small nitro
//TODO : make steering switch-aware so that the kart goes towards a bad item
// and use the switch at the last moment
//It would also be possible but complicated to check if using the switch will
//cause another kart not far from taking a bad item instead of a good one
//It should also be possible but complicated to discard items when a good
//and a bad one are two close from one another
else if(ai_skill == 5)
{
//First step : identify the best available item
int i;
int bad = 0;
int good = 0;
//Good will store 1 for nitro, big or small, 2 for item box
//Big nitro are usually hard to take for the AI
for(i=items_to_collect.size()-1; i>=0; i--)
{
if (items_to_collect[i]->getType() == Item::ITEM_BONUS_BOX)
{
good = 2;
i = -1;
}
else if ( (items_to_collect[i]->getType() == Item::ITEM_NITRO_BIG) ||
(items_to_collect[i]->getType() == Item::ITEM_NITRO_SMALL) )
{
good = 1;
}
}
//Bad will store 2 for bananas, 3 for bubble gum
for(i=items_to_avoid.size()-1; i>=0; i--)
{
if (items_to_avoid[i]->getType() == Item::ITEM_BUBBLEGUM)
{
bad = 3;
i = -1;
}
else if ( items_to_avoid[i]->getType() == Item::ITEM_BANANA )
{
bad = 2;
}
}
//Second step : make sure a close item don't make the choice pointless
if( items_to_avoid.size()>0)
{
float d = (items_to_avoid[0]->getXYZ() - m_kart->getXYZ()).length2();
//fire if very close to a bad item
if (d < 2.0f)
{
m_controls->setFire(true);
break;
}
}
if( items_to_collect.size()>0)
{
float d = (items_to_collect[0]->getXYZ() - m_kart->getXYZ()).length2();
//don't fire if close to a good item
if (d < 5.0f)
{
break;
}
}
//Third step : Use or don't use to get the best available item
if( bad > good)
{
m_controls->setFire(true);
break;
}
} //ai_skill == 5
break;
} // POWERUP_SWITCH
case PowerupManager::POWERUP_PARACHUTE:
// Wait one second more than a previous parachute
@ -1399,8 +1711,33 @@ void SkiddingAI::handleItems(const float dt)
}
break; // POWERUP_ANVIL
// Level 2 : Use the swatter immediately after a wait time
// Level 3 : Use the swatter when enemies are close
// Level 4 : Level 3 and use the swatter to remove bad attachments
// Level 5 : Same as level 4.
case PowerupManager::POWERUP_SWATTER:
{
Attachment::AttachmentType type = m_kart->getAttachment()->getType();
if((ai_skill == 2) && (m_time_since_last_shot > 2.0f))
{
m_controls->setFire(true);
break;
}
// Use swatter to remove bad attachments
if((ai_skill == 4) || (ai_skill == 5))
{
if( type == Attachment::ATTACH_BOMB
|| type == Attachment::ATTACH_PARACHUTE
|| type == Attachment::ATTACH_ANVIL )
{
m_controls->setFire(true);
m_controls->setLookBack(false);
break;
}
}
// Squared distance for which the swatter works
float d2 = m_kart->getKartProperties()->getSwatterDistance();
// if the kart has a shield, do not break it by using a swatter.
@ -1421,7 +1758,7 @@ void SkiddingAI::handleItems(const float dt)
}
case PowerupManager::POWERUP_RUBBERBALL:
// if the kart has a shield, do not break it by using a swatter.
if(m_kart->getShieldTime() > min_bubble_time)
if((m_kart->getShieldTime() > min_bubble_time) && (stk_config->m_shield_restrict_weapons == true))
break;
// Perhaps some more sophisticated algorithm might be useful.
// For now: fire if there is a kart ahead (which means that
@ -1582,107 +1919,235 @@ void SkiddingAI::handleRescue(const float dt)
} // handleRescue
//-----------------------------------------------------------------------------
/** Decides wether to use nitro or not.
/** Decides wether to use nitro and zipper or not.
*/
void SkiddingAI::handleNitroAndZipper()
{
//Calculated here and not passed as parameter to not redo all the calls to the function
//May be better to change it
int ai_skill = 0;
if (m_ai_properties->m_item_usage_skill > 0)
{
if (m_ai_properties->m_item_usage_skill > 5)
{
ai_skill = 5;
}
else
{
ai_skill = m_ai_properties->m_item_usage_skill;
}
}
int nitro_skill = 0;
if (m_ai_properties->m_nitro_usage > 0)
{
if (m_ai_properties->m_nitro_usage > 4)
{
nitro_skill = 4;
}
else
{
nitro_skill = m_ai_properties->m_nitro_usage;
}
}
if (m_kart->getBoostAI() == true)
{
if (ai_skill < 5)
{
ai_skill = ai_skill + 1; //possible improvement : make the boost amplitude pulled from config
}
if (nitro_skill < 4)
{
nitro_skill = nitro_skill + 1; //possible improvement : make the boost amplitude pulled from config
}
}
if (m_kart->getPowerup()->getType()!=PowerupManager::POWERUP_ZIPPER)
{
ai_skill = 0; //don't try to use the zipper if there is none
}
//Nitro continue to be advantageous during the fadeout
float nitro_time = ( m_kart->getSpeedIncreaseTimeLeft(MaxSpeed::MS_INCREASE_NITRO)
+ m_kart->getKartProperties()->getNitroFadeOutTime() );
float nitro_max_time = m_kart->getKartProperties()->getNitroDuration()
+ m_kart->getKartProperties()->getNitroFadeOutTime();
//Nitro skill 0 : don't use
//Nitro skill 1 : don't use if the kart is braking, on the ground, has finished the race, has no nitro,
// has a parachute or an anvil attached, or has a plunger in the face.
// Otherwise, use it immediately
//Nitro skill 2 : Don't use nitro if there is more than 1,2 seconds of effect/fadeout left. Use it when at
// max speed or under 5 of speed (after rescue, etc.). Use it to pass bombs.
// Tries to builds a reserve of 4 energy to use towards the end
//Nitro skill 3 : Same as level 2, but don't use until 0,5 seconds of effect/fadeout left, and don't use close
// to bad items, and has a target reserve of 8 energy
//Nitro skill 4 : Same as level 3, but don't use until 0,05 seconds of effect/fadeout left and ignore the plunger
// and has a target reserve of 12 energy
m_controls->setNitro(false);
// If we are already very fast, save nitro.
if(m_kart->getSpeed() > 0.95f*m_kart->getCurrentMaxSpeed())
return;
// Don't use nitro when the AI has a plunger in the face!
if(m_kart->getBlockedByPlungerTime()>0) return;
// Don't use nitro if we are braking
float energy_reserve = 0;
if (nitro_skill == 2)
{
energy_reserve = 4;
}
if (nitro_skill == 3)
{
energy_reserve = 8;
}
if (nitro_skill == 4)
{
energy_reserve = 12;
}
// Don't use nitro or zipper if we are braking
if(m_controls->getBrake()) return;
// Don't use nitro if the kart is not on ground or has finished the race
// Don't use nitro or zipper if the kart is not on ground or has finished the race
if(!m_kart->isOnGround() || m_kart->hasFinishedRace()) return;
// Don't use nitro or zipper when the AI has a plunger in the face!
if(m_kart->getBlockedByPlungerTime()>0)
{
if ((nitro_skill < 4) && (ai_skill < 5))
{
return;
}
else if (nitro_skill < 4)
{
nitro_skill = 0;
}
else if (ai_skill < 5)
{
ai_skill = 0;
}
}
// Don't compute nitro usage if we don't have nitro or are not supposed
// to use it, and we don't have a zipper or are not supposed to use
// it (calculated).
if( (m_kart->getEnergy()==0 ||
m_ai_properties->m_nitro_usage==AIProperties::NITRO_NONE) &&
(m_kart->getPowerup()->getType()!=PowerupManager::POWERUP_ZIPPER ||
!m_ai_properties->m_item_usage_non_random ) )
return;
// If there are items to avoid close, and we only have zippers, don't
// use them (since this make it harder to avoid items).
if(m_avoid_item_close &&
(m_kart->getEnergy()==0 ||
m_ai_properties->m_nitro_usage==AIProperties::NITRO_NONE) )
return;
// If a parachute or anvil is attached, the nitro doesn't give much
// If a parachute or anvil is attached, the nitro and zipper don't give much
// benefit. Better wait till later.
const bool has_slowdown_attachment =
m_kart->getAttachment()->getType()==Attachment::ATTACH_PARACHUTE ||
m_kart->getAttachment()->getType()==Attachment::ATTACH_ANVIL;
if(has_slowdown_attachment) return;
// If the kart is very slow (e.g. after rescue), use nitro
if(m_kart->getSpeed()<5)
// Don't compute nitro usage if we don't have nitro
if( m_kart->getEnergy()==0 )
{
nitro_skill = 0;
}
// Don't use nitro if there is already a nitro boost active
// Nitro effect and fadeout varies between karts type from 2 to 4 seconds
// So vary time according to kart properties
if ((nitro_skill == 4) && nitro_time >= (nitro_max_time*0.01f) )
{
nitro_skill = 0;
}
else if ((nitro_skill == 3) && nitro_time >= (nitro_max_time*0.35f) )
{
nitro_skill = 0;
}
else if ((nitro_skill == 2) && nitro_time >= (nitro_max_time*0.5f) )
{
nitro_skill = 0;
}
// If there are items to avoid close
// Don't use zippers
// Dont use nitro if nitro_skill is 3 or 4
// (since going faster makes it harder to avoid items).
if(m_avoid_item_close && (m_kart->getEnergy()==0 || nitro_skill == 0 || nitro_skill >= 3) )
return;
// If basic AI, use nitro immediately
if (nitro_skill == 1)
{
m_controls->setNitro(true);
return;
}
// If this kart is the last kart, and we have enough
// (i.e. more than 2) nitro, use it.
// -------------------------------------------------
const unsigned int num_karts = m_world->getCurrentNumKarts();
if(m_kart->getPosition()== (int)num_karts &&
num_karts>1 && m_kart->getEnergy()>2.0f)
// Estimate time towards the end of the race.
// Decreases the reserve size when there is an estimate of time remaining
// to the end of less than 2,5 times the maximum nitro effect duration.
// This vary depending on kart characteristic.
// There is a margin because the kart will go a bit faster than predicted
// by the estimate, because the kart may collect more nitro and because
// there may be moments when it's not useful to use nitro (parachutes, etc).
if(nitro_skill >= 2 && energy_reserve > 0.0f)
{
m_controls->setNitro(true);
return;
}
// On the last track shortly before the finishing line, use nitro
// anyway. Since the kart is faster with nitro, estimate a 50% time
// decrease (additionally some nitro will be saved when top speed
// is reached).
if(m_world->getLapForKart(m_kart->getWorldKartId())
==race_manager->getNumLaps()-1 &&
m_ai_properties->m_nitro_usage == AIProperties::NITRO_ALL)
{
float finish =
m_world->getEstimatedFinishTime(m_kart->getWorldKartId());
if( 1.5f*m_kart->getEnergy() >= finish - m_world->getTime() )
float finish = m_world->getEstimatedFinishTime(m_kart->getWorldKartId()) - m_world->getTime();
float max_time_effect = nitro_max_time / m_kart->getKartProperties()->getNitroConsumption()
* m_kart->getEnergy()*2; //the minimum burst consumes around 0,5 energy
// The burster forces the AI to consume its reserve by series of 2 bursts
// Otherwise the bursting differences of the various nitro skill wouldn't matter here
// In short races, most AI nitro usage may be at the end with the reserve
float burster;
if ( nitro_time > 0)
{
m_controls->setNitro(true);
return;
burster = 2*nitro_max_time;
}
else
{
burster = 0;
}
if( (2.5f*max_time_effect) >= (finish - burster) )
{
// Absolute reduction to avoid small amount of unburned nitro at the end
energy_reserve = (finish - burster)/(2.5f*max_time_effect/m_kart->getEnergy()) - 0.5f ;
}
}
// A kart within this distance is considered to be overtaking (or to be
// overtaken).
const float overtake_distance = 10.0f;
// Try to overtake a kart that is close ahead, except
// when we are already much faster than that kart
// --------------------------------------------------
if(m_kart_ahead &&
m_distance_ahead < overtake_distance &&
m_kart_ahead->getSpeed()+5.0f > m_kart->getSpeed() )
// If trying to pass a bomb to a kart faster or far ahead, use nitro reserve
if(m_kart->getAttachment()->getType() == Attachment::ATTACH_BOMB
&& nitro_skill >= 2 && energy_reserve > 0.0f)
{
m_controls->setNitro(true);
return;
if (m_distance_ahead>10.0f || m_kart_ahead->getSpeed() > m_kart->getSpeed() )
{
energy_reserve = 0 ;
}
}
// Don't use nitro if building an energy reserve
if (m_kart->getEnergy() <= energy_reserve)
{
nitro_skill = 0;
}
if(m_kart_behind &&
m_distance_behind < overtake_distance &&
m_kart_behind->getSpeed() > m_kart->getSpeed() )
// If the kart is very slow (e.g. after rescue), use nitro
if(nitro_skill > 0 && m_kart->getSpeed()<5 && m_kart->getSpeed()>2)
{
// Only prevent overtaking on highest level
m_controls->setNitro(m_ai_properties->m_nitro_usage
== AIProperties::NITRO_ALL);
m_controls->setNitro(true);
return;
}
// If kart is at max speed, use nitro
// This is to profit from the max speed increase
// And because it means there should be no slowing down from, e.g. plungers
if (nitro_skill > 0 && m_kart->getSpeed() > 0.99f*m_kart->getCurrentMaxSpeed() )
{
m_controls->setNitro(true);
return;
}
if(m_kart->getPowerup()->getType()==PowerupManager::POWERUP_ZIPPER &&
m_kart->getSpeed()>1.0f &&
// If this kart is the last kart, and we have nitro, use it.
// -------------------------------------------------
const unsigned int num_karts = m_world->getCurrentNumKarts();
if(nitro_skill > 0 && m_kart->getPosition()== (int)num_karts &&
num_karts > 1 )
{
m_controls->setNitro(true);
return;
}
// Use zipper
if(ai_skill >= 2 && m_kart->getSpeed()>1.0f &&
m_kart->getSpeedIncreaseTimeLeft(MaxSpeed::MS_INCREASE_ZIPPER)<=0)
{
DriveNode::DirectionType dir;

View File

@ -244,7 +244,8 @@ private:
void handleRaceStart();
void handleAcceleration(const float dt);
void handleSteering(float dt);
void handleItems(const float dt);
void handleItems(const float dt, const Vec3 *aim_point,
int last_node);
void handleRescue(const float dt);
void handleBraking();
void handleNitroAndZipper();

View File

@ -1181,7 +1181,7 @@ void SkiddingAI::handleItems(const float dt)
// Tactic 1: wait ten seconds, then use item
// -----------------------------------------
if(!m_ai_properties->m_item_usage_non_random)
if(m_ai_properties->m_item_usage_skill <= 1)
{
if( m_time_since_last_shot > 10.0f )
{
@ -1652,16 +1652,16 @@ void SkiddingAI::handleNitroAndZipper()
// to use it, and we don't have a zipper or are not supposed to use
// it (calculated).
if( (m_kart->getEnergy()==0 ||
m_ai_properties->m_nitro_usage==AIProperties::NITRO_NONE) &&
m_ai_properties->m_nitro_usage == 0) &&
(m_kart->getPowerup()->getType()!=PowerupManager::POWERUP_ZIPPER ||
!m_ai_properties->m_item_usage_non_random ) )
m_ai_properties->m_item_usage_skill <= 1 ) )
return;
// If there are items to avoid close, and we only have zippers, don't
// use them (since this make it harder to avoid items).
if(m_avoid_item_close &&
(m_kart->getEnergy()==0 ||
m_ai_properties->m_nitro_usage==AIProperties::NITRO_NONE) )
m_ai_properties->m_nitro_usage == 0) )
return;
// If a parachute or anvil is attached, the nitro doesn't give much
// benefit. Better wait till later.
@ -1694,7 +1694,7 @@ void SkiddingAI::handleNitroAndZipper()
// is reached).
if(m_world->getLapForKart(m_kart->getWorldKartId())
==race_manager->getNumLaps()-1 &&
m_ai_properties->m_nitro_usage == AIProperties::NITRO_ALL)
m_ai_properties->m_nitro_usage >= 2)
{
float finish =
m_world->getEstimatedFinishTime(m_kart->getWorldKartId());
@ -1725,8 +1725,7 @@ void SkiddingAI::handleNitroAndZipper()
m_kart_behind->getSpeed() > m_kart->getSpeed() )
{
// Only prevent overtaking on highest level
m_controls->setNitro(m_ai_properties->m_nitro_usage
== AIProperties::NITRO_ALL );
m_controls->setNitro(m_ai_properties->m_nitro_usage >= 2 );
return;
}

View File

@ -77,6 +77,6 @@ public:
// ------------------------------------------------------------------------
virtual void kartIsInRestNow() {};
// ------------------------------------------------------------------------
}; // GhostKart
#endif

View File

@ -118,6 +118,7 @@ Kart::Kart (const std::string& ident, unsigned int world_kart_id,
m_max_speed = new MaxSpeed(this);
m_terrain_info = new TerrainInfo();
m_powerup = new Powerup(this);
m_last_used_powerup = PowerupManager::POWERUP_NOTHING;
m_vehicle = NULL;
m_initial_position = position;
m_race_position = position;
@ -143,6 +144,7 @@ Kart::Kart (const std::string& ident, unsigned int world_kart_id,
m_min_nitro_time = 0.0f;
m_fire_clicked = 0;
m_wrongway_counter = 0;
m_boosted_ai = false;
m_type = RaceManager::KT_AI;
m_view_blocked_by_plunger = 0;
@ -470,6 +472,17 @@ float Kart::getSpeedIncreaseTimeLeft(unsigned int category) const
return m_max_speed->getSpeedIncreaseTimeLeft(category);
} // getSpeedIncreaseTimeLeft
// -----------------------------------------------------------------------------
void Kart::setBoostAI(bool boosted)
{
m_boosted_ai = boosted;
} // setBoostAI
// -----------------------------------------------------------------------------
bool Kart::getBoostAI() const
{
return m_boosted_ai;
} // getBoostAI
// -----------------------------------------------------------------------------
/** Returns the current material the kart is on. */
const Material *Kart::getMaterial() const
@ -508,6 +521,15 @@ void Kart::setPowerup(PowerupManager::PowerupType t, int n)
m_powerup->set(t, n);
} // setPowerup
// ----------------------------------------------------------------------------
/** Sets the powerup this kart has last used. Number is always 1.
* \param t Type of the powerup.
*/
void Kart::setLastUsedPowerup(PowerupManager::PowerupType t)
{
m_last_used_powerup = t;
} // setLastUsedPowerup
// -----------------------------------------------------------------------------
int Kart::getNumPowerup() const
{
@ -1356,6 +1378,10 @@ void Kart::update(float dt)
if(m_controls.getFire() && !m_fire_clicked && !m_kart_animation)
{
if (m_powerup->getType() != PowerupManager::POWERUP_NOTHING)
{
setLastUsedPowerup(m_powerup->getType());
}
// use() needs to be called even if there currently is no collecteable
// since use() can test if something needs to be switched on/off.
m_powerup->use() ;

View File

@ -86,6 +86,9 @@ protected:
/** Handles the powerup of a kart. */
Powerup *m_powerup;
/** Remember the last **used** powerup type of a kart for AI purposes. */
PowerupManager::PowerupType m_last_used_powerup;
/** True if kart is flying (for debug purposes only). */
bool m_flying;
@ -160,6 +163,9 @@ protected:
/** Counter which is used for displaying wrong way message after a delay */
float m_wrongway_counter;
/** True if the kart has been selected to have a boosted ai */
bool m_boosted_ai;
// Bullet physics parameters
@ -270,6 +276,8 @@ public:
virtual void setSlowdown(unsigned int category, float max_speed_fraction,
float fade_in_time);
virtual float getSpeedIncreaseTimeLeft(unsigned int category) const;
virtual void setBoostAI (bool boosted);
virtual bool getBoostAI () const;
virtual void collectedItem(Item *item, int random_attachment);
virtual float getStartupBoost() const;
@ -303,12 +311,18 @@ public:
/** Sets a new powerup. */
virtual void setPowerup (PowerupManager::PowerupType t, int n);
// ------------------------------------------------------------------------
/** Sets the last used powerup. */
virtual void setLastUsedPowerup (PowerupManager::PowerupType t);
// ------------------------------------------------------------------------
/** Returns the current powerup. */
virtual const Powerup* getPowerup() const { return m_powerup; }
// ------------------------------------------------------------------------
/** Returns the current powerup. */
virtual Powerup* getPowerup() { return m_powerup; }
// ------------------------------------------------------------------------
/** Returns the last used powerup. */
virtual PowerupManager::PowerupType getLastUsedPowerup() { return m_last_used_powerup; }
// ------------------------------------------------------------------------
/** Returns the number of powerups. */
virtual int getNumPowerup() const;
// ------------------------------------------------------------------------
@ -486,4 +500,3 @@ public:
#endif
/* EOF */

View File

@ -94,7 +94,7 @@ float MainLoop::getLimitedDt()
{
Log::verbose("fps", "time %f distance %f dt %f fps %f",
lw->getTime(),
lw->getDistanceDownTrackForKart(0),
lw->getDistanceDownTrackForKart(0, true),
dt*0.001f, 1000.0f / dt);
}
else

View File

@ -108,7 +108,7 @@ void LinearWorld::reset()
for(unsigned int i=0; i<kart_amount; i++)
{
m_distance_increase = std::min(m_distance_increase,
getDistanceDownTrackForKart(i));
getDistanceDownTrackForKart(i, false));
}
// Track length - minimum distance is how much the track length must
// be increased to avoid negative values in estimateFinishTimeForKart
@ -190,7 +190,7 @@ void LinearWorld::update(float dt)
getTrackSector(n)->update(kart->getFrontXYZ());
kart_info.m_overall_distance = kart_info.m_race_lap
* Track::getCurrentTrack()->getTrackLength()
+ getDistanceDownTrackForKart(kart->getWorldKartId());
+ getDistanceDownTrackForKart(kart->getWorldKartId(), true);
} // for n
// Update all positions. This must be done after _all_ karts have
@ -206,13 +206,11 @@ void LinearWorld::update(float dt)
if (m_karts[i]->hasFinishedRace() ||
m_karts[i]->isEliminated() ) continue;
// During the last lap update the estimated finish time.
// This is used to play the faster music, and by the AI
if (m_kart_info[i].m_race_lap == race_manager->getNumLaps()-1)
{
m_kart_info[i].m_estimated_finish =
// Update the estimated finish time.
// This is used by the AI
m_kart_info[i].m_estimated_finish =
estimateFinishTimeForKart(m_karts[i]);
}
checkForWrongDirection(i, dt);
}
@ -231,7 +229,7 @@ void LinearWorld::update(float dt)
j, m_karts[j]->getPosition(),
m_karts[j]->hasFinishedRace(),
m_kart_info[j].m_race_lap,
getDistanceDownTrackForKart(m_karts[j]->getWorldKartId()),
getDistanceDownTrackForKart(m_karts[j]->getWorldKartId(), true),
m_kart_info[j].m_overall_distance,
(m_karts[j]->getPosition() == m_karts[i]->getPosition()
? "<--- !!!" : "") );
@ -281,7 +279,7 @@ void LinearWorld::newLap(unsigned int kart_index)
m_kart_info[kart_index].m_overall_distance =
m_kart_info[kart_index].m_race_lap
* Track::getCurrentTrack()->getTrackLength()
+ getDistanceDownTrackForKart(kart->getWorldKartId());
+ getDistanceDownTrackForKart(kart->getWorldKartId(), true);
}
// Last lap message (kart_index's assert in previous block already)
if (raceHasLaps() && kart_info.m_race_lap+1 == lap_count)
@ -390,9 +388,9 @@ void LinearWorld::newLap(unsigned int kart_index)
* crossing the start line..
* \param kart_id Index of the kart.
*/
float LinearWorld::getDistanceDownTrackForKart(const int kart_id) const
float LinearWorld::getDistanceDownTrackForKart(const int kart_id, bool account_for_checklines) const
{
return getTrackSector(kart_id)->getDistanceFromStart();
return getTrackSector(kart_id)->getDistanceFromStart(account_for_checklines);
} // getDistanceDownTrackForKart
//-----------------------------------------------------------------------------
@ -413,13 +411,12 @@ int LinearWorld::getLapForKart(const int kart_id) const
} // getLapForKart
//-----------------------------------------------------------------------------
/** Returns the estimated finishing time. Only valid during the last lap!
/** Returns the estimated finishing time.
* \param kart_id Id of the kart.
*/
float LinearWorld::getEstimatedFinishTime(const int kart_id) const
{
assert(kart_id < (int)m_kart_info.size());
assert(m_kart_info[kart_id].m_race_lap == race_manager->getNumLaps()-1);
return m_kart_info[kart_id].m_estimated_finish;
} // getEstimatedFinishTime
@ -893,6 +890,7 @@ void LinearWorld::checkForWrongDirection(unsigned int i, float dt)
if (wrongway_counter > 1.0f)
{
m_race_gui->cleanupMessages(0.0f);
m_race_gui->addMessage(_("WRONG WAY!"), kart,
/* time */ -1.0f,
video::SColor(255,255,255,255),

View File

@ -114,7 +114,7 @@ public:
virtual ~LinearWorld();
virtual void update(float delta) OVERRIDE;
float getDistanceDownTrackForKart(const int kart_id) const;
float getDistanceDownTrackForKart(const int kart_id, bool account_for_checklines) const;
float getDistanceToCenterForKart(const int kart_id) const;
float getEstimatedFinishTime(const int kart_id) const;
int getLapForKart(const int kart_id) const;

View File

@ -57,6 +57,9 @@ OverWorld::~OverWorld()
/** Function to simplify the start process */
void OverWorld::enterOverWorld()
{
// update point count and the list of locked/unlocked stuff
PlayerManager::getCurrentPlayer()->computeActive();
race_manager->setNumPlayers(1);
race_manager->setMajorMode (RaceManager::MAJOR_MODE_SINGLE);
race_manager->setMinorMode (RaceManager::MINOR_MODE_OVERWORLD);

File diff suppressed because it is too large Load Diff

View File

@ -18,9 +18,11 @@
#include "script_audio.hpp"
#include "audio/sfx_manager.hpp"
#include "scriptengine/aswrappedcall.hpp"
#include <angelscript.h>
#include <assert.h>
#include <cstring>
/** \cond DOXYGEN_IGNORE */
namespace Scripting
@ -48,9 +50,15 @@ namespace Scripting
void registerScriptFunctions(asIScriptEngine *engine)
{
int r; // of type asERetCodes
engine->SetDefaultNamespace("Audio");
r = engine->RegisterGlobalFunction("void playSound(const string &in)", asFUNCTION(playSound), asCALL_CDECL); assert(r >= 0);
bool mp = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY");
asDWORD call_conv = mp ? asCALL_GENERIC : asCALL_CDECL;
int r; // of type asERetCodes
r = engine->RegisterGlobalFunction("void playSound(const string &in)",
mp ? WRAP_FN(playSound) : asFUNCTION(playSound),
call_conv); assert(r >= 0);
}
}

View File

@ -30,6 +30,7 @@
#include "tracks/track.hpp"
#include "tracks/track_object.hpp"
#include "tracks/track_object_manager.hpp"
#include "scriptengine/aswrappedcall.hpp"
#include <angelscript.h>
#include <assert.h>
@ -106,30 +107,35 @@ namespace Scripting
// --------------------------------------------------------------------
/** @}*/
/** @}*/
void registerScriptFunctions(asIScriptEngine *engine)
{
int r; // of type asERetCodes
engine->SetDefaultNamespace("Challenges");
bool mp = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY");
asDWORD call_conv = mp ? asCALL_GENERIC : asCALL_CDECL;
int r; // of type asERetCodes
r = engine->RegisterGlobalFunction("int getCompletedChallengesCount()",
asFUNCTION(getCompletedChallengesCount),
asCALL_CDECL);
assert(r >= 0);
mp ? WRAP_FN(getCompletedChallengesCount)
: asFUNCTION(getCompletedChallengesCount),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getChallengeCount()",
asFUNCTION(getChallengeCount),
asCALL_CDECL);
assert(r >= 0);
mp ? WRAP_FN(getChallengeCount)
: asFUNCTION(getChallengeCount),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("bool isChallengeUnlocked(string &in)",
asFUNCTION(isChallengeUnlocked),
asCALL_CDECL);
assert(r >= 0);
mp ? WRAP_FN(isChallengeUnlocked)
: asFUNCTION(isChallengeUnlocked),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getChallengeRequiredPoints(string &in)",
asFUNCTION(getChallengeRequiredPoints),
asCALL_CDECL);
assert(r >= 0);
} // registerScriptFunctions
mp ? WRAP_FN(getChallengeRequiredPoints)
: asFUNCTION(getChallengeRequiredPoints),
call_conv); assert(r >= 0);
} // registerScriptFunctions
} // namespace Challenges

View File

@ -21,6 +21,7 @@
#include "io/file_manager.hpp"
#include "karts/kart.hpp"
#include "modes/world.hpp"
#include "scriptengine/aswrappedcall.hpp"
#include "scriptengine/script_audio.hpp"
#include "scriptengine/script_challenges.hpp"
#include "scriptengine/script_kart.hpp"
@ -527,6 +528,12 @@ namespace Scripting
{
m_time = time;
m_callback_delegate = callback_delegate;
// This may be not needed in future angelscript versions
if (strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY"))
{
callback_delegate->AddRef();
}
}
//-----------------------------------------------------------------------------

View File

@ -23,6 +23,7 @@
#include "input/input_device.hpp"
#include "input/input_manager.hpp"
#include "modes/world.hpp"
#include "scriptengine/aswrappedcall.hpp"
#include "states_screens/dialogs/tutorial_message_dialog.hpp"
#include "tracks/track.hpp"
#include "tracks/track_object.hpp"
@ -165,19 +166,50 @@ namespace Scripting
return translate(formatString, arg1, arg2, arg3);
}
/** \endcond */
void registerScriptFunctions(asIScriptEngine *engine)
{
int r; // of type asERetCodes
engine->SetDefaultNamespace("GUI");
r = engine->RegisterGlobalFunction("void displayModalMessage(const string &in)", asFUNCTION(displayModalMessage), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void displayOverlayMessage(const string &in)", asFUNCTION(displayOverlayMessage), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void clearOverlayMessages()", asFUNCTION(clearOverlayMessages), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string getKeyBinding(int input)", asFUNCTION(getKeyBinding), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in)", asFUNCTION(proxy_translate), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in, const string &in)", asFUNCTION(proxy_translateAndInsertValues1), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in, const string &in, const string &in)", asFUNCTION(proxy_translateAndInsertValues2), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in, const string &in, const string &in, const string &in)", asFUNCTION(proxy_translateAndInsertValues3), asCALL_CDECL); assert(r >= 0);
bool mp = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY");
asDWORD call_conv = mp ? asCALL_GENERIC : asCALL_CDECL;
int r; // of type asERetCodes
r = engine->RegisterGlobalFunction("void displayModalMessage(const string &in)",
mp ? WRAP_FN(displayModalMessage) : asFUNCTION(displayModalMessage),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void displayOverlayMessage(const string &in)",
mp ? WRAP_FN(displayOverlayMessage) : asFUNCTION(displayOverlayMessage),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void clearOverlayMessages()",
mp ? WRAP_FN(clearOverlayMessages) : asFUNCTION(clearOverlayMessages),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string getKeyBinding(int input)",
mp ? WRAP_FN(getKeyBinding) : asFUNCTION(getKeyBinding),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in)",
mp ? WRAP_FN(proxy_translate) : asFUNCTION(proxy_translate),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in, const string &in)",
mp ? WRAP_FN(proxy_translateAndInsertValues1)
: asFUNCTION(proxy_translateAndInsertValues1),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in, const string &in, const string &in)",
mp ? WRAP_FN(proxy_translateAndInsertValues2)
: asFUNCTION(proxy_translateAndInsertValues2),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string translate(const string &in, const string &in, const string &in, const string &in)",
mp ? WRAP_FN(proxy_translateAndInsertValues3)
: asFUNCTION(proxy_translateAndInsertValues3),
call_conv); assert(r >= 0);
}
void registerScriptEnums(asIScriptEngine *engine)

View File

@ -22,6 +22,7 @@
#include "karts/kart_properties.hpp"
#include "modes/world.hpp"
#include "scriptvec3.hpp"
#include "scriptengine/aswrappedcall.hpp"
#include <assert.h>
#include <angelscript.h>
@ -128,18 +129,42 @@ namespace Scripting
/** @}*/
/** @}*/
void registerScriptFunctions(asIScriptEngine *engine)
{
int r; // of type asERetCodes
engine->SetDefaultNamespace("Kart");
r = engine->RegisterGlobalFunction("void squash(int id, float time)", asFUNCTION(squash), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void teleport(int id, const Vec3 &in)", asFUNCTION(teleport), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setVelocity(int id, const Vec3 &in)", asFUNCTION(setVelocity), asCALL_CDECL); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void jumpTo(int id, float x, float y)", asFUNCTION(jumpTo), asCALL_GENERIC); assert(r >= 0);
r = engine->RegisterGlobalFunction("Vec3 getLocation(int id)", asFUNCTION(getLocation), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("Vec3 getVelocity(int id)", asFUNCTION(getVelocity), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("float getMaxSpeed(int id)", asFUNCTION(getMaxSpeed), asCALL_CDECL); assert(r >= 0);
bool mp = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY");
asDWORD call_conv = mp ? asCALL_GENERIC : asCALL_CDECL;
int r; // of type asERetCodes
r = engine->RegisterGlobalFunction("void squash(int id, float time)",
mp ? WRAP_FN(squash) : asFUNCTION(squash),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void teleport(int id, const Vec3 &in)",
mp ? WRAP_FN(teleport) : asFUNCTION(teleport),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setVelocity(int id, const Vec3 &in)",
mp ? WRAP_FN(setVelocity) : asFUNCTION(setVelocity),
call_conv); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void jumpTo(int id, float x, float y)",
// mp ? WRAP_FN(jumpTo) : asFUNCTION(jumpTo),
// call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("Vec3 getLocation(int id)",
mp ? WRAP_FN(getLocation) : asFUNCTION(getLocation),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("Vec3 getVelocity(int id)",
mp ? WRAP_FN(getVelocity) : asFUNCTION(getVelocity),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("float getMaxSpeed(int id)",
mp ? WRAP_FN(getMaxSpeed) : asFUNCTION(getMaxSpeed),
call_conv); assert(r >= 0);
}
void registerScriptEnums(asIScriptEngine *engine)

View File

@ -19,9 +19,9 @@
#include <assert.h>
#include <angelscript.h>
#include "script_physics.hpp"
#include "graphics/explosion.hpp"
#include "graphics/hit_effect.hpp"
#include "items/projectile_manager.hpp"
#include "graphics/explosion.hpp"
namespace Scripting
{
@ -39,9 +39,12 @@ namespace Scripting
}
void registerScriptFunctions(asIScriptEngine *engine)
{
int r;
engine->SetDefaultNamespace("Physics");
r = engine->RegisterGlobalFunction("string createExplosion(Vec3 &in)", asFUNCTION(createExplosion), asCALL_GENERIC); assert(r >= 0);
int r;
r = engine->RegisterGlobalFunction("string createExplosion(Vec3 &in)",
asFUNCTION(createExplosion),
asCALL_GENERIC); assert(r >= 0);
}
}
}

View File

@ -30,6 +30,7 @@
#include "input/input_manager.hpp"
#include "modes/world.hpp"
#include "scriptengine/property_animator.hpp"
#include "scriptengine/aswrappedcall.hpp"
#include "states_screens/dialogs/tutorial_message_dialog.hpp"
#include "states_screens/dialogs/race_paused_dialog.hpp"
#include "tracks/track.hpp"
@ -447,12 +448,16 @@ namespace Scripting
/** @}*/
/** @}*/
void registerScriptFunctions(asIScriptEngine *engine)
{
int r; // of type asERetCodes
engine->SetDefaultNamespace("Track");
bool mp = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY");
asDWORD call_conv = mp ? asCALL_GENERIC : asCALL_CDECL;
asDWORD call_conv_objlast = mp ? asCALL_GENERIC : asCALL_CDECL_OBJLAST;
asDWORD call_conv_thiscall = mp ? asCALL_GENERIC : asCALL_THISCALL;
int r; // of type asERetCodes
r = engine->RegisterObjectType("TrackObject", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
r = engine->RegisterObjectType("PhysicalObject", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
@ -462,76 +467,222 @@ namespace Scripting
r = engine->RegisterObjectType("Animator", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
r = engine->RegisterObjectType("Light", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void disableTrackObject(const string &in)", asFUNCTION(disableTrackObject), asCALL_CDECL); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void enableTrackObject(const string &in)", asFUNCTION(enableTrackObject), asCALL_CDECL); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void enableTrigger(const string &in)", asFUNCTION(enableTrigger), asCALL_CDECL); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void disableTrigger(const string &in)", asFUNCTION(disableTrigger), asCALL_CDECL); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void disableTrackObject(const string &in)",
// mp ? WRAP_FN(disableTrackObject) : asFUNCTION(disableTrackObject),
// call_conv); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void enableTrackObject(const string &in)",
// mp ? WRAP_FN(enableTrackObject) : asFUNCTION(enableTrackObject),
// call_conv); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void enableTrigger(const string &in)",
// mp ? WRAP_FN(enableTrigger) : asFUNCTION(enableTrigger),
// call_conv); assert(r >= 0);
//r = engine->RegisterGlobalFunction("void disableTrigger(const string &in)",
// mp ? WRAP_FN(disableTrigger) : asFUNCTION(disableTrigger),
// call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void createTrigger(const string &in, const Vec3 &in, float distance)",
asFUNCTION(createTrigger), asCALL_CDECL); assert(r >= 0);
mp ? WRAP_FN(createTrigger) : asFUNCTION(createTrigger),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void createTextBillboard(const string &in, const Vec3 &in)",
asFUNCTION(createTextBillboard), asCALL_CDECL); assert(r >= 0);
mp ? WRAP_FN(createTextBillboard) : asFUNCTION(createTextBillboard),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setTriggerReenableTimeout(const string &in, const string &in, float reenable_time)",
asFUNCTION(setTriggerReenableTimeout), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("TrackObject@ getTrackObject(const string &in, const string &in)", asFUNCTION(getTrackObject), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void exitRace()", asFUNCTION(exitRace), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void pauseRace()", asFUNCTION(pauseRace), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setFog(float maxDensity, float start, float end, int r, int g, int b, float duration)", asFUNCTION(setFog), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getNumberOfKarts()", asFUNCTION(getNumberOfKarts), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getNumLocalPlayers()", asFUNCTION(getNumLocalPlayers), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("bool isReverse()", asFUNCTION(isTrackReverse), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getMajorRaceMode()", asFUNCTION(getMajorRaceMode), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getMinorRaceMode()", asFUNCTION(getMinorRaceMode), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("bool isDuringDay()", asFUNCTION(isDuringDay), asCALL_CDECL); assert(r >= 0);
mp ? WRAP_FN(setTriggerReenableTimeout) : asFUNCTION(setTriggerReenableTimeout),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("TrackObject@ getTrackObject(const string &in, const string &in)",
mp ? WRAP_FN(getTrackObject) : asFUNCTION(getTrackObject),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void exitRace()",
mp ? WRAP_FN(exitRace) : asFUNCTION(exitRace),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void pauseRace()",
mp ? WRAP_FN(pauseRace) : asFUNCTION(pauseRace),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setFog(float maxDensity, float start, float end, int r, int g, int b, float duration)",
mp ? WRAP_FN(setFog) : asFUNCTION(setFog),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getNumberOfKarts()",
mp ? WRAP_FN(getNumberOfKarts) : asFUNCTION(getNumberOfKarts),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getNumLocalPlayers()",
mp ? WRAP_FN(getNumLocalPlayers) : asFUNCTION(getNumLocalPlayers),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("bool isReverse()",
mp ? WRAP_FN(isTrackReverse) : asFUNCTION(isTrackReverse),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getMajorRaceMode()",
mp ? WRAP_FN(getMajorRaceMode) : asFUNCTION(getMajorRaceMode),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("int getMinorRaceMode()",
mp ? WRAP_FN(getMinorRaceMode) : asFUNCTION(getMinorRaceMode),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("bool isDuringDay()",
mp ? WRAP_FN(isDuringDay) : asFUNCTION(isDuringDay),
call_conv); assert(r >= 0);
// TrackObject
r = engine->RegisterObjectMethod("TrackObject", "void setEnabled(bool status)", asMETHOD(::TrackObject, setEnabled), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "SoundEmitter@ getSoundEmitter()", asMETHOD(::TrackObject, getSoundEmitter), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Light@ getLight()", asMETHOD(::TrackObject, getLight), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "PhysicalObject@ getPhysics()", asMETHOD(::TrackObject, getPhysics), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Mesh@ getMesh()", asMETHOD(::TrackObject, getMesh), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "ParticleEmitter@ getParticleEmitter()", asMETHOD(::TrackObject, getParticleEmitter), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Animator@ getIPOAnimator()", asMETHOD(::TrackObject, getIPOAnimator), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "void moveTo(const Vec3 &in, bool)", asMETHOD(::TrackObject, moveTo), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Vec3 getCenterPosition()", asFUNCTION(TrackObject::getCenterPosition), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Vec3 getOrigin()", asFUNCTION(TrackObject::getOrigin), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "TrackObject@ getParentLibrary()", asMETHOD(::TrackObject, getParentLibrary), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "string getName()", asMETHOD(::TrackObject, getName), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "void setEnabled(bool status)",
mp ? WRAP_MFN(::TrackObject, setEnabled) : asMETHOD(::TrackObject, setEnabled),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "SoundEmitter@ getSoundEmitter()",
mp ? WRAP_MFN(::TrackObject, getSoundEmitter) : asMETHOD(::TrackObject, getSoundEmitter),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Light@ getLight()",
mp ? WRAP_MFN(::TrackObject, getLight) : asMETHOD(::TrackObject, getLight),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "PhysicalObject@ getPhysics()",
mp ? WRAP_MFN(::TrackObject, getPhysics): asMETHOD(::TrackObject, getPhysics),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Mesh@ getMesh()",
mp ? WRAP_MFN(::TrackObject, getMesh) : asMETHOD(::TrackObject, getMesh),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "ParticleEmitter@ getParticleEmitter()",
mp ? WRAP_MFN(::TrackObject, getParticleEmitter) : asMETHOD(::TrackObject, getParticleEmitter),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Animator@ getIPOAnimator()",
mp ? WRAP_MFN(::TrackObject, getIPOAnimator): asMETHOD(::TrackObject, getIPOAnimator),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "void moveTo(const Vec3 &in, bool)",
mp ? WRAP_MFN(::TrackObject, moveTo) : asMETHOD(::TrackObject, moveTo),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Vec3 getCenterPosition()",
mp ? WRAP_OBJ_LAST(TrackObject::getCenterPosition): asFUNCTION(TrackObject::getCenterPosition),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Vec3 getOrigin()",
mp ? WRAP_OBJ_LAST(TrackObject::getOrigin) : asFUNCTION(TrackObject::getOrigin),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "TrackObject@ getParentLibrary()",
mp ? WRAP_MFN(::TrackObject, getParentLibrary): asMETHOD(::TrackObject, getParentLibrary),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "string getName()",
mp ? WRAP_MFN(::TrackObject, getName) : asMETHOD(::TrackObject, getName),
call_conv_thiscall); assert(r >= 0);
// PhysicalObject
r = engine->RegisterObjectMethod("PhysicalObject", "bool isFlattenKartObject()", asMETHOD(PhysicalObject, isFlattenKartObject), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("PhysicalObject", "void disable()", asMETHOD(PhysicalObject, disable), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("PhysicalObject", "void enable()", asMETHOD(PhysicalObject, enable), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("PhysicalObject", "bool isFlattenKartObject()",
mp ? WRAP_MFN(PhysicalObject, isFlattenKartObject) : asMETHOD(PhysicalObject,
isFlattenKartObject), call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("PhysicalObject", "void disable()",
mp ? WRAP_MFN(PhysicalObject, disable) : asMETHOD(PhysicalObject, disable),
call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("PhysicalObject", "void enable()",
mp ? WRAP_MFN(PhysicalObject, enable) : asMETHOD(PhysicalObject, enable),
call_conv_thiscall); assert(r >= 0);
// Animated Mesh
r = engine->RegisterObjectMethod("Mesh", "void setFrameLoop(int start, int end)", asFUNCTION(Mesh::setFrameLoop), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void setFrameLoopOnce(int start, int end)", asFUNCTION(Mesh::setFrameLoopOnce), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "int getFrameNr()", asFUNCTION(Mesh::getFrameNr), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "int getAnimationSet()", asFUNCTION(Mesh::getAnimationSet), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void useAnimationSet(int set_num)", asFUNCTION(Mesh::useAnimationSet), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void addAnimationSet(int start, int end)", asFUNCTION(Mesh::addAnimationSet), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void removeAllAnimationSet()", asFUNCTION(Mesh::removeAllAnimationSet), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void setCurrentFrame(int frame)", asFUNCTION(Mesh::setCurrentFrame), asCALL_CDECL_OBJLAST); assert(r >= 0);
//r = engine->RegisterObjectMethod("Mesh", "void move(Vec3 &in)", asFUNCTION(movePresentation), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void setFrameLoop(int start, int end)",
mp ? WRAP_OBJ_LAST(Mesh::setFrameLoop) : asFUNCTION(Mesh::setFrameLoop),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void setFrameLoopOnce(int start, int end)",
mp ? WRAP_OBJ_LAST(Mesh::setFrameLoopOnce) : asFUNCTION(Mesh::setFrameLoopOnce),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "int getFrameNr()",
mp ? WRAP_OBJ_LAST(Mesh::getFrameNr) : asFUNCTION(Mesh::getFrameNr),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "int getAnimationSet()",
mp ? WRAP_OBJ_LAST(Mesh::getAnimationSet) : asFUNCTION(Mesh::getAnimationSet),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void useAnimationSet(int set_num)",
mp ? WRAP_OBJ_LAST(Mesh::useAnimationSet) : asFUNCTION(Mesh::useAnimationSet),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void addAnimationSet(int start, int end)",
mp ? WRAP_OBJ_LAST(Mesh::addAnimationSet) : asFUNCTION(Mesh::addAnimationSet),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void removeAllAnimationSet()",
mp ? WRAP_OBJ_LAST(Mesh::removeAllAnimationSet) : asFUNCTION(Mesh::removeAllAnimationSet),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void setCurrentFrame(int frame)",
mp ? WRAP_OBJ_LAST(Mesh::setCurrentFrame) : asFUNCTION(Mesh::setCurrentFrame),
call_conv_objlast); assert(r >= 0);
//r = engine->RegisterObjectMethod("Mesh", "void move(Vec3 &in)",
// mp ? WRAP_OBJ_LAST(movePresentation) : asFUNCTION(movePresentation),
// call_conv_objlast); assert(r >= 0);
// Particle Emitter
r = engine->RegisterObjectMethod("ParticleEmitter", "void stop()", asFUNCTION(ParticleEmitter::stop), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("ParticleEmitter", "void stopIn(float)", asFUNCTION(ParticleEmitter::stopIn), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("ParticleEmitter", "void setEmissionRate(float)", asFUNCTION(ParticleEmitter::setEmissionRate), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("ParticleEmitter", "void stop()",
mp ? WRAP_OBJ_LAST(ParticleEmitter::stop) : asFUNCTION(ParticleEmitter::stop),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("ParticleEmitter", "void stopIn(float)",
mp ? WRAP_OBJ_LAST(ParticleEmitter::stopIn) : asFUNCTION(ParticleEmitter::stopIn),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("ParticleEmitter", "void setEmissionRate(float)",
mp ? WRAP_OBJ_LAST(ParticleEmitter::setEmissionRate) : asFUNCTION(ParticleEmitter::setEmissionRate),
call_conv_objlast); assert(r >= 0);
// Sound Effect
//r = engine->RegisterObjectMethod("SoundEmitter", "void move(Vec3 &in)", asFUNCTION(movePresentation), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("SoundEmitter", "void stop()", asFUNCTION(SoundEmitter::stop), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("SoundEmitter", "void playOnce()", asFUNCTION(SoundEmitter::playOnce), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("SoundEmitter", "void playLoop()", asFUNCTION(SoundEmitter::playLoop), asCALL_CDECL_OBJLAST); assert(r >= 0);
//r = engine->RegisterObjectMethod("SoundEmitter", "void move(Vec3 &in)",
// mp ? WRAP_OBJ_LAST(movePresentation) : asFUNCTION(movePresentation),
// call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("SoundEmitter", "void stop()",
mp ? WRAP_OBJ_LAST(SoundEmitter::stop) : asFUNCTION(SoundEmitter::stop),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("SoundEmitter", "void playOnce()",
mp ? WRAP_OBJ_LAST(SoundEmitter::playOnce) : asFUNCTION(SoundEmitter::playOnce),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("SoundEmitter", "void playLoop()",
mp ? WRAP_OBJ_LAST(SoundEmitter::playLoop) : asFUNCTION(SoundEmitter::playLoop),
call_conv_objlast); assert(r >= 0);
// Light
r = engine->RegisterObjectMethod("Light", "void setEnergy(float)", asFUNCTION(Light::setEnergy), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Light", "void animateEnergy(float, float)", asFUNCTION(Light::animateEnergy), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Light", "void setEnergy(float)",
mp ? WRAP_OBJ_LAST(Light::setEnergy) : asFUNCTION(Light::setEnergy),
call_conv_objlast); assert(r >= 0);
r = engine->RegisterObjectMethod("Light", "void animateEnergy(float, float)",
mp ? WRAP_OBJ_LAST(Light::animateEnergy) : asFUNCTION(Light::animateEnergy),
call_conv_objlast); assert(r >= 0);
// Curve based Animation
//fails due to insufficient visibility to scripts TODO : Decide whether to fix visibility or introduce wrappers
//r = engine->RegisterObjectMethod("Animator", "void setPaused(bool mode)", asMETHOD(ThreeDAnimation, setPaused), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("Animator", "void setPaused(bool mode)", asFUNCTION(Animator::setPaused), asCALL_CDECL_OBJLAST); assert(r >= 0);
//r = engine->RegisterObjectMethod("Animator", "void setPaused(bool mode)",
// mp ? WRAP_MFN(ThreeDAnimation, setPaused) : asMETHOD(ThreeDAnimation, setPaused),
// call_conv_thiscall); assert(r >= 0);
r = engine->RegisterObjectMethod("Animator", "void setPaused(bool mode)",
mp ? WRAP_OBJ_LAST(Animator::setPaused) : asFUNCTION(Animator::setPaused),
call_conv_objlast); assert(r >= 0);
// TODO: add method to set current frame
// TODO: add method to launch playback from frame X to frame Y
// TODO: add method to register onAnimationComplete notifications ?

View File

@ -22,6 +22,7 @@
#include "input/device_manager.hpp"
#include "input/input_device.hpp"
#include "input/input_manager.hpp"
#include "scriptengine/aswrappedcall.hpp"
#include "scriptengine/script_engine.hpp"
#include "states_screens/dialogs/tutorial_message_dialog.hpp"
#include "tracks/track.hpp"
@ -179,29 +180,65 @@ namespace Scripting
return insertValues(formatString, arg1, arg2, arg3, arg4);
}
/** \endcond */
void registerScriptFunctions(asIScriptEngine *engine)
{
int r; // of type asERetCodes
engine->SetDefaultNamespace("Utils");
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in)", asFUNCTION(proxy_insertValues1), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in, const string &in)", asFUNCTION(proxy_insertValues2), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in, const string &in, const string &in)", asFUNCTION(proxy_insertValues3), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in, const string &in, const string &in, const string &in)", asFUNCTION(proxy_insertValues4), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void runScript(string &in)", asFUNCTION(runScript), asCALL_CDECL); assert(r >= 0);
bool mp = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY");
asDWORD call_conv = mp ? asCALL_GENERIC : asCALL_CDECL;
int r; // of type asERetCodes
r = engine->RegisterGlobalFunction("int randomInt(int, int)", asFUNCTION(randomInt), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("float randomFloat(int, int)", asFUNCTION(randomFloat), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setTimeout(const string &in, float)", asFUNCTION(setTimeout), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in)",
mp ? WRAP_FN(proxy_insertValues1) : asFUNCTION(proxy_insertValues1),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in, const string &in)",
mp ? WRAP_FN(proxy_insertValues2) : asFUNCTION(proxy_insertValues2),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in, const string &in, const string &in)",
mp ? WRAP_FN(proxy_insertValues3) : asFUNCTION(proxy_insertValues3),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("string insertValues(const string &in, const string &in, const string &in, const string &in, const string &in)",
mp ? WRAP_FN(proxy_insertValues4) : asFUNCTION(proxy_insertValues4),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void runScript(string &in)",
mp ? WRAP_FN(runScript) : asFUNCTION(runScript),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("int randomInt(int, int)",
mp ? WRAP_FN(randomInt) : asFUNCTION(randomInt),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("float randomFloat(int, int)",
mp ? WRAP_FN(randomFloat) : asFUNCTION(randomFloat),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setTimeout(const string &in, float)",
mp ? WRAP_FN(setTimeout) : asFUNCTION(setTimeout),
call_conv); assert(r >= 0);
r = engine->RegisterFuncdef("void TimeoutCallback()"); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setTimeoutDelegate(TimeoutCallback@, float)", asFUNCTION(setTimeoutDelegate), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void setTimeoutDelegate(TimeoutCallback@, float)",
mp ? WRAP_FN(setTimeoutDelegate) : asFUNCTION(setTimeoutDelegate),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void logInfo(const string &in)",
mp ? WRAP_FN(logInfo) : asFUNCTION(logInfo),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void logWarning(const string &in)",
mp ? WRAP_FN(logWarning) : asFUNCTION(logWarning),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void logError(const string &in)",
mp ? WRAP_FN(logError) : asFUNCTION(logError),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void logInfo(const string &in)", asFUNCTION(logInfo), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void logWarning(const string &in)", asFUNCTION(logWarning), asCALL_CDECL); assert(r >= 0);
r = engine->RegisterGlobalFunction("void logError(const string &in)", asFUNCTION(logError), asCALL_CDECL); assert(r >= 0);
}
}

View File

@ -21,6 +21,7 @@
#include "karts/kart.hpp"
#include "script_kart.hpp"
#include "scriptvec3.hpp"
#include "scriptengine/aswrappedcall.hpp"
//debug
#include <iostream>
@ -61,17 +62,48 @@ namespace Scripting
void RegisterVec3(asIScriptEngine *engine)
{
int r;
bool mp = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY");
asDWORD call_conv = mp ? asCALL_GENERIC : asCALL_CDECL_OBJLAST;
int r; // of type asERetCodes
r = engine->RegisterObjectType("Vec3", sizeof(SimpleVec3), asOBJ_VALUE | asOBJ_APP_CLASS_ALLFLOATS | asOBJ_APP_CLASS_CDA); assert(r >= 0);
// Register the behaviours
r = engine->RegisterObjectBehaviour("Vec3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Constructor), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectBehaviour("Vec3", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(Destructor), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "Vec3 &opAssign(const Vec3 &in)", asMETHODPR(SimpleVec3, operator =, (const SimpleVec3&), SimpleVec3&), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectBehaviour("Vec3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", asFUNCTION(ConstructVector3FromFloats), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterGlobalFunction("void printVec3(Vec3 a)", asFUNCTION(printVec3), asCALL_GENERIC); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getX()", asFUNCTION(getX), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getY()", asFUNCTION(getY), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getZ()", asFUNCTION(getZ), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getLength()", asFUNCTION(getLength), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectBehaviour("Vec3", asBEHAVE_CONSTRUCT, "void f()",
mp ? WRAP_OBJ_LAST(Constructor) : asFUNCTION(Constructor),
call_conv); assert(r >= 0);
r = engine->RegisterObjectBehaviour("Vec3", asBEHAVE_DESTRUCT, "void f()",
mp ? WRAP_OBJ_LAST(Destructor) : asFUNCTION(Destructor),
call_conv); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "Vec3 &opAssign(const Vec3 &in)",
mp ? WRAP_MFN_PR(SimpleVec3, operator =, (const SimpleVec3&), SimpleVec3&)
: asMETHODPR(SimpleVec3, operator =, (const SimpleVec3&), SimpleVec3&),
mp ? asCALL_GENERIC : asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectBehaviour("Vec3", asBEHAVE_CONSTRUCT, "void f(float, float, float)",
mp ? WRAP_OBJ_LAST(ConstructVector3FromFloats)
: asFUNCTION(ConstructVector3FromFloats),
call_conv); assert(r >= 0);
r = engine->RegisterGlobalFunction("void printVec3(Vec3 a)",
asFUNCTION(printVec3),
asCALL_GENERIC); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getX()",
mp ? WRAP_OBJ_LAST(getX) : asFUNCTION(getX),
call_conv); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getY()",
mp ? WRAP_OBJ_LAST(getY) : asFUNCTION(getY),
call_conv); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getZ()",
mp ? WRAP_OBJ_LAST(getZ) : asFUNCTION(getZ),
call_conv); assert(r >= 0);
r = engine->RegisterObjectMethod("Vec3", "float getLength()",
mp ? WRAP_OBJ_LAST(getLength) : asFUNCTION(getLength),
call_conv); assert(r >= 0);
}
}

View File

@ -129,6 +129,7 @@ GUIEngine::EventPropagation MultitouchSettingsDialog::processEvent(
UserConfigParams::m_multitouch_deadzone_edge.revertToDefaults();
UserConfigParams::m_multitouch_deadzone_center.revertToDefaults();
UserConfigParams::m_multitouch_mode.revertToDefaults();
UserConfigParams::m_multitouch_inverted.revertToDefaults();
UserConfigParams::m_multitouch_controls.revertToDefaults();
updateValues();

View File

@ -463,7 +463,7 @@ void RaceGUIBase::renderPlayerView(const Camera *camera, float dt)
if (m_multitouch_gui != NULL)
{
m_multitouch_gui->drawMultitouchSteering(kart, viewport, scaling);
m_multitouch_gui->draw(kart, viewport, scaling);
}
} // renderPlayerView
@ -770,7 +770,7 @@ void RaceGUIBase::drawGlobalPlayerIcons(int bottom_margin)
{
LinearWorld *linear_world = (LinearWorld*)(World::getWorld());
float distance = linear_world->getDistanceDownTrackForKart(kart_id)
float distance = linear_world->getDistanceDownTrackForKart(kart_id, true)
+ Track::getCurrentTrack()->getTrackLength()*lap;
if ((position>1) &&
(previous_distance-distance<m_dist_show_overlap) &&

View File

@ -185,7 +185,6 @@ protected:
RaceGUIMultitouch* m_multitouch_gui;
void cleanupMessages(const float dt);
//void createMarkerTexture();
void createRegularPolygon(unsigned int n, float radius,
const core::vector2df &center,
@ -248,6 +247,8 @@ public:
const core::recti &viewport,
const core::vector2df &scaling) {};
void cleanupMessages(const float dt);
}; // RaceGUIBase
#endif

View File

@ -42,7 +42,8 @@ RaceGUIMultitouch::RaceGUIMultitouch(RaceGUIBase* race_gui)
m_race_gui = race_gui;
m_minimap_bottom = 0;
m_gui_action = false;
m_directionnal_wheel_tex = NULL;
m_steering_wheel_tex = NULL;
m_up_down_tex = NULL;
m_pause_tex = NULL;
m_nitro_tex = NULL;
m_nitro_empty_tex = NULL;
@ -51,6 +52,7 @@ RaceGUIMultitouch::RaceGUIMultitouch(RaceGUIBase* race_gui)
m_drift_tex = NULL;
m_bg_button_tex = NULL;
m_bg_button_focus_tex = NULL;
m_gui_action_tex = NULL;
m_device = input_manager->getDeviceManager()->getMultitouchDevice();
@ -63,7 +65,7 @@ RaceGUIMultitouch::RaceGUIMultitouch(RaceGUIBase* race_gui)
UserConfigParams::m_multitouch_scale = 0.5f;
}
initMultitouchSteering();
init();
} // RaceGUIMultitouch
@ -72,7 +74,7 @@ RaceGUIMultitouch::RaceGUIMultitouch(RaceGUIBase* race_gui)
*/
RaceGUIMultitouch::~RaceGUIMultitouch()
{
closeMultitouchSteering();
close();
} // ~RaceGUIMultitouch
@ -91,23 +93,33 @@ void RaceGUIMultitouch::reset()
//-----------------------------------------------------------------------------
/** Clears all previously created buttons in the multitouch device
*/
void RaceGUIMultitouch::closeMultitouchSteering()
void RaceGUIMultitouch::close()
{
if (m_device != NULL)
{
m_device->clearButtons();
}
} // closeMultitouchSteering
if (m_device->isAccelerometerActive())
{
m_device->deactivateAccelerometer();
}
} // close
//-----------------------------------------------------------------------------
/** Makes some initializations and determines the look of multitouch steering
/** Makes some initializations and determines the look of multitouch race GUI
* interface
*/
void RaceGUIMultitouch::initMultitouchSteering()
void RaceGUIMultitouch::init()
{
if (m_device == NULL)
return;
if (UserConfigParams::m_multitouch_controls == 2)
{
m_device->activateAccelerometer();
}
const float scale = UserConfigParams::m_multitouch_scale;
@ -138,10 +150,20 @@ void RaceGUIMultitouch::initMultitouchSteering()
}
m_minimap_bottom = (unsigned int)(h - 2 * col_size);
if (m_device->isAccelerometerActive())
{
m_device->addButton(BUTTON_UP_DOWN,
int(steering_btn_x + btn2_size / 4), int(steering_btn_y),
int(btn2_size / 2), int(btn2_size));
}
else
{
m_device->addButton(BUTTON_STEERING,
int(steering_btn_x), int(steering_btn_y),
int(btn2_size), int(btn2_size));
}
m_device->addButton(BUTTON_STEERING,
int(steering_btn_x), int(steering_btn_y),
int(btn2_size), int(btn2_size));
m_device->addButton(BUTTON_ESCAPE,
int(margin_top), int(margin_small),
int(btn_small_size), int(btn_small_size));
@ -161,8 +183,10 @@ void RaceGUIMultitouch::initMultitouchSteering()
int(first_column_x), int(h - 1 * col_size),
int(btn_size), int(btn_size));
m_directionnal_wheel_tex = irr_driver->getTexture(FileManager::GUI,
"android/directionnal_wheel.png");
m_steering_wheel_tex = irr_driver->getTexture(FileManager::GUI,
"android/steering_wheel.png");
m_up_down_tex = irr_driver->getTexture(FileManager::GUI,
"android/up_down.png");
m_pause_tex = irr_driver->getTexture(FileManager::GUI, "android/pause.png");
m_nitro_tex = irr_driver->getTexture(FileManager::GUI, "android/nitro.png");
m_nitro_empty_tex = irr_driver->getTexture(FileManager::GUI,
@ -178,17 +202,17 @@ void RaceGUIMultitouch::initMultitouchSteering()
"android/blur_bg_button_focus.png");
m_gui_action_tex = irr_driver->getTexture(FileManager::GUI,"challenge.png");
} // initMultitouchSteering
} // init
//-----------------------------------------------------------------------------
/** Draws the buttons for multitouch steering.
/** Draws the buttons for multitouch race GUI.
* \param kart The kart for which to show the data.
* \param viewport The viewport to use.
* \param scaling Which scaling to apply to the buttons.
*/
void RaceGUIMultitouch::drawMultitouchSteering(const AbstractKart* kart,
const core::recti &viewport,
const core::vector2df &scaling)
void RaceGUIMultitouch::draw(const AbstractKart* kart,
const core::recti &viewport,
const core::vector2df &scaling)
{
#ifndef SERVER_ONLY
if (m_device == NULL)
@ -210,7 +234,7 @@ void RaceGUIMultitouch::drawMultitouchSteering(const AbstractKart* kart,
if (button->type == MultitouchButtonType::BUTTON_STEERING)
{
video::ITexture* btn_texture = m_directionnal_wheel_tex;
video::ITexture* btn_texture = m_steering_wheel_tex;
core::rect<s32> coords(pos_zero, btn_texture->getSize());
draw2DImage(btn_texture, btn_pos, coords, NULL, NULL, true);
@ -226,6 +250,12 @@ void RaceGUIMultitouch::drawMultitouchSteering(const AbstractKart* kart,
// draw2DImage(btn_texture, pos2, coords, NULL, NULL, true);
}
if (button->type == MultitouchButtonType::BUTTON_UP_DOWN)
{
video::ITexture* btn_texture = m_up_down_tex;
core::rect<s32> coords(pos_zero, btn_texture->getSize());
draw2DImage(btn_texture, btn_pos, coords, NULL, NULL, true);
}
else
{
bool can_be_pressed = true;
@ -321,4 +351,4 @@ void RaceGUIMultitouch::drawMultitouchSteering(const AbstractKart* kart,
}
}
#endif
} // drawMultitouchSteering
} // draw

View File

@ -38,7 +38,8 @@ private:
bool m_gui_action;
unsigned int m_minimap_bottom;
video::ITexture* m_directionnal_wheel_tex;
video::ITexture* m_steering_wheel_tex;
video::ITexture* m_up_down_tex;
video::ITexture* m_pause_tex;
video::ITexture* m_nitro_tex;
video::ITexture* m_nitro_empty_tex;
@ -49,16 +50,15 @@ private:
video::ITexture* m_bg_button_focus_tex;
video::ITexture* m_gui_action_tex;
void initMultitouchSteering();
void closeMultitouchSteering();
void init();
void close();
public:
RaceGUIMultitouch(RaceGUIBase* race_gui);
~RaceGUIMultitouch();
void drawMultitouchSteering(const AbstractKart* kart,
const core::recti &viewport,
const core::vector2df &scaling);
void draw(const AbstractKart* kart, const core::recti &viewport,
const core::vector2df &scaling);
unsigned int getMinimapBottom() {return m_minimap_bottom;}
void setGuiAction(bool enabled = true) {m_gui_action = enabled;}

View File

@ -69,7 +69,7 @@ bool CheckLap::isTriggered(const Vec3 &old_pos, const Vec3 &new_pos,
// has check defined.
if(!lin_world)
return false;
float current_distance = lin_world->getDistanceDownTrackForKart(kart_index);
float current_distance = lin_world->getDistanceDownTrackForKart(kart_index, false);
bool result = (m_previous_distance[kart_index]>0.95f*track_length &&
current_distance<7.0f);

View File

@ -68,48 +68,55 @@ void TrackSector::update(const Vec3 &xyz, bool ignore_vertical)
// If m_track_sector == UNKNOWN_SECTOR, then the kart is not on top of
// the road, so we have to use search for the closest graph node.
if(m_current_graph_node == Graph::UNKNOWN_SECTOR)
if (m_current_graph_node == Graph::UNKNOWN_SECTOR)
{
m_current_graph_node = Graph::get()->findOutOfRoadSector(xyz,
prev_sector, test_nodes, ignore_vertical);
// ArenaGraph (battle and soccer mode) doesn't need the code below
if (ag) return;
}
// ArenaGraph (battle and soccer mode) doesn't need the code below
if (ag) return;
// keep the current quad as the latest valid one IF the player has one
// of the required checklines
const DriveNode* dn = DriveGraph::get()->getNode(m_current_graph_node);
const std::vector<int>& checkline_requirements = dn->getChecklineRequirements();
bool isValidQuad = false;
if (checkline_requirements.size() == 0)
{
isValidQuad = true;
if (m_on_road)
m_last_valid_graph_node = m_current_graph_node;
}
else
{
if (ag) return;
// keep the current quad as the latest valid one IF the player has one
// of the required checklines
const DriveNode* dn = DriveGraph::get()->getNode(m_current_graph_node);
const std::vector<int>& checkline_requirements = dn->getChecklineRequirements();
if (checkline_requirements.size() == 0)
for (unsigned int i=0; i<checkline_requirements.size(); i++)
{
m_last_valid_graph_node = m_current_graph_node;
}
else
{
//bool has_prerequisite = false;
for (unsigned int i=0; i<checkline_requirements.size(); i++)
if (m_last_triggered_checkline == checkline_requirements[i])
{
if (m_last_triggered_checkline == checkline_requirements[i])
{
//has_prerequisite = true;
//has_prerequisite = true;
if (m_on_road)
m_last_valid_graph_node = m_current_graph_node;
break;
}
isValidQuad = true;
break;
}
// TODO: show a message when we detect a user cheated.
}
// TODO: show a message when we detect a user cheated.
}
// Now determine the 'track' coords, i.e. ow far from the start of the
// track, and how far to the left or right of the center driveline.
DriveGraph::get()->spatialToTrack(&m_current_track_coords, xyz,
m_current_graph_node);
m_current_graph_node);
if (m_last_valid_graph_node != Graph::UNKNOWN_SECTOR)
{
DriveGraph::get()->spatialToTrack(&m_latest_valid_track_coords, xyz,
m_last_valid_graph_node);
}
} // update
// ----------------------------------------------------------------------------

View File

@ -48,6 +48,8 @@ private:
* of the center driveline. */
Vec3 m_current_track_coords;
Vec3 m_latest_valid_track_coords;
/** True if the object is on the road (driveline), or not. */
bool m_on_road;
@ -61,7 +63,13 @@ public:
float getRelativeDistanceToCenter() const;
// ------------------------------------------------------------------------
/** Returns how far the the object is from the start line. */
float getDistanceFromStart() const { return m_current_track_coords.getZ();}
float getDistanceFromStart(bool account_for_checklines) const
{
if (account_for_checklines)
return m_latest_valid_track_coords.getZ();
else
return m_current_track_coords.getZ();
}
// ------------------------------------------------------------------------
/** Returns the distance to the centre driveline. */
float getDistanceToCenter() const { return m_current_track_coords.getX(); }

View File

@ -122,6 +122,7 @@ enum DebugMenuCommand
DEBUG_GUI_CAM_NORMAL,
DEBUG_GUI_CAM_SMOOTH,
DEBUG_GUI_CAM_ATTACH,
DEBUG_VIEW_KART_PREVIOUS,
DEBUG_VIEW_KART_ONE,
DEBUG_VIEW_KART_TWO,
DEBUG_VIEW_KART_THREE,
@ -130,6 +131,7 @@ enum DebugMenuCommand
DEBUG_VIEW_KART_SIX,
DEBUG_VIEW_KART_SEVEN,
DEBUG_VIEW_KART_EIGHT,
DEBUG_VIEW_KART_NEXT,
DEBUG_HIDE_KARTS,
DEBUG_THROTTLE_FPS,
DEBUG_VISUAL_VALUES,
@ -244,6 +246,7 @@ LightNode* findNearestLight()
bool handleContextMenuAction(s32 cmd_id)
{
unsigned int kart_num = Camera::getActiveCamera()->getKart()->getWorldKartId();
World *world = World::getWorld();
Physics *physics = Physics::getInstance();
@ -603,6 +606,19 @@ bool handleContextMenuAction(s32 cmd_id)
}
break;
}
case DEBUG_VIEW_KART_PREVIOUS:
{
if (kart_num == 0)
{
kart_num += World::getWorld()->getNumKarts() - 1;
}
else
{
kart_num--;
}
Camera::getActiveCamera()->setKart(World::getWorld()->getKart(kart_num));
break;
}
case DEBUG_VIEW_KART_ONE:
changeCameraTarget(1);
break;
@ -627,6 +643,20 @@ bool handleContextMenuAction(s32 cmd_id)
case DEBUG_VIEW_KART_EIGHT:
changeCameraTarget(8);
break;
case DEBUG_VIEW_KART_NEXT:
{
if (kart_num == World::getWorld()->getNumKarts() - 1)
{
kart_num = 0;
}
else
{
kart_num++;
}
Camera::getActiveCamera()->setKart(World::getWorld()->getKart(kart_num));
break;
}
case DEBUG_PRINT_START_POS:
if (!world) return false;
for (unsigned int i = 0; i<world->getNumKarts(); i++)
@ -893,6 +923,7 @@ bool onEvent(const SEvent &event)
mnu->addItem(L"Change camera target >",-1,true, true);
sub = mnu->getSubMenu(5);
sub->addItem(L"To previous kart (Ctrl + F5)", DEBUG_VIEW_KART_PREVIOUS);
sub->addItem(L"To kart one", DEBUG_VIEW_KART_ONE);
sub->addItem(L"To kart two", DEBUG_VIEW_KART_TWO);
sub->addItem(L"To kart three", DEBUG_VIEW_KART_THREE);
@ -901,6 +932,7 @@ bool onEvent(const SEvent &event)
sub->addItem(L"To kart six", DEBUG_VIEW_KART_SIX);
sub->addItem(L"To kart seven", DEBUG_VIEW_KART_SEVEN);
sub->addItem(L"To kart eight", DEBUG_VIEW_KART_EIGHT);
sub->addItem(L"To next kart (Ctrl + F6)", DEBUG_VIEW_KART_NEXT);
mnu->addItem(L"Font >",-1,true, true);
sub = mnu->getSubMenu(6);
@ -970,6 +1002,7 @@ bool onEvent(const SEvent &event)
bool handleStaticAction(int key)
{
unsigned int kart_num = Camera::getActiveCamera()->getKart()->getWorldKartId();
if (key == IRR_KEY_F1)
{
handleContextMenuAction(DEBUG_GUI_CAM_FREE);
@ -985,6 +1018,32 @@ bool handleStaticAction(int key)
#endif
return true;
}
else if (key == IRR_KEY_F5)
{
if (kart_num == 0)
{
kart_num += World::getWorld()->getNumKarts() - 1;
}
else
{
kart_num--;
}
Camera::getActiveCamera()->setKart(World::getWorld()->getKart(kart_num));
return true;
}
else if (key == IRR_KEY_F6)
{
if (kart_num == World::getWorld()->getNumKarts() - 1)
{
kart_num = 0;
}
else
{
kart_num++;
}
Camera::getActiveCamera()->setKart(World::getWorld()->getKart(kart_num));
return true;
}
// TODO: create more keyboard shortcuts
return false;

View File

@ -21,17 +21,18 @@
#include <stdlib.h>
#include <ctime>
std::vector<RandomGenerator*> RandomGenerator::m_all_random_generators;
//std::vector<RandomGenerator*> RandomGenerator::m_all_random_generators;
RandomGenerator::RandomGenerator()
{
m_a = 1103515245;
m_c = 12345;
m_all_random_generators.push_back(this);
//m_all_random_generators.push_back(this);
m_random_value = 3141591;
} // RandomGenerator
// ----------------------------------------------------------------------------
#if 0
std::vector<int> RandomGenerator::generateAllSeeds()
{
std::vector<int> all_seeds;
@ -44,7 +45,6 @@ std::vector<int> RandomGenerator::generateAllSeeds()
return all_seeds;
} // generateAllSeeds
#if 0
// ----------------------------------------------------------------------------
int RandomGenerator::get(int n)

View File

@ -40,7 +40,7 @@ private:
public:
RandomGenerator();
std::vector<int> generateAllSeeds();
//std::vector<int> generateAllSeeds();
/** Returns a pseudo random number between 0 and n-1 inclusive */
int get(int n) {return rand() % n; }
void seed(int s) {m_random_value = s;}