mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2026-01-29 17:38:16 +03:00
Compare commits
73 Commits
2.4.3
...
33f275a62e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33f275a62e | ||
|
|
9256100cb9 | ||
|
|
b8ca587df1 | ||
|
|
552f1b21c2 | ||
|
|
f73fddea72 | ||
|
|
512a9b7150 | ||
|
|
d9a3158f6a | ||
|
|
d3197d10f7 | ||
|
|
1900c867aa | ||
|
|
cd26810e9a | ||
|
|
6ae4de1f94 | ||
|
|
65b024a9a3 | ||
|
|
d53861553e | ||
|
|
7dccc2d328 | ||
|
|
26d27c7df5 | ||
|
|
70cbde18fe | ||
|
|
37bb4f30fd | ||
|
|
0d16cd1369 | ||
|
|
902acdd2ac | ||
|
|
8bf6b25b5b | ||
|
|
0e31253876 | ||
|
|
1de2078014 | ||
|
|
37b788c1c8 | ||
|
|
d730528118 | ||
|
|
75035047ad | ||
|
|
1a1bf2a4f9 | ||
|
|
48c3e175a3 | ||
|
|
374ce11425 | ||
|
|
0b00415ab3 | ||
|
|
3eb88e0ac0 | ||
|
|
719ed9a67b | ||
|
|
6810c5fa8c | ||
|
|
2ee5aef3fa | ||
|
|
c1eaeca9f6 | ||
|
|
0e9c4f98a6 | ||
|
|
b8bcdf39df | ||
|
|
6809aa0135 | ||
|
|
5816e6f51a | ||
|
|
b0d53e85a0 | ||
|
|
d419c6ed5b | ||
|
|
343790f12b | ||
|
|
e318df24bc | ||
|
|
d709db4b45 | ||
|
|
f9f9f076b4 | ||
|
|
d90f3c3c08 | ||
|
|
420683a80f | ||
|
|
d4e472db1b | ||
|
|
63880169e6 | ||
|
|
9c45dfb845 | ||
|
|
fa8517a521 | ||
|
|
6174d62f6f | ||
|
|
98a0931225 | ||
|
|
45e60fa69c | ||
|
|
d8a8e44afa | ||
|
|
b572e2164b | ||
|
|
2875af0492 | ||
|
|
54b2aaae96 | ||
|
|
1fb0afb99d | ||
|
|
dedf941b25 | ||
|
|
94620d809e | ||
|
|
11d0e7f91e | ||
|
|
4587fa46b0 | ||
|
|
c2642dbdef | ||
|
|
a0bd2f3da4 | ||
|
|
8a00ea7aab | ||
|
|
c04c6bc552 | ||
|
|
41d5e688e9 | ||
|
|
e58fd606cf | ||
|
|
8aec83daec | ||
|
|
c870df4e5b | ||
|
|
32562f03a9 | ||
|
|
d8b2b3542a | ||
|
|
8b62bb1d65 |
4
.github/workflows/android.yml
vendored
4
.github/workflows/android.yml
vendored
@@ -65,7 +65,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: libsdl-org/SDL
|
||||
ref: release-2.28.5
|
||||
ref: release-2.30.8
|
||||
path: 'SDL'
|
||||
|
||||
- name: Build SDL
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
sudo apt-get -y install ninja-build
|
||||
cd SDL
|
||||
./build-scripts/android-prefab.sh
|
||||
mvn install:install-file -Dfile=build-android-prefab/prefab-2.28.5/SDL2-2.28.5.aar -DpomFile=build-android-prefab/prefab-2.28.5/SDL2-2.28.5.pom
|
||||
mvn install:install-file -Dfile=build-android-prefab/prefab-2.30.8/SDL2-2.30.8.aar -DpomFile=build-android-prefab/prefab-2.30.8/SDL2-2.30.8.pom
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
|
||||
59
.github/workflows/ci.yml
vendored
59
.github/workflows/ci.yml
vendored
@@ -20,6 +20,14 @@ on:
|
||||
- "third_party/**"
|
||||
- ".github/workflows/ci.yml"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
statuses: write
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
SRC_DIR_PATH: desktop_version
|
||||
|
||||
@@ -32,19 +40,31 @@ jobs:
|
||||
env:
|
||||
CXXFLAGS: -I/usr/local/include/SDL2
|
||||
LDFLAGS: -L/usr/local/lib
|
||||
HOMEBREW_NO_ENV_HINTS: 1 # Suppress brew update hints
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: Cache Homebrew packages
|
||||
id: cache-brew
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
/usr/local/Cellar/ninja
|
||||
/usr/local/Cellar/sdl2
|
||||
/usr/local/opt/sdl2 # Symlink often used
|
||||
key: ${{ runner.os }}-brew-${{ hashFiles('/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/ninja.rb', '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/sdl2.rb') }} # Using hash of formula files if available, or a fixed key for simplicity if not easily determined
|
||||
|
||||
- name: Install dependencies
|
||||
if: steps.cache-brew.outputs.cache-hit != 'true'
|
||||
run: brew install ninja sdl2
|
||||
|
||||
- name: CMake configure (default version)
|
||||
run: |
|
||||
mkdir ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
|
||||
cmake -GNinja ..
|
||||
mkdir -p ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
|
||||
cmake -G Ninja ..
|
||||
- name: Build (default version)
|
||||
run: ninja -C ${SRC_DIR_PATH}/build
|
||||
|
||||
@@ -70,31 +90,30 @@ jobs:
|
||||
container: registry.gitlab.steamos.cloud/steamrt/sniper/sdk:latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: CMake configure (default version)
|
||||
run: |
|
||||
mkdir ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
|
||||
cmake ..
|
||||
mkdir -p ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
|
||||
cmake -G Ninja ..
|
||||
- name: Build (default version)
|
||||
run: make -j $(nproc) -C ${SRC_DIR_PATH}/build
|
||||
run: ninja -C ${SRC_DIR_PATH}/build
|
||||
|
||||
- name: CMake configure (official)
|
||||
run: |
|
||||
cd ${SRC_DIR_PATH}/build
|
||||
cmake -DOFFICIAL_BUILD=ON ..
|
||||
cmake -G Ninja -DOFFICIAL_BUILD=ON ..
|
||||
- name: Build (official)
|
||||
run: |
|
||||
make -j $(nproc) -C ${SRC_DIR_PATH}/build
|
||||
run: ninja -C ${SRC_DIR_PATH}/build
|
||||
|
||||
- name: CMake configure (M&P)
|
||||
run: |
|
||||
cd ${SRC_DIR_PATH}/build
|
||||
cmake -DOFFICIAL_BUILD=OFF -DMAKEANDPLAY=ON ..
|
||||
cmake -G Ninja -DOFFICIAL_BUILD=OFF -DMAKEANDPLAY=ON ..
|
||||
- name: Build (M&P)
|
||||
run: make -j $(nproc) -C ${SRC_DIR_PATH}/build
|
||||
run: ninja -C ${SRC_DIR_PATH}/build
|
||||
|
||||
build-win:
|
||||
name: Build (windows-latest)
|
||||
@@ -105,7 +124,7 @@ jobs:
|
||||
SDL_VERSION: 2.26.0
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
@@ -124,19 +143,7 @@ jobs:
|
||||
Invoke-WebRequest "https://github.com/libsdl-org/SDL/releases/download/release-$env:SDL_VERSION/SDL2-devel-$env:SDL_VERSION-VC.zip" -OutFile C:\SDL.zip
|
||||
Expand-Archive C:\SDL.zip -DestinationPath C:\
|
||||
|
||||
- name: Cache build folder for this CMakeLists.txt
|
||||
id: cache-windows-build-folder
|
||||
uses: actions/cache@v3
|
||||
env:
|
||||
cache-name: cache-windows-build-folder-VS2022
|
||||
with:
|
||||
path: |
|
||||
desktop_version/build
|
||||
desktop_version/CMakeLists.txt
|
||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('desktop_version/CMakeLists.txt') }}-SDL${{ env.SDL_VERSION }}
|
||||
|
||||
- if: ${{ steps.cache-windows-build-folder.outputs.cache-hit != 'true' }}
|
||||
name: CMake initial configure/generate
|
||||
- name: CMake initial configure/generate
|
||||
run: |
|
||||
mkdir $env:SRC_DIR_PATH/build
|
||||
cd $env:SRC_DIR_PATH/build
|
||||
|
||||
@@ -21,5 +21,6 @@ Last updated on January 23rd, 2024.
|
||||
| Dreamcast Port | [Gustavo Aranda](https://github.com/gusarba/) | Port for the Sega Dreamcast. | Permission is given to distribute a ready-to-use CD image file for the Sega Dreamcast containing the data.zip assets for non commercial use only. | [github repo](https://github.com/gusarba/VVVVVVDC)|
|
||||
| XBox One/UWP Port | [tunip3](https://github.com/tunip3) | Port for XBOX ONE (DURANGO) via UWP. | Permission is given to distribute a pre-compiled package (containing the data.zip assets) for people to run on development mode xboxes, for non commercial use only. | [github repo](https://github.com/tunip3/DURANGO-V6)|
|
||||
| armhf Port | [johnnyonFlame](https://github.com/johnnyonFlame/) | Armhf port for Raspberry PI and other SBC devices| Permission is for non commercial use only. Display the following text in the readme to make it clear that this is an exception: "VVVVVV is a commercial game! The author has given special permission to make this port available for free. If you enjoy the game, please consider purchasing a copy at [thelettervsixtim.es](http://thelettervsixtim.es)."| [github release](https://github.com/JohnnyonFlame/VVVVVV/releases/tag/v2.4-r1) |
|
||||
| PortMaster distributions of the game for Linux Handheld devices | [portmaster](https://portmaster.games/) | A port manager GUI for Linux handheld devices | Permission is for non commercial use only. Display the following text in the readme to make it clear that this is an exception: "VVVVVV is a commercial game! The author has given special permission to make this port available for free. If you enjoy the game, please consider purchasing a copy at [thelettervsixtim.es](http://thelettervsixtim.es)."| [website](https://portmaster.games/detail.html?name=vvvvvv) |
|
||||
| Wii Port | [Alberto Mardegan](https://github.com/mardy/) | Port for the Nintendo Wii. | Permission is given to distribute a ready-to-use build for the Nintendo Wii containing the data.zip assets for non commercial use only. | [github repo](https://github.com/mardy/VVVVVV/tree/wii) |
|
||||
| Recalbox Port | [digitalLumberjack](https://gitlab.com/recalbox/recalbox) | Port for Recalbox project. | Display the following text in the readme to make it clear that this is an exception: "VVVVVV is a commercial game! The author has given special permission to make this port available for free. If you enjoy the game, please consider purchasing a copy at [thelettervsixtim.es](http://thelettervsixtim.es)." | [website](https://recalbox.com/) |
|
||||
|
||||
@@ -4,7 +4,7 @@ This is the source code to VVVVVV, the 2010 indie game by [Terry Cavanagh](http:
|
||||
|
||||
The source code for the desktop version is in [this folder](desktop_version).
|
||||
|
||||
VVVVVV is still commerically available at [thelettervsixtim.es](https://thelettervsixtim.es/) if you'd like to support it, but you are completely free to compile the game for your own personal use. If you're interested in distributing a compiled version of the game, see [LICENSE.md](LICENSE.md) for more information.
|
||||
VVVVVV is still commercially available at [thelettervsixtim.es](https://thelettervsixtim.es/) if you'd like to support it, but you are completely free to compile the game for your own personal use. If you're interested in distributing a compiled version of the game, see [LICENSE.md](LICENSE.md) for more information.
|
||||
|
||||
Discussion about VVVVVV updates mainly happens on the "unofficial" [VVVVVV discord](https://discord.gg/Zf7Nzea), in the `vvvvvv-code` channel.
|
||||
|
||||
|
||||
BIN
desktop_version/AppIcon.xcassets/AppIcon.appiconset/AppIcon.png
Normal file
BIN
desktop_version/AppIcon.xcassets/AppIcon.appiconset/AppIcon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 287 KiB |
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "AppIcon.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
6
desktop_version/AppIcon.xcassets/Contents.json
Normal file
6
desktop_version/AppIcon.xcassets/Contents.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ option(REMOVE_ABSOLUTE_PATHS "If supported by the compiler, replace all absolute
|
||||
|
||||
|
||||
# Architecture Flags
|
||||
if(APPLE)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
# Wow, Apple is a huge jerk these days huh?
|
||||
set(OSX_10_9_SDK_PATH /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk)
|
||||
if(NOT CMAKE_OSX_SYSROOT)
|
||||
@@ -38,6 +38,8 @@ if(APPLE)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
|
||||
link_directories(/usr/local/lib)
|
||||
add_compile_options(-Werror=partial-availability)
|
||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0) # SDL goes back to iOS 8.0, but modern Xcode doesn't
|
||||
endif()
|
||||
|
||||
project(VVVVVV)
|
||||
@@ -48,12 +50,16 @@ endif()
|
||||
|
||||
# RPATH
|
||||
if(NOT WIN32)
|
||||
if(APPLE)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
set(BIN_LIBROOT "Frameworks")
|
||||
set(BIN_RPATH "@executable_path/Frameworks")
|
||||
elseif(APPLE)
|
||||
set(BIN_LIBROOT "osx")
|
||||
set(BIN_RPATH "@executable_path/osx")
|
||||
elseif(CMAKE_SIZEOF_VOID_P MATCHES "8")
|
||||
set(BIN_LIBROOT "lib64")
|
||||
set(BIN_RPATH "\$ORIGIN/lib64")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--disable-new-dtags")
|
||||
else()
|
||||
set(BIN_LIBROOT "lib")
|
||||
set(BIN_RPATH "\$ORIGIN/lib")
|
||||
@@ -128,6 +134,9 @@ endif()
|
||||
if(GOG)
|
||||
list(APPEND VVV_C_SRC src/GOGNetwork.c)
|
||||
endif()
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
list(APPEND VVV_C_SRC src/SDL_uikit_main.c)
|
||||
endif()
|
||||
|
||||
set(VVV_SRC ${VVV_CXX_SRC} ${VVV_C_SRC})
|
||||
|
||||
@@ -136,6 +145,30 @@ if(WIN32)
|
||||
add_executable(VVVVVV WIN32 ${VVV_SRC} icon.rc)
|
||||
elseif(ANDROID)
|
||||
add_library(VVVVVV SHARED ${VVV_SRC})
|
||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
file(GLOB_RECURSE REPO_RESOURCES "fonts/*" "lang/*")
|
||||
|
||||
add_executable(VVVVVV MACOSX_BUNDLE ${VVV_SRC} ${DATA_ZIP} AppIcon.xcassets ${REPO_RESOURCES})
|
||||
set_target_properties(VVVVVV PROPERTIES
|
||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.distractionware.vvvvvvmobile"
|
||||
XCODE_ATTRIBUTE_PRODUCT_NAME "VVVVVV"
|
||||
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" # iPhone, iPad
|
||||
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "2.5"
|
||||
XCODE_ATTRIBUTE_MARKETING_VERSION "2.5"
|
||||
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon
|
||||
XCODE_ATTRIBUTE_GENERATE_INFOPLIST_FILE YES
|
||||
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist"
|
||||
XCODE_ATTRIBUTE_INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace YES
|
||||
XCODE_ATTRIBUTE_INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents YES
|
||||
RESOURCE "${DATA_ZIP};AppIcon.xcassets"
|
||||
)
|
||||
|
||||
foreach(REPO_FILE ${REPO_RESOURCES})
|
||||
file(RELATIVE_PATH REPO_FILE_REL "${CMAKE_CURRENT_SOURCE_DIR}" ${REPO_FILE})
|
||||
get_filename_component(REPO_FILE_DIR ${REPO_FILE_REL} DIRECTORY)
|
||||
set_property(SOURCE ${REPO_FILE} PROPERTY MACOSX_PACKAGE_LOCATION "Resources/${REPO_FILE_DIR}")
|
||||
source_group("Resources/${REPO_FILE_DIR}" FILES "${REPO_FILE}")
|
||||
endforeach()
|
||||
else()
|
||||
add_executable(VVVVVV ${VVV_SRC})
|
||||
endif()
|
||||
@@ -207,6 +240,7 @@ if(APPLE)
|
||||
set(PFS_SRC ${PFS_SRC} ../third_party/physfs/src/physfs_platform_apple.m)
|
||||
endif()
|
||||
set(PNG_SRC src/lodepng_wrapper.c)
|
||||
set(PNG_DEF -DLODEPNG_NO_COMPILE_ALLOCATORS -DLODEPNG_NO_COMPILE_DISK)
|
||||
set(CHM_SRC ../third_party/c-hashmap/map.c)
|
||||
set(SBIDI_SRC ../third_party/SheenBidi/Source/SheenBidi.c)
|
||||
|
||||
@@ -280,17 +314,15 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
target_compile_options(VVVVVV PRIVATE -Wno-c99-extensions)
|
||||
endif()
|
||||
|
||||
# Set standards version, disable exceptions and RTTI
|
||||
if(MSVC)
|
||||
# MSVC doesn't have /std:c99 or /std:c++98 switches!
|
||||
|
||||
# MSVC does not officially support disabling exceptions,
|
||||
# so this is as far as we are willing to go to disable them.
|
||||
string(REGEX REPLACE "/EH[a-z]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS /EHsc)
|
||||
|
||||
# Disable RTTI
|
||||
string(REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS /GR-)
|
||||
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS "/EHsc /GR-")
|
||||
|
||||
if(MSVC_VERSION GREATER 1900)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
|
||||
@@ -301,29 +333,15 @@ else()
|
||||
set_source_files_properties(${VVV_C_SRC} PROPERTIES COMPILE_FLAGS -std=c99)
|
||||
|
||||
string(REGEX REPLACE "-std=[a-z0-9+]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS -std=c++98)
|
||||
|
||||
# Disable exceptions
|
||||
string(REPLACE "-fexceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS -fno-exceptions)
|
||||
|
||||
# Disable RTTI
|
||||
string(REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS -fno-rtti)
|
||||
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS "-std=c++98 -fno-exceptions -fno-rtti")
|
||||
|
||||
# Dependencies (as needed)
|
||||
set_source_files_properties(${FAUDIO_SRC} PROPERTIES COMPILE_FLAGS -std=c99)
|
||||
set_source_files_properties(${CHM_SRC} PROPERTIES COMPILE_FLAGS -std=c99)
|
||||
endif()
|
||||
|
||||
# Unfortunately, it doesn't seem like distros package LodePNG
|
||||
add_library(lodepng-static STATIC ${PNG_SRC})
|
||||
|
||||
target_compile_definitions(lodepng-static PRIVATE
|
||||
-DLODEPNG_NO_COMPILE_ALLOCATORS
|
||||
-DLODEPNG_NO_COMPILE_DISK
|
||||
)
|
||||
|
||||
add_library(c-hashmap-static STATIC ${CHM_SRC})
|
||||
|
||||
add_library(sheenbidi-static STATIC ${SBIDI_SRC})
|
||||
@@ -336,12 +354,14 @@ target_include_directories(sheenbidi-static PRIVATE
|
||||
)
|
||||
|
||||
if(BUNDLE_DEPENDENCIES)
|
||||
list(APPEND STATIC_LIBRARIES physfs-static tinyxml2-static lodepng-static c-hashmap-static faudio-static sheenbidi-static)
|
||||
list(APPEND STATIC_LIBRARIES lodepng-static physfs-static tinyxml2-static c-hashmap-static faudio-static sheenbidi-static)
|
||||
else()
|
||||
list(APPEND STATIC_LIBRARIES lodepng-static c-hashmap-static sheenbidi-static)
|
||||
list(APPEND STATIC_LIBRARIES c-hashmap-static sheenbidi-static)
|
||||
endif()
|
||||
|
||||
if(BUNDLE_DEPENDENCIES)
|
||||
add_library(lodepng-static STATIC ${PNG_SRC})
|
||||
target_compile_definitions(lodepng-static PRIVATE ${PNG_DEF})
|
||||
add_library(tinyxml2-static STATIC ${XML2_SRC})
|
||||
add_library(physfs-static STATIC ${PFS_SRC})
|
||||
target_compile_definitions(physfs-static PRIVATE
|
||||
@@ -357,7 +377,11 @@ if(BUNDLE_DEPENDENCIES)
|
||||
|
||||
target_link_libraries(VVVVVV ${STATIC_LIBRARIES})
|
||||
else()
|
||||
target_link_libraries(VVVVVV ${STATIC_LIBRARIES} physfs tinyxml2 FAudio)
|
||||
target_compile_definitions(VVVVVV PRIVATE
|
||||
${PNG_DEF}
|
||||
-DSYSTEM_LODEPNG
|
||||
)
|
||||
target_link_libraries(VVVVVV ${STATIC_LIBRARIES} physfs tinyxml2 FAudio lodepng)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -427,6 +451,15 @@ elseif (EMSCRIPTEN)
|
||||
target_compile_options(faudio-static PUBLIC -sUSE_SDL=2)
|
||||
target_link_libraries(faudio-static -sUSE_SDL=2)
|
||||
endif()
|
||||
elseif(DEFINED SDL2_FRAMEWORK)
|
||||
message(STATUS "Using pre-defined SDL2 variable SDL2_FRAMEWORK")
|
||||
target_include_directories(VVVVVV SYSTEM PRIVATE "$<BUILD_INTERFACE:${SDL2_FRAMEWORK}/Headers>")
|
||||
target_link_libraries(VVVVVV ${SDL2_FRAMEWORK})
|
||||
if(BUNDLE_DEPENDENCIES)
|
||||
target_include_directories(faudio-static SYSTEM PRIVATE "$<BUILD_INTERFACE:${SDL2_FRAMEWORK}/Headers>")
|
||||
target_link_libraries(faudio-static ${SDL2_FRAMEWORK})
|
||||
endif()
|
||||
set_target_properties(VVVVVV PROPERTIES XCODE_EMBED_FRAMEWORKS ${SDL2_FRAMEWORK})
|
||||
else()
|
||||
# Only try to autodetect if both SDL2 variables aren't explicitly set
|
||||
find_package(SDL2 CONFIG)
|
||||
|
||||
8
desktop_version/Info.plist
Normal file
8
desktop_version/Info.plist
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>UIFileSharingEnabled</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -10,18 +10,18 @@ How to Build
|
||||
------------
|
||||
|
||||
The recommended way is to install Android Studio and Maven. These instructions are for
|
||||
SDL 2.28.5; adapt your SDL version accordingly.
|
||||
SDL 2.30.8; adapt your SDL version accordingly.
|
||||
|
||||
1. Place a copy of `data.zip` in `desktop_version/VVVVVV-android/app/src/main/assets/`.
|
||||
(If the `assets/` folder doesn't exist, then create it.)
|
||||
2. Obtain the SDL 2.28.5 Maven package. As of writing, SDL currently does not publish
|
||||
2. Obtain the SDL 2.30.8 Maven package. As of writing, SDL currently does not publish
|
||||
Maven packages, so here is one way to obtain them (other methods are possible):
|
||||
|
||||
1. Download the SDL 2.28.5 source code.
|
||||
1. Download the SDL 2.30.8 source code.
|
||||
2. Run the `build-scripts/android-prefab.sh` script in the SDL repository.
|
||||
3. After building, run `mvn install:install-file
|
||||
-Dfile=build-android-prefab/prefab-2.28.5/SDL2-2.28.5.aar
|
||||
-DpomFile=build-android-prefab/prefab-2.28.5/SDL2-2.28.5.pom` to install it to
|
||||
-Dfile=build-android-prefab/prefab-2.30.8/SDL2-2.30.8.aar
|
||||
-DpomFile=build-android-prefab/prefab-2.30.8/SDL2-2.30.8.pom` to install it to
|
||||
Maven Local.
|
||||
|
||||
3. Open the `desktop_version/VVVVVV-android/` folder in Android Studio.
|
||||
|
||||
@@ -14,8 +14,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 29
|
||||
targetSdkVersion 34
|
||||
versionCode 20004000
|
||||
versionName "2.4"
|
||||
versionCode 20005000
|
||||
versionName "2.5"
|
||||
applicationId "air.com.distractionware.vvvvvvmobile"
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
@@ -110,5 +110,5 @@ dependencies {
|
||||
implementation 'org.jetbrains:annotations:15.0'
|
||||
implementation 'androidx.core:core:1.10.1'
|
||||
implementation 'androidx.exifinterface:exifinterface:1.3.6'
|
||||
implementation 'org.libsdl.android:SDL2:2.28.5'
|
||||
implementation 'org.libsdl.android:SDL2:2.30.8'
|
||||
}
|
||||
|
||||
@@ -246,6 +246,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="وضوح رؤية ما وراء اسم الغرفة أسفل الشاشة." explanation="" max="38*3" max_local="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="خلفية اسم الغرفة شفافة" explanation="" max="38*2" max_local="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="خلفية اسم الغرفة ليست شفافة" explanation="" max="38*2" max_local="38*2"/>
|
||||
<string english="checkpoint saving" translation="تخزين نقطة الحفظ" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="تخزين نقطة الحفظ" explanation="title, makes checkpoints save the game" max="20" max_local="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="تفعيل تخزين التقدم عند كل نقطة حفظ." explanation="" max="38*3" max_local="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="نقاط الحفظ لا تخزن التقدم" explanation="makes checkpoints save the game" max="38*2" max_local="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="نقاط الحفظ تخزن التقدم" explanation="makes checkpoints save the game" max="38*2" max_local="38*2"/>
|
||||
<string english="speedrun options" translation="إعدادات التختيم السريع" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="إعدادات التختيم السريع" explanation="title" max="20" max_local="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="دخول إعدادات متقدمة قد تحظى باهتمام
|
||||
@@ -640,6 +645,7 @@
|
||||
<string english="Tileset Colour Changed" translation="تغير لون مجموعة الخلايا" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3" max_local="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="تغير نوع الأعداء" explanation="level editor, user changed enemy appearance for the room" max="38*3" max_local="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="تغيرت سرعة المنصات إلى {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3" max_local="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="تغيرت سرعة الأعداء إلى {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3" max_local="38*3"/>
|
||||
<string english="Reloaded resources" translation="أعيد فتح ملفات الموارد" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3" max_local="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="خطأ: صيغة المكتوب غير مناسبة" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3" max_local="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="فتحت الغرفة: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3" max_local="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Permet veure què hi ha darrere del nom a la part inferior de la pantalla." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="El fons del nom de sala és TRANSLÚCID" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="El fons del nom de sala és OPAC" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="desa als punts de control" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Desa als punts" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Activa o desactiva que es desi la partida als punts de control." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Desat als punts de control DESACTIVAT" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Desat als punts de control ACTIVAT" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opcions per a speedruns" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Speedruns" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Accedeix a opcions avançades que poden ser d’interès per als speedrunners." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="S’ha canviat el color|del conjunt de peces" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="S’ha canviat el tipus d’enemic" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="La velocitat de les plataformes és ara {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="La velocitat dels enemics és ara {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="S’han recarregat els recursos" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERROR: Format invàlid" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="S’ha obert el mapa: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Yn gadael i chi weld trwy'r hyn sydd y tu ôl i'r enw ar waelod y sgrin." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Mae cefndir enw ystafell yn TRYLOYW" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Mae cefndir enw ystafell yn DI-DRAIDD" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="siecbwyntiau yn arbed" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Arbed-Awto" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Toglwch os dylai siecbwynt arbed y gêm." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Siecbwyntiau yn arbed wedi'i DDIFFODD" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Siecbwyntiau yn arbed YMLAEN" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opsiynau rhediad-gwib" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Opsiynau Rhedwr-Gwib" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Cyrchwch rai gosodiadau uwch a allai fod o ddiddordeb i redwyr cyflym ." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Lliw Set Teil wedi'i Newid" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Newidiodd Math y Gelyn" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Cyflymder llwyfan yw {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Cyflymder y gelyn yw {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Adnoddau wedi'u hail-lwytho" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="GWALL: Fformat annilys" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Map wedi'i lwytho: {filename}.vvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Lässt dich sehen, was sich hinter dem Namen am unteren Rand des Bildschirms verbirgt." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Raumnamen-Hintergrund ist DURCHSICHTIG" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Raumnamen-Hintergrund ist UNDURCHSICHTIG" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="checkpoint-speichern" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Checkpoint-Speichern" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Schalte ein, wenn Checkpoints das Spiel speichern sollen." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Checkpoint-Speichern ist AUS" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Checkpoint-Speichern ist EIN" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="speedrunner-optionen" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Speedrunner-Optionen" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Greife auf erweiterte Einstellungen zu, die für Speedrunner interessant sind." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Tileset-Farbe geändert" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Feindtyp geändert" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Plattformgeschwindigkeit ist jetzt {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Feindgeschwindigkeit ist jetzt {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Ressourcen neu geladen" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="FEHLER: ungültiges Format" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Karte geladen: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="" explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="" explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="" explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Ebligi vidi tion, kio estas malantaŭ la nomo ĉe la ekranmalsupro" explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Ĉambronoma fono estas TRAVIDEBLA" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Ĉambronoma fono estas NETRAVIDEBLA" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="konserveja konduto" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Konserveja konduto" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Baskuligi ĉu la ludo aŭtomate konserviĝu ĉe konservejoj." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Aŭtomata konservado estas MALŜALTA" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Aŭtomata konservado estas ŜALTA" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opcioj de kurludado" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Kurludaj opcioj" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Iuj altnivelaj agordoj, utilaj por kurludistoj." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -461,7 +466,7 @@
|
||||
<string english="New Trophy!" translation="Nova trofeo!" explanation="" max="20"/>
|
||||
<string english="[Press {button} to stop]" translation="[Premu {button} por eliri]" explanation="stop super gravitron" max="40"/>
|
||||
<string english="SUPER GRAVITRON" translation="SUPERGRAVITRONO" explanation="" max="20"/>
|
||||
<string english="SUPER GRAVITRON HIGHSCORE" translation="ALTPOENTARO DE SUPERGRAVITRONO" explanation="" max="38*4"/>
|
||||
<string english="SUPER GRAVITRON HIGHSCORE" translation="REKORDO DE SUPERGRAVITRONO" explanation="" max="38*4"/>
|
||||
<string english="MAP" translation="MAPO" explanation="in-game menu" max="8"/>
|
||||
<string english="GRAV" translation="GRAV" explanation="in-game menu, Gravitron" max="8"/>
|
||||
<string english="SHIP" translation="ŜIPO" explanation="in-game menu, spaceship" max="8"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Kahelara koloro ŝanĝiĝis" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Malamika tipo ŝanĝiĝis" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Platforma rapido nun estas {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Malamika rapido nun estas {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Resursoj reŝargiĝis" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERARO: malĝusta formo" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Ŝargiĝis mapo: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Permite ver qué hay detrás del nombre que aparece en la parte baja de la pantalla." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="El fondo de los nombres de sala es TRASLÚCIDO" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="El fondo de los nombres de sala es OPACO" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="guardar punt. cont." explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Guardar punt. cont." explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Se activa para guardar partida en puntos de control." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Guardar punt. cont. desact." explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Guardar punt. cont. activado" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opciones de speedrun" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Opciones de speedrun" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Accede a opciones avanzadas que podrían interesar a quienes hacen speedrun." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Color de casillas cambiado" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Tipo de enemigo cambiado" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="La velocidad plataforma es {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Velocidad del enemigo en {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Recursos recargados" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERROR: Formato no válido" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Mapa cargado: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Permite ver qué hay detrás del nombre que aparece en la parte inferior de la pantalla." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="El fondo de los nombres de sala es TRASLÚCIDO" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="El fondo de los nombres de sala es OPACO" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="guardando punto de control" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Guardando p. control" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Actívalo para que los puntos de control guarden la partida." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="El guardado en puntos de control está DESACTIVADO" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="El guardado en puntos de control está ACTIVADO" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opciones de speedrun" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Opciones de speedrun" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Accede a opciones avanzadas que podrían interesarte si haces speedrun." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Color de casillas cambiado" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Tipo de enemigo cambiado" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Velocidad de las plataformas: {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Velocidad de los enemigos: {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Recursos recargados" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERROR: Formato no válido" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Mapa cargado: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Te permite ver qué hay atrás del nombre que aparece en la parte inferior de la pantalla." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="El fondo de los nombres de sala es TRASLÚCIDO" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="El fondo de los nombres de sala es OPACO" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="guardando punto de control" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Guardando p. control" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Activalo para que los puntos de control guarden la partida." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="El guardado en puntos de control está DESACTIVADO" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="El guardado en puntos de control está ACTIVADO" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opciones de speedrun" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Opciones de speedrun" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Entrá a opciones avanzadas que podrían interesarte si hacés speedrun." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Color de casillas cambiado" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Tipo de enemigo cambiado" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Velocidad de las plataformas: {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Velocidad de los enemigos: {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Recursos recargados" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERROR: Formato no válido" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Mapa cargado: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Vous permet de voir ce qui se|trouve derrière le nom affiché|en bas de l'écran." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Fond de nom des salles TRANSPARENT" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Fond de nom des salles OPAQUE" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="sauvegarde aux points de contrôle" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Sauvegarde auto" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Active ou non la sauvegarde aux points de contrôle" explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Sauvegarde auto DÉSACTIVÉE" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Sauvegarde auto ACTIVÉE" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="options de speedrun" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Options de speedrun" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Accédez à des paramètres|avancés susceptibles d'intéresser|les speedrunners." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Couleur des tuiles modifiée" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Type d'ennemis modifié" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Vitesse des plateformes réglée sur {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Vitesse des ennemis réglée sur {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Recharger les ressources" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERREUR : format invalide" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Carte chargée : {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -243,6 +243,11 @@ Déan cóip chúltaca, ar eagla na heagla." explanation="translation maintenance
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Beidh tú in ann a fheiceáil céard atá taobh thiar den ainm ag bun an scáileáin." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Cúlra Ainmneacha na Seomraí: TRÉSHOILSEACH" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Cúlra Ainmneacha na Seomraí: TEIMHNEACH" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="ceadaigh 'sábháil seicphointí'" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Sábháil seicphointí" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Roghnaigh an sábhálfar seicphointí an chluiche " explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Tá sábháil seicphointí AS FEIDHM" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Tá sábháil seicphointí I bhFEIDHM" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="socruithe sciuirde" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Socruithe Sciuirde" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Socruithe breise a bhaineann le sciuirdeanna." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -634,6 +639,7 @@ Déan cóip chúltaca, ar eagla na heagla." explanation="translation maintenance
|
||||
<string english="Tileset Colour Changed" translation="Athraíodh Dath na dTíleanna" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Athraíodh Cineál Naimhde" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Luas na n-ardán {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Luas na naimhde {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Athlódáladh acmhainní" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="EARRÁID: Formáid Neamhbhailí" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Mapa lódáilte: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Consente di vedere dietro il nome nella parte bassa dello schermo." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Lo sfondo del nome della stanza è TRASPARENTE" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Lo sfondo del nome della stanza è OPACO" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="salvataggio ai checkpoint" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Salva ai checkpoint" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Attiva/disattiva il salvataggio della partita ai checkpoint" explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Salvataggio ai checkpoint: NO" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Salvataggio ai checkpoint: SÌ" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opzioni speedrun" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Opzioni speedrunner" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Accedi ad alcune impostazioni avanzate di interesse per gli speedrunner." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Colore set di caselle cambiato" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Tipo di nemico cambiato" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="La velocità piattaforma ora è {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="La velocità dei nemici è ora {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Risorse ricaricate" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERRORE: Formato non valido" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Mappa caricata: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -256,6 +256,11 @@ Escキーを押すと表示を終了する。" explanation="" max="38*6" max_loc
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="画面下部に表示されるルームタイトルの背景を半透明にする。" explanation="" max="38*3" max_local="38*2"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="現在の設定: 半透明" explanation="" max="38*2" max_local="38*1"/>
|
||||
<string english="Room name background is OPAQUE" translation="現在の設定: 不透明" explanation="" max="38*2" max_local="38*1"/>
|
||||
<string english="checkpoint saving" translation="チェックポイントでセーブ" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="チェックポイントでセーブ" explanation="title, makes checkpoints save the game" max="20" max_local="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="チェックポイント通過時にゲームを自動セーブするかを切り替える。" explanation="" max="38*3" max_local="38*2"/>
|
||||
<string english="Checkpoint saving is OFF" translation="現在の設定: OFF" explanation="makes checkpoints save the game" max="38*2" max_local="38*1"/>
|
||||
<string english="Checkpoint saving is ON" translation="現在の設定: ON" explanation="makes checkpoints save the game" max="38*2" max_local="38*1"/>
|
||||
<string english="speedrun options" translation="RTA用設定" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="RTA用設定" explanation="title" max="20" max_local="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="RTA/スピードランで役に立つ設定を変更する。" explanation="description for speedrunner options" max="38*5" max_local="38*4"/>
|
||||
@@ -668,6 +673,7 @@ Steam Deckには対応していません。" explanation="" max="38*5" max_local
|
||||
<string english="Tileset Colour Changed" translation="タイルセットのカラーを変更しました" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3" max_local="38*2"/>
|
||||
<string english="Enemy Type Changed" translation="敵の種類を変更しました" explanation="level editor, user changed enemy appearance for the room" max="38*3" max_local="38*2"/>
|
||||
<string english="Platform speed is now {speed}" translation="プラットフォームの速度を {speed} に変更しました" explanation="level editor, user changed speed of platforms for the room" max="38*3" max_local="38*2"/>
|
||||
<string english="Enemy speed is now {speed}" translation="敵のスピードを {speed} に変更しました" explanation="level editor, user changed speed of enemies for the room" max="38*3" max_local="38*2"/>
|
||||
<string english="Reloaded resources" translation="リソースを再読み込みしました" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3" max_local="38*2"/>
|
||||
<string english="ERROR: Invalid format" translation="エラー: 無効な記述形式" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3" max_local="38*2"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="{filename}.vvvvvv をロードしました" explanation="successfully loaded level file" max="38*3" max_local="38*2"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="화면 아래에 있는 이름 뒤쪽에 있는 것을 볼 수 있게 합니다." explanation="" max="38*3" max_local="30*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="방 이름 배경 투명" explanation="" max="38*2" max_local="30*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="방 이름 배경 불투명" explanation="" max="38*2" max_local="30*2"/>
|
||||
<string english="checkpoint saving" translation="체크포인트 저장" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="체크포인트 저장" explanation="title, makes checkpoints save the game" max="20" max_local="16"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="체크포인트 저장 기능을 켜거나 끕니다." explanation="" max="38*3" max_local="30*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="체크포인트 저장 꺼짐" explanation="makes checkpoints save the game" max="38*2" max_local="30*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="체크포인트 저장 켜짐" explanation="makes checkpoints save the game" max="38*2" max_local="30*2"/>
|
||||
<string english="speedrun options" translation="스피드런 설정" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="스피드런 설정" explanation="title" max="20" max_local="16"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="스피드런을 하는 유저들에게 흥미가 갈만한 고급 설정에 진입합니다." explanation="description for speedrunner options" max="38*5" max_local="30*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="타일셋 색 변경됨" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3" max_local="30*3"/>
|
||||
<string english="Enemy Type Changed" translation="적 종류 변경됨" explanation="level editor, user changed enemy appearance for the room" max="38*3" max_local="30*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="플랫폼 속도 현재 {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3" max_local="30*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="적의 속도 현재 {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3" max_local="30*3"/>
|
||||
<string english="Reloaded resources" translation="자원 다시 불러오기" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3" max_local="30*3"/>
|
||||
<string english="ERROR: Invalid format" translation="오류: 이용 불가능한 포맷" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3" max_local="30*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="불러온 지도: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3" max_local="30*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Laat zien wat er achter de naam van een kamer zit onder in beeld." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Kamernaamachtergrond is DOORZICHTIG" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Kamernaamachtergrond is ONDOORZICHTIG" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="opslaan bij checkpoints" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Checkpoint-opslaan" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Bepaal of checkpoints het spel op moeten slaan." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Opslaan bij checkpoints staat UIT" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Opslaan bij checkpoints staat AAN" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="speedrunopties" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Speedrunopties" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Een aantal geavanceerde instellingen die interessant kunnen zijn voor speedrunners." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Tilesetkleur aangepast" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Vijandtype aangepast" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Platformsnelheid is nu {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Vijandsnelheid is nu {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Bronnen opnieuw geladen" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="FOUT: Ongeldig formaat" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Level geladen: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Pozwala widzieć przestrzeń za nazwami pokoi." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Tło za nazwami jest PRZEZROCZYSTE" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Tło za nazwami jest NIEPRZEZROCZYSTE" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="zapis przy punktach przywrócenia" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Punkty Przywrócenia" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Ustaw, czy gra będzie zapisywana poprzez punkty przywrócenia." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Zapis przy punktach przywrócenia jest WYŁĄCZONY" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Zapis przy punktach przywrócenia jest WŁĄCZONY" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opcje dla speedrunnerów" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Opcje Speedrunnerów" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Zaawansowane ustawienia|do speedrunnerów." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Zmieniono Kolor Klocków" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Zmieniono Typ Wroga" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Prędkość platformy: {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Prędkość przeciwników: {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Załadowano zasoby ponownie" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="BŁĄD: Niewłaściwy format" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Wczytano poziom: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Permite ver o que está por trás do nome na parte inferior da tela." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="O plano de fundo do nome da sala está TRANSLÚCIDO" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="O plano de fundo do nome da sala está OPACO" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="salvamento automático" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Salvamento auto" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Selecione se deseja que o jogo tenha pontos de salvamento." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Salvamento automático está DESLIGADO." explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Salvamento automático está LIGADO." explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opções de speedrun" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Opções de speedrun" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Acessa algumas configurações avançadas que podem interessar aos speedrunners." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="A cor do conjunto de blocos foi alterada" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="O tipo de inimigo foi alterado" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="A velocidade da plataforma agora é {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="A velocidade do inimigo agora é {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Recursos recarregados" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERRO: formato inválido" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Mapa carregado: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Define se é possível ver o que está por detrás do nome das salas na parte inferior do ecrã." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Fundo do nome da sala: TRANSPARENTE" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Fundo do nome da sala: OPACO" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="guardar nos pontos de controlo" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Guardar nos pontos" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Liga/desliga a função de guardar nos pontos de controlo." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Guardar nos pontos de controlo NÃO" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Guardar nos pontos de controlo SIM" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="opções de corrida" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Corrida" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Acede a definições avançadas que poderão ser úteis a quem quiser fazer corridas." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Cor de padrão alterada" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Tipo de inimigo alterado" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Velocidade atual da plataforma: {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Velocidade dos inimigos: {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Recursos recarregados" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ERRO: Formato inválido" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Mapa carregado: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Позволяет вам увидеть, что находится позади названий комнат внизу экрана." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Фон названий комнат ПРОЗРАЧНЫЙ" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Фон названий комнат НЕПРОЗРАЧНЫЙ" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="сохранение на точках" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Сохранение на точках" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Выберите, должны ли точки сохранения автоматически сохранять игру." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Сохранение на точках ОТКЛЮЧЕНО" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Сохранение на точках ВКЛЮЧЕНО" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="настройки спидрана" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Для спидранеров" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Просмотрите расширенные настройки, которые могут быть полезны спидранерам." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -657,6 +662,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Цвет плиток изменён" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Тип врагов изменён" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Установлена скорость платформ {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Установлена скорость врагов {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Ресурсы перезагружены" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ОШИБКА: Недопустимый формат" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Карта загружена: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Dozwŏlo widzieć, co je za mianami izbōw." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Tło za mianami je PRZEZDZIYRNE" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Tło za mianami je NIYPRZEZDZIYRNE" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="zapis ôd pōnktōw przywrōcynio" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Pōnkty Przywrōcynio" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Nasztaluj, eli szpil bydzie zachowywany bez pōnkty przywrōcynio." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Zapis ôd pōnktōw przywrōcynio je WYŁŌNCZŌNY" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Zapis ôd pōnktōw przywrōcynio je ZAŁŌNCZŌNY" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="ôpcyje do speedrunnerōw" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Ôpcyje Speedrunnerōw" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Zaawansowane sztalowania|do speedrunnerōw." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Zmiyniōno Farba Klockōw" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Zmiyniōno Zorta Niyprzŏciela" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Gibkoś platformy: {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Gibkoś ôpacznikōw: {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Nafolowano zasoby drugi rŏz" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="FELER: Felerny format" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Nafolowano poziōm: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Ekranın altında oda adı yazılı olan|panelin arkasını görmeni sağlar." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Oda adı arka planı SAYDAM" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Oda adı arka planı OPAK" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="kayıt noktasında kayıt" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="K. Noktasında Kayıt" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Kayıt noktaları oyunu kaydetsin/kaydetmesin." explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="K. noktası kaydı KAPALI" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="K. noktası kaydı AÇIK" explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="speedrun seçenekleri" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Speedrun Seçenekleri" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Speedrun seven oyunculara yönelik bazı gelişmiş seçeneklere eriş." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Kare Renkleri Değişti" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Düşman Türü Değişti" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Platform hızı: {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Şu anki düşman hızı: {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Kaynaklar tekrar yüklendi" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="HATA: Geçersiz format" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Yüklenen harita: {dosyaadi}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -242,6 +242,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Дозволяє побачити те, що розташовано за назвою внизу екрана." explanation="" max="38*3"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="Тло назв кімнат ПРОЗОРЕ" explanation="" max="38*2"/>
|
||||
<string english="Room name background is OPAQUE" translation="Тло назв кімнат НЕПРОЗОРЕ" explanation="" max="38*2"/>
|
||||
<string english="checkpoint saving" translation="збереження в чекпоінтах" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="Чекпоінт. Збереження" explanation="title, makes checkpoints save the game" max="20"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="Увімкніть для збереження гри в чекпоінтах" explanation="" max="38*3"/>
|
||||
<string english="Checkpoint saving is OFF" translation="Збереження в чекпоінтах ВИМК." explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="Checkpoint saving is ON" translation="Збереження в чекпоінтах УВІМК." explanation="makes checkpoints save the game" max="38*2"/>
|
||||
<string english="speedrun options" translation="швидкісна гра" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="Швидкісна гра" explanation="title" max="20"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="Додаткові налаштування, що можуть бути корисні для швидкісного проходження." explanation="description for speedrunner options" max="38*5"/>
|
||||
@@ -632,6 +637,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Колір набору плиток змінено" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3"/>
|
||||
<string english="Enemy Type Changed" translation="Тип ворога змінено" explanation="level editor, user changed enemy appearance for the room" max="38*3"/>
|
||||
<string english="Platform speed is now {speed}" translation="Тепер швидкість платформи {speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3"/>
|
||||
<string english="Enemy speed is now {speed}" translation="Тепер швидкість ворога {speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3"/>
|
||||
<string english="Reloaded resources" translation="Ресурси перезавантажено" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3"/>
|
||||
<string english="ERROR: Invalid format" translation="ПОМИЛКА: Неприпустимий формат" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="Завантажено мапу: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>
|
||||
|
||||
@@ -248,6 +248,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="让你可以看见屏幕底端房间名后面的背景。" explanation="" max="38*3" max_local="25*2"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="房间名背景 透明" explanation="" max="38*2" max_local="25*1"/>
|
||||
<string english="Room name background is OPAQUE" translation="房间名背景 不透明" explanation="" max="38*2" max_local="25*1"/>
|
||||
<string english="checkpoint saving" translation="检查点保存" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="检查点保存" explanation="title, makes checkpoints save the game" max="20" max_local="13"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="设置检查点是否可以保存游戏。" explanation="" max="38*3" max_local="25*2"/>
|
||||
<string english="Checkpoint saving is OFF" translation="检查点保存已关闭" explanation="makes checkpoints save the game" max="38*2" max_local="25*1"/>
|
||||
<string english="Checkpoint saving is ON" translation="检查点保存已开启" explanation="makes checkpoints save the game" max="38*2" max_local="25*1"/>
|
||||
<string english="speedrun options" translation="竞速选项" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="竞速玩家选项" explanation="title" max="20" max_local="13"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="竞速玩家可能会感兴趣的一些高级设定。" explanation="description for speedrunner options" max="38*5" max_local="25*4"/>
|
||||
@@ -642,6 +647,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Tileset颜色已改变" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Enemy Type Changed" translation="敌人类型已改变" explanation="level editor, user changed enemy appearance for the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Platform speed is now {speed}" translation="平台速度现在为{speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Enemy speed is now {speed}" translation="敌人速度现在为{speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Reloaded resources" translation="资源已重新载入" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3" max_local="25*2"/>
|
||||
<string english="ERROR: Invalid format" translation="错误:格式不符合" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3" max_local="25*2"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="已载入地图:{filename}.vvvvvv" explanation="successfully loaded level file" max="38*3" max_local="25*2"/>
|
||||
|
||||
@@ -248,6 +248,11 @@
|
||||
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="讓你可以看見屏幕底端房間名後面的背景。" explanation="" max="38*3" max_local="25*2"/>
|
||||
<string english="Room name background is TRANSLUCENT" translation="房間名背景 透明" explanation="" max="38*2" max_local="25*1"/>
|
||||
<string english="Room name background is OPAQUE" translation="房間名背景 不透明" explanation="" max="38*2" max_local="25*1"/>
|
||||
<string english="checkpoint saving" translation="檢查點保存" explanation="menu option"/>
|
||||
<string english="Checkpoint Saving" translation="檢查點保存" explanation="title, makes checkpoints save the game" max="20" max_local="13"/>
|
||||
<string english="Toggle if checkpoints should save the game." translation="設置檢查點是否可以保存遊戲。" explanation="" max="38*3" max_local="25*2"/>
|
||||
<string english="Checkpoint saving is OFF" translation="檢查點保存已關閉" explanation="makes checkpoints save the game" max="38*2" max_local="25*1"/>
|
||||
<string english="Checkpoint saving is ON" translation="檢查點保存已開啟" explanation="makes checkpoints save the game" max="38*2" max_local="25*1"/>
|
||||
<string english="speedrun options" translation="競速選項" explanation="menu option"/>
|
||||
<string english="Speedrunner Options" translation="競速玩家選項" explanation="title" max="20" max_local="13"/>
|
||||
<string english="Access some advanced settings that might be of interest to speedrunners." translation="競速玩家可能會感興趣的一些高級設定。" explanation="description for speedrunner options" max="38*5" max_local="25*4"/>
|
||||
@@ -642,6 +647,7 @@
|
||||
<string english="Tileset Colour Changed" translation="Tileset 顏色已改變" explanation="level editor, user changed the tileset colour/variant of the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Enemy Type Changed" translation="敵人類型已改變" explanation="level editor, user changed enemy appearance for the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Platform speed is now {speed}" translation="平臺速度現在為{speed}" explanation="level editor, user changed speed of platforms for the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Enemy speed is now {speed}" translation="敵人速度現在爲{speed}" explanation="level editor, user changed speed of enemies for the room" max="38*3" max_local="25*2"/>
|
||||
<string english="Reloaded resources" translation="資源已重新載入" explanation="level editor, reloaded graphics assets/resources, music and sound effects" max="38*3" max_local="25*2"/>
|
||||
<string english="ERROR: Invalid format" translation="錯誤:格式不符合" explanation="user was supposed to enter something like `12,12`, but entered `as@df`" max="38*3" max_local="25*2"/>
|
||||
<string english="Loaded map: {filename}.vvvvvv" translation="已載入地圖:{filename}.vvvvvv" explanation="successfully loaded level file" max="38*3" max_local="25*2"/>
|
||||
|
||||
@@ -178,7 +178,7 @@ bool BUTTONGLYPHS_keyboard_is_available(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#if defined(__ANDROID__) || TARGET_OS_IPHONE
|
||||
return false;
|
||||
#else
|
||||
return !SDL_GetHintBoolean("SteamDeck", SDL_FALSE);
|
||||
|
||||
@@ -57,6 +57,7 @@ RoomProperty::RoomProperty(void)
|
||||
enemyx2=320;
|
||||
enemyy2=240;
|
||||
enemytype=0;
|
||||
enemyv=0;
|
||||
directmode=0;
|
||||
}
|
||||
|
||||
@@ -389,6 +390,7 @@ void customlevelclass::reset(void)
|
||||
roomproperties[i+(j*maxwidth)].enemyx2=320;
|
||||
roomproperties[i+(j*maxwidth)].enemyy2=240;
|
||||
roomproperties[i+(j*maxwidth)].enemytype=0;
|
||||
roomproperties[i+(j*maxwidth)].enemyv=0;
|
||||
roomproperties[i+(j*maxwidth)].directmode=0;
|
||||
}
|
||||
}
|
||||
@@ -402,6 +404,8 @@ void customlevelclass::reset(void)
|
||||
script.textbox_colours.clear();
|
||||
script.add_default_colours();
|
||||
map.specialroomnames.clear();
|
||||
|
||||
player_colour = 0;
|
||||
}
|
||||
|
||||
const int* customlevelclass::loadlevel( int rxi, int ryi )
|
||||
@@ -1264,6 +1268,7 @@ bool customlevelclass::load(std::string _path)
|
||||
edLevelClassElement->QueryIntAttribute("enemyx2", &roomproperties[i].enemyx2);
|
||||
edLevelClassElement->QueryIntAttribute("enemyy2", &roomproperties[i].enemyy2);
|
||||
edLevelClassElement->QueryIntAttribute("enemytype", &roomproperties[i].enemytype);
|
||||
edLevelClassElement->QueryIntAttribute("enemyv", &roomproperties[i].enemyv);
|
||||
edLevelClassElement->QueryIntAttribute("directmode", &roomproperties[i].directmode);
|
||||
|
||||
edLevelClassElement->QueryIntAttribute("warpdir", &roomproperties[i].warpdir);
|
||||
@@ -1411,6 +1416,12 @@ next:
|
||||
map.specialroomnames.push_back(name);
|
||||
}
|
||||
}
|
||||
|
||||
if (SDL_strcmp(pKey, "PlayerColour") == 0)
|
||||
{
|
||||
player_colour = help.Int(pText);
|
||||
game.savecolour = player_colour;
|
||||
}
|
||||
}
|
||||
|
||||
if (mapwidth < maxwidth)
|
||||
@@ -1645,6 +1656,7 @@ bool customlevelclass::save(const std::string& _path)
|
||||
roompropertyElement->SetAttribute( "enemyx2", roomproperties[i].enemyx2);
|
||||
roompropertyElement->SetAttribute( "enemyy2", roomproperties[i].enemyy2);
|
||||
roompropertyElement->SetAttribute( "enemytype", roomproperties[i].enemytype);
|
||||
roompropertyElement->SetAttribute( "enemyv", roomproperties[i].enemyv);
|
||||
roompropertyElement->SetAttribute( "directmode", roomproperties[i].directmode);
|
||||
roompropertyElement->SetAttribute( "warpdir", roomproperties[i].warpdir);
|
||||
|
||||
@@ -1673,40 +1685,27 @@ bool customlevelclass::save(const std::string& _path)
|
||||
}
|
||||
xml::update_tag(data, "script", scriptString.c_str());
|
||||
|
||||
|
||||
if (player_colour != 0)
|
||||
{
|
||||
xml::update_tag(data, "PlayerColour", player_colour);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get rid of this one as well, since older levels don't have this property anyways
|
||||
tinyxml2::XMLElement* element;
|
||||
while ((element = data->FirstChildElement("PlayerColour")) != NULL)
|
||||
{
|
||||
doc.DeleteNode(element);
|
||||
}
|
||||
}
|
||||
|
||||
return FILESYSTEM_saveTiXml2Document(newpath.c_str(), doc);
|
||||
}
|
||||
|
||||
void customlevelclass::generatecustomminimap(void)
|
||||
{
|
||||
map.customzoom = 1;
|
||||
if (mapwidth <= 10 && mapheight <= 10)
|
||||
{
|
||||
map.customzoom = 2;
|
||||
}
|
||||
if (mapwidth <= 5 && mapheight <= 5)
|
||||
{
|
||||
map.customzoom = 4;
|
||||
}
|
||||
|
||||
// Set minimap offsets
|
||||
switch (map.customzoom)
|
||||
{
|
||||
case 4:
|
||||
map.custommmxoff = 24 * (5 - mapwidth);
|
||||
map.custommmyoff = 18 * (5 - mapheight);
|
||||
break;
|
||||
case 2:
|
||||
map.custommmxoff = 12 * (10 - mapwidth);
|
||||
map.custommmyoff = 9 * (10 - mapheight);
|
||||
break;
|
||||
default:
|
||||
map.custommmxoff = 6 * (20 - mapwidth);
|
||||
map.custommmyoff = int(4.5 * (20 - mapheight));
|
||||
break;
|
||||
}
|
||||
|
||||
map.custommmxsize = 240 - (map.custommmxoff * 2);
|
||||
map.custommmysize = 180 - (map.custommmyoff * 2);
|
||||
const MapRenderData data = map.get_render_data();
|
||||
|
||||
// Start drawing the minimap
|
||||
|
||||
@@ -1715,9 +1714,9 @@ void customlevelclass::generatecustomminimap(void)
|
||||
graphics.clear();
|
||||
|
||||
// Scan over the map size
|
||||
for (int j2 = 0; j2 < mapheight; j2++)
|
||||
for (int j2 = data.starty; j2 < data.starty + data.height; j2++)
|
||||
{
|
||||
for (int i2 = 0; i2 < mapwidth; i2++)
|
||||
for (int i2 = data.startx; i2 < data.startx + data.width; i2++)
|
||||
{
|
||||
std::vector<SDL_Point> dark_points;
|
||||
std::vector<SDL_Point> light_points;
|
||||
@@ -1725,12 +1724,12 @@ void customlevelclass::generatecustomminimap(void)
|
||||
bool dark = getroomprop(i2, j2)->tileset == 1;
|
||||
|
||||
// Ok, now scan over each square
|
||||
for (int j = 0; j < 9 * map.customzoom; j++)
|
||||
for (int j = 0; j < 9 * data.zoom; j++)
|
||||
{
|
||||
for (int i = 0; i < 12 * map.customzoom; i++)
|
||||
for (int i = 0; i < 12 * data.zoom; i++)
|
||||
{
|
||||
int tile;
|
||||
switch (map.customzoom)
|
||||
switch (data.zoom)
|
||||
{
|
||||
case 4:
|
||||
tile = absfree(
|
||||
@@ -1755,7 +1754,7 @@ void customlevelclass::generatecustomminimap(void)
|
||||
if (tile >= 1)
|
||||
{
|
||||
// Add this pixel
|
||||
SDL_Point point = { (i2 * 12 * map.customzoom) + i, (j2 * 9 * map.customzoom) + j };
|
||||
SDL_Point point = { ((i2 - data.startx) * 12 * data.zoom) + i, ((j2 - data.starty) * 9 * data.zoom) + j };
|
||||
if (dark)
|
||||
{
|
||||
dark_points.push_back(point);
|
||||
|
||||
@@ -31,6 +31,7 @@ public:
|
||||
FOREACH_PROP(enemyx2, int) \
|
||||
FOREACH_PROP(enemyy2, int) \
|
||||
FOREACH_PROP(enemytype, int) \
|
||||
FOREACH_PROP(enemyv, int) \
|
||||
FOREACH_PROP(directmode, int)
|
||||
|
||||
class RoomProperty
|
||||
@@ -169,6 +170,8 @@ public:
|
||||
SDL_Color getonewaycol(int rx, int ry);
|
||||
SDL_Color getonewaycol(void);
|
||||
bool onewaycol_override;
|
||||
|
||||
int player_colour;
|
||||
};
|
||||
|
||||
bool translate_title(const std::string& title);
|
||||
|
||||
@@ -1048,11 +1048,11 @@ static void draw_entities(void)
|
||||
|
||||
if (entity->p1 == 0) // Facing right
|
||||
{
|
||||
graphics.draw_sprite(x - 4, y, 0, graphics.col_crewcyan);
|
||||
graphics.draw_sprite(x - 4, y, 0, graphics.getcol(cl.player_colour));
|
||||
}
|
||||
else // Non-zero is facing left
|
||||
{
|
||||
graphics.draw_sprite(x - 4, y, 3, graphics.col_crewcyan);
|
||||
graphics.draw_sprite(x - 4, y, 3, graphics.getcol(cl.player_colour));
|
||||
}
|
||||
|
||||
graphics.draw_rect(x, y, 16, 24, graphics.getRGB(255, 255, 164));
|
||||
@@ -1959,6 +1959,8 @@ void editorrenderfixed(void)
|
||||
const RoomProperty* const room = cl.getroomprop(ed.levx, ed.levy);
|
||||
graphics.updatetitlecolours();
|
||||
|
||||
graphics.trinketcolset = false;
|
||||
|
||||
game.customcol = cl.getlevelcol(room->tileset, room->tilecol) + 1;
|
||||
ed.entcol = cl.getenemycol(game.customcol);
|
||||
|
||||
@@ -3096,12 +3098,22 @@ static void handle_draw_input()
|
||||
|
||||
const int room = ed.levx + ed.levy * cl.maxwidth;
|
||||
const int plat_speed = cl.roomproperties[room].platv;
|
||||
const int enemy_speed = cl.roomproperties[room].enemyv;
|
||||
|
||||
const bool ctrl = key.keymap[SDLK_LCTRL] || key.keymap[SDLK_RCTRL];
|
||||
const bool shift = key.keymap[SDLK_LSHIFT] || key.keymap[SDLK_RSHIFT];
|
||||
if (key.keymap[SDLK_COMMA])
|
||||
{
|
||||
if (key.keymap[SDLK_LCTRL] || key.keymap[SDLK_RCTRL])
|
||||
if (ctrl)
|
||||
{
|
||||
cl.roomproperties[room].platv = plat_speed - 1;
|
||||
if (shift)
|
||||
{
|
||||
cl.roomproperties[room].enemyv = enemy_speed - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
cl.roomproperties[room].platv = plat_speed - 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3111,9 +3123,16 @@ static void handle_draw_input()
|
||||
}
|
||||
else if (key.keymap[SDLK_PERIOD])
|
||||
{
|
||||
if (key.keymap[SDLK_LCTRL] || key.keymap[SDLK_RCTRL])
|
||||
if (ctrl)
|
||||
{
|
||||
cl.roomproperties[room].platv = plat_speed + 1;
|
||||
if (shift)
|
||||
{
|
||||
cl.roomproperties[room].enemyv = enemy_speed + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
cl.roomproperties[room].platv = plat_speed + 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3134,6 +3153,18 @@ static void handle_draw_input()
|
||||
ed.show_note(buffer);
|
||||
}
|
||||
|
||||
if (enemy_speed != cl.roomproperties[room].enemyv)
|
||||
{
|
||||
char buffer[3 * SCREEN_WIDTH_CHARS + 1];
|
||||
vformat_buf(
|
||||
buffer, sizeof(buffer),
|
||||
loc::gettext("Enemy speed is now {speed}"),
|
||||
"speed:int",
|
||||
cl.roomproperties[room].enemyv + 4
|
||||
);
|
||||
ed.show_note(buffer);
|
||||
}
|
||||
|
||||
if (key.keymap[SDLK_SPACE])
|
||||
{
|
||||
ed.toolbox_open = !ed.toolbox_open;
|
||||
|
||||
@@ -11,14 +11,14 @@ entclass::entclass(void)
|
||||
void entclass::clear(void)
|
||||
{
|
||||
invis = false;
|
||||
type = 0;
|
||||
type = EntityType_PLAYER;
|
||||
size = 0;
|
||||
tile = 0;
|
||||
rule = 0;
|
||||
state = 0;
|
||||
statedelay = 0;
|
||||
life = 0;
|
||||
colour = 0;
|
||||
colour = EntityColour_CREW_CYAN;
|
||||
para = 0;
|
||||
behave = 0;
|
||||
animate = 0;
|
||||
@@ -108,7 +108,7 @@ void entclass::setenemy( int t )
|
||||
case 0:
|
||||
tile = 60;
|
||||
animate = 2;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
behave = 10;
|
||||
w = 32;
|
||||
h = 32;
|
||||
@@ -119,7 +119,7 @@ void entclass::setenemy( int t )
|
||||
lerpoldyp += 10;
|
||||
tile = 63;
|
||||
animate = 100; //LIES
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
behave = 11;
|
||||
para = 9; //destroyed when outside
|
||||
x1 = -200;
|
||||
@@ -132,7 +132,7 @@ void entclass::setenemy( int t )
|
||||
case 2:
|
||||
tile = 62;
|
||||
animate = 100;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
behave = -1;
|
||||
w = 32;
|
||||
h = 32;
|
||||
@@ -147,7 +147,7 @@ void entclass::setenemy( int t )
|
||||
tile = 72;
|
||||
animate = 3;
|
||||
size = 9;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
behave = 12;
|
||||
w = 64;
|
||||
h = 40;
|
||||
@@ -161,7 +161,7 @@ void entclass::setenemy( int t )
|
||||
lerpoldyp -= 4;
|
||||
tile = 76;
|
||||
animate = 100; // Clouds
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
behave = 13;
|
||||
para = -6; //destroyed when outside
|
||||
x2 = 400;
|
||||
@@ -173,7 +173,7 @@ void entclass::setenemy( int t )
|
||||
case 2:
|
||||
tile = 77;
|
||||
animate = 100;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
behave = -1;
|
||||
w = 32;
|
||||
h = 16;
|
||||
@@ -195,32 +195,32 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
//Space Station 1
|
||||
case rn(12, 3): //Security Drone
|
||||
tile = 36;
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
animate = 1;
|
||||
break;
|
||||
case rn(13, 3): //Wavelengths
|
||||
tile = 32;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 32;
|
||||
break;
|
||||
case rn(15, 3): //Traffic
|
||||
tile = 28;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
animate = 1;
|
||||
w = 22;
|
||||
h = 32;
|
||||
break;
|
||||
case rn(12, 5): //The Yes Men
|
||||
tile = 40;
|
||||
colour = 9;
|
||||
colour = EntityColour_ENEMY_YELLOW;
|
||||
animate = 1;
|
||||
w = 20;
|
||||
h = 20;
|
||||
break;
|
||||
case rn(13, 6): //Hunchbacked Guards
|
||||
tile = 44;
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 20;
|
||||
@@ -231,7 +231,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
{
|
||||
//transmittor
|
||||
tile = 104;
|
||||
colour = 4;
|
||||
colour = EntityColour_INACTIVE_ENTITY;
|
||||
animate = 7;
|
||||
w = 16;
|
||||
h = 16;
|
||||
@@ -244,7 +244,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
{
|
||||
//radar dish
|
||||
tile =124;
|
||||
colour = 4;
|
||||
colour = EntityColour_INACTIVE_ENTITY;
|
||||
animate = 6;
|
||||
w = 32;
|
||||
h = 32;
|
||||
@@ -260,37 +260,37 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
//The Lab
|
||||
case rn(4, 0):
|
||||
tile = 78;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(2, 0):
|
||||
tile = 88;
|
||||
colour = 11;
|
||||
colour = EntityColour_ENEMY_CYAN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
//Space Station 2
|
||||
case rn(14, 11):
|
||||
colour = 17;
|
||||
colour = EntityColour_ENEMY_ORANGE;
|
||||
break; //Lies
|
||||
case rn(16, 11):
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
break; //Lies
|
||||
case rn(13, 10):
|
||||
colour = 11;
|
||||
colour = EntityColour_ENEMY_CYAN;
|
||||
break; //Factory
|
||||
case rn(13, 9):
|
||||
colour = 9;
|
||||
colour = EntityColour_ENEMY_YELLOW;
|
||||
break; //Factory
|
||||
case rn(13, 8):
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
break; //Factory
|
||||
case rn(11, 13): //Truth
|
||||
tile = 64;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 100;
|
||||
w = 44;
|
||||
h = 10;
|
||||
@@ -298,7 +298,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
break;
|
||||
case rn(17, 7): //Brass sent us under the top
|
||||
tile =82;
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
animate = 5;
|
||||
w = 28;
|
||||
h = 32;
|
||||
@@ -306,42 +306,42 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
break;
|
||||
case rn(10, 7): // (deception)
|
||||
tile = 92;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(14, 13): // (chose poorly)
|
||||
tile = 56;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
animate = 1;
|
||||
w = 15;
|
||||
h = 24;
|
||||
break;
|
||||
case rn(13, 12): // (backsliders)
|
||||
tile = 164;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(14, 8): // (wheel of fortune room)
|
||||
tile = 116;
|
||||
colour = 12;
|
||||
colour = EntityColour_ENEMY_BLUE;
|
||||
animate = 1;
|
||||
w = 32;
|
||||
h = 32;
|
||||
break;
|
||||
case rn(16, 9): // (seeing dollar signs)
|
||||
tile = 68;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(16, 7): // (tomb of mad carew)
|
||||
tile = 106;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 2;
|
||||
w = 24;
|
||||
h = 25;
|
||||
@@ -349,7 +349,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
//Warp Zone
|
||||
case rn(15, 2): // (numbers)
|
||||
tile = 100;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
animate = 1;
|
||||
w = 32;
|
||||
h = 14;
|
||||
@@ -358,7 +358,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
break;
|
||||
case rn(16, 2): // (Manequins)
|
||||
tile = 52;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 5;
|
||||
w = 16;
|
||||
h = 25;
|
||||
@@ -367,28 +367,28 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
break;
|
||||
case rn(18, 0): // (Obey)
|
||||
tile = 51;
|
||||
colour = 11;
|
||||
colour = EntityColour_ENEMY_CYAN;
|
||||
animate = 100;
|
||||
w = 30;
|
||||
h = 14;
|
||||
break;
|
||||
case rn(19, 1): // Ascending and Descending
|
||||
tile = 48;
|
||||
colour = 9;
|
||||
colour = EntityColour_ENEMY_YELLOW;
|
||||
animate = 5;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(19, 2): // Shockwave Rider
|
||||
tile = 176;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(18, 3): // Mind the gap
|
||||
tile = 168;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
@@ -397,7 +397,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
if (yp ==96)
|
||||
{
|
||||
tile = 160;
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
@@ -405,7 +405,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
else
|
||||
{
|
||||
tile = 156;
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
@@ -413,14 +413,14 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
break;
|
||||
case rn(16, 0): // I love you
|
||||
tile = 112;
|
||||
colour = 8;
|
||||
colour = EntityColour_ENEMY_PINK;
|
||||
animate = 5;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(14, 2): // That's why I have to kill you
|
||||
tile = 114;
|
||||
colour = 6;
|
||||
colour = EntityColour_ENEMY_RED;
|
||||
animate = 5;
|
||||
w = 16;
|
||||
h = 16;
|
||||
@@ -430,7 +430,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
if (xp ==88)
|
||||
{
|
||||
tile = 54+12;
|
||||
colour = 12;
|
||||
colour = EntityColour_ENEMY_BLUE;
|
||||
animate = 100;
|
||||
w = 60;
|
||||
h = 16;
|
||||
@@ -439,7 +439,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
else
|
||||
{
|
||||
tile = 54;
|
||||
colour = 12;
|
||||
colour = EntityColour_ENEMY_BLUE;
|
||||
animate = 100;
|
||||
w = 60;
|
||||
h = 16;
|
||||
@@ -449,62 +449,62 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
//Final level
|
||||
case rn(50-100, 53-100): //The Yes Men
|
||||
tile = 40;
|
||||
colour = 9;
|
||||
colour = EntityColour_ENEMY_YELLOW;
|
||||
animate = 1;
|
||||
w = 20;
|
||||
h = 20;
|
||||
break;
|
||||
case rn(48-100, 51-100): //Wavelengths
|
||||
tile = 32;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 32;
|
||||
break;
|
||||
case rn(43-100,52-100): // Ascending and Descending
|
||||
tile = 48;
|
||||
colour = 9;
|
||||
colour = EntityColour_ENEMY_YELLOW;
|
||||
animate = 5;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(46-100,51-100): //kids his age
|
||||
tile = 88;
|
||||
colour = 11;
|
||||
colour = EntityColour_ENEMY_CYAN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(43-100,51-100): // Mind the gap
|
||||
tile = 168;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(44-100,51-100): // vertigo?
|
||||
tile = 172;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 100;
|
||||
w = 32;
|
||||
h = 32;
|
||||
break;
|
||||
case rn(44-100,52-100): // (backsliders)
|
||||
tile = 164;
|
||||
colour = 7;
|
||||
colour = EntityColour_ENEMY_GREEN;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(43-100, 56-100): //Intermission 1
|
||||
tile = 88;
|
||||
colour = 21;
|
||||
colour = EntityColour_ENEMY_GRAVITRON;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
break;
|
||||
case rn(45-100, 56-100): //Intermission 1
|
||||
tile = 88;
|
||||
colour = 21;
|
||||
colour = EntityColour_ENEMY_GRAVITRON;
|
||||
animate = 1;
|
||||
w = 16;
|
||||
h = 16;
|
||||
@@ -515,7 +515,7 @@ void entclass::setenemyroom( int rx, int ry )
|
||||
case rn(11, 8):
|
||||
case rn(12, 8):
|
||||
tile = 0;
|
||||
colour = 102;
|
||||
colour = EntityColour_TELEPORTER_FLASHING;
|
||||
animate = 0;
|
||||
w = 464;
|
||||
h = 320;
|
||||
@@ -613,17 +613,24 @@ void entclass::updatecolour(void)
|
||||
switch (size)
|
||||
{
|
||||
case 0: // Sprites
|
||||
case 3: // Big chunky pixels!
|
||||
case 4: // Small pickups
|
||||
case 7: // Teleporter
|
||||
case 9: // Really Big Sprite! (2x2)
|
||||
case 10: // 2x1 Sprite
|
||||
case 13: // Special for epilogue: huge hero!
|
||||
realcol = graphics.getcol(colour);
|
||||
break;
|
||||
case 3: // Big chunky pixels!
|
||||
realcol = graphics.bigchunkygetcol(colour);
|
||||
break;
|
||||
case 4: // Small pickups
|
||||
realcol = graphics.huetilegetcol();
|
||||
case 5: // Horizontal gravity line
|
||||
case 6: // Vertical gravity line
|
||||
if (life == 0)
|
||||
{
|
||||
realcol = graphics.getcol(colour);
|
||||
}
|
||||
else
|
||||
{
|
||||
realcol = graphics.getcol(24);
|
||||
}
|
||||
break;
|
||||
case 11: // The fucking elephant
|
||||
if (game.noflashingmode)
|
||||
@@ -650,8 +657,8 @@ void entclass::updatecolour(void)
|
||||
|
||||
bool entclass::ishumanoid(void)
|
||||
{
|
||||
return type == 0
|
||||
|| type == 12
|
||||
|| type == 14
|
||||
|| type == 55;
|
||||
return type == EntityType_PLAYER
|
||||
|| type == EntityType_CREWMATE
|
||||
|| type == EntityType_SUPERCREWMATE
|
||||
|| type == EntityType_COLLECTABLE_CREWMATE;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,34 @@
|
||||
|
||||
#define rn( rx, ry) ((rx) + ((ry) * 100))
|
||||
|
||||
enum EntityType
|
||||
{
|
||||
EntityType_INVALID = -1,
|
||||
EntityType_PLAYER,
|
||||
EntityType_MOVING,
|
||||
EntityType_DISAPPEARING_PLATFORM,
|
||||
EntityType_QUICKSAND,
|
||||
EntityType_GRAVITY_TOKEN,
|
||||
EntityType_PARTICLE,
|
||||
EntityType_COIN,
|
||||
EntityType_TRINKET,
|
||||
EntityType_CHECKPOINT,
|
||||
EntityType_HORIZONTAL_GRAVITY_LINE,
|
||||
EntityType_VERTICAL_GRAVITY_LINE,
|
||||
EntityType_WARP_TOKEN,
|
||||
EntityType_CREWMATE,
|
||||
EntityType_TERMINAL,
|
||||
EntityType_SUPERCREWMATE,
|
||||
EntityType_TROPHY,
|
||||
EntityType_GRAVITRON_ENEMY = 23,
|
||||
EntityType_WARP_LINE_LEFT = 51,
|
||||
EntityType_WARP_LINE_RIGHT = 52,
|
||||
EntityType_WARP_LINE_TOP = 53,
|
||||
EntityType_WARP_LINE_BOTTOM = 54,
|
||||
EntityType_COLLECTABLE_CREWMATE = 55,
|
||||
EntityType_TELEPORTER = 100
|
||||
};
|
||||
|
||||
class entclass
|
||||
{
|
||||
public:
|
||||
@@ -26,11 +54,13 @@ public:
|
||||
public:
|
||||
//Fundamentals
|
||||
bool invis;
|
||||
int type, size, tile, rule;
|
||||
EntityType type;
|
||||
int size, tile, rule;
|
||||
int state, statedelay;
|
||||
int behave, animate;
|
||||
float para;
|
||||
int life, colour;
|
||||
int life;
|
||||
int colour; // As out-of-bounds colours are allowed, this should be an int instead of an EnemyColour.
|
||||
|
||||
//Position and velocity
|
||||
int oldxp, oldyp;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,10 +5,10 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "Maths.h"
|
||||
#include "Ent.h"
|
||||
#include "BlockV.h"
|
||||
#include "Ent.h"
|
||||
#include "Game.h"
|
||||
#include "Maths.h"
|
||||
|
||||
enum
|
||||
{
|
||||
@@ -20,18 +20,6 @@ enum
|
||||
ACTIVITY = 5
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
CYAN = 0,
|
||||
PURPLE = 20,
|
||||
YELLOW = 14,
|
||||
RED = 15,
|
||||
GREEN = 13,
|
||||
BLUE = 16,
|
||||
GRAY = 19,
|
||||
TELEPORTER = 102
|
||||
};
|
||||
|
||||
class entityclass
|
||||
{
|
||||
public:
|
||||
@@ -56,7 +44,7 @@ public:
|
||||
createblock(DAMAGE, 312, -8, 16, 260);
|
||||
}
|
||||
|
||||
int swncolour(int t );
|
||||
int swncolour(int t);
|
||||
|
||||
void swnenemiescol(int t);
|
||||
|
||||
@@ -106,7 +94,7 @@ public:
|
||||
|
||||
int getlineat(int t);
|
||||
|
||||
int getcrewman(int t, int fallback = 0);
|
||||
int getcrewman(int t);
|
||||
int getcustomcrewman(int t);
|
||||
|
||||
int getteleporter(void);
|
||||
|
||||
@@ -333,15 +333,35 @@ int FILESYSTEM_init(char *argvZero, char* baseDir, char *assetsPath, char* langD
|
||||
vlog_error("You do not have data.zip!");
|
||||
vlog_error("Grab it from your purchased copy of the game,");
|
||||
vlog_error("or get it from the free Make and Play Edition.");
|
||||
vlog_error("https://thelettervsixtim.es/makeandplay/");
|
||||
|
||||
SDL_MessageBoxData messagebox;
|
||||
messagebox.flags = SDL_MESSAGEBOX_ERROR;
|
||||
messagebox.window = NULL;
|
||||
messagebox.title = "data.zip missing!";
|
||||
messagebox.message = "You do not have data.zip!"
|
||||
"\n\nGrab it from your purchased copy of the game,"
|
||||
"\nor get it from the free Make and Play Edition.";
|
||||
|
||||
messagebox.numbuttons = 2;
|
||||
SDL_MessageBoxButtonData buttons[2];
|
||||
buttons[0].flags = SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT;
|
||||
buttons[0].flags |= SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT;
|
||||
buttons[0].buttonid = 0;
|
||||
buttons[0].text = "OK";
|
||||
buttons[1].flags = 0;
|
||||
buttons[1].buttonid = 1;
|
||||
buttons[1].text = "Open Download Page";
|
||||
messagebox.buttons = buttons;
|
||||
messagebox.colorScheme = NULL;
|
||||
|
||||
int clicked = 0;
|
||||
SDL_ShowMessageBox(&messagebox, &clicked);
|
||||
if (clicked == 1)
|
||||
{
|
||||
SDL_OpenURL("https://thelettervsixtim.es/makeandplay/");
|
||||
}
|
||||
|
||||
SDL_ShowSimpleMessageBox(
|
||||
SDL_MESSAGEBOX_ERROR,
|
||||
"data.zip missing!",
|
||||
"You do not have data.zip!"
|
||||
"\n\nGrab it from your purchased copy of the game,"
|
||||
"\nor get it from the free Make and Play Edition.",
|
||||
NULL
|
||||
);
|
||||
VVV_exit(1);
|
||||
return 0;
|
||||
}
|
||||
@@ -1331,6 +1351,19 @@ static int PLATFORM_getOSDirectory(char* output, const size_t output_size)
|
||||
}
|
||||
SDL_snprintf(output, output_size, "%s/", externalStoragePath);
|
||||
return 1;
|
||||
#elif TARGET_OS_IPHONE
|
||||
// (ab)use SDL APIs to get the path to the Documents folder without needing Objective-C
|
||||
const char* prefsPath = SDL_GetPrefPath("", "");
|
||||
if (prefsPath == NULL)
|
||||
{
|
||||
vlog_error(
|
||||
"Could not get OS directory: %s",
|
||||
SDL_GetError()
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
SDL_snprintf(output, output_size, "%s/../../Documents/", prefsPath);
|
||||
return 1;
|
||||
#else
|
||||
const char* prefDir = PHYSFS_getPrefDir("distractionware", "VVVVVV");
|
||||
if (prefDir == NULL)
|
||||
|
||||
@@ -146,7 +146,7 @@ void Game::init(void)
|
||||
prevroomy = 0;
|
||||
saverx = 0;
|
||||
savery = 0;
|
||||
savecolour = 0;
|
||||
savecolour = EntityColour_CREW_CYAN;
|
||||
|
||||
mutebutton = 0;
|
||||
muted = false;
|
||||
@@ -225,6 +225,7 @@ void Game::init(void)
|
||||
ndmresulthardestroom_x = hardestroom_x;
|
||||
ndmresulthardestroom_y = hardestroom_y;
|
||||
ndmresulthardestroom_specialname = false;
|
||||
nodeatheligible = false;
|
||||
|
||||
customcol=0;
|
||||
|
||||
@@ -380,6 +381,12 @@ void Game::init(void)
|
||||
screenshot_border_timer = 0;
|
||||
screenshot_saved_success = false;
|
||||
|
||||
#if defined(__ANDROID__) || TARGET_OS_IPHONE
|
||||
checkpoint_saving = true;
|
||||
#else
|
||||
checkpoint_saving = false;
|
||||
#endif
|
||||
|
||||
setdefaultcontrollerbuttons();
|
||||
}
|
||||
|
||||
@@ -825,7 +832,7 @@ static void savetele_textbox_success(textboxclass* THIS)
|
||||
THIS->pad(3, 3);
|
||||
}
|
||||
|
||||
static void savetele_textbox_fail(textboxclass* THIS)
|
||||
static void save_textbox_fail(textboxclass* THIS)
|
||||
{
|
||||
THIS->lines.clear();
|
||||
THIS->lines.push_back(loc::gettext("ERROR: Could not save game!"));
|
||||
@@ -833,6 +840,31 @@ static void savetele_textbox_fail(textboxclass* THIS)
|
||||
THIS->pad(1, 1);
|
||||
}
|
||||
|
||||
void Game::show_save_fail(void)
|
||||
{
|
||||
graphics.createtextboxflipme("", -1, 12, TEXT_COLOUR("red"));
|
||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||
graphics.textboxcenterx();
|
||||
graphics.textboxtimer(50);
|
||||
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, save_textbox_fail);
|
||||
}
|
||||
|
||||
void Game::checkpoint_save(void)
|
||||
{
|
||||
if (checkpoint_saving && !inspecial() && (!map.custommode || (map.custommode && map.custommodeforreal)) && !cliplaytest)
|
||||
{
|
||||
bool success = map.custommode ? customsavequick(cl.ListOfMetaData[playcustomlevel].filename) : savequick();
|
||||
gamesaved = success;
|
||||
gamesavefailed = !success;
|
||||
|
||||
if (gamesavefailed)
|
||||
{
|
||||
show_save_fail();
|
||||
graphics.textboxapplyposition();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Game::savetele_textbox(void)
|
||||
{
|
||||
if (inspecial() || map.custommode)
|
||||
@@ -850,11 +882,7 @@ void Game::savetele_textbox(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.createtextboxflipme("", -1, 12, TEXT_COLOUR("red"));
|
||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||
graphics.textboxcenterx();
|
||||
graphics.textboxtimer(50);
|
||||
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, savetele_textbox_fail);
|
||||
show_save_fail();
|
||||
}
|
||||
graphics.textboxapplyposition();
|
||||
}
|
||||
@@ -2539,7 +2567,7 @@ void Game::updatestate(void)
|
||||
int i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
|
||||
int j = obj.getteleporter();
|
||||
@@ -2560,7 +2588,7 @@ void Game::updatestate(void)
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].tile = 1;
|
||||
obj.entities[i].colour = 101;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2733,7 +2761,7 @@ void Game::updatestate(void)
|
||||
int i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = true;
|
||||
}
|
||||
|
||||
@@ -2747,7 +2775,7 @@ void Game::updatestate(void)
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].tile = 1;
|
||||
obj.entities[i].colour = 100;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_INACTIVE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3316,11 +3344,14 @@ void Game::updatestate(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (nodeathmode)
|
||||
if (nodeathmode || nodeatheligible)
|
||||
{
|
||||
unlockAchievement("vvvvvvmaster"); //bloody hell
|
||||
unlocknum(UnlockTrophy_NODEATHMODE_COMPLETE);
|
||||
}
|
||||
|
||||
if (nodeathmode)
|
||||
{
|
||||
setstate(3520);
|
||||
setstatedelay(0);
|
||||
}
|
||||
@@ -3338,7 +3369,7 @@ void Game::updatestate(void)
|
||||
int i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 102;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
|
||||
incstate();
|
||||
@@ -3380,7 +3411,7 @@ void Game::updatestate(void)
|
||||
int i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = true;
|
||||
}
|
||||
|
||||
@@ -3465,7 +3496,7 @@ void Game::updatestate(void)
|
||||
int i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = true;
|
||||
}
|
||||
|
||||
@@ -3473,7 +3504,7 @@ void Game::updatestate(void)
|
||||
if(INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].tile = 1;
|
||||
obj.entities[i].colour = 100;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_INACTIVE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3517,9 +3548,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 1;
|
||||
|
||||
@@ -3648,9 +3679,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 1;
|
||||
|
||||
@@ -3761,9 +3792,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 0;
|
||||
|
||||
@@ -3874,9 +3905,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 1;
|
||||
|
||||
@@ -3992,9 +4023,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 1;
|
||||
|
||||
@@ -4110,9 +4141,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 0;
|
||||
|
||||
@@ -4226,7 +4257,7 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 1;
|
||||
@@ -4339,9 +4370,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 1;
|
||||
|
||||
@@ -4452,9 +4483,9 @@ void Game::updatestate(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[j].tile = 2;
|
||||
obj.entities[j].colour = 101;
|
||||
obj.entities[j].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].invis = false;
|
||||
obj.entities[i].dir = 1;
|
||||
|
||||
@@ -4940,6 +4971,10 @@ void Game::deserializesettings(tinyxml2::XMLElement* dataNode, struct ScreenSett
|
||||
roomname_translator::set_enabled(help.Int(pText));
|
||||
}
|
||||
|
||||
if (SDL_strcmp(pKey, "checkpoint_saving") == 0)
|
||||
{
|
||||
checkpoint_saving = help.Int(pText);
|
||||
}
|
||||
}
|
||||
|
||||
setdefaultcontrollerbuttons();
|
||||
@@ -5198,6 +5233,8 @@ void Game::serializesettings(tinyxml2::XMLElement* dataNode, const struct Screen
|
||||
xml::update_tag(dataNode, "english_sprites", (int) loc::english_sprites);
|
||||
xml::update_tag(dataNode, "new_level_font", loc::new_level_font.c_str());
|
||||
xml::update_tag(dataNode, "roomname_translator", (int) roomname_translator::enabled);
|
||||
|
||||
xml::update_tag(dataNode, "checkpoint_saving", (int) checkpoint_saving);
|
||||
}
|
||||
|
||||
static bool settings_loaded = false;
|
||||
@@ -5330,7 +5367,7 @@ void Game::deathsequence(void)
|
||||
}
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 1;
|
||||
obj.entities[i].colour = EntityColour_DEAD;
|
||||
|
||||
obj.entities[i].invis = false;
|
||||
}
|
||||
@@ -5897,6 +5934,10 @@ void Game::customloadquick(const std::string& savfile)
|
||||
{
|
||||
map.customshowmm = help.Int(pText);
|
||||
}
|
||||
else if (SDL_strcmp(pKey, "mapreveal") == 0)
|
||||
{
|
||||
map.revealmap = help.Int(pText);
|
||||
}
|
||||
else if (SDL_strcmp(pKey, "disabletemporaryaudiopause") == 0)
|
||||
{
|
||||
disabletemporaryaudiopause = help.Int(pText);
|
||||
@@ -5911,6 +5952,48 @@ void Game::customloadquick(const std::string& savfile)
|
||||
map.roomnameset = true;
|
||||
map.roomname_special = true;
|
||||
}
|
||||
else if (SDL_strcmp(pKey, "currentregion") == 0)
|
||||
{
|
||||
map.currentregion = help.Int(pText);
|
||||
}
|
||||
else if (SDL_strcmp(pKey, "regions") == 0)
|
||||
{
|
||||
tinyxml2::XMLElement* pElem2;
|
||||
for (pElem2 = pElem->FirstChildElement(); pElem2 != NULL; pElem2 = pElem2->NextSiblingElement())
|
||||
{
|
||||
int thisid = 0;
|
||||
int thisrx = 0;
|
||||
int thisry = 0;
|
||||
int thisrx2 = (cl.mapwidth - 1);
|
||||
int thisry2 = (cl.mapheight - 1);
|
||||
if (pElem2->Attribute("id"))
|
||||
{
|
||||
thisid = help.Int(pElem2->Attribute("id"));
|
||||
}
|
||||
|
||||
for (tinyxml2::XMLElement* pElem3 = pElem2->FirstChildElement(); pElem3 != NULL; pElem3 = pElem3->NextSiblingElement())
|
||||
{
|
||||
if (SDL_strcmp(pElem3->Value(), "rx") == 0 && pElem3->GetText() != NULL)
|
||||
{
|
||||
thisrx = help.Int(pElem3->GetText());
|
||||
}
|
||||
if (SDL_strcmp(pElem3->Value(), "ry") == 0 && pElem3->GetText() != NULL)
|
||||
{
|
||||
thisry = help.Int(pElem3->GetText());
|
||||
}
|
||||
if (SDL_strcmp(pElem3->Value(), "rx2") == 0 && pElem3->GetText() != NULL)
|
||||
{
|
||||
thisrx2 = help.Int(pElem3->GetText());
|
||||
}
|
||||
if (SDL_strcmp(pElem3->Value(), "ry2") == 0 && pElem3->GetText() != NULL)
|
||||
{
|
||||
thisry2 = help.Int(pElem3->GetText());
|
||||
}
|
||||
}
|
||||
|
||||
map.setregion(thisid, thisrx, thisry, thisrx2, thisry2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6295,6 +6378,41 @@ bool Game::customsavequick(const std::string& savfile)
|
||||
|
||||
xml::update_tag(msgs, "crewmates", crewmates());
|
||||
|
||||
xml::update_tag(msgs, "currentregion", map.currentregion);
|
||||
|
||||
tinyxml2::XMLElement* msg = xml::update_element_delete_contents(msgs, "regions");
|
||||
for (size_t i = 0; i < SDL_arraysize(map.region); i++)
|
||||
{
|
||||
if (map.region[i].isvalid)
|
||||
{
|
||||
tinyxml2::XMLElement* region_el;
|
||||
region_el = doc.NewElement("region");
|
||||
|
||||
region_el->SetAttribute("id", (help.String(i).c_str()));
|
||||
|
||||
tinyxml2::XMLElement* rx_el;
|
||||
rx_el = doc.NewElement("rx");
|
||||
rx_el->LinkEndChild(doc.NewText(help.String(map.region[i].rx).c_str()));
|
||||
region_el->LinkEndChild(rx_el);
|
||||
|
||||
tinyxml2::XMLElement* ry_el;
|
||||
ry_el = doc.NewElement("ry");
|
||||
ry_el->LinkEndChild(doc.NewText(help.String(map.region[i].ry).c_str()));
|
||||
region_el->LinkEndChild(ry_el);
|
||||
|
||||
tinyxml2::XMLElement* rx2_el;
|
||||
rx2_el = doc.NewElement("rx2");
|
||||
rx2_el->LinkEndChild(doc.NewText(help.String(map.region[i].rx2).c_str()));
|
||||
region_el->LinkEndChild(rx2_el);
|
||||
|
||||
tinyxml2::XMLElement* ry2_el;
|
||||
ry2_el = doc.NewElement("ry2");
|
||||
ry2_el->LinkEndChild(doc.NewText(help.String(map.region[i].ry2).c_str()));
|
||||
region_el->LinkEndChild(ry2_el);
|
||||
|
||||
msg->LinkEndChild(region_el);
|
||||
}
|
||||
}
|
||||
|
||||
//Special stats
|
||||
|
||||
@@ -6336,6 +6454,8 @@ bool Game::customsavequick(const std::string& savfile)
|
||||
|
||||
xml::update_tag(msgs, "showminimap", (int) map.customshowmm);
|
||||
|
||||
xml::update_tag(msgs, "mapreveal", (int) map.revealmap);
|
||||
|
||||
xml::update_tag(msgs, "disabletemporaryaudiopause", (int) disabletemporaryaudiopause);
|
||||
|
||||
xml::update_tag(msgs, "showtrinkets", (int) map.showtrinkets);
|
||||
@@ -6856,6 +6976,7 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
|
||||
option(loc::gettext("unfocus pause"));
|
||||
option(loc::gettext("unfocus audio pause"));
|
||||
option(loc::gettext("room name background"));
|
||||
option(loc::gettext("checkpoint saving"));
|
||||
option(loc::gettext("return"));
|
||||
menuyoff = 0;
|
||||
maxspacing = 15;
|
||||
@@ -7772,6 +7893,11 @@ void Game::returntoingame(void)
|
||||
}
|
||||
}
|
||||
DEFER_CALLBACK(nextbgcolor);
|
||||
|
||||
if (nocompetitive())
|
||||
{
|
||||
invalidate_ndm_trophy();
|
||||
}
|
||||
}
|
||||
|
||||
void Game::unlockAchievement(const char* name)
|
||||
@@ -7824,8 +7950,22 @@ void Game::copyndmresults(void)
|
||||
SDL_memcpy(ndmresultcrewstats, crewstats, sizeof(ndmresultcrewstats));
|
||||
}
|
||||
|
||||
static inline int get_framerate(const int slowdown)
|
||||
void Game::invalidate_ndm_trophy(void)
|
||||
{
|
||||
if (nodeatheligible)
|
||||
{
|
||||
vlog_debug("NDM trophy is invalidated!");
|
||||
}
|
||||
nodeatheligible = false;
|
||||
}
|
||||
|
||||
static inline int get_framerate(const int slowdown, const int deathseq)
|
||||
{
|
||||
if (deathseq != -1)
|
||||
{
|
||||
return 34;
|
||||
}
|
||||
|
||||
switch (slowdown)
|
||||
{
|
||||
case 30:
|
||||
@@ -7854,7 +7994,7 @@ int Game::get_timestep(void)
|
||||
switch (gamestate)
|
||||
{
|
||||
case GAMEMODE:
|
||||
return get_framerate(slowdown);
|
||||
return get_framerate(slowdown, deathseq);
|
||||
default:
|
||||
return 34;
|
||||
}
|
||||
|
||||
@@ -225,6 +225,8 @@ public:
|
||||
void crewmate_textbox(const int color);
|
||||
void remaining_textbox(void);
|
||||
void actionprompt_textbox(void);
|
||||
void show_save_fail(void);
|
||||
void checkpoint_save(void);
|
||||
void savetele_textbox(void);
|
||||
|
||||
void setstate(int gamestate);
|
||||
@@ -363,6 +365,7 @@ public:
|
||||
int savetrinkets;
|
||||
bool startscript;
|
||||
std::string newscript;
|
||||
bool checkpoint_saving;
|
||||
|
||||
bool menustart;
|
||||
|
||||
@@ -436,6 +439,8 @@ public:
|
||||
int ndmresulthardestroom_y;
|
||||
bool ndmresulthardestroom_specialname;
|
||||
void copyndmresults(void);
|
||||
bool nodeatheligible;
|
||||
void invalidate_ndm_trophy(void);
|
||||
|
||||
//Time Trials
|
||||
bool intimetrial, timetrialparlost;
|
||||
|
||||
@@ -425,22 +425,23 @@ void Graphics::print_level_creator(
|
||||
int width_for_face = 17;
|
||||
int total_width = width_for_face + font::len(print_flags, creator.c_str());
|
||||
int face_x, text_x, sprite_x;
|
||||
int offset_x = -7;
|
||||
if (!font::is_rtl(print_flags))
|
||||
{
|
||||
face_x = (SCREEN_WIDTH_PIXELS - total_width) / 2;
|
||||
text_x = face_x + width_for_face;
|
||||
sprite_x = 7;
|
||||
sprite_x = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
face_x = (SCREEN_WIDTH_PIXELS + total_width) / 2;
|
||||
text_x = face_x - width_for_face;
|
||||
face_x -= 10; // sprite origin
|
||||
sprite_x = 103;
|
||||
sprite_x = 96;
|
||||
print_flags |= PR_RIGHT;
|
||||
}
|
||||
set_texture_color_mod(grphx.im_sprites, r, g, b);
|
||||
draw_texture_part(grphx.im_sprites, face_x, y - 1, sprite_x, 2, 10, 10, 1, 1);
|
||||
draw_texture_part(grphx.im_sprites, face_x + offset_x, y - 3, sprite_x, 0, 24, 12, 1, 1);
|
||||
set_texture_color_mod(grphx.im_sprites, 255, 255, 255);
|
||||
font::print(print_flags, text_x, y, creator, r, g, b);
|
||||
}
|
||||
@@ -929,13 +930,20 @@ void Graphics::drawgui(void)
|
||||
size_t j;
|
||||
for (j = 0; j < textboxes[i].lines.size(); j++)
|
||||
{
|
||||
font::print(
|
||||
print_flags | PR_BOR,
|
||||
text_xp,
|
||||
yp + text_yoff + text_sign * (j * (font_height + textboxes[i].linegap)),
|
||||
textbox_line(buffer, sizeof(buffer), i, j),
|
||||
0, 0, 0
|
||||
);
|
||||
const int x = text_xp;
|
||||
const int y = yp + text_yoff + text_sign * (j * (font_height + textboxes[i].linegap));
|
||||
if (!textboxes[i].force_outline)
|
||||
{
|
||||
font::print(print_flags | PR_BOR, x, y, textbox_line(buffer, sizeof(buffer), i, j), 0, 0, 0);
|
||||
}
|
||||
else if (textboxes[i].outline)
|
||||
{
|
||||
// We're forcing an outline, so we'll have to draw it ourselves instead of relying on PR_BOR.
|
||||
font::print(print_flags, x - 1, y, textbox_line(buffer, sizeof(buffer), i, j), 0, 0, 0);
|
||||
font::print(print_flags, x + 1, y, textbox_line(buffer, sizeof(buffer), i, j), 0, 0, 0);
|
||||
font::print(print_flags, x, y - 1, textbox_line(buffer, sizeof(buffer), i, j), 0, 0, 0);
|
||||
font::print(print_flags, x, y + 1, textbox_line(buffer, sizeof(buffer), i, j), 0, 0, 0);
|
||||
}
|
||||
}
|
||||
for (j = 0; j < textboxes[i].lines.size(); j++)
|
||||
{
|
||||
@@ -1271,6 +1279,15 @@ void Graphics::draw_grid_tile(
|
||||
draw_grid_tile(texture, t, x, y, width, height, color, 1, 1);
|
||||
}
|
||||
|
||||
void Graphics::draw_region_image(int t, int xp, int yp, int wp, int hp)
|
||||
{
|
||||
if (!INBOUNDS_ARR(t, customminimaps) || customminimaps[t] == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
draw_texture_part(customminimaps[t], xp, yp, 0, 0, wp, hp, 1, 1);
|
||||
}
|
||||
|
||||
void Graphics::cutscenebars(void)
|
||||
{
|
||||
const int usethispos = lerp(oldcutscenebarspos, cutscenebarspos);
|
||||
@@ -1474,6 +1491,18 @@ void Graphics::setimage(TextboxImage image)
|
||||
textboxes[m].setimage(image);
|
||||
}
|
||||
|
||||
void Graphics::textboxoutline(bool enabled)
|
||||
{
|
||||
if (!INBOUNDS_VEC(m, textboxes))
|
||||
{
|
||||
vlog_error("textboxoutline() out-of-bounds!");
|
||||
return;
|
||||
}
|
||||
|
||||
textboxes[m].force_outline = true;
|
||||
textboxes[m].outline = enabled;
|
||||
}
|
||||
|
||||
void Graphics::addline( const std::string& t )
|
||||
{
|
||||
if (!INBOUNDS_VEC(m, textboxes))
|
||||
@@ -1841,53 +1870,7 @@ void Graphics::drawgravityline(const int t, const int x, const int y, const int
|
||||
return;
|
||||
}
|
||||
|
||||
if (obj.entities[t].life == 0)
|
||||
{
|
||||
if (game.noflashingmode)
|
||||
{
|
||||
set_color(200 - 20, 200 - 20, 200 - 20);
|
||||
draw_line(x, y, x + w, y + h);
|
||||
return;
|
||||
}
|
||||
|
||||
switch(linestate)
|
||||
{
|
||||
case 0:
|
||||
set_color(200 - 20, 200 - 20, 200 - 20);
|
||||
break;
|
||||
case 1:
|
||||
set_color(245 - 30, 245 - 30, 225 - 30);
|
||||
break;
|
||||
case 2:
|
||||
set_color(225 - 30, 245 - 30, 245 - 30);
|
||||
break;
|
||||
case 3:
|
||||
set_color(200 - 20, 200 - 20, 164 - 10);
|
||||
break;
|
||||
case 4:
|
||||
set_color(196 - 20, 255 - 30, 224 - 20);
|
||||
break;
|
||||
case 5:
|
||||
set_color(196 - 20, 235 - 30, 205 - 20);
|
||||
break;
|
||||
case 6:
|
||||
set_color(164 - 10, 164 - 10, 164 - 10);
|
||||
break;
|
||||
case 7:
|
||||
set_color(205 - 20, 245 - 30, 225 - 30);
|
||||
break;
|
||||
case 8:
|
||||
set_color(225 - 30, 255 - 30, 205 - 20);
|
||||
break;
|
||||
case 9:
|
||||
set_color(245 - 30, 245 - 30, 245 - 30);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
set_color(96, 96, 96);
|
||||
}
|
||||
set_color(obj.entities[t].realcol);
|
||||
|
||||
draw_line(x, y, x + w, y + h);
|
||||
}
|
||||
@@ -3056,8 +3039,49 @@ SDL_Color Graphics::getcol( int t )
|
||||
case 23: // Enemy : Indicator Gray
|
||||
return getRGB(255 - help.glow / 2 - (int) (GETCOL_RANDOM * 40), 255 - help.glow/2 - (int) (GETCOL_RANDOM * 40), 255 - help.glow/2 - (int) (GETCOL_RANDOM * 40));
|
||||
|
||||
// Trophies
|
||||
// cyan
|
||||
case 24: // Gravity line (Inactive)
|
||||
return getRGB(96, 96, 96);
|
||||
case 25: // Gravity line (Active)
|
||||
if (game.noflashingmode)
|
||||
{
|
||||
return getRGB(200 - 20, 200 - 20, 200 - 20);
|
||||
}
|
||||
|
||||
switch (linestate)
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
return getRGB(200 - 20, 200 - 20, 200 - 20);
|
||||
case 1:
|
||||
return getRGB(245 - 30, 245 - 30, 225 - 30);
|
||||
case 2:
|
||||
return getRGB(225 - 30, 245 - 30, 245 - 30);
|
||||
case 3:
|
||||
return getRGB(200 - 20, 200 - 20, 164 - 10);
|
||||
case 4:
|
||||
return getRGB(196 - 20, 255 - 30, 224 - 20);
|
||||
case 5:
|
||||
return getRGB(196 - 20, 235 - 30, 205 - 20);
|
||||
case 6:
|
||||
return getRGB(164 - 10, 164 - 10, 164 - 10);
|
||||
case 7:
|
||||
return getRGB(205 - 20, 245 - 30, 225 - 30);
|
||||
case 8:
|
||||
return getRGB(225 - 30, 255 - 30, 205 - 20);
|
||||
case 9:
|
||||
return getRGB(245 - 30, 245 - 30, 245 - 30);
|
||||
}
|
||||
case 26: // Coin
|
||||
if (game.noflashingmode)
|
||||
{
|
||||
return getRGB(234, 234, 10);
|
||||
}
|
||||
return getRGB(250 - (int) (GETCOL_RANDOM * 32), 250 - (int) (GETCOL_RANDOM * 32), 10);
|
||||
case 27: // Particle flashy red
|
||||
return getRGB((GETCOL_RANDOM * 64), 10, 10);
|
||||
|
||||
// Trophies
|
||||
// cyan
|
||||
case 30:
|
||||
return RGBf(160, 200, 220);
|
||||
// Purple
|
||||
@@ -3174,30 +3198,17 @@ void Graphics::menuoffrender(void)
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Color Graphics::huetilegetcol()
|
||||
void Graphics::textboxabsolutepos(int x, int y)
|
||||
{
|
||||
if (game.noflashingmode)
|
||||
if (!INBOUNDS_VEC(m, textboxes))
|
||||
{
|
||||
return getRGB(234, 234, 10);
|
||||
vlog_error("textboxabsolutepos() out-of-bounds!");
|
||||
return;
|
||||
}
|
||||
|
||||
return getRGB(250 - (int) (fRandom() * 32), 250 - (int) (fRandom() * 32), 10);
|
||||
}
|
||||
|
||||
SDL_Color Graphics::bigchunkygetcol(int t)
|
||||
{
|
||||
// A seperate index of colours, for simplicity
|
||||
float random = game.noflashingmode ? 0.5 : fRandom();
|
||||
|
||||
switch (t)
|
||||
{
|
||||
case 1:
|
||||
return getRGB(random * 64, 10, 10);
|
||||
case 2:
|
||||
return getRGB(160 - help.glow / 2 - (int) (random * 20), 200 - help.glow / 2, 220 - help.glow);
|
||||
}
|
||||
const SDL_Color color = {0, 0, 0, 0};
|
||||
return color;
|
||||
textboxes[m].position_absolute = true;
|
||||
textboxes[m].xp = x;
|
||||
textboxes[m].yp = y;
|
||||
}
|
||||
|
||||
void Graphics::textboxcenterx(void)
|
||||
@@ -3413,19 +3424,19 @@ int Graphics::crewcolour(const int t)
|
||||
switch (t)
|
||||
{
|
||||
case 0:
|
||||
return CYAN;
|
||||
return EntityColour_CREW_CYAN;
|
||||
case 1:
|
||||
return PURPLE;
|
||||
return EntityColour_CREW_PURPLE;
|
||||
case 2:
|
||||
return YELLOW;
|
||||
return EntityColour_CREW_YELLOW;
|
||||
case 3:
|
||||
return RED;
|
||||
return EntityColour_CREW_RED;
|
||||
case 4:
|
||||
return GREEN;
|
||||
return EntityColour_CREW_GREEN;
|
||||
case 5:
|
||||
return BLUE;
|
||||
return EntityColour_CREW_BLUE;
|
||||
default:
|
||||
return 0;
|
||||
return EntityColour_CREW_CYAN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3526,12 +3537,15 @@ void Graphics::get_stretch_info(SDL_Rect* rect)
|
||||
break;
|
||||
default:
|
||||
SDL_assert(0 && "Invalid scaling mode!");
|
||||
/* Width and height should be nonzero to avoid division by zero. */
|
||||
rect->x = 0;
|
||||
rect->y = 0;
|
||||
rect->w = width;
|
||||
rect->h = height;
|
||||
}
|
||||
|
||||
// In case anything accidentally set the width/height to 0, we'll clamp it to avoid crashing from a division by 0
|
||||
rect->w = SDL_max(1, rect->w);
|
||||
rect->h = SDL_max(1, rect->h);
|
||||
}
|
||||
|
||||
void Graphics::render(void)
|
||||
|
||||
@@ -40,6 +40,54 @@ enum ImageNames
|
||||
|
||||
#define FADEMODE_IS_FADING(mode) ((mode) != FADE_NONE && (mode) != FADE_FULLY_BLACK)
|
||||
|
||||
enum EntityColour
|
||||
{
|
||||
EntityColour_CREW_CYAN = 0,
|
||||
EntityColour_DEAD = 1,
|
||||
EntityColour_ENEMY_DARK_ORANGE = 2,
|
||||
EntityColour_TRINKET = 3,
|
||||
EntityColour_INACTIVE_ENTITY = 4,
|
||||
EntityColour_ACTIVE_ENTITY = 5,
|
||||
EntityColour_ENEMY_RED = 6,
|
||||
EntityColour_ENEMY_GREEN = 7,
|
||||
EntityColour_ENEMY_PINK = 8,
|
||||
EntityColour_ENEMY_YELLOW = 9,
|
||||
EntityColour_WARP_TOKEN = 10,
|
||||
EntityColour_ENEMY_CYAN = 11,
|
||||
EntityColour_ENEMY_BLUE = 12,
|
||||
EntityColour_CREW_GREEN = 13,
|
||||
EntityColour_CREW_YELLOW = 14,
|
||||
EntityColour_CREW_RED = 15,
|
||||
EntityColour_CREW_BLUE = 16,
|
||||
EntityColour_ENEMY_ORANGE = 17,
|
||||
EntityColour_ENEMY_GRAY = 18,
|
||||
|
||||
EntityColour_CREW_GRAY = 19, // Despite the comment in the color code saying this is for enemies, it's used as a fallback for crew colors.
|
||||
|
||||
EntityColour_CREW_PURPLE = 20,
|
||||
EntityColour_ENEMY_GRAVITRON = 21,
|
||||
EntityColour_ENEMY_LIGHT_GRAY = 22,
|
||||
EntityColour_GRAVITRON_INDICATOR = 23,
|
||||
EntityColour_GRAVITY_LINE_TOUCHED = 24,
|
||||
EntityColour_GRAVITY_LINE_ACTIVE = 25,
|
||||
EntityColour_COIN = 26,
|
||||
EntityColour_PARTICLE_RED = 27,
|
||||
EntityColour_TROPHY_FINAL_LEVEL = 30,
|
||||
EntityColour_TROPHY_SPACE_STATION_1 = 31,
|
||||
EntityColour_TROPHY_SPACE_STATION_2 = 32,
|
||||
EntityColour_TROPHY_TOWER = 33,
|
||||
EntityColour_TROPHY_WARP_ZONE = 34,
|
||||
EntityColour_TROPHY_LABORATORY = 35,
|
||||
EntityColour_TROPHY_GOLD = 36,
|
||||
EntityColour_TROPHY_GAME_COMPLETE = 37,
|
||||
EntityColour_TROPHY_SILVER = 38,
|
||||
EntityColour_TROPHY_BRONZE = 39,
|
||||
EntityColour_TROPHY_FLASHY = 40,
|
||||
EntityColour_TELEPORTER_INACTIVE = 100,
|
||||
EntityColour_TELEPORTER_ACTIVE = 101,
|
||||
EntityColour_TELEPORTER_FLASHING = 102
|
||||
};
|
||||
|
||||
class Graphics
|
||||
{
|
||||
public:
|
||||
@@ -51,9 +99,6 @@ public:
|
||||
|
||||
GraphicsResources grphx;
|
||||
|
||||
SDL_Color huetilegetcol();
|
||||
SDL_Color bigchunkygetcol(int t);
|
||||
|
||||
void drawgravityline(int t, int x, int y, int w, int h);
|
||||
|
||||
void drawcoloredtile(int x, int y, int t, int r, int g, int b);
|
||||
@@ -94,6 +139,8 @@ public:
|
||||
int r, int g, int b
|
||||
);
|
||||
|
||||
void textboxabsolutepos(int x, int y);
|
||||
|
||||
void textboxcenterx(void);
|
||||
|
||||
int textboxwidth(void);
|
||||
@@ -135,6 +182,8 @@ public:
|
||||
|
||||
void setimage(TextboxImage image);
|
||||
|
||||
void textboxoutline(bool enabled);
|
||||
|
||||
void textboxindex(int index);
|
||||
|
||||
void textboxremove(void);
|
||||
@@ -172,6 +221,8 @@ public:
|
||||
void draw_grid_tile(SDL_Texture* texture, int t, int x, int y, int width, int height, SDL_Color color, int scalex, int scaley);
|
||||
void draw_grid_tile(SDL_Texture* texture, int t, int x, int y, int width, int height, SDL_Color color);
|
||||
|
||||
void draw_region_image(int t, int xp, int yp, int wp, int hp);
|
||||
|
||||
void updatetextboxes(void);
|
||||
const char* textbox_line(char* buffer, size_t buffer_len, size_t textbox_i, size_t line_i);
|
||||
void drawgui(void);
|
||||
@@ -337,6 +388,8 @@ public:
|
||||
|
||||
SDL_Texture* images[NUM_IMAGES];
|
||||
|
||||
SDL_Texture* customminimaps[401];
|
||||
|
||||
bool flipmode;
|
||||
bool setflipmode;
|
||||
bool notextoutline;
|
||||
|
||||
@@ -442,6 +442,33 @@ void GraphicsResources::init(void)
|
||||
SDL_assert(0 && "Failed to create minimap texture! See stderr.");
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_zeroa(graphics.customminimaps);
|
||||
|
||||
EnumHandle handle = {};
|
||||
const char* item;
|
||||
char full_item[64];
|
||||
while ((item = FILESYSTEM_enumerateAssets("graphics", &handle)) != NULL)
|
||||
{
|
||||
if (SDL_strncmp(item, "region", 6) != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
char* end;
|
||||
int i = SDL_strtol(&item[6], &end, 10);
|
||||
// make sure the region id is actually in bounds!
|
||||
if (i < 1 || i > 400)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (item == end || SDL_strcmp(end, ".png") != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
SDL_snprintf(full_item, sizeof(full_item), "graphics/%s", item);
|
||||
graphics.customminimaps[i] = LoadImage(full_item);
|
||||
}
|
||||
FILESYSTEM_freeEnumerate(&handle);
|
||||
}
|
||||
|
||||
|
||||
@@ -476,6 +503,11 @@ void GraphicsResources::destroy(void)
|
||||
|
||||
CLEAR(im_sprites_translated);
|
||||
CLEAR(im_flipsprites_translated);
|
||||
|
||||
for (size_t i = 0; i < SDL_arraysize(graphics.customminimaps); i++)
|
||||
{
|
||||
CLEAR(graphics.customminimaps[i]);
|
||||
}
|
||||
#undef CLEAR
|
||||
|
||||
VVV_freefunc(SDL_FreeSurface, im_sprites_surf);
|
||||
|
||||
@@ -189,8 +189,15 @@ void UpdateFilter(void)
|
||||
}
|
||||
}
|
||||
|
||||
static bool disabled_filter = false;
|
||||
|
||||
void ApplyFilter(SDL_Surface** src, SDL_Surface** dest)
|
||||
{
|
||||
if (disabled_filter)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (src == NULL || dest == NULL)
|
||||
{
|
||||
SDL_assert(0 && "NULL src or dest!");
|
||||
@@ -214,7 +221,9 @@ void ApplyFilter(SDL_Surface** src, SDL_Surface** dest)
|
||||
const int result = SDL_RenderReadPixels(gameScreen.m_renderer, NULL, 0, (*src)->pixels, (*src)->pitch);
|
||||
if (result != 0)
|
||||
{
|
||||
SDL_FreeSurface(*src);
|
||||
disabled_filter = true;
|
||||
VVV_freefunc(SDL_FreeSurface, *src);
|
||||
VVV_freefunc(SDL_FreeSurface, *dest);
|
||||
WHINE_ONCE_ARGS(("Could not read pixels from renderer: %s", SDL_GetError()));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -898,6 +898,12 @@ static void menuactionpress(void)
|
||||
game.savestatsandsettings_menu();
|
||||
music.playef(Sound_VIRIDIAN);
|
||||
break;
|
||||
case 3:
|
||||
// toggle checkpoint saving
|
||||
game.checkpoint_saving = !game.checkpoint_saving;
|
||||
game.savestatsandsettings_menu();
|
||||
music.playef(Sound_VIRIDIAN);
|
||||
break;
|
||||
default:
|
||||
//back
|
||||
music.playef(Sound_VIRIDIAN);
|
||||
@@ -2772,14 +2778,14 @@ void gameinput(void)
|
||||
int player = obj.getplayer();
|
||||
if (INBOUNDS_VEC(player, obj.entities))
|
||||
{
|
||||
obj.entities[player].colour = 102;
|
||||
obj.entities[player].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
|
||||
int teleporter = obj.getteleporter();
|
||||
if (INBOUNDS_VEC(teleporter, obj.entities))
|
||||
{
|
||||
obj.entities[teleporter].tile = 6;
|
||||
obj.entities[teleporter].colour = 102;
|
||||
obj.entities[teleporter].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
//which teleporter script do we use? it depends on the companion!
|
||||
game.setstate(4000);
|
||||
@@ -2803,16 +2809,16 @@ void gameinput(void)
|
||||
int player = obj.getplayer();
|
||||
if (INBOUNDS_VEC(player, obj.entities))
|
||||
{
|
||||
obj.entities[player].colour = 102;
|
||||
obj.entities[player].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
int companion = obj.getcompanion();
|
||||
if(INBOUNDS_VEC(companion, obj.entities)) obj.entities[companion].colour = 102;
|
||||
if(INBOUNDS_VEC(companion, obj.entities)) obj.entities[companion].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
|
||||
int teleporter = obj.getteleporter();
|
||||
if (INBOUNDS_VEC(teleporter, obj.entities))
|
||||
{
|
||||
obj.entities[teleporter].tile = 6;
|
||||
obj.entities[teleporter].colour = 102;
|
||||
obj.entities[teleporter].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
//which teleporter script do we use? it depends on the companion!
|
||||
game.setstate(3000);
|
||||
@@ -3276,7 +3282,7 @@ static void mapmenuactionpress(const bool version2_2)
|
||||
int i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 102;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
|
||||
//which teleporter script do we use? it depends on the companion!
|
||||
@@ -3498,14 +3504,14 @@ void teleporterinput(void)
|
||||
int i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 102;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
|
||||
i = obj.getteleporter();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].tile = 6;
|
||||
obj.entities[i].colour = 102;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
//which teleporter script do we use? it depends on the companion!
|
||||
game.setstate(4000);
|
||||
|
||||
@@ -282,11 +282,11 @@ namespace level_debugger
|
||||
graphics.draw_rect(bounding_box.x, bounding_box.y, bounding_box.w, bounding_box.h, graphics.getRGB(15, 90, 90));
|
||||
|
||||
// For gravity lines, show the true hitbox.
|
||||
if (obj.entities[i].type == 9)
|
||||
if (obj.entities[i].type == EntityType_HORIZONTAL_GRAVITY_LINE)
|
||||
{
|
||||
graphics.draw_rect(bounding_box.x - 1, bounding_box.y + 1, bounding_box.w + 2, bounding_box.h, graphics.getRGB(90, 90, 15));
|
||||
}
|
||||
else if (obj.entities[i].type == 10)
|
||||
else if (obj.entities[i].type == EntityType_VERTICAL_GRAVITY_LINE)
|
||||
{
|
||||
graphics.fill_rect(bounding_box.x - 2, bounding_box.y - 1, bounding_box.w + 1, bounding_box.h + 2, graphics.getRGB(90, 90, 15));
|
||||
}
|
||||
@@ -390,33 +390,35 @@ namespace level_debugger
|
||||
// Mostly contains duplicates, but for ease of use
|
||||
switch (entity->type)
|
||||
{
|
||||
case 0:
|
||||
case EntityType_PLAYER:
|
||||
// Player
|
||||
render_info(line++, "Gravity", help.String(game.gravitycontrol));
|
||||
render_info(line++, "Checkpoint", help.String(game.savepoint));
|
||||
break;
|
||||
case 1:
|
||||
case EntityType_MOVING:
|
||||
// Moving platforms and enemies
|
||||
render_info(line++, "Speed", help.String(entity->para));
|
||||
render_info(line++, "Movement type", help.String(entity->behave));
|
||||
break;
|
||||
case 7:
|
||||
case EntityType_TRINKET:
|
||||
// Trinkets
|
||||
render_info(line++, "ID", help.String(entity->para));
|
||||
break;
|
||||
case 8:
|
||||
case EntityType_CHECKPOINT:
|
||||
// Checkpoints
|
||||
render_info(line++, "ID", help.String(entity->para));
|
||||
render_info(line++, "Active", game.savepoint == entity->para ? "True" : "False");
|
||||
break;
|
||||
case 9:
|
||||
case EntityType_HORIZONTAL_GRAVITY_LINE:
|
||||
// Horizontal gravity lines
|
||||
render_info(line++, "Horizontal");
|
||||
break;
|
||||
case 10:
|
||||
case EntityType_VERTICAL_GRAVITY_LINE:
|
||||
// Vertical gravity lines
|
||||
render_info(line++, "Vertical");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -373,7 +373,7 @@ void gamelogic(void)
|
||||
{
|
||||
if (game.roomx == 111 && game.roomy == 107 && !map.custommode)
|
||||
{
|
||||
if (obj.entities[i].type == 1)
|
||||
if (obj.entities[i].type == EntityType_MOVING)
|
||||
{
|
||||
if (obj.entities[i].xp < 152)
|
||||
{
|
||||
@@ -391,7 +391,7 @@ void gamelogic(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (obj.entities[i].type == 2 && obj.entities[i].state == 3)
|
||||
if (obj.entities[i].type == EntityType_DISAPPEARING_PLATFORM && obj.entities[i].state == 3)
|
||||
{
|
||||
//Ok! super magical exception for the room with the intention death for the shiny trinket
|
||||
//fix this when the maps are finalised
|
||||
@@ -405,7 +405,7 @@ void gamelogic(void)
|
||||
map.settile(18, 9, 59);
|
||||
}
|
||||
}
|
||||
else if (obj.entities[i].type == 2 && obj.entities[i].state == 2)
|
||||
else if (obj.entities[i].type == EntityType_DISAPPEARING_PLATFORM && obj.entities[i].state == 2)
|
||||
{
|
||||
//ok, unfortunate case where the disappearing platform hasn't fully disappeared. Accept a little
|
||||
//graphical uglyness to avoid breaking the room!
|
||||
@@ -421,7 +421,7 @@ void gamelogic(void)
|
||||
}
|
||||
if (!entitygone) obj.entities[i].state = 4;
|
||||
}
|
||||
else if (obj.entities[i].type == 23 && game.swnmode && game.deathseq<15)
|
||||
else if (obj.entities[i].type == EntityType_GRAVITRON_ENEMY && game.swnmode && game.deathseq<15)
|
||||
{
|
||||
//if playing SWN, get the enemies offscreen.
|
||||
obj.entities[i].xp += obj.entities[i].vx*5;
|
||||
@@ -461,6 +461,8 @@ void gamelogic(void)
|
||||
game.deathseq--;
|
||||
if (game.deathseq <= 0)
|
||||
{
|
||||
game.invalidate_ndm_trophy();
|
||||
|
||||
if (game.nodeathmode)
|
||||
{
|
||||
game.deathseq = 1;
|
||||
@@ -728,7 +730,7 @@ void gamelogic(void)
|
||||
bool square_onscreen = false;
|
||||
for (size_t i = 0; i < obj.entities.size(); i++)
|
||||
{
|
||||
if (obj.entities[i].type == 23)
|
||||
if (obj.entities[i].type == EntityType_GRAVITRON_ENEMY)
|
||||
{
|
||||
square_onscreen = true;
|
||||
break;
|
||||
@@ -1034,9 +1036,11 @@ void gamelogic(void)
|
||||
size_t i;
|
||||
for (i = 0; i < obj.entities.size(); ++i)
|
||||
{
|
||||
if ((obj.entities[i].type >= 51
|
||||
&& obj.entities[i].type <= 54) /* Don't warp warp lines */
|
||||
|| obj.entities[i].size == 12) /* Don't warp gravitron squares */
|
||||
if (obj.entities[i].type == EntityType_WARP_LINE_LEFT
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_RIGHT
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_TOP
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_BOTTOM /* Don't warp warp lines */
|
||||
|| obj.entities[i].size == 12) /* Don't warp gravitron squares */
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -1092,8 +1096,10 @@ void gamelogic(void)
|
||||
size_t i;
|
||||
for (i = 0; i < obj.entities.size(); ++i)
|
||||
{
|
||||
if (obj.entities[i].type >= 51
|
||||
&& obj.entities[i].type <= 54) /* Don't warp warp lines */
|
||||
if (obj.entities[i].type == EntityType_WARP_LINE_LEFT
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_RIGHT
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_TOP
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_BOTTOM) /* Don't warp warp lines */
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -1124,9 +1130,11 @@ void gamelogic(void)
|
||||
size_t i;
|
||||
for (i = 0; i < obj.entities.size(); ++i)
|
||||
{
|
||||
if ((obj.entities[i].type >= 51
|
||||
&& obj.entities[i].type <= 54) /* Don't warp warp lines */
|
||||
|| obj.entities[i].rule == 0) /* Don't warp the player */
|
||||
if ((obj.entities[i].type == EntityType_WARP_LINE_LEFT
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_RIGHT
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_TOP
|
||||
|| obj.entities[i].type == EntityType_WARP_LINE_BOTTOM) /* Don't warp warp lines */
|
||||
|| obj.entities[i].rule == 0) /* Don't warp the player */
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -52,9 +52,8 @@ mapclass::mapclass(void)
|
||||
|
||||
custommode=false;
|
||||
custommodeforreal=false;
|
||||
custommmxoff=0; custommmyoff=0; custommmxsize=0; custommmysize=0;
|
||||
customzoom=0;
|
||||
customshowmm=true;
|
||||
revealmap = true;
|
||||
|
||||
rcol = 0;
|
||||
|
||||
@@ -88,6 +87,9 @@ mapclass::mapclass(void)
|
||||
roomtexton = false;
|
||||
|
||||
nexttowercolour_set = false;
|
||||
|
||||
currentregion = 0;
|
||||
SDL_zeroa(region);
|
||||
}
|
||||
|
||||
static char roomname_static[SCREEN_WIDTH_CHARS];
|
||||
@@ -198,6 +200,12 @@ void mapclass::resetmap(void)
|
||||
SDL_memset(explored, 0, sizeof(explored));
|
||||
}
|
||||
|
||||
void mapclass::fullmap(void)
|
||||
{
|
||||
//mark the whole map as explored
|
||||
SDL_memset(explored, 1, sizeof(explored));
|
||||
}
|
||||
|
||||
void mapclass::updateroomnames(void)
|
||||
{
|
||||
if (roomnameset)
|
||||
@@ -478,28 +486,28 @@ int mapclass::maptiletoenemycol(int t)
|
||||
switch(t)
|
||||
{
|
||||
case 0:
|
||||
return 11;
|
||||
return EntityColour_ENEMY_CYAN;
|
||||
break;
|
||||
case 1:
|
||||
return 6;
|
||||
return EntityColour_ENEMY_RED;
|
||||
break;
|
||||
case 2:
|
||||
return 8;
|
||||
return EntityColour_ENEMY_PINK;
|
||||
break;
|
||||
case 3:
|
||||
return 12;
|
||||
return EntityColour_ENEMY_BLUE;
|
||||
break;
|
||||
case 4:
|
||||
return 9;
|
||||
return EntityColour_ENEMY_YELLOW;
|
||||
break;
|
||||
case 5:
|
||||
return 7;
|
||||
return EntityColour_ENEMY_GREEN;
|
||||
break;
|
||||
case 6:
|
||||
return 18;
|
||||
return EntityColour_ENEMY_GRAY;
|
||||
break;
|
||||
}
|
||||
return 11;
|
||||
return EntityColour_ENEMY_CYAN;
|
||||
}
|
||||
|
||||
void mapclass::changefinalcol(int t)
|
||||
@@ -511,7 +519,7 @@ void mapclass::changefinalcol(int t)
|
||||
//Next, entities
|
||||
for (size_t i = 0; i < obj.entities.size(); i++)
|
||||
{
|
||||
if (obj.entities[i].type == 1) //something with a movement behavior
|
||||
if (obj.entities[i].type == EntityType_MOVING)
|
||||
{
|
||||
if (obj.entities[i].animate == 10 || obj.entities[i].animate == 11) //treadmill
|
||||
{
|
||||
@@ -534,7 +542,7 @@ void mapclass::changefinalcol(int t)
|
||||
obj.entities[i].colour = maptiletoenemycol(temp);
|
||||
}
|
||||
}
|
||||
else if (obj.entities[i].type == 2) //disappearing platforms
|
||||
else if (obj.entities[i].type == EntityType_DISAPPEARING_PLATFORM)
|
||||
{
|
||||
obj.entities[i].tile = 915+(temp*40);
|
||||
}
|
||||
@@ -884,7 +892,7 @@ void mapclass::gotoroom(int rx, int ry)
|
||||
//Ok, let's save the position of all lines on the screen
|
||||
for (size_t i = 0; i < obj.entities.size(); i++)
|
||||
{
|
||||
if (obj.entities[i].type == 9)
|
||||
if (obj.entities[i].type == EntityType_HORIZONTAL_GRAVITY_LINE)
|
||||
{
|
||||
//It's a horizontal line
|
||||
if (obj.entities[i].xp <= 0 || (obj.entities[i].xp + obj.entities[i].w) >= 312)
|
||||
@@ -1022,7 +1030,7 @@ void mapclass::gotoroom(int rx, int ry)
|
||||
|
||||
for (size_t i = 0; i < obj.entities.size(); i++)
|
||||
{
|
||||
if (obj.entities[i].type == 9)
|
||||
if (obj.entities[i].type == EntityType_HORIZONTAL_GRAVITY_LINE)
|
||||
{
|
||||
//It's a horizontal line
|
||||
if (obj.entities[i].xp <= 0 || obj.entities[i].xp + obj.entities[i].w >= 312)
|
||||
@@ -1304,12 +1312,15 @@ static void copy_short_to_int(int* dest, const short* src, const size_t size)
|
||||
void mapclass::loadlevel(int rx, int ry)
|
||||
{
|
||||
int t;
|
||||
if (!finalmode)
|
||||
if (revealmap)
|
||||
{
|
||||
setexplored(rx - 100, ry - 100, true);
|
||||
if (rx == 109 && !custommode)
|
||||
if (!finalmode)
|
||||
{
|
||||
exploretower();
|
||||
setexplored(rx - 100, ry - 100, true);
|
||||
if (rx == 109 && !custommode)
|
||||
{
|
||||
exploretower();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1850,7 +1861,7 @@ void mapclass::loadlevel(int rx, int ry)
|
||||
{
|
||||
case 1: // Enemies
|
||||
obj.customenemy = room->enemytype;
|
||||
obj.createentity(ex, ey, 56, ent.p1, 4, bx1, by1, bx2, by2);
|
||||
obj.createentity(ex, ey, 56, ent.p1, 4 + room->enemyv, bx1, by1, bx2, by2);
|
||||
break;
|
||||
case 2: // Platforms and conveyors
|
||||
if (ent.p1 <= 4)
|
||||
@@ -2047,7 +2058,7 @@ void mapclass::loadlevel(int rx, int ry)
|
||||
|
||||
for (size_t i = 0; i < obj.entities.size(); i++)
|
||||
{
|
||||
if (obj.entities[i].type == 1 && obj.entities[i].behave >= 8 && obj.entities[i].behave < 10)
|
||||
if (obj.entities[i].type == EntityType_MOVING && obj.entities[i].behave >= 8 && obj.entities[i].behave < 10)
|
||||
{
|
||||
//put a block underneath
|
||||
int temp = obj.entities[i].xp / 8.0f;
|
||||
@@ -2174,7 +2185,7 @@ void mapclass::loadlevel(int rx, int ry)
|
||||
{
|
||||
//A slight varation - she's upside down
|
||||
obj.createentity(249, 62, 18, 16, 0, 18);
|
||||
int j = obj.getcrewman(BLUE);
|
||||
int j = obj.getcrewman(EntityColour_CREW_BLUE);
|
||||
if (INBOUNDS_VEC(j, obj.entities))
|
||||
{
|
||||
obj.entities[j].rule = 7;
|
||||
@@ -2195,16 +2206,16 @@ void mapclass::twoframedelayfix(void)
|
||||
// A bit kludge-y, but it's the least we can do without changing the frame ordering.
|
||||
|
||||
if (GlitchrunnerMode_less_than_or_equal(Glitchrunner2_2)
|
||||
|| !custommode
|
||||
|| game.deathseq != -1)
|
||||
|| !custommode
|
||||
|| game.deathseq != -1)
|
||||
return;
|
||||
|
||||
int block_idx = -1;
|
||||
// obj.checktrigger() sets block_idx
|
||||
int activetrigger = obj.checktrigger(&block_idx);
|
||||
if (activetrigger <= -1
|
||||
|| !INBOUNDS_VEC(block_idx, obj.blocks)
|
||||
|| activetrigger < 300)
|
||||
|| !INBOUNDS_VEC(block_idx, obj.blocks)
|
||||
|| activetrigger < 300)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -2215,3 +2226,131 @@ void mapclass::twoframedelayfix(void)
|
||||
game.setstatedelay(0);
|
||||
script.load(game.newscript);
|
||||
}
|
||||
|
||||
MapRenderData mapclass::get_render_data(void)
|
||||
{
|
||||
MapRenderData data;
|
||||
data.width = getwidth();
|
||||
data.height = getheight();
|
||||
|
||||
data.startx = 0;
|
||||
data.starty = 0;
|
||||
|
||||
// Region handling
|
||||
if (region[currentregion].isvalid)
|
||||
{
|
||||
data.startx = region[currentregion].rx;
|
||||
data.starty = region[currentregion].ry;
|
||||
data.width = ((region[currentregion].rx2 - data.startx) + 1);
|
||||
data.height = ((region[currentregion].ry2 - data.starty) + 1);
|
||||
}
|
||||
|
||||
data.zoom = 1;
|
||||
|
||||
if (data.width <= 10 && data.height <= 10)
|
||||
{
|
||||
data.zoom = 2;
|
||||
}
|
||||
if (data.width <= 5 && data.height <= 5)
|
||||
{
|
||||
data.zoom = 4;
|
||||
}
|
||||
|
||||
data.xoff = 0;
|
||||
data.yoff = 0;
|
||||
|
||||
// Set minimap offsets
|
||||
switch (data.zoom)
|
||||
{
|
||||
case 4:
|
||||
data.xoff = 24 * (5 - data.width);
|
||||
data.yoff = 18 * (5 - data.height);
|
||||
break;
|
||||
case 2:
|
||||
data.xoff = 12 * (10 - data.width);
|
||||
data.yoff = 9 * (10 - data.height);
|
||||
break;
|
||||
default:
|
||||
data.xoff = 6 * (20 - data.width);
|
||||
data.yoff = (int)(4.5 * (20 - data.height));
|
||||
break;
|
||||
}
|
||||
|
||||
data.pixelsx = 240 - (data.xoff * 2);
|
||||
data.pixelsy = 180 - (data.yoff * 2);
|
||||
|
||||
data.legendxoff = 40 + data.xoff;
|
||||
data.legendyoff = 21 + data.yoff;
|
||||
|
||||
// Magic numbers for centering legend tiles.
|
||||
switch (data.zoom)
|
||||
{
|
||||
case 4:
|
||||
data.legendxoff += 21;
|
||||
data.legendyoff += 16;
|
||||
break;
|
||||
case 2:
|
||||
data.legendxoff += 9;
|
||||
data.legendyoff += 5;
|
||||
break;
|
||||
default:
|
||||
data.legendxoff += 3;
|
||||
data.legendyoff += 1;
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void mapclass::setregion(int id, int rx, int ry, int rx2, int ry2)
|
||||
{
|
||||
if (INBOUNDS_ARR(id, region) && id > 0)
|
||||
{
|
||||
// swap the variables if they're entered in the wrong order
|
||||
if (rx2 < rx)
|
||||
{
|
||||
int temp = rx;
|
||||
rx = rx2;
|
||||
rx2 = temp;
|
||||
}
|
||||
if (ry2 < ry)
|
||||
{
|
||||
int temp = ry;
|
||||
ry = ry2;
|
||||
ry2 = temp;
|
||||
}
|
||||
|
||||
region[id].isvalid = true;
|
||||
region[id].rx = SDL_clamp(rx, 0, cl.mapwidth - 1);
|
||||
region[id].ry = SDL_clamp(ry, 0, cl.mapheight - 1);
|
||||
region[id].rx2 = SDL_clamp(rx2, 0, cl.mapwidth - 1);
|
||||
region[id].ry2 = SDL_clamp(ry2, 0, cl.mapheight - 1);
|
||||
|
||||
if (id == currentregion)
|
||||
{
|
||||
cl.generatecustomminimap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mapclass::removeregion(int id)
|
||||
{
|
||||
if (INBOUNDS_ARR(id, region) && id > 0)
|
||||
{
|
||||
SDL_zero(region[id]);
|
||||
|
||||
if (id == currentregion)
|
||||
{
|
||||
cl.generatecustomminimap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mapclass::changeregion(int id)
|
||||
{
|
||||
if (INBOUNDS_ARR(id, region))
|
||||
{
|
||||
currentregion = id;
|
||||
cl.generatecustomminimap();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,21 @@
|
||||
#include "TowerBG.h"
|
||||
#include "WarpClass.h"
|
||||
|
||||
struct MapRenderData
|
||||
{
|
||||
int zoom;
|
||||
int xoff;
|
||||
int yoff;
|
||||
int legendxoff;
|
||||
int legendyoff;
|
||||
int startx;
|
||||
int starty;
|
||||
int width;
|
||||
int height;
|
||||
int pixelsx;
|
||||
int pixelsy;
|
||||
};
|
||||
|
||||
struct Roomtext
|
||||
{
|
||||
int x, y;
|
||||
@@ -58,6 +73,8 @@ public:
|
||||
|
||||
void resetmap(void);
|
||||
|
||||
void fullmap(void);
|
||||
|
||||
void updateroomnames(void);
|
||||
|
||||
void initmapdata(void);
|
||||
@@ -125,6 +142,8 @@ public:
|
||||
bool isexplored(const int rx, const int ry);
|
||||
void setexplored(const int rx, const int ry, const bool status);
|
||||
|
||||
bool revealmap;
|
||||
|
||||
int background;
|
||||
int rcol;
|
||||
int tileset;
|
||||
@@ -159,8 +178,6 @@ public:
|
||||
//Variables for playing custom levels
|
||||
bool custommode;
|
||||
bool custommodeforreal;
|
||||
int custommmxoff, custommmyoff, custommmxsize, custommmysize;
|
||||
int customzoom;
|
||||
bool customshowmm;
|
||||
|
||||
//final level colour cycling stuff
|
||||
@@ -194,6 +211,25 @@ public:
|
||||
|
||||
//Map cursor
|
||||
int cursorstate, cursordelay;
|
||||
|
||||
//Region system
|
||||
struct Region
|
||||
{
|
||||
bool isvalid;
|
||||
int rx;
|
||||
int ry;
|
||||
int rx2;
|
||||
int ry2;
|
||||
};
|
||||
struct Region region[401];
|
||||
void setregion(int id, int rx, int ry, int rx2, int ry2);
|
||||
void removeregion(int id);
|
||||
void changeregion(int id);
|
||||
int currentregion;
|
||||
int regionx, regiony;
|
||||
int regionwidth, regionheight;
|
||||
|
||||
MapRenderData get_render_data(void);
|
||||
};
|
||||
|
||||
#ifndef MAP_DEFINITION
|
||||
|
||||
@@ -93,7 +93,7 @@ static FAudioMasteringVoice* masteringvoice = NULL;
|
||||
class SoundTrack
|
||||
{
|
||||
public:
|
||||
SoundTrack(const char* fileName)
|
||||
SoundTrack(const char* fileName, const char* _id, bool _extra)
|
||||
{
|
||||
unsigned char* mem;
|
||||
size_t length;
|
||||
@@ -118,6 +118,9 @@ public:
|
||||
{
|
||||
LoadWAV(fileName, mem, length);
|
||||
}
|
||||
|
||||
extra = _extra;
|
||||
id = SDL_strdup(_id);
|
||||
}
|
||||
|
||||
void LoadWAV(const char* fileName, unsigned char* mem, const size_t length)
|
||||
@@ -180,6 +183,7 @@ end:
|
||||
VVV_free(decoded_buf_reserve);
|
||||
VVV_freefunc(stb_vorbis_close, vorbis);
|
||||
VVV_free(ogg_file);
|
||||
VVV_free(id);
|
||||
}
|
||||
|
||||
void Play(void)
|
||||
@@ -364,6 +368,9 @@ end:
|
||||
static FAudioSourceVoice** voices;
|
||||
static FAudioWaveFormatEx voice_formats[VVV_MAX_CHANNELS];
|
||||
static float volume;
|
||||
|
||||
char* id;
|
||||
bool extra;
|
||||
};
|
||||
FAudioSourceVoice** SoundTrack::voices = NULL;
|
||||
FAudioWaveFormatEx SoundTrack::voice_formats[VVV_MAX_CHANNELS];
|
||||
@@ -504,9 +511,9 @@ end:
|
||||
}
|
||||
}
|
||||
|
||||
static void SetVolume(int musicVolume)
|
||||
static void SetVolume(int controlVolume)
|
||||
{
|
||||
float adj_vol = (float) musicVolume / VVV_MAX_VOLUME;
|
||||
float adj_vol = (float)controlVolume / VVV_MAX_VOLUME;
|
||||
if (!IsHalted())
|
||||
{
|
||||
FAudioVoice_SetVolume(musicVoice, adj_vol, FAUDIO_COMMIT_NOW);
|
||||
@@ -715,7 +722,7 @@ musicclass::musicclass(void)
|
||||
safeToProcessMusic= false;
|
||||
m_doFadeInVol = false;
|
||||
m_doFadeOutVol = false;
|
||||
musicVolume = 0;
|
||||
controlVolume = 0;
|
||||
|
||||
user_music_volume = USER_VOLUME_MAX;
|
||||
user_sound_volume = USER_VOLUME_MAX;
|
||||
@@ -729,6 +736,13 @@ musicclass::musicclass(void)
|
||||
usingmmmmmm = false;
|
||||
}
|
||||
|
||||
static void add_builtin_sound(const char* id)
|
||||
{
|
||||
char asset_filename[256];
|
||||
SDL_snprintf(asset_filename, sizeof(asset_filename), "sounds/%s.wav", id);
|
||||
soundTracks.push_back(SoundTrack(asset_filename, id, false));
|
||||
}
|
||||
|
||||
void musicclass::init(void)
|
||||
{
|
||||
if (FAudioCreate(&faudioctx, 0, FAUDIO_DEFAULT_PROCESSOR))
|
||||
@@ -744,34 +758,84 @@ void musicclass::init(void)
|
||||
|
||||
SoundTrack::Init(44100);
|
||||
|
||||
soundTracks.push_back(SoundTrack( "sounds/jump.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/jump2.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/hurt.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/souleyeminijingle.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/coin.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/save.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crumble.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/vanish.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/blip.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/preteleport.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/teleport.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crew1.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crew2.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crew3.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crew4.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crew5.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crew6.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/terminal.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/gamesaved.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crashing.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/blip2.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/countdown.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/go.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/crash.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/combine.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/newrecord.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/trophy.wav" ));
|
||||
soundTracks.push_back(SoundTrack( "sounds/rescue.wav" ));
|
||||
add_builtin_sound("jump");
|
||||
add_builtin_sound("jump2");
|
||||
add_builtin_sound("hurt");
|
||||
add_builtin_sound("souleyeminijingle");
|
||||
add_builtin_sound("coin");
|
||||
add_builtin_sound("save");
|
||||
add_builtin_sound("crumble");
|
||||
add_builtin_sound("vanish");
|
||||
add_builtin_sound("blip");
|
||||
add_builtin_sound("preteleport");
|
||||
add_builtin_sound("teleport");
|
||||
add_builtin_sound("crew1");
|
||||
add_builtin_sound("crew2");
|
||||
add_builtin_sound("crew3");
|
||||
add_builtin_sound("crew4");
|
||||
add_builtin_sound("crew5");
|
||||
add_builtin_sound("crew6");
|
||||
add_builtin_sound("terminal");
|
||||
add_builtin_sound("gamesaved");
|
||||
add_builtin_sound("crashing");
|
||||
add_builtin_sound("blip2");
|
||||
add_builtin_sound("countdown");
|
||||
add_builtin_sound("go");
|
||||
add_builtin_sound("crash");
|
||||
add_builtin_sound("combine");
|
||||
add_builtin_sound("newrecord");
|
||||
add_builtin_sound("trophy");
|
||||
add_builtin_sound("rescue");
|
||||
|
||||
EnumHandle handle = {};
|
||||
const char* item;
|
||||
while ((item = FILESYSTEM_enumerateAssets("sounds", &handle)) != NULL)
|
||||
{
|
||||
char asset_filename[256];
|
||||
char id[256];
|
||||
SDL_snprintf(asset_filename, sizeof(asset_filename), "sounds/%s", item);
|
||||
|
||||
// Create the ID
|
||||
size_t current_char = 0;
|
||||
size_t item_len = SDL_strlen(item);
|
||||
for (size_t i = 0; i < item_len; i++)
|
||||
{
|
||||
// If it's a space, we don't want to include this.
|
||||
if (item[i] == ' ')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// Otherwise, add it to our ID string, lowered
|
||||
id[current_char] = SDL_tolower(item[i]);
|
||||
|
||||
current_char++;
|
||||
|
||||
if (current_char >= 255)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Null-terminate the string
|
||||
id[current_char] = '\0';
|
||||
|
||||
// Chop off the extension!
|
||||
char* dot = SDL_strrchr(id, '.');
|
||||
if (dot != NULL)
|
||||
{
|
||||
*dot = '\0';
|
||||
}
|
||||
|
||||
if (soundidexists(id))
|
||||
{
|
||||
// Make sure we haven't already loaded this file
|
||||
continue;
|
||||
}
|
||||
|
||||
vlog_info("Reading extra sound file %s as %s", item, id);
|
||||
soundTracks.push_back(SoundTrack(asset_filename, id, true));
|
||||
}
|
||||
FILESYSTEM_freeEnumerate(&handle);
|
||||
|
||||
#ifdef VVV_COMPILEMUSIC
|
||||
binaryBlob musicWriteBlob;
|
||||
@@ -909,6 +973,16 @@ void musicclass::destroy(void)
|
||||
VVV_freefunc(FAudio_Release, faudioctx);
|
||||
}
|
||||
|
||||
void musicclass::set_music_volume(int volume)
|
||||
{
|
||||
MusicTrack::SetVolume(volume * user_music_volume / USER_VOLUME_MAX);
|
||||
}
|
||||
|
||||
void musicclass::set_sound_volume(int volume)
|
||||
{
|
||||
SoundTrack::SetVolume(volume * user_sound_volume / USER_VOLUME_MAX);
|
||||
}
|
||||
|
||||
void musicclass::play(int t)
|
||||
{
|
||||
if (mmmmmm && usingmmmmmm)
|
||||
@@ -961,8 +1035,8 @@ void musicclass::play(int t)
|
||||
{
|
||||
m_doFadeInVol = false;
|
||||
m_doFadeOutVol = false;
|
||||
musicVolume = VVV_MAX_VOLUME;
|
||||
MusicTrack::SetVolume(VVV_MAX_VOLUME * user_music_volume / USER_VOLUME_MAX);
|
||||
controlVolume = VVV_MAX_VOLUME;
|
||||
set_music_volume(controlVolume);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1040,7 +1114,7 @@ void musicclass::haltdasmusik(const bool from_fade)
|
||||
|
||||
void musicclass::silencedasmusik(void)
|
||||
{
|
||||
musicVolume = 0;
|
||||
controlVolume = 0;
|
||||
m_doFadeInVol = false;
|
||||
m_doFadeOutVol = false;
|
||||
}
|
||||
@@ -1097,10 +1171,10 @@ void musicclass::fadeMusicVolumeIn(int ms)
|
||||
m_doFadeOutVol = false;
|
||||
|
||||
/* Ensure it starts at 0 */
|
||||
musicVolume = 0;
|
||||
controlVolume = 0;
|
||||
|
||||
/* Fix 1-frame glitch */
|
||||
MusicTrack::SetVolume(0);
|
||||
set_music_volume(0);
|
||||
|
||||
fade.step_ms = 0;
|
||||
fade.duration_ms = ms;
|
||||
@@ -1120,8 +1194,8 @@ void musicclass::fadeMusicVolumeOut(const int fadeout_ms)
|
||||
|
||||
fade.step_ms = 0;
|
||||
/* Duration is proportional to current volume. */
|
||||
fade.duration_ms = fadeout_ms * musicVolume / VVV_MAX_VOLUME;
|
||||
fade.start_volume = musicVolume;
|
||||
fade.duration_ms = fadeout_ms * controlVolume / VVV_MAX_VOLUME;
|
||||
fade.start_volume = controlVolume;
|
||||
fade.end_volume = 0;
|
||||
}
|
||||
|
||||
@@ -1133,7 +1207,7 @@ void musicclass::fadeout(const bool quick_fade_ /*= true*/)
|
||||
|
||||
void musicclass::processmusicfadein(void)
|
||||
{
|
||||
enum FadeCode fade_code = processmusicfade(&fade, &musicVolume);
|
||||
enum FadeCode fade_code = processmusicfade(&fade, &controlVolume);
|
||||
if (fade_code == Fade_finished)
|
||||
{
|
||||
m_doFadeInVol = false;
|
||||
@@ -1142,10 +1216,10 @@ void musicclass::processmusicfadein(void)
|
||||
|
||||
void musicclass::processmusicfadeout(void)
|
||||
{
|
||||
enum FadeCode fade_code = processmusicfade(&fade, &musicVolume);
|
||||
enum FadeCode fade_code = processmusicfade(&fade, &controlVolume);
|
||||
if (fade_code == Fade_finished)
|
||||
{
|
||||
musicVolume = 0;
|
||||
controlVolume = 0;
|
||||
m_doFadeOutVol = false;
|
||||
haltdasmusik(true);
|
||||
}
|
||||
@@ -1271,13 +1345,61 @@ void musicclass::changemusicarea(int x, int y)
|
||||
niceplay(track);
|
||||
}
|
||||
|
||||
void musicclass::playef(int t)
|
||||
bool musicclass::playef(int t)
|
||||
{
|
||||
if (!INBOUNDS_VEC(t, soundTracks))
|
||||
{
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
soundTracks[t].Play();
|
||||
if (soundTracks[t].valid)
|
||||
{
|
||||
soundTracks[t].Play();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool musicclass::playefid(const char* id)
|
||||
{
|
||||
for (size_t i = 0; i < soundTracks.size(); i++)
|
||||
{
|
||||
if (SDL_strcmp(soundTracks[i].id, id) == 0)
|
||||
{
|
||||
return playef(i);
|
||||
}
|
||||
}
|
||||
vlog_error("playefid() couldn't find sound ID: %s", id);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool musicclass::soundidexists(const char* id)
|
||||
{
|
||||
for (size_t i = 0; i < soundTracks.size(); i++)
|
||||
{
|
||||
if (SDL_strcmp(soundTracks[i].id, id) == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool musicclass::soundisextra(int t)
|
||||
{
|
||||
if (INBOUNDS_VEC(t, soundTracks))
|
||||
{
|
||||
return soundTracks[t].extra;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* musicclass::getsoundid(int t)
|
||||
{
|
||||
if (INBOUNDS_VEC(t, soundTracks))
|
||||
{
|
||||
return soundTracks[t].id;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void musicclass::pauseef(void)
|
||||
@@ -1299,20 +1421,20 @@ void musicclass::updatemutestate(void)
|
||||
{
|
||||
if (game.muted)
|
||||
{
|
||||
MusicTrack::SetVolume(0);
|
||||
SoundTrack::SetVolume(0);
|
||||
set_music_volume(0);
|
||||
set_sound_volume(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SoundTrack::SetVolume(VVV_MAX_VOLUME * user_sound_volume / USER_VOLUME_MAX);
|
||||
set_sound_volume(VVV_MAX_VOLUME);
|
||||
|
||||
if (game.musicmuted)
|
||||
{
|
||||
MusicTrack::SetVolume(0);
|
||||
set_music_volume(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MusicTrack::SetVolume(musicVolume * user_music_volume / USER_VOLUME_MAX);
|
||||
set_music_volume(controlVolume);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,6 +70,9 @@ public:
|
||||
void init(void);
|
||||
void destroy(void);
|
||||
|
||||
void set_music_volume(int volume);
|
||||
void set_sound_volume(int volume);
|
||||
|
||||
void play(int t);
|
||||
void resume(void);
|
||||
void resumefade(const int fadein_ms);
|
||||
@@ -91,7 +94,11 @@ public:
|
||||
int currentsong;
|
||||
int haltedsong;
|
||||
|
||||
void playef(int t);
|
||||
bool playef(int t);
|
||||
bool playefid(const char* id);
|
||||
bool soundidexists(const char* id);
|
||||
bool soundisextra(int t);
|
||||
const char* getsoundid(int t);
|
||||
void pauseef(void);
|
||||
void resumeef(void);
|
||||
|
||||
@@ -105,7 +112,7 @@ public:
|
||||
|
||||
bool m_doFadeInVol;
|
||||
bool m_doFadeOutVol;
|
||||
int musicVolume;
|
||||
int controlVolume;
|
||||
|
||||
/* 0..USER_VOLUME_MAX */
|
||||
int user_music_volume;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "Otherlevel.h"
|
||||
|
||||
#include "Game.h"
|
||||
#include "Graphics.h"
|
||||
#include "Entity.h"
|
||||
#include "MakeAndPlay.h"
|
||||
#include "UtilityClass.h"
|
||||
@@ -8904,7 +8905,7 @@ const short* otherlevelclass::loadlevel(int rx, int ry)
|
||||
|
||||
//violet
|
||||
obj.createentity(83, 126, 18, 20, 0, 18);
|
||||
int crewman = obj.getcrewman(PURPLE);
|
||||
int crewman = obj.getcrewman(EntityColour_CREW_PURPLE);
|
||||
if (INBOUNDS_VEC(crewman, obj.entities))
|
||||
{
|
||||
obj.entities[crewman].rule = 7;
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
#ifndef RELEASEVERSION_H
|
||||
#define RELEASEVERSION_H
|
||||
|
||||
#define RELEASE_VERSION "v2.4.3"
|
||||
#define MAJOR_VERSION 2
|
||||
#define MINOR_VERSION 5
|
||||
#define PATCH_VERSION 0
|
||||
|
||||
#define VVV_STRINGIFY(x) #x
|
||||
#define VVV_TOSTRING(x) VVV_STRINGIFY(x)
|
||||
|
||||
#if PATCH_VERSION == 0
|
||||
#define RELEASE_VERSION "v" VVV_TOSTRING(MAJOR_VERSION) "." VVV_TOSTRING(MINOR_VERSION)
|
||||
#else
|
||||
#define RELEASE_VERSION "v" VVV_TOSTRING(MAJOR_VERSION) "." VVV_TOSTRING(MINOR_VERSION) "." VVV_TOSTRING(PATCH_VERSION)
|
||||
#endif
|
||||
|
||||
#endif /* RELEASEVERSION_H */
|
||||
|
||||
@@ -32,15 +32,6 @@ static int tr;
|
||||
static int tg;
|
||||
static int tb;
|
||||
|
||||
struct MapRenderData
|
||||
{
|
||||
int zoom;
|
||||
int xoff;
|
||||
int yoff;
|
||||
int legendxoff;
|
||||
int legendyoff;
|
||||
};
|
||||
|
||||
static inline void drawslowdowntext(const int y)
|
||||
{
|
||||
switch (game.slowdown)
|
||||
@@ -114,7 +105,7 @@ static void volumesliderrender(void)
|
||||
}
|
||||
|
||||
char slider[40 + 1];
|
||||
slider_get(slider, sizeof(slider), volume_max_position*volume/USER_VOLUME_MAX, volume_max_position+1, 240);
|
||||
slider_get(slider, sizeof(slider), volume_max_position * volume / USER_VOLUME_MAX, volume_max_position + 1, 240);
|
||||
|
||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
||||
|
||||
@@ -1218,6 +1209,7 @@ static void menurender(void)
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
font::print(PR_2X | PR_CEN, -1, 30, loc::gettext("Room Name BG"), tr, tg, tb);
|
||||
int next_y = font::print_wrap(PR_CEN, -1, 65, loc::gettext("Lets you see through what is behind the name at the bottom of the screen."), tr, tg, tb);
|
||||
if (graphics.translucentroomname)
|
||||
@@ -1226,6 +1218,21 @@ static void menurender(void)
|
||||
font::print_wrap(PR_CEN, -1, next_y, loc::gettext("Room name background is OPAQUE"), tr, tg, tb);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
font::print(PR_2X | PR_CEN, -1, 30, loc::gettext("Checkpoint Saving"), tr, tg, tb);
|
||||
int next_y = font::print_wrap(PR_CEN, -1, 65, loc::gettext("Toggle if checkpoints should save the game."), tr, tg, tb);
|
||||
if (!game.checkpoint_saving)
|
||||
{
|
||||
font::print_wrap(PR_CEN, -1, next_y, loc::gettext("Checkpoint saving is OFF"), tr / 2, tg / 2, tb / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
font::print_wrap(PR_CEN, -1, next_y, loc::gettext("Checkpoint saving is ON"), tr, tg, tb);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Menu::accessibility:
|
||||
{
|
||||
@@ -2852,42 +2859,26 @@ static void draw_roomname_menu(void)
|
||||
#define FLIP_PR_CJK_LOW (graphics.flipmode ? PR_CJK_HIGH : PR_CJK_LOW)
|
||||
#define FLIP_PR_CJK_HIGH (graphics.flipmode ? PR_CJK_LOW : PR_CJK_HIGH)
|
||||
|
||||
static MapRenderData getmaprenderdata(void)
|
||||
{
|
||||
MapRenderData data;
|
||||
|
||||
data.zoom = map.custommode ? map.customzoom : 1;
|
||||
data.xoff = map.custommode ? map.custommmxoff : 0;
|
||||
data.yoff = map.custommode ? map.custommmyoff : 0;
|
||||
data.legendxoff = 40 + data.xoff;
|
||||
data.legendyoff = 21 + data.yoff;
|
||||
|
||||
// Magic numbers for centering legend tiles.
|
||||
switch (data.zoom)
|
||||
{
|
||||
case 4:
|
||||
data.legendxoff += 20;
|
||||
data.legendyoff += 14;
|
||||
break;
|
||||
case 2:
|
||||
data.legendxoff += 8;
|
||||
data.legendyoff += 5;
|
||||
break;
|
||||
default:
|
||||
data.legendxoff += 2;
|
||||
data.legendyoff += 1;
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static void rendermap(void)
|
||||
{
|
||||
if (map.custommode && map.customshowmm)
|
||||
{
|
||||
graphics.drawpixeltextbox(35 + map.custommmxoff, 16 + map.custommmyoff, map.custommmxsize + 10, map.custommmysize + 10, 65, 185, 207);
|
||||
graphics.drawpartimage(graphics.minimap_mounted ? IMAGE_MINIMAP : IMAGE_CUSTOMMINIMAP, 40 + map.custommmxoff, 21 + map.custommmyoff, map.custommmxsize, map.custommmysize);
|
||||
const MapRenderData data = map.get_render_data();
|
||||
|
||||
graphics.drawpixeltextbox(35 + data.xoff, 16 + data.yoff, data.pixelsx + 10, data.pixelsy + 10, 65, 185, 207);
|
||||
|
||||
if (graphics.customminimaps[map.currentregion] != NULL)
|
||||
{
|
||||
graphics.draw_region_image(map.currentregion, 40 + data.xoff, 21 + data.yoff, data.pixelsx, data.pixelsy);
|
||||
}
|
||||
else if (map.currentregion == 0 && graphics.minimap_mounted)
|
||||
{
|
||||
graphics.drawpartimage(IMAGE_MINIMAP, 40 + data.xoff, 21 + data.yoff, data.pixelsx, data.pixelsy);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics.drawpartimage(IMAGE_CUSTOMMINIMAP, 40 + data.xoff, 21 + data.yoff, data.pixelsx, data.pixelsy);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2897,11 +2888,11 @@ static void rendermap(void)
|
||||
|
||||
static void rendermapfog(void)
|
||||
{
|
||||
const MapRenderData data = getmaprenderdata();
|
||||
const MapRenderData data = map.get_render_data();
|
||||
|
||||
for (int j = 0; j < map.getheight(); j++)
|
||||
for (int j = data.starty; j < data.starty + data.height; j++)
|
||||
{
|
||||
for (int i = 0; i < map.getwidth(); i++)
|
||||
for (int i = data.startx; i < data.startx + data.width; i++)
|
||||
{
|
||||
if (!map.isexplored(i, j))
|
||||
{
|
||||
@@ -2910,7 +2901,7 @@ static void rendermapfog(void)
|
||||
{
|
||||
for (int y = 0; y < data.zoom; y++)
|
||||
{
|
||||
graphics.drawimage(IMAGE_COVERED, data.xoff + 40 + (x * 12) + (i * (12 * data.zoom)), data.yoff + 21 + (y * 9) + (j * (9 * data.zoom)), false);
|
||||
graphics.drawimage(IMAGE_COVERED, data.xoff + 40 + (x * 12) + ((i - data.startx) * (12 * data.zoom)), data.yoff + 21 + (y * 9) + ((j - data.starty) * (9 * data.zoom)), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2922,17 +2913,22 @@ static void rendermaplegend(void)
|
||||
{
|
||||
// Draw the map legend, aka teleports/targets/trinkets
|
||||
|
||||
const MapRenderData data = getmaprenderdata();
|
||||
const MapRenderData data = map.get_render_data();
|
||||
|
||||
for (size_t i = 0; i < map.teleporters.size(); i++)
|
||||
{
|
||||
if (map.showteleporters && map.isexplored(map.teleporters[i].x, map.teleporters[i].y))
|
||||
int x = map.teleporters[i].x - data.startx;
|
||||
int y = map.teleporters[i].y - data.starty;
|
||||
if (x >= 0 && y >= 0 && x < data.width && y < data.height)
|
||||
{
|
||||
font::print(PR_FONT_8X8 | PR_FULLBOR, data.legendxoff + (map.teleporters[i].x * 12 * data.zoom), data.legendyoff + (map.teleporters[i].y * 9 * data.zoom), "💿", 171, 255, 252);
|
||||
}
|
||||
else if (map.showtargets && !map.isexplored(map.teleporters[i].x, map.teleporters[i].y))
|
||||
{
|
||||
font::print(PR_FONT_8X8 | PR_FULLBOR, data.legendxoff + (map.teleporters[i].x * 12 * data.zoom), data.legendyoff + (map.teleporters[i].y * 9 * data.zoom), "❓", 64, 64, 64);
|
||||
if (map.showteleporters && map.isexplored(x + data.startx, y + data.starty))
|
||||
{
|
||||
font::print(PR_FONT_8X8 | PR_FULLBOR, data.legendxoff + (x * 12 * data.zoom), data.legendyoff + (y * 9 * data.zoom), "💿", 171, 255, 252);
|
||||
}
|
||||
else if (map.showtargets && !map.isexplored(x + data.startx, y + data.starty))
|
||||
{
|
||||
font::print(PR_FONT_8X8 | PR_FULLBOR, data.legendxoff + (x * 12 * data.zoom), data.legendyoff + (y * 9 * data.zoom), "❓", 64, 64, 64);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2942,7 +2938,12 @@ static void rendermaplegend(void)
|
||||
{
|
||||
if (!obj.collect[i])
|
||||
{
|
||||
font::print(PR_FONT_8X8 | PR_FULLBOR, data.legendxoff + (map.shinytrinkets[i].x * 12 * data.zoom), data.legendyoff + (map.shinytrinkets[i].y * 9 * data.zoom), "🪙", 254, 252, 58);
|
||||
int x = map.shinytrinkets[i].x - data.startx;
|
||||
int y = map.shinytrinkets[i].y - data.starty;
|
||||
if (x >= 0 && y >= 0 && x < data.width && y < data.height)
|
||||
{
|
||||
font::print(PR_FONT_8X8 | PR_FULLBOR, data.legendxoff + (x * 12 * data.zoom), data.legendyoff + (y * 9 * data.zoom), "🪙", 254, 252, 58);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2950,44 +2951,45 @@ static void rendermaplegend(void)
|
||||
|
||||
static void rendermapcursor(const bool flashing)
|
||||
{
|
||||
const MapRenderData data = getmaprenderdata();
|
||||
const MapRenderData data = map.get_render_data();
|
||||
int room_x = game.roomx - data.startx - 100;
|
||||
int room_y = game.roomy - data.starty - 100;
|
||||
int pixels_x = room_x * 12;
|
||||
int pixels_y = room_y * 9;
|
||||
|
||||
if (!map.custommode && game.roomx == 109)
|
||||
{
|
||||
// Draw the tower specially
|
||||
if (!flashing || game.noflashingmode)
|
||||
{
|
||||
graphics.draw_rect(40 + ((game.roomx - 100) * 12) + 2, 21 + 2, 12 - 4, 180 - 4, 16, 245 - (help.glow * 2), 245 - (help.glow * 2));
|
||||
graphics.draw_rect(40 + pixels_x + 2, 21 + 2, 12 - 4, 180 - 4, 16, 245 - (help.glow * 2), 245 - (help.glow * 2));
|
||||
}
|
||||
else if (map.cursorstate == 1)
|
||||
{
|
||||
if (int(map.cursordelay / 4) % 2 == 0)
|
||||
{
|
||||
graphics.draw_rect(40 + ((game.roomx - 100) * 12), 21, 12, 180, 255, 255, 255);
|
||||
graphics.draw_rect(40 + ((game.roomx - 100) * 12) + 2, 21 + 2, 12 - 4, 180 - 4, 255, 255, 255);
|
||||
graphics.draw_rect(40 + pixels_x, 21, 12, 180, 255, 255, 255);
|
||||
graphics.draw_rect(40 + pixels_x + 2, 21 + 2, 12 - 4, 180 - 4, 255, 255, 255);
|
||||
}
|
||||
}
|
||||
else if (map.cursorstate == 2 && (int(map.cursordelay / 15) % 2 == 0))
|
||||
{
|
||||
graphics.draw_rect(40 + ((game.roomx - 100) * 12) + 2, 21 + 2, 12 - 4, 180 - 4, 16, 245 - (help.glow), 245 - (help.glow));
|
||||
graphics.draw_rect(40 + pixels_x + 2, 21 + 2, 12 - 4, 180 - 4, 16, 245 - (help.glow), 245 - (help.glow));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!flashing || ((map.cursorstate == 2 && int(map.cursordelay / 15) % 2 == 0) || game.noflashingmode))
|
||||
if (room_x >= 0 && room_y >= 0 && room_x < data.width && room_y < data.height)
|
||||
{
|
||||
int margin = (data.zoom == 4) ? 2 : 1;
|
||||
graphics.draw_rect(
|
||||
40 + ((game.roomx - 100) * 12 * data.zoom) + margin + data.xoff,
|
||||
21 + ((game.roomy - 100) * 9 * data.zoom) + margin + data.yoff,
|
||||
(12 * data.zoom) - (2 * margin), (9 * data.zoom) - (2 * margin),
|
||||
16, 245 - (help.glow), 245 - (help.glow)
|
||||
);
|
||||
}
|
||||
else if (map.cursorstate == 1 && int(map.cursordelay / 4) % 2 == 0)
|
||||
{
|
||||
graphics.draw_rect(40 + ((game.roomx - 100) * 12 * data.zoom) + data.xoff, 21 + ((game.roomy - 100) * 9 * data.zoom) + data.yoff, 12 * data.zoom, 9 * data.zoom, 255, 255, 255);
|
||||
graphics.draw_rect(40 + ((game.roomx - 100) * 12 * data.zoom) + 2 + data.xoff, 21 + ((game.roomy - 100) * 9 * data.zoom) + 2 + data.yoff, (12 * data.zoom) - 4, (9 * data.zoom) - 4, 255, 255, 255);
|
||||
if (!flashing || ((map.cursorstate == 2 && int(map.cursordelay / 15) % 2 == 0) || game.noflashingmode))
|
||||
{
|
||||
graphics.draw_rect(40 + (pixels_x * data.zoom) + 2 + data.xoff, 21 + (pixels_y * data.zoom) + 2 + data.yoff, (12 * data.zoom) - 4, (9 * data.zoom) - 4, 16, 245 - (help.glow), 245 - (help.glow));
|
||||
}
|
||||
else if (map.cursorstate == 1 && int(map.cursordelay / 4) % 2 == 0)
|
||||
{
|
||||
graphics.draw_rect(40 + (pixels_x * data.zoom) + data.xoff, 21 + (pixels_y * data.zoom) + data.yoff, 12 * data.zoom, 9 * data.zoom, 255, 255, 255);
|
||||
graphics.draw_rect(40 + (pixels_x * data.zoom) + 2 + data.xoff, 21 + (pixels_y * data.zoom) + 2 + data.yoff, (12 * data.zoom) - 4, (9 * data.zoom) - 4, 255, 255, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3179,26 +3181,30 @@ void maprender(void)
|
||||
|
||||
font::print(title_flags | PR_2X | PR_CEN, -1, FLIP(45, 8), meta.title, 196, 196, 255 - help.glow);
|
||||
int sp = SDL_max(10, font::height(PR_FONT_LEVEL));
|
||||
int desc_pos = (cl.numcrewmates() > 0) ? 70 : 70 + (sp*2);
|
||||
graphics.print_level_creator(creator_flags, FLIP(70, 8), meta.creator, 196, 196, 255 - help.glow);
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(70+sp, 8), meta.website, 196, 196, 255 - help.glow);
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(70+sp*3, 8), meta.Desc1, 196, 196, 255 - help.glow);
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(70+sp*4, 8), meta.Desc2, 196, 196, 255 - help.glow);
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(70 + sp, 8), meta.website, 196, 196, 255 - help.glow);
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(desc_pos + sp*3, 8), meta.Desc1, 196, 196, 255 - help.glow);
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(desc_pos + sp*4, 8), meta.Desc2, 196, 196, 255 - help.glow);
|
||||
if (sp <= 10)
|
||||
{
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(70+sp*5, 8), meta.Desc3, 196, 196, 255 - help.glow);
|
||||
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(desc_pos + sp*5, 8), meta.Desc3, 196, 196, 255 - help.glow);
|
||||
}
|
||||
|
||||
int remaining = cl.numcrewmates() - game.crewmates();
|
||||
if (cl.numcrewmates() > 0)
|
||||
{
|
||||
int remaining = cl.numcrewmates() - game.crewmates();
|
||||
|
||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
||||
loc::gettext_plural_fill(
|
||||
buffer, sizeof(buffer),
|
||||
"{n_crew|wordy} crewmates remain",
|
||||
"{n_crew|wordy} crewmate remains",
|
||||
"n_crew:int",
|
||||
remaining
|
||||
);
|
||||
font::print_wrap(PR_CEN, -1, FLIP(165, 8), buffer, 196, 196, 255 - help.glow);
|
||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
||||
loc::gettext_plural_fill(
|
||||
buffer, sizeof(buffer),
|
||||
"{n_crew|wordy} crewmates remain",
|
||||
"{n_crew|wordy} crewmate remains",
|
||||
"n_crew:int",
|
||||
remaining
|
||||
);
|
||||
font::print_wrap(PR_CEN, -1, FLIP(165, 8), buffer, 196, 196, 255 - help.glow);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3271,21 +3277,29 @@ void maprender(void)
|
||||
}
|
||||
|
||||
/* Stats. */
|
||||
font::print(PR_CEN | FLIP_PR_CJK_HIGH, -1, FLIP(52, 8), loc::gettext("[Trinkets found]"), 196, 196, 255 - help.glow);
|
||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
||||
vformat_buf(
|
||||
buffer, sizeof(buffer),
|
||||
loc::gettext("{n_trinkets|wordy} out of {max_trinkets|wordy}"),
|
||||
"n_trinkets:int, max_trinkets:int",
|
||||
game.trinkets(), max_trinkets
|
||||
);
|
||||
font::print(PR_CEN | FLIP_PR_CJK_LOW, -1, FLIP(64, 8), buffer, 96, 96, 96);
|
||||
|
||||
font::print(PR_CEN | FLIP_PR_CJK_HIGH, -1, FLIP(102, 8), loc::gettext("[Number of Deaths]"), 196, 196, 255 - help.glow);
|
||||
font::print(PR_CEN | FLIP_PR_CJK_LOW, -1, FLIP(114, 8), help.String(game.deathcounts), 96, 96, 96);
|
||||
// Always show trinkets if you're in the main game, otherwise only show them if any exist in the level
|
||||
bool show_trinkets = map.custommode ? (cl.numtrinkets() > 0) : true;
|
||||
int deaths_pos = show_trinkets ? 102 : 72;
|
||||
int time_pos = show_trinkets ? 152 : 132;
|
||||
if (show_trinkets)
|
||||
{
|
||||
font::print(PR_CEN | FLIP_PR_CJK_HIGH, -1, FLIP(52, 8), loc::gettext("[Trinkets found]"), 196, 196, 255 - help.glow);
|
||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
||||
vformat_buf(
|
||||
buffer, sizeof(buffer),
|
||||
loc::gettext("{n_trinkets|wordy} out of {max_trinkets|wordy}"),
|
||||
"n_trinkets:int, max_trinkets:int",
|
||||
game.trinkets(), max_trinkets
|
||||
);
|
||||
font::print(PR_CEN | FLIP_PR_CJK_LOW, -1, FLIP(64, 8), buffer, 96, 96, 96);
|
||||
}
|
||||
|
||||
font::print(PR_CEN | FLIP_PR_CJK_HIGH, -1, FLIP(152, 8), loc::gettext("[Time Taken]"), 196, 196, 255 - help.glow);
|
||||
font::print(PR_CEN | FLIP_PR_CJK_LOW, -1, FLIP(164, 8), game.timestring(), 96, 96, 96);
|
||||
font::print(PR_CEN | FLIP_PR_CJK_HIGH, -1, FLIP(deaths_pos, 8), loc::gettext("[Number of Deaths]"), 196, 196, 255 - help.glow);
|
||||
font::print(PR_CEN | FLIP_PR_CJK_LOW, -1, FLIP(deaths_pos + 12, 8), help.String(game.deathcounts), 96, 96, 96);
|
||||
|
||||
font::print(PR_CEN | FLIP_PR_CJK_HIGH, -1, FLIP(time_pos, 8), loc::gettext("[Time Taken]"), 196, 196, 255 - help.glow);
|
||||
font::print(PR_CEN | FLIP_PR_CJK_LOW, -1, FLIP(time_pos + 12, 8), game.timestring(), 96, 96, 96);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
@@ -3554,7 +3568,7 @@ void teleporterrender(void)
|
||||
|
||||
// Draw a box around the currently selected teleporter
|
||||
|
||||
const MapRenderData data = getmaprenderdata();
|
||||
const MapRenderData data = map.get_render_data();
|
||||
|
||||
if (game.useteleporter)
|
||||
{
|
||||
|
||||
23
desktop_version/src/SDL_uikit_main.c
Normal file
23
desktop_version/src/SDL_uikit_main.c
Normal file
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
SDL_uikit_main.c, placed in the public domain by Sam Lantinga 3/18/2019
|
||||
*/
|
||||
|
||||
/* Include the SDL main definition header */
|
||||
#include "SDL_main.h"
|
||||
|
||||
#if defined(__IPHONEOS__) || defined(__TVOS__)
|
||||
|
||||
#ifndef SDL_MAIN_HANDLED
|
||||
#ifdef main
|
||||
#undef main
|
||||
#endif
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return SDL_UIKitRunApp(argc, argv, SDL_main);
|
||||
}
|
||||
#endif /* !SDL_MAIN_HANDLED */
|
||||
|
||||
#endif /* __IPHONEOS__ || __TVOS__ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
@@ -383,7 +383,7 @@ bool Screen::isForcedFullscreen(void)
|
||||
* If you're working on a tenfoot-only build, add a def that always
|
||||
* returns true!
|
||||
*/
|
||||
#ifdef __ANDROID__
|
||||
#if defined(__ANDROID__) || TARGET_OS_IPHONE
|
||||
return true;
|
||||
#else
|
||||
return SDL_GetHintBoolean("SteamTenfoot", SDL_FALSE);
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "LocalizationStorage.h"
|
||||
#include "Map.h"
|
||||
#include "Music.h"
|
||||
#include "ReleaseVersion.h"
|
||||
#include "Unreachable.h"
|
||||
#include "UtilityClass.h"
|
||||
#include "VFormat.h"
|
||||
@@ -53,6 +54,7 @@ scriptclass::scriptclass(void)
|
||||
textlarge = false;
|
||||
textbox_sprites.clear();
|
||||
textbox_image = TEXTIMAGE_NONE;
|
||||
textbox_absolutepos = false;
|
||||
}
|
||||
|
||||
void scriptclass::add_default_colours(void)
|
||||
@@ -133,16 +135,16 @@ void scriptclass::tokenize( const std::string& t )
|
||||
|
||||
static int getcolorfromname(std::string name)
|
||||
{
|
||||
if (name == "player") return CYAN;
|
||||
else if (name == "cyan") return CYAN;
|
||||
else if (name == "red") return RED;
|
||||
else if (name == "green") return GREEN;
|
||||
else if (name == "yellow") return YELLOW;
|
||||
else if (name == "blue") return BLUE;
|
||||
else if (name == "purple") return PURPLE;
|
||||
else if (name == "customcyan") return CYAN;
|
||||
else if (name == "gray") return GRAY;
|
||||
else if (name == "teleporter") return TELEPORTER;
|
||||
if (name == "player") return EntityColour_CREW_CYAN;
|
||||
else if (name == "cyan") return EntityColour_CREW_CYAN;
|
||||
else if (name == "red") return EntityColour_CREW_RED;
|
||||
else if (name == "green") return EntityColour_CREW_GREEN;
|
||||
else if (name == "yellow") return EntityColour_CREW_YELLOW;
|
||||
else if (name == "blue") return EntityColour_CREW_BLUE;
|
||||
else if (name == "purple") return EntityColour_CREW_PURPLE;
|
||||
else if (name == "customcyan") return EntityColour_CREW_CYAN;
|
||||
else if (name == "gray") return EntityColour_CREW_GRAY;
|
||||
else if (name == "teleporter") return EntityColour_TELEPORTER_FLASHING;
|
||||
|
||||
int color = help.Int(name.c_str(), -1);
|
||||
if (color < 0) return -1; // Not a number (or it's negative), so we give up
|
||||
@@ -157,7 +159,6 @@ static int getcrewmanfromname(std::string name)
|
||||
return obj.getcrewman(color);
|
||||
}
|
||||
|
||||
|
||||
/* Also used in gamestate 1001. */
|
||||
void foundtrinket_textbox1(textboxclass* THIS);
|
||||
void foundtrinket_textbox2(textboxclass* THIS);
|
||||
@@ -294,7 +295,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
for (size_t edi = 0; edi < obj.entities.size(); edi++)
|
||||
{
|
||||
if (obj.entities[edi].type == 9 || obj.entities[edi].type == 10)
|
||||
if (obj.entities[edi].type == EntityType_HORIZONTAL_GRAVITY_LINE || obj.entities[edi].type == EntityType_VERTICAL_GRAVITY_LINE)
|
||||
{
|
||||
obj.disableentity(edi);
|
||||
}
|
||||
@@ -304,7 +305,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
for (size_t edi = 0; edi < obj.entities.size(); edi++)
|
||||
{
|
||||
if (obj.entities[edi].type == 11)
|
||||
if (obj.entities[edi].type == EntityType_WARP_TOKEN)
|
||||
{
|
||||
obj.disableentity(edi);
|
||||
}
|
||||
@@ -331,13 +332,74 @@ void scriptclass::run(void)
|
||||
for (size_t edi = 0; edi < obj.entities.size(); edi++)
|
||||
{
|
||||
obj.disableblockat(obj.entities[edi].xp, obj.entities[edi].yp);
|
||||
if (obj.entities[edi].type == 2 && obj.entities[edi].rule == 3)
|
||||
if (obj.entities[edi].type == EntityType_DISAPPEARING_PLATFORM && obj.entities[edi].rule == 3)
|
||||
{
|
||||
obj.disableentity(edi);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (words[0] == "ifversion")
|
||||
{
|
||||
// A short for each is SURELY enough
|
||||
unsigned short version[3] = { 0, 0, 0 };
|
||||
bool valid_version = true;
|
||||
int current = 0;
|
||||
|
||||
// Crawl through the string
|
||||
for (int i = 0; i < words[1].size(); i++)
|
||||
{
|
||||
// If the current character is a number, add it to the current version part
|
||||
if (words[1][i] >= '0' && words[1][i] <= '9')
|
||||
{
|
||||
version[current] = version[current] * 10 + (words[1][i] - '0');
|
||||
}
|
||||
else if (words[1][i] == '.')
|
||||
{
|
||||
current++;
|
||||
if (current >= 3)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unexpected character
|
||||
valid_version = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (valid_version)
|
||||
{
|
||||
bool version_is_met = false;
|
||||
|
||||
if (MAJOR_VERSION > version[0])
|
||||
{
|
||||
version_is_met = true;
|
||||
}
|
||||
else if (MAJOR_VERSION == version[0])
|
||||
{
|
||||
if (MINOR_VERSION > version[1])
|
||||
{
|
||||
version_is_met = true;
|
||||
}
|
||||
else if (MINOR_VERSION == version[1])
|
||||
{
|
||||
if (PATCH_VERSION >= version[2])
|
||||
{
|
||||
version_is_met = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (version_is_met)
|
||||
{
|
||||
loadalts("custom_" + words[2], "custom_" + raw_words[2]);
|
||||
position--;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (words[0] == "customiftrinkets")
|
||||
{
|
||||
if (game.trinkets() >= ss_toi(words[1]))
|
||||
@@ -371,6 +433,23 @@ void scriptclass::run(void)
|
||||
map.customshowmm=false;
|
||||
}
|
||||
}
|
||||
else if (words[0] == "setregion")
|
||||
{
|
||||
map.setregion(
|
||||
ss_toi(words[1]),
|
||||
ss_toi(words[2]),
|
||||
ss_toi(words[3]),
|
||||
ss_toi(words[4]),
|
||||
ss_toi(words[5]));
|
||||
}
|
||||
else if (words[0] == "removeregion")
|
||||
{
|
||||
map.removeregion(ss_toi(words[1]));
|
||||
}
|
||||
else if (words[0] == "changeregion")
|
||||
{
|
||||
map.changeregion(ss_toi(words[1]));
|
||||
}
|
||||
if (words[0] == "delay")
|
||||
{
|
||||
//USAGE: delay(frames)
|
||||
@@ -430,7 +509,21 @@ void scriptclass::run(void)
|
||||
}
|
||||
if (words[0] == "playef")
|
||||
{
|
||||
music.playef(ss_toi(words[1]));
|
||||
bool played = false;
|
||||
int sound_id = help.Int(words[1].c_str(), -1);
|
||||
|
||||
if (music.soundidexists(words[1].c_str()))
|
||||
{
|
||||
played = music.playefid(words[1].c_str());
|
||||
}
|
||||
else if (!music.soundisextra(sound_id))
|
||||
{
|
||||
played = music.playef(sound_id);
|
||||
}
|
||||
if (!played)
|
||||
{
|
||||
vlog_error("playef() couldn't play sound: %s", words[1].c_str());
|
||||
}
|
||||
}
|
||||
if (words[0] == "play")
|
||||
{
|
||||
@@ -549,11 +642,15 @@ void scriptclass::run(void)
|
||||
textcrewmateposition = TextboxCrewmatePosition();
|
||||
textbox_sprites.clear();
|
||||
textbox_image = TEXTIMAGE_NONE;
|
||||
textbox_absolutepos = false;
|
||||
textbox_force_outline = false;
|
||||
textbox_outline = false;
|
||||
}
|
||||
else if (words[0] == "position")
|
||||
{
|
||||
//are we facing left or right? for some objects we don't care, default at 0.
|
||||
j = 0;
|
||||
textbox_absolutepos = false;
|
||||
|
||||
//the first word is the object to position relative to
|
||||
if (words[1] == "centerx")
|
||||
@@ -575,6 +672,13 @@ void scriptclass::run(void)
|
||||
textx = -500;
|
||||
texty = -500;
|
||||
}
|
||||
else if (words[1] == "absolute")
|
||||
{
|
||||
words[2] = "donothing";
|
||||
j = -1;
|
||||
textbox_absolutepos = true;
|
||||
|
||||
}
|
||||
else // Well, are they asking for a crewmate...?
|
||||
{
|
||||
i = getcrewmanfromname(words[1]);
|
||||
@@ -609,37 +713,37 @@ void scriptclass::run(void)
|
||||
//the first word is the object to position relative to
|
||||
if (words[1] == "player")
|
||||
{
|
||||
i = obj.getcustomcrewman(0);
|
||||
i = obj.getcustomcrewman(EntityColour_CREW_CYAN);
|
||||
j = obj.entities[i].dir;
|
||||
}
|
||||
else if (words[1] == "cyan")
|
||||
{
|
||||
i = obj.getcustomcrewman(0);
|
||||
i = obj.getcustomcrewman(EntityColour_CREW_CYAN);
|
||||
j = obj.entities[i].dir;
|
||||
}
|
||||
else if (words[1] == "purple")
|
||||
{
|
||||
i = obj.getcustomcrewman(1);
|
||||
i = obj.getcustomcrewman(EntityColour_CREW_PURPLE);
|
||||
j = obj.entities[i].dir;
|
||||
}
|
||||
else if (words[1] == "yellow")
|
||||
{
|
||||
i = obj.getcustomcrewman(2);
|
||||
i = obj.getcustomcrewman(EntityColour_CREW_YELLOW);
|
||||
j = obj.entities[i].dir;
|
||||
}
|
||||
else if (words[1] == "red")
|
||||
{
|
||||
i = obj.getcustomcrewman(3);
|
||||
i = obj.getcustomcrewman(EntityColour_CREW_RED);
|
||||
j = obj.entities[i].dir;
|
||||
}
|
||||
else if (words[1] == "green")
|
||||
{
|
||||
i = obj.getcustomcrewman(4);
|
||||
i = obj.getcustomcrewman(EntityColour_CREW_GREEN);
|
||||
j = obj.entities[i].dir;
|
||||
}
|
||||
else if (words[1] == "blue")
|
||||
{
|
||||
i = obj.getcustomcrewman(5);
|
||||
i = obj.getcustomcrewman(EntityColour_CREW_BLUE);
|
||||
j = obj.entities[i].dir;
|
||||
}
|
||||
else if (words[1] == "centerx")
|
||||
@@ -719,6 +823,23 @@ void scriptclass::run(void)
|
||||
textbox_image = TEXTIMAGE_NONE;
|
||||
}
|
||||
}
|
||||
else if (words[0] == "textoutline")
|
||||
{
|
||||
if (words[1] == "default")
|
||||
{
|
||||
textbox_force_outline = false;
|
||||
}
|
||||
else if (words[1] == "on")
|
||||
{
|
||||
textbox_force_outline = true;
|
||||
textbox_outline = true;
|
||||
}
|
||||
else if (words[1] == "off")
|
||||
{
|
||||
textbox_force_outline = true;
|
||||
textbox_outline = false;
|
||||
}
|
||||
}
|
||||
else if (words[0] == "flipme")
|
||||
{
|
||||
textflipme = !textflipme;
|
||||
@@ -757,16 +878,28 @@ void scriptclass::run(void)
|
||||
|
||||
graphics.setimage(textbox_image);
|
||||
|
||||
if (textx == -500 || textx == -1)
|
||||
if (textbox_absolutepos)
|
||||
{
|
||||
graphics.textboxcenterx();
|
||||
textcrewmateposition.override_x = false;
|
||||
graphics.textboxabsolutepos(textx, texty);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (textx == -500 || textx == -1)
|
||||
{
|
||||
graphics.textboxcenterx();
|
||||
textcrewmateposition.override_x = false;
|
||||
}
|
||||
|
||||
if (texty == -500)
|
||||
{
|
||||
graphics.textboxcentery();
|
||||
textcrewmateposition.override_y = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (texty == -500)
|
||||
if (textbox_force_outline)
|
||||
{
|
||||
graphics.textboxcentery();
|
||||
textcrewmateposition.override_y = false;
|
||||
graphics.textboxoutline(textbox_outline);
|
||||
}
|
||||
|
||||
TextboxOriginalContext context = TextboxOriginalContext();
|
||||
@@ -852,7 +985,7 @@ void scriptclass::run(void)
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].lerpoldyp = obj.entities[i].yp;
|
||||
obj.entities[i].size = 13;
|
||||
obj.entities[i].colour = 23;
|
||||
obj.entities[i].colour = EntityColour_GRAVITRON_INDICATOR;
|
||||
obj.entities[i].cx = 36;// 6;
|
||||
obj.entities[i].cy = 12+80;// 2;
|
||||
obj.entities[i].h = 126-80;// 21;
|
||||
@@ -867,7 +1000,7 @@ void scriptclass::run(void)
|
||||
obj.entities[i].xp = 100;
|
||||
obj.entities[i].lerpoldxp = obj.entities[i].xp;
|
||||
obj.entities[i].size = 0;
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = EntityColour_CREW_CYAN;
|
||||
obj.entities[i].cx = 6;
|
||||
obj.entities[i].cy = 2;
|
||||
obj.entities[i].h = 21;
|
||||
@@ -964,47 +1097,47 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (words[1] == "player")
|
||||
{
|
||||
i=obj.getcustomcrewman(0);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_CYAN);
|
||||
obj.customcrewmoods[0]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "cyan")
|
||||
{
|
||||
i=obj.getcustomcrewman(0);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_CYAN);
|
||||
obj.customcrewmoods[0]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "customcyan")
|
||||
{
|
||||
i=obj.getcustomcrewman(0);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_CYAN);
|
||||
obj.customcrewmoods[0]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "red")
|
||||
{
|
||||
i=obj.getcustomcrewman(3);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_RED);
|
||||
obj.customcrewmoods[3]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "green")
|
||||
{
|
||||
i=obj.getcustomcrewman(4);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_GREEN);
|
||||
obj.customcrewmoods[4]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "yellow")
|
||||
{
|
||||
i=obj.getcustomcrewman(2);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_YELLOW);
|
||||
obj.customcrewmoods[2]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "blue")
|
||||
{
|
||||
i=obj.getcustomcrewman(5);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_BLUE);
|
||||
obj.customcrewmoods[5]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "purple")
|
||||
{
|
||||
i=obj.getcustomcrewman(1);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_PURPLE);
|
||||
obj.customcrewmoods[1]=ss_toi(words[2]);
|
||||
}
|
||||
else if (words[1] == "pink")
|
||||
{
|
||||
i=obj.getcustomcrewman(1);
|
||||
i=obj.getcustomcrewman(EntityColour_CREW_PURPLE);
|
||||
obj.customcrewmoods[1]=ss_toi(words[2]);
|
||||
}
|
||||
|
||||
@@ -1130,7 +1263,7 @@ void scriptclass::run(void)
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].tile = 6;
|
||||
obj.entities[i].colour = 102;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
|
||||
}
|
||||
}
|
||||
else if (words[0] == "changecolour")
|
||||
@@ -1206,6 +1339,8 @@ void scriptclass::run(void)
|
||||
{
|
||||
game.savedir = obj.entities[i].dir;
|
||||
}
|
||||
|
||||
game.checkpoint_save();
|
||||
}
|
||||
else if (words[0] == "gamestate")
|
||||
{
|
||||
@@ -1328,6 +1463,28 @@ void scriptclass::run(void)
|
||||
map.setexplored(19, 7, false);
|
||||
map.setexplored(19, 8, false);
|
||||
}
|
||||
else if (words[0] == "mapexplored")
|
||||
{
|
||||
if (words[1] == "none")
|
||||
{
|
||||
map.resetmap();
|
||||
}
|
||||
else if (words[1] == "all")
|
||||
{
|
||||
map.fullmap();
|
||||
}
|
||||
}
|
||||
else if (words[0] == "mapreveal")
|
||||
{
|
||||
if (words[1] == "on")
|
||||
{
|
||||
map.revealmap = true;
|
||||
}
|
||||
else if (words[1] == "off")
|
||||
{
|
||||
map.revealmap = false;
|
||||
}
|
||||
}
|
||||
else if (words[0] == "showteleporters")
|
||||
{
|
||||
map.showteleporters = true;
|
||||
@@ -1413,7 +1570,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
game.unlocknum(Unlock_SECRETLAB);
|
||||
game.insecretlab = true;
|
||||
SDL_memset(map.explored, true, sizeof(map.explored));
|
||||
map.fullmap();
|
||||
}
|
||||
else if (words[0] == "leavesecretlab")
|
||||
{
|
||||
@@ -1566,9 +1723,9 @@ void scriptclass::run(void)
|
||||
{
|
||||
for (j = 0; j < (int) obj.entities.size(); j++)
|
||||
{
|
||||
if (obj.entities[j].type == 13)
|
||||
if (obj.entities[j].type == EntityType_TERMINAL)
|
||||
{
|
||||
obj.entities[j].colour = 4;
|
||||
obj.entities[j].colour = EntityColour_INACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
if (ss_toi(words[1]) == 1)
|
||||
@@ -1578,7 +1735,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 88 && obj.entities[j].yp==80)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1589,7 +1746,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 128 && obj.entities[j].yp==80)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1600,7 +1757,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 176 && obj.entities[j].yp==80)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1611,7 +1768,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 216 && obj.entities[j].yp==80)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1622,7 +1779,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 88 && obj.entities[j].yp==128)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1633,7 +1790,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 176 && obj.entities[j].yp==128)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1644,7 +1801,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 40 && obj.entities[j].yp==40)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1655,7 +1812,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 216 && obj.entities[j].yp==128)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1666,7 +1823,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 128 && obj.entities[j].yp==128)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1677,7 +1834,7 @@ void scriptclass::run(void)
|
||||
{
|
||||
if (obj.entities[j].xp == 264 && obj.entities[j].yp==40)
|
||||
{
|
||||
obj.entities[j].colour = 5;
|
||||
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1688,31 +1845,31 @@ void scriptclass::run(void)
|
||||
if (words[1] == "red")
|
||||
{
|
||||
i = 3;
|
||||
crew_color = RED;
|
||||
crew_color = EntityColour_CREW_RED;
|
||||
}
|
||||
else if (words[1] == "green")
|
||||
{
|
||||
i = 4;
|
||||
crew_color = GREEN;
|
||||
crew_color = EntityColour_CREW_GREEN;
|
||||
}
|
||||
else if (words[1] == "yellow")
|
||||
{
|
||||
i = 2;
|
||||
crew_color = YELLOW;
|
||||
crew_color = EntityColour_CREW_YELLOW;
|
||||
}
|
||||
else if (words[1] == "blue")
|
||||
{
|
||||
i = 5;
|
||||
crew_color = BLUE;
|
||||
crew_color = EntityColour_CREW_BLUE;
|
||||
}
|
||||
else if (words[1] == "purple")
|
||||
{
|
||||
i = 1;
|
||||
crew_color = PURPLE;
|
||||
crew_color = EntityColour_CREW_PURPLE;
|
||||
}
|
||||
|
||||
int crewman = obj.getcrewman(crew_color);
|
||||
if (INBOUNDS_VEC(crewman, obj.entities) && crew_color == GREEN)
|
||||
if (INBOUNDS_VEC(crewman, obj.entities) && crew_color == EntityColour_CREW_GREEN)
|
||||
{
|
||||
obj.createblock(5, obj.entities[crewman].xp - 32, obj.entities[crewman].yp-20, 96, 60, i, "", (i == 35));
|
||||
}
|
||||
@@ -1768,8 +1925,9 @@ void scriptclass::run(void)
|
||||
i = obj.getplayer();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 0;
|
||||
obj.entities[i].colour = cl.player_colour;
|
||||
}
|
||||
game.savecolour = cl.player_colour;
|
||||
}
|
||||
else if (words[0] == "changeplayercolour")
|
||||
{
|
||||
@@ -1793,7 +1951,7 @@ void scriptclass::run(void)
|
||||
i = obj.getteleporter();
|
||||
if (INBOUNDS_VEC(i, obj.entities))
|
||||
{
|
||||
obj.entities[i].colour = 101;
|
||||
obj.entities[i].colour = EntityColour_TELEPORTER_ACTIVE;
|
||||
}
|
||||
}
|
||||
else if (words[0] == "foundtrinket")
|
||||
@@ -1886,6 +2044,16 @@ void scriptclass::run(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (words[0] == "everybodyhappy")
|
||||
{
|
||||
for (i = 0; i < (int) obj.entities.size(); i++)
|
||||
{
|
||||
if (obj.entities[i].rule == 6 || obj.entities[i].rule == 0)
|
||||
{
|
||||
obj.entities[i].tile = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (words[0] == "startintermission2")
|
||||
{
|
||||
map.finalmode = true; //Enable final level mode
|
||||
@@ -1908,9 +2076,9 @@ void scriptclass::run(void)
|
||||
else if (words[0] == "createlastrescued")
|
||||
{
|
||||
r = graphics.crewcolour(game.lastsaved);
|
||||
if (r == 0 || r == PURPLE)
|
||||
if (r == EntityColour_CREW_CYAN || r == EntityColour_CREW_PURPLE)
|
||||
{
|
||||
r = GRAY; // Default to gray if invalid color.
|
||||
r = EntityColour_CREW_GRAY; // Default to gray if invalid color.
|
||||
}
|
||||
|
||||
obj.createentity(200, 153, 18, r, 0, 19, 30);
|
||||
@@ -2570,7 +2738,7 @@ void scriptclass::startgamemode(const enum StartMode mode)
|
||||
}
|
||||
}
|
||||
|
||||
/* Containers which need to be reset before gameplay starts
|
||||
/* State which needs to be reset before gameplay starts
|
||||
* ex. before custom levels get loaded */
|
||||
|
||||
switch (mode)
|
||||
@@ -2580,6 +2748,8 @@ void scriptclass::startgamemode(const enum StartMode mode)
|
||||
default:
|
||||
textbox_colours.clear();
|
||||
add_default_colours();
|
||||
cl.onewaycol_override = false;
|
||||
cl.player_colour = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2651,6 +2821,16 @@ void scriptclass::startgamemode(const enum StartMode mode)
|
||||
graphics.showcutscenebars = true;
|
||||
graphics.setbars(320);
|
||||
load("intro");
|
||||
|
||||
if (!game.nocompetitive())
|
||||
{
|
||||
game.nodeatheligible = true;
|
||||
vlog_debug("NDM trophy is eligible.");
|
||||
}
|
||||
else
|
||||
{
|
||||
game.invalidate_ndm_trophy();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2712,7 +2892,7 @@ void scriptclass::startgamemode(const enum StartMode mode)
|
||||
{
|
||||
game.timetrialcountdown = 0;
|
||||
game.timetrialparlost = true;
|
||||
SDL_memset(map.explored, true, sizeof(map.explored));
|
||||
map.fullmap();
|
||||
}
|
||||
|
||||
graphics.fademode = FADE_START_FADEIN;
|
||||
@@ -2722,9 +2902,9 @@ void scriptclass::startgamemode(const enum StartMode mode)
|
||||
game.startspecial(0);
|
||||
|
||||
/* Unlock the entire map */
|
||||
SDL_memset(obj.collect, true, sizeof(obj.collect[0]) * 20);
|
||||
map.fullmap();
|
||||
/* Give all 20 trinkets */
|
||||
SDL_memset(map.explored, true, sizeof(map.explored));
|
||||
SDL_memset(obj.collect, true, sizeof(obj.collect[0]) * 20);
|
||||
i = 400; /* previously a nested for-loop set this */
|
||||
game.insecretlab = true;
|
||||
map.showteleporters = true;
|
||||
@@ -2818,6 +2998,7 @@ void scriptclass::startgamemode(const enum StartMode mode)
|
||||
map.custommode = true;
|
||||
map.custommodeforreal = false;
|
||||
map.customshowmm = true;
|
||||
map.revealmap = true;
|
||||
|
||||
if (cl.levmusic > 0)
|
||||
{
|
||||
@@ -2844,6 +3025,7 @@ void scriptclass::startgamemode(const enum StartMode mode)
|
||||
cl.findstartpoint();
|
||||
|
||||
map.customshowmm = true;
|
||||
map.revealmap = true;
|
||||
|
||||
music.fadeout();
|
||||
game.customstart();
|
||||
@@ -3088,6 +3270,7 @@ void scriptclass::hardreset(void)
|
||||
|
||||
game.nodeathmode = false;
|
||||
game.nocutscenes = false;
|
||||
game.nodeatheligible = false;
|
||||
|
||||
for (i = 0; i < (int) SDL_arraysize(game.crewstats); i++)
|
||||
{
|
||||
@@ -3112,7 +3295,7 @@ void scriptclass::hardreset(void)
|
||||
game.savey = 0;
|
||||
game.savegc = 0;
|
||||
}
|
||||
game.savecolour = 0;
|
||||
game.savecolour = cl.player_colour;
|
||||
|
||||
game.intimetrial = false;
|
||||
game.timetrialcountdown = 0;
|
||||
@@ -3215,11 +3398,14 @@ void scriptclass::hardreset(void)
|
||||
map.cameraseekframe = 0;
|
||||
map.resumedelay = 0;
|
||||
graphics.towerbg.scrolldir = 0;
|
||||
map.customshowmm=true;
|
||||
map.customshowmm = true;
|
||||
map.revealmap = true;
|
||||
|
||||
SDL_memset(map.roomdeaths, 0, sizeof(map.roomdeaths));
|
||||
SDL_memset(map.roomdeathsfinal, 0, sizeof(map.roomdeathsfinal));
|
||||
map.resetmap();
|
||||
map.currentregion = 0;
|
||||
SDL_zeroa(map.region);
|
||||
//entityclass
|
||||
obj.nearelephant = false;
|
||||
obj.upsetmode = false;
|
||||
@@ -3339,6 +3525,10 @@ bool scriptclass::loadcustom(const std::string& t)
|
||||
}else { tstring="play("+words[1]+")"; }
|
||||
}
|
||||
add(tstring);
|
||||
}else if(words[0] == "sound") {
|
||||
if(customtextmode==1){ add("endtext"); customtextmode=0;}
|
||||
tstring="playef("+words[1]+")";
|
||||
add(tstring);
|
||||
}else if(words[0] == "playremix"){
|
||||
add("play(15)");
|
||||
}else if(words[0] == "flash"){
|
||||
@@ -3456,6 +3646,9 @@ bool scriptclass::loadcustom(const std::string& t)
|
||||
}else if(words[0] == "iftrinketsless"){
|
||||
if(customtextmode==1){ add("endtext"); customtextmode=0;}
|
||||
add("custom"+lines[i]);
|
||||
}else if(words[0] == "ifversion"){
|
||||
if(customtextmode==1){ add("endtext"); customtextmode=0;}
|
||||
add(lines[i]);
|
||||
}else if(words[0] == "textcase"){
|
||||
if(customtextmode==1){ add("endtext"); customtextmode=0;}
|
||||
add(lines[i]);
|
||||
|
||||
@@ -122,6 +122,9 @@ public:
|
||||
int textboxtimer;
|
||||
std::vector<TextboxSprite> textbox_sprites;
|
||||
TextboxImage textbox_image;
|
||||
bool textbox_absolutepos;
|
||||
bool textbox_force_outline;
|
||||
bool textbox_outline;
|
||||
|
||||
//Misc
|
||||
int i, j, k;
|
||||
|
||||
@@ -29,6 +29,8 @@ textboxclass::textboxclass(int gap)
|
||||
|
||||
large = false;
|
||||
|
||||
position_absolute = false;
|
||||
|
||||
should_centerx = false;
|
||||
should_centery = false;
|
||||
|
||||
@@ -41,6 +43,9 @@ textboxclass::textboxclass(int gap)
|
||||
|
||||
image = TEXTIMAGE_NONE;
|
||||
|
||||
force_outline = false;
|
||||
outline = false;
|
||||
|
||||
crewmate_position = TextboxCrewmatePosition();
|
||||
original = TextboxOriginalContext();
|
||||
original.text_case = 1;
|
||||
@@ -78,18 +83,21 @@ void textboxclass::centery(void)
|
||||
void textboxclass::applyposition(void)
|
||||
{
|
||||
resize();
|
||||
reposition();
|
||||
if (should_centerx)
|
||||
if (!position_absolute)
|
||||
{
|
||||
centerx();
|
||||
}
|
||||
if (should_centery)
|
||||
{
|
||||
centery();
|
||||
}
|
||||
if (translate == TEXTTRANSLATE_CUTSCENE)
|
||||
{
|
||||
adjust();
|
||||
reposition();
|
||||
if (should_centerx)
|
||||
{
|
||||
centerx();
|
||||
}
|
||||
if (should_centery)
|
||||
{
|
||||
centery();
|
||||
}
|
||||
if (translate == TEXTTRANSLATE_CUTSCENE)
|
||||
{
|
||||
adjust();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -125,6 +125,8 @@ public:
|
||||
|
||||
bool large;
|
||||
|
||||
bool position_absolute;
|
||||
|
||||
bool should_centerx;
|
||||
bool should_centery;
|
||||
|
||||
@@ -135,6 +137,9 @@ public:
|
||||
std::vector<TextboxSprite> sprites;
|
||||
TextboxImage image;
|
||||
|
||||
bool force_outline;
|
||||
bool outline;
|
||||
|
||||
TextboxCrewmatePosition crewmate_position;
|
||||
TextboxOriginalContext original;
|
||||
TextboxSpacing spacing;
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#if defined(__ANDROID__) || TARGET_OS_IPHONE
|
||||
// forward to SDL logging on Android, since stdout/stderr are /dev/null
|
||||
// they exist on iOS, but just get forwarded to the system log anyway, so might as well provide proper metadata
|
||||
#define VLOG_USE_SDL 1
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,2 +1,6 @@
|
||||
#ifdef SYSTEM_LODEPNG
|
||||
#include <lodepng.h>
|
||||
#else
|
||||
/* Workaround for being unable to rename lodepng.cpp to lodepng.c */
|
||||
#include "../../third_party/lodepng/lodepng.cpp"
|
||||
#endif
|
||||
@@ -604,6 +604,8 @@ int main(int argc, char *argv[])
|
||||
/* We already do the button swapping in ButtonGlyphs, disable SDL's swapping */
|
||||
SDL_SetHintWithPriority(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, "0", SDL_HINT_OVERRIDE);
|
||||
|
||||
SDL_SetHintWithPriority(SDL_HINT_ORIENTATIONS, "LandscapeLeft LandscapeRight", SDL_HINT_OVERRIDE);
|
||||
|
||||
if(!FILESYSTEM_init(argv[0], baseDir, assetsPath, langDir, fontsDir))
|
||||
{
|
||||
vlog_error("Unable to initialize filesystem!");
|
||||
|
||||
Reference in New Issue
Block a user