1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00

Merge remote-tracking branch 'origin/master' into HEAD

This commit is contained in:
krzys-h 2017-10-22 20:57:31 +02:00
commit b96741b45f
70 changed files with 3576 additions and 1323 deletions

View File

@ -11,12 +11,16 @@ link_directories (${CMAKE_INSTALL_PREFIX}/lib)
project (planetblupi)
set (PB_VERSION_MAJOR 1)
set (PB_VERSION_MINOR 9)
set (PB_VERSION_PATCH 1)
set (PB_VERSION_MINOR 11)
set (PB_VERSION_PATCH 0)
set (PB_VERSION_EXTRA "")
set (PB_PRODUCT_NAME "Planet Blupi")
set (PB_PACKAGE_NAME "planetblupi")
set (PB_DESCRIPTION "Planet Blupi - A delerious spell-binding game")
set (PB_EXEC "planetblupi")
set (PB_ICON_REF "blupi")
set (PB_DESCRIPTION "Planet Blupi - A delirious spell-binding game")
option (PB_HTTP_VERSION_CHECK "Run a version check over HTTP (with CURL)" OFF)
configure_file (
"${PROJECT_SOURCE_DIR}/src/config.h.in"
@ -32,11 +36,19 @@ if (APPIMAGE_APPRUN_PROGRAM AND APPIMAGE_ASSISTANT_PROGRAM)
set (USE_APPIMAGE ON)
endif ()
if (NOT USE_APPIMAGE)
configure_file (
"${PROJECT_SOURCE_DIR}/resources/linux/application.desktop.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PB_PACKAGE_NAME}.desktop"
@ONLY
)
endif ()
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -L${CMAKE_INSTALL_PREFIX}/lib")
endif ()
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND "${STATIC_BUILD}")
set (CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
endif ()
@ -94,32 +106,50 @@ endif (MINGW)
# Dependencies
set (CMAKE_INCLUDE_PATH ${CMAKE_INSTALL_PREFIX}/include)
set (CMAKE_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib)
if ("${STATIC_BUILD}")
set (CMAKE_INCLUDE_PATH ${CMAKE_INSTALL_PREFIX}/include)
set (CMAKE_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib)
endif ()
find_package (Intl REQUIRED)
include_directories (${Intl_INCLUDE_DIRS})
find_package (Iconv REQUIRED)
include_directories (${Iconv_INCLUDE_DIRS})
find_package (Argagg REQUIRED)
include_directories (${Argagg_INCLUDE_DIRS})
find_package (SDLKitchensink REQUIRED)
include_directories (${SDLKitchensink_INCLUDE_DIRS})
find_package (PkgConfig REQUIRED)
pkg_search_module (SDL2 REQUIRED sdl2)
pkg_search_module (SDL2_MIXER REQUIRED SDL2_mixer)
pkg_search_module (SDL2_IMAGE REQUIRED SDL2_image)
pkg_search_module (CURL REQUIRED libcurl)
# Static dependencies for SDL_kitchensink
pkg_search_module (PNG REQUIRED libpng)
pkg_search_module (AVCODEC REQUIRED libavcodec)
pkg_search_module (AVFORMAT REQUIRED libavformat)
pkg_search_module (AVUTIL REQUIRED libavutil)
pkg_search_module (SWSCALE REQUIRED libswscale)
pkg_search_module (SWRESAMPLE REQUIRED libswresample)
if (UNIX AND NOT APPLE)
pkg_search_module (ALSA REQUIRED alsa)
pkg_search_module (PULSE REQUIRED libpulse)
if (${PB_HTTP_VERSION_CHECK})
pkg_search_module (CURL REQUIRED libcurl)
add_definitions (-DUSE_CURL)
endif ()
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCURL_STATICLIB")
if ("${STATIC_BUILD}")
pkg_search_module (PNG REQUIRED libpng)
# Static dependencies for SDL_kitchensink
pkg_search_module (AVCODEC REQUIRED libavcodec)
pkg_search_module (AVFORMAT REQUIRED libavformat)
pkg_search_module (AVUTIL REQUIRED libavutil)
pkg_search_module (SWSCALE REQUIRED libswscale)
pkg_search_module (SWRESAMPLE REQUIRED libswresample)
if (UNIX AND NOT APPLE)
pkg_search_module (ALSA REQUIRED alsa)
pkg_search_module (PULSE REQUIRED libpulse)
endif ()
if (${PB_HTTP_VERSION_CHECK})
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCURL_STATICLIB")
endif ()
endif ()
###########################
## Main binary dependencies
@ -127,28 +157,50 @@ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCURL_STATICLIB")
add_executable (planetblupi ${sources})
set (planetblupi_DEPS
${Intl_LIBRARIES}
${Iconv_LIBRARIES}
${SDL2_STATIC_LIBRARIES}
${SDL2_MIXER_STATIC_LIBRARIES}
${SDL2_IMAGE_STATIC_LIBRARIES}
${CURL_STATIC_LIBRARIES}
${SDLKitchensink_STATIC_LIBRARIES}
${PNG_STATIC_LIBRARIES}
${AVCODEC_STATIC_LIBRARIES}
${AVFORMAT_STATIC_LIBRARIES}
${AVUTIL_STATIC_LIBRARIES}
${SWSCALE_STATIC_LIBRARIES}
${SWRESAMPLE_STATIC_LIBRARIES}
)
if (UNIX AND NOT APPLE)
list (APPEND planetblupi_DEPS
${ALSA_STATIC_LIBRARIES}
${PULSE_STATIC_LIBRARIES}
if ("${STATIC_BUILD}")
set (planetblupi_DEPS
${Intl_LIBRARIES}
${Iconv_LIBRARIES}
${SDL2_STATIC_LIBRARIES}
${SDL2_MIXER_STATIC_LIBRARIES}
${SDL2_IMAGE_STATIC_LIBRARIES}
${SDLKitchensink_STATIC_LIBRARIES}
${PNG_STATIC_LIBRARIES}
${AVCODEC_STATIC_LIBRARIES}
${AVFORMAT_STATIC_LIBRARIES}
${AVUTIL_STATIC_LIBRARIES}
${SWSCALE_STATIC_LIBRARIES}
${SWRESAMPLE_STATIC_LIBRARIES}
)
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_INSTALL_PREFIX}/lib/pulseaudio")
if (${PB_HTTP_VERSION_CHECK})
list (APPEND planetblupi_DEPS
${CURL_STATIC_LIBRARIES}
)
endif ()
if (UNIX AND NOT APPLE)
list (APPEND planetblupi_DEPS
${ALSA_STATIC_LIBRARIES}
${PULSE_STATIC_LIBRARIES}
)
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_INSTALL_PREFIX}/lib/pulseaudio")
endif ()
else ()
set (planetblupi_DEPS
${SDL2_LIBRARIES}
${SDL2_MIXER_LIBRARIES}
${SDL2_IMAGE_LIBRARIES}
${CURL_LIBRARIES}
${SDLKitchensink_LIBRARIES}
pthread
)
if (${PB_HTTP_VERSION_CHECK})
list (APPEND planetblupi_DEPS
${CURL_LIBRARIES}
)
endif ()
endif ()
target_link_libraries (planetblupi PUBLIC ${planetblupi_DEPS})
@ -219,6 +271,13 @@ if (UNIX AND NOT APPLE)
install (DIRECTORY resources/icon/hicolor DESTINATION share/icons)
endif ()
if (NOT USE_APPIMAGE)
install (
FILES ${CMAKE_CURRENT_BINARY_DIR}/${PB_PACKAGE_NAME}.desktop
DESTINATION share/applications
)
endif ()
# Copy libwinpthread-1.dll which seems not be linkable statically
if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND MINGW)
execute_process (COMMAND cygpath.exe --windows /mingw64 OUTPUT_VARIABLE MINGW64_PATH)
@ -231,7 +290,7 @@ endif ()
## Deploy
#########
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND "${STATIC_BUILD}")
# set (CPACK_STRIP_FILES TRUE)
set (CPACK_PACKAGE_NAME ${PB_PACKAGE_NAME})
set (CPACK_PACKAGE_VENDOR "blupi.org")
@ -246,7 +305,7 @@ if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
if (USE_APPIMAGE)
include (LinuxAppImageBuild)
set (CMAKE_PACKAGED_OUTPUT_PREFIX ${CMAKE_INSTALL_PREFIX})
APPIMAGE_PACKAGE (planetblupi ${PB_PACKAGE_NAME} ${PB_PRODUCT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/resources/linux" "${CMAKE_BINARY_DIR}/share" "" "" "blupi")
APPIMAGE_PACKAGE (planetblupi ${PB_PACKAGE_NAME} ${PB_PRODUCT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/resources/linux" "${CMAKE_BINARY_DIR}/share" "" "" ${PB_ICON_REF})
elseif (MINGW)
set (INSTALLER_FILE_NAME "${PB_PACKAGE_NAME}-${PB_VERSION_MAJOR}.${PB_VERSION_MINOR}.${PB_VERSION_PATCH}${PB_VERSION_EXTRA}")
set (CPACK_PACKAGE_FILE_NAME "${INSTALLER_FILE_NAME}")

View File

@ -8,10 +8,10 @@ to construct your own missions.
| Category | Description |
| -------- | ----------- |
| OS | At least GNU/Linux 2.6.32, macOS 10.7 or Microsoft Windows Vista |
| VIDEO | An 3D accelerated video card is highly recommended |
| SOUND | Any sound card supported by ALSA, sndio, macOS or DirectSound |
| INPUT | Keyboard and mouse |
| OS | At least GNU/Linux 2.6.32, macOS 10.9 or Microsoft Windows Vista |
| VIDEO | An 3D accelerated video card is highly recommended |
| SOUND | Any sound card supported by ALSA, PulseAudio, macOS or DirectSound |
| INPUT | Keyboard and mouse |
## Screen problems
@ -19,10 +19,10 @@ What ever your screen resolution is, the game "Planet Blupi" always runs in
640x480 on full screen. If your screen does not support this mode, you may run
the game by default in windowed mode. Proceed as follows:
- 1. Quit the game _Planet Blupi_.
- 2. Open the file `<INSTALLDIR>/data/config.json` with a text editor.
- 3. Replace `fullscreen: true` by `fullscreen: false`.
- 4. Save and restart the game.
1. Quit the game _Planet Blupi_.
2. Open the file `<INSTALLDIR>/data/config.json` with a text editor.
3. Replace `fullscreen: true` by `fullscreen: false`.
4. Save and restart the game.
In this mode the screen is no more scrolled if the mouse touches the window
border. Use the Keyboard arrows instead.
@ -32,9 +32,9 @@ border. Use the Keyboard arrows instead.
Left button:
This button is always used in three steps:
- 1. Select a Blupi.
- 2. Click where you want him to act.
- 3. Click the button corresponding to the required operation.
1. Select a Blupi.
2. Click where you want him to act.
3. Click the button corresponding to the required operation.
If the chosen Blupi is already selected (blue or red circle around him),
step 1) is not necessary.

View File

@ -1,4 +1,5 @@
{
"fullscreen": true,
"zoom": 1,
"speedrate": 1
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View File

@ -3,8 +3,8 @@ Version=1.0
Type=Application
Name=@PB_PRODUCT_NAME@
GenericName=Video Game
Comment=@CPACK_PACKAGE_DESCRIPTION_SUMMARY@
Exec=@APPIMAGE_EXEC@
StartupWMClass=@APPIMAGE_EXEC_WM@
Comment=@PB_DESCRIPTION@
Exec=@PB_EXEC@
StartupWMClass=@PB_EXEC@
Icon=@APPIMAGE_ICON_REF@
Categories=Game;
Categories=Game;StrategyGame;

View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-09 09:13+0200\n"
"PO-Revision-Date: 2017-09-09 09:13+0200\n"
"POT-Creation-Date: 2017-09-15 18:34+0200\n"
"PO-Revision-Date: 2017-10-04 23:30+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@ -548,6 +548,9 @@ msgstr "Auswahl der Musik"
msgid "Music number 1"
msgstr "Musik Nummer 1"
msgid "Music number 10"
msgstr "Musik Nummer 10"
msgid "Music number 2"
msgstr "Musik Nummer 2"
@ -908,7 +911,7 @@ msgid "free slot"
msgstr "frei"
msgid "http://www.blupi.org info@blupi.org"
msgstr ""
msgstr "http://www.blupi.org info@blupi.org"
#, c-format
msgid "mission %d, time %d"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-09 09:13+0200\n"
"POT-Creation-Date: 2017-09-15 18:34+0200\n"
"PO-Revision-Date: 2017-02-27 21:28+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -491,6 +491,9 @@ msgstr ""
msgid "Music number 1"
msgstr ""
msgid "Music number 10"
msgstr ""
msgid "Music number 2"
msgstr ""

View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-09 09:13+0200\n"
"PO-Revision-Date: 2017-09-09 09:13+0200\n"
"POT-Creation-Date: 2017-09-15 18:34+0200\n"
"PO-Revision-Date: 2017-10-04 23:29+0200\n"
"Last-Translator: Mathieu Schroeter <mathieu@schroetersa.ch>\n"
"Language-Team: French <kde-i18n-doc@kde.org>\n"
"Language: fr\n"
@ -543,6 +543,9 @@ msgstr "Choix de la musique"
msgid "Music number 1"
msgstr "Musique numéro 1"
msgid "Music number 10"
msgstr "Musique numéro 10"
msgid "Music number 2"
msgstr "Musique numéro 2"
@ -900,7 +903,7 @@ msgid "free slot"
msgstr "libre"
msgid "http://www.blupi.org info@blupi.org"
msgstr ""
msgstr "http://www.blupi.org info@blupi.org"
#, c-format
msgid "mission %d, time %d"

917
resources/po/it.po Normal file
View File

@ -0,0 +1,917 @@
# 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 <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-29 10:21+0200\n"
"PO-Revision-Date: 2017-10-04 17:30+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.11\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid " - FFmpeg (LGPLv2.1)"
msgstr " - FFmpeg (LGPLv2.1)"
msgid " - GNU/gettext and GNU/libiconv (GPLv3)"
msgstr " - GNU/gettext e GNU/libiconv (GPLv3)"
msgid " - SDL2, SDL2_image and SDL2_mixer (zlib license)"
msgstr " - SDL2, SDL2_image e SDL2_mixer (zlib licensa)"
msgid " - SDL_kitchensink (MIT)"
msgstr " - SDL_kitchensink (MIT)"
msgid " - argagg (MIT)"
msgstr " - argagg (MIT)"
msgid " - libasound (LGPLv2.1)"
msgstr " - libasound (LGPLv2.1)"
msgid " - libcurl (MIT/X derivate)"
msgstr " - libcurl (MIT/X derivata)"
msgid " - libpng (own license)"
msgstr " - libpng (licensa personale)"
msgid " - libpulse (LGPLv2.1)"
msgstr " - libpulse (LGPLv2.1)"
msgid " - zlib (own license)"
msgstr " - zlib (licensa personale)"
msgid "(isolated tower)"
msgstr "(torre isolata)"
msgid ""
"1: Cut down a tree \n"
"2: Build a bridge"
msgstr ""
"1: Abbatti un albero \n"
"2: Costruisci un ponte"
msgid ""
"1: Cut down a tree \n"
"2: Make a boat"
msgstr ""
"1: Abbatti un albero \n"
"2: Costruisci una barca"
msgid ""
"1: Cut down a tree \n"
"2: Make a palisade"
msgstr ""
"1: Abbatti un albero \n"
"2: Costruisci una palizzata"
msgid ""
"1: Extract iron\n"
"2: Make a Jeep"
msgstr ""
"1: Estrai del ferro\n"
"2: Costruisci una Jeep"
msgid ""
"1: Extract iron\n"
"2: Make a bomb"
msgstr ""
"1: Estrai del ferro\n"
"2: Costruisci una bomba"
msgid ""
"1: Extract iron\n"
"2: Make an armour"
msgstr ""
"1: Estrai del ferro\n"
"2: Costruisci un'armatura"
msgid ""
"1: Grow tomatoes\n"
"2: Eat"
msgstr ""
"1: Coltiva...\n"
"2: Mangia"
msgid ""
"1: Make a bunch\n"
"2: Transform"
msgstr ""
"1: Fai un mazzo\n"
"2: Trasforma"
msgid ""
"1: Take\n"
"2: Build a bridge"
msgstr ""
"1: Prendi\n"
"2: Costruisci un ponte"
msgid ""
"1: Take\n"
"2: Build palisade"
msgstr ""
"1: Prendi\n"
"2: Costruisci una palizzata"
msgid ""
"1: Take\n"
"2: Make a boat"
msgstr ""
"1: Prendi\n"
"2: Costruisci una barca"
msgid ""
"1: Take\n"
"2: Transform"
msgstr ""
"1: Prendi\n"
"2: Trasforma"
msgid ""
"1|Drop planks on striped \n"
"1|paving stones."
msgstr ""
"1|Posa delle assi \n"
"1|sulle lastre tratteggiate."
msgid ""
"1|Drop platinium on striped \n"
"1|paving stones."
msgstr ""
"1|Posa del platinium sulle \n"
"1|lastre tratteggiate."
msgid ""
"1|Drop tomatoes on striped \n"
"1|paving stones."
msgstr ""
"1|Posa dei pomodori sulle \n"
"1|lastre tratteggiate."
msgid ""
"1|Each Blupi in\n"
"1|his house."
msgstr ""
"1|Ogni Blupi nella\n"
"1|sua casa."
msgid ""
"1|Go on striped\n"
"1|paving stones."
msgstr ""
"1|Andare sulle lastre\n"
"1|tratteggiate."
msgid "1|Goal :"
msgstr "1|Obbiettivo :"
msgid ""
"1|Kill all\n"
"1|enemies !"
msgstr ""
"1|Eliminare\n"
"1|tutti i nemici !"
msgid ""
"1|Resist until\n"
"1|fire extinction ..."
msgstr ""
"1|Resistere sino allo\n"
"1|spegnimento del fuoco ..."
#, c-format
msgid ""
"1|The Blupi population must\n"
"1|be of at least %d Blupi."
msgstr ""
"1|La popolazione deve\n"
"1|essere di almeno %d Blupi."
msgid ""
"1|The robot must reach\n"
"1|the striped paving stones."
msgstr ""
"1|Il robot deve raggiungere\n"
"1|le lastre tratteggiate."
msgid "All licenses are available under share/doc/planetblupi/copyright"
msgstr "Tutte le license sono disponibili in share/doc/planetblupi/copyright"
msgid "Already two teleporters"
msgstr "Esistono già due teletrasporti"
msgid "Another mistake..."
msgstr "Ahimè, hai sbagliato un'altra volta..."
msgid "Armour"
msgstr "Armatura"
msgid "Available buttons"
msgstr "Pulsanti disponibili"
msgid "Bang, failed again !"
msgstr "Bang, hai sbagliato ancora !"
msgid "Bank"
msgstr "Riva"
msgid "Blow up"
msgstr "Espoldi"
msgid "Blupi"
msgstr "Blupi"
msgid "Blupi in house"
msgstr "Blupi nella sua casa"
msgid "Blupi on striped paving stones"
msgstr "Blupi su lastre tratteggiate"
msgid "Blupi's energy"
msgstr "Energia di Blupi"
msgid "Blupi's house"
msgstr "Casa di Blupi"
msgid "Boat"
msgstr "Barca"
msgid "Bouncing bomb"
msgstr "Bomba salterina"
msgid "Bridge"
msgstr "Ponte"
msgid "Bridge finished"
msgstr "Ponte finito"
msgid "Buildings"
msgstr "Edifici"
msgid "Bulldozer"
msgstr "Bulldozer"
msgid "Bunch of flowers"
msgstr "Mazzo di fiori"
msgid "Burnt ground"
msgstr "Terreno bruciato"
msgid "Cancel last operation"
msgstr "Annullare l'ultima operazione"
msgid "Carve a rock"
msgstr "Spacca una roccia"
msgid "Carve rocks"
msgstr "Spacca delle roccie"
msgid ""
"Change the\n"
"window size"
msgstr ""
"Cambiare la\n"
"dimensione\n"
"della finestra"
msgid "Construct this game"
msgstr "Costruire questa partita"
msgid "Construction"
msgstr "Costruzione"
msgid "Construction number"
msgstr "Costruzione numero"
msgid "Continue this game"
msgstr "Continua la partita"
msgid "Cut down a tree"
msgstr "Abbatti un albero"
msgid "Cut down trees"
msgstr "Abbatti degli alberi"
msgid "Decorative plants"
msgstr "Piante ornamentali"
msgid "Delete figure"
msgstr "Elimina personaggio"
msgid "Delete fire"
msgstr "Elimina il fuoco"
msgid "Delete item"
msgstr "Elimina oggetto"
msgid "Demo"
msgstr "Demo"
msgid "Desert"
msgstr "Deserto"
msgid "Difficult"
msgstr "Difficile"
msgid "Drink"
msgstr "Bevi"
msgid "Drop"
msgstr "Posa"
msgid "Dynamite"
msgstr "Dinamite"
msgid "E"
msgstr "E"
msgid "Easy"
msgstr "Facile"
msgid "Eat"
msgstr "Mangia"
msgid "Eggs"
msgstr "Uova"
msgid "Electrocutor"
msgstr "Folgoratore"
msgid "Ending conditions"
msgstr ""
"Condizioni per\n"
"concludere\n"
"la missione"
msgid "Enemy barrier"
msgstr "Barriera nemica"
msgid "Enemy buildings"
msgstr "Edifici nemici"
msgid "Enemy construction"
msgstr "Costruzione nemica"
msgid "Enemy ground"
msgstr "Terreno nemico"
msgid "Enemy rocket"
msgstr "Razzo nemico"
msgid "Excellent..."
msgstr "Eccellente..."
msgid "Extract iron"
msgstr "Estrai del ferro"
msgid "Faster"
msgstr "Veloce"
msgid "Finish"
msgstr "Terminare"
msgid "Fire"
msgstr "Fuoco"
msgid "Fire out"
msgstr "Fuoco fermato"
msgid "Flag"
msgstr "Bandiera"
msgid "Flowers"
msgstr "Fiori"
msgid "Forest"
msgstr "Foresta"
msgid "Forest under snow"
msgstr "Foresta innevata"
msgid "Fullscreen"
msgstr "Schermata intera"
msgid "Game paused"
msgstr "Partita interrotta"
msgid "Garden shed"
msgstr "Capanno"
msgid ""
"Global game\n"
"speed"
msgstr ""
"Velocità\n"
"del gioco"
msgid "Global settings"
msgstr "Configurazione globale"
msgid "Go"
msgstr "Va"
msgid "Grow tomatoes"
msgstr "Coltiva pomodori"
msgid "Help"
msgstr "Aiuto"
msgid "Help number"
msgstr "Aiuto numero"
msgid "Helper robot"
msgstr "Robot aiutante"
msgid "Ice"
msgstr "Ghiaccio"
msgid "Impossible"
msgstr "Impossibile"
#, c-format
msgid "Impossible to win if less than %d Blupi"
msgstr "Impossibile vincere se meno di %d Blupi"
msgid "Inadequate ground"
msgstr "Terreno non adatto"
msgid "Increase volume"
msgstr "Alza il volume"
msgid "Increase window size"
msgstr "Aumentare la dimensione della finestra"
msgid "Incubator"
msgstr "Incubatrice"
msgid "Incubator or teleporter"
msgstr "Incubatrice o teletrasporto"
msgid "Inflammable ground"
msgstr "Terreno infiammabile"
msgid "Insert CD-Rom Planet Blupi and wait a few seconds..."
msgstr "Inserire il CD-Rom Planet Blupi e attendere qualche secondo ..."
msgid ""
"Interface language\n"
"and sounds"
msgstr ""
"Lingua\n"
"dell'interfaccia\n"
"e dei suoni"
msgid "Interrupt"
msgstr "Interrompere"
msgid "Iron"
msgstr "Ferro"
msgid "Items"
msgstr "Oggetti"
msgid "Jeep"
msgstr "Jeep"
msgid "Laboratory"
msgstr "Laboratorio"
msgid "Last construction resolved !"
msgstr "Ultima costruzione risolta !"
msgid "Leave Jeep"
msgstr "Lascia la Jeep"
#, c-format
msgid "Lost if less than %d Blupi"
msgstr "Perso se meno di %d Blupi"
msgid "Make a Jeep"
msgstr "Costruisci una Jeep"
msgid "Make a helper robot"
msgstr "Costruisci un robot aiutante"
msgid "Make a time bomb"
msgstr "Costruisci una bomba"
msgid "Make armour"
msgstr "Costruisci un'armatura"
msgid "Make bunch of flowers"
msgstr "Fai un mazzo di fiori"
msgid "Make bunches of flowers"
msgstr "Fai dei mazzi di fiori"
msgid "Master robot"
msgstr "Robot-capo"
msgid "Medical potion"
msgstr "Pozione"
msgid "Mine"
msgstr "Miniera"
msgid "Miscellaneous ground"
msgstr "Terreno misto"
msgid "Mission number"
msgstr "Missione numero"
msgid "Mission over..."
msgstr "Missione compiuta..."
msgid "Missions"
msgstr "Missioni"
msgid ""
"Music\n"
"volume"
msgstr ""
"Volume\n"
"della musica"
msgid "Music choice"
msgstr "Scelta della musica"
msgid "Music number 1"
msgstr "Musica numero 1"
msgid "Music number 10"
msgstr "Musica numero 10"
msgid "Music number 2"
msgstr "Musica numero 2"
msgid "Music number 3"
msgstr "Musica numero 3"
msgid "Music number 4"
msgstr "Musica numero 4"
msgid "Music number 5"
msgstr "Musica numero 5"
msgid "Music number 6"
msgstr "Musica numero 6"
msgid "Music number 7"
msgstr "Musica numero 7"
msgid "Music number 8"
msgstr "Musica numero 8"
msgid "Music number 9"
msgstr "Musica numero 9"
msgid "N"
msgstr "N"
#, c-format
msgid "New version available for download on www.blupi.org (v%s)"
msgstr "Nuova versione disponibile su www.blupi.org (v%s)"
msgid "Next game"
msgstr "Partita successiva"
msgid "Next language"
msgstr "Prossima lingua"
msgid "Next page"
msgstr "Pagina successiva"
msgid "No"
msgstr "No"
msgid "No more enemies"
msgstr "Nemici eliminati"
msgid "No music"
msgstr "Nessuna musica"
msgid "No video"
msgstr "Nessun video"
msgid "No, not that way !"
msgstr "Ma no, non così !"
msgid "No, wrong way ..."
msgstr "Eh no, non è così ..."
msgid "None"
msgstr "Nessuno"
msgid "Normal ground"
msgstr "Terreno normale"
msgid "Not enough energy"
msgstr "Energia limitata"
msgid "Now go on mission."
msgstr "Ora passa alle missioni."
msgid "Occupied ground"
msgstr "Terreno occupato"
msgid "Open another game"
msgstr "Apri un'altra partita"
msgid "Opposite bank no good"
msgstr "Riva opposta non ok"
msgid "Palisade"
msgstr "Palizzata"
msgid "Paving stones"
msgstr "Lastre"
msgid "Planet Blupi"
msgstr "Planet Blupi"
msgid "Planet Blupi -- stop"
msgstr "Planet Blupi -- stop"
msgid "Planks"
msgstr "Assi"
msgid "Planks on striped paving stones"
msgstr "Assi su lastre tratteggiate"
msgid "Platinium"
msgstr "Platinium"
msgid "Platinium on striped paving stones"
msgstr "Platinium su lastre trattegiate"
msgid "Play this game"
msgstr "Giocare questa partita"
msgid "Poison"
msgstr "Veleno"
msgid "Prairie"
msgstr "Prateria"
msgid "Previous game"
msgstr "Partita precedente"
msgid "Previous language"
msgstr "Lingua precedente"
msgid "Previous page"
msgstr "Pagina precedente"
msgid "Prospect for iron"
msgstr "Cerca del ferro"
msgid "Protection tower"
msgstr "Torre di protezione"
msgid "Quit"
msgstr "Lascia"
msgid "Quit Planet Blupi"
msgstr "Lasciare Planet Blupi"
msgid "Quit construction"
msgstr "Terminare la costruzione"
msgid "Quit this game"
msgstr "Lasciare la partita"
msgid "REC"
msgstr "REC"
msgid "Reduce volume"
msgstr "Abbassa il volume"
msgid "Reduce window size"
msgstr "Ridurre la dimesione della finestra"
msgid "Repeat"
msgstr "Ripeti"
msgid "Restart this game"
msgstr "Ricomincia la partita"
msgid "Robot on striped paving stones"
msgstr "Robot su lastre tratteggiate"
msgid "Rocks"
msgstr "Rocce"
msgid "S"
msgstr "S"
msgid "Save"
msgstr "Salvare"
msgid "Save this game"
msgstr "Salvare questa partita"
msgid "Scenery choice"
msgstr "Scelta degli scenari"
msgid ""
"Scroll speed\n"
"with mouse"
msgstr ""
"Velocità\n"
"del mouse"
msgid ""
"Select the\n"
"window mode"
msgstr ""
"Selezionare il\n"
"modo finestra"
msgid "Settings"
msgstr "Configurazione"
msgid "Show videos"
msgstr "Mostra i video"
msgid "Sick Blupi"
msgstr "Blupi ammalato"
msgid "Skill level"
msgstr "Livello di difficoltà"
msgid "Slower"
msgstr "Lento"
msgid ""
"Sound effect\n"
"volume"
msgstr ""
"Volume\n"
"degli effetti"
msgid "Special pavings"
msgstr "Lastre speciali"
msgid "Spider"
msgstr "Ragno"
msgid "Starting fire"
msgstr "Inizio d'incendio"
msgid "Sterile ground"
msgstr "Terreno sterile"
msgid "Sticky trap"
msgstr "Trappola collosa"
msgid "Stones"
msgstr "Pietre"
msgid "Stop"
msgstr "Stop"
msgid "Striped paving stones"
msgstr "Lastre tratteggiate"
msgid "Take"
msgstr "Prendi"
msgid "Teleporter"
msgstr "Teletrasporto"
msgid ""
"This game is an original creation of Epsitec SA, CH-1400 Yverdon-les-Bains"
msgstr ""
"Questo gioco è una realizzazione originale di Epsitec SA, CH-1400 Yverdon-"
"les-Bains"
msgid "This game uses statically linked free and open-source libraries:"
msgstr "Questo gioco utilizza delle librerie open-source:"
msgid "Time bomb"
msgstr "Bomba a tempo"
msgid "Tired Blupi"
msgstr "Blupi stanco"
msgid "Tomatoes"
msgstr "Pomodori"
msgid "Tomatoes on striped paving stones"
msgstr "Pomodori su lastre tratteggiate"
msgid "Too close to water"
msgstr "Troppo vicino all'acqua"
msgid "Training"
msgstr "Allenamento"
msgid "Training number"
msgstr "Allenamento numero"
msgid "Transform"
msgstr "Trasforma"
msgid "Transport"
msgstr "Mezzi di trasporto"
msgid "Trapped enemy"
msgstr "Nemico intrappolato"
msgid "Tree"
msgstr "Alberi"
msgid "Tree trunks"
msgstr "Tronchi"
msgid "Version"
msgstr "Versione"
msgid "Very good, success on all missions !"
msgstr "Splendido, hai concluso il gioco !"
msgid "Very good."
msgstr "Molto bene."
msgid ""
"Video\n"
"sequences"
msgstr ""
"Sequenze\n"
"video"
msgid "Virus"
msgstr "Virus"
msgid "W"
msgstr "O"
msgid "Wall"
msgstr "Muro"
msgid "Wall or palisade"
msgstr "Muro o Palizzata"
msgid "Water"
msgstr "Acqua"
msgid "We hope you have had as much fun playing the game as we had making it !"
msgstr ""
"Speriamo che ti sia divertito con questo gioco almeno quanto noi ci siamo "
"zzarlo !"
msgid "Weapons"
msgstr "Armi"
msgid "Well done !"
msgstr "Bravo, ce l'hai fatta !"
msgid "Windowed"
msgstr "Finestra"
msgid "Work done"
msgstr "Lavoro in corso"
msgid "Workshop"
msgstr "Fabbrica"
msgid "Yes"
msgstr "Si"
msgid "Yes, great ..."
msgstr "Si, fantastico ..."
msgid "You have failed, try again..."
msgstr "Hai sbagliato, riprova..."
msgid "You have played Planet Blupi."
msgstr "Hai giocato con Planet Blupi."
#, c-format
msgid "construction %d, time %d"
msgstr "Costruzione %d, tempo %d"
msgid "en"
msgstr "it"
msgid "free slot"
msgstr "libero"
msgid "http://www.blupi.org info@blupi.org"
msgstr "http://www.blupi.org info@blupi.org"
#, c-format
msgid "mission %d, time %d"
msgstr "missione %d, tempo %d"
#, c-format
msgid "training %d, time %d"
msgstr "allenamento %d, tempo %d"

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-09-09 09:13+0200\n"
"POT-Creation-Date: 2017-10-04 07:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -518,6 +518,9 @@ msgstr ""
msgid "Music number 9"
msgstr ""
msgid "Music number 10"
msgstr ""
msgid "Prairie"
msgstr ""

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -30,7 +30,9 @@
#include <SDL2/SDL_image.h>
#include <argagg/argagg.hpp>
#ifdef USE_CURL
#include <curl/curl.h>
#endif /* USE_CURL */
#include "json/json.hpp"
@ -59,6 +61,7 @@ CDecor * g_pDecor = nullptr;
std::thread * g_updateThread = nullptr;
bool g_bFullScreen = false; // false si mode de test
Uint8 g_windowScale = 1;
Sint32 g_speedRate = 1;
Sint32 g_timerInterval = 50; // inverval = 50ms
int g_rendererType = 0;
@ -71,6 +74,7 @@ enum Settings {
SETTING_SPEEDRATE = 1 << 1,
SETTING_TIMERINTERVAL = 1 << 2,
SETTING_RENDERER = 1 << 3,
SETTING_ZOOM = 1 << 4,
};
static int g_settingsOverload = 0;
@ -79,11 +83,13 @@ bool g_bTermInit = false; // initialisation en cours
Uint32 g_lastPhase = 999;
static bool g_pause;
#ifdef USE_CURL
struct url_data {
CURLcode status;
char * buffer;
size_t size;
};
#endif
template <typename Out>
static void
@ -92,7 +98,7 @@ split (const std::string & s, char delim, Out result)
std::stringstream ss;
ss.str (s);
std::string item;
while (std::getline (ss, item, delim).good ())
while (std::getline (ss, item, delim))
*(result++) = item;
}
@ -114,7 +120,10 @@ ReadConfig ()
{
const auto config = GetBaseDir () + "data/config.json";
std::ifstream file (config, std::ifstream::in);
std::ifstream file (config, std::ifstream::in);
if (!file)
return false;
nlohmann::json j;
file >> j;
@ -149,6 +158,13 @@ ReadConfig ()
g_bFullScreen = 1;
}
if (!(g_settingsOverload & SETTING_ZOOM) && j.find ("zoom") != j.end ())
{
g_windowScale = j["zoom"].get<Uint8> ();
if (g_windowScale != 1 && g_windowScale != 2)
g_windowScale = 1;
}
if (
!(g_settingsOverload & SETTING_RENDERER) && j.find ("renderer") != j.end ())
{
@ -164,13 +180,14 @@ ReadConfig ()
/**
* \brief Main frame update.
*/
static void
static bool
UpdateFrame (void)
{
Rect clip, rcRect;
Uint32 phase;
Point posMouse;
Sint32 i, term, speed;
bool display = true;
posMouse = g_pEvent->GetLastMousePos ();
@ -243,7 +260,7 @@ UpdateFrame (void)
phase == EV_PHASE_H2MOVIE || phase == EV_PHASE_PLAYMOVIE ||
phase == EV_PHASE_WINMOVIE)
{
g_pEvent->MovieToStart (); // start a movie if necessary
display = g_pEvent->MovieToStart (); // start a movie if necessary
}
if (phase == EV_PHASE_INSERT)
@ -257,6 +274,8 @@ UpdateFrame (void)
if (term == 2)
g_pEvent->ChangePhase (EV_PHASE_WINMOVIE); // win
}
return display;
}
/**
@ -371,10 +390,12 @@ HandleEvent (const SDL_Event & event)
case EV_UPDATE:
if (!g_pEvent->IsMovie ()) // pas de film en cours ?
{
if (!g_pause)
UpdateFrame ();
bool display = true;
if (!g_pEvent->IsMovie ())
if (!g_pause)
display = UpdateFrame ();
if (!g_pEvent->IsMovie () && display)
g_pPixmap->Display ();
}
break;
@ -446,6 +467,7 @@ InitFail (const char * msg)
FinishObjects ();
}
#ifdef USE_CURL
static size_t
updateCallback (void * ptr, size_t size, size_t nmemb, void * data)
{
@ -463,10 +485,12 @@ updateCallback (void * ptr, size_t size, size_t nmemb, void * data)
return realsize;
}
#endif /* USE_CURL */
static void
CheckForUpdates ()
{
#ifdef USE_CURL
url_data chunk;
chunk.buffer = nullptr; /* we expect realloc(NULL, size) to work */
@ -503,6 +527,7 @@ CheckForUpdates ()
free (chunk.buffer);
curl_easy_cleanup (curl);
#endif /* USE_CURL */
}
static int
@ -523,6 +548,10 @@ parseArgs (int argc, char * argv[], bool & exit)
{"-f", "--fullscreen"},
"load in fullscreen [on;off] (default: on)",
1},
{"zoom",
{"-z", "--zoom"},
"change the window scale (only if fullscreen is off) [1;2] (default: 1)",
1},
{"renderer",
{"-r", "--renderer"},
"set a renderer [auto;software;accelerated] (default: auto)",
@ -584,6 +613,12 @@ parseArgs (int argc, char * argv[], bool & exit)
g_settingsOverload |= SETTING_FULLSCREEN;
}
if (args["zoom"])
{
g_windowScale = args["zoom"];
g_settingsOverload |= SETTING_ZOOM;
}
if (args["renderer"])
{
if (args["renderer"].as<std::string> () == "auto")
@ -622,19 +657,20 @@ DoInit (int argc, char * argv[], bool & exit)
bOK = ReadConfig (); // lit le fichier config.json
if (!bOK) // Something wrong with config.json file?
{
InitFail ("Game not correctly installed");
return EXIT_FAILURE;
}
auto res = SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);
if (res < 0)
return EXIT_FAILURE;
// Create a window.
if (g_bFullScreen)
g_window = SDL_CreateWindow (
gettext ("Planet Blupi"), 0, 0, LXIMAGE, LYIMAGE,
SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS | SDL_WINDOW_INPUT_GRABBED);
else
g_window = SDL_CreateWindow (
gettext ("Planet Blupi"), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
LXIMAGE, LYIMAGE, 0);
g_window = SDL_CreateWindow (
gettext ("Planet Blupi"), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
LXIMAGE, LYIMAGE, 0);
if (!g_window)
{
@ -657,12 +693,6 @@ DoInit (int argc, char * argv[], bool & exit)
return EXIT_FAILURE;
}
if (!bOK) // Something wrong with config.json file?
{
InitFail ("Game not correctly installed");
return EXIT_FAILURE;
}
SDL_RenderSetLogicalSize (g_renderer, LXIMAGE, LYIMAGE);
const auto renders = SDL_GetNumRenderDrivers ();
@ -830,26 +860,20 @@ DoInit (int argc, char * argv[], bool & exit)
}
totalDim.x = DIMTEXTX * 16;
totalDim.y = DIMTEXTY * 8 * 3;
totalDim.y = DIMTEXTY * 9 * 3;
iconDim.x = DIMTEXTX;
iconDim.y = DIMTEXTY;
std::string text_filename = "image/text.png";
if (GetLocale() == "pl")
text_filename = "image/text_pl.png"; // TODO: Merge into one texture, or use TTF fonts instead?
if (!g_pPixmap->Cache (CHTEXT, text_filename, totalDim, iconDim))
if (!g_pPixmap->Cache (CHTEXT, "image/text.png", totalDim, iconDim))
{
InitFail ("Cache text.png");
return EXIT_FAILURE;
}
totalDim.x = DIMLITTLEX * 16;
totalDim.y = DIMLITTLEY * 8;
totalDim.y = DIMLITTLEY * 9;
iconDim.x = DIMLITTLEX;
iconDim.y = DIMLITTLEY;
std::string little_filename = "image/little.png";
if (GetLocale() == "pl")
little_filename = "image/little_pl.png"; // TODO: Merge into one texture, or use TTF fonts instead?
if (!g_pPixmap->Cache (CHLITTLE, little_filename, totalDim, iconDim))
if (!g_pPixmap->Cache (CHLITTLE, "image/little.png", totalDim, iconDim))
{
InitFail ("Cache little.png");
return EXIT_FAILURE;
@ -866,7 +890,7 @@ DoInit (int argc, char * argv[], bool & exit)
}
// Load all cursors
g_pPixmap->LoadCursors ();
g_pPixmap->LoadCursors (g_windowScale);
g_pPixmap->ChangeSprite (SPRITE_WAIT); // met le sablier maison
// Create the sound manager.
@ -913,6 +937,8 @@ DoInit (int argc, char * argv[], bool & exit)
g_pEvent->Create (g_pPixmap, g_pDecor, g_pSound, g_pMovie);
g_updateThread = new std::thread (CheckForUpdates);
g_pEvent->SetFullScreen (g_bFullScreen);
if (!g_bFullScreen)
g_pEvent->SetWindowSize (g_windowScale);
g_pEvent->ChangePhase (EV_PHASE_INTRO1);
g_bTermInit = true;

View File

@ -155,7 +155,7 @@ CButton::Draw ()
rect.right = m_pos.x + m_dim.x;
rect.top = m_pos.y;
rect.bottom = m_pos.y + m_dim.y;
m_pPixmap->DrawPart (-1, CHBACK, m_pos, rect, 1); // dessine le fond
m_pPixmap->DrawPart (-1, CHBACK, m_pos, rect); // dessine le fond
return;
}

View File

@ -2487,6 +2487,29 @@ CDecor::BlupiNextAction (Sint32 rank)
return false;
}
}
/* Prevent Blupi to take a trap when an enemy is already captured. */
if (m_blupi[rank].perso == 0 && m_blupi[rank].action == ACTION_CARRY)
{
Sint32 ch, icon;
auto exists = this->GetObject (m_blupi[rank].goalHili, ch, icon);
if (exists && ch == CHOBJECT)
{
switch (icon)
{
case 96: // spider in trap
case 97: // track in trap
case 98: // robot in trap
BlupiInitAction (rank, ACTION_STOP);
GoalStop (rank, true);
return false;
default:
break;
}
}
}
}
if (m_blupi[rank].clicDelay > 0)
@ -3991,7 +4014,7 @@ CDecor::BlupiGoal (Sint32 rank, Buttons button, Point cel, Point cMem)
if (direct == DIRECT_S)
action = EV_ACTION_BOATS;
if (direct == DIRECT_O)
if (direct == DIRECT_W)
action = EV_ACTION_BOATO;
if (direct == DIRECT_N)
action = EV_ACTION_BOATN;

View File

@ -640,7 +640,7 @@ static Sint16 table_goal_build1[] =
GOAL_ACTION, ACTION_BUILDSEC, DIRECT_S,
GOAL_GOBLUPI, +1, +1, true,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -2, true,
GOAL_GOBLUPI, -2, 0, true,
GOAL_ACTION, ACTION_SAW, DIRECT_S,
@ -648,11 +648,11 @@ static Sint16 table_goal_build1[] =
GOAL_GOBLUPI, 0, +1, true,
// maison
GOAL_BUILDOBJECT, -2, 0, CHOBJECT, 61, -1, -1, DIMOBJY / 10, 20, 10 * 100,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_GOBLUPI, -1, 0, true,
GOAL_ACTION, ACTION_BUILDSEC, DIRECT_S,
@ -723,11 +723,11 @@ static Sint16 table_goal_build3[] =
GOAL_ACTION, ACTION_BUILDSEC, DIRECT_S,
GOAL_GOBLUPI, +1, 0, true,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_FINISHMOVE,
@ -752,7 +752,7 @@ static Sint16 table_goal_build4[] =
GOAL_ACTION, ACTION_SAW, DIRECT_S,
GOAL_GOBLUPI, +1, 0, true,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -2, true,
GOAL_GOBLUPI, -1, 0, true,
GOAL_ACTION, ACTION_SAW, DIRECT_S,
@ -760,11 +760,11 @@ static Sint16 table_goal_build4[] =
GOAL_GOBLUPI, 0, +1, true,
// mine
GOAL_BUILDOBJECT, -2, 0, CHOBJECT, 122, -1, -1, DIMOBJY / 10, 20, 10 * 100,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_GOBLUPI, -1, 0, true,
GOAL_ACTION, ACTION_BUILDSEC, DIRECT_S,
@ -801,11 +801,11 @@ static Sint16 table_goal_build5[] =
GOAL_ACTION, ACTION_BUILDSEC, DIRECT_S,
GOAL_GOBLUPI, +1, 0, true,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_O,
GOAL_ACTION, ACTION_BUILDSOURD, DIRECT_W,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_FINISHMOVE,
@ -876,16 +876,16 @@ static Sint16 table_goal_mur[] =
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_S,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_S,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_TCHAO, DIRECT_E,
GOAL_FINISHMOVE,
@ -911,16 +911,16 @@ static Sint16 table_goal_tour[] =
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_PUTOBJECT, -1, 0, -1, -1, // enlève les pierres
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_PIOCHEPIERRE, DIRECT_E,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_O,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_BUILDBREF, DIRECT_W,
GOAL_ACTION, ACTION_STOP, DIRECT_S,
GOAL_FINISHMOVE,
GOAL_ARRANGEOBJECT, -1, -1,
@ -1317,7 +1317,7 @@ static Sint16 table_goal_labo[] =
GOAL_ADDMOVES, -1, -1, 10, // secoue
GOAL_CACHE, true, false,
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_ACTION, ACTION_STOP, DIRECT_O,
GOAL_ACTION, ACTION_STOP, DIRECT_W,
GOAL_SOUND, SOUND_LABO,
GOAL_ACTION, ACTION_LABO, DIRECT_E,
GOAL_SOUND, SOUND_DOOR,
@ -1785,7 +1785,7 @@ static Sint16 table_goal_pontol[] =
GOAL_INTERRUPT, 0, // prioritaire
GOAL_BUILDOBJECT, -10, -10, CHOBJECT, 72, -1, -1, DIMOBJY, 1, -1 * 100,
GOAL_ADDMOVES, -10, -10, 7, // pont vers l'ouest
GOAL_ACTION, ACTION_BRIDGE, DIRECT_O,
GOAL_ACTION, ACTION_BRIDGE, DIRECT_W,
GOAL_GROUP, 4,
GOAL_FINISHMOVE,
GOAL_PUTOBJECT, -10, -10, -1, -1,
@ -1798,7 +1798,7 @@ static Sint16 table_goal_pontol[] =
GOAL_PUTFLOOR, -10, -10, CHFLOOR, -2, // vIcon
GOAL_SOUND, SOUND_PLOUF,
//? GOAL_GOBLUPI, 0,-1, true,
GOAL_ACTION, ACTION_STOP, DIRECT_O,
GOAL_ACTION, ACTION_STOP, DIRECT_W,
GOAL_TERM,
0
};
@ -1982,7 +1982,7 @@ static Sint16 table_goal_bateauo[] =
GOAL_GROUP, 2,
GOAL_BUILDOBJECT, -1, 0, CHOBJECT, 117, -1, -1, DIMOBJY, 1, -1 * 100,
GOAL_ADDMOVES, -1, 0, 7, // bateau vers l'ouest
GOAL_ACTION, ACTION_BRIDGE, DIRECT_O,
GOAL_ACTION, ACTION_BRIDGE, DIRECT_W,
GOAL_GROUP, 4,
GOAL_FINISHMOVE,
GOAL_PUTOBJECT, -1, 0, -1, -1,
@ -2227,7 +2227,7 @@ static Sint16 table_goal_r_build1[] =
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_E,
GOAL_GOBLUPI, +1, 0, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_O,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_E,
GOAL_GOBLUPI, -1, 0, true,
@ -2235,7 +2235,7 @@ static Sint16 table_goal_r_build1[] =
GOAL_GOBLUPI, +1, 0, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_E,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_O,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_S,
GOAL_FINISHMOVE,
GOAL_TERM,
@ -2265,7 +2265,7 @@ static Sint16 table_goal_r_build2[] =
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_E,
GOAL_GOBLUPI, +1, 0, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_O,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_S,
GOAL_GOBLUPI, 0, -1, true,
@ -2273,7 +2273,7 @@ static Sint16 table_goal_r_build2[] =
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_S,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_O,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_S,
GOAL_FINISHMOVE,
GOAL_TERM,
@ -2301,7 +2301,7 @@ static Sint16 table_goal_r_build3[] =
GOAL_BUILDOBJECT, -1, -1, CHOBJECT, 102, -1, -1, DIMOBJY / 4, 20, 4 * 100,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_E,
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_O,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_W,
GOAL_GOBLUPI, +1, 0, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_N,
GOAL_GOBLUPI, 0, +1, true,
@ -2341,7 +2341,7 @@ static Sint16 table_goal_r_build4[] =
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_S,
GOAL_GOBLUPI, +1, 0, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_O,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_S,
GOAL_GOBLUPI, 0, -1, true,
@ -2379,7 +2379,7 @@ static Sint16 table_goal_r_build5[] =
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_S,
GOAL_GOBLUPI, +1, 0, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_O,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_S,
GOAL_GOBLUPI, 0, -1, true,
@ -2417,7 +2417,7 @@ static Sint16 table_goal_r_build6[] =
GOAL_GOBLUPI, 0, -1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_S,
GOAL_GOBLUPI, +1, 0, true,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_O,
GOAL_ACTION, ACTION_R_APLAT, DIRECT_W,
GOAL_GOBLUPI, 0, +1, true,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_S,
GOAL_GOBLUPI, 0, -1, true,
@ -2440,17 +2440,17 @@ static Sint16 table_goal_r_make1[] =
GOAL_GROUP, 2,
GOAL_USINEFREE, -1, -1,
GOAL_INTERRUPT, 0, // prioritaire
GOAL_ACTION, ACTION_R_LOAD, DIRECT_O,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_O,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_O,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_O,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_O,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_O,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_O,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_O,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_O,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_O,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_O,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_W,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_W,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_W,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_W,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_W,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_W,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_W,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_W,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_W,
GOAL_ACTION, ACTION_R_LOAD, DIRECT_W,
GOAL_ACTION, ACTION_R_BUILD, DIRECT_W,
GOAL_TERM,
0
};
@ -2465,11 +2465,11 @@ static Sint16 table_goal_r_make2[] =
GOAL_INTERRUPT, 0, // prioritaire
GOAL_SOUND, SOUND_DOOR,
GOAL_PUTOBJECT, -2, -1, CHOBJECT, 101, // ouvre la porte
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_GOBLUPI, -1, 0, true,
GOAL_SOUND, SOUND_DOOR,
GOAL_GROUP, 2,
@ -2530,11 +2530,11 @@ static Sint16 table_goal_r_make3[] =
GOAL_INTERRUPT, 0, // prioritaire
GOAL_SOUND, SOUND_DOOR,
GOAL_PUTOBJECT, -2, -1, CHOBJECT, 103, // ouvre la porte
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_GOBLUPI, -1, 0, true,
GOAL_SOUND, SOUND_DOOR,
GOAL_GROUP, 2,
@ -2594,11 +2594,11 @@ static Sint16 table_goal_r_make4[] =
GOAL_INTERRUPT, 0, // prioritaire
GOAL_SOUND, SOUND_DOOR,
GOAL_PUTOBJECT, -2, -1, CHOBJECT, 105, // ouvre la porte
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_GOBLUPI, -1, 0, true,
GOAL_SOUND, SOUND_DOOR,
GOAL_GROUP, 2,
@ -2658,11 +2658,11 @@ static Sint16 table_goal_r_make5[] =
GOAL_INTERRUPT, 0, // prioritaire
GOAL_SOUND, SOUND_DOOR,
GOAL_PUTOBJECT, -2, -1, CHOBJECT, 116, // ouvre la porte
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_GOBLUPI, -1, 0, true,
GOAL_SOUND, SOUND_DOOR,
GOAL_GROUP, 2,
@ -2722,11 +2722,11 @@ static Sint16 table_goal_r_make6[] =
GOAL_INTERRUPT, 0, // prioritaire
GOAL_SOUND, SOUND_DOOR,
GOAL_PUTOBJECT, -2, -1, CHOBJECT, 18, // ouvre la porte
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_O,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_ACTION, ACTION_R_STOP, DIRECT_W,
GOAL_GOBLUPI, -1, 0, true,
GOAL_SOUND, SOUND_DOOR,
GOAL_GROUP, 2,
@ -2940,7 +2940,7 @@ static Sint16 table_goal_drapeau3[] =
GOAL_INTERRUPT, 0, // prioritaire
GOAL_WORK, 0, -1,
GOAL_BUILDOBJECT, 0, -1, CHOBJECT, 124, -1, -1, DIMOBJY / 10, 8, 10 * 100,
GOAL_ACTION, ACTION_PIOCHESOURD, DIRECT_O,
GOAL_ACTION, ACTION_PIOCHESOURD, DIRECT_W,
GOAL_GOBLUPI, +1, -1, true,
GOAL_ACTION, ACTION_PIOCHESOURD, DIRECT_E,
GOAL_ADDDRAPEAU, -1, 0,
@ -2968,7 +2968,7 @@ static Sint16 table_goal_extrait[] =
GOAL_ADDMOVES, -1, -1, 11, // secoue
GOAL_CACHE, true, false,
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_ACTION, ACTION_STOP, DIRECT_O,
GOAL_ACTION, ACTION_STOP, DIRECT_W,
GOAL_SOUND, SOUND_MINE,
GOAL_ACTION, ACTION_LABO, DIRECT_E,
GOAL_GROUP, 2,
@ -3015,7 +3015,7 @@ static Sint16 table_goal_fabjeep[] =
GOAL_ADDMOVES, -1, -1, 12, // secoue
GOAL_CACHE, true, false,
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_ACTION, ACTION_STOP, DIRECT_O,
GOAL_ACTION, ACTION_STOP, DIRECT_W,
GOAL_SOUND, SOUND_USINE,
GOAL_ACTION, ACTION_LABO, DIRECT_E,
GOAL_GROUP, 2,
@ -3058,7 +3058,7 @@ static Sint16 table_goal_fabarmure[] =
GOAL_ADDMOVES, -1, -1, 12, // secoue
GOAL_CACHE, true, false,
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_ACTION, ACTION_STOP, DIRECT_O,
GOAL_ACTION, ACTION_STOP, DIRECT_W,
GOAL_SOUND, SOUND_USINE,
GOAL_ACTION, ACTION_LABO, DIRECT_E,
GOAL_GROUP, 2,
@ -3101,7 +3101,7 @@ static Sint16 table_goal_fabmine[] =
GOAL_ADDMOVES, -1, -1, 12, // secoue
GOAL_CACHE, true, false,
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_ACTION, ACTION_STOP, DIRECT_O,
GOAL_ACTION, ACTION_STOP, DIRECT_W,
GOAL_SOUND, SOUND_USINE,
GOAL_ACTION, ACTION_LABO, DIRECT_E,
GOAL_GROUP, 2,
@ -3150,7 +3150,7 @@ static Sint16 table_goal_fabdisc[] =
GOAL_BUILDOBJECT, 0, -1, CHOBJECT, 119, -1, -1, DIMOBJY, 1, -1 * 100,
GOAL_ADDMOVES, 0, -1, 12, // secoue
GOAL_ACTION, ACTION_STOP, DIRECT_E,
GOAL_ACTION, ACTION_STOP, DIRECT_O,
GOAL_ACTION, ACTION_STOP, DIRECT_W,
GOAL_SOUND, SOUND_USINE,
GOAL_ACTION, ACTION_LABO, DIRECT_E,
GOAL_GROUP, 2,

View File

@ -120,7 +120,10 @@ CDecor::Write (Sint32 rank, bool bUser, Sint32 world, Sint32 time, Sint32 total)
AddUserPath (filename);
}
else
filename = string_format (GetBaseDir () + "data/world%.3d.blp", rank);
{
filename = string_format ("data/world%.3d.blp", rank);
AddUserPath (filename);
}
file = fopen (filename.c_str (), "wb");
if (file == nullptr)
@ -207,6 +210,11 @@ CDecor::Read (
filename = string_format ("data/user%.3d.blp", rank);
AddUserPath (filename);
}
else if (rank >= 200)
{
filename = string_format ("data/world%.3d.blp", rank);
AddUserPath (filename);
}
else
filename = string_format (GetBaseDir () + "data/world%.3d.blp", rank);
@ -343,6 +351,11 @@ CDecor::FileExist (
filename = string_format ("data/user%.3d.blp", rank);
AddUserPath (filename);
}
else if (rank >= 200)
{
filename = string_format ("data/world%.3d.blp", rank);
AddUserPath (filename);
}
else
filename = string_format (GetBaseDir () + "data/world%.3d.blp", rank);

View File

@ -533,6 +533,16 @@ CDecor::GenerateMap ()
if (m_blupi[rank].bExist)
{
pos = ConvCelToMap (m_blupi[rank].cel);
if (this->GetSkill () >= 1 && !m_bBuild)
{
auto fogCel = m_blupi[rank].cel;
fogCel.x = (fogCel.x / 4) * 4;
fogCel.y = (fogCel.y / 4) * 4;
if (m_decor[fogCel.x / 2][fogCel.y / 2].fog == FOGHIDE) // hidden?
continue;
}
if (
pos.x >= 0 && pos.x < DIMMAPX - 1 && pos.y >= 0 && pos.y < DIMMAPY - 1)
{

View File

@ -90,14 +90,14 @@ GetVector (Sint32 direct)
case DIRECT_S:
vector.y = +1;
break;
case DIRECT_SO:
case DIRECT_SW:
vector.x = -1;
vector.y = +1;
break;
case DIRECT_O:
case DIRECT_W:
vector.x = -1;
break;
case DIRECT_NO:
case DIRECT_NW:
vector.x = -1;
vector.y = -1;
break;
@ -684,7 +684,7 @@ CDecor::BuildMoveFloor (Sint32 x, Sint32 y, Point pos, Sint32 rank)
m_move[rank].maskChannel, icon, m_move[rank].channel, m_move[rank].icon,
0);
m_pPixmap->DrawIcon (-1, m_move[rank].channel, 0, pos, true);
m_pPixmap->DrawIcon (-1, m_move[rank].channel, 0, pos);
}
else
{

View File

@ -472,9 +472,22 @@ CDecor::StatisticUpdate ()
}
if (m_blupi[rank].perso == 8) // disciple ?
table_statistic[STATDISCIPLE].nb++;
// Hide enemies from the stat when hidden by the fog
bool hide = false;
if (this->GetSkill () >= 1)
{
auto fogCel = m_blupi[rank].cel;
fogCel.x = (fogCel.x / 4) * 4;
fogCel.y = (fogCel.y / 4) * 4;
if (m_decor[fogCel.x / 2][fogCel.y / 2].fog == FOGHIDE) // hidden?
hide = true;
}
if (m_blupi[rank].perso == 4) // robot ?
{
table_statistic[STATROBOT].nb++;
if (!hide)
table_statistic[STATROBOT].nb++;
m_nbStatRobots++;
x = (m_blupi[rank].cel.x / 2) * 2;
y = (m_blupi[rank].cel.y / 2) * 2;
@ -485,27 +498,32 @@ CDecor::StatisticUpdate ()
}
if (m_blupi[rank].perso == 3) // tracks ?
{
table_statistic[STATTRACKS].nb++;
if (!hide)
table_statistic[STATTRACKS].nb++;
if (!m_term.bHachRobot) // pas robot sur hachures ?
m_nbStatRobots++;
}
if (m_blupi[rank].perso == 1) // araignée ?
{
table_statistic[STATARAIGNEE].nb++;
if (!hide)
table_statistic[STATARAIGNEE].nb++;
if (!m_term.bHachRobot) // pas robot sur hachures ?
m_nbStatRobots++;
}
if (m_blupi[rank].perso == 2) // virus ?
table_statistic[STATVIRUS].nb++;
if (!hide)
table_statistic[STATVIRUS].nb++;
if (m_blupi[rank].perso == 5) // bombe ?
{
table_statistic[STATBOMBE].nb++;
if (!hide)
table_statistic[STATBOMBE].nb++;
if (!m_term.bHachRobot) // pas robot sur hachures ?
m_nbStatRobots++;
}
if (m_blupi[rank].perso == 7) // électro ?
{
table_statistic[STATELECTRO].nb++;
if (!hide)
table_statistic[STATELECTRO].nb++;
if (!m_term.bHachRobot) // pas robot sur hachures ?
m_nbStatRobots++;
}
@ -675,7 +693,7 @@ CDecor::StatisticDraw ()
rect.top = pos.y;
rect.bottom = pos.y + DIMSTATY;
m_pPixmap->DrawPart (-1, CHBACK, pos, rect, 1); // dessine le fond
m_pPixmap->DrawPart (-1, CHBACK, pos, rect); // dessine le fond
if (rank == 0 && m_bStatUp)
{
@ -750,7 +768,7 @@ CDecor::StatisticDraw ()
rect.right = pos.x + POSDRAWX;
rect.top = pos.y;
rect.bottom = pos.y + 16;
m_pPixmap->DrawPart (-1, CHBACK, pos, rect, 1); // dessine le fond
m_pPixmap->DrawPart (-1, CHBACK, pos, rect); // dessine le fond
if (strlen (textRes))
{
@ -1009,6 +1027,14 @@ CDecor::StatisticDetect (Point pos)
if (rank >= STATNB)
return -1;
auto pStatistic = StatisticGet (rank);
if (
this->GetSkill () >= 1 && pStatistic->perso >= 0 &&
(pStatistic->perso != 0 && pStatistic->perso != 8))
{
return -1;
}
return rank;
}

View File

@ -23,50 +23,50 @@
#include <SDL2/SDL_stdinc.h>
// clang-format off
#define _INTRO true // true si images d'introduction
#define _INTRO true // true for init screen
#define LXIMAGE 640 // dimensions de la fenêtre de jeu
#define SCRFACTOR 4 / 3
#define LXIMAGE (480 * SCRFACTOR + (480 * SCRFACTOR) % 2) // window size
#define LYIMAGE 480
#define POSDRAWX 144 // surface de dessin
#define POSDRAWX 144 // draw surface
#define POSDRAWY 15
#define DIMDRAWX 480
#define DIMDRAWX (LXIMAGE - (640 - 480))
#define DIMDRAWY 450
#define POSMAPX 8 // surface pour la carte
#define POSMAPX 8 // map surface
#define POSMAPY 15
#define DIMMAPX 128
#define DIMMAPY 128
#define MAXCELX 200 // nb max de cellules d'un monde
#define MAXCELX 200 // max cells for a world
#define MAXCELY 200
#define DIMCELX 60 // dimensions d'une cellule (décor)
#define DIMCELX 60 // cell size (decor)
#define DIMCELY 30
#define DIMOBJX 120 // dimensions d'un objet
#define DIMOBJX 120 // object size
#define DIMOBJY 120
#define DIMBLUPIX 60 // dimensions de blupi
#define DIMBLUPIX 60 // Blupi size
#define DIMBLUPIY 60
#define SHIFTBLUPIY 5 // petit décalage vers le haut
#define SHIFTBLUPIY 5 // shift on top
#define DIMBUTTONX 40 // dimensions d'un button
#define DIMBUTTONX 40 // button size
#define DIMBUTTONY 40
#define DIMJAUGEX 124 // dimensions de la jauge
#define DIMJAUGEX 124 // progress size
#define DIMJAUGEY 22
#define POSSTATX 12 // statistiques
#define POSSTATX 12 // statistics
#define POSSTATY 220
#define DIMSTATX 60
#define DIMSTATY 30
#define DIMTEXTX 16 // dimensions max d'un caractère
#define DIMTEXTX 16 // max char size
#define DIMTEXTY 16
#define DIMLITTLEX 16 // dimensions max d'un petit caractère
#define DIMLITTLEX 16 // max small char size
#define DIMLITTLEY 12
#define CHBACK 0
@ -94,9 +94,9 @@ enum Directions {
DIRECT_E = (0 * 16), // east
DIRECT_SE = (1 * 16), // south-east
DIRECT_S = (2 * 16), // south
DIRECT_SO = (3 * 16), // south-west
DIRECT_O = (4 * 16), // west
DIRECT_NO = (5 * 16), // north-west
DIRECT_SW = (3 * 16), // south-west
DIRECT_W = (4 * 16), // west
DIRECT_NW = (5 * 16), // north-west
DIRECT_N = (6 * 16), // north
DIRECT_NE = (7 * 16), // north-east
};

View File

@ -20,6 +20,7 @@
#include <assert.h>
#include <ctime>
#include <set>
#include <stdio.h>
#include <stdlib.h>
#include <unordered_map>
@ -1258,63 +1259,69 @@ static Phase table[] =
{
EV_BUTTON1,
0, {1, 40},
170 + 42 * 0, 30 + 42 * 0,
170 + 42 * 1, 30 + 42 * 0,
{ translate ("No music") },
},
{
EV_BUTTON2,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 1,
170 + 42 * 0, 30 + 42 * 0,
{ translate ("Music number 1") },
},
{
EV_BUTTON3,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 2,
170 + 42 * 0, 30 + 42 * 1,
{ translate ("Music number 2") },
},
{
EV_BUTTON4,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 3,
170 + 42 * 0, 30 + 42 * 2,
{ translate ("Music number 3") },
},
{
EV_BUTTON5,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 4,
170 + 42 * 0, 30 + 42 * 3,
{ translate ("Music number 4") },
},
{
EV_BUTTON6,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 5,
170 + 42 * 0, 30 + 42 * 4,
{ translate ("Music number 5") },
},
{
EV_BUTTON7,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 6,
170 + 42 * 0, 30 + 42 * 5,
{ translate ("Music number 6") },
},
{
EV_BUTTON8,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 7,
170 + 42 * 0, 30 + 42 * 6,
{ translate ("Music number 7") },
},
{
EV_BUTTON9,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 8,
170 + 42 * 0, 30 + 42 * 7,
{ translate ("Music number 8") },
},
{
EV_BUTTON10,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 9,
170 + 42 * 0, 30 + 42 * 8,
{ translate ("Music number 9") },
},
{
EV_BUTTON11,
0, {1, 44},
170 + 42 * 0, 30 + 42 * 9,
{ translate ("Music number 10") },
},
{
EV_PHASE_BUILD,
0, {1, 50},
@ -1518,7 +1525,7 @@ CEvent::CEvent ()
{
Sint32 i;
m_bFullScreen = g_bFullScreen;
m_bFullScreen = false;
m_WindowScale = 1;
m_exercice = 0;
m_mission = 0;
@ -1545,7 +1552,6 @@ CEvent::CEvent ()
m_bSpeed = false;
m_bHelp = false;
m_bAllMissions = false;
m_bChangeCheat = false;
m_scrollSpeed = 1;
m_bPause = false;
m_bShift = false;
@ -1587,6 +1593,7 @@ CEvent::CEvent ()
m_Languages.push_back (Language::en_US);
m_Languages.push_back (Language::fr);
m_Languages.push_back (Language::de);
m_Languages.push_back (Language::it);
m_Languages.push_back (Language::pl);
this->m_LangStart = GetLocale ();
@ -1597,8 +1604,10 @@ CEvent::CEvent ()
m_Lang = m_Languages.begin () + 2;
else if (this->m_LangStart == "de")
m_Lang = m_Languages.begin () + 3;
else if (this->m_LangStart == "pl")
else if (this->m_LangStart == "it")
m_Lang = m_Languages.begin () + 4;
else if (this->m_LangStart == "pl")
m_Lang = m_Languages.begin () + 5;
else
m_Lang = m_Languages.begin ();
@ -1650,6 +1659,7 @@ CEvent::SetFullScreen (bool bFullScreen)
SDL_SetWindowPosition (
g_window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
m_pPixmap->LoadCursors (m_WindowScale);
m_pPixmap->ReloadTargetTextures ();
/* Force this update before otherwise the coordinates retrieved with
@ -1663,6 +1673,33 @@ CEvent::SetFullScreen (bool bFullScreen)
CEvent::PushUserEvent (EV_WARPMOUSE, coord);
}
/**
* \brief Change the size of the window.
*
* We use an integer scale to be sure that the pixels are always well formed.
*
* \param[in] newScale - The new scale.
*/
void
CEvent::SetWindowSize (Uint8 newScale)
{
if (newScale == m_WindowScale)
return;
auto scale = m_WindowScale;
m_WindowScale = newScale;
switch (newScale)
{
case 1:
case 2:
SetWindowSize (scale, m_WindowScale);
break;
default:
return;
}
}
/**
* \brief Change the size of the window.
*
@ -1681,6 +1718,7 @@ CEvent::SetWindowSize (Uint8 prevScale, Uint8 newScale)
SDL_SetWindowPosition (
g_window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
m_pPixmap->LoadCursors (newScale);
m_pPixmap->ReloadTargetTextures ();
/* Force this update before otherwise the coordinates retrieved with
@ -1932,12 +1970,10 @@ CEvent::DrawButtons ()
bool bEnable;
if (
(m_phase == EV_PHASE_PLAY && m_bChangeCheat) ||
(m_phase == EV_PHASE_PLAY) ||
(m_phase != EV_PHASE_PLAY && m_phase != EV_PHASE_INSERT &&
m_phase != EV_PHASE_INTRO1 && m_phase != EV_PHASE_BYE))
{
m_bChangeCheat = false;
text[0] = 0;
if (m_bAllMissions)
AddCheatCode (text, cheat_code[3]);
@ -1949,14 +1985,17 @@ CEvent::DrawButtons ()
AddCheatCode (text, cheat_code[6]);
if (m_pDecor->GetSuper ())
AddCheatCode (text, cheat_code[7]);
pos.x = 2;
pos.y = 2;
rect.left = pos.x;
rect.right = pos.x + 300;
rect.top = pos.y;
rect.bottom = pos.y + DIMLITTLEY;
m_pPixmap->DrawPart (-1, CHBACK, pos, rect, 1); // dessine le fond
DrawText (m_pPixmap, pos, text, FONTLITTLE);
if (text[0])
{
pos.x = 2;
pos.y = 2;
rect.left = pos.x;
rect.right = pos.x + 300;
rect.top = pos.y;
rect.bottom = pos.y + DIMLITTLEY;
DrawText (m_pPixmap, pos, text, FONTLITTLE);
}
}
if (m_phase == EV_PHASE_INIT)
@ -2112,7 +2151,7 @@ CEvent::DrawButtons ()
rect.right = pos.x + 20;
rect.top = pos.y;
rect.bottom = pos.y + 15;
m_pPixmap->DrawPart (-1, CHBACK, pos, rect, 1); // dessine le fond
m_pPixmap->DrawPart (-1, CHBACK, pos, rect); // dessine le fond
if (m_speed > 1)
{
snprintf (res, sizeof (res), "x%d", m_speed);
@ -2130,7 +2169,7 @@ CEvent::DrawButtons ()
rect.right = POSDRAWX + DIMDRAWX;
rect.top = 0;
rect.bottom = lg;
m_pPixmap->DrawPart (-1, CHBACK, pos, rect, 1);
m_pPixmap->DrawPart (-1, CHBACK, pos, rect);
pos.x = POSDRAWX;
pos.y = lg;
@ -2138,7 +2177,7 @@ CEvent::DrawButtons ()
rect.right = POSDRAWX + DIMDRAWX;
rect.top = 0;
rect.bottom = POSDRAWY;
m_pPixmap->DrawPart (-1, CHBACK, pos, rect, 1);
m_pPixmap->DrawPart (-1, CHBACK, pos, rect);
pos.x = POSDRAWX + 20;
pos.y = POSDRAWY + 4;
@ -2504,8 +2543,10 @@ CEvent::DrawButtons ()
lang = "Français";
else if (locale == "de")
lang = "Deutsch";
else if (locale == "it")
lang = "Italiano";
else if (locale == "pl")
lang = "Polish";
lang = "Polski";
lg = GetTextWidth (lang.c_str ());
pos.x = (54 + 40) - lg / 2;
@ -3036,7 +3077,10 @@ CEvent::ChangePhase (Uint32 phase)
// FIXME: pause is better if the game is not stop but just interrupted
if (m_phase == EV_PHASE_PLAY && m_phase != phase)
m_pSound->StopAllSounds (false);
{
static const std::set<Sint32> except = {SOUND_WIN, SOUND_LOST};
m_pSound->StopAllSounds (false, &except);
}
m_phase = phase; // change de phase
m_index = index;
@ -3149,7 +3193,6 @@ CEvent::ChangePhase (Uint32 phase)
m_pDecor->NextPhase (0); // refait la carte tout de suite
m_pDecor->StatisticInit ();
m_pDecor->TerminatedInit ();
m_bChangeCheat = true; // affiche les cheat-codes
}
if (m_phase == EV_PHASE_BUILD)
@ -3251,7 +3294,7 @@ CEvent::ChangePhase (Uint32 phase)
{
music = m_pDecor->GetMusic ();
for (i = 0; i < 10; i++)
for (i = 0; i < 11; i++)
SetState (EV_BUTTON1 + i, music == i ? 1 : 0);
}
@ -3342,15 +3385,16 @@ CEvent::TryInsert ()
// Fait démarrer un film si nécessaire.
void
bool
CEvent::MovieToStart ()
{
bool movie = false;
if (m_movieToStart[0] != 0) // y a-t-il un film à démarrer ?
{
HideMouse (true); // cache la souris
if (StartMovie (m_movieToStart))
{
movie = true;
m_phase = m_phaseAfterMovie; // prochaine phase normale
}
else
@ -3358,6 +3402,8 @@ CEvent::MovieToStart ()
m_movieToStart[0] = 0;
}
return movie;
}
// Décale le décor.
@ -3650,6 +3696,8 @@ CEvent::GetStartLanguage ()
return Language::fr;
if (this->m_LangStart == "de")
return Language::de;
if (this->m_LangStart == "it")
return Language::it;
if (this->m_LangStart == "pl")
return Language::pl;
return Language::en;
@ -3686,6 +3734,9 @@ CEvent::SetLanguage (Language lang)
case Language::de:
slang = "de";
break;
case Language::it:
slang = "it";
break;
case Language::pl:
slang = "pl";
break;
@ -3702,31 +3753,6 @@ CEvent::SetLanguage (Language lang)
SDL_SetWindowTitle (g_window, gettext ("Planet Blupi"));
m_pSound->CacheAll ();
Point totalDim, iconDim;
totalDim.x = DIMTEXTX * 16;
totalDim.y = DIMTEXTY * 8 * 3;
iconDim.x = DIMTEXTX;
iconDim.y = DIMTEXTY;
std::string text_filename = "image/text.png";
if (GetLocale() == "pl")
text_filename = "image/text_pl.png";
if (!m_pPixmap->Cache (CHTEXT, text_filename, totalDim, iconDim))
{
printf ("Error (Cache text.png)");
}
totalDim.x = DIMLITTLEX * 16;
totalDim.y = DIMLITTLEY * 8;
iconDim.x = DIMLITTLEX;
iconDim.y = DIMLITTLEY;
std::string little_filename = "image/little.png";
if (GetLocale() == "pl")
little_filename = "image/little_pl.png";
if (!m_pPixmap->Cache (CHLITTLE, little_filename, totalDim, iconDim))
{
printf ("Error (Cache little.png)");
}
}
// Clic dans un bouton.
@ -4227,8 +4253,6 @@ CEvent::BuildMove (Point pos, Uint16 mod, const SDL_Event & event)
bool
CEvent::StartMovie (const std::string & pFilename)
{
Rect rect;
if (!m_pMovie->GetEnable ())
return false;
if (!m_bMovie)
@ -4237,15 +4261,12 @@ CEvent::StartMovie (const std::string & pFilename)
if (!m_pMovie->IsExist (pFilename))
return false;
rect.left = 1; // mystère: plante avec 0,0,LXIMAGE,LYIMAGE !!!
rect.top = 1;
rect.right = LXIMAGE - 2;
rect.bottom = LYIMAGE - 2;
HideMouse (true);
m_pSound->StopMusic ();
if (!m_pMovie->Play (rect, pFilename))
if (!m_pMovie->Play (pFilename))
return false;
m_bRunMovie = true;
return true;
}
@ -5097,42 +5118,36 @@ CEvent::TreatEventBase (const SDL_Event & event)
{
m_bAllMissions = !m_bAllMissions;
bEnable = m_bAllMissions;
m_bChangeCheat = true;
break;
}
case 4: // quick ?
{
m_bSpeed = !m_bSpeed;
bEnable = m_bSpeed;
m_bChangeCheat = true;
break;
}
case 5: // helpme ?
{
m_bHelp = !m_bHelp;
bEnable = m_bHelp;
m_bChangeCheat = true;
break;
}
case 6: // invincible ?
{
m_pDecor->SetInvincible (!m_pDecor->GetInvincible ());
bEnable = m_pDecor->GetInvincible ();
m_bChangeCheat = true;
break;
}
case 7: // superblupi ?
{
m_pDecor->SetSuper (!m_pDecor->GetSuper ());
bEnable = m_pDecor->GetSuper ();
m_bChangeCheat = true;
break;
}
case 8: // construire ?
{
m_bAccessBuild = !m_bAccessBuild;
bEnable = m_bAccessBuild;
m_bChangeCheat = true;
break;
}
}
@ -5196,6 +5211,9 @@ CEvent::TreatEventBase (const SDL_Event & event)
return true;
case EV_PHASE_STOP:
ChangePhase (EV_PHASE_PLAY);
return true;
case EV_PHASE_LOST:
case EV_PHASE_BUILD:
ChangePhase (EV_PHASE_INFO);
@ -5301,6 +5319,9 @@ CEvent::TreatEventBase (const SDL_Event & event)
m_pDecor->FlipOutline ();
return true;
case SDLK_PAUSE:
if (this->m_pDecor->GetSkill () >= 1)
return true;
m_bPause = !m_bPause;
if (m_phase == EV_PHASE_PLAY)
{

View File

@ -81,7 +81,9 @@ enum class Language {
en_US = 1,
fr = 2,
de = 3,
pl = 4,
it = 4,
// Left some space for Korean and Hebrew as I think original translations should be first, see issue #23
pl = 7,
};
class CEvent
@ -99,7 +101,7 @@ public:
Sint32 GetImageWorld ();
bool IsHelpHide ();
bool ChangePhase (Uint32 phase);
void MovieToStart ();
bool MovieToStart ();
Uint32 GetPhase ();
void TryInsert ();
@ -141,6 +143,7 @@ public:
void IntroStep ();
Uint8 GetWindowScale ();
void SetWindowSize (Uint8 newScale);
void SetUpdateVersion (const std::string & version);
static void PushUserEvent (Sint32 code, void * data = nullptr);
@ -237,7 +240,6 @@ protected:
bool m_bSpeed;
bool m_bHelp;
bool m_bAllMissions;
bool m_bChangeCheat;
Sint32 m_scrollSpeed;
bool m_bPause;
bool m_bShift;

View File

@ -628,76 +628,77 @@ CDecor::ArrangeObject (Point cel)
}
}
// Arrange les rayons entre les tours.
if (
m_decor[cel.x / 2][cel.y / 2].objectIcon == 27 || // tour ?
m_decor[cel.x / 2][cel.y / 2].objectIcon == -1) // rien ?
g_restoreBugs &&
(m_decor[cel.x / 2][cel.y / 2].objectIcon != 27 && // not a tower?
m_decor[cel.x / 2][cel.y / 2].objectIcon != -1))
return;
// Arrange les rayons entre les tours.
for (i = 0; i < 4; i++)
{
for (i = 0; i < 4; i++)
vector = GetVector (i * 2 * 16);
test = cel;
bTour = false;
j = 0;
while (true)
{
vector = GetVector (i * 2 * 16);
test = cel;
test.x += vector.x * 2;
test.y += vector.y * 2;
if (m_decor[test.x / 2][test.y / 2].objectIcon == 27) // tour ?
{
bTour = true;
break;
}
if (
m_decor[test.x / 2][test.y / 2].objectIcon != -1 &&
m_decor[test.x / 2][test.y / 2].objectIcon != 10001 - i % 2)
break;
j++;
if (j >= 2 + 1)
break;
}
if (m_decor[cel.x / 2][cel.y / 2].objectIcon != 27) // pas tour ?
bTour = false;
j = 0;
while (true)
{
test.x += vector.x * 2;
test.y += vector.y * 2;
if (m_decor[test.x / 2][test.y / 2].objectIcon == 27) // tour ?
test = cel;
for (k = 0; k < j; k++)
{
test.x += vector.x * 2;
test.y += vector.y * 2;
if (bTour)
{
channel = CHOBJECT;
icon = 10001 - i % 2; // rayon e-o (10001) ou n-s (10000)
}
else
{
channel = -1;
icon = -1;
}
m_decor[test.x / 2][test.y / 2].objectChannel = channel;
m_decor[test.x / 2][test.y / 2].objectIcon = icon;
if (!m_bBuild && bTour)
{
if (MoveCreate (
test, -1, false, CHOBJECT, -1, -1, -1, 9999, 1, 0, true))
{
bTour = true;
break;
MoveAddIcons (test, 5 - i % 2, true); // éclairs
}
if (
m_decor[test.x / 2][test.y / 2].objectIcon != -1 &&
m_decor[test.x / 2][test.y / 2].objectIcon != 10001 - i % 2)
break;
j++;
if (j >= 2 + 1)
break;
pos = ConvCelToPos (test);
m_pSound->PlayImage (SOUND_RAYON1, pos);
}
if (m_decor[cel.x / 2][cel.y / 2].objectIcon != 27) // pas tour ?
bTour = false;
test = cel;
for (k = 0; k < j; k++)
{
test.x += vector.x * 2;
test.y += vector.y * 2;
if (bTour)
{
channel = CHOBJECT;
icon = 10001 - i % 2; // rayon e-o (10001) ou n-s (10000)
}
else
{
channel = -1;
icon = -1;
}
m_decor[test.x / 2][test.y / 2].objectChannel = channel;
m_decor[test.x / 2][test.y / 2].objectIcon = icon;
if (!m_bBuild && bTour)
{
if (MoveCreate (
test, -1, false, CHOBJECT, -1, -1, -1, 9999, 1, 0, true))
{
MoveAddIcons (test, 5 - i % 2, true); // éclairs
}
pos = ConvCelToPos (test);
m_pSound->PlayImage (SOUND_RAYON1, pos);
}
if (!m_bBuild && !bTour)
MoveFinish (test);
}
if (!m_bBuild && !bTour)
MoveFinish (test);
}
}
}

View File

@ -90,7 +90,7 @@ CMovie::fileCloseMovie ()
// Sets <m_fMovieOpen> on success.
bool
CMovie::fileOpenMovie (Rect rect, const std::string & pFilename)
CMovie::fileOpenMovie (const std::string & pFilename)
{
const auto path = GetBaseDir () + pFilename;
@ -108,21 +108,22 @@ CMovie::fileOpenMovie (Rect rect, const std::string & pFilename)
if (m_player == nullptr)
return false;
pinfo = new Kit_PlayerInfo;
Kit_GetPlayerInfo (m_player, pinfo);
Kit_PlayerInfo info;
Kit_GetPlayerInfo (m_player, &info);
SDL_AudioSpec wanted_spec, audio_spec;
SDL_memset (&wanted_spec, 0, sizeof (wanted_spec));
wanted_spec.freq = pinfo->audio.samplerate;
wanted_spec.format = pinfo->audio.format;
wanted_spec.channels = pinfo->audio.channels;
wanted_spec.freq = info.audio.samplerate;
wanted_spec.format = info.audio.format;
wanted_spec.channels = info.audio.channels;
m_audioDev = SDL_OpenAudioDevice (nullptr, 0, &wanted_spec, &audio_spec, 0);
SDL_PauseAudioDevice (m_audioDev, 0);
m_videoTex = SDL_CreateTexture (
g_renderer, pinfo->video.format, SDL_TEXTUREACCESS_STATIC,
pinfo->video.width, pinfo->video.height);
g_renderer, info.video.format, SDL_TEXTUREACCESS_TARGET, info.video.width,
info.video.height);
if (m_videoTex == nullptr)
return false;
@ -145,7 +146,10 @@ CMovie::playMovie ()
// play/pause the AVI movie
if (m_fPlaying)
{
this->starting = true;
Kit_PlayerPlay (m_player);
}
else
Kit_PlayerPause (m_player);
}
@ -159,7 +163,6 @@ CMovie::CMovie ()
m_movie = nullptr;
m_player = nullptr;
m_videoTex = nullptr;
pinfo = nullptr;
memset (m_audiobuf, 0, sizeof (m_audiobuf));
@ -207,11 +210,12 @@ CMovie::IsExist (const std::string & pFilename)
// Montre un film avi.
bool
CMovie::Play (Rect rect, const std::string & pFilename)
CMovie::Play (const std::string & pFilename)
{
if (!m_bEnable)
return false;
if (!fileOpenMovie (rect, pFilename))
if (!fileOpenMovie (pFilename))
return false;
playMovie ();
@ -289,6 +293,15 @@ CMovie::Render ()
SDL_SetRenderDrawColor (g_renderer, 0, 0, 0, 255);
SDL_RenderClear (g_renderer);
if (this->starting)
{
SDL_SetRenderTarget (g_renderer, m_videoTex);
SDL_SetRenderDrawColor (g_renderer, 0, 0, 0, 255);
SDL_RenderClear (g_renderer);
SDL_SetRenderTarget (g_renderer, nullptr);
this->starting = false;
}
// Refresh videotexture and render it
Kit_GetVideoData (m_player, m_videoTex);
SDL_RenderCopy (g_renderer, m_videoTex, nullptr, nullptr);

View File

@ -38,7 +38,7 @@ public:
bool Create ();
bool GetEnable ();
bool IsExist (const std::string & pFilename);
bool Play (Rect rect, const std::string & pFilename);
bool Play (const std::string & pFilename);
void Stop ();
void Pause ();
void Resume ();
@ -46,13 +46,12 @@ public:
protected:
void playMovie ();
bool fileOpenMovie (Rect rect, const std::string & pFilename);
bool fileOpenMovie (const std::string & pFilename);
void fileCloseMovie ();
void termAVI ();
bool initAVI ();
protected:
Kit_PlayerInfo * pinfo;
Kit_Source * m_movie;
Kit_Player * m_player;
SDL_Texture * m_videoTex;
@ -61,6 +60,7 @@ protected:
char m_audiobuf[AUDIOBUFFER_SIZE];
bool m_bEnable;
bool starting;
bool m_fPlaying; // Play flag: true == playing, false == paused
bool m_fMovieOpen; // Open flag: true == movie open, false = none
};

View File

@ -2228,17 +2228,17 @@ CDecor::DirectSearch (Point cel, Point goal)
{
if (dir.y > 0)
{
direct = DIRECT_SO;
direct = DIRECT_SW;
if (tan < 41)
direct = DIRECT_O;
direct = DIRECT_W;
if (tan > 241)
direct = DIRECT_S;
}
else
{
direct = DIRECT_NO;
direct = DIRECT_NW;
if (tan < 41)
direct = DIRECT_O;
direct = DIRECT_W;
if (tan > 241)
direct = DIRECT_N;
}
@ -3724,7 +3724,7 @@ CDecor::IsBuildBateau (Point cel, Sint32 & direct)
fChannel == CHFLOOR && fIcon == 4 && // rivage ?
oChannel == -1 && oIcon == -1)
{
direct = DIRECT_O;
direct = DIRECT_W;
return true;
}

View File

@ -373,8 +373,7 @@ CPixmap::IsIconPixel (size_t channel, Sint32 rank, Point pos)
// Les modes sont 0=transparent, 1=opaque.
bool
CPixmap::DrawIcon (
Sint32 chDst, size_t channel, Sint32 rank, Point pos, bool bMask)
CPixmap::DrawIcon (Sint32 chDst, size_t channel, Sint32 rank, Point pos)
{
Sint32 nbx, nby;
Rect rect;
@ -411,8 +410,7 @@ CPixmap::DrawIcon (
// 33,48 35,49
bool
CPixmap::DrawIconDemi (
Sint32 chDst, size_t channel, Sint32 rank, Point pos, bool bMask)
CPixmap::DrawIconDemi (Sint32 chDst, size_t channel, Sint32 rank, Point pos)
{
Sint32 nbx, nby;
Rect rect;
@ -445,7 +443,7 @@ CPixmap::DrawIconDemi (
bool
CPixmap::DrawIconPart (
Sint32 chDst, size_t channel, Sint32 rank, Point pos, Sint32 startY,
Sint32 endY, bool bMask)
Sint32 endY)
{
Sint32 nbx, nby;
Rect rect;
@ -477,8 +475,7 @@ CPixmap::DrawIconPart (
// Dessine une partie d'image n'importe o�.
bool
CPixmap::DrawPart (
Sint32 chDst, size_t channel, Point dest, Rect rect, bool bMask)
CPixmap::DrawPart (Sint32 chDst, size_t channel, Point dest, Rect rect)
{
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
@ -770,7 +767,7 @@ CPixmap::GetCursorRect (MouseSprites sprite)
}
void
CPixmap::LoadCursors ()
CPixmap::LoadCursors (Uint8 scale)
{
Uint32 rmask, gmask, bmask, amask;
@ -791,16 +788,20 @@ on the endianness (byte order) of the machine */
for (int i = SPRITE_BEGIN; i <= SPRITE_END; ++i)
{
MouseSprites sprite = static_cast<MouseSprites> (i);
if (m_lpSDLCursors[sprite - 1])
SDL_FreeCursor (m_lpSDLCursors[sprite - 1]);
SDL_Point hotspot = this->GetCursorHotSpot (sprite);
SDL_Rect rect = this->GetCursorRect (sprite);
SDL_Surface * surface =
SDL_CreateRGBSurface (0, rect.w, rect.h, 32, rmask, gmask, bmask, amask);
SDL_BlitSurface (m_lpSDLBlupi, &rect, surface, nullptr);
SDL_Surface * surface = SDL_CreateRGBSurface (
0, rect.w * scale, rect.h * scale, 32, rmask, gmask, bmask, amask);
SDL_BlitScaled (m_lpSDLBlupi, &rect, surface, nullptr);
// FIXME: change cursor first value to 0
m_lpSDLCursors[sprite - 1] =
SDL_CreateColorCursor (surface, hotspot.x, hotspot.y);
SDL_CreateColorCursor (surface, hotspot.x * scale, hotspot.y * scale);
SDL_FreeSurface (surface);
}
}

View File

@ -66,15 +66,12 @@ public:
bool IsIconPixel (size_t channel, Sint32 rank, Point pos);
bool DrawIcon (
Sint32 chDst, size_t channel, Sint32 rank, Point pos, bool bMask = false);
bool DrawIconDemi (
Sint32 chDst, size_t channel, Sint32 rank, Point pos, bool bMask = false);
bool DrawIcon (Sint32 chDst, size_t channel, Sint32 rank, Point pos);
bool DrawIconDemi (Sint32 chDst, size_t channel, Sint32 rank, Point pos);
bool DrawIconPart (
Sint32 chDst, size_t channel, Sint32 rank, Point pos, Sint32 startY,
Sint32 endY, bool bMask = false);
bool DrawPart (
Sint32 chDst, size_t channel, Point dest, Rect rect, bool bMask = false);
Sint32 endY);
bool DrawPart (Sint32 chDst, size_t channel, Point dest, Rect rect);
bool DrawImage (Sint32 chDst, size_t channel, Rect rect);
bool BuildIconMask (
@ -85,7 +82,7 @@ public:
void SetMouseSprite (MouseSprites sprite);
void MouseShow (bool bShow);
void LoadCursors ();
void LoadCursors (Uint8 scale);
void ChangeSprite (MouseSprites sprite);
protected:

View File

@ -72,7 +72,7 @@ CJauge::Draw ()
rect.right = m_pos.x + m_dim.x;
rect.top = m_pos.y;
rect.bottom = m_pos.y + m_dim.y;
m_pPixmap->DrawPart (-1, CHBACK, m_pos, rect, 1); // dessine le fond
m_pPixmap->DrawPart (-1, CHBACK, m_pos, rect); // dessine le fond
return;
}

View File

@ -28,13 +28,16 @@
// Stops all sounds.
bool
CSound::StopAllSounds (bool immediat)
CSound::StopAllSounds (bool immediat, const std::set<Sint32> * except)
{
for (Sint32 i = 0; i < MAXSOUND; i++)
{
if (!m_lpSDL[i])
continue;
if (except && except->find (i) != except->end ())
continue;
if (Mix_Playing (i + 1) == SDL_TRUE)
{
if (immediat)

View File

@ -20,11 +20,13 @@
#pragma once
#include <SDL2/SDL_mixer.h>
#include <set>
#include <stdio.h>
#include <string>
#include <vector>
#include <SDL2/SDL_mixer.h>
#include "blupi.h"
#define MAXSOUND 100
@ -63,7 +65,7 @@ public:
bool IsStoppedOnDemand ();
void AdaptVolumeMusic ();
void SetSuspendSkip (Sint32 nb);
bool StopAllSounds (bool immediat);
bool StopAllSounds (bool immediat, const std::set<Sint32> * except = nullptr);
protected:
bool m_bState;
@ -78,5 +80,3 @@ protected:
Sint32 m_lastMidiVolume;
Sint32 m_nbSuspendSkip;
};
/////////////////////////////////////////////////////////////////////////////

View File

@ -35,22 +35,25 @@
static Sint32
GetOffset (const char *& c)
{
/* clang-format off */
static const unsigned char table_accents[] = {
/* ü à â é è ë ê ï */
/* 0xFC, 0xE0, 0xE2, 0xE9, 0xE8, 0xEB, 0xEA, 0xEF, // CP1252 */
0xBC, 0xA0, 0xA2, 0xA9, 0xA8, 0xAB, 0xAA, 0xAF, // UTF-8
/* î ô ù û ä ö ç */
/* 0xEE, 0xF4, 0xF9, 0xFB, 0xE4, 0xF6, 0xE7, // CP1252 */
0xAE, 0xB4, 0xB9, 0xBB, 0xA4, 0xB6, 0xA7, // UTF-8
/* ü à â é è ë ê ï */
0xBC, 0xA0, 0xA2, 0xA9, 0xA8, 0xAB, 0xAA, 0xAF, /* UTF-8 */
/* î ô ù û ä ö ç */
0xAE, 0xB4, 0xB9, 0xBB, 0xA4, 0xB6, 0xA7, /* UTF-8 */
};
static const unsigned char table_accents_pl[] = {
/* Polish */
/* ń * ó ę * ć * * */
0x84, 0xFF, 0xB3, 0x99, 0xFF, 0x87, 0xFF, 0xFF, // UTF-8
/* ź ż * * ą ł ś */
0xBA, 0xBC, 0xFF, 0xFF, 0x85, 0x82, 0x9B, // UTF-8
static const unsigned char table_extended[] = {
/* Italian */
/* ò ì */
0xB2, 0xAC, /* UTF-8 */
/* Polish */
/* ń ó ę ć ź ż */
0x84, 0xB3, 0x99, 0x87, 0xBA, 0xBC, /* UTF-8 */
/* ą ł ś */
0x85, 0x82, 0x9B, /* UTF-8 */
};
/* clang-format on */
if (static_cast<unsigned char> (*c) == 0xC3)
c++;
@ -59,21 +62,20 @@ GetOffset (const char *& c)
if (static_cast<unsigned char> (*c) == 0xC5)
c++;
if(GetLocale() == "pl") {
for (unsigned int i = 0; i < countof (table_accents_pl); ++i)
{
if ((unsigned char) *c == table_accents_pl[i])
return 15 + i;
}
}
else
if (GetLocale() != "pl")
{
// Do not use the 'standard' accents table with Polish locale
// This is required because we check only last byte of UTF-8 and some characters overlap
// TODO: In the future, this ugly hack should be replaced with proper UTF-8 parsing
for (unsigned int i = 0; i < countof (table_accents); ++i)
{
if ((unsigned char) *c == table_accents[i])
return 15 + i;
}
}
for (unsigned int i = 0; i < countof (table_extended); ++i)
if ((unsigned char) *c == table_extended[i])
return 127 + i;
if (*c < 0)
return 1; // square
@ -100,7 +102,8 @@ GetCharWidth (const char *& c, Sint32 font)
12, 8, 9, 9, 9, 8, 8, 8, 9, 4, 8, 9, 8, 10, 9, 9,
8, 9, 8, 9, 10, 8, 9, 11, 9, 8, 10, 7, 10, 7, 13, 13,
9, 9, 8, 8, 8, 8, 6, 8, 8, 4, 6, 8, 4, 12, 8, 8,
8, 8, 7, 6, 7, 8, 8, 10, 8, 8, 7, 6, 6, 6, 10, 0,
8, 8, 7, 6, 7, 8, 8, 10, 8, 8, 7, 6, 6, 6, 10, 8,
5, 8, 8, 8, 8, 8, 7, 9, 6, 7
};
static const unsigned char table_width_little[] =
@ -112,7 +115,8 @@ GetCharWidth (const char *& c, Sint32 font)
9, 8, 6, 7, 7, 5, 5, 8, 7, 2, 4, 7, 5, 10, 7, 8,
6, 8, 7, 6, 6, 6, 8, 12, 7, 6, 6, 3, 5, 3, 6, 8,
4, 6, 6, 6, 6, 6, 4, 6, 6, 2, 3, 5, 2, 10, 6, 6,
6, 6, 3, 5, 3, 6, 6, 8, 6, 6, 5, 4, 6, 4, 7, 0,
6, 6, 3, 5, 3, 6, 6, 8, 6, 6, 5, 4, 6, 4, 7, 6,
3, 5, 5, 5, 5, 4, 4, 6, 3, 4
};
// clang-format on
@ -141,7 +145,7 @@ DrawText (CPixmap * pPixmap, Point pos, const char * pText, Sint32 font)
if (font != FONTLITTLE)
{
rank += 128 * font;
rank += (128 + 16) * font;
pPixmap->DrawIcon (-1, CHTEXT, rank, pos);
}
else
@ -165,7 +169,7 @@ DrawTextPente (
while (*pText != 0)
{
rank = GetOffset (pText);
rank += 128 * font;
rank += (128 + 16) * font;
pPixmap->DrawIcon (-1, CHTEXT, rank, pos);
lg = GetCharWidth (pText, font);