From 116d72a4b753c07ecb302d91e8dc8ad9abb6e883 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Tue, 5 Nov 2013 15:00:02 +0100 Subject: [PATCH 01/40] Only use PO4A on desktop file and manpages on non-Windows builds Fixes the MXE-with-PO4A build --- desktop/CMakeLists.txt | 53 +++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt index bf9be067..b2115639 100644 --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -72,34 +72,33 @@ if(NOT PLATFORM_WINDOWS) podman(PODFILE colobot.pod) endif() - + + # Translate translatable material + find_program(PO4A po4a) + + if(PO4A) + add_custom_target(desktop_po4a + COMMAND ${PO4A} po4a.cfg + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + add_dependencies(desktopfile desktop_po4a) + + if(POD2MAN) + add_custom_target(man_po4a + COMMAND ${PO4A} po4a.cfg + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + add_dependencies(man man_po4a) + file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po) + string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO}) + foreach(LOCALE ${LINGUAS}) + podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE}) + add_dependencies(man${PM_LOCALE} man_po4a) + endforeach() + endif() + endif() + else() # if(NOT PLATFORM_WINDOWS) set(COLOBOT_VERSION_4COMMAS "${COLOBOT_VERSION_MAJOR},${COLOBOT_VERSION_MINOR},${COLOBOT_VERSION_REVISION},0") configure_file(colobot.rc.cmake ${CMAKE_CURRENT_BINARY_DIR}/colobot.rc) endif() - -# Translate translatable material -find_program(PO4A po4a) - -if(PO4A) - add_custom_target(desktop_po4a - COMMAND ${PO4A} po4a.cfg - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - add_dependencies(desktopfile desktop_po4a) - - if(POD2MAN) - add_custom_target(man_po4a - COMMAND ${PO4A} po4a.cfg - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - add_dependencies(man man_po4a) - file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po) - string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO}) - foreach(LOCALE ${LINGUAS}) - podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE}) - add_dependencies(man${PM_LOCALE} man_po4a) - endforeach() - endif() -endif() - From 8b65e9b56f922db8f961b3de0a5628792f5eb79a Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Thu, 7 Nov 2013 14:44:12 +0100 Subject: [PATCH 02/40] Add russian language support --- src/app/app.cpp | 17 +++++++++++++++++ src/common/global.h | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index 04c028dd..e2405b81 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -1683,6 +1683,10 @@ char CApplication::GetLanguageChar() const case LANGUAGE_POLISH: langChar = 'P'; break; + + case LANGUAGE_RUSSIAN: + langChar = 'R'; + break; } return langChar; } @@ -1709,6 +1713,11 @@ bool CApplication::ParseLanguage(const std::string& str, Language& language) language = LANGUAGE_POLISH; return true; } + else if (str == "ru") + { + language = LANGUAGE_RUSSIAN; + return true; + } return false; } @@ -1742,6 +1751,10 @@ void CApplication::SetLanguage(Language language) case LANGUAGE_POLISH: locale = "pl_PL.utf8"; break; + + case LANGUAGE_RUSSIAN: + locale = "ru_RU.utf8"; + break; } if (locale.empty()) @@ -1772,6 +1785,10 @@ void CApplication::SetLanguage(Language language) { m_language = LANGUAGE_POLISH; } + else if (strncmp(envLang,"ru",2) == 0) + { + m_language = LANGUAGE_RUSSIAN; + } else { GetLogger()->Warn("Enviromnent locale ('%s') is not supported, setting default language\n", envLang); diff --git a/src/common/global.h b/src/common/global.h index a3220571..da62bac6 100644 --- a/src/common/global.h +++ b/src/common/global.h @@ -173,7 +173,8 @@ enum Language LANGUAGE_ENGLISH = 0, LANGUAGE_FRENCH = 1, LANGUAGE_GERMAN = 2, - LANGUAGE_POLISH = 3 + LANGUAGE_POLISH = 3, + LANGUAGE_RUSSIAN = 4 }; /** From bf0c0227ecefa491937a982cff6ab9cf60460ada Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 30 Oct 2013 09:06:06 +0100 Subject: [PATCH 03/40] Fix tab-vs-space in CMake configuration file --- desktop/CMakeLists.txt | 198 ++++++++++++++++++++--------------------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt index b2115639..72417578 100644 --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -1,104 +1,104 @@ cmake_minimum_required(VERSION 2.8) if(NOT PLATFORM_WINDOWS) - # Install Desktop Entry file - set(COLOBOT_DESKTOP_FILE colobot.desktop) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE} - COMMAND ./create_desktop_file.sh > ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Build ${COLOBOT_DESKTOP_FILE}" - ) - add_custom_target(desktopfile ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}) - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE} - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/ - ) - - # Install Icon - set(COLOBOT_ICON_FILE colobot.svg) - install( - FILES ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE} - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/ - ) - - # Render SVG icon in various sizes - find_program(RSVG_CONVERT rsvg-convert) - if(RSVG_CONVERT) - foreach(PNGSIZE "48" "32" "16") - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}) - add_custom_target(resize_icon_${PNGSIZE} ALL - COMMAND ${RSVG_CONVERT} -w ${PNGSIZE} -h ${PNGSIZE} ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE} - > ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png - ) - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${PNGSIZE}x${PNGSIZE}/apps/ - ) - endforeach() - endif() - - # Create manpage from pod-formatted file - find_program(POD2MAN pod2man) - if(POD2MAN) - set(COLOBOT_MANPAGE_SECTION 6) - - macro(podman) - cmake_parse_arguments(PM "" "PODFILE;LOCALE;" "" ${ARGN}) - if(PM_LOCALE) - # This copes with the fact that english has no "/LANG" in the paths and filenames. - set(SLASHLOCALE /${PM_LOCALE}) - endif() - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE} - COMMAND ${POD2MAN} ARGS --section=${COLOBOT_MANPAGE_SECTION} - --center="Colobot" --stderr --utf8 - --release="${COLOBOT_VERSION_FULL}" - ${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE} - ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} - COMMENT "Create ${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} manpage" - ) - add_custom_target(man${PM_LOCALE} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}) - - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man${SLASHLOCALE}/man${COLOBOT_MANPAGE_SECTION}/ ) - - add_dependencies(man man${PM_LOCALE}) - endmacro() - - # Create the english manpage - podman(PODFILE colobot.pod) - - endif() - - # Translate translatable material - find_program(PO4A po4a) - - if(PO4A) - add_custom_target(desktop_po4a - COMMAND ${PO4A} po4a.cfg - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - add_dependencies(desktopfile desktop_po4a) - - if(POD2MAN) - add_custom_target(man_po4a - COMMAND ${PO4A} po4a.cfg - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - add_dependencies(man man_po4a) - file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po) - string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO}) - foreach(LOCALE ${LINGUAS}) - podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE}) - add_dependencies(man${PM_LOCALE} man_po4a) - endforeach() - endif() - endif() - + # Install Desktop Entry file + set(COLOBOT_DESKTOP_FILE colobot.desktop) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE} + COMMAND ./create_desktop_file.sh > ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMENT "Build ${COLOBOT_DESKTOP_FILE}" + ) + add_custom_target(desktopfile ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE} + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/ + ) + + # Install Icon + set(COLOBOT_ICON_FILE colobot.svg) + install( + FILES ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE} + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/ + ) + + # Render SVG icon in various sizes + find_program(RSVG_CONVERT rsvg-convert) + if(RSVG_CONVERT) + foreach(PNGSIZE "48" "32" "16") + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}) + add_custom_target(resize_icon_${PNGSIZE} ALL + COMMAND ${RSVG_CONVERT} -w ${PNGSIZE} -h ${PNGSIZE} ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE} + > ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png + ) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${PNGSIZE}x${PNGSIZE}/apps/ + ) + endforeach() + endif() + + # Create manpage from pod-formatted file + find_program(POD2MAN pod2man) + if(POD2MAN) + set(COLOBOT_MANPAGE_SECTION 6) + + macro(podman) + cmake_parse_arguments(PM "" "PODFILE;LOCALE;" "" ${ARGN}) + if(PM_LOCALE) + # This copes with the fact that english has no "/LANG" in the paths and filenames. + set(SLASHLOCALE /${PM_LOCALE}) + endif() + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE} + COMMAND ${POD2MAN} ARGS --section=${COLOBOT_MANPAGE_SECTION} + --center="Colobot" --stderr --utf8 + --release="${COLOBOT_VERSION_FULL}" + ${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE} + ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} + COMMENT "Create ${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} manpage" + ) + add_custom_target(man${PM_LOCALE} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man${SLASHLOCALE}/man${COLOBOT_MANPAGE_SECTION}/ ) + + add_dependencies(man man${PM_LOCALE}) + endmacro() + + # Create the english manpage + podman(PODFILE colobot.pod) + + endif() + + # Translate translatable material + find_program(PO4A po4a) + + if(PO4A) + add_custom_target(desktop_po4a + COMMAND ${PO4A} po4a.cfg + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + add_dependencies(desktopfile desktop_po4a) + + if(POD2MAN) + add_custom_target(man_po4a + COMMAND ${PO4A} po4a.cfg + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + add_dependencies(man man_po4a) + file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po) + string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO}) + foreach(LOCALE ${LINGUAS}) + podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE}) + add_dependencies(man${PM_LOCALE} man_po4a) + endforeach() + endif() + endif() + else() # if(NOT PLATFORM_WINDOWS) - set(COLOBOT_VERSION_4COMMAS "${COLOBOT_VERSION_MAJOR},${COLOBOT_VERSION_MINOR},${COLOBOT_VERSION_REVISION},0") - configure_file(colobot.rc.cmake ${CMAKE_CURRENT_BINARY_DIR}/colobot.rc) + set(COLOBOT_VERSION_4COMMAS "${COLOBOT_VERSION_MAJOR},${COLOBOT_VERSION_MINOR},${COLOBOT_VERSION_REVISION},0") + configure_file(colobot.rc.cmake ${CMAKE_CURRENT_BINARY_DIR}/colobot.rc) endif() From d8762fdd8dcfcf9ac62704547c669be15e9c74bc Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 30 Oct 2013 16:38:58 +0100 Subject: [PATCH 04/40] Reorder desktop/CMakeLists.txt for more platform-specific clarity --- desktop/CMakeLists.txt | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt index 72417578..f7aa5f1b 100644 --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -if(NOT PLATFORM_WINDOWS) +if(PLATFORM_LINUX) # Install Desktop Entry file set(COLOBOT_DESKTOP_FILE colobot.desktop) add_custom_command( @@ -38,12 +38,22 @@ if(NOT PLATFORM_WINDOWS) endforeach() endif() + # Translate translatable material + find_program(PO4A po4a) + if(PO4A) + add_custom_target(desktop_po4a + COMMAND ${PO4A} po4a.cfg + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + add_dependencies(desktopfile desktop_po4a) + endif() + # Create manpage from pod-formatted file find_program(POD2MAN pod2man) if(POD2MAN) set(COLOBOT_MANPAGE_SECTION 6) - macro(podman) + macro(podman) cmake_parse_arguments(PM "" "PODFILE;LOCALE;" "" ${ARGN}) if(PM_LOCALE) # This copes with the fact that english has no "/LANG" in the paths and filenames. @@ -71,19 +81,8 @@ if(NOT PLATFORM_WINDOWS) # Create the english manpage podman(PODFILE colobot.pod) - endif() - - # Translate translatable material - find_program(PO4A po4a) - - if(PO4A) - add_custom_target(desktop_po4a - COMMAND ${PO4A} po4a.cfg - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - add_dependencies(desktopfile desktop_po4a) - - if(POD2MAN) + if(PO4A) + # Translate the manpage to other languages add_custom_target(man_po4a COMMAND ${PO4A} po4a.cfg WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} @@ -97,8 +96,9 @@ if(NOT PLATFORM_WINDOWS) endforeach() endif() endif() +endif(PLATFORM_LINUX) -else() # if(NOT PLATFORM_WINDOWS) +if(PLATFORM_WINDOWS) set(COLOBOT_VERSION_4COMMAS "${COLOBOT_VERSION_MAJOR},${COLOBOT_VERSION_MINOR},${COLOBOT_VERSION_REVISION},0") configure_file(colobot.rc.cmake ${CMAKE_CURRENT_BINARY_DIR}/colobot.rc) -endif() +endif(PLATFORM_WINDOWS) From 96383279321d0e467f18e570f6c84915010dea8f Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 30 Oct 2013 17:05:29 +0100 Subject: [PATCH 05/40] Drop redundant custom_target for po4a --- desktop/CMakeLists.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt index f7aa5f1b..be886e50 100644 --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -83,16 +83,12 @@ if(PLATFORM_LINUX) if(PO4A) # Translate the manpage to other languages - add_custom_target(man_po4a - COMMAND ${PO4A} po4a.cfg - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - add_dependencies(man man_po4a) + add_dependencies(man desktop_po4a) file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po) string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO}) foreach(LOCALE ${LINGUAS}) podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE}) - add_dependencies(man${PM_LOCALE} man_po4a) + add_dependencies(man${PM_LOCALE} desktop_po4a) endforeach() endif() endif() From 512fa82df388d00722991b47e4ca388a46ab381a Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Sun, 10 Nov 2013 23:08:38 +0100 Subject: [PATCH 06/40] Updated data submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 54e899d2..9d211ad4 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 54e899d258915d7bab57447b34f1a343654688e7 +Subproject commit 9d211ad4e04c9508cc31e217314bf490c88e7d29 From 7a1a388216cf9d68fde7a482bb8b9416b37d37bd Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Mon, 11 Nov 2013 14:16:28 +0100 Subject: [PATCH 07/40] Updated data submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 9d211ad4..0e2fa1ec 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 9d211ad4e04c9508cc31e217314bf490c88e7d29 +Subproject commit 0e2fa1ec3b279b9a43b78b618fd059eb2244f53a From 788800f570c1d9d6d2e71681771df262347db299 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Tue, 12 Nov 2013 19:02:28 +0100 Subject: [PATCH 08/40] Russian translation of interface (#249) --- po/ru.po | 1827 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1827 insertions(+) create mode 100644 po/ru.po diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 00000000..f2d629ad --- /dev/null +++ b/po/ru.po @@ -0,0 +1,1827 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-12-27 17:09+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Language: ru_RU\n" +"X-Source-Language: en_US\n" + +msgid " " +msgstr " " + +msgid " Challenges in the chapter:" +msgstr " Задачи к главе:" + +msgid " Chapters:" +msgstr " Разделы:" + +msgid " Drivers:" +msgstr " Драйверы:" + +msgid " Exercises in the chapter:" +msgstr " Упражнения в разделе:" + +msgid " Free game on this chapter:" +msgstr " Свободная игра на этой главе:" + +msgid " Free game on this planet:" +msgstr " Свободная игра на этой планете:" + +msgid " Missions on this level:" +msgstr " Миссии на этом уровне:" + +msgid " Missions on this planet:" +msgstr "Миссии на этой планете:" + +msgid " Planets:" +msgstr " Планеты:" + +msgid " Prototypes on this planet:" +msgstr "Прототипы на этой планете:" + +msgid " Resolution:" +msgstr " Разрешение:" + +msgid " Summary:" +msgstr " Итог:" + +msgid " User levels:" +msgstr " Пользовательские уровни:" + +msgid " or " +msgstr " или " + +msgid "\" [ \" expected" +msgstr "Ожидалось \" [ \"" + +msgid "\" ] \" missing" +msgstr "Отсутствует \"]\" " + +#, c-format +msgid "\"%s\" missing in this exercise" +msgstr "\"%s\" отсутствует в этом упражнении" + +msgid "%1" +msgstr "%1" + +msgid "..behind" +msgstr "Сзади" + +msgid "..in front" +msgstr "Спереди" + +msgid "..power cell" +msgstr "Батарею" + +msgid "1) First click on the key you want to redefine." +msgstr "1) Сначала нажми на клавишу, которую вы хотите переопределить." + +msgid "2) Then press the key you want to use instead." +msgstr "2) После этого нажмите на клавишу, которую вы хотите использовать." + +msgid "3D sound\\3D positioning of the sound" +msgstr "3D-звук\\Стерео звук" + +msgid "<< Back \\Back to the previous screen" +msgstr "<< Назад \\Вернуться на предыдущую страницу" + +msgid "<<< Sorry; mission failed >>>" +msgstr "<<< Миссия провалена >>>" + +msgid "<<< Well done; mission accomplished >>>" +msgstr "<<< Отлично, миссия выполнена >>>" + +msgid "A label must be followed by \"for\"; \"while\"; \"do\" or \"switch\"" +msgstr "За меткой должен быть \"for\", \"while\", \"do\" или \"switch\"" + +msgid "A variable can not be declared twice" +msgstr "Переменная не может быть объявлена дважды" + +msgid "Abort\\Abort the current mission" +msgstr "Выход\\Прервать текущую миссию" + +msgid "Access beyond array limit" +msgstr "Доступ к массиву за предел" + +msgid "" +"Access to solution\\Shows the solution (detailed instructions for missions)" +msgstr "Доступ к решению\\Показывает решение (подробные инструкции для миссий)" + +msgid "Access to solutions\\Show program \"4: Solution\" in the exercises" +msgstr "Доступ к решению\\Показывает решение \"4: Решение\" в упражнениях" + +msgid "Alien Queen" +msgstr "Королева чужих" + +msgid "Alien Queen killed" +msgstr "Королева чужих убита" + +msgid "Already carrying something" +msgstr "Уже что-то несу" + +msgid "Alt" +msgstr "Alt" + +msgid "Analysis already performed" +msgstr "Анализ уже выполнен" + +msgid "Analysis performed" +msgstr "Анализ выполнен" + +msgid "Analyzes only organic matter" +msgstr "Анализирую только органические вещества" + +msgid "Ant" +msgstr "Муравей" + +msgid "Ant fatally wounded" +msgstr "Муравей смертельно ранен" + +msgid "Appearance\\Choose your appearance" +msgstr "Внешность\\Настройка внешности" + +msgid "Apply changes\\Activates the changed settings" +msgstr "Принять\\Принять изменения настроек" + +msgid "Appropriate constructor missing" +msgstr "Соответствующий конструктор отсутствует" + +msgid "Assignment impossible" +msgstr "Назначение невозможно" + +msgid "Autolab" +msgstr "Лаборатория" + +msgid "Automatic indent\\When program editing" +msgstr "Автоматический отступ\\При редактировании программы" + +msgid "Back" +msgstr "Назад" + +msgid "Background sound :\\Volume of audio tracks on the CD" +msgstr "Фоновый звук:\\Громкость звуковых дорожек на CD" + +msgid "Backward (\\key down;)" +msgstr "Назад (\\key down;)" + +msgid "Backward\\Moves backward" +msgstr "Назад\\Двигаться назад" + +msgid "Bad argument for \"new\"" +msgstr "Неверный аргумент для \"new\"" + +msgid "Big indent\\Indent 2 or 4 spaces per level defined by braces" +msgstr "Большой отступ\\Отступать на 2 или 4 пробела, в зависимости от скобок" + +msgid "Black box" +msgstr "Черный ящик" + +msgid "Blue" +msgstr "Синий" + +msgid "Blue flag" +msgstr "Синий флаг" + +msgid "Bot destroyed" +msgstr "Бот уничтожен" + +msgid "Bot factory" +msgstr "Завод ботов" + +msgid "Build a bot factory" +msgstr "Построить завод ботов" + +msgid "Build a converter" +msgstr "Построить преобразователь" + +msgid "Build a defense tower" +msgstr "Построить защитную башню" + +msgid "Build a derrick" +msgstr "Построить буровую вышку" + +msgid "Build a exchange post" +msgstr "Построить пост по обмену сообщениями" + +msgid "Build a legged grabber" +msgstr "Собрать шагающего сборщика" + +msgid "Build a legged orga shooter" +msgstr "Собрать шагающего орга-стрелка" + +msgid "Build a legged shooter" +msgstr "Собрать шагающего стрелка" + +msgid "Build a legged sniffer" +msgstr "Собрать шагающего искателя" + +msgid "Build a lightning conductor" +msgstr "Построить громоотвод" + +msgid "Build a nuclear power plant" +msgstr "Построить завод атомных батарей (неперезаряж.)" + +msgid "Build a phazer shooter" +msgstr "Собрать фазового стрелка" + +msgid "Build a power cell factory" +msgstr "Построить завод перезаряжаемых батарей" + +msgid "Build a power station" +msgstr "Построить электростанцию" + +msgid "Build a radar station" +msgstr "Построить радарную станцию" + +msgid "Build a recycler" +msgstr "Собрать утилизатор" + +msgid "Build a repair center" +msgstr "Построить ремонтный пункт" + +msgid "Build a research center" +msgstr "Построить научно-исследовательский центр" + +msgid "Build a shielder" +msgstr "Собрать передвижной щит" + +msgid "Build a subber" +msgstr "Собрать саббера" + +msgid "Build a thumper" +msgstr "Собрать ударника" + +msgid "Build a tracked grabber" +msgstr "Собрать гусеничного сборщика" + +msgid "Build a tracked orga shooter" +msgstr "Собрать гусеничного орга-стрелка" + +msgid "Build a tracked shooter" +msgstr "Собрать гусеничного стрелка" + +msgid "Build a tracked sniffer" +msgstr "Собрать гусеничного искателя" + +msgid "Build a wheeled grabber" +msgstr "Собрать колесного сборщика" + +msgid "Build a wheeled orga shooter" +msgstr "Собрать колесного орга-стрелка" + +msgid "Build a wheeled shooter" +msgstr "Собрать колесного стрелка" + +msgid "Build a wheeled sniffer" +msgstr "Собрать колесного искателя" + +msgid "Build a winged grabber" +msgstr "Собрать летающего сборщика" + +msgid "Build a winged orga shooter" +msgstr "Собрать летающего орга-стрелка" + +msgid "Build a winged shooter" +msgstr "Собрать летающего стрелка" + +msgid "Build a winged sniffer" +msgstr "Собрать летающего искателя" + +msgid "Build an autolab" +msgstr "Построить лабораторию" + +msgid "Building completed" +msgstr "Здание построено" + +msgid "Building destroyed" +msgstr "Здание разрушено" + +msgid "Building too close" +msgstr "Здание слишком близко" + +msgid "Button %1" +msgstr "Кнопка %1" + +msgid "COLOBOT" +msgstr "КОЛОБОТ" + +msgid "Calling an unknown function" +msgstr "Вызов неизвестной функции" + +msgid "Camera (\\key camera;)" +msgstr "Камера (\\key camera;)" + +msgid "Camera awayest" +msgstr "Отдалить камеру" + +msgid "Camera back\\Moves the camera backward" +msgstr "Отдалить камеру\\Перемещение камеры назад" + +msgid "Camera closer\\Moves the camera forward" +msgstr "Приблизать камеру\\Перемещение камеры вперед" + +msgid "Camera nearest" +msgstr "Приблизить камеру" + +msgid "Camera to left" +msgstr "Камеру влево" + +msgid "Camera to right" +msgstr "Камеру вправо" + +msgid "Can not create this; there are too many objects" +msgstr "Не удается это создать, слишком много объектов" + +msgid "Can't open file" +msgstr "Невозможно открыть файл" + +msgid "Cancel" +msgstr "Отмена" + +msgid "Cancel\\Cancel all changes" +msgstr "Отмена\\Отменить все изменения" + +msgid "Cancel\\Keep current player name" +msgstr "Отмена\\Отмена" + +msgid "Challenges" +msgstr "Задания" + +msgid "Challenges\\Programming challenges" +msgstr "Задания\\Практика программирования" + +msgid "Change camera\\Switches between onboard camera and following camera" +msgstr "Изменить вид\\Переключение между бортовой камерой и следящей камерой" + +msgid "Checkpoint" +msgstr "Контрольная точка" + +msgid "Checkpoint crossed" +msgstr "Вы прошли контрольную точку" + +msgid "Climb\\Increases the power of the jet" +msgstr "Взлет и подъем\\Увеличивает мощность реактивного двигателя" + +msgid "Close" +msgstr "Закрыть" + +msgid "Closing bracket missing " +msgstr "Закрывающая скобка отсутствует" + +msgid "Colobot rules!" +msgstr "Правила игры!" + +msgid "Command line" +msgstr "Командная строка" + +msgid "Compass" +msgstr "Компас" + +msgid "Compilation ok (0 errors)" +msgstr "Компиляция завершена (0 ошибок)" + +msgid "Compile" +msgstr "Компилировать" + +msgid "Continue" +msgstr "Продолжить" + +msgid "Continue\\Continue the current mission" +msgstr "Продолжить\\Продолжить текущую миссию" + +msgid "Continue\\Continue the game" +msgstr "Продолжить\\Продолжить игру" + +msgid "Controls\\Keyboard, joystick and mouse settings" +msgstr "Управление\\Настройки клавиатуры, джойстика и мыши" + +msgid "Converts ore to titanium" +msgstr "Преобразует руду в титан" + +msgid "Copy" +msgstr "Копировать" + +msgid "Copy (Ctrl+c)" +msgstr "Копировать (Ctrl+C)" + +msgid "Ctrl" +msgstr "Ctrl" + +msgid "Current mission saved" +msgstr "Текущая миссия сохранена" + +msgid "Customize your appearance" +msgstr "Настроить свой внешний вид" + +msgid "Cut (Ctrl+x)" +msgstr "Вырезать (Ctrl+X)" + +msgid "Defense tower" +msgstr "Защитная башня" + +msgid "Delete" +msgstr "Удалить" + +msgid "Delete player\\Deletes the player from the list" +msgstr "Удалить игрока\\Удаление игрока из списка" + +msgid "Delete\\Deletes the selected file" +msgstr "Удалить\\Удаление выбранного файла" + +msgid "Depth of field\\Maximum visibility" +msgstr "Дальность прорисовки\\Максимальная видимость" + +msgid "Derrick" +msgstr "Космический корабль" + +msgid "Descend\\Reduces the power of the jet" +msgstr "Снижение и посадка\\Понижение мощности реактивного двигателя" + +msgid "Destroy the building" +msgstr "Уничтожить здание" + +msgid "Destroyer" +msgstr "Уничтожитель" + +msgid "Details\\Visual quality of 3D objects" +msgstr "Детали\\Визуальное качество 3D-объектов" + +msgid "Developed by :" +msgstr "Разработка :" + +msgid "Device\\Driver and resolution settings" +msgstr "Устройство\\Драйвер и настройки разрешения" + +msgid "Dividing by zero" +msgstr "Деление на ноль (запрещено!)" + +msgid "Do not use in this exercise" +msgstr "Не используй в этом упражнении" + +msgid "Do you really want to destroy the selected building?" +msgstr "Вы действительно хотите уничтожить выбранное здание?" + +#, c-format +msgid "Do you want to delete %s's saved games? " +msgstr "Вы действительно хотите удалить сохраненные игры игрока %s?" + +msgid "Do you want to quit COLOBOT ?" +msgstr "Вы хотите закрыть COLOBOT?" + +msgid "Doors blocked by a robot or another object " +msgstr "Двери заблокированы роботом или другим объектом" + +msgid "Down (\\key gdown;)" +msgstr "Вниз (\\key gdown;)" + +msgid "Drawer bot" +msgstr "Рисовальщик" + +msgid "Dust\\Dust and dirt on bots and buildings" +msgstr "Пыль\\Пыль и грязь на ботах и зданиях" + +msgid "Dynamic lighting\\Mobile light sources" +msgstr "Динамическое освещение\\Подвижные источники света" + +msgid "Edit the selected program" +msgstr "Изменить выбранную программу" + +msgid "Egg" +msgstr "Яйцо" + +msgid "End of block missing" +msgstr "Отсутствует конец блока" + +msgid "Energy deposit (site for power station)" +msgstr "Запасы энергии (место для электростанций)" + +msgid "Energy level" +msgstr "Уровень энергии" + +msgid "Engineer" +msgstr "Инженер" + +msgid "Error in instruction move" +msgstr "Ошибка движения" + +msgid "Execute the selected program" +msgstr "Выполнить выбранную программу" + +msgid "Execute/stop" +msgstr "Выполнить/стоп" + +msgid "Exercises\\Programming exercises" +msgstr "Упражнения\\Упражнения по программированию" + +msgid "Exit film\\Film at the exit of exercises" +msgstr "Ролик при выходе\\Ролик во время выхода из упражнения" + +msgid "Explosive" +msgstr "Взрывчатка" + +msgid "Extend shield (\\key action;)" +msgstr "Поднять щит (\\key action;)" + +msgid "Eyeglasses:" +msgstr "Очки:" + +msgid "Face type:" +msgstr "Лицо:" + +msgid "File not open" +msgstr "Файл не открыт" + +msgid "Filename:" +msgstr "Имя файла:" + +msgid "Film sequences\\Films before and after the missions" +msgstr "Показывать видео\\Фильмы до и после миссий" + +msgid "Finish" +msgstr "Финиш" + +msgid "Fixed mine" +msgstr "Мина" + +msgid "Flat ground not large enough" +msgstr "Недостаточно плоской земли" + +msgid "Fog\\Fog" +msgstr "Туман\\Туман" + +msgid "Folder:" +msgstr "Папка" + +#, c-format +msgid "Folder: %s" +msgstr "Папка: %s" + +msgid "Font size" +msgstr "Размер шрифта" + +msgid "Forward" +msgstr "Вперед" + +msgid "Forward (\\key up;)" +msgstr "Вперед (\\key up;)" + +msgid "Forward\\Moves forward" +msgstr "Вперед\\Двигаться вперед" + +msgid "Found a site for a derrick" +msgstr "Найдено место для буровой вышки" + +msgid "Found a site for power station" +msgstr "Найдено место для электростанции" + +msgid "Found key A (site for derrick)" +msgstr "Найден ключ A (место для буровой вышки)" + +msgid "Found key B (site for derrick)" +msgstr "Найден ключ B (место для буровой вышки)" + +msgid "Found key C (site for derrick)" +msgstr "Найден ключ C (место для буровой вышки)" + +msgid "Found key D (site for derrick)" +msgstr "Найден ключ D (место для буровой вышки)" + +msgid "Free game" +msgstr "Свободная игра" + +msgid "Free game\\Free game without a specific goal" +msgstr "Свобод. игра\\Игра без четкой цели" + +msgid "Friendly fire\\Your shooting can damage your own objects " +msgstr "Огонь по своим\\Вы можете повредить собственные объекты" + +msgid "Full screen\\Full screen or window mode" +msgstr "Во весь экран\\Выбор полноэкранного или оконного режима" + +msgid "Function already exists" +msgstr "Функция уже существует" + +msgid "Function name missing" +msgstr "Имя функции отсутствует" + +msgid "Game speed" +msgstr "Скорость игры" + +msgid "Game\\Game settings" +msgstr "Игра\\Настройки игры" + +msgid "Gantry crane" +msgstr "Козловой кран" + +#, c-format +msgid "GetResource event num out of range: %d\n" +msgstr "событие GetResource, число вне диапазона: %d\n" + +msgid "Goto: destination occupied" +msgstr "Перейти: место занято" + +msgid "Goto: inaccessible destination" +msgstr "Перейти: место недоступно" + +msgid "Grab or drop (\\key action;)" +msgstr "Взять или бросить (\\key action;)" + +msgid "Graphics\\Graphics settings" +msgstr "Графика\\Настройки графики" + +msgid "Green" +msgstr "Зеленый" + +msgid "Green flag" +msgstr "Зеленый флаг" + +msgid "Ground inappropriate" +msgstr "Земля не подходит" + +msgid "Ground not flat enough" +msgstr "Земля недостаточно плоская" + +msgid "Hair color:" +msgstr "Волосы:" + +msgid "Head\\Face and hair" +msgstr "Голова\\Лицо и волосы" + +msgid "Help about selected object" +msgstr "Справка о выбранном объекте" + +msgid "Help balloons\\Explain the function of the buttons" +msgstr "Подсказки\\Объяснение функций кнопок" + +msgid "Highest\\Highest graphic quality (lowest frame rate)" +msgstr "Высок.\\Самые высокие настройки графики (лучшее качество)" + +msgid "Home" +msgstr "Домой" + +msgid "Houston Mission Control" +msgstr "Центр управления Хьюстон" + +msgid "Illegal object" +msgstr "Запрещенный объект" + +msgid "Impossible under water" +msgstr "Невозможно под водой" + +msgid "Impossible when carrying an object" +msgstr "Невозможно при движении с объектом" + +msgid "Impossible when flying" +msgstr "Невозможно в полете" + +msgid "Impossible when moving" +msgstr "Невозможно в движении" + +msgid "Impossible when swimming" +msgstr "Невозможно в воде" + +msgid "Inappropriate bot" +msgstr "Неверный бот" + +msgid "Inappropriate cell type" +msgstr "Батарея не подходит" + +msgid "Incorrect index type" +msgstr "Неверный тип индекса" + +msgid "Infected by a virus; temporarily out of order" +msgstr "Заражено вирусом. Временно вышел из строя" + +msgid "Information exchange post" +msgstr "Пост обмена информацией" + +msgid "Instruction \"break\" outside a loop" +msgstr "Инструкция \"break\" вне цикла" + +msgid "Instruction \"case\" missing" +msgstr "Отсутствует инструкция \"case\"" + +msgid "Instruction \"case\" outside a block \"switch\"" +msgstr "Инструкция \"case\" вне блока \"switch\" " + +msgid "Instruction \"else\" without corresponding \"if\" " +msgstr "Инструкция \"else\" без \"if\" " + +msgid "Instructions (\\key help;)" +msgstr "Инструкции (\\key help;)" + +msgid "Instructions after the final closing brace" +msgstr "Инструкция после последней закрывающей фигурной скобки" + +msgid "Instructions for the mission (\\key help;)" +msgstr "Инструкции для миссии (\\key help;)" + +msgid "Instructions from Houston" +msgstr "Инструкции из Хьюстона" + +msgid "Instructions\\Shows the instructions for the current mission" +msgstr "Инструкции\\Показывает инструкции по текущей миссии" + +msgid "Jet temperature" +msgstr "Температура реактивного двигателя" + +msgid "Key A" +msgstr "Ключ А" + +msgid "Key B" +msgstr "Ключ B" + +msgid "Key C" +msgstr "Ключ C" + +msgid "Key D" +msgstr "Ключ D" + +msgid "Key word help\\More detailed help about key words" +msgstr "Помощь по командам\\Более подробная справку по командам" + +msgid "Keyword \"while\" missing" +msgstr "Нет ключевого слова \"while\" " + +msgid "Keyword help(\\key cbot;)" +msgstr "Помощь(\\key cbot;)" + +msgid "LOADING" +msgstr "ЗАГРУЗКА" + +msgid "Legged grabber" +msgstr "Шагающий сборщик" + +msgid "Legged orga shooter" +msgstr "Шагающий орга-стрелка" + +msgid "Legged shooter" +msgstr "Шагающий стрелок" + +msgid "Legged sniffer" +msgstr "Шагающий искатель" + +msgid "Lightning conductor" +msgstr "Громоотвод" + +msgid "List of objects" +msgstr "Список объектов" + +msgid "List of saved missions" +msgstr "Список сохраненных миссий" + +msgid "Load a saved mission" +msgstr "Загрузить" + +msgid "Load\\Load a saved mission" +msgstr "Загрузить\\Загрузить сохраненную миссию" + +msgid "Load\\Loads the selected mission" +msgstr "Загрузить\\Загрузить выбранную миссию" + +msgid "Lowest\\Minimum graphic quality (highest frame rate)" +msgstr "Низкое\\Минимальное качество графики (быстро)" + +msgid "Lunar Roving Vehicle" +msgstr "Луноход" + +msgid "Marks on the ground\\Marks on the ground" +msgstr "Метки на земле\\Метки на земле" + +msgid "Maximize" +msgstr "Развернуть" + +msgid "Menu (\\key quit;)" +msgstr "Меню (\\key выйти;)" + +msgid "Minimize" +msgstr "Свернуть" + +msgid "Mission name" +msgstr "Название миссии" + +msgid "Missions" +msgstr "Миссии" + +msgid "Missions\\Select mission" +msgstr "Миссии\\Выбор миссии" + +msgid "Mouse inversion X\\Inversion of the scrolling direction on the X axis" +msgstr "Инверсия мыши по оси X\\Инверсия прокрутки по оси Х" + +msgid "Mouse inversion Y\\Inversion of the scrolling direction on the Y axis" +msgstr "Инверсия мыши по оси Y\\Инверсия прокрутки по оси Y" + +msgid "Mouse shadow\\Gives the mouse a shadow" +msgstr "Тень мыши\\Мышь отбрасывает тень" + +msgid "Mute\\No sound" +msgstr "Без звука\\Без звука" + +msgid "Name:" +msgstr "Имя:" + +msgid "Negative value rejected by \"throw\"" +msgstr "Отрицательное значение не принято" + +msgid "Nest" +msgstr "Гнездо" + +msgid "New" +msgstr "Новый" + +msgid "New ..." +msgstr "Новый ..." + +msgid "New bot available" +msgstr "Доступен новый бот" + +msgid "New player\\Choose player's name" +msgstr "Новый игрок\\Выберите имя для игрока" + +msgid "Next" +msgstr "Следующий" + +msgid "Next object\\Selects the next object" +msgstr "Следующий объект\\Выбор следующего объекта" + +msgid "No energy in the subsoil" +msgstr "Под землей нет запасов энергии" + +msgid "No flag nearby" +msgstr "Слишком много флагов этого цвета (максимум 5)" + +msgid "No function running" +msgstr "Нет запущенной функции" + +msgid "No function with this name accepts this kind of parameter" +msgstr "Нет функции с этим именем для этого вида параметра" + +msgid "No function with this name accepts this number of parameters" +msgstr "Нет функции с этим именем для этого числа параметра" + +msgid "No information exchange post within range" +msgstr "Поста по обмену информацией нет рядом или он далеко" + +msgid "No more energy" +msgstr "Нет энергии" + +msgid "No ore in the subsoil" +msgstr "" + +msgid "No other robot" +msgstr "Нет робота" + +msgid "No power cell" +msgstr "Нет батареи" + +msgid "No titanium" +msgstr "Нет титана" + +msgid "No titanium around" +msgstr "Вокруг нет титана" + +msgid "No titanium ore to convert" +msgstr "Нет титановых руд для преобразования" + +msgid "No titanium to transform" +msgstr "" + +msgid "No uranium to transform" +msgstr "Нет урана для преобразования" + +msgid "Normal size" +msgstr "Нормальный размер" + +msgid "Normal\\Normal graphic quality" +msgstr "Средн.\\Нормальное качество графики" + +msgid "Normal\\Normal sound volume" +msgstr "Нормально\\Нормальная громкость" + +msgid "Not enough energy" +msgstr "Не хватает энергии" + +msgid "Not enough energy yet" +msgstr "Не хватает энергии" + +msgid "Not yet enough energy" +msgstr "Не хватает энергии" + +msgid "Nothing to analyze" +msgstr "Нечего анализировать" + +msgid "Nothing to drop" +msgstr "Нечего бросить" + +msgid "Nothing to grab" +msgstr "Нечего взять" + +msgid "Nothing to recycle" +msgstr "Нечего утилизировать" + +msgid "Nuclear power cell" +msgstr "Атомная батарея" + +msgid "Nuclear power cell available" +msgstr "Доступна атомная батарея" + +msgid "Nuclear power station" +msgstr "Завод атомных батарей (неперезаряж.)" + +msgid "Num of decorative objects\\Number of purely ornamental objects" +msgstr "Количество декораций\\Количество декоративных объектов" + +msgid "Number missing" +msgstr "Нет числа" + +msgid "Number of insects detected" +msgstr "Количество обнаруженных насекомых" + +msgid "Number of particles\\Explosions, dust, reflections, etc." +msgstr "Количество частиц\\Взрывы, пыль, отражения и т.д." + +msgid "OK" +msgstr "ОК" + +msgid "OK\\Choose the selected player" +msgstr "ОК\\Выбрать игрока" + +msgid "OK\\Close program editor and return to game" +msgstr "ОК\\Закрыть редактор программ и вернуться к игре" + +msgid "Object not found" +msgstr "Объект не найден" + +msgid "Object too close" +msgstr "Объект слишком близок" + +msgid "One step" +msgstr "Один шаг" + +msgid "Open" +msgstr "Открыть" + +msgid "Open (Ctrl+o)" +msgstr "Открыть (Ctrl+o)" + +msgid "Opening brace missing " +msgstr "Открывающая скобка отсутствует " + +msgid "Opening bracket missing" +msgstr "Открывающая скобка отсутствует" + +msgid "Operation impossible with value \"nan\"" +msgstr "Операция невозможна значение \"nan\"" + +msgid "Options" +msgstr "Опции" + +msgid "Options\\Preferences" +msgstr "Опции\\Настройки" + +msgid "Organic matter" +msgstr "Органическое вещество" + +msgid "Origin of last message\\Shows where the last message was sent from" +msgstr "" +"Источник сообщения\\Показывает место, откуда было отправлено последнеее " +"сообщение" + +msgid "Parameters missing " +msgstr "Отсутствуют параметры " + +msgid "Particles in the interface\\Steam clouds and sparks in the interface" +msgstr "Частицы в интерфейсе меню\\Пар из труб и искры в интерфейсе меню" + +msgid "Paste (Ctrl+v)" +msgstr "Вставить (Ctrl+V)" + +msgid "Pause/continue" +msgstr "Пауза/продолжить" + +msgid "Phazer shooter" +msgstr "Фазовый стрелок" + +msgid "Photography" +msgstr "Фотография" + +msgid "Place occupied" +msgstr "Место занято" + +msgid "Planets and stars\\Astronomical objects in the sky" +msgstr "Планеты и звезды\\Астрономические объекты в небе" + +msgid "Plans for defense tower available" +msgstr "Доступны схемы защитной башни" + +msgid "Plans for nuclear power plant available" +msgstr "Доступны схемы АЭС" + +msgid "Plans for phazer shooter available" +msgstr "Доступны схемы фазового стрелка" + +msgid "Plans for shielder available" +msgstr "Доступны схемы передвижного щита" + +msgid "Plans for shooter available" +msgstr "Доступны схемы стрелка" + +msgid "Plans for thumper available" +msgstr "Доступны схемы ударника" + +msgid "Plans for tracked robots available " +msgstr "Доступны схемы гусеничных роботов " + +msgid "Plant a flag" +msgstr "Установить флаг" + +msgid "Play\\Start mission!" +msgstr "Начать\\Перейти к выполнению миссии!" + +msgid "Player" +msgstr "Игрок" + +msgid "Player name" +msgstr "Имя игрока" + +msgid "Player's name" +msgstr "Имя игрока" + +msgid "Power cell" +msgstr "Батарея" + +msgid "Power cell available" +msgstr "Доступна батарея" + +msgid "Power cell factory" +msgstr "Завод перезаряжаемых батарей" + +msgid "Power station" +msgstr "Электростанция" + +msgid "Practice bot" +msgstr "Тренировочный бот" + +msgid "Press \\key help; to read instructions on your SatCom" +msgstr "Нажмите \\key help; чтобы получить инструкции от SatCom" + +msgid "Previous" +msgstr "Предыдущий" + +msgid "Previous object\\Selects the previous object" +msgstr "Предыдущий объект\\Выбор предыдущего объекта" + +msgid "Previous selection (\\key desel;)" +msgstr "Предыдущий выбор (\\key desel;)" + +msgid "Private element" +msgstr "Частный элемент" + +msgid "Private\\Private folder" +msgstr "Личное\\Личная папка" + +msgid "Program editor" +msgstr "Редактор программ" + +msgid "Program finished" +msgstr "Программа выполнена" + +msgid "Program infected by a virus" +msgstr "Программа заражена вирусом" + +msgid "Programming exercises" +msgstr "Упражнения" + +msgid "Programming help" +msgstr "Помощь в программировании" + +msgid "Programming help (\\key prog;)" +msgstr "Помощь в программировании (\\key prog;)" + +msgid "Programming help\\Gives more detailed help with programming" +msgstr "" +"Помощь в программировании\\Дает более детальную помощь в программировании" + +msgid "Programs dispatched by Houston" +msgstr "Программы переданные с Хьюстона" + +msgid "Proto\\Prototypes under development" +msgstr "Прототипы\\Прототипы в стадии разработки" + +msgid "Prototypes" +msgstr "Прототипы" + +msgid "Public required" +msgstr "Требуется общественное" + +msgid "Public\\Common folder" +msgstr "Общее\\Общая папка" + +msgid "Quake at explosions\\The screen shakes at explosions" +msgstr "Землетряс. при взрывах\\Тряска экрана при взрывах" + +msgid "Quit the mission?" +msgstr "Завершить миссию?" + +msgid "Quit\\Quit COLOBOT" +msgstr "Выход\\Выход из COLOBOT" + +msgid "Quit\\Quit the current mission or exercise" +msgstr "Выход\\Выход из текущей миссии" + +msgid "Radar station" +msgstr "Радар" + +msgid "Read error" +msgstr "Ошибка чтения" + +msgid "Recorder" +msgstr "Запись" + +msgid "Recycle (\\key action;)" +msgstr "Утилизация (\\key action;)" + +msgid "Recycler" +msgstr "Утилизатор" + +msgid "Red" +msgstr "Красный" + +msgid "Red flag" +msgstr "Красный флаг" + +msgid "Reflections on the buttons \\Shiny buttons" +msgstr "Отражения кнопок \\Блестящие кнопки" + +msgid "Remains of Apollo mission" +msgstr "Остатки миссии Аполлон" + +msgid "Remove a flag" +msgstr "Удалить флаг" + +msgid "Repair center" +msgstr "Ремонтный пункт" + +msgid "Research center" +msgstr "Научно-исследовательский центр" + +msgid "Research program already performed" +msgstr "Научно-исследовательская программа уже выполняется" + +msgid "Research program completed" +msgstr "Научно-исследовательская программа завершена" + +msgid "Reserved keyword of CBOT language" +msgstr "Резервное ключевое слово языка CBOT" + +msgid "Resolution" +msgstr "Разрешение" + +msgid "Restart\\Restart the mission from the beginning" +msgstr "Заново\\Начать данную миссию с начала" + +msgid "Return to start" +msgstr "Вернуться в начало" + +msgid "Robbie" +msgstr "Робби" + +msgid "Robbie\\Your assistant" +msgstr "Робби\\Ваш помощник" + +msgid "Ruin" +msgstr "Руины" + +msgid "Run research program for defense tower" +msgstr "Начать исследование программы для защитной башни" + +msgid "Run research program for legged bots" +msgstr "Начать исследование программы для шагающих ботов" + +msgid "Run research program for nuclear power" +msgstr "Начать исследование программы для атомной энергетики" + +msgid "Run research program for orga shooter" +msgstr "Начать исследование программы для орга-стерлка" + +msgid "Run research program for phazer shooter" +msgstr "Начать исследование программы для фазового стрелка" + +msgid "Run research program for shielder" +msgstr "Начать исследование программы для передвижного щита" + +msgid "Run research program for shooter" +msgstr "Начать исследование программы для стрелка" + +msgid "Run research program for thumper" +msgstr "Начать исследование программы для ударника" + +msgid "Run research program for tracked bots" +msgstr "Начать исследование программы для гусеничного бота " + +msgid "Run research program for winged bots" +msgstr "Начать исследование программы для летающего бота" + +msgid "SatCom" +msgstr "SatCom" + +msgid "Satellite report" +msgstr "Спутниковый отчет" + +msgid "Save" +msgstr "Сохранить" + +msgid "Save (Ctrl+s)" +msgstr "Сохранить (Ctrl+s)" + +msgid "Save the current mission" +msgstr "Сохранить" + +msgid "Save\\Save the current mission " +msgstr "Сохранить\\Сохранить текущую миссию" + +msgid "Save\\Saves the current mission" +msgstr "Сохранить\\Сохранить текущую миссию" + +msgid "Scrolling\\Scrolling when the mouse touches right or left border" +msgstr "Прокрутка\\Прокрутка, когда указатель мыши касается граней экрана" + +msgid "Select the astronaut\\Selects the astronaut" +msgstr "Выбор астронавта\\Выбор астронавта" + +msgid "Semicolon terminator missing" +msgstr "Отсутствует точка с запятой" + +msgid "Shadows\\Shadows on the ground" +msgstr "Тени\\Тени на земле" + +msgid "Shield level" +msgstr "Уровень брони" + +msgid "Shield radius" +msgstr "Радиус щита" + +msgid "Shielder" +msgstr "Передвижной щит" + +msgid "Shift" +msgstr "Shift" + +msgid "Shoot (\\key action;)" +msgstr "Огонь (\\key action;)" + +msgid "Show if the ground is flat" +msgstr "Показывать плоскую землю" + +msgid "Show the place" +msgstr "Место" + +msgid "Show the range" +msgstr "Дальность" + +msgid "Show the solution" +msgstr "Показать решение" + +msgid "Sign \" : \" missing" +msgstr "Знак \" : \" отсутствует" + +msgid "Size 1" +msgstr "Размер 1" + +msgid "Size 2" +msgstr "Размер 2" + +msgid "Size 3" +msgstr "Размер 3" + +msgid "Size 4" +msgstr "Размер 4" + +msgid "Size 5" +msgstr "Размер 5" + +msgid "Sky\\Clouds and nebulae" +msgstr "Небо\\Облака и туманности" + +msgid "Sniff (\\key action;)" +msgstr "Искать (\\key action;)" + +msgid "Solution" +msgstr "Решение" + +msgid "Sound effects:\\Volume of engines, voice, shooting, etc." +msgstr "Общий звук:\\Гормкость двигателя, голоса, стрельбы и т.д." + +msgid "Sound\\Music and game sound volume" +msgstr "Звук\\Громкость музыки и звуков" + +msgid "Spaceship" +msgstr "Космический корабль" + +msgid "Spaceship ruin" +msgstr "Обломки корабля" + +msgid "Speed 1.0x\\Normal speed" +msgstr "Скорость 1.0х\\Нормальная скорость" + +msgid "Speed 1.5x\\1.5 times faster" +msgstr "Скорость 1.5х\\В полтора раза быстрее" + +msgid "Speed 2.0x\\Double speed" +msgstr "Скорость 2.0х\\В два раза скорость" + +msgid "Speed 3.0x\\Three times faster" +msgstr "Скорость 3.0х\\В три раза быстрее" + +msgid "Spider" +msgstr "Маук" + +msgid "Spider fatally wounded" +msgstr "Паук смертельно ранен" + +msgid "Stack overflow" +msgstr "Переполнение стека" + +msgid "" +"Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)" +msgstr "" +"Стандартное действие\\Стандартное действие бота (брать/взять, стрелять, " +"искать и т.д.)" + +msgid "Standard controls\\Standard key functions" +msgstr "Стандартное управление\\Сделать управление по умолчанию" + +msgid "Standard\\Standard appearance settings" +msgstr "По умолчанию\\Настройки внешнего вида по умолчанию" + +msgid "Start" +msgstr "Начало" + +msgid "Still working ..." +msgstr "Работает ..." + +msgid "String missing" +msgstr "Отсутствует строка" + +msgid "Strip color:" +msgstr "Цвет полос" + +msgid "Subber" +msgstr "Саббер" + +msgid "Suit color:" +msgstr "Костюм:" + +msgid "Suit\\Astronaut suit" +msgstr "Костюм\\Костюм астронавта" + +msgid "Sunbeams\\Sunbeams in the sky" +msgstr "Солнечные лучи\\Солнечные лучи в небе" + +msgid "Survival kit" +msgstr "Аптечка" + +msgid "Switch bots <-> buildings" +msgstr "Переключение между ботами и зданиями" + +msgid "Take off to finish the mission" +msgstr "Взлететь, чтобы закончить миссию" + +msgid "Target" +msgstr "Цель" + +msgid "Target bot" +msgstr "Целевой бот" + +msgid "Textures\\Quality of textures " +msgstr "Текстуры\\Качество текстур " + +msgid "The expression must return a boolean value" +msgstr "Выражение должно возвращать логическое значение" + +msgid "The function returned no value " +msgstr "Функция не возвратила значения" + +msgid "" +"The list is only available if a \\l;radar station\\u object\\radar; is " +"working.\n" +msgstr "" +"Список доступен только если \\l;radar station\\u object\\radar; работают" + +msgid "" +"The mission is not accomplished yet (press \\key help; for more details)" +msgstr "" +"Миссия еще не выполнена (нажмите \\key help; для более подробной информации)" + +msgid "The types of the two operands are incompatible " +msgstr "Типы операндов несовместимы" + +msgid "This class already exists" +msgstr "Этот класс уже существует" + +msgid "This class does not exist" +msgstr "Этот класс не существует" + +msgid "This is not a member of this class" +msgstr "Это не член этого класса" + +msgid "This label does not exist" +msgstr "Эта метка не существует" + +msgid "This object is not a member of a class" +msgstr "Этот объект не член класса" + +msgid "Thump (\\key action;)" +msgstr "Удар (\\key action;)" + +msgid "Thumper" +msgstr "Ударник" + +msgid "Titanium" +msgstr "Титан" + +msgid "Titanium available" +msgstr "Титан доступен" + +msgid "Titanium deposit (site for derrick)" +msgstr "Запасы титана (место для буровой вышки)" + +msgid "Titanium ore" +msgstr "Титановая руда" + +msgid "Titanium too close" +msgstr "Титан слишком близко" + +msgid "Titanium too far away" +msgstr "Титан слишком далеко" + +msgid "Too close to a building" +msgstr "Слишком близко к зданию" + +msgid "Too close to an existing flag" +msgstr "" + +msgid "Too close to space ship" +msgstr "Слишком близко к кораблю" + +msgid "Too many flags of this color (maximum 5)" +msgstr "" + +msgid "Too many parameters" +msgstr "Слишком много параметров" + +msgid "Tracked grabber" +msgstr "Гусеничный сборщик" + +msgid "Tracked orga shooter" +msgstr "Гусеничный орга-стрелок" + +msgid "Tracked shooter" +msgstr "Гусеничный стрелок" + +msgid "Tracked sniffer" +msgstr "Гусеничный искатель" + +msgid "Transforms only titanium" +msgstr "Нет титана для преобразования" + +msgid "Transforms only uranium" +msgstr "Преобразовывается только уран" + +msgid "Transmitted information" +msgstr "Переданная информация" + +msgid "Turn left (\\key left;)" +msgstr "Налево (\\key left;)" + +msgid "Turn left\\turns the bot to the left" +msgstr "Повернуть налево\\Поворот налево" + +msgid "Turn right (\\key right;)" +msgstr "Направо (\\key right;)" + +msgid "Turn right\\turns the bot to the right" +msgstr "Повернуть налево\\Поворот налево" + +msgid "Type declaration missing" +msgstr "Не задан тип" + +msgid "Undo (Ctrl+z)" +msgstr "Отмена (Ctrl+Z)" + +msgid "Unit" +msgstr "Юнит" + +msgid "Unknown Object" +msgstr "Неизвестный объект" + +msgid "Unknown command" +msgstr "Неизвестная команда" + +msgid "Unknown function" +msgstr "Неизвестная функция" + +msgid "Up (\\key gup;)" +msgstr "Вверх (\\key gup;)" + +msgid "Uranium deposit (site for derrick)" +msgstr "Запасы урана (место для буровой вышки)" + +msgid "Uranium ore" +msgstr "Урановая руда" + +msgid "Use a joystick\\Joystick or keyboard" +msgstr "Использовать джойстик\\Джойстик или клавиатура" + +msgid "User levels" +msgstr "Пользовательские уровни" + +msgid "User\\User levels" +msgstr "Польз.\\Пользовательские уровни" + +msgid "Variable name missing" +msgstr "Нет имени переменной" + +msgid "Variable not declared" +msgstr "Переменная не объявлена" + +msgid "Variable not initialized" +msgstr "Переменная не инициализирована" + +msgid "Vault" +msgstr "Хранилище" + +msgid "Violet flag" +msgstr "Фиолетовый флаг" + +msgid "Void parameter" +msgstr "Пустой параметр" + +msgid "Wasp" +msgstr "Оса" + +msgid "Wasp fatally wounded" +msgstr "Оса смертельно ранена" + +msgid "Waste" +msgstr "Мусор" + +msgid "Wheeled grabber" +msgstr "Колесный сборщик" + +msgid "Wheeled orga shooter" +msgstr "Колесный орга-стрелок" + +msgid "Wheeled shooter" +msgstr "Колесный стрелок" + +msgid "Wheeled sniffer" +msgstr "Колесный искатель" + +msgid "Win" +msgstr "Win" + +msgid "Winged grabber" +msgstr "Летающий сборщик" + +msgid "Winged orga shooter" +msgstr "Летающий орга-стрелок" + +msgid "Winged shooter" +msgstr "Летающий стрелок" + +msgid "Winged sniffer" +msgstr "Летающий искатель" + +msgid "Withdraw shield (\\key action;)" +msgstr "Снять щит (\\key action;)" + +msgid "Worm" +msgstr "Червь" + +msgid "Worm fatally wounded" +msgstr "Червь смертельно ранен" + +msgid "Wreckage" +msgstr "Обломки" + +msgid "Write error" +msgstr "Ошибка записи" + +msgid "Wrong type for the assignment" +msgstr "Неверный тип для назначения" + +msgid "Yellow flag" +msgstr "Желтый флаг" + +msgid "You can fly with the keys (\\key gup;) and (\\key gdown;)" +msgstr "Вы можете лететь с помощью клавиш (\\key gup;) и (\\key gdown;)" + +msgid "You can not carry a radioactive object" +msgstr "Вы не можете нести радиоактивные объекты" + +msgid "You can not carry an object under water" +msgstr "Вы не можете нести объекты под водой" + +msgid "You found a usable object" +msgstr "Вы нашли рабочий объект" + +msgid "You must get on the spaceship to take off " +msgstr "Вы должны быть на борту корабля, чтобы взлететь" + +msgid "Zoom mini-map" +msgstr "Масштаб мини-карты" + +msgid "\\Blue flags" +msgstr "\\Синий флаг" + +msgid "\\Eyeglasses 1" +msgstr "\\Очки 1" + +msgid "\\Eyeglasses 2" +msgstr "\\Очки 2" + +msgid "\\Eyeglasses 3" +msgstr "\\Очки 3" + +msgid "\\Eyeglasses 4" +msgstr "\\Очки 4" + +msgid "\\Eyeglasses 5" +msgstr "\\Очки 5" + +msgid "\\Face 1" +msgstr "Лицо 1" + +msgid "\\Face 2" +msgstr "\\Лицо 4" + +msgid "\\Face 3" +msgstr "\\Лицо 3" + +msgid "\\Face 4" +msgstr "\\Лицо 4" + +msgid "\\Green flags" +msgstr "\\Зеленый флаг" + +msgid "\\New player name" +msgstr "\\Новое имя" + +msgid "\\No eyeglasses" +msgstr "\\Без очков" + +msgid "\\Raise the pencil" +msgstr "\\Поднять перо" + +msgid "\\Red flags" +msgstr "\\Красный флаг" + +msgid "\\Return to COLOBOT" +msgstr "\\Вернуться в COLOBOT" + +msgid "\\SatCom on standby" +msgstr "\\SatCom ждет" + +msgid "\\Start recording" +msgstr "\\Начать запись" + +msgid "\\Stop recording" +msgstr "\\Остановить запись" + +msgid "\\Turn left" +msgstr "\\Повернуть налево" + +msgid "\\Turn right" +msgstr "\\Повернуть направо" + +msgid "\\Use the black pencil" +msgstr "\\Использовать черное перо" + +msgid "\\Use the blue pencil" +msgstr "\\Использовать синее перо" + +msgid "\\Use the brown pencil" +msgstr "Использовать коричневое перо" + +msgid "\\Use the green pencil" +msgstr "\\Использовать зеленое перо" + +msgid "\\Use the orange pencil" +msgstr "\\Использовать оранжевое перо" + +msgid "\\Use the purple pencil" +msgstr "" + +msgid "\\Use the red pencil" +msgstr "\\Использовать красное перо" + +msgid "\\Use the yellow pencil" +msgstr "\\Использовать желтое перо" + +msgid "\\Violet flags" +msgstr "\\Фиолетовый флаг" + +msgid "\\Yellow flags" +msgstr "\\Желтый флаг" + +msgid "\\b;Aliens\n" +msgstr "\\b;Чужаки\n" + +msgid "\\b;Buildings\n" +msgstr "\\b;Здания\n" + +msgid "\\b;Error\n" +msgstr "\\b;Ошибка\n" + +msgid "\\b;List of objects\n" +msgstr "\\b;Список объектов\n" + +msgid "\\b;Moveable objects\n" +msgstr "\\b;Подвижные объекты\n" + +msgid "\\b;Robots\n" +msgstr "\\b;Роботы\n" + +msgid "\\c; (none)\\n;\n" +msgstr "\\c; (нет)\\n;\n" + +msgid "action;" +msgstr "действие" + +msgid "away;" +msgstr "дальше" + +msgid "camera;" +msgstr "камера" + +msgid "cbot;" +msgstr "cobt" + +msgid "desel;" +msgstr "отмена" + +msgid "down;" +msgstr "вниз" + +msgid "gdown;" +msgstr "вниз" + +msgid "gup;" +msgstr "вверх" + +msgid "help;" +msgstr "помощь" + +msgid "human;" +msgstr "человек" + +msgid "left;" +msgstr "влево" + +msgid "near;" +msgstr "ближе" + +msgid "next;" +msgstr "следующий" + +msgid "prog;" +msgstr "прог." + +msgid "quit;" +msgstr "выйти" + +msgid "right;" +msgstr "вправо" + +msgid "speed10;" +msgstr "скорость10" + +msgid "speed15;" +msgstr "скорость15" + +msgid "speed20;" +msgstr "скорость20" + +msgid "up;" +msgstr "вверх" + +msgid "visit;" +msgstr "посетить" + +msgid "www.epsitec.com" +msgstr "www.epsitec.com" From 99b3ff78f86bbe3e11d7737bc54eb876470b1b1c Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Tue, 12 Nov 2013 19:46:37 +0100 Subject: [PATCH 09/40] Fixed missing "\n" in ru.po --- po/ru.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/ru.po b/po/ru.po index f2d629ad..012395a2 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1420,7 +1420,7 @@ msgid "" "The list is only available if a \\l;radar station\\u object\\radar; is " "working.\n" msgstr "" -"Список доступен только если \\l;radar station\\u object\\radar; работают" +"Список доступен только если \\l;radar station\\u object\\radar; работают\n" msgid "" "The mission is not accomplished yet (press \\key help; for more details)" From 11dd911faf9763382431162985b8363a39ffe481 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 30 Oct 2013 17:08:12 +0100 Subject: [PATCH 10/40] Under MacOSX, generate an Info.plist --- desktop/CMakeLists.txt | 7 +++++++ desktop/Info.plist.cmake | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 desktop/Info.plist.cmake diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt index be886e50..3bf1011b 100644 --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -94,6 +94,13 @@ if(PLATFORM_LINUX) endif() endif(PLATFORM_LINUX) +if(PLATFORM_MACOSX) + configure_file(Info.plist.cmake ${CMAKE_CURRENT_BINARY_DIR}/Info.plist) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Info.plist + DESTINATION ${CMAKE_INSTALL_PREFIX}/Contents/ + ) +endif(PLATFORM_MACOSX) + if(PLATFORM_WINDOWS) set(COLOBOT_VERSION_4COMMAS "${COLOBOT_VERSION_MAJOR},${COLOBOT_VERSION_MINOR},${COLOBOT_VERSION_REVISION},0") configure_file(colobot.rc.cmake ${CMAKE_CURRENT_BINARY_DIR}/colobot.rc) diff --git a/desktop/Info.plist.cmake b/desktop/Info.plist.cmake new file mode 100644 index 00000000..21149090 --- /dev/null +++ b/desktop/Info.plist.cmake @@ -0,0 +1,27 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleDevelopmentRegion + English + + CFBundleDisplayName + Colobot + CFBundleExecutable + colobot + CFBundleIconFile + Colobot + CFBundleIdentifier + info.colobot.colobot + CFBundleName + Colobot + CFBundlePackageType + APPL + CFBundleSignature + cbot + CFBundleVersion + @COLOBOT_VERSION_FULL@ + + From 68d9a72357016206db6578e0137b3e8227865fbd Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 30 Oct 2013 17:18:53 +0100 Subject: [PATCH 11/40] Generate an icns icon on Mac OSX --- desktop/CMakeLists.txt | 57 +++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt index 3bf1011b..6dc3d1cb 100644 --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -1,5 +1,45 @@ cmake_minimum_required(VERSION 2.8) +set(COLOBOT_ICON_FILE colobot.svg) + +# Render SVG icon in various sizes +find_program(RSVG_CONVERT rsvg-convert) +if(RSVG_CONVERT AND (PLATFORM_LINUX OR PLATFORM_MACOSX)) + add_custom_target(png-icons ALL) + foreach(PNGSIZE 512 256 128 48 32 16) + add_custom_command( + OUTPUT ${PNGSIZE}/colobot.png + COMMAND mkdir -p ${PNGSIZE} + COMMAND ${RSVG_CONVERT} -w ${PNGSIZE} -h ${PNGSIZE} ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE} > ${PNGSIZE}/colobot.png + ) + add_custom_target(png-icon-${PNGSIZE} ALL DEPENDS ${PNGSIZE}/colobot.png) + add_dependencies(png-icons png-icon-${PNGSIZE}) + + if(PLATFORM_LINUX) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${PNGSIZE}x${PNGSIZE}/apps/ + ) + endif() + # Prepare the ICNS icon generation + list(APPEND ICNS_SRCS "${PNGSIZE}/colobot.png") + endforeach() + + # Pack icon for Mac OS + find_program(PNG2ICNS png2icns) + if(PNG2ICNS AND PLATFORM_MACOSX) + add_custom_command(OUTPUT Colobot.icns + COMMAND ${PNG2ICNS} Colobot.icns ${ICNS_SRCS} + DEPENDS png-icons + ) + add_custom_target(icns-icon ALL DEPENDS Colobot.icns) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Colobot.icns + DESTINATION ${CMAKE_INSTALL_PREFIX}/Contents/Resources/ + ) + endif() + +endif() + if(PLATFORM_LINUX) # Install Desktop Entry file set(COLOBOT_DESKTOP_FILE colobot.desktop) @@ -16,28 +56,11 @@ if(PLATFORM_LINUX) ) # Install Icon - set(COLOBOT_ICON_FILE colobot.svg) install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/ ) - # Render SVG icon in various sizes - find_program(RSVG_CONVERT rsvg-convert) - if(RSVG_CONVERT) - foreach(PNGSIZE "48" "32" "16") - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}) - add_custom_target(resize_icon_${PNGSIZE} ALL - COMMAND ${RSVG_CONVERT} -w ${PNGSIZE} -h ${PNGSIZE} ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE} - > ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png - ) - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${PNGSIZE}x${PNGSIZE}/apps/ - ) - endforeach() - endif() - # Translate translatable material find_program(PO4A po4a) if(PO4A) From 8f7f56f1eae2998b9431e07a3ed0ea7765eb19ba Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 30 Oct 2013 17:27:05 +0100 Subject: [PATCH 12/40] On Mac OS X, write colobot.ini and savegames to Application Support directories --- src/CMakeLists.txt | 3 ++ src/app/system.cpp | 4 +++ src/app/system_macosx.cpp | 60 +++++++++++++++++++++++++++++++++++++++ src/app/system_macosx.h | 36 +++++++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 src/app/system_macosx.cpp create mode 100644 src/app/system_macosx.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2fab853d..9a6dba11 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -61,6 +61,9 @@ if(PLATFORM_WINDOWS) set(SYSTEM_CPP_MODULE "system_windows.cpp") elseif(PLATFORM_LINUX) set(SYSTEM_CPP_MODULE "system_linux.cpp") +elseif(PLATFORM_MACOSX) + set(SYSTEM_CPP_MODULE "system_macosx.cpp") + set(SYSTEM_CPP_MODULE ${SYSTEM_CPP_MODULE} "app/system_other.cpp") else() set(SYSTEM_CPP_MODULE "system_other.cpp") endif() diff --git a/src/app/system.cpp b/src/app/system.cpp index 2eb68ba0..ce694690 100644 --- a/src/app/system.cpp +++ b/src/app/system.cpp @@ -25,6 +25,8 @@ #include "app/system_windows.h" #elif defined(PLATFORM_LINUX) #include "app/system_linux.h" +#elif defined(PLATFORM_MACOSX) + #include "app/system_macosx.h" #else #include "app/system_other.h" #endif @@ -48,6 +50,8 @@ CSystemUtils* CSystemUtils::Create() m_instance = new CSystemUtilsWindows(); #elif defined(PLATFORM_LINUX) m_instance = new CSystemUtilsLinux(); +#elif defined(PLATFORM_MACOSX) + m_instance = new CSystemUtilsMacOSX(); #else m_instance = new CSystemUtilsOther(); #endif diff --git a/src/app/system_macosx.cpp b/src/app/system_macosx.cpp new file mode 100644 index 00000000..8e9608cd --- /dev/null +++ b/src/app/system_macosx.cpp @@ -0,0 +1,60 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * Copyright (C) 2013, Polish Portal of Colobot (PPC) +// * +// * This program is free software: you can redistribute it and/or modify +// * it under the terms of the GNU General Public License as published by +// * the Free Software Foundation, either version 3 of the License, or +// * (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have received a copy of the GNU General Public License +// * along with this program. If not, see http://www.gnu.org/licenses/. + +#include "app/system_macosx.h" + +#include "common/logger.h" + +#include + +#include + +#include + +void CSystemUtilsMacOSX::Init() +{ + // These functions are a deprecated way to get the 'Application Support' folder, but they do work, in plain C++ + FSRef ref; + OSType folderType = kApplicationSupportFolderType; + char path[PATH_MAX]; + FSFindFolder( kUserDomain, folderType, kCreateFolder, &ref ); + FSRefMakePath( &ref, reinterpret_cast(&path), PATH_MAX ); + + m_ASPath = path; + m_ASPath.append("/colobot/"); + + // Make sure the directory exists + boost::filesystem::create_directories(m_ASPath.c_str()); +} + +std::string CSystemUtilsMacOSX::GetProfileFileLocation() +{ + std::string profileFile = m_ASPath + "/colobot.ini"; + + GetLogger()->Trace("Profile file is %s\n", profileFile.c_str()); + return profileFile; +} + +std::string CSystemUtilsMacOSX::GetSavegameDirectoryLocation() +{ + std::string savegameDir = m_ASPath + "/savegame"; + boost::filesystem::create_directories(savegameDir.c_str()); + GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str()); + + return savegameDir; +} + diff --git a/src/app/system_macosx.h b/src/app/system_macosx.h new file mode 100644 index 00000000..a5c11502 --- /dev/null +++ b/src/app/system_macosx.h @@ -0,0 +1,36 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * Copyright (C) 2012, Polish Portal of Colobot (PPC) +// * +// * This program is free software: you can redistribute it and/or modify +// * it under the terms of the GNU General Public License as published by +// * the Free Software Foundation, either version 3 of the License, or +// * (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have received a copy of the GNU General Public License +// * along with this program. If not, see http://www.gnu.org/licenses/. + +/** + * \file app/system_macosx.h + * \brief MacOSX-specific implementation of system functions + */ + +#include "app/system.h" +#include "app/system_other.h" + +class CSystemUtilsMacOSX : public CSystemUtilsOther +{ +public: + virtual void Init() override; + + virtual std::string GetProfileFileLocation() override; + virtual std::string GetSavegameDirectoryLocation() override; +private: + std::string m_ASPath; +}; + From 17ad3e5a906c59e8d108b75a6d51cc7528dfa44d Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Thu, 31 Oct 2013 10:08:32 +0100 Subject: [PATCH 13/40] Abstract the definition of DataPath to CSystemUtils --- src/app/app.cpp | 2 +- src/app/system.cpp | 5 +++++ src/app/system.h | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index e2405b81..404c6156 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -147,7 +147,7 @@ CApplication::CApplication() m_mouseButtonsState = 0; m_trackedKeys = 0; - m_dataPath = COLOBOT_DEFAULT_DATADIR; + m_dataPath = GetSystemUtils()->GetDataPath(); m_langPath = COLOBOT_I18N_DIR; m_texPackPath = ""; diff --git a/src/app/system.cpp b/src/app/system.cpp index ce694690..90b7d205 100644 --- a/src/app/system.cpp +++ b/src/app/system.cpp @@ -192,6 +192,11 @@ float CSystemUtils::TimeStampDiff(SystemTimeStamp *before, SystemTimeStamp *afte return result; } +std::string CSystemUtils::GetDataPath() +{ + return std::string(COLOBOT_DEFAULT_DATADIR); +} + std::string CSystemUtils::GetProfileFileLocation() { return std::string("colobot.ini"); diff --git a/src/app/system.h b/src/app/system.h index d22a5194..c357bff8 100644 --- a/src/app/system.h +++ b/src/app/system.h @@ -130,6 +130,9 @@ public: /** The difference is \a after - \a before. */ virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) = 0; + //! Returns the data path (containing textures, levels, helpfiles, etc) + virtual std::string GetDataPath(); + //! Returns the profile (colobot.ini) file location virtual std::string GetProfileFileLocation(); From e78d2cce18b50ed86933d05ac5bccdf4ef13d6e3 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Thu, 31 Oct 2013 10:35:43 +0100 Subject: [PATCH 14/40] On MacOSX, define the DataPath as being the Resources path in the bundle --- src/app/system_macosx.cpp | 53 +++++++++++++++++++++++++++++++++++++++ src/app/system_macosx.h | 1 + 2 files changed, 54 insertions(+) diff --git a/src/app/system_macosx.cpp b/src/app/system_macosx.cpp index 8e9608cd..d452fe60 100644 --- a/src/app/system_macosx.cpp +++ b/src/app/system_macosx.cpp @@ -21,10 +21,47 @@ #include +// MacOS-specific headers +#include #include #include +inline std::string CFStringRefToStdString(CFStringRef str) { + + std::string stdstr; + + char *fullPath; + CFStringEncoding encodingMethod = CFStringGetSystemEncoding(); + + // 1st try for English system + fullPath = const_cast(CFStringGetCStringPtr(str, encodingMethod)); + if( fullPath == NULL ) + { + // 2nd try for Japanese system + encodingMethod = kCFStringEncodingUTF8; + fullPath = const_cast(CFStringGetCStringPtr(str, encodingMethod)); + } + + // for safer operation. + if( fullPath == NULL ) + { + CFIndex length = CFStringGetLength(str); + fullPath = static_cast(malloc( length + 1 )); + + // TODO: Check boolean result of that conversion + CFStringGetCString(str, fullPath, length, kCFStringEncodingUTF8 ); + + stdstr = fullPath; + + free( fullPath ); + } + else + stdstr = fullPath; + + return stdstr; +} + void CSystemUtilsMacOSX::Init() { // These functions are a deprecated way to get the 'Application Support' folder, but they do work, in plain C++ @@ -41,6 +78,22 @@ void CSystemUtilsMacOSX::Init() boost::filesystem::create_directories(m_ASPath.c_str()); } +std::string CSystemUtilsMacOSX::GetDataPath() +{ + std::string dataPath; + // Get the Resources bundle URL + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFURLRef resourcesURL = CFBundleCopyBundleURL(mainBundle); + CFStringRef str = CFURLCopyFileSystemPath( resourcesURL, kCFURLPOSIXPathStyle ); + CFRelease(resourcesURL); + + dataPath = CFStringRefToStdString(str); + dataPath += "/Contents/Resources"; + GetLogger()->Trace("dataPath is %s\n", dataPath.c_str()); + + return dataPath; +} + std::string CSystemUtilsMacOSX::GetProfileFileLocation() { std::string profileFile = m_ASPath + "/colobot.ini"; diff --git a/src/app/system_macosx.h b/src/app/system_macosx.h index a5c11502..c2b9a412 100644 --- a/src/app/system_macosx.h +++ b/src/app/system_macosx.h @@ -28,6 +28,7 @@ class CSystemUtilsMacOSX : public CSystemUtilsOther public: virtual void Init() override; + virtual std::string GetDataPath() override; virtual std::string GetProfileFileLocation() override; virtual std::string GetSavegameDirectoryLocation() override; private: From 93727a3fdf543d5699f676772e32311fe8383254 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Thu, 31 Oct 2013 11:10:45 +0100 Subject: [PATCH 15/40] On MacOSX, don't cache the Data, Sound and Music paths As users can potentially move the bundle around, it doesn't make sense to cache these (It would probably make sense to drop this caching on all architectures, but it's only on MacOSX where it hurts most) --- src/app/app.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/app.cpp b/src/app/app.cpp index 404c6156..56931489 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -423,7 +423,10 @@ bool CApplication::Create() return false; } +#if !defined(PLATFORM_MACOSX) + // On Mac OSX, the bundle can potentially change place, it doesn't make sense to cache it to the configuration file GetProfile().SetLocalProfileString("Resources", "Data", m_dataPath); +#endif SetLanguage(m_language); @@ -437,12 +440,16 @@ bool CApplication::Create() m_sound->Create(true); +#if !defined(PLATFORM_MACOSX) + // On Mac OSX, the bundle can potentially change place, it doesn't make sense to cache it to the configuration file + // Cache sound files if (defaultValues) { GetProfile().SetLocalProfileString("Resources", "Sound", GetDataSubdirPath(DIR_SOUND)); GetProfile().SetLocalProfileString("Resources", "Music", GetDataSubdirPath(DIR_MUSIC)); } +#endif if (!m_customDataPath && GetProfile().GetLocalProfileString("Resources", "Sound", path)) { From b32f87bac7cde826db2502422b0696c0d08f0822 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Thu, 31 Oct 2013 11:29:52 +0100 Subject: [PATCH 16/40] Abstract the definition of LangPath to CSystemUtils --- src/app/app.cpp | 2 +- src/app/system.cpp | 7 ++++++- src/app/system.h | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index 56931489..ce973351 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -148,7 +148,7 @@ CApplication::CApplication() m_trackedKeys = 0; m_dataPath = GetSystemUtils()->GetDataPath(); - m_langPath = COLOBOT_I18N_DIR; + m_langPath = GetSystemUtils()->GetLangPath(); m_texPackPath = ""; m_runSceneName = ""; diff --git a/src/app/system.cpp b/src/app/system.cpp index 90b7d205..eaa9e4c9 100644 --- a/src/app/system.cpp +++ b/src/app/system.cpp @@ -194,7 +194,12 @@ float CSystemUtils::TimeStampDiff(SystemTimeStamp *before, SystemTimeStamp *afte std::string CSystemUtils::GetDataPath() { - return std::string(COLOBOT_DEFAULT_DATADIR); + return COLOBOT_DEFAULT_DATADIR; +} + +std::string CSystemUtils::GetLangPath() +{ + return COLOBOT_I18N_DIR; } std::string CSystemUtils::GetProfileFileLocation() diff --git a/src/app/system.h b/src/app/system.h index c357bff8..c2125fe5 100644 --- a/src/app/system.h +++ b/src/app/system.h @@ -133,6 +133,9 @@ public: //! Returns the data path (containing textures, levels, helpfiles, etc) virtual std::string GetDataPath(); + //! Returns the translations path + virtual std::string GetLangPath(); + //! Returns the profile (colobot.ini) file location virtual std::string GetProfileFileLocation(); From aeefdbd1bed4d0670b1e860e900eebb9d70b3543 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Fri, 8 Nov 2013 10:41:50 +0100 Subject: [PATCH 17/40] On MacOSX, define the LangPath as being i18n in the Resources path of the bundle --- src/app/system_macosx.cpp | 19 +++++++++++-------- src/app/system_macosx.h | 2 ++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/app/system_macosx.cpp b/src/app/system_macosx.cpp index d452fe60..68f5c79f 100644 --- a/src/app/system_macosx.cpp +++ b/src/app/system_macosx.cpp @@ -76,22 +76,25 @@ void CSystemUtilsMacOSX::Init() // Make sure the directory exists boost::filesystem::create_directories(m_ASPath.c_str()); -} -std::string CSystemUtilsMacOSX::GetDataPath() -{ - std::string dataPath; // Get the Resources bundle URL CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyBundleURL(mainBundle); CFStringRef str = CFURLCopyFileSystemPath( resourcesURL, kCFURLPOSIXPathStyle ); CFRelease(resourcesURL); - dataPath = CFStringRefToStdString(str); - dataPath += "/Contents/Resources"; - GetLogger()->Trace("dataPath is %s\n", dataPath.c_str()); + m_dataPath = CFStringRefToStdString(str); + m_dataPath += "/Contents/Resources"; +} - return dataPath; +std::string CSystemUtilsMacOSX::GetDataPath() +{ + return m_dataPath; +} + +std::string CSystemUtilsMacOSX::GetLangPath() +{ + return m_dataPath + "/i18n"; } std::string CSystemUtilsMacOSX::GetProfileFileLocation() diff --git a/src/app/system_macosx.h b/src/app/system_macosx.h index c2b9a412..b6a044bc 100644 --- a/src/app/system_macosx.h +++ b/src/app/system_macosx.h @@ -29,9 +29,11 @@ public: virtual void Init() override; virtual std::string GetDataPath() override; + virtual std::string GetLangPath() override; virtual std::string GetProfileFileLocation() override; virtual std::string GetSavegameDirectoryLocation() override; private: std::string m_ASPath; + std::string m_dataPath; }; From ffdba25411e544efd04b51c54f8b23cdd518b554 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Thu, 31 Oct 2013 11:56:32 +0100 Subject: [PATCH 18/40] Add MacOSX bundle-specific installation paths --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 43b4a8fe..9af0aefc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -309,6 +309,12 @@ if(PLATFORM_WINDOWS) set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/lang CACHE PATH "Colobot translations directory") set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc CACHE PATH "Colobot documentation directory") endif() +elseif(PLATFORM_MACOSX) + set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/Contents/MacOS CACHE PATH "Colobot binary directory") + set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/Contents/libs CACHE PATH "Colobot libraries directory") + set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/Contents/Resources CACHE PATH "Colobot shared data directory") + set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/Contents/Resources/i18n CACHE PATH "Colobot translations directory") + set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/Contents/Resources/doc CACHE PATH "Colobot documentation directory") else() set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/games CACHE PATH "Colobot binary directory") set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/colobot CACHE PATH "Colobot libraries directory") From bea84f0af4edd58e665ae510b843189c0b8c50df Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Fri, 8 Nov 2013 10:04:26 +0100 Subject: [PATCH 19/40] Don't set rpath if libCBot is compiled statically --- src/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a6dba11..958f86cc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -240,5 +240,6 @@ add_executable(colobot ${SOURCES}) target_link_libraries(colobot ${LIBS}) install(TARGETS colobot RUNTIME DESTINATION ${COLOBOT_INSTALL_BIN_DIR}) -set_target_properties(colobot PROPERTIES INSTALL_RPATH ${COLOBOT_INSTALL_LIB_DIR}) - +if(NOT CBOT_STATIC) + set_target_properties(colobot PROPERTIES INSTALL_RPATH ${COLOBOT_INSTALL_LIB_DIR}) +endif() From 6b3e6694e35eb2fe94d9b7500ea00bcacbbee6e1 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Fri, 8 Nov 2013 10:06:06 +0100 Subject: [PATCH 20/40] On MacOSX, install files to Bundle-specific directories --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9af0aefc..1ca364ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,11 +310,11 @@ if(PLATFORM_WINDOWS) set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc CACHE PATH "Colobot documentation directory") endif() elseif(PLATFORM_MACOSX) - set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/Contents/MacOS CACHE PATH "Colobot binary directory") - set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/Contents/libs CACHE PATH "Colobot libraries directory") - set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/Contents/Resources CACHE PATH "Colobot shared data directory") - set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/Contents/Resources/i18n CACHE PATH "Colobot translations directory") - set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/Contents/Resources/doc CACHE PATH "Colobot documentation directory") + set(COLOBOT_INSTALL_BIN_DIR ../MacOS CACHE STRING "Colobot binary directory") + set(COLOBOT_INSTALL_LIB_DIR ../MacOS CACHE STRING "Colobot libraries directory") + set(COLOBOT_INSTALL_DATA_DIR . CACHE STRING "Colobot shared data directory") + set(COLOBOT_INSTALL_I18N_DIR i18n CACHE SRING "Colobot translations directory") + set(COLOBOT_INSTALL_DOC_DIR doc CACHE STRING "Colobot documentation directory") else() set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/games CACHE PATH "Colobot binary directory") set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/colobot CACHE PATH "Colobot libraries directory") From fda831d991708af79a8719d404662f97e497e095 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Fri, 8 Nov 2013 16:52:42 +0100 Subject: [PATCH 21/40] Add MacOSX Bundle and Windows NSIS installer - Add two images from screenshots or existing data textures to brand the NSIS installer --- desktop/CMakeLists.txt | 62 ++++++++++++++++++++++++++++++---- desktop/colobot_nsis.bmp | Bin 0 -> 9744 bytes desktop/colobot_nsis_left.bmp | Bin 0 -> 103048 bytes 3 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 desktop/colobot_nsis.bmp create mode 100644 desktop/colobot_nsis_left.bmp diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt index 6dc3d1cb..9fa0c5e5 100644 --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -33,9 +33,6 @@ if(RSVG_CONVERT AND (PLATFORM_LINUX OR PLATFORM_MACOSX)) DEPENDS png-icons ) add_custom_target(icns-icon ALL DEPENDS Colobot.icns) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Colobot.icns - DESTINATION ${CMAKE_INSTALL_PREFIX}/Contents/Resources/ - ) endif() endif() @@ -119,12 +116,65 @@ endif(PLATFORM_LINUX) if(PLATFORM_MACOSX) configure_file(Info.plist.cmake ${CMAKE_CURRENT_BINARY_DIR}/Info.plist) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Info.plist - DESTINATION ${CMAKE_INSTALL_PREFIX}/Contents/ - ) endif(PLATFORM_MACOSX) if(PLATFORM_WINDOWS) set(COLOBOT_VERSION_4COMMAS "${COLOBOT_VERSION_MAJOR},${COLOBOT_VERSION_MINOR},${COLOBOT_VERSION_REVISION},0") configure_file(colobot.rc.cmake ${CMAKE_CURRENT_BINARY_DIR}/colobot.rc) endif(PLATFORM_WINDOWS) + + +## +# Packaging +## +set(CPACK_BUNDLE_NAME "Colobot") +set(CPACK_PACKAGE_FILE_NAME "colobot-${COLOBOT_VERSION_FULL}") +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../README.md") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Colobot - Colonize with Bots") +set(CPACK_PACKAGE_VENDOR "Polish Portal of Colobot") + +set(CPACK_PACKAGE_VERSION_MAJOR ${COLOBOT_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${COLOBOT_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${COLOBOT_VERSION_REVISION}) + +if(PLATFORM_WINDOWS) + set(CPACK_STRIP_FILES TRUE) + + # Don't version the install directory, and allow overwriting + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Colobot") + set(CPACK_NSIS_DEFINES "SetOverwrite on\nBrandingText \\\"Colobot ${COLOBOT_VERSION_CODENAME} (${COLOBOT_VERSION_FULL})\\\"") + # Install the executable directly in Program Files/Colobot/ + set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") + set(CPACK_PACKAGE_EXECUTABLES "colobot" "Colobot ${COLOBOT_VERSION_CODENAME}") + + # Branding + ## Installation and uninstallation icons + set(CPACK_NSIS_MUI_ICON ${CMAKE_CURRENT_SOURCE_DIR}/colobot.ico) + set(CPACK_NSIS_MUI_UNIICON ${CMAKE_CURRENT_SOURCE_DIR}/colobot.ico) + ## Header and Left banner images + set(CPACK_PACKAGE_ICON "") + set(CPACK_NSIS_INSTALLER_ICON_CODE "!define MUI_HEADERIMAGE_BITMAP \\\"${CMAKE_CURRENT_SOURCE_DIR}/colobot_nsis.bmp\\\" + !define MUI_WELCOMEFINISHPAGE_BITMAP \\\"${CMAKE_CURRENT_SOURCE_DIR}/colobot_nsis_left.bmp\\\"") + + ## Allow to directly run Colobot at the end of the installation + set(CPACK_NSIS_MUI_FINISHPAGE_RUN "colobot.exe") + + ## TODO: Find a way to have no license prompt. Until that, display the GPL-3 + set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE.txt) + +elseif(PLATFORM_MACOSX) + set(CPACK_GENERATOR "Bundle") + set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_BINARY_DIR}/Colobot.icns) + set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_BINARY_DIR}/Colobot.icns) + set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist) + + set(CPACK_BINARY_DRAGNDROP ON) + + install(CODE " + include(BundleUtilities) + message(STATUS \"fixup_bundle(\${CMAKE_INSTALL_PREFIX}/${COLOBOT_INSTALL_BIN_DIR}/colobot/\") + fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${COLOBOT_INSTALL_BIN_DIR}/colobot\" \"\" \"\") + ") +endif() + +include(CPack) diff --git a/desktop/colobot_nsis.bmp b/desktop/colobot_nsis.bmp new file mode 100644 index 0000000000000000000000000000000000000000..529a0cf7b12becd699a6997a0229b51745417a1c GIT binary patch literal 9744 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 B=EVR2 literal 0 HcmV?d00001 From 642034eda9cd0071a32974ce8cd9b333a95a8d74 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Tue, 12 Nov 2013 11:32:41 +0100 Subject: [PATCH 22/40] Update the MXE install README to document the creation of the installer --- INSTALL-MXE.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/INSTALL-MXE.md b/INSTALL-MXE.md index f12ed888..47b6bcc8 100644 --- a/INSTALL-MXE.md +++ b/INSTALL-MXE.md @@ -58,12 +58,18 @@ To cross-compile Colobot using MXE: 4. Now `cd` to directory with colobot sources. To cross-compile a CMake project, you have to specify a CMake toolchain file. MXE has such file in MXE's directory: `usr/i686-pc-mingw32/share/cmake/mxe-conf.cmake` - Toolchain file is specified thus:`cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/mxe-conf.cmake .` + Toolchain file is specified that way: `cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/mxe-conf.cmake .` CMake files in Colobot should detect that MXE is being used and they will modify flags, paths, etc. as required. You should not run into any problems. *Note:* you may also want to use a separate out-of-source build directory for MXE. -5. `make` should now compile the game with the resulting exe in `bin/colobot.exe`. +5. `make` should now compile the game with the resulting executable as `colobot.exe`. The exe is linked against all libraries *statically*, so there are no dependencies on external DLLs. However, the resulting binary will be huge with all these libraries, so you might want to do: `strip bin/colobot.exe`. + +6. If you want to create a Colobot installer, you need to additionally build 'nsis' + in MXE. Then you can create the NSIS installer that way: + `PATH=/path/to/mxe/binaries/:$PATH make package` This will create a versionned + colobot-$version.exe installer that will install Colobot in system directories, + add a shortcut in the start menu and setup an uninstaller. From ba8dcc887f3ece99c7ee48cc0b5400ddd180b415 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 13 Nov 2013 14:04:11 +0100 Subject: [PATCH 23/40] Add an INSTALL file for MacOSX --- INSTALL-MacOSX.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 INSTALL-MacOSX.md diff --git a/INSTALL-MacOSX.md b/INSTALL-MacOSX.md new file mode 100644 index 00000000..862fda47 --- /dev/null +++ b/INSTALL-MacOSX.md @@ -0,0 +1,60 @@ +# Compile and install instructions on MacOSX + +To compile Colobot on MacOS X, you need to first get all tools, all +building dependencies (including the recompilation of some of them), and +finally compile colobot. + +* Install git from [git-osx-installer on Google Code](https://code.google.com/p/git-osx-installer/) +* Install Xcode through the Mac AppStore +* Accept the Xcode license + + xcodebuild -license + +* Download and install Apple's Command Line Developer Tools from within Xcode (Preferences, Download, Components) +* Download and install [Mac Ports](http://www.macports.org/install.php#requirements) +* Install GCC 4.8 through MacPorts + + sudo port install gcc48 + +* Install all colobot build depends + + sudo port install cmake libsdl libsdl_image libsdl_ttf boost libsndfile glew libicns librsvg + + > [po4a](http://po4a.alioth.debian.org/) should also be installed for the translation of levels, but the [MacPorts' Portfiles have not been accepted yet](http://trac.macports.org/ticket/41227). + +* Rebuild libtiff locally + + This is needed because of the following error: + + > libtiff.5.dylib (for architecture x86_64) because larger updated load + > commands do not fit (the program must be relinked, and you may need to + > use -headerpad or -headerpad_max_install_names) + + MacPorts changed the default linker flag, a simple local rebuild suffices: + + sudo port -ns upgrade --force tiff + +* Rebuild boost with the same gcc that we want to use + + This is needed because boost is compiled against Mac's system libstdc++ + which is older than the one used by gcc-4.8 + + sudo port -ns upgrade --force boost configure.compiler=macports-gcc-4.8 + +* Build colobot with gcc-4.8 + + mkdir -p build + cd build + CC=/opt/local/bin/gcc-mp-4.8 CXX=/opt/local/bin/g++-mp-4.8 cmake .. + make + +* Build a Colobot drag-n-drop package + + make package + +* Open the package + + open colobot-*.dmg + +* Once opened, drag the Colobot application and drop it in the + Application directory. Then just launch it as any other application. From d7af8204cec4ea91ed50d42b2db491b68416a750 Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 13 Nov 2013 17:41:33 +0100 Subject: [PATCH 24/40] On MacOSX, assume we do have CFLocaleCopyCurrent to detect the actual locale by hard-coding the fact in config.h.cmake This circumvents the fact that we are using localename.c directly instead of relying on the autotools-generated config.h --- src/common/config.h.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/common/config.h.cmake b/src/common/config.h.cmake index 2f403fa5..63cd93b9 100644 --- a/src/common/config.h.cmake +++ b/src/common/config.h.cmake @@ -6,6 +6,11 @@ #cmakedefine PLATFORM_MACOSX @PLATFORM_MACOSX@ #cmakedefine PLATFORM_OTHER @PLATFORM_OTHER@ +#ifdef PLATFORM_MACOSX +// Assume we have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework +#define HAVE_CFLOCALECOPYCURRENT 1 +#endif + #cmakedefine GLEW_STATIC #cmakedefine OPENAL_SOUND From 418f57f8bee550b75ccfd67f80c79a355c6f060d Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Wed, 13 Nov 2013 18:50:43 +0100 Subject: [PATCH 25/40] Buffer overflow fix --- src/ui/control.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/control.cpp b/src/ui/control.cpp index 7c77c95e..bed84ddc 100644 --- a/src/ui/control.cpp +++ b/src/ui/control.cpp @@ -57,7 +57,7 @@ CControl::~CControl() bool CControl::Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) { - char text[100]; + char text[200]; std::string str_text; if ( eventType == EVENT_NULL ) From 4e2ac61ee6c4d95c4846bce2ca29022083876347 Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Thu, 14 Nov 2013 14:49:25 +0100 Subject: [PATCH 26/40] Enable OpenAL in CI build --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 038e4c23..1abfb514 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,11 +2,11 @@ language: cpp compiler: - gcc - clang -script: mkdir build; cd build; cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DOPENAL_SOUND=0 -DTESTS=1 && make all doc test && DESTDIR=. make install +script: mkdir build; cd build; cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DOPENAL_SOUND=1 -DTESTS=1 && make all doc test && DESTDIR=. make install before_install: - git submodule update --init --recursive - sudo add-apt-repository ppa:mapnik/boost -y - sudo apt-get update -qq - - sudo apt-get install -qq --no-install-recommends libgl1-mesa-dev libsdl1.2-dev libsdl-image1.2-dev libsdl-ttf2.0-dev libpng12-dev libglew-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-regex-dev google-mock libgtest-dev doxygen graphviz po4a librsvg2-bin libsndfile-dev + - sudo apt-get install -qq --no-install-recommends libgl1-mesa-dev libsdl1.2-dev libsdl-image1.2-dev libsdl-ttf2.0-dev libpng12-dev libglew-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-regex-dev google-mock libgtest-dev doxygen graphviz po4a librsvg2-bin libsndfile-dev libopenal-dev notifications: email: false From be3d92ba03d832427f0720106dd72a9852639cb6 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Thu, 14 Nov 2013 20:54:18 +0100 Subject: [PATCH 27/40] Updated data submodule --- data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data b/data index 0e2fa1ec..5d2cf836 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 0e2fa1ec3b279b9a43b78b618fd059eb2244f53a +Subproject commit 5d2cf83612a6072c4c952a3b9ad16d0aae05ab12 From 81b940cc25e6892ac752005521b3adba4534177b Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Fri, 15 Nov 2013 10:22:11 +0100 Subject: [PATCH 28/40] Fix for crash when loading PNG in indexed mode For example, some icons in SatCom --- src/common/image.cpp | 30 +++++++++++++++++++++++++----- src/common/image.h | 6 ++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/common/image.cpp b/src/common/image.cpp index a9587efa..8a876e3c 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -218,15 +218,30 @@ void CImage::PadToNearestPowerOfTwo() int w = Math::NextPowerOfTwo(m_data->surface->w); int h = Math::NextPowerOfTwo(m_data->surface->h); + BlitToNewRGBASurface(w, h); +} + +void CImage::ConvertToRGBA() +{ + assert(m_data != nullptr); + + int w = m_data->surface->w; + int h = m_data->surface->h; + + BlitToNewRGBASurface(w, h); +} + +void CImage::BlitToNewRGBASurface(int width, int height) +{ m_data->surface->flags &= (~SDL_SRCALPHA); - SDL_Surface* resizedSurface = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, - 0x000000ff, 0xff000000); - assert(resizedSurface != NULL); - SDL_BlitSurface(m_data->surface, NULL, resizedSurface, NULL); + SDL_Surface* convertedSurface = SDL_CreateRGBSurface(0, width, height, 32, 0x00FF0000, 0x0000FF00, + 0x000000FF, 0xFF000000); + assert(convertedSurface != nullptr); + SDL_BlitSurface(m_data->surface, nullptr, convertedSurface, nullptr); SDL_FreeSurface(m_data->surface); - m_data->surface = resizedSurface; + m_data->surface = convertedSurface; } /** @@ -376,6 +391,11 @@ bool CImage::Load(const std::string& fileName) return false; } + if (m_data->surface->format->palette != nullptr) + { + ConvertToRGBA(); + } + return true; } diff --git a/src/common/image.h b/src/common/image.h index 44aedf15..31dab2d0 100644 --- a/src/common/image.h +++ b/src/common/image.h @@ -97,6 +97,9 @@ public: //! Pads the image to nearest power of 2 dimensions void PadToNearestPowerOfTwo(); + //! Convert the image to RGBA surface + void ConvertToRGBA(); + //! Loads an image from the specified file bool Load(const std::string &fileName); @@ -107,6 +110,9 @@ public: std::string GetError(); private: + //! Blit to new RGBA surface with given size + void BlitToNewRGBASurface(int width, int height); + //! Last encountered error std::string m_error; //! Image data From 6e31af3923601663b351433892d6ad314fdc802a Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Sun, 17 Nov 2013 18:07:18 +0100 Subject: [PATCH 29/40] Initialise CSystemUtils' singleton in the three light, transform and model tests Also fix README --- test/envs/opengl/README.txt | 2 +- test/envs/opengl/light_test.cpp | 3 +++ test/envs/opengl/model_test.cpp | 5 ++++- test/envs/opengl/transform_test.cpp | 3 +++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/test/envs/opengl/README.txt b/test/envs/opengl/README.txt index c6184159..f64f1855 100644 --- a/test/envs/opengl/README.txt +++ b/test/envs/opengl/README.txt @@ -1,7 +1,7 @@ Test programs for OpenGL engine: - texture_test -> multitexturing test with 2 textures (included as files: ./tex1.png, ./tex2.png) - model_test -> simple model viewer to test model loading - usage: ./model_test {dxf|mod} model_file + usage: ./model_test {old|new_txt|new_bin} model_file second argument is the loaded format (DXF or Colobot .mod files) requires ./tex folder (or symlink) with Colobot textures viewer is controlled from keyboard - the bindings can be found in code diff --git a/test/envs/opengl/light_test.cpp b/test/envs/opengl/light_test.cpp index 0baf6d3f..227ca2a0 100644 --- a/test/envs/opengl/light_test.cpp +++ b/test/envs/opengl/light_test.cpp @@ -365,6 +365,9 @@ int SDL_MAIN_FUNC(int argc, char *argv[]) { CLogger logger; + CSystemUtils* systemUtils = CSystemUtils::Create(); // platform-specific utils + systemUtils->Init(); + PREV_TIME = GetSystemUtils()->CreateTimeStamp(); CURR_TIME = GetSystemUtils()->CreateTimeStamp(); diff --git a/test/envs/opengl/model_test.cpp b/test/envs/opengl/model_test.cpp index 1dda69c5..fa4042cf 100644 --- a/test/envs/opengl/model_test.cpp +++ b/test/envs/opengl/model_test.cpp @@ -265,6 +265,9 @@ int SDL_MAIN_FUNC(int argc, char *argv[]) { CLogger logger; + CSystemUtils* systemUtils = CSystemUtils::Create(); // platform-specific utils + systemUtils->Init(); + PREV_TIME = GetSystemUtils()->CreateTimeStamp(); CURR_TIME = GetSystemUtils()->CreateTimeStamp(); @@ -273,7 +276,7 @@ int SDL_MAIN_FUNC(int argc, char *argv[]) if (argc != 3) { - std::cerr << "Usage: " << argv[0] << "{old|new_txt|new_bin} model_file" << std::endl; + std::cerr << "Usage: " << argv[0] << " {old|new_txt|new_bin} model_file" << std::endl; return 1; } diff --git a/test/envs/opengl/transform_test.cpp b/test/envs/opengl/transform_test.cpp index 1d5ccf1d..58d8e9e3 100644 --- a/test/envs/opengl/transform_test.cpp +++ b/test/envs/opengl/transform_test.cpp @@ -243,6 +243,9 @@ int SDL_MAIN_FUNC(int argc, char *argv[]) { CLogger logger; + CSystemUtils* systemUtils = CSystemUtils::Create(); // platform-specific utils + systemUtils->Init(); + PREV_TIME = GetSystemUtils()->CreateTimeStamp(); CURR_TIME = GetSystemUtils()->CreateTimeStamp(); From ca82353e81988b4c4105ef2ed8d61206a70d6595 Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Mon, 18 Nov 2013 16:13:19 +0100 Subject: [PATCH 30/40] Re-enable profile_test test --- test/unit/common/CMakeLists.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/unit/common/CMakeLists.txt b/test/unit/common/CMakeLists.txt index aebf17a6..7d1ae9d4 100644 --- a/test/unit/common/CMakeLists.txt +++ b/test/unit/common/CMakeLists.txt @@ -10,7 +10,10 @@ target_link_libraries(image_test ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${PNG_LIBRAR file(COPY colobot.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -# add_executable(profile_test ${SRC_DIR}/common/profile.cpp ${SRC_DIR}/common/logger.cpp profile_test.cpp) -# target_link_libraries(profile_test gtest ${Boost_LIBRARIES}) +add_executable(profile_test ${SRC_DIR}/common/profile.cpp ${SRC_DIR}/common/logger.cpp profile_test.cpp) +set_target_properties(profile_test PROPERTIES COMPILE_DEFINITIONS "DEV_BUILD=1") +target_link_libraries(profile_test gtest ${Boost_LIBRARIES}) -# add_test(profile_test ./profile_test) +add_test(NAME profile_test + COMMAND ${CMAKE_BINARY_DIR}/profile_test + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) From 86c0eb193dc84d39056e9a581f0717a058614db1 Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Mon, 18 Nov 2013 16:24:41 +0100 Subject: [PATCH 31/40] Run image_test --- test/unit/common/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unit/common/CMakeLists.txt b/test/unit/common/CMakeLists.txt index 7d1ae9d4..cf37961e 100644 --- a/test/unit/common/CMakeLists.txt +++ b/test/unit/common/CMakeLists.txt @@ -7,6 +7,8 @@ ${GTEST_INCLUDE_DIR} add_executable(image_test ${SRC_DIR}/common/image.cpp image_test.cpp) target_link_libraries(image_test ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${PNG_LIBRARIES}) +add_test(NAME image_test + COMMAND ${CMAKE_BINARY_DIR}/image_test ${CMAKE_SOURCE_DIR}/test/envs/opengl/tex1.png ${CMAKE_BINARY_DIR}/tex1_test.png) file(COPY colobot.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) From f4355b8b8ea50d01fb2f6e3af5351ef08fad4afb Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Tue, 19 Nov 2013 17:09:06 +0100 Subject: [PATCH 32/40] Fix tooltip to display as white and not transparent --- src/ui/window.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/window.cpp b/src/ui/window.cpp index 80059399..6e082e6f 100644 --- a/src/ui/window.cpp +++ b/src/ui/window.cpp @@ -1191,8 +1191,8 @@ void CWindow::DrawVertex(Math::Point pos, Math::Point dim, int icon) else if ( icon == 1 ) { m_engine->SetTexture("button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); - uv1.x = 128.0f/256.0f; // yellow tooltip + m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + uv1.x = 128.0f/256.0f; // white tooltip uv1.y = 0.0f/256.0f; uv2.x = 224.0f/256.0f; uv2.y = 16.0f/256.0f; From 3bcf80a82aff5652fad3840884c1a762b4d2f296 Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Tue, 19 Nov 2013 17:22:25 +0100 Subject: [PATCH 33/40] Tweak tooltip margin and correct french jargon comment --- src/object/robotmain.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index 6fe85d32..26fa8276 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -3138,9 +3138,9 @@ void CRobotMain::CreateTooltip(Math::Point pos, const char* text) start, end); start.x -= 0.010f; - start.y -= 0.002f; + start.y -= 0.006f; end.x += 0.010f; - end.y += 0.004f; // ch'tite (?) margin + end.y += 0.008f; // small'ish margin pos.x = start.x; pos.y = start.y; From 89e2855f9577a629d1ca67e87de588815829864e Mon Sep 17 00:00:00 2001 From: Didier 'OdyX' Raboud Date: Wed, 20 Nov 2013 10:39:06 +0100 Subject: [PATCH 34/40] Consolidate SYSTEM_CPP_MODULE in the main CMakeLists.txt --- CMakeLists.txt | 12 ++++++++++++ src/CMakeLists.txt | 13 +------------ test/envs/opengl/CMakeLists.txt | 13 ++++--------- test/unit/CMakeLists.txt | 10 +--------- test/unit/ui/CMakeLists.txt | 5 +---- 5 files changed, 19 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ca364ea..7ee21cfd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,12 +45,18 @@ if("${CMAKE_SYSTEM_NAME}" MATCHES "Windows") set(PLATFORM_LINUX 0) set(PLATFORM_MACOSX 0) set(PLATFORM_OTHER 0) + + # Platform-dependent implementation of system.h + set(SYSTEM_CPP_MODULE "system_windows.cpp") elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") message(STATUS "Build for Linux system") set(PLATFORM_WINDOWS 0) set(PLATFORM_LINUX 1) set(PLATFORM_MACOSX 0) set(PLATFORM_OTHER 0) + + # Platform-dependent implementation of system.h + set(SYSTEM_CPP_MODULE "system_linux.cpp") elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") message(STATUS "Build for Mac OSX system") set(PLATFORM_WINDOWS 0) @@ -58,6 +64,9 @@ elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") set(PLATFORM_MACOSX 1) set(PLATFORM_OTHER 0) + # Platform-dependent implementation of system.h + set(SYSTEM_CPP_MODULE "system_macosx.cpp") + set(USE_SDL_MAIN 1) # fixes SDL_main else() message(STATUS "Build for other system") @@ -65,6 +74,9 @@ else() set(PLATFORM_LINUX 0) set(PLATFORM_MACOSX 0) set(PLATFORM_OTHER 1) + + # Platform-dependent implementation of system.h + set(SYSTEM_CPP_MODULE "system_other.cpp") endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 958f86cc..ef59973c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -56,24 +56,13 @@ if(PLATFORM_WINDOWS) set(RES_FILES "../desktop/colobot.rc") endif() -# Platform-dependent implementation of system.h -if(PLATFORM_WINDOWS) - set(SYSTEM_CPP_MODULE "system_windows.cpp") -elseif(PLATFORM_LINUX) - set(SYSTEM_CPP_MODULE "system_linux.cpp") -elseif(PLATFORM_MACOSX) - set(SYSTEM_CPP_MODULE "system_macosx.cpp") - set(SYSTEM_CPP_MODULE ${SYSTEM_CPP_MODULE} "app/system_other.cpp") -else() - set(SYSTEM_CPP_MODULE "system_other.cpp") -endif() - # Source files set(SOURCES app/app.cpp app/main.cpp app/system.cpp app/${SYSTEM_CPP_MODULE} +app/system_other.cpp common/event.cpp common/image.cpp common/iman.cpp diff --git a/test/envs/opengl/CMakeLists.txt b/test/envs/opengl/CMakeLists.txt index 28553185..a78962c5 100644 --- a/test/envs/opengl/CMakeLists.txt +++ b/test/envs/opengl/CMakeLists.txt @@ -2,15 +2,6 @@ set(SRC_DIR ${colobot_SOURCE_DIR}/src) configure_file(${SRC_DIR}/common/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/common/config.h) -# Platform-dependent implementation of system.h -if(PLATFORM_WINDOWS) - set(SYSTEM_CPP_MODULE "system_windows.cpp") -elseif(PLATFORM_LINUX) - set(SYSTEM_CPP_MODULE "system_linux.cpp") -else() - set(SYSTEM_CPP_MODULE "system_other.cpp") -endif() - set(TEXTURE_SOURCES ${SRC_DIR}/graphics/core/color.cpp ${SRC_DIR}/graphics/opengl/gldevice.cpp @@ -28,6 +19,7 @@ ${SRC_DIR}/common/image.cpp ${SRC_DIR}/common/stringutils.cpp ${SRC_DIR}/app/system.cpp ${SRC_DIR}/app/${SYSTEM_CPP_MODULE} +${SRC_DIR}/app/system_other.cpp model_test.cpp ) @@ -38,6 +30,7 @@ ${SRC_DIR}/common/logger.cpp ${SRC_DIR}/common/image.cpp ${SRC_DIR}/app/system.cpp ${SRC_DIR}/app/${SYSTEM_CPP_MODULE} +${SRC_DIR}/app/system_other.cpp transform_test.cpp ) @@ -48,6 +41,7 @@ ${SRC_DIR}/common/logger.cpp ${SRC_DIR}/common/image.cpp ${SRC_DIR}/app/system.cpp ${SRC_DIR}/app/${SYSTEM_CPP_MODULE} +${SRC_DIR}/app/system_other.cpp light_test.cpp ) @@ -68,6 +62,7 @@ ${SDLIMAGE_LIBRARY} ${OPENGL_LIBRARY} ${GLEW_LIBRARY} ${PNG_LIBRARIES} +${Boost_LIBRARIES} ) add_executable(texture_test ${TEXTURE_SOURCES}) diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 1f5e1bc3..38bffda8 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -18,20 +18,12 @@ endif() # Configure file configure_file(${SRC_DIR}/common/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/common/config.h) -# Platform-dependent implementation of system.h -if(PLATFORM_WINDOWS) - set(SYSTEM_CPP_MODULE "system_windows.cpp") -elseif(PLATFORM_LINUX) - set(SYSTEM_CPP_MODULE "system_linux.cpp") -else() - set(SYSTEM_CPP_MODULE "system_other.cpp") -endif() - # Code sources set(COLOBOT_SOURCES ${SRC_DIR}/app/app.cpp ${SRC_DIR}/app/system.cpp ${SRC_DIR}/app/${SYSTEM_CPP_MODULE} +${SRC_DIR}/app/system_other.cpp ${SRC_DIR}/common/event.cpp ${SRC_DIR}/common/image.cpp ${SRC_DIR}/common/iman.cpp diff --git a/test/unit/ui/CMakeLists.txt b/test/unit/ui/CMakeLists.txt index 97dd6818..80869676 100644 --- a/test/unit/ui/CMakeLists.txt +++ b/test/unit/ui/CMakeLists.txt @@ -10,21 +10,18 @@ ${CLIPBOARD_INCLUDE_DIR} # Platform-dependent implementation of CSystemUtils if(PLATFORM_WINDOWS) - set(SYSTEM_CPP_MODULE "system_windows.cpp") elseif(PLATFORM_LINUX) - set(SYSTEM_CPP_MODULE "system_linux.cpp") set(ADDITIONAL_LIB "-lX11") elseif(PLATFORM_MACOSX) - set(SYSTEM_CPP_MODULE "system_other.cpp") set(ADDITIONAL_LIB "${X11_X11_LIB}") else() - set(SYSTEM_CPP_MODULE "system_other.cpp") set(ADDITIONAL_LIB "-lX11") endif() add_executable(edit_test ${SRC_DIR}/app/system.cpp ${SRC_DIR}/app/${SYSTEM_CPP_MODULE} +${SRC_DIR}/app/system_other.cpp ${SRC_DIR}/common/event.cpp ${SRC_DIR}/common/logger.cpp ${SRC_DIR}/common/misc.cpp From 29b1f9e4c69e8a587997960e42832555ecd21c9c Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Sat, 23 Nov 2013 00:41:20 +0100 Subject: [PATCH 35/40] Fix for error with multiple definitions in MXE build --- cmake/mxe.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/mxe.cmake b/cmake/mxe.cmake index 9bb38d0a..2c24b1bd 100644 --- a/cmake/mxe.cmake +++ b/cmake/mxe.cmake @@ -41,6 +41,8 @@ if((${CMAKE_CROSSCOMPILING}) AND (DEFINED MSYS)) ${CMAKE_FIND_ROOT_PATH}/lib/libbz2.a ${OPENAL_MXE_LIBS} ) + # This fixes problem with multiple definition of `IID_IDirectSoundNotify' + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--allow-multiple-definition") else() set(MXE 0) -endif() \ No newline at end of file +endif() From 405db2d70ca108a0422538a4f30072f1831f473b Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Sat, 23 Nov 2013 00:50:20 +0100 Subject: [PATCH 36/40] Updated INSTALL-MXE instructions --- INSTALL-MXE.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/INSTALL-MXE.md b/INSTALL-MXE.md index 47b6bcc8..e8db7cdd 100644 --- a/INSTALL-MXE.md +++ b/INSTALL-MXE.md @@ -29,7 +29,6 @@ To cross-compile Colobot using MXE: * check-requirements * expat * flac - * flac * freetype * gcc * gcc-gmp @@ -55,13 +54,15 @@ To cross-compile Colobot using MXE: * xz * zlib -4. Now `cd` to directory with colobot sources. To cross-compile a CMake project, - you have to specify a CMake toolchain file. MXE has such file in MXE's directory: - `usr/i686-pc-mingw32/share/cmake/mxe-conf.cmake` - Toolchain file is specified that way: `cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/mxe-conf.cmake .` +4. Now `cd` to directory with colobot sources. + It is recommended that you create a separate directory for out-of-source build: + `mkdir build-mxe && cd build-mxe` + + In order to cross-compile a CMake project, you have to specify a CMake toolchain file. + MXE has such file in MXE's directory: `usr/i686-pc-mingw32/share/cmake/mxe-conf.cmake` + So you should use the following cmake command: `cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/mxe-conf.cmake ..` CMake files in Colobot should detect that MXE is being used and they will modify flags, paths, etc. as required. You should not run into any problems. - *Note:* you may also want to use a separate out-of-source build directory for MXE. 5. `make` should now compile the game with the resulting executable as `colobot.exe`. The exe is linked against all libraries *statically*, so there are no dependencies @@ -70,6 +71,8 @@ To cross-compile Colobot using MXE: 6. If you want to create a Colobot installer, you need to additionally build 'nsis' in MXE. Then you can create the NSIS installer that way: - `PATH=/path/to/mxe/binaries/:$PATH make package` This will create a versionned - colobot-$version.exe installer that will install Colobot in system directories, - add a shortcut in the start menu and setup an uninstaller. + `PATH=/path/to/mxe/binaries:$PATH make package` + where `/path/to/mxe/binaries` is path to cross-compiled MXE binaries available + in MXE's directory under `usr/i686-pc-mingw32/bin`. + This will create a versioned colobot-$version.exe installer that will install Colobot + in system directories, add a shortcut in the start menu and setup an uninstaller. From aab79c6b5dc33f2a0f88b42a5308e79aeeb92b2c Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Mon, 25 Nov 2013 20:03:06 +0100 Subject: [PATCH 37/40] Changed ASM_TRAP() to assert(0) --- src/CBot/CBot.cpp | 29 +++++----- src/CBot/CBot.h | 7 --- src/CBot/CBotFunction.cpp | 5 +- src/CBot/CBotStack.cpp | 12 ++-- src/CBot/CBotTwoOpExpr.cpp | 4 +- src/CBot/CBotVar.cpp | 114 +++++++++++++++++++------------------ 6 files changed, 88 insertions(+), 83 deletions(-) diff --git a/src/CBot/CBot.cpp b/src/CBot/CBot.cpp index 513b8038..403be6e7 100644 --- a/src/CBot/CBot.cpp +++ b/src/CBot/CBot.cpp @@ -33,6 +33,9 @@ #include "CBot.h" +#include + + CBotInstr::CBotInstr() { name = "CBotInstr"; @@ -285,7 +288,7 @@ CBotInstr* CBotInstr::Compile(CBotToken* &p, CBotCStack* pStack) bool CBotInstr::Execute(CBotStack* &pj) { CBotString ClassManquante = name; - ASM_TRAP(); // should never go through this routine + assert(0); // should never go through this routine // but use the routines of the subclasses return false; } @@ -300,26 +303,26 @@ bool CBotInstr::Execute(CBotStack* &pj, CBotVar* pVar) void CBotInstr::RestoreState(CBotStack* &pj, bool bMain) { CBotString ClassManquante = name; - ASM_TRAP(); // should never go through this routine + assert(0); // should never go through this routine // but use the routines of the subclasses } bool CBotInstr::ExecuteVar(CBotVar* &pVar, CBotCStack* &pile) { - ASM_TRAP(); // dad do not know, see the girls + assert(0); // dad do not know, see the girls return false; } bool CBotInstr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prevToken, bool bStep, bool bExtend) { - ASM_TRAP(); // dad do not know, see the girls + assert(0); // dad do not know, see the girls return false; } void CBotInstr::RestoreStateVar(CBotStack* &pile, bool bMain) { - ASM_TRAP(); // dad do not know, see the girls + assert(0); // dad do not know, see the girls } // this routine is defined only for the subclass CBotCase @@ -531,7 +534,7 @@ void CBotLeftExprVar::RestoreState(CBotStack* &pj, bool bMain) CBotVar* var1; var1 = pj->FindVar(m_token.GetString()); - if (var1 == NULL) ASM_TRAP(); + if (var1 == NULL) assert(0); var1->SetUniqNum(m_nIdent); // with the unique identifier } @@ -1747,7 +1750,7 @@ bool CBotExpression::Execute(CBotStack* &pj) pile2->SetVar(result); break; default: - ASM_TRAP(); + assert(0); } if (!IsInit) pile2->SetError(TX_NOTINIT, m_leftop->GetToken()); @@ -2270,7 +2273,7 @@ CBotIndexExpr::~CBotIndexExpr() bool CBotIndexExpr::ExecuteVar(CBotVar* &pVar, CBotCStack* &pile) { if (pVar->GetType(1) != CBotTypArrayPointer) - ASM_TRAP(); + assert(0); pVar = (static_cast(pVar))->GetItem(0, false); // at compile time makes the element [0] if (pVar == NULL) @@ -2291,7 +2294,7 @@ bool CBotIndexExpr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prev CBotStack* pj = pile; if (pVar->GetType(1) != CBotTypArrayPointer) - ASM_TRAP(); + assert(0); pile = pile->AddStack(); @@ -2372,7 +2375,7 @@ void CBotFieldExpr::SetUniqNum(int num) bool CBotFieldExpr::ExecuteVar(CBotVar* &pVar, CBotCStack* &pile) { if (pVar->GetType(1) != CBotTypPointer) - ASM_TRAP(); + assert(0); pVar = pVar->GetItemRef(m_nIdent); if (pVar == NULL) @@ -2395,7 +2398,7 @@ bool CBotFieldExpr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prev if (pVar->GetType(1) != CBotTypPointer) - ASM_TRAP(); + assert(0); CBotVarClass* pItem = pVar->GetPointer(); if (pItem == NULL) @@ -2648,7 +2651,7 @@ bool CBotLeftExpr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prevT if (pVar == NULL) { #ifdef _DEBUG - ASM_TRAP(); + assert(0); #endif pile->SetError(2, &m_token); return false; @@ -3289,7 +3292,7 @@ bool CBotExprVar::ExecuteVar(CBotVar* &pVar, CBotStack* &pj, CBotToken* prevToke if (pVar == NULL) { #ifdef _DEBUG - ASM_TRAP(); + assert(0); #endif pj->SetError(1, &m_token); return false; diff --git a/src/CBot/CBot.h b/src/CBot/CBot.h index 8313252e..df6614e4 100644 --- a/src/CBot/CBot.h +++ b/src/CBot/CBot.h @@ -32,13 +32,6 @@ #define EOX (reinterpret_cast(-1)) /// \def tag special condition -// fix for MSVC instruction __asm int 3 (setting a trap) -#if defined(__MINGW32__) || defined(__GNUC__) -#define ASM_TRAP() asm("int $3"); -#else -#define ASM_TRAP() __asm int 3; -#endif - ///////////////////////////////////////////////////////////////////// // forward declaration diff --git a/src/CBot/CBotFunction.cpp b/src/CBot/CBotFunction.cpp index 862554e1..e6aa2c9d 100644 --- a/src/CBot/CBotFunction.cpp +++ b/src/CBot/CBotFunction.cpp @@ -20,6 +20,9 @@ #include "CBot.h" +#include + + // various constructors / destructors // \TODO translation:to liberate all according to esteblished tree // pour libérer tout selon l'arbre établi @@ -1046,7 +1049,7 @@ bool CBotDefParam::Execute(CBotVar** ppVars, CBotStack* &pj) } break; default: - ASM_TRAP(); + assert(0); } } newvar->SetUniqNum(p->m_nIdent); diff --git a/src/CBot/CBotStack.cpp b/src/CBot/CBotStack.cpp index 086442d2..1679e5e6 100644 --- a/src/CBot/CBotStack.cpp +++ b/src/CBot/CBotStack.cpp @@ -18,6 +18,8 @@ #include "CBot.h" + +#include #include #include @@ -80,12 +82,12 @@ CBotStack* CBotStack::FirstStack() CBotStack::CBotStack(CBotStack* ppapa) { // constructor must exist or the destructor is never called! - ASM_TRAP(); + assert(0); } CBotStack::~CBotStack() { - ASM_TRAP(); // use Delete () instead + assert(0); // use Delete () instead } void CBotStack::Delete() @@ -693,7 +695,7 @@ void CBotStack::AddVar(CBotVar* pVar) *pp = pVar; // added after #ifdef _DEBUG - if ( pVar->GetUniqNum() == 0 ) ASM_TRAP(); + if ( pVar->GetUniqNum() == 0 ) assert(0); #endif } @@ -1091,7 +1093,7 @@ bool CBotVar::RestoreState(FILE* pf, CBotVar* &pVar) } break; default: - ASM_TRAP(); + assert(0); } if ( pPrev != NULL ) pPrev->m_next = pNew; @@ -1388,7 +1390,7 @@ void CBotCStack::AddVar(CBotVar* pVar) *pp = pVar; // added after #ifdef _DEBUG - if ( pVar->GetUniqNum() == 0 ) ASM_TRAP(); + if ( pVar->GetUniqNum() == 0 ) assert(0); #endif } diff --git a/src/CBot/CBotTwoOpExpr.cpp b/src/CBot/CBotTwoOpExpr.cpp index 6a0d6367..4d4add8b 100644 --- a/src/CBot/CBotTwoOpExpr.cpp +++ b/src/CBot/CBotTwoOpExpr.cpp @@ -20,6 +20,8 @@ #include "CBot.h" +#include + // various constructors CBotTwoOpExpr::CBotTwoOpExpr() @@ -466,7 +468,7 @@ bool CBotTwoOpExpr::Execute(CBotStack* &pStack) if ( !IsNan(left, right, &err) ) result->SL(left , right); break; default: - ASM_TRAP(); + assert(0); } delete temp; diff --git a/src/CBot/CBotVar.cpp b/src/CBot/CBotVar.cpp index ad3708d9..b84006fa 100644 --- a/src/CBot/CBotVar.cpp +++ b/src/CBot/CBotVar.cpp @@ -21,8 +21,10 @@ // it never creates an instance of the class mother CBotVar #include "CBot.h" -#include -#include + +#include +#include +#include long CBotVar::m_identcpt = 0; @@ -124,7 +126,7 @@ void CBotVarClass::InitCBotVarClass( const CBotToken* name, CBotTypResult& type !type.Eq(CBotTypIntrinsic) && // by convenience there accepts these types !type.Eq(CBotTypPointer) && !type.Eq(CBotTypArrayPointer) && - !type.Eq(CBotTypArrayBody)) ASM_TRAP(); + !type.Eq(CBotTypArrayBody)) assert(0); m_token = new CBotToken(name); m_next = NULL; @@ -169,7 +171,7 @@ void CBotVarClass::InitCBotVarClass( const CBotToken* name, CBotTypResult& type CBotVarClass::~CBotVarClass( ) { if ( m_CptUse != 0 ) - ASM_TRAP(); + assert(0); if ( m_pParent ) delete m_pParent; m_pParent = NULL; @@ -242,7 +244,7 @@ void CBotVar::SetUniqNum(long n) { m_ident = n; - if ( n == 0 ) ASM_TRAP(); + if ( n == 0 ) assert(0); } long CBotVar::NextUniqNum() @@ -267,7 +269,7 @@ bool CBotVar::Save1State(FILE* pf) // this routine "virtual" must never be called, // there must be a routine for each of the subclasses (CBotVarInt, CBotVarFloat, etc) // ( see the type in m_type ) - ASM_TRAP(); + assert(0); return false; } @@ -335,7 +337,7 @@ CBotVar* CBotVar::Create(const CBotToken* name, CBotTypResult type) } } - ASM_TRAP(); + assert(0); return NULL; } @@ -406,7 +408,7 @@ CBotVar* CBotVar::Create( const char* n, CBotTypResult type) } } - ASM_TRAP(); + assert(0); return NULL; } @@ -519,25 +521,25 @@ CBotToken* CBotVar::GetToken() CBotVar* CBotVar::GetItem(const char* name) { - ASM_TRAP(); + assert(0); return NULL; } CBotVar* CBotVar::GetItemRef(int nIdent) { - ASM_TRAP(); + assert(0); return NULL; } CBotVar* CBotVar::GetItemList() { - ASM_TRAP(); + assert(0); return NULL; } CBotVar* CBotVar::GetItem(int row, bool bGrow) { - ASM_TRAP(); + assert(0); return NULL; } @@ -617,7 +619,7 @@ void CBotVar::SetVal(CBotVar* var) } break; default: - ASM_TRAP(); + assert(0); } m_binit = var->m_binit; // copie l'état nan s'il y a @@ -651,12 +653,12 @@ int CBotVar::GetPrivate() void CBotVar::SetPointer(CBotVar* pVarClass) { - ASM_TRAP(); + assert(0); } CBotVarClass* CBotVar::GetPointer() { - ASM_TRAP(); + assert(0); return NULL; } @@ -665,167 +667,167 @@ CBotVarClass* CBotVar::GetPointer() int CBotVar::GetValInt() { - ASM_TRAP(); + assert(0); return 0; } float CBotVar::GetValFloat() { - ASM_TRAP(); + assert(0); return 0; } void CBotVar::SetValInt(int c, const char* s) { - ASM_TRAP(); + assert(0); } void CBotVar::SetValFloat(float c) { - ASM_TRAP(); + assert(0); } void CBotVar::Mul(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::Power(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } int CBotVar::Div(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return 0; } int CBotVar::Modulo(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return 0; } void CBotVar::Add(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::Sub(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } bool CBotVar::Lo(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return false; } bool CBotVar::Hi(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return false; } bool CBotVar::Ls(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return false; } bool CBotVar::Hs(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return false; } bool CBotVar::Eq(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return false; } bool CBotVar::Ne(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); return false; } void CBotVar::And(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::Or(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::XOr(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::ASR(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::SR(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::SL(CBotVar* left, CBotVar* right) { - ASM_TRAP(); + assert(0); } void CBotVar::Neg() { - ASM_TRAP(); + assert(0); } void CBotVar::Not() { - ASM_TRAP(); + assert(0); } void CBotVar::Inc() { - ASM_TRAP(); + assert(0); } void CBotVar::Dec() { - ASM_TRAP(); + assert(0); } void CBotVar::Copy(CBotVar* pSrc, bool bName) { - ASM_TRAP(); + assert(0); } void CBotVar::SetValString(const char* p) { - ASM_TRAP(); + assert(0); } CBotString CBotVar::GetValString() { - ASM_TRAP(); + assert(0); return CBotString(); } void CBotVar::SetClass(CBotClass* pClass) { - ASM_TRAP(); + assert(0); } CBotClass* CBotVar::GetClass() { - ASM_TRAP(); + assert(0); return NULL; } @@ -1398,7 +1400,7 @@ void CBotVarClass::Copy(CBotVar* pSrc, bool bName) pSrc = pSrc->GetPointer(); // if source given by a pointer if ( pSrc->GetType() != CBotTypClass ) - ASM_TRAP(); + assert(0); CBotVarClass* p = static_cast(pSrc); @@ -1410,7 +1412,7 @@ void CBotVarClass::Copy(CBotVar* pSrc, bool bName) m_pClass = p->m_pClass; if ( p->m_pParent ) { - ASM_TRAP(); // "que faire du pParent"; + assert(0); // "que faire du pParent"; } // m_next = NULL; @@ -1768,7 +1770,7 @@ bool CBotVarClass::Ne(CBotVar* left, CBotVar* right) CBotVarArray::CBotVarArray(const CBotToken* name, CBotTypResult& type ) { if ( !type.Eq(CBotTypArrayPointer) && - !type.Eq(CBotTypArrayBody)) ASM_TRAP(); + !type.Eq(CBotTypArrayBody)) assert(0); m_token = new CBotToken(name); m_next = NULL; @@ -1791,7 +1793,7 @@ CBotVarArray::~CBotVarArray() void CBotVarArray::Copy(CBotVar* pSrc, bool bName) { if ( pSrc->GetType() != CBotTypArrayPointer ) - ASM_TRAP(); + assert(0); CBotVarArray* p = static_cast(pSrc); @@ -1825,7 +1827,7 @@ void CBotVarArray::SetPointer(CBotVar* pVarClass) if ( !pVarClass->m_type.Eq(CBotTypClass) && !pVarClass->m_type.Eq(CBotTypArrayBody)) - ASM_TRAP(); + assert(0); (static_cast(pVarClass))->IncrementUse(); // incement the reference } @@ -1882,7 +1884,7 @@ CBotVarPointer::CBotVarPointer(const CBotToken* name, CBotTypResult& type ) if ( !type.Eq(CBotTypPointer) && !type.Eq(CBotTypNullPointer) && !type.Eq(CBotTypClass) && // for convenience accepts Class and Intrinsic - !type.Eq(CBotTypIntrinsic) ) ASM_TRAP(); + !type.Eq(CBotTypIntrinsic) ) assert(0); m_token = new CBotToken(name); m_next = NULL; @@ -1965,7 +1967,7 @@ void CBotVarPointer::SetPointer(CBotVar* pVarClass) // if ( pVarClass->GetType() != CBotTypClass ) if ( !pVarClass->m_type.Eq(CBotTypClass) ) - ASM_TRAP(); + assert(0); (static_cast(pVarClass))->IncrementUse(); // increment the reference m_pClass = (static_cast(pVarClass))->m_pClass; @@ -2034,7 +2036,7 @@ void CBotVarPointer::Copy(CBotVar* pSrc, bool bName) { if ( pSrc->GetType() != CBotTypPointer && pSrc->GetType() != CBotTypNullPointer) - ASM_TRAP(); + assert(0); CBotVarPointer* p = static_cast(pSrc); @@ -2162,11 +2164,11 @@ int CBotTypResult::GetType(int mode) const m_type == CBotTypClass || m_type == CBotTypIntrinsic ) - if ( m_pClass == NULL ) ASM_TRAP(); + if ( m_pClass == NULL ) assert(0); if ( m_type == CBotTypArrayPointer ) - if ( m_pNext == NULL ) ASM_TRAP(); + if ( m_pNext == NULL ) assert(0); #endif if ( mode == 3 && m_type == CBotTypNullPointer ) return CBotTypPointer; return m_type; From 6c6f2924388a1f7c1d449d598785fd8c218aeea2 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Mon, 25 Nov 2013 21:36:41 +0100 Subject: [PATCH 38/40] Fix for msys build --- cmake/msys.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/msys.cmake b/cmake/msys.cmake index 26b25b28..230ceb63 100644 --- a/cmake/msys.cmake +++ b/cmake/msys.cmake @@ -8,5 +8,4 @@ if (MSYS AND (NOT MXE)) set(COLOBOT_CXX_FLAGS "${COLOBOT_CXX_FLAGS} -U__STRICT_ANSI__") # fixes putenv() set(USE_SDL_MAIN 1) # fixes SDL_main - set(DESKTOP OFF) # MSYS doesn't have the necessary tools endif() From fdd7c225910302a46ae637a910ab2119cec5c391 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Tue, 26 Nov 2013 00:29:03 +0100 Subject: [PATCH 39/40] Updated README and INSTALL files --- INSTALL-MXE.md | 2 +- INSTALL.md | 160 ++++++++++++++++++++++++++++++++---------------- README.md | 37 ++++++++--- data | 2 +- src/app/app.cpp | 2 +- 5 files changed, 137 insertions(+), 66 deletions(-) diff --git a/INSTALL-MXE.md b/INSTALL-MXE.md index e8db7cdd..2074de0f 100644 --- a/INSTALL-MXE.md +++ b/INSTALL-MXE.md @@ -67,7 +67,7 @@ To cross-compile Colobot using MXE: 5. `make` should now compile the game with the resulting executable as `colobot.exe`. The exe is linked against all libraries *statically*, so there are no dependencies on external DLLs. However, the resulting binary will be huge with all these libraries, - so you might want to do: `strip bin/colobot.exe`. + so you might want to do: `strip colobot.exe`. 6. If you want to create a Colobot installer, you need to additionally build 'nsis' in MXE. Then you can create the NSIS installer that way: diff --git a/INSTALL.md b/INSTALL.md index b7d356a6..d33a2243 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -3,15 +3,40 @@ ## Source and data files Colobot source files can be downloaded from Github repository (https://github.com/colobot/colobot). You can either download -the repository as a ZIP archive, or, clone the repository using git or a GUI frontent for git. +the repository as a ZIP archive, or, clone the repository using git or a GUI frontend for git. -Make sure that once you download/clone the repository, you have the neeeded data files in `data/` subdirectory.These files +Make sure that once you download/clone the repository, you have the needed data files in `data/` subdirectory.These files are provided as git submodule, hosted at a separate Github repository (https://github.com/colobot/colobot-data). If you don't have them, you can either download the repository manually and unpack its content into `data/` or, if you're working with git cloned repository, `git submodule update --init` will download the data submodule repository. -## Compiling on Windows +## Important notes + +It is highly recommended that while compiling, you do an out-of-source build, that is create a separate directory where all build files +will be created. This isolates the generated CMake files and makes it easy to clean them (simply remove the build directory) +as CMake lacks "make clean" command. + +As of 0.1.2-alpha, running the game with source data directory is no longer supported as the data files +are now generated to support multiple languages. You have to perform installation, at least of the data files, to a destination +directory. If you fail to do that, and try to run the game with source data directory, the game will run, but you will not be able to access +any of the missions. + + +## Compilation + +### Compiling on Windows + +The recommended way of compiling for Windows is using Linux in a cross-compilation environment called MXE. +This is the way our build bot service (http://colobot.info/files/compiled.php) prepares the release packages. +You can also try to compile with MSYS/MinGW but this is more difficult. + +#### Cross-compiling using MXE + +MXE (M cross environment, http://mxe.cc/) is a very good cross-compiling framework, complete with a suite of libraries +that make it extremely easy to port applications to Win32. It runs on pretty much any *nix flavor and generates generic, +statically linked Win32 binaries. More information is available in +[INSTALL-MXE.md](https://github.com/colobot/colobot/blob/master/INSTALL-MXE.md) file. #### Compiling with MSYS/MinGW @@ -19,47 +44,53 @@ If you like challenges ;-), you can try to compile Colobot directly under MSYS/M You need to manually compile about 20 packages and resolve many problems. Fortunately, the developers took pity on you, and provide a download package containing all the necessary libraries and tools. -To use this package, you must first install a vanilla MSYS/MinGW enviromnent. To do this, download and run +To use this package, you must first install a vanilla MSYS/MinGW environment. To do this, download and run mingw-get installer (http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/). When installing, select **all** possible packages in the installer. -Next, download the development package available at Colobot site (http://colobot.info/) and unpack the files -from the archive to MinGW directory. This should provide a working environment, including CMake and +Next, download the development package available at Colobot site (http://colobot.info/files/ - files named msys-devpack-*) +and unpack the files from the archive to MinGW directory. This should provide a working environment, including CMake and all necessary packages. However, make sure you get the right package. There are slight changes between GCC 4.6 and 4.7, especially with boost library which will result in build failure or error in runtime. -To compile Colobot, `cd` to directory with sources and run: - $ cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Release . -and then: +Once you have installed the development package, run the MSYS shell. This shell works as a hybrid *nix/Windows environment, +so you have regular bash commands but can specify paths using Windows syntax: "C:\some\path", CRLF is the endline separator and so forth. +CMake should automatically detect this build environment and use the Windows options to compile. + +To compile colobot, change the directory to where you have downloaded the source files: + $ cd "C:\path\to\colobot\sources" + +It is recommended that you create a build directory: + $ mkdir build + $ cd build + +Then you have to configure CMake. You should specify the following options: + $ cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="C:\some\directory" .. +where "C:\some\directory" is the directory you want to run colobot from. It can be a proper installation path if you want +to install it in system, or some temporary directory like "..\colobot-temporary-install" if you just want to try the game. +You can also skip this argument and use the default install path: "C:\Program Files\colobot". +Make sure you specify "MSYS Makefiles" as the CMake generator because otherwise, the default for Windows is to use MSVC nmake +and it will not work. + +Then to compile: $ make Everything should compile just fine. If you see any errors, it most likely means missing libraries or invalid installation. Warnings may occur, but are mostly harmless. -You'll get the binary `colobot.exe`, which you can run directly, pointing it to the data directory: - $ colobot.exe -datadir ./data - -You can also install Colobot in your system using +Now you need to perform the installation: $ make install -The default install path is `C:\Program Files\colobot`, but you can change it by adding `-DCMAKE_INSTALL_PREFIX="C:\your\path"` -to CMake arguments. +You should get all files ready to use under the installation prefix you specified. Run `colobot.exe` and enjoy the game. -See also "Hints and notes" below on some useful advice. +### Compiling on Linux -#### Cross-compiling using MXE +Since there are so many Linux flavors, it is difficult to write generic instructions. However, here is the general gist of what +you will need to compile colobot. -MXE (http://mxe.cc/) is a very good cross-compiling framework, complete with a suite of libraries -that make it extremely easy to port applications to Win32. It runs on pretty much any *nix flavor and generates generic, -statically linked Win32 binaries. More information is available in INSTALL-MXE.md file. - - -## Compiling on Linux - -Depending on your distribution, you'll need to install different packages, so here's just an outline, the details will -be different for different distros: - * recent compiler (GCC >= 4.6 or a newer clang) since we are using some features of C++11. - * CMake >= 2.8. +You will need: + * recent compiler (GCC >= 4.6 or a newer clang) since we are using some features of C++11 + * CMake >= 2.8 * Boost >= 1.51 (header files + components: filesystem and regex) * SDL >= 1.2.10 * SDL_image >= 1.2 @@ -71,45 +102,66 @@ be different for different distros: * libvorbis >= 1.3.2 * libogg >= 1.3.0 * OpenAL (OpenAL-Soft) >= 1.13 + * po4a >= 0.45 (to generate translated data files) -Instructions for compiling are universal: - $ cmake -DCMAKE_BUILD_TYPE=Release . - $ make +Make sure you install the packages along with header files (often distributed in separate *-dev packages). If you miss any requirements, +CMake should warn you. + +To compile colobot, run your favorite shell and change the directory to where you downloaded colobot source files: + $ cd /path/to/colobot/sources + +It is recommended that you create a build directory: + $ mkdir build + $ cd build + +Now to configure CMake: + $ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/some/prefix .. +where "/some/prefix" is installation prefix where you want to put the game files. It could be a proper installation directory +if you want to install colobot in the system or simply temporary directory like "/tmp/colobot-temporary-install" if you just want to try it. +You can also use clang as the compiler. In that case, before issuing cmake, set the following variables: + $ export CC=clang CXX=clang++ + +Then to compile: + $ make Everything should compile just fine. If you see any errors, it most likely means missing libraries. Warnings may occur, but are mostly harmless. -You'll get the binary in `bin/colobot`, which you can run directly, pointing it to the data directory: - $ bin/colobot -datadir ./data - -To install colobot in the system, you can run: +Now you need to install the game files: $ make install -The default installation path is `/usr/local/` but you can change it by adding `-DCMAKE_INSTALL_PREFIX="/your/custom/path"` -to CMake arguments. +You can now run the game from the prefix you specified. Note that colobot binary is installed in `games/` subdirectory. +So if you provided prefix "/some/prefix", you can run: + $ /some/prefix/games/colobot -See also "Hints and notes" below on some useful advice. +### Compiling on MacOS X + +As of 0.1.2-alpha, we have added MacOS X support. See [INSTALL-MacOSX.md](https://github.com/colobot/colobot/blob/master/INSTALL-MacOSX.md) +file for details. + +## Other platforms + +The code isn't particularly tied to any compiler or platform, so in theory it should work on any platform provided you have +the required libraries there. Also, other compilers than currently supported GCC >= 4.6 and Clang may happen to work with our code. +If you can, please try to compile the code on your platform and let us know how it goes. -## Compiling on other platforms +## Error reports and debugging -We haven't checked other platforms yet but the code isn't particularly tied to any compiler or platform, so in theory -it should work. If you can, please try to compile the code on your platform and let us know how it goes. +Before reporting errors, please make sure you compile the dev branch to make sure that the issue is not yet fixed there. Also, search the +existing issues (https://github.com/colobot/colobot/issues) to check if a similar error has not been already reported. - -## Hints and notes - -CMake has a very useful feature - out-of-source builds - using a separate directory for the output of CMake and compiler. -This way, you can keep clean the directory with your source files. Example of use (starting from directory with sources): - $ mkdir build/ - $ cd build/ - $ cmake ../ - $ make - - -If you want to submit debug reports, please use special Debug and Dev builds (`-DDEV_BUILD=1 -DCMAKE_BUILD_TYPE=Debug`) +If you want to submit error reports, please use special Debug and Dev builds (add `-DDEV_BUILD=1 -DCMAKE_BUILD_TYPE=Debug` to CMake arguments) and run the game in debug mode and with logging on higher level (commandline arguments: `-loglevel debug`). -Also, `-help` will give full list of available arguments. +## Language support + +In order to run colobot in different language, you need to run with fully installed data files. +If you run a system with locale settings set to your language, colobot should auto-detect it and use appropriate language. If that does not happen, +you can force a specific language using option `-language xx` where xx is language code like `en` or `de`. `-help` will show all possible settings. + + +## Help + If you encounter any problems, you can get help at our forum or IRC channels. diff --git a/README.md b/README.md index 21f71588..c67b7553 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ Welcome to the Colobot project code repository -This is official repository for the open-source Colobot project developed by Polish Portal of Colobot (PPC; in Polish: Polski Portal Colobota) with the official site at: http://colobot.info/. +This is official repository for the open-source Colobot project developed by Polish Portal of Colobot (PPC; in Polish: Polski Portal Colobota) with the official site at: [colobot.info](http://colobot.info/joomla). The source code contained here was released by Epsitec -- the original creator of the game -- on open source (GPLv3) license. The code was given and the rights granted specifically to PPC community in March 2012. Since then, we have been developing the game further. -More information for developers (in English) can be found on the [developer wiki](https://colobot.info/wiki/Dev:Main_Page) or [our forum](http://colobot.info/forum/). However, the freshest source of information is our IRC channels (see below). +More information for developers (in English) can be found on the [developer wiki](http://colobot.info/w/Dev:Main_Page) or (in Polish) [our forum](http://colobot.info/forum/). However, the freshest source of information is our IRC channels (see below). This repository contains only the source code of the project. The game requires also data files which are now provided as git submodule and are hosted in [separate repository](https://github.com/colobot/colobot-data). @@ -17,14 +17,23 @@ The original version of the game, as released to us by Epsitec, is available as We are now working on refreshed and updated version of original game, codename Colobot Gold and this is the version currently hosted in this repository. The goal is to rewrite the game engine to be multi-platform, refresh the graphics, include some enhancements and refactor the code to make the game easier to modify. -The project at this point is in alpha stage - the game is mostly playable, both on Windows and Linux, and most major bugs have been corrected. However, there is still a lot of work to be done. We are now working steadily towards subsequent beta releases, correcting other bugs and introducing enhancements and new features. There is a lot of work ahead and we will gladly accept any and all help. +The project at this point is in alpha stage - the game is mostly playable, both on Windows and Linux, and most major bugs have been corrected. We are now working steadily towards subsequent beta releases, correcting other bugs and introducing enhancements and new features. There is a lot of work ahead and we will gladly accept any and all help. In the future, we will begin development on a new installment in the Colobot series, codename Colobot 2. We have many ideas for the new game and we are still discussing them. Generally, the development of this version will begin only after finishing Colobot Gold (it will be probably hosted in another repository, forked off the Colobot Gold code). +## Download packages + +We provide compiled packages of most recent versions using an [automated build bot service](http://colobot.info/files/compiled.php). Available versions include packages for Windows and Linux in both Release and Debug configurations. + +On some Linux distributions there are also distribution packages available: + * Debian Sid (unstable): http://packages.debian.org/sid/colobot + * Arch Linux (AUR): https://aur.archlinux.org/packages/colobot-gold + + ## Compiling and running the game -For these instructions see INSTALL.md file. +If you want to compile colobot yourself, see [INSTALL.md](https://github.com/colobot/colobot/blob/master/INSTALL.md) file. ## Contact @@ -41,11 +50,11 @@ If you want to help in the project, please contact us on our IRC channels or [ou Witamy w repozytorium projektu Colobot -To jest oficjalne repozytorium z kodem projektu open-source Colobot rozwijanego przez Polski Portal Colobota (PPC; po angielsku: Polish Portal of Colobot) z oficjalną stroną: http://colobot.info/. +To jest oficjalne repozytorium z kodem projektu open-source Colobot rozwijanego przez Polski Portal Colobota (PPC; po angielsku: Polish Portal of Colobot) z oficjalną stroną: [colobot.info](http://colobot.info/joomla/?lang=pl). Kod źródłowy zawarty tutaj został wydany przez Epsitec -- oryginalnego twórcę gry -- na otwartej licencji (GPLv3). Kod został wydany i prawa nadane specjalnie dla społeczności PPC w marcu 2012. Od tamtej pory, zajmowaliśmy się dalszym rozwojem gry. -Więcej informacji dla developerów projektu (po angielsku) można znaleźć na [wiki dla developerów](http://colobot.info/wiki/Dev:Main_Page) lub [naszym forum](http://colobot.info/forum/). Jednak źródłem najświeższych informacji są nasze kanały IRC (patrz niżej). +Więcej informacji dla developerów projektu (po angielsku) można znaleźć na [wiki dla developerów](htt://colobot.info/w/Dev:Main_Page) lub (po polsku) na [naszym forum](http://colobot.info/forum/). Jednak źródłem najświeższych informacji są nasze kanały IRC (patrz niżej). To repozytorium zawiera jedynie kod źródłowy projektu. Gra wymaga jeszcze plików danych, które są teraz udostępniane jako submoduł gita i hostowane w [osobnym repozytorium]((https://github.com/colobot/colobot-data). @@ -56,20 +65,30 @@ Oryginalna wersja gry, jaka została udostępniona nam przez Epsitec, jest dost Obecnie pracujemy nad odświeżoną i uaktualnioną wersją oryginalnej gry, którą nazywamy Colobot Gold i jest to wersja obecnie dostępna w tym repozytorium. Celem tego projektu jest przepisanie silnika gry na wersję wieloplatformową, odświeżenie grafiki, dodanie pewnych usprawnień i zrefaktorowanie kodu tak, by dało się łatwiej modyfikować grę. -W tym momencie, gra jest w stadium alpha - gra jest w większości grywalna, pod Windowsem i Linuksem i większość poważnych bugów została poprawiona. Jednakże, jest nadal sporo pracy do zrobienia. Teraz systematycznie pracujemy do kolejnych wydań w fazie beta, poprawiając pozostałe bugi i wprowadzając usprawnienia i nowe funkcje. Jest sporo pracy przed nami i chętnie przyjmiemy pomoc w jakielkolwiek formie. +W tym momencie, gra jest w stadium alpha - gra jest w większości grywalna, pod Windowsem i Linuksem i większość poważnych bugów została poprawiona. Teraz systematycznie pracujemy do kolejnych wydań w fazie beta, poprawiając pozostałe bugi i wprowadzając usprawnienia i nowe funkcje. Jest sporo pracy przed nami i chętnie przyjmiemy pomoc w jakiejkolwiek formie. -W przyszłości, planujemy rozpocząć prace nad nową częścią z serii Colobot, pod nazwą Colobot 2.Mamy wiele pomysłów na nową grę i nadal dyskutujemy nad nimi. Ogólnie, rozwój tej wersji zacznie się po skończeniu wersji Colobot Gold (prawdopodobnie będzie hostowane w osobnym repozytorium, sforkowanym z kodu Colobot Gold). +W przyszłości, planujemy rozpocząć prace nad nową częścią z serii Colobot, pod nazwą Colobot 2. Mamy wiele pomysłów na nową grę i nadal dyskutujemy nad nimi. Ogólnie, rozwój tej wersji zacznie się po skończeniu wersji Colobot Gold (prawdopodobnie będzie hostowane w osobnym repozytorium, sforkowanym z kodu Colobot Gold). + + +## Paczki do pobrania + +Udostępniamy gotowe skompilowane paczki z ostatnich wersji używając [automatycznego build bota](http://colobot.info/files/compiled.php?lang=pl). Dostępne są paczki dla Windowsa i Linuksa w konfiguracjach Release i Debug. + +Dla niektórych dystrybucji Linuksa, dostępne są pakiety danej dystrybucji: + * Debian Sid (unstable): http://packages.debian.org/sid/colobot + * Arch Linux (AUR): https://aur.archlinux.org/packages/colobot-gold ## Kompilacja i uruchomienie gry -Instrukcje te znajdują się w pliku INSTALL.md (po angielsku). +Jeżeli chcesz sam skompilować colobota, zobacz plik [INSTALL.md](https://github.com/colobot/colobot/blob/master/INSTALL.md) (po angielsku). ## Kontakt Jeżeli chcesz pomóc w projekcie, prosimy o kontakt na naszych kanałach IRC lub [naszym forum](http://colobot.info/forum/). + ### Kanały IRC * [#colobot on pirc.pl](irc://pirc.pl#colobot) polski; diff --git a/data b/data index 5d2cf836..5641495f 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 5d2cf83612a6072c4c952a3b9ad16d0aae05ab12 +Subproject commit 5641495ff106199c1e564a4b60d3fca6bbf948a3 diff --git a/src/app/app.cpp b/src/app/app.cpp index ce973351..09fb2337 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -281,7 +281,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) GetLogger()->Message(" -debug modes enable debug modes (more info printed in logs; see code for reference of modes)\n"); GetLogger()->Message(" -runscene sceneNNN run given scene on start\n"); GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n"); - GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl)\n"); + GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl, ru)\n"); GetLogger()->Message(" -datadir path set custom data directory path\n"); GetLogger()->Message(" -game modid run mod\n"); GetLogger()->Message(" -langdir path set custom language directory path\n"); From 8c25650ad5e888019f350f099d6755921780c6f1 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Tue, 26 Nov 2013 00:39:44 +0100 Subject: [PATCH 40/40] Version bump (0.1.2) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ee21cfd..ff305139 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ project(colobot C CXX) set(COLOBOT_VERSION_CODENAME "Gold") set(COLOBOT_VERSION_MAJOR 0) set(COLOBOT_VERSION_MINOR 1) -set(COLOBOT_VERSION_REVISION 1) +set(COLOBOT_VERSION_REVISION 2) # Used on official releases #set(COLOBOT_VERSION_RELEASE_CODENAME "-alpha")