diff --git a/.gitignore b/.gitignore index 7023aaa80..3eca1c57a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ Win32_LIB_ASM_Release /assets/debian /make /bin +/build diff --git a/CMakeLists.txt b/CMakeLists.txt index 0771f712c..10c65a167 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,15 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.14 FATAL_ERROR) -# Enable CCache early -set(SRB2_USE_CCACHE OFF CACHE BOOL "Use CCache") -if (${SRB2_USE_CCACHE}) - find_program(CCACHE_PROGRAM ccache) - if(CCACHE_PROGRAM) - message(STATUS "Found CCache: ${CCACHE_PROGRAM}") - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") - else() - message(WARNING "You have specified to use CCACHE but it was not found. Object files will not be cached.") - endif() +if("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") + message(FATAL_ERROR "In-source builds are blocked. Please build from a separate directory.") endif() +# Set up CMAKE path +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") + +include(CMakeDependentOption) +include(cmake/CPM.cmake) + file(STRINGS src/version.h SRB2_VERSION) string(REGEX MATCH "[0-9]+\\.[0-9.]+" SRB2_VERSION ${SRB2_VERSION}) @@ -19,117 +17,11 @@ string(REGEX MATCH "[0-9]+\\.[0-9.]+" SRB2_VERSION ${SRB2_VERSION}) # Version change is fine. project(SRB2 VERSION ${SRB2_VERSION} - LANGUAGES C) + LANGUAGES C CXX) -if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR}) - message(FATAL_ERROR "In-source builds will bring you a world of pain. Please make a separate directory to invoke CMake from.") -endif() - -if ((${SRB2_USE_CCACHE}) AND (${CMAKE_C_COMPILER} MATCHES "clang")) - message(WARNING "Using clang and CCache: You may want to set environment variable CCACHE_CPP2=yes to prevent include errors during compile.") -endif() - -# Set up CMAKE path -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") - -### Useful functions - -# Add sources from Sourcefile -function(target_sourcefile type) - file(STRINGS Sourcefile list - REGEX "[-0-9A-Za-z_]+\.${type}") - target_sources(SRB2SDL2 PRIVATE ${list}) -endfunction() - -# Macro to add OSX framework -macro(add_framework fwname appname) - find_library(FRAMEWORK_${fwname} - NAMES ${fwname} - PATHS ${CMAKE_OSX_SYSROOT}/System/Library - ${CMAKE_OSX_SYSROOT}/Library - /System/Library - /Library - ATH_SUFFIXES Frameworks - NO_DEFAULT_PATH) - if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND) - MESSAGE(ERROR ": Framework ${fwname} not found") - else() - TARGET_LINK_LIBRARIES(${appname} PRIVATE "${FRAMEWORK_${fwname}}/${fwname}") - MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}") - endif() -endmacro() - -# Macro to copy Windows DLLs to Debug/Release folder for easy debugging -# Note: this is general purpose, we could copy anything. Just using for DLLs on MSVC though -macro(copy_files_to_build_dir target dlllist_var) - if(MSVC) - # http://stackoverflow.com/a/26983405/3064195 - foreach(dlllist_item ${${dlllist_var}}) - get_filename_component(dllname ${dlllist_item} NAME) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${dlllist_item} - $/${dllname} - ) - endforeach() - endif() -endmacro() - -# bitness check -set(SRB2_SYSTEM_BITS 0) -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - message(STATUS "Target is 64-bit") - set(SRB2_SYSTEM_BITS 64) -endif() -if(CMAKE_SIZEOF_VOID_P EQUAL 4) - message(STATUS "Target is 32-bit") - set(SRB2_SYSTEM_BITS 32) -endif() -if(${SRB2_SYSTEM_BITS} EQUAL 0) - message(STATUS "Target bitness is unknown") -endif() - -# OS macros -if (UNIX) - add_definitions(-DUNIXCOMMON) -endif() - -if(CMAKE_COMPILER_IS_GNUCC) - find_program(OBJCOPY objcopy) -endif() - -if(${CMAKE_SYSTEM} MATCHES "Linux") - add_definitions(-DLINUX) - if(${SRB2_SYSTEM_BITS} EQUAL 64) - add_definitions(-DLINUX64) - endif() -endif() - -if(${CMAKE_SYSTEM} MATCHES "Darwin") - add_definitions(-DMACOSX) -endif() - -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") -set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") - -# Set EXE names so the assets CMakeLists can refer to its target -set(SRB2_SDL2_EXE_NAME ringracers CACHE STRING "Executable binary output name") - -include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) - -## config.h generation -set(GIT_EXECUTABLE "git" CACHE FILEPATH "Path to git binary") -include(GitUtilities) -git_latest_commit(SRB2_COMP_COMMIT "${CMAKE_SOURCE_DIR}") -git_current_branch(SRB2_GIT_BRANCH "${CMAKE_SOURCE_DIR}") -git_working_tree_dirty(SRB2_COMP_UNCOMMITTED "${CMAKE_SOURCE_DIR}") -set(SRB2_COMP_BRANCH "${SRB2_GIT_BRANCH}") -set(SRB2_COMP_REVISION "${SRB2_COMP_COMMIT}") -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/config.h) - -add_subdirectory(src) -if(NOT ${SRB2_CONFIG_DEV_BUILD}) - add_subdirectory(assets) +if(APPLE) + # DiscordRPC needs but does not properly specify ObjC + enable_language(OBJC) endif() ##### PACKAGE CONFIGURATION ##### @@ -137,11 +29,11 @@ endif() set(SRB2_CPACK_GENERATOR "" CACHE STRING "Generator to use for making a package. E.g., ZIP, TGZ, DragNDrop (OSX only). Leave blank for default generator.") if("${SRB2_CPACK_GENERATOR}" STREQUAL "") - if(${CMAKE_SYSTEM} MATCHES "Windows") + if("${CMAKE_SYSTEM_NAME}" MATCHES "Windows") set(SRB2_CPACK_GENERATOR "ZIP") - elseif(${CMAKE_SYSTEM} MATCHES "Linux") + elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") set(SRB2_CPACK_GENERATOR "TGZ") - elseif(${CMAKE_SYSTEM} MATCHES "Darwin") + elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") set(SRB2_CPACK_GENERATOR "TGZ") endif() endif() @@ -157,3 +49,138 @@ set(CPACK_PACKAGE_VERSION_PATCH ${SRB2_VERSION_PATCH}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMAKE_VERSION_MAJOR}.${CMAKE_VERSION_MINOR}") SET(CPACK_OUTPUT_FILE_PREFIX package) include(CPack) + +# Options + +if("${CMAKE_SYSTEM_NAME}" MATCHES Linux) + set(SRB2_CONFIG_SYSTEM_LIBRARIES_DEFAULT ON) +else() + set(SRB2_CONFIG_SYSTEM_LIBRARIES_DEFAULT OFF) +endif() + +option( + SRB2_CONFIG_SYSTEM_LIBRARIES + "Link dependencies using CMake's find_package and do not use internal builds" + ${SRB2_CONFIG_SYSTEM_LIBRARIES_DEFAULT} +) +# This option isn't recommended for distribution builds and probably won't work (yet). +cmake_dependent_option( + SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES + "Use dynamic libraries when compiling internal dependencies" + OFF "NOT SRB2_CONFIG_SYSTEM_LIBRARIES" + OFF +) +option(SRB2_CONFIG_HWRENDER "Enable hardware render (OpenGL) support" ON) +option(SRB2_CONFIG_STATIC_OPENGL "Enable static linking GL (do not do this)" OFF) +option(SRB2_CONFIG_ERRORMODE "Compile C code with warnings treated as errors." OFF) +option(SRB2_CONFIG_DEBUGMODE "Compile with PARANOIA, ZDEBUG, RANGECHECK and PACKETDROP defined." OFF) +option(SRB2_CONFIG_MOBJCONSISTANCY "Compile with MOBJCONSISTANCY defined." OFF) +option(SRB2_CONFIG_PACKETDROP "Compile with PACKETDROP defined." OFF) +option(SRB2_CONFIG_ZDEBUG "Compile with ZDEBUG defined." OFF) +# SRB2_CONFIG_PROFILEMODE is probably superceded by some CMake setting. +option(SRB2_CONFIG_PROFILEMODE "Compile for profiling (GCC only)." OFF) +set(SRB2_CONFIG_ASSET_DIRECTORY "" CACHE PATH "Path to directory that contains all asset files for the installer. If set, assets will be part of installation and cpack.") + +# Enable CCache +# (Set USE_CCACHE=ON to use, CCACHE_OPTIONS for options) +if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL Windows) + option(USE_CCACHE "Enable ccache support" OFF) + + if(USE_CCACHE) + find_program(CCACHE_TOOL_PATH ccache) + if(CCACHE_TOOL_PATH) + set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_TOOL_PATH} CACHE STRING "" FORCE) + set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_TOOL_PATH} CACHE STRING "" FORCE) + else() + message(WARNING "USE_CCACHE was set but ccache is not found (set CCACHE_TOOL_PATH)") + endif() + endif() +else() + CPMAddPackage( + NAME Ccache.cmake + GITHUB_REPOSITORY TheLartians/Ccache.cmake + VERSION 1.2 + ) +endif() + +# Dependencies +add_subdirectory(thirdparty) + +if("${SRB2_CONFIG_SYSTEM_LIBRARIES}") + find_package(ZLIB REQUIRED) + find_package(PNG REQUIRED) + find_package(SDL2 REQUIRED) + find_package(SDL2_mixer REQUIRED) + find_package(CURL REQUIRED) + find_package(OPENMPT REQUIRED) + find_package(GME REQUIRED) + find_package(DiscordRPC REQUIRED) +endif() + +if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR}) + message(FATAL_ERROR "In-source builds will bring you a world of pain. Please make a separate directory to invoke CMake from.") +endif() + +if ((${SRB2_USE_CCACHE}) AND (${CMAKE_C_COMPILER} MATCHES "clang")) + message(WARNING "Using clang and CCache: You may want to set environment variable CCACHE_CPP2=yes to prevent include errors during compile.") +endif() + +# Add sources from Sourcefile +function(target_sourcefile type) + file(STRINGS Sourcefile list + REGEX "[-0-9A-Za-z_]+\.${type}") + target_sources(SRB2SDL2 PRIVATE ${list}) +endfunction() + +# bitness check +set(SRB2_SYSTEM_BITS 0) +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + message(STATUS "Target is 64-bit") + set(SRB2_SYSTEM_BITS 64) +endif() +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + message(STATUS "Target is 32-bit") + set(SRB2_SYSTEM_BITS 32) +endif() +if(${SRB2_SYSTEM_BITS} EQUAL 0) + message(STATUS "Target bitness is unknown") +endif() + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +# Set EXE names so the assets CMakeLists can refer to its target +set(SRB2_SDL2_EXE_NAME "" CACHE STRING "Override executable binary output name") +set(SRB2_SDL2_EXE_SUFFIX "" CACHE STRING "Optional executable suffix, separated by an underscore") + +include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) + +add_subdirectory(src) +add_subdirectory(assets) + + +## config.h generation +set(GIT_EXECUTABLE "git" CACHE FILEPATH "Path to git binary") +include(GitUtilities) +git_latest_commit(SRB2_COMP_COMMIT "${CMAKE_SOURCE_DIR}") +git_current_branch(SRB2_GIT_BRANCH "${CMAKE_SOURCE_DIR}") +git_working_tree_dirty(SRB2_COMP_UNCOMMITTED "${CMAKE_SOURCE_DIR}") +set(SRB2_COMP_BRANCH "${SRB2_GIT_BRANCH}") +set(SRB2_COMP_REVISION "${SRB2_COMP_COMMIT}") +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/config.h) + + +if("${SRB2_SDL2_EXE_NAME}" STREQUAL "") + list(APPEND EXE_NAME_PARTS "ringracers") + + if(NOT "${SRB2_GIT_BRANCH}" STREQUAL "master") + list(APPEND EXE_NAME_PARTS ${SRB2_GIT_BRANCH}) + endif() +else() + list(APPEND EXE_NAME_PARTS ${SRB2_SDL2_EXE_NAME}) +endif() + +list(APPEND EXE_NAME_PARTS ${SRB2_SDL2_EXE_SUFFIX}) + +list(JOIN EXE_NAME_PARTS "_" EXE_NAME) +set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME ${EXE_NAME}) diff --git a/assets/CMakeLists.txt b/assets/CMakeLists.txt index a8f4cac5c..42243c9c1 100644 --- a/assets/CMakeLists.txt +++ b/assets/CMakeLists.txt @@ -1,75 +1,53 @@ ## Assets Target Configuration ## -# For prepending the current source path, later -FUNCTION(PREPEND var prefix) - SET(listVar "") - FOREACH(f ${ARGN}) - LIST(APPEND listVar "${prefix}/${f}") - ENDFOREACH(f) - SET(${var} "${listVar}" PARENT_SCOPE) -ENDFUNCTION(PREPEND) +if(${CMAKE_SYSTEM} MATCHES Linux) + # Asset installation isn't part of the Linux target + return() +endif() -set(SRB2_ASSET_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/installer" - CACHE STRING "Path to directory that contains all asset files for the installer.") +if("${SRB2_CONFIG_ASSET_DIRECTORY}" STREQUAL "") + message(WARNING "SRB2_CONFIG_ASSET_DIRECTORY is not set, so installation will not contain data files.") + return() +endif() -set(SRB2_ASSET_INSTALL ON - CACHE BOOL "Insert asset files into the install directory or package.") +get_filename_component(SRB2_ASSET_DIRECTORY_ABSOLUTE "${SRB2_CONFIG_ASSET_DIRECTORY}" ABSOLUTE) + +set(SRB2_ASSETS_DOCS + "README.txt" + "HISTORY.txt" + "README-SDL.txt" + "LICENSE.txt" + "LICENSE-3RD-PARTY.txt" +) +list(TRANSFORM SRB2_ASSETS_DOCS PREPEND "/") +list(TRANSFORM SRB2_ASSETS_DOCS PREPEND "${SRB2_ASSET_DIRECTORY_ABSOLUTE}") #################### # POST-V2.2 NOTE: Do not forget to add patch.pk3 to the end of this list! #################### -set(SRB2_ASSET_HASHED -"main.kart;\ -gfx.pk3;\ -textures.pk3;\ -chars.pk3;\ -maps.pk3;\ -patch.pk3" - CACHE STRING "Asset filenames to apply MD5 checks. No spaces between entries!" +set(SRB2_ASSETS_GAME + "main.kart" + "gfx.pk3" + "textures.pk3" + "chars.pk3" + "maps.pk3" + "followers.pk3" + "patch.pk3" ) +list(TRANSFORM SRB2_ASSETS_GAME PREPEND "/") +list(TRANSFORM SRB2_ASSETS_GAME PREPEND "${SRB2_ASSET_DIRECTORY_ABSOLUTE}") -set(SRB2_ASSET_DOCS -"README.txt;\ -HISTORY.txt;\ -LICENSE.txt;\ -LICENSE-3RD-PARTY.txt;\ -README-SDL.txt" - CACHE STRING "Documentation filenames. In OS X, these are packaged separately from other assets. No spaces between entries!" -) - -PREPEND(SRB2_ASSET_DOCS ${SRB2_ASSET_DIRECTORY} ${SRB2_ASSET_DOCS}) - -foreach(SRB2_ASSET ${SRB2_ASSET_HASHED}) - file(MD5 ${SRB2_ASSET_DIRECTORY}/${SRB2_ASSET} "SRB2_ASSET_${SRB2_ASSET}_HASH") - set(SRB2_ASSET_${SRB2_ASSET}_HASH ${SRB2_ASSET_${SRB2_ASSET}_HASH} PARENT_SCOPE) -endforeach() +set(SRB2_ASSETS ${SRB2_ASSET_DOCS} ${SRB2_ASSETS_GAME}) # Installation if(${CMAKE_SYSTEM} MATCHES Darwin) get_target_property(outname SRB2SDL2 OUTPUT_NAME) - if(${SRB2_ASSET_INSTALL}) - install(DIRECTORY "${SRB2_ASSET_DIRECTORY}/" - DESTINATION "${outname}.app/Contents/Resources" - ) - endif() - # Always install the doc files, even in non-asset packages. - install(FILES ${SRB2_ASSET_DOCS} - DESTINATION . - OPTIONAL - ) + install(FILES ${SRB2_ASSETS} DESTINATION "${outname}.app/Contents/Resources") + install(DIRECTORY "${SRB2_ASSET_DIRECTORY_ABSOLUTE}/models" DESTINATION "${outname}.app/Contents/Resources") + install(FILES ${SRB2_ASSETS_DOCS} DESTINATION .) else() - if(${SRB2_ASSET_INSTALL}) - install(DIRECTORY "${SRB2_ASSET_DIRECTORY}/" - DESTINATION . - ) - # Docs are assumed to be located in SRB2_ASSET_DIRECTORY, so don't install them in their own call. - else() - # Always install the doc files, even in non-asset packages. - install(FILES ${SRB2_ASSET_DOCS} - DESTINATION . - OPTIONAL - ) - endif() + install(FILES ${SRB2_ASSETS} DESTINATION .) + install(DIRECTORY "${SRB2_ASSET_DIRECTORY_ABSOLUTE}/models" DESTINATION .) endif() diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake new file mode 100644 index 000000000..772103fc3 --- /dev/null +++ b/cmake/CPM.cmake @@ -0,0 +1,21 @@ +set(CPM_DOWNLOAD_VERSION 0.36.0) + +if(CPM_SOURCE_CACHE) + set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +elseif(DEFINED ENV{CPM_SOURCE_CACHE}) + set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +else() + set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +endif() + +# Expand relative path. This is important if the provided path contains a tilde (~) +get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE) +if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION})) + message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}") + file(DOWNLOAD + https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake + ${CPM_DOWNLOAD_LOCATION} + ) +endif() + +include(${CPM_DOWNLOAD_LOCATION}) diff --git a/cmake/Modules/FindDiscordRPC.cmake b/cmake/Modules/FindDiscordRPC.cmake index e71762767..2d3c987c1 100644 --- a/cmake/Modules/FindDiscordRPC.cmake +++ b/cmake/Modules/FindDiscordRPC.cmake @@ -21,3 +21,13 @@ find_library(DISCORDRPC_LIBRARY set(DISCORDRPC_PROCESS_INCLUDES DISCORDRPC_INCLUDE_DIR) set(DISCORDRPC_PROCESS_LIBS DISCORDRPC_LIBRARY) libfind_process(DISCORDRPC) + +if(DISCORDRPC_FOUND AND NOT TARGET DiscordRPC::DiscordRPC) + add_library(DiscordRPC::DiscordRPC UNKNOWN IMPORTED) + set_target_properties( + DiscordRPC::DiscordRPC + PROPERTIES + IMPORTED_LOCATION "${DISCORDRPC_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${DISCORDRPC_INCLUDE_DIR}" + ) +endif() diff --git a/cmake/Modules/FindGME.cmake b/cmake/Modules/FindGME.cmake index ea80af454..3af0a94be 100644 --- a/cmake/Modules/FindGME.cmake +++ b/cmake/Modules/FindGME.cmake @@ -20,4 +20,14 @@ find_library(GME_LIBRARY set(GME_PROCESS_INCLUDES GME_INCLUDE_DIR) set(GME_PROCESS_LIBS GME_LIBRARY) -libfind_process(GME) \ No newline at end of file +libfind_process(GME) + +if(GME_FOUND AND NOT TARGET gme) + add_library(gme UNKNOWN IMPORTED) + set_target_properties( + gme + PROPERTIES + IMPORTED_LOCATION "${GME_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${GME_INCLUDE_DIR}" + ) +endif() diff --git a/cmake/Modules/FindOPENMPT.cmake b/cmake/Modules/FindOPENMPT.cmake index 2d334b6f0..7e5b2d5a3 100644 --- a/cmake/Modules/FindOPENMPT.cmake +++ b/cmake/Modules/FindOPENMPT.cmake @@ -20,4 +20,14 @@ find_library(OPENMPT_LIBRARY set(OPENMPT_PROCESS_INCLUDES OPENMPT_INCLUDE_DIR) set(OPENMPT_PROCESS_LIBS OPENMPT_LIBRARY) -libfind_process(OPENMPT) \ No newline at end of file +libfind_process(OPENMPT) + +if(OPENMPT_FOUND AND NOT TARGET openmpt) + add_library(openmpt UNKNOWN IMPORTED) + set_target_properties( + openmpt + PROPERTIES + IMPORTED_LOCATION "${OPENMPT_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${OPENMPT_INCLUDE_DIR}" + ) +endif() diff --git a/cmake/Modules/FindSDL2.cmake b/cmake/Modules/FindSDL2.cmake index 2fc833cef..2d625f84c 100644 --- a/cmake/Modules/FindSDL2.cmake +++ b/cmake/Modules/FindSDL2.cmake @@ -31,3 +31,13 @@ find_library(SDL2_LIBRARY set(SDL2_PROCESS_INCLUDES SDL2_INCLUDE_DIR) set(SDL2_PROCESS_LIBS SDL2_LIBRARY) libfind_process(SDL2) + +if(SDL2_FOUND AND NOT TARGET SDL2::SDL2) + add_library(SDL2::SDL2 UNKNOWN IMPORTED) + set_target_properties( + SDL2::SDL2 + PROPERTIES + IMPORTED_LOCATION "${SDL2_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" + ) +endif() diff --git a/cmake/Modules/FindSDL2_mixer.cmake b/cmake/Modules/FindSDL2_mixer.cmake index 9af3e26dd..637498e53 100644 --- a/cmake/Modules/FindSDL2_mixer.cmake +++ b/cmake/Modules/FindSDL2_mixer.cmake @@ -32,3 +32,13 @@ find_library(SDL2_MIXER_LIBRARY set(SDL2_MIXER_PROCESS_INCLUDES SDL2_MIXER_INCLUDE_DIR) set(SDL2_MIXER_PROCESS_LIBS SDL2_MIXER_LIBRARY) libfind_process(SDL2_MIXER) + +if(SDL2_MIXER_FOUND AND NOT TARGET SDL2_mixer::SDL2_mixer) + add_library(SDL2_mixer::SDL2_mixer UNKNOWN IMPORTED) + set_target_properties( + SDL2_mixer::SDL2_mixer + PROPERTIES + IMPORTED_LOCATION "${SDL2_MIXER_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_MIXER_INCLUDE_DIR}" + ) +endif() diff --git a/cmake/launch-c.in b/cmake/launch-c.in deleted file mode 100644 index c60558232..000000000 --- a/cmake/launch-c.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -export CCACHE_CPP2=true -exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@" diff --git a/cmake/launch-cxx.in b/cmake/launch-cxx.in deleted file mode 100644 index c60558232..000000000 --- a/cmake/launch-cxx.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -export CCACHE_CPP2=true -exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d08fe0faa..5b681d042 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,12 @@ -# SRB2 Core - add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32) +if("${CMAKE_COMPILER_IS_GNUCC}" AND "${CMAKE_SYSTEM_NAME}" MATCHES "Windows" AND NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}" AND NOT "${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}") + # On MinGW with internal libraries, link the standard library statically + target_link_options(SRB2SDL2 PRIVATE "-static") +endif() + +set_property(TARGET SRB2SDL2 PROPERTY C_STANDARD 11) + # Core sources target_sourcefile(c) target_sources(SRB2SDL2 PRIVATE comptime.c md5.c config.h.in) @@ -11,110 +16,56 @@ set(SRB2_ASM_SOURCES vid_copy.s) set(SRB2_NASM_SOURCES tmap_mmx.nas tmap.nas) ### Configuration -set(SRB2_CONFIG_HAVE_PNG ON CACHE BOOL - "Enable PNG support. Depends on zlib, so will be disabled if you don't enable that too.") -set(SRB2_CONFIG_HAVE_ZLIB ON CACHE BOOL - "Enable zlib support.") -set(SRB2_CONFIG_HAVE_GME ON CACHE BOOL - "Enable GME support.") -set(SRB2_CONFIG_HAVE_DISCORDRPC OFF CACHE BOOL - "Enable Discord rich presence support.") -set(SRB2_CONFIG_HAVE_CURL ON CACHE BOOL - "Enable cURL support, used for downloading files via HTTP.") -set(SRB2_CONFIG_HAVE_OPENMPT ON CACHE BOOL - "Enable OpenMPT support.") -set(SRB2_CONFIG_HAVE_CURL ON CACHE BOOL - "Enable curl support.") -set(SRB2_CONFIG_HAVE_THREADS ON CACHE BOOL - "Enable multithreading support.") -if(${CMAKE_SYSTEM} MATCHES Windows) - set(SRB2_CONFIG_HAVE_MIXERX ON CACHE BOOL - "Enable SDL Mixer X support.") -else() - set(SRB2_CONFIG_HAVE_MIXERX OFF) -endif() -set(SRB2_CONFIG_HWRENDER ON CACHE BOOL - "Enable hardware rendering through OpenGL.") set(SRB2_CONFIG_USEASM OFF CACHE BOOL "Enable NASM tmap implementation for software mode speedup.") set(SRB2_CONFIG_YASM OFF CACHE BOOL "Use YASM in place of NASM.") -set(SRB2_CONFIG_STATIC_OPENGL OFF CACHE BOOL - "Use statically linked OpenGL. NOT RECOMMENDED.") set(SRB2_CONFIG_DEV_BUILD OFF CACHE BOOL "Compile a development build of SRB2Kart.") -### use internal libraries? -if(${CMAKE_SYSTEM} MATCHES "Windows") ###set on Windows only - set(SRB2_CONFIG_USE_INTERNAL_LIBRARIES OFF CACHE BOOL - "Use SRB2Kart's internal copies of required dependencies (SDL2, PNG, zlib, GME, OpenMPT, cURL).") -endif() - add_subdirectory(blua) -if(${SRB2_CONFIG_HAVE_GME}) - if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) - set(GME_FOUND ON) - set(GME_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/gme/include) - if(${SRB2_SYSTEM_BITS} EQUAL 64) - set(GME_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/gme/win64 -lgme") - else() # 32-bit - set(GME_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/gme/win32 -lgme") - endif() - else() - find_package(GME) - endif() - if(${GME_FOUND}) - set(SRB2_HAVE_GME ON) - target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_GME) - else() - message(WARNING "You have specified that GME is available but it was not found.") +# OS macros +if (UNIX) + target_compile_definitions(SRB2SDL2 PRIVATE -DUNIXCOMMON) +endif() + +if(CMAKE_COMPILER_IS_GNUCC) + find_program(OBJCOPY objcopy) +endif() + +if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") + target_compile_definitions(SRB2SDL2 PRIVATE -DLINUX) + if(${SRB2_SYSTEM_BITS} EQUAL 64) + target_compile_definitions(SRB2SDL2 PRIVATE -DLINUX64) endif() endif() -if(${SRB2_CONFIG_HAVE_OPENMPT}) - if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) - set(OPENMPT_FOUND ON) - set(OPENMPT_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/libopenmpt/inc) - if(${SRB2_SYSTEM_BITS} EQUAL 64) - set(OPENMPT_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/libopenmpt/lib/x86_64/mingw -lopenmpt") - else() # 32-bit - set(OPENMPT_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/libopenmpt/lib/x86/mingw -lopenmpt") - endif() - else() - find_package(OPENMPT) - endif() - if(${OPENMPT_FOUND}) - set(SRB2_HAVE_OPENMPT ON) - target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_OPENMPT) - else() - message(WARNING "You have specified that OpenMPT is available but it was not found.") - endif() +if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") + target_compile_definitions(SRB2SDL2 PRIVATE -DMACOSX) endif() -if(${SRB2_CONFIG_HAVE_MIXERX}) - if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) - set(MIXERX_FOUND ON) - set(MIXERX_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/SDLMixerX/i686-w64-mingw32/include/SDL2) - if(${SRB2_SYSTEM_BITS} EQUAL 64) - set(MIXERX_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/SDLMixerX/x86_64-w64-mingw32/lib -lSDL2_mixer_ext") - else() # 32-bit - set(MIXERX_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/SDLMixerX/i686-w64-mingw32/lib -lSDL2_mixer_ext") - endif() - else() - # No support for non-Windows (yet?) - #find_package(MIXERX) - message(WARNING "SDL Mixer X is not supported as an external library.") - set(MIXERX_FOUND OFF) - endif() - if(${MIXERX_FOUND}) - set(SRB2_HAVE_MIXERX ON) - target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_MIXERX) - else() - message(WARNING "You have specified that SDL Mixer X is available but it was not found.") - endif() +target_link_libraries(SRB2SDL2 PRIVATE gme) +target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_GME) +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + # this sucks but gme doesn't use modern cmake to delineate public headers + target_include_directories(SRB2SDL2 PRIVATE "${libgme_SOURCE_DIR}") endif() +target_link_libraries(SRB2SDL2 PRIVATE openmpt) +target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_OPENMPT) + +target_link_libraries(SRB2SDL2 PRIVATE ZLIB::ZLIB PNG::PNG CURL::libcurl) +target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_ZLIB -DHAVE_PNG -DHAVE_CURL -D_LARGEFILE64_SOURCE) +target_sources(SRB2SDL2 PRIVATE apng.c) + +target_link_libraries(SRB2SDL2 PRIVATE DiscordRPC::DiscordRPC) +target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_DISCORDRPC -DUSE_STUN) +target_sources(SRB2SDL2 PRIVATE discord.c stun.c) + +set(SRB2_HAVE_THREADS ON) +target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_THREADS) + if(${SRB2_CONFIG_HAVE_DISCORDRPC}) if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) set(DISCORDRPC_FOUND ON) @@ -182,49 +133,32 @@ if(${SRB2_CONFIG_HAVE_PNG} AND ${SRB2_CONFIG_HAVE_ZLIB}) endif() endif() -if(${SRB2_CONFIG_HAVE_CURL}) - if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) - set(CURL_FOUND ON) - set(CURL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/curl/include) - if(${SRB2_SYSTEM_BITS} EQUAL 64) - set(CURL_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/curl/lib64 -lcurl") - else() # 32-bit - set(CURL_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/curl/lib32 -lcurl") - endif() - else() - find_package(CURL) - endif() - if(${CURL_FOUND}) - set(SRB2_HAVE_CURL ON) - target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_CURL) - else() - message(WARNING "You have specified that CURL is available but it was not found. SRB2Kart may not compile correctly.") - endif() -endif() - -if(${SRB2_CONFIG_HAVE_THREADS}) - set(SRB2_HAVE_THREADS ON) - target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_THREADS) -endif() - -if(${SRB2_CONFIG_HWRENDER}) +if("${SRB2_CONFIG_HWRENDER}") target_compile_definitions(SRB2SDL2 PRIVATE -DHWRENDER) add_subdirectory(hardware) + + if("${SRB2_CONFIG_STATIC_OPENGL}") + find_package(OpenGL) + if(${OPENGL_FOUND}) + target_compile_definitions(SRB2SDL2 PRIVATE -DSTATIC_OPENGL) + else() + message(WARNING "You have specified static opengl but opengl was not found. Not setting HWRENDER.") + endif() + endif() endif() -if(${SRB2_CONFIG_HWRENDER} AND ${SRB2_CONFIG_STATIC_OPENGL}) - find_package(OpenGL) - if(${OPENGL_FOUND}) - target_compile_definitions(SRB2SDL2 PRIVATE -DHWRENDER) - target_compile_definitions(SRB2SDL2 PRIVATE -DSTATIC_OPENGL) - else() - message(WARNING "You have specified static opengl but opengl was not found. Not setting HWRENDER.") - endif() +# TODO: build this with the game +if(${CMAKE_SYSTEM} MATCHES Windows AND ${CMAKE_C_COMPILER_ID} MATCHES "GNU" AND ${SRB2_SYSTEM_BITS} EQUAL 32) + target_link_libraries(SRB2SDL2 PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/../libs/drmingw/lib/win32/libexchndl.a" + "${CMAKE_CURRENT_SOURCE_DIR}/../libs/drmingw/lib/win32/libmgwhelp.a" + ) + target_include_directories(SRB2SDL2 PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../libs/drmingw/include") endif() if(${SRB2_CONFIG_USEASM}) #SRB2_ASM_FLAGS can be used to pass flags to either nasm or yasm. - if(${CMAKE_SYSTEM} MATCHES "Linux") + if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") set(SRB2_ASM_FLAGS "-DLINUX ${SRB2_ASM_FLAGS}") endif() @@ -240,7 +174,7 @@ if(${SRB2_CONFIG_USEASM}) set(SRB2_USEASM ON) target_compile_definitions(SRB2SDL2 PRIVATE -DUSEASM) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse3 -mfpmath=sse") + target_compile_options(SRB2SDL2 PRIVATE -msse3 -mfpmath=sse) target_sources(SRB2SDL2 PRIVATE ${SRB2_ASM_SOURCES} ${SRB2_NASM_SOURCES}) @@ -253,7 +187,7 @@ endif() # If using CCACHE, then force it. # https://github.com/Cockatrice/Cockatrice/pull/3052/files -if (${CMAKE_SYSTEM} MATCHES "Darwin") +if ("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE) if(RULE_LAUNCH_COMPILE) MESSAGE(STATUS "Force enabling CCache usage under macOS") @@ -275,35 +209,171 @@ endif() # Compatibility flag with later versions of GCC # We should really fix our code to not need this if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -mno-ms-bitfields) + target_compile_options(SRB2SDL2 PRIVATE -mno-ms-bitfields) endif() -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -Wno-absolute-value) +# Compiler warnings configuration +target_compile_options(SRB2SDL2 PRIVATE + # Using generator expressions to handle per-language compile options + + # C, GNU + # This is a direct translation from versions.mk + $<$,$>: + -Wall + -Wno-trigraphs + -W # Was controlled by RELAXWARNINGS + -pedantic + -Wfloat-equal + -Wundef + -Wpointer-arith + -Wbad-function-cast + -Wcast-qual + -Wcast-align # Was controlled by NOCASTALIGNWARN + -Wwrite-strings + -Wsign-compare + -Wmissing-prototypes + -Wmissing-declarations + -Wmissing-noreturn + -Wnested-externs + -Winline + -Wformat-y2k + -Wformat-security + + $<$,2.9.5>: + -Wno-div-by-zero + -Wendif-labels + -Wdisabled-optimization + > + + $<$,4.0.0>: + -Wold-style-definition + -Wmissing-field-initializers + > + + $<$,4.1.0>: + -Wshadow + > + + $<$,4.3.0>: + -funit-at-a-time + -Wlogical-op + > + + $<$,4.5.0>: + -Wlogical-op + -Wno-error=array-bounds + > + + $<$,4.6.0>: + -Wno-suggest-attribute=noreturn + -Wno-error=suggest-attribute=noreturn + > + + $<$,5.4.0>: + -Wno-logical-op + -Wno-error=logical-op + > + + $<$,6.1.0>: + -Wno-tautological-compare + -Wno-error=tautological-compare + > + + $<$,7.1.0>: + -Wno-error=format-overflow=2 + -Wimplicit-fallthrough=4 + > + + $<$,8.1.0>: + -Wno-error=format-overflow + -Wno-error=stringop-truncation + -Wno-error=stringop-overflow + -Wno-format-overflow + -Wno-stringop-truncation + -Wno-stringop-overflow + -Wno-error=multistatement-macros + > + + $<$,9.1.0>: + -Wno-error=address-of-packed-member + > + > + + # C, Clang and Apple Clang + $<$,$,$>>: + -Wall + -Wno-absolute-value + -Wno-trigraphs + -Wno-error=non-literal-null-conversion + -Wno-error=constant-conversion + -Wno-error=unused-but-set-variable + > + + # C, MSVC + $<$,$>: + # All warnings at and before Visual Studio 2019 RTM + # https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warnings-by-compiler-version?view=msvc-170 + /Wv:19.20.27004.0 + > + + # C++, GNU, Clang and Apple Clang + $<$,$,$,$>>: + -Wall + > + + # C++, MSVC + $<$,$>: + /Wv:19.20.27004.0 + > +) +if(SRB2_CONFIG_ERRORMODE) + target_compile_options(SRB2SDL2 PRIVATE + $<$,$,$>: + -Werror + > + + $<$: + /WX + > + ) endif() +# Link warnings configuration +target_link_options(SRB2SDL2 PRIVATE + $<$: + # -Wl,--as-needed - Was controlled by NOLDWARNING + > +) + if(${SRB2_CONFIG_DEV_BUILD}) target_compile_definitions(SRB2SDL2 PRIVATE -DDEVELOP) endif() - -set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -Wno-trigraphs) - target_compile_definitions(SRB2SDL2 PRIVATE -DCMAKECONFIG) -#add_library(SRB2Core STATIC -# ${SRB2_CORE_SOURCES} -# ${SRB2_CORE_HEADERS} -# ${SRB2_CORE_RENDER_SOURCES} -# ${SRB2_CORE_GAME_SOURCES} -# ${SRB2_LUA_SOURCES} -# ${SRB2_LUA_HEADERS} -# ${SRB2_BLUA_SOURCES} -# ${SRB2_BLUA_HEADERS} -#) +# Misc. build options from Makefiles +if(SRB2_CONFIG_DEBUGMODE) + target_compile_definitions(SRB2SDL2 PRIVATE -DZDEBUG -DPARANOIA -DRANGECHECK -DPACKETDROP) +endif() +if(SRB2_CONFIG_MOBJCONSISTANCY) + target_compile_definitions(SRB2SDL2 PRIVATE -DMOBJCONSISTANCY) +endif() +if(SRB2_CONFIG_PACKETDROP) + target_compile_definitions(SRB2SDL2 PRIVATE -DPACKETDROP) +endif() +if(SRB2_CONFIG_ZDEBUG) + target_compile_definitions(SRB2SDL2 PRIVATE -DZDEBUG) +endif() +if(SRB2_CONFIG_PROFILEMODE AND "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") + target_compile_options(SRB2SDL2 PRIVATE -pg) + target_link_options(SRB2SDL2 PRIVATE -pg) +endif() -## strip debug symbols into separate file when using gcc. -## to be consistent with Makefile, don't generate for OS X. -if((CMAKE_COMPILER_IS_GNUCC) AND NOT (${CMAKE_SYSTEM} MATCHES Darwin)) +add_subdirectory(sdl) +add_subdirectory(objects) + +# strip debug symbols into separate file when using gcc. +# to be consistent with Makefile, don't generate for OS X. +if((CMAKE_COMPILER_IS_GNUCC) AND NOT ("${CMAKE_SYSTEM_NAME}" MATCHES Darwin)) if((${CMAKE_BUILD_TYPE} MATCHES Debug) OR (${CMAKE_BUILD_TYPE} MATCHES RelWithDebInfo)) if(${CMAKE_BUILD_TYPE} MATCHES Debug) set(OBJCOPY_ONLY_KEEP_DEBUG "--only-keep-debug") @@ -317,9 +387,26 @@ if((CMAKE_COMPILER_IS_GNUCC) AND NOT (${CMAKE_SYSTEM} MATCHES Darwin)) endif() endif() -add_subdirectory(sdl) -add_subdirectory(objects) +# copy DLLs to bin/ directory if building internal shared on windows +if("${CMAKE_SYSTEM_NAME}" STREQUAL Windows AND NOT "${SRB2_CONFIG_INTERNAL_LIBRARIES}" AND "${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}") + set(ADDITIONAL_DLLS "") + if("${CMAKE_C_COMPILER_ID}" STREQUAL GNU) + # also copy implicitly linked system libraries + get_filename_component(MINGW_BIN_PATH ${CMAKE_CXX_COMPILER} PATH) + list(APPEND ADDITIONAL_DLLS + "libgcc_s_dw2-1.dll" + "libstdc++-6.dll" + "libwinpthread-1.dll" + ) + list(TRANSFORM ADDITIONAL_DLLS PREPEND "${MINGW_BIN_PATH}/") + endif() + add_custom_command(TARGET SRB2SDL2 POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + ${ADDITIONAL_DLLS} -if(NOT ${SRB2_SDL2_AVAILABLE}) - message(FATAL_ERROR "There are no targets available to build an SRB2Kart executable. :(") + $ + COMMAND_EXPAND_LISTS + COMMENT "Copying runtime DLLs" + ) endif() diff --git a/src/am_map.h b/src/am_map.h index 1c8fa70e4..596a17d46 100644 --- a/src/am_map.h +++ b/src/am_map.h @@ -16,15 +16,15 @@ #include "d_event.h" -typedef struct +struct fpoint_t { INT32 x, y; -} fpoint_t; +}; -typedef struct +struct fline_t { fpoint_t a, b; -} fline_t; +}; extern boolean am_recalc; // true if screen size changes extern boolean automapactive; // In AutoMap mode? diff --git a/src/command.h b/src/command.h index 35330d5d4..6715d66a0 100644 --- a/src/command.h +++ b/src/command.h @@ -79,14 +79,14 @@ void COM_Init(void); // Variable sized buffers // ====================== -typedef struct vsbuf_s +struct vsbuf_t { boolean allowoverflow; // if false, do a I_Error boolean overflowed; // set to true if the buffer size failed UINT8 *data; size_t maxsize; size_t cursize; -} vsbuf_t; +}; void VS_Alloc(vsbuf_t *buf, size_t initsize); void VS_Free(vsbuf_t *buf); @@ -127,13 +127,13 @@ typedef enum CV_NOLUA = 4096,/* don't let this be called from Lua */ } cvflags_t; -typedef struct CV_PossibleValue_s +struct CV_PossibleValue_t { INT32 value; const char *strvalue; -} CV_PossibleValue_t; +}; -typedef struct consvar_s //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NULL +struct consvar_t //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NULL { const char *name; const char *defaultvalue; @@ -157,8 +157,8 @@ typedef struct consvar_s //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NUL UINT16 netid; // used internaly : netid for send end receive // used only with CV_NETVAR char changed; // has variable been changed by the user? 0 = no, 1 = yes - struct consvar_s *next; -} consvar_t; + consvar_t *next; +}; /* name, defaultvalue, flags, PossibleValue, func */ #define CVAR_INIT( ... ) \ diff --git a/src/config.h.in b/src/config.h.in index c27628ffd..d7b67cdce 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -11,15 +11,6 @@ #ifdef CMAKECONFIG -#define ASSET_HASH_MAIN_KART "${SRB2_ASSET_main.kart_HASH}" -#define ASSET_HASH_GFX_PK3 "${SRB2_ASSET_gfx.pk3_HASH}" -#define ASSET_HASH_TEXTURES_PK3 "${SRB2_ASSET_textures.pk3_HASH}" -#define ASSET_HASH_CHARS_PK3 "${SRB2_ASSET_chars.pk3_HASH}" -#define ASSET_HASH_MAPS_PK3 "${SRB2_ASSET_maps.pk3_HASH}" -#ifdef USE_PATCH_FILE -#define ASSET_HASH_PATCH_PK3 "${SRB2_ASSET_patch.pk3_HASH}" -#endif - #define SRB2_COMP_REVISION "${SRB2_COMP_REVISION}" #define SRB2_COMP_BRANCH "${SRB2_COMP_BRANCH}" // This is done with configure_file instead of defines in order to avoid @@ -29,9 +20,7 @@ #define COMPVERSION_UNCOMMITTED #endif -#define CMAKE_ASSETS_DIR "${CMAKE_SOURCE_DIR}/assets" - -#else +#endif /* Manually defined asset hashes for non-CMake builds * Last updated 2019 / 01 / 18 - Kart v1.0.2 - Main assets @@ -48,4 +37,3 @@ #endif #endif -#endif \ No newline at end of file diff --git a/src/d_clisrv.h b/src/d_clisrv.h index eb11ca04a..42393da1b 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -130,43 +130,43 @@ void Command_Numnodes(void); #endif // Client to server packet -typedef struct +struct clientcmd_pak { UINT8 client_tic; UINT8 resendfrom; INT16 consistancy; ticcmd_t cmd; -} ATTRPACK clientcmd_pak; +} ATTRPACK; // Splitscreen packet // WARNING: must have the same format of clientcmd_pak, for more easy use -typedef struct +struct client2cmd_pak { UINT8 client_tic; UINT8 resendfrom; INT16 consistancy; ticcmd_t cmd, cmd2; -} ATTRPACK client2cmd_pak; +} ATTRPACK; // 3P Splitscreen packet // WARNING: must have the same format of clientcmd_pak, for more easy use -typedef struct +struct client3cmd_pak { UINT8 client_tic; UINT8 resendfrom; INT16 consistancy; ticcmd_t cmd, cmd2, cmd3; -} ATTRPACK client3cmd_pak; +} ATTRPACK; // 4P Splitscreen packet // WARNING: must have the same format of clientcmd_pak, for more easy use -typedef struct +struct client4cmd_pak { UINT8 client_tic; UINT8 resendfrom; INT16 consistancy; ticcmd_t cmd, cmd2, cmd3, cmd4; -} ATTRPACK client4cmd_pak; +} ATTRPACK; #ifdef _MSC_VER #pragma warning(disable : 4200) @@ -174,15 +174,15 @@ typedef struct // Server to client packet // this packet is too large -typedef struct +struct servertics_pak { UINT8 starttic; UINT8 numtics; UINT8 numslots; // "Slots filled": Highest player number in use plus one. ticcmd_t cmds[45]; // Normally [BACKUPTIC][MAXPLAYERS] but too large -} ATTRPACK servertics_pak; +} ATTRPACK; -typedef struct +struct serverconfig_pak { UINT8 version; // Different versions don't work UINT8 subversion; // Contains build version @@ -204,9 +204,9 @@ typedef struct UINT8 maxplayer; boolean allownewplayer; boolean discordinvites; -} ATTRPACK serverconfig_pak; +} ATTRPACK; -typedef struct +struct filetx_pak { UINT8 fileid; UINT32 filesize; @@ -214,21 +214,21 @@ typedef struct UINT32 position; UINT16 size; UINT8 data[]; // Size is variable using hardware_MAXPACKETLENGTH -} ATTRPACK filetx_pak; +} ATTRPACK; -typedef struct +struct fileacksegment_t { UINT32 start; UINT32 acks; -} ATTRPACK fileacksegment_t; +} ATTRPACK; -typedef struct +struct fileack_pak { UINT8 fileid; UINT8 iteration; UINT8 numsegments; fileacksegment_t segments[]; -} ATTRPACK fileack_pak; +} ATTRPACK; #ifdef _MSC_VER #pragma warning(default : 4200) @@ -236,7 +236,7 @@ typedef struct #define MAXAPPLICATION 16 -typedef struct +struct clientconfig_pak { UINT8 _255;/* see serverinfo_pak */ UINT8 packetversion; @@ -246,7 +246,7 @@ typedef struct UINT8 localplayers; // number of splitscreen players UINT8 mode; char names[MAXSPLITSCREENPLAYERS][MAXPLAYERNAME]; -} ATTRPACK clientconfig_pak; +} ATTRPACK; #define SV_SPEEDMASK 0x03 // used to send kartspeed #define SV_DEDICATED 0x40 // server is dedicated @@ -256,7 +256,7 @@ typedef struct #define MAXFILENEEDED 915 #define MAX_MIRROR_LENGTH 256 // This packet is too large -typedef struct +struct serverinfo_pak { /* In the old packet, 'version' is the first field. Now that field is set @@ -289,27 +289,27 @@ typedef struct char httpsource[MAX_MIRROR_LENGTH]; // HTTP URL to download from, always defined for compatibility INT16 avgpwrlv; // Kart avg power level UINT8 fileneeded[MAXFILENEEDED]; // is filled with writexxx (byteptr.h) -} ATTRPACK serverinfo_pak; +} ATTRPACK; -typedef struct +struct serverrefuse_pak { char reason[255]; -} ATTRPACK serverrefuse_pak; +} ATTRPACK; -typedef struct +struct askinfo_pak { UINT8 version; tic_t time; // used for ping evaluation -} ATTRPACK askinfo_pak; +} ATTRPACK; -typedef struct +struct msaskinfo_pak { char clientaddr[22]; tic_t time; // used for ping evaluation -} ATTRPACK msaskinfo_pak; +} ATTRPACK; // Shorter player information for external use. -typedef struct +struct plrinfo { UINT8 num; char name[MAXPLAYERNAME+1]; @@ -319,10 +319,10 @@ typedef struct UINT8 data; // Color is first four bits, hasflag, isit and issuper have one bit each, the last is unused. UINT32 score; UINT16 timeinserver; // In seconds. -} ATTRPACK plrinfo; +} ATTRPACK; // Shortest player information for join during intermission. -typedef struct +struct plrconfig { char name[MAXPLAYERNAME+1]; UINT8 skin; @@ -330,20 +330,20 @@ typedef struct UINT32 pflags; UINT32 score; UINT8 ctfteam; -} ATTRPACK plrconfig; +} ATTRPACK; -typedef struct +struct filesneededconfig_pak { INT32 first; UINT8 num; UINT8 more; UINT8 files[MAXFILENEEDED]; // is filled with writexxx (byteptr.h) -} ATTRPACK filesneededconfig_pak; +} ATTRPACK; // // Network packet data // -typedef struct +struct doomdata_t { UINT32 checksum; UINT8 ack; // If not zero the node asks for acknowledgement, the receiver must resend the ack @@ -375,18 +375,18 @@ typedef struct filesneededconfig_pak filesneededcfg; // ??? bytes UINT32 pingtable[MAXPLAYERS+1]; // 68 bytes } u; // This is needed to pack diff packet types data together -} ATTRPACK doomdata_t; +} ATTRPACK; #if defined(_MSC_VER) #pragma pack() #endif #define MAXSERVERLIST (MAXNETNODES-1) -typedef struct +struct serverelem_t { SINT8 node; serverinfo_pak info; -} serverelem_t; +}; extern serverelem_t serverlist[MAXSERVERLIST]; extern UINT32 serverlistcount; @@ -528,7 +528,7 @@ extern boolean hu_stopped; // SRB2Kart // -typedef struct rewind_s { +struct rewind_t { UINT8 savebuffer[(768*1024)]; tic_t leveltime; size_t demopos; @@ -536,8 +536,8 @@ typedef struct rewind_s { ticcmd_t oldcmd[MAXPLAYERS]; mobj_t oldghost[MAXPLAYERS]; - struct rewind_s *next; -} rewind_t; + rewind_t *next; +}; void CL_ClearRewinds(void); rewind_t *CL_SaveRewindPoint(size_t demopos); diff --git a/src/d_event.h b/src/d_event.h index 5a8c915a3..3ae1010c4 100644 --- a/src/d_event.h +++ b/src/d_event.h @@ -28,14 +28,14 @@ typedef enum } evtype_t; // Event structure. -typedef struct +struct event_t { evtype_t type; INT32 data1; // keys / mouse/joystick buttons INT32 data2; // mouse/joystick x move INT32 data3; // mouse/joystick y move INT32 device; // which player's device it belongs to -} event_t; +}; // // GLOBAL VARIABLES diff --git a/src/d_main.c b/src/d_main.c index bd63cd874..fe5046585 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -373,6 +373,9 @@ static void D_Display(void) if (dedicated) //bail out after wipe logic return; + // Catch runaway clipping rectangles. + V_ClearClipRect(); + // do buffered drawing switch (gamestate) { @@ -1203,7 +1206,11 @@ D_ConvertVersionNumbers (void) void D_SRB2Main(void) { INT32 i, p; - INT32 pstartmap = 0; +#ifdef DEVELOP + INT32 pstartmap = 1; // default to first loaded map (Test Run) +#else + INT32 pstartmap = 0; // default to random map (0 is not a valid map number) +#endif boolean autostart = false; /* break the version string into version numbers, for netplay */ diff --git a/src/d_net.c b/src/d_net.c index 5978fef5d..3799ecd13 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -192,9 +192,9 @@ typedef struct UINT8 nextacknum; UINT8 flags; -} node_t; +} netnode_t; -static node_t nodes[MAXNETNODES]; +static netnode_t nodes[MAXNETNODES]; #define NODETIMEOUT 14 // return <0 if a < b (mod 256) @@ -218,7 +218,7 @@ FUNCMATH static INT32 cmpack(UINT8 a, UINT8 b) */ static boolean GetFreeAcknum(UINT8 *freeack, boolean lowtimer) { - node_t *node = &nodes[doomcom->remotenode]; + netnode_t *node = &nodes[doomcom->remotenode]; INT32 i, numfreeslot = 0; if (cmpack((UINT8)((node->remotefirstack + MAXACKTOSEND) % 256), node->nextacknum) < 0) @@ -325,7 +325,7 @@ static boolean Processackpak(void) { INT32 i; boolean goodpacket = true; - node_t *node = &nodes[doomcom->remotenode]; + netnode_t *node = &nodes[doomcom->remotenode]; // Received an ack return, so remove the ack in the list if (netbuffer->ackreturn && cmpack(node->remotefirstack, netbuffer->ackreturn) < 0) @@ -492,7 +492,7 @@ void Net_AckTicker(void) for (i = 0; i < MAXACKPACKETS; i++) { const INT32 nodei = ackpak[i].destinationnode; - node_t *node = &nodes[nodei]; + netnode_t *node = &nodes[nodei]; if (ackpak[i].acknum && ackpak[i].senttime + NODETIMEOUT < I_GetTime()) { if (ackpak[i].resentnum > 20 && (node->flags & NF_CLOSE)) @@ -612,7 +612,7 @@ void Net_WaitAllAckReceived(UINT32 timeout) } } -static void InitNode(node_t *node) +static void InitNode(netnode_t *node) { node->acktosend_head = node->acktosend_tail = 0; node->firstacktosend = 0; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index a6b11d694..57385dc5c 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -219,22 +219,22 @@ extern const char *netxcmdnames[MAXNETXCMD - 1]; //Packet composition for Command_TeamChange_f() ServerTeamChange, etc. //bitwise structs make packing bits a little easier, but byte alignment harder? //todo: decide whether to make the other netcommands conform, or just get rid of this experiment. -typedef struct { +struct changeteam_packet_t { UINT32 playernum : 5; // value 0 to 31 UINT32 newteam : 5; // value 0 to 31 UINT32 verification : 1; // value 0 to 1 UINT32 autobalance : 1; // value 0 to 1 UINT32 scrambled : 1; // value 0 to 1 -} ATTRPACK changeteam_packet_t; +} ATTRPACK; #ifdef _MSC_VER #pragma warning(default : 4214) #endif -typedef struct { +struct changeteam_value_t { UINT16 l; // liitle endian UINT16 b; // big enian -} ATTRPACK changeteam_value_t; +} ATTRPACK; //Since we do not want other files/modules to know about this data buffer we union it here with a Short Int. //Other files/modules will hand the INT16 back to us and we will decode it here. @@ -272,12 +272,12 @@ void RemoveAdminPlayer(INT32 playernum); void ItemFinder_OnChange(void); void D_SetPassword(const char *pw); -typedef struct +struct scheduleTask_t { UINT16 basetime; UINT16 timer; char *command; -} scheduleTask_t; +}; extern scheduleTask_t **schedule; extern size_t schedule_size; diff --git a/src/d_netfil.h b/src/d_netfil.h index 59fdd99e3..1191e1bfa 100644 --- a/src/d_netfil.h +++ b/src/d_netfil.h @@ -37,7 +37,7 @@ typedef enum FS_FALLBACK, // HTTP failed } filestatus_t; -typedef struct +struct fileneeded_t { UINT8 willsend; // Is the server willing to send it? char filename[MAX_WADPATH]; @@ -54,7 +54,7 @@ typedef struct UINT32 currentsize; UINT32 totalsize; UINT32 ackresendposition; // Used when resuming downloads -} fileneeded_t; +}; extern INT32 fileneedednum; extern fileneeded_t fileneeded[MAX_WADFILES]; @@ -71,8 +71,6 @@ extern boolean curl_failedwebdownload; extern boolean curl_running; extern INT32 curl_transfers; -typedef struct HTTP_login HTTP_login; - extern struct HTTP_login { char * url; @@ -112,7 +110,7 @@ typedef enum LFTNS_SENT // The node already has the file } luafiletransfernodestatus_t; -typedef struct luafiletransfer_s +struct luafiletransfer_t { char *filename; char *realfilename; @@ -121,8 +119,8 @@ typedef struct luafiletransfer_s boolean ongoing; luafiletransfernodestatus_t nodestatus[MAXNETNODES]; tic_t nodetimeouts[MAXNETNODES]; - struct luafiletransfer_s *next; -} luafiletransfer_t; + luafiletransfer_t *next; +}; extern luafiletransfer_t *luafiletransfers; extern boolean waitingforluafiletransfer; diff --git a/src/d_player.h b/src/d_player.h index a2581db8c..59a7a73b8 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -289,7 +289,7 @@ typedef enum #define GARDENTOP_MAXGRINDTIME (45) // player_t struct for all respawn variables -typedef struct respawnvars_s +struct respawnvars_t { UINT8 state; // see RESPAWNST_ constants in k_respawn.h waypoint_t *wp; // Waypoint that we're going towards, NULL if the position isn't linked to one @@ -303,10 +303,10 @@ typedef struct respawnvars_s tic_t dropdash; // Drop Dash charge timer boolean truedeath; // Your soul has left your body boolean manual; // Respawn coords were manually set, please respawn exactly there -} respawnvars_t; +}; // player_t struct for all bot variables -typedef struct botvars_s +struct botvars_t { UINT8 difficulty; // Bot's difficulty setting UINT8 diffincrease; // In GP: bot difficulty will increase this much next round @@ -323,18 +323,18 @@ typedef struct botvars_s SINT8 turnconfirm; // Confirm turn direction tic_t spindashconfirm; // When high enough, they will try spindashing -} botvars_t; +}; // player_t struct for all skybox variables -typedef struct { +struct skybox_t { mobj_t * viewpoint; mobj_t * centerpoint; -} skybox_t; +}; // ======================================================================== // PLAYER STRUCTURE // ======================================================================== -typedef struct player_s +struct player_t { mobj_t *mo; @@ -614,6 +614,6 @@ typedef struct player_s #ifdef HWRENDER fixed_t fovadd; // adjust FOV for hw rendering #endif -} player_t; +}; #endif diff --git a/src/d_think.h b/src/d_think.h index 4bdac4627..719efa564 100644 --- a/src/d_think.h +++ b/src/d_think.h @@ -40,15 +40,15 @@ typedef union typedef actionf_t think_t; // Doubly linked list of actors. -typedef struct thinker_s +struct thinker_t { - struct thinker_s *prev; - struct thinker_s *next; + thinker_t *prev; + thinker_t *next; think_t function; // killough 11/98: count of how many other objects reference // this one using pointers. Used for garbage collection. INT32 references; -} thinker_t; +}; #endif diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index 4cf1e7c97..7cf95cb0a 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -63,7 +63,7 @@ typedef enum #pragma pack(1) #endif -typedef struct +struct ticcmd_t { SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50) INT16 turning; // Turn speed @@ -72,7 +72,7 @@ typedef struct UINT16 buttons; UINT8 latency; // Netgames: how many tics ago was this ticcmd generated from this player's end? UINT8 flags; -} ATTRPACK ticcmd_t; +} ATTRPACK; #if defined(_MSC_VER) #pragma pack() diff --git a/src/deh_tables.c b/src/deh_tables.c index 47b282030..19aa12528 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -313,6 +313,7 @@ actionpointer_t actionpointers[] = {{A_JawzExplode}, "A_JAWZEXPLODE"}, {{A_SSMineSearch}, "A_SSMINESEARCH"}, {{A_SSMineExplode}, "A_SSMINEEXPLODE"}, + {{A_SSMineFlash}, "A_SSMINEFLASH"}, {{A_LandMineExplode}, "A_LANDMINEEXPLODE"}, {{A_BallhogExplode}, "A_BALLHOGEXPLODE"}, {{A_LightningFollowPlayer}, "A_LIGHTNINGFOLLOWPLAYER"}, @@ -4529,6 +4530,10 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_JANKSPARK2", "S_JANKSPARK3", "S_JANKSPARK4", + + // Broly Ki Orb + "S_BROLY1", + "S_BROLY2", }; // RegEx to generate this from info.h: ^\tMT_([^,]+), --> \t"MT_\1", @@ -6371,6 +6376,7 @@ struct int_const_s const INT_CONST[] = { {"DMG_TUMBLE",DMG_TUMBLE}, {"DMG_STING",DMG_STING}, {"DMG_KARMA",DMG_KARMA}, + {"DMG_VOLTAGE",DMG_VOLTAGE}, //// Death types {"DMG_INSTAKILL",DMG_INSTAKILL}, {"DMG_DEATHPIT",DMG_DEATHPIT}, diff --git a/src/deh_tables.h b/src/deh_tables.h index cfb676172..8103634a3 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -41,11 +41,11 @@ struct flickytypes_s { /** Action pointer for reading actions from Dehacked lumps. */ -typedef struct +struct actionpointer_t { actionf_t action; ///< Function pointer corresponding to the actual action. const char *name; ///< Name of the action in ALL CAPS. -} actionpointer_t; +}; struct int_const_s { const char *n; diff --git a/src/dehacked.h b/src/dehacked.h index 88d303b33..63cf9cedd 100644 --- a/src/dehacked.h +++ b/src/dehacked.h @@ -57,13 +57,13 @@ extern UINT8 superstack; // the code was first write for a file // converted to use memory with this functions -typedef struct +struct MYFILE { char *data; char *curpos; size_t size; UINT16 wad; -} MYFILE; +}; #define myfeof(a) (a->data + a->size <= a->curpos) char *myfgets(char *buf, size_t bufsize, MYFILE *f); char *myhashfgets(char *buf, size_t bufsize, MYFILE *f); diff --git a/src/discord.h b/src/discord.h index a6bb1134a..82d955d01 100644 --- a/src/discord.h +++ b/src/discord.h @@ -15,7 +15,7 @@ #ifdef HAVE_DISCORDRPC -#include "discord_rpc.h" +#include extern consvar_t cv_discordrp; extern consvar_t cv_discordstreamer; @@ -27,7 +27,7 @@ extern struct discordInfo_s { boolean everyoneCanInvite; } discordInfo; -typedef struct discordRequest_s { +struct discordRequest_t { char *username; // Discord user name. char *discriminator; // Discord discriminator (The little hashtag thing after the username). Separated for a "hide discriminators" cvar. char *userID; // The ID of the Discord user, gets used with Discord_Respond() @@ -38,9 +38,9 @@ typedef struct discordRequest_s { // Hey, wanna add ImageMagick as a dependency? :dying: //patch_t *avatar; - struct discordRequest_s *next; // Next request in the list. - struct discordRequest_s *prev; // Previous request in the list. Not used normally, but just in case something funky happens, this should repair the list. -} discordRequest_t; + discordRequest_t *next; // Next request in the list. + discordRequest_t *prev; // Previous request in the list. Not used normally, but just in case something funky happens, this should repair the list. +}; extern discordRequest_t *discordRequestList; diff --git a/src/doomdata.h b/src/doomdata.h index 6d3a6386c..5767da5ec 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -68,24 +68,24 @@ enum #endif // A single Vertex. -typedef struct +struct mapvertex_t { INT16 x, y; -}ATTRPACK mapvertex_t; +}ATTRPACK; // A SideDef, defining the visual appearance of a wall, // by setting textures and offsets. -typedef struct +struct mapsidedef_t { INT16 textureoffset, rowoffset; char toptexture[8], bottomtexture[8], midtexture[8]; // Front sector, towards viewer. INT16 sector; -} ATTRPACK mapsidedef_t; +} ATTRPACK; // A LineDef, as used for editing, and as input // to the BSP builder. -typedef struct +struct maplinedef_t { INT16 v1, v2; INT16 flags; @@ -93,7 +93,7 @@ typedef struct INT16 tag; // sidenum[1] will be 0xffff if one sided UINT16 sidenum[2]; -} ATTRPACK maplinedef_t; +} ATTRPACK; // // LineDef attributes. @@ -152,7 +152,7 @@ enum }; // Sector definition, from editing. -typedef struct +struct mapsector_t { INT16 floorheight; INT16 ceilingheight; @@ -161,34 +161,34 @@ typedef struct INT16 lightlevel; INT16 special; INT16 tag; -} ATTRPACK mapsector_t; +} ATTRPACK; // SubSector, as generated by BSP. -typedef struct +struct mapsubsector_t { UINT16 numsegs; // Index of first one, segs are stored sequentially. UINT16 firstseg; -} ATTRPACK mapsubsector_t; +} ATTRPACK; // LineSeg, generated by splitting LineDefs // using partition lines selected by BSP builder. -typedef struct +struct mapseg_t { INT16 v1, v2; INT16 angle; INT16 linedef; INT16 side; INT16 offset; -} ATTRPACK mapseg_t; +} ATTRPACK; // BSP node structure. // Indicate a leaf. #define NF_SUBSECTOR 0x8000 -typedef struct +struct mapnode_t { // Partition line from (x,y) to x+dx,y+dy) INT16 x, y; @@ -199,7 +199,7 @@ typedef struct // If NF_SUBSECTOR it's a subsector, else it's a node of another subtree. UINT16 children[2]; -} ATTRPACK mapnode_t; +} ATTRPACK; #if defined(_MSC_VER) #pragma pack() @@ -210,7 +210,7 @@ typedef struct // Thing definition, position, orientation and type, // plus visibility flags and attributes. -typedef struct +struct mapthing_t { INT16 x, y; INT16 angle, pitch, roll; @@ -222,8 +222,8 @@ typedef struct fixed_t scale; INT32 args[NUMMAPTHINGARGS]; char *stringargs[NUMMAPTHINGSTRINGARGS]; - struct mobj_s *mobj; -} mapthing_t; + mobj_t *mobj; +}; #define ZSHIFT 4 diff --git a/src/doomdef.h b/src/doomdef.h index 8271a4ae2..f54916599 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -210,7 +210,7 @@ extern char logfilename[1024]; // Master Server compatibility ONLY #define MSCOMPAT_MAXPLAYERS (32) -typedef struct skincolor_s +struct skincolor_t { char name[MAXCOLORNAME+1]; // Skincolor name UINT8 ramp[COLORRAMPSIZE]; // Colormap ramp @@ -218,7 +218,7 @@ typedef struct skincolor_s UINT8 invshade; // Signpost color shade UINT16 chatcolor; // Chat color boolean accessible; // Accessible by the color command + setup menu -} skincolor_t; +}; #define FOLLOWERCOLOR_MATCH UINT16_MAX #define FOLLOWERCOLOR_OPPOSITE (UINT16_MAX-1) diff --git a/src/doomstat.h b/src/doomstat.h index 3338e9b76..320e29c13 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -92,12 +92,12 @@ typedef enum PRECIPFX_WATERPARTICLES = 1<<2 } precipeffect_t; -typedef struct +struct precipprops_t { const char *name; mobjtype_t type; precipeffect_t effects; -} precipprops_t; +}; extern precipprops_t precipprops[MAXPRECIP]; extern preciptype_t precip_freeslot; @@ -107,13 +107,13 @@ extern preciptype_t curWeather; /** Time attack information, currently a very small structure. */ -typedef struct +struct recorddata_t { tic_t time; ///< Time in which the level was finished. tic_t lap; ///< Best lap time for this level. //UINT32 score; ///< Score when the level was finished. //UINT16 rings; ///< Rings when the level was finished. -} recorddata_t; +}; // mapvisited is now a set of flags that says what we've done in the map. #define MV_VISITED (1) @@ -220,7 +220,7 @@ extern UINT16 skincolor_redteam, skincolor_blueteam, skincolor_redring, skincolo extern boolean exitfadestarted; -typedef struct +struct scene_t { UINT8 numpics; char picname[8][8]; @@ -240,13 +240,13 @@ typedef struct UINT8 fadecolor; // Color number for fade, 0 means don't do the first fade UINT8 fadeinid; // ID of the first fade, to a color -- ignored if fadecolor is 0 UINT8 fadeoutid; // ID of the second fade, to the new screen -} scene_t; // TODO: It would probably behoove us to implement subsong/track selection here, too, but I'm lazy -SH +}; // TODO: It would probably behoove us to implement subsong/track selection here, too, but I'm lazy -SH -typedef struct +struct cutscene_t { scene_t scene[128]; // 128 scenes per cutscene. INT32 numscenes; // Number of scenes in this cutscene -} cutscene_t; +}; extern cutscene_t *cutscenes[128]; @@ -261,7 +261,7 @@ extern cutscene_t *cutscenes[128]; #define PROMPT_PIC_LOOP 1 #define PROMPT_PIC_DESTROY 2 #define MAX_PROMPT_PICS 8 -typedef struct +struct textpage_t { UINT8 numpics; UINT8 picmode; // sequence mode after displaying last pic, 0 = persist, 1 = loop, 2 = destroy @@ -294,13 +294,13 @@ typedef struct char nexttag[33]; // next tag to jump to. If set, this overrides nextprompt and nextpage. INT32 timetonext; // time in tics to jump to next page automatically. 0 = don't jump automatically char *text; -} textpage_t; +}; -typedef struct +struct textprompt_t { textpage_t page[MAX_PAGES]; INT32 numpages; // Number of pages in this prompt -} textprompt_t; +}; extern textprompt_t *textprompts[MAX_PROMPTS]; @@ -316,10 +316,10 @@ extern mapthing_t *rflagpoint, *bflagpoint; // Pointers to the flag spawn locati #define GF_BLUEFLAG 2 // A single point in space. -typedef struct +struct mappoint_t { fixed_t x, y, z; -} mappoint_t; +}; extern struct quake { @@ -333,11 +333,11 @@ extern struct quake } quake; // Custom Lua values -typedef struct +struct customoption_t { char option[32]; // 31 usable characters char value[256]; // 255 usable characters. If this seriously isn't enough then wtf. -} customoption_t; +}; // This could support more, but is that a good idea? // Keep in mind that it may encourage people making overly long cups just because they "can", and would be a waste of memory. @@ -347,7 +347,7 @@ typedef struct #define CUPCACHE_SPECIAL (CUPCACHE_BONUS+MAXBONUSLIST) #define CUPCACHE_MAX (CUPCACHE_SPECIAL+1) -typedef struct cupheader_s +struct cupheader_t { UINT16 id; ///< Cup ID char name[15]; ///< Cup title (14 chars) @@ -358,8 +358,8 @@ typedef struct cupheader_s UINT8 numbonus; ///< Number of bonus stages defined UINT8 emeraldnum; ///< ID of Emerald to use for special stage (1-7 for Chaos Emeralds, 8-14 for Super Emeralds, 0 for no emerald) SINT8 unlockrequired; ///< An unlockable is required to select this cup. -1 for no unlocking required. - struct cupheader_s *next; ///< Next cup in linked list -} cupheader_t; + cupheader_t *next; ///< Next cup in linked list +}; extern cupheader_t *kartcupheaders; // Start of cup linked list extern UINT16 numkartcupheaders; @@ -368,7 +368,7 @@ extern UINT16 numkartcupheaders; /** Map header information. */ -typedef struct +struct mapheader_t { // Core game information, not user-modifiable directly char *lumpname; ///< Lump name can be really long @@ -441,7 +441,7 @@ typedef struct // Lua information UINT8 numCustomOptions; ///< Internal. For Lua custom value support. customoption_t *customopts; ///< Custom options. Allocated dynamically for space reasons. Be careful. -} mapheader_t; +}; // level flags #define LF_SCRIPTISFILE (1<<0) ///< True if the script is a file, not a lump. @@ -530,11 +530,11 @@ enum TypeOfLevel #define NUMBASETOLNAMES (4) #define NUMTOLNAMES (NUMBASETOLNAMES + NUMGAMETYPEFREESLOTS) -typedef struct +struct tolinfo_t { const char *name; UINT32 flag; -} tolinfo_t; +}; extern tolinfo_t TYPEOFLEVEL[NUMTOLNAMES]; extern UINT32 lastcustomtol; diff --git a/src/doomtype.h b/src/doomtype.h index 4aabab8b0..95f060008 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -406,4 +406,6 @@ typedef UINT64 precise_t; #define FUNCPTRCAST(p) ((union{void(*f)(void);void*v;})\ {(void(*)(void))p}).v +#include "typedef.h" + #endif //__DOOMTYPE__ diff --git a/src/font.h b/src/font.h index 88bedb44f..0cc6610d0 100644 --- a/src/font.h +++ b/src/font.h @@ -15,9 +15,7 @@ #define MAX_FONTS 32 -typedef struct font font_t; - -struct font +struct font_t { patch_t **font; diff --git a/src/g_demo.h b/src/g_demo.h index a00756a74..78e544342 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -28,12 +28,12 @@ extern consvar_t cv_recordmultiplayerdemos, cv_netdemosyncquality; extern tic_t demostarttime; -typedef struct democharlist_s { +struct democharlist_t { UINT8 mapping; // No, this isn't about levels. It maps to loaded character ID. UINT8 kartspeed; UINT8 kartweight; UINT32 flags; -} democharlist_t; +}; // Publicly-accessible demo vars struct demovars_s { @@ -76,7 +76,7 @@ typedef enum { MD_INVALID } menudemotype_e; -typedef struct menudemo_s { +struct menudemo_t { char filepath[256]; menudemotype_e type; @@ -93,7 +93,7 @@ typedef struct menudemo_s { UINT8 skin, color; UINT32 timeorscore; } standings[MAXPLAYERS]; -} menudemo_t; +}; extern mobj_t *metalplayback; @@ -160,7 +160,7 @@ void G_LoadMetal(UINT8 **buffer); // Your naming conventions are stupid and useless. // There is no conflict here. -typedef struct demoghost { +struct demoghost { UINT8 checksum[16]; UINT8 *buffer, *p, color; UINT8 fadein; @@ -169,7 +169,7 @@ typedef struct demoghost { democharlist_t *skinlist; mobj_t oldmo, *mo; struct demoghost *next; -} demoghost; +}; extern demoghost *ghosts; // G_CheckDemoExtraFiles: checks if our loaded WAD list matches the demo's. diff --git a/src/g_game.c b/src/g_game.c index fe73d8ae6..5cde2d270 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2824,6 +2824,11 @@ mapthing_t *G_FindMapStart(INT32 playernum) spawnpoint = G_FindRaceStartOrFallback(playernum); } + // -- Grand Prix / Time Attack -- + // Order: Race->DM->CTF + else if (grandprixinfo.gp || modeattacking) + spawnpoint = G_FindRaceStartOrFallback(playernum); + // -- CTF -- // Order: CTF->DM->Race else if ((gametyperules & GTR_TEAMSTARTS) && players[playernum].ctfteam) diff --git a/src/g_game.h b/src/g_game.h index 9c0bec553..0108cc06d 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -135,7 +135,7 @@ struct searchdim UINT8 siz; }; -typedef struct +struct mapsearchfreq_t { INT16 mapnum; UINT8 matchc; @@ -143,8 +143,7 @@ typedef struct UINT8 keywhc; struct searchdim *keywhd;/* ...in KEYWORD */ UINT8 total;/* total hits */ -} -mapsearchfreq_t; +}; INT32 G_FindMap(const char *query, char **foundmapnamep, mapsearchfreq_t **freqp, INT32 *freqc); diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index b5268986b..d8eac4a44 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -145,6 +145,11 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p // 0--1 float dupx, dupy, fscalew, fscaleh, fwidth, fheight; + const cliprect_t *clip = V_GetClipRect(); + + float s_min, s_max; + float t_min, t_max; + // make patch ready in hardware cache if (!colormap) HWR_GetPatch(gpatch); @@ -207,7 +212,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p INT32 intx, inty; intx = (INT32)cx; inty = (INT32)cy; - K_AdjustXYWithSnap(&intx, &inty, option, dupx, dupy); + V_AdjustXYWithSnap(&intx, &inty, option, dupx, dupy); cx = (float)intx; cy = (float)inty; } @@ -224,6 +229,41 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p fheight = (float)(gpatch->height) * dupy; } + s_min = t_min = 0.0f; + s_max = hwrPatch->max_s; + t_max = hwrPatch->max_t; + + if (clip) + { + if (cx < clip->left) + { + s_min = ((clip->left - cx) / fwidth) * s_max; + cx = clip->left; + } + + if (cy < clip->top) + { + t_min = ((clip->top - cy) / fheight) * t_max; + cy = clip->top; + } + + if ((cx + fwidth) > clip->right) + { + const float n = (clip->right - clip->left); + + s_max = (s_min + ((n / fwidth) * s_max)); + fwidth = n; + } + + if ((cy + fheight) > clip->bottom) + { + const float n = (clip->bottom - clip->top); + + t_max = (t_min + ((n / fheight) * t_max)); + fheight = n; + } + } + // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 cx = -1 + (cx / (vid.width/2)); cy = 1 - (cy / (vid.height/2)); @@ -243,24 +283,24 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p if (option & V_FLIP) { - v[0].s = v[3].s = hwrPatch->max_s; - v[2].s = v[1].s = 0.0f; + v[0].s = v[3].s = s_max; + v[2].s = v[1].s = s_min; } else { - v[0].s = v[3].s = 0.0f; - v[2].s = v[1].s = hwrPatch->max_s; + v[0].s = v[3].s = s_min; + v[2].s = v[1].s = s_max; } if (option & V_VFLIP) { - v[0].t = v[1].t = hwrPatch->max_t; - v[2].t = v[3].t = 0.0f; + v[0].t = v[1].t = t_max; + v[2].t = v[3].t = t_min; } else { - v[0].t = v[1].t = 0.0f; - v[2].t = v[3].t = hwrPatch->max_t; + v[0].t = v[1].t = t_min; + v[2].t = v[3].t = t_max; } flags = PF_NoDepthTest; @@ -1011,7 +1051,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32 intx = (INT32)fx; inty = (INT32)fy; - K_AdjustXYWithSnap(&intx, &inty, color, dupx, dupy); + V_AdjustXYWithSnap(&intx, &inty, color, dupx, dupy); fx = (float)intx; fy = (float)inty; } @@ -1102,7 +1142,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) intx = (INT32)fx; inty = (INT32)fy; - K_AdjustXYWithSnap(&intx, &inty, color, dupx, dupy); + V_AdjustXYWithSnap(&intx, &inty, color, dupx, dupy); fx = (float)intx; fy = (float)inty; } diff --git a/src/hu_stuff.h b/src/hu_stuff.h index be0d97df9..078cd0751 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -81,12 +81,12 @@ extern char english_shiftxform[]; // sorted player lines //------------------------------------ -typedef struct +struct playersort_t { UINT32 count; INT32 num; const char *name; -} playersort_t; +}; //------------------------------------ // chat stuff diff --git a/src/i_joy.h b/src/i_joy.h index b10f4c55d..eb83a6649 100644 --- a/src/i_joy.h +++ b/src/i_joy.h @@ -38,7 +38,7 @@ actually, we need to know if it is a gamepad or analog controls */ -struct JoyType_s +struct JoyType_t { /*! if true, we MUST Poll() to get new joystick data, that is: we NEED the DIRECTINPUTDEVICE2 ! (watchout NT compatibility) */ @@ -48,7 +48,6 @@ struct JoyType_s INT32 bGamepadStyle; }; -typedef struct JoyType_s JoyType_t; /** \brief Joystick info for palyer[sic] 1-4's joystick/gamepad */ diff --git a/src/i_net.h b/src/i_net.h index 8ad08e08c..bc98dca8e 100644 --- a/src/i_net.h +++ b/src/i_net.h @@ -40,7 +40,7 @@ extern INT32 net_bandwidth; // in byte/s #pragma pack(1) #endif -typedef struct +struct doomcom_t { /// Supposed to be DOOMCOM_ID INT32 id; @@ -77,14 +77,14 @@ typedef struct /// The packet data to be sent. char data[MAXPACKETLENGTH]; -} ATTRPACK doomcom_t; +} ATTRPACK; -typedef struct +struct holepunch_t { INT32 magic; INT32 addr; INT16 port; -} ATTRPACK holepunch_t; +} ATTRPACK; #if defined(_MSC_VER) #pragma pack() @@ -172,11 +172,11 @@ extern boolean (*I_SetBanUsername) (const char *username); extern boolean (*I_SetBanReason) (const char *reason); extern boolean (*I_SetUnbanTime) (time_t timestamp); -typedef struct +struct bannednode_t { size_t banid; time_t timeleft; -} bannednode_t; +}; extern bannednode_t *bannednode; /// \brief Called by D_SRB2Main to be defined by extern network driver diff --git a/src/i_system.h b/src/i_system.h index 75e7b49e1..e7b9f2bf5 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -128,7 +128,7 @@ typedef enum NumberofForces, } FFType; -typedef struct JoyFF_s +struct JoyFF_t { INT32 ForceX; ///< The X of the Force's Vel INT32 ForceY; ///< The Y of the Force's Vel @@ -144,7 +144,7 @@ typedef struct JoyFF_s INT32 Offset; ///< Offset of the effect. UINT32 Phase; ///< Position in the cycle of the periodic effect at which playback begins, in the range from 0 through 35,999 UINT32 Period; ///< Period of the effect, in microseconds. -} JoyFF_t; +}; /** \brief Forcefeedback for the first joystick @@ -298,7 +298,7 @@ char *I_GetUserName(void); */ INT32 I_mkdir(const char *dirname, INT32 unixright); -typedef struct { +struct CPUInfoFlags { int FPU : 1; ///< FPU availabile int CPUID : 1; ///< CPUID instruction int RDTSC : 1; ///< RDTSC instruction @@ -324,7 +324,7 @@ typedef struct { int ALPHAbyte : 1; ///< ? int PAE : 1; ///< Physical Address Extension int CPUs : 8; -} CPUInfoFlags; +}; /** \brief Info about CPU diff --git a/src/i_time.h b/src/i_time.h index cab36133b..8d90c3d09 100644 --- a/src/i_time.h +++ b/src/i_time.h @@ -22,10 +22,10 @@ extern "C" { #endif -typedef struct timestate_s { +struct timestate_t { tic_t time; fixed_t timefrac; -} timestate_t; +}; extern timestate_t g_time; extern consvar_t cv_timescale; diff --git a/src/info.c b/src/info.c index b71241509..138bc241a 100644 --- a/src/info.c +++ b/src/info.c @@ -495,6 +495,7 @@ char sprnames[NUMSPRITES + 1][5] = "BOM3", // Boss Explosion 2 "BOM4", // Underwater Explosion "BMNB", // Mine Explosion + "LSSJ", // My ki is overflowing!! // Crumbly rocks "ROIA", @@ -543,6 +544,7 @@ char sprnames[NUMSPRITES + 1][5] = "KINF", // Invincibility flash "INVI", // Invincibility speedlines "ICAP", // Item capsules + "IMON", // Item Monitor "MGBX", // Heavy Magician transform box "MGBT", // Heavy Magician transform box top "MGBB", // Heavy Magician transform box bottom @@ -5140,6 +5142,10 @@ state_t states[NUMSTATES] = {SPR_JANK, FF_PAPERSPRITE|FF_FULLBRIGHT|FF_ANIMATE, 4, {NULL}, 3, 1, S_JANKSPARK3}, // S_JANKSPARK2 {SPR_JANK, 0, 0, {A_SetCustomValue}, -1, 5, S_JANKSPARK4}, // S_JANKSPARK3 {SPR_JANK, 0, 0, {A_ChangeAngleRelative}, 180, 180, S_JANKSPARK2}, // S_JANKSPARK4 + + // Broly Ki Orb + {SPR_LSSJ, FF_REVERSESUBTRACT|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_BROLY2}, // S_BROLY1 + {SPR_NULL, 0, 5*TICRATE, {A_SSMineFlash}, 0, 0, S_NULL}, // S_BROLY2 }; mobjinfo_t mobjinfo[NUMMOBJTYPES] = @@ -23341,7 +23347,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_None, // deathsound 0, // speed 16*FRACUNIT, // radius - 24*FRACUNIT, // height + 56*FRACUNIT, // height 0, // display offset 100, // mass 1, // damage @@ -28673,7 +28679,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_BATTLECAPSULE 2333, // doomednum - S_INVISIBLE, // spawnstate + S_SHADOW, // spawnstate 1, // spawnhealth S_NULL, // seestate sfx_None, // seesound @@ -28688,8 +28694,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 28<mo, wp->mobj) == false) { // If we can't get a direct path to this waypoint, predict less. - distanceleft -= disttonext; + distanceleft /= 2; radreduce = FRACUNIT >> 1; } @@ -745,6 +745,25 @@ static botprediction_t *K_CreateBotPrediction(player_t *player) predict->y += P_ReturnThrustY(NULL, angletonext, min(disttonext, distanceleft) * FRACUNIT); } + if (player->mo->standingslope != NULL) + { + const pslope_t *slope = player->mo->standingslope; + + if (!(slope->flags & SL_NOPHYSICS) && abs(slope->zdelta) >= FRACUNIT/21) + { + // Displace the prediction to go against the slope physics. + angle_t angle = slope->xydirection; + + if (P_MobjFlip(player->mo) * slope->zdelta < 0) + { + angle ^= ANGLE_180; + } + + predict->x -= P_ReturnThrustX(NULL, angle, startDist * abs(slope->zdelta)); + predict->y -= P_ReturnThrustY(NULL, angle, startDist * abs(slope->zdelta)); + } + } + ps_bots[player - players].prediction += I_GetPreciseTime() - time; return predict; } @@ -875,7 +894,7 @@ static void K_DrawPredictionDebug(botprediction_t *predict, player_t *player) debugMobj->frame |= FF_TRANS20|FF_FULLBRIGHT; debugMobj->color = SKINCOLOR_ORANGE; - debugMobj->scale *= 2; + P_SetScale(debugMobj, debugMobj->destscale * 2); debugMobj->tics = 2; @@ -902,7 +921,7 @@ static void K_DrawPredictionDebug(botprediction_t *predict, player_t *player) radiusMobj->frame |= FF_TRANS20|FF_FULLBRIGHT; radiusMobj->color = SKINCOLOR_YELLOW; - radiusMobj->scale /= 2; + P_SetScale(debugMobj, debugMobj->destscale / 2); radiusMobj->tics = 2; } @@ -1452,7 +1471,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) } } - if (spindash == 0) + if (spindash == 0 && player->exiting == 0) { // Don't pointlessly try to use rings/sneakers while charging a spindash. // TODO: Allowing projectile items like orbinaut while e-braking would be nice, maybe just pass in the spindash variable? diff --git a/src/k_bot.h b/src/k_bot.h index 858e4f331..60d22700d 100644 --- a/src/k_bot.h +++ b/src/k_bot.h @@ -31,10 +31,10 @@ #define BOTSPINDASHCONFIRM (2*TICRATE) // Point for bots to aim for -typedef struct botprediction_s { +struct botprediction_t { fixed_t x, y; fixed_t radius; -} botprediction_t; +}; // AVAILABLE FOR LUA diff --git a/src/k_botitem.c b/src/k_botitem.c index e51b04b3a..aea9b671f 100644 --- a/src/k_botitem.c +++ b/src/k_botitem.c @@ -486,6 +486,12 @@ static void K_BotItemGenericOrbitShield(player_t *player, ticcmd_t *cmd) --------------------------------------------------*/ static void K_BotItemSneaker(player_t *player, ticcmd_t *cmd) { + if (P_IsObjectOnGround(player->mo) == false) + { + // Don't use while mid-air. + return; + } + if ((player->offroad && K_ApplyOffroad(player)) // Stuck in offroad, use it NOW || K_GetWaypointIsShortcut(player->nextwaypoint) == true // Going toward a shortcut! || player->speed < K_GetKartSpeed(player, false, true) / 2 // Being slowed down too much @@ -518,6 +524,12 @@ static void K_BotItemSneaker(player_t *player, ticcmd_t *cmd) --------------------------------------------------*/ static void K_BotItemRocketSneaker(player_t *player, ticcmd_t *cmd) { + if (P_IsObjectOnGround(player->mo) == false) + { + // Don't use while mid-air. + return; + } + if (player->botvars.itemconfirm > TICRATE) { if (player->sneakertimer == 0 && K_ItemButtonWasDown(player) == false) @@ -892,9 +904,9 @@ static void K_BotItemOrbinaut(player_t *player, ticcmd_t *cmd) } /*-------------------------------------------------- - static void K_BotItemDropTarget(player_t *player, ticcmd_t *cmd) + static void K_BotItemBallhog(player_t *player, ticcmd_t *cmd) - Item usage for Drop Target throwing. + Item usage for Ballhog throwing. Input Arguments:- player - Bot to do this for. @@ -903,14 +915,15 @@ static void K_BotItemOrbinaut(player_t *player, ticcmd_t *cmd) Return:- None --------------------------------------------------*/ -static void K_BotItemDropTarget(player_t *player, ticcmd_t *cmd) +static void K_BotItemBallhog(player_t *player, ticcmd_t *cmd) { const fixed_t topspeed = K_GetKartSpeed(player, false, true); - fixed_t radius = FixedMul(1280 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed)); + fixed_t radius = FixedMul(2560 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed)); SINT8 throwdir = -1; boolean tryLookback = false; UINT8 snipeMul = 2; player_t *target = NULL; + boolean hold = false; if (player->speed > topspeed) { @@ -918,8 +931,6 @@ static void K_BotItemDropTarget(player_t *player, ticcmd_t *cmd) snipeMul = 3; // Confirm faster when you'll throw it with a bunch of extra speed!! } - player->botvars.itemconfirm++; - target = K_PlayerInCone(player, radius, 15, false); if (target != NULL) { @@ -943,7 +954,89 @@ static void K_BotItemDropTarget(player_t *player, ticcmd_t *cmd) cmd->buttons |= BT_LOOKBACK; } - if (player->botvars.itemconfirm > 25*TICRATE) + if (target != NULL) + { + // Charge up! + hold = true; + } + else + { + // If we lose sight of the target, then we'll just + // let go and it'll do a partial-blast. + + // If we've been waiting for too long though, then + // we'll go for the full charge :) + player->botvars.itemconfirm++; + hold = (player->botvars.itemconfirm > 10*TICRATE); + } + + if (hold == true) + { + cmd->throwdir = KART_FULLTURN * throwdir; + cmd->buttons |= BT_ATTACK; + } +} + +/*-------------------------------------------------- + static void K_BotItemDropTarget(player_t *player, ticcmd_t *cmd, INT16 turnamt) + + Item usage for Drop Target throwing. + + Input Arguments:- + player - Bot to do this for. + cmd - Bot's ticcmd to edit. + turnamt - How hard they currently are turning. + + Return:- + None +--------------------------------------------------*/ +static void K_BotItemDropTarget(player_t *player, ticcmd_t *cmd, INT16 turnamt) +{ + const fixed_t topspeed = K_GetKartSpeed(player, false, true); + fixed_t radius = FixedMul(1280 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed)); + SINT8 throwdir = -1; + boolean tryLookback = false; + UINT8 snipeMul = 2; + player_t *target = NULL; + + if (player->speed > topspeed) + { + radius = FixedMul(radius, FixedDiv(player->speed, topspeed)); + snipeMul = 3; // Confirm faster when you'll throw it with a bunch of extra speed!! + } + + player->botvars.itemconfirm++; + + if (abs(turnamt) >= KART_FULLTURN/2) + { + player->botvars.itemconfirm += player->botvars.difficulty / 2; + throwdir = -1; + } + + target = K_PlayerInCone(player, radius, 15, false); + if (target != NULL) + { + K_ItemConfirmForTarget(player, target, player->botvars.difficulty * snipeMul); + throwdir = 1; + } + else + { + target = K_PlayerInCone(player, radius, 15, true); + + if (target != NULL) + { + K_ItemConfirmForTarget(player, target, player->botvars.difficulty); + throwdir = -1; + tryLookback = true; + } + } + + if (tryLookback == true && throwdir == -1) + { + cmd->buttons |= BT_LOOKBACK; + } + + if (player->botvars.itemconfirm > 10*TICRATE || player->bananadrag >= TICRATE) { K_BotGenericPressItem(player, cmd, throwdir); } @@ -1166,6 +1259,92 @@ static void K_BotItemFlame(player_t *player, ticcmd_t *cmd) } } +/*-------------------------------------------------- + static void K_BotItemGardenTopDeploy(player_t *player, ticcmd_t *cmd) + + Item usage for deploying the Garden Top. + + Input Arguments:- + player - Bot to do this for. + cmd - Bot's ticcmd to edit. + + Return:- + None +--------------------------------------------------*/ +static void K_BotItemGardenTopDeploy(player_t *player, ticcmd_t *cmd) +{ + //if (player->curshield != KSHIELD_TOP) + if (player->botvars.itemconfirm++ > 2*TICRATE) + { + K_BotGenericPressItem(player, cmd, 0); + } +} + +/*-------------------------------------------------- + static void K_BotItemGardenTop(player_t *player, ticcmd_t *cmd, INT16 turnamt) + + Item usage for Garden Top movement. + + Input Arguments:- + player - Bot to do this for. + cmd - Bot's ticcmd to edit. + turnamt - How hard they currently are turning. + + Return:- + None +--------------------------------------------------*/ +static void K_BotItemGardenTop(player_t *player, ticcmd_t *cmd, INT16 turnamt) +{ + const fixed_t topspeed = K_GetKartSpeed(player, false, true); + fixed_t radius = FixedMul(2560 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed)); + SINT8 throwdir = -1; + UINT8 snipeMul = 1; + player_t *target = NULL; + + if (player->speed > topspeed) + { + radius = FixedMul(radius, FixedDiv(player->speed, topspeed)); + snipeMul = 2; // Confirm faster when you'll throw it with a bunch of extra speed!! + } + + player->botvars.itemconfirm++; + + target = K_PlayerInCone(player, radius, 15, false); + if (target != NULL) + { + K_ItemConfirmForTarget(player, target, player->botvars.difficulty * snipeMul); + throwdir = 1; + } + + if (player->topdriftheld > 0) + { + // Grinding in place. + // Wait until we're mostly done turning. + // Cancel early if we hit max thrust speed. + if ((abs(turnamt) >= KART_FULLTURN/8) + && (player->topdriftheld <= GARDENTOP_MAXGRINDTIME)) + { + cmd->buttons |= BT_DRIFT; + } + } + else + { + const angle_t maxDelta = ANGLE_11hh; + angle_t delta = AngleDelta(player->mo->angle, K_MomentumAngle(player->mo)); + + if (delta > maxDelta) + { + // Do we need to turn? Start grinding! + cmd->buttons |= BT_DRIFT; + } + } + + if (player->botvars.itemconfirm > 25*TICRATE) + { + K_BotGenericPressItem(player, cmd, throwdir); + } +} + /*-------------------------------------------------- static void K_BotItemRings(player_t *player, ticcmd_t *cmd) @@ -1182,6 +1361,12 @@ static void K_BotItemRings(player_t *player, ticcmd_t *cmd) { INT32 saferingsval = 16 - K_GetKartRingPower(player, false); + if (P_IsObjectOnGround(player->mo) == false) + { + // Don't use while mid-air. + return; + } + if (player->speed < K_GetKartSpeed(player, false, true) / 2 // Being slowed down too much || player->speedboost > (FRACUNIT/5)) // Have another type of boost (tethering) { @@ -1242,7 +1427,7 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt) { // Use rings! - if (leveltime > starttime && !player->exiting) + if (leveltime > starttime) { K_BotItemRings(player, cmd); } @@ -1293,7 +1478,6 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt) case KITEM_SPB: case KITEM_GROW: case KITEM_SHRINK: - case KITEM_HYUDORO: case KITEM_SUPERRING: K_BotItemGenericTap(player, cmd); break; @@ -1325,8 +1509,6 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt) K_BotItemGenericOrbitShield(player, cmd); } else if (player->position != 1) // Hold onto orbiting items when in 1st :) - /* FALLTHRU */ - case KITEM_BALLHOG: { K_BotItemOrbinaut(player, cmd); } @@ -1352,8 +1534,12 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt) } break; case KITEM_LANDMINE: + case KITEM_HYUDORO: // Function re-use, as they have about the same usage. K_BotItemLandmine(player, cmd, turnamt); break; + case KITEM_BALLHOG: + K_BotItemBallhog(player, cmd); + break; case KITEM_DROPTARGET: if (!(player->pflags & PF_ITEMOUT)) { @@ -1361,7 +1547,17 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt) } else { - K_BotItemDropTarget(player, cmd); + K_BotItemDropTarget(player, cmd, turnamt); + } + break; + case KITEM_GARDENTOP: + if (player->curshield != KSHIELD_TOP) + { + K_BotItemGardenTopDeploy(player, cmd); + } + else + { + K_BotItemGardenTop(player, cmd, turnamt); } break; case KITEM_LIGHTNINGSHIELD: diff --git a/src/k_botsearch.c b/src/k_botsearch.c index 8af4dcc75..f619035e9 100644 --- a/src/k_botsearch.c +++ b/src/k_botsearch.c @@ -149,7 +149,7 @@ static boolean K_BotHatesThisSectorsSpecial(player_t *player, sector_t *sec) return true; } - if (sec->offroad > FRACUNIT) // Only care about strong offroad. + if (sec->offroad > 0) { return !K_BotCanTakeCut(player); } diff --git a/src/k_brightmap.h b/src/k_brightmap.h index 9ed86b125..2c22a171f 100644 --- a/src/k_brightmap.h +++ b/src/k_brightmap.h @@ -17,7 +17,7 @@ #include "doomdef.h" #include "doomtype.h" -typedef struct brightmapStorage_s +struct brightmapStorage_t { // Brightmap storage struct. // Stores data for brightmap definitions, @@ -28,7 +28,7 @@ typedef struct brightmapStorage_s char brightmapName[9]; // The brightmap's name. UINT32 brightmapHash; // The brightmap name's hash. -} brightmapStorage_t; +}; /*-------------------------------------------------- void K_InitBrightmapsPwad(INT32 wadNum); diff --git a/src/k_collide.c b/src/k_collide.c index 5ff75dc17..8b4a7bb90 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -206,6 +206,7 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2) static mobj_t *grenade; static fixed_t explodedist; static boolean explodespin; +static tic_t minehitlag; static inline boolean PIT_SSMineChecks(mobj_t *thing) { @@ -284,17 +285,22 @@ static inline BlockItReturn_t PIT_SSMineExplode(mobj_t *thing) if (PIT_SSMineChecks(thing) == true) return BMIT_CONTINUE; - P_DamageMobj(thing, grenade, grenade->target, 1, (explodespin ? DMG_NORMAL : DMG_EXPLODE)); + if (P_DamageMobj(thing, grenade, grenade->target, 1, (explodespin ? DMG_NORMAL : DMG_EXPLODE))) + { + minehitlag = thing->hitlag; + } + return BMIT_CONTINUE; } -void K_MineExplodeAttack(mobj_t *actor, fixed_t size, boolean spin) +tic_t K_MineExplodeAttack(mobj_t *actor, fixed_t size, boolean spin) { INT32 bx, by, xl, xh, yl, yh; explodespin = spin; explodedist = FixedMul(size, actor->scale); grenade = actor; + minehitlag = 0; // Use blockmap to check for nearby shootables yh = (unsigned)(actor->y + explodedist - bmaporgy)>>MAPBLOCKSHIFT; @@ -310,6 +316,15 @@ void K_MineExplodeAttack(mobj_t *actor, fixed_t size, boolean spin) // Set this flag to ensure that the inital action won't be triggered twice. actor->flags2 |= MF2_DEBRIS; + + if (!spin) + { + K_SpawnBrolyKi(actor, minehitlag); + + return minehitlag; + } + + return 0; } boolean K_MineCollide(mobj_t *t1, mobj_t *t2) @@ -397,6 +412,7 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2) P_DamageMobj(t2, t1, t1->target, 1, DMG_TUMBLE); } + t1->reactiontime = t2->hitlag; P_KillMobj(t1, t2, t2, DMG_NORMAL); } else if (t2->type == MT_BANANA || t2->type == MT_BANANA_SHIELD @@ -420,6 +436,7 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2) P_SpawnMobj(t2->x/2 + t1->x/2, t2->y/2 + t1->y/2, t2->z/2 + t1->z/2, MT_ITEMCLASH); + t1->reactiontime = t2->hitlag; P_KillMobj(t1, t2, t2, DMG_NORMAL); } else if (t2->type == MT_SSMINE_SHIELD || t2->type == MT_SSMINE || t2->type == MT_LANDMINE) @@ -432,6 +449,8 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2) { // Shootable damage P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL); + + t1->reactiontime = t2->hitlag; P_KillMobj(t1, t2, t2, DMG_NORMAL); } @@ -626,7 +645,7 @@ static inline BlockItReturn_t PIT_LightningShieldAttack(mobj_t *thing) } #endif - P_DamageMobj(thing, lightningSource, lightningSource, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO); + P_DamageMobj(thing, lightningSource, lightningSource, 1, DMG_VOLTAGE|DMG_CANTHURTSELF|DMG_WOMBO); return BMIT_CONTINUE; } diff --git a/src/k_collide.h b/src/k_collide.h index a498241ca..e8700a097 100644 --- a/src/k_collide.h +++ b/src/k_collide.h @@ -10,7 +10,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2); boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2); void K_DoMineSearch(mobj_t *actor, fixed_t size); -void K_MineExplodeAttack(mobj_t *actor, fixed_t size, boolean spin); +tic_t K_MineExplodeAttack(mobj_t *actor, fixed_t size, boolean spin); boolean K_MineCollide(mobj_t *t1, mobj_t *t2); boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2); diff --git a/src/k_follower.h b/src/k_follower.h index 3c1e2a7d1..13c67bb11 100644 --- a/src/k_follower.h +++ b/src/k_follower.h @@ -43,7 +43,7 @@ typedef enum // // We'll define these here because they're really just a mobj that'll follow some rules behind a player // -typedef struct follower_s +struct follower_t { char name[SKINNAMESIZE+1]; // Skin Name. This is what to refer to when asking the commands anything.. char icon[8+1]; // Lump names are only 8 characters. (+1 for \0) @@ -81,19 +81,19 @@ typedef struct follower_s statenum_t losestate; // state when the player has lost statenum_t hitconfirmstate; // state for hit confirm tic_t hitconfirmtime; // time to keep the above playing for -} follower_t; +}; extern INT32 numfollowers; extern follower_t followers[MAXSKINS]; #define MAXFOLLOWERCATEGORIES 32 -typedef struct followercategory_s +struct followercategory_t { char name[SKINNAMESIZE+1]; // Name. This is used for the menus. We'll just follow the same rules as skins for this. char icon[8+1]; // Lump names are only 8 characters. (+1 for \0) UINT8 numincategory; -} followercategory_t; +}; extern INT32 numfollowercategories; extern followercategory_t followercategories[MAXFOLLOWERCATEGORIES]; diff --git a/src/k_hud.c b/src/k_hud.c index c33879360..238da54ef 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -804,117 +804,6 @@ INT32 POSI2_X, POSI2_Y; // trick "cool" INT32 TCOOL_X, TCOOL_Y; - -void K_AdjustXYWithSnap(INT32 *x, INT32 *y, UINT32 options, INT32 dupx, INT32 dupy) -{ - // dupx adjustments pretend that screen width is BASEVIDWIDTH * dupx - INT32 screenwidth = vid.width; - INT32 screenheight = vid.height; - INT32 basewidth = BASEVIDWIDTH * dupx; - INT32 baseheight = BASEVIDHEIGHT * dupy; - SINT8 player = -1; - UINT8 i; - - if (options & V_SPLITSCREEN) - { - if (r_splitscreen > 0) - { - screenheight /= 2; - baseheight /= 2; - } - - if (r_splitscreen > 1) - { - screenwidth /= 2; - basewidth /= 2; - } - } - - for (i = 0; i <= r_splitscreen; i++) - { - if (stplyr == &players[displayplayers[i]]) - { - player = i; - break; - } - } - - if (vid.width != (BASEVIDWIDTH * dupx)) - { - if (options & V_SNAPTORIGHT) - *x += (screenwidth - basewidth); - else if (!(options & V_SNAPTOLEFT)) - *x += (screenwidth - basewidth) / 2; - } - - if (vid.height != (BASEVIDHEIGHT * dupy)) - { - if (options & V_SNAPTOBOTTOM) - *y += (screenheight - baseheight); - else if (!(options & V_SNAPTOTOP)) - *y += (screenheight - baseheight) / 2; - } - - if (options & V_SPLITSCREEN) - { - if (r_splitscreen == 1) - { - if (player == 1) - *y += screenheight; - } - else if (r_splitscreen > 1) - { - if (player == 1 || player == 3) - *x += screenwidth; - - if (player == 2 || player == 3) - *y += screenheight; - } - } - - if (options & V_SLIDEIN) - { - const tic_t length = TICRATE/4; - tic_t timer = lt_exitticker; - if (bossinfo.boss == true) - { - if (leveltime <= 3) - timer = 0; - else - timer = leveltime-3; - } - - if (timer < length) - { - boolean slidefromright = false; - - const INT32 offsetAmount = (screenwidth * FRACUNIT/2) / length; - fixed_t offset = (screenwidth * FRACUNIT/2) - (timer * offsetAmount); - - offset += FixedMul(offsetAmount, renderdeltatics); - offset /= FRACUNIT; - - if (r_splitscreen > 1) - { - if (stplyr == &players[displayplayers[1]] || stplyr == &players[displayplayers[3]]) - slidefromright = true; - } - - if (options & V_SNAPTORIGHT) - slidefromright = true; - else if (options & V_SNAPTOLEFT) - slidefromright = false; - - if (slidefromright == true) - { - offset = -offset; - } - - *x -= offset; - } - } -} - // This version of the function was prototyped in Lua by Nev3r ... a HUGE thank you goes out to them! void K_ObjectTracking(trackingResult_t *result, vector3_t *point, boolean reverse) { @@ -1349,6 +1238,8 @@ static void K_drawKartItem(void) V_DrawScaledPatch(fx, fy, V_HUDTRANS|V_SLIDEIN|fflags, localbg); + //V_SetClipRect((fx + 10) << FRACBITS, (fy + 10) << FRACBITS, 30 << FRACBITS, 30 << FRACBITS, V_HUDTRANS|V_SLIDEIN|fflags); + // Then, the numbers: if (stplyr->itemamount >= numberdisplaymin && !stplyr->itemroulette) { @@ -1368,6 +1259,8 @@ static void K_drawKartItem(void) else V_DrawFixedPatch(fx<player->kartweight) * FRACUNIT; if (mobj->player->speed > spd) - weight += (mobj->player->speed - spd) / 8; + weight += FixedDiv((mobj->player->speed - spd), 8 * mapobjectscale); if (mobj->player->itemtype == KITEM_BUBBLESHIELD) weight += 9*FRACUNIT; @@ -5113,6 +5113,8 @@ void K_MineFlashScreen(mobj_t *source) INT32 pnum; player_t *p; + S_StartSound(source, sfx_s3k4e); + // check for potential display players near the source so we can have a sick earthquake / flashpal. for (pnum = 0; pnum < MAXPLAYERS; pnum++) { @@ -5135,7 +5137,7 @@ void K_MineFlashScreen(mobj_t *source) } // Spawns the purely visual explosion -void K_SpawnMineExplosion(mobj_t *source, UINT8 color) +void K_SpawnMineExplosion(mobj_t *source, UINT8 color, tic_t delay) { INT32 i, radius, height; mobj_t *smoldering = P_SpawnMobj(source->x, source->y, source->z, MT_SMOLDERING); @@ -5143,15 +5145,12 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) mobj_t *truc; INT32 speed, speed2; - K_MineFlashScreen(source); - K_MatchGenericExtraFlags(smoldering, source); smoldering->tics = TICRATE*3; + smoldering->hitlag += delay; radius = source->radius>>FRACBITS; height = source->height>>FRACBITS; - S_StartSound(smoldering, sfx_s3k4e); - if (!color) color = SKINCOLOR_KETCHUP; @@ -5164,6 +5163,8 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) dust->destscale = source->scale*10; dust->scalespeed = source->scale/12; P_InstaThrust(dust, dust->angle, FixedMul(20*FRACUNIT, source->scale)); + dust->hitlag += delay; + dust->renderflags |= RF_DONTDRAW; truc = P_SpawnMobj(source->x + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT, source->y + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT, @@ -5180,6 +5181,8 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) if (truc->eflags & MFE_UNDERWATER) truc->momz = (117 * truc->momz) / 200; truc->color = color; + truc->hitlag += delay; + truc->renderflags |= RF_DONTDRAW; } for (i = 0; i < 16; i++) @@ -5193,6 +5196,8 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) dust->scalespeed = source->scale/12; dust->tics = 30; dust->momz = P_RandomRange(PR_EXPLOSION, FixedMul(3*FRACUNIT, source->scale)>>FRACBITS, FixedMul(7*FRACUNIT, source->scale)>>FRACBITS)*FRACUNIT; + dust->hitlag += delay; + dust->renderflags |= RF_DONTDRAW; truc = P_SpawnMobj(source->x + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT, source->y + P_RandomRange(PR_EXPLOSION, -radius, radius)*FRACUNIT, @@ -5213,9 +5218,44 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) truc->momz = (117 * truc->momz) / 200; truc->tics = TICRATE*2; truc->color = color; + truc->hitlag += delay; + truc->renderflags |= RF_DONTDRAW; } } +void K_SpawnBrolyKi(mobj_t *source, tic_t duration) +{ + mobj_t *x; + + if (duration == 0) + { + return; + } + + x = P_SpawnMobjFromMobj(source, 0, 0, 0, MT_THOK); + + // Shrink into center of source object. + x->z = (source->z + source->height / 2); + x->height = 0; + + P_SetMobjState(x, S_BROLY1); + x->colorized = true; + x->color = source->color; + x->hitlag = 0; // do not copy source hitlag + + P_SetScale(x, 64 * mapobjectscale); + x->scalespeed = x->scale / duration; + + // The last tic doesn't actually get rendered so in order + // to show scale = destscale, add one buffer tic. + x->tics = (duration + 1); + x->destscale = 1; // 0 also doesn't work + + K_ReduceVFX(x, NULL); + + S_StartSound(x, sfx_cdfm74); +} + #undef MINEQUAKEDIST fixed_t K_ItemScaleForPlayer(player_t *player) @@ -6688,6 +6728,9 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) mo->momz = FixedDiv(mo->momz, FixedSqrt(3*FRACUNIT)); } + mo->pitch = 0; + mo->roll = 0; + if (sound) { S_StartSound(mo, (sound == 1 ? sfx_kc2f : sfx_kpogos)); @@ -8631,6 +8674,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) //player->flashing = 0; eggsexplode = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SPBEXPLOSION); + eggsexplode->height = 2 * player->mo->height; + eggsexplode->color = player->mo->color; + if (player->eggmanblame >= 0 && player->eggmanblame < MAXPLAYERS && playeringame[player->eggmanblame] @@ -9097,6 +9143,11 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player) if (angledelta < nextbestdelta && momdelta < nextbestmomdelta) { + if (waypoint->prevwaypoints[i] == finishline) // NEVER allow finish line. + { + continue; + } + if (P_TraceWaypointTraversal(player->mo, waypoint->prevwaypoints[i]->mobj) == false) { // Save sight checks when all of the other checks pass, so we only do it if we have to diff --git a/src/k_kart.h b/src/k_kart.h index cddf3d503..87f3e1998 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -106,7 +106,8 @@ void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers); void K_DestroyBumpers(player_t *player, UINT8 amount); void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount); void K_MineFlashScreen(mobj_t *source); -void K_SpawnMineExplosion(mobj_t *source, UINT8 color); +void K_SpawnMineExplosion(mobj_t *source, UINT8 color, tic_t delay); +void K_SpawnBrolyKi(mobj_t *source, tic_t duration); void K_RunFinishLineBeam(void); UINT16 K_DriftSparkColor(player_t *player, INT32 charge); void K_SpawnBoostTrail(player_t *player); diff --git a/src/k_menu.h b/src/k_menu.h index 588542002..d8a966775 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -101,17 +101,17 @@ extern M_waiting_mode_t m_waiting_mode; typedef union { - struct menu_s *submenu; // IT_SUBMENU + menu_t *submenu; // IT_SUBMENU consvar_t *cvar; // IT_CVAR void (*routine)(INT32 choice); // IT_CALL, IT_KEYHANDLER, IT_ARROWS } itemaction_t; // Player Setup menu colors linked list -typedef struct menucolor_s { - struct menucolor_s *next; - struct menucolor_s *prev; +struct menucolor_t { + menucolor_t *next; + menucolor_t *prev; UINT16 color; -} menucolor_t; +}; extern menucolor_t *menucolorhead, *menucolortail; @@ -121,7 +121,7 @@ extern CV_PossibleValue_t gametype_cons_t[]; // MENU TYPEDEFS // -typedef struct menuitem_s +struct menuitem_t { UINT16 status; // show IT_xxx @@ -134,12 +134,12 @@ typedef struct menuitem_s // extra variables INT32 mvar1; INT32 mvar2; -} menuitem_t; +}; -typedef struct menu_s +struct menu_t { INT16 numitems; // # of menu items - struct menu_s *prevMenu; // previous menu + menu_t *prevMenu; // previous menu INT16 lastOn; // last item user was on in menu menuitem_t *menuitems; // menu items @@ -155,7 +155,7 @@ typedef struct menu_s void (*initroutine)(void); // called when starting a new menu boolean (*quitroutine)(void); // called before quit a menu return true if we can boolean (*inputroutine)(INT32); // if set, called every frame in the input handler. Returning true overwrites normal input handling. -} menu_t; +}; typedef enum { @@ -522,7 +522,7 @@ typedef enum MBT_START = 1<<8 } menuButtonCode_t; -typedef struct menucmd_s +struct menucmd_t { SINT8 dpad_ud; // up / down dpad SINT8 dpad_lr; // left / right @@ -530,15 +530,15 @@ typedef struct menucmd_s UINT32 buttonsHeld; // prev frame's buttons UINT16 delay; // menu wait UINT32 delayCount; // num times ya did menu wait (to make the wait shorter each time) -} menucmd_t; +}; extern menucmd_t menucmd[MAXSPLITSCREENPLAYERS]; extern struct menutransition_s { INT16 tics; INT16 dest; - struct menu_s *startmenu; - struct menu_s *endmenu; + menu_t *startmenu; + menu_t *endmenu; boolean in; } menutransition; @@ -607,7 +607,7 @@ typedef enum CSSTEP_READY } setup_mdepth_t; -typedef struct setup_player_s +struct setup_player_t { SINT8 gridx, gridy; UINT8 profilen; @@ -633,7 +633,7 @@ typedef struct setup_player_s tic_t follower_timer; UINT8 follower_frame; state_t *follower_state; -} setup_player_t; +}; extern setup_player_t setup_player[MAXSPLITSCREENPLAYERS]; @@ -800,12 +800,12 @@ void M_ServerListFillDebug(void); // Options menu: // mode descriptions for video mode menu -typedef struct +struct modedesc_t { INT32 modenum; // video mode number in the vidmodes list const char *desc; // XXXxYYY UINT8 goodratio; // aspect correct if 1 -} modedesc_t; +}; #define MAXCOLUMNMODES 12 //max modes displayed in one column diff --git a/src/k_pathfind.h b/src/k_pathfind.h index 3d08d87e7..38b0b207f 100644 --- a/src/k_pathfind.h +++ b/src/k_pathfind.h @@ -35,27 +35,27 @@ typedef boolean(*getpathfindfinishedfunc)(void*, void*); // A pathfindnode contains information about a node from the pathfinding // heapindex is only used within the pathfinding algorithm itself, and is always 0 after it is completed -typedef struct pathfindnode_s { +struct pathfindnode_t { size_t heapindex; // The index in the openset binary heap. Only valid while the node is in the openset. void *nodedata; - struct pathfindnode_s *camefrom; // should eventually be the most efficient predecessor node + pathfindnode_t *camefrom; // should eventually be the most efficient predecessor node UINT32 gscore; // The accumulated distance from the start to this node UINT32 hscore; // The heuristic from this node to the goal -} pathfindnode_t; +}; // Contains the final created path after pathfinding is completed -typedef struct path_s { +struct path_t { size_t numnodes; - struct pathfindnode_s *array; + pathfindnode_t *array; UINT32 totaldist; -} path_t; +}; // Contains info about the pathfinding used to setup the algorithm // (e.g. the base capacities of the dynamically allocated arrays) // should be setup by the caller before starting pathfinding // base capacities will be 8 if they aren't setup, missing callback functions will cause an error. // Can be accessed after the pathfinding is complete to get the final capacities of them -typedef struct pathfindsetup_s { +struct pathfindsetup_t { size_t opensetcapacity; size_t closedsetcapacity; size_t nodesarraycapacity; @@ -67,7 +67,7 @@ typedef struct pathfindsetup_s { getnodeheuristicfunc getheuristic; getnodetraversablefunc gettraversable; getpathfindfinishedfunc getfinished; -} pathfindsetup_t; +}; /*-------------------------------------------------- diff --git a/src/k_profiles.h b/src/k_profiles.h index 961ac807b..2e65a49fe 100644 --- a/src/k_profiles.h +++ b/src/k_profiles.h @@ -45,7 +45,7 @@ // profile_t definition (WIP) // If you edit, see PR_SaveProfiles and PR_LoadProfiles -typedef struct profile_s +struct profile_t { // Versionning @@ -70,7 +70,7 @@ typedef struct profile_s // Finally, control data itself INT32 controls[num_gamecontrols][MAXINPUTMAPPING]; // Lists of all the controls, defined the same way as default inputs in g_input.c -} profile_t; +}; // Functions diff --git a/src/k_terrain.h b/src/k_terrain.h index 84bdc6ad8..349455bed 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -22,7 +22,7 @@ #define TERRAIN_NAME_LEN 32 -typedef struct t_splash_s +struct t_splash_t { // Splash definition. // These are particles spawned when hitting the floor. @@ -41,9 +41,9 @@ typedef struct t_splash_s angle_t cone; // Randomized angle of the push-out. UINT8 numParticles; // Number of particles to spawn. -} t_splash_t; +}; -typedef struct t_footstep_s +struct t_footstep_t { // Footstep definition. // These are particles spawned when moving fast enough on a floor. @@ -64,7 +64,7 @@ typedef struct t_footstep_s tic_t sfxFreq; // How frequently to play the sound. tic_t frequency; // How frequently to spawn the particles. fixed_t requiredSpeed; // Speed percentage you need to be at to trigger the particles. -} t_footstep_t; +}; typedef enum { @@ -75,7 +75,7 @@ typedef enum TOV__MAX } t_overlay_action_t; -typedef struct t_overlay_s +struct t_overlay_t { // Overlay definition. // These are sprites displayed on top of the base object. @@ -87,7 +87,7 @@ typedef struct t_overlay_s fixed_t scale; // Thing scale multiplier. UINT16 color; // Colorize effect. SKINCOLOR_NONE has no colorize. fixed_t speed; // Speed-up based on object speed. 0 plays the animation at a constant rate. -} t_overlay_t; +}; typedef enum { @@ -98,7 +98,7 @@ typedef enum TRF_TRIPWIRE = 1<<3 // Texture is a tripwire when used as a midtexture } terrain_flags_t; -typedef struct terrain_s +struct terrain_t { // Terrain definition. // These are all of the properties that the floor gets. @@ -118,9 +118,9 @@ typedef struct terrain_s angle_t speedPadAngle; // Speed pad angle fixed_t floorClip; // Offset for sprites on this ground UINT32 flags; // Flag values (see: terrain_flags_t) -} terrain_t; +}; -typedef struct t_floor_s +struct t_floor_t { // Terrain floor definition. // Ties a texture name to a terrain definition. @@ -128,7 +128,7 @@ typedef struct t_floor_s char textureName[9]; // Floor texture name. UINT32 textureHash; // Floor texture hash. size_t terrainID; // Terrain definition ID. -} t_floor_t; +}; /*-------------------------------------------------- diff --git a/src/k_waypoint.c b/src/k_waypoint.c index 837f77102..a36cdfeb7 100644 --- a/src/k_waypoint.c +++ b/src/k_waypoint.c @@ -361,7 +361,7 @@ waypoint_t *K_GetBestWaypointForMobj(mobj_t *const mobj) // remember: huge radius if (closestdist <= rad && checkdist <= rad && finishline != NULL) { - if (!P_TraceBlockingLines(mobj, checkwaypoint->mobj)) // Intentionally not P_TraceWaypointTraversal + if (!P_TraceWaypointTraversal(mobj, checkwaypoint->mobj)) { // Save sight checks when all of the other checks pass, so we only do it if we have to continue; @@ -379,7 +379,7 @@ waypoint_t *K_GetBestWaypointForMobj(mobj_t *const mobj) } else if (checkdist < closestdist && bestfindist == INT32_MAX) { - if (!P_TraceBlockingLines(mobj, checkwaypoint->mobj)) // Intentionally not P_TraceWaypointTraversal + if (!P_TraceWaypointTraversal(mobj, checkwaypoint->mobj)) { // Save sight checks when all of the other checks pass, so we only do it if we have to continue; diff --git a/src/k_waypoint.h b/src/k_waypoint.h index 1cb659dbe..9239cd41c 100644 --- a/src/k_waypoint.h +++ b/src/k_waypoint.h @@ -20,17 +20,17 @@ #define DEFAULT_WAYPOINT_RADIUS (384) -typedef struct waypoint_s +struct waypoint_t { mobj_t *mobj; boolean onaline; - struct waypoint_s **nextwaypoints; - struct waypoint_s **prevwaypoints; + waypoint_t **nextwaypoints; + waypoint_t **prevwaypoints; UINT32 *nextwaypointdistances; UINT32 *prevwaypointdistances; size_t numnextwaypoints; size_t numprevwaypoints; -} waypoint_t; +}; // AVAILABLE FOR LUA diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 06fbb789c..8c88c5155 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3601,10 +3601,11 @@ static int lib_kSpawnMineExplosion(lua_State *L) { mobj_t *source = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); UINT8 color = (UINT8)luaL_optinteger(L, 2, SKINCOLOR_KETCHUP); + tic_t delay = (tic_t)luaL_optinteger(L, 3, 0); NOHUD if (!source) return LUA_ErrInvalid(L, "mobj_t"); - K_SpawnMineExplosion(source, color); + K_SpawnMineExplosion(source, color, delay); return 0; } diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index b797f669c..142d01490 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -27,6 +27,8 @@ #include "d_netcmd.h" // for cv_perfstats #include "i_system.h" // I_GetPreciseTime +#include "v_video.h" // V_ClearClipRect + /* ========================================================================= ABSTRACTION ========================================================================= */ @@ -641,8 +643,13 @@ void LUA_HookHUD(huddrawlist_h list, int hook_type) LUA_SetHudHook(hook_type, list); hud_running = true; // local hook + + // Catch runaway clipping rectangles. + V_ClearClipRect(); + init_hook_call(&hook, 0, res_none); call_mapped(&hook, map); + hud_running = false; } } diff --git a/src/lua_hudlib_drawlist.h b/src/lua_hudlib_drawlist.h index 398293602..15249e4f9 100644 --- a/src/lua_hudlib_drawlist.h +++ b/src/lua_hudlib_drawlist.h @@ -24,8 +24,6 @@ extern "C" { #endif -typedef struct huddrawlist_s *huddrawlist_h; - // Create a new drawlist. Returns a handle to it. huddrawlist_h LUA_HUD_CreateDrawList(void); // Clears the draw list. diff --git a/src/m_aatree.c b/src/m_aatree.c index c0bb739f8..506887776 100644 --- a/src/m_aatree.c +++ b/src/m_aatree.c @@ -27,7 +27,7 @@ typedef struct aatree_node_s struct aatree_node_s *left, *right; } aatree_node_t; -struct aatree_s +struct aatree_t { aatree_node_t *root; UINT32 flags; diff --git a/src/m_aatree.h b/src/m_aatree.h index b784eb17a..77bfd05fb 100644 --- a/src/m_aatree.h +++ b/src/m_aatree.h @@ -19,7 +19,6 @@ // Flags for AA trees. #define AATREE_ZUSER 1 // Treat values as z_zone-allocated blocks and set their user fields -typedef struct aatree_s aatree_t; typedef void (*aatree_iter_t)(INT32 key, void *value); aatree_t *M_AATreeAlloc(UINT32 flags); diff --git a/src/m_cond.h b/src/m_cond.h index 323c84347..c340fbef1 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -37,7 +37,7 @@ typedef enum } conditiontype_t; // Condition Set information -typedef struct +struct condition_t { UINT32 id; /// <- The ID of this condition. /// In an unlock condition, all conditions with the same ID @@ -47,14 +47,14 @@ typedef struct INT32 requirement; /// <- The requirement for this variable. INT16 extrainfo1; /// <- Extra information for the condition when needed. INT16 extrainfo2; /// <- Extra information for the condition when needed. -} condition_t; -typedef struct +}; +struct conditionset_t { UINT32 numconditions; /// <- number of conditions. condition_t *condition; /// <- All conditionals to be checked. UINT8 achieved; /// <- Whether this conditional has been achieved already or not. /// (Conditional checking is skipped if true -- it's assumed you can't relock an unlockable) -} conditionset_t; +}; // Emblem information #define ET_GLOBAL 0 // Emblem with a position in space @@ -69,7 +69,7 @@ typedef struct // Map emblem flags #define ME_ENCORE 1 -typedef struct +struct emblem_t { UINT8 type; ///< Emblem type INT16 tag; ///< Tag of emblem mapthing @@ -79,8 +79,8 @@ typedef struct INT32 var; ///< If needed, specifies information on the target amount to achieve (or target skin) char hint[110]; ///< Hint for emblem hints menu UINT8 collected; ///< Do you have this emblem? -} emblem_t; -typedef struct +}; +struct extraemblem_t { char name[20]; ///< Name of the goal (used in the "emblem awarded" cecho) char description[40]; ///< Description of goal (used in statistics) @@ -89,10 +89,10 @@ typedef struct UINT8 sprite; ///< emblem sprite to use, 0 - 25 UINT16 color; ///< skincolor to use UINT8 collected; ///< Do you have this emblem? -} extraemblem_t; +}; // Unlockable information -typedef struct +struct unlockable_t { char name[64]; char objective[64]; @@ -103,7 +103,7 @@ typedef struct UINT8 nocecho; UINT8 nochecklist; UINT8 unlocked; -} unlockable_t; +}; #define SECRET_NONE 0 // Does nil. Use with levels locked by UnlockRequired #define SECRET_HEADER 1 // Does nothing on its own, just serves as a header for the menu diff --git a/src/m_dllist.h b/src/m_dllist.h index 680c2cd80..1a1f0a6ea 100644 --- a/src/m_dllist.h +++ b/src/m_dllist.h @@ -29,11 +29,11 @@ #pragma warning(disable : 4706) #endif -typedef struct mdllistitem_s +struct mdllistitem_t { - struct mdllistitem_s *next; - struct mdllistitem_s **prev; -} mdllistitem_t; + mdllistitem_t *next; + mdllistitem_t **prev; +}; FUNCINLINE static ATTRINLINE void M_DLListInsert(mdllistitem_t *item, mdllistitem_t **head) { diff --git a/src/m_fixed.h b/src/m_fixed.h index fd8e79b94..b605434fb 100644 --- a/src/m_fixed.h +++ b/src/m_fixed.h @@ -333,11 +333,11 @@ FUNCMATH FUNCINLINE static ATTRINLINE fixed_t FixedRound(fixed_t x) return INT32_MAX; } -typedef struct +struct vector2_t { fixed_t x; fixed_t y; -} vector2_t; +}; vector2_t *FV2_Load(vector2_t *vec, fixed_t x, fixed_t y); vector2_t *FV2_UnLoad(vector2_t *vec, fixed_t *x, fixed_t *y); @@ -361,10 +361,10 @@ boolean FV2_Equal(const vector2_t *a_1, const vector2_t *a_2); fixed_t FV2_Dot(const vector2_t *a_1, const vector2_t *a_2); vector2_t *FV2_Point2Vec (const vector2_t *point1, const vector2_t *point2, vector2_t *a_o); -typedef struct +struct vector3_t { fixed_t x, y, z; -} vector3_t; +}; vector3_t *FV3_Load(vector3_t *vec, fixed_t x, fixed_t y, fixed_t z); vector3_t *FV3_UnLoad(vector3_t *vec, fixed_t *x, fixed_t *y, fixed_t *z); @@ -401,10 +401,10 @@ vector3_t *FV3_IntersectionPoint(const vector3_t *vNormal, const vector3_t *vLin UINT8 FV3_PointOnLineSide(const vector3_t *point, const vector3_t *line); boolean FV3_PointInsideBox(const vector3_t *point, const vector3_t *box); -typedef struct +struct matrix_t { fixed_t m[16]; -} matrix_t; +}; void FM_LoadIdentity(matrix_t* matrix); void FM_CreateObjectMatrix(matrix_t *matrix, fixed_t x, fixed_t y, fixed_t z, fixed_t anglex, fixed_t angley, fixed_t anglez, fixed_t upx, fixed_t upy, fixed_t upz, fixed_t radius); diff --git a/src/m_perfstats.h b/src/m_perfstats.h index 2c448031c..f0a186bf3 100644 --- a/src/m_perfstats.h +++ b/src/m_perfstats.h @@ -38,22 +38,22 @@ extern int ps_checkposition_calls; extern precise_t ps_lua_thinkframe_time; extern int ps_lua_mobjhooks; -typedef struct +struct ps_hookinfo_t { precise_t time_taken; char short_src[LUA_IDSIZE]; -} ps_hookinfo_t; +}; void PS_SetThinkFrameHookInfo(int index, precise_t time_taken, char* short_src); -typedef struct +struct ps_botinfo_t { boolean isBot; precise_t total; precise_t prediction; // K_CreateBotPrediction precise_t nudge; // K_NudgePredictionTowardsObjects precise_t item; // K_BotItemUsage -} ps_botinfo_t; +}; extern ps_botinfo_t ps_bots[MAXPLAYERS]; diff --git a/src/m_queue.h b/src/m_queue.h index 3e9579e11..8e0c02797 100644 --- a/src/m_queue.h +++ b/src/m_queue.h @@ -13,17 +13,17 @@ #ifndef M_QUEUE_H #define M_QUEUE_H -typedef struct mqueueitem_s +struct mqueueitem_t { - struct mqueueitem_s *next; -} mqueueitem_t; + mqueueitem_t *next; +}; -typedef struct mqueue_s +struct mqueue_t { mqueueitem_t head; mqueueitem_t *tail; mqueueitem_t *rover; -} mqueue_t; +}; void M_QueueInit(mqueue_t *queue); void M_QueueInsert(mqueueitem_t *item, mqueue_t *queue); diff --git a/src/mserv.h b/src/mserv.h index eb1152876..b47bf2c25 100644 --- a/src/mserv.h +++ b/src/mserv.h @@ -27,16 +27,16 @@ typedef union } ATTRPACK msg_header_t; // Keep this structure 8 bytes aligned (current size is 80) -typedef struct +struct msg_server_t { msg_header_t header; char ip[16]; char port[8]; char contact[32]; char version[8]; // format is: x.yy.z (like 1.30.2 or 1.31) -} ATTRPACK msg_server_t; +} ATTRPACK; -typedef struct +struct msg_ban_t { msg_header_t header; char ipstart[16]; @@ -44,7 +44,7 @@ typedef struct char endstamp[32]; char reason[255]; INT32 hostonly; -} ATTRPACK msg_ban_t; +} ATTRPACK; #if defined(_MSC_VER) #pragma pack() diff --git a/src/p_enemy.c b/src/p_enemy.c index 0db891f81..afe17b5bc 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -315,6 +315,7 @@ void A_ItemPop(mobj_t *actor); void A_JawzExplode(mobj_t *actor); void A_SSMineSearch(mobj_t *actor); void A_SSMineExplode(mobj_t *actor); +void A_SSMineFlash(mobj_t *actor); void A_LandMineExplode(mobj_t *actor); void A_BallhogExplode(mobj_t *actor); void A_LightningFollowPlayer(mobj_t *actor); @@ -750,9 +751,6 @@ boolean P_LookForPlayers(mobj_t *actor, boolean allaround, boolean tracer, fixed if (player->mo->health <= 0) continue; // dead - if (player->bot) - continue; // ignore bots - if (dist > 0 && P_AproxDistance(P_AproxDistance(player->mo->x - actor->x, player->mo->y - actor->y), player->mo->z - actor->z) > dist) continue; // Too far away @@ -13120,14 +13118,21 @@ void A_SSMineExplode(mobj_t *actor) { INT32 locvar1 = var1; + tic_t delay; + if (LUA_CallAction(A_SSMINEEXPLODE, actor)) return; if (actor->flags2 & MF2_DEBRIS) return; - K_SpawnMineExplosion(actor, (actor->target && actor->target->player) ? actor->target->player->skincolor : SKINCOLOR_KETCHUP); - K_MineExplodeAttack(actor, (3*actor->info->painchance)>>1, (boolean)locvar1); + delay = K_MineExplodeAttack(actor, (3*actor->info->painchance)>>1, (boolean)locvar1); + K_SpawnMineExplosion(actor, (actor->target && actor->target->player) ? actor->target->player->skincolor : SKINCOLOR_KETCHUP, delay); +} + +void A_SSMineFlash(mobj_t *actor) +{ + K_MineFlashScreen(actor); } void A_LandMineExplode(mobj_t *actor) @@ -13138,21 +13143,27 @@ void A_LandMineExplode(mobj_t *actor) INT32 i; mobj_t *smoldering; + tic_t delay = actor->reactiontime; + if (LUA_CallAction(A_LANDMINEEXPLODE, actor)) return; + if (delay == 0) + { + delay = 8; + } + // we'll base the explosion "timer" off of some stupid variable like uh... cvmem! // Yeah let's use cvmem since nobody uses that if (actor->target && !P_MobjWasRemoved(actor->target)) colour = actor->target->color; - K_MineFlashScreen(actor); - // Spawn smoke remains: smoldering = P_SpawnMobj(actor->x, actor->y, actor->z, MT_SMOLDERING); P_SetScale(smoldering, actor->scale); smoldering->tics = TICRATE*3; + smoldering->hitlag = delay; actor->fuse = actor->tics; // disappear when this state ends. @@ -13162,6 +13173,8 @@ void A_LandMineExplode(mobj_t *actor) expl = P_SpawnMobj(actor->x, actor->y, actor->z + actor->scale, MT_BOOMEXPLODE); expl->color = colour; expl->tics = (i+1); + expl->hitlag = delay; + expl->renderflags |= RF_DONTDRAW; //K_MatchGenericExtraFlags(expl, actor); P_SetScale(expl, actor->scale*4); @@ -13172,6 +13185,8 @@ void A_LandMineExplode(mobj_t *actor) // 100/45 = 2.22 fu/t expl->momz = ((i+1)*actor->scale*5/2)*P_MobjFlip(expl); } + + K_SpawnBrolyKi(actor, delay); } void A_BallhogExplode(mobj_t *actor) diff --git a/src/p_inter.c b/src/p_inter.c index 6498397d8..904905cb3 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2181,6 +2181,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_SpinPlayer(player, inflictor, source, KSPIN_WIPEOUT); K_KartPainEnergyFling(player); break; + case DMG_VOLTAGE: case DMG_NORMAL: default: K_SpinPlayer(player, inflictor, source, KSPIN_SPINOUT); diff --git a/src/p_local.h b/src/p_local.h index 9bc92cb64..d9486e8b7 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -80,7 +80,7 @@ void P_RemoveThinker(thinker_t *thinker); // // P_USER // -typedef struct camera_s +struct camera_t { boolean chase; angle_t aiming; @@ -96,7 +96,7 @@ typedef struct camera_s //More drawing info: to determine current sprite. angle_t angle; // orientation - struct subsector_s *subsector; + subsector_t *subsector; // The closest interval over all contacted Sectors (or Things). fixed_t floorz; @@ -119,7 +119,7 @@ typedef struct camera_s // Interpolation data fixed_t old_x, old_y, old_z; angle_t old_angle, old_aiming; -} camera_t; +}; // demo freecam or something before i commit die struct demofreecam_s { @@ -246,11 +246,11 @@ typedef enum NUMJINGLES } jingletype_t; -typedef struct +struct jingle_t { char musname[7]; boolean looping; -} jingle_t; +}; extern jingle_t jingleinfo[NUMJINGLES]; @@ -381,7 +381,7 @@ void P_InternalFlickyHop(mobj_t *actor, fixed_t momz, fixed_t momh, angle_t angl // P_MAP // -typedef struct tm_s +struct tm_t { mobj_t *thing; fixed_t x, y; @@ -411,7 +411,7 @@ typedef struct tm_s // set by PIT_CheckLine() for any line that stopped the PIT_CheckLine() // that is, for any line which is 'solid' line_t *blockingline; -} tm_t; +}; extern tm_t tm; @@ -431,12 +431,12 @@ void P_UnsetThingPosition(mobj_t *thing); void P_SetThingPosition(mobj_t *thing); void P_SetUnderlayPosition(mobj_t *thing); -typedef struct TryMoveResult_s +struct TryMoveResult_t { boolean success; line_t *line; mobj_t *mo; -} TryMoveResult_t; +}; boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y, TryMoveResult_t *result); boolean P_CheckMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff, TryMoveResult_t *result); @@ -496,7 +496,7 @@ extern mobj_t **blocklinks; // for thing chains // // P_INTER // -typedef struct BasicFF_s +struct BasicFF_t { INT32 ForceX; ///< The X of the Force's Vel INT32 ForceY; ///< The Y of the Force's Vel @@ -506,7 +506,7 @@ typedef struct BasicFF_s INT32 Gain; ///< /The gain to be applied to the effect, in the range from 0 through 10,000. //All, CONSTANTFORCE �10,000 to 10,000 INT32 Magnitude; ///< Magnitude of the effect, in the range from 0 through 10,000. -} BasicFF_t; +}; /* Damage/death types, for P_DamageMobj and related */ //// Damage types @@ -516,6 +516,7 @@ typedef struct BasicFF_s #define DMG_TUMBLE 0x03 #define DMG_STING 0x04 #define DMG_KARMA 0x05 // Karma Bomb explosion -- works like DMG_EXPLODE, but steals half of their bumpers & deletes the rest +#define DMG_VOLTAGE 0x06 //// Death types - cannot be combined with damage types #define DMG_INSTAKILL 0x80 #define DMG_DEATHPIT 0x81 diff --git a/src/p_map.c b/src/p_map.c index ddc02ca0e..a2916a94a 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1464,6 +1464,11 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) } } + // This code is causing conflicts for Ring Racers, + // as solid objects cause bumping. If you need to + // bring back this code for a moving platform-style + // object, separate it properly. +#if 0 if ((tm.thing->flags & MF_SPRING || tm.thing->type == MT_STEAM || tm.thing->type == MT_SPIKE || tm.thing->type == MT_WALLSPIKE) && (thing->player)) ; // springs, gas jets and springs should never be able to step up onto a player // z checking at last @@ -1562,6 +1567,7 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) } } } +#endif // not solid not blocked return BMIT_CONTINUE; diff --git a/src/p_maputl.c b/src/p_maputl.c index 7eb4a7e19..e1ceeb0fe 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -534,7 +534,7 @@ P_GetMidtextureTopBottom texbottom = back->floorheight + side->rowoffset; textop = back->ceilingheight + side->rowoffset; } - else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_MIDPEG)) + else if (linedef->flags & ML_MIDPEG) { texbottom = back->floorheight + side->rowoffset; textop = texbottom + texheight*(side->repeatcnt+1); @@ -553,7 +553,7 @@ P_GetMidtextureTopBottom texbottom += side->rowoffset; textop += side->rowoffset; } - else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_MIDPEG)) + else if (linedef->flags & ML_MIDPEG) { texbottom += side->rowoffset; textop = texbottom + texheight*(side->repeatcnt+1); diff --git a/src/p_maputl.h b/src/p_maputl.h index b53bddfd1..15e2abbf4 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -20,12 +20,12 @@ // // P_MAPUTL // -typedef struct +struct divline_t { fixed_t x, y, dx, dy; -} divline_t; +}; -typedef struct +struct intercept_t { fixed_t frac; // along trace line boolean isaline; @@ -34,7 +34,7 @@ typedef struct mobj_t *thing; line_t *line; } d; -} intercept_t; +}; typedef boolean (*traverser_t)(intercept_t *in); diff --git a/src/p_mobj.c b/src/p_mobj.c index d08e5ed3a..137bc38fe 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4546,7 +4546,7 @@ boolean P_SupermanLook4Players(mobj_t *actor) { if (playeringame[c] && !players[c].spectator) { - if (!players[c].mo || players[c].bot) + if (!players[c].mo) continue; if (players[c].mo->health <= 0) @@ -5895,9 +5895,13 @@ static void P_MobjSceneryThink(mobj_t *mobj) K_MatchGenericExtraFlags(smoke, mobj); smoke->scale = mobj->scale * 2; smoke->destscale = mobj->scale * 6; - smoke->momz = P_RandomRange(PR_SMOLDERING, 4, 9)*FRACUNIT*P_MobjFlip(smoke); + smoke->momz = P_RandomRange(PR_SMOLDERING, 4, 9)*mobj->scale*P_MobjFlip(smoke); } break; + case MT_SMOKE: + case MT_BOOMEXPLODE: + mobj->renderflags &= ~(RF_DONTDRAW); + break; case MT_BOOMPARTICLE: { fixed_t x = P_RandomRange(PR_EXPLOSION, -16, 16)*mobj->scale; @@ -6393,15 +6397,121 @@ static void P_MobjSceneryThink(mobj_t *mobj) break; case MT_BATTLECAPSULE_PIECE: if (mobj->extravalue2) + { mobj->frame |= FF_VERTICALFLIP; + } else + { mobj->frame &= ~FF_VERTICALFLIP; + } if (mobj->flags2 & MF2_OBJECTFLIP) + { mobj->eflags |= MFE_VERTICALFLIP; + } if (mobj->tics > 0) + { + // Despawning. mobj->renderflags ^= RF_DONTDRAW; + } + else + { + statenum_t state = (statenum_t)(mobj->state - states); + mobj_t *owner = mobj->target; + fixed_t newx, newy, newz; + SINT8 flip; + + if (owner == NULL || P_MobjWasRemoved(owner) == true) + { + // Exit early. + break; + } + + newx = owner->x; + newy = owner->y; + newz = P_GetMobjFeet(owner); + + flip = P_MobjFlip(owner); // Flying capsules needs flipped sprites, but not flipped gravity + if (owner->extravalue1) + { + flip = -flip; + newz += owner->height; + } + + mobj->scale = owner->scale; + mobj->destscale = owner->destscale; + mobj->scalespeed = owner->scalespeed; + + mobj->extravalue2 = owner->extravalue1; + + mobj->flags2 = (mobj->flags2 & ~MF2_OBJECTFLIP) | (owner->flags2 & MF2_OBJECTFLIP); + + switch (state) + { + case S_BATTLECAPSULE_TOP: + { + newz += (80 * owner->scale * flip); + break; + } + + case S_BATTLECAPSULE_BUTTON: + { + newz += (120 * owner->scale * flip); + break; + } + + case S_BATTLECAPSULE_SUPPORT: + case S_BATTLECAPSULE_SUPPORTFLY: + case S_KARMAWHEEL: + { + fixed_t offx = 36 * owner->scale; + fixed_t offy = 36 * owner->scale; + + if (mobj->extravalue1 & 1) + { + offx = -offx; + } + + if (mobj->extravalue1 > 1) + { + offy = -offy; + } + + newx += offx; + newy += offy; + break; + } + + case S_BATTLECAPSULE_SIDE1: + case S_BATTLECAPSULE_SIDE2: + { +#define inradius 3797355 // Precalculated +#ifndef inradius + fixed_t inradius = FixedDiv(48 << FRACBITS, 2 * FINETANGENT((((ANGLE_180 / 8) + ANGLE_90) >> ANGLETOFINESHIFT) & 4095)); +#endif + fixed_t offset = FixedMul(inradius, owner->scale); + angle_t angle = (ANGLE_45 * mobj->extravalue1); + + newx += FixedMul(offset, FINECOSINE(angle >> ANGLETOFINESHIFT)); + newy += FixedMul(offset, FINESINE(angle >> ANGLETOFINESHIFT)); + newz += (12 * owner->scale * flip); + + mobj->angle = angle + ANGLE_90; + break; +#undef inradius + } + + default: + { + break; + } + } + + mobj->momx = newx - mobj->x; + mobj->momy = newy - mobj->y; + mobj->momz = newz - mobj->z; + } break; case MT_SPINDASHWIND: case MT_DRIFTELECTRICSPARK: @@ -9050,8 +9160,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { SINT8 realflip = P_MobjFlip(mobj); SINT8 flip = realflip; // Flying capsules needs flipped sprites, but not flipped gravity - fixed_t bottom; - mobj_t *cur; if (mobj->extravalue1) { @@ -9156,67 +9264,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } } } - - if (flip == -1) - bottom = mobj->z + mobj->height; - else - bottom = mobj->z; - - cur = mobj->hnext; - - // Move each piece to the proper position - while (cur && !P_MobjWasRemoved(cur)) - { - fixed_t newx = mobj->x; - fixed_t newy = mobj->y; - fixed_t newz = bottom; - statenum_t state = (statenum_t)(cur->state-states); - - cur->scale = mobj->scale; - cur->destscale = mobj->destscale; - cur->scalespeed = mobj->scalespeed; - - cur->extravalue2 = mobj->extravalue1; - - cur->flags2 = (cur->flags2 & ~MF2_OBJECTFLIP)|(mobj->flags2 & MF2_OBJECTFLIP); - - if (state == S_BATTLECAPSULE_TOP) - newz += (80 * mobj->scale * flip); - else if (state == S_BATTLECAPSULE_BUTTON) - newz += (108 * mobj->scale * flip); - else if (state == S_BATTLECAPSULE_SUPPORT - || state == S_BATTLECAPSULE_SUPPORTFLY - || state == S_KARMAWHEEL) - { - fixed_t offx = mobj->radius; - fixed_t offy = mobj->radius; - - if (cur->extravalue1 & 1) - offx = -offx; - - if (cur->extravalue1 > 1) - offy = -offy; - - newx += offx; - newy += offy; - } - else if (state == S_BATTLECAPSULE_SIDE1 - || state == S_BATTLECAPSULE_SIDE2) - { - fixed_t offset = 48 * mobj->scale; - angle_t angle = (ANGLE_45 * cur->extravalue1); - - newx += FixedMul(offset, FINECOSINE(angle >> ANGLETOFINESHIFT)); - newy += FixedMul(offset, FINESINE(angle >> ANGLETOFINESHIFT)); - newz += (12 * mobj->scale * flip); - - cur->angle = angle + ANGLE_90; - } - - P_MoveOrigin(cur, newx, newy, newz); - - cur = cur->hnext; - } } break; case MT_RANDOMITEM: @@ -10008,6 +10055,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) { case MT_PLAYER: case MT_KART_LEFTOVER: + case MT_BATTLECAPSULE: thing->shadowscale = FRACUNIT; break; case MT_SMALLMACE: diff --git a/src/p_mobj.h b/src/p_mobj.h index b725f2bf0..8811c0149 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -270,7 +270,7 @@ typedef enum { } precipflag_t; // Map Object definition. -typedef struct mobj_s +struct mobj_t { // List: thinker links. thinker_t thinker; @@ -284,8 +284,8 @@ typedef struct mobj_s fixed_t old_x2, old_y2, old_z2; // More list: links in sector (if needed) - struct mobj_s *snext; - struct mobj_s **sprev; // killough 8/11/98: change to ptr-to-ptr + mobj_t *snext; + mobj_t **sprev; // killough 8/11/98: change to ptr-to-ptr // More drawing info: to determine current sprite. angle_t angle, pitch, roll; // orientation @@ -302,17 +302,17 @@ typedef struct mobj_s fixed_t spritexoffset, spriteyoffset; fixed_t old_spritexscale, old_spriteyscale; fixed_t old_spritexoffset, old_spriteyoffset; - struct pslope_s *floorspriteslope; // The slope that the floorsprite is rotated by + pslope_t *floorspriteslope; // The slope that the floorsprite is rotated by - struct msecnode_s *touching_sectorlist; // a linked list of sectors where this object appears + msecnode_t *touching_sectorlist; // a linked list of sectors where this object appears - struct subsector_s *subsector; // Subsector the mobj resides in. + subsector_t *subsector; // Subsector the mobj resides in. // The closest interval over all contacted sectors (or things). fixed_t floorz; // Nearest floor below. fixed_t ceilingz; // Nearest ceiling above. - struct ffloor_s *floorrover; // FOF referred by floorz - struct ffloor_s *ceilingrover; // FOF referred by ceilingz + ffloor_t *floorrover; // FOF referred by floorz + ffloor_t *ceilingrover; // FOF referred by ceilingz fixed_t floordrop; fixed_t ceilingdrop; @@ -337,15 +337,15 @@ typedef struct mobj_s // Interaction info, by BLOCKMAP. // Links in blocks (if needed). - struct mobj_s *bnext; - struct mobj_s **bprev; // killough 8/11/98: change to ptr-to-ptr + mobj_t *bnext; + mobj_t **bprev; // killough 8/11/98: change to ptr-to-ptr // Additional pointers for NiGHTS hoops - struct mobj_s *hnext; - struct mobj_s *hprev; + mobj_t *hnext; + mobj_t *hprev; // One last pointer for kart item lists - struct mobj_s *itnext; + mobj_t *itnext; INT32 health; // for player this is rings + 1 -- no it isn't, not any more!! @@ -353,7 +353,7 @@ typedef struct mobj_s angle_t movedir; // dirtype_t 0-7; also used by Deton for up/down angle INT32 movecount; // when 0, select a new dir - struct mobj_s *target; // Thing being chased/attacked (or NULL), and originator for missiles. + mobj_t *target; // Thing being chased/attacked (or NULL), and originator for missiles. INT32 reactiontime; // If not 0, don't attack yet. @@ -361,13 +361,13 @@ typedef struct mobj_s // Additional info record for player avatars only. // Only valid if type == MT_PLAYER - struct player_s *player; + player_t *player; INT32 lastlook; // Player number last looked for. mapthing_t *spawnpoint; // Used for CTF flags, objectplace, and a handful other applications. - struct mobj_s *tracer; // Thing being chased/attacked for tracers. + mobj_t *tracer; // Thing being chased/attacked for tracers. fixed_t friction; fixed_t movefactor; @@ -394,7 +394,7 @@ typedef struct mobj_s INT32 cusval; INT32 cvmem; - struct pslope_s *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?) + pslope_t *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?) boolean resetinterp; // if true, some fields should not be interpolated (see R_InterpolateMobjState implementation) boolean colorized; // Whether the mobj uses the rainbow colormap @@ -405,8 +405,8 @@ typedef struct mobj_s fixed_t sprxoff, spryoff, sprzoff; // Sprite offsets in real space, does NOT affect position or collision - struct terrain_s *terrain; // Terrain definition of the floor this object last hit. NULL when in the air. - struct mobj_s *terrainOverlay; // Overlay sprite object for terrain + terrain_t *terrain; // Terrain definition of the floor this object last hit. NULL when in the air. + mobj_t *terrainOverlay; // Overlay sprite object for terrain INT32 hitlag; // Sal-style hit lag, straight from Captain Fetch's jowls UINT8 waterskip; // Water skipping counter @@ -414,7 +414,7 @@ typedef struct mobj_s INT32 dispoffset; // WARNING: New fields must be added separately to savegame and Lua. -} mobj_t; +}; // // For precipitation @@ -423,7 +423,7 @@ typedef struct mobj_s // so please keep the start of the // structure the same. // -typedef struct precipmobj_s +struct precipmobj_t { // List: thinker links. thinker_t thinker; @@ -437,8 +437,8 @@ typedef struct precipmobj_s fixed_t old_x2, old_y2, old_z2; // More list: links in sector (if needed) - struct precipmobj_s *snext; - struct precipmobj_s **sprev; // killough 8/11/98: change to ptr-to-ptr + precipmobj_t *snext; + precipmobj_t **sprev; // killough 8/11/98: change to ptr-to-ptr // More drawing info: to determine current sprite. angle_t angle, pitch, roll; // orientation @@ -455,17 +455,17 @@ typedef struct precipmobj_s fixed_t spritexoffset, spriteyoffset; fixed_t old_spritexscale, old_spriteyscale; fixed_t old_spritexoffset, old_spriteyoffset; - struct pslope_s *floorspriteslope; // The slope that the floorsprite is rotated by + pslope_t *floorspriteslope; // The slope that the floorsprite is rotated by - struct mprecipsecnode_s *touching_sectorlist; // a linked list of sectors where this object appears + mprecipsecnode_t *touching_sectorlist; // a linked list of sectors where this object appears - struct subsector_s *subsector; // Subsector the mobj resides in. + subsector_t *subsector; // Subsector the mobj resides in. // The closest interval over all contacted sectors (or things). fixed_t floorz; // Nearest floor below. fixed_t ceilingz; // Nearest ceiling above. - struct ffloor_s *floorrover; // FOF referred by floorz - struct ffloor_s *ceilingrover; // FOF referred by ceilingz + ffloor_t *floorrover; // FOF referred by floorz + ffloor_t *ceilingrover; // FOF referred by ceilingz fixed_t floordrop; fixed_t ceilingdrop; @@ -480,15 +480,15 @@ typedef struct precipmobj_s INT32 tics; // state tic counter state_t *state; UINT32 flags; // flags from mobjinfo tables -} precipmobj_t; +}; -typedef struct actioncache_s +struct actioncache_t { - struct actioncache_s *next; - struct actioncache_s *prev; - struct mobj_s *mobj; + actioncache_t *next; + actioncache_t *prev; + mobj_t *mobj; INT32 statenum; -} actioncache_t; +}; extern actioncache_t actioncachehead; diff --git a/src/p_polyobj.h b/src/p_polyobj.h index 91333a107..dc5dab153 100644 --- a/src/p_polyobj.h +++ b/src/p_polyobj.h @@ -66,7 +66,7 @@ typedef enum // Polyobject Structure // -typedef struct polyobj_s +struct polyobj_t { mdllistitem_t link; // for subsector links; must be first @@ -78,7 +78,7 @@ typedef struct polyobj_s size_t segCount; // number of segs in polyobject size_t numSegsAlloc; // number of segs allocated - struct seg_s **segs; // the segs, a reallocating array. + seg_t **segs; // the segs, a reallocating array. size_t numVertices; // number of vertices (generally == segCount) size_t numVerticesAlloc; // number of vertices allocated @@ -88,7 +88,7 @@ typedef struct polyobj_s size_t numLines; // number of linedefs (generally <= segCount) size_t numLinesAlloc; // number of linedefs allocated - struct line_s **lines; // linedefs this polyobject must move + line_t **lines; // linedefs this polyobject must move degenmobj_t spawnSpot; // location of spawn spot vertex_t centerPt; // center point @@ -109,28 +109,28 @@ typedef struct polyobj_s INT32 translucency; // index to translucency tables INT16 triggertag; // Tag of linedef executor to trigger on touch - struct visplane_s *visplane; // polyobject's visplane, for ease of putting into the list later + visplane_t *visplane; // polyobject's visplane, for ease of putting into the list later // these are saved for netgames, so do not let Lua touch these! INT32 spawnflags; // Flags the polyobject originally spawned with INT32 spawntrans; // Translucency the polyobject originally spawned with -} polyobj_t; +}; // // Polyobject Blockmap Link Structure // -typedef struct polymaplink_s +struct polymaplink_t { mdllistitem_t link; // for blockmap links polyobj_t *po; // pointer to polyobject -} polymaplink_t; +}; // // Polyobject Special Thinkers // -typedef struct polyrotate_s +struct polyrotate_t { thinker_t thinker; // must be first @@ -138,9 +138,9 @@ typedef struct polyrotate_s INT32 speed; // speed of movement per frame INT32 distance; // distance to move UINT8 turnobjs; // turn objects? PTF_ flags -} polyrotate_t; +}; -typedef struct polymove_s +struct polymove_t { thinker_t thinker; // must be first @@ -150,7 +150,7 @@ typedef struct polymove_s fixed_t momy; // y component of speed along angle INT32 distance; // total distance to move UINT32 angle; // angle along which to move -} polymove_t; +}; // PolyObject waypoint movement return behavior typedef enum @@ -160,7 +160,7 @@ typedef enum PWR_COMEBACK, // Repeat sequence in reverse } polywaypointreturn_e; -typedef struct polywaypoint_s +struct polywaypoint_t { thinker_t thinker; // must be first @@ -172,9 +172,9 @@ typedef struct polywaypoint_s UINT8 returnbehavior; // behavior after reaching the last waypoint UINT8 continuous; // continuously move - used with PWR_WRAP or PWR_COMEBACK UINT8 stophere; // Will stop after it reaches the next waypoint -} polywaypoint_t; +}; -typedef struct polyslidedoor_s +struct polyslidedoor_t { thinker_t thinker; // must be first @@ -191,9 +191,9 @@ typedef struct polyslidedoor_s fixed_t momx; // x component of speed along angle fixed_t momy; // y component of speed along angle UINT8 closing; // if true, is closing -} polyslidedoor_t; +}; -typedef struct polyswingdoor_s +struct polyswingdoor_t { thinker_t thinker; // must be first @@ -205,31 +205,31 @@ typedef struct polyswingdoor_s INT32 initDistance; // initial distance to travel INT32 distance; // current distance to travel UINT8 closing; // if true, is closing -} polyswingdoor_t; +}; -typedef struct polydisplace_s +struct polydisplace_t { thinker_t thinker; // must be first INT32 polyObjNum; - struct sector_s *controlSector; + sector_t *controlSector; fixed_t dx; fixed_t dy; fixed_t oldHeights; -} polydisplace_t; +}; -typedef struct polyrotdisplace_s +struct polyrotdisplace_t { thinker_t thinker; // must be first INT32 polyObjNum; - struct sector_s *controlSector; + sector_t *controlSector; fixed_t rotscale; UINT8 turnobjs; fixed_t oldHeights; -} polyrotdisplace_t; +}; -typedef struct polyfade_s +struct polyfade_t { thinker_t thinker; // must be first @@ -241,7 +241,7 @@ typedef struct polyfade_s boolean ticbased; INT32 duration; INT32 timer; -} polyfade_t; +}; // // Line Activation Data Structures @@ -261,23 +261,23 @@ typedef enum PTF_OTHERS = 1<<1, // Turn other mobjs with movement } polyturnflags_e; -typedef struct polyrotdata_s +struct polyrotdata_t { INT32 polyObjNum; // numeric id of polyobject to affect INT32 direction; // direction of rotation INT32 speed; // angular speed INT32 distance; // distance to move UINT8 flags; // TMPR_ flags -} polyrotdata_t; +}; -typedef struct polymovedata_s +struct polymovedata_t { INT32 polyObjNum; // numeric id of polyobject to affect fixed_t distance; // distance to move fixed_t speed; // linear speed angle_t angle; // angle of movement UINT8 overRide; // if true, will override any action on the object -} polymovedata_t; +}; typedef enum { @@ -285,14 +285,14 @@ typedef enum PWF_LOOP = 1<<1, // Loop movement (used with PWR_WRAP or PWR_COMEBACK) } polywaypointflags_e; -typedef struct polywaypointdata_s +struct polywaypointdata_t { INT32 polyObjNum; // numeric id of polyobject to affect INT32 sequence; // waypoint sequence # fixed_t speed; // linear speed UINT8 returnbehavior; // behavior after reaching the last waypoint UINT8 flags; // PWF_ flags -} polywaypointdata_t; +}; typedef enum { @@ -315,7 +315,7 @@ typedef enum POLY_DOOR_SWING, } polydoor_e; -typedef struct polydoordata_s +struct polydoordata_t { INT32 polyObjNum; // numeric id of polyobject to affect INT32 doorType; // polyobj door type @@ -323,31 +323,31 @@ typedef struct polydoordata_s angle_t angle; // for slide door only, angle of motion INT32 distance; // distance to move INT32 delay; // delay time after opening -} polydoordata_t; +}; -typedef struct polydisplacedata_s +struct polydisplacedata_t { INT32 polyObjNum; - struct sector_s *controlSector; + sector_t *controlSector; fixed_t dx; fixed_t dy; -} polydisplacedata_t; +}; -typedef struct polyrotdisplacedata_s +struct polyrotdisplacedata_t { INT32 polyObjNum; - struct sector_s *controlSector; + sector_t *controlSector; fixed_t rotscale; UINT8 turnobjs; -} polyrotdisplacedata_t; +}; -typedef struct polyflagdata_s +struct polyflagdata_t { INT32 polyObjNum; INT32 speed; UINT32 angle; fixed_t momx; -} polyflagdata_t; +}; typedef enum { @@ -358,7 +358,7 @@ typedef enum TMPF_GHOSTFADE = 1<<4, } textmappolyfade_t; -typedef struct polyfadedata_s +struct polyfadedata_t { INT32 polyObjNum; INT32 destvalue; @@ -366,7 +366,7 @@ typedef struct polyfadedata_s boolean doghostfade; boolean ticbased; INT32 speed; -} polyfadedata_t; +}; // // Functions diff --git a/src/p_saveg.h b/src/p_saveg.h index 27865bf50..b7ca6527f 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -28,14 +28,14 @@ boolean P_LoadNetGame(boolean reloading); mobj_t *P_FindNewPosition(UINT32 oldposition); -typedef struct +struct savedata_t { UINT8 skin; INT32 score; INT32 lives; UINT16 emeralds; UINT8 numgameovers; -} savedata_t; +}; extern savedata_t savedata; extern UINT8 *save_p; diff --git a/src/p_setup.h b/src/p_setup.h index 04a3233e0..9284a2b0d 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -45,7 +45,7 @@ enum // // MAP used flats lookup table // -typedef struct +struct levelflat_t { char name[9]; // resource name from wad @@ -85,7 +85,7 @@ typedef struct void *mipmap; void *mippic; #endif -} levelflat_t; +}; extern size_t numlevelflats; extern levelflat_t *levelflats; diff --git a/src/p_sight.c b/src/p_sight.c index e96bf9db8..7ef9b9dd3 100644 --- a/src/p_sight.c +++ b/src/p_sight.c @@ -334,6 +334,12 @@ static boolean P_CanTraceBlockingLine(seg_t *seg, divline_t *divl, register los_ (void)divl; + if (!(line->flags & ML_TWOSIDED)) + { + // stop because it is not two sided anyway + return false; + } + if (P_IsLineBlocking(line, los->compareThing) == true) { // This line will always block us @@ -380,11 +386,16 @@ static boolean P_CanBotTraverse(seg_t *seg, divline_t *divl, register los_t *los if (los->compareThing->player != NULL && los->alreadyHates == false) { // Treat damage sectors like walls, if you're not already in a bad sector. + sector_t *front, *back; vertex_t pos; + P_ClosestPointOnLine(los->compareThing->x, los->compareThing->y, line, &pos); - if (K_BotHatesThisSector(los->compareThing->player, line->frontsector, pos.x, pos.y) - || K_BotHatesThisSector(los->compareThing->player, line->backsector, pos.x, pos.y)) + front = seg->frontsector; + back = seg->backsector; + + if (K_BotHatesThisSector(los->compareThing->player, front, pos.x, pos.y) + || K_BotHatesThisSector(los->compareThing->player, back, pos.x, pos.y)) { // This line does not block us, but we don't want to be in it. return false; diff --git a/src/p_slopes.h b/src/p_slopes.h index 5543b785f..454dd344f 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -117,16 +117,16 @@ typedef enum { } dynplanetype_t; /// Permit slopes to be dynamically altered through a thinker. -typedef struct +struct dynlineplanethink_t { thinker_t thinker; pslope_t *slope; dynplanetype_t type; line_t *sourceline; fixed_t extent; -} dynlineplanethink_t; +}; -typedef struct +struct dynvertexplanethink_t { thinker_t thinker; pslope_t *slope; @@ -135,7 +135,7 @@ typedef struct fixed_t origsecheights[3]; fixed_t origvecheights[3]; UINT8 relative; -} dynvertexplanethink_t; +}; void T_DynamicSlopeLine (dynlineplanethink_t* th); void T_DynamicSlopeVert (dynvertexplanethink_t* th); diff --git a/src/p_spec.c b/src/p_spec.c index 4abe9f5e1..56eb3d941 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4282,7 +4282,7 @@ boolean P_IsPlayerValid(size_t playernum) boolean P_CanPlayerTrigger(size_t playernum) { - return P_IsPlayerValid(playernum) && !players[playernum].bot; + return P_IsPlayerValid(playernum); } /// \todo check continues for proper splitscreen support? @@ -4310,7 +4310,7 @@ static void P_ProcessEggCapsule(player_t *player, sector_t *sector) mobj_t *mo2; INT32 i; - if (player->bot || sector->ceilingdata || sector->floordata) + if (sector->ceilingdata || sector->floordata) return; // Find the center of the Eggtrap and release all the pretty animals! @@ -4517,9 +4517,6 @@ static void P_EvaluateDamageType(player_t *player, sector_t *sector, boolean isT static void P_EvaluateLinedefExecutorTrigger(player_t *player, sector_t *sector, boolean isTouching) { - if (player->bot) - return; - if (!sector->triggertag) return; diff --git a/src/p_spec.h b/src/p_spec.h index 91bc74150..6bfbc535a 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -578,17 +578,17 @@ UINT16 P_GetFFloorID(ffloor_t *fflr); ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id); // Use this when you don't know the type of your thinker data struct but need to access its thinker. -typedef struct +struct thinkerdata_t { thinker_t thinker; -} thinkerdata_t; +}; // // P_LIGHTS // /** Fire flicker action structure. */ -typedef struct +struct fireflicker_t { thinker_t thinker; ///< The thinker in use for the effect. sector_t *sector; ///< The sector where action is taking place. @@ -596,29 +596,29 @@ typedef struct INT32 resetcount; INT16 maxlight; ///< The brightest light level to use. INT16 minlight; ///< The darkest light level to use. -} fireflicker_t; +}; -typedef struct +struct lightflash_t { thinker_t thinker; sector_t *sector; INT32 maxlight; INT32 minlight; -} lightflash_t; +}; /** Laser block thinker. */ -typedef struct +struct laserthink_t { thinker_t thinker; ///< Thinker structure for laser. INT16 tag; line_t *sourceline; UINT8 nobosses; -} laserthink_t; +}; /** Strobe light action structure.. */ -typedef struct +struct strobe_t { thinker_t thinker; ///< The thinker in use for the effect. sector_t *sector; ///< The sector where the action is taking place. @@ -627,9 +627,9 @@ typedef struct INT16 maxlight; ///< The maximum light level to use. INT32 darktime; ///< How INT32 to use minlight. INT32 brighttime; ///< How INT32 to use maxlight. -} strobe_t; +}; -typedef struct +struct glow_t { thinker_t thinker; sector_t *sector; @@ -637,11 +637,11 @@ typedef struct INT16 maxlight; INT16 direction; INT16 speed; -} glow_t; +}; /** Thinker struct for fading lights. */ -typedef struct +struct lightlevel_t { thinker_t thinker; ///< Thinker in use for the effect. sector_t *sector; ///< Sector where action is taking place. @@ -652,7 +652,7 @@ typedef struct fixed_t fixedpertic; ///< Fixed point for increment per tic. // The reason for those two above to be fixed point is to deal with decimal values that would otherwise get trimmed away. INT32 timer; ///< Internal timer. -} lightlevel_t; +}; #define GLOWSPEED 8 #define STROBEBRIGHT 5 @@ -709,7 +709,7 @@ typedef enum /** Ceiling movement structure. */ -typedef struct +struct ceiling_t { thinker_t thinker; ///< Thinker for the type of movement. ceiling_e type; ///< Type of movement. @@ -728,7 +728,7 @@ typedef struct INT16 tag; ///< Tag of linedef executor to run when movement is done. fixed_t origspeed; ///< The original, "real" speed. INT32 sourceline; ///< Index of the source linedef -} ceiling_t; +}; #define CEILSPEED (FRACUNIT) @@ -771,7 +771,7 @@ typedef enum bridgeFall, } elevator_e; -typedef struct +struct floormove_t { thinker_t thinker; floor_e type; @@ -786,9 +786,9 @@ typedef struct fixed_t delaytimer; INT16 tag; INT32 sourceline; -} floormove_t; +}; -typedef struct +struct elevator_t { thinker_t thinker; elevator_e type; @@ -807,7 +807,7 @@ typedef struct fixed_t floorwasheight; // Height the floor WAS at fixed_t ceilingwasheight; // Height the ceiling WAS at line_t *sourceline; -} elevator_t; +}; typedef enum { @@ -816,7 +816,7 @@ typedef enum CF_REVERSE = 1<<2, // Reverse gravity } crumbleflag_t; -typedef struct +struct crumble_t { thinker_t thinker; line_t *sourceline; @@ -830,15 +830,15 @@ typedef struct fixed_t floorwasheight; // Height the floor WAS at fixed_t ceilingwasheight; // Height the ceiling WAS at UINT8 flags; -} crumble_t; +}; -typedef struct +struct noenemies_t { thinker_t thinker; line_t *sourceline; // Source line of the thinker -} noenemies_t; +}; -typedef struct +struct continuousfall_t { thinker_t thinker; sector_t *sector; @@ -847,9 +847,9 @@ typedef struct fixed_t floorstartheight; fixed_t ceilingstartheight; fixed_t destheight; -} continuousfall_t; +}; -typedef struct +struct bouncecheese_t { thinker_t thinker; line_t *sourceline; @@ -859,9 +859,9 @@ typedef struct fixed_t floorwasheight; fixed_t ceilingwasheight; boolean low; -} bouncecheese_t; +}; -typedef struct +struct mariothink_t { thinker_t thinker; sector_t *sector; @@ -870,16 +870,16 @@ typedef struct fixed_t floorstartheight; fixed_t ceilingstartheight; INT16 tag; -} mariothink_t; +}; -typedef struct +struct mariocheck_t { thinker_t thinker; line_t *sourceline; sector_t *sector; -} mariocheck_t; +}; -typedef struct +struct thwomp_t { thinker_t thinker; line_t *sourceline; @@ -893,23 +893,23 @@ typedef struct INT16 tag; UINT16 sound; INT32 initDelay; -} thwomp_t; +}; -typedef struct +struct floatthink_t { thinker_t thinker; line_t *sourceline; sector_t *sector; INT16 tag; -} floatthink_t; +}; -typedef struct +struct eachtime_t { thinker_t thinker; line_t *sourceline; // Source line of the thinker boolean playersInArea[MAXPLAYERS]; boolean triggerOnExit; -} eachtime_t; +}; typedef enum { @@ -918,7 +918,7 @@ typedef enum RF_DYNAMIC = 1<<2, //Dynamically sinking platform } raiseflag_t; -typedef struct +struct raise_t { thinker_t thinker; INT16 tag; @@ -929,7 +929,7 @@ typedef struct fixed_t extraspeed; //For dynamically sinking platform UINT8 shaketimer; //For dynamically sinking platform UINT8 flags; -} raise_t; +}; #define ELEVATORSPEED (FRACUNIT*4) #define FLOORSPEED (FRACUNIT) @@ -971,20 +971,20 @@ void T_EachTimeThinker(eachtime_t *eachtime); void T_CameraScanner(elevator_t *elevator); void T_RaiseSector(raise_t *raise); -typedef struct +struct executor_t { thinker_t thinker; // Thinker for linedef executor delay line_t *line; // Pointer to line that is waiting. mobj_t *caller; // Pointer to calling mobj sector_t *sector; // Pointer to triggering sector INT32 timer; // Delay timer -} executor_t; +}; void T_ExecutorDelay(executor_t *e); /** Generalized scroller. */ -typedef struct +struct scroll_t { thinker_t thinker; ///< Thinker structure for scrolling. fixed_t dx, dy; ///< (dx,dy) scroll speeds. @@ -1004,14 +1004,14 @@ typedef struct sc_carry, ///< Carry objects on floor. sc_carry_ceiling,///< Carry objects on ceiling (for 3Dfloor conveyors). } type; -} scroll_t; +}; void T_Scroll(scroll_t *s); void T_LaserFlash(laserthink_t *flash); /** Friction for ice/sludge effects. */ -typedef struct +struct friction_t { thinker_t thinker; ///< Thinker structure for friction. INT32 friction; ///< Friction value, 0xe800 = normal. @@ -1019,7 +1019,7 @@ typedef struct INT32 affectee; ///< Number of affected sector. INT32 referrer; ///< If roverfriction == true, then this will contain the sector # of the control sector where the effect was applied. UINT8 roverfriction; ///< flag for whether friction originated from a FOF or not -} friction_t; +}; // Friction defines. #define ORIG_FRICTION (0xF5 << (FRACBITS-8)) ///< Original value. @@ -1033,7 +1033,7 @@ typedef enum } pushertype_e; // Model for pushers for push/pull effects -typedef struct +struct pusher_t { thinker_t thinker; ///< Thinker structure for pusher effect. pushertype_e type; ///< Type of pusher effect. @@ -1045,10 +1045,10 @@ typedef struct INT32 referrer; ///< If roverpusher == true, then this will contain the sector # of the control sector where the effect was applied. INT32 exclusive; /// < Once this affect has been applied to a mobj, no other pushers may affect it. INT32 slider; /// < Should the player go into an uncontrollable slide? -} pusher_t; +}; // Model for disappearing/reappearing FOFs -typedef struct +struct disappear_t { thinker_t thinker; ///< Thinker structure for effect. tic_t appeartime; ///< Tics to be appeared for @@ -1058,12 +1058,12 @@ typedef struct INT32 affectee; ///< Number of affected line INT32 sourceline; ///< Number of source line INT32 exists; ///< Exists toggle -} disappear_t; +}; void T_Disappear(disappear_t *d); // Model for fading FOFs -typedef struct +struct fade_t { thinker_t thinker; ///< Thinker structure for effect. ffloor_t *rover; ///< Target ffloor @@ -1084,13 +1084,13 @@ typedef struct boolean docollision; ///< Handle interactive flags boolean doghostfade; ///< No interactive flags during fading boolean exactalpha; ///< Use exact alpha values (opengl) -} fade_t; +}; void T_Fade(fade_t *d); // Model for fading colormaps -typedef struct +struct fadecolormap_t { thinker_t thinker; ///< Thinker structure for effect. sector_t *sector; ///< Sector where action is taking place. @@ -1099,7 +1099,7 @@ typedef struct boolean ticbased; ///< Tic-based timing INT32 duration; ///< Total duration for tic-based logic (OR: speed increment) INT32 timer; ///< Timer for tic-based logic (OR: internal speed counter) -} fadecolormap_t; +}; void T_FadeColormap(fadecolormap_t *d); @@ -1107,7 +1107,7 @@ void T_FadeColormap(fadecolormap_t *d); void T_Pusher(pusher_t *p); // Plane displacement -typedef struct +struct planedisplace_t { thinker_t thinker; ///< Thinker structure for plane displacement effect. INT32 affectee; ///< Number of affected sector. @@ -1123,7 +1123,7 @@ typedef struct pd_ceiling, ///< Displace ceiling. pd_both, ///< Displace both floor AND ceiling. } type; -} planedisplace_t; +}; void T_PlaneDisplace(planedisplace_t *pd); diff --git a/src/p_user.c b/src/p_user.c index 7d21578dd..57f4b2af9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -478,6 +478,12 @@ void P_ResetPlayer(player_t *player) player->trickpanel = 0; player->glanceDir = 0; player->fastfall = 0; + + if (player->mo != NULL && P_MobjWasRemoved(player->mo) == false) + { + player->mo->pitch = 0; + player->mo->roll = 0; + } } // diff --git a/src/r_data.h b/src/r_data.h index da3f81163..5ba30010c 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -23,12 +23,12 @@ #endif // Store lists of lumps for F_START/F_END etc. -typedef struct +struct lumplist_t { UINT16 wadfile; UINT16 firstlump; size_t numlumps; -} lumplist_t; +}; UINT32 ASTBlendPixel(RGBA_t background, RGBA_t foreground, int style, UINT8 alpha); UINT32 ASTBlendTexturePixel(RGBA_t background, RGBA_t foreground, int style, UINT8 alpha); diff --git a/src/r_defs.h b/src/r_defs.h index a0c557e94..59faac3c0 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -35,11 +35,11 @@ // Clips the given range of columns // and includes it in the new clip list. // -typedef struct +struct cliprange_t { INT32 first; INT32 last; -} cliprange_t; +}; // Silhouette, needed for clipping segs (mainly) and sprites representing things. #define SIL_NONE 0 @@ -57,7 +57,7 @@ typedef UINT8 lighttable_t; #define CMF_FOG 4 // ExtraColormap type. Use for extra_colormaps from now on. -typedef struct extracolormap_s +struct extracolormap_t { UINT8 fadestart, fadeend; UINT8 flags; @@ -74,9 +74,9 @@ typedef struct extracolormap_s char lumpname[9]; // for netsyncing #endif - struct extracolormap_s *next; - struct extracolormap_s *prev; -} extracolormap_t; + extracolormap_t *next; + extracolormap_t *prev; +}; // // INTERNAL MAP TYPES used by play and refresh @@ -84,28 +84,25 @@ typedef struct extracolormap_s /** Your plain vanilla vertex. */ -typedef struct +struct vertex_t { fixed_t x, y; boolean floorzset, ceilingzset; fixed_t floorz, ceilingz; -} vertex_t; - -// Forward of linedefs, for sectors. -struct line_s; +}; /** Degenerate version of ::mobj_t, storing only a location. * Used for sound origins in sectors, hoop centers, and the like. Does not * handle sound from moving objects (doppler), because position is probably * just buffered, not updated. */ -typedef struct +struct degenmobj_t { thinker_t thinker; ///< Not used for anything. fixed_t x; ///< X coordinate. fixed_t y; ///< Y coordinate. fixed_t z; ///< Z coordinate. -} degenmobj_t; +}; #include "p_polyobj.h" @@ -208,7 +205,7 @@ typedef enum BT_STRONG, } busttype_e; -typedef struct ffloor_s +struct ffloor_t { fixed_t *topheight; INT32 *toppic; @@ -224,17 +221,17 @@ typedef struct ffloor_s angle_t *bottomangle; // Pointers to pointers. Yup. - struct pslope_s **t_slope; - struct pslope_s **b_slope; + pslope_t **t_slope; + pslope_t **b_slope; size_t secnum; ffloortype_e fofflags; - struct line_s *master; + line_t *master; - struct sector_s *target; + sector_t *target; - struct ffloor_s *next; - struct ffloor_s *prev; + ffloor_t *next; + ffloor_t *prev; INT32 lastlight; INT32 alpha; @@ -258,25 +255,25 @@ typedef struct ffloor_s INT32 spawnalpha; // alpha the 3D floor spawned with void *fadingdata; // fading FOF thinker -} ffloor_t; +}; // This struct holds information for shadows casted by 3D floors. // This information is contained inside the sector_t and is used as the base // information for casted shadows. -typedef struct lightlist_s +struct lightlist_t { fixed_t height; INT16 *lightlevel; extracolormap_t **extra_colormap; // pointer-to-a-pointer, so we can react to colormap changes INT32 flags; ffloor_t *caster; - struct pslope_s *slope; // FOF_DOUBLESHADOW makes me have to store this pointer here. Bluh bluh. -} lightlist_t; + pslope_t *slope; // FOF_DOUBLESHADOW makes me have to store this pointer here. Bluh bluh. +}; // This struct is used for rendering walls with shadows casted on them... -typedef struct r_lightlist_s +struct r_lightlist_t { fixed_t height; fixed_t heightstep; @@ -288,7 +285,7 @@ typedef struct r_lightlist_s lighttable_t *rcolormap; ffloortype_e flags; INT32 lightnum; -} r_lightlist_t; +}; // Slopes typedef enum { @@ -296,10 +293,10 @@ typedef enum { SL_DYNAMIC = 1<<1, /// This plane slope will be assigned a thinker to make it dynamic. } slopeflags_t; -typedef struct pslope_s +struct pslope_t { UINT16 id; // The number of the slope, mostly used for netgame syncing purposes - struct pslope_s *next; // Make a linked list of dynamic slopes, for easy reference later + pslope_t *next; // Make a linked list of dynamic slopes, for easy reference later // The plane's definition. vector3_t o; /// Plane origin. @@ -323,7 +320,7 @@ typedef struct pslope_s #ifdef HWRENDER INT16 hwLightOffset; #endif -} pslope_t; +}; typedef enum { @@ -399,7 +396,7 @@ typedef enum // The SECTORS record, at runtime. // Stores things/mobjs. // -typedef struct sector_s +struct sector_t { fixed_t floorheight; fixed_t ceilingheight; @@ -445,10 +442,10 @@ typedef struct sector_s // list of mobjs that are at least partially in the sector // thinglist is a subset of touching_thinglist - struct msecnode_s *touching_thinglist; + msecnode_t *touching_thinglist; size_t linecount; - struct line_s **lines; // [linecount] size + line_t **lines; // [linecount] size // Improved fake floor hack ffloor_t *ffloors; @@ -480,14 +477,14 @@ typedef struct sector_s fixed_t friction; // Sprite culling feature - struct line_s *cullheight; + line_t *cullheight; // Current speed of ceiling/floor. For Knuckles to hold onto stuff. fixed_t floorspeed, ceilspeed; // list of precipitation mobjs in sector precipmobj_t *preciplist; - struct mprecipsecnode_s *touching_preciplist; + mprecipsecnode_t *touching_preciplist; // Eternity engine slope pslope_t *f_slope; // floor slope @@ -499,7 +496,7 @@ typedef struct sector_s // colormap structure extracolormap_t *spawn_extra_colormap; -} sector_t; +}; // // Move clipping aid for linedefs. @@ -517,7 +514,7 @@ typedef enum #define NUMLINEARGS 10 #define NUMLINESTRINGARGS 2 -typedef struct line_s +struct line_t { // Vertices, from v1 to v2. vertex_t *v1; @@ -556,9 +553,9 @@ typedef struct line_s char *text; // a concatenation of all front and back texture names, for linedef specials that require a string. INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0 -} line_t; +}; -typedef struct +struct side_t { // add this to the calculated texture column fixed_t textureoffset; @@ -582,7 +579,7 @@ typedef struct char *text; // a concatenation of all top, bottom, and mid texture names, for linedef specials that require a string. extracolormap_t *colormap_data; // storage for colormaps; not applied to sectors. -} side_t; +}; // // A subsector. @@ -590,14 +587,14 @@ typedef struct // Basically, this is a list of linesegs, indicating the visible walls that define // (all or some) sides of a convex BSP leaf. // -typedef struct subsector_s +struct subsector_t { sector_t *sector; INT16 numlines; UINT16 firstline; - struct polyobj_s *polyList; // haleyjd 02/19/06: list of polyobjects + polyobj_t *polyList; // haleyjd 02/19/06: list of polyobjects size_t validcount; -} subsector_t; +}; // Sector list node showing all sectors an object appears in. // @@ -613,32 +610,32 @@ typedef struct subsector_s // // For the links, NULL means top or end of list. -typedef struct msecnode_s +struct msecnode_t { sector_t *m_sector; // a sector containing this object - struct mobj_s *m_thing; // this object - struct msecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing - struct msecnode_s *m_sectorlist_next; // next msecnode_t for this thing - struct msecnode_s *m_thinglist_prev; // prev msecnode_t for this sector - struct msecnode_s *m_thinglist_next; // next msecnode_t for this sector + mobj_t *m_thing; // this object + msecnode_t *m_sectorlist_prev; // prev msecnode_t for this thing + msecnode_t *m_sectorlist_next; // next msecnode_t for this thing + msecnode_t *m_thinglist_prev; // prev msecnode_t for this sector + msecnode_t *m_thinglist_next; // next msecnode_t for this sector boolean visited; // used in search algorithms -} msecnode_t; +}; -typedef struct mprecipsecnode_s +struct mprecipsecnode_t { sector_t *m_sector; // a sector containing this object - struct precipmobj_s *m_thing; // this object - struct mprecipsecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing - struct mprecipsecnode_s *m_sectorlist_next; // next msecnode_t for this thing - struct mprecipsecnode_s *m_thinglist_prev; // prev msecnode_t for this sector - struct mprecipsecnode_s *m_thinglist_next; // next msecnode_t for this sector + precipmobj_t *m_thing; // this object + mprecipsecnode_t *m_sectorlist_prev; // prev msecnode_t for this thing + mprecipsecnode_t *m_sectorlist_next; // next msecnode_t for this thing + mprecipsecnode_t *m_thinglist_prev; // prev msecnode_t for this sector + mprecipsecnode_t *m_thinglist_next; // next msecnode_t for this sector boolean visited; // used in search algorithms -} mprecipsecnode_t; +}; // for now, only used in hardware mode // maybe later for software as well? // that's why it's moved here -typedef struct light_s +struct light_t { UINT16 type; // light,... (cfr #define in hwr_light.c) @@ -651,19 +648,19 @@ typedef struct light_s UINT32 dynamic_color; // color of the light for dynamic lighting float dynamic_radius; // radius of the light ball float dynamic_sqrradius; // radius^2 of the light ball -} light_t; +}; -typedef struct lightmap_s +struct lightmap_t { float s[2], t[2]; light_t *light; - struct lightmap_s *next; -} lightmap_t; + lightmap_t *next; +}; // // The lineseg. // -typedef struct seg_s +struct seg_t { vertex_t *v1; vertex_t *v2; @@ -704,12 +701,12 @@ typedef struct seg_s #ifdef HWRENDER INT16 hwLightOffset; #endif -} seg_t; +}; // // BSP node. // -typedef struct +struct node_t { // Partition line. fixed_t x, y; @@ -720,18 +717,18 @@ typedef struct // If NF_SUBSECTOR its a subsector. UINT16 children[2]; -} node_t; +}; #if defined(_MSC_VER) #pragma pack(1) #endif // posts are runs of non masked source pixels -typedef struct +struct post_t { UINT8 topdelta; // -1 is the last post in a column UINT8 length; // length data bytes follows -} ATTRPACK post_t; +} ATTRPACK; #if defined(_MSC_VER) #pragma pack() @@ -751,7 +748,7 @@ typedef post_t column_t; // // ? // -typedef struct drawseg_s +struct drawseg_t { seg_t *curline; INT32 x1; @@ -771,9 +768,9 @@ typedef struct drawseg_s INT16 *sprbottomclip; INT16 *maskedtexturecol; - struct visplane_s *ffloorplanes[MAXFFLOORS]; + visplane_t *ffloorplanes[MAXFFLOORS]; INT32 numffloorplanes; - struct ffloor_s *thicksides[MAXFFLOORS]; + ffloor_t *thicksides[MAXFFLOORS]; INT16 *thicksidecol; INT32 numthicksides; fixed_t frontscale[MAXVIDWIDTH]; @@ -783,7 +780,7 @@ typedef struct drawseg_s fixed_t maskedtextureheight[MAXVIDWIDTH]; // For handling sloped midtextures vertex_t leftpos, rightpos; // Used for rendering FOF walls with slopes -} drawseg_t; +}; typedef enum { @@ -795,11 +792,11 @@ typedef enum } pic_mode_t; #ifdef ROTSPRITE -typedef struct +struct rotsprite_t { INT32 angles; void **patches; -} rotsprite_t; +}; #endif // Patches. @@ -807,7 +804,7 @@ typedef struct // Patches are used for sprites and all masked pictures, and we compose // textures from the TEXTURES list of patches. // -typedef struct +struct patch_t { INT16 width, height; INT16 leftoffset, topoffset; @@ -821,7 +818,7 @@ typedef struct #ifdef ROTSPRITE rotsprite_t *rotated; // Rotated patches #endif -} patch_t; +}; extern patch_t *missingpat; extern patch_t *blanklvl; @@ -830,7 +827,7 @@ extern patch_t *blanklvl; #pragma pack(1) #endif -typedef struct +struct softwarepatch_t { INT16 width; // bounding box size INT16 height; @@ -838,14 +835,14 @@ typedef struct INT16 topoffset; // pixels below the origin INT32 columnofs[8]; // only [width] used // the [0] is &columnofs[width] -} ATTRPACK softwarepatch_t; +} ATTRPACK; #ifdef _MSC_VER #pragma warning(disable : 4200) #endif // a pic is an unmasked block of pixels, stored in horizontal way -typedef struct +struct pic_t { INT16 width; UINT8 zero; // set to 0 allow autodetection of pic_t @@ -854,7 +851,7 @@ typedef struct INT16 height; INT16 reserved1; // set to 0 UINT8 data[]; -} ATTRPACK pic_t; +} ATTRPACK; #ifdef _MSC_VER #pragma warning(default : 4200) @@ -951,7 +948,7 @@ typedef enum // Or the right side: NNNNFR // Or both, mirrored: NNNNFLFR // -typedef struct +struct spriteframe_t { // If false use 0 for any position. // Note: as eight entries are available, we might as well insert the same @@ -968,15 +965,15 @@ typedef struct #ifdef ROTSPRITE rotsprite_t *rotated[2][16]; // Rotated patches #endif -} spriteframe_t; +}; // // A sprite definition: a number of animation frames. // -typedef struct +struct spritedef_t { size_t numframes; spriteframe_t *spriteframes; -} spritedef_t; +}; #endif diff --git a/src/r_draw.c b/src/r_draw.c index 4b8eaf715..6eb5d6cfb 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -103,7 +103,7 @@ UINT8 *dc_transmap; // one of the translucency tables */ UINT8 *dc_translation; -struct r_lightlist_s *dc_lightlist = NULL; +struct r_lightlist_t *dc_lightlist = NULL; INT32 dc_numlights = 0, dc_maxlights, dc_texheight; // ========================================================================= diff --git a/src/r_draw.h b/src/r_draw.h index d01ad6e74..aee8ecc5f 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -47,7 +47,7 @@ extern UINT8 *dc_transmap; extern UINT8 *dc_translation; -extern struct r_lightlist_s *dc_lightlist; +extern struct r_lightlist_t *dc_lightlist; extern INT32 dc_numlights, dc_maxlights; //Fix TUTIFRUTI @@ -72,9 +72,9 @@ extern UINT8 *ds_source; extern UINT8 *ds_brightmap; extern UINT8 *ds_transmap; -typedef struct { +struct floatv3_t { float x, y, z; -} floatv3_t; +}; // Vectors for Software's tilted slope drawers extern floatv3_t *ds_su, *ds_sv, *ds_sz; diff --git a/src/r_fps.h b/src/r_fps.h index c2bc05699..8a12e1d10 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -40,7 +40,7 @@ extern enum viewcontext_e viewcontext; #define R_GetViewNumber() ((viewcontext - VIEWCONTEXT_PLAYER1) & 3) -typedef struct { +struct viewvars_t { fixed_t x; fixed_t y; fixed_t z; @@ -54,11 +54,11 @@ typedef struct { fixed_t cos; fixed_t sin; mobj_t *mobj; -} viewvars_t; +}; extern viewvars_t *newview; -typedef struct { +struct interpmobjstate_t { fixed_t x; fixed_t y; fixed_t z; @@ -69,7 +69,7 @@ typedef struct { fixed_t spriteyscale; fixed_t spritexoffset; fixed_t spriteyoffset; -} interpmobjstate_t; +}; // Level interpolators @@ -83,7 +83,7 @@ typedef enum { } levelinterpolator_type_e; // Tagged union of a level interpolator -typedef struct levelinterpolator_s { +struct levelinterpolator_t { levelinterpolator_type_e type; thinker_t *thinker; union { @@ -116,7 +116,7 @@ typedef struct levelinterpolator_s { fixed_t oldzdelta, bakzdelta; } dynslope; }; -} levelinterpolator_t; +}; // Interpolates the current view variables (r_state.h) against the selected view context in R_SetViewContext void R_InterpolateView(fixed_t frac); diff --git a/src/r_picformats.h b/src/r_picformats.h index 700424814..57af58100 100644 --- a/src/r_picformats.h +++ b/src/r_picformats.h @@ -92,18 +92,18 @@ typedef enum ROTAXIS_Z // Yaw } rotaxis_t; -typedef struct +struct spriteframepivot_t { INT32 x, y; rotaxis_t rotaxis; -} spriteframepivot_t; +}; -typedef struct +struct spriteinfo_t { spriteframepivot_t pivot[64 + 1]; #define SPRINFO_DEFAULT_PIVOT (64) UINT8 available[BIT_ARRAY_SIZE(64 + 1)]; // 1 extra for default_pivot -} spriteinfo_t; +}; // Portable Network Graphics #define PNG_HEADER_SIZE (8) diff --git a/src/r_plane.h b/src/r_plane.h index f0a32d969..782691af6 100644 --- a/src/r_plane.h +++ b/src/r_plane.h @@ -28,9 +28,9 @@ // Now what is a visplane, anyway? // Simple: kinda floor/ceiling polygon optimised for SRB2 rendering. // -typedef struct visplane_s +struct visplane_t { - struct visplane_s *next; + visplane_t *next; fixed_t height; fixed_t viewx, viewy, viewz; @@ -50,13 +50,13 @@ typedef struct visplane_s fixed_t xoffs, yoffs; // Scrolling flats. - struct ffloor_s *ffloor; + ffloor_t *ffloor; polyobj_t *polyobj; pslope_t *slope; boolean noencore; boolean ripple; -} visplane_t; +}; extern visplane_t *visplanes[MAXVISPLANES]; extern visplane_t *floorplane; @@ -104,7 +104,7 @@ void R_CalculateSlopeVectors(void); // Sets the slope vector pointers for the current tilted span. void R_SetTiltedSpan(INT32 span); -typedef struct planemgr_s +struct visffloor_t { visplane_t *plane; fixed_t height; @@ -119,11 +119,11 @@ typedef struct planemgr_s fixed_t f_pos_slope; fixed_t b_pos_slope; - struct pslope_s *slope; + pslope_t *slope; - struct ffloor_s *ffloor; + ffloor_t *ffloor; polyobj_t *polyobj; -} visffloor_t; +}; extern visffloor_t ffloor[MAXFFLOORS]; extern INT32 numffloors; diff --git a/src/r_portal.h b/src/r_portal.h index 3e77b2ef7..4f665f90b 100644 --- a/src/r_portal.h +++ b/src/r_portal.h @@ -20,9 +20,9 @@ /** Portal structure for the software renderer. */ -typedef struct portal_s +struct portal_t { - struct portal_s *next; + portal_t *next; // Viewport. fixed_t viewx; @@ -39,7 +39,7 @@ typedef struct portal_s INT16 *ceilingclip; /**< Temporary screen top clipping array. */ INT16 *floorclip; /**< Temporary screen bottom clipping array. */ fixed_t *frontscale;/**< Temporary screen bottom clipping array. */ -} portal_t; +}; extern portal_t* portal_base; extern portal_t* portal_cap; diff --git a/src/r_skins.h b/src/r_skins.h index 1cc06cca4..f9dd944c0 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -30,7 +30,7 @@ #define DEFAULTSKIN4 "knuckles" // fourth player /// The skin_t struct -typedef struct +struct skin_t { char name[SKINNAMESIZE+1]; // INT16 descriptive name of the skin UINT16 wadnum; @@ -61,7 +61,7 @@ typedef struct // contains super versions too spritedef_t sprites[NUMPLAYERSPRITES*2]; spriteinfo_t sprinfo[NUMPLAYERSPRITES*2]; -} skin_t; +}; enum facepatches { FACE_RANK = 0, diff --git a/src/r_splats.h b/src/r_splats.h index a26661e03..23e475c06 100644 --- a/src/r_splats.h +++ b/src/r_splats.h @@ -28,7 +28,7 @@ struct rastery_s }; extern struct rastery_s *prastertab; // for ASM code -typedef struct floorsplat_s +struct floorsplat_t { UINT16 *pic; INT32 width, height; @@ -39,7 +39,7 @@ typedef struct floorsplat_s vector3_t verts[4]; // (x,y,z) as viewed from above on map fixed_t x, y, z; // position mobj_t *mobj; // Mobj it is tied to -} floorsplat_t; +}; void R_DrawFloorSplat(vissprite_t *spr); diff --git a/src/r_state.h b/src/r_state.h index dc577448e..4807a0f92 100644 --- a/src/r_state.h +++ b/src/r_state.h @@ -28,13 +28,13 @@ // // needed for pre rendering (fracs) -typedef struct +struct sprcache_t { fixed_t width; fixed_t offset; fixed_t topoffset; fixed_t height; -} sprcache_t; +}; extern sprcache_t *spritecachedinfo; diff --git a/src/r_textures.h b/src/r_textures.h index d4c9302e5..8f39f5bd4 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -28,7 +28,7 @@ // A single patch from a texture definition, // basically a rectangular area within // the texture rectangle. -typedef struct +struct texpatch_t { // Block origin (always UL), which has already accounted for the internal origin of the patch. INT16 originx, originy; @@ -36,7 +36,7 @@ typedef struct UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both UINT8 alpha; // Translucency value patchalphastyle_t style; -} texpatch_t; +}; // texture type enum @@ -52,7 +52,7 @@ enum // A texture_t describes a rectangular texture, // which is composed of one or more texpatch_t structures // that arrange graphic patches. -typedef struct +struct texture_t { // Keep name for switch changing, etc. char name[8]; @@ -66,7 +66,7 @@ typedef struct // All the patches[patchcount] are drawn back to front into the cached texture. INT16 patchcount; texpatch_t patches[]; -} texture_t; +}; // all loaded and prepared textures from the start of the game extern texture_t **textures; diff --git a/src/r_things.c b/src/r_things.c index 87b19eb6b..cc0d46a2a 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -3454,6 +3454,7 @@ boolean R_ThingVisible (mobj_t *thing) case MT_SPHEREBOX: case MT_ITEMCAPSULE: case MT_ITEMCAPSULE_PART: + case MT_OVERLAY: // mostly capsule numbers :))) case MT_BATTLECAPSULE: case MT_BATTLECAPSULE_PIECE: return false; diff --git a/src/r_things.h b/src/r_things.h index 18c55629b..f27f3a7c9 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -96,13 +96,13 @@ boolean R_ThingIsFlashing(mobj_t *thing); * per portal to later group them in separate * drawnode lists. */ -typedef struct +struct maskcount_t { size_t drawsegs[2]; size_t vissprites[2]; fixed_t viewx, viewy, viewz; /**< View z stored at the time of the BSP traversal for the view/portal. Masked sorting/drawing needs it. */ sector_t* viewsector; -} maskcount_t; +}; void R_DrawMasked(maskcount_t* masks, INT32 nummasks); @@ -145,14 +145,14 @@ typedef enum // A vissprite_t is a thing that will be drawn during a refresh, // i.e. a sprite object that is partly visible. -typedef struct vissprite_s +struct vissprite_t { // Doubly linked list. - struct vissprite_s *prev; - struct vissprite_s *next; + vissprite_t *prev; + vissprite_t *next; // Bonus linkdraw pointer. - struct vissprite_s *linkdraw; + vissprite_t *linkdraw; mobj_t *mobj; // for easy access @@ -219,7 +219,7 @@ typedef struct vissprite_s INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing fixed_t floorclip; // Cut off your tires in tall grass -} vissprite_t; +}; extern UINT32 visspritecount; @@ -236,7 +236,7 @@ UINT8 *R_GetSpriteTranslation(vissprite_t *vis); // A drawnode is something that points to a 3D floor, 3D side, or masked // middle texture. This is used for sorting with sprites. -typedef struct drawnode_s +struct drawnode_t { visplane_t *plane; drawseg_t *seg; @@ -244,9 +244,9 @@ typedef struct drawnode_s ffloor_t *ffloor; vissprite_t *sprite; - struct drawnode_s *next; - struct drawnode_s *prev; -} drawnode_t; + drawnode_t *next; + drawnode_t *prev; +}; void R_InitDrawNodes(void); diff --git a/src/s_sound.c b/src/s_sound.c index a36b14bf6..fb21cc190 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -732,7 +732,7 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id) S_StartSoundAtVolume(origin, sfx_id, 255); } -void S_ReducedVFXSoundAtVolume(const void *origin, sfxenum_t sfx_id, INT32 volume, void *owner) +void S_ReducedVFXSoundAtVolume(const void *origin, sfxenum_t sfx_id, INT32 volume, player_t *owner) { if (S_SoundDisabled()) return; @@ -744,7 +744,7 @@ void S_ReducedVFXSoundAtVolume(const void *origin, sfxenum_t sfx_id, INT32 volum return; } - if (P_IsDisplayPlayer((player_t *)owner) == false) + if (P_IsDisplayPlayer(owner) == false) { return; } diff --git a/src/s_sound.h b/src/s_sound.h index e67868266..adbf92533 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -66,12 +66,12 @@ typedef enum SF_X2AWAYSOUND = 64, // Hear it from 2x the distance away } soundflags_t; -typedef struct { +struct listener_t { fixed_t x, y, z; angle_t angle; -} listener_t; +}; -typedef struct +struct channel_t { // sound information (if null, channel avail.) sfxinfo_t *sfxinfo; @@ -85,14 +85,14 @@ typedef struct // handle of the sound being played INT32 handle; -} channel_t; +}; -typedef struct { +struct caption_t { channel_t *c; sfxinfo_t *s; UINT16 t; UINT8 b; -} caption_t; +}; #define NUMCAPTIONS 8 #define MAXCAPTIONTICS (2*TICRATE) @@ -140,7 +140,7 @@ void S_StartSound(const void *origin, sfxenum_t sound_id); void S_StartSoundAtVolume(const void *origin, sfxenum_t sound_id, INT32 volume); // Will start a sound, but only if VFX reduce is off or the owner isn't a display player. -void S_ReducedVFXSoundAtVolume(const void *origin, sfxenum_t sfx_id, INT32 volume, void *owner); +void S_ReducedVFXSoundAtVolume(const void *origin, sfxenum_t sfx_id, INT32 volume, player_t *owner); #define S_ReducedVFXSound(a, b, c) S_ReducedVFXSoundAtVolume(a, b, 255, c) // Stop sound for thing at @@ -170,14 +170,14 @@ boolean S_MusicInfo(char *mname, UINT16 *mflags, boolean *looping); boolean S_SpeedMusic(float speed); // Music credits -typedef struct musicdef_s +struct musicdef_t { char name[7]; //char usage[256]; char source[256]; int volume; - struct musicdef_s *next; -} musicdef_t; + musicdef_t *next; +}; extern struct cursongcredit { @@ -218,7 +218,7 @@ UINT32 S_GetMusicPosition(void); // Music Stacking (Jingles) // -typedef struct musicstack_s +struct musicstack_t { char musname[7]; UINT16 musflags; @@ -229,9 +229,9 @@ typedef struct musicstack_s lumpnum_t mlumpnum; boolean noposition; // force music stack resuming from zero (like music_stack_noposition) - struct musicstack_s *prev; - struct musicstack_s *next; -} musicstack_t; + musicstack_t *prev; + musicstack_t *next; +}; extern char music_stack_nextmusname[7]; extern boolean music_stack_noposition; diff --git a/src/screen.h b/src/screen.h index 8abf77224..d49f4aee2 100644 --- a/src/screen.h +++ b/src/screen.h @@ -45,7 +45,7 @@ #define BASEVIDHEIGHT 200 // resolution of the graphics. // global video state -typedef struct viddef_s +struct viddef_t { INT32 modenum; // vidmode num indexes videomodes list @@ -74,7 +74,7 @@ typedef struct viddef_s INT32/*fixed_t*/ fmeddupx, fmeddupy; INT32 glstate; #endif -} viddef_t; +}; enum { @@ -84,16 +84,16 @@ enum }; // internal additional info for vesa modes only -typedef struct +struct vesa_extra_t { INT32 vesamode; // vesa mode number plus LINEAR_MODE bit void *plinearmem; // linear address of start of frame buffer -} vesa_extra_t; +}; // a video modes from the video modes list, // note: video mode 0 is always standard VGA320x200. -typedef struct vmode_s +struct vmode_t { - struct vmode_s *pnext; + vmode_t *pnext; char *name; UINT32 width, height; UINT32 rowbytes; // bytes per scanline @@ -102,12 +102,12 @@ typedef struct vmode_s INT32 numpages; vesa_extra_t *pextradata; // vesa mode extra data #ifdef _WIN32 - INT32 (WINAPI *setmode)(viddef_t *lvid, struct vmode_s *pcurrentmode); + INT32 (WINAPI *setmode)(viddef_t *lvid, vmode_t *pcurrentmode); #else - INT32 (*setmode)(viddef_t *lvid, struct vmode_s *pcurrentmode); + INT32 (*setmode)(viddef_t *lvid, vmode_t *pcurrentmode); #endif INT32 misc; // misc for display driver (r_opengl.dll etc) -} vmode_t; +}; #define NUMSPECIALMODES 4 extern vmode_t specialmodes[NUMSPECIALMODES]; diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index 60921b587..dd8d304a4 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -1,303 +1,129 @@ # Declare SDL2 interface sources -if(NOT ${SRB2_CONFIG_HAVE_MIXERX}) - set(SRB2_CONFIG_SDL2_USEMIXER ON CACHE BOOL "Use SDL2_mixer or regular sdl sound") -else() - set(SRB2_CONFIG_SDL2_USEMIXER OFF) -endif() - -if(${SRB2_CONFIG_SDL2_USEMIXER}) - if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) - set(SDL2_MIXER_FOUND ON) - if(${SRB2_SYSTEM_BITS} EQUAL 64) - set(SDL2_MIXER_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/x86_64-w64-mingw32/include/SDL2) - set(SDL2_MIXER_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/x86_64-w64-mingw32/lib -lSDL2_mixer") - else() # 32-bit - set(SDL2_MIXER_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/i686-w64-mingw32/include/SDL2) - set(SDL2_MIXER_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/i686-w64-mingw32/lib -lSDL2_mixer") - endif() - else() - find_package(SDL2_mixer) - endif() - if(${SDL2_MIXER_FOUND}) - set(SRB2_HAVE_MIXER ON) - target_sources(SRB2SDL2 PRIVATE mixer_sound.c) - else() - message(WARNING "You specified that SDL2_mixer is available, but it was not found. Falling back to sdl sound.") - target_sources(SRB2SDL2 PRIVATE sdl_sound.c) - endif() -elseif(${MIXERX_FOUND}) - target_sources(SRB2SDL2 PRIVATE mixer_sound.c) -else() - target_sources(SRB2SDL2 PRIVATE sdl_sound.c) -endif() +target_sources(SRB2SDL2 PRIVATE mixer_sound.c) target_sourcefile(c) target_sources(SRB2SDL2 PRIVATE ogl_sdl.c) -if(${SRB2_CONFIG_HAVE_THREADS}) - target_sources(SRB2SDL2 PRIVATE i_threads.c) +target_sources(SRB2SDL2 PRIVATE i_threads.c) + +if(${SRB2_USEASM}) + set_source_files_properties(${SRB2_ASM_SOURCES} PROPERTIES LANGUAGE C) + set_source_files_properties(${SRB2_ASM_SOURCES} PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp") endif() -# Dependency -if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) - set(SDL2_FOUND ON) - if(${SRB2_SYSTEM_BITS} EQUAL 64) - set(SDL2_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/SDL2/x86_64-w64-mingw32/include/SDL2) - set(SDL2_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/SDL2/x86_64-w64-mingw32/lib -lSDL2") - else() # 32-bit - set(SDL2_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/SDL2/i686-w64-mingw32/include/SDL2) - set(SDL2_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/SDL2/i686-w64-mingw32/lib -lSDL2") - endif() +if("${CMAKE_SYSTEM_NAME}" MATCHES Windows) + target_sources(SRB2SDL2 PRIVATE + ../win32/win_dbg.c + ../win32/Srb2win.rc) +endif() + +if("${CMAKE_SYSTEM_NAME}" MATCHES Darwin) + set(MACOSX_BUNDLE_ICON_FILE Srb2mac.icns) + set_source_files_properties(macosx/Srb2mac.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + target_sources(SRB2SDL2 PRIVATE + macosx/mac_alert.c + macosx/mac_alert.h + macosx/mac_resources.c + macosx/mac_resources.h + macosx/Srb2mac.icns + ) +endif() + +if("${CMAKE_SYSTEM_NAME}" MATCHES Darwin) + find_library(CORE_FOUNDATION_LIBRARY "CoreFoundation") + target_link_libraries(SRB2SDL2 PRIVATE + ${CORE_FOUNDATION_LIBRARY} + ) + + #target_link_libraries(SRB2SDL2 PRIVATE SRB2Core) + set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}") + + # Configure the app bundle icon and plist properties + target_sources(SRB2SDL2 PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns") + set_target_properties(SRB2SDL2 PROPERTIES + MACOSX_BUNDLE_ICON_FILE "Srb2mac" + MACOSX_BUNDLE_BUNDLE_NAME "Dr. Robotnik's Ring Racers" + MACOSX_BUNDLE_BUNDLE_VERSION ${SRB2_VERSION} + + RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns" + ) +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}" AND NOT "${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}") + target_link_libraries(SRB2SDL2 PRIVATE SDL2::SDL2-static SDL2_mixer::SDL2_mixer-static) else() - find_package(SDL2) + target_link_libraries(SRB2SDL2 PRIVATE SDL2::SDL2 SDL2_mixer::SDL2_mixer) endif() -if(${SDL2_FOUND}) - if(${SRB2_USEASM}) - set_source_files_properties(${SRB2_ASM_SOURCES} PROPERTIES LANGUAGE C) - set_source_files_properties(${SRB2_ASM_SOURCES} PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp") - endif() +if("${CMAKE_SYSTEM_NAME}" MATCHES Linux) + target_link_libraries(SRB2SDL2 PRIVATE m rt) +endif() - if(${CMAKE_SYSTEM} MATCHES Windows) - target_sources(SRB2SDL2 PRIVATE - ../win32/win_dbg.c - ../win32/Srb2win.rc) - endif() - - if(${CMAKE_SYSTEM} MATCHES Darwin) - set(MACOSX_BUNDLE_ICON_FILE Srb2mac.icns) - set_source_files_properties(macosx/Srb2mac.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") - target_sources(SRB2SDL2 PRIVATE - macosx/mac_alert.c - macosx/mac_alert.h - macosx/mac_resources.c - macosx/mac_resources.h - macosx/Srb2mac.icns - ) - endif() - - set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME ringracers) - - if(${CMAKE_SYSTEM} MATCHES Darwin) - find_library(CORE_LIB CoreFoundation) - target_link_libraries(SRB2SDL2 PRIVATE - ${CORE_LIB} - SDL2 - SDL2_mixer - ${GME_LIBRARIES} - ${OPENMPT_LIBRARIES} - ${MIXERX_LIBRARIES} - ${PNG_LIBRARIES} - ${ZLIB_LIBRARIES} - ${OPENGL_LIBRARIES} - ${CURL_LIBRARIES} - ${DISCORDRPC_LIBRARIES} - ) - set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}") +if(${SRB2_USEASM}) + if(${SRB2_CONFIG_YASM}) + set(ASM_ASSEMBLER_TEMP ${CMAKE_ASM_YASM_COMPILER}) + set(ASM_ASSEMBLER_OBJFORMAT ${CMAKE_ASM_YASM_OBJECT_FORMAT}) + set_source_files_properties(${SRB2_NASM_SOURCES} LANGUAGE ASM_YASM) else() - target_link_libraries(SRB2SDL2 PRIVATE - ${SDL2_LIBRARIES} - ${SDL2_MIXER_LIBRARIES} - ${GME_LIBRARIES} - ${OPENMPT_LIBRARIES} - ${MIXERX_LIBRARIES} - ${PNG_LIBRARIES} - ${ZLIB_LIBRARIES} - ${OPENGL_LIBRARIES} - ${CURL_LIBRARIES} - ${DISCORDRPC_LIBRARIES} - ) + set(ASM_ASSEMBLER_TEMP ${CMAKE_ASM_NASM_COMPILER}) + set(ASM_ASSEMBLER_OBJFORMAT ${CMAKE_ASM_NASM_OBJECT_FORMAT}) + set_source_files_properties(${SRB2_NASM_SOURCES} LANGUAGE ASM_NASM) + endif() +endif() - if(${CMAKE_SYSTEM} MATCHES Linux) - target_link_libraries(SRB2SDL2 PRIVATE - m - rt +if("${CMAKE_SYSTEM_NAME}" MATCHES Windows) + target_link_libraries(SRB2SDL2 PRIVATE + ws2_32 + ) + target_compile_options(SRB2SDL2 PRIVATE + -U_WINDOWS + ) +endif() + +target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_MIXER -DSOUND=SOUND_MIXER) +target_compile_definitions(SRB2SDL2 PRIVATE -DDIRECTFULLSCREEN -DHAVE_SDL) + +#### Installation #### +if("${CMAKE_SYSTEM_NAME}" MATCHES Darwin) + install(TARGETS SRB2SDL2 + BUNDLE DESTINATION . + ) + set_property(TARGET SRB2SDL2 PROPERTY INSTALL_RPATH_USE_LINK_PATH ON) +else() + install(TARGETS SRB2SDL2 SRB2SDL2 + RUNTIME DESTINATION . + ) + if ((${CMAKE_BUILD_TYPE} MATCHES Debug) OR (${CMAKE_BUILD_TYPE} MATCHES RelWithDebInfo)) + set(SRB2_DEBUG_INSTALL OFF CACHE BOOL "Insert *.debug file into the install directory or package.") + if (${SRB2_DEBUG_INSTALL}) + install(FILES $.debug + DESTINATION . + OPTIONAL ) endif() endif() - - if(${CMAKE_SYSTEM} MATCHES Windows AND ${CMAKE_C_COMPILER_ID} MATCHES "GNU" AND ${SRB2_SYSTEM_BITS} EQUAL 32) - target_link_libraries(SRB2SDL2 PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}/../../libs/drmingw/lib/win32/libexchndl.a" - "${CMAKE_CURRENT_SOURCE_DIR}/../../libs/drmingw/lib/win32/libmgwhelp.a" - ) - target_include_directories(SRB2SDL2 PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../libs/drmingw/include") - endif() - - #target_link_libraries(SRB2SDL2 PRIVATE SRB2Core) - - if(${SRB2_USEASM}) - if(${SRB2_CONFIG_YASM}) - set(ASM_ASSEMBLER_TEMP ${CMAKE_ASM_YASM_COMPILER}) - set(ASM_ASSEMBLER_OBJFORMAT ${CMAKE_ASM_YASM_OBJECT_FORMAT}) - set_source_files_properties(${SRB2_NASM_SOURCES} LANGUAGE ASM_YASM) - else() - set(ASM_ASSEMBLER_TEMP ${CMAKE_ASM_NASM_COMPILER}) - set(ASM_ASSEMBLER_OBJFORMAT ${CMAKE_ASM_NASM_OBJECT_FORMAT}) - set_source_files_properties(${SRB2_NASM_SOURCES} LANGUAGE ASM_NASM) - endif() - endif() - - set_target_properties(SRB2SDL2 PROPERTIES VERSION ${SRB2_VERSION}) - - if(${CMAKE_SYSTEM} MATCHES Windows) - target_link_libraries(SRB2SDL2 PRIVATE - ws2_32 - ) - target_compile_options(SRB2SDL2 PRIVATE - -U_WINDOWS - ) - endif() - - target_include_directories(SRB2SDL2 PRIVATE - ${SDL2_INCLUDE_DIRS} - ${SDL2_MIXER_INCLUDE_DIRS} - ${GME_INCLUDE_DIRS} - ${OPENMPT_INCLUDE_DIRS} - ${MIXERX_INCLUDE_DIRS} - ${PNG_INCLUDE_DIRS} - ${ZLIB_INCLUDE_DIRS} - ${OPENGL_INCLUDE_DIRS} - ${CURL_INCLUDE_DIRS} - ${DISCORDRPC_INCLUDE_DIRS} - ) - - if((${SRB2_HAVE_MIXER}) OR (${SRB2_HAVE_MIXERX})) - target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_MIXER -DSOUND=SOUND_MIXER) - endif() - - target_compile_definitions(SRB2SDL2 PRIVATE - -DDIRECTFULLSCREEN -DHAVE_SDL - -DHAVE_THREADS - ) - - #### Installation #### - if(${CMAKE_SYSTEM} MATCHES Darwin) - install(TARGETS SRB2SDL2 - BUNDLE DESTINATION . - ) - else() - install(TARGETS SRB2SDL2 SRB2SDL2 - RUNTIME DESTINATION . - ) - if ((${CMAKE_BUILD_TYPE} MATCHES Debug) OR (${CMAKE_BUILD_TYPE} MATCHES RelWithDebInfo)) - set(SRB2_DEBUG_INSTALL OFF CACHE BOOL "Insert *.debug file into the install directory or package.") - if (${SRB2_DEBUG_INSTALL}) - install(FILES $.debug - DESTINATION . - OPTIONAL - ) - endif() - endif() - endif() - - if(${CMAKE_SYSTEM} MATCHES Windows) - set(win_extra_dll_list "") - macro(getwinlib dllname defaultname) - if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES}) - if (${CMAKE_GENERATOR} STREQUAL "MinGW Makefiles") - if(${SRB2_SYSTEM_BITS} EQUAL 64) - find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}" - HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/x86_64 - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/x86_64-w64-mingw32/bin - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/x86_64-w64-mingw32/bin - HINTS ${CMAKE_SOURCE_DIR}/libs/libopenmpt/bin/x86_64/mingw - HINTS ${CMAKE_SOURCE_DIR}/libs/SDLMixerX/x86_64-w64-mingw32/bin - ) - else() - find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}" - HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/i686 - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/i686-w64-mingw32/bin - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/i686-w64-mingw32/bin - HINTS ${CMAKE_SOURCE_DIR}/libs/libopenmpt/bin/x86/mingw - HINTS ${CMAKE_SOURCE_DIR}/libs/SDLMixerX/i686-w64-mingw32/bin - ) - endif() - else() - if(${SRB2_SYSTEM_BITS} EQUAL 64) - find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}" - HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/x86_64 - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/lib/x64 - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/lib/x64 - HINTS ${CMAKE_SOURCE_DIR}/libs/libopenmpt/bin/x86_64/mingw - HINTS ${CMAKE_SOURCE_DIR}/libs/SDLMixerX/x86_64-w64-mingw32/bin - ) - else() - find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}" - HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/i686 - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/lib/x86 - HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/lib/x86 - HINTS ${CMAKE_SOURCE_DIR}/libs/libopenmpt/bin/x86/mingw - HINTS ${CMAKE_SOURCE_DIR}/libs/SDLMixerX/i686-w64-mingw32/bin - ) - endif() - endif() - - list(APPEND win_extra_dll_list ${SRB2_SDL2_DLL_${dllname}}) - else() - find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}") - list(APPEND win_extra_dll_list ${SRB2_SDL2_DLL_${dllname}}) - endif() - endmacro() - getwinlib(SDL2 "SDL2.dll") - if(${SRB2_CONFIG_SDL2_USEMIXER}) - getwinlib(SDL2_mixer "SDL2_mixer.dll") - getwinlib(libogg_0 "libogg-0.dll") - getwinlib(libvorbis_0 "libvorbis-0.dll") - getwinlib(libvorbisfile_3 "libvorbisfile-3.dll") - endif() - if(${SRB2_CONFIG_HAVE_GME}) - getwinlib(libgme "libgme.dll") - endif() - if(${SRB2_CONFIG_HAVE_OPENMPT}) - getwinlib(libopenmpt "libopenmpt.dll") - endif() - if(${SRB2_CONFIG_HAVE_MIXERX}) - getwinlib(SDL2_mixer_ext "SDL2_mixer_ext.dll") - getwinlib(libfluidsynth-2 "libfluidsynth-2.dll") - getwinlib(libgcc_s_sjlj-1 "libgcc_s_sjlj-1.dll") - getwinlib(libstdc++-6 "libstdc++-6.dll") - endif() - - if(${SRB2_CONFIG_HAVE_DISCORDRPC}) - getwinlib(discord-rpc "discord-rpc.dll") - endif() - - install(PROGRAMS - ${win_extra_dll_list} - DESTINATION . - ) - - # We also want to copy those DLLs to build directories on MSVC. - # So we'll add a post_build step. - copy_files_to_build_dir(SRB2SDL2 win_extra_dll_list) - endif() - - - # Mac bundle fixup - # HACK: THIS IS IMPORTANT! See the escaped \${CMAKE_INSTALL_PREFIX}? This - # makes it so that var is evaluated LATER during cpack, not right now! - # This fixes the quirk where the bundled libraries don't land in the final package - # https://cmake.org/pipermail/cmake/2011-March/043532.html - # - # HOWEVER: ${CPACK_PACKAGE_DESCRIPTION_SUMMARY} is NOT escaped, because that var - # is only available to us at this step. Read the link: ${CMAKE_INSTALL_PREFIX} at - # this current step points to the CMAKE build folder, NOT the folder that CPACK uses. - # Therefore, it makes sense to escape that var, but not the other. - if(${CMAKE_SYSTEM} MATCHES Darwin) - install(CODE " - include(BundleUtilities) - fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_DESCRIPTION_SUMMARY}.app\" - \"\" - /Library/Frameworks - )" - ) - endif() - - set(SRB2_SDL2_AVAILABLE YES PARENT_SCOPE) -else() - message(WARNING "SDL2 was not found, so the SDL2 target will not be available.") - set(SRB2_SDL2_AVAILABLE NO PARENT_SCOPE) endif() + +# Mac bundle fixup +# HACK: THIS IS IMPORTANT! See the escaped \${CMAKE_INSTALL_PREFIX}? This +# makes it so that var is evaluated LATER during cpack, not right now! +# This fixes the quirk where the bundled libraries don't land in the final package +# https://cmake.org/pipermail/cmake/2011-March/043532.html +# +# HOWEVER: ${CPACK_PACKAGE_DESCRIPTION_SUMMARY} is NOT escaped, because that var +# is only available to us at this step. Read the link: ${CMAKE_INSTALL_PREFIX} at +# this current step points to the CMAKE build folder, NOT the folder that CPACK uses. +# Therefore, it makes sense to escape that var, but not the other. +if("${CMAKE_SYSTEM_NAME}" MATCHES Darwin) + install(CODE " + include(BundleUtilities) + fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_DESCRIPTION_SUMMARY}.app\" + \"\" + /Library/Frameworks + )" + ) +endif() + +set(SRB2_SDL2_AVAILABLE YES PARENT_SCOPE) diff --git a/src/sdl/i_main.c b/src/sdl/i_main.c index de3ea3c9a..bc1200788 100644 --- a/src/sdl/i_main.c +++ b/src/sdl/i_main.c @@ -66,7 +66,7 @@ char logfilename[1024]; #endif #if defined (_WIN32) -#include "exchndl.h" +#include #endif #if defined (_WIN32) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index db4296f79..707d20427 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2273,18 +2273,6 @@ static const char *locateWad(void) } #endif - -#ifdef CMAKECONFIG -#ifndef NDEBUG - I_OutputMsg(","CMAKE_ASSETS_DIR); - strcpy(returnWadPath, CMAKE_ASSETS_DIR); - if (isWadPathOk(returnWadPath)) - { - return returnWadPath; - } -#endif -#endif - #ifdef __APPLE__ OSX_GetResourcesPath(returnWadPath); I_OutputMsg(",%s", returnWadPath); diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 5e97694ad..5cea8c65a 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -108,7 +108,7 @@ boolean highcolor = false; // synchronize page flipping with screen refresh -consvar_t cv_vidwait = CVAR_INIT ("vid_wait", "On", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_vidwait = CVAR_INIT ("vid_wait", "Off", CV_SAVE, CV_OnOff, NULL); static consvar_t cv_stretch = CVAR_INIT ("stretch", "Off", CV_SAVE|CV_NOSHOWHELP, CV_OnOff, NULL); static consvar_t cv_alwaysgrabmouse = CVAR_INIT ("alwaysgrabmouse", "Off", CV_SAVE, CV_OnOff, NULL); diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c index d50bb49b5..5c4be227a 100644 --- a/src/sdl/mixer_sound.c +++ b/src/sdl/mixer_sound.c @@ -80,7 +80,7 @@ write netcode into the sound code, OKAY? #endif #ifdef HAVE_GME -#include "gme/gme.h" +#include #define GME_TREBLE 5.0f #define GME_BASS 1.0f #endif // HAVE_GME diff --git a/src/sounds.c b/src/sounds.c index f50e94942..016cf5029 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -479,7 +479,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3k4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Splash"}, {"s3k4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Heavy hit"}, {"s3k4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing bullet"}, - {"s3k4e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Big explosion"}, // Kart explosion + {"s3k4e", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Big explosion"}, // Kart explosion {"s3k4f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flamethrower"}, {"s3k50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Siren"}, {"s3k51", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Falling"}, @@ -750,7 +750,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"cdfm71", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"cdfm72", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"cdfm73", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, - {"cdfm74", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, + {"cdfm74", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Broly ki {"cdfm75", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"cdfm76", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"cdfm77", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, diff --git a/src/sounds.h b/src/sounds.h index fe4427048..01dfbfc2b 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -62,9 +62,8 @@ typedef enum // // SoundFX struct. // -typedef struct sfxinfo_struct sfxinfo_t; -struct sfxinfo_struct +struct sfxinfo_t { // up to 6-character name const char *name; diff --git a/src/taglist.h b/src/taglist.h index a66312425..8db78b880 100644 --- a/src/taglist.h +++ b/src/taglist.h @@ -21,11 +21,11 @@ typedef INT16 mtag_t; #define MTAG_GLOBAL -1 /// Multitag list. Each taggable element will have its own taglist. -typedef struct +struct taglist_t { mtag_t* tags; UINT16 count; -} taglist_t; +}; void Tag_Add (taglist_t* list, const mtag_t tag); void Tag_Remove (taglist_t* list, const mtag_t tag); @@ -40,12 +40,12 @@ void Tag_SectorRemove (const size_t id, const mtag_t tag); void Tag_SectorFSet (const size_t id, const mtag_t tag); /// Taggroup list. It is essentially just an element id list. -typedef struct +struct taggroup_t { size_t *elements; size_t count; size_t capacity; -} taggroup_t; +}; extern bitarray_t tags_available[]; diff --git a/src/typedef.h b/src/typedef.h new file mode 100644 index 000000000..5fb5ec146 --- /dev/null +++ b/src/typedef.h @@ -0,0 +1,398 @@ +// SONIC ROBO BLAST 2 +//----------------------------------------------------------------------------- +// Copyright (C) 2022 by Kart Krew. +// +// This program is free software distributed under the +// terms of the GNU General Public License, version 2. +// See the 'LICENSE' file for more details. +//----------------------------------------------------------------------------- +/// \file typedef.h +/// \brief Universally accessible type definitions. This +/// file exists so these types can be used anywhere +/// without needing to include specific headers. + +#define TYPEDEF2(struct_id, new_type) \ + typedef struct struct_id new_type + +#define TYPEDEF(id) TYPEDEF2 (id, id) + +// am_map.h +TYPEDEF (fpoint_t); +TYPEDEF (fline_t); + +// command.h +TYPEDEF (vsbuf_t); +TYPEDEF (CV_PossibleValue_t); +TYPEDEF (consvar_t); + +// d_netcmd.h +TYPEDEF (changeteam_packet_t); +TYPEDEF (changeteam_value_t); +TYPEDEF (scheduleTask_t); + +// discord.h +TYPEDEF (discordRequest_t); + +// d_player.h +TYPEDEF (respawnvars_t); +TYPEDEF (botvars_t); +TYPEDEF (skybox_t); +TYPEDEF (player_t); + +// d_clisrv.h +TYPEDEF (clientcmd_pak); +TYPEDEF (client2cmd_pak); +TYPEDEF (client3cmd_pak); +TYPEDEF (client4cmd_pak); +TYPEDEF (servertics_pak); +TYPEDEF (serverconfig_pak); +TYPEDEF (filetx_pak); +TYPEDEF (fileacksegment_t); +TYPEDEF (fileack_pak); +TYPEDEF (clientconfig_pak); +TYPEDEF (serverinfo_pak); +TYPEDEF (serverrefuse_pak); +TYPEDEF (askinfo_pak); +TYPEDEF (msaskinfo_pak); +TYPEDEF (plrinfo); +TYPEDEF (plrconfig); +TYPEDEF (filesneededconfig_pak); +TYPEDEF (doomdata_t); +TYPEDEF (serverelem_t); +TYPEDEF (rewind_t); + +// d_event.h +TYPEDEF (event_t); + +// d_netfil.h +TYPEDEF (fileneeded_t); +TYPEDEF (HTTP_login); +TYPEDEF (luafiletransfer_t); + +// d_think.h +TYPEDEF (thinker_t); + +// d_ticcmd.h +TYPEDEF (ticcmd_t); + +// deh_tables.h +TYPEDEF (actionpointer_t); + +// dehacked.h +TYPEDEF (MYFILE); + +// domdata.h +TYPEDEF (mapvertex_t); +TYPEDEF (mapsidedef_t); +TYPEDEF (maplinedef_t); +TYPEDEF (mapsector_t); +TYPEDEF (mapsubsector_t); +TYPEDEF (mapseg_t); +TYPEDEF (mapnode_t); +TYPEDEF (mapthing_t); + +// doomdef.h +TYPEDEF (skincolor_t); + +// doomstat.h +TYPEDEF (precipprops_t); +TYPEDEF (recorddata_t); +TYPEDEF (scene_t); +TYPEDEF (cutscene_t); +TYPEDEF (textpage_t); +TYPEDEF (textprompt_t); +TYPEDEF (mappoint_t); +TYPEDEF (customoption_t); +TYPEDEF (mapheader_t); +TYPEDEF (tolinfo_t); +TYPEDEF (cupheader_t); + +// font.h +TYPEDEF (font_t); + +// g_demo.h +TYPEDEF (democharlist_t); +TYPEDEF (menudemo_t); +TYPEDEF (demoghost); + +// g_game.h +TYPEDEF (mapsearchfreq_t); + +// hu_stuff.h +TYPEDEF (playersort_t); + +// i_joy.h +TYPEDEF (JoyType_t); + +// i_net.h +TYPEDEF (doomcom_t); +TYPEDEF (holepunch_t); +TYPEDEF (bannednode_t); + +// i_system.h +TYPEDEF (JoyFF_t); +TYPEDEF (CPUInfoFlags); + +// i_time.h +TYPEDEF (timestate_t); + +// info.h +TYPEDEF (state_t); +TYPEDEF (mobjinfo_t); + +// k_bheap.h +TYPEDEF (bheapitem_t); +TYPEDEF (bheap_t); + +// k_boss.h +TYPEDEF (weakspot_t); + +// k_bot.h +TYPEDEF (botprediction_t); + +// k_brightmap.h +TYPEDEF (brightmapStorage_t); + +// k_follower.h +TYPEDEF (follower_t); +TYPEDEF (followercategory_t); + +// k_hud.h +TYPEDEF (trackingResult_t); + +// k_menu.h +TYPEDEF (menucolor_t); +TYPEDEF (menuitem_t); +TYPEDEF (menu_t); +TYPEDEF (menucmd_t); +TYPEDEF (setup_player_t); +TYPEDEF (modedesc_t); + +// k_pathfind.h +TYPEDEF (pathfindnode_t); +TYPEDEF (path_t); +TYPEDEF (pathfindsetup_t); + +// k_profiles.h +TYPEDEF (profile_t); + +// k_terrain.h +TYPEDEF (t_splash_t); +TYPEDEF (t_footstep_t); +TYPEDEF (t_overlay_t); +TYPEDEF (terrain_t); +TYPEDEF (t_floor_t); + +// k_waypoint.h +TYPEDEF (waypoint_t); + +// lua_hudlib_drawlist.h +typedef struct huddrawlist_s *huddrawlist_h; + +// m_aatree.h +TYPEDEF (aatree_t); + +// m_cond.h +TYPEDEF (condition_t); +TYPEDEF (conditionset_t); +TYPEDEF (emblem_t); +TYPEDEF (extraemblem_t); +TYPEDEF (unlockable_t); + +// m_dllist.h +TYPEDEF (mdllistitem_t); + +// m_fixed.h +TYPEDEF (vector2_t); +TYPEDEF (vector3_t); +TYPEDEF (matrix_t); + +// m_perfstats.h +TYPEDEF (ps_hookinfo_t); +TYPEDEF (ps_botinfo_t); + +// m_queue.h +TYPEDEF (mqueueitem_t); +TYPEDEF (mqueue_t); + +// mserv.h +TYPEDEF (msg_server_t); +TYPEDEF (msg_ban_t); + +// p_local.h +TYPEDEF (camera_t); +TYPEDEF (jingle_t); +TYPEDEF (tm_t); +TYPEDEF (TryMoveResult_t); +TYPEDEF (BasicFF_t); + +// p_maputl.h +TYPEDEF (divline_t); +TYPEDEF (intercept_t); + +// p_mobj.h +TYPEDEF (mobj_t); +TYPEDEF (precipmobj_t); +TYPEDEF (actioncache_t); + +// p_polyobj.h +TYPEDEF (polyobj_t); +TYPEDEF (polymaplink_t); +TYPEDEF (polyrotate_t); +TYPEDEF (polymove_t); +TYPEDEF (polywaypoint_t); +TYPEDEF (polyslidedoor_t); +TYPEDEF (polyswingdoor_t); +TYPEDEF (polydisplace_t); +TYPEDEF (polyrotdisplace_t); +TYPEDEF (polyfade_t); +TYPEDEF (polyrotdata_t); +TYPEDEF (polymovedata_t); +TYPEDEF (polywaypointdata_t); +TYPEDEF (polydoordata_t); +TYPEDEF (polydisplacedata_t); +TYPEDEF (polyrotdisplacedata_t); +TYPEDEF (polyflagdata_t); +TYPEDEF (polyfadedata_t); + +// p_saveg.h +TYPEDEF (savedata_t); + +// p_setup.h +TYPEDEF (levelflat_t); + +// p_slopes.h +TYPEDEF (dynlineplanethink_t); +TYPEDEF (dynvertexplanethink_t); + +// p_spec.h +TYPEDEF (thinkerdata_t); +TYPEDEF (fireflicker_t); +TYPEDEF (lightflash_t); +TYPEDEF (laserthink_t); +TYPEDEF (strobe_t); +TYPEDEF (glow_t); +TYPEDEF (lightlevel_t); +TYPEDEF (ceiling_t); +TYPEDEF (floormove_t); +TYPEDEF (elevator_t); +TYPEDEF (crumble_t); +TYPEDEF (noenemies_t); +TYPEDEF (continuousfall_t); +TYPEDEF (bouncecheese_t); +TYPEDEF (mariothink_t); +TYPEDEF (mariocheck_t); +TYPEDEF (thwomp_t); +TYPEDEF (floatthink_t); +TYPEDEF (eachtime_t); +TYPEDEF (raise_t); +TYPEDEF (executor_t); +TYPEDEF (scroll_t); +TYPEDEF (friction_t); +TYPEDEF (pusher_t); +TYPEDEF (disappear_t); +TYPEDEF (fade_t); +TYPEDEF (fadecolormap_t); +TYPEDEF (planedisplace_t); + +// r_data.h +TYPEDEF (lumplist_t); + +// r_defs.h +TYPEDEF (cliprange_t); +TYPEDEF (vertex_t); +TYPEDEF (degenmobj_t); +TYPEDEF (light_t); +TYPEDEF (node_t); +TYPEDEF (post_t); +TYPEDEF (drawseg_t); +TYPEDEF (rotsprite_t); +TYPEDEF (patch_t); +TYPEDEF (softwarepatch_t); +TYPEDEF (pic_t); +TYPEDEF (spriteframe_t); +TYPEDEF (spritedef_t); +TYPEDEF (extracolormap_t); +TYPEDEF (ffloor_t); +TYPEDEF (lightlist_t); +TYPEDEF (r_lightlist_t); +TYPEDEF (pslope_t); +TYPEDEF (sector_t); +TYPEDEF (line_t); +TYPEDEF (side_t); +TYPEDEF (subsector_t); +TYPEDEF (msecnode_t); +TYPEDEF (mprecipsecnode_t); +TYPEDEF (lightmap_t); +TYPEDEF (seg_t); + +// r_draw.h +TYPEDEF (floatv3_t); + +// r_fps.h +TYPEDEF (viewvars_t); +TYPEDEF (interpmobjstate_t); +TYPEDEF (levelinterpolator_t); + +// r_picformats.h +TYPEDEF (spriteframepivot_t); +TYPEDEF (spriteinfo_t); + +// r_plane.h +TYPEDEF (visplane_t); +TYPEDEF (visffloor_t); + +// r_portal.h +TYPEDEF (portal_t); + +// r_skins.h +TYPEDEF (skin_t); + +// r_splats.h +TYPEDEF (floorsplat_t); + +// r_state.h +TYPEDEF (sprcache_t); + +// r_textures.h +TYPEDEF (texpatch_t); +TYPEDEF (texture_t); + +// r_things.h +TYPEDEF (maskcount_t); +TYPEDEF (vissprite_t); +TYPEDEF (drawnode_t); + +// s_sound.h +TYPEDEF (listener_t); +TYPEDEF (channel_t); +TYPEDEF (caption_t); +TYPEDEF (musicdef_t); +TYPEDEF (musicstack_t); + +// screen.h +TYPEDEF (viddef_t); +TYPEDEF (vesa_extra_t); +TYPEDEF (vmode_t); + +// sounds.h +TYPEDEF (sfxinfo_t); + +// taglist.h +TYPEDEF (taglist_t); +TYPEDEF (taggroup_t); + +// v_video.h +TYPEDEF (colorlookup_t); +TYPEDEF (cliprect_t); + +// w_wad.h +TYPEDEF (filelump_t); +TYPEDEF (wadinfo_t); +TYPEDEF (lumpinfo_t); +TYPEDEF (virtlump_t); +TYPEDEF (virtres_t); +TYPEDEF (wadfile_t); + +#undef TYPEDEF +#undef TYPEDEF2 diff --git a/src/v_video.c b/src/v_video.c index 2df56c9a4..d65b34cea 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -36,6 +36,7 @@ // SRB2Kart #include "k_hud.h" +#include "k_boss.h" #include "i_time.h" // Each screen is [vid.width*vid.height]; @@ -517,6 +518,211 @@ void VID_BlitLinearScreen(const UINT8 *srcptr, UINT8 *destptr, INT32 width, INT3 #endif } +void V_AdjustXYWithSnap(INT32 *x, INT32 *y, UINT32 options, INT32 dupx, INT32 dupy) +{ + // dupx adjustments pretend that screen width is BASEVIDWIDTH * dupx + INT32 screenwidth = vid.width; + INT32 screenheight = vid.height; + INT32 basewidth = BASEVIDWIDTH * dupx; + INT32 baseheight = BASEVIDHEIGHT * dupy; + SINT8 player = -1; + UINT8 i; + + if (options & V_SPLITSCREEN) + { + if (r_splitscreen > 0) + { + screenheight /= 2; + baseheight /= 2; + } + + if (r_splitscreen > 1) + { + screenwidth /= 2; + basewidth /= 2; + } + } + + for (i = 0; i <= r_splitscreen; i++) + { + if (stplyr == &players[displayplayers[i]]) + { + player = i; + break; + } + } + + if (vid.width != (BASEVIDWIDTH * dupx)) + { + if (options & V_SNAPTORIGHT) + *x += (screenwidth - basewidth); + else if (!(options & V_SNAPTOLEFT)) + *x += (screenwidth - basewidth) / 2; + } + + if (vid.height != (BASEVIDHEIGHT * dupy)) + { + if (options & V_SNAPTOBOTTOM) + *y += (screenheight - baseheight); + else if (!(options & V_SNAPTOTOP)) + *y += (screenheight - baseheight) / 2; + } + + if (options & V_SPLITSCREEN) + { + if (r_splitscreen == 1) + { + if (player == 1) + *y += screenheight; + } + else if (r_splitscreen > 1) + { + if (player == 1 || player == 3) + *x += screenwidth; + + if (player == 2 || player == 3) + *y += screenheight; + } + } + + if (options & V_SLIDEIN) + { + const tic_t length = TICRATE/4; + tic_t timer = lt_exitticker; + if (bossinfo.boss == true) + { + if (leveltime <= 3) + timer = 0; + else + timer = leveltime-3; + } + + if (timer < length) + { + boolean slidefromright = false; + + const INT32 offsetAmount = (screenwidth * FRACUNIT/2) / length; + fixed_t offset = (screenwidth * FRACUNIT/2) - (timer * offsetAmount); + + offset += FixedMul(offsetAmount, renderdeltatics); + offset /= FRACUNIT; + + if (r_splitscreen > 1) + { + if (stplyr == &players[displayplayers[1]] || stplyr == &players[displayplayers[3]]) + slidefromright = true; + } + + if (options & V_SNAPTORIGHT) + slidefromright = true; + else if (options & V_SNAPTOLEFT) + slidefromright = false; + + if (slidefromright == true) + { + offset = -offset; + } + + *x -= offset; + } + } +} + +static cliprect_t cliprect; + +const cliprect_t *V_GetClipRect(void) +{ + if (cliprect.enabled == false) + { + return NULL; + } + + return &cliprect; +} + +void V_SetClipRect(fixed_t x, fixed_t y, fixed_t w, fixed_t h, INT32 flags) +{ + // Adjust position. + if (!(flags & V_NOSCALESTART)) + { + fixed_t dupx = vid.dupx; + fixed_t dupy = vid.dupy; + + if (flags & V_SCALEPATCHMASK) + { + switch ((flags & V_SCALEPATCHMASK) >> V_SCALEPATCHSHIFT) + { + case 1: // V_NOSCALEPATCH + dupx = dupy = 1; + break; + case 2: // V_SMALLSCALEPATCH + dupx = vid.smalldupx; + dupy = vid.smalldupy; + break; + case 3: // V_MEDSCALEPATCH + dupx = vid.meddupx; + dupy = vid.meddupy; + break; + default: + break; + } + } + + dupx = dupy = (dupx < dupy ? dupx : dupy); + + x = FixedMul(x, dupx); + y = FixedMul(y, dupy); + w = FixedMul(w, dupx); + h = FixedMul(h, dupy); + + if (!(flags & V_SCALEPATCHMASK)) + { + V_AdjustXYWithSnap(&x, &y, flags, dupx, dupy); + } + } + + if (x < 0) + { + w += x; + x = 0; + } + + if (y < 0) + { + h += y; + y = 0; + } + + if (x > vid.width) + { + x = vid.width; + w = 0; + } + + if (y > vid.height) + { + y = vid.height; + h = 0; + } + + cliprect.left = x; + cliprect.top = y; + cliprect.right = x + w; + cliprect.bottom = y + h; + cliprect.flags = flags; + cliprect.enabled = true; + + /* + V_DrawFill(cliprect.l, cliprect.t, cliprect.r - cliprect.l, cliprect.b - cliprect.t, V_NOSCALESTART); + CONS_Printf("[(%d, %d), (%d, %d)]\n", cliprect.l, cliprect.t, cliprect.r, cliprect.b); + */ +} + +void V_ClearClipRect(void) +{ + cliprect.enabled = false; +} + static UINT8 hudplusalpha[11] = { 10, 8, 6, 4, 2, 0, 0, 0, 0, 0, 0}; static UINT8 hudminusalpha[11] = { 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5}; @@ -554,6 +760,8 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca fixed_t pwidth; // patch width fixed_t offx = 0; // x offset + const cliprect_t *clip = V_GetClipRect(); + if (rendermode == render_none) return; @@ -662,7 +870,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca // Center it if necessary if (!(scrn & V_SCALEPATCHMASK)) { - K_AdjustXYWithSnap(&x, &y, scrn, dupx, dupy); + V_AdjustXYWithSnap(&x, &y, scrn, dupx, dupy); } desttop += (y*vid.width) + x; @@ -684,18 +892,19 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca for (col = 0; (col>>FRACBITS) < patch->width; col += colfrac, ++offx, desttop++) { INT32 topdelta, prevdelta = -1; + if (scrn & V_FLIP) // offx is measured from right edge instead of left { - if (x+pwidth-offx < 0) // don't draw off the left of the screen (WRAP PREVENTION) + if (x+pwidth-offx < (clip ? clip->left : 0)) // don't draw off the left of the screen (WRAP PREVENTION) break; - if (x+pwidth-offx >= vid.width) // don't draw off the right of the screen (WRAP PREVENTION) + if (x+pwidth-offx >= (clip ? clip->right : vid.width)) // don't draw off the right of the screen (WRAP PREVENTION) continue; } else { - if (x+offx < 0) // don't draw off the left of the screen (WRAP PREVENTION) + if (x+offx < (clip ? clip->left : 0)) // don't draw off the left of the screen (WRAP PREVENTION) continue; - if (x+offx >= vid.width) // don't draw off the right of the screen (WRAP PREVENTION) + if (x+offx >= (clip ? clip->right : vid.width)) // don't draw off the right of the screen (WRAP PREVENTION) break; } @@ -703,6 +912,8 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca while (column->topdelta != 0xff) { + fixed_t offy = 0; + topdelta = column->topdelta; if (topdelta <= prevdelta) topdelta += prevdelta; @@ -712,23 +923,60 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca dest = desttop; if (scrn & V_FLIP) dest = deststart + (destend - dest); - dest += FixedInt(FixedMul(topdelta<length << FRACBITS)-1; dest < deststop && ofs >= 0; ofs -= rowfrac) + for (ofs = (column->length << FRACBITS)-1; dest < deststop && ofs >= 0; ofs -= rowfrac, ++offy) { + if (clip != NULL) + { + const INT32 cy = y + topdelta - offy; + + if (cy < clip->top) // don't draw off the top of the clip rect + { + dest += vid.width; + continue; + } + + if (cy >= clip->bottom) // don't draw off the bottom of the clip rect + { + dest += vid.width; + continue; + } + } + if (dest >= screens[scrn&V_SCREENMASK]) // don't draw off the top of the screen (CRASH PREVENTION) *dest = patchdrawfunc(dest, source, ofs); + dest += vid.width; } } else { - for (ofs = 0; dest < deststop && ofs < (column->length << FRACBITS); ofs += rowfrac) + for (ofs = 0; dest < deststop && ofs < (column->length << FRACBITS); ofs += rowfrac, ++offy) { + if (clip != NULL) + { + const INT32 cy = y + topdelta + offy; + + if (cy < clip->top) // don't draw off the top of the clip rect + { + dest += vid.width; + continue; + } + + if (cy >= clip->bottom) // don't draw off the bottom of the clip rect + { + dest += vid.width; + continue; + } + } + if (dest >= screens[scrn&V_SCREENMASK]) // don't draw off the top of the screen (CRASH PREVENTION) *dest = patchdrawfunc(dest, source, ofs); + dest += vid.width; } } @@ -741,115 +989,16 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca // Draws a patch cropped and scaled to arbitrary size. void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t *patch, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h) { - UINT8 (*patchdrawfunc)(const UINT8*, const UINT8*, fixed_t); - UINT32 alphalevel, blendmode; - // boolean flip = false; + cliprect_t oldClip = cliprect; - fixed_t col, ofs, colfrac, rowfrac, fdup; - INT32 dupx, dupy; - const column_t *column; - UINT8 *desttop, *dest; - const UINT8 *source, *deststop; + V_SetClipRect(x, y, w, h, scrn); - if (rendermode == render_none) - return; + x -= sx; + y -= sy; -#ifdef HWRENDER - //if (rendermode != render_soft && !con_startup) // Not this again - if (rendermode == render_opengl) - { - HWR_DrawCroppedPatch(patch,x,y,pscale,scrn,sx,sy,w,h); - return; - } -#endif + V_DrawStretchyFixedPatch(x, y, pscale, pscale, scrn, patch, NULL); - patchdrawfunc = standardpdraw; - - if ((blendmode = ((scrn & V_BLENDMASK) >> V_BLENDSHIFT))) - blendmode++; // realign to constants - if ((alphalevel = ((scrn & V_ALPHAMASK) >> V_ALPHASHIFT))) - { - if (alphalevel == 10) // V_HUDTRANSHALF - alphalevel = hudminusalpha[st_translucency]; - else if (alphalevel == 11) // V_HUDTRANS - alphalevel = 10 - st_translucency; - else if (alphalevel == 12) // V_HUDTRANSDOUBLE - alphalevel = hudplusalpha[st_translucency]; - - if (alphalevel >= 10) // Still inelegible to render? - return; - } - if ((v_translevel = R_GetBlendTable(blendmode, alphalevel))) - patchdrawfunc = translucentpdraw; - - // only use one dup, to avoid stretching (har har) - dupx = dupy = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); - fdup = FixedMul(dupx<topoffset<leftoffset<>= FRACBITS; - y >>= FRACBITS; - desttop += (y*vid.width) + x; - } - else - { - x = FixedMul(x,dupx<>= FRACBITS; - y >>= FRACBITS; - - // Center it if necessary - // adjustxy - - desttop += (y*vid.width) + x; - } - - for (col = sx<>FRACBITS) < patch->width && ((col>>FRACBITS) - sx) < w; col += colfrac, ++x, desttop++) - { - INT32 topdelta, prevdelta = -1; - if (x < 0) // don't draw off the left of the screen (WRAP PREVENTION) - continue; - if (x >= vid.width) // don't draw off the right of the screen (WRAP PREVENTION) - break; - column = (const column_t *)((const UINT8 *)(patch->columns) + (patch->columnofs[col>>FRACBITS])); - - while (column->topdelta != 0xff) - { - topdelta = column->topdelta; - if (topdelta <= prevdelta) - topdelta += prevdelta; - prevdelta = topdelta; - source = (const UINT8 *)(column) + 3; - dest = desttop; - if (topdelta-sy > 0) - { - dest += FixedInt(FixedMul((topdelta-sy)<>FRACBITS) < column->length && (((ofs>>FRACBITS) - sy) + topdelta) < h; ofs += rowfrac) - { - if (dest >= screens[scrn&V_SCREENMASK]) // don't draw off the top of the screen (CRASH PREVENTION) - *dest = patchdrawfunc(dest, source, ofs); - dest += vid.width; - } - column = (const column_t *)((const UINT8 *)column + column->length + 4); - } - } + cliprect = oldClip; } // @@ -927,7 +1076,7 @@ void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c) h *= dupy; // Center it if necessary - K_AdjustXYWithSnap(&x, &y, c, dupx, dupy); + V_AdjustXYWithSnap(&x, &y, c, dupx, dupy); } if (x >= vid.width || y >= vid.height) @@ -1039,7 +1188,7 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c) h *= dupy; // Center it if necessary - K_AdjustXYWithSnap(&x, &y, c, dupx, dupy); + V_AdjustXYWithSnap(&x, &y, c, dupx, dupy); } if (x >= vid.width || y >= vid.height) @@ -1126,7 +1275,7 @@ void V_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 c) wh *= dupx; // Center it if necessary - K_AdjustXYWithSnap(&x, &y, c, dupx, dupy); + V_AdjustXYWithSnap(&x, &y, c, dupx, dupy); } if (x >= vid.width || y >= vid.height) diff --git a/src/v_video.h b/src/v_video.h index 1803d0818..ddf5bb89e 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -46,12 +46,12 @@ void V_Recalc(void); // Color look-up table #define CLUTINDEX(r, g, b) (((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3) -typedef struct +struct colorlookup_t { boolean init; RGBA_t palette[256]; UINT16 table[0xFFFF]; -} colorlookup_t; +}; void InitColorLUT(colorlookup_t *lut, RGBA_t *palette, boolean makecolors); UINT8 GetColorLUT(colorlookup_t *lut, UINT8 r, UINT8 g, UINT8 b); @@ -168,6 +168,19 @@ void V_CubeApply(RGBA_t *input); #define V_NOSCALESTART 0x40000000 // don't scale x, y, start coords #define V_SPLITSCREEN 0x80000000 // Add half of screen width or height automatically depending on player number +void V_AdjustXYWithSnap(INT32 *x, INT32 *y, UINT32 options, INT32 dupx, INT32 dupy); + +struct cliprect_t +{ + fixed_t left, right, top, bottom; + INT32 flags; + boolean enabled; +}; + +const cliprect_t *V_GetClipRect(void); +void V_SetClipRect(fixed_t x, fixed_t y, fixed_t w, fixed_t h, INT32 flags); +void V_ClearClipRect(void); + // defines for old functions #define V_DrawPatch(x,y,s,p) V_DrawFixedPatch((x)<>16) // wad flumpnum>>16) // wad file number in upper word #define LUMPNUM(lumpnum) (UINT16)((lumpnum)&0xFFFF) // lump number for this pwad diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt new file mode 100644 index 000000000..8e9793ee7 --- /dev/null +++ b/thirdparty/CMakeLists.txt @@ -0,0 +1,542 @@ +macro(export) +endmacro() + +if(SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES) + set(SRB2_INTERNAL_LIBRARY_TYPE SHARED) + set(NOT_SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES OFF) +else() + set(SRB2_INTERNAL_LIBRARY_TYPE STATIC) + set(NOT_SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES ON) +endif() + + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + CPMAddPackage( + NAME SDL2 + VERSION 2.24.2 + URL "https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.24.2.zip" + EXCLUDE_FROM_ALL ON + OPTIONS + "BUILD_SHARED_LIBS ${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}" + "SDL_SHARED ${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}" + "SDL_STATIC ${NOT_SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}" + "SDL_TEST OFF" + "SDL2_DISABLE_SDL2MAIN ON" + "SDL2_DISABLE_INSTALL ON" + ) +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + CPMAddPackage( + NAME SDL2_mixer + VERSION 2.6.2 + URL "https://github.com/libsdl-org/SDL_mixer/archive/refs/tags/release-2.6.2.zip" + EXCLUDE_FROM_ALL ON + OPTIONS + "BUILD_SHARED_LIBS ${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}" + "SDL2MIXER_INSTALL OFF" + "SDL2MIXER_DEPS_SHARED OFF" + "SDL2MIXER_SAMPLES OFF" + "SDL2MIXER_VENDORED ON" + "SDL2MIXER_FLAC ON" + "SDL2MIXER_FLAC_LIBFLAC OFF" + "SDL2MIXER_FLAC_DRFLAC ON" + "SDL2MIXER_MOD OFF" + "SDL2MIXER_MP3 ON" + "SDL2MIXER_MP3_DRMP3 ON" + "SDL2MIXER_MIDI ON" + "SDL2MIXER_OPUS OFF" + "SDL2MIXER_VORBIS STB" + "SDL2MIXER_WAVE ON" + ) +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + CPMAddPackage( + NAME ZLIB + VERSION 1.2.13 + URL "https://github.com/madler/zlib/archive/refs/tags/v1.2.13.zip" + EXCLUDE_FROM_ALL + DOWNLOAD_ONLY YES + ) + if(ZLIB_ADDED) + set(ZLIB_SRCS + crc32.h + deflate.h + gzguts.h + inffast.h + inffixed.h + inflate.h + inftrees.h + trees.h + zutil.h + + adler32.c + compress.c + crc32.c + deflate.c + gzclose.c + gzlib.c + gzread.c + gzwrite.c + inflate.c + infback.c + inftrees.c + inffast.c + trees.c + uncompr.c + zutil.c + ) + list(TRANSFORM ZLIB_SRCS PREPEND "${ZLIB_SOURCE_DIR}/") + + configure_file("${ZLIB_SOURCE_DIR}/zlib.pc.cmakein" "${ZLIB_BINARY_DIR}/zlib.pc" @ONLY) + configure_file("${ZLIB_SOURCE_DIR}/zconf.h.cmakein" "${ZLIB_BINARY_DIR}/include/zconf.h" @ONLY) + configure_file("${ZLIB_SOURCE_DIR}/zlib.h" "${ZLIB_BINARY_DIR}/include/zlib.h" @ONLY) + + add_library(ZLIB ${SRB2_INTERNAL_LIBRARY_TYPE} ${ZLIB_SRCS}) + set_target_properties(ZLIB PROPERTIES + VERSION 1.2.13 + OUTPUT_NAME "z" + ) + target_include_directories(ZLIB PRIVATE "${ZLIB_SOURCE_DIR}") + target_include_directories(ZLIB PUBLIC "${ZLIB_BINARY_DIR}/include") + if(MSVC) + target_compile_definitions(ZLIB PRIVATE -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) + endif() + add_library(ZLIB::ZLIB ALIAS ZLIB) + endif() +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + CPMAddPackage( + NAME png + VERSION 1.6.38 + URL "https://github.com/glennrp/libpng/archive/refs/tags/v1.6.38.zip" + # png cmake build is broken on msys/mingw32 + DOWNLOAD_ONLY YES + ) + + if(png_ADDED) + # Since png's cmake build is broken, we're going to create a target manually + set( + PNG_SOURCES + + png.h + pngconf.h + + pngpriv.h + pngdebug.h + pnginfo.h + pngstruct.h + + png.c + pngerror.c + pngget.c + pngmem.c + pngpread.c + pngread.c + pngrio.c + pngrtran.c + pngrutil.c + pngset.c + pngtrans.c + pngwio.c + pngwrite.c + pngwtran.c + pngwutil.c + ) + list(TRANSFORM PNG_SOURCES PREPEND "${png_SOURCE_DIR}/") + + add_custom_command( + OUTPUT "${png_BINARY_DIR}/include/png.h" "${png_BINARY_DIR}/include/pngconf.h" + COMMAND ${CMAKE_COMMAND} -E copy "${png_SOURCE_DIR}/png.h" "${png_SOURCE_DIR}/pngconf.h" "${png_BINARY_DIR}/include" + DEPENDS "${png_SOURCE_DIR}/png.h" "${png_SOURCE_DIR}/pngconf.h" + VERBATIM + ) + add_custom_command( + OUTPUT "${png_BINARY_DIR}/include/pnglibconf.h" + COMMAND ${CMAKE_COMMAND} -E copy "${png_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt" "${png_BINARY_DIR}/include/pnglibconf.h" + DEPENDS "${png_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt" + VERBATIM + ) + list( + APPEND PNG_SOURCES + "${png_BINARY_DIR}/include/png.h" + "${png_BINARY_DIR}/include/pngconf.h" + "${png_BINARY_DIR}/include/pnglibconf.h" + ) + add_library(png "${SRB2_INTERNAL_LIBRARY_TYPE}" ${PNG_SOURCES}) + + # Disable ARM NEON since having it automatic breaks libpng external build on clang for some reason + target_compile_definitions(png PRIVATE -DPNG_ARM_NEON_OPT=0) + + # The png includes need to be available to consumers + target_include_directories(png PUBLIC "${png_BINARY_DIR}/include") + + # ... and these also need to be present only for png build + target_include_directories(png PRIVATE "${ZLIB_SOURCE_DIR}") + target_include_directories(png PRIVATE "${ZLIB_BINARY_DIR}") + target_include_directories(png PRIVATE "${png_BINARY_DIR}") + + target_link_libraries(png PRIVATE ZLIB::ZLIB) + add_library(PNG::PNG ALIAS png) + endif() +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + set( + internal_curl_options + + "BUILD_CURL_EXE OFF" + "BUILD_SHARED_LIBS ${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}" + "CURL_DISABLE_TESTS ON" + "HTTP_ONLY ON" + "CURL_DISABLE_CRYPTO_AUTH ON" + "CURL_DISABLE_NTLM ON" + "ENABLE_MANUAL OFF" + "ENABLE_THREADED_RESOLVER OFF" + "CURL_USE_LIBPSL OFF" + "CURL_USE_LIBSSH2 OFF" + "USE_LIBIDN2 OFF" + "CURL_ENABLE_EXPORT_TARGET OFF" + ) + if(${CMAKE_SYSTEM} MATCHES Windows) + list(APPEND internal_curl_options "CURL_USE_OPENSSL OFF") + list(APPEND internal_curl_options "CURL_USE_SCHANNEL ON") + endif() + if(${CMAKE_SYSTEM} MATCHES Darwin) + list(APPEND internal_curl_options "CURL_USE_OPENSSL OFF") + list(APPEND internal_curl_options "CURL_USE_SECTRANSP ON") + endif() + if(${CMAKE_SYSTEM} MATCHES Linux) + list(APPEND internal_curl_options "CURL_USE_OPENSSL ON") + endif() + + CPMAddPackage( + NAME curl + VERSION 7.86.0 + URL "https://github.com/curl/curl/archive/refs/tags/curl-7_86_0.zip" + EXCLUDE_FROM_ALL ON + OPTIONS ${internal_curl_options} + ) +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + CPMAddPackage( + NAME openmpt + VERSION 0.4.30 + URL "https://github.com/OpenMPT/openmpt/archive/refs/tags/libopenmpt-0.4.30.zip" + DOWNLOAD_ONLY ON + ) + + if(openmpt_ADDED) + set( + openmpt_SOURCES + + # minimp3 + # -DMPT_WITH_MINIMP3 + include/minimp3/minimp3.c + + common/mptStringParse.cpp + common/mptLibrary.cpp + common/Logging.cpp + common/Profiler.cpp + common/version.cpp + common/mptCPU.cpp + common/ComponentManager.cpp + common/mptOS.cpp + common/serialization_utils.cpp + common/mptStringFormat.cpp + common/FileReader.cpp + common/mptWine.cpp + common/mptPathString.cpp + common/mptAlloc.cpp + common/mptUUID.cpp + common/mptTime.cpp + common/mptString.cpp + common/mptFileIO.cpp + common/mptStringBuffer.cpp + common/mptRandom.cpp + common/mptIO.cpp + common/misc_util.cpp + + common/mptCRC.h + common/mptLibrary.h + common/mptIO.h + common/version.h + common/stdafx.h + common/ComponentManager.h + common/Endianness.h + common/mptStringFormat.h + common/mptMutex.h + common/mptUUID.h + common/mptExceptionText.h + common/BuildSettings.h + common/mptAlloc.h + common/mptTime.h + common/FileReaderFwd.h + common/Logging.h + common/mptException.h + common/mptWine.h + common/mptStringBuffer.h + common/misc_util.h + common/mptBaseMacros.h + common/mptMemory.h + common/mptFileIO.h + common/serialization_utils.h + common/mptSpan.h + common/mptThread.h + common/FlagSet.h + common/mptString.h + common/mptStringParse.h + common/mptBaseUtils.h + common/mptRandom.h + common/CompilerDetect.h + common/FileReader.h + common/mptAssert.h + common/mptPathString.h + common/Profiler.h + common/mptOS.h + common/mptBaseTypes.h + common/mptCPU.h + common/mptBufferIO.h + common/versionNumber.h + + soundlib/WAVTools.cpp + soundlib/ITTools.cpp + soundlib/AudioCriticalSection.cpp + soundlib/Load_stm.cpp + soundlib/MixerLoops.cpp + soundlib/Load_dbm.cpp + soundlib/ModChannel.cpp + soundlib/Load_gdm.cpp + soundlib/Snd_fx.cpp + soundlib/Load_mid.cpp + soundlib/mod_specifications.cpp + soundlib/Snd_flt.cpp + soundlib/Load_psm.cpp + soundlib/Load_far.cpp + soundlib/patternContainer.cpp + soundlib/Load_med.cpp + soundlib/Load_dmf.cpp + soundlib/Paula.cpp + soundlib/modcommand.cpp + soundlib/Message.cpp + soundlib/SoundFilePlayConfig.cpp + soundlib/Load_uax.cpp + soundlib/plugins/PlugInterface.cpp + soundlib/plugins/LFOPlugin.cpp + soundlib/plugins/PluginManager.cpp + soundlib/plugins/DigiBoosterEcho.cpp + soundlib/plugins/dmo/DMOPlugin.cpp + soundlib/plugins/dmo/Flanger.cpp + soundlib/plugins/dmo/Distortion.cpp + soundlib/plugins/dmo/ParamEq.cpp + soundlib/plugins/dmo/Gargle.cpp + soundlib/plugins/dmo/I3DL2Reverb.cpp + soundlib/plugins/dmo/Compressor.cpp + soundlib/plugins/dmo/WavesReverb.cpp + soundlib/plugins/dmo/Echo.cpp + soundlib/plugins/dmo/Chorus.cpp + soundlib/Load_ams.cpp + soundlib/tuningbase.cpp + soundlib/ContainerUMX.cpp + soundlib/Load_ptm.cpp + soundlib/ContainerXPK.cpp + soundlib/SampleFormatMP3.cpp + soundlib/tuning.cpp + soundlib/Sndfile.cpp + soundlib/ContainerMMCMP.cpp + soundlib/Load_amf.cpp + soundlib/Load_669.cpp + soundlib/modsmp_ctrl.cpp + soundlib/Load_mtm.cpp + soundlib/OggStream.cpp + soundlib/Load_plm.cpp + soundlib/Tables.cpp + soundlib/Load_c67.cpp + soundlib/Load_mod.cpp + soundlib/Load_sfx.cpp + soundlib/Sndmix.cpp + soundlib/load_j2b.cpp + soundlib/ModSequence.cpp + soundlib/SampleFormatFLAC.cpp + soundlib/ModInstrument.cpp + soundlib/Load_mo3.cpp + soundlib/ModSample.cpp + soundlib/Dlsbank.cpp + soundlib/Load_itp.cpp + soundlib/UpgradeModule.cpp + soundlib/MIDIMacros.cpp + soundlib/ContainerPP20.cpp + soundlib/RowVisitor.cpp + soundlib/Load_imf.cpp + soundlib/SampleFormatVorbis.cpp + soundlib/Load_dsm.cpp + soundlib/Load_mt2.cpp + soundlib/MixerSettings.cpp + soundlib/S3MTools.cpp + soundlib/Load_xm.cpp + soundlib/MIDIEvents.cpp + soundlib/pattern.cpp + soundlib/Load_digi.cpp + soundlib/Load_s3m.cpp + soundlib/tuningCollection.cpp + soundlib/SampleIO.cpp + soundlib/Dither.cpp + soundlib/Load_mdl.cpp + soundlib/OPL.cpp + soundlib/WindowedFIR.cpp + soundlib/SampleFormats.cpp + soundlib/Load_wav.cpp + soundlib/Load_it.cpp + soundlib/UMXTools.cpp + soundlib/Load_stp.cpp + soundlib/Load_okt.cpp + soundlib/Load_ult.cpp + soundlib/MixFuncTable.cpp + soundlib/SampleFormatOpus.cpp + soundlib/Fastmix.cpp + soundlib/Tagging.cpp + soundlib/ITCompression.cpp + soundlib/Load_dtm.cpp + soundlib/MPEGFrame.cpp + soundlib/XMTools.cpp + soundlib/SampleFormatMediaFoundation.cpp + soundlib/InstrumentExtensions.cpp + + soundlib/MixerInterface.h + soundlib/SoundFilePlayConfig.h + soundlib/ModSample.h + soundlib/MIDIEvents.h + soundlib/ModSampleCopy.h + soundlib/patternContainer.h + soundlib/ChunkReader.h + soundlib/ITCompression.h + soundlib/Dither.h + soundlib/S3MTools.h + soundlib/MPEGFrame.h + soundlib/WAVTools.h + soundlib/mod_specifications.h + soundlib/ITTools.h + soundlib/RowVisitor.h + soundlib/plugins/PluginMixBuffer.h + soundlib/plugins/PluginStructs.h + soundlib/plugins/LFOPlugin.h + soundlib/plugins/PlugInterface.h + soundlib/plugins/DigiBoosterEcho.h + soundlib/plugins/OpCodes.h + soundlib/plugins/dmo/Echo.h + soundlib/plugins/dmo/I3DL2Reverb.h + soundlib/plugins/dmo/WavesReverb.h + soundlib/plugins/dmo/ParamEq.h + soundlib/plugins/dmo/Gargle.h + soundlib/plugins/dmo/DMOPlugin.h + soundlib/plugins/dmo/Chorus.h + soundlib/plugins/dmo/Compressor.h + soundlib/plugins/dmo/Distortion.h + soundlib/plugins/dmo/Flanger.h + soundlib/plugins/PluginManager.h + soundlib/SampleIO.h + soundlib/Container.h + soundlib/ModSequence.h + soundlib/UMXTools.h + soundlib/Message.h + soundlib/modcommand.h + soundlib/XMTools.h + soundlib/Snd_defs.h + soundlib/MixFuncTable.h + soundlib/pattern.h + soundlib/modsmp_ctrl.h + soundlib/Tagging.h + soundlib/tuningcollection.h + soundlib/Mixer.h + soundlib/FloatMixer.h + soundlib/AudioCriticalSection.h + soundlib/Tables.h + soundlib/tuningbase.h + soundlib/WindowedFIR.h + soundlib/Sndfile.h + soundlib/Paula.h + soundlib/ModInstrument.h + soundlib/Dlsbank.h + soundlib/IntMixer.h + soundlib/OPL.h + soundlib/Resampler.h + soundlib/ModChannel.h + soundlib/MixerSettings.h + soundlib/AudioReadTarget.h + soundlib/MixerLoops.h + soundlib/tuning.h + soundlib/MIDIMacros.h + soundlib/OggStream.h + soundlib/Loaders.h + soundlib/BitReader.h + soundlib/opal.h + + sounddsp/AGC.cpp + sounddsp/EQ.cpp + sounddsp/DSP.cpp + sounddsp/Reverb.cpp + sounddsp/Reverb.h + sounddsp/EQ.h + sounddsp/DSP.h + sounddsp/AGC.h + + libopenmpt/libopenmpt_c.cpp + libopenmpt/libopenmpt_cxx.cpp + libopenmpt/libopenmpt_impl.cpp + libopenmpt/libopenmpt_ext_impl.cpp + ) + list(TRANSFORM openmpt_SOURCES PREPEND "${openmpt_SOURCE_DIR}/") + + # -DLIBOPENMPT_BUILD + configure_file("openmpt_svn_version.h" "svn_version.h") + add_library(openmpt "${SRB2_INTERNAL_LIBRARY_TYPE}" ${openmpt_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/svn_version.h) + if("${CMAKE_C_COMPILER_ID}" STREQUAL GNU OR "${CMAKE_C_COMPILER_ID}" STREQUAL Clang OR "${CMAKE_C_COMPILER_ID}" STREQUAL AppleClang) + target_compile_options(openmpt PRIVATE "-g0") + endif() + if("${CMAKE_SYSTEM_NAME}" STREQUAL Windows AND "${CMAKE_C_COMPILER_ID}" STREQUAL MSVC) + target_link_libraries(openmpt PRIVATE Rpcrt4) + endif() + target_compile_features(openmpt PRIVATE cxx_std_11) + target_compile_definitions(openmpt PRIVATE -DLIBOPENMPT_BUILD) + + target_include_directories(openmpt PRIVATE "${openmpt_SOURCE_DIR}/common") + target_include_directories(openmpt PRIVATE "${openmpt_SOURCE_DIR}/src") + target_include_directories(openmpt PRIVATE "${openmpt_SOURCE_DIR}/include") + target_include_directories(openmpt PRIVATE "${openmpt_SOURCE_DIR}") + target_include_directories(openmpt PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") + + # I wish this wasn't necessary, but it is + target_include_directories(openmpt PUBLIC "${openmpt_SOURCE_DIR}") + endif() +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + CPMAddPackage( + NAME libgme + VERSION 0.6.3 + URL "https://bitbucket.org/mpyne/game-music-emu/get/e76bdc0cb916e79aa540290e6edd0c445879d3ba.zip" + EXCLUDE_FROM_ALL ON + OPTIONS + "BUILD_SHARED_LIBS ${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}" + "ENABLE_UBSAN OFF" + "GME_YM2612_EMU MAME" + ) + target_compile_features(gme PRIVATE cxx_std_11) + target_link_libraries(gme PRIVATE ZLIB::ZLIB) +endif() + +if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + CPMAddPackage( + NAME DiscordRPC + VERSION 3.4.0 + URL "https://github.com/discord/discord-rpc/archive/refs/tags/v3.4.0.zip" + EXCLUDE_FROM_ALL ON + OPTIONS + "BUILD_EXAMPLES OFF" + ) + target_include_directories(discord-rpc INTERFACE "${DiscordRPC_SOURCE_DIR}/include") + add_library(DiscordRPC::DiscordRPC ALIAS discord-rpc) +endif() diff --git a/thirdparty/openmpt_svn_version.h b/thirdparty/openmpt_svn_version.h new file mode 100644 index 000000000..a45ed9f22 --- /dev/null +++ b/thirdparty/openmpt_svn_version.h @@ -0,0 +1,10 @@ + +#pragma once +#define OPENMPT_VERSION_SVNVERSION "17963" +#define OPENMPT_VERSION_REVISION 17963 +#define OPENMPT_VERSION_DIRTY 0 +#define OPENMPT_VERSION_MIXEDREVISIONS 0 +#define OPENMPT_VERSION_URL "https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.4.32" +#define OPENMPT_VERSION_DATE "2022-09-25T14:19:05.052596Z" +#define OPENMPT_VERSION_IS_PACKAGE 1 +