mirror of
https://github.com/halpz/re3.git
synced 2025-01-02 19:25:30 +00:00
Merge branch 'miami' into lcs
# Conflicts: # README.md # gamefiles/TEXT/american.gxt # gamefiles/TEXT/french.gxt # gamefiles/TEXT/german.gxt # gamefiles/TEXT/italian.gxt # gamefiles/TEXT/spanish.gxt # src/audio/AudioLogic.cpp # src/core/config.h # src/vehicles/Automobile.cpp # utils/gxt/american.txt # utils/gxt/french.txt # utils/gxt/german.txt # utils/gxt/italian.txt # utils/gxt/spanish.txt
This commit is contained in:
commit
d7e764d519
29
.github/workflows/build-switch.yml
vendored
Normal file
29
.github/workflows/build-switch.yml
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
name: re3 cmake devkitA64 (Nintendo Switch)
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
release:
|
||||||
|
types: published
|
||||||
|
jobs:
|
||||||
|
build-nintendo-switch:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: devkitpro/devkita64:latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
|
- name: "Build files"
|
||||||
|
run: |
|
||||||
|
/opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -S. -Bbuild -DREVC_AUDIO=OAL -DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=GLFW -DREVC_WITH_OPUS=False -DREVC_VENDORED_LIBRW=True -DREVC_INSTALL=True
|
||||||
|
cmake --build build --parallel
|
||||||
|
- name: "Create binary package (cpack)"
|
||||||
|
working-directory: ./build
|
||||||
|
run: |
|
||||||
|
cpack
|
||||||
|
- name: "Archive binary package (github artifacts)"
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: "switch-gl3"
|
||||||
|
path: build/*.tar.xz
|
||||||
|
if-no-files-found: error
|
18
.vscode/c_cpp_properties.json
vendored
18
.vscode/c_cpp_properties.json
vendored
|
@ -26,6 +26,24 @@
|
||||||
"compilerArgs": ["-ggdb"],
|
"compilerArgs": ["-ggdb"],
|
||||||
"cStandard": "gnu11",
|
"cStandard": "gnu11",
|
||||||
"cppStandard": "gnu++14"
|
"cppStandard": "gnu++14"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "devkitPro aarch64 (Nintendo Switch)",
|
||||||
|
"compilerPath": "${env:DEVKITPRO}/devkitA64/bin/aarch64-none-elf-g++",
|
||||||
|
"includePath": [
|
||||||
|
"${default}",
|
||||||
|
"${env:DEVKITPRO}/portlibs/switch/include",
|
||||||
|
"${env:DEVKITPRO}/libnx/include"
|
||||||
|
],
|
||||||
|
"intelliSenseMode": "gcc-arm64",
|
||||||
|
"cStandard": "gnu11",
|
||||||
|
"cppStandard": "gnu++11",
|
||||||
|
"defines": [
|
||||||
|
"__SWITCH__",
|
||||||
|
"LIBRW",
|
||||||
|
"RW_GL3",
|
||||||
|
"AUDIO_OAL"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version": 4
|
"version": 4
|
||||||
|
|
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
|
@ -2,8 +2,13 @@
|
||||||
"C_Cpp.default.cStandard": "gnu11",
|
"C_Cpp.default.cStandard": "gnu11",
|
||||||
"C_Cpp.default.cppStandard": "gnu++14",
|
"C_Cpp.default.cppStandard": "gnu++14",
|
||||||
"C_Cpp.default.includePath": [
|
"C_Cpp.default.includePath": [
|
||||||
|
"src",
|
||||||
"src/animation",
|
"src/animation",
|
||||||
"src/audio",
|
"src/audio",
|
||||||
|
"src/audio/eax",
|
||||||
|
"src/audio/oal",
|
||||||
|
"src/buildings",
|
||||||
|
"src/collision",
|
||||||
"src/control",
|
"src/control",
|
||||||
"src/core",
|
"src/core",
|
||||||
"src/entities",
|
"src/entities",
|
||||||
|
@ -16,6 +21,7 @@
|
||||||
"src/renderer",
|
"src/renderer",
|
||||||
"src/rw",
|
"src/rw",
|
||||||
"src/save",
|
"src/save",
|
||||||
|
"src/save/glfw",
|
||||||
"src/skel",
|
"src/skel",
|
||||||
"src/text",
|
"src/text",
|
||||||
"src/vehicles",
|
"src/vehicles",
|
||||||
|
|
|
@ -1,15 +1,27 @@
|
||||||
cmake_minimum_required(VERSION 3.8)
|
cmake_minimum_required(VERSION 3.14)
|
||||||
|
|
||||||
set(EXECUTABLE reLCS)
|
set(EXECUTABLE reLCS)
|
||||||
set(PROJECT RELCS)
|
set(PROJECT RELCS)
|
||||||
|
|
||||||
project(${EXECUTABLE} C CXX)
|
project(${EXECUTABLE} C CXX)
|
||||||
|
set(${PROJECT}_AUTHOR "${PROJECT} Team")
|
||||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
include(GetGitRevisionDescription)
|
include(GetGitRevisionDescription)
|
||||||
get_git_head_revision(GIT_REFSPEC GIT_SHA1 "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
|
get_git_head_revision(GIT_REFSPEC GIT_SHA1 "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
|
||||||
message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}")
|
message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}")
|
||||||
|
|
||||||
|
|
||||||
|
if(NINTENDO_SWITCH)
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/nx")
|
||||||
|
include(NXFunctions)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT COMMAND reVC_platform_target)
|
||||||
|
function(reVC_platform_target)
|
||||||
|
endfunction()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(${PROJECT}_AUDIOS "OAL" "MSS")
|
set(${PROJECT}_AUDIOS "OAL" "MSS")
|
||||||
else()
|
else()
|
||||||
|
@ -66,6 +78,8 @@ if(${PROJECT}_INSTALL)
|
||||||
set(os "-apple")
|
set(os "-apple")
|
||||||
elseif(UNIX)
|
elseif(UNIX)
|
||||||
set(os "-linux")
|
set(os "-linux")
|
||||||
|
elseif(NINTENDO_SWITCH)
|
||||||
|
set(os "-switch")
|
||||||
else()
|
else()
|
||||||
set(compiler "-UNK")
|
set(compiler "-UNK")
|
||||||
message(WARNING "Unknown os. Created cpack package will be wrong. (override using cpack -P)")
|
message(WARNING "Unknown os. Created cpack package will be wrong. (override using cpack -P)")
|
||||||
|
|
38
cmake/nx/NXFunctions.cmake
Normal file
38
cmake/nx/NXFunctions.cmake
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
if(NOT COMMAND nx_generate_nacp)
|
||||||
|
message(FATAL_ERROR "The `nx_generate_nacp` cmake command is not available. Please use an appropriate Nintendo Switch toolchain.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT COMMAND nx_create_nro)
|
||||||
|
message(FATAL_ERROR "The `nx_create_nro` cmake command is not available. Please use an appropriate Nintendo Switch toolchain.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_EXECUTABLE_SUFFIX ".elf")
|
||||||
|
|
||||||
|
function(reVC_platform_target TARGET)
|
||||||
|
cmake_parse_arguments(RPT "INSTALL" "" "" ${ARGN})
|
||||||
|
|
||||||
|
get_target_property(TARGET_TYPE "${TARGET}" TYPE)
|
||||||
|
if(TARGET_TYPE STREQUAL "EXECUTABLE")
|
||||||
|
nx_generate_nacp(${TARGET}.nacp
|
||||||
|
NAME "${TARGET}"
|
||||||
|
AUTHOR "${${PROJECT}_AUTHOR}"
|
||||||
|
VERSION "1.0.0-${GIT_SHA1}"
|
||||||
|
)
|
||||||
|
|
||||||
|
nx_create_nro(${TARGET}
|
||||||
|
NACP ${TARGET}.nacp
|
||||||
|
ICON "${PROJECT_SOURCE_DIR}/res/images/logo_256.jpg"
|
||||||
|
)
|
||||||
|
|
||||||
|
if(${PROJECT}_INSTALL AND RPT_INSTALL)
|
||||||
|
get_target_property(TARGET_OUTPUT_NAME ${TARGET} OUTPUT_NAME)
|
||||||
|
if(NOT TARGET_OUTPUT_NAME)
|
||||||
|
set(TARGET_OUTPUT_NAME "${TARGET}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_OUTPUT_NAME}.nro"
|
||||||
|
DESTINATION "."
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
|
@ -1723,6 +1723,13 @@
|
||||||
<FILEKIND>Text</FILEKIND>
|
<FILEKIND>Text</FILEKIND>
|
||||||
<FILEFLAGS></FILEFLAGS>
|
<FILEFLAGS></FILEFLAGS>
|
||||||
</FILE>
|
</FILE>
|
||||||
|
<FILE>
|
||||||
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
|
<PATH>ScriptDebug.cpp</PATH>
|
||||||
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
|
<FILEKIND>Text</FILEKIND>
|
||||||
|
<FILEFLAGS>Debug</FILEFLAGS>
|
||||||
|
</FILE>
|
||||||
<FILE>
|
<FILE>
|
||||||
<PATHTYPE>Name</PATHTYPE>
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
<PATH>Script.cpp</PATH>
|
<PATH>Script.cpp</PATH>
|
||||||
|
@ -4711,6 +4718,11 @@
|
||||||
<PATH>SceneEdit.h</PATH>
|
<PATH>SceneEdit.h</PATH>
|
||||||
<PATHFORMAT>Windows</PATHFORMAT>
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
</FILEREF>
|
</FILEREF>
|
||||||
|
<FILEREF>
|
||||||
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
|
<PATH>ScriptDebug.cpp</PATH>
|
||||||
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
|
</FILEREF>
|
||||||
<FILEREF>
|
<FILEREF>
|
||||||
<PATHTYPE>Name</PATHTYPE>
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
<PATH>Script.cpp</PATH>
|
<PATH>Script.cpp</PATH>
|
||||||
|
@ -8248,6 +8260,13 @@
|
||||||
<FILEKIND>Text</FILEKIND>
|
<FILEKIND>Text</FILEKIND>
|
||||||
<FILEFLAGS></FILEFLAGS>
|
<FILEFLAGS></FILEFLAGS>
|
||||||
</FILE>
|
</FILE>
|
||||||
|
<FILE>
|
||||||
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
|
<PATH>ScriptDebug.cpp</PATH>
|
||||||
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
|
<FILEKIND>Text</FILEKIND>
|
||||||
|
<FILEFLAGS>Debug</FILEFLAGS>
|
||||||
|
</FILE>
|
||||||
<FILE>
|
<FILE>
|
||||||
<PATHTYPE>Name</PATHTYPE>
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
<PATH>Script.cpp</PATH>
|
<PATH>Script.cpp</PATH>
|
||||||
|
@ -11236,6 +11255,11 @@
|
||||||
<PATH>SceneEdit.h</PATH>
|
<PATH>SceneEdit.h</PATH>
|
||||||
<PATHFORMAT>Windows</PATHFORMAT>
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
</FILEREF>
|
</FILEREF>
|
||||||
|
<FILEREF>
|
||||||
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
|
<PATH>ScriptDebug.cpp</PATH>
|
||||||
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
|
</FILEREF>
|
||||||
<FILEREF>
|
<FILEREF>
|
||||||
<PATHTYPE>Name</PATHTYPE>
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
<PATH>Script.cpp</PATH>
|
<PATH>Script.cpp</PATH>
|
||||||
|
@ -13780,6 +13804,12 @@
|
||||||
<PATH>SceneEdit.h</PATH>
|
<PATH>SceneEdit.h</PATH>
|
||||||
<PATHFORMAT>Windows</PATHFORMAT>
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
</FILEREF>
|
</FILEREF>
|
||||||
|
<FILEREF>
|
||||||
|
<TARGETNAME>Debug</TARGETNAME>
|
||||||
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
|
<PATH>ScriptDebug.cpp</PATH>
|
||||||
|
<PATHFORMAT>Windows</PATHFORMAT>
|
||||||
|
</FILEREF>
|
||||||
<FILEREF>
|
<FILEREF>
|
||||||
<TARGETNAME>Debug</TARGETNAME>
|
<TARGETNAME>Debug</TARGETNAME>
|
||||||
<PATHTYPE>Name</PATHTYPE>
|
<PATHTYPE>Name</PATHTYPE>
|
||||||
|
|
BIN
gamefiles/models/frontend_nsw.txd
Normal file
BIN
gamefiles/models/frontend_nsw.txd
Normal file
Binary file not shown.
BIN
gamefiles/models/nswbtns.txd
Normal file
BIN
gamefiles/models/nswbtns.txd
Normal file
Binary file not shown.
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
BIN
res/images/logo_256.jpg
Normal file
BIN
res/images/logo_256.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
|
@ -54,9 +54,13 @@ target_compile_definitions(${EXECUTABLE} PRIVATE USE_OUR_VERSIONING)
|
||||||
|
|
||||||
if(${PROJECT}_AUDIO STREQUAL "OAL")
|
if(${PROJECT}_AUDIO STREQUAL "OAL")
|
||||||
find_package(OpenAL REQUIRED)
|
find_package(OpenAL REQUIRED)
|
||||||
target_include_directories(${EXECUTABLE} PRIVATE ${OPENAL_INCLUDE_DIR})
|
if(TARGET OpenAL::OpenAL)
|
||||||
target_link_libraries(${EXECUTABLE} PRIVATE ${OPENAL_LIBRARY})
|
target_link_libraries(${EXECUTABLE} PRIVATE OpenAL::OpenAL)
|
||||||
target_compile_definitions(${EXECUTABLE} PRIVATE ${OPENAL_DEFINITIONS})
|
else()
|
||||||
|
target_include_directories(${EXECUTABLE} PRIVATE ${OPENAL_INCLUDE_DIR})
|
||||||
|
target_link_libraries(${EXECUTABLE} PRIVATE ${OPENAL_LIBRARY})
|
||||||
|
target_compile_definitions(${EXECUTABLE} PRIVATE ${OPENAL_DEFINITIONS})
|
||||||
|
endif()
|
||||||
target_compile_definitions(${EXECUTABLE} PRIVATE AUDIO_OAL)
|
target_compile_definitions(${EXECUTABLE} PRIVATE AUDIO_OAL)
|
||||||
elseif(${PROJECT}_AUDIO STREQUAL "MSS")
|
elseif(${PROJECT}_AUDIO STREQUAL "MSS")
|
||||||
find_package(MilesSDK REQUIRED)
|
find_package(MilesSDK REQUIRED)
|
||||||
|
@ -122,13 +126,19 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(NINTENDO_SWITCH)
|
||||||
|
set(${PROJECT}_C_CXX_EXTENSIONS ON)
|
||||||
|
else()
|
||||||
|
set(${PROJECT}_C_CXX_EXTENSIONS OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
set_target_properties(${EXECUTABLE}
|
set_target_properties(${EXECUTABLE}
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
C_STANDARD 11
|
C_STANDARD 11
|
||||||
C_EXTENSIONS OFF
|
C_EXTENSIONS ${${PROJECT}_C_CXX_EXTENSIONS}
|
||||||
C_STANDARD_REQUIRED ON
|
C_STANDARD_REQUIRED ON
|
||||||
CXX_STANDARD 11
|
CXX_STANDARD 11
|
||||||
CXX_EXTENSIONS OFF
|
CXX_EXTENSIONS ${${PROJECT}_C_CXX_EXTENSIONS}
|
||||||
CXX_STANDARD_REQUIRED ON
|
CXX_STANDARD_REQUIRED ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -142,3 +152,5 @@ if(${PROJECT}_INSTALL)
|
||||||
install(FILES $<TARGET_PDB_FILE:${EXECUTABLE}> DESTINATION "." OPTIONAL)
|
install(FILES $<TARGET_PDB_FILE:${EXECUTABLE}> DESTINATION "." OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
reVC_platform_target(${EXECUTABLE} INSTALL)
|
||||||
|
|
|
@ -268,7 +268,7 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
||||||
SET_EMITTING_VOLUME(emittingVol);
|
SET_EMITTING_VOLUME(emittingVol);
|
||||||
RESET_LOOP_OFFSETS
|
RESET_LOOP_OFFSETS
|
||||||
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
|
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
|
||||||
m_sQueueSample.m_fSoundIntensity = CollisionSoundIntensity;
|
m_sQueueSample.m_SoundIntensity = CollisionSoundIntensity;
|
||||||
m_sQueueSample.m_bReleasingSoundFlag = TRUE;
|
m_sQueueSample.m_bReleasingSoundFlag = TRUE;
|
||||||
m_sQueueSample.m_bReverbFlag = TRUE;
|
m_sQueueSample.m_bReverbFlag = TRUE;
|
||||||
m_sQueueSample.m_bRequireReflection = FALSE;
|
m_sQueueSample.m_bRequireReflection = FALSE;
|
||||||
|
@ -297,7 +297,7 @@ cAudioManager::SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 coun
|
||||||
SET_EMITTING_VOLUME(emittingVol);
|
SET_EMITTING_VOLUME(emittingVol);
|
||||||
SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex)
|
SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex)
|
||||||
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
|
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
|
||||||
m_sQueueSample.m_fSoundIntensity = CollisionSoundIntensity;
|
m_sQueueSample.m_SoundIntensity = CollisionSoundIntensity;
|
||||||
m_sQueueSample.m_bReleasingSoundFlag = FALSE;
|
m_sQueueSample.m_bReleasingSoundFlag = FALSE;
|
||||||
m_sQueueSample.m_nReleasingVolumeDivider = 5;
|
m_sQueueSample.m_nReleasingVolumeDivider = 5;
|
||||||
m_sQueueSample.m_bReverbFlag = TRUE;
|
m_sQueueSample.m_bReverbFlag = TRUE;
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -697,7 +697,6 @@ cAudioManager::AddDetailsToRequestedOrderList(uint8 sample)
|
||||||
m_abSampleQueueIndexTable[m_nActiveSampleQueue][i] = sample;
|
m_abSampleQueueIndexTable[m_nActiveSampleQueue][i] = sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GTA_PC
|
|
||||||
void
|
void
|
||||||
cAudioManager::AddReflectionsToRequestedQueue()
|
cAudioManager::AddReflectionsToRequestedQueue()
|
||||||
{
|
{
|
||||||
|
@ -719,7 +718,7 @@ cAudioManager::AddReflectionsToRequestedQueue()
|
||||||
} else {
|
} else {
|
||||||
emittingVolume = (9 * m_sQueueSample.m_nVolume) / 16;
|
emittingVolume = (9 * m_sQueueSample.m_nVolume) / 16;
|
||||||
}
|
}
|
||||||
m_sQueueSample.m_fSoundIntensity /= 2.f;
|
m_sQueueSample.m_SoundIntensity /= 2.f;
|
||||||
|
|
||||||
int halfOldFreq = oldFreq >> 1;
|
int halfOldFreq = oldFreq >> 1;
|
||||||
|
|
||||||
|
@ -728,12 +727,12 @@ cAudioManager::AddReflectionsToRequestedQueue()
|
||||||
m_afReflectionsDistances[i] = (m_anRandomTable[i % 4] % 3) * 100.f / 8.f;
|
m_afReflectionsDistances[i] = (m_anRandomTable[i % 4] % 3) * 100.f / 8.f;
|
||||||
|
|
||||||
reflectionDistance = m_afReflectionsDistances[i];
|
reflectionDistance = m_afReflectionsDistances[i];
|
||||||
if (reflectionDistance > 0.0f && reflectionDistance < 100.f && reflectionDistance < m_sQueueSample.m_fSoundIntensity) {
|
if (reflectionDistance > 0.0f && reflectionDistance < 100.f && reflectionDistance < m_sQueueSample.m_SoundIntensity) {
|
||||||
m_sQueueSample.m_nLoopsRemaining = CTimer::GetIsSlowMotionActive() ? (reflectionDistance * 800.f / 1029.f) : (reflectionDistance * 500.f / 1029.f);
|
m_sQueueSample.m_nLoopsRemaining = CTimer::GetIsSlowMotionActive() ? (reflectionDistance * 800.f / 1029.f) : (reflectionDistance * 500.f / 1029.f);
|
||||||
if (m_sQueueSample.m_nLoopsRemaining > 3) {
|
if (m_sQueueSample.m_nLoopsRemaining > 3) {
|
||||||
m_sQueueSample.m_fDistance = m_afReflectionsDistances[i];
|
m_sQueueSample.m_fDistance = m_afReflectionsDistances[i];
|
||||||
SET_EMITTING_VOLUME(emittingVolume);
|
SET_EMITTING_VOLUME(emittingVolume);
|
||||||
m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance);
|
m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, m_sQueueSample.m_SoundIntensity, m_sQueueSample.m_fDistance);
|
||||||
|
|
||||||
if (m_sQueueSample.m_nVolume > emittingVolume / 16) {
|
if (m_sQueueSample.m_nVolume > emittingVolume / 16) {
|
||||||
m_sQueueSample.m_nCounter = oldCounter + (i + 1) * 256;
|
m_sQueueSample.m_nCounter = oldCounter + (i + 1) * 256;
|
||||||
|
@ -762,43 +761,87 @@ cAudioManager::AddReflectionsToRequestedQueue()
|
||||||
void
|
void
|
||||||
cAudioManager::UpdateReflections()
|
cAudioManager::UpdateReflections()
|
||||||
{
|
{
|
||||||
CVector camPos = TheCamera.GetPosition();
|
CVector camPos;
|
||||||
CColPoint colpoint;
|
CColPoint colpoint;
|
||||||
CEntity *ent;
|
CEntity *ent;
|
||||||
|
|
||||||
|
#if GTA_VERSION < GTAVC_PC_10
|
||||||
if (m_FrameCounter % 8 == 0) {
|
if (m_FrameCounter % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
|
m_avecReflectionsPos[0] = camPos;
|
||||||
|
m_avecReflectionsPos[0].y += 50.0f;
|
||||||
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[0], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
|
m_afReflectionsDistances[0] = Distance(camPos, colpoint.point);
|
||||||
|
else
|
||||||
|
m_afReflectionsDistances[0] = 50.0f;
|
||||||
|
} else if ((m_FrameCounter + 1) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
|
m_avecReflectionsPos[1] = camPos;
|
||||||
|
m_avecReflectionsPos[1].y -= 50.0f;
|
||||||
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[1], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
|
m_afReflectionsDistances[1] = Distance(camPos, colpoint.point);
|
||||||
|
else
|
||||||
|
m_afReflectionsDistances[1] = 50.0f;
|
||||||
|
} else if ((m_FrameCounter + 2) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
|
m_avecReflectionsPos[2] = camPos;
|
||||||
|
m_avecReflectionsPos[2].x -= 50.0f;
|
||||||
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[2], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
|
m_afReflectionsDistances[2] = Distance(camPos, colpoint.point);
|
||||||
|
else
|
||||||
|
m_afReflectionsDistances[2] = 50.0f;
|
||||||
|
} else if ((m_FrameCounter + 3) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
|
m_avecReflectionsPos[3] = camPos;
|
||||||
|
m_avecReflectionsPos[3].x += 50.0f;
|
||||||
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[3], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
|
m_afReflectionsDistances[3] = Distance(camPos, colpoint.point);
|
||||||
|
else
|
||||||
|
m_afReflectionsDistances[3] = 50.0f;
|
||||||
|
} else if ((m_FrameCounter + 4) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
|
m_avecReflectionsPos[4] = camPos;
|
||||||
|
m_avecReflectionsPos[4].z += 50.0f;
|
||||||
|
if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[4].z, colpoint, ent, true, false, false, false, true, false, nil))
|
||||||
|
m_afReflectionsDistances[4] = colpoint.point.z - camPos.z;
|
||||||
|
else
|
||||||
|
m_afReflectionsDistances[4] = 50.0f;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (m_FrameCounter % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
m_avecReflectionsPos[0] = camPos;
|
m_avecReflectionsPos[0] = camPos;
|
||||||
m_avecReflectionsPos[0].y += 100.f;
|
m_avecReflectionsPos[0].y += 100.f;
|
||||||
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[0], colpoint, ent, true, false, false, true, false, true, true))
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[0], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
m_afReflectionsDistances[0] = Distance(camPos, colpoint.point);
|
m_afReflectionsDistances[0] = Distance(camPos, colpoint.point);
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[0] = 100.0f;
|
m_afReflectionsDistances[0] = 100.0f;
|
||||||
|
|
||||||
} else if ((m_FrameCounter + 1) % 8 == 0) {
|
} else if ((m_FrameCounter + 1) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
m_avecReflectionsPos[1] = camPos;
|
m_avecReflectionsPos[1] = camPos;
|
||||||
m_avecReflectionsPos[1].y -= 100.0f;
|
m_avecReflectionsPos[1].y -= 100.0f;
|
||||||
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[1], colpoint, ent, true, false, false, true, false, true, true))
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[1], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
m_afReflectionsDistances[1] = Distance(camPos, colpoint.point);
|
m_afReflectionsDistances[1] = Distance(camPos, colpoint.point);
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[1] = 100.0f;
|
m_afReflectionsDistances[1] = 100.0f;
|
||||||
|
|
||||||
} else if ((m_FrameCounter + 2) % 8 == 0) {
|
} else if ((m_FrameCounter + 2) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
m_avecReflectionsPos[2] = camPos;
|
m_avecReflectionsPos[2] = camPos;
|
||||||
m_avecReflectionsPos[2].x -= 100.0f;
|
m_avecReflectionsPos[2].x -= 100.0f;
|
||||||
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[2], colpoint, ent, true, false, false, true, false, true, true))
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[2], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
m_afReflectionsDistances[2] = Distance(camPos, colpoint.point);
|
m_afReflectionsDistances[2] = Distance(camPos, colpoint.point);
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[2] = 100.0f;
|
m_afReflectionsDistances[2] = 100.0f;
|
||||||
|
|
||||||
} else if ((m_FrameCounter + 3) % 8 == 0) {
|
} else if ((m_FrameCounter + 3) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
m_avecReflectionsPos[3] = camPos;
|
m_avecReflectionsPos[3] = camPos;
|
||||||
m_avecReflectionsPos[3].x += 100.0f;
|
m_avecReflectionsPos[3].x += 100.0f;
|
||||||
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[3], colpoint, ent, true, false, false, true, false, true, true))
|
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[3], colpoint, ent, true, false, false, true, false, true, true))
|
||||||
m_afReflectionsDistances[3] = Distance(camPos, colpoint.point);
|
m_afReflectionsDistances[3] = Distance(camPos, colpoint.point);
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[3] = 100.0f;
|
m_afReflectionsDistances[3] = 100.0f;
|
||||||
|
|
||||||
} else if ((m_FrameCounter + 4) % 8 == 0) {
|
} else if ((m_FrameCounter + 4) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
camPos.y += 1.0f;
|
camPos.y += 1.0f;
|
||||||
m_avecReflectionsPos[4] = camPos;
|
m_avecReflectionsPos[4] = camPos;
|
||||||
m_avecReflectionsPos[4].z += 100.0f;
|
m_avecReflectionsPos[4].z += 100.0f;
|
||||||
|
@ -806,8 +849,8 @@ cAudioManager::UpdateReflections()
|
||||||
m_afReflectionsDistances[4] = colpoint.point.z - camPos.z;
|
m_afReflectionsDistances[4] = colpoint.point.z - camPos.z;
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[4] = 100.0f;
|
m_afReflectionsDistances[4] = 100.0f;
|
||||||
|
|
||||||
} else if ((m_FrameCounter + 5) % 8 == 0) {
|
} else if ((m_FrameCounter + 5) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
camPos.y -= 1.0f;
|
camPos.y -= 1.0f;
|
||||||
m_avecReflectionsPos[5] = camPos;
|
m_avecReflectionsPos[5] = camPos;
|
||||||
m_avecReflectionsPos[5].z += 100.0f;
|
m_avecReflectionsPos[5].z += 100.0f;
|
||||||
|
@ -815,8 +858,8 @@ cAudioManager::UpdateReflections()
|
||||||
m_afReflectionsDistances[5] = colpoint.point.z - camPos.z;
|
m_afReflectionsDistances[5] = colpoint.point.z - camPos.z;
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[5] = 100.0f;
|
m_afReflectionsDistances[5] = 100.0f;
|
||||||
|
|
||||||
} else if ((m_FrameCounter + 6) % 8 == 0) {
|
} else if ((m_FrameCounter + 6) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
camPos.x -= 1.0f;
|
camPos.x -= 1.0f;
|
||||||
m_avecReflectionsPos[6] = camPos;
|
m_avecReflectionsPos[6] = camPos;
|
||||||
m_avecReflectionsPos[6].z += 100.0f;
|
m_avecReflectionsPos[6].z += 100.0f;
|
||||||
|
@ -824,8 +867,8 @@ cAudioManager::UpdateReflections()
|
||||||
m_afReflectionsDistances[6] = colpoint.point.z - camPos.z;
|
m_afReflectionsDistances[6] = colpoint.point.z - camPos.z;
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[6] = 100.0f;
|
m_afReflectionsDistances[6] = 100.0f;
|
||||||
|
|
||||||
} else if ((m_FrameCounter + 7) % 8 == 0) {
|
} else if ((m_FrameCounter + 7) % 8 == 0) {
|
||||||
|
camPos = TheCamera.GetPosition();
|
||||||
camPos.x += 1.0f;
|
camPos.x += 1.0f;
|
||||||
m_avecReflectionsPos[7] = camPos;
|
m_avecReflectionsPos[7] = camPos;
|
||||||
m_avecReflectionsPos[7].z += 100.0f;
|
m_avecReflectionsPos[7].z += 100.0f;
|
||||||
|
@ -834,8 +877,8 @@ cAudioManager::UpdateReflections()
|
||||||
else
|
else
|
||||||
m_afReflectionsDistances[7] = 100.0f;
|
m_afReflectionsDistances[7] = 100.0f;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif // GTA_PC
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cAudioManager::AddReleasingSounds()
|
cAudioManager::AddReleasingSounds()
|
||||||
|
@ -863,7 +906,7 @@ cAudioManager::AddReleasingSounds()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!toProcess[i]) {
|
if (!toProcess[i]) {
|
||||||
if (sample.m_nCounter <= 255 || !sample.m_nLoopsRemaining) {
|
if (sample.m_nCounter <= 255 || sample.m_nLoopsRemaining == 0) {
|
||||||
if (sample.m_nReleasingVolumeDivider == 0)
|
if (sample.m_nReleasingVolumeDivider == 0)
|
||||||
continue;
|
continue;
|
||||||
if (sample.m_nLoopCount == 0) {
|
if (sample.m_nLoopCount == 0) {
|
||||||
|
@ -1005,7 +1048,7 @@ cAudioManager::ProcessActiveQueues()
|
||||||
TranslateEntity(&sample.m_vecPos, &position);
|
TranslateEntity(&sample.m_vecPos, &position);
|
||||||
#ifdef EXTERNAL_3D_SOUND
|
#ifdef EXTERNAL_3D_SOUND
|
||||||
SampleManager.SetChannel3DPosition(j, position.x, position.y, position.z);
|
SampleManager.SetChannel3DPosition(j, position.x, position.y, position.z);
|
||||||
SampleManager.SetChannel3DDistances(j, sample.m_fSoundIntensity, 0.25f * sample.m_fSoundIntensity);
|
SampleManager.SetChannel3DDistances(j, sample.m_SoundIntensity, 0.25f * sample.m_SoundIntensity);
|
||||||
#else
|
#else
|
||||||
sample.m_nOffset = ComputePan(sample.m_fDistance, &position);
|
sample.m_nOffset = ComputePan(sample.m_fDistance, &position);
|
||||||
SampleManager.SetChannelPan(j, sample.m_nOffset);
|
SampleManager.SetChannelPan(j, sample.m_nOffset);
|
||||||
|
@ -1094,14 +1137,14 @@ cAudioManager::ProcessActiveQueues()
|
||||||
usedX = x;
|
usedX = x;
|
||||||
usedY = 0.0f;
|
usedY = 0.0f;
|
||||||
usedZ = 0.0f;
|
usedZ = 0.0f;
|
||||||
m_asActiveSamples[k].m_fSoundIntensity = 100000.0f;
|
m_asActiveSamples[k].m_SoundIntensity = 100000.0f;
|
||||||
} else {
|
} else {
|
||||||
usedX = position.x;
|
usedX = position.x;
|
||||||
usedY = position.y;
|
usedY = position.y;
|
||||||
usedZ = position.z;
|
usedZ = position.z;
|
||||||
}
|
}
|
||||||
SampleManager.SetChannel3DPosition(k, usedX, usedY, usedZ);
|
SampleManager.SetChannel3DPosition(k, usedX, usedY, usedZ);
|
||||||
SampleManager.SetChannel3DDistances(k, m_asActiveSamples[k].m_fSoundIntensity, 0.25f * m_asActiveSamples[k].m_fSoundIntensity);
|
SampleManager.SetChannel3DDistances(k, m_asActiveSamples[k].m_SoundIntensity, 0.25f * m_asActiveSamples[k].m_SoundIntensity);
|
||||||
#endif
|
#endif
|
||||||
SampleManager.StartChannel(k);
|
SampleManager.StartChannel(k);
|
||||||
}
|
}
|
||||||
|
@ -1150,7 +1193,7 @@ cAudioManager::ClearActiveSamples()
|
||||||
m_asActiveSamples[i].m_nLoopEnd = -1;
|
m_asActiveSamples[i].m_nLoopEnd = -1;
|
||||||
#endif
|
#endif
|
||||||
m_asActiveSamples[i].m_fSpeedMultiplier = 0.0f;
|
m_asActiveSamples[i].m_fSpeedMultiplier = 0.0f;
|
||||||
m_asActiveSamples[i].m_fSoundIntensity = 200.0f;
|
m_asActiveSamples[i].m_SoundIntensity = 200.0f;
|
||||||
m_asActiveSamples[i].m_nOffset = 63;
|
m_asActiveSamples[i].m_nOffset = 63;
|
||||||
m_asActiveSamples[i].m_bReleasingSoundFlag = FALSE;
|
m_asActiveSamples[i].m_bReleasingSoundFlag = FALSE;
|
||||||
m_asActiveSamples[i].m_nCalculatedVolume = 0;
|
m_asActiveSamples[i].m_nCalculatedVolume = 0;
|
||||||
|
@ -1186,7 +1229,7 @@ cAudioManager::AdjustSamplesVolume()
|
||||||
tSound *pSample = &m_asSamples[m_nActiveSampleQueue][m_abSampleQueueIndexTable[m_nActiveSampleQueue][i]];
|
tSound *pSample = &m_asSamples[m_nActiveSampleQueue][m_abSampleQueueIndexTable[m_nActiveSampleQueue][i]];
|
||||||
|
|
||||||
if (!pSample->m_bIs2D)
|
if (!pSample->m_bIs2D)
|
||||||
pSample->m_nEmittingVolume = ComputeEmittingVolume(pSample->m_nEmittingVolume, pSample->m_fSoundIntensity, pSample->m_fDistance);
|
pSample->m_nEmittingVolume = ComputeEmittingVolume(pSample->m_nEmittingVolume, pSample->m_SoundIntensity, pSample->m_fDistance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,10 +27,12 @@ public:
|
||||||
uint8 m_nEmittingVolume;
|
uint8 m_nEmittingVolume;
|
||||||
#endif
|
#endif
|
||||||
float m_fSpeedMultiplier;
|
float m_fSpeedMultiplier;
|
||||||
float m_fSoundIntensity;
|
float m_SoundIntensity;
|
||||||
bool8 m_bReleasingSoundFlag;
|
bool8 m_bReleasingSoundFlag;
|
||||||
CVector m_vecPos;
|
CVector m_vecPos;
|
||||||
bool8 m_bReverbFlag;
|
#ifndef GTA_PS2
|
||||||
|
bool8 m_bReverbFlag; // TODO: ifdef all the occurrences
|
||||||
|
#endif
|
||||||
uint8 m_nLoopsRemaining;
|
uint8 m_nLoopsRemaining;
|
||||||
bool8 m_bRequireReflection; // Used for oneshots
|
bool8 m_bRequireReflection; // Used for oneshots
|
||||||
uint8 m_nOffset;
|
uint8 m_nOffset;
|
||||||
|
@ -182,6 +184,24 @@ public:
|
||||||
|
|
||||||
VALIDATE_SIZE(cVehicleParams, 0x1C);
|
VALIDATE_SIZE(cVehicleParams, 0x1C);
|
||||||
|
|
||||||
|
#if GTA_VERSION < GTAVC_PC_10
|
||||||
|
enum {
|
||||||
|
/*
|
||||||
|
REFLECTION_YMAX = 0, top
|
||||||
|
REFLECTION_YMIN = 1, bottom
|
||||||
|
REFLECTION_XMIN = 2, left
|
||||||
|
REFLECTION_XMAX = 3, right
|
||||||
|
REFLECTION_ZMAX = 4,
|
||||||
|
*/
|
||||||
|
|
||||||
|
REFLECTION_TOP = 0,
|
||||||
|
REFLECTION_BOTTOM,
|
||||||
|
REFLECTION_LEFT,
|
||||||
|
REFLECTION_RIGHT,
|
||||||
|
REFLECTION_UP,
|
||||||
|
MAX_REFLECTIONS,
|
||||||
|
};
|
||||||
|
#else
|
||||||
enum {
|
enum {
|
||||||
REFLECTION_NORTH = 0,
|
REFLECTION_NORTH = 0,
|
||||||
REFLECTION_SOUTH,
|
REFLECTION_SOUTH,
|
||||||
|
@ -193,6 +213,7 @@ enum {
|
||||||
REFLECTION_CEIL_EAST,
|
REFLECTION_CEIL_EAST,
|
||||||
MAX_REFLECTIONS,
|
MAX_REFLECTIONS,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
enum PLAY_STATUS { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED };
|
enum PLAY_STATUS { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED };
|
||||||
enum LOADING_STATUS { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED };
|
enum LOADING_STATUS { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED };
|
||||||
|
@ -219,10 +240,8 @@ public:
|
||||||
tAudioEntity m_asAudioEntities[NUM_AUDIOENTITIES];
|
tAudioEntity m_asAudioEntities[NUM_AUDIOENTITIES];
|
||||||
int32 m_anAudioEntityIndices[NUM_AUDIOENTITIES];
|
int32 m_anAudioEntityIndices[NUM_AUDIOENTITIES];
|
||||||
int32 m_nAudioEntitiesTotal;
|
int32 m_nAudioEntitiesTotal;
|
||||||
#ifdef GTA_PC
|
|
||||||
CVector m_avecReflectionsPos[NUM_AUDIO_REFLECTIONS];
|
CVector m_avecReflectionsPos[NUM_AUDIO_REFLECTIONS];
|
||||||
float m_afReflectionsDistances[NUM_AUDIO_REFLECTIONS];
|
float m_afReflectionsDistances[NUM_AUDIO_REFLECTIONS];
|
||||||
#endif
|
|
||||||
cAudioScriptObjectManager m_sAudioScriptObjectManager;
|
cAudioScriptObjectManager m_sAudioScriptObjectManager;
|
||||||
|
|
||||||
// miami
|
// miami
|
||||||
|
@ -301,10 +320,8 @@ public:
|
||||||
void InterrogateAudioEntities(); // inlined
|
void InterrogateAudioEntities(); // inlined
|
||||||
void AddSampleToRequestedQueue();
|
void AddSampleToRequestedQueue();
|
||||||
void AddDetailsToRequestedOrderList(uint8 sample); // inlined in vc
|
void AddDetailsToRequestedOrderList(uint8 sample); // inlined in vc
|
||||||
#ifdef GTA_PC
|
|
||||||
void AddReflectionsToRequestedQueue();
|
void AddReflectionsToRequestedQueue();
|
||||||
void UpdateReflections();
|
void UpdateReflections();
|
||||||
#endif
|
|
||||||
void AddReleasingSounds();
|
void AddReleasingSounds();
|
||||||
void ProcessActiveQueues();
|
void ProcessActiveQueues();
|
||||||
void ClearRequestedQueue(); // inlined in vc
|
void ClearRequestedQueue(); // inlined in vc
|
||||||
|
@ -341,7 +358,7 @@ public:
|
||||||
void ProcessVehicleFlatTyre(cVehicleParams ¶ms);
|
void ProcessVehicleFlatTyre(cVehicleParams ¶ms);
|
||||||
bool8 ProcessVehicleRoadNoise(cVehicleParams ¶ms);
|
bool8 ProcessVehicleRoadNoise(cVehicleParams ¶ms);
|
||||||
bool8 ProcessWetRoadNoise(cVehicleParams ¶ms);
|
bool8 ProcessWetRoadNoise(cVehicleParams ¶ms);
|
||||||
void ProcessVehicleEngine(cVehicleParams ¶ms);
|
bool8 ProcessVehicleEngine(cVehicleParams ¶ms);
|
||||||
void UpdateGasPedalAudio(CVehicle *veh, int vehType);
|
void UpdateGasPedalAudio(CVehicle *veh, int vehType);
|
||||||
void PlayerJustGotInCar();
|
void PlayerJustGotInCar();
|
||||||
void PlayerJustLeftCar();
|
void PlayerJustLeftCar();
|
||||||
|
|
|
@ -2673,6 +2673,14 @@ const char *PlayStationButtons[][MAX_CONTROLLERACTIONS] =
|
||||||
#undef PS2_CROSS
|
#undef PS2_CROSS
|
||||||
#undef PS2_SQUARE
|
#undef PS2_SQUARE
|
||||||
|
|
||||||
|
const char *NintendoSwitchButtons_noIcons[][MAX_CONTROLLERACTIONS] =
|
||||||
|
CONTROLLER_BUTTONS("Y", "A", "B", "X", "L", "ZL", "LS", "R", "ZR", "RS", "BACK", "right stick up", "right stick down", "right stick left", "right stick right");
|
||||||
|
|
||||||
|
#ifdef BUTTON_ICONS
|
||||||
|
const char *NintendoSwitchButtons[][MAX_CONTROLLERACTIONS] =
|
||||||
|
CONTROLLER_BUTTONS("~T~", "~O~", "~X~", "~Q~", "~K~", "~M~", "~A~", "~J~", "~V~", "~C~", "BACK", "~H~", "~L~", "~(~", "~)~");
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef UP
|
#undef UP
|
||||||
#undef DOWN
|
#undef DOWN
|
||||||
#undef LEFT
|
#undef LEFT
|
||||||
|
@ -2698,6 +2706,9 @@ void CControllerConfigManager::GetWideStringOfCommandKeys(uint16 action, wchar *
|
||||||
case CMenuManager::CONTROLLER_DUALSHOCK4:
|
case CMenuManager::CONTROLLER_DUALSHOCK4:
|
||||||
Buttons = CFont::ButtonsSlot != -1 ? PlayStationButtons : PlayStationButtons_noIcons;
|
Buttons = CFont::ButtonsSlot != -1 ? PlayStationButtons : PlayStationButtons_noIcons;
|
||||||
break;
|
break;
|
||||||
|
case CMenuManager::CONTROLLER_NINTENDO_SWITCH:
|
||||||
|
Buttons = CFont::ButtonsSlot != -1 ? NintendoSwitchButtons : NintendoSwitchButtons_noIcons;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
#endif
|
#endif
|
||||||
Buttons = CFont::ButtonsSlot != -1 ? XboxButtons : XboxButtons_noIcons;
|
Buttons = CFont::ButtonsSlot != -1 ? XboxButtons : XboxButtons_noIcons;
|
||||||
|
@ -2713,6 +2724,9 @@ void CControllerConfigManager::GetWideStringOfCommandKeys(uint16 action, wchar *
|
||||||
case CMenuManager::CONTROLLER_DUALSHOCK4:
|
case CMenuManager::CONTROLLER_DUALSHOCK4:
|
||||||
Buttons = PlayStationButtons_noIcons;
|
Buttons = PlayStationButtons_noIcons;
|
||||||
break;
|
break;
|
||||||
|
case CMenuManager::CONTROLLER_NINTENDO_SWITCH:
|
||||||
|
Buttons = NintendoSwitchButtons_noIcons;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Buttons = XboxButtons_noIcons;
|
Buttons = XboxButtons_noIcons;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -554,8 +554,12 @@ CMenuManager::CMenuManager()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef GAMEPAD_MENU
|
#ifdef GAMEPAD_MENU
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
m_PrefsControllerType = CONTROLLER_NINTENDO_SWITCH;
|
||||||
|
#else
|
||||||
m_PrefsControllerType = CONTROLLER_XBOXONE;
|
m_PrefsControllerType = CONTROLLER_XBOXONE;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MISSION_REPLAY
|
#ifdef MISSION_REPLAY
|
||||||
m_bAttemptingMissionRetry = false;
|
m_bAttemptingMissionRetry = false;
|
||||||
|
@ -585,7 +589,11 @@ CMenuManager::Initialise(void)
|
||||||
m_nCurrOption = 0;
|
m_nCurrOption = 0;
|
||||||
m_nOptionHighlightTransitionBlend = 0;
|
m_nOptionHighlightTransitionBlend = 0;
|
||||||
CentreMousePointer();
|
CentreMousePointer();
|
||||||
|
#ifdef GTA_HANDHELD
|
||||||
|
m_bShowMouse = false;
|
||||||
|
#else
|
||||||
m_bShowMouse = true;
|
m_bShowMouse = true;
|
||||||
|
#endif
|
||||||
m_fMapSize = MENU_Y(162.0f); // Y because of HOR+
|
m_fMapSize = MENU_Y(162.0f); // Y because of HOR+
|
||||||
m_fMapCenterX = MENU_X_LEFT_ALIGNED(320.0f);
|
m_fMapCenterX = MENU_X_LEFT_ALIGNED(320.0f);
|
||||||
m_fMapCenterY = MENU_Y(225.0f);
|
m_fMapCenterY = MENU_Y(225.0f);
|
||||||
|
@ -3174,9 +3182,6 @@ CMenuManager::LoadSettings()
|
||||||
if (LoadINISettings()) {
|
if (LoadINISettings()) {
|
||||||
LoadINIControllerSettings();
|
LoadINIControllerSettings();
|
||||||
}
|
}
|
||||||
// if no reVC.ini, create it, or update it with new values
|
|
||||||
SaveINISettings();
|
|
||||||
SaveINIControllerSettings();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
|
@ -5987,6 +5992,7 @@ const char* controllerTypesPaths[] = {
|
||||||
"MODELS/FRONTEND_DS4.TXD",
|
"MODELS/FRONTEND_DS4.TXD",
|
||||||
"MODELS/FRONTEND_X360.TXD",
|
"MODELS/FRONTEND_X360.TXD",
|
||||||
"MODELS/FRONTEND_XONE.TXD",
|
"MODELS/FRONTEND_XONE.TXD",
|
||||||
|
"MODELS/FRONTEND_NSW.TXD",
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -6097,6 +6103,18 @@ CMenuManager::PrintController(void)
|
||||||
TEXT_L2R2_Y += 5.0f;
|
TEXT_L2R2_Y += 5.0f;
|
||||||
TEXT_SELECT_X += 3.0f;
|
TEXT_SELECT_X += 3.0f;
|
||||||
break;
|
break;
|
||||||
|
case CONTROLLER_NINTENDO_SWITCH:
|
||||||
|
TEXT_L1_Y += 5.0f;
|
||||||
|
TEXT_L1_Y_VEH = TEXT_L1_Y;
|
||||||
|
TEXT_R1_Y += 5.0f;
|
||||||
|
TEXT_TRIANGLE_Y += 3.0f;
|
||||||
|
TEXT_CIRCLE_Y += 3.0f;
|
||||||
|
TEXT_CROSS_Y += 3.0f;
|
||||||
|
TEXT_LSTICK_Y -= 23.0f;
|
||||||
|
TEXT_DPAD_Y += 25.0;
|
||||||
|
TEXT_RSTICK_Y += 1.0f;
|
||||||
|
TEXT_R3_Y += 1.0f;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (m_DisplayControllerOnFoot) {
|
if (m_DisplayControllerOnFoot) {
|
||||||
|
@ -6393,6 +6411,7 @@ CMenuManager::PrintController(void)
|
||||||
{
|
{
|
||||||
case CONTROLLER_XBOXONE:
|
case CONTROLLER_XBOXONE:
|
||||||
case CONTROLLER_XBOX360:
|
case CONTROLLER_XBOX360:
|
||||||
|
case CONTROLLER_NINTENDO_SWITCH:
|
||||||
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
||||||
switch (m_PrefsLanguage)
|
switch (m_PrefsLanguage)
|
||||||
{
|
{
|
||||||
|
@ -6473,6 +6492,7 @@ CMenuManager::PrintController(void)
|
||||||
{
|
{
|
||||||
case CONTROLLER_XBOXONE:
|
case CONTROLLER_XBOXONE:
|
||||||
case CONTROLLER_XBOX360:
|
case CONTROLLER_XBOX360:
|
||||||
|
case CONTROLLER_NINTENDO_SWITCH:
|
||||||
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
||||||
switch (m_PrefsLanguage)
|
switch (m_PrefsLanguage)
|
||||||
{
|
{
|
||||||
|
@ -6556,6 +6576,7 @@ CMenuManager::PrintController(void)
|
||||||
{
|
{
|
||||||
case CONTROLLER_XBOXONE:
|
case CONTROLLER_XBOXONE:
|
||||||
case CONTROLLER_XBOX360:
|
case CONTROLLER_XBOX360:
|
||||||
|
case CONTROLLER_NINTENDO_SWITCH:
|
||||||
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
||||||
switch (m_PrefsLanguage)
|
switch (m_PrefsLanguage)
|
||||||
{
|
{
|
||||||
|
@ -6640,6 +6661,7 @@ CMenuManager::PrintController(void)
|
||||||
{
|
{
|
||||||
case CONTROLLER_XBOXONE:
|
case CONTROLLER_XBOXONE:
|
||||||
case CONTROLLER_XBOX360:
|
case CONTROLLER_XBOX360:
|
||||||
|
case CONTROLLER_NINTENDO_SWITCH:
|
||||||
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f));
|
||||||
CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_SMT"));
|
CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_SMT"));
|
||||||
break;
|
break;
|
||||||
|
@ -6682,6 +6704,9 @@ CMenuManager::LoadController(int8 type)
|
||||||
case CONTROLLER_DUALSHOCK4:
|
case CONTROLLER_DUALSHOCK4:
|
||||||
CFont::LoadButtons("MODELS/PS3BTNS.TXD");
|
CFont::LoadButtons("MODELS/PS3BTNS.TXD");
|
||||||
break;
|
break;
|
||||||
|
case CONTROLLER_NINTENDO_SWITCH:
|
||||||
|
CFont::LoadButtons("MODELS/NSWBTNS.TXD");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
CFont::LoadButtons("MODELS/X360BTNS.TXD");
|
CFont::LoadButtons("MODELS/X360BTNS.TXD");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -731,6 +731,7 @@ public:
|
||||||
CONTROLLER_DUALSHOCK4,
|
CONTROLLER_DUALSHOCK4,
|
||||||
CONTROLLER_XBOX360,
|
CONTROLLER_XBOX360,
|
||||||
CONTROLLER_XBOXONE,
|
CONTROLLER_XBOXONE,
|
||||||
|
CONTROLLER_NINTENDO_SWITCH,
|
||||||
};
|
};
|
||||||
|
|
||||||
int8 m_PrefsControllerType;
|
int8 m_PrefsControllerType;
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||||
|
|
||||||
#ifdef IMPROVED_VIDEOMODE
|
#if defined(IMPROVED_VIDEOMODE) && !defined(GTA_HANDHELD)
|
||||||
#define VIDEOMODE_SELECTOR MENUACTION_CFO_SELECT, "FEM_SCF", { new CCFOSelect((int8*)&FrontEndMenuManager.m_nPrefsWindowed, "VideoMode", "Windowed", screenModes, 2, true, ScreenModeAfterChange, true) }, 0, 0, MENUALIGN_LEFT,
|
#define VIDEOMODE_SELECTOR MENUACTION_CFO_SELECT, "FEM_SCF", { new CCFOSelect((int8*)&FrontEndMenuManager.m_nPrefsWindowed, "VideoMode", "Windowed", screenModes, 2, true, ScreenModeAfterChange, true) }, 0, 0, MENUALIGN_LEFT,
|
||||||
#else
|
#else
|
||||||
#define VIDEOMODE_SELECTOR
|
#define VIDEOMODE_SELECTOR
|
||||||
|
@ -380,7 +380,7 @@ void DetectJoystickGoBack() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef GAMEPAD_MENU
|
#ifdef GAMEPAD_MENU
|
||||||
const char* controllerTypes[] = { "FEC_DS2", "FEC_DS3", "FEC_DS4", "FEC_360", "FEC_ONE" };
|
const char* controllerTypes[] = { "FEC_DS2", "FEC_DS3", "FEC_DS4", "FEC_360", "FEC_ONE", "FEC_NSW" };
|
||||||
void ControllerTypeAfterChange(int8 before, int8 after)
|
void ControllerTypeAfterChange(int8 before, int8 after)
|
||||||
{
|
{
|
||||||
FrontEndMenuManager.LoadController(after);
|
FrontEndMenuManager.LoadController(after);
|
||||||
|
@ -430,6 +430,7 @@ CMenuScreenCustom aScreens[] = {
|
||||||
{ "FEH_DIS", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true}), nil,
|
{ "FEH_DIS", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true}), nil,
|
||||||
MENUACTION_BRIGHTNESS, "FED_BRI", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_BRIGHTNESS, "FED_BRI", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||||
MENUACTION_DRAWDIST, "FEM_LOD", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_DRAWDIST, "FEM_LOD", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||||
|
DENSITY_SLIDERS
|
||||||
#ifdef LEGACY_MENU_OPTIONS
|
#ifdef LEGACY_MENU_OPTIONS
|
||||||
MENUACTION_FRAMESYNC, "FEM_VSC", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_FRAMESYNC, "FEM_VSC", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_LEFT,
|
||||||
#endif
|
#endif
|
||||||
|
@ -449,7 +450,6 @@ CMenuScreenCustom aScreens[] = {
|
||||||
DUALPASS_SELECTOR
|
DUALPASS_SELECTOR
|
||||||
CUTSCENE_BORDERS_TOGGLE
|
CUTSCENE_BORDERS_TOGGLE
|
||||||
FREE_CAM_TOGGLE
|
FREE_CAM_TOGGLE
|
||||||
DENSITY_SLIDERS
|
|
||||||
POSTFX_SELECTORS
|
POSTFX_SELECTORS
|
||||||
// re3.cpp inserts here pipeline selectors if neo/neo.txd exists and EXTENDED_PIPELINES defined
|
// re3.cpp inserts here pipeline selectors if neo/neo.txd exists and EXTENDED_PIPELINES defined
|
||||||
MENUACTION_RESTOREDEF, "FET_DEF", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 320, 0, MENUALIGN_CENTER,
|
MENUACTION_RESTOREDEF, "FET_DEF", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 320, 0, MENUALIGN_CENTER,
|
||||||
|
@ -459,9 +459,9 @@ CMenuScreenCustom aScreens[] = {
|
||||||
{ "FEH_DIS", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true}), nil,
|
{ "FEH_DIS", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true}), nil,
|
||||||
MENUACTION_BRIGHTNESS, "FED_BRI", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_BRIGHTNESS, "FED_BRI", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
MENUACTION_DRAWDIST, "FEM_LOD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_DRAWDIST, "FEM_LOD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
|
DENSITY_SLIDERS
|
||||||
CUTSCENE_BORDERS_TOGGLE
|
CUTSCENE_BORDERS_TOGGLE
|
||||||
FREE_CAM_TOGGLE
|
FREE_CAM_TOGGLE
|
||||||
DENSITY_SLIDERS
|
|
||||||
MENUACTION_LEGENDS, "MAP_LEG", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_LEGENDS, "MAP_LEG", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
MENUACTION_RADARMODE, "FED_RDR", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_RADARMODE, "FED_RDR", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
MENUACTION_HUD, "FED_HUD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_HUD, "FED_HUD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
|
@ -638,7 +638,11 @@ CMenuScreenCustom aScreens[] = {
|
||||||
|
|
||||||
// MENUPAGE_OPTIONS = 27
|
// MENUPAGE_OPTIONS = 27
|
||||||
{ "FET_OPT", MENUPAGE_NONE, nil, nil,
|
{ "FET_OPT", MENUPAGE_NONE, nil, nil,
|
||||||
|
#ifdef GTA_HANDHELD
|
||||||
|
MENUACTION_CHANGEMENU, "FEO_CON", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS}, 320, 132, MENUALIGN_CENTER,
|
||||||
|
#else
|
||||||
MENUACTION_CHANGEMENU, "FEO_CON", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC}, 320, 132, MENUALIGN_CENTER,
|
MENUACTION_CHANGEMENU, "FEO_CON", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC}, 320, 132, MENUALIGN_CENTER,
|
||||||
|
#endif
|
||||||
MENUACTION_LOADRADIO, "FEO_AUD", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
MENUACTION_LOADRADIO, "FEO_AUD", {nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||||
MENUACTION_CHANGEMENU, "FEO_DIS", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
MENUACTION_CHANGEMENU, "FEO_DIS", {nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS}, 0, 0, MENUALIGN_CENTER,
|
||||||
#ifdef GRAPHICS_MENU_OPTIONS
|
#ifdef GRAPHICS_MENU_OPTIONS
|
||||||
|
@ -694,7 +698,11 @@ CMenuScreenCustom aScreens[] = {
|
||||||
{ "", 0, nil, nil, },
|
{ "", 0, nil, nil, },
|
||||||
|
|
||||||
#ifdef GAMEPAD_MENU
|
#ifdef GAMEPAD_MENU
|
||||||
|
#ifdef GTA_HANDHELD
|
||||||
|
{ "FET_AGS", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true, true}), nil,
|
||||||
|
#else
|
||||||
{ "FET_AGS", MENUPAGE_CONTROLLER_PC, new CCustomScreenLayout({40, 78, 25, true, true}), nil,
|
{ "FET_AGS", MENUPAGE_CONTROLLER_PC, new CCustomScreenLayout({40, 78, 25, true, true}), nil,
|
||||||
|
#endif
|
||||||
MENUACTION_CTRLCONFIG, "FEC_CCF", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, 40, 76, MENUALIGN_LEFT,
|
MENUACTION_CTRLCONFIG, "FEC_CCF", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, 40, 76, MENUALIGN_LEFT,
|
||||||
MENUACTION_CTRLDISPLAY, "FEC_CDP", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_CTRLDISPLAY, "FEC_CDP", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
INVERT_PAD_SELECTOR
|
INVERT_PAD_SELECTOR
|
||||||
|
@ -760,7 +768,9 @@ CMenuScreenCustom aScreens[] = {
|
||||||
// MENUPAGE_GRAPHICS_SETTINGS
|
// MENUPAGE_GRAPHICS_SETTINGS
|
||||||
{ "FET_GFX", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true, true}), GraphicsGoBack,
|
{ "FET_GFX", MENUPAGE_OPTIONS, new CCustomScreenLayout({40, 78, 25, true, true}), GraphicsGoBack,
|
||||||
|
|
||||||
|
#ifndef GTA_HANDHELD
|
||||||
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
|
#endif
|
||||||
MENUACTION_WIDESCREEN, "FED_WIS", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
MENUACTION_WIDESCREEN, "FED_WIS", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS }, 0, 0, MENUALIGN_LEFT,
|
||||||
VIDEOMODE_SELECTOR
|
VIDEOMODE_SELECTOR
|
||||||
#ifdef LEGACY_MENU_OPTIONS
|
#ifdef LEGACY_MENU_OPTIONS
|
||||||
|
|
|
@ -11,6 +11,11 @@
|
||||||
#define __STDC_LIMIT_MACROS // so we get UINT32_MAX etc
|
#define __STDC_LIMIT_MACROS // so we get UINT32_MAX etc
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
#include <switch.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
|
@ -170,6 +170,11 @@ enum Config {
|
||||||
|
|
||||||
#define GTA_VERSION GTAVC_PC_11
|
#define GTA_VERSION GTAVC_PC_11
|
||||||
|
|
||||||
|
// Enable configuration for handheld console ports
|
||||||
|
#if defined(__SWITCH__) || defined(PSP2)
|
||||||
|
#define GTA_HANDHELD
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO(MIAMI): someone ought to find and check out uses of these defines:
|
// TODO(MIAMI): someone ought to find and check out uses of these defines:
|
||||||
//#define GTA3_STEAM_PATCH
|
//#define GTA3_STEAM_PATCH
|
||||||
//#define GTAVC_JP_PATCH
|
//#define GTAVC_JP_PATCH
|
||||||
|
@ -182,7 +187,9 @@ enum Config {
|
||||||
# define PS2_MENU
|
# define PS2_MENU
|
||||||
#elif defined GTA_PC
|
#elif defined GTA_PC
|
||||||
# define EXTERNAL_3D_SOUND
|
# define EXTERNAL_3D_SOUND
|
||||||
# define PC_PLAYER_CONTROLS // mouse player/cam mode
|
# ifndef GTA_HANDHELD
|
||||||
|
# define PC_PLAYER_CONTROLS // mouse player/cam mode
|
||||||
|
# endif
|
||||||
//# define GTA_REPLAY
|
//# define GTA_REPLAY
|
||||||
# define GTA_SCENE_EDIT
|
# define GTA_SCENE_EDIT
|
||||||
# define PC_MENU
|
# define PC_MENU
|
||||||
|
@ -343,7 +350,7 @@ enum Config {
|
||||||
#if !defined(RW_GL3) && defined(_WIN32)
|
#if !defined(RW_GL3) && defined(_WIN32)
|
||||||
#define XINPUT
|
#define XINPUT
|
||||||
#endif
|
#endif
|
||||||
#if defined XINPUT || (defined RW_GL3 && !defined LIBRW_SDL2 && !defined __SWITCH__)
|
#if defined XINPUT || (defined RW_GL3 && !defined LIBRW_SDL2 && !defined GTA_HANDHELD)
|
||||||
#define DETECT_JOYSTICK_MENU // Then we'll expect user to enter Controller->Detect joysticks if his joystick isn't detected at the start.
|
#define DETECT_JOYSTICK_MENU // Then we'll expect user to enter Controller->Detect joysticks if his joystick isn't detected at the start.
|
||||||
#endif
|
#endif
|
||||||
#define DETECT_PAD_INPUT_SWITCH // Adds automatic switch of pad related stuff between controller and kb/m
|
#define DETECT_PAD_INPUT_SWITCH // Adds automatic switch of pad related stuff between controller and kb/m
|
||||||
|
@ -365,7 +372,7 @@ enum Config {
|
||||||
//# define PS2_MENU_USEALLPAGEICONS
|
//# define PS2_MENU_USEALLPAGEICONS
|
||||||
#else
|
#else
|
||||||
# define MAP_ENHANCEMENTS // Adding waypoint and better mouse support
|
# define MAP_ENHANCEMENTS // Adding waypoint and better mouse support
|
||||||
# ifdef XINPUT
|
# if defined(XINPUT) || defined(GTA_HANDHELD)
|
||||||
# define GAMEPAD_MENU // Add gamepad menu
|
# define GAMEPAD_MENU // Add gamepad menu
|
||||||
# endif
|
# endif
|
||||||
# define TRIANGLE_BACK_BUTTON
|
# define TRIANGLE_BACK_BUTTON
|
||||||
|
@ -484,6 +491,14 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
|
||||||
#undef USE_CUTSCENE_SHADOW_FOR_PED
|
#undef USE_CUTSCENE_SHADOW_FOR_PED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef GTA_HANDHELD
|
||||||
|
#define IGNORE_MOUSE_KEYBOARD // ignore mouse & keyboard input
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
#define USE_UNNAMED_SEM // named semaphores are unsupported on the switch
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // VANILLA_DEFINES
|
#endif // VANILLA_DEFINES
|
||||||
|
|
||||||
#if defined(AUDIO_OAL) && !defined(EXTERNAL_3D_SOUND)
|
#if defined(AUDIO_OAL) && !defined(EXTERNAL_3D_SOUND)
|
||||||
|
|
|
@ -48,9 +48,7 @@
|
||||||
#include "Population.h"
|
#include "Population.h"
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
|
|
||||||
#ifdef DETECT_JOYSTICK_MENU
|
|
||||||
#include "crossplatform.h"
|
#include "crossplatform.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
|
|
|
@ -1237,8 +1237,12 @@ CPed::ClearAimFlag(void)
|
||||||
m_lookTimer = 0;
|
m_lookTimer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsPlayer())
|
if (IsPlayer()) {
|
||||||
((CPlayerPed*)this)->m_fFPSMoveHeading = 0.0f;
|
((CPlayerPed*)this)->m_fFPSMoveHeading = 0.0f;
|
||||||
|
#ifdef FREE_CAM
|
||||||
|
((CPlayerPed*)this)->m_bFreeAimActive = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -347,11 +347,17 @@ CPed::SetAttack(CEntity *victim)
|
||||||
|
|
||||||
if (m_pLookTarget) {
|
if (m_pLookTarget) {
|
||||||
SetAimFlag(m_pLookTarget);
|
SetAimFlag(m_pLookTarget);
|
||||||
} else if (this == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam()) {
|
#ifdef FREE_CAM
|
||||||
SetAimFlag(m_fRotationCur);
|
} else if (this != FindPlayerPed() || !((CPlayerPed*)this)->m_bFreeAimActive) {
|
||||||
((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
|
#else
|
||||||
} else if (curWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) {
|
} else {
|
||||||
SetAimFlag(m_fRotationCur);
|
#endif
|
||||||
|
if (this == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam()) {
|
||||||
|
SetAimFlag(m_fRotationCur);
|
||||||
|
((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
|
||||||
|
} else if (curWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) {
|
||||||
|
SetAimFlag(m_fRotationCur);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
|
@ -823,6 +829,9 @@ CPed::Attack(void)
|
||||||
if (!bIsDucking && !GetFireAnimNotDucking(ourWeapon) && ourWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM))
|
if (!bIsDucking && !GetFireAnimNotDucking(ourWeapon) && ourWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM))
|
||||||
m_pedIK.m_flags |= CPedIK::AIMS_WITH_ARM;
|
m_pedIK.m_flags |= CPedIK::AIMS_WITH_ARM;
|
||||||
else
|
else
|
||||||
|
#ifdef FREE_CAM
|
||||||
|
if (!IsPlayer() || !((CPlayerPed*)this)->m_bFreeAimActive)
|
||||||
|
#endif
|
||||||
m_pedIK.m_flags &= ~CPedIK::AIMS_WITH_ARM;
|
m_pedIK.m_flags &= ~CPedIK::AIMS_WITH_ARM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1019,6 +1028,15 @@ CPed::Attack(void)
|
||||||
weaponAnimAssoc->SetCurrentTime(animLoopEnd);
|
weaponAnimAssoc->SetCurrentTime(animLoopEnd);
|
||||||
weaponAnimAssoc->flags &= ~ASSOC_RUNNING;
|
weaponAnimAssoc->flags &= ~ASSOC_RUNNING;
|
||||||
SetPointGunAt(m_pPointGunAt);
|
SetPointGunAt(m_pPointGunAt);
|
||||||
|
#ifdef FREE_CAM
|
||||||
|
} else if (IsPlayer() && ((CPlayerPed*)this)->m_bFreeAimActive && GetWeapon()->m_eWeaponState != WEAPONSTATE_RELOADING) {
|
||||||
|
float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
|
||||||
|
SetLookFlag(limitedCam, true, true);
|
||||||
|
SetAimFlag(limitedCam);
|
||||||
|
SetLookTimer(INT32_MAX);
|
||||||
|
SetPointGunAt(nil);
|
||||||
|
((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
ClearAimFlag();
|
ClearAimFlag();
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,9 @@ CPlayerPed::CPlayerPed(void) : CPed(PEDTYPE_PLAYER1)
|
||||||
m_nAttackDirToCheck = 0;
|
m_nAttackDirToCheck = 0;
|
||||||
m_nLastBusFareCollected = 0;
|
m_nLastBusFareCollected = 0;
|
||||||
idleAnimBlockIndex = CAnimManager::GetAnimationBlockIndex("playidles");
|
idleAnimBlockIndex = CAnimManager::GetAnimationBlockIndex("playidles");
|
||||||
|
#ifdef FREE_CAM
|
||||||
|
m_bFreeAimActive = false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1343,17 +1346,22 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
|
||||||
if ((padUsed->GetTarget() && CAN_AIM_WITH_ARM) || padUsed->GetWeapon()) {
|
if ((padUsed->GetTarget() && CAN_AIM_WITH_ARM) || padUsed->GetWeapon()) {
|
||||||
float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
|
float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
|
||||||
|
|
||||||
|
m_cachedCamSource = TheCamera.Cams[TheCamera.ActiveCam].Source;
|
||||||
|
m_cachedCamFront = TheCamera.Cams[TheCamera.ActiveCam].Front;
|
||||||
|
m_cachedCamUp = TheCamera.Cams[TheCamera.ActiveCam].Up;
|
||||||
|
|
||||||
// On this one we can rotate arm.
|
// On this one we can rotate arm.
|
||||||
if (CAN_AIM_WITH_ARM) {
|
if (CAN_AIM_WITH_ARM) {
|
||||||
if (!padUsed->GetWeapon()) { // making this State != ATTACK still stops it after attack. Re-start it immediately!
|
|
||||||
SetPointGunAt(nil);
|
|
||||||
bIsPointingGunAt = false; // to not stop after attack
|
|
||||||
}
|
|
||||||
pointedGun = 2;
|
pointedGun = 2;
|
||||||
SetLookFlag(limitedCam, true);
|
m_bFreeAimActive = true;
|
||||||
|
SetLookFlag(limitedCam, true, true);
|
||||||
SetAimFlag(limitedCam);
|
SetAimFlag(limitedCam);
|
||||||
SetLookTimer(INT32_MAX); // removing this makes head move for real, but I experinced some bugs.
|
SetLookTimer(INT32_MAX);
|
||||||
|
((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
|
||||||
|
if (m_nPedState != PED_ATTACK && m_nPedState != PED_AIM_GUN) {
|
||||||
|
// This is a seperate ped state just for pointing gun. Used for target button
|
||||||
|
SetPointGunAt(nil);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
m_fRotationDest = limitedCam;
|
m_fRotationDest = limitedCam;
|
||||||
changedHeadingRate = 2;
|
changedHeadingRate = 2;
|
||||||
|
@ -1381,9 +1389,19 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
|
||||||
changedHeadingRate = 0;
|
changedHeadingRate = 0;
|
||||||
RestoreHeadingRate();
|
RestoreHeadingRate();
|
||||||
}
|
}
|
||||||
if (pointedGun == 1 && m_nPedState != PED_ATTACK) {
|
if (pointedGun == 1) {
|
||||||
pointedGun = 0;
|
if (m_nPedState == PED_ATTACK) {
|
||||||
ClearPointGunAt();
|
if (!padUsed->GetWeapon() && (m_pedIK.m_flags & CPedIK::GUN_POINTED_SUCCESSFULLY) == 0) {
|
||||||
|
float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
|
||||||
|
|
||||||
|
SetAimFlag(limitedCam);
|
||||||
|
((CPlayerPed*)this)->m_fFPSMoveHeading = TheCamera.Find3rdPersonQuickAimPitch();
|
||||||
|
m_bFreeAimActive = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pointedGun = 0;
|
||||||
|
ClearPointGunAt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,12 @@ public:
|
||||||
float m_fGunSpinAngle;
|
float m_fGunSpinAngle;
|
||||||
unsigned int m_nPadDownPressedInMilliseconds;
|
unsigned int m_nPadDownPressedInMilliseconds;
|
||||||
unsigned int m_nLastBusFareCollected;
|
unsigned int m_nLastBusFareCollected;
|
||||||
|
#ifdef FREE_CAM
|
||||||
|
bool m_bFreeAimActive;
|
||||||
|
CVector m_cachedCamSource;
|
||||||
|
CVector m_cachedCamFront;
|
||||||
|
CVector m_cachedCamUp;
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool bDontAllowWeaponChange;
|
static bool bDontAllowWeaponChange;
|
||||||
#ifndef MASTER
|
#ifndef MASTER
|
||||||
|
|
|
@ -198,6 +198,20 @@ char* casepath(char const* path, bool checkPathFirst)
|
||||||
size_t rl = 0;
|
size_t rl = 0;
|
||||||
|
|
||||||
DIR* d;
|
DIR* d;
|
||||||
|
char* c;
|
||||||
|
|
||||||
|
#if defined(__SWITCH__) || defined(PSP2)
|
||||||
|
if( (c = strstr(p, ":/")) != NULL) // scheme used by some environments, eg. switch, vita
|
||||||
|
{
|
||||||
|
size_t deviceNameOffset = c - p + 3;
|
||||||
|
char* deviceNamePath = (char*)alloca(deviceNameOffset + 1);
|
||||||
|
strlcpy(deviceNamePath, p, deviceNameOffset);
|
||||||
|
deviceNamePath[deviceNameOffset] = 0;
|
||||||
|
d = opendir(deviceNamePath);
|
||||||
|
p = c + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if (p[0] == '/' || p[0] == '\\')
|
if (p[0] == '/' || p[0] == '\\')
|
||||||
{
|
{
|
||||||
d = opendir("/");
|
d = opendir("/");
|
||||||
|
@ -212,7 +226,7 @@ char* casepath(char const* path, bool checkPathFirst)
|
||||||
|
|
||||||
bool cantProceed = false; // just convert slashes in what's left in string, don't correct case of letters(because we can't)
|
bool cantProceed = false; // just convert slashes in what's left in string, don't correct case of letters(because we can't)
|
||||||
bool mayBeTrailingSlash = false;
|
bool mayBeTrailingSlash = false;
|
||||||
char* c;
|
|
||||||
while (c = strsep(&p, "/\\"))
|
while (c = strsep(&p, "/\\"))
|
||||||
{
|
{
|
||||||
// May be trailing slash(allow), slash at the start(avoid), or multiple slashes(avoid)
|
// May be trailing slash(allow), slash at the start(avoid), or multiple slashes(avoid)
|
||||||
|
@ -293,3 +307,133 @@ char *_strdate(char *buf) {
|
||||||
return strdate(buf);
|
return strdate(buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
/* Taken from glibc */
|
||||||
|
char *realpath(const char *name, char *resolved)
|
||||||
|
{
|
||||||
|
char *rpath, *dest = NULL;
|
||||||
|
const char *start, *end, *rpath_limit;
|
||||||
|
long int path_max;
|
||||||
|
|
||||||
|
/* As per Single Unix Specification V2 we must return an error if
|
||||||
|
either parameter is a null pointer. We extend this to allow
|
||||||
|
the RESOLVED parameter to be NULL in case the we are expected to
|
||||||
|
allocate the room for the return value. */
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* As per Single Unix Specification V2 we must return an error if
|
||||||
|
the name argument points to an empty string. */
|
||||||
|
if (name[0] == '\0')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
#ifdef PATH_MAX
|
||||||
|
path_max = PATH_MAX;
|
||||||
|
#else
|
||||||
|
path_max = pathconf(name, _PC_PATH_MAX);
|
||||||
|
if (path_max <= 0)
|
||||||
|
path_max = 1024;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!resolved)
|
||||||
|
{
|
||||||
|
rpath = (char*)malloc(path_max);
|
||||||
|
if (!rpath)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rpath = resolved;
|
||||||
|
rpath_limit = rpath + path_max;
|
||||||
|
|
||||||
|
if (name[0] != '/')
|
||||||
|
{
|
||||||
|
if (!getcwd(rpath, path_max))
|
||||||
|
{
|
||||||
|
rpath[0] = '\0';
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
dest = (char*)memchr(rpath, '\0', path_max);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rpath[0] = '/';
|
||||||
|
dest = rpath + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (start = end = name; *start; start = end)
|
||||||
|
{
|
||||||
|
/* Skip sequence of multiple path-separators. */
|
||||||
|
while (*start == '/')
|
||||||
|
++start;
|
||||||
|
|
||||||
|
/* Find end of path component. */
|
||||||
|
for (end = start; *end && *end != '/'; ++end)
|
||||||
|
/* Nothing. */;
|
||||||
|
|
||||||
|
if (end - start == 0)
|
||||||
|
break;
|
||||||
|
else if (end - start == 1 && start[0] == '.')
|
||||||
|
/* nothing */;
|
||||||
|
else if (end - start == 2 && start[0] == '.' && start[1] == '.')
|
||||||
|
{
|
||||||
|
/* Back up to previous component, ignore if at root already. */
|
||||||
|
if (dest > rpath + 1)
|
||||||
|
while ((--dest)[-1] != '/')
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t new_size;
|
||||||
|
|
||||||
|
if (dest[-1] != '/')
|
||||||
|
*dest++ = '/';
|
||||||
|
|
||||||
|
if (dest + (end - start) >= rpath_limit)
|
||||||
|
{
|
||||||
|
ptrdiff_t dest_offset = dest - rpath;
|
||||||
|
char *new_rpath;
|
||||||
|
|
||||||
|
if (resolved)
|
||||||
|
{
|
||||||
|
if (dest > rpath + 1)
|
||||||
|
dest--;
|
||||||
|
*dest = '\0';
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
new_size = rpath_limit - rpath;
|
||||||
|
if (end - start + 1 > path_max)
|
||||||
|
new_size += end - start + 1;
|
||||||
|
else
|
||||||
|
new_size += path_max;
|
||||||
|
new_rpath = (char *)realloc(rpath, new_size);
|
||||||
|
if (!new_rpath)
|
||||||
|
goto error;
|
||||||
|
rpath = new_rpath;
|
||||||
|
rpath_limit = rpath + new_size;
|
||||||
|
|
||||||
|
dest = rpath + dest_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest = (char*)memcpy(dest, start, end - start);
|
||||||
|
*dest = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dest > rpath + 1 && dest[-1] == '/')
|
||||||
|
--dest;
|
||||||
|
*dest = '\0';
|
||||||
|
|
||||||
|
return rpath;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (!resolved)
|
||||||
|
free(rpath);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t readlink (const char * __path, char * __buf, size_t __buflen)
|
||||||
|
{
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -161,3 +161,28 @@ bool FindNextFile(HANDLE, WIN32_FIND_DATA*);
|
||||||
void FileTimeToSystemTime(time_t*, SYSTEMTIME*);
|
void FileTimeToSystemTime(time_t*, SYSTEMTIME*);
|
||||||
void GetDateFormat(int, int, SYSTEMTIME*, int, char*, int);
|
void GetDateFormat(int, int, SYSTEMTIME*, int, char*, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
|
||||||
|
// tweak glfw values for switch to match expected pc bindings
|
||||||
|
#ifdef GLFW_GAMEPAD_BUTTON_A
|
||||||
|
#undef GLFW_GAMEPAD_BUTTON_A
|
||||||
|
#endif
|
||||||
|
#define GLFW_GAMEPAD_BUTTON_A 1
|
||||||
|
|
||||||
|
#ifdef GLFW_GAMEPAD_BUTTON_B
|
||||||
|
#undef GLFW_GAMEPAD_BUTTON_B
|
||||||
|
#endif
|
||||||
|
#define GLFW_GAMEPAD_BUTTON_B 0
|
||||||
|
|
||||||
|
#ifdef GLFW_GAMEPAD_BUTTON_X
|
||||||
|
#undef GLFW_GAMEPAD_BUTTON_X
|
||||||
|
#endif
|
||||||
|
#define GLFW_GAMEPAD_BUTTON_X 3
|
||||||
|
|
||||||
|
#ifdef GLFW_GAMEPAD_BUTTON_Y
|
||||||
|
#undef GLFW_GAMEPAD_BUTTON_Y
|
||||||
|
#endif
|
||||||
|
#define GLFW_GAMEPAD_BUTTON_Y 2
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -821,7 +821,9 @@ PadHandler(RsEvent event, void *param)
|
||||||
RwBool
|
RwBool
|
||||||
AttachInputDevices(void)
|
AttachInputDevices(void)
|
||||||
{
|
{
|
||||||
|
#ifndef IGNORE_MOUSE_KEYBOARD
|
||||||
RsInputDeviceAttach(rsKEYBOARD, KeyboardHandler);
|
RsInputDeviceAttach(rsKEYBOARD, KeyboardHandler);
|
||||||
|
#endif
|
||||||
|
|
||||||
RsInputDeviceAttach(rsPAD, PadHandler);
|
RsInputDeviceAttach(rsPAD, PadHandler);
|
||||||
|
|
||||||
|
|
|
@ -12,12 +12,14 @@ DWORD _dwOperatingSystemVersion;
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
#else
|
#else
|
||||||
long _dwOperatingSystemVersion;
|
long _dwOperatingSystemVersion;
|
||||||
|
#ifndef __SWITCH__
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
#include <sys/sysinfo.h>
|
#include <sys/sysinfo.h>
|
||||||
#else
|
#else
|
||||||
#include <mach/mach_host.h>
|
#include <mach/mach_host.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@ -51,7 +53,7 @@ long _dwOperatingSystemVersion;
|
||||||
#include "MemoryMgr.h"
|
#include "MemoryMgr.h"
|
||||||
|
|
||||||
// We found out that GLFW's keyboard input handling is still pretty delayed/not stable, so now we fetch input from X11 directly on Linux.
|
// We found out that GLFW's keyboard input handling is still pretty delayed/not stable, so now we fetch input from X11 directly on Linux.
|
||||||
#if !defined _WIN32 && !defined __APPLE__ && !defined __SWITCH__ // && !defined WAYLAND
|
#if !defined _WIN32 && !defined __APPLE__ && !defined GTA_HANDHELD // && !defined WAYLAND
|
||||||
#define GET_KEYBOARD_INPUT_FROM_X11
|
#define GET_KEYBOARD_INPUT_FROM_X11
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -328,6 +330,78 @@ psNativeTextureSupport(void)
|
||||||
#define CMDSTR LPSTR
|
#define CMDSTR LPSTR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
|
||||||
|
static HidVibrationValue SwitchVibrationValues[2];
|
||||||
|
static HidVibrationDeviceHandle SwitchVibrationDeviceHandles[2][2];
|
||||||
|
static HidVibrationDeviceHandle SwitchVibrationDeviceGC;
|
||||||
|
|
||||||
|
static PadState SwitchPad;
|
||||||
|
|
||||||
|
static Result HidInitializationResult[2];
|
||||||
|
static Result HidInitializationGCResult;
|
||||||
|
|
||||||
|
static void _psInitializeVibration()
|
||||||
|
{
|
||||||
|
HidInitializationResult[0] = hidInitializeVibrationDevices(SwitchVibrationDeviceHandles[0], 2, HidNpadIdType_Handheld, HidNpadStyleTag_NpadHandheld);
|
||||||
|
if(R_FAILED(HidInitializationResult[0])) {
|
||||||
|
printf("Failed to initialize VibrationDevice for Handheld Mode\n");
|
||||||
|
}
|
||||||
|
HidInitializationResult[1] = hidInitializeVibrationDevices(SwitchVibrationDeviceHandles[1], 2, HidNpadIdType_No1, HidNpadStyleSet_NpadFullCtrl);
|
||||||
|
if(R_FAILED(HidInitializationResult[1])) {
|
||||||
|
printf("Failed to initialize VibrationDevice for Detached Mode\n");
|
||||||
|
}
|
||||||
|
HidInitializationGCResult = hidInitializeVibrationDevices(&SwitchVibrationDeviceGC, 1, HidNpadIdType_No1, HidNpadStyleTag_NpadGc);
|
||||||
|
if(R_FAILED(HidInitializationResult[1])) {
|
||||||
|
printf("Failed to initialize VibrationDevice for GC Mode\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
SwitchVibrationValues[0].freq_low = 160.0f;
|
||||||
|
SwitchVibrationValues[0].freq_high = 320.0f;
|
||||||
|
|
||||||
|
padConfigureInput(1, HidNpadStyleSet_NpadFullCtrl);
|
||||||
|
padInitializeDefault(&SwitchPad);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _psHandleVibration()
|
||||||
|
{
|
||||||
|
padUpdate(&SwitchPad);
|
||||||
|
|
||||||
|
uint8 target_device = padIsHandheld(&SwitchPad) ? 0 : 1;
|
||||||
|
|
||||||
|
if(R_SUCCEEDED(HidInitializationResult[target_device])) {
|
||||||
|
CPad* pad = CPad::GetPad(0);
|
||||||
|
|
||||||
|
// value conversion based on SDL2 switch port
|
||||||
|
SwitchVibrationValues[0].amp_high = SwitchVibrationValues[0].amp_low = pad->ShakeFreq == 0 ? 0.0f : 320.0f;
|
||||||
|
SwitchVibrationValues[0].freq_low = pad->ShakeFreq == 0.0 ? 160.0f : (float)pad->ShakeFreq * 1.26f;
|
||||||
|
SwitchVibrationValues[0].freq_high = pad->ShakeFreq == 0.0 ? 320.0f : (float)pad->ShakeFreq * 1.26f;
|
||||||
|
|
||||||
|
if (pad->ShakeDur < CTimer::GetTimeStepInMilliseconds())
|
||||||
|
pad->ShakeDur = 0;
|
||||||
|
else
|
||||||
|
pad->ShakeDur -= CTimer::GetTimeStepInMilliseconds();
|
||||||
|
if (pad->ShakeDur == 0) pad->ShakeFreq = 0;
|
||||||
|
|
||||||
|
|
||||||
|
if(target_device == 1 && R_SUCCEEDED(HidInitializationGCResult)) {
|
||||||
|
// gamecube rumble
|
||||||
|
hidSendVibrationGcErmCommand(SwitchVibrationDeviceGC, pad->ShakeFreq > 0 ? HidVibrationGcErmCommand_Start : HidVibrationGcErmCommand_Stop);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&SwitchVibrationValues[1], &SwitchVibrationValues[0], sizeof(HidVibrationValue));
|
||||||
|
hidSendVibrationValues(SwitchVibrationDeviceHandles[target_device], SwitchVibrationValues, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void _psInitializeVibration() {}
|
||||||
|
static void _psHandleVibration() {}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
@ -407,6 +481,8 @@ psInitialize(void)
|
||||||
InitialiseLanguage();
|
InitialiseLanguage();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
_psInitializeVibration();
|
||||||
|
|
||||||
gGameState = GS_START_UP;
|
gGameState = GS_START_UP;
|
||||||
TRACE("gGameState = GS_START_UP");
|
TRACE("gGameState = GS_START_UP");
|
||||||
|
@ -480,6 +556,9 @@ psInitialize(void)
|
||||||
_dwMemAvailPhys = (uint64_t)(vm_stat.free_count * page_size);
|
_dwMemAvailPhys = (uint64_t)(vm_stat.free_count * page_size);
|
||||||
debug("Physical memory size %llu\n", _dwMemAvailPhys);
|
debug("Physical memory size %llu\n", _dwMemAvailPhys);
|
||||||
debug("Available physical memory %llu\n", size);
|
debug("Available physical memory %llu\n", size);
|
||||||
|
#elif defined (__SWITCH__)
|
||||||
|
svcGetInfo(&_dwMemAvailPhys, InfoType_UsedMemorySize, CUR_PROCESS_HANDLE, 0);
|
||||||
|
debug("Physical memory size %llu\n", _dwMemAvailPhys);
|
||||||
#else
|
#else
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
struct sysinfo systemInfo;
|
struct sysinfo systemInfo;
|
||||||
|
@ -982,13 +1061,15 @@ void psPostRWinit(void)
|
||||||
RwVideoMode vm;
|
RwVideoMode vm;
|
||||||
RwEngineGetVideoModeInfo(&vm, GcurSelVM);
|
RwEngineGetVideoModeInfo(&vm, GcurSelVM);
|
||||||
|
|
||||||
|
glfwSetFramebufferSizeCallback(PSGLOBAL(window), resizeCB);
|
||||||
|
#ifndef IGNORE_MOUSE_KEYBOARD
|
||||||
#ifndef GET_KEYBOARD_INPUT_FROM_X11
|
#ifndef GET_KEYBOARD_INPUT_FROM_X11
|
||||||
glfwSetKeyCallback(PSGLOBAL(window), keypressCB);
|
glfwSetKeyCallback(PSGLOBAL(window), keypressCB);
|
||||||
#endif
|
#endif
|
||||||
glfwSetFramebufferSizeCallback(PSGLOBAL(window), resizeCB);
|
|
||||||
glfwSetScrollCallback(PSGLOBAL(window), scrollCB);
|
glfwSetScrollCallback(PSGLOBAL(window), scrollCB);
|
||||||
glfwSetCursorPosCallback(PSGLOBAL(window), cursorCB);
|
glfwSetCursorPosCallback(PSGLOBAL(window), cursorCB);
|
||||||
glfwSetCursorEnterCallback(PSGLOBAL(window), cursorEnterCB);
|
glfwSetCursorEnterCallback(PSGLOBAL(window), cursorEnterCB);
|
||||||
|
#endif
|
||||||
glfwSetWindowIconifyCallback(PSGLOBAL(window), windowIconifyCB);
|
glfwSetWindowIconifyCallback(PSGLOBAL(window), windowIconifyCB);
|
||||||
glfwSetWindowFocusCallback(PSGLOBAL(window), windowFocusCB);
|
glfwSetWindowFocusCallback(PSGLOBAL(window), windowFocusCB);
|
||||||
glfwSetJoystickCallback(joysChangeCB);
|
glfwSetJoystickCallback(joysChangeCB);
|
||||||
|
@ -1824,7 +1905,7 @@ main(int argc, char *argv[])
|
||||||
InitMemoryMgr();
|
InitMemoryMgr();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if !defined(_WIN32) && !defined(__SWITCH__)
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
act.sa_sigaction = terminateHandler;
|
act.sa_sigaction = terminateHandler;
|
||||||
act.sa_flags = SA_SIGINFO;
|
act.sa_flags = SA_SIGINFO;
|
||||||
|
@ -1968,10 +2049,12 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
#ifdef LOAD_INI_SETTINGS
|
#ifdef LOAD_INI_SETTINGS
|
||||||
LoadINIControllerSettings();
|
LoadINIControllerSettings();
|
||||||
if (connectedPadButtons != 0) {
|
if (connectedPadButtons != 0)
|
||||||
ControlsManager.InitDefaultControlConfigJoyPad(connectedPadButtons);
|
ControlsManager.InitDefaultControlConfigJoyPad(connectedPadButtons); // add (connected-saved) amount of new button assignments on top of ours
|
||||||
SaveINIControllerSettings();
|
|
||||||
}
|
// these have 2 purposes: creating .ini at the start, and adding newly introduced settings to old .ini at the start
|
||||||
|
SaveINISettings();
|
||||||
|
SaveINIControllerSettings();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2486,7 +2569,9 @@ void CapturePad(RwInt32 padID)
|
||||||
if ( Abs(rightStickPos.y) > 0.3f )
|
if ( Abs(rightStickPos.y) > 0.3f )
|
||||||
pad->PCTempJoyState.RightStickY = (int32)(rightStickPos.y * 128.0f);
|
pad->PCTempJoyState.RightStickY = (int32)(rightStickPos.y * 128.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_psHandleVibration();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2179,10 +2179,12 @@ WinMain(HINSTANCE instance,
|
||||||
|
|
||||||
#ifdef LOAD_INI_SETTINGS
|
#ifdef LOAD_INI_SETTINGS
|
||||||
LoadINIControllerSettings();
|
LoadINIControllerSettings();
|
||||||
if (connectedPadButtons != 0) {
|
if (connectedPadButtons != 0)
|
||||||
ControlsManager.InitDefaultControlConfigJoyPad(connectedPadButtons);
|
ControlsManager.InitDefaultControlConfigJoyPad(connectedPadButtons); // add (connected-saved) amount of new button assignments on top of ours
|
||||||
SaveINIControllerSettings();
|
|
||||||
}
|
// these have 2 purposes: creating .ini at the start, and adding newly introduced settings to old .ini at the start
|
||||||
|
SaveINISettings();
|
||||||
|
SaveINIControllerSettings();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3600,6 +3600,7 @@ CAutomobile::ProcessBuoyancy(void)
|
||||||
CVector impulse, point;
|
CVector impulse, point;
|
||||||
|
|
||||||
if(mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)){
|
if(mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)){
|
||||||
|
bTouchingWater = true;
|
||||||
float timeStep = Max(CTimer::GetTimeStep(), 0.01f);
|
float timeStep = Max(CTimer::GetTimeStep(), 0.01f);
|
||||||
float impulseRatio = impulse.z / (GRAVITY * m_fMass * timeStep);
|
float impulseRatio = impulse.z / (GRAVITY * m_fMass * timeStep);
|
||||||
float waterResistance = Pow(1.0f - 0.05f*impulseRatio, CTimer::GetTimeStep());
|
float waterResistance = Pow(1.0f - 0.05f*impulseRatio, CTimer::GetTimeStep());
|
||||||
|
@ -3614,7 +3615,7 @@ CAutomobile::ProcessBuoyancy(void)
|
||||||
heliHitWaterHard = true;
|
heliHitWaterHard = true;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
float strength = 1.0f/Max(8.0f*impulseRatio, 1.0f);
|
float strength = Max(8.0f*impulseRatio, 1.0f);
|
||||||
ApplyMoveForce(-2.0f*impulse/strength);
|
ApplyMoveForce(-2.0f*impulse/strength);
|
||||||
ApplyTurnForce(-impulse/strength, point);
|
ApplyTurnForce(-impulse/strength, point);
|
||||||
if(impulseRatio > 0.9f){
|
if(impulseRatio > 0.9f){
|
||||||
|
|
|
@ -49,6 +49,29 @@ bool CWeapon::bPhotographHasBeenTaken;
|
||||||
int32 sniperPirateCheck = 0x00797743; // 'Cwy\0' ???
|
int32 sniperPirateCheck = 0x00797743; // 'Cwy\0' ???
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FREE_CAM
|
||||||
|
static bool
|
||||||
|
Find3rdPersonCamTargetVectorFromCachedVectors(float dist, CVector pos, CVector& source, CVector& target, CVector camSource, CVector camFront, CVector camUp)
|
||||||
|
{
|
||||||
|
if (CPad::GetPad(0)->GetLookBehindForPed()) {
|
||||||
|
source = pos;
|
||||||
|
target = dist * FindPlayerPed()->GetForward() + source;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
float angleX = DEGTORAD((CCamera::m_f3rdPersonCHairMultX - 0.5f) * 1.8f * 0.5f * TheCamera.Cams[TheCamera.ActiveCam].FOV * CDraw::GetAspectRatio());
|
||||||
|
float angleY = DEGTORAD((0.5f - CCamera::m_f3rdPersonCHairMultY) * 1.8f * 0.5f * TheCamera.Cams[TheCamera.ActiveCam].FOV);
|
||||||
|
source = camSource;
|
||||||
|
target = camFront;
|
||||||
|
target += camUp * Tan(angleY);
|
||||||
|
target += CrossProduct(camFront, camUp) * Tan(angleX);
|
||||||
|
target.Normalise();
|
||||||
|
source += DotProduct(pos - source, target) * target;
|
||||||
|
target = dist * target + source;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CWeaponInfo *
|
CWeaponInfo *
|
||||||
CWeapon::GetInfo()
|
CWeapon::GetInfo()
|
||||||
{
|
{
|
||||||
|
@ -943,17 +966,23 @@ CWeapon::FireInstantHit(CEntity *shooter, CVector *fireSource)
|
||||||
}
|
}
|
||||||
else if ( shooter == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam() )
|
else if ( shooter == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam() )
|
||||||
{
|
{
|
||||||
TheCamera.Find3rdPersonCamTargetVector(info->m_fRange, *fireSource, source, target);
|
|
||||||
#ifdef FREE_CAM
|
#ifdef FREE_CAM
|
||||||
CPed *shooterPed = (CPed *)shooter;
|
if (CCamera::bFreeCam) {
|
||||||
if((shooterPed->m_pedIK.m_flags & CPedIK::GUN_POINTED_SUCCESSFULLY) == 0) {
|
CPlayerPed* shooterPed = (CPlayerPed*)shooter;
|
||||||
target.x = info->m_fRange;
|
Find3rdPersonCamTargetVectorFromCachedVectors(info->m_fRange, *fireSource, source, target, shooterPed->m_cachedCamSource, shooterPed->m_cachedCamFront, shooterPed->m_cachedCamUp);
|
||||||
target.y = 0.0f;
|
|
||||||
target.z = 0.0f;
|
|
||||||
|
|
||||||
shooterPed->TransformToNode(target, PED_HANDR);
|
if ((shooterPed->m_pedIK.m_flags & CPedIK::GUN_POINTED_SUCCESSFULLY) == 0) {
|
||||||
}
|
target.x = info->m_fRange;
|
||||||
|
target.y = 0.0f;
|
||||||
|
target.z = 0.0f;
|
||||||
|
|
||||||
|
shooterPed->TransformToNode(target, PED_HANDR);
|
||||||
|
}
|
||||||
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
|
TheCamera.Find3rdPersonCamTargetVector(info->m_fRange, *fireSource, source, target);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
// fix muzzleflash rotation
|
// fix muzzleflash rotation
|
||||||
|
@ -1708,8 +1737,19 @@ CWeapon::FireShotgun(CEntity *shooter, CVector *fireSource)
|
||||||
|
|
||||||
if ( shooter == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam() )
|
if ( shooter == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam() )
|
||||||
{
|
{
|
||||||
TheCamera.Find3rdPersonCamTargetVector(1.0f, *fireSource, source, target);
|
CVector Left;
|
||||||
CVector Left = CrossProduct(TheCamera.Cams[TheCamera.ActiveCam].Front, TheCamera.Cams[TheCamera.ActiveCam].Up);
|
#ifdef FREE_CAM
|
||||||
|
if (CCamera::bFreeCam) {
|
||||||
|
CPlayerPed* shooterPed = (CPlayerPed*)shooter;
|
||||||
|
Find3rdPersonCamTargetVectorFromCachedVectors(1.0f, *fireSource, source, target, shooterPed->m_cachedCamSource, shooterPed->m_cachedCamFront, shooterPed->m_cachedCamUp);
|
||||||
|
Left = CrossProduct(shooterPed->m_cachedCamFront, shooterPed->m_cachedCamUp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
TheCamera.Find3rdPersonCamTargetVector(1.0f, *fireSource, source, target);
|
||||||
|
Left = CrossProduct(TheCamera.Cams[TheCamera.ActiveCam].Front, TheCamera.Cams[TheCamera.ActiveCam].Up);
|
||||||
|
}
|
||||||
|
|
||||||
float f = (i - (shootsAtOnce / 2)) * angleBetweenTwoShot;
|
float f = (i - (shootsAtOnce / 2)) * angleBetweenTwoShot;
|
||||||
target = f * Left + target - source;
|
target = f * Left + target - source;
|
||||||
|
@ -2151,7 +2191,16 @@ CWeapon::FireAreaEffect(CEntity *shooter, CVector *fireSource)
|
||||||
|
|
||||||
if ( shooter == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam() )
|
if ( shooter == FindPlayerPed() && TheCamera.Cams[0].Using3rdPersonMouseCam() )
|
||||||
{
|
{
|
||||||
TheCamera.Find3rdPersonCamTargetVector(info->m_fRange, *fireSource, source, target);
|
#ifdef FREE_CAM
|
||||||
|
if (CCamera::bFreeCam) {
|
||||||
|
CPlayerPed* shooterPed = (CPlayerPed*)shooter;
|
||||||
|
Find3rdPersonCamTargetVectorFromCachedVectors(info->m_fRange, *fireSource, source, target, shooterPed->m_cachedCamSource, shooterPed->m_cachedCamFront, shooterPed->m_cachedCamUp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
TheCamera.Find3rdPersonCamTargetVector(info->m_fRange, *fireSource, source, target);
|
||||||
|
}
|
||||||
float norm = (1.0f / info->m_fRange);
|
float norm = (1.0f / info->m_fRange);
|
||||||
dir = (target - source) * norm;
|
dir = (target - source) * norm;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue