diff --git a/.editorconfig b/.editorconfig index 3c0aacdf0..393f23da7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,7 +11,7 @@ insert_final_newline = true indent_style = space indent_size = 4 -[*.{sh,rb,js,yml,adoc}] +[*.{sh,rb,js,yml,yaml,adoc}] indent_style = space indent_size = 2 diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 000000000..87c3c71d5 --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,62 @@ +name: Lint Files + +on: + push: + pull_request: + +jobs: + lint: + name: YAML, CMake & Markdown + runs-on: ubuntu-latest + steps: + - name: Clone Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install tools + run: | + pip install yamllint + pip install cmakelint + + - uses: tj-actions/changed-files@v46 + if: '!cancelled()' + id: changed-files-yaml + with: + files: | + **/*.yaml + **/*.yml + - name: Lint YAML files + if: steps.changed-files-yaml.outputs.any_changed == 'true' + run: | + yamllint -d "{extends: relaxed, rules: {line-length: {max: 100}}}" \ + ${{ steps.changed-files-yaml.outputs.all_changed_files }} + # we often have extra long lines, so relaxing the check (from 80) + + - uses: tj-actions/changed-files@v46 + if: '!cancelled()' + id: changed-files-cmake + with: + files: | + **/*.cmake + **/CMakeLists.txt + - name: Lint CMake files + if: steps.changed-files-cmake.outputs.any_changed == 'true' + run: | + cmakelint --filter=-whitespace/tabs --linelength=120 \ + ${{ steps.changed-files-cmake.outputs.all_changed_files }} + # we often have extra long lines, so relaxing the check (from 80) + # also do not warn about tabstops + + - uses: tj-actions/changed-files@v46 + if: '!cancelled()' + id: changed-files-md + with: + files: '**/*.md' + separator: "," + - name: Lint Markdown files + if: steps.changed-files-md.outputs.any_changed == 'true' + uses: DavidAnson/markdownlint-cli2-action@v19 + with: + globs: ${{ steps.changed-files-md.outputs.all_changed_files }} + separator: "," diff --git a/.github/workflows/pr_labels.yml b/.github/workflows/pr_labels.yml index e4d84c449..9c318344e 100644 --- a/.github/workflows/pr_labels.yml +++ b/.github/workflows/pr_labels.yml @@ -15,10 +15,10 @@ jobs: - name: Clone repository uses: actions/checkout@v4 with: - # pull_request_target is run under forks, use main repo source - fetch-depth: 0 - repository: EasyRPG/Player - ref: master + # pull_request_target is run under forks, use main repo source + fetch-depth: 0 + repository: EasyRPG/Player + ref: master - name: Update labels uses: actions/labeler@v5 diff --git a/.github/workflows/stable-compilation.yml b/.github/workflows/stable-compilation.yml index cd76d692e..6e0193421 100644 --- a/.github/workflows/stable-compilation.yml +++ b/.github/workflows/stable-compilation.yml @@ -19,8 +19,8 @@ defaults: jobs: docker: - name: ${{ matrix.image }} - runs-on: ubuntu-latest + name: ${{ matrix.image }} (${{ matrix.os.arch }}) + runs-on: ${{ matrix.os.name }} container: image: ${{ matrix.image }} @@ -30,10 +30,22 @@ jobs: image: # version of: # CMake | g++ | SDL | support end # # ------------------------------------------------------------- - - ubuntu:20.04 # 3.16.3 | 9.3.0 | 2.0.10 | LTS (4/25) # - debian:11 # 3.18.4 | 10.2.1 | 2.0.14 | oldstable (8/24) # - - ubuntu:22.04 # 3.22.1 | 11.2.0 | 2.0.20 | LTS (6/27) # + - ubuntu:22.04 # 3.22.1 | 11.2.0 | 2.0.20 | LTS (4/27) # - debian:12 # 3.25.1 | 12.2.0 | 2.26.5 | stable (6/26) # + - ubuntu:24.04 # 3.28.3 | 13.2.0 | 2.30.0 | LTS (4/29) # + os: + - arch: x86_64 + name: ubuntu-latest + - arch: arm64 + name: ubuntu-24.04-arm + exclude: + - os: + arch: arm64 + image: debian:11 + - os: + arch: arm64 + image: ubuntu:22.04 steps: - name: Install dependencies @@ -45,7 +57,7 @@ jobs: libicu-dev libexpat1-dev libinih-dev nlohmann-json3-dev \ libsdl2-dev libpng-dev libpixman-1-dev libfmt-dev \ libfreetype6-dev libharfbuzz-dev libmpg123-dev libsndfile-dev \ - libvorbis-dev libopusfile-dev libspeexdsp-dev \ + libvorbis-dev libopusfile-dev libspeexdsp-dev liblhasa-dev \ libdrm-dev libgbm-dev # only needed for sdl2 on debian 11 - name: Clone Repository diff --git a/CMakeLists.txt b/CMakeLists.txt index f50f014af..e996fa32c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,9 @@ -cmake_minimum_required(VERSION 3.16...3.31 FATAL_ERROR) +cmake_minimum_required(VERSION 3.18...3.31 FATAL_ERROR) -project(EasyRPG_Player VERSION 0.8 +project(EasyRPG_Player VERSION 0.8.1 DESCRIPTION "Interpreter for RPG Maker 2000/2003 games" HOMEPAGE_URL "https://easyrpg.org" - LANGUAGES CXX) + LANGUAGES C CXX) # Extra CMake Module files list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/builds/cmake/Modules") @@ -13,6 +13,8 @@ include(PlayerFindPackage) include(PlayerBuildType) include(PlayerMisc) include(GetGitRevisionDescription) +include(CheckCSourceCompiles) +include(FetchContent) # Dependencies provided by CMake Presets option(PLAYER_FIND_ROOT_PATH_APPEND "When enabled the items from CMAKE_PREFIX_PATH are added to CMAKE_FIND_ROOT_PATH. Works around problematic CMake Toolchain files" OFF) @@ -68,8 +70,6 @@ add_library(${PROJECT_NAME} OBJECT src/baseui.h src/battle_animation.cpp src/battle_animation.h - src/battle_message.cpp - src/battle_message.h src/bitmap.cpp src/bitmapfont.h src/bitmapfont_glyph.h @@ -192,6 +192,8 @@ add_library(${PROJECT_NAME} OBJECT src/game_map.h src/game_message.cpp src/game_message.h + src/game_message_terms.cpp + src/game_message_terms.h src/game_party_base.cpp src/game_party_base.h src/game_party.cpp @@ -237,6 +239,10 @@ add_library(${PROJECT_NAME} OBJECT src/image_png.h src/image_xyz.cpp src/image_xyz.h + src/image_webp.cpp + src/image_webp.h + src/image_gif.cpp + src/image_gif.h src/input_buttons_desktop.cpp src/input_buttons.h src/input.cpp @@ -500,8 +506,34 @@ target_sources(${PROJECT_NAME} PRIVATE src/multiplayer/playerother.h src/multiplayer/playerother.cpp src/external/TinySHA1.hpp + src/icons.h + src/icons.cpp + src/multiplayer/overlay_utils.h + + # to be upstreamed + src/window_stringinput.h + src/window_stringinput.cpp ) +if(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + target_sources(${PROJECT_NAME} PRIVATE + src/multiplayer/chat_overlay.h + src/multiplayer/chat_overlay.cpp + src/multiplayer/status_overlay.h + src/multiplayer/status_overlay.cpp + src/multiplayer/scene_overlay.h + src/multiplayer/scene_overlay.cpp + src/multiplayer/scene_online.h + src/multiplayer/scene_online.cpp + src/multiplayer/scene_nexus.h + src/multiplayer/scene_nexus.cpp + src/multiplayer/webview.h + ) + if(WIN32) + target_link_libraries(${PROJECT_NAME} synchronization) # provides WaitOnAddress + endif() +endif() + include(CMakeDependentOption) # Include directories @@ -594,6 +626,33 @@ endif() set(PLAYER_BUILD_EXECUTABLE ON) set(PLAYER_TEST_LIBRARIES ${PROJECT_NAME}) +set(PLAYER_SHELL "none" CACHE STRING "Optional UI shell, options: none yno") +set_property(CACHE PLAYER_SHELL PROPERTY STRINGS none yno) + +if(${PLAYER_SHELL} STREQUAL "yno") + set(PLAYER_YNO TRUE) + target_compile_definitions(${PROJECT_NAME} PUBLIC PLAYER_YNO) + + #player_find_package(NAME wxWidgets REQUIRED) + #target_link_libraries(${PROJECT_NAME} wx::core wx::base) + #find_package(unofficial-webview2 CONFIG REQUIRED) + #target_link_libraries(${PROJECT_NAME} unofficial::webview2::webview2) + FetchContent_Declare(webview + GIT_REPOSITORY https://github.com/webview/webview + GIT_TAG 0.12.0) + FetchContent_MakeAvailable(webview) + target_link_libraries(${PROJECT_NAME} webview::core) + + player_find_package(NAME GIF TARGET GIF::GIF REQUIRED) + find_package(WebP CONFIG REQUIRED) + target_link_libraries(${PROJECT_NAME} WebP::webp WebP::webpdecoder WebP::webpdemux) + +elseif(${PLAYER_SHELL} STREQUAL "none") + # do nothing +else() + message(FATAL_ERROR "Invalid shell ${PLAYER_SHELL}") +endif() + if(ANDROID AND PLAYER_GRADLE_BUILD) # Build invoked by Gradle # Ugly: Gradle has no way to branch based on the ABI @@ -629,11 +688,12 @@ elseif(PLAYER_TARGET_PLATFORM STREQUAL "SDL2") # SDL2 depends on some systems on SDL2::SDL2main but SDL2::SDL2 is not always a dependency of it # Manually add the dependencies player_find_package(NAME SDL2 - VERSION 2.0.5 + VERSION 2.0.14 TARGET SDL2::SDL2 REQUIRED) - if(TARGET SDL2::SDL2main) + if(TARGET SDL2::SDL2main #AND ${PLAYER_SHELL} STREQUAL "none" + ) target_link_libraries(${PROJECT_NAME} SDL2::SDL2main) endif() @@ -801,6 +861,10 @@ endif() # Shared by homebrew platforms if(NINTENDO_3DS OR NINTENDO_WII OR NINTENDO_WIIU OR NINTENDO_WIIU OR NINTENDO_SWITCH OR VITA) target_compile_options(${PROJECT_NAME} PUBLIC -fno-exceptions -fno-rtti) + if(VITA) + # This optimisation is unstable on Vita (crashes at the end of MainLoop) + target_compile_options(${PROJECT_NAME} PUBLIC -fno-optimize-sibling-calls) + endif() set(CMAKE_DL_LIBS "") # hack4icu! set(PLAYER_ENABLE_TESTS OFF) option(PLAYER_VERSIONED_PACKAGES "Create zip packages with versioned name (for internal use)" ON) @@ -889,6 +953,7 @@ endif() if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") option(PLAYER_JS_BUILD_SHELL "Build the Player executable as a shell file (.html) instead of a standalone javascript file (.js)" OFF) + option(PLAYER_JS_AUDIO_WORKLETS "Use the newer Web Audio API instead of the built-in support from SDL2" OFF) set(PLAYER_JS_GAME_URL "games/" CACHE STRING "Game URL/directory where the web player searches for games") set(PLAYER_JS_OUTPUT_NAME "easyrpg-player" CACHE STRING "Output name of the js, html and wasm files") set_property(SOURCE src/async_handler.cpp APPEND PROPERTY COMPILE_DEFINITIONS "EM_GAME_URL=\"${PLAYER_JS_GAME_URL}\"") @@ -942,7 +1007,7 @@ if(PLAYER_BUILD_LIBLCF) target_link_libraries(${PROJECT_NAME} lcf) else() # Use system package - player_find_package(NAME liblcf VERSION 0.8 + player_find_package(NAME liblcf VERSION 0.8.1 TARGET liblcf::liblcf REQUIRED) endif() @@ -1009,6 +1074,37 @@ else() TARGET nlohmann_json::nlohmann_json ONLY_CONFIG ) + + find_package(Libwebsockets CONFIG REQUIRED) + # require_lws_config(LWS_ROLE_H1 1 requirements) + # require_lws_config(LWS_WITHOUT_CLIENT 0 requirements) + # require_lws_config(LWS_WITH_TLS 1 requirements) + + # uses system trust store + # require_lws_config(LWS_WITH_MBEDTLS 0 requirements) + # require_lws_config(LWS_WITH_WOLFSSL 0 requirements) + # require_lws_config(LWS_WITH_CYASSL 0 requirements) + + if(websockets_shared) + target_link_libraries(${PROJECT_NAME} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} websockets_shared) + else() + target_link_libraries(${PROJECT_NAME} websockets ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + + #find_package(websocketpp REQUIRED) + #add_dependencies(${PROJECT_NAME} websocketpp::websocketpp) + #find_package(httplib CONFIG REQUIRED) + #target_link_libraries(${PROJECT_NAME} httplib::httplib) + find_package(cpr CONFIG) + if(NOT cpr_FOUND) + include(FetchContent) + FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git + GIT_TAG dec9422db3af470641f8b0d90e4b451c4daebf64) # Replace with your desired git commit from: https://github.com/libcpr/cpr/releases + + FetchContent_MakeAvailable(cpr) + endif() + target_link_libraries(${PROJECT_NAME} cpr::cpr) endif() # Configure Audio backends @@ -1192,6 +1288,8 @@ if(PLAYER_BUILD_EXECUTABLE AND ${PLAYER_TARGET_PLATFORM} MATCHES "^SDL.*$" AND N set(EXE_NAME ${PROJECT_NAME}_exe) if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") add_executable(${EXE_NAME} "src/platform/emscripten/main.cpp") + #elseif(PLAYER_YNO) + #add_executable(${EXE_NAME} "src/platform/ynoshell/main.cpp") else() add_executable(${EXE_NAME} "src/platform/sdl/main.cpp") endif() @@ -1200,7 +1298,8 @@ if(PLAYER_BUILD_EXECUTABLE AND ${PLAYER_TARGET_PLATFORM} MATCHES "^SDL.*$" AND N if(WIN32) # Open console for Debug builds - set_target_properties(${EXE_NAME} PROPERTIES WIN32_EXECUTABLE $<$>:TRUE>) + #set_target_properties(${EXE_NAME} PROPERTIES WIN32_EXECUTABLE $<$>:TRUE>) + set_target_properties(${EXE_NAME} PROPERTIES WIN32_EXECUTABLE FALSE) # Add resources string(REPLACE "." "," RC_VERSION ${PROJECT_VERSION}) @@ -1215,6 +1314,7 @@ if(PLAYER_BUILD_EXECUTABLE AND ${PLAYER_TARGET_PLATFORM} MATCHES "^SDL.*$" AND N # Change executable name set_target_properties(${EXE_NAME} PROPERTIES OUTPUT_NAME "Player") + target_link_libraries(${EXE_NAME} dbghelp) endif() target_link_libraries(${EXE_NAME} ${PROJECT_NAME}) @@ -1223,6 +1323,9 @@ if(PLAYER_BUILD_EXECUTABLE AND ${PLAYER_TARGET_PLATFORM} MATCHES "^SDL.*$" AND N # Do not confuse this with our own -DUSE_SDL # Prevent Emscripten from pulling in bundled SDL headers that break the build target_compile_options(${PROJECT_NAME} PUBLIC "-sUSE_SDL=0") + if(PLAYER_JS_AUDIO_WORKLETS) + target_compile_options(${PROJECT_NAME} PUBLIC "-pthread") + endif() set(PLAYER_JS_PREJS "${CMAKE_CURRENT_SOURCE_DIR}/resources/emscripten/emscripten-pre.js") set(PLAYER_JS_POSTJS "${CMAKE_CURRENT_SOURCE_DIR}/resources/emscripten/emscripten-post.js") @@ -1232,9 +1335,7 @@ if(PLAYER_BUILD_EXECUTABLE AND ${PLAYER_TARGET_PLATFORM} MATCHES "^SDL.*$" AND N "-sALLOW_MEMORY_GROWTH -sMINIFY_HTML=0 -sMODULARIZE -sEXPORT_NAME=createEasyRpgPlayer \ -sEXIT_RUNTIME --bind --pre-js ${PLAYER_JS_PREJS} --post-js ${PLAYER_JS_POSTJS} \ -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE=['$autoResumeAudioContext','$dynCall'] \ - -sEXPORTED_FUNCTIONS=_main,_malloc,_free \ - -sEXPORTED_RUNTIME_METHODS=['FS'] \ - -sGL_ENABLE_GET_PROC_ADDRESS") + -sEXPORTED_FUNCTIONS=_main,_malloc,_free") set_source_files_properties("src/platform/sdl/main.cpp" PROPERTIES OBJECT_DEPENDS "${PLAYER_JS_PREJS};${PLAYER_JS_POSTJS};${PLAYER_JS_SHELL}") @@ -1243,16 +1344,27 @@ if(PLAYER_BUILD_EXECUTABLE AND ${PLAYER_TARGET_PLATFORM} MATCHES "^SDL.*$" AND N set_property(TARGET ${EXE_NAME} APPEND_STRING PROPERTY LINK_FLAGS " --shell-file ${PLAYER_JS_SHELL}") endif() + if(PLAYER_JS_AUDIO_WORKLETS) + set_property(TARGET ${EXE_NAME} APPEND_STRING PROPERTY LINK_FLAGS + " -sINITIAL_MEMORY=67108864 -sAUDIO_WORKLET -sWASM_WORKERS -sUSE_PTHREADS -sPTHREAD_POOL_SIZE=1 -sPTHREAD_POOL_SIZE_STRICT=2") + endif() + target_compile_options(${PROJECT_NAME} PUBLIC -fno-exceptions) target_sources(${PROJECT_NAME} PRIVATE src/platform/emscripten/clock.h src/platform/emscripten/interface.cpp src/platform/emscripten/interface.h) + if(PLAYER_JS_AUDIO_WORKLETS) + target_sources(${PROJECT_NAME} PRIVATE + src/platform/emscripten/audio.h + src/platform/emscripten/audio.cpp) + endif() target_link_libraries(${EXE_NAME} "idbfs.js") target_link_libraries(${EXE_NAME} "websocket.js") - set_property(TARGET ${EXE_NAME} APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORTED_RUNTIME_METHODS='[\"ccall\",\"cwrap\",\"intArrayFromString\",\"ALLOC_NORMAL\",\"allocate\",\"getValue\"]'") + target_link_libraries(${EXE_NAME} "wasmfs_fetch.js") + set_property(TARGET ${EXE_NAME} APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORTED_RUNTIME_METHODS='[\"ccall\",\"cwrap\",\"intArrayFromString\",\"ALLOC_NORMAL\",\"allocate\",\"getValue\",\"FS\"]'") set_target_properties(${EXE_NAME} PROPERTIES OUTPUT_NAME "${PLAYER_JS_OUTPUT_NAME}") endif() @@ -1704,3 +1816,35 @@ if (${PLAYER_TARGET_PLATFORM} STREQUAL "SDL1") message(WARNING "SDL1 is deprecated!") message(WARNING "Please migrate to SDL2 or SDL3!") endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + execute_process(COMMAND ${CMAKE_CXX_COMPILER} --cflags + OUTPUT_VARIABLE EM_CFLAGS + COMMAND_ERROR_IS_FATAL ANY + ) + string(STRIP "${EM_CFLAGS}" EM_CFLAGS) + find_package(Python3 REQUIRED) + message("Python: ${Python3_EXECUTABLE}") + set(ENV{EXTRA_FLAGS} "${EM_CFLAGS}") + execute_process( + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/fix_compile_commands.py + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + execute_process(COMMAND ${CMAKE_CXX_COMPILER} --cflags + OUTPUT_VARIABLE EM_CFLAGS + COMMAND_ERROR_IS_FATAL ANY + ) + string(STRIP "${EM_CFLAGS}" EM_CFLAGS) + find_package(Python3 REQUIRED) + message("Python: ${Python3_EXECUTABLE}") + set(ENV{EXTRA_FLAGS} "${EM_CFLAGS}") + execute_process( + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/fix_compile_commands.py + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) +endif() diff --git a/CMakePresets.json b/CMakePresets.json index 0fbb5ae34..ecefc9459 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -294,6 +294,22 @@ "type-release" ] }, + { + "name": "linux-ynoshell-relwithdebinfo", + "displayName": "Linux (ynoshell, RelWithDebInfo)", + "inherits": "linux-relwithdebinfo", + "cacheVariables": { + "PLAYER_SHELL": "yno" + } + }, + { + "name": "linux-ynoshell-release", + "displayName": "Linux (ynoshell, Release)", + "inherits": "linux-release", + "cacheVariables": { + "PLAYER_SHELL": "yno" + } + }, { "name": "windows-parent", "cacheVariables": { @@ -637,6 +653,54 @@ "type-release" ] }, + { + "name": "windows-x64-vs2022-ynoshell-debug", + "displayName": "Windows (x64) using Visual Studio 2022 (ynoshell) (Debug)", + "inherits": "windows-x64-vs2022-debug", + "cacheVariables": { + "PLAYER_SHELL": "yno" + } + }, + { + "name": "windows-x64-vs2022-ynoshell-release", + "displayName": "Windows (x64) using Visual Studio 2022 (ynoshell) (Release)", + "inherits": "windows-x64-vs2022-release", + "cacheVariables": { + "PLAYER_SHELL": "yno" + } + }, + { + "name": "windows-x64-vs2022-ynoshell-relwithdebinfo", + "displayName": "Windows (x64) using Visual Studio 2022 (ynoshell) (RelWithDebInfo)", + "inherits": "windows-x64-vs2022-relwithdebinfo", + "cacheVariables": { + "PLAYER_SHELL": "yno" + } + }, + { + "name": "ynoshell-parent", + "hidden": true, + "cacheVariables": { + "PLAYER_SHELL": "yno", + "VCPKG_CHAINLOAD_TOOLCHAIN_FILE": "${sourceDir}/builds/cmake/Windows.MSVC.toolchain.cmake" + } + }, + { + "name": "windows-ynoshell-release", + "displayName": "Windows (ynoshell) (Release)", + "inherits": [ + "ynoshell-parent", + "windows-release" + ] + }, + { + "name": "windows-ynoshell-relwithdebinfo", + "displayName": "Windows (ynoshell) (RelWithDebInfo)", + "inherits": [ + "ynoshell-parent", + "windows-relwithdebinfo" + ] + }, { "name": "macos-parent", "cacheVariables": { @@ -1541,11 +1605,13 @@ }, { "name": "windows-relwithdebinfo", - "configurePreset": "windows-relwithdebinfo" + "configurePreset": "windows-relwithdebinfo", + "configuration": "RelWithDebInfo" }, { "name": "windows-release", - "configurePreset": "windows-release" + "configurePreset": "windows-release", + "configuration": "Release" }, { "name": "windows-sdl3-debug", @@ -1679,6 +1745,11 @@ "name": "windows-x64-vs2022-libretro-release", "configurePreset": "windows-x64-vs2022-libretro-release" }, + { + "name": "windows-x64-vs2022-ynoshell-release", + "configurePreset": "windows-x64-vs2022-ynoshell-release", + "configuration": "RelWithDebInfo" + }, { "name": "macos-debug", "configurePreset": "macos-debug" @@ -1993,4 +2064,4 @@ } ], "testPresets": [] -} +} \ No newline at end of file diff --git a/Makefile.am b/Makefile.am index 63fc20c3b..da211087c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -42,8 +42,6 @@ libeasyrpg_player_a_SOURCES = \ src/baseui.h \ src/battle_animation.cpp \ src/battle_animation.h \ - src/battle_message.cpp \ - src/battle_message.h \ src/bitmap.cpp \ src/bitmap.h \ src/bitmapfont.h \ @@ -168,6 +166,8 @@ libeasyrpg_player_a_SOURCES = \ src/game_map.h \ src/game_message.cpp \ src/game_message.h \ + src/game_message_terms.cpp \ + src/game_message_terms.h \ src/game_party.cpp \ src/game_party.h \ src/game_party_base.cpp \ diff --git a/README.md b/README.md index 1e00cf95a..7bf1af6f4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Documentation is available at the documentation wiki: https://wiki.easyrpg.org ### minimal / required - [liblcf] for RPG Maker data reading. -- SDL3 or SDL2 >= 2.0.5 for screen backend support. +- SDL3 or SDL2 >= 2.0.14 for screen backend support. - Pixman for low level pixel manipulation. - libpng for PNG image support. - zlib for XYZ image and ZIP archive support. diff --git a/YNOPROTOCOL.md b/YNOPROTOCOL.md index fe6dbf30c..fef538bdb 100644 --- a/YNOPROTOCOL.md +++ b/YNOPROTOCOL.md @@ -218,6 +218,20 @@ BADGE_UPDATE: | Data Field | Type | | ------------ | ----- | +CU_TIME: + +| Data Field | Type | +| ------------ | ----- | +| time | int32 | +| randint | int32 | + +CU_WEATHER: + +| Data Field | Type | +| ------------- | ----- | +| temperature | int32 | +| precipitation | int32 | + #### C2S (Client to Server) Packets: MAIN_PLAYER_POS: diff --git a/builds/android/app/build.gradle b/builds/android/app/build.gradle index 2a1c48576..7a45ff9d1 100644 --- a/builds/android/app/build.gradle +++ b/builds/android/app/build.gradle @@ -5,9 +5,9 @@ android { assetPacks = [":assets"] defaultConfig { applicationId "org.easyrpg.player" - compileSdk 35 + compileSdk 34 minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 34 versionName VERSION_NAME versionCode Integer.parseInt(VERSION_CODE) } @@ -51,7 +51,8 @@ android { cmake { arguments "-DPLAYER_GRADLE_BUILD=ON", "-DBUILD_SHARED_LIBS=ON", - "-DPLAYER_ENABLE_TESTS=OFF" + "-DPLAYER_ENABLE_TESTS=OFF", + "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON" if (project.hasProperty("toolchainDirs") && project.toolchainDirs) { arguments.add('-DPLAYER_ANDROID_TOOLCHAIN_PATH=' + project.toolchainDirs) diff --git a/builds/android/app/src/main/AndroidManifest.xml b/builds/android/app/src/main/AndroidManifest.xml index 3be2ba9ac..691be0ed5 100644 --- a/builds/android/app/src/main/AndroidManifest.xml +++ b/builds/android/app/src/main/AndroidManifest.xml @@ -70,7 +70,8 @@ + android:configChanges="orientation|screenSize" + android:theme="@style/AppThemePlayerActivity"/> + + arab balti thai - vietnám + vietnámi OK Mégse Biztosan ki szeretnél lépni\? @@ -23,24 +23,22 @@ Nem A $PATH mappa létrehozása sikertelen volt $PATH nem olvasható - Nem található külső adattárolót (pl: SD kártya) - $PATH nem egy érvényes játékot tárol - A játék területének kiválasztása - Felület módosítása - Felület kiválasztása - Ismeretlen terület - A terület megváltoztatása nem sikerült + Nem található külső adattároló (pl: SD kártya) + $PATH nem egy érvényes játék + A játék régiójának kiválasztása + Elrendezés módosítása + Elrendezés kiválasztása + Ismeretlen régió + A régió megváltoztatása nem sikerült Frissítés - Alap irányítógombok megváltoztatása - Az EasyRPG Player használata + Alapértelmezett irányítás módosítása + Hogyan használd az EasyRPG Player-t Virtuális gombok ki/be Játék befejezése Hibajelentés - Meg fog nyílni a levelezője (pl. Gmail), hogy egy hibajelentést küldjön nekünk. -\n -\nHa nem szeretne e-mailt küldeni, vagy nincsen beállítva levelezője, bejelentheti a hibát a https://github.com/EasyRPG/Player/issues oldalon is. - Köszönjük, hogy támogatja az EasyRPG Player-t. \n Egy naplófájl és a játékmentései mellékelve lettek a levélhez. \n Kérjük ne távolítsa el a naplófájlt! Szükségünk van egy mentésre, ami közel van a hiba helyéhez. \n Kérjük írja le a hiba részleteit. + Meg fog nyílni a levelező programod (pl. Gmail), hogy egy hibajelentést küldj nekünk. \n \nHa nem szeretnél e-mailt küldeni, vagy nincsen beállítva levelező programod, bejelentheted a hibát a https://github.com/EasyRPG/Player/issues oldalon is. + Köszönjük, hogy támogatod az EasyRPG Player-t. \n Egy naplófájl és a játékmentéseid mellékelve lettek a levélhez. \n Kérjük ne távolítsd el a naplófájlt! Szükségünk van egy mentésre, ami közel van a hiba helyéhez. \n Kérjük írd le a hiba részleteit. Videó Hang @@ -78,4 +76,74 @@ Navigációs menü megnyitása Navigációs menü bezárása Android menü megnyitása + Játék átnevezése + Látogasd meg weboldalunkat + Visszaállít + Szeretnél visszamenni a kezdőképernyőre? + Indítás debug módban + A Letöltés (Download) mappa nem lehet az EasyRPG mappája. + Kezdőképernyőhöz + Kérjük hozz létre egy üres EasyRPG mappát és válaszd ki. + Rossz mappa került kiválasztásra + A játékmentés mappa megnyitása + Széles (416x240, 16:9, Kísérleti) + Használd a mappa nevet + Használd a címet + FPS megjelenítése ki/be + Nyisd meg az \"rtp\" mappát + Egyedi hangbank (Soundfont): + Játék felbontás: + Képernyő méretezés: + Betöltés… + Első betűtípus: + Betű méret + Második betűtípus: + Beépített betűtípus + Nyisd meg a \"fonts\" mappát + Zene hangerő + Eredeti (320x240, 4:3, Ajánlott) + Debug menü megnyitása (debug módot igényel) + $ENGINE nem támogatott + Ultraszéles (560x240, 21:9, Kísérleti) + Nem sikerült RPG Maker 2000/2003 játékot találni.\n\nA kiválasztott EasyRPG mappa tartalmaz egy játékmappát (games). Használj egy fájlmenedzser alkalmazást arra, hogy ebbe a mappába rakd a játékaidat.\nA játékok almappába vagy ZIP/LZH állományba rakhatók.\n\nAz EasyRPG mappa módosítható a beállítások között. + Nem támogatott játékmotor + EasyRPG mappák + Betűtípus + Áthaladás a falakon (debug módot igényel) + A játékmappa (games) megnyitása + A kiválasztott mappa más fájlokat tartalmaz, és nem használható EasyRPG mappaként. Ha eltávolítod a mappában lévő összes fájlt, akkor használhatod azt EasyRPG mappaként. + Nyisd meg a hangbank (soundfonts) mappát + Válaszd ki, hogyan legyenek a játékok elnevezve + A kiválasztott mappa nem használható EasyRPG mappaként. Ez a probléma különböző okok miatt fordulhat elő, például ha a gyökér könyvtárat választottad, vagy a tárolás helye a felhő.\n\n + Rakd a betűtípust a \"fonts\" mappába. A legjobb eredményért használj TTF betűtípust vagy bitmap (FON) betűtípust. + Hanghatások hangereje + Rakd az RPG Maker 2000/2003 játékaidat alkönyvtárakba a játék (games) mappán belül.\nA játékoknak vagy kicsomagolva vagy ZIP/LZH állományban kell lennie.\nRAR, 7z és EXE fájlok NEM támogatottak.\n\nOpcionális szolgáltatások (Kérjük, tekintsd meg a beállításokat):\n- RTP (egyes játékok által használt megosztott eszközök) biztosítható\n- Egyedi hangbankok (soundfont-ok) a MIDI zenék képzésének módosításához + Hangbankok (Soundfonts): + Az EasyRPG Player-nek szüksége van egy dedikált mappára. A gomb megérintése után ki kell választanod egy mappát.\n\nHa első alkalommal használod ezt az appot, akkor nincs még EasyRPG mappa. Hozz létre egy új EasyRPG mappát és válaszd ki.\n\nHa már használtad korábban ezt az appot, akkor válaszd ki a már létező EasyRPG mappát. + Az RTP biztosítja a megosztott eszközöket, amiket néhány játékban használnak.\nRakd az RPG Maker 2000 RTP-t az \"rtp/2000\" és az the RPG Maker 2003 RTP-t az \"rtp/2003\" mappába.\nKérjük vedd figyelembe, hogy az RTP támogatás engedélyezése szignifikánsan megnöveli a kezdeti betöltési idejét egy játéknak. + Képernyőméretre méretezés bilineáris szűrő eljárással (Lassú, jó minőség) + A felbontás módosítása grafikai hibákat okozhat vagy elronthatja a játékot. Figyelmeztetve lettél! + Válaszd ki az EasyRPG mappát + Képernyőre átméretezés a legközelebbi szomszéd eljárással (Gyors, rossz minőség) + Az A és B gombok megjelenítése Z és X gombként + A beviteli elrendezés szerkesztésénél gombok adhatók hozzá (pl. egy Shift gomb).\n Egy gomb hozzáadásához nyomd meg a vissza gombot, majd válaszd a Gomb hozzáadása opciót. + Függőleges (álló) beviteli elrendezés + Kezdeti lépések és játékok hozzáadása (videó útmutató) + A méretnek úgy kell beállítva lennie, hogy a # legalább részben látszik. Ha nem látod, akkor a szöveg levágásra kerül a játékban. + Nézet + RTP támogatás engedélyezése + A játék dönti el, hogy az első vagy a második betűtípust használja. + A játék felbontásának többszörösére átméretezés (Gyors, kisebb kép, jó minőség) + Ez a játék nem játszható EasyRPG Player-rel, mert $ENGINE motorral készült.\n\nAz EasyRPG Player úgy lett megtervezve, hogy csak az RPG Maker 2000 és 2003 játékokat támogassa, és nincs terv más motorokkal kibővítésre.\n\nOlyan szoftverért, ami el tudja ezt a játékot indítani, kérjük nézz körbe a Play Áruházban. + Rakd a hangbankokat (soundfont) SF2 formátumban a \"soundfonts\" mappába. A hangbankok módosítják a MIDI zenék hangzását. + A betű méret beállításnak nincs hatása, ha a beépített betűtípust használjuk vagy bizonyos bitmap betűtípusokat. + RTP $YEAR nem található. Azon játékoknak, amiknek szüksége van erre lehetnek hiányzó elemei. + koppint + Alapértelmezett hangbank (Soundfont) + nyomvatart + A játékok mappa (games) nem olvasható vagy írható. Kérjük válasz egy másik helyet az EasyRPG mappának. Az EasyRPG mappa módosítható a beállítások között. + Vízszintes (fekvő) beviteli elrendezés + A képarány figyelmen kívül hagyása (Nyújtás a képernyő szélességére) + A játékok mappa (games) nem létezik, vagy nem mappa. Kérjük hozz létre egyet kézzel vagy válasz egy másik helyet az EasyRPG mappának. Az EasyRPG mappa módosítható a beállítások között. + RTP $YEAR megtalálva: $NAME ($FOUND/$MAX talált eszköz) diff --git a/builds/android/app/src/main/res/values-ko/strings.xml b/builds/android/app/src/main/res/values-ko/strings.xml index ad0799d37..27865ee3d 100644 --- a/builds/android/app/src/main/res/values-ko/strings.xml +++ b/builds/android/app/src/main/res/values-ko/strings.xml @@ -160,4 +160,8 @@ 타이틀 사용 보기 A/B 버튼을 Z/X 버튼으로 표시 + $ENGINE 엔진은 지원하지 않음 + 이 게임은 $ENGINE 엔진으로 제작되었기 때문에 EasyRPG에서 플레이할 수 없습니다.\n\nEasyRPG Player는 RPG Maker 2000 및 2003 게임만 지원하도록 설계되었으며 다른 엔진을 지원할 계획은 없습니다.\n\n이 게임을 시작할 수 있는 다른 소프트웨어를 확인해 보세요. + 지원하지 않는 엔진 + 게임 저장 폴더 열기 diff --git a/builds/android/app/src/main/res/values-pt-rBR/strings.xml b/builds/android/app/src/main/res/values-pt-rBR/strings.xml index d49dcabb0..7c9dd28ea 100644 --- a/builds/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/builds/android/app/src/main/res/values-pt-rBR/strings.xml @@ -104,7 +104,7 @@ Iniciando e adicionando jogos (Vídeo Explicativo) Pastas EasyRPG Abra a pasta de \"soundfonts\" - Soundfonts: + Fontes sonoras: Soundfont padrão O EasyRPG Player requer uma pasta única. Após tocar no botão, você será perguntado para selecionar uma pasta. \n @@ -141,4 +141,31 @@ Tela Ultra Cheia (560x240, 21:9, Experimental) tocar manter + Usar o nome de pasta + Escolha a forma como os jogos são nomeados + Usar o título + Colocar fontes em \"fontes\" da pasta. Para melhor resultado use fontes TTF ou mapa de bits (FON) de tipos de letra. + Alternar FPS de visualização + Mudar o nome do jogo + Reverter + Escala para tamanho de tela usando o vizinho mais próximo (Rápido, de má qualidade) + Exibição de botões A e B Z e X + Você realmente deseja redefinir? + Primeira Fonte: + Tamanho fonte + Segundo Fonte: + Fonte Interna + Reposição de jogo + Abra as \"fontes\" da pasta + O tamanho deve ser definido de modo que o # é pelo menos parcialmente visível. Se você não pode vê-lo, o texto será cortado do jogo. + Visualizar + $ENGINE não é suportado + O jogo que decide se usa o tipo de letra primeiro ou o segundo tipo de letra. + Este jogo não pode ser jogado no EasyRPG Player porque foi criado com o $ENGINE.\n\nO EasyRPG Player foi projetado para suportar apenas jogos do RPG Maker 2000 e 2003, sem planos para expandir para outros motores.\n\nPara softwares capazes de iniciar este jogo, por favor, verifique a Play Store. + Sem suporte do motor + A configuração de tamanho de fonte, não tem nenhum efeito quando usando o built-in tipo de letra ou de determinadas fontes de bitmap. + RTP $YEAR não foi encontrado. Jogos que exigem esse RTP terão ativos faltando. + Fonte + Abrir pasta savegame + RTP $YEAR encontrado: $NAME ($FOUND de $MAX ativos encontrados) diff --git a/builds/android/app/src/main/res/values-tr/strings.xml b/builds/android/app/src/main/res/values-tr/strings.xml index 693e967fd..6dba21358 100644 --- a/builds/android/app/src/main/res/values-tr/strings.xml +++ b/builds/android/app/src/main/res/values-tr/strings.xml @@ -5,9 +5,141 @@ Titreşimleri etkinleştir - Çabuk erişim + Hızlı erişim Android menüsünü aç - \ No newline at end of file + Balt Dilleri + Geniş ekran (416x240, 16:9, Deneysel) + Bir düzen seçin + Seçilen klasör başka dosyalar içeriyor ve EasyRPG klasörü olarak kullanılamaz. Klasörün içindeki tüm dosyaları kaldırdığınızda onu EasyRPG klasörü olarak kullanabilirsiniz. + Kaydetmeden çık + \"soundfonts\" (ses yazı tipi) klasörünü açın + Dosya ismini kullan + Oyunların nasıl isimlendirileceğini seçin + Başka bir yöne kaydırırken titreştir + Seçilen klasör EasyRPG klasörü olarak kullanılamaz. Bu sorun, kök dizini veya buluttaki bir depolama konumunu seçmiş olmanız gibi çeşitli nedenlerle ortaya çıkabilir.\n\n + Başlığı kullan + Yazı tiplerini \"fonts\" klasörüne koyun. En iyi sonuç için TTF fontları veya bitmap (FON) yazı tiplerini kullanın. + Ses Efekti Seviyesi + Korece + RPG Maker 2000/2003 oyunlarınızı \"games\" klasörünün alt dizinlerine koyun.\nOyunların sıkıştırılmamış veya ZIP/LZH arşivinde olması gerekir.\nRAR, 7z ve EXE dosyaları DESTEKLENMEZ.\n\nOpsiyonel özellikler (Lütfen ayarlara bakın):\n- RTP (bazı oyunlar tarafından kullanılan paylaşımlı varlıklar) sağlanabilir\n- MIDI müzik seslerinin nasıl sağlanabileceğini değiştirmek için özel bir ses yazı tipi sağlanabilir + Harici depolama (örn. SD kart) bulunamadı + Ses yazı tipleri: + FPS göstergesini değiştir + Oyunu yeniden adlandır + Web sitemizi ziyaret edin + EasyRPG Player\'ın çalışması için özel bir klasör gereklidir. Düğmeye tıkladıktan sonra sizden bir klasör seçmeniz istenecektir.\n\nEğer bu uygulamayı ilk defa kullanıyorsanız, henüz bir EasyRPG klasörü bulunmamaktadır. Yeni bir EasyRPG klasörü oluşturun ve onu seçin.\n\nEğer uygulamayı daha önce kullandıysanız, var olan EasyRPG klasörünü seçin. + Bir düğme ekle + \"rtp\" Klasörünü aç + Yerleşimi düzenle + Giriş Düzenlerini Yönet: + %1$s üzerinde okuma yetkisi yok + Özel Ses Yazı Tipi: + Çince (Basitleştirilmiş) + RTP, bazı oyunların kullandığı ortak kaynakları sunar.\nRPG Maker 2000 RTP\'sini \"rtp/2000\" klasörüne, RPG Maker 2003 RTP\'sini ise \"rtp/2003\" klasörüne yerleştirin.\nUnutmayın, RTP desteğini açmak oyunun ilk açılış süresini belirgin şekilde uzatacaktır. + Türkçe + Oyun bölgesini seçin + Çince (Geleneksel) + Geri al + Ekran boyutuna ölçekle ve iki doğrusal filtre uygula (Yavaş, yüksek kalite) + Giriş düzeni saydamlığı: + İbranice + Çözünürlüğü değiştirmek grafiksel sorunlara neden olabilir veya oyunu bozabilir. Dikkatli olun! + Hayır + $PATH Dizinini oluşturma başarısız oldu + Japonca + EasyRPG klasörünü seçin + Arapça + En yakın komşuyu kullanarak ekran boyutuna ölçeklendir (Hızlı, düşük kalite) + İleri sarma düğme modu: + Oyun Çözünürlüğü: + Bölge değiştirme başarısız oldu + Navigasyon menüsünü kapat + A ve B düğmelerini Z ve X olarak göster + Bir giriş düzeni düzenlenirken, düğmeler eklenebilir (örneğin bir Shift düğmesi).\n Bir düğme eklemek için geri düğmesine basın ve Düğme ekle\'yi seçin. + Ekran ölçeği: + Navigasyon menüsünü aç + Yükleniyor… + Varsayılan düğme atamasını değiştirin + Yunanca + EasyRPG Player\'ı desteklediğiniz için teşekkür ederiz.\n Bu e-postaya bir günlük dosyası ve kayıtlı oyunlarınız eklenmiştir.\n Lütfen log dosyasını kaldırmayın! Hatanın bulunduğu yere yakın bir kayıtlı oyuna ihtiyacımız var.\n Lütfen bize neyin yanlış gittiğini detaylı olarak anlatın. + Hız çarpanı: + Gerçekten menüye dönmek istiyor musunuz? + Evet + Dikey (Portre) Giriş Düzeni + İlk Yazı Tipi: + Yazı Tipi Boyutu + Hata ayıklama modunda başlat + İkinci Yazı Tipi: + Oyunlara başlama ve oyun ekleme (Video Rehberi) + Dahili Yazı Tipi + Sil + Giriş + $PATH geçerli bir oyun değil + EasyRPG Player nasıl kullanılır + İndirme klasörü EasyRPG klasörü olarak kullanılamaz. + Tamam + Sanal düğmeleri aç/kapat + Kiril Alfabesi + Ana menüye dön + Enter (Z) + Lütfen boş bir EasyRPG klasörü oluşturun ve onu seçin. + Geçersiz klasör seçildi + \"fonts\" (yazı tipleri) klasörünü aç + Müzik Seviyesi + Shift + Orjinal (320x240, 4:3, Önerilir) + Boyut, #\'ın en azından bir kısmı görünecek şekilde ayarlanmalı. Eğer onu göremiyorsanız, oyun içinde metin kırpılacaktır. + Görünüm + İptal Et (ESC ve X) + Oyunu sonlandır + İleri Sarma + Düğme boyutu ayarlarını yoksay ve bunun yerine bunu kullan: + Hata ayıklama menüsünü aç (Hata ayıklama modu gerektirir) + RTP Desteğini etkinleştir + İptal + $ENGINE Desteklenmiyor + Yenile + Batı Avrupa + Orta/Doğu Avrupa + Oyun, birinci yazı tipini mi yoksa ikinci yazı tipini mi kullanacağına karar verir. + Ultra Geniş (560x240, 21:9, Deneysel) + Oyun çözünürlüğünün katlarına ölçekle (Hızlı, daha küçük görüntü, iyi kalite) + İsmi değiştir + Yatay ekran yönünü zorla + RPG Maker 2000/2003 oyunu bulunamadı .\n\nSeçtiğiniz EasyRPG klasörü bir \"games\" klasörü içeriyor. Oyunlarınızı bu klasöre koymak için bir dosya yöneticisi uygulaması kullanın.\nOyunlar alt klasörlere veya ZIP/LZH arşivlerine konulabilir.\n\nEasyRPG klasörü daha sonra ayarlardan değiştirilebilir. + Bu oyun, $ENGINE ile oluşturulduğu için EasyRPG Player\'da oynatılamaz.\n\nEasyRPG Player, yalnızca RPG Maker 2000 ve 2003 oyunlarını desteklemek üzere tasarlanmıştır ve diğer oyun motorlarına genişletme planı yoktur.\n\nBu oyunu başlatabilecek yazılımlar için lütfen Play Store\'u kontrol edin. + es yazı tiplerini SF2 formatında \"soundfonts\" klasörüne koyun. Ses yazı tipleri MIDI müziğin sesini değiştirir. + Desteklenmeyen motor + Video + Kaydet ve çık + EasyRPG Dosyaları + Bir hata bildirin + Dahili yazı tipi veya bazı bit eşlem fontları kullanıldığında, font boyutu ayarı etkisizdir. + RTP $YEAR bulunamadı. Bu RTP\'yi kullanan oyunlarda eksik kaynaklar olacağı anlamına gelir. + dokun + Varsayılan Ses Yazı Tipi + Ayarlar + basılı tut + Bu fonksiyon, hata raporunu bize göndermek için E-posta programınızı (örn. Gmail) açacaktır.\n\nEğer mail göndermek istemiyorsanız veya mail programınız yapılandırılmamışsa https://github.com/EasyRPG/Player/issues adresinden yeni bir konu açabilirsiniz. + Yazı Tipi + Duvarların içinden geç (Hata ayıklama modu gerektirir) + \"games\" Klasörü okunabilir veya yazılabilir değil. Lütfen EasyRPG klasörü için farklı bir konum seçin. EasyRPG klasörü ayarlarda değiştirilebilir. + Bilinmeyen Bölge + $PATH Dizini okunabilir değil + Vietnamca + Yatay (Manzara) Giriş Düzeni + Tayca + En boy oranını yoksay (Ekran genişliğine uzat) + Düğme atamasını sıfırla + \"games\" klasörü mevcut değil veya bir klasör değil. Lütfen klasörü manuel olarak oluşturun veya EasyRPG klasörü için farklı bir konum seçin. EasyRPG klasörü ayarlarda değiştirilebilir. + Kayıt dosyası klasörünü aç + \"oyunlar (oyunlar)\" Klasörünü aç + Gerçekten çıkmak istiyor musunuz? + Varsayılan + Ses + Düzeni değiştir + RTP $YEAR bulundu: $NAME ($MAX varlıktan $FOUND varlık bulundu) + diff --git a/builds/android/app/src/main/res/values-zh/strings.xml b/builds/android/app/src/main/res/values-zh/strings.xml index aed62f2a7..8c6be88c2 100644 --- a/builds/android/app/src/main/res/values-zh/strings.xml +++ b/builds/android/app/src/main/res/values-zh/strings.xml @@ -38,7 +38,7 @@ 退出游戏 报告错误 此选项将打开您的电子邮件应用(如 Gmail)来向我们发送错误报告。 \n \n如果您不想发送邮件或者没有安装电子邮件应用,可以在 https://github.com/EasyRPG/Player/issues 创建一个新的 Issue。 - 感谢您对 EasyRPG Player 的支持。\n这封电子邮件附带了日志文件和您的游戏存档。\n请不要删除日志文件!我们需要一个靠近错误位置的游戏存档。\n请详细告诉我们出了什么问题。 + 感谢您对 EasyRPG Player 的支持。\n这封电子邮件附带了日志文件和您的游戏存档。\n请不要删除日志文件!我们需要一个能复现错误的游戏存档。\n请详细告诉我们出了什么问题。 视频 音频 @@ -47,7 +47,7 @@ 开启震动 往另一个方向滑动时振动 按键透明度: - 统一全部按钮大小: + 全局按钮大小: 没有读取 %1$s 的权限 快速访问 强制横屏 @@ -62,7 +62,7 @@ 恢复默认 退出而不保存 保存并退出 - 决定键 (Z) + 决定键 (Enter 或 Z) 取消键 (ESC 或 X) Shift键 快进 @@ -81,7 +81,7 @@ EasyRPG Player 需要一个专用文件夹。点击按钮后,系统会要求您选择一个文件夹。\n\n如果您是第一次使用此应用,请创建一个新文件夹并选中,用作 EasyRPG 文件夹。\n\n如果您以前使用过此应用,请选择现有的 EasyRPG 文件夹。 加载中…… 启用 RTP 支持 - RTP 提供某些游戏使用到的共享素材。 \n将 RPG Maker 2000 RTP 放入路径 \"rtp/2000\" ,将 RPG Maker 2003 RTP 放入路径 \"rtp/2000\" 。 \n请注意,启用 RTP 支持将显著增加游戏的初始加载时间。 + RTP 提供某些游戏使用到的共享素材。 \n将 RPG Maker 2000 RTP 放入路径 \"rtp/2000\" ,将 RPG Maker 2003 RTP 放入路径 \"rtp/2003\" 。 \n请注意,启用 RTP 支持将显著增加游戏的初始加载时间。 打开 \"rtp\" 文件夹 音乐音量 音效音量 @@ -131,14 +131,14 @@ 内置字体 重启游戏 打开 \"fonts\" 文件夹 - 设置的大小必须使 # 至少部分可见。如果它不可见,游戏中的文字可能会超出显示范围。 + 设置的大小必须使最右侧的 # 至少部分可见。如果它不可见,游戏中的文字可能会超出显示范围。 视图 不支持 $ENGINE 由游戏决定是使用第一种字体还是第二种字体。 此游戏无法使用 EasyRPG Player 运行,因为它是使用 $ENGINE 制作的。\n\nEasyRPG Player 仅支持使用 RPG Maker 2000/2003 制作的游戏,并且没有支持其他引擎的计划。\n\n对于能够运行此游戏的应用,请前往应用商店搜索。 不支持的引擎 使用内置字体或者某些点阵字体时,字体大小设置无效。 - 未找到 RTP $YEAR。需要此 RTP 的游戏将缺少文件。 + 未找到 RTP $YEAR。需要此 RTP 的游戏将缺少必要文件。 字体 打开存档文件夹 RTP $YEAR 已找到:$NAME(已找到 $MAX 中的 $FOUND) diff --git a/builds/android/app/src/main/res/values/strings.xml b/builds/android/app/src/main/res/values/strings.xml index fcf472fa4..573457267 100644 --- a/builds/android/app/src/main/res/values/strings.xml +++ b/builds/android/app/src/main/res/values/strings.xml @@ -77,6 +77,7 @@ Please tell us in detail what went wrong.\n\n EasyRPG Folders Settings Screen scaling: + Fullscreen Force landscape orientation Scale to screen size using nearest neighbour (Fast, bad quality) Scale to a multiple of the game resolution (Fast, smaller image, good quality) diff --git a/builds/android/app/src/main/res/values/styles.xml b/builds/android/app/src/main/res/values/styles.xml index 177cefc89..61a89decd 100644 --- a/builds/android/app/src/main/res/values/styles.xml +++ b/builds/android/app/src/main/res/values/styles.xml @@ -8,6 +8,9 @@ @color/colorAccent + +