21 Commits

Author SHA1 Message Date
leo60228
30bdb47f80 Don't overwrite existing CMAKE_EXE_LINKER_FLAGS 2026-01-24 18:57:31 -05:00
Ethan Lee
f22ae5fbf5 CMake: Use rpath, not runpath 2025-07-05 18:07:45 -04:00
Ethan Lee
529ff46eb2 2.4.3 2025-06-19 12:17:27 -04:00
Dav999
c9ad49a050 Fix vertical position of Comms Relay textbox
Fixes #1242.

Turns out it was a really simple fix - the X positions were good, but
the Y positions were always at the top of the screen regardless of the
height of the textbox. Now they're vertically centered respective to
the speaker.
2025-06-15 21:15:27 -04:00
Dav999
f4788a38de Update SheenBidi to 2.9.0
This fixes our problem with Valgrind reporting a jump based on an
uninitialized value; see https://github.com/Tehreer/SheenBidi/issues/19

Just to be sure nothing unexpected happens, I tested that this doesn't
cause any changes in behavior by outputting bidi-transformed versions
of all strings in strings.xml to a file for both our Arabic and Persian
localizations before and after the update, and confirming that the
files are the same.
2025-06-11 15:28:23 -04:00
Ethan Lee
aa9fa04d86 CI: Update from CentOS 7 to Steam Linux Runtime 3.0 2025-06-08 22:51:59 -04:00
Dav999
a3c8d43f93 Apply translations for 2.4 strings
This includes translations that were missing translations, with varying
extent between different languages, for the following things:
- "X mode is enabled" in-game warnings
- "Press {button} to freeze/unfreeze gameplay" for the level debugger
- Some credits strings for the post-2.4.0 extra Spanish options, the
  PT_BR proofread, and Persian
- The recent gamepad menu changes (#1229)

Furthermore:
- "TAB" (used in the level debugger string) is now a separate string
  instead of being hardcoded, because some languages needed it
  translated
- Added missing arrows to Arabic/Persian font (needed for the gamepad
  menu, and also a translator menu actually)
2025-06-08 17:06:04 -04:00
NyakoFox
cd785316b6 Fix mouse coordinates being wrong on HiDPI displays
When writing the initial stretch mode code, the existence of HiDPI
displays completely slipped my mind -- or at least I didn't realize
that they'd be a problem.

We implement scaling modes ourselves, so transforming the mouse
coordinates to our 320x240 viewport is done manually. Unfortunately,
that code did not take into account HiDPI scaling whatsoever, meaning
that all of the math which assumes the window size and the renderer
size is wrong.

To fix this, we use `SDL_GetWindowSizeInPixels` and `SDL_GetWindow` to
find the scaling factor, and then apply that to the mouse coordinates
to get the mouse coordinates in the pixel-space instead, and then we do
all of our normal logic after.

Due to our usage of `SDL_GetWindowSizeInPixels`, this bumps the minimum
SDL version to 2.26.0.

Closes #1235.
2025-05-03 15:15:38 -04:00
Dav999
53bb45e01d Sync new gamepad strings into all language files
Also including all the localizations I already have right now.
2025-05-03 14:09:30 -04:00
Dav999
3320ee5962 Add check for converting negative SDL_GameControllerButton to glyph
A SDL_GameControllerButton below 0 is out of array bounds, so that
should trip the assert and return GLYPH_UNKNOWN just like when the
value is too high.
2025-05-03 14:09:30 -04:00
Dav999
f715897fdd Add confirmation and removal to bindings menu
This makes the following improvements to the gamepad bindings menu:

- The menu now shows a hint that you can press a button while any of
  the bind options are selected (or that you can navigate away from
  those options)
- Instead of button presses immediately setting a binding, they now
  ask for confirmation: press the same button a second time to confirm
- You can now remove a binding, the same way you add it (this has the
  same type of confirmation)
- This menu used to be inconsistent with pretty much every other menu
  in the game by showing a permanent title and description for the menu
  itself ("Game Pad", "Change controller options.") rather than showing
  a title and description for the currently selected option.
  This inconsistency is now fixed.
2025-05-03 14:09:30 -04:00
Dav999
1fc02463e8 Update name of Arabic/Persian font
The level font menu now shows both names, since the font is used for
both Arabic and Persian.
2025-05-02 22:32:29 -04:00
Dav999
6ed20aad06 Add new strings for Persian
New strings were delivered already today, so let's add them immediately
in this PR so we have a little less on our checklist later!
2025-05-02 22:32:29 -04:00
Dav999
3930f89247 Fix save summary sometimes getting misordered in Arabic
The Persian localizers noticed an issue where the translation for
"Dimension VVVVVV, 12:34:56" would become "VVVVVV, 12:34:56 noisnemiD",
rather than "12:34:56 ,VVVVVV noisnemiD" as expected. This was fixed
for Persian but the same issue also affected Arabic, so I added a
RIGHT-TO-LEFT MARK (U+200F) to fix it there as well.
2025-05-02 22:32:29 -04:00
Dav999
5dd2270139 Sync language files
This adds "Persian" to all the languages, and brings the Persian files
up-to-date (mainly removing outdated strings and adding some late 2.4
stuff that we'll contact all translators for soon)
2025-05-02 22:32:29 -04:00
Dav999
b921ffbedc Add Persian to credits screen 2025-05-02 22:32:29 -04:00
Dav999
ed2e5bf73e Add files for Persian localization
A bit overdue since this was delivered a few weeks ago (oops),
but here it is!

Thanks to Amir Arzani and Masoud Varaste.
2025-05-02 22:32:28 -04:00
Dav999
4deba1a3a8 Change name of Silesian option (part 2)
Turns out there was a little miscommunication with the translator -
they said the option needed to say "Ślōnsko" but were only talking
about correcting the first word, where I thought the whole thing needed
to be replaced.
2025-02-18 10:38:04 -05:00
Dav999
3b78251e47 Change name of Silesian option by request of translator
Our Silesian translator asked for "Ślonsko godka" to be changed to
"Ślōnsko".
2025-02-05 11:05:18 -05:00
Dav999
e72d59de56 Fix squeak and save spam in gamepad menu
If you push a button to set a controller binding, you may either hear
one Viridian squeak, two Viridian squeaks (a louder one), or Viridian
doesn't stop squeaking until you let go of the button. While you hear
the continuous squeaking, your save file is also repeatedly saved.

There are two small bugs at play here:
- the squeak is actually played in two different places at the same
  time (both in titleinput() whenever a button is pressed, and in
  updatebuttonmappings() when a mapping is succesfully changed)
- titleinput() doesn't register that a button is held down and applies
  the button (and saves to file) every frame for as long as the button
  is held

This commit fixes both these issues. Now a single button press always
causes one squeak, and only if the bindings actually changed. Your save
file is also no longer saved repeatedly from holding down the button.
2024-12-22 15:53:27 -05:00
NyakoFox
25dd9d56ad Make 0-length gravity lines invisible again 2024-11-17 11:46:55 -05:00
69 changed files with 783 additions and 1952 deletions

View File

@@ -65,7 +65,7 @@ jobs:
- uses: actions/checkout@v4
with:
repository: libsdl-org/SDL
ref: release-2.30.8
ref: release-2.28.5
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.30.8/SDL2-2.30.8.aar -DpomFile=build-android-prefab/prefab-2.30.8/SDL2-2.30.8.pom
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
- name: Build
run: |

View File

@@ -20,14 +20,6 @@ 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
@@ -40,31 +32,19 @@ 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@v4
- uses: actions/checkout@v1
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 -p ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
cmake -G Ninja ..
mkdir ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
cmake -GNinja ..
- name: Build (default version)
run: ninja -C ${SRC_DIR_PATH}/build
@@ -90,30 +70,31 @@ jobs:
container: registry.gitlab.steamos.cloud/steamrt/sniper/sdk:latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v1
with:
submodules: true
- name: CMake configure (default version)
run: |
mkdir -p ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
cmake -G Ninja ..
mkdir ${SRC_DIR_PATH}/build && cd ${SRC_DIR_PATH}/build
cmake ..
- name: Build (default version)
run: ninja -C ${SRC_DIR_PATH}/build
run: make -j $(nproc) -C ${SRC_DIR_PATH}/build
- name: CMake configure (official)
run: |
cd ${SRC_DIR_PATH}/build
cmake -G Ninja -DOFFICIAL_BUILD=ON ..
cmake -DOFFICIAL_BUILD=ON ..
- name: Build (official)
run: ninja -C ${SRC_DIR_PATH}/build
run: |
make -j $(nproc) -C ${SRC_DIR_PATH}/build
- name: CMake configure (M&P)
run: |
cd ${SRC_DIR_PATH}/build
cmake -G Ninja -DOFFICIAL_BUILD=OFF -DMAKEANDPLAY=ON ..
cmake -DOFFICIAL_BUILD=OFF -DMAKEANDPLAY=ON ..
- name: Build (M&P)
run: ninja -C ${SRC_DIR_PATH}/build
run: make -j $(nproc) -C ${SRC_DIR_PATH}/build
build-win:
name: Build (windows-latest)
@@ -124,7 +105,7 @@ jobs:
SDL_VERSION: 2.26.0
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v1
with:
submodules: true
@@ -143,7 +124,19 @@ 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: CMake initial configure/generate
- 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
run: |
mkdir $env:SRC_DIR_PATH/build
cd $env:SRC_DIR_PATH/build

View File

@@ -21,6 +21,5 @@ 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/) |

View File

@@ -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 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.
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.
Discussion about VVVVVV updates mainly happens on the "unofficial" [VVVVVV discord](https://discord.gg/Zf7Nzea), in the `vvvvvv-code` channel.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

View File

@@ -1,14 +0,0 @@
{
"images" : [
{
"filename" : "AppIcon.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,6 +0,0 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -25,7 +25,7 @@ option(REMOVE_ABSOLUTE_PATHS "If supported by the compiler, replace all absolute
# Architecture Flags
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
if(APPLE)
# 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,8 +38,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
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)
@@ -50,10 +48,7 @@ endif()
# RPATH
if(NOT WIN32)
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
set(BIN_LIBROOT "Frameworks")
set(BIN_RPATH "@executable_path/Frameworks")
elseif(APPLE)
if(APPLE)
set(BIN_LIBROOT "osx")
set(BIN_RPATH "@executable_path/osx")
elseif(CMAKE_SIZEOF_VOID_P MATCHES "8")
@@ -134,9 +129,6 @@ 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})
@@ -145,30 +137,6 @@ 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()
@@ -240,7 +208,6 @@ 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)
@@ -314,15 +281,17 @@ 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 "/EHsc /GR-")
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS /GR-)
if(MSVC_VERSION GREATER 1900)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
@@ -333,15 +302,29 @@ 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 "-std=c++98 -fno-exceptions -fno-rtti")
set_source_files_properties(${VVV_CXX_SRC} PROPERTIES COMPILE_FLAGS -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})
@@ -354,14 +337,12 @@ target_include_directories(sheenbidi-static PRIVATE
)
if(BUNDLE_DEPENDENCIES)
list(APPEND STATIC_LIBRARIES lodepng-static physfs-static tinyxml2-static c-hashmap-static faudio-static sheenbidi-static)
list(APPEND STATIC_LIBRARIES physfs-static tinyxml2-static lodepng-static c-hashmap-static faudio-static sheenbidi-static)
else()
list(APPEND STATIC_LIBRARIES c-hashmap-static sheenbidi-static)
list(APPEND STATIC_LIBRARIES lodepng-static 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
@@ -377,11 +358,7 @@ if(BUNDLE_DEPENDENCIES)
target_link_libraries(VVVVVV ${STATIC_LIBRARIES})
else()
target_compile_definitions(VVVVVV PRIVATE
${PNG_DEF}
-DSYSTEM_LODEPNG
)
target_link_libraries(VVVVVV ${STATIC_LIBRARIES} physfs tinyxml2 FAudio lodepng)
target_link_libraries(VVVVVV ${STATIC_LIBRARIES} physfs tinyxml2 FAudio)
endif()
@@ -451,15 +428,6 @@ 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)

View File

@@ -1,8 +0,0 @@
<?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>

View File

@@ -10,18 +10,18 @@ How to Build
------------
The recommended way is to install Android Studio and Maven. These instructions are for
SDL 2.30.8; adapt your SDL version accordingly.
SDL 2.28.5; 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.30.8 Maven package. As of writing, SDL currently does not publish
2. Obtain the SDL 2.28.5 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.30.8 source code.
1. Download the SDL 2.28.5 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.30.8/SDL2-2.30.8.aar
-DpomFile=build-android-prefab/prefab-2.30.8/SDL2-2.30.8.pom` to install it to
-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
Maven Local.
3. Open the `desktop_version/VVVVVV-android/` folder in Android Studio.

View File

@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion 29
targetSdkVersion 34
versionCode 20005000
versionName "2.5"
versionCode 20004000
versionName "2.4"
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.30.8'
implementation 'org.libsdl.android:SDL2:2.28.5'
}

View File

@@ -246,11 +246,6 @@
<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="دخول إعدادات متقدمة قد تحظى باهتمام
@@ -645,7 +640,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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 dinterès per als speedrunners." explanation="description for speedrunner options" max="38*5"/>
@@ -637,7 +632,6 @@
<string english="Tileset Colour Changed" translation="Sha 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="Sha canviat el tipus denemic" 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="Shan 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="Sha obert el mapa: {filename}.vvvvvv" explanation="successfully loaded level file" max="38*3"/>

View File

@@ -242,11 +242,6 @@
<string english="Lets you see through what is behind the name at the bottom of the screen." translation="Yn gadael i chi weld trwy&apos;r hyn sydd y tu ôl i&apos;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&apos;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"/>
@@ -637,7 +632,6 @@
<string english="Tileset Colour Changed" translation="Lliw Set Teil wedi&apos;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&apos;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&apos;i lwytho: {filename}.vvvvv" explanation="successfully loaded level file" max="38*3"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -466,7 +461,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="REKORDO DE SUPERGRAVITRONO" explanation="" max="38*4"/>
<string english="SUPER GRAVITRON HIGHSCORE" translation="ALTPOENTARO 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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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&apos;é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&apos;intéresser|les speedrunners." explanation="description for speedrunner options" max="38*5"/>
@@ -637,7 +632,6 @@
<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&apos;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"/>

View File

@@ -243,11 +243,6 @@ 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 &apos;sábháil seicphointí&apos;" 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"/>
@@ -639,7 +634,6 @@ 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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -256,11 +256,6 @@ 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"/>
@@ -673,7 +668,6 @@ 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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -662,7 +657,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -242,11 +242,6 @@
<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"/>
@@ -637,7 +632,6 @@
<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"/>

View File

@@ -248,11 +248,6 @@
<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"/>
@@ -647,7 +642,6 @@
<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"/>

View File

@@ -248,11 +248,6 @@
<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"/>
@@ -647,7 +642,6 @@
<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"/>

View File

@@ -178,7 +178,7 @@ bool BUTTONGLYPHS_keyboard_is_available(void)
return true;
}
#if defined(__ANDROID__) || TARGET_OS_IPHONE
#ifdef __ANDROID__
return false;
#else
return !SDL_GetHintBoolean("SteamDeck", SDL_FALSE);

View File

@@ -57,7 +57,6 @@ RoomProperty::RoomProperty(void)
enemyx2=320;
enemyy2=240;
enemytype=0;
enemyv=0;
directmode=0;
}
@@ -390,7 +389,6 @@ 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;
}
}
@@ -404,8 +402,6 @@ 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 )
@@ -1268,7 +1264,6 @@ 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);
@@ -1416,12 +1411,6 @@ next:
map.specialroomnames.push_back(name);
}
}
if (SDL_strcmp(pKey, "PlayerColour") == 0)
{
player_colour = help.Int(pText);
game.savecolour = player_colour;
}
}
if (mapwidth < maxwidth)
@@ -1656,7 +1645,6 @@ 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);
@@ -1685,27 +1673,40 @@ 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)
{
const MapRenderData data = map.get_render_data();
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);
// Start drawing the minimap
@@ -1714,9 +1715,9 @@ void customlevelclass::generatecustomminimap(void)
graphics.clear();
// Scan over the map size
for (int j2 = data.starty; j2 < data.starty + data.height; j2++)
for (int j2 = 0; j2 < mapheight; j2++)
{
for (int i2 = data.startx; i2 < data.startx + data.width; i2++)
for (int i2 = 0; i2 < mapwidth; i2++)
{
std::vector<SDL_Point> dark_points;
std::vector<SDL_Point> light_points;
@@ -1724,12 +1725,12 @@ void customlevelclass::generatecustomminimap(void)
bool dark = getroomprop(i2, j2)->tileset == 1;
// Ok, now scan over each square
for (int j = 0; j < 9 * data.zoom; j++)
for (int j = 0; j < 9 * map.customzoom; j++)
{
for (int i = 0; i < 12 * data.zoom; i++)
for (int i = 0; i < 12 * map.customzoom; i++)
{
int tile;
switch (data.zoom)
switch (map.customzoom)
{
case 4:
tile = absfree(
@@ -1754,7 +1755,7 @@ void customlevelclass::generatecustomminimap(void)
if (tile >= 1)
{
// Add this pixel
SDL_Point point = { ((i2 - data.startx) * 12 * data.zoom) + i, ((j2 - data.starty) * 9 * data.zoom) + j };
SDL_Point point = { (i2 * 12 * map.customzoom) + i, (j2 * 9 * map.customzoom) + j };
if (dark)
{
dark_points.push_back(point);

View File

@@ -31,7 +31,6 @@ public:
FOREACH_PROP(enemyx2, int) \
FOREACH_PROP(enemyy2, int) \
FOREACH_PROP(enemytype, int) \
FOREACH_PROP(enemyv, int) \
FOREACH_PROP(directmode, int)
class RoomProperty
@@ -170,8 +169,6 @@ 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);

View File

@@ -1048,11 +1048,11 @@ static void draw_entities(void)
if (entity->p1 == 0) // Facing right
{
graphics.draw_sprite(x - 4, y, 0, graphics.getcol(cl.player_colour));
graphics.draw_sprite(x - 4, y, 0, graphics.col_crewcyan);
}
else // Non-zero is facing left
{
graphics.draw_sprite(x - 4, y, 3, graphics.getcol(cl.player_colour));
graphics.draw_sprite(x - 4, y, 3, graphics.col_crewcyan);
}
graphics.draw_rect(x, y, 16, 24, graphics.getRGB(255, 255, 164));
@@ -1959,8 +1959,6 @@ 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);
@@ -3098,22 +3096,12 @@ 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 (ctrl)
if (key.keymap[SDLK_LCTRL] || key.keymap[SDLK_RCTRL])
{
if (shift)
{
cl.roomproperties[room].enemyv = enemy_speed - 1;
}
else
{
cl.roomproperties[room].platv = plat_speed - 1;
}
cl.roomproperties[room].platv = plat_speed - 1;
}
else
{
@@ -3123,16 +3111,9 @@ static void handle_draw_input()
}
else if (key.keymap[SDLK_PERIOD])
{
if (ctrl)
if (key.keymap[SDLK_LCTRL] || key.keymap[SDLK_RCTRL])
{
if (shift)
{
cl.roomproperties[room].enemyv = enemy_speed + 1;
}
else
{
cl.roomproperties[room].platv = plat_speed + 1;
}
cl.roomproperties[room].platv = plat_speed + 1;
}
else
{
@@ -3153,18 +3134,6 @@ 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;

View File

@@ -11,14 +11,14 @@ entclass::entclass(void)
void entclass::clear(void)
{
invis = false;
type = EntityType_PLAYER;
type = 0;
size = 0;
tile = 0;
rule = 0;
state = 0;
statedelay = 0;
life = 0;
colour = EntityColour_CREW_CYAN;
colour = 0;
para = 0;
behave = 0;
animate = 0;
@@ -108,7 +108,7 @@ void entclass::setenemy( int t )
case 0:
tile = 60;
animate = 2;
colour = EntityColour_ENEMY_RED;
colour = 6;
behave = 10;
w = 32;
h = 32;
@@ -119,7 +119,7 @@ void entclass::setenemy( int t )
lerpoldyp += 10;
tile = 63;
animate = 100; //LIES
colour = EntityColour_ENEMY_RED;
colour = 6;
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 = EntityColour_ENEMY_RED;
colour = 6;
behave = -1;
w = 32;
h = 32;
@@ -147,7 +147,7 @@ void entclass::setenemy( int t )
tile = 72;
animate = 3;
size = 9;
colour = EntityColour_ENEMY_RED;
colour = 6;
behave = 12;
w = 64;
h = 40;
@@ -161,7 +161,7 @@ void entclass::setenemy( int t )
lerpoldyp -= 4;
tile = 76;
animate = 100; // Clouds
colour = EntityColour_ENEMY_RED;
colour = 6;
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 = EntityColour_ENEMY_RED;
colour = 6;
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 = EntityColour_ENEMY_PINK;
colour = 8;
animate = 1;
break;
case rn(13, 3): //Wavelengths
tile = 32;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 32;
break;
case rn(15, 3): //Traffic
tile = 28;
colour = EntityColour_ENEMY_RED;
colour = 6;
animate = 1;
w = 22;
h = 32;
break;
case rn(12, 5): //The Yes Men
tile = 40;
colour = EntityColour_ENEMY_YELLOW;
colour = 9;
animate = 1;
w = 20;
h = 20;
break;
case rn(13, 6): //Hunchbacked Guards
tile = 44;
colour = EntityColour_ENEMY_PINK;
colour = 8;
animate = 1;
w = 16;
h = 20;
@@ -231,7 +231,7 @@ void entclass::setenemyroom( int rx, int ry )
{
//transmittor
tile = 104;
colour = EntityColour_INACTIVE_ENTITY;
colour = 4;
animate = 7;
w = 16;
h = 16;
@@ -244,7 +244,7 @@ void entclass::setenemyroom( int rx, int ry )
{
//radar dish
tile =124;
colour = EntityColour_INACTIVE_ENTITY;
colour = 4;
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 = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 16;
h = 16;
break;
case rn(2, 0):
tile = 88;
colour = EntityColour_ENEMY_CYAN;
colour = 11;
animate = 1;
w = 16;
h = 16;
break;
//Space Station 2
case rn(14, 11):
colour = EntityColour_ENEMY_ORANGE;
colour = 17;
break; //Lies
case rn(16, 11):
colour = EntityColour_ENEMY_PINK;
colour = 8;
break; //Lies
case rn(13, 10):
colour = EntityColour_ENEMY_CYAN;
colour = 11;
break; //Factory
case rn(13, 9):
colour = EntityColour_ENEMY_YELLOW;
colour = 9;
break; //Factory
case rn(13, 8):
colour = EntityColour_ENEMY_PINK;
colour = 8;
break; //Factory
case rn(11, 13): //Truth
tile = 64;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
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 = EntityColour_ENEMY_PINK;
colour = 8;
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 = EntityColour_ENEMY_RED;
colour = 6;
animate = 1;
w = 16;
h = 16;
break;
case rn(14, 13): // (chose poorly)
tile = 56;
colour = EntityColour_ENEMY_RED;
colour = 6;
animate = 1;
w = 15;
h = 24;
break;
case rn(13, 12): // (backsliders)
tile = 164;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 16;
h = 16;
break;
case rn(14, 8): // (wheel of fortune room)
tile = 116;
colour = EntityColour_ENEMY_BLUE;
colour = 12;
animate = 1;
w = 32;
h = 32;
break;
case rn(16, 9): // (seeing dollar signs)
tile = 68;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 16;
h = 16;
break;
case rn(16, 7): // (tomb of mad carew)
tile = 106;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
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 = EntityColour_ENEMY_RED;
colour = 6;
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 = EntityColour_ENEMY_GREEN;
colour = 7;
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 = EntityColour_ENEMY_CYAN;
colour = 11;
animate = 100;
w = 30;
h = 14;
break;
case rn(19, 1): // Ascending and Descending
tile = 48;
colour = EntityColour_ENEMY_YELLOW;
colour = 9;
animate = 5;
w = 16;
h = 16;
break;
case rn(19, 2): // Shockwave Rider
tile = 176;
colour = EntityColour_ENEMY_RED;
colour = 6;
animate = 1;
w = 16;
h = 16;
break;
case rn(18, 3): // Mind the gap
tile = 168;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 16;
h = 16;
@@ -397,7 +397,7 @@ void entclass::setenemyroom( int rx, int ry )
if (yp ==96)
{
tile = 160;
colour = EntityColour_ENEMY_PINK;
colour = 8;
animate = 1;
w = 16;
h = 16;
@@ -405,7 +405,7 @@ void entclass::setenemyroom( int rx, int ry )
else
{
tile = 156;
colour = EntityColour_ENEMY_PINK;
colour = 8;
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 = EntityColour_ENEMY_PINK;
colour = 8;
animate = 5;
w = 16;
h = 16;
break;
case rn(14, 2): // That's why I have to kill you
tile = 114;
colour = EntityColour_ENEMY_RED;
colour = 6;
animate = 5;
w = 16;
h = 16;
@@ -430,7 +430,7 @@ void entclass::setenemyroom( int rx, int ry )
if (xp ==88)
{
tile = 54+12;
colour = EntityColour_ENEMY_BLUE;
colour = 12;
animate = 100;
w = 60;
h = 16;
@@ -439,7 +439,7 @@ void entclass::setenemyroom( int rx, int ry )
else
{
tile = 54;
colour = EntityColour_ENEMY_BLUE;
colour = 12;
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 = EntityColour_ENEMY_YELLOW;
colour = 9;
animate = 1;
w = 20;
h = 20;
break;
case rn(48-100, 51-100): //Wavelengths
tile = 32;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 32;
break;
case rn(43-100,52-100): // Ascending and Descending
tile = 48;
colour = EntityColour_ENEMY_YELLOW;
colour = 9;
animate = 5;
w = 16;
h = 16;
break;
case rn(46-100,51-100): //kids his age
tile = 88;
colour = EntityColour_ENEMY_CYAN;
colour = 11;
animate = 1;
w = 16;
h = 16;
break;
case rn(43-100,51-100): // Mind the gap
tile = 168;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 16;
h = 16;
break;
case rn(44-100,51-100): // vertigo?
tile = 172;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 100;
w = 32;
h = 32;
break;
case rn(44-100,52-100): // (backsliders)
tile = 164;
colour = EntityColour_ENEMY_GREEN;
colour = 7;
animate = 1;
w = 16;
h = 16;
break;
case rn(43-100, 56-100): //Intermission 1
tile = 88;
colour = EntityColour_ENEMY_GRAVITRON;
colour = 21;
animate = 1;
w = 16;
h = 16;
break;
case rn(45-100, 56-100): //Intermission 1
tile = 88;
colour = EntityColour_ENEMY_GRAVITRON;
colour = 21;
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 = EntityColour_TELEPORTER_FLASHING;
colour = 102;
animate = 0;
w = 464;
h = 320;
@@ -613,24 +613,17 @@ 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 5: // Horizontal gravity line
case 6: // Vertical gravity line
if (life == 0)
{
realcol = graphics.getcol(colour);
}
else
{
realcol = graphics.getcol(24);
}
case 3: // Big chunky pixels!
realcol = graphics.bigchunkygetcol(colour);
break;
case 4: // Small pickups
realcol = graphics.huetilegetcol();
break;
case 11: // The fucking elephant
if (game.noflashingmode)
@@ -657,8 +650,8 @@ void entclass::updatecolour(void)
bool entclass::ishumanoid(void)
{
return type == EntityType_PLAYER
|| type == EntityType_CREWMATE
|| type == EntityType_SUPERCREWMATE
|| type == EntityType_COLLECTABLE_CREWMATE;
return type == 0
|| type == 12
|| type == 14
|| type == 55;
}

View File

@@ -5,34 +5,6 @@
#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:
@@ -54,13 +26,11 @@ public:
public:
//Fundamentals
bool invis;
EntityType type;
int size, tile, rule;
int type, size, tile, rule;
int state, statedelay;
int behave, animate;
float para;
int life;
int colour; // As out-of-bounds colours are allowed, this should be an int instead of an EnemyColour.
int life, colour;
//Position and velocity
int oldxp, oldyp;

File diff suppressed because it is too large Load Diff

View File

@@ -5,10 +5,10 @@
#include <string>
#include <vector>
#include "BlockV.h"
#include "Ent.h"
#include "Game.h"
#include "Maths.h"
#include "Ent.h"
#include "BlockV.h"
#include "Game.h"
enum
{
@@ -20,6 +20,18 @@ enum
ACTIVITY = 5
};
enum
{
CYAN = 0,
PURPLE = 20,
YELLOW = 14,
RED = 15,
GREEN = 13,
BLUE = 16,
GRAY = 19,
TELEPORTER = 102
};
class entityclass
{
public:
@@ -44,7 +56,7 @@ public:
createblock(DAMAGE, 312, -8, 16, 260);
}
int swncolour(int t);
int swncolour(int t );
void swnenemiescol(int t);
@@ -94,7 +106,7 @@ public:
int getlineat(int t);
int getcrewman(int t);
int getcrewman(int t, int fallback = 0);
int getcustomcrewman(int t);
int getteleporter(void);

View File

@@ -333,35 +333,15 @@ 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;
}
@@ -1351,19 +1331,6 @@ 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)

View File

@@ -146,7 +146,7 @@ void Game::init(void)
prevroomy = 0;
saverx = 0;
savery = 0;
savecolour = EntityColour_CREW_CYAN;
savecolour = 0;
mutebutton = 0;
muted = false;
@@ -225,7 +225,6 @@ void Game::init(void)
ndmresulthardestroom_x = hardestroom_x;
ndmresulthardestroom_y = hardestroom_y;
ndmresulthardestroom_specialname = false;
nodeatheligible = false;
customcol=0;
@@ -381,12 +380,6 @@ 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();
}
@@ -832,7 +825,7 @@ static void savetele_textbox_success(textboxclass* THIS)
THIS->pad(3, 3);
}
static void save_textbox_fail(textboxclass* THIS)
static void savetele_textbox_fail(textboxclass* THIS)
{
THIS->lines.clear();
THIS->lines.push_back(loc::gettext("ERROR: Could not save game!"));
@@ -840,31 +833,6 @@ static void save_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)
@@ -882,7 +850,11 @@ void Game::savetele_textbox(void)
}
else
{
show_save_fail();
graphics.createtextboxflipme("", -1, 12, TEXT_COLOUR("red"));
graphics.textboxprintflags(PR_FONT_INTERFACE);
graphics.textboxcenterx();
graphics.textboxtimer(50);
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, savetele_textbox_fail);
}
graphics.textboxapplyposition();
}
@@ -2567,7 +2539,7 @@ void Game::updatestate(void)
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
int j = obj.getteleporter();
@@ -2588,7 +2560,7 @@ void Game::updatestate(void)
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].tile = 1;
obj.entities[i].colour = EntityColour_TELEPORTER_ACTIVE;
obj.entities[i].colour = 101;
}
break;
}
@@ -2761,7 +2733,7 @@ void Game::updatestate(void)
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = true;
}
@@ -2775,7 +2747,7 @@ void Game::updatestate(void)
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].tile = 1;
obj.entities[i].colour = EntityColour_TELEPORTER_INACTIVE;
obj.entities[i].colour = 100;
}
break;
}
@@ -3344,14 +3316,11 @@ void Game::updatestate(void)
}
}
if (nodeathmode || nodeatheligible)
{
unlockAchievement("vvvvvvmaster"); //bloody hell
unlocknum(UnlockTrophy_NODEATHMODE_COMPLETE);
}
if (nodeathmode)
{
unlockAchievement("vvvvvvmaster"); //bloody hell
unlocknum(UnlockTrophy_NODEATHMODE_COMPLETE);
setstate(3520);
setstatedelay(0);
}
@@ -3369,7 +3338,7 @@ void Game::updatestate(void)
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[i].colour = 102;
}
incstate();
@@ -3411,7 +3380,7 @@ void Game::updatestate(void)
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = true;
}
@@ -3496,7 +3465,7 @@ void Game::updatestate(void)
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = true;
}
@@ -3504,7 +3473,7 @@ void Game::updatestate(void)
if(INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].tile = 1;
obj.entities[i].colour = EntityColour_TELEPORTER_INACTIVE;
obj.entities[i].colour = 100;
}
break;
}
@@ -3548,9 +3517,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 1;
@@ -3679,9 +3648,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 1;
@@ -3792,9 +3761,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 0;
@@ -3905,9 +3874,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 1;
@@ -4023,9 +3992,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 1;
@@ -4141,9 +4110,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 0;
@@ -4257,7 +4226,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].invis = false;
obj.entities[i].dir = 1;
@@ -4370,9 +4339,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 1;
@@ -4483,9 +4452,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 = EntityColour_TELEPORTER_ACTIVE;
obj.entities[j].colour = 101;
}
obj.entities[i].colour = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].invis = false;
obj.entities[i].dir = 1;
@@ -4971,10 +4940,6 @@ 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();
@@ -5233,8 +5198,6 @@ 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;
@@ -5367,7 +5330,7 @@ void Game::deathsequence(void)
}
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_DEAD;
obj.entities[i].colour = 1;
obj.entities[i].invis = false;
}
@@ -5934,10 +5897,6 @@ 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);
@@ -5952,48 +5911,6 @@ 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);
}
}
}
}
@@ -6378,41 +6295,6 @@ 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
@@ -6454,8 +6336,6 @@ 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);
@@ -6976,7 +6856,6 @@ 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;
@@ -7893,11 +7772,6 @@ void Game::returntoingame(void)
}
}
DEFER_CALLBACK(nextbgcolor);
if (nocompetitive())
{
invalidate_ndm_trophy();
}
}
void Game::unlockAchievement(const char* name)
@@ -7950,22 +7824,8 @@ void Game::copyndmresults(void)
SDL_memcpy(ndmresultcrewstats, crewstats, sizeof(ndmresultcrewstats));
}
void Game::invalidate_ndm_trophy(void)
static inline int get_framerate(const int slowdown)
{
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:
@@ -7994,7 +7854,7 @@ int Game::get_timestep(void)
switch (gamestate)
{
case GAMEMODE:
return get_framerate(slowdown, deathseq);
return get_framerate(slowdown);
default:
return 34;
}

View File

@@ -225,8 +225,6 @@ 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);
@@ -365,7 +363,6 @@ public:
int savetrinkets;
bool startscript;
std::string newscript;
bool checkpoint_saving;
bool menustart;
@@ -439,8 +436,6 @@ public:
int ndmresulthardestroom_y;
bool ndmresulthardestroom_specialname;
void copyndmresults(void);
bool nodeatheligible;
void invalidate_ndm_trophy(void);
//Time Trials
bool intimetrial, timetrialparlost;

View File

@@ -425,23 +425,22 @@ 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 = 0;
sprite_x = 7;
}
else
{
face_x = (SCREEN_WIDTH_PIXELS + total_width) / 2;
text_x = face_x - width_for_face;
face_x -= 10; // sprite origin
sprite_x = 96;
sprite_x = 103;
print_flags |= PR_RIGHT;
}
set_texture_color_mod(grphx.im_sprites, r, g, b);
draw_texture_part(grphx.im_sprites, face_x + offset_x, y - 3, sprite_x, 0, 24, 12, 1, 1);
draw_texture_part(grphx.im_sprites, face_x, y - 1, sprite_x, 2, 10, 10, 1, 1);
set_texture_color_mod(grphx.im_sprites, 255, 255, 255);
font::print(print_flags, text_x, y, creator, r, g, b);
}
@@ -930,20 +929,13 @@ void Graphics::drawgui(void)
size_t j;
for (j = 0; j < textboxes[i].lines.size(); j++)
{
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);
}
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
);
}
for (j = 0; j < textboxes[i].lines.size(); j++)
{
@@ -1279,15 +1271,6 @@ 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);
@@ -1491,18 +1474,6 @@ 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))
@@ -1870,7 +1841,53 @@ void Graphics::drawgravityline(const int t, const int x, const int y, const int
return;
}
set_color(obj.entities[t].realcol);
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);
}
draw_line(x, y, x + w, y + h);
}
@@ -3039,49 +3056,8 @@ 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));
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
// Trophies
// cyan
case 30:
return RGBf(160, 200, 220);
// Purple
@@ -3198,17 +3174,30 @@ void Graphics::menuoffrender(void)
}
}
void Graphics::textboxabsolutepos(int x, int y)
SDL_Color Graphics::huetilegetcol()
{
if (!INBOUNDS_VEC(m, textboxes))
if (game.noflashingmode)
{
vlog_error("textboxabsolutepos() out-of-bounds!");
return;
return getRGB(234, 234, 10);
}
textboxes[m].position_absolute = true;
textboxes[m].xp = x;
textboxes[m].yp = y;
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;
}
void Graphics::textboxcenterx(void)
@@ -3424,19 +3413,19 @@ int Graphics::crewcolour(const int t)
switch (t)
{
case 0:
return EntityColour_CREW_CYAN;
return CYAN;
case 1:
return EntityColour_CREW_PURPLE;
return PURPLE;
case 2:
return EntityColour_CREW_YELLOW;
return YELLOW;
case 3:
return EntityColour_CREW_RED;
return RED;
case 4:
return EntityColour_CREW_GREEN;
return GREEN;
case 5:
return EntityColour_CREW_BLUE;
return BLUE;
default:
return EntityColour_CREW_CYAN;
return 0;
}
}
@@ -3537,15 +3526,12 @@ 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)

View File

@@ -40,54 +40,6 @@ 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:
@@ -99,6 +51,9 @@ 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);
@@ -139,8 +94,6 @@ public:
int r, int g, int b
);
void textboxabsolutepos(int x, int y);
void textboxcenterx(void);
int textboxwidth(void);
@@ -182,8 +135,6 @@ public:
void setimage(TextboxImage image);
void textboxoutline(bool enabled);
void textboxindex(int index);
void textboxremove(void);
@@ -221,8 +172,6 @@ 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);
@@ -388,8 +337,6 @@ public:
SDL_Texture* images[NUM_IMAGES];
SDL_Texture* customminimaps[401];
bool flipmode;
bool setflipmode;
bool notextoutline;

View File

@@ -442,33 +442,6 @@ 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);
}
@@ -503,11 +476,6 @@ 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);

View File

@@ -189,15 +189,8 @@ 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!");
@@ -221,9 +214,7 @@ 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)
{
disabled_filter = true;
VVV_freefunc(SDL_FreeSurface, *src);
VVV_freefunc(SDL_FreeSurface, *dest);
SDL_FreeSurface(*src);
WHINE_ONCE_ARGS(("Could not read pixels from renderer: %s", SDL_GetError()));
return;
}

View File

@@ -898,12 +898,6 @@ 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);
@@ -2778,14 +2772,14 @@ void gameinput(void)
int player = obj.getplayer();
if (INBOUNDS_VEC(player, obj.entities))
{
obj.entities[player].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[player].colour = 102;
}
int teleporter = obj.getteleporter();
if (INBOUNDS_VEC(teleporter, obj.entities))
{
obj.entities[teleporter].tile = 6;
obj.entities[teleporter].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[teleporter].colour = 102;
}
//which teleporter script do we use? it depends on the companion!
game.setstate(4000);
@@ -2809,16 +2803,16 @@ void gameinput(void)
int player = obj.getplayer();
if (INBOUNDS_VEC(player, obj.entities))
{
obj.entities[player].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[player].colour = 102;
}
int companion = obj.getcompanion();
if(INBOUNDS_VEC(companion, obj.entities)) obj.entities[companion].colour = EntityColour_TELEPORTER_FLASHING;
if(INBOUNDS_VEC(companion, obj.entities)) obj.entities[companion].colour = 102;
int teleporter = obj.getteleporter();
if (INBOUNDS_VEC(teleporter, obj.entities))
{
obj.entities[teleporter].tile = 6;
obj.entities[teleporter].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[teleporter].colour = 102;
}
//which teleporter script do we use? it depends on the companion!
game.setstate(3000);
@@ -3282,7 +3276,7 @@ static void mapmenuactionpress(const bool version2_2)
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[i].colour = 102;
}
//which teleporter script do we use? it depends on the companion!
@@ -3504,14 +3498,14 @@ void teleporterinput(void)
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[i].colour = 102;
}
i = obj.getteleporter();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].tile = 6;
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[i].colour = 102;
}
//which teleporter script do we use? it depends on the companion!
game.setstate(4000);

View File

@@ -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 == EntityType_HORIZONTAL_GRAVITY_LINE)
if (obj.entities[i].type == 9)
{
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 == EntityType_VERTICAL_GRAVITY_LINE)
else if (obj.entities[i].type == 10)
{
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,35 +390,33 @@ namespace level_debugger
// Mostly contains duplicates, but for ease of use
switch (entity->type)
{
case EntityType_PLAYER:
case 0:
// Player
render_info(line++, "Gravity", help.String(game.gravitycontrol));
render_info(line++, "Checkpoint", help.String(game.savepoint));
break;
case EntityType_MOVING:
case 1:
// Moving platforms and enemies
render_info(line++, "Speed", help.String(entity->para));
render_info(line++, "Movement type", help.String(entity->behave));
break;
case EntityType_TRINKET:
case 7:
// Trinkets
render_info(line++, "ID", help.String(entity->para));
break;
case EntityType_CHECKPOINT:
case 8:
// Checkpoints
render_info(line++, "ID", help.String(entity->para));
render_info(line++, "Active", game.savepoint == entity->para ? "True" : "False");
break;
case EntityType_HORIZONTAL_GRAVITY_LINE:
case 9:
// Horizontal gravity lines
render_info(line++, "Horizontal");
break;
case EntityType_VERTICAL_GRAVITY_LINE:
case 10:
// Vertical gravity lines
render_info(line++, "Vertical");
break;
default:
break;
}

View File

@@ -373,7 +373,7 @@ void gamelogic(void)
{
if (game.roomx == 111 && game.roomy == 107 && !map.custommode)
{
if (obj.entities[i].type == EntityType_MOVING)
if (obj.entities[i].type == 1)
{
if (obj.entities[i].xp < 152)
{
@@ -391,7 +391,7 @@ void gamelogic(void)
}
}
}
if (obj.entities[i].type == EntityType_DISAPPEARING_PLATFORM && obj.entities[i].state == 3)
if (obj.entities[i].type == 2 && 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 == EntityType_DISAPPEARING_PLATFORM && obj.entities[i].state == 2)
else if (obj.entities[i].type == 2 && 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 == EntityType_GRAVITRON_ENEMY && game.swnmode && game.deathseq<15)
else if (obj.entities[i].type == 23 && game.swnmode && game.deathseq<15)
{
//if playing SWN, get the enemies offscreen.
obj.entities[i].xp += obj.entities[i].vx*5;
@@ -461,8 +461,6 @@ void gamelogic(void)
game.deathseq--;
if (game.deathseq <= 0)
{
game.invalidate_ndm_trophy();
if (game.nodeathmode)
{
game.deathseq = 1;
@@ -730,7 +728,7 @@ void gamelogic(void)
bool square_onscreen = false;
for (size_t i = 0; i < obj.entities.size(); i++)
{
if (obj.entities[i].type == EntityType_GRAVITRON_ENEMY)
if (obj.entities[i].type == 23)
{
square_onscreen = true;
break;
@@ -1036,11 +1034,9 @@ void gamelogic(void)
size_t i;
for (i = 0; i < obj.entities.size(); ++i)
{
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 */
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 */
{
continue;
}
@@ -1096,10 +1092,8 @@ void gamelogic(void)
size_t i;
for (i = 0; i < obj.entities.size(); ++i)
{
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 */
if (obj.entities[i].type >= 51
&& obj.entities[i].type <= 54) /* Don't warp warp lines */
{
continue;
}
@@ -1130,11 +1124,9 @@ void gamelogic(void)
size_t i;
for (i = 0; i < obj.entities.size(); ++i)
{
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 */
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 */
{
continue;
}

View File

@@ -52,8 +52,9 @@ mapclass::mapclass(void)
custommode=false;
custommodeforreal=false;
custommmxoff=0; custommmyoff=0; custommmxsize=0; custommmysize=0;
customzoom=0;
customshowmm=true;
revealmap = true;
rcol = 0;
@@ -87,9 +88,6 @@ mapclass::mapclass(void)
roomtexton = false;
nexttowercolour_set = false;
currentregion = 0;
SDL_zeroa(region);
}
static char roomname_static[SCREEN_WIDTH_CHARS];
@@ -200,12 +198,6 @@ 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)
@@ -486,28 +478,28 @@ int mapclass::maptiletoenemycol(int t)
switch(t)
{
case 0:
return EntityColour_ENEMY_CYAN;
return 11;
break;
case 1:
return EntityColour_ENEMY_RED;
return 6;
break;
case 2:
return EntityColour_ENEMY_PINK;
return 8;
break;
case 3:
return EntityColour_ENEMY_BLUE;
return 12;
break;
case 4:
return EntityColour_ENEMY_YELLOW;
return 9;
break;
case 5:
return EntityColour_ENEMY_GREEN;
return 7;
break;
case 6:
return EntityColour_ENEMY_GRAY;
return 18;
break;
}
return EntityColour_ENEMY_CYAN;
return 11;
}
void mapclass::changefinalcol(int t)
@@ -519,7 +511,7 @@ void mapclass::changefinalcol(int t)
//Next, entities
for (size_t i = 0; i < obj.entities.size(); i++)
{
if (obj.entities[i].type == EntityType_MOVING)
if (obj.entities[i].type == 1) //something with a movement behavior
{
if (obj.entities[i].animate == 10 || obj.entities[i].animate == 11) //treadmill
{
@@ -542,7 +534,7 @@ void mapclass::changefinalcol(int t)
obj.entities[i].colour = maptiletoenemycol(temp);
}
}
else if (obj.entities[i].type == EntityType_DISAPPEARING_PLATFORM)
else if (obj.entities[i].type == 2) //disappearing platforms
{
obj.entities[i].tile = 915+(temp*40);
}
@@ -892,7 +884,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 == EntityType_HORIZONTAL_GRAVITY_LINE)
if (obj.entities[i].type == 9)
{
//It's a horizontal line
if (obj.entities[i].xp <= 0 || (obj.entities[i].xp + obj.entities[i].w) >= 312)
@@ -1030,7 +1022,7 @@ void mapclass::gotoroom(int rx, int ry)
for (size_t i = 0; i < obj.entities.size(); i++)
{
if (obj.entities[i].type == EntityType_HORIZONTAL_GRAVITY_LINE)
if (obj.entities[i].type == 9)
{
//It's a horizontal line
if (obj.entities[i].xp <= 0 || obj.entities[i].xp + obj.entities[i].w >= 312)
@@ -1312,15 +1304,12 @@ 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 (revealmap)
if (!finalmode)
{
if (!finalmode)
setexplored(rx - 100, ry - 100, true);
if (rx == 109 && !custommode)
{
setexplored(rx - 100, ry - 100, true);
if (rx == 109 && !custommode)
{
exploretower();
}
exploretower();
}
}
@@ -1861,7 +1850,7 @@ void mapclass::loadlevel(int rx, int ry)
{
case 1: // Enemies
obj.customenemy = room->enemytype;
obj.createentity(ex, ey, 56, ent.p1, 4 + room->enemyv, bx1, by1, bx2, by2);
obj.createentity(ex, ey, 56, ent.p1, 4, bx1, by1, bx2, by2);
break;
case 2: // Platforms and conveyors
if (ent.p1 <= 4)
@@ -2058,7 +2047,7 @@ void mapclass::loadlevel(int rx, int ry)
for (size_t i = 0; i < obj.entities.size(); i++)
{
if (obj.entities[i].type == EntityType_MOVING && obj.entities[i].behave >= 8 && obj.entities[i].behave < 10)
if (obj.entities[i].type == 1 && obj.entities[i].behave >= 8 && obj.entities[i].behave < 10)
{
//put a block underneath
int temp = obj.entities[i].xp / 8.0f;
@@ -2185,7 +2174,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(EntityColour_CREW_BLUE);
int j = obj.getcrewman(BLUE);
if (INBOUNDS_VEC(j, obj.entities))
{
obj.entities[j].rule = 7;
@@ -2206,16 +2195,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;
}
@@ -2226,131 +2215,3 @@ 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();
}
}

View File

@@ -12,21 +12,6 @@
#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;
@@ -73,8 +58,6 @@ public:
void resetmap(void);
void fullmap(void);
void updateroomnames(void);
void initmapdata(void);
@@ -142,8 +125,6 @@ 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;
@@ -178,6 +159,8 @@ public:
//Variables for playing custom levels
bool custommode;
bool custommodeforreal;
int custommmxoff, custommmyoff, custommmxsize, custommmysize;
int customzoom;
bool customshowmm;
//final level colour cycling stuff
@@ -211,25 +194,6 @@ 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

View File

@@ -93,7 +93,7 @@ static FAudioMasteringVoice* masteringvoice = NULL;
class SoundTrack
{
public:
SoundTrack(const char* fileName, const char* _id, bool _extra)
SoundTrack(const char* fileName)
{
unsigned char* mem;
size_t length;
@@ -118,9 +118,6 @@ public:
{
LoadWAV(fileName, mem, length);
}
extra = _extra;
id = SDL_strdup(_id);
}
void LoadWAV(const char* fileName, unsigned char* mem, const size_t length)
@@ -137,7 +134,7 @@ public:
format.nSamplesPerSec = spec.freq;
format.wFormatTag = FAUDIO_FORMAT_PCM;
format.wBitsPerSample = SDL_AUDIO_BITSIZE(spec.format);
format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nBlockAlign = format.nChannels * format.wBitsPerSample;
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0;
valid = true;
@@ -161,7 +158,7 @@ end:
format.wBitsPerSample = sizeof(float) * 8;
format.nChannels = vorbis_info.channels;
format.nSamplesPerSec = vorbis_info.sample_rate;
format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nBlockAlign = format.nChannels * format.wBitsPerSample;
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0;
@@ -183,7 +180,6 @@ end:
VVV_free(decoded_buf_reserve);
VVV_freefunc(stb_vorbis_close, vorbis);
VVV_free(ogg_file);
VVV_free(id);
}
void Play(void)
@@ -214,7 +210,7 @@ end:
}
FAudioBuffer faudio_buffer = {
FAUDIO_END_OF_STREAM, /* Flags */
wav_length, /* AudioBytes */
wav_length * 8, /* AudioBytes */
wav_buffer, /* AudioData */
0, /* playbegin */
0, /* playlength */
@@ -266,7 +262,7 @@ end:
format.nSamplesPerSec = audio_rate;
format.wFormatTag = FAUDIO_FORMAT_PCM;
format.wBitsPerSample = 16;
format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nBlockAlign = format.nChannels * format.wBitsPerSample;
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0;
voice_formats[i] = format;
@@ -368,9 +364,6 @@ 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];
@@ -399,7 +392,7 @@ public:
format.wBitsPerSample = sizeof(float) * 8;
format.nChannels = vorbis_info.channels;
format.nSamplesPerSec = vorbis_info.sample_rate;
format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nBlockAlign = format.nChannels * format.wBitsPerSample;
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0;
@@ -511,9 +504,9 @@ end:
}
}
static void SetVolume(int controlVolume)
static void SetVolume(int musicVolume)
{
float adj_vol = (float)controlVolume / VVV_MAX_VOLUME;
float adj_vol = (float) musicVolume / VVV_MAX_VOLUME;
if (!IsHalted())
{
FAudioVoice_SetVolume(musicVoice, adj_vol, FAUDIO_COMMIT_NOW);
@@ -722,7 +715,7 @@ musicclass::musicclass(void)
safeToProcessMusic= false;
m_doFadeInVol = false;
m_doFadeOutVol = false;
controlVolume = 0;
musicVolume = 0;
user_music_volume = USER_VOLUME_MAX;
user_sound_volume = USER_VOLUME_MAX;
@@ -736,13 +729,6 @@ 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))
@@ -758,84 +744,34 @@ void musicclass::init(void)
SoundTrack::Init(44100);
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);
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" ));
#ifdef VVV_COMPILEMUSIC
binaryBlob musicWriteBlob;
@@ -973,16 +909,6 @@ 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)
@@ -1035,8 +961,8 @@ void musicclass::play(int t)
{
m_doFadeInVol = false;
m_doFadeOutVol = false;
controlVolume = VVV_MAX_VOLUME;
set_music_volume(controlVolume);
musicVolume = VVV_MAX_VOLUME;
MusicTrack::SetVolume(VVV_MAX_VOLUME * user_music_volume / USER_VOLUME_MAX);
}
}
else
@@ -1114,7 +1040,7 @@ void musicclass::haltdasmusik(const bool from_fade)
void musicclass::silencedasmusik(void)
{
controlVolume = 0;
musicVolume = 0;
m_doFadeInVol = false;
m_doFadeOutVol = false;
}
@@ -1171,10 +1097,10 @@ void musicclass::fadeMusicVolumeIn(int ms)
m_doFadeOutVol = false;
/* Ensure it starts at 0 */
controlVolume = 0;
musicVolume = 0;
/* Fix 1-frame glitch */
set_music_volume(0);
MusicTrack::SetVolume(0);
fade.step_ms = 0;
fade.duration_ms = ms;
@@ -1194,8 +1120,8 @@ void musicclass::fadeMusicVolumeOut(const int fadeout_ms)
fade.step_ms = 0;
/* Duration is proportional to current volume. */
fade.duration_ms = fadeout_ms * controlVolume / VVV_MAX_VOLUME;
fade.start_volume = controlVolume;
fade.duration_ms = fadeout_ms * musicVolume / VVV_MAX_VOLUME;
fade.start_volume = musicVolume;
fade.end_volume = 0;
}
@@ -1207,7 +1133,7 @@ void musicclass::fadeout(const bool quick_fade_ /*= true*/)
void musicclass::processmusicfadein(void)
{
enum FadeCode fade_code = processmusicfade(&fade, &controlVolume);
enum FadeCode fade_code = processmusicfade(&fade, &musicVolume);
if (fade_code == Fade_finished)
{
m_doFadeInVol = false;
@@ -1216,10 +1142,10 @@ void musicclass::processmusicfadein(void)
void musicclass::processmusicfadeout(void)
{
enum FadeCode fade_code = processmusicfade(&fade, &controlVolume);
enum FadeCode fade_code = processmusicfade(&fade, &musicVolume);
if (fade_code == Fade_finished)
{
controlVolume = 0;
musicVolume = 0;
m_doFadeOutVol = false;
haltdasmusik(true);
}
@@ -1345,61 +1271,13 @@ void musicclass::changemusicarea(int x, int y)
niceplay(track);
}
bool musicclass::playef(int t)
void musicclass::playef(int t)
{
if (!INBOUNDS_VEC(t, soundTracks))
{
return false;
return;
}
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;
soundTracks[t].Play();
}
void musicclass::pauseef(void)
@@ -1421,20 +1299,20 @@ void musicclass::updatemutestate(void)
{
if (game.muted)
{
set_music_volume(0);
set_sound_volume(0);
MusicTrack::SetVolume(0);
SoundTrack::SetVolume(0);
}
else
{
set_sound_volume(VVV_MAX_VOLUME);
SoundTrack::SetVolume(VVV_MAX_VOLUME * user_sound_volume / USER_VOLUME_MAX);
if (game.musicmuted)
{
set_music_volume(0);
MusicTrack::SetVolume(0);
}
else
{
set_music_volume(controlVolume);
MusicTrack::SetVolume(musicVolume * user_music_volume / USER_VOLUME_MAX);
}
}
}

View File

@@ -70,9 +70,6 @@ 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);
@@ -94,11 +91,7 @@ public:
int currentsong;
int haltedsong;
bool playef(int t);
bool playefid(const char* id);
bool soundidexists(const char* id);
bool soundisextra(int t);
const char* getsoundid(int t);
void playef(int t);
void pauseef(void);
void resumeef(void);
@@ -112,7 +105,7 @@ public:
bool m_doFadeInVol;
bool m_doFadeOutVol;
int controlVolume;
int musicVolume;
/* 0..USER_VOLUME_MAX */
int user_music_volume;

View File

@@ -1,7 +1,6 @@
#include "Otherlevel.h"
#include "Game.h"
#include "Graphics.h"
#include "Entity.h"
#include "MakeAndPlay.h"
#include "UtilityClass.h"
@@ -8905,7 +8904,7 @@ const short* otherlevelclass::loadlevel(int rx, int ry)
//violet
obj.createentity(83, 126, 18, 20, 0, 18);
int crewman = obj.getcrewman(EntityColour_CREW_PURPLE);
int crewman = obj.getcrewman(PURPLE);
if (INBOUNDS_VEC(crewman, obj.entities))
{
obj.entities[crewman].rule = 7;

View File

@@ -1,17 +1,6 @@
#ifndef RELEASEVERSION_H
#define RELEASEVERSION_H
#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
#define RELEASE_VERSION "v2.4.3"
#endif /* RELEASEVERSION_H */

View File

@@ -32,6 +32,15 @@ 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)
@@ -105,7 +114,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];
@@ -1209,7 +1218,6 @@ 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)
@@ -1218,21 +1226,6 @@ 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:
{
@@ -2859,26 +2852,42 @@ 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)
{
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);
}
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);
return;
}
@@ -2888,11 +2897,11 @@ static void rendermap(void)
static void rendermapfog(void)
{
const MapRenderData data = map.get_render_data();
const MapRenderData data = getmaprenderdata();
for (int j = data.starty; j < data.starty + data.height; j++)
for (int j = 0; j < map.getheight(); j++)
{
for (int i = data.startx; i < data.startx + data.width; i++)
for (int i = 0; i < map.getwidth(); i++)
{
if (!map.isexplored(i, j))
{
@@ -2901,7 +2910,7 @@ static void rendermapfog(void)
{
for (int y = 0; y < data.zoom; y++)
{
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);
graphics.drawimage(IMAGE_COVERED, data.xoff + 40 + (x * 12) + (i * (12 * data.zoom)), data.yoff + 21 + (y * 9) + (j * (9 * data.zoom)), false);
}
}
}
@@ -2913,22 +2922,17 @@ static void rendermaplegend(void)
{
// Draw the map legend, aka teleports/targets/trinkets
const MapRenderData data = map.get_render_data();
const MapRenderData data = getmaprenderdata();
for (size_t i = 0; i < map.teleporters.size(); i++)
{
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)
if (map.showteleporters && map.isexplored(map.teleporters[i].x, map.teleporters[i].y))
{
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);
}
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);
}
}
@@ -2938,12 +2942,7 @@ static void rendermaplegend(void)
{
if (!obj.collect[i])
{
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);
}
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);
}
}
}
@@ -2951,45 +2950,44 @@ static void rendermaplegend(void)
static void rendermapcursor(const bool flashing)
{
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;
const MapRenderData data = getmaprenderdata();
if (!map.custommode && game.roomx == 109)
{
// Draw the tower specially
if (!flashing || game.noflashingmode)
{
graphics.draw_rect(40 + pixels_x + 2, 21 + 2, 12 - 4, 180 - 4, 16, 245 - (help.glow * 2), 245 - (help.glow * 2));
graphics.draw_rect(40 + ((game.roomx - 100) * 12) + 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 + pixels_x, 21, 12, 180, 255, 255, 255);
graphics.draw_rect(40 + pixels_x + 2, 21 + 2, 12 - 4, 180 - 4, 255, 255, 255);
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);
}
}
else if (map.cursorstate == 2 && (int(map.cursordelay / 15) % 2 == 0))
{
graphics.draw_rect(40 + pixels_x + 2, 21 + 2, 12 - 4, 180 - 4, 16, 245 - (help.glow), 245 - (help.glow));
graphics.draw_rect(40 + ((game.roomx - 100) * 12) + 2, 21 + 2, 12 - 4, 180 - 4, 16, 245 - (help.glow), 245 - (help.glow));
}
return;
}
if (room_x >= 0 && room_y >= 0 && room_x < data.width && room_y < data.height)
if (!flashing || ((map.cursorstate == 2 && int(map.cursordelay / 15) % 2 == 0) || game.noflashingmode))
{
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);
}
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);
}
}
@@ -3181,30 +3179,26 @@ 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(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);
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);
if (sp <= 10)
{
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(desc_pos + sp*5, 8), meta.Desc3, 196, 196, 255 - help.glow);
font::print(PR_FONT_LEVEL | PR_CEN, -1, FLIP(70+sp*5, 8), meta.Desc3, 196, 196, 255 - help.glow);
}
if (cl.numcrewmates() > 0)
{
int remaining = cl.numcrewmates() - game.crewmates();
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
{
@@ -3277,29 +3271,21 @@ 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);
// 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(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);
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);
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);
break;
}
case 3:
@@ -3568,7 +3554,7 @@ void teleporterrender(void)
// Draw a box around the currently selected teleporter
const MapRenderData data = map.get_render_data();
const MapRenderData data = getmaprenderdata();
if (game.useteleporter)
{

View File

@@ -1,23 +0,0 @@
/*
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: */

View File

@@ -383,7 +383,7 @@ bool Screen::isForcedFullscreen(void)
* If you're working on a tenfoot-only build, add a def that always
* returns true!
*/
#if defined(__ANDROID__) || TARGET_OS_IPHONE
#ifdef __ANDROID__
return true;
#else
return SDL_GetHintBoolean("SteamTenfoot", SDL_FALSE);

View File

@@ -20,7 +20,6 @@
#include "LocalizationStorage.h"
#include "Map.h"
#include "Music.h"
#include "ReleaseVersion.h"
#include "Unreachable.h"
#include "UtilityClass.h"
#include "VFormat.h"
@@ -54,7 +53,6 @@ scriptclass::scriptclass(void)
textlarge = false;
textbox_sprites.clear();
textbox_image = TEXTIMAGE_NONE;
textbox_absolutepos = false;
}
void scriptclass::add_default_colours(void)
@@ -135,16 +133,16 @@ void scriptclass::tokenize( const std::string& t )
static int getcolorfromname(std::string name)
{
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;
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;
int color = help.Int(name.c_str(), -1);
if (color < 0) return -1; // Not a number (or it's negative), so we give up
@@ -159,6 +157,7 @@ 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);
@@ -295,7 +294,7 @@ void scriptclass::run(void)
{
for (size_t edi = 0; edi < obj.entities.size(); edi++)
{
if (obj.entities[edi].type == EntityType_HORIZONTAL_GRAVITY_LINE || obj.entities[edi].type == EntityType_VERTICAL_GRAVITY_LINE)
if (obj.entities[edi].type == 9 || obj.entities[edi].type == 10)
{
obj.disableentity(edi);
}
@@ -305,7 +304,7 @@ void scriptclass::run(void)
{
for (size_t edi = 0; edi < obj.entities.size(); edi++)
{
if (obj.entities[edi].type == EntityType_WARP_TOKEN)
if (obj.entities[edi].type == 11)
{
obj.disableentity(edi);
}
@@ -332,74 +331,13 @@ 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 == EntityType_DISAPPEARING_PLATFORM && obj.entities[edi].rule == 3)
if (obj.entities[edi].type == 2 && 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]))
@@ -433,23 +371,6 @@ 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)
@@ -509,21 +430,7 @@ void scriptclass::run(void)
}
if (words[0] == "playef")
{
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());
}
music.playef(ss_toi(words[1]));
}
if (words[0] == "play")
{
@@ -642,15 +549,11 @@ 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")
@@ -672,13 +575,6 @@ 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]);
@@ -713,37 +609,37 @@ void scriptclass::run(void)
//the first word is the object to position relative to
if (words[1] == "player")
{
i = obj.getcustomcrewman(EntityColour_CREW_CYAN);
i = obj.getcustomcrewman(0);
j = obj.entities[i].dir;
}
else if (words[1] == "cyan")
{
i = obj.getcustomcrewman(EntityColour_CREW_CYAN);
i = obj.getcustomcrewman(0);
j = obj.entities[i].dir;
}
else if (words[1] == "purple")
{
i = obj.getcustomcrewman(EntityColour_CREW_PURPLE);
i = obj.getcustomcrewman(1);
j = obj.entities[i].dir;
}
else if (words[1] == "yellow")
{
i = obj.getcustomcrewman(EntityColour_CREW_YELLOW);
i = obj.getcustomcrewman(2);
j = obj.entities[i].dir;
}
else if (words[1] == "red")
{
i = obj.getcustomcrewman(EntityColour_CREW_RED);
i = obj.getcustomcrewman(3);
j = obj.entities[i].dir;
}
else if (words[1] == "green")
{
i = obj.getcustomcrewman(EntityColour_CREW_GREEN);
i = obj.getcustomcrewman(4);
j = obj.entities[i].dir;
}
else if (words[1] == "blue")
{
i = obj.getcustomcrewman(EntityColour_CREW_BLUE);
i = obj.getcustomcrewman(5);
j = obj.entities[i].dir;
}
else if (words[1] == "centerx")
@@ -823,23 +719,6 @@ 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;
@@ -878,28 +757,16 @@ void scriptclass::run(void)
graphics.setimage(textbox_image);
if (textbox_absolutepos)
if (textx == -500 || textx == -1)
{
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;
}
graphics.textboxcenterx();
textcrewmateposition.override_x = false;
}
if (textbox_force_outline)
if (texty == -500)
{
graphics.textboxoutline(textbox_outline);
graphics.textboxcentery();
textcrewmateposition.override_y = false;
}
TextboxOriginalContext context = TextboxOriginalContext();
@@ -985,7 +852,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 = EntityColour_GRAVITRON_INDICATOR;
obj.entities[i].colour = 23;
obj.entities[i].cx = 36;// 6;
obj.entities[i].cy = 12+80;// 2;
obj.entities[i].h = 126-80;// 21;
@@ -1000,7 +867,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 = EntityColour_CREW_CYAN;
obj.entities[i].colour = 0;
obj.entities[i].cx = 6;
obj.entities[i].cy = 2;
obj.entities[i].h = 21;
@@ -1097,47 +964,47 @@ void scriptclass::run(void)
{
if (words[1] == "player")
{
i=obj.getcustomcrewman(EntityColour_CREW_CYAN);
i=obj.getcustomcrewman(0);
obj.customcrewmoods[0]=ss_toi(words[2]);
}
else if (words[1] == "cyan")
{
i=obj.getcustomcrewman(EntityColour_CREW_CYAN);
i=obj.getcustomcrewman(0);
obj.customcrewmoods[0]=ss_toi(words[2]);
}
else if (words[1] == "customcyan")
{
i=obj.getcustomcrewman(EntityColour_CREW_CYAN);
i=obj.getcustomcrewman(0);
obj.customcrewmoods[0]=ss_toi(words[2]);
}
else if (words[1] == "red")
{
i=obj.getcustomcrewman(EntityColour_CREW_RED);
i=obj.getcustomcrewman(3);
obj.customcrewmoods[3]=ss_toi(words[2]);
}
else if (words[1] == "green")
{
i=obj.getcustomcrewman(EntityColour_CREW_GREEN);
i=obj.getcustomcrewman(4);
obj.customcrewmoods[4]=ss_toi(words[2]);
}
else if (words[1] == "yellow")
{
i=obj.getcustomcrewman(EntityColour_CREW_YELLOW);
i=obj.getcustomcrewman(2);
obj.customcrewmoods[2]=ss_toi(words[2]);
}
else if (words[1] == "blue")
{
i=obj.getcustomcrewman(EntityColour_CREW_BLUE);
i=obj.getcustomcrewman(5);
obj.customcrewmoods[5]=ss_toi(words[2]);
}
else if (words[1] == "purple")
{
i=obj.getcustomcrewman(EntityColour_CREW_PURPLE);
i=obj.getcustomcrewman(1);
obj.customcrewmoods[1]=ss_toi(words[2]);
}
else if (words[1] == "pink")
{
i=obj.getcustomcrewman(EntityColour_CREW_PURPLE);
i=obj.getcustomcrewman(1);
obj.customcrewmoods[1]=ss_toi(words[2]);
}
@@ -1263,7 +1130,7 @@ void scriptclass::run(void)
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].tile = 6;
obj.entities[i].colour = EntityColour_TELEPORTER_FLASHING;
obj.entities[i].colour = 102;
}
}
else if (words[0] == "changecolour")
@@ -1339,8 +1206,6 @@ void scriptclass::run(void)
{
game.savedir = obj.entities[i].dir;
}
game.checkpoint_save();
}
else if (words[0] == "gamestate")
{
@@ -1463,28 +1328,6 @@ 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;
@@ -1570,7 +1413,7 @@ void scriptclass::run(void)
{
game.unlocknum(Unlock_SECRETLAB);
game.insecretlab = true;
map.fullmap();
SDL_memset(map.explored, true, sizeof(map.explored));
}
else if (words[0] == "leavesecretlab")
{
@@ -1723,9 +1566,9 @@ void scriptclass::run(void)
{
for (j = 0; j < (int) obj.entities.size(); j++)
{
if (obj.entities[j].type == EntityType_TERMINAL)
if (obj.entities[j].type == 13)
{
obj.entities[j].colour = EntityColour_INACTIVE_ENTITY;
obj.entities[j].colour = 4;
}
}
if (ss_toi(words[1]) == 1)
@@ -1735,7 +1578,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 88 && obj.entities[j].yp==80)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1746,7 +1589,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 128 && obj.entities[j].yp==80)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1757,7 +1600,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 176 && obj.entities[j].yp==80)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1768,7 +1611,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 216 && obj.entities[j].yp==80)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1779,7 +1622,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 88 && obj.entities[j].yp==128)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1790,7 +1633,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 176 && obj.entities[j].yp==128)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1801,7 +1644,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 40 && obj.entities[j].yp==40)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1812,7 +1655,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 216 && obj.entities[j].yp==128)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1823,7 +1666,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 128 && obj.entities[j].yp==128)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1834,7 +1677,7 @@ void scriptclass::run(void)
{
if (obj.entities[j].xp == 264 && obj.entities[j].yp==40)
{
obj.entities[j].colour = EntityColour_ACTIVE_ENTITY;
obj.entities[j].colour = 5;
}
}
}
@@ -1845,31 +1688,31 @@ void scriptclass::run(void)
if (words[1] == "red")
{
i = 3;
crew_color = EntityColour_CREW_RED;
crew_color = RED;
}
else if (words[1] == "green")
{
i = 4;
crew_color = EntityColour_CREW_GREEN;
crew_color = GREEN;
}
else if (words[1] == "yellow")
{
i = 2;
crew_color = EntityColour_CREW_YELLOW;
crew_color = YELLOW;
}
else if (words[1] == "blue")
{
i = 5;
crew_color = EntityColour_CREW_BLUE;
crew_color = BLUE;
}
else if (words[1] == "purple")
{
i = 1;
crew_color = EntityColour_CREW_PURPLE;
crew_color = PURPLE;
}
int crewman = obj.getcrewman(crew_color);
if (INBOUNDS_VEC(crewman, obj.entities) && crew_color == EntityColour_CREW_GREEN)
if (INBOUNDS_VEC(crewman, obj.entities) && crew_color == GREEN)
{
obj.createblock(5, obj.entities[crewman].xp - 32, obj.entities[crewman].yp-20, 96, 60, i, "", (i == 35));
}
@@ -1925,9 +1768,8 @@ void scriptclass::run(void)
i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = cl.player_colour;
obj.entities[i].colour = 0;
}
game.savecolour = cl.player_colour;
}
else if (words[0] == "changeplayercolour")
{
@@ -1951,7 +1793,7 @@ void scriptclass::run(void)
i = obj.getteleporter();
if (INBOUNDS_VEC(i, obj.entities))
{
obj.entities[i].colour = EntityColour_TELEPORTER_ACTIVE;
obj.entities[i].colour = 101;
}
}
else if (words[0] == "foundtrinket")
@@ -2044,16 +1886,6 @@ 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
@@ -2076,9 +1908,9 @@ void scriptclass::run(void)
else if (words[0] == "createlastrescued")
{
r = graphics.crewcolour(game.lastsaved);
if (r == EntityColour_CREW_CYAN || r == EntityColour_CREW_PURPLE)
if (r == 0 || r == PURPLE)
{
r = EntityColour_CREW_GRAY; // Default to gray if invalid color.
r = GRAY; // Default to gray if invalid color.
}
obj.createentity(200, 153, 18, r, 0, 19, 30);
@@ -2738,7 +2570,7 @@ void scriptclass::startgamemode(const enum StartMode mode)
}
}
/* State which needs to be reset before gameplay starts
/* Containers which need to be reset before gameplay starts
* ex. before custom levels get loaded */
switch (mode)
@@ -2748,8 +2580,6 @@ void scriptclass::startgamemode(const enum StartMode mode)
default:
textbox_colours.clear();
add_default_colours();
cl.onewaycol_override = false;
cl.player_colour = 0;
break;
}
@@ -2821,16 +2651,6 @@ 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;
@@ -2892,7 +2712,7 @@ void scriptclass::startgamemode(const enum StartMode mode)
{
game.timetrialcountdown = 0;
game.timetrialparlost = true;
map.fullmap();
SDL_memset(map.explored, true, sizeof(map.explored));
}
graphics.fademode = FADE_START_FADEIN;
@@ -2902,9 +2722,9 @@ void scriptclass::startgamemode(const enum StartMode mode)
game.startspecial(0);
/* Unlock the entire map */
map.fullmap();
/* Give all 20 trinkets */
SDL_memset(obj.collect, true, sizeof(obj.collect[0]) * 20);
/* Give all 20 trinkets */
SDL_memset(map.explored, true, sizeof(map.explored));
i = 400; /* previously a nested for-loop set this */
game.insecretlab = true;
map.showteleporters = true;
@@ -2998,7 +2818,6 @@ void scriptclass::startgamemode(const enum StartMode mode)
map.custommode = true;
map.custommodeforreal = false;
map.customshowmm = true;
map.revealmap = true;
if (cl.levmusic > 0)
{
@@ -3025,7 +2844,6 @@ void scriptclass::startgamemode(const enum StartMode mode)
cl.findstartpoint();
map.customshowmm = true;
map.revealmap = true;
music.fadeout();
game.customstart();
@@ -3270,7 +3088,6 @@ void scriptclass::hardreset(void)
game.nodeathmode = false;
game.nocutscenes = false;
game.nodeatheligible = false;
for (i = 0; i < (int) SDL_arraysize(game.crewstats); i++)
{
@@ -3295,7 +3112,7 @@ void scriptclass::hardreset(void)
game.savey = 0;
game.savegc = 0;
}
game.savecolour = cl.player_colour;
game.savecolour = 0;
game.intimetrial = false;
game.timetrialcountdown = 0;
@@ -3398,14 +3215,11 @@ void scriptclass::hardreset(void)
map.cameraseekframe = 0;
map.resumedelay = 0;
graphics.towerbg.scrolldir = 0;
map.customshowmm = true;
map.revealmap = true;
map.customshowmm=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;
@@ -3525,10 +3339,6 @@ 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"){
@@ -3646,9 +3456,6 @@ 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]);

View File

@@ -122,9 +122,6 @@ 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;

View File

@@ -29,8 +29,6 @@ textboxclass::textboxclass(int gap)
large = false;
position_absolute = false;
should_centerx = false;
should_centery = false;
@@ -43,9 +41,6 @@ textboxclass::textboxclass(int gap)
image = TEXTIMAGE_NONE;
force_outline = false;
outline = false;
crewmate_position = TextboxCrewmatePosition();
original = TextboxOriginalContext();
original.text_case = 1;
@@ -83,21 +78,18 @@ void textboxclass::centery(void)
void textboxclass::applyposition(void)
{
resize();
if (!position_absolute)
reposition();
if (should_centerx)
{
reposition();
if (should_centerx)
{
centerx();
}
if (should_centery)
{
centery();
}
if (translate == TEXTTRANSLATE_CUTSCENE)
{
adjust();
}
centerx();
}
if (should_centery)
{
centery();
}
if (translate == TEXTTRANSLATE_CUTSCENE)
{
adjust();
}
}

View File

@@ -125,8 +125,6 @@ public:
bool large;
bool position_absolute;
bool should_centerx;
bool should_centery;
@@ -137,9 +135,6 @@ public:
std::vector<TextboxSprite> sprites;
TextboxImage image;
bool force_outline;
bool outline;
TextboxCrewmatePosition crewmate_position;
TextboxOriginalContext original;
TextboxSpacing spacing;

View File

@@ -3,9 +3,8 @@
#include <stdarg.h>
#include <stdio.h>
#if defined(__ANDROID__) || TARGET_OS_IPHONE
#ifdef __ANDROID__
// 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

View File

@@ -1,6 +1,2 @@
#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

View File

@@ -604,8 +604,6 @@ 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!");