mirror of
https://gitlab.com/GaryOderNichts/re3-wiiu.git
synced 2025-02-18 19:16:21 +01:00
Merge branch 'master' of https://github.com/GTAmodding/re3 into wiiu
This commit is contained in:
commit
7e860c5c53
@ -1,54 +0,0 @@
|
|||||||
version: 1.0.{build}
|
|
||||||
image: Visual Studio 2019
|
|
||||||
configuration:
|
|
||||||
- Debug
|
|
||||||
- Release
|
|
||||||
platform:
|
|
||||||
- win-x86-librw_d3d9-mss
|
|
||||||
- win-x86-librw_gl3_glfw-mss
|
|
||||||
environment:
|
|
||||||
APPVEYOR_SAVE_CACHE_ON_ERROR: true
|
|
||||||
GLEW_VER: "2.1.0"
|
|
||||||
GLFW_VER: "3.3.2"
|
|
||||||
GLEW_BASE: glew-%GLEW_VER%
|
|
||||||
GLFW_BASE: glfw-%GLFW_VER%.bin.WIN32
|
|
||||||
GLEW_FILE: "%GLEW_BASE%-win32.zip"
|
|
||||||
GLFW_FILE: "%GLFW_BASE%.zip"
|
|
||||||
GLEW_URL: https://github.com/nigels-com/glew/releases/download/%GLEW_BASE%/%GLEW_FILE%
|
|
||||||
GLFW_URL: https://github.com/glfw/glfw/releases/download/%GLFW_VER%/%GLFW_FILE%
|
|
||||||
install:
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] IF NOT EXIST %GLEW_FILE% appveyor DownloadFile %GLEW_URL% -FileName "%APPVEYOR_BUILD_FOLDER%/%GLEW_FILE%"
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] 7z x "%APPVEYOR_BUILD_FOLDER%/%GLEW_FILE%"
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] IF NOT EXIST %GLFW_FILE% appveyor DownloadFile %GLFW_URL% -FileName "%APPVEYOR_BUILD_FOLDER%/%GLFW_FILE%"
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] 7z x "%APPVEYOR_BUILD_FOLDER%/%GLFW_FILE%"
|
|
||||||
- cmd: >-
|
|
||||||
git submodule update --init --recursive
|
|
||||||
|
|
||||||
premake5 vs2019 --with-librw --glewdir=%APPVEYOR_BUILD_FOLDER%/%GLEW_BASE% --glfwdir32=%APPVEYOR_BUILD_FOLDER%/%GLFW_BASE%
|
|
||||||
|
|
||||||
build:
|
|
||||||
project: build/re3.sln
|
|
||||||
verbosity: minimal
|
|
||||||
after_build:
|
|
||||||
- 7z a "re3_%configuration%_%platform%_%APPVEYOR_BUILD_VERSION%.zip" bin/%PLATFORM%/%CONFIGURATION%/re3.exe bin/%PLATFORM%/%CONFIGURATION%/re3.pdb
|
|
||||||
artifacts:
|
|
||||||
- path: "re3_%configuration%_%platform%_%APPVEYOR_BUILD_VERSION%.zip"
|
|
||||||
name: re3
|
|
||||||
deploy:
|
|
||||||
- provider: BinTray
|
|
||||||
username: shfil119
|
|
||||||
api_key:
|
|
||||||
secure: xWnYDfNWM87iPoBFbz6L1XAduxijJRWSpQLhMDOjznmzbMCsORtdx2tmWmFLTwf6
|
|
||||||
subject: gtamodding
|
|
||||||
repo: re3
|
|
||||||
package: "%configuration%_%platform%"
|
|
||||||
version: "%APPVEYOR_BUILD_VERSION%"
|
|
||||||
artifact: re3
|
|
||||||
publish: true
|
|
||||||
on:
|
|
||||||
branch: master
|
|
||||||
APPVEYOR_REPO_TAG: false
|
|
||||||
|
|
||||||
cache:
|
|
||||||
- "%GLEW_FILE%"
|
|
||||||
- "%GLFW_FILE%"
|
|
28
.clang-format
Normal file
28
.clang-format
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
AllowShortBlocksOnASingleLine: 'true'
|
||||||
|
AllowShortCaseLabelsOnASingleLine: 'true'
|
||||||
|
AllowShortIfStatementsOnASingleLine: 'true'
|
||||||
|
AllowShortLoopsOnASingleLine: 'true'
|
||||||
|
AlwaysBreakAfterReturnType: TopLevel
|
||||||
|
AccessModifierOffset: -8
|
||||||
|
BreakBeforeBraces: Linux
|
||||||
|
ColumnLimit: 160
|
||||||
|
IndentCaseLabels: 'false'
|
||||||
|
IndentWidth: '8'
|
||||||
|
Language: Cpp
|
||||||
|
PointerAlignment: Right
|
||||||
|
SpaceAfterCStyleCast: 'false'
|
||||||
|
SpaceBeforeAssignmentOperators: 'true'
|
||||||
|
SpaceBeforeCtorInitializerColon: 'true'
|
||||||
|
SpaceBeforeInheritanceColon: 'true'
|
||||||
|
SpaceBeforeParens: Never
|
||||||
|
SpaceInEmptyParentheses: 'false'
|
||||||
|
SpacesInAngles: 'false'
|
||||||
|
SpacesInCStyleCastParentheses: 'false'
|
||||||
|
SpacesInContainerLiterals: 'false'
|
||||||
|
SpacesInParentheses: 'false'
|
||||||
|
SpacesInSquareBrackets: 'false'
|
||||||
|
TabWidth: '8'
|
||||||
|
UseTab: ForIndentation
|
||||||
|
|
||||||
|
...
|
41
.travis.yml
41
.travis.yml
@ -1,15 +1,44 @@
|
|||||||
language: cpp
|
language: cpp
|
||||||
os: linux
|
|
||||||
dist: focal
|
dist: focal
|
||||||
matrix:
|
os: linux
|
||||||
|
jobs:
|
||||||
include:
|
include:
|
||||||
- env: TARGET=release_linux-amd64-librw_gl3_glfw-oal
|
- env: TARGET=release_linux-amd64-librw_gl3_glfw-oal
|
||||||
|
os: linux
|
||||||
- env: TARGET=debug_linux-amd64-librw_gl3_glfw-oal
|
- env: TARGET=debug_linux-amd64-librw_gl3_glfw-oal
|
||||||
|
os: linux
|
||||||
|
- env: TARGET=release_macosx-amd64-librw_gl3_glfw-oal PREMAKE5=premake-5.0.0-alpha15
|
||||||
|
compiler: clang
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode12u
|
||||||
|
- env: TARGET=debug_macosx-amd64-librw_gl3_glfw-oal PREMAKE5=premake-5.0.0-alpha15
|
||||||
|
compiler: clang
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode12u
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
update: true
|
||||||
|
packages:
|
||||||
|
- linux-libc-dev
|
||||||
|
- libopenal-dev
|
||||||
|
- libglew-dev
|
||||||
|
- libglfw3-dev
|
||||||
|
- libsndfile1-dev
|
||||||
|
- libmpg123-dev
|
||||||
|
- gcc-8-multilib
|
||||||
|
- g++-8-multilib
|
||||||
|
homebrew:
|
||||||
|
packages:
|
||||||
|
- libsndfile
|
||||||
|
- mpg123
|
||||||
|
- glew
|
||||||
|
- glfw
|
||||||
|
- openal-soft
|
||||||
script:
|
script:
|
||||||
- sudo apt-get update
|
|
||||||
- sudo apt-get -y install linux-libc-dev libopenal-dev libglew-dev libglfw3-dev libsndfile1-dev libmpg123-dev gcc-8-multilib g++-8-multilib
|
|
||||||
- mkdir -p "$TRAVIS_BUILD_DIR/build"
|
- mkdir -p "$TRAVIS_BUILD_DIR/build"
|
||||||
- cd "$TRAVIS_BUILD_DIR"
|
- cd "$TRAVIS_BUILD_DIR"
|
||||||
- ./premake5Linux --with-librw gmake2
|
- if [ "$TRAVIS_OS_NAME" = linux ]; then ./premake5Linux --with-librw gmake2; fi
|
||||||
|
- if [ "$TRAVIS_OS_NAME" = osx ]; then curl -L -o "${PREMAKE5}.zip" "https://github.com/premake/premake-core/releases/download/v5.0.0-alpha15/${PREMAKE5}-src.zip" && unzip -q "${PREMAKE5}.zip" && cd "$PREMAKE5" && make -f Bootstrap.mak osx && cd .. && "./${PREMAKE5}/bin/release/premake5" --with-librw gmake2; fi
|
||||||
- cd build
|
- cd build
|
||||||
- CC=gcc-8 CXX=g++-8 make config=$TARGET -j4 verbose=1
|
- if [ "$TRAVIS_OS_NAME" = linux ]; then env CC=gcc-8 CXX=g++-8 make config=$TARGET -j4 verbose=1; fi
|
||||||
|
- if [ "$TRAVIS_OS_NAME" = osx ]; then make config=$TARGET -j4 verbose=1; fi
|
||||||
|
44
CMakeLists.txt
Normal file
44
CMakeLists.txt
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
|
||||||
|
project(re3 C CXX)
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set(RE3_AUDIOS "NULL" "OAL" "MSS")
|
||||||
|
else()
|
||||||
|
set(RE3_AUDIOS "NULL" "OAL")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(RE3_AUDIO "OAL" CACHE STRING "Audio")
|
||||||
|
|
||||||
|
set_property(CACHE RE3_AUDIO PROPERTY STRINGS ${RE3_AUDIOS})
|
||||||
|
message(STATUS "RE3_AUDIO = ${RE3_AUDIO} (choices=${RE3_AUDIOS})")
|
||||||
|
set("RE3_AUDIO_${RE3_AUDIO}" ON)
|
||||||
|
if(NOT RE3_AUDIO IN_LIST RE3_AUDIOS)
|
||||||
|
message(FATAL_ERROR "Illegal RE3_AUDIO=${RE3_AUDIO}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(RE3_INSTALL)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
set(RE3_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/re3")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory("vendor/librw")
|
||||||
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if(RE3_INSTALL)
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
configure_package_config_file(re3-config.cmake.in re3-config.cmake
|
||||||
|
INSTALL_DESTINATION "${CMAKE_INSTALL_PREFIX}"
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
FILES "${CMAKE_CURRENT_BINARY_DIR}/re3-config.cmake"
|
||||||
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
EXPORT re3-targets
|
||||||
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
|
||||||
|
)
|
||||||
|
|
||||||
|
include(CMakeCPack.cmake)
|
||||||
|
endif()
|
107
CODING_STYLE.md
Normal file
107
CODING_STYLE.md
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
# Coding style
|
||||||
|
|
||||||
|
I started writing in [Plan 9 style](http://man.cat-v.org/plan_9/6/style),
|
||||||
|
but realize that this is not the most popular style, so I'm willing to compromise.
|
||||||
|
Try not to deviate too much so the code will look similar across the whole project.
|
||||||
|
|
||||||
|
To give examples, these two styles (or anything in between) are fine:
|
||||||
|
|
||||||
|
```
|
||||||
|
type
|
||||||
|
functionname(args)
|
||||||
|
{
|
||||||
|
if(a == b){
|
||||||
|
s1;
|
||||||
|
s2;
|
||||||
|
}else{
|
||||||
|
s3;
|
||||||
|
s4;
|
||||||
|
}
|
||||||
|
if(x != y)
|
||||||
|
s5;
|
||||||
|
}
|
||||||
|
|
||||||
|
type functionname(args)
|
||||||
|
{
|
||||||
|
if (a == b) {
|
||||||
|
s1;
|
||||||
|
s2;
|
||||||
|
} else {
|
||||||
|
s3;
|
||||||
|
s4;
|
||||||
|
}
|
||||||
|
if (x != y)
|
||||||
|
s5;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This one (or anything more extreme) is heavily discouraged:
|
||||||
|
|
||||||
|
```
|
||||||
|
type functionname ( args )
|
||||||
|
{
|
||||||
|
if ( a == b )
|
||||||
|
{
|
||||||
|
s1;
|
||||||
|
s2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s3;
|
||||||
|
s4;
|
||||||
|
}
|
||||||
|
if ( x != y )
|
||||||
|
{
|
||||||
|
s5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
i.e.
|
||||||
|
|
||||||
|
* Put the brace on the same line as control statements
|
||||||
|
|
||||||
|
* Put the brace on the next line after function definitions and structs/classes
|
||||||
|
|
||||||
|
* Put an `else` on the same line with the braces
|
||||||
|
|
||||||
|
* Don't put braces around single statements
|
||||||
|
|
||||||
|
* Put the function return type on a separate line
|
||||||
|
|
||||||
|
* Indent with TABS
|
||||||
|
|
||||||
|
As for the less cosmetic choices, here are some guidelines how the code should look:
|
||||||
|
|
||||||
|
* Don't use magic numbers where the original source code would have had an enum or similar.
|
||||||
|
Even if you don't know the exact meaning it's better to call something `FOOBAR_TYPE_4` than just `4`,
|
||||||
|
since `4` will be used in other places and you can't easily see where else the enum value is used.
|
||||||
|
|
||||||
|
* Don't just copy paste code from IDA, make it look nice
|
||||||
|
|
||||||
|
* Use the right types. In particular:
|
||||||
|
|
||||||
|
* don't use types like `__int16`, we have `int16` for that
|
||||||
|
|
||||||
|
* don't use `unsigned`, we have typedefs for that
|
||||||
|
|
||||||
|
* don't use `char` for anything but actual characters, use `int8`, `uint8` or `bool`
|
||||||
|
|
||||||
|
* don't even think about using win32 types (`BYTE`, `WORD`, &c.) unless you're writing win32 specific code
|
||||||
|
|
||||||
|
* declare pointers like `int *ptr;`, not `int* ptr;`
|
||||||
|
|
||||||
|
* As for variable names, the original gta source code was not written in a uniform style,
|
||||||
|
but here are some observations:
|
||||||
|
|
||||||
|
* many variables employ a form of hungarian notation, i.e.:
|
||||||
|
|
||||||
|
* `m_` may be used for class member variables (mostly those that are considered private)
|
||||||
|
|
||||||
|
* `ms_` for (mostly private) static members
|
||||||
|
|
||||||
|
* `f` is a float, `i` or `n` is an integer, `b` is a boolean, `a` is an array
|
||||||
|
|
||||||
|
* do *not* use `dw` for `DWORD` or so, we're not programming win32
|
||||||
|
|
||||||
|
* Generally, try to make the code look as if R* could have written it
|
147
README.md
147
README.md
@ -1,10 +1,6 @@
|
|||||||
# re3
|
# re3
|
||||||
[](https://ci.appveyor.com/project/aap/re3/branch/master)
|
[](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=master)
|
||||||
<a href="https://discord.gg/jYpXxTm"><img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" /></a>
|
<a href="https://discord.gg/aKYAwCx92H"><img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" /></a>
|
||||||
| Platform | Debug | Release |
|
|
||||||
|------------------|-------------|-------------|
|
|
||||||
| Windows Direct3D9 | [](https://bintray.com/gtamodding/re3/Debug_win-x86-librw_d3d9-mss/_latestVersion) | [](https://bintray.com/gtamodding/re3/Release_win-x86-librw_d3d9-mss/_latestVersion) |
|
|
||||||
| Windows OpenGL3.3 | [](https://bintray.com/gtamodding/re3/Debug_win-x86-librw_gl3_glfw-mss/_latestVersion) | [](https://bintray.com/gtamodding/re3/Release_win-x86-librw_gl3_glfw-mss/_latestVersion) |
|
|
||||||
|
|
||||||
## Intro
|
## Intro
|
||||||
|
|
||||||
@ -21,133 +17,38 @@ such that we have a working game at all times.
|
|||||||
|
|
||||||
## Preparing the environment for building
|
## Preparing the environment for building
|
||||||
|
|
||||||
- Clone the repo.
|
You may want to point GTA_III_RE_DIR environment variable to GTA3 root folder if you want executable to be moved there via post-build script.
|
||||||
- Run `git submodule init` and `git submodule update`.
|
|
||||||
- Point GTA_III_RE_DIR environment variable to GTA3 root folder.
|
|
||||||
- Run premake
|
|
||||||
- On Windows: one of the `premake-vsXXXX.cmd` variants on root folder
|
|
||||||
- On Linux: proceed to [Building on Linux](https://github.com/GTAmodding/re3/wiki/Building-on-Linux).
|
|
||||||
- There are various settings at the very bottom of [config.h](https://github.com/GTAmodding/re3/tree/master/src/core/config.h), you may want to take a look there. i.e. FIX_BUGS define fixes the bugs we've come across.
|
|
||||||
- **If you use 64-bit D3D9**: We don't ship 64-bit Dx9 SDK. You need to download it from Microsoft if you don't have it(although it should come pre-installed after some Windows version)
|
|
||||||
|
|
||||||
|
- For Linux, proceed: [Building on Linux](https://github.com/GTAmodding/re3/wiki/Building-on-Linux)
|
||||||
|
- For FreeBSD, proceed: [Building on FreeBSD](https://github.com/GTAmodding/re3/wiki/Building-on-FreeBSD)
|
||||||
|
- For Windows, assuming you have Visual Studio:
|
||||||
|
- Clone the repo using the argument `--recursive`.
|
||||||
|
- Run one of the `premake-vsXXXX.cmd` variants on root folder.
|
||||||
|
- Open the project via Visual Studio
|
||||||
|
|
||||||
|
**If you use 64-bit D3D9**: We don't ship 64-bit Dx9 SDK. You need to download it from Microsoft if you don't have it(although it should come pre-installed after some Windows version)
|
||||||
|
|
||||||
|
There are various settings at the very bottom of [config.h](https://github.com/GTAmodding/re3/tree/master/src/core/config.h), you may want to take a look there. i.e. FIX_BUGS define fixes the bugs we've come across.
|
||||||
|
|
||||||
> :information_source: **If you choose OpenAL on Windows** You must read [Running OpenAL build on Windows](https://github.com/GTAmodding/re3/wiki/Running-OpenAL-build-on-Windows).
|
> :information_source: **If you choose OpenAL on Windows** You must read [Running OpenAL build on Windows](https://github.com/GTAmodding/re3/wiki/Running-OpenAL-build-on-Windows).
|
||||||
|
|
||||||
> :information_source: **Did you notice librw?** re3 uses completely homebrew RenderWare-replacement rendering engine; [librw](https://github.com/aap/librw/). librw comes as submodule of re3, but you also can use LIBRW enviorenment variable to specify path to your own librw.
|
> :information_source: **Did you notice librw?** re3 uses completely homebrew RenderWare-replacement rendering engine; [librw](https://github.com/aap/librw/). librw comes as submodule of re3, but you also can use LIBRW enviorenment variable to specify path to your own librw.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
Please read the [Coding Style](https://github.com/GTAmodding/re3/blob/master/CODING_STYLE.md) Document
|
||||||
|
|
||||||
### Unreversed / incomplete classes (at least the ones we know)
|
### Unreversed / incomplete classes (at least the ones we know)
|
||||||
The following classes have only unused or practically unused code left:
|
The following classes have only unused or practically unused code left:
|
||||||
```
|
```
|
||||||
CCullZone - only mobile stuff
|
CMemoryHeap - only on PS2
|
||||||
CCullZones - only mobile stuff
|
NameGrid.cpp - only on mobile (a player name grid, either a very early player name code ala GTA1 or a multiplayer leftover)
|
||||||
|
PedDebug.cpp - only on mobile (debug code)
|
||||||
|
HandlingMgr.cpp - debug functions from mobile
|
||||||
|
CVehicle::ProcessBikeWheel - early bike code (only on mobile)
|
||||||
|
CAutomobile::DebugCode - debug function from mobile
|
||||||
|
CBoat::DebugCode - debug function from mobile
|
||||||
|
CBoat::ModifyHandlingValue - debug function from mobile
|
||||||
|
CBoat::DisplayHandlingData - debug function from mobile
|
||||||
|
TexturePools - only on PC (slight RW modification that we don't actually need)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Coding style
|
|
||||||
|
|
||||||
I started writing in [Plan 9 style](http://man.cat-v.org/plan_9/6/style),
|
|
||||||
but realize that this is not the most popular style, so I'm willing to compromise.
|
|
||||||
Try not to deviate too much so the code will look similar across the whole project.
|
|
||||||
|
|
||||||
To give examples, these two styles (or anything in between) are fine:
|
|
||||||
|
|
||||||
```
|
|
||||||
type
|
|
||||||
functionname(args)
|
|
||||||
{
|
|
||||||
if(a == b){
|
|
||||||
s1;
|
|
||||||
s2;
|
|
||||||
}else{
|
|
||||||
s3;
|
|
||||||
s4;
|
|
||||||
}
|
|
||||||
if(x != y)
|
|
||||||
s5;
|
|
||||||
}
|
|
||||||
|
|
||||||
type functionname(args)
|
|
||||||
{
|
|
||||||
if (a == b) {
|
|
||||||
s1;
|
|
||||||
s2;
|
|
||||||
} else {
|
|
||||||
s3;
|
|
||||||
s4;
|
|
||||||
}
|
|
||||||
if (x != y)
|
|
||||||
s5;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
This one (or anything more extreme) is heavily discouraged:
|
|
||||||
|
|
||||||
```
|
|
||||||
type functionname ( args )
|
|
||||||
{
|
|
||||||
if ( a == b )
|
|
||||||
{
|
|
||||||
s1;
|
|
||||||
s2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s3;
|
|
||||||
s4;
|
|
||||||
}
|
|
||||||
if ( x != y )
|
|
||||||
{
|
|
||||||
s5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
i.e.
|
|
||||||
|
|
||||||
* Put the brace on the same line as control statements
|
|
||||||
|
|
||||||
* Put the brace on the next line after function definitions and structs/classes
|
|
||||||
|
|
||||||
* Put an `else` on the same line with the braces
|
|
||||||
|
|
||||||
* Don't put braces around single statements
|
|
||||||
|
|
||||||
* Put the function return type on a separate line
|
|
||||||
|
|
||||||
* Indent with TABS
|
|
||||||
|
|
||||||
As for the less cosmetic choices, here are some guidelines how the code should look:
|
|
||||||
|
|
||||||
* Don't use magic numbers where the original source code would have had an enum or similar.
|
|
||||||
Even if you don't know the exact meaning it's better to call something `FOOBAR_TYPE_4` than just `4`,
|
|
||||||
since `4` will be used in other places and you can't easily see where else the enum value is used.
|
|
||||||
|
|
||||||
* Don't just copy paste code from IDA, make it look nice
|
|
||||||
|
|
||||||
* Use the right types. In particular:
|
|
||||||
|
|
||||||
* don't use types like `__int16`, we have `int16` for that
|
|
||||||
|
|
||||||
* don't use `unsigned`, we have typedefs for that
|
|
||||||
|
|
||||||
* don't use `char` for anything but actual characters, use `int8`, `uint8` or `bool`
|
|
||||||
|
|
||||||
* don't even think about using win32 types (`BYTE`, `WORD`, &c.) unless you're writing win32 specific code
|
|
||||||
|
|
||||||
* declare pointers like `int *ptr;`, not `int* ptr;`
|
|
||||||
|
|
||||||
* As for variable names, the original gta source code was not written in a uniform style,
|
|
||||||
but here are some observations:
|
|
||||||
|
|
||||||
* many variables employ a form of hungarian notation, i.e.:
|
|
||||||
|
|
||||||
* `m_` may be used for class member variables (mostly those that are considered private)
|
|
||||||
|
|
||||||
* `ms_` for (mostly private) static members
|
|
||||||
|
|
||||||
* `f` is a float, `i` or `n` is an integer, `b` is a boolean, `a` is an array
|
|
||||||
|
|
||||||
* do *not* use `dw` for `DWORD` or so, we're not programming win32
|
|
||||||
|
|
||||||
* Generally, try to make the code look as if R* could have written it
|
|
||||||
|
28
cmake/FindMPG123.cmake
Normal file
28
cmake/FindMPG123.cmake
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# - Find mpg123
|
||||||
|
# Find the native mpg123 includes and library
|
||||||
|
#
|
||||||
|
# MPG123_INCLUDE_DIR - where to find mpg123.h
|
||||||
|
# MPG123_LIBRARIES - List of libraries when using mpg123.
|
||||||
|
# MPG123_FOUND - True if mpg123 found.
|
||||||
|
|
||||||
|
IF(MPG123_INCLUDE_DIR AND MPG123_LIBRARIES)
|
||||||
|
# Already in cache, be silent
|
||||||
|
SET(MPG123_FIND_QUIETLY TRUE)
|
||||||
|
ENDIF(MPG123_INCLUDE_DIR AND MPG123_LIBRARIES)
|
||||||
|
|
||||||
|
FIND_PATH(MPG123_INCLUDE_DIR mpg123.h
|
||||||
|
PATHS "${MPG123_DIR}"
|
||||||
|
PATH_SUFFIXES include
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(MPG123_LIBRARIES NAMES mpg123 mpg123-0
|
||||||
|
PATHS "${MPG123_DIR}"
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
)
|
||||||
|
|
||||||
|
# MARK_AS_ADVANCED(MPG123_LIBRARIES MPG123_INCLUDE_DIR)
|
||||||
|
|
||||||
|
# handle the QUIETLY and REQUIRED arguments and set MPG123_FOUND to TRUE if
|
||||||
|
# all listed variables are TRUE
|
||||||
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(MPG123 DEFAULT_MSG MPG123_LIBRARIES MPG123_INCLUDE_DIR)
|
67
cmake/FindSndFile.cmake
Normal file
67
cmake/FindSndFile.cmake
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# Found on http://hg.kvats.net
|
||||||
|
#
|
||||||
|
# - Try to find libsndfile
|
||||||
|
#
|
||||||
|
# Once done this will define
|
||||||
|
#
|
||||||
|
# SNDFILE_FOUND - system has libsndfile
|
||||||
|
# SNDFILE_INCLUDE_DIRS - the libsndfile include directory
|
||||||
|
# SNDFILE_LIBRARIES - Link these to use libsndfile
|
||||||
|
#
|
||||||
|
# Copyright (C) 2006 Wengo
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the New
|
||||||
|
# BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
#
|
||||||
|
|
||||||
|
if (SNDFILE_LIBRARIES AND SNDFILE_INCLUDE_DIRS)
|
||||||
|
# in cache already
|
||||||
|
set(SNDFILE_FOUND TRUE)
|
||||||
|
else (SNDFILE_LIBRARIES AND SNDFILE_INCLUDE_DIRS)
|
||||||
|
|
||||||
|
find_path(SNDFILE_INCLUDE_DIR
|
||||||
|
NAMES
|
||||||
|
sndfile.h
|
||||||
|
PATHS
|
||||||
|
/usr/include
|
||||||
|
/usr/local/include
|
||||||
|
/opt/local/include
|
||||||
|
/sw/include
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(SNDFILE_LIBRARY
|
||||||
|
NAMES
|
||||||
|
sndfile
|
||||||
|
PATHS
|
||||||
|
/usr/lib
|
||||||
|
/usr/local/lib
|
||||||
|
/opt/local/lib
|
||||||
|
/sw/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SNDFILE_INCLUDE_DIRS
|
||||||
|
${SNDFILE_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
set(SNDFILE_LIBRARIES
|
||||||
|
${SNDFILE_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (SNDFILE_INCLUDE_DIRS AND SNDFILE_LIBRARIES)
|
||||||
|
set(SNDFILE_FOUND TRUE)
|
||||||
|
endif (SNDFILE_INCLUDE_DIRS AND SNDFILE_LIBRARIES)
|
||||||
|
|
||||||
|
if (SNDFILE_FOUND)
|
||||||
|
if (NOT SndFile_FIND_QUIETLY)
|
||||||
|
message(STATUS "Found libsndfile: ${SNDFILE_LIBRARIES}")
|
||||||
|
endif (NOT SndFile_FIND_QUIETLY)
|
||||||
|
else (SNDFILE_FOUND)
|
||||||
|
if (SndFile_FIND_REQUIRED)
|
||||||
|
message(FATAL_ERROR "Could not find libsndfile")
|
||||||
|
endif (SndFile_FIND_REQUIRED)
|
||||||
|
endif (SNDFILE_FOUND)
|
||||||
|
|
||||||
|
# show the SNDFILE_INCLUDE_DIRS and SNDFILE_LIBRARIES variables only in the advanced view
|
||||||
|
mark_as_advanced(SNDFILE_INCLUDE_DIRS SNDFILE_LIBRARIES)
|
||||||
|
|
||||||
|
endif (SNDFILE_LIBRARIES AND SNDFILE_INCLUDE_DIRS)
|
Binary file not shown.
Binary file not shown.
199
gamefiles/gamecontrollerdb.txt
Normal file
199
gamefiles/gamecontrollerdb.txt
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
# Windows - DINPUT
|
||||||
|
8f0e1200000000000000504944564944,Acme,platform:Windows,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||||
|
6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
0d0f6e00000000000000504944564944,HORIPAD 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,
|
||||||
|
4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,
|
||||||
|
25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,
|
||||||
|
4c05c405000000000000504944564944,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
6d0418c2000000000000504944564944,Logitech RumblePad 2 USB,platform:Windows,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
36280100000000000000504944564944,OUYA Controller,platform:Windows,a:b0,b:b3,y:b2,x:b1,start:b14,guide:b15,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b8,dpleft:b10,dpdown:b9,dpright:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b12,righttrigger:b13,
|
||||||
|
4f0400b3000000000000504944564944,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Windows,
|
||||||
|
00f00300000000000000504944564944,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
00f0f100000000000000504944564944,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
28040140000000000000504944564944,GamePad Pro USB,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7,
|
||||||
|
ff113133000000000000504944564944,SVEN X-PAD,platform:Windows,a:b2,b:b3,y:b1,x:b0,start:b5,back:b4,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b8,righttrigger:b9,
|
||||||
|
8f0e0300000000000000504944564944,Piranha xtreme,platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
8f0e0d31000000000000504944564944,Multilaser JS071 USB,platform:Windows,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
10080300000000000000504944564944,PS2 USB,platform:Windows,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a4,righty:a2,lefttrigger:b4,righttrigger:b5,
|
||||||
|
79000600000000000000504944564944,G-Shark GS-GP702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
4b12014d000000000000504944564944,NYKO AIRFLO,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftstick:a0,rightstick:a2,leftshoulder:a3,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:h0.6,lefty:h0.12,rightx:h0.9,righty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
d6206dca000000000000504944564944,PowerA Pro Ex,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide:b10,back:b5,leftstick:b8,rightstick:b9,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows,
|
||||||
|
4f0415b3000000000000504944564944,Thrustmaster Dual Analog 3.2,platform:Windows,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
6f0e1e01000000000000504944564944,Rock Candy Gamepad for PS3,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
83056020000000000000504944564944,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,y:b2,x:b3,start:b7,back:b6,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
10080100000000000000504944564944,PS1 USB,platform:Windows,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows,
|
||||||
|
4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
79004318000000000000504944564944,Mayflash GameCube Controller Adapter,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b0,start:b9,guide:b0,leftshoulder:b4,rightshoulder:b7,leftstick:b0,rightstick:b0,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
300f1001000000000000504944564944,Saitek P480 Rumble Pad,a:b2,b:b3,x:b0,y:b1,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b5,righttrigger:b7,platform:Windows,
|
||||||
|
10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,y:b3,x:b4,start:b11,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,platform:Windows,
|
||||||
|
63252305000000000000504944564944,USB Vibration Joystick (BM),platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
20380900000000000000504944564944,8Bitdo NES30 PRO Wireless,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,
|
||||||
|
02200090000000000000504944564944,8Bitdo NES30 PRO USB,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,
|
||||||
|
ff113133000000000000504944564944,Gembird JPD-DualForce,platform:Windows,a:b2,b:b3,x:b0,y:b1,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,leftstick:b10,rightstick:b11,
|
||||||
|
341a0108000000000000504944564944,EXEQ RF USB Gamepad 8206,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,leftstick:b8,rightstick:b7,back:b8,start:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows,
|
||||||
|
c0111352000000000000504944564944,Battalife Joystick,platform:Windows,x:b4,a:b6,b:b7,y:b5,back:b2,start:b3,leftshoulder:b0,rightshoulder:b1,leftx:a0,lefty:a1,
|
||||||
|
100801e5000000000000504944564944,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
4c05cc09000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows,
|
||||||
|
4c05a00b000000000000504944564944,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows,
|
||||||
|
|
||||||
|
# OS X
|
||||||
|
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
|
||||||
|
4c05000000000000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
891600000000000000fd000000000000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b8,guide:b10,back:b9,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b11,dpleft:b13,dpdown:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Mac OS X,
|
||||||
|
4f0400000000000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Mac OS X,
|
||||||
|
8f0e0000000000000300000000000000,Piranha xtreme,platform:Mac OS X,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
0d0f0000000000004d00000000000000,HORI Gem Pad 3,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
79000000000000000600000000000000,G-Shark GP-702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,
|
||||||
|
4f0400000000000015b3000000000000,Thrustmaster Dual Analog 3.2,platform:Mac OS X,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,y:b9,x:b10,start:b6,guide:b8,back:b7,dpup:b2,dpleft:b0,dpdown:b3,dpright:b1,leftx:a0,lefty:a1,lefttrigger:b12,righttrigger:,leftshoulder:b11,platform:Mac OS X,
|
||||||
|
83050000000000006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
5e04000000000000dd02000000000000,Xbox One Wired Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,x:b18,y:b17,back:b7,guide:b8,start:b6,leftstick:b23,rightstick:b24,leftshoulder:b19,rightshoulder:b20,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b21,righttrigger:b22,platform:Mac OS X,
|
||||||
|
79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,x:b0,y:b12,back:b32,start:b36,leftstick:b40,rightstick:b44,leftshoulder:b16,rightshoulder:b20,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a8,righty:a12,lefttrigger:b24,righttrigger:b28,platform:Mac OS X,
|
||||||
|
2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,
|
||||||
|
351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
b4040000000000000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,x:b3,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
10280000000000000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
d814000000000000cecf000000000000,MC Cthulhu,platform:Mac OS X,leftx:,lefty:,rightx:,righty:,lefttrigger:b6,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,righttrigger:b7,
|
||||||
|
0d0f0000000000006600000000000000,HORIPAD FPS PLUS 4,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:a4,
|
||||||
|
5e04000000000000e002000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b10,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
79000000000000001100000000000000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a3,lefty:a4,platform:Mac OS X,
|
||||||
|
4c05000000000000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X,
|
||||||
|
5e04000000000000ea02000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
81170000000000007e05000000000000,Sega Saturn,x:b0,a:b2,b:b4,y:b6,start:b13,dpleft:b15,dpdown:b16,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,lefttrigger:b10,rightshoulder:b9,righttrigger:a4,righttrigger:b11,leftx:a0,lefty:a2,platform:Mac OS X,
|
||||||
|
bd1200000000000015d0000000000000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
03000000632500002305000000010000,Redragon Saturn,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
050000004c0500006802000000000000,Sony PLAYSTATION(R)3 Controller,platform:Linux,a:b14,b:b13,x:b15,y:b12,back:b0,guide:b16,start:b3,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpdown:b6,dpleft:b7,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a12,righttrigger:a13,
|
||||||
|
03000000ff1100004133000010010000,GreenAsia Inc.USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
|
030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
|
||||||
|
03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000004c050000c405000011010000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000006f0e00003001000001010000,EA Sports PS3 Controller,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,y:b0,x:b3,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux,
|
||||||
|
03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,y:b3,x:b1,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,
|
||||||
|
030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a5,
|
||||||
|
030000008f0e00000300000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||||
|
030000006d04000016c2000010010000,Logitech Logitech Dual Action,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,y:b3,x:b1,start:b7,leftshoulder:,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,rightstick:,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Linux,
|
||||||
|
030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,y:b4,x:b3,start:b8,guide:b5,back:b2,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b9,righttrigger:b10,platform:Linux,
|
||||||
|
030000006d04000018c2000010010000,Logitech Logitech RumblePad 2 USB,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
05000000d6200000ad0d000001000000,Moga Pro,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,
|
||||||
|
0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
030000006f0e00001f01000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000280400000140000000010000,Gravis GamePad Pro USB ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftx:a0,lefty:a1,
|
||||||
|
030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000005e0400008502000000010000,Microsoft X-Box pad (Japan),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,platform:Linux,a:b2,b:b1,y:b0,x:b3,start:b8,back:b9,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,
|
||||||
|
030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||||
|
030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,
|
||||||
|
03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||||
|
050000004c050000c405000000010000,PS4 Controller (Bluetooth),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,
|
||||||
|
050000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,
|
||||||
|
05000000504c415953544154494f4e00,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,
|
||||||
|
03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000666600000488000000010000,Super Joy Box 5 Pro,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b9,start:b8,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,dpup:b12,dpleft:b15,dpdown:b14,dpright:b13,
|
||||||
|
05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,
|
||||||
|
05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,
|
||||||
|
030000008916000001fd000024010000,Razer Onza Classic Edition,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:b11,dpdown:b14,dpright:b12,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000005e040000d102000001010000,Microsoft X-Box One pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000005e040000dd02000003020000,Microsoft X-Box One pad v2,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,
|
||||||
|
03000000790000001100000010010000,RetroLink Saturn Classic Controller,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,
|
||||||
|
050000007e0500003003000001000000,Nintendo Wii U Pro Controller,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b8,start:b9,guide:b10,leftshoulder:b4,rightshoulder:b5,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,
|
||||||
|
030000005e0400008e02000004010000,Microsoft X-Box 360 pad,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,
|
||||||
|
030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7
|
||||||
|
03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
03000000f0250000c283000010010000,Goodbetterbest Ltd PC USB Controller,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7
|
||||||
|
0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b7,back:b6,guide:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,lefttrigger:a5,righttrigger:a4,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000006f0e00001304000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:a0,rightstick:a3,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
03000000c9110000f055000011010000,HJC Game GAMEPAD,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b2,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:h0.2,righttrigger:b7,b:b1,platform:Linux,
|
||||||
|
03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux,
|
||||||
|
03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,y:b3,x:b0,start:b9,guide:,back:,leftstick:,rightstick:,leftshoulder:,dpleft:b15,dpdown:b14,dpright:b13,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,rightshoulder:b7,dpup:b12,platform:Linux,
|
||||||
|
030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,platform:Linux,x:b0,a:b2,b:b3,y:b1,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,platform:Linux,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,guide:b8,leftstick:b9,rightstick:b10,lefttrigger:a2,righttrigger:a5,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,
|
||||||
|
030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,platform:Linux,a:b0,b:b2,x:b1,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,
|
||||||
|
05000000102800000900000000010000,8Bitdo SFC30 GamePad,platform:Linux,x:b4,a:b1,b:b0,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,
|
||||||
|
03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftshoulder:b4,rightshoulder:b5,lefttrigger:b6,righttrigger:b7,leftx:a0,lefty:a1,
|
||||||
|
030000000d0f00000d00000000010000,hori,platform:Linux,a:b0,b:b6,y:b2,x:b1,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,start:b9,guide:b10,back:b8,leftshoulder:b3,rightshoulder:b7,leftx:b4,lefty:b5,
|
||||||
|
030000000d0f00006700000001010000,HORIPAD ONE,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,
|
||||||
|
03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,platform:Linux,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),platform:Linux,a:b3,b:b4,y:b1,x:b0,start:b7,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,
|
||||||
|
05000000010000000100000003000000,Nintendo Wiimote,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b9,guide:b10,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
030000005e0400008e02000062230000,Microsoft X-Box 360 pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,y:b1,x:b0,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000006f0e00000103000000020000,Logic3 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
05000000380700006652000025010000,Mad Catz C.T.R.L.R ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
06000000adde0000efbe000002010000,Hidromancer Game Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,platform:Linux,a:b12,b:b10,x:b13,y:b11,back:b4,start:b5,leftstick:b14,rightstick:b15,leftshoulder:b9,rightshoulder:b8,dpup:b0,dpdown:b2,dpleft:b3,dpright:b1,leftx:a1,lefty:a0,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
05000000a00500003232000001000000,8Bitdo Zero GamePad,platform:Linux,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,
|
||||||
|
03000000780000000600000010010000,Microntek USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftx:a0,lefty:a1,
|
||||||
|
03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:a2,righttrigger:a5,
|
||||||
|
03000000100800000300000010010000,USB Gamepad,platform:Linux,a:b2,b:b1,x:b3,y:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,
|
||||||
|
030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000001008000001e5000010010000,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
030000006d04000016c2000011010000,Logitech F310 Gamepad (DInput),x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Linux,
|
||||||
|
03000000bd12000015d0000010010000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
050000004c050000cc09000000010000,Sony DualShock 4 V2 BT,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
030000004c050000a00b000011010000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
05000000ac0500003232000001000000,VR-BOX,platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,
|
||||||
|
030000004c050000cc09000011010000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
030000004c050000cc09000011810000,Sony Interactive Entertainment Wireless Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
050000004c050000cc09000000810000,Wireless Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000004c0500006802000011810000,Sony PLAYSTATION(R)3 Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
050000004c0500006802000000810000,PLAYSTATION(R)3 Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000c82d00000190000011010000,8Bitdo NES30 Pro 8Bitdo NES30 Pro,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,
|
||||||
|
05000000c82d00002038000000010000,8Bitdo NES30 Pro,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b2,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
030000005e040000a102000000010000,Xbox 360 Wireless Receiver,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpdown:b14,dpleft:b11,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,
|
||||||
|
050000004c050000cc09000001000000,Sony DualShock 4 V2 BT,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
03000000bc2000006412000011010000,BETOP CONTROLLER,a:b2,b:b1,y:b0,x:b3,start:b9,guide:b30,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
05000000c82d00000161000000010000,8Bitdo SN30 Pro,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b2,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
03000000380700008532000010010000,MadCatz Madcatz Fightpad,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:b5,righttrigger:b7,
|
||||||
|
030000000d0f0000ee00000011010000,HORI CO.,LTD. HORIPAD mini4,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
030000000d0f0000c100000011010000,HORI CO.,LTD. HORIPAD S,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000ad1b000003f5000033050000,Hori Fighting Stick VX,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,-leftx:h0.8,+leftx:h0.2,-lefty:h0.1,+lefty:h0.4,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000c82d00000260000011010000,8Bitdo SF30 Pro 8BitDo SN30 Pro+,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b2,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b9,guide:b11,start:b10,leftstick:b12,rightstick:b13,leftshoulder:b5,rightshoulder:b6,dpup:b14,dpdown:b15,dpleft:b16,dpright:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b7,righttrigger:b8,
|
BIN
gamefiles/models/x360btns.txd
Normal file
BIN
gamefiles/models/x360btns.txd
Normal file
Binary file not shown.
84
premake5.lua
84
premake5.lua
@ -19,6 +19,11 @@ newoption {
|
|||||||
default = "vendor/glfw-3.3.2.bin.WIN32",
|
default = "vendor/glfw-3.3.2.bin.WIN32",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newoption {
|
||||||
|
trigger = "with-asan",
|
||||||
|
description = "Build with address sanitizer"
|
||||||
|
}
|
||||||
|
|
||||||
newoption {
|
newoption {
|
||||||
trigger = "with-librw",
|
trigger = "with-librw",
|
||||||
description = "Build and use librw from this solution"
|
description = "Build and use librw from this solution"
|
||||||
@ -60,6 +65,11 @@ workspace "re3"
|
|||||||
symbols "Full"
|
symbols "Full"
|
||||||
staticruntime "off"
|
staticruntime "off"
|
||||||
|
|
||||||
|
if _OPTIONS["with-asan"] then
|
||||||
|
buildoptions { "-fsanitize=address -g3 -fno-omit-frame-pointer" }
|
||||||
|
linkoptions { "-fsanitize=address" }
|
||||||
|
end
|
||||||
|
|
||||||
filter { "system:windows" }
|
filter { "system:windows" }
|
||||||
platforms {
|
platforms {
|
||||||
"win-x86-RW33_d3d8-mss",
|
"win-x86-RW33_d3d8-mss",
|
||||||
@ -82,7 +92,16 @@ workspace "re3"
|
|||||||
|
|
||||||
filter { "system:bsd" }
|
filter { "system:bsd" }
|
||||||
platforms {
|
platforms {
|
||||||
"bsd-amd64-librw_gl3_glfw-oal"
|
"bsd-x86-librw_gl3_glfw-oal",
|
||||||
|
"bsd-amd64-librw_gl3_glfw-oal",
|
||||||
|
"bsd-arm-librw_gl3_glfw-oal",
|
||||||
|
"bsd-arm64-librw_gl3_glfw-oal"
|
||||||
|
}
|
||||||
|
|
||||||
|
filter { "system:macosx" }
|
||||||
|
platforms {
|
||||||
|
"macosx-arm64-librw_gl3_glfw-oal",
|
||||||
|
"macosx-amd64-librw_gl3_glfw-oal",
|
||||||
}
|
}
|
||||||
|
|
||||||
filter "configurations:Debug"
|
filter "configurations:Debug"
|
||||||
@ -101,15 +120,26 @@ workspace "re3"
|
|||||||
filter { "platforms:bsd*" }
|
filter { "platforms:bsd*" }
|
||||||
system "bsd"
|
system "bsd"
|
||||||
|
|
||||||
|
filter { "platforms:macosx*" }
|
||||||
|
system "macosx"
|
||||||
|
|
||||||
filter { "platforms:*x86*" }
|
filter { "platforms:*x86*" }
|
||||||
architecture "x86"
|
architecture "x86"
|
||||||
|
floatingpoint "Fast"
|
||||||
|
|
||||||
filter { "platforms:*amd64*" }
|
filter { "platforms:*amd64*" }
|
||||||
architecture "amd64"
|
architecture "amd64"
|
||||||
|
floatingpoint "Fast"
|
||||||
|
|
||||||
filter { "platforms:*arm*" }
|
filter { "platforms:*arm*" }
|
||||||
architecture "ARM"
|
architecture "ARM"
|
||||||
|
|
||||||
|
filter { "platforms:macosx-arm64-*" }
|
||||||
|
buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" }
|
||||||
|
|
||||||
|
filter { "platforms:macosx-amd64-*" }
|
||||||
|
buildoptions { "-target", "x86_64-apple-macos10.12", "-std=gnu++14" }
|
||||||
|
|
||||||
filter { "platforms:*librw_d3d9*" }
|
filter { "platforms:*librw_d3d9*" }
|
||||||
defines { "RW_D3D9" }
|
defines { "RW_D3D9" }
|
||||||
if(not _OPTIONS["with-librw"]) then
|
if(not _OPTIONS["with-librw"]) then
|
||||||
@ -159,10 +189,32 @@ project "librw"
|
|||||||
files { path.join(Librw, "src/*.*") }
|
files { path.join(Librw, "src/*.*") }
|
||||||
files { path.join(Librw, "src/*/*.*") }
|
files { path.join(Librw, "src/*/*.*") }
|
||||||
|
|
||||||
|
filter { "platforms:*x86*" }
|
||||||
|
architecture "x86"
|
||||||
|
floatingpoint "Fast"
|
||||||
|
|
||||||
|
filter { "platforms:*amd64*" }
|
||||||
|
architecture "amd64"
|
||||||
|
floatingpoint "Fast"
|
||||||
|
|
||||||
|
filter "platforms:win*"
|
||||||
|
staticruntime "on"
|
||||||
|
buildoptions { "/Zc:sizedDealloc-" }
|
||||||
|
|
||||||
filter "platforms:bsd*"
|
filter "platforms:bsd*"
|
||||||
includedirs { "/usr/local/include" }
|
includedirs { "/usr/local/include" }
|
||||||
libdirs { "/usr/local/lib" }
|
libdirs { "/usr/local/lib" }
|
||||||
|
|
||||||
|
filter "platforms:macosx*"
|
||||||
|
-- Support MacPorts and Homebrew
|
||||||
|
includedirs { "/opt/local/include" }
|
||||||
|
includedirs {"/usr/local/include" }
|
||||||
|
libdirs { "/opt/local/lib" }
|
||||||
|
libdirs { "/usr/local/lib" }
|
||||||
|
|
||||||
|
filter "platforms:*gl3_glfw*"
|
||||||
|
staticruntime "off"
|
||||||
|
|
||||||
filter "platforms:*RW33*"
|
filter "platforms:*RW33*"
|
||||||
flags { "ExcludeFromBuild" }
|
flags { "ExcludeFromBuild" }
|
||||||
filter {}
|
filter {}
|
||||||
@ -182,6 +234,8 @@ project "re3"
|
|||||||
files { addSrcFiles("src/audio") }
|
files { addSrcFiles("src/audio") }
|
||||||
files { addSrcFiles("src/audio/eax") }
|
files { addSrcFiles("src/audio/eax") }
|
||||||
files { addSrcFiles("src/audio/oal") }
|
files { addSrcFiles("src/audio/oal") }
|
||||||
|
files { addSrcFiles("src/buildings") }
|
||||||
|
files { addSrcFiles("src/collision") }
|
||||||
files { addSrcFiles("src/control") }
|
files { addSrcFiles("src/control") }
|
||||||
files { addSrcFiles("src/core") }
|
files { addSrcFiles("src/core") }
|
||||||
files { addSrcFiles("src/entities") }
|
files { addSrcFiles("src/entities") }
|
||||||
@ -204,6 +258,8 @@ project "re3"
|
|||||||
includedirs { "src/audio" }
|
includedirs { "src/audio" }
|
||||||
includedirs { "src/audio/eax" }
|
includedirs { "src/audio/eax" }
|
||||||
includedirs { "src/audio/oal" }
|
includedirs { "src/audio/oal" }
|
||||||
|
includedirs { "src/buildings" }
|
||||||
|
includedirs { "src/collision" }
|
||||||
includedirs { "src/control" }
|
includedirs { "src/control" }
|
||||||
includedirs { "src/core" }
|
includedirs { "src/core" }
|
||||||
includedirs { "src/entities" }
|
includedirs { "src/entities" }
|
||||||
@ -252,9 +308,17 @@ project "re3"
|
|||||||
filter "platforms:win*"
|
filter "platforms:win*"
|
||||||
files { addSrcFiles("src/skel/win") }
|
files { addSrcFiles("src/skel/win") }
|
||||||
includedirs { "src/skel/win" }
|
includedirs { "src/skel/win" }
|
||||||
|
buildoptions { "/Zc:sizedDealloc-" }
|
||||||
linkoptions "/SAFESEH:NO"
|
linkoptions "/SAFESEH:NO"
|
||||||
characterset ("MBCS")
|
characterset ("MBCS")
|
||||||
targetextension ".exe"
|
targetextension ".exe"
|
||||||
|
if(_OPTIONS["with-librw"]) then
|
||||||
|
-- external librw is dynamic
|
||||||
|
staticruntime "on"
|
||||||
|
end
|
||||||
|
|
||||||
|
filter "platforms:win*glfw*"
|
||||||
|
staticruntime "off"
|
||||||
|
|
||||||
filter "platforms:win*oal"
|
filter "platforms:win*oal"
|
||||||
includedirs { "vendor/openal-soft/include" }
|
includedirs { "vendor/openal-soft/include" }
|
||||||
@ -277,6 +341,11 @@ project "re3"
|
|||||||
filter "platforms:bsd*oal"
|
filter "platforms:bsd*oal"
|
||||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||||
|
|
||||||
|
filter "platforms:macosx*oal"
|
||||||
|
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||||
|
includedirs { "/usr/local/opt/openal-soft/include" }
|
||||||
|
libdirs { "/usr/local/opt/openal-soft/lib" }
|
||||||
|
|
||||||
if _OPTIONS["with-opus"] then
|
if _OPTIONS["with-opus"] then
|
||||||
filter {}
|
filter {}
|
||||||
links { "libogg" }
|
links { "libogg" }
|
||||||
@ -285,7 +354,6 @@ project "re3"
|
|||||||
end
|
end
|
||||||
|
|
||||||
filter "platforms:*RW33*"
|
filter "platforms:*RW33*"
|
||||||
staticruntime "on"
|
|
||||||
includedirs { "sdk/rwsdk/include/d3d8" }
|
includedirs { "sdk/rwsdk/include/d3d8" }
|
||||||
libdirs { "sdk/rwsdk/lib/d3d8/release" }
|
libdirs { "sdk/rwsdk/lib/d3d8/release" }
|
||||||
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" }
|
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" }
|
||||||
@ -303,15 +371,13 @@ project "re3"
|
|||||||
links { "rw" }
|
links { "rw" }
|
||||||
|
|
||||||
filter "platforms:*d3d9*"
|
filter "platforms:*d3d9*"
|
||||||
|
defines { "USE_D3D9" }
|
||||||
links { "d3d9" }
|
links { "d3d9" }
|
||||||
|
|
||||||
filter "platforms:*x86*d3d*"
|
filter "platforms:*x86*d3d*"
|
||||||
includedirs { "sdk/dx8sdk/include" }
|
includedirs { "sdk/dx8sdk/include" }
|
||||||
libdirs { "sdk/dx8sdk/lib" }
|
libdirs { "sdk/dx8sdk/lib" }
|
||||||
|
|
||||||
filter "platforms:*amd64*d3d9*"
|
|
||||||
defines { "USE_D3D9" }
|
|
||||||
|
|
||||||
filter "platforms:win-x86*gl3_glfw*"
|
filter "platforms:win-x86*gl3_glfw*"
|
||||||
libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") }
|
libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") }
|
||||||
libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
||||||
@ -329,3 +395,11 @@ project "re3"
|
|||||||
links { "GL", "GLEW", "glfw", "sysinfo" }
|
links { "GL", "GLEW", "glfw", "sysinfo" }
|
||||||
includedirs { "/usr/local/include" }
|
includedirs { "/usr/local/include" }
|
||||||
libdirs { "/usr/local/lib" }
|
libdirs { "/usr/local/lib" }
|
||||||
|
|
||||||
|
filter "platforms:macosx*gl3_glfw*"
|
||||||
|
links { "GLEW", "glfw" }
|
||||||
|
linkoptions { "-framework OpenGL" }
|
||||||
|
includedirs { "/opt/local/include" }
|
||||||
|
includedirs { "/usr/local/include" }
|
||||||
|
libdirs { "/opt/local/lib" }
|
||||||
|
libdirs { "/usr/local/lib" }
|
||||||
|
113
src/CMakeLists.txt
Normal file
113
src/CMakeLists.txt
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
if(${RE3_AUDIO} STREQUAL "OAL")
|
||||||
|
find_package(OpenAL REQUIRED)
|
||||||
|
find_package(MPG123 REQUIRED)
|
||||||
|
find_package(SndFile REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(GLOB_RECURSE Sources "*.cpp" "*.h")
|
||||||
|
|
||||||
|
MACRO(HEADER_DIRECTORIES return_list)
|
||||||
|
FILE(GLOB_RECURSE new_list *.cpp)
|
||||||
|
SET(dir_list "animation"
|
||||||
|
"audio"
|
||||||
|
"collision"
|
||||||
|
"control"
|
||||||
|
"core"
|
||||||
|
"entities"
|
||||||
|
"extras"
|
||||||
|
"fakerw"
|
||||||
|
"math"
|
||||||
|
"modelinfo"
|
||||||
|
"objects"
|
||||||
|
"peds"
|
||||||
|
"render"
|
||||||
|
"rw"
|
||||||
|
"save"
|
||||||
|
"skel"
|
||||||
|
"text"
|
||||||
|
"vehicles"
|
||||||
|
"weapons")
|
||||||
|
FOREACH(file_path ${new_list})
|
||||||
|
GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
|
||||||
|
SET(dir_list ${dir_list} ${dir_path})
|
||||||
|
ENDFOREACH()
|
||||||
|
LIST(REMOVE_DUPLICATES dir_list)
|
||||||
|
SET(${return_list} ${dir_list})
|
||||||
|
ENDMACRO()
|
||||||
|
|
||||||
|
HEADER_DIRECTORIES(header_list)
|
||||||
|
include_directories(${header_list})
|
||||||
|
|
||||||
|
|
||||||
|
add_executable(re3 ${Sources})
|
||||||
|
target_link_libraries(re3 librw)
|
||||||
|
target_link_libraries(re3 Threads::Threads)
|
||||||
|
|
||||||
|
if(${RE3_AUDIO} STREQUAL "OAL")
|
||||||
|
target_link_libraries(re3 ${OPENAL_LIBRARY})
|
||||||
|
target_link_libraries(re3 ${MPG123_LIBRARIES})
|
||||||
|
target_link_libraries(re3 ${SNDFILE_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_include_directories(re3
|
||||||
|
INTERFACE
|
||||||
|
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(re3
|
||||||
|
PRIVATE
|
||||||
|
"$<IF:$<CONFIG:DEBUG>,DEBUG,NDEBUG>"
|
||||||
|
PUBLIC
|
||||||
|
"RW_${RE3_PLATFORM}"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(re3 PRIVATE LIBRW=1 AUDIO_OAL=1)
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
||||||
|
target_compile_options(re3
|
||||||
|
PRIVATE
|
||||||
|
"-Wall"
|
||||||
|
)
|
||||||
|
if (NOT RE3_PLATFORM_PS2)
|
||||||
|
target_compile_options(re3
|
||||||
|
PRIVATE
|
||||||
|
"-Wextra"
|
||||||
|
"-Wdouble-promotion"
|
||||||
|
"-Wpedantic"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
|
target_compile_options(re3
|
||||||
|
PUBLIC
|
||||||
|
/wd4996 /wd4244
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(re3
|
||||||
|
PROPERTIES
|
||||||
|
C_STANDARD 11
|
||||||
|
C_EXTENSIONS OFF
|
||||||
|
C_STANDARD_REQUIRED ON
|
||||||
|
CXX_STANDARD 11
|
||||||
|
CXX_EXTENSIONS OFF
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
PREFIX ""
|
||||||
|
)
|
||||||
|
|
||||||
|
if(RE3_INSTALL)
|
||||||
|
target_include_directories(re3
|
||||||
|
INTERFACE
|
||||||
|
$<INSTALL_INTERFACE:${RE3_INSTALL_INCLUDEDIR}>
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS re3
|
||||||
|
EXPORT re3-targets
|
||||||
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||||
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||||
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||||
|
)
|
||||||
|
endif()
|
@ -5,7 +5,7 @@
|
|||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
#include "AnimManager.h"
|
#include "AnimManager.h"
|
||||||
#include "AnimBlendAssociation.h"
|
#include "AnimBlendAssociation.h"
|
||||||
#include "RwHelper.h"
|
#include "MemoryMgr.h"
|
||||||
|
|
||||||
CAnimBlendAssociation::CAnimBlendAssociation(void)
|
CAnimBlendAssociation::CAnimBlendAssociation(void)
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@ enum {
|
|||||||
ASSOC_MOVEMENT = 0x20, // ???
|
ASSOC_MOVEMENT = 0x20, // ???
|
||||||
ASSOC_HAS_TRANSLATION = 0x40,
|
ASSOC_HAS_TRANSLATION = 0x40,
|
||||||
ASSOC_WALK = 0x80, // for CPed::PlayFootSteps(void)
|
ASSOC_WALK = 0x80, // for CPed::PlayFootSteps(void)
|
||||||
ASSOC_FLAG_XPRESS = 0x100, // only used by xpress scratch, see CPed::Chat(void)
|
ASSOC_IDLE = 0x100, // only used by xpress scratch, see CPed::Chat(void)
|
||||||
ASSOC_NOWALK = 0x200, // see CPed::PlayFootSteps(void)
|
ASSOC_NOWALK = 0x200, // see CPed::PlayFootSteps(void)
|
||||||
ASSOC_BLOCK = 0x400, // unused in assoc description, blocks other anims from being played
|
ASSOC_BLOCK = 0x400, // unused in assoc description, blocks other anims from being played
|
||||||
ASSOC_FRONTAL = 0x800, // anims that we fall to front
|
ASSOC_FRONTAL = 0x800, // anims that we fall to front
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include "AnimBlendClumpData.h"
|
#include "AnimBlendClumpData.h"
|
||||||
#include "RwHelper.h"
|
#include "MemoryMgr.h"
|
||||||
|
|
||||||
|
|
||||||
CAnimBlendClumpData::CAnimBlendClumpData(void)
|
CAnimBlendClumpData::CAnimBlendClumpData(void)
|
||||||
|
@ -30,15 +30,14 @@ void
|
|||||||
CAnimBlendHierarchy::CalcTotalTime(void)
|
CAnimBlendHierarchy::CalcTotalTime(void)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
float totalTime = 0.0f;
|
totalLength = 0.0f;
|
||||||
|
|
||||||
for(i = 0; i < numSequences; i++){
|
for(i = 0; i < numSequences; i++){
|
||||||
float seqTime = 0.0f;
|
float seqTime = 0.0f;
|
||||||
for(j = 0; j < sequences[i].numFrames; j++)
|
for(j = 0; j < sequences[i].numFrames; j++)
|
||||||
seqTime += sequences[i].GetKeyFrame(j)->deltaTime;
|
seqTime += sequences[i].GetKeyFrame(j)->deltaTime;
|
||||||
totalTime = Max(totalTime, seqTime);
|
totalLength = Max(totalLength, seqTime);
|
||||||
}
|
}
|
||||||
totalLength = totalTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -53,7 +52,6 @@ CAnimBlendHierarchy::RemoveQuaternionFlips(void)
|
|||||||
void
|
void
|
||||||
CAnimBlendHierarchy::RemoveAnimSequences(void)
|
CAnimBlendHierarchy::RemoveAnimSequences(void)
|
||||||
{
|
{
|
||||||
if(sequences)
|
|
||||||
delete[] sequences;
|
delete[] sequences;
|
||||||
numSequences = 0;
|
numSequences = 0;
|
||||||
}
|
}
|
||||||
@ -61,6 +59,12 @@ CAnimBlendHierarchy::RemoveAnimSequences(void)
|
|||||||
void
|
void
|
||||||
CAnimBlendHierarchy::Uncompress(void)
|
CAnimBlendHierarchy::Uncompress(void)
|
||||||
{
|
{
|
||||||
|
#ifdef ANIM_COMPRESSION
|
||||||
|
int i;
|
||||||
|
assert(compressed);
|
||||||
|
for(i = 0; i < numSequences; i++)
|
||||||
|
sequences[i].Uncompress();
|
||||||
|
#endif
|
||||||
if(totalLength == 0.0f)
|
if(totalLength == 0.0f)
|
||||||
CalcTotalTime();
|
CalcTotalTime();
|
||||||
compressed = 0;
|
compressed = 0;
|
||||||
@ -69,6 +73,22 @@ CAnimBlendHierarchy::Uncompress(void)
|
|||||||
void
|
void
|
||||||
CAnimBlendHierarchy::RemoveUncompressedData(void)
|
CAnimBlendHierarchy::RemoveUncompressedData(void)
|
||||||
{
|
{
|
||||||
// useless
|
#ifdef ANIM_COMPRESSION
|
||||||
|
int i;
|
||||||
|
assert(!compressed);
|
||||||
|
for(i = 0; i < numSequences; i++)
|
||||||
|
sequences[i].RemoveUncompressedData();
|
||||||
|
#endif
|
||||||
compressed = 1;
|
compressed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_CUSTOM_ALLOCATOR
|
||||||
|
void
|
||||||
|
CAnimBlendHierarchy::MoveMemory(bool onlyone)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < numSequences; i++)
|
||||||
|
if(sequences[i].MoveMemory() && onlyone)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
|
|
||||||
|
#ifdef MoveMemory
|
||||||
|
#undef MoveMemory // windows shit
|
||||||
|
#endif
|
||||||
|
|
||||||
class CAnimBlendSequence;
|
class CAnimBlendSequence;
|
||||||
|
|
||||||
// A collection of sequences
|
// A collection of sequences
|
||||||
@ -11,7 +15,7 @@ public:
|
|||||||
char name[24];
|
char name[24];
|
||||||
CAnimBlendSequence *sequences;
|
CAnimBlendSequence *sequences;
|
||||||
int16 numSequences;
|
int16 numSequences;
|
||||||
int16 compressed; // not really used
|
int16 compressed;
|
||||||
float totalLength;
|
float totalLength;
|
||||||
CLink<CAnimBlendHierarchy*> *linkPtr;
|
CLink<CAnimBlendHierarchy*> *linkPtr;
|
||||||
|
|
||||||
@ -23,6 +27,7 @@ public:
|
|||||||
void RemoveAnimSequences(void);
|
void RemoveAnimSequences(void);
|
||||||
void Uncompress(void);
|
void Uncompress(void);
|
||||||
void RemoveUncompressedData(void);
|
void RemoveUncompressedData(void);
|
||||||
|
void MoveMemory(bool onlyone = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
VALIDATE_SIZE(CAnimBlendHierarchy, 0x28);
|
VALIDATE_SIZE(CAnimBlendHierarchy, 0x28);
|
@ -1,6 +1,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include "AnimBlendSequence.h"
|
#include "AnimBlendSequence.h"
|
||||||
|
#include "MemoryHeap.h"
|
||||||
|
|
||||||
CAnimBlendSequence::CAnimBlendSequence(void)
|
CAnimBlendSequence::CAnimBlendSequence(void)
|
||||||
{
|
{
|
||||||
@ -17,6 +18,8 @@ CAnimBlendSequence::~CAnimBlendSequence(void)
|
|||||||
{
|
{
|
||||||
if(keyFrames)
|
if(keyFrames)
|
||||||
RwFree(keyFrames);
|
RwFree(keyFrames);
|
||||||
|
if(keyFramesCompressed)
|
||||||
|
RwFree(keyFramesCompressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -60,3 +63,138 @@ CAnimBlendSequence::RemoveQuaternionFlips(void)
|
|||||||
last = frame->rotation;
|
last = frame->rotation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CAnimBlendSequence::Uncompress(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(numFrames == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PUSH_MEMID(MEMID_ANIMATION);
|
||||||
|
|
||||||
|
float rotScale = 1.0f/4096.0f;
|
||||||
|
float timeScale = 1.0f/60.0f;
|
||||||
|
float transScale = 1.0f/128.0f;
|
||||||
|
if(type & KF_TRANS){
|
||||||
|
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTrans));
|
||||||
|
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)keyFramesCompressed;
|
||||||
|
KeyFrameTrans *kf = (KeyFrameTrans*)newKfs;
|
||||||
|
for(i = 0; i < numFrames; i++){
|
||||||
|
kf->rotation.x = ckf->rot[0]*rotScale;
|
||||||
|
kf->rotation.y = ckf->rot[1]*rotScale;
|
||||||
|
kf->rotation.z = ckf->rot[2]*rotScale;
|
||||||
|
kf->rotation.w = ckf->rot[3]*rotScale;
|
||||||
|
kf->deltaTime = ckf->deltaTime*timeScale;
|
||||||
|
kf->translation.x = ckf->trans[0]*transScale;
|
||||||
|
kf->translation.y = ckf->trans[1]*transScale;
|
||||||
|
kf->translation.z = ckf->trans[2]*transScale;
|
||||||
|
kf++;
|
||||||
|
ckf++;
|
||||||
|
}
|
||||||
|
keyFrames = newKfs;
|
||||||
|
}else{
|
||||||
|
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrame));
|
||||||
|
KeyFrameCompressed *ckf = (KeyFrameCompressed*)keyFramesCompressed;
|
||||||
|
KeyFrame *kf = (KeyFrame*)newKfs;
|
||||||
|
for(i = 0; i < numFrames; i++){
|
||||||
|
kf->rotation.x = ckf->rot[0]*rotScale;
|
||||||
|
kf->rotation.y = ckf->rot[1]*rotScale;
|
||||||
|
kf->rotation.z = ckf->rot[2]*rotScale;
|
||||||
|
kf->rotation.w = ckf->rot[3]*rotScale;
|
||||||
|
kf->deltaTime = ckf->deltaTime*timeScale;
|
||||||
|
kf++;
|
||||||
|
ckf++;
|
||||||
|
}
|
||||||
|
keyFrames = newKfs;
|
||||||
|
}
|
||||||
|
REGISTER_MEMPTR(&keyFrames);
|
||||||
|
|
||||||
|
RwFree(keyFramesCompressed);
|
||||||
|
keyFramesCompressed = nil;
|
||||||
|
|
||||||
|
POP_MEMID();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CAnimBlendSequence::CompressKeyframes(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(numFrames == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PUSH_MEMID(MEMID_ANIMATION);
|
||||||
|
|
||||||
|
float rotScale = 4096.0f;
|
||||||
|
float timeScale = 60.0f;
|
||||||
|
float transScale = 128.0f;
|
||||||
|
if(type & KF_TRANS){
|
||||||
|
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTransCompressed));
|
||||||
|
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)newKfs;
|
||||||
|
KeyFrameTrans *kf = (KeyFrameTrans*)keyFrames;
|
||||||
|
for(i = 0; i < numFrames; i++){
|
||||||
|
ckf->rot[0] = kf->rotation.x*rotScale;
|
||||||
|
ckf->rot[1] = kf->rotation.y*rotScale;
|
||||||
|
ckf->rot[2] = kf->rotation.z*rotScale;
|
||||||
|
ckf->rot[3] = kf->rotation.w*rotScale;
|
||||||
|
ckf->deltaTime = kf->deltaTime*timeScale + 0.5f;
|
||||||
|
ckf->trans[0] = kf->translation.x*transScale;
|
||||||
|
ckf->trans[1] = kf->translation.y*transScale;
|
||||||
|
ckf->trans[2] = kf->translation.z*transScale;
|
||||||
|
kf++;
|
||||||
|
ckf++;
|
||||||
|
}
|
||||||
|
keyFramesCompressed = newKfs;
|
||||||
|
}else{
|
||||||
|
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameCompressed));
|
||||||
|
KeyFrameCompressed *ckf = (KeyFrameCompressed*)newKfs;
|
||||||
|
KeyFrame *kf = (KeyFrame*)keyFrames;
|
||||||
|
for(i = 0; i < numFrames; i++){
|
||||||
|
ckf->rot[0] = kf->rotation.x*rotScale;
|
||||||
|
ckf->rot[1] = kf->rotation.y*rotScale;
|
||||||
|
ckf->rot[2] = kf->rotation.z*rotScale;
|
||||||
|
ckf->rot[3] = kf->rotation.w*rotScale;
|
||||||
|
ckf->deltaTime = kf->deltaTime*timeScale + 0.5f;
|
||||||
|
kf++;
|
||||||
|
ckf++;
|
||||||
|
}
|
||||||
|
keyFramesCompressed = newKfs;
|
||||||
|
}
|
||||||
|
REGISTER_MEMPTR(&keyFramesCompressed);
|
||||||
|
|
||||||
|
POP_MEMID();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CAnimBlendSequence::RemoveUncompressedData(void)
|
||||||
|
{
|
||||||
|
if(numFrames == 0)
|
||||||
|
return;
|
||||||
|
CompressKeyframes();
|
||||||
|
RwFree(keyFrames);
|
||||||
|
keyFrames = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef USE_CUSTOM_ALLOCATOR
|
||||||
|
bool
|
||||||
|
CAnimBlendSequence::MoveMemory(void)
|
||||||
|
{
|
||||||
|
if(keyFrames){
|
||||||
|
void *newaddr = gMainHeap.MoveMemory(keyFrames);
|
||||||
|
if(newaddr != keyFrames){
|
||||||
|
keyFrames = newaddr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}else if(keyFramesCompressed){
|
||||||
|
void *newaddr = gMainHeap.MoveMemory(keyFramesCompressed);
|
||||||
|
if(newaddr != keyFramesCompressed){
|
||||||
|
keyFramesCompressed = newaddr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
#include "Quaternion.h"
|
#include "Quaternion.h"
|
||||||
|
|
||||||
|
#ifdef MoveMemory
|
||||||
|
#undef MoveMemory // windows shit
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO: put them somewhere else?
|
// TODO: put them somewhere else?
|
||||||
struct KeyFrame {
|
struct KeyFrame {
|
||||||
CQuaternion rotation;
|
CQuaternion rotation;
|
||||||
@ -12,6 +16,15 @@ struct KeyFrameTrans : KeyFrame {
|
|||||||
CVector translation;
|
CVector translation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct KeyFrameCompressed {
|
||||||
|
int16 rot[4]; // 4096
|
||||||
|
int16 deltaTime; // 60
|
||||||
|
};
|
||||||
|
|
||||||
|
struct KeyFrameTransCompressed : KeyFrameCompressed {
|
||||||
|
int16 trans[3]; // 128
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// The sequence of key frames of one animated node
|
// The sequence of key frames of one animated node
|
||||||
class CAnimBlendSequence
|
class CAnimBlendSequence
|
||||||
@ -41,10 +54,10 @@ public:
|
|||||||
&((KeyFrame*)keyFrames)[n];
|
&((KeyFrame*)keyFrames)[n];
|
||||||
}
|
}
|
||||||
bool HasTranslation(void) { return !!(type & KF_TRANS); }
|
bool HasTranslation(void) { return !!(type & KF_TRANS); }
|
||||||
// TODO? these are unused
|
void Uncompress(void);
|
||||||
// void Uncompress(void);
|
void CompressKeyframes(void);
|
||||||
// void CompressKeyframes(void);
|
void RemoveUncompressedData(void);
|
||||||
// void RemoveUncompressedData(void);
|
bool MoveMemory(void);
|
||||||
|
|
||||||
#ifdef PED_SKIN
|
#ifdef PED_SKIN
|
||||||
void SetBoneTag(int tag) { boneTag = tag; }
|
void SetBoneTag(int tag) { boneTag = tag; }
|
||||||
|
@ -57,6 +57,9 @@ AnimAssocDesc aStdAnimDescs[] = {
|
|||||||
{ ANIM_HIT_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_HIT_BACK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
{ ANIM_HIT_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_HIT_RIGHT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_FLOOR_HIT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL },
|
{ ANIM_FLOOR_HIT, ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL },
|
||||||
|
#if GTA_VERSION <= GTA3_PS2_160
|
||||||
|
{ ANIM_HIT_BODY, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
|
#endif
|
||||||
{ ANIM_HIT_BODYBLOW, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_HIT_BODYBLOW, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
{ ANIM_HIT_CHEST, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_HIT_CHEST, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
{ ANIM_HIT_HEAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_HIT_HEAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
@ -78,6 +81,8 @@ AnimAssocDesc aStdAnimDescs[] = {
|
|||||||
{ ANIM_BOMBER, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK },
|
{ ANIM_BOMBER, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK },
|
||||||
{ ANIM_HGUN_RELOAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK },
|
{ ANIM_HGUN_RELOAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK },
|
||||||
{ ANIM_AK_RELOAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK },
|
{ ANIM_AK_RELOAD, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_NOWALK },
|
||||||
|
#ifdef PC_PLAYER_CONTROLS
|
||||||
|
// maybe wrong define, but unused anyway
|
||||||
{ ANIM_FPS_PUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_FPS_PUNCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_FPS_BAT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_FPS_BAT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_FPS_UZI, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_FPS_UZI, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
@ -85,6 +90,7 @@ AnimAssocDesc aStdAnimDescs[] = {
|
|||||||
{ ANIM_FPS_AK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_FPS_AK, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_FPS_M16, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_FPS_M16, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_FPS_ROCKET, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_FPS_ROCKET, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
|
#endif
|
||||||
{ ANIM_FIGHT_IDLE, ASSOC_REPEAT },
|
{ ANIM_FIGHT_IDLE, ASSOC_REPEAT },
|
||||||
{ ANIM_FIGHT2_IDLE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_FIGHT2_IDLE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_FIGHT_SH_F, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_FIGHT_SH_F, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
@ -176,7 +182,7 @@ AnimAssocDesc aStdAnimDescs[] = {
|
|||||||
{ ANIM_FALL_COLLAPSE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_FALL_COLLAPSE, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
{ ANIM_EV_STEP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_EV_STEP, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
{ ANIM_EV_DIVE, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL },
|
{ ANIM_EV_DIVE, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION | ASSOC_FRONTAL },
|
||||||
{ ANIM_XPRESS_SCRATCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_FLAG_XPRESS },
|
{ ANIM_XPRESS_SCRATCH, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL | ASSOC_IDLE },
|
||||||
{ ANIM_ROAD_CROSS, ASSOC_REPEAT | ASSOC_PARTIAL },
|
{ ANIM_ROAD_CROSS, ASSOC_REPEAT | ASSOC_PARTIAL },
|
||||||
{ ANIM_TURN_180, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_TURN_180, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_ARREST_GUN, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
{ ANIM_ARREST_GUN, ASSOC_PARTIAL | ASSOC_HAS_TRANSLATION },
|
||||||
@ -193,6 +199,7 @@ AnimAssocDesc aStdAnimDescs[] = {
|
|||||||
{ ANIM_PHONE_OUT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
{ ANIM_PHONE_OUT, ASSOC_FADEOUTWHENDONE | ASSOC_PARTIAL },
|
||||||
{ ANIM_PHONE_TALK, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL },
|
{ ANIM_PHONE_TALK, ASSOC_REPEAT | ASSOC_DELETEFADEDOUT | ASSOC_PARTIAL },
|
||||||
};
|
};
|
||||||
|
#ifdef PC_PLAYER_CONTROLS
|
||||||
AnimAssocDesc aStdAnimDescsSide[] = {
|
AnimAssocDesc aStdAnimDescsSide[] = {
|
||||||
{ ANIM_WALK, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK | ASSOC_HAS_X_TRANSLATION },
|
{ ANIM_WALK, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK | ASSOC_HAS_X_TRANSLATION },
|
||||||
{ ANIM_RUN, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK | ASSOC_HAS_X_TRANSLATION },
|
{ ANIM_RUN, ASSOC_REPEAT | ASSOC_MOVEMENT | ASSOC_HAS_TRANSLATION | ASSOC_WALK | ASSOC_HAS_X_TRANSLATION },
|
||||||
@ -200,6 +207,7 @@ AnimAssocDesc aStdAnimDescsSide[] = {
|
|||||||
{ ANIM_IDLE_STANCE, ASSOC_REPEAT },
|
{ ANIM_IDLE_STANCE, ASSOC_REPEAT },
|
||||||
{ ANIM_WALK_START, ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION },
|
{ ANIM_WALK_START, ASSOC_HAS_TRANSLATION | ASSOC_HAS_X_TRANSLATION },
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
char const *aStdAnimations[] = {
|
char const *aStdAnimations[] = {
|
||||||
"walk_civi",
|
"walk_civi",
|
||||||
"run_civi",
|
"run_civi",
|
||||||
@ -239,6 +247,9 @@ char const *aStdAnimations[] = {
|
|||||||
"HIT_back",
|
"HIT_back",
|
||||||
"HIT_R",
|
"HIT_R",
|
||||||
"FLOOR_hit",
|
"FLOOR_hit",
|
||||||
|
#if GTA_VERSION <= GTA3_PS2_160
|
||||||
|
"HIT_body",
|
||||||
|
#endif
|
||||||
"HIT_bodyblow",
|
"HIT_bodyblow",
|
||||||
"HIT_chest",
|
"HIT_chest",
|
||||||
"HIT_head",
|
"HIT_head",
|
||||||
@ -260,6 +271,8 @@ char const *aStdAnimations[] = {
|
|||||||
"bomber",
|
"bomber",
|
||||||
"WEAPON_hgun_rload",
|
"WEAPON_hgun_rload",
|
||||||
"WEAPON_AK_rload",
|
"WEAPON_AK_rload",
|
||||||
|
#ifdef PC_PLAYER_CONTROLS
|
||||||
|
// maybe wrong define, but unused anyway
|
||||||
"FPS_PUNCH",
|
"FPS_PUNCH",
|
||||||
"FPS_BAT",
|
"FPS_BAT",
|
||||||
"FPS_UZI",
|
"FPS_UZI",
|
||||||
@ -267,6 +280,7 @@ char const *aStdAnimations[] = {
|
|||||||
"FPS_AK",
|
"FPS_AK",
|
||||||
"FPS_M16",
|
"FPS_M16",
|
||||||
"FPS_ROCKET",
|
"FPS_ROCKET",
|
||||||
|
#endif
|
||||||
"FIGHTIDLE",
|
"FIGHTIDLE",
|
||||||
"FIGHT2IDLE",
|
"FIGHT2IDLE",
|
||||||
"FIGHTsh_F",
|
"FIGHTsh_F",
|
||||||
@ -488,6 +502,7 @@ char const *aPanicChunkyAnimations[] = {
|
|||||||
"woman_runpanic",
|
"woman_runpanic",
|
||||||
"idle_stance",
|
"idle_stance",
|
||||||
};
|
};
|
||||||
|
#ifdef PC_PLAYER_CONTROLS
|
||||||
char const *aPlayerStrafeBackAnimations[] = {
|
char const *aPlayerStrafeBackAnimations[] = {
|
||||||
"walk_player_back",
|
"walk_player_back",
|
||||||
"run_player_back",
|
"run_player_back",
|
||||||
@ -530,6 +545,7 @@ char const *aRocketStrafeRightAnimations[] = {
|
|||||||
"idle_rocket",
|
"idle_rocket",
|
||||||
"walkst_rocket_right",
|
"walkst_rocket_right",
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#define awc(a) ARRAY_SIZE(a), a
|
#define awc(a) ARRAY_SIZE(a), a
|
||||||
const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_GROUPS] = {
|
const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_GROUPS] = {
|
||||||
@ -552,12 +568,14 @@ const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_
|
|||||||
{ "oldwoman", "ped", MI_COP, awc(aOldWomanAnimations), aStdAnimDescs },
|
{ "oldwoman", "ped", MI_COP, awc(aOldWomanAnimations), aStdAnimDescs },
|
||||||
{ "fatwoman", "ped", MI_COP, awc(aFatWomanAnimations), aStdAnimDescs },
|
{ "fatwoman", "ped", MI_COP, awc(aFatWomanAnimations), aStdAnimDescs },
|
||||||
{ "panicchunky", "ped", MI_COP, awc(aPanicChunkyAnimations), aStdAnimDescs },
|
{ "panicchunky", "ped", MI_COP, awc(aPanicChunkyAnimations), aStdAnimDescs },
|
||||||
|
#ifdef PC_PLAYER_CONTROLS
|
||||||
{ "playerback", "ped", MI_COP, awc(aPlayerStrafeBackAnimations), aStdAnimDescs },
|
{ "playerback", "ped", MI_COP, awc(aPlayerStrafeBackAnimations), aStdAnimDescs },
|
||||||
{ "playerleft", "ped", MI_COP, awc(aPlayerStrafeLeftAnimations), aStdAnimDescsSide },
|
{ "playerleft", "ped", MI_COP, awc(aPlayerStrafeLeftAnimations), aStdAnimDescsSide },
|
||||||
{ "playerright", "ped", MI_COP, awc(aPlayerStrafeRightAnimations), aStdAnimDescsSide },
|
{ "playerright", "ped", MI_COP, awc(aPlayerStrafeRightAnimations), aStdAnimDescsSide },
|
||||||
{ "rocketback", "ped", MI_COP, awc(aRocketStrafeBackAnimations), aStdAnimDescs },
|
{ "rocketback", "ped", MI_COP, awc(aRocketStrafeBackAnimations), aStdAnimDescs },
|
||||||
{ "rocketleft", "ped", MI_COP, awc(aRocketStrafeLeftAnimations), aStdAnimDescsSide },
|
{ "rocketleft", "ped", MI_COP, awc(aRocketStrafeLeftAnimations), aStdAnimDescsSide },
|
||||||
{ "rocketright", "ped", MI_COP, awc(aRocketStrafeRightAnimations), aStdAnimDescsSide },
|
{ "rocketright", "ped", MI_COP, awc(aRocketStrafeRightAnimations), aStdAnimDescsSide },
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#undef awc
|
#undef awc
|
||||||
|
|
||||||
@ -795,7 +813,7 @@ CAnimManager::LoadAnimFile(int fd, bool compress)
|
|||||||
#ifdef BIGENDIAN
|
#ifdef BIGENDIAN
|
||||||
anpk.size = BSWAP32(anpk.size);
|
anpk.size = BSWAP32(anpk.size);
|
||||||
#endif
|
#endif
|
||||||
if(strncmp(anpk.ident, "ANLF", 4) == 0){
|
if(!CGeneral::faststrncmp(anpk.ident, "ANLF", 4)) {
|
||||||
ROUNDSIZE(anpk.size);
|
ROUNDSIZE(anpk.size);
|
||||||
CFileMgr::Read(fd, buf, anpk.size);
|
CFileMgr::Read(fd, buf, anpk.size);
|
||||||
#ifndef BIGENDIAN
|
#ifndef BIGENDIAN
|
||||||
@ -803,7 +821,7 @@ CAnimManager::LoadAnimFile(int fd, bool compress)
|
|||||||
#else
|
#else
|
||||||
numANPK = BSWAP32(*(int*)buf);
|
numANPK = BSWAP32(*(int*)buf);
|
||||||
#endif
|
#endif
|
||||||
}else if(strncmp(anpk.ident, "ANPK", 4) == 0){
|
} else if(!CGeneral::faststrncmp(anpk.ident, "ANPK", 4)) {
|
||||||
CFileMgr::Seek(fd, -8, 1);
|
CFileMgr::Seek(fd, -8, 1);
|
||||||
numANPK = 1;
|
numANPK = 1;
|
||||||
}
|
}
|
||||||
@ -881,6 +899,7 @@ CAnimManager::LoadAnimFile(int fd, bool compress)
|
|||||||
#else
|
#else
|
||||||
int numFrames = BSWAP32(*(int*)(buf+28));
|
int numFrames = BSWAP32(*(int*)(buf+28));
|
||||||
#endif
|
#endif
|
||||||
|
seq->SetName(buf);
|
||||||
#ifdef PED_SKIN
|
#ifdef PED_SKIN
|
||||||
if(anim.size == 44)
|
if(anim.size == 44)
|
||||||
#ifndef BIGENDIAN
|
#ifndef BIGENDIAN
|
||||||
@ -889,84 +908,52 @@ CAnimManager::LoadAnimFile(int fd, bool compress)
|
|||||||
seq->SetBoneTag(BSWAP32(*(int*)(buf+40)));
|
seq->SetBoneTag(BSWAP32(*(int*)(buf+40)));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
seq->SetName(buf);
|
|
||||||
if(numFrames == 0)
|
if(numFrames == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
bool hasScale = false;
|
||||||
|
bool hasTranslation = false;
|
||||||
CFileMgr::Read(fd, (char*)&info, sizeof(info));
|
CFileMgr::Read(fd, (char*)&info, sizeof(info));
|
||||||
#ifdef BIGENDIAN
|
if(!CGeneral::faststrncmp(info.ident, "KRTS", 4)) {
|
||||||
info.size = BSWAP32(info.size);
|
hasScale = true;
|
||||||
#endif
|
seq->SetNumFrames(numFrames, true);
|
||||||
if(strncmp(info.ident, "KR00", 4) == 0){
|
}else if(!CGeneral::faststrncmp(info.ident, "KRT0", 4)) {
|
||||||
|
hasTranslation = true;
|
||||||
|
seq->SetNumFrames(numFrames, true);
|
||||||
|
}else if(!CGeneral::faststrncmp(info.ident, "KR00", 4)){
|
||||||
seq->SetNumFrames(numFrames, false);
|
seq->SetNumFrames(numFrames, false);
|
||||||
KeyFrame *kf = seq->GetKeyFrame(0);
|
|
||||||
for(l = 0; l < numFrames; l++, kf++){
|
|
||||||
CFileMgr::Read(fd, buf, 0x14);
|
|
||||||
#ifndef BIGENDIAN
|
|
||||||
kf->rotation.x = -fbuf[0];
|
|
||||||
kf->rotation.y = -fbuf[1];
|
|
||||||
kf->rotation.z = -fbuf[2];
|
|
||||||
kf->rotation.w = fbuf[3];
|
|
||||||
kf->deltaTime = fbuf[4]; // absolute time here
|
|
||||||
#else
|
|
||||||
kf->rotation.x = -FLOATSWAP32(fbuf[0]);
|
|
||||||
kf->rotation.y = -FLOATSWAP32(fbuf[1]);
|
|
||||||
kf->rotation.z = -FLOATSWAP32(fbuf[2]);
|
|
||||||
kf->rotation.w = FLOATSWAP32(fbuf[3]);
|
|
||||||
kf->deltaTime = FLOATSWAP32(fbuf[4]); // absolute time here
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}else if(strncmp(info.ident, "KRT0", 4) == 0){
|
|
||||||
seq->SetNumFrames(numFrames, true);
|
for(l = 0; l < numFrames; l++){
|
||||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
|
if(hasScale){
|
||||||
for(l = 0; l < numFrames; l++, kf++){
|
|
||||||
CFileMgr::Read(fd, buf, 0x20);
|
|
||||||
#ifndef BIGENDIAN
|
|
||||||
kf->rotation.x = -fbuf[0];
|
|
||||||
kf->rotation.y = -fbuf[1];
|
|
||||||
kf->rotation.z = -fbuf[2];
|
|
||||||
kf->rotation.w = fbuf[3];
|
|
||||||
kf->translation.x = fbuf[4];
|
|
||||||
kf->translation.y = fbuf[5];
|
|
||||||
kf->translation.z = fbuf[6];
|
|
||||||
kf->deltaTime = fbuf[7]; // absolute time here
|
|
||||||
#else
|
|
||||||
kf->rotation.x = -FLOATSWAP32(fbuf[0]);
|
|
||||||
kf->rotation.y = -FLOATSWAP32(fbuf[1]);
|
|
||||||
kf->rotation.z = -FLOATSWAP32(fbuf[2]);
|
|
||||||
kf->rotation.w = FLOATSWAP32(fbuf[3]);
|
|
||||||
kf->translation.x = FLOATSWAP32(fbuf[4]);
|
|
||||||
kf->translation.y = FLOATSWAP32(fbuf[5]);
|
|
||||||
kf->translation.z = FLOATSWAP32(fbuf[6]);
|
|
||||||
kf->deltaTime = FLOATSWAP32(fbuf[7]); // absolute time here
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}else if(strncmp(info.ident, "KRTS", 4) == 0){
|
|
||||||
seq->SetNumFrames(numFrames, true);
|
|
||||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
|
|
||||||
for(l = 0; l < numFrames; l++, kf++){
|
|
||||||
CFileMgr::Read(fd, buf, 0x2C);
|
CFileMgr::Read(fd, buf, 0x2C);
|
||||||
#ifndef BIGENDIAN
|
CQuaternion rot(FLOATSWAP32(fbuf[0]), FLOATSWAP32(fbuf[1]), FLOATSWAP32(fbuf[2]), FLOATSWAP32(fbuf[3]));
|
||||||
kf->rotation.x = -fbuf[0];
|
rot.Invert();
|
||||||
kf->rotation.y = -fbuf[1];
|
CVector trans(FLOATSWAP32(fbuf[4]), FLOATSWAP32(fbuf[5]), FLOATSWAP32(fbuf[6]));
|
||||||
kf->rotation.z = -fbuf[2];
|
|
||||||
kf->rotation.w = fbuf[3];
|
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
|
||||||
kf->translation.x = fbuf[4];
|
kf->rotation = rot;
|
||||||
kf->translation.y = fbuf[5];
|
kf->translation = trans;
|
||||||
kf->translation.z = fbuf[6];
|
|
||||||
// scaling ignored
|
|
||||||
kf->deltaTime = fbuf[10]; // absolute time here
|
|
||||||
#else
|
|
||||||
kf->rotation.x = -FLOATSWAP32(fbuf[0]);
|
|
||||||
kf->rotation.y = -FLOATSWAP32(fbuf[1]);
|
|
||||||
kf->rotation.z = -FLOATSWAP32(fbuf[2]);
|
|
||||||
kf->rotation.w = FLOATSWAP32(fbuf[3]);
|
|
||||||
kf->translation.x = FLOATSWAP32(fbuf[4]);
|
|
||||||
kf->translation.y = FLOATSWAP32(fbuf[5]);
|
|
||||||
kf->translation.z = FLOATSWAP32(fbuf[6]);
|
|
||||||
// scaling ignored
|
// scaling ignored
|
||||||
kf->deltaTime = FLOATSWAP32(fbuf[10]); // absolute time here
|
kf->deltaTime = FLOATSWAP32(fbuf[10]); // absolute time here
|
||||||
#endif
|
}else if(hasTranslation){
|
||||||
|
CFileMgr::Read(fd, buf, 0x20);
|
||||||
|
CQuaternion rot(FLOATSWAP32(fbuf[0]), FLOATSWAP32(fbuf[1]), FLOATSWAP32(fbuf[2]), FLOATSWAP32(fbuf[3]));
|
||||||
|
rot.Invert();
|
||||||
|
CVector trans(FLOATSWAP32(fbuf[4]), FLOATSWAP32(fbuf[5]), FLOATSWAP32(fbuf[6]));
|
||||||
|
|
||||||
|
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
|
||||||
|
kf->rotation = rot;
|
||||||
|
kf->translation = trans;
|
||||||
|
kf->deltaTime = FLOATSWAP32(fbuf[7]); // absolute time here
|
||||||
|
}else{
|
||||||
|
CFileMgr::Read(fd, buf, 0x14);
|
||||||
|
CQuaternion rot(FLOATSWAP32(fbuf[0]), FLOATSWAP32(fbuf[1]), FLOATSWAP32(fbuf[2]), FLOATSWAP32(fbuf[3]));
|
||||||
|
rot.Invert();
|
||||||
|
|
||||||
|
KeyFrame *kf = (KeyFrame*)seq->GetKeyFrame(l);
|
||||||
|
kf->rotation = rot;
|
||||||
|
kf->deltaTime = FLOATSWAP32(fbuf[4]); // absolute time here
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,12 +24,14 @@ enum AssocGroupId
|
|||||||
ASSOCGRP_OLDWOMAN,
|
ASSOCGRP_OLDWOMAN,
|
||||||
ASSOCGRP_FATWOMAN,
|
ASSOCGRP_FATWOMAN,
|
||||||
ASSOCGRP_PANICCHUNKY,
|
ASSOCGRP_PANICCHUNKY,
|
||||||
|
#ifdef PC_PLAYER_CONTROLS
|
||||||
ASSOCGRP_PLAYERBACK,
|
ASSOCGRP_PLAYERBACK,
|
||||||
ASSOCGRP_PLAYERLEFT,
|
ASSOCGRP_PLAYERLEFT,
|
||||||
ASSOCGRP_PLAYERRIGHT,
|
ASSOCGRP_PLAYERRIGHT,
|
||||||
ASSOCGRP_ROCKETBACK,
|
ASSOCGRP_ROCKETBACK,
|
||||||
ASSOCGRP_ROCKETLEFT,
|
ASSOCGRP_ROCKETLEFT,
|
||||||
ASSOCGRP_ROCKETRIGHT,
|
ASSOCGRP_ROCKETRIGHT,
|
||||||
|
#endif
|
||||||
|
|
||||||
NUM_ANIM_ASSOC_GROUPS
|
NUM_ANIM_ASSOC_GROUPS
|
||||||
};
|
};
|
||||||
|
@ -40,6 +40,9 @@ enum AnimationId
|
|||||||
ANIM_HIT_BACK,
|
ANIM_HIT_BACK,
|
||||||
ANIM_HIT_RIGHT,
|
ANIM_HIT_RIGHT,
|
||||||
ANIM_FLOOR_HIT,
|
ANIM_FLOOR_HIT,
|
||||||
|
#if GTA_VERSION <= GTA3_PS2_160
|
||||||
|
ANIM_HIT_BODY,
|
||||||
|
#endif
|
||||||
ANIM_HIT_BODYBLOW,
|
ANIM_HIT_BODYBLOW,
|
||||||
ANIM_HIT_CHEST,
|
ANIM_HIT_CHEST,
|
||||||
ANIM_HIT_HEAD,
|
ANIM_HIT_HEAD,
|
||||||
@ -61,6 +64,8 @@ enum AnimationId
|
|||||||
ANIM_BOMBER,
|
ANIM_BOMBER,
|
||||||
ANIM_HGUN_RELOAD,
|
ANIM_HGUN_RELOAD,
|
||||||
ANIM_AK_RELOAD,
|
ANIM_AK_RELOAD,
|
||||||
|
#ifdef PC_PLAYER_CONTROLS
|
||||||
|
// maybe wrong define, but unused anyway
|
||||||
ANIM_FPS_PUNCH,
|
ANIM_FPS_PUNCH,
|
||||||
ANIM_FPS_BAT,
|
ANIM_FPS_BAT,
|
||||||
ANIM_FPS_UZI,
|
ANIM_FPS_UZI,
|
||||||
@ -68,6 +73,7 @@ enum AnimationId
|
|||||||
ANIM_FPS_AK,
|
ANIM_FPS_AK,
|
||||||
ANIM_FPS_M16,
|
ANIM_FPS_M16,
|
||||||
ANIM_FPS_ROCKET,
|
ANIM_FPS_ROCKET,
|
||||||
|
#endif
|
||||||
ANIM_FIGHT_IDLE,
|
ANIM_FIGHT_IDLE,
|
||||||
ANIM_FIGHT2_IDLE,
|
ANIM_FIGHT2_IDLE,
|
||||||
ANIM_FIGHT_SH_F,
|
ANIM_FIGHT_SH_F,
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "AnimBlendClumpData.h"
|
#include "AnimBlendClumpData.h"
|
||||||
#include "AnimBlendHierarchy.h"
|
#include "AnimBlendHierarchy.h"
|
||||||
#include "AnimBlendAssociation.h"
|
#include "AnimBlendAssociation.h"
|
||||||
|
#include "AnimManager.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
#ifdef PED_SKIN
|
#ifdef PED_SKIN
|
||||||
#include "PedModelInfo.h"
|
#include "PedModelInfo.h"
|
||||||
@ -441,7 +442,7 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
|
|||||||
next = link->next;
|
next = link->next;
|
||||||
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
||||||
if(assoc->UpdateBlend(timeDelta)){
|
if(assoc->UpdateBlend(timeDelta)){
|
||||||
// CAnimManager::UncompressAnimation(v6->hierarchy)
|
CAnimManager::UncompressAnimation(assoc->hierarchy);
|
||||||
updateData.nodes[i++] = assoc->GetNode(0);
|
updateData.nodes[i++] = assoc->GetNode(0);
|
||||||
if(assoc->flags & ASSOC_MOVEMENT){
|
if(assoc->flags & ASSOC_MOVEMENT){
|
||||||
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
|
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -128,7 +128,7 @@ cAudioManager::CreateEntity(eAudioType type, void *entity)
|
|||||||
for (uint32 i = 0; i < ARRAY_SIZE(m_asAudioEntities); i++) {
|
for (uint32 i = 0; i < ARRAY_SIZE(m_asAudioEntities); i++) {
|
||||||
if (!m_asAudioEntities[i].m_bIsUsed) {
|
if (!m_asAudioEntities[i].m_bIsUsed) {
|
||||||
m_asAudioEntities[i].m_bIsUsed = true;
|
m_asAudioEntities[i].m_bIsUsed = true;
|
||||||
m_asAudioEntities[i].m_nStatus = 0;
|
m_asAudioEntities[i].m_bStatus = false;
|
||||||
m_asAudioEntities[i].m_nType = type;
|
m_asAudioEntities[i].m_nType = type;
|
||||||
m_asAudioEntities[i].m_pEntity = entity;
|
m_asAudioEntities[i].m_pEntity = entity;
|
||||||
m_asAudioEntities[i].m_awAudioEvent[0] = SOUND_NO_SOUND;
|
m_asAudioEntities[i].m_awAudioEvent[0] = SOUND_NO_SOUND;
|
||||||
@ -163,11 +163,11 @@ void
|
|||||||
cAudioManager::SetEntityStatus(int32 id, uint8 status)
|
cAudioManager::SetEntityStatus(int32 id, uint8 status)
|
||||||
{
|
{
|
||||||
if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed)
|
if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed)
|
||||||
m_asAudioEntities[id].m_nStatus = status;
|
m_asAudioEntities[id].m_bStatus = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cAudioManager::PlayOneShot(int32 index, int16 sound, float vol)
|
cAudioManager::PlayOneShot(int32 index, uint16 sound, float vol)
|
||||||
{
|
{
|
||||||
static const uint8 OneShotPriority[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 5, 2, 2, 1, 1, 3, 1, 3, 3, 1, 1, 1, 4, 4, 3, 1, 1,
|
static const uint8 OneShotPriority[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 5, 2, 2, 1, 1, 3, 1, 3, 3, 1, 1, 1, 4, 4, 3, 1, 1,
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 3, 2, 2, 2, 2, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 3, 2, 2, 2, 2, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
@ -321,8 +321,13 @@ cAudioManager::Get3DProviderName(uint8 id) const
|
|||||||
{
|
{
|
||||||
if (!m_bIsInitialised)
|
if (!m_bIsInitialised)
|
||||||
return nil;
|
return nil;
|
||||||
|
#ifdef AUDIO_OAL
|
||||||
|
id = clamp(id, 0, SampleManager.GetNum3DProvidersAvailable() - 1);
|
||||||
|
#else
|
||||||
|
// We don't want that either since it will crash the game, but skipping for now
|
||||||
if (id >= SampleManager.GetNum3DProvidersAvailable())
|
if (id >= SampleManager.GetNum3DProvidersAvailable())
|
||||||
return nil;
|
return nil;
|
||||||
|
#endif
|
||||||
return SampleManager.Get3DProviderName(id);
|
return SampleManager.Get3DProviderName(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
eAudioType m_nType;
|
eAudioType m_nType;
|
||||||
void *m_pEntity;
|
void *m_pEntity;
|
||||||
bool m_bIsUsed;
|
bool m_bIsUsed;
|
||||||
uint8 m_nStatus;
|
uint8 m_bStatus;
|
||||||
int16 m_awAudioEvent[NUM_AUDIOENTITY_EVENTS];
|
int16 m_awAudioEvent[NUM_AUDIOENTITY_EVENTS];
|
||||||
float m_afVolume[NUM_AUDIOENTITY_EVENTS];
|
float m_afVolume[NUM_AUDIOENTITY_EVENTS];
|
||||||
uint8 m_AudioEvents;
|
uint8 m_AudioEvents;
|
||||||
@ -132,6 +132,13 @@ public:
|
|||||||
bool m_bDistanceCalculated;
|
bool m_bDistanceCalculated;
|
||||||
float m_fDistance;
|
float m_fDistance;
|
||||||
CPed *m_pPed;
|
CPed *m_pPed;
|
||||||
|
|
||||||
|
cPedParams()
|
||||||
|
{
|
||||||
|
m_pPed = nil;
|
||||||
|
m_bDistanceCalculated = false;
|
||||||
|
m_fDistance = 0.0f;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class cVehicleParams
|
class cVehicleParams
|
||||||
@ -332,7 +339,7 @@ public:
|
|||||||
int8 GetMissionScriptPoliceAudioPlayingStatus() const;
|
int8 GetMissionScriptPoliceAudioPlayingStatus() const;
|
||||||
uint8 GetNum3DProvidersAvailable() const;
|
uint8 GetNum3DProvidersAvailable() const;
|
||||||
int32 GetPedCommentSfx(CPed *ped, int32 sound);
|
int32 GetPedCommentSfx(CPed *ped, int32 sound);
|
||||||
void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample, uint32 maxOffset) const;
|
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const;
|
||||||
float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile,
|
float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile,
|
||||||
cTransmission *transmission, float velocityChange);
|
cTransmission *transmission, float velocityChange);
|
||||||
float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile,
|
float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile,
|
||||||
@ -351,7 +358,7 @@ public:
|
|||||||
bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const;
|
bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const;
|
||||||
|
|
||||||
void PlayLoadedMissionAudio();
|
void PlayLoadedMissionAudio();
|
||||||
void PlayOneShot(int32 index, int16 sound, float vol);
|
void PlayOneShot(int32 index, uint16 sound, float vol);
|
||||||
void PlaySuspectLastSeen(float x, float y, float z);
|
void PlaySuspectLastSeen(float x, float y, float z);
|
||||||
void PlayerJustGotInCar() const;
|
void PlayerJustGotInCar() const;
|
||||||
void PlayerJustLeftCar() const;
|
void PlayerJustLeftCar() const;
|
||||||
@ -362,29 +369,29 @@ public:
|
|||||||
void PreTerminateGameSpecificShutdown();
|
void PreTerminateGameSpecificShutdown();
|
||||||
/// processX - main logic of adding new sounds
|
/// processX - main logic of adding new sounds
|
||||||
void ProcessActiveQueues();
|
void ProcessActiveQueues();
|
||||||
bool ProcessAirBrakes(cVehicleParams *params);
|
bool ProcessAirBrakes(cVehicleParams& params);
|
||||||
void ProcessAirportScriptObject(uint8 sound);
|
void ProcessAirportScriptObject(uint8 sound);
|
||||||
bool ProcessBoatEngine(cVehicleParams *params);
|
bool ProcessBoatEngine(cVehicleParams& params);
|
||||||
bool ProcessBoatMovingOverWater(cVehicleParams *params);
|
bool ProcessBoatMovingOverWater(cVehicleParams& params);
|
||||||
void ProcessBridge();
|
void ProcessBridge();
|
||||||
void ProcessBridgeMotor();
|
void ProcessBridgeMotor();
|
||||||
void ProcessBridgeOneShots();
|
void ProcessBridgeOneShots();
|
||||||
void ProcessBridgeWarning();
|
void ProcessBridgeWarning();
|
||||||
bool ProcessCarBombTick(cVehicleParams *params);
|
bool ProcessCarBombTick(cVehicleParams& params);
|
||||||
void ProcessCesna(cVehicleParams *params);
|
void ProcessCesna(cVehicleParams& params);
|
||||||
void ProcessCinemaScriptObject(uint8 sound);
|
void ProcessCinemaScriptObject(uint8 sound);
|
||||||
void ProcessCrane();
|
void ProcessCrane();
|
||||||
void ProcessDocksScriptObject(uint8 sound);
|
void ProcessDocksScriptObject(uint8 sound);
|
||||||
bool ProcessEngineDamage(cVehicleParams *params);
|
bool ProcessEngineDamage(cVehicleParams& params);
|
||||||
void ProcessEntity(int32 sound);
|
void ProcessEntity(int32 sound);
|
||||||
void ProcessExplosions(int32 explosion);
|
void ProcessExplosions(int32 explosion);
|
||||||
void ProcessFireHydrant();
|
void ProcessFireHydrant();
|
||||||
void ProcessFires(int32 entity);
|
void ProcessFires(int32 entity);
|
||||||
void ProcessFrontEnd();
|
void ProcessFrontEnd();
|
||||||
void ProcessGarages();
|
void ProcessGarages();
|
||||||
bool ProcessHelicopter(cVehicleParams *params);
|
bool ProcessHelicopter(cVehicleParams& params);
|
||||||
void ProcessHomeScriptObject(uint8 sound);
|
void ProcessHomeScriptObject(uint8 sound);
|
||||||
void ProcessJumbo(cVehicleParams *);
|
void ProcessJumbo(cVehicleParams& params);
|
||||||
void ProcessJumboAccel(CPlane *plane);
|
void ProcessJumboAccel(CPlane *plane);
|
||||||
void ProcessJumboDecel(CPlane *plane);
|
void ProcessJumboDecel(CPlane *plane);
|
||||||
void ProcessJumboFlying();
|
void ProcessJumboFlying();
|
||||||
@ -394,37 +401,37 @@ public:
|
|||||||
void ProcessLaunderetteScriptObject(uint8 sound);
|
void ProcessLaunderetteScriptObject(uint8 sound);
|
||||||
void ProcessLoopingScriptObject(uint8 sound);
|
void ProcessLoopingScriptObject(uint8 sound);
|
||||||
void ProcessMissionAudio();
|
void ProcessMissionAudio();
|
||||||
void ProcessModelCarEngine(cVehicleParams *params);
|
void ProcessModelCarEngine(cVehicleParams& params);
|
||||||
void ProcessOneShotScriptObject(uint8 sound);
|
void ProcessOneShotScriptObject(uint8 sound);
|
||||||
void ProcessPed(CPhysical *ped);
|
void ProcessPed(CPhysical *ped);
|
||||||
void ProcessPedHeadphones(cPedParams *params);
|
void ProcessPedHeadphones(cPedParams ¶ms);
|
||||||
void ProcessPedOneShots(cPedParams *params);
|
void ProcessPedOneShots(cPedParams ¶ms);
|
||||||
void ProcessPhysical(int32 id);
|
void ProcessPhysical(int32 id);
|
||||||
void ProcessPlane(cVehicleParams *params);
|
void ProcessPlane(cVehicleParams& params);
|
||||||
void ProcessPlayersVehicleEngine(cVehicleParams *params, CAutomobile *automobile);
|
void ProcessPlayersVehicleEngine(cVehicleParams& params, CAutomobile *automobile);
|
||||||
void ProcessPoliceCellBeatingScriptObject(uint8 sound);
|
void ProcessPoliceCellBeatingScriptObject(uint8 sound);
|
||||||
void ProcessPornCinema(uint8 sound);
|
void ProcessPornCinema(uint8 sound);
|
||||||
void ProcessProjectiles();
|
void ProcessProjectiles();
|
||||||
void ProcessRainOnVehicle(cVehicleParams *params);
|
void ProcessRainOnVehicle(cVehicleParams& params);
|
||||||
void ProcessReverb() const;
|
void ProcessReverb() const;
|
||||||
bool ProcessReverseGear(cVehicleParams *params);
|
bool ProcessReverseGear(cVehicleParams& params);
|
||||||
void ProcessSawMillScriptObject(uint8 sound);
|
void ProcessSawMillScriptObject(uint8 sound);
|
||||||
void ProcessScriptObject(int32 id);
|
void ProcessScriptObject(int32 id);
|
||||||
void ProcessShopScriptObject(uint8 sound);
|
void ProcessShopScriptObject(uint8 sound);
|
||||||
void ProcessSpecial();
|
void ProcessSpecial();
|
||||||
bool ProcessTrainNoise(cVehicleParams *params);
|
bool ProcessTrainNoise(cVehicleParams& params);
|
||||||
void ProcessVehicle(CVehicle *vehicle);
|
void ProcessVehicle(CVehicle *vehicle);
|
||||||
bool ProcessVehicleDoors(cVehicleParams *params);
|
bool ProcessVehicleDoors(cVehicleParams& params);
|
||||||
void ProcessVehicleEngine(cVehicleParams *params);
|
void ProcessVehicleEngine(cVehicleParams& params);
|
||||||
void ProcessVehicleHorn(cVehicleParams *params);
|
void ProcessVehicleHorn(cVehicleParams& params);
|
||||||
void ProcessVehicleOneShots(cVehicleParams *params);
|
void ProcessVehicleOneShots(cVehicleParams& params);
|
||||||
bool ProcessVehicleReverseWarning(cVehicleParams *params);
|
bool ProcessVehicleReverseWarning(cVehicleParams& params);
|
||||||
bool ProcessVehicleRoadNoise(cVehicleParams *params);
|
bool ProcessVehicleRoadNoise(cVehicleParams& params);
|
||||||
bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);
|
bool ProcessVehicleSirenOrAlarm(cVehicleParams& params);
|
||||||
bool ProcessVehicleSkidding(cVehicleParams *params);
|
bool ProcessVehicleSkidding(cVehicleParams& params);
|
||||||
void ProcessWaterCannon(int32);
|
void ProcessWaterCannon(int32);
|
||||||
void ProcessWeather(int32 id);
|
void ProcessWeather(int32 id);
|
||||||
bool ProcessWetRoadNoise(cVehicleParams *params);
|
bool ProcessWetRoadNoise(cVehicleParams& params);
|
||||||
void ProcessWorkShopScriptObject(uint8 sound);
|
void ProcessWorkShopScriptObject(uint8 sound);
|
||||||
|
|
||||||
int32 RandomDisplacement(uint32 seed) const;
|
int32 RandomDisplacement(uint32 seed) const;
|
||||||
@ -432,7 +439,7 @@ public:
|
|||||||
void ReleaseDigitalHandle() const;
|
void ReleaseDigitalHandle() const;
|
||||||
void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2,
|
void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2,
|
||||||
float collisionPower, float intensity2);
|
float collisionPower, float intensity2);
|
||||||
void ReportCrime(int32 crime, const CVector *pos);
|
void ReportCrime(eCrimeType crime, const CVector &pos);
|
||||||
void ResetAudioLogicTimers(uint32 timer);
|
void ResetAudioLogicTimers(uint32 timer);
|
||||||
void ResetPoliceRadio();
|
void ResetPoliceRadio();
|
||||||
void ResetTimers(uint32 time);
|
void ResetTimers(uint32 time);
|
||||||
@ -440,7 +447,7 @@ public:
|
|||||||
void Service();
|
void Service();
|
||||||
void ServiceCollisions();
|
void ServiceCollisions();
|
||||||
void ServicePoliceRadio();
|
void ServicePoliceRadio();
|
||||||
void ServicePoliceRadioChannel(int32 wantedLevel);
|
void ServicePoliceRadioChannel(uint8 wantedLevel);
|
||||||
void ServiceSoundEffects();
|
void ServiceSoundEffects();
|
||||||
int8 SetCurrent3DProvider(uint8 which);
|
int8 SetCurrent3DProvider(uint8 which);
|
||||||
void SetDynamicAcousticModelingStatus(uint8 status);
|
void SetDynamicAcousticModelingStatus(uint8 status);
|
||||||
@ -462,7 +469,7 @@ public:
|
|||||||
bool SetupJumboRumbleSound(uint8 emittingVol);
|
bool SetupJumboRumbleSound(uint8 emittingVol);
|
||||||
bool SetupJumboTaxiSound(uint8 vol);
|
bool SetupJumboTaxiSound(uint8 vol);
|
||||||
bool SetupJumboWhineSound(uint8 emittingVol, uint32 freq);
|
bool SetupJumboWhineSound(uint8 emittingVol, uint32 freq);
|
||||||
void SetupPedComments(cPedParams *params, uint32 sound);
|
void SetupPedComments(cPedParams ¶ms, uint16 sound);
|
||||||
void SetupSuspectLastSeenReport();
|
void SetupSuspectLastSeenReport();
|
||||||
|
|
||||||
void Terminate();
|
void Terminate();
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
enum eSfxSample : uint32
|
enum eSfxSample
|
||||||
{
|
{
|
||||||
SFX_CAR_HORN_JEEP = 0,
|
SFX_CAR_HORN_JEEP = 0,
|
||||||
SFX_CAR_HORN_BMW328,
|
SFX_CAR_HORN_BMW328,
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
#include "AudioManager.h"
|
#include "AudioManager.h"
|
||||||
#include "AudioScriptObject.h"
|
#include "AudioScriptObject.h"
|
||||||
#include "sampman.h"
|
#include "sampman.h"
|
||||||
#include "Text.h"
|
|
||||||
#include "crossplatform.h"
|
|
||||||
|
|
||||||
cDMAudio DMAudio;
|
cDMAudio DMAudio;
|
||||||
|
|
||||||
@ -112,28 +110,6 @@ cDMAudio::Get3DProviderName(uint8 id)
|
|||||||
return AudioManager.Get3DProviderName(id);
|
return AudioManager.Get3DProviderName(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8 cDMAudio::AutoDetect3DProviders(void)
|
|
||||||
{
|
|
||||||
for ( int32 i = 0; i < GetNum3DProvidersAvailable(); i++ )
|
|
||||||
{
|
|
||||||
wchar buff[64];
|
|
||||||
|
|
||||||
char *name = Get3DProviderName(i);
|
|
||||||
AsciiToUnicode(name, buff);
|
|
||||||
char *providername = UnicodeToAscii(buff);
|
|
||||||
strupr(providername);
|
|
||||||
#if defined(AUDIO_MSS)
|
|
||||||
if ( !strcmp(providername, "MILES FAST 2D POSITIONAL AUDIO") )
|
|
||||||
return i;
|
|
||||||
#elif defined(AUDIO_OAL)
|
|
||||||
if ( !strcmp(providername, "OPENAL SOFT") )
|
|
||||||
return i;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8
|
int8
|
||||||
cDMAudio::GetCurrent3DProviderIndex(void)
|
cDMAudio::GetCurrent3DProviderIndex(void)
|
||||||
{
|
{
|
||||||
@ -197,7 +173,7 @@ cDMAudio::IsAudioInitialised(void)
|
|||||||
void
|
void
|
||||||
cDMAudio::ReportCrime(eCrimeType crime, const CVector &pos)
|
cDMAudio::ReportCrime(eCrimeType crime, const CVector &pos)
|
||||||
{
|
{
|
||||||
AudioManager.ReportCrime(crime, &pos);
|
AudioManager.ReportCrime(crime, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32
|
int32
|
||||||
@ -344,7 +320,7 @@ cDMAudio::SetRadioInCar(uint32 radio)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cDMAudio::SetRadioChannel(int8 radio, int32 pos)
|
cDMAudio::SetRadioChannel(uint8 radio, int32 pos)
|
||||||
{
|
{
|
||||||
MusicManager.SetRadioChannelByScript(radio, pos);
|
MusicManager.SetRadioChannelByScript(radio, pos);
|
||||||
}
|
}
|
||||||
|
@ -35,8 +35,6 @@ public:
|
|||||||
uint8 GetNum3DProvidersAvailable(void);
|
uint8 GetNum3DProvidersAvailable(void);
|
||||||
char *Get3DProviderName(uint8 id);
|
char *Get3DProviderName(uint8 id);
|
||||||
|
|
||||||
int8 AutoDetect3DProviders(void);
|
|
||||||
|
|
||||||
int8 GetCurrent3DProviderIndex(void);
|
int8 GetCurrent3DProviderIndex(void);
|
||||||
int8 SetCurrent3DProvider(uint8 which);
|
int8 SetCurrent3DProvider(uint8 which);
|
||||||
|
|
||||||
@ -86,6 +84,6 @@ public:
|
|||||||
|
|
||||||
uint8 GetRadioInCar(void);
|
uint8 GetRadioInCar(void);
|
||||||
void SetRadioInCar(uint32 radio);
|
void SetRadioInCar(uint32 radio);
|
||||||
void SetRadioChannel(int8 radio, int32 pos);
|
void SetRadioChannel(uint8 radio, int32 pos);
|
||||||
};
|
};
|
||||||
extern cDMAudio DMAudio;
|
extern cDMAudio DMAudio;
|
||||||
|
@ -83,18 +83,40 @@ cMusicManager::DisplayRadioStationName()
|
|||||||
if(m_bPlayerInCar && !m_bPreviousPlayerInCar)
|
if(m_bPlayerInCar && !m_bPreviousPlayerInCar)
|
||||||
pCurrentStation = nil;
|
pCurrentStation = nil;
|
||||||
|
|
||||||
|
#ifdef RADIO_SCROLL_TO_PREV_STATION
|
||||||
|
if(gNumRetunePresses < 0) {
|
||||||
|
gStreamedSound = m_nCurrentStreamedSound;
|
||||||
|
|
||||||
|
if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT ||
|
||||||
|
gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) {
|
||||||
|
gStreamedSound = POLICE_RADIO; // which means OFF
|
||||||
|
|
||||||
|
} else if(gStreamedSound > STREAMED_SOUND_RADIO_MP3_PLAYER)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gRetuneCounter = gNumRetunePresses;
|
||||||
|
pRetune = gStreamedSound;
|
||||||
|
|
||||||
|
while(gRetuneCounter < 0) {
|
||||||
|
if(pRetune == HEAD_RADIO) {
|
||||||
|
pRetune = RADIO_OFF;
|
||||||
|
} else if(pRetune == RADIO_OFF || pRetune == POLICE_RADIO) {
|
||||||
|
pRetune = SampleManager.IsMP3RadioChannelAvailable() ? USERTRACK : USERTRACK - 1;
|
||||||
|
} else
|
||||||
|
pRetune--;
|
||||||
|
|
||||||
|
++gRetuneCounter;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
if(SampleManager.IsMP3RadioChannelAvailable()) {
|
if(SampleManager.IsMP3RadioChannelAvailable()) {
|
||||||
gStreamedSound = m_nCurrentStreamedSound;
|
gStreamedSound = m_nCurrentStreamedSound;
|
||||||
|
|
||||||
if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT ||
|
if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT ||
|
||||||
gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) {
|
gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) {
|
||||||
gStreamedSound = STREAMED_SOUND_RADIO_POLICE;
|
gStreamedSound = POLICE_RADIO; // which means OFF
|
||||||
} else {
|
} else if(gStreamedSound > STREAMED_SOUND_RADIO_MP3_PLAYER)
|
||||||
|
|
||||||
if(gStreamedSound >
|
|
||||||
STREAMED_SOUND_RADIO_MP3_PLAYER)
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
pRetune = gNumRetunePresses + gStreamedSound;
|
pRetune = gNumRetunePresses + gStreamedSound;
|
||||||
|
|
||||||
@ -140,10 +162,17 @@ cMusicManager::DisplayRadioStationName()
|
|||||||
case FLASHBACK: string = TheText.Get("FEA_FM7"); break;
|
case FLASHBACK: string = TheText.Get("FEA_FM7"); break;
|
||||||
case CHATTERBOX: string = TheText.Get("FEA_FM8"); break;
|
case CHATTERBOX: string = TheText.Get("FEA_FM8"); break;
|
||||||
case USERTRACK: string = TheText.Get("FEA_FM9"); break;
|
case USERTRACK: string = TheText.Get("FEA_FM9"); break;
|
||||||
|
#ifdef RADIO_OFF_TEXT
|
||||||
|
case RADIO_OFF: case POLICE_RADIO: string = TheText.Get("FEM_OFF"); break;
|
||||||
|
#endif
|
||||||
default: return;
|
default: return;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef RADIO_OFF_TEXT
|
||||||
|
if(pRetune == USERTRACK && !SampleManager.IsMP3RadioChannelAvailable()) { string = TheText.Get("FEM_OFF"); }
|
||||||
|
#else
|
||||||
if(pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) { return; }
|
if(pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) { return; }
|
||||||
|
#endif
|
||||||
|
|
||||||
if(string && pCurrentStation != string ||
|
if(string && pCurrentStation != string ||
|
||||||
m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_MP3_PLAYER &&
|
m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_MP3_PLAYER &&
|
||||||
@ -161,9 +190,15 @@ cMusicManager::DisplayRadioStationName()
|
|||||||
CFont::SetPropOn();
|
CFont::SetPropOn();
|
||||||
CFont::SetFontStyle(FONT_HEADING);
|
CFont::SetFontStyle(FONT_HEADING);
|
||||||
CFont::SetCentreOn();
|
CFont::SetCentreOn();
|
||||||
CFont::SetCentreSize(SCREEN_STRETCH_X(640.0f));
|
// Reminder: Game doesn't have "scaling" at all, it just stretches, and it's team's decision here to not let centered text occupy all the screen.
|
||||||
|
// Disable ASPECT_RATIO_SCALE and it'll go back to default behaviour; stretching.
|
||||||
|
CFont::SetCentreSize(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH));
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), SCREEN_SCALE_Y(22.0f) + SCREEN_SCALE_Y(2.0f), pCurrentStation);
|
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), SCREEN_SCALE_Y(22.0f) + SCREEN_SCALE_Y(2.0f), pCurrentStation);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2 + 2.0f, SCREEN_SCALE_Y(22.0f) + 2.0f, pCurrentStation);
|
||||||
|
#endif
|
||||||
|
|
||||||
if(gNumRetunePresses)
|
if(gNumRetunePresses)
|
||||||
CFont::SetColor(CRGBA(102, 133, 143, 255));
|
CFont::SetColor(CRGBA(102, 133, 143, 255));
|
||||||
@ -442,10 +477,11 @@ cMusicManager::ServiceGameMode()
|
|||||||
if (m_bPlayerInCar) {
|
if (m_bPlayerInCar) {
|
||||||
if (FindPlayerPed() != nil
|
if (FindPlayerPed() != nil
|
||||||
&& !FindPlayerPed()->DyingOrDead()
|
&& !FindPlayerPed()->DyingOrDead()
|
||||||
&& CPad::GetPad(0)->ChangeStationJustDown()
|
|
||||||
&& !CReplay::IsPlayingBack()
|
&& !CReplay::IsPlayingBack()
|
||||||
&& FindPlayerVehicle() != nil
|
&& FindPlayerVehicle() != nil
|
||||||
&& !UsesPoliceRadio(FindPlayerVehicle())) {
|
&& !UsesPoliceRadio(FindPlayerVehicle())) {
|
||||||
|
|
||||||
|
if (CPad::GetPad(0)->ChangeStationJustDown()) {
|
||||||
gRetuneCounter = 30;
|
gRetuneCounter = 30;
|
||||||
gNumRetunePresses++;
|
gNumRetunePresses++;
|
||||||
AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f);
|
AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f);
|
||||||
@ -454,6 +490,19 @@ cMusicManager::ServiceGameMode()
|
|||||||
gNumRetunePresses -= RADIO_OFF;
|
gNumRetunePresses -= RADIO_OFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef RADIO_SCROLL_TO_PREV_STATION
|
||||||
|
else if(CPad::GetPad(0)->GetMouseWheelDownJustDown() || CPad::GetPad(0)->GetMouseWheelUpJustDown()) {
|
||||||
|
int scrollNext = ControlsManager.GetControllerKeyAssociatedWithAction(VEHICLE_CHANGE_RADIO_STATION, MOUSE);
|
||||||
|
int scrollPrev = scrollNext == rsMOUSEWHEELUPBUTTON ? rsMOUSEWHEELDOWNBUTTON : scrollNext == rsMOUSEWHEELDOWNBUTTON ? rsMOUSEWHEELUPBUTTON : -1;
|
||||||
|
|
||||||
|
if (scrollPrev != -1 && !ControlsManager.IsAnyVehicleActionAssignedToMouseKey(scrollPrev)) {
|
||||||
|
gRetuneCounter = 30;
|
||||||
|
gNumRetunePresses--;
|
||||||
|
AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
nFramesSinceCutsceneEnded = -1;
|
nFramesSinceCutsceneEnded = -1;
|
||||||
}
|
}
|
||||||
@ -494,10 +543,22 @@ cMusicManager::ServiceGameMode()
|
|||||||
gNumRetunePresses = 0;
|
gNumRetunePresses = 0;
|
||||||
m_bSetNextStation = false;
|
m_bSetNextStation = false;
|
||||||
}
|
}
|
||||||
|
// Because when you switch radio back and forth, gNumRetunePresses will be 0 but gRetuneCounter won't.
|
||||||
|
#ifdef RADIO_SCROLL_TO_PREV_STATION
|
||||||
|
if (gRetuneCounter != 0) {
|
||||||
|
if (gRetuneCounter > 1) gRetuneCounter--;
|
||||||
|
else if (gRetuneCounter == 1) gRetuneCounter = -1;
|
||||||
|
else if (gRetuneCounter == -1) {
|
||||||
|
m_bSetNextStation = true;
|
||||||
|
gRetuneCounter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (gNumRetunePresses) {
|
if (gNumRetunePresses) {
|
||||||
if (gRetuneCounter != 0) gRetuneCounter--;
|
if (gRetuneCounter != 0) gRetuneCounter--;
|
||||||
else m_bSetNextStation = true;
|
else m_bSetNextStation = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (gRetuneCounter)
|
if (gRetuneCounter)
|
||||||
AudioManager.DoPoliceRadioCrackle();
|
AudioManager.DoPoliceRadioCrackle();
|
||||||
if (m_bSetNextStation) {
|
if (m_bSetNextStation) {
|
||||||
@ -863,6 +924,20 @@ cMusicManager::GetNextCarTuning()
|
|||||||
if (veh == nil) return RADIO_OFF;
|
if (veh == nil) return RADIO_OFF;
|
||||||
if (UsesPoliceRadio(veh)) return POLICE_RADIO;
|
if (UsesPoliceRadio(veh)) return POLICE_RADIO;
|
||||||
if (gNumRetunePresses != 0) {
|
if (gNumRetunePresses != 0) {
|
||||||
|
#ifdef RADIO_SCROLL_TO_PREV_STATION
|
||||||
|
if (gNumRetunePresses < 0) {
|
||||||
|
while (gNumRetunePresses < 0) {
|
||||||
|
if(veh->m_nRadioStation == HEAD_RADIO) {
|
||||||
|
veh->m_nRadioStation = RADIO_OFF;
|
||||||
|
} else if(veh->m_nRadioStation == RADIO_OFF || veh->m_nRadioStation == POLICE_RADIO) {
|
||||||
|
veh->m_nRadioStation = SampleManager.IsMP3RadioChannelAvailable() ? USERTRACK : USERTRACK - 1;
|
||||||
|
} else
|
||||||
|
veh->m_nRadioStation--;
|
||||||
|
|
||||||
|
++gNumRetunePresses;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
if (SampleManager.IsMP3RadioChannelAvailable()) {
|
if (SampleManager.IsMP3RadioChannelAvailable()) {
|
||||||
if (veh->m_nRadioStation == RADIO_OFF)
|
if (veh->m_nRadioStation == RADIO_OFF)
|
||||||
veh->m_nRadioStation = POLICE_RADIO;
|
veh->m_nRadioStation = POLICE_RADIO;
|
||||||
|
@ -91,9 +91,9 @@ cAudioManager::InitialisePoliceRadio()
|
|||||||
m_sPoliceRadioQueue.policeChannelTimerSeconds = 0;
|
m_sPoliceRadioQueue.policeChannelTimerSeconds = 0;
|
||||||
m_sPoliceRadioQueue.policeChannelCounterSeconds = 0;
|
m_sPoliceRadioQueue.policeChannelCounterSeconds = 0;
|
||||||
for (int32 i = 0; i < ARRAY_SIZE(m_sPoliceRadioQueue.crimes); i++)
|
for (int32 i = 0; i < ARRAY_SIZE(m_sPoliceRadioQueue.crimes); i++)
|
||||||
m_sPoliceRadioQueue.crimes[i].type = 0;
|
m_sPoliceRadioQueue.crimes[i].type = CRIME_NONE;
|
||||||
|
|
||||||
SampleManager.SetChannelReverbFlag(policeChannel, 0);
|
SampleManager.SetChannelReverbFlag(policeChannel, false);
|
||||||
gSpecialSuspectLastSeenReport = false;
|
gSpecialSuspectLastSeenReport = false;
|
||||||
for (int32 i = 0; i < ARRAY_SIZE(gMinTimeToNextReport); i++)
|
for (int32 i = 0; i < ARRAY_SIZE(gMinTimeToNextReport); i++)
|
||||||
gMinTimeToNextReport[i] = m_FrameCounter;
|
gMinTimeToNextReport[i] = m_FrameCounter;
|
||||||
@ -154,7 +154,7 @@ cAudioManager::ServicePoliceRadio()
|
|||||||
|
|
||||||
if(!m_bIsInitialised) return;
|
if(!m_bIsInitialised) return;
|
||||||
|
|
||||||
if(!m_nUserPause) {
|
if(m_nUserPause == 0) {
|
||||||
bool crimeReport = SetupCrimeReport();
|
bool crimeReport = SetupCrimeReport();
|
||||||
#ifdef FIX_BUGS // Crash at 0x5fe6ef
|
#ifdef FIX_BUGS // Crash at 0x5fe6ef
|
||||||
if(CReplay::IsPlayingBack() || !FindPlayerPed() || !FindPlayerPed()->m_pWanted)
|
if(CReplay::IsPlayingBack() || !FindPlayerPed() || !FindPlayerPed()->m_pWanted)
|
||||||
@ -162,8 +162,8 @@ cAudioManager::ServicePoliceRadio()
|
|||||||
#endif
|
#endif
|
||||||
wantedLevel = FindPlayerPed()->m_pWanted->m_nWantedLevel;
|
wantedLevel = FindPlayerPed()->m_pWanted->m_nWantedLevel;
|
||||||
if(!crimeReport) {
|
if(!crimeReport) {
|
||||||
if(wantedLevel) {
|
if(wantedLevel != 0) {
|
||||||
if(nLastSeen) {
|
if(nLastSeen != 0) {
|
||||||
--nLastSeen;
|
--nLastSeen;
|
||||||
} else {
|
} else {
|
||||||
nLastSeen = m_anRandomTable[1] % 1000 + 2000;
|
nLastSeen = m_anRandomTable[1] % 1000 + 2000;
|
||||||
@ -176,7 +176,7 @@ cAudioManager::ServicePoliceRadio()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
|
||||||
{
|
{
|
||||||
bool processed = false;
|
bool processed = false;
|
||||||
uint32 sample;
|
uint32 sample;
|
||||||
@ -189,7 +189,7 @@ cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
|||||||
|
|
||||||
if (!m_bIsInitialised) return;
|
if (!m_bIsInitialised) return;
|
||||||
|
|
||||||
if (m_nUserPause) {
|
if (m_nUserPause != 0) {
|
||||||
if (SampleManager.GetChannelUsedFlag(policeChannel)) SampleManager.StopChannel(policeChannel);
|
if (SampleManager.GetChannelUsedFlag(policeChannel)) SampleManager.StopChannel(policeChannel);
|
||||||
if (g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES && bMissionAudioPhysicalPlayingStatus == 1 &&
|
if (g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES && bMissionAudioPhysicalPlayingStatus == 1 &&
|
||||||
SampleManager.IsStreamPlaying(1)) {
|
SampleManager.IsStreamPlaying(1)) {
|
||||||
@ -241,7 +241,7 @@ cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
|||||||
} else {
|
} else {
|
||||||
sample = TOTAL_AUDIO_SAMPLES;
|
sample = TOTAL_AUDIO_SAMPLES;
|
||||||
}
|
}
|
||||||
if (!wantedLevel) {
|
if (wantedLevel == 0) {
|
||||||
if (gSpecialSuspectLastSeenReport) {
|
if (gSpecialSuspectLastSeenReport) {
|
||||||
gSpecialSuspectLastSeenReport = 0;
|
gSpecialSuspectLastSeenReport = 0;
|
||||||
} else if (((sample >= SFX_POLICE_RADIO_MESSAGE_NOISE_1) && (sample <= SFX_POLICE_RADIO_MESSAGE_NOISE_3)) || sample == TOTAL_AUDIO_SAMPLES) {
|
} else if (((sample >= SFX_POLICE_RADIO_MESSAGE_NOISE_1) && (sample <= SFX_POLICE_RADIO_MESSAGE_NOISE_3)) || sample == TOTAL_AUDIO_SAMPLES) {
|
||||||
@ -675,7 +675,7 @@ cAudioManager::SetupSuspectLastSeenReport()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cAudioManager::ReportCrime(int32 type, const CVector *pos)
|
cAudioManager::ReportCrime(eCrimeType type, const CVector &pos)
|
||||||
{
|
{
|
||||||
int32 lastCrime = ARRAY_SIZE(m_sPoliceRadioQueue.crimes);
|
int32 lastCrime = ARRAY_SIZE(m_sPoliceRadioQueue.crimes);
|
||||||
if (m_bIsInitialised && MusicManager.m_nMusicMode != MUSICMODE_CUTSCENE && FindPlayerPed()->m_pWanted->m_nWantedLevel > 0 &&
|
if (m_bIsInitialised && MusicManager.m_nMusicMode != MUSICMODE_CUTSCENE && FindPlayerPed()->m_pWanted->m_nWantedLevel > 0 &&
|
||||||
@ -683,7 +683,7 @@ cAudioManager::ReportCrime(int32 type, const CVector *pos)
|
|||||||
for (int32 i = 0; i < ARRAY_SIZE(m_sPoliceRadioQueue.crimes); i++) {
|
for (int32 i = 0; i < ARRAY_SIZE(m_sPoliceRadioQueue.crimes); i++) {
|
||||||
if (m_sPoliceRadioQueue.crimes[i].type) {
|
if (m_sPoliceRadioQueue.crimes[i].type) {
|
||||||
if (m_sPoliceRadioQueue.crimes[i].type == type) {
|
if (m_sPoliceRadioQueue.crimes[i].type == type) {
|
||||||
m_sPoliceRadioQueue.crimes[i].position = *pos;
|
m_sPoliceRadioQueue.crimes[i].position = pos;
|
||||||
m_sPoliceRadioQueue.crimes[i].timer = 0;
|
m_sPoliceRadioQueue.crimes[i].timer = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -694,7 +694,7 @@ cAudioManager::ReportCrime(int32 type, const CVector *pos)
|
|||||||
|
|
||||||
if (lastCrime < ARRAY_SIZE(m_sPoliceRadioQueue.crimes)) {
|
if (lastCrime < ARRAY_SIZE(m_sPoliceRadioQueue.crimes)) {
|
||||||
m_sPoliceRadioQueue.crimes[lastCrime].type = type;
|
m_sPoliceRadioQueue.crimes[lastCrime].type = type;
|
||||||
m_sPoliceRadioQueue.crimes[lastCrime].position = *pos;
|
m_sPoliceRadioQueue.crimes[lastCrime].position = pos;
|
||||||
m_sPoliceRadioQueue.crimes[lastCrime].timer = 0;
|
m_sPoliceRadioQueue.crimes[lastCrime].timer = 0;
|
||||||
gMinTimeToNextReport[type] = m_FrameCounter + 500;
|
gMinTimeToNextReport[type] = m_FrameCounter + 500;
|
||||||
}
|
}
|
||||||
|
@ -235,7 +235,7 @@ enum AudioEntityHandle {
|
|||||||
AEHANDLE_ERROR_BADAUDIOTYPE = -1,
|
AEHANDLE_ERROR_BADAUDIOTYPE = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eAudioType : int32
|
enum eAudioType
|
||||||
{
|
{
|
||||||
AUDIOTYPE_PHYSICAL = 0,
|
AUDIOTYPE_PHYSICAL = 0,
|
||||||
AUDIOTYPE_EXPLOSION,
|
AUDIOTYPE_EXPLOSION,
|
||||||
|
@ -10,17 +10,49 @@
|
|||||||
|
|
||||||
extern bool IsFXSupported();
|
extern bool IsFXSupported();
|
||||||
|
|
||||||
|
ALuint alSources[MAXCHANNELS+MAX2DCHANNELS];
|
||||||
|
ALuint alFilters[MAXCHANNELS+MAX2DCHANNELS];
|
||||||
|
ALuint alBuffers[MAXCHANNELS+MAX2DCHANNELS];
|
||||||
|
bool bChannelsCreated = false;
|
||||||
|
|
||||||
|
void
|
||||||
|
CChannel::InitChannels()
|
||||||
|
{
|
||||||
|
alGenSources(MAXCHANNELS+MAX2DCHANNELS, alSources);
|
||||||
|
alGenBuffers(MAXCHANNELS+MAX2DCHANNELS, alBuffers);
|
||||||
|
if (IsFXSupported())
|
||||||
|
alGenFilters(MAXCHANNELS + MAX2DCHANNELS, alFilters);
|
||||||
|
bChannelsCreated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CChannel::DestroyChannels()
|
||||||
|
{
|
||||||
|
if (bChannelsCreated)
|
||||||
|
{
|
||||||
|
alDeleteSources(MAXCHANNELS + MAX2DCHANNELS, alSources);
|
||||||
|
memset(alSources, 0, sizeof(alSources));
|
||||||
|
alDeleteBuffers(MAXCHANNELS + MAX2DCHANNELS, alBuffers);
|
||||||
|
memset(alBuffers, 0, sizeof(alBuffers));
|
||||||
|
if (IsFXSupported())
|
||||||
|
{
|
||||||
|
alDeleteFilters(MAXCHANNELS + MAX2DCHANNELS, alFilters);
|
||||||
|
memset(alFilters, 0, sizeof(alFilters));
|
||||||
|
}
|
||||||
|
bChannelsCreated = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CChannel::CChannel()
|
CChannel::CChannel()
|
||||||
{
|
{
|
||||||
alSource = AL_NONE;
|
Data = nil;
|
||||||
alFilter = AL_FILTER_NULL;
|
DataSize = 0;
|
||||||
SetDefault();
|
SetDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetDefault()
|
void CChannel::SetDefault()
|
||||||
{
|
{
|
||||||
alBuffer = AL_NONE;
|
|
||||||
|
|
||||||
Pitch = 1.0f;
|
Pitch = 1.0f;
|
||||||
Gain = 1.0f;
|
Gain = 1.0f;
|
||||||
Mix = 0.0f;
|
Mix = 0.0f;
|
||||||
@ -39,25 +71,19 @@ void CChannel::Reset()
|
|||||||
SetDefault();
|
SetDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::Init(bool Is2D)
|
void CChannel::Init(uint32 _id, bool Is2D)
|
||||||
{
|
{
|
||||||
ASSERT(!HasSource());
|
id = _id;
|
||||||
alGenSources(1, &alSource);
|
|
||||||
if ( HasSource() )
|
if ( HasSource() )
|
||||||
{
|
{
|
||||||
alSourcei(alSource, AL_SOURCE_RELATIVE, AL_TRUE);
|
alSourcei(alSources[id], AL_SOURCE_RELATIVE, AL_TRUE);
|
||||||
if ( IsFXSupported() )
|
if ( IsFXSupported() )
|
||||||
alSource3i(alSource, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, 0, AL_FILTER_NULL);
|
alSource3i(alSources[id], AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, 0, AL_FILTER_NULL);
|
||||||
|
|
||||||
if ( Is2D )
|
if ( Is2D )
|
||||||
{
|
{
|
||||||
alSource3f(alSource, AL_POSITION, 0.0f, 0.0f, 0.0f);
|
alSource3f(alSources[id], AL_POSITION, 0.0f, 0.0f, 0.0f);
|
||||||
alSourcef (alSource, AL_GAIN, 1.0f);
|
alSourcef(alSources[id], AL_GAIN, 1.0f);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( IsFXSupported() )
|
|
||||||
alGenFilters(1,&alFilter);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,39 +95,34 @@ void CChannel::Term()
|
|||||||
{
|
{
|
||||||
if ( IsFXSupported() )
|
if ( IsFXSupported() )
|
||||||
{
|
{
|
||||||
alSource3i(alSource, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, 0, AL_FILTER_NULL);
|
alSource3i(alSources[id], AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, 0, AL_FILTER_NULL);
|
||||||
|
|
||||||
if(alFilter != AL_FILTER_NULL)
|
|
||||||
alDeleteFilters(1,&alFilter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
alDeleteSources(1, &alSource);
|
|
||||||
}
|
}
|
||||||
alSource = AL_NONE;
|
|
||||||
alFilter = AL_FILTER_NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::Start()
|
void CChannel::Start()
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
|
if ( !Data ) return;
|
||||||
|
|
||||||
|
alBufferData(alBuffers[id], AL_FORMAT_MONO16, Data, DataSize, Frequency);
|
||||||
if ( LoopPoints[0] != 0 && LoopPoints[0] != -1 )
|
if ( LoopPoints[0] != 0 && LoopPoints[0] != -1 )
|
||||||
alBufferiv(alBuffer, AL_LOOP_POINTS_SOFT, LoopPoints);
|
alBufferiv(alBuffers[id], AL_LOOP_POINTS_SOFT, LoopPoints);
|
||||||
alSourcei (alSource, AL_BUFFER, alBuffer);
|
alSourcei(alSources[id], AL_BUFFER, alBuffers[id]);
|
||||||
alSourcePlay(alSource);
|
alSourcePlay(alSources[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::Stop()
|
void CChannel::Stop()
|
||||||
{
|
{
|
||||||
if ( HasSource() )
|
if ( HasSource() )
|
||||||
alSourceStop(alSource);
|
alSourceStop(alSources[id]);
|
||||||
|
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CChannel::HasSource()
|
bool CChannel::HasSource()
|
||||||
{
|
{
|
||||||
return alSource != AL_NONE;
|
return alSources[id] != AL_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CChannel::IsUsed()
|
bool CChannel::IsUsed()
|
||||||
@ -109,7 +130,7 @@ bool CChannel::IsUsed()
|
|||||||
if ( HasSource() )
|
if ( HasSource() )
|
||||||
{
|
{
|
||||||
ALint sourceState;
|
ALint sourceState;
|
||||||
alGetSourcei(alSource, AL_SOURCE_STATE, &sourceState);
|
alGetSourcei(alSources[id], AL_SOURCE_STATE, &sourceState);
|
||||||
return sourceState == AL_PLAYING;
|
return sourceState == AL_PLAYING;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -118,13 +139,13 @@ bool CChannel::IsUsed()
|
|||||||
void CChannel::SetPitch(float pitch)
|
void CChannel::SetPitch(float pitch)
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
alSourcef(alSource, AL_PITCH, pitch);
|
alSourcef(alSources[id], AL_PITCH, pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetGain(float gain)
|
void CChannel::SetGain(float gain)
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
alSourcef(alSource, AL_GAIN, gain);
|
alSourcef(alSources[id], AL_GAIN, gain);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetVolume(int32 vol)
|
void CChannel::SetVolume(int32 vol)
|
||||||
@ -132,14 +153,20 @@ void CChannel::SetVolume(int32 vol)
|
|||||||
SetGain(ALfloat(vol) / MAX_VOLUME);
|
SetGain(ALfloat(vol) / MAX_VOLUME);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetSampleID(uint32 nSfx)
|
void CChannel::SetSampleData(void *_data, size_t _DataSize, int32 freq)
|
||||||
{
|
|
||||||
Sample = nSfx;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannel::SetFreq(int32 freq)
|
|
||||||
{
|
{
|
||||||
|
DataSize = _DataSize;
|
||||||
Frequency = freq;
|
Frequency = freq;
|
||||||
|
|
||||||
|
#ifdef BIGENDIAN
|
||||||
|
Data = malloc(DataSize);
|
||||||
|
memcpy(Data, _data, DataSize);
|
||||||
|
for (int i = 0; i < DataSize / sizeof(uint16); i++) {
|
||||||
|
((uint16*)Data)[i] = BSWAP16(((uint16*)Data)[i]);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
Data = _data;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetCurrentFreq(uint32 freq)
|
void CChannel::SetCurrentFreq(uint32 freq)
|
||||||
@ -150,7 +177,7 @@ void CChannel::SetCurrentFreq(uint32 freq)
|
|||||||
void CChannel::SetLoopCount(int32 loopCount) // fake. TODO:
|
void CChannel::SetLoopCount(int32 loopCount) // fake. TODO:
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
alSourcei(alSource, AL_LOOPING, loopCount == 1 ? AL_FALSE : AL_TRUE);
|
alSourcei(alSources[id], AL_LOOPING, loopCount == 1 ? AL_FALSE : AL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetLoopPoints(ALint start, ALint end)
|
void CChannel::SetLoopPoints(ALint start, ALint end)
|
||||||
@ -162,53 +189,54 @@ void CChannel::SetLoopPoints(ALint start, ALint end)
|
|||||||
void CChannel::SetPosition(float x, float y, float z)
|
void CChannel::SetPosition(float x, float y, float z)
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
alSource3f(alSource, AL_POSITION, x, y, z);
|
alSource3f(alSources[id], AL_POSITION, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetDistances(float max, float min)
|
void CChannel::SetDistances(float max, float min)
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
alSourcef (alSource, AL_MAX_DISTANCE, max);
|
alSourcef (alSources[id], AL_MAX_DISTANCE, max);
|
||||||
alSourcef (alSource, AL_REFERENCE_DISTANCE, min);
|
alSourcef (alSources[id], AL_REFERENCE_DISTANCE, min);
|
||||||
alSourcef (alSource, AL_MAX_GAIN, 1.0f);
|
alSourcef (alSources[id], AL_MAX_GAIN, 1.0f);
|
||||||
alSourcef (alSource, AL_ROLLOFF_FACTOR, 1.0f);
|
alSourcef (alSources[id], AL_ROLLOFF_FACTOR, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetPan(uint32 pan)
|
void CChannel::SetPan(int32 pan)
|
||||||
{
|
{
|
||||||
SetPosition((pan-63)/64.0f, 0.0f, Sqrt(1.0f-SQR((pan-63)/64.0f)));
|
SetPosition((pan-63)/64.0f, 0.0f, Sqrt(1.0f-SQR((pan-63)/64.0f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetBuffer(ALuint buffer)
|
|
||||||
{
|
|
||||||
alBuffer = buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannel::ClearBuffer()
|
void CChannel::ClearBuffer()
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
SetBuffer(AL_NONE);
|
alSourcei(alSources[id], AL_BUFFER, AL_NONE);
|
||||||
alSourcei(alSource, AL_BUFFER, AL_NONE);
|
|
||||||
|
#ifdef BIGENDIAN
|
||||||
|
free(Data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Data = nil;
|
||||||
|
DataSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::SetReverbMix(ALuint slot, float mix)
|
void CChannel::SetReverbMix(ALuint slot, float mix)
|
||||||
{
|
{
|
||||||
if ( !IsFXSupported() ) return;
|
if ( !IsFXSupported() ) return;
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
if ( alFilter == AL_FILTER_NULL ) return;
|
if ( alFilters[id] == AL_FILTER_NULL ) return;
|
||||||
|
|
||||||
Mix = mix;
|
Mix = mix;
|
||||||
EAX3_SetReverbMix(alFilter, mix);
|
EAX3_SetReverbMix(alFilters[id], mix);
|
||||||
alSource3i(alSource, AL_AUXILIARY_SEND_FILTER, slot, 0, alFilter);
|
alSource3i(alSources[id], AL_AUXILIARY_SEND_FILTER, slot, 0, alFilters[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannel::UpdateReverb(ALuint slot)
|
void CChannel::UpdateReverb(ALuint slot)
|
||||||
{
|
{
|
||||||
if ( !IsFXSupported() ) return;
|
if ( !IsFXSupported() ) return;
|
||||||
if ( !HasSource() ) return;
|
if ( !HasSource() ) return;
|
||||||
if ( alFilter == AL_FILTER_NULL ) return;
|
if ( alFilters[id] == AL_FILTER_NULL ) return;
|
||||||
EAX3_SetReverbMix(alFilter, Mix);
|
EAX3_SetReverbMix(alFilters[id], Mix);
|
||||||
alSource3i(alSource, AL_AUXILIARY_SEND_FILTER, slot, 0, alFilter);
|
alSource3i(alSources[id], AL_AUXILIARY_SEND_FILTER, slot, 0, alFilters[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,22 +9,24 @@
|
|||||||
|
|
||||||
class CChannel
|
class CChannel
|
||||||
{
|
{
|
||||||
ALuint alSource;
|
uint32 id;
|
||||||
ALuint alFilter;
|
|
||||||
ALuint alBuffer;
|
|
||||||
float Pitch, Gain;
|
float Pitch, Gain;
|
||||||
float Mix;
|
float Mix;
|
||||||
|
void *Data;
|
||||||
|
size_t DataSize;
|
||||||
int32 Frequency;
|
int32 Frequency;
|
||||||
float Position[3];
|
float Position[3];
|
||||||
float Distances[2];
|
float Distances[2];
|
||||||
int32 LoopCount;
|
int32 LoopCount;
|
||||||
ALint LoopPoints[2];
|
ALint LoopPoints[2];
|
||||||
uint32 Sample;
|
|
||||||
public:
|
public:
|
||||||
|
static void InitChannels();
|
||||||
|
static void DestroyChannels();
|
||||||
|
|
||||||
CChannel();
|
CChannel();
|
||||||
void SetDefault();
|
void SetDefault();
|
||||||
void Reset();
|
void Reset();
|
||||||
void Init(bool Is2D = false);
|
void Init(uint32 _id, bool Is2D = false);
|
||||||
void Term();
|
void Term();
|
||||||
void Start();
|
void Start();
|
||||||
void Stop();
|
void Stop();
|
||||||
@ -33,15 +35,13 @@ public:
|
|||||||
void SetPitch(float pitch);
|
void SetPitch(float pitch);
|
||||||
void SetGain(float gain);
|
void SetGain(float gain);
|
||||||
void SetVolume(int32 vol);
|
void SetVolume(int32 vol);
|
||||||
void SetSampleID(uint32 nSfx);
|
void SetSampleData(void *_data, size_t _DataSize, int32 freq);
|
||||||
void SetFreq(int32 freq);
|
|
||||||
void SetCurrentFreq(uint32 freq);
|
void SetCurrentFreq(uint32 freq);
|
||||||
void SetLoopCount(int32 loopCount); // fake
|
void SetLoopCount(int32 loopCount); // fake
|
||||||
void SetLoopPoints(ALint start, ALint end);
|
void SetLoopPoints(ALint start, ALint end);
|
||||||
void SetPosition(float x, float y, float z);
|
void SetPosition(float x, float y, float z);
|
||||||
void SetDistances(float max, float min);
|
void SetDistances(float max, float min);
|
||||||
void SetPan(uint32 pan);
|
void SetPan(int32 pan);
|
||||||
void SetBuffer(ALuint buffer);
|
|
||||||
void ClearBuffer();
|
void ClearBuffer();
|
||||||
void SetReverbMix(ALuint slot, float mix);
|
void SetReverbMix(ALuint slot, float mix);
|
||||||
void UpdateReverb(ALuint slot);
|
void UpdateReverb(ALuint slot);
|
||||||
|
@ -4,6 +4,14 @@
|
|||||||
#ifdef AUDIO_OAL
|
#ifdef AUDIO_OAL
|
||||||
|
|
||||||
#ifndef __WIIU__
|
#ifndef __WIIU__
|
||||||
|
/*
|
||||||
|
* When linking to a static openal-soft library,
|
||||||
|
* the extension function inside the openal library conflict with the variables here.
|
||||||
|
* Therefore declare these re3 owned symbols in a private namespace.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace re3_openal {
|
||||||
|
|
||||||
LPALGENEFFECTS alGenEffects;
|
LPALGENEFFECTS alGenEffects;
|
||||||
LPALDELETEEFFECTS alDeleteEffects;
|
LPALDELETEEFFECTS alDeleteEffects;
|
||||||
LPALISEFFECT alIsEffect;
|
LPALISEFFECT alIsEffect;
|
||||||
@ -37,8 +45,12 @@ LPALGETFILTERI alGetFilteri;
|
|||||||
LPALGETFILTERIV alGetFilteriv;
|
LPALGETFILTERIV alGetFilteriv;
|
||||||
LPALGETFILTERF alGetFilterf;
|
LPALGETFILTERF alGetFilterf;
|
||||||
LPALGETFILTERFV alGetFilterfv;
|
LPALGETFILTERFV alGetFilterfv;
|
||||||
#endif
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace re3_openal;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void EFXInit()
|
void EFXInit()
|
||||||
{
|
{
|
||||||
|
@ -11,6 +11,8 @@ void EFX_Set(ALuint effect, const EAXLISTENERPROPERTIES *props);
|
|||||||
void EAX3_SetReverbMix(ALuint filter, float mix);
|
void EAX3_SetReverbMix(ALuint filter, float mix);
|
||||||
void SetEffectsLevel(ALuint uiFilter, float level);
|
void SetEffectsLevel(ALuint uiFilter, float level);
|
||||||
|
|
||||||
|
namespace re3_openal {
|
||||||
|
|
||||||
extern LPALGENEFFECTS alGenEffects;
|
extern LPALGENEFFECTS alGenEffects;
|
||||||
extern LPALDELETEEFFECTS alDeleteEffects;
|
extern LPALDELETEEFFECTS alDeleteEffects;
|
||||||
extern LPALISEFFECT alIsEffect;
|
extern LPALISEFFECT alIsEffect;
|
||||||
@ -44,4 +46,9 @@ extern LPALGETFILTERI alGetFilteri;
|
|||||||
extern LPALGETFILTERIV alGetFilteriv;
|
extern LPALGETFILTERIV alGetFilteriv;
|
||||||
extern LPALGETFILTERF alGetFilterf;
|
extern LPALGETFILTERF alGetFilterf;
|
||||||
extern LPALGETFILTERFV alGetFilterfv;
|
extern LPALGETFILTERFV alGetFilterfv;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace re3_openal;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,13 +10,15 @@
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#pragma comment( lib, "libsndfile-1.lib" )
|
#pragma comment( lib, "libsndfile-1.lib" )
|
||||||
#pragma comment( lib, "libmpg123-0.lib" )
|
#pragma comment( lib, "libmpg123-0.lib" )
|
||||||
#else
|
|
||||||
#include "crossplatform.h"
|
|
||||||
#endif
|
#endif
|
||||||
#include <sndfile.h>
|
#include <sndfile.h>
|
||||||
#include <mpg123.h>
|
#include <mpg123.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include "crossplatform.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef AUDIO_OPUS
|
#ifndef AUDIO_OPUS
|
||||||
class CSndFile : public IDecoder
|
class CSndFile : public IDecoder
|
||||||
{
|
{
|
||||||
@ -155,13 +157,13 @@ public:
|
|||||||
void Seek(uint32 milliseconds)
|
void Seek(uint32 milliseconds)
|
||||||
{
|
{
|
||||||
if ( !IsOpened() ) return;
|
if ( !IsOpened() ) return;
|
||||||
mpg123_seek(m_pMH, ms2samples(milliseconds)*GetSampleSize(), SEEK_SET);
|
mpg123_seek(m_pMH, ms2samples(milliseconds), SEEK_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Tell()
|
uint32 Tell()
|
||||||
{
|
{
|
||||||
if ( !IsOpened() ) return 0;
|
if ( !IsOpened() ) return 0;
|
||||||
return samples2ms(mpg123_tell(m_pMH)/GetSampleSize());
|
return samples2ms(mpg123_tell(m_pMH));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Decode(void *buffer)
|
uint32 Decode(void *buffer)
|
||||||
@ -195,7 +197,7 @@ public:
|
|||||||
|
|
||||||
if (m_FileH) {
|
if (m_FileH) {
|
||||||
m_nChannels = op_head(m_FileH, 0)->channel_count;
|
m_nChannels = op_head(m_FileH, 0)->channel_count;
|
||||||
m_nRate = op_head(m_FileH, 0)->input_sample_rate;
|
m_nRate = 48000;
|
||||||
const OpusTags *tags = op_tags(m_FileH, 0);
|
const OpusTags *tags = op_tags(m_FileH, 0);
|
||||||
for (int i = 0; i < tags->comments; i++) {
|
for (int i = 0; i < tags->comments; i++) {
|
||||||
if (strncmp(tags->user_comments[i], "SAMPLERATE", sizeof("SAMPLERATE")-1) == 0)
|
if (strncmp(tags->user_comments[i], "SAMPLERATE", sizeof("SAMPLERATE")-1) == 0)
|
||||||
@ -247,13 +249,13 @@ public:
|
|||||||
void Seek(uint32 milliseconds)
|
void Seek(uint32 milliseconds)
|
||||||
{
|
{
|
||||||
if ( !IsOpened() ) return;
|
if ( !IsOpened() ) return;
|
||||||
op_pcm_seek(m_FileH, ms2samples(milliseconds) * GetSampleSize());
|
op_pcm_seek(m_FileH, ms2samples(milliseconds) / GetChannels());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Tell()
|
uint32 Tell()
|
||||||
{
|
{
|
||||||
if ( !IsOpened() ) return 0;
|
if ( !IsOpened() ) return 0;
|
||||||
return samples2ms(op_pcm_tell(m_FileH)/GetSampleSize());
|
return samples2ms(op_pcm_tell(m_FileH) * GetChannels());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Decode(void *buffer)
|
uint32 Decode(void *buffer)
|
||||||
@ -323,8 +325,8 @@ CStream::CStream(char *filename, ALuint &source, ALuint (&buffers)[NUM_STREAMBUF
|
|||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
m_pSoundFile = nil;
|
m_pSoundFile = nil;
|
||||||
ASSERT(m_pSoundFile != nil);
|
|
||||||
if (m_pSoundFile && m_pSoundFile->IsOpened() )
|
if ( IsOpened() )
|
||||||
{
|
{
|
||||||
m_pBuffer = malloc(m_pSoundFile->GetBufferSize());
|
m_pBuffer = malloc(m_pSoundFile->GetBufferSize());
|
||||||
ASSERT(m_pBuffer!=nil);
|
ASSERT(m_pBuffer!=nil);
|
||||||
@ -371,14 +373,14 @@ bool CStream::HasSource()
|
|||||||
|
|
||||||
bool CStream::IsOpened()
|
bool CStream::IsOpened()
|
||||||
{
|
{
|
||||||
return m_pSoundFile->IsOpened();
|
return m_pSoundFile && m_pSoundFile->IsOpened();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CStream::IsPlaying()
|
bool CStream::IsPlaying()
|
||||||
{
|
{
|
||||||
if ( !HasSource() || !IsOpened() ) return false;
|
if ( !HasSource() || !IsOpened() ) return false;
|
||||||
|
|
||||||
if ( m_pSoundFile->IsOpened() && !m_bPaused )
|
if ( !m_bPaused )
|
||||||
{
|
{
|
||||||
ALint sourceState;
|
ALint sourceState;
|
||||||
alGetSourcei(m_alSource, AL_SOURCE_STATE, &sourceState);
|
alGetSourcei(m_alSource, AL_SOURCE_STATE, &sourceState);
|
||||||
@ -446,7 +448,7 @@ void CStream::SetPan(uint8 nPan)
|
|||||||
|
|
||||||
void CStream::SetPosMS(uint32 nPos)
|
void CStream::SetPosMS(uint32 nPos)
|
||||||
{
|
{
|
||||||
if ( !m_pSoundFile->IsOpened() ) return;
|
if ( !IsOpened() ) return;
|
||||||
m_pSoundFile->Seek(nPos);
|
m_pSoundFile->Seek(nPos);
|
||||||
ClearBuffers();
|
ClearBuffers();
|
||||||
}
|
}
|
||||||
@ -454,20 +456,20 @@ void CStream::SetPosMS(uint32 nPos)
|
|||||||
uint32 CStream::GetPosMS()
|
uint32 CStream::GetPosMS()
|
||||||
{
|
{
|
||||||
if ( !HasSource() ) return 0;
|
if ( !HasSource() ) return 0;
|
||||||
if ( !m_pSoundFile->IsOpened() ) return 0;
|
if ( !IsOpened() ) return 0;
|
||||||
|
|
||||||
ALint offset;
|
ALint offset;
|
||||||
//alGetSourcei(m_alSource, AL_SAMPLE_OFFSET, &offset);
|
//alGetSourcei(m_alSource, AL_SAMPLE_OFFSET, &offset);
|
||||||
alGetSourcei(m_alSource, AL_BYTE_OFFSET, &offset);
|
alGetSourcei(m_alSource, AL_BYTE_OFFSET, &offset);
|
||||||
|
|
||||||
return m_pSoundFile->Tell()
|
return m_pSoundFile->Tell()
|
||||||
- m_pSoundFile->samples2ms(m_pSoundFile->GetBufferSamples() * (NUM_STREAMBUFFERS-1))
|
- m_pSoundFile->samples2ms(m_pSoundFile->GetBufferSamples() * (NUM_STREAMBUFFERS-1)) / m_pSoundFile->GetChannels()
|
||||||
+ m_pSoundFile->samples2ms(offset/m_pSoundFile->GetSampleSize());
|
+ m_pSoundFile->samples2ms(offset/m_pSoundFile->GetSampleSize()) / m_pSoundFile->GetChannels();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 CStream::GetLengthMS()
|
uint32 CStream::GetLengthMS()
|
||||||
{
|
{
|
||||||
if ( !m_pSoundFile->IsOpened() ) return 0;
|
if ( !IsOpened() ) return 0;
|
||||||
return m_pSoundFile->GetLength();
|
return m_pSoundFile->GetLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,7 +477,7 @@ bool CStream::FillBuffer(ALuint alBuffer)
|
|||||||
{
|
{
|
||||||
if ( !HasSource() )
|
if ( !HasSource() )
|
||||||
return false;
|
return false;
|
||||||
if ( !m_pSoundFile->IsOpened() )
|
if ( !IsOpened() )
|
||||||
return false;
|
return false;
|
||||||
if ( !(alBuffer != AL_NONE && alIsBuffer(alBuffer)) )
|
if ( !(alBuffer != AL_NONE && alIsBuffer(alBuffer)) )
|
||||||
return false;
|
return false;
|
||||||
@ -517,7 +519,7 @@ void CStream::ClearBuffers()
|
|||||||
|
|
||||||
bool CStream::Setup()
|
bool CStream::Setup()
|
||||||
{
|
{
|
||||||
if ( m_pSoundFile->IsOpened() )
|
if ( IsOpened() )
|
||||||
{
|
{
|
||||||
m_pSoundFile->Seek(0);
|
m_pSoundFile->Seek(0);
|
||||||
alSourcei(m_alSource, AL_SOURCE_RELATIVE, AL_TRUE);
|
alSourcei(m_alSource, AL_SOURCE_RELATIVE, AL_TRUE);
|
||||||
|
@ -24,12 +24,12 @@ public:
|
|||||||
|
|
||||||
uint32 ms2samples(uint32 ms)
|
uint32 ms2samples(uint32 ms)
|
||||||
{
|
{
|
||||||
return float(ms) / 1000.0f * float(GetChannels()) * float(GetSampleRate());
|
return float(ms) / 1000.0f * float(GetSampleRate());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 samples2ms(uint32 sm)
|
uint32 samples2ms(uint32 sm)
|
||||||
{
|
{
|
||||||
return float(sm) * 1000.0f / float(GetChannels()) / float(GetSampleRate());
|
return float(sm) * 1000.0f / float(GetSampleRate());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 GetBufferSamples()
|
uint32 GetBufferSamples()
|
||||||
|
@ -158,10 +158,6 @@ public:
|
|||||||
bool Initialise(void);
|
bool Initialise(void);
|
||||||
void Terminate (void);
|
void Terminate (void);
|
||||||
|
|
||||||
#ifdef AUDIO_OAL
|
|
||||||
void UpdateSoundBuffers(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool CheckForAnAudioFileOnCD(void);
|
bool CheckForAnAudioFileOnCD(void);
|
||||||
char GetCDAudioDriveLetter (void);
|
char GetCDAudioDriveLetter (void);
|
||||||
|
|
||||||
@ -222,6 +218,10 @@ public:
|
|||||||
extern cSampleManager SampleManager;
|
extern cSampleManager SampleManager;
|
||||||
extern uint32 BankStartOffset[MAX_SFX_BANKS];
|
extern uint32 BankStartOffset[MAX_SFX_BANKS];
|
||||||
|
|
||||||
|
#ifdef AUDIO_OAL
|
||||||
|
extern int defaultProvider;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef AUDIO_OPUS
|
#ifdef AUDIO_OPUS
|
||||||
static char StreamedNameTable[][25] = {
|
static char StreamedNameTable[][25] = {
|
||||||
"AUDIO\\HEAD.OPUS", "AUDIO\\CLASS.OPUS", "AUDIO\\KJAH.OPUS", "AUDIO\\RISE.OPUS", "AUDIO\\LIPS.OPUS", "AUDIO\\GAME.OPUS",
|
"AUDIO\\HEAD.OPUS", "AUDIO\\CLASS.OPUS", "AUDIO\\KJAH.OPUS", "AUDIO\\RISE.OPUS", "AUDIO\\LIPS.OPUS", "AUDIO\\GAME.OPUS",
|
||||||
|
@ -65,7 +65,7 @@ uint32 _CurMP3Index;
|
|||||||
int32 _CurMP3Pos;
|
int32 _CurMP3Pos;
|
||||||
bool _bIsMp3Active;
|
bool _bIsMp3Active;
|
||||||
|
|
||||||
#if defined(GTA3_1_1_PATCH) || defined(GTA3_STEAM_PATCH) || defined(NO_CDCHECK)
|
#if GTA_VERSION >= GTA3_PC_11 || defined(NO_CDCHECK)
|
||||||
bool _bUseHDDAudio;
|
bool _bUseHDDAudio;
|
||||||
char _aHDDPath[MAX_PATH];
|
char _aHDDPath[MAX_PATH];
|
||||||
#endif
|
#endif
|
||||||
@ -1043,7 +1043,7 @@ cSampleManager::Initialise(void)
|
|||||||
|
|
||||||
if ( !m_bInitialised )
|
if ( !m_bInitialised )
|
||||||
{
|
{
|
||||||
#if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK)
|
#if GTA_VERSION < GTA3_PC_STEAM && !defined(NO_CDCHECK)
|
||||||
FrontEndMenuManager.WaitForUserCD();
|
FrontEndMenuManager.WaitForUserCD();
|
||||||
if ( FrontEndMenuManager.m_bQuitGameNoCD )
|
if ( FrontEndMenuManager.m_bQuitGameNoCD )
|
||||||
{
|
{
|
||||||
@ -1060,7 +1060,7 @@ cSampleManager::Initialise(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(GTA3_1_1_PATCH) || defined(GTA3_STEAM_PATCH) || defined(NO_CDCHECK)
|
#if GTA_VERSION >= GTA3_PC_11 || defined(NO_CDCHECK)
|
||||||
// hddaudio
|
// hddaudio
|
||||||
/**
|
/**
|
||||||
Option for user to play audio files directly from hard disk.
|
Option for user to play audio files directly from hard disk.
|
||||||
@ -1297,17 +1297,17 @@ cSampleManager::Terminate(void)
|
|||||||
bool
|
bool
|
||||||
cSampleManager::CheckForAnAudioFileOnCD(void)
|
cSampleManager::CheckForAnAudioFileOnCD(void)
|
||||||
{
|
{
|
||||||
#if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK)
|
#if GTA_VERSION < GTA3_PC_STEAM && !defined(NO_CDCHECK)
|
||||||
char filepath[MAX_PATH];
|
char filepath[MAX_PATH];
|
||||||
|
|
||||||
#if defined(GTA3_1_1_PATCH)
|
#if GTA_VERSION >= GTA3_PC_11
|
||||||
if (_bUseHDDAudio)
|
if (_bUseHDDAudio)
|
||||||
strcpy(filepath, _aHDDPath);
|
strcpy(filepath, _aHDDPath);
|
||||||
else
|
else
|
||||||
strcpy(filepath, m_szCDRomRootPath);
|
strcpy(filepath, m_szCDRomRootPath);
|
||||||
#else
|
#else
|
||||||
strcpy(filepath, m_szCDRomRootPath);
|
strcpy(filepath, m_szCDRomRootPath);
|
||||||
#endif // #if defined(GTA3_1_1_PATCH)
|
#endif // #if GTA_VERSION >= GTA3_PC_11
|
||||||
|
|
||||||
strcat(filepath, StreamedNameTable[AudioManager.GetRandomNumber(1) % TOTAL_STREAMED_SOUNDS]);
|
strcat(filepath, StreamedNameTable[AudioManager.GetRandomNumber(1) % TOTAL_STREAMED_SOUNDS]);
|
||||||
|
|
||||||
@ -1324,13 +1324,13 @@ cSampleManager::CheckForAnAudioFileOnCD(void)
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
return true;
|
return true;
|
||||||
#endif // #if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK)
|
#endif // #if GTA_VERSION < GTA3_PC_STEAM && !defined(NO_CDCHECK)
|
||||||
}
|
}
|
||||||
|
|
||||||
char
|
char
|
||||||
cSampleManager::GetCDAudioDriveLetter(void)
|
cSampleManager::GetCDAudioDriveLetter(void)
|
||||||
{
|
{
|
||||||
#if defined(GTA3_1_1_PATCH) || defined(GTA3_STEAM_PATCH) || defined(NO_CDCHECK)
|
#if GTA_VERSION >= GTA3_PC_11 || defined(NO_CDCHECK)
|
||||||
if (_bUseHDDAudio)
|
if (_bUseHDDAudio)
|
||||||
{
|
{
|
||||||
if ( strlen(_aHDDPath) != 0 )
|
if ( strlen(_aHDDPath) != 0 )
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
enum eSound : uint16
|
enum eSound
|
||||||
{
|
{
|
||||||
SOUND_CAR_DOOR_CLOSE_BONNET = 0,
|
SOUND_CAR_DOOR_CLOSE_BONNET = 0,
|
||||||
SOUND_CAR_DOOR_CLOSE_BUMPER,
|
SOUND_CAR_DOOR_CLOSE_BUMPER,
|
||||||
@ -173,7 +173,7 @@ enum eSound : uint16
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum eScriptSounds : uint16 {
|
enum eScriptSounds {
|
||||||
SCRIPT_SOUND_0 = 0,
|
SCRIPT_SOUND_0 = 0,
|
||||||
SCRIPT_SOUND_1,
|
SCRIPT_SOUND_1,
|
||||||
SCRIPT_SOUND_2,
|
SCRIPT_SOUND_2,
|
||||||
|
21
src/collision/ColBox.cpp
Normal file
21
src/collision/ColBox.cpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "ColBox.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
CColBox::Set(const CVector &min, const CVector &max, uint8 surf, uint8 piece)
|
||||||
|
{
|
||||||
|
this->min = min;
|
||||||
|
this->max = max;
|
||||||
|
this->surface = surf;
|
||||||
|
this->piece = piece;
|
||||||
|
}
|
||||||
|
|
||||||
|
CColBox&
|
||||||
|
CColBox::operator=(const CColBox& other)
|
||||||
|
{
|
||||||
|
min = other.min;
|
||||||
|
max = other.max;
|
||||||
|
surface = other.surface;
|
||||||
|
piece = other.piece;
|
||||||
|
return *this;
|
||||||
|
}
|
16
src/collision/ColBox.h
Normal file
16
src/collision/ColBox.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "SurfaceTable.h"
|
||||||
|
|
||||||
|
struct CColBox
|
||||||
|
{
|
||||||
|
CVector min;
|
||||||
|
CVector max;
|
||||||
|
uint8 surface;
|
||||||
|
uint8 piece;
|
||||||
|
|
||||||
|
void Set(const CVector &min, const CVector &max, uint8 surf = SURFACE_DEFAULT, uint8 piece = 0);
|
||||||
|
CVector GetSize(void) { return max - min; }
|
||||||
|
|
||||||
|
CColBox& operator=(const CColBox &other);
|
||||||
|
};
|
9
src/collision/ColLine.cpp
Normal file
9
src/collision/ColLine.cpp
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "ColLine.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
CColLine::Set(const CVector &p0, const CVector &p1)
|
||||||
|
{
|
||||||
|
this->p0 = p0;
|
||||||
|
this->p1 = p1;
|
||||||
|
}
|
14
src/collision/ColLine.h
Normal file
14
src/collision/ColLine.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct CColLine
|
||||||
|
{
|
||||||
|
// NB: this has to be compatible with two CVuVectors
|
||||||
|
CVector p0;
|
||||||
|
int pad0;
|
||||||
|
CVector p1;
|
||||||
|
int pad1;
|
||||||
|
|
||||||
|
CColLine(void) { };
|
||||||
|
CColLine(const CVector &p0, const CVector &p1) { this->p0 = p0; this->p1 = p1; };
|
||||||
|
void Set(const CVector &p0, const CVector &p1);
|
||||||
|
};
|
190
src/collision/ColModel.cpp
Normal file
190
src/collision/ColModel.cpp
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "ColModel.h"
|
||||||
|
#include "Game.h"
|
||||||
|
#include "MemoryHeap.h"
|
||||||
|
|
||||||
|
CColModel::CColModel(void)
|
||||||
|
{
|
||||||
|
numSpheres = 0;
|
||||||
|
spheres = nil;
|
||||||
|
numLines = 0;
|
||||||
|
lines = nil;
|
||||||
|
numBoxes = 0;
|
||||||
|
boxes = nil;
|
||||||
|
numTriangles = 0;
|
||||||
|
vertices = nil;
|
||||||
|
triangles = nil;
|
||||||
|
trianglePlanes = nil;
|
||||||
|
level = CGame::currLevel;
|
||||||
|
ownsCollisionVolumes = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CColModel::~CColModel(void)
|
||||||
|
{
|
||||||
|
RemoveCollisionVolumes();
|
||||||
|
RemoveTrianglePlanes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CColModel::RemoveCollisionVolumes(void)
|
||||||
|
{
|
||||||
|
if(ownsCollisionVolumes){
|
||||||
|
RwFree(spheres);
|
||||||
|
RwFree(lines);
|
||||||
|
RwFree(boxes);
|
||||||
|
RwFree(vertices);
|
||||||
|
RwFree(triangles);
|
||||||
|
}
|
||||||
|
numSpheres = 0;
|
||||||
|
numLines = 0;
|
||||||
|
numBoxes = 0;
|
||||||
|
numTriangles = 0;
|
||||||
|
spheres = nil;
|
||||||
|
lines = nil;
|
||||||
|
boxes = nil;
|
||||||
|
vertices = nil;
|
||||||
|
triangles = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CColModel::CalculateTrianglePlanes(void)
|
||||||
|
{
|
||||||
|
PUSH_MEMID(MEMID_COLLISION);
|
||||||
|
|
||||||
|
// HACK: allocate space for one more element to stuff the link pointer into
|
||||||
|
trianglePlanes = (CColTrianglePlane*)RwMalloc(sizeof(CColTrianglePlane) * (numTriangles+1));
|
||||||
|
REGISTER_MEMPTR(&trianglePlanes);
|
||||||
|
for(int i = 0; i < numTriangles; i++)
|
||||||
|
trianglePlanes[i].Set(vertices, triangles[i]);
|
||||||
|
|
||||||
|
POP_MEMID();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CColModel::RemoveTrianglePlanes(void)
|
||||||
|
{
|
||||||
|
RwFree(trianglePlanes);
|
||||||
|
trianglePlanes = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CColModel::SetLinkPtr(CLink<CColModel*> *lptr)
|
||||||
|
{
|
||||||
|
assert(trianglePlanes);
|
||||||
|
*(CLink<CColModel*>**)ALIGNPTR(&trianglePlanes[numTriangles]) = lptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
CLink<CColModel*>*
|
||||||
|
CColModel::GetLinkPtr(void)
|
||||||
|
{
|
||||||
|
assert(trianglePlanes);
|
||||||
|
return *(CLink<CColModel*>**)ALIGNPTR(&trianglePlanes[numTriangles]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CColModel::GetTrianglePoint(CVector &v, int i) const
|
||||||
|
{
|
||||||
|
v = vertices[i].Get();
|
||||||
|
}
|
||||||
|
|
||||||
|
CColModel&
|
||||||
|
CColModel::operator=(const CColModel &other)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int numVerts;
|
||||||
|
|
||||||
|
boundingSphere = other.boundingSphere;
|
||||||
|
boundingBox = other.boundingBox;
|
||||||
|
|
||||||
|
// copy spheres
|
||||||
|
if(other.numSpheres){
|
||||||
|
if(numSpheres != other.numSpheres){
|
||||||
|
numSpheres = other.numSpheres;
|
||||||
|
if(spheres)
|
||||||
|
RwFree(spheres);
|
||||||
|
spheres = (CColSphere*)RwMalloc(numSpheres*sizeof(CColSphere));
|
||||||
|
}
|
||||||
|
for(i = 0; i < numSpheres; i++)
|
||||||
|
spheres[i] = other.spheres[i];
|
||||||
|
}else{
|
||||||
|
numSpheres = 0;
|
||||||
|
if(spheres)
|
||||||
|
RwFree(spheres);
|
||||||
|
spheres = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy lines
|
||||||
|
if(other.numLines){
|
||||||
|
if(numLines != other.numLines){
|
||||||
|
numLines = other.numLines;
|
||||||
|
if(lines)
|
||||||
|
RwFree(lines);
|
||||||
|
lines = (CColLine*)RwMalloc(numLines*sizeof(CColLine));
|
||||||
|
}
|
||||||
|
for(i = 0; i < numLines; i++)
|
||||||
|
lines[i] = other.lines[i];
|
||||||
|
}else{
|
||||||
|
numLines = 0;
|
||||||
|
if(lines)
|
||||||
|
RwFree(lines);
|
||||||
|
lines = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy boxes
|
||||||
|
if(other.numBoxes){
|
||||||
|
if(numBoxes != other.numBoxes){
|
||||||
|
numBoxes = other.numBoxes;
|
||||||
|
if(boxes)
|
||||||
|
RwFree(boxes);
|
||||||
|
boxes = (CColBox*)RwMalloc(numBoxes*sizeof(CColBox));
|
||||||
|
}
|
||||||
|
for(i = 0; i < numBoxes; i++)
|
||||||
|
boxes[i] = other.boxes[i];
|
||||||
|
}else{
|
||||||
|
numBoxes = 0;
|
||||||
|
if(boxes)
|
||||||
|
RwFree(boxes);
|
||||||
|
boxes = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy mesh
|
||||||
|
if(other.numTriangles){
|
||||||
|
// copy vertices
|
||||||
|
numVerts = 0;
|
||||||
|
for(i = 0; i < other.numTriangles; i++){
|
||||||
|
if(other.triangles[i].a > numVerts)
|
||||||
|
numVerts = other.triangles[i].a;
|
||||||
|
if(other.triangles[i].b > numVerts)
|
||||||
|
numVerts = other.triangles[i].b;
|
||||||
|
if(other.triangles[i].c > numVerts)
|
||||||
|
numVerts = other.triangles[i].c;
|
||||||
|
}
|
||||||
|
numVerts++;
|
||||||
|
if(vertices)
|
||||||
|
RwFree(vertices);
|
||||||
|
if(numVerts){
|
||||||
|
vertices = (CompressedVector*)RwMalloc(numVerts*sizeof(CompressedVector));
|
||||||
|
for(i = 0; i < numVerts; i++)
|
||||||
|
vertices[i] = other.vertices[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy triangles
|
||||||
|
if(numTriangles != other.numTriangles){
|
||||||
|
numTriangles = other.numTriangles;
|
||||||
|
if(triangles)
|
||||||
|
RwFree(triangles);
|
||||||
|
triangles = (CColTriangle*)RwMalloc(numTriangles*sizeof(CColTriangle));
|
||||||
|
}
|
||||||
|
for(i = 0; i < numTriangles; i++)
|
||||||
|
triangles[i] = other.triangles[i];
|
||||||
|
}else{
|
||||||
|
numTriangles = 0;
|
||||||
|
if(triangles)
|
||||||
|
RwFree(triangles);
|
||||||
|
triangles = nil;
|
||||||
|
if(vertices)
|
||||||
|
RwFree(vertices);
|
||||||
|
vertices = nil;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
37
src/collision/ColModel.h
Normal file
37
src/collision/ColModel.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "templates.h"
|
||||||
|
#include "ColBox.h"
|
||||||
|
#include "ColSphere.h"
|
||||||
|
#include "ColLine.h"
|
||||||
|
#include "ColPoint.h"
|
||||||
|
#include "ColTriangle.h"
|
||||||
|
|
||||||
|
struct CColModel
|
||||||
|
{
|
||||||
|
CColSphere boundingSphere;
|
||||||
|
CColBox boundingBox;
|
||||||
|
int16 numSpheres;
|
||||||
|
int16 numLines;
|
||||||
|
int16 numBoxes;
|
||||||
|
int16 numTriangles;
|
||||||
|
int32 level;
|
||||||
|
bool ownsCollisionVolumes; // missing on PS2
|
||||||
|
CColSphere *spheres;
|
||||||
|
CColLine *lines;
|
||||||
|
CColBox *boxes;
|
||||||
|
CompressedVector *vertices;
|
||||||
|
CColTriangle *triangles;
|
||||||
|
CColTrianglePlane *trianglePlanes;
|
||||||
|
|
||||||
|
CColModel(void);
|
||||||
|
~CColModel(void);
|
||||||
|
void RemoveCollisionVolumes(void);
|
||||||
|
void CalculateTrianglePlanes(void);
|
||||||
|
void RemoveTrianglePlanes(void);
|
||||||
|
CLink<CColModel*> *GetLinkPtr(void);
|
||||||
|
void SetLinkPtr(CLink<CColModel*>*);
|
||||||
|
void GetTrianglePoint(CVector &v, int i) const;
|
||||||
|
|
||||||
|
CColModel& operator=(const CColModel& other);
|
||||||
|
};
|
16
src/collision/ColPoint.cpp
Normal file
16
src/collision/ColPoint.cpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "ColPoint.h"
|
||||||
|
|
||||||
|
CColPoint&
|
||||||
|
CColPoint::operator=(const CColPoint &other)
|
||||||
|
{
|
||||||
|
point = other.point;
|
||||||
|
normal = other.normal;
|
||||||
|
surfaceA = other.surfaceA;
|
||||||
|
pieceA = other.pieceA;
|
||||||
|
surfaceB = other.surfaceB;
|
||||||
|
pieceB = other.pieceB;
|
||||||
|
|
||||||
|
// no depth?
|
||||||
|
return *this;
|
||||||
|
}
|
34
src/collision/ColPoint.h
Normal file
34
src/collision/ColPoint.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct CColPoint
|
||||||
|
{
|
||||||
|
CVector point;
|
||||||
|
int pad1;
|
||||||
|
// the surface normal on the surface of point
|
||||||
|
CVector normal;
|
||||||
|
int pad2;
|
||||||
|
uint8 surfaceA;
|
||||||
|
uint8 pieceA;
|
||||||
|
uint8 surfaceB;
|
||||||
|
uint8 pieceB;
|
||||||
|
float depth;
|
||||||
|
|
||||||
|
const CVector &GetNormal() { return normal; }
|
||||||
|
float GetDepth() { return depth; }
|
||||||
|
void Set(float depth, uint8 surfA, uint8 pieceA, uint8 surfB, uint8 pieceB) {
|
||||||
|
this->depth = depth;
|
||||||
|
this->surfaceA = surfA;
|
||||||
|
this->pieceA = pieceA;
|
||||||
|
this->surfaceB = surfB;
|
||||||
|
this->pieceB = pieceB;
|
||||||
|
}
|
||||||
|
void Set(uint8 surfA, uint8 pieceA, uint8 surfB, uint8 pieceB) {
|
||||||
|
this->surfaceA = surfA;
|
||||||
|
this->pieceA = pieceA;
|
||||||
|
this->surfaceB = surfB;
|
||||||
|
this->pieceB = pieceB;
|
||||||
|
}
|
||||||
|
|
||||||
|
CColPoint &operator=(const CColPoint &other);
|
||||||
|
};
|
||||||
|
|
11
src/collision/ColSphere.cpp
Normal file
11
src/collision/ColSphere.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "ColSphere.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
CColSphere::Set(float radius, const CVector ¢er, uint8 surf, uint8 piece)
|
||||||
|
{
|
||||||
|
this->radius = radius;
|
||||||
|
this->center = center;
|
||||||
|
this->surface = surf;
|
||||||
|
this->piece = piece;
|
||||||
|
}
|
13
src/collision/ColSphere.h
Normal file
13
src/collision/ColSphere.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "SurfaceTable.h"
|
||||||
|
|
||||||
|
struct CColSphere
|
||||||
|
{
|
||||||
|
// NB: this has to be compatible with a CVuVector
|
||||||
|
CVector center;
|
||||||
|
float radius;
|
||||||
|
uint8 surface;
|
||||||
|
uint8 piece;
|
||||||
|
void Set(float radius, const CVector ¢er, uint8 surf = SURFACE_DEFAULT, uint8 piece = 0);
|
||||||
|
};
|
41
src/collision/ColTriangle.cpp
Normal file
41
src/collision/ColTriangle.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "ColTriangle.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
CColTriangle::Set(const CompressedVector *, int a, int b, int c, uint8 surf, uint8 piece)
|
||||||
|
{
|
||||||
|
this->a = a;
|
||||||
|
this->b = b;
|
||||||
|
this->c = c;
|
||||||
|
this->surface = surf;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VU_COLLISION
|
||||||
|
void
|
||||||
|
CColTrianglePlane::Set(const CVector &va, const CVector &vb, const CVector &vc)
|
||||||
|
{
|
||||||
|
CVector norm = CrossProduct(vc-va, vb-va);
|
||||||
|
norm.Normalise();
|
||||||
|
float d = DotProduct(norm, va);
|
||||||
|
normal.x = norm.x*4096.0f;
|
||||||
|
normal.y = norm.y*4096.0f;
|
||||||
|
normal.z = norm.z*4096.0f;
|
||||||
|
dist = d*128.0f;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void
|
||||||
|
CColTrianglePlane::Set(const CVector &va, const CVector &vb, const CVector &vc)
|
||||||
|
{
|
||||||
|
normal = CrossProduct(vc-va, vb-va);
|
||||||
|
normal.Normalise();
|
||||||
|
dist = DotProduct(normal, va);
|
||||||
|
CVector an(Abs(normal.x), Abs(normal.y), Abs(normal.z));
|
||||||
|
// find out largest component and its direction
|
||||||
|
if(an.x > an.y && an.x > an.z)
|
||||||
|
dir = normal.x < 0.0f ? DIR_X_NEG : DIR_X_POS;
|
||||||
|
else if(an.y > an.z)
|
||||||
|
dir = normal.y < 0.0f ? DIR_Y_NEG : DIR_Y_POS;
|
||||||
|
else
|
||||||
|
dir = normal.z < 0.0f ? DIR_Z_NEG : DIR_Z_POS;
|
||||||
|
}
|
||||||
|
#endif
|
68
src/collision/ColTriangle.h
Normal file
68
src/collision/ColTriangle.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CompressedVector.h"
|
||||||
|
|
||||||
|
enum Direction {
|
||||||
|
DIR_X_POS,
|
||||||
|
DIR_X_NEG,
|
||||||
|
DIR_Y_POS,
|
||||||
|
DIR_Y_NEG,
|
||||||
|
DIR_Z_POS,
|
||||||
|
DIR_Z_NEG,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CColTriangle
|
||||||
|
{
|
||||||
|
uint16 a;
|
||||||
|
uint16 b;
|
||||||
|
uint16 c;
|
||||||
|
uint8 surface;
|
||||||
|
|
||||||
|
void Set(const CompressedVector *v, int a, int b, int c, uint8 surf, uint8 piece);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CColTrianglePlane
|
||||||
|
{
|
||||||
|
#ifdef VU_COLLISION
|
||||||
|
CompressedVector normal;
|
||||||
|
int16 dist;
|
||||||
|
|
||||||
|
void Set(const CVector &va, const CVector &vb, const CVector &vc);
|
||||||
|
void Set(const CompressedVector *v, CColTriangle &tri) { Set(v[tri.a].Get(), v[tri.b].Get(), v[tri.c].Get()); }
|
||||||
|
void GetNormal(CVector &n) const { n.x = normal.x/4096.0f; n.y = normal.y/4096.0f; n.z = normal.z/4096.0f; }
|
||||||
|
float CalcPoint(const CVector &v) const { CVector n; GetNormal(n); return DotProduct(n, v) - dist/128.0f; };
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
void Unpack(uint128 &qword) const {
|
||||||
|
__asm__ volatile (
|
||||||
|
"lh $8, 0(%1)\n"
|
||||||
|
"lh $9, 2(%1)\n"
|
||||||
|
"lh $10, 4(%1)\n"
|
||||||
|
"lh $11, 6(%1)\n"
|
||||||
|
"pextlw $10, $8\n"
|
||||||
|
"pextlw $11, $9\n"
|
||||||
|
"pextlw $2, $11, $10\n"
|
||||||
|
"sq $2, %0\n"
|
||||||
|
: "=m" (qword)
|
||||||
|
: "r" (this)
|
||||||
|
: "$8", "$9", "$10", "$11", "$2"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void Unpack(int32 *qword) const {
|
||||||
|
qword[0] = normal.x;
|
||||||
|
qword[1] = normal.y;
|
||||||
|
qword[2] = normal.z;
|
||||||
|
qword[3] = dist;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
CVector normal;
|
||||||
|
float dist;
|
||||||
|
uint8 dir;
|
||||||
|
|
||||||
|
void Set(const CVector &va, const CVector &vb, const CVector &vc);
|
||||||
|
void Set(const CompressedVector *v, CColTriangle &tri) { Set(v[tri.a].Get(), v[tri.b].Get(), v[tri.c].Get()); }
|
||||||
|
void GetNormal(CVector &n) const { n = normal; }
|
||||||
|
float CalcPoint(const CVector &v) const { return DotProduct(normal, v) - dist; };
|
||||||
|
#endif
|
||||||
|
};
|
@ -23,303 +23,8 @@
|
|||||||
#include "Collision.h"
|
#include "Collision.h"
|
||||||
#include "Frontend.h"
|
#include "Frontend.h"
|
||||||
|
|
||||||
|
|
||||||
// TODO: where do these go?
|
|
||||||
|
|
||||||
#ifdef VU_COLLISION
|
#ifdef VU_COLLISION
|
||||||
|
#include "VuCollision.h"
|
||||||
struct VuTriangle
|
|
||||||
{
|
|
||||||
// Compressed int16 but unpacked
|
|
||||||
#ifdef GTA_PS2
|
|
||||||
uint128 v0;
|
|
||||||
uint128 v1;
|
|
||||||
uint128 v2;
|
|
||||||
uint128 plane;
|
|
||||||
#else
|
|
||||||
int32 v0[4];
|
|
||||||
int32 v1[4];
|
|
||||||
int32 v2[4];
|
|
||||||
int32 plane[4];
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef GTA_PS2
|
|
||||||
static int16 vi01;
|
|
||||||
static CVuVector vf01;
|
|
||||||
static CVuVector vf02;
|
|
||||||
static CVuVector vf03;
|
|
||||||
|
|
||||||
CVuVector
|
|
||||||
DistanceBetweenSphereAndLine(const CVuVector ¢er, const CVuVector &p0, const CVuVector &line)
|
|
||||||
{
|
|
||||||
// center VF12
|
|
||||||
// p0 VF14
|
|
||||||
// line VF15
|
|
||||||
CVuVector ret; // VF16
|
|
||||||
CVuVector p1 = p0+line;
|
|
||||||
CVuVector dist0 = center - p0; // VF20
|
|
||||||
CVuVector dist1 = center - p1; // VF25
|
|
||||||
float lenSq = line.MagnitudeSqr(); // VF21
|
|
||||||
float distSq0 = dist0.MagnitudeSqr(); // VF22
|
|
||||||
float distSq1 = dist1.MagnitudeSqr();
|
|
||||||
float dot = DotProduct(dist0, line); // VF23
|
|
||||||
if(dot < 0.0f){
|
|
||||||
// not above line, closest to p0
|
|
||||||
ret = p0;
|
|
||||||
ret.w = distSq0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
float t = dot/lenSq; // param of nearest point on infinite line
|
|
||||||
if(t > 1.0f){
|
|
||||||
// not above line, closest to p1
|
|
||||||
ret = p1;
|
|
||||||
ret.w = distSq1;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
// closest to line
|
|
||||||
ret = p0 + line*t;
|
|
||||||
ret.w = (ret - center).MagnitudeSqr();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
inline int SignFlags(const CVector &v)
|
|
||||||
{
|
|
||||||
int f = 0;
|
|
||||||
if(v.x < 0.0f) f |= 1;
|
|
||||||
if(v.y < 0.0f) f |= 2;
|
|
||||||
if(v.z < 0.0f) f |= 4;
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern "C" void
|
|
||||||
LineToTriangleCollision(const CVuVector &p0, const CVuVector &p1,
|
|
||||||
const CVuVector &v0, const CVuVector &v1, const CVuVector &v2,
|
|
||||||
const CVuVector &plane)
|
|
||||||
{
|
|
||||||
#ifdef GTA_PS2
|
|
||||||
__asm__ volatile (
|
|
||||||
".set noreorder\n"
|
|
||||||
"lqc2 vf12, 0x0(%0)\n"
|
|
||||||
"lqc2 vf13, 0x0(%1)\n"
|
|
||||||
"lqc2 vf14, 0x0(%2)\n"
|
|
||||||
"lqc2 vf15, 0x0(%3)\n"
|
|
||||||
"lqc2 vf16, 0x0(%4)\n"
|
|
||||||
"lqc2 vf17, 0x0(%5)\n"
|
|
||||||
"vcallms Vu0LineToTriangleCollisionStart\n"
|
|
||||||
".set reorder\n"
|
|
||||||
:
|
|
||||||
: "r" (&p0), "r" (&p1), "r" (&v0), "r" (&v1), "r" (&v2), "r" (&plane)
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
float dot0 = DotProduct(plane, p0);
|
|
||||||
float dot1 = DotProduct(plane, p1);
|
|
||||||
float dist0 = plane.w - dot0;
|
|
||||||
float dist1 = plane.w - dot1;
|
|
||||||
|
|
||||||
// if points are on the same side, no collision
|
|
||||||
if(dist0 * dist1 > 0.0f){
|
|
||||||
vi01 = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVuVector diff = p1 - p0;
|
|
||||||
float t = dist0/(dot1 - dot0);
|
|
||||||
CVuVector p = p0 + diff*t;
|
|
||||||
p.w = 0.0f;
|
|
||||||
vf01 = p;
|
|
||||||
vf03.x = t;
|
|
||||||
|
|
||||||
// Check if point is inside
|
|
||||||
CVector cross1 = CrossProduct(p-v0, v1-v0);
|
|
||||||
CVector cross2 = CrossProduct(p-v1, v2-v1);
|
|
||||||
CVector cross3 = CrossProduct(p-v2, v0-v2);
|
|
||||||
// Only check relevant directions
|
|
||||||
int flagmask = 0;
|
|
||||||
if(Abs(plane.x) > 0.5f) flagmask |= 1;
|
|
||||||
if(Abs(plane.y) > 0.5f) flagmask |= 2;
|
|
||||||
if(Abs(plane.z) > 0.5f) flagmask |= 4;
|
|
||||||
int flags1 = SignFlags(cross1) & flagmask;
|
|
||||||
int flags2 = SignFlags(cross2) & flagmask;
|
|
||||||
int flags3 = SignFlags(cross3) & flagmask;
|
|
||||||
// inside if on the same side of all edges
|
|
||||||
if(flags1 != flags2 || flags1 != flags3){
|
|
||||||
vi01 = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
vi01 = 1;
|
|
||||||
vf02 = plane;
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void
|
|
||||||
LineToTriangleCollisionCompressed(const CVuVector &p0, const CVuVector &p1, VuTriangle &tri)
|
|
||||||
{
|
|
||||||
#ifdef GTA_PS2
|
|
||||||
__asm__ volatile (
|
|
||||||
".set noreorder\n"
|
|
||||||
"lqc2 vf12, 0x0(%0)\n"
|
|
||||||
"lqc2 vf13, 0x0(%1)\n"
|
|
||||||
"lqc2 vf14, 0x0(%2)\n"
|
|
||||||
"lqc2 vf15, 0x10(%2)\n"
|
|
||||||
"lqc2 vf16, 0x20(%2)\n"
|
|
||||||
"lqc2 vf17, 0x30(%2)\n"
|
|
||||||
"vcallms Vu0LineToTriangleCollisionCompressedStart\n"
|
|
||||||
".set reorder\n"
|
|
||||||
:
|
|
||||||
: "r" (&p0), "r" (&p1), "r" (&tri)
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
CVuVector v0, v1, v2, plane;
|
|
||||||
v0.x = tri.v0[0]/128.0f;
|
|
||||||
v0.y = tri.v0[1]/128.0f;
|
|
||||||
v0.z = tri.v0[2]/128.0f;
|
|
||||||
v0.w = tri.v0[3]/128.0f;
|
|
||||||
v1.x = tri.v1[0]/128.0f;
|
|
||||||
v1.y = tri.v1[1]/128.0f;
|
|
||||||
v1.z = tri.v1[2]/128.0f;
|
|
||||||
v1.w = tri.v1[3]/128.0f;
|
|
||||||
v2.x = tri.v2[0]/128.0f;
|
|
||||||
v2.y = tri.v2[1]/128.0f;
|
|
||||||
v2.z = tri.v2[2]/128.0f;
|
|
||||||
v2.w = tri.v2[3]/128.0f;
|
|
||||||
plane.x = tri.plane[0]/4096.0f;
|
|
||||||
plane.y = tri.plane[1]/4096.0f;
|
|
||||||
plane.z = tri.plane[2]/4096.0f;
|
|
||||||
plane.w = tri.plane[3]/128.0f;
|
|
||||||
LineToTriangleCollision(p0, p1, v0, v1, v2, plane);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void
|
|
||||||
SphereToTriangleCollision(const CVuVector &sph,
|
|
||||||
const CVuVector &v0, const CVuVector &v1, const CVuVector &v2,
|
|
||||||
const CVuVector &plane)
|
|
||||||
{
|
|
||||||
#ifdef GTA_PS2
|
|
||||||
__asm__ volatile (
|
|
||||||
".set noreorder\n"
|
|
||||||
"lqc2 vf12, 0x0(%0)\n"
|
|
||||||
"lqc2 vf14, 0x0(%1)\n"
|
|
||||||
"lqc2 vf15, 0x0(%2)\n"
|
|
||||||
"lqc2 vf16, 0x0(%3)\n"
|
|
||||||
"lqc2 vf17, 0x0(%4)\n"
|
|
||||||
"vcallms Vu0SphereToTriangleCollisionStart\n"
|
|
||||||
".set reorder\n"
|
|
||||||
:
|
|
||||||
: "r" (&sph), "r" (&v0), "r" (&v1), "r" (&v2), "r" (&plane)
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
float planedist = DotProduct(plane, sph) - plane.w; // VF02
|
|
||||||
if(Abs(planedist) > sph.w){
|
|
||||||
vi01 = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// point on plane
|
|
||||||
CVuVector p = sph - planedist*plane;
|
|
||||||
p.w = 0.0f;
|
|
||||||
vf01 = p;
|
|
||||||
planedist = Abs(planedist);
|
|
||||||
// edges
|
|
||||||
CVuVector v01 = v1 - v0;
|
|
||||||
CVuVector v12 = v2 - v1;
|
|
||||||
CVuVector v20 = v0 - v2;
|
|
||||||
// VU code calculates normal again for some weird reason...
|
|
||||||
// Check sides of point
|
|
||||||
CVector cross1 = CrossProduct(p-v0, v01);
|
|
||||||
CVector cross2 = CrossProduct(p-v1, v12);
|
|
||||||
CVector cross3 = CrossProduct(p-v2, v20);
|
|
||||||
// Only check relevant directions
|
|
||||||
int flagmask = 0;
|
|
||||||
if(Abs(plane.x) > 0.1f) flagmask |= 1;
|
|
||||||
if(Abs(plane.y) > 0.1f) flagmask |= 2;
|
|
||||||
if(Abs(plane.z) > 0.1f) flagmask |= 4;
|
|
||||||
int nflags = SignFlags(plane) & flagmask;
|
|
||||||
int flags1 = SignFlags(cross1) & flagmask;
|
|
||||||
int flags2 = SignFlags(cross2) & flagmask;
|
|
||||||
int flags3 = SignFlags(cross3) & flagmask;
|
|
||||||
int testcase = 0;
|
|
||||||
CVuVector closest(0.0f, 0.0f, 0.0f); // VF04
|
|
||||||
if(flags1 == nflags){
|
|
||||||
closest += v2;
|
|
||||||
testcase++;
|
|
||||||
}
|
|
||||||
if(flags2 == nflags){
|
|
||||||
closest += v0;
|
|
||||||
testcase++;
|
|
||||||
}
|
|
||||||
if(flags3 == nflags){
|
|
||||||
closest += v1;
|
|
||||||
testcase++;
|
|
||||||
}
|
|
||||||
if(testcase == 3){
|
|
||||||
// inside triangle - dist to plane already checked
|
|
||||||
vf02 = plane;
|
|
||||||
vf02.w = vf03.x = planedist;
|
|
||||||
vi01 = 1;
|
|
||||||
}else if(testcase == 1){
|
|
||||||
// outside two sides - closest to point opposide inside edge
|
|
||||||
vf01 = closest;
|
|
||||||
vf02 = sph - closest;
|
|
||||||
float distSq = vf02.MagnitudeSqr();
|
|
||||||
vi01 = sph.w*sph.w > distSq;
|
|
||||||
vf03.x = Sqrt(distSq);
|
|
||||||
vf02 *= 1.0f/vf03.x;
|
|
||||||
}else{
|
|
||||||
// inside two sides - closest to third edge
|
|
||||||
if(flags1 != nflags)
|
|
||||||
closest = DistanceBetweenSphereAndLine(sph, v0, v01);
|
|
||||||
else if(flags2 != nflags)
|
|
||||||
closest = DistanceBetweenSphereAndLine(sph, v1, v12);
|
|
||||||
else
|
|
||||||
closest = DistanceBetweenSphereAndLine(sph, v2, v20);
|
|
||||||
vi01 = sph.w*sph.w > closest.w;
|
|
||||||
vf01 = closest;
|
|
||||||
vf02 = sph - closest;
|
|
||||||
vf03.x = Sqrt(closest.w);
|
|
||||||
vf02 *= 1.0f/vf03.x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void
|
|
||||||
SphereToTriangleCollisionCompressed(const CVuVector &sph, VuTriangle &tri)
|
|
||||||
{
|
|
||||||
#ifdef GTA_PS2
|
|
||||||
__asm__ volatile (
|
|
||||||
".set noreorder\n"
|
|
||||||
"lqc2 vf12, 0x0(%0)\n"
|
|
||||||
"lqc2 vf14, 0x0(%1)\n"
|
|
||||||
"lqc2 vf15, 0x10(%1)\n"
|
|
||||||
"lqc2 vf16, 0x20(%1)\n"
|
|
||||||
"lqc2 vf17, 0x30(%1)\n"
|
|
||||||
"vcallms Vu0SphereToTriangleCollisionCompressedStart\n"
|
|
||||||
".set reorder\n"
|
|
||||||
:
|
|
||||||
: "r" (&sph), "r" (&tri)
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
CVuVector v0, v1, v2, plane;
|
|
||||||
v0.x = tri.v0[0]/128.0f;
|
|
||||||
v0.y = tri.v0[1]/128.0f;
|
|
||||||
v0.z = tri.v0[2]/128.0f;
|
|
||||||
v0.w = tri.v0[3]/128.0f;
|
|
||||||
v1.x = tri.v1[0]/128.0f;
|
|
||||||
v1.y = tri.v1[1]/128.0f;
|
|
||||||
v1.z = tri.v1[2]/128.0f;
|
|
||||||
v1.w = tri.v1[3]/128.0f;
|
|
||||||
v2.x = tri.v2[0]/128.0f;
|
|
||||||
v2.y = tri.v2[1]/128.0f;
|
|
||||||
v2.z = tri.v2[2]/128.0f;
|
|
||||||
v2.w = tri.v2[3]/128.0f;
|
|
||||||
plane.x = tri.plane[0]/4096.0f;
|
|
||||||
plane.y = tri.plane[1]/4096.0f;
|
|
||||||
plane.z = tri.plane[2]/4096.0f;
|
|
||||||
plane.w = tri.plane[3]/128.0f;
|
|
||||||
SphereToTriangleCollision(sph, v0, v1, v2, plane);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int
|
inline int
|
||||||
GetVUresult(void)
|
GetVUresult(void)
|
||||||
@ -362,17 +67,6 @@ GetVUresult(CVuVector &point, CVuVector &normal, float &dist)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
enum Direction
|
|
||||||
{
|
|
||||||
DIR_X_POS,
|
|
||||||
DIR_X_NEG,
|
|
||||||
DIR_Y_POS,
|
|
||||||
DIR_Y_NEG,
|
|
||||||
DIR_Z_POS,
|
|
||||||
DIR_Z_NEG,
|
|
||||||
};
|
|
||||||
|
|
||||||
eLevelName CCollision::ms_collisionInMemory;
|
eLevelName CCollision::ms_collisionInMemory;
|
||||||
CLinkList<CColModel*> CCollision::ms_colModelCache;
|
CLinkList<CColModel*> CCollision::ms_colModelCache;
|
||||||
|
|
||||||
@ -971,7 +665,7 @@ CCollision::TestLineOfSight(const CColLine &line, const CMatrix &matrix, CColMod
|
|||||||
// transform line to model space
|
// transform line to model space
|
||||||
Invert(matrix, matTransform);
|
Invert(matrix, matTransform);
|
||||||
CVuVector newline[2];
|
CVuVector newline[2];
|
||||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
// If we don't intersect with the bounding box, no chance on the rest
|
// If we don't intersect with the bounding box, no chance on the rest
|
||||||
if(!TestLineBox(*(CColLine*)newline, model.boundingBox))
|
if(!TestLineBox(*(CColLine*)newline, model.boundingBox))
|
||||||
@ -1780,7 +1474,7 @@ CCollision::ProcessLineOfSight(const CColLine &line,
|
|||||||
// transform line to model space
|
// transform line to model space
|
||||||
Invert(matrix, matTransform);
|
Invert(matrix, matTransform);
|
||||||
CVuVector newline[2];
|
CVuVector newline[2];
|
||||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
if(mindist < 1.0f)
|
if(mindist < 1.0f)
|
||||||
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
||||||
@ -1912,7 +1606,7 @@ CCollision::ProcessVerticalLine(const CColLine &line,
|
|||||||
// transform line to model space
|
// transform line to model space
|
||||||
Invert(matrix, matTransform);
|
Invert(matrix, matTransform);
|
||||||
CVuVector newline[2];
|
CVuVector newline[2];
|
||||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
if(mindist < 1.0f)
|
if(mindist < 1.0f)
|
||||||
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
||||||
@ -2112,16 +1806,16 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
|||||||
matAB *= matrixA;
|
matAB *= matrixA;
|
||||||
|
|
||||||
CVuVector bsphereAB; // bounding sphere of A in B space
|
CVuVector bsphereAB; // bounding sphere of A in B space
|
||||||
TransformPoint(bsphereAB, matAB, *(RwV3d*)modelA.boundingSphere.center); // inlined
|
TransformPoint(bsphereAB, matAB, modelA.boundingSphere.center); // inlined
|
||||||
bsphereAB.w = modelA.boundingSphere.radius;
|
bsphereAB.w = modelA.boundingSphere.radius;
|
||||||
if(!TestSphereBox(*(CColSphere*)&bsphereAB, modelB.boundingBox))
|
if(!TestSphereBox(*(CColSphere*)&bsphereAB, modelB.boundingBox))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// transform modelA's spheres and lines to B space
|
// transform modelA's spheres and lines to B space
|
||||||
TransformPoints(aSpheresA, modelA.numSpheres, matAB, (RwV3d*)&modelA.spheres->center, sizeof(CColSphere));
|
TransformPoints(aSpheresA, modelA.numSpheres, matAB, &modelA.spheres->center, sizeof(CColSphere));
|
||||||
for(i = 0; i < modelA.numSpheres; i++)
|
for(i = 0; i < modelA.numSpheres; i++)
|
||||||
aSpheresA[i].w = modelA.spheres[i].radius;
|
aSpheresA[i].w = modelA.spheres[i].radius;
|
||||||
TransformPoints(aLinesA, modelA.numLines*2, matAB, (RwV3d*)&modelA.lines->p0, sizeof(CColLine)/2);
|
TransformPoints(aLinesA, modelA.numLines*2, matAB, &modelA.lines->p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
// Test them against model B's bounding volumes
|
// Test them against model B's bounding volumes
|
||||||
int numSpheresA = 0;
|
int numSpheresA = 0;
|
||||||
@ -2138,7 +1832,7 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
|||||||
matBA *= matrixB;
|
matBA *= matrixB;
|
||||||
|
|
||||||
// transform modelB's spheres to A space
|
// transform modelB's spheres to A space
|
||||||
TransformPoints(aSpheresB, modelB.numSpheres, matBA, (RwV3d*)&modelB.spheres->center, sizeof(CColSphere));
|
TransformPoints(aSpheresB, modelB.numSpheres, matBA, &modelB.spheres->center, sizeof(CColSphere));
|
||||||
for(i = 0; i < modelB.numSpheres; i++)
|
for(i = 0; i < modelB.numSpheres; i++)
|
||||||
aSpheresB[i].w = modelB.spheres[i].radius;
|
aSpheresB[i].w = modelB.spheres[i].radius;
|
||||||
|
|
||||||
@ -2412,11 +2106,12 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
|||||||
assert(modelA.numLines <= MAXNUMLINES);
|
assert(modelA.numLines <= MAXNUMLINES);
|
||||||
|
|
||||||
// From model A space to model B space
|
// From model A space to model B space
|
||||||
Invert(matrixB, matAB);
|
matAB = Invert(matrixB, matAB);
|
||||||
matAB *= matrixA;
|
matAB *= matrixA;
|
||||||
|
|
||||||
CColSphere bsphereAB; // bounding sphere of A in B space
|
CColSphere bsphereAB; // bounding sphere of A in B space
|
||||||
bsphereAB.Set(modelA.boundingSphere.radius, matAB * modelA.boundingSphere.center);
|
bsphereAB.radius = modelA.boundingSphere.radius;
|
||||||
|
bsphereAB.center = matAB * modelA.boundingSphere.center;
|
||||||
if(!TestSphereBox(bsphereAB, modelB.boundingBox))
|
if(!TestSphereBox(bsphereAB, modelB.boundingBox))
|
||||||
return 0;
|
return 0;
|
||||||
// B to A space
|
// B to A space
|
||||||
@ -2449,7 +2144,8 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
|||||||
int numBoxesB = 0;
|
int numBoxesB = 0;
|
||||||
int numTrianglesB = 0;
|
int numTrianglesB = 0;
|
||||||
for(i = 0; i < modelB.numSpheres; i++){
|
for(i = 0; i < modelB.numSpheres; i++){
|
||||||
s.Set(modelB.spheres[i].radius, matBA * modelB.spheres[i].center);
|
s.radius = modelB.spheres[i].radius;
|
||||||
|
s.center = matBA * modelB.spheres[i].center;
|
||||||
if(TestSphereBox(s, modelA.boundingBox))
|
if(TestSphereBox(s, modelA.boundingBox))
|
||||||
aSphereIndicesB[numSpheresB++] = i;
|
aSphereIndicesB[numSpheresB++] = i;
|
||||||
}
|
}
|
||||||
@ -3038,253 +2734,3 @@ CCollision::DrawColModel_Coloured(const CMatrix &mat, const CColModel &colModel,
|
|||||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ColModel code
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
CColSphere::Set(float radius, const CVector ¢er, uint8 surf, uint8 piece)
|
|
||||||
{
|
|
||||||
this->radius = radius;
|
|
||||||
this->center = center;
|
|
||||||
this->surface = surf;
|
|
||||||
this->piece = piece;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColBox::Set(const CVector &min, const CVector &max, uint8 surf, uint8 piece)
|
|
||||||
{
|
|
||||||
this->min = min;
|
|
||||||
this->max = max;
|
|
||||||
this->surface = surf;
|
|
||||||
this->piece = piece;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColLine::Set(const CVector &p0, const CVector &p1)
|
|
||||||
{
|
|
||||||
this->p0 = p0;
|
|
||||||
this->p1 = p1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColTriangle::Set(const CompressedVector *, int a, int b, int c, uint8 surf, uint8 piece)
|
|
||||||
{
|
|
||||||
this->a = a;
|
|
||||||
this->b = b;
|
|
||||||
this->c = c;
|
|
||||||
this->surface = surf;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef VU_COLLISION
|
|
||||||
void
|
|
||||||
CColTrianglePlane::Set(const CVector &va, const CVector &vb, const CVector &vc)
|
|
||||||
{
|
|
||||||
CVector norm = CrossProduct(vc-va, vb-va);
|
|
||||||
norm.Normalise();
|
|
||||||
float d = DotProduct(norm, va);
|
|
||||||
normal.x = norm.x*4096.0f;
|
|
||||||
normal.y = norm.y*4096.0f;
|
|
||||||
normal.z = norm.z*4096.0f;
|
|
||||||
dist = d*128.0f;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void
|
|
||||||
CColTrianglePlane::Set(const CVector &va, const CVector &vb, const CVector &vc)
|
|
||||||
{
|
|
||||||
normal = CrossProduct(vc-va, vb-va);
|
|
||||||
normal.Normalise();
|
|
||||||
dist = DotProduct(normal, va);
|
|
||||||
CVector an(Abs(normal.x), Abs(normal.y), Abs(normal.z));
|
|
||||||
// find out largest component and its direction
|
|
||||||
if(an.x > an.y && an.x > an.z)
|
|
||||||
dir = normal.x < 0.0f ? DIR_X_NEG : DIR_X_POS;
|
|
||||||
else if(an.y > an.z)
|
|
||||||
dir = normal.y < 0.0f ? DIR_Y_NEG : DIR_Y_POS;
|
|
||||||
else
|
|
||||||
dir = normal.z < 0.0f ? DIR_Z_NEG : DIR_Z_POS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CColModel::CColModel(void)
|
|
||||||
{
|
|
||||||
numSpheres = 0;
|
|
||||||
spheres = nil;
|
|
||||||
numLines = 0;
|
|
||||||
lines = nil;
|
|
||||||
numBoxes = 0;
|
|
||||||
boxes = nil;
|
|
||||||
numTriangles = 0;
|
|
||||||
vertices = nil;
|
|
||||||
triangles = nil;
|
|
||||||
trianglePlanes = nil;
|
|
||||||
level = CGame::currLevel;
|
|
||||||
ownsCollisionVolumes = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CColModel::~CColModel(void)
|
|
||||||
{
|
|
||||||
RemoveCollisionVolumes();
|
|
||||||
RemoveTrianglePlanes();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColModel::RemoveCollisionVolumes(void)
|
|
||||||
{
|
|
||||||
if(ownsCollisionVolumes){
|
|
||||||
RwFree(spheres);
|
|
||||||
RwFree(lines);
|
|
||||||
RwFree(boxes);
|
|
||||||
RwFree(vertices);
|
|
||||||
RwFree(triangles);
|
|
||||||
}
|
|
||||||
numSpheres = 0;
|
|
||||||
numLines = 0;
|
|
||||||
numBoxes = 0;
|
|
||||||
numTriangles = 0;
|
|
||||||
spheres = nil;
|
|
||||||
lines = nil;
|
|
||||||
boxes = nil;
|
|
||||||
vertices = nil;
|
|
||||||
triangles = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColModel::CalculateTrianglePlanes(void)
|
|
||||||
{
|
|
||||||
// HACK: allocate space for one more element to stuff the link pointer into
|
|
||||||
trianglePlanes = (CColTrianglePlane*)RwMalloc(sizeof(CColTrianglePlane) * (numTriangles+1));
|
|
||||||
for(int i = 0; i < numTriangles; i++)
|
|
||||||
trianglePlanes[i].Set(vertices, triangles[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColModel::RemoveTrianglePlanes(void)
|
|
||||||
{
|
|
||||||
RwFree(trianglePlanes);
|
|
||||||
trianglePlanes = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColModel::SetLinkPtr(CLink<CColModel*> *lptr)
|
|
||||||
{
|
|
||||||
assert(trianglePlanes);
|
|
||||||
*(CLink<CColModel*>**)ALIGNPTR(&trianglePlanes[numTriangles]) = lptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
CLink<CColModel*>*
|
|
||||||
CColModel::GetLinkPtr(void)
|
|
||||||
{
|
|
||||||
assert(trianglePlanes);
|
|
||||||
return *(CLink<CColModel*>**)ALIGNPTR(&trianglePlanes[numTriangles]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CColModel::GetTrianglePoint(CVector &v, int i) const
|
|
||||||
{
|
|
||||||
v = vertices[i].Get();
|
|
||||||
}
|
|
||||||
|
|
||||||
CColModel&
|
|
||||||
CColModel::operator=(const CColModel &other)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int numVerts;
|
|
||||||
|
|
||||||
boundingSphere = other.boundingSphere;
|
|
||||||
boundingBox = other.boundingBox;
|
|
||||||
|
|
||||||
// copy spheres
|
|
||||||
if(other.numSpheres){
|
|
||||||
if(numSpheres != other.numSpheres){
|
|
||||||
numSpheres = other.numSpheres;
|
|
||||||
if(spheres)
|
|
||||||
RwFree(spheres);
|
|
||||||
spheres = (CColSphere*)RwMalloc(numSpheres*sizeof(CColSphere));
|
|
||||||
}
|
|
||||||
for(i = 0; i < numSpheres; i++)
|
|
||||||
spheres[i] = other.spheres[i];
|
|
||||||
}else{
|
|
||||||
numSpheres = 0;
|
|
||||||
if(spheres)
|
|
||||||
RwFree(spheres);
|
|
||||||
spheres = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy lines
|
|
||||||
if(other.numLines){
|
|
||||||
if(numLines != other.numLines){
|
|
||||||
numLines = other.numLines;
|
|
||||||
if(lines)
|
|
||||||
RwFree(lines);
|
|
||||||
lines = (CColLine*)RwMalloc(numLines*sizeof(CColLine));
|
|
||||||
}
|
|
||||||
for(i = 0; i < numLines; i++)
|
|
||||||
lines[i] = other.lines[i];
|
|
||||||
}else{
|
|
||||||
numLines = 0;
|
|
||||||
if(lines)
|
|
||||||
RwFree(lines);
|
|
||||||
lines = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy boxes
|
|
||||||
if(other.numBoxes){
|
|
||||||
if(numBoxes != other.numBoxes){
|
|
||||||
numBoxes = other.numBoxes;
|
|
||||||
if(boxes)
|
|
||||||
RwFree(boxes);
|
|
||||||
boxes = (CColBox*)RwMalloc(numBoxes*sizeof(CColBox));
|
|
||||||
}
|
|
||||||
for(i = 0; i < numBoxes; i++)
|
|
||||||
boxes[i] = other.boxes[i];
|
|
||||||
}else{
|
|
||||||
numBoxes = 0;
|
|
||||||
if(boxes)
|
|
||||||
RwFree(boxes);
|
|
||||||
boxes = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy mesh
|
|
||||||
if(other.numTriangles){
|
|
||||||
// copy vertices
|
|
||||||
numVerts = 0;
|
|
||||||
for(i = 0; i < other.numTriangles; i++){
|
|
||||||
if(other.triangles[i].a > numVerts)
|
|
||||||
numVerts = other.triangles[i].a;
|
|
||||||
if(other.triangles[i].b > numVerts)
|
|
||||||
numVerts = other.triangles[i].b;
|
|
||||||
if(other.triangles[i].c > numVerts)
|
|
||||||
numVerts = other.triangles[i].c;
|
|
||||||
}
|
|
||||||
numVerts++;
|
|
||||||
if(vertices)
|
|
||||||
RwFree(vertices);
|
|
||||||
if(numVerts){
|
|
||||||
vertices = (CompressedVector*)RwMalloc(numVerts*sizeof(CompressedVector));
|
|
||||||
for(i = 0; i < numVerts; i++)
|
|
||||||
vertices[i] = other.vertices[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy triangles
|
|
||||||
if(numTriangles != other.numTriangles){
|
|
||||||
numTriangles = other.numTriangles;
|
|
||||||
if(triangles)
|
|
||||||
RwFree(triangles);
|
|
||||||
triangles = (CColTriangle*)RwMalloc(numTriangles*sizeof(CColTriangle));
|
|
||||||
}
|
|
||||||
for(i = 0; i < numTriangles; i++)
|
|
||||||
triangles[i] = other.triangles[i];
|
|
||||||
}else{
|
|
||||||
numTriangles = 0;
|
|
||||||
if(triangles)
|
|
||||||
RwFree(triangles);
|
|
||||||
triangles = nil;
|
|
||||||
if(vertices)
|
|
||||||
RwFree(vertices);
|
|
||||||
vertices = nil;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
70
src/collision/Collision.h
Normal file
70
src/collision/Collision.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ColModel.h"
|
||||||
|
#include "Game.h" // for eLevelName
|
||||||
|
#ifdef VU_COLLISION
|
||||||
|
#include "VuVector.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct CStoredCollPoly
|
||||||
|
{
|
||||||
|
#ifdef VU_COLLISION
|
||||||
|
CVuVector verts[3];
|
||||||
|
#else
|
||||||
|
CVector verts[3];
|
||||||
|
#endif
|
||||||
|
bool valid;
|
||||||
|
};
|
||||||
|
|
||||||
|
// If you spawn many tanks at once, you will see that collisions of two entity exceeds 32.
|
||||||
|
#if defined(FIX_BUGS) && !defined(SQUEEZE_PERFORMANCE)
|
||||||
|
#define MAX_COLLISION_POINTS 64
|
||||||
|
#else
|
||||||
|
#define MAX_COLLISION_POINTS 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class CCollision
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static eLevelName ms_collisionInMemory;
|
||||||
|
static CLinkList<CColModel*> ms_colModelCache;
|
||||||
|
#ifdef NO_ISLAND_LOADING
|
||||||
|
static bool bAlreadyLoaded;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void Init(void);
|
||||||
|
static void Shutdown(void);
|
||||||
|
static void Update(void);
|
||||||
|
static void LoadCollisionWhenINeedIt(bool changeLevel);
|
||||||
|
static void SortOutCollisionAfterLoad(void);
|
||||||
|
static void LoadCollisionScreen(eLevelName level);
|
||||||
|
static void DrawColModel(const CMatrix &mat, const CColModel &colModel);
|
||||||
|
static void DrawColModel_Coloured(const CMatrix &mat, const CColModel &colModel, int32 id);
|
||||||
|
|
||||||
|
static void CalculateTrianglePlanes(CColModel *model);
|
||||||
|
|
||||||
|
// all these return true if there's a collision
|
||||||
|
static bool TestSphereSphere(const CColSphere &s1, const CColSphere &s2);
|
||||||
|
static bool TestSphereBox(const CColSphere &sph, const CColBox &box);
|
||||||
|
static bool TestLineBox(const CColLine &line, const CColBox &box);
|
||||||
|
static bool TestVerticalLineBox(const CColLine &line, const CColBox &box);
|
||||||
|
static bool TestLineTriangle(const CColLine &line, const CompressedVector *verts, const CColTriangle &tri, const CColTrianglePlane &plane);
|
||||||
|
static bool TestLineSphere(const CColLine &line, const CColSphere &sph);
|
||||||
|
static bool TestSphereTriangle(const CColSphere &sphere, const CompressedVector *verts, const CColTriangle &tri, const CColTrianglePlane &plane);
|
||||||
|
static bool TestLineOfSight(const CColLine &line, const CMatrix &matrix, CColModel &model, bool ignoreSeeThrough);
|
||||||
|
|
||||||
|
static bool ProcessSphereSphere(const CColSphere &s1, const CColSphere &s2, CColPoint &point, float &mindistsq);
|
||||||
|
static bool ProcessSphereBox(const CColSphere &sph, const CColBox &box, CColPoint &point, float &mindistsq);
|
||||||
|
static bool ProcessLineBox(const CColLine &line, const CColBox &box, CColPoint &point, float &mindist);
|
||||||
|
static bool ProcessVerticalLineTriangle(const CColLine &line, const CompressedVector *verts, const CColTriangle &tri, const CColTrianglePlane &plane, CColPoint &point, float &mindist, CStoredCollPoly *poly);
|
||||||
|
static bool ProcessLineTriangle(const CColLine &line , const CompressedVector *verts, const CColTriangle &tri, const CColTrianglePlane &plane, CColPoint &point, float &mindist);
|
||||||
|
static bool ProcessLineSphere(const CColLine &line, const CColSphere &sphere, CColPoint &point, float &mindist);
|
||||||
|
static bool ProcessSphereTriangle(const CColSphere &sph, const CompressedVector *verts, const CColTriangle &tri, const CColTrianglePlane &plane, CColPoint &point, float &mindistsq);
|
||||||
|
static bool ProcessLineOfSight(const CColLine &line, const CMatrix &matrix, CColModel &model, CColPoint &point, float &mindist, bool ignoreSeeThrough);
|
||||||
|
static bool ProcessVerticalLine(const CColLine &line, const CMatrix &matrix, CColModel &model, CColPoint &point, float &mindist, bool ignoreSeeThrough, CStoredCollPoly *poly);
|
||||||
|
static int32 ProcessColModels(const CMatrix &matrixA, CColModel &modelA, const CMatrix &matrixB, CColModel &modelB, CColPoint *spherepoints, CColPoint *linepoints, float *linedists);
|
||||||
|
static bool IsStoredPolyStillValidVerticalLine(const CVector &pos, float z, CColPoint &point, CStoredCollPoly *poly);
|
||||||
|
|
||||||
|
static float DistToLine(const CVector *l0, const CVector *l1, const CVector *point);
|
||||||
|
static float DistToLine(const CVector *l0, const CVector *l1, const CVector *point, CVector &closest);
|
||||||
|
};
|
36
src/collision/CompressedVector.h
Normal file
36
src/collision/CompressedVector.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct CompressedVector
|
||||||
|
{
|
||||||
|
#ifdef COMPRESSED_COL_VECTORS
|
||||||
|
int16 x, y, z;
|
||||||
|
CVector Get(void) const { return CVector(x, y, z)/128.0f; };
|
||||||
|
void Set(float x, float y, float z) { this->x = x*128.0f; this->y = y*128.0f; this->z = z*128.0f; };
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
void Unpack(uint128 &qword) const {
|
||||||
|
__asm__ volatile (
|
||||||
|
"lh $8, 0(%1)\n"
|
||||||
|
"lh $9, 2(%1)\n"
|
||||||
|
"lh $10, 4(%1)\n"
|
||||||
|
"pextlw $10, $8\n"
|
||||||
|
"pextlw $2, $9, $10\n"
|
||||||
|
"sq $2, %0\n"
|
||||||
|
: "=m" (qword)
|
||||||
|
: "r" (this)
|
||||||
|
: "$8", "$9", "$10", "$2"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void Unpack(int32 *qword) const {
|
||||||
|
qword[0] = x;
|
||||||
|
qword[1] = y;
|
||||||
|
qword[2] = z;
|
||||||
|
qword[3] = 0; // junk
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
float x, y, z;
|
||||||
|
CVector Get(void) const { return CVector(x, y, z); };
|
||||||
|
void Set(float x, float y, float z) { this->x = x; this->y = y; this->z = z; };
|
||||||
|
#endif
|
||||||
|
};
|
@ -1,7 +1,6 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include "TempColModels.h"
|
#include "TempColModels.h"
|
||||||
#include "SurfaceTable.h"
|
|
||||||
|
|
||||||
CColModel CTempColModels::ms_colModelPed1;
|
CColModel CTempColModels::ms_colModelPed1;
|
||||||
CColModel CTempColModels::ms_colModelPed2;
|
CColModel CTempColModels::ms_colModelPed2;
|
||||||
@ -21,7 +20,11 @@ CColModel CTempColModels::ms_colModelBonnet1;
|
|||||||
CColSphere s_aPedSpheres[3];
|
CColSphere s_aPedSpheres[3];
|
||||||
CColSphere s_aPed2Spheres[3];
|
CColSphere s_aPed2Spheres[3];
|
||||||
CColSphere s_aPedGSpheres[4];
|
CColSphere s_aPedGSpheres[4];
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CColSphere s_aDoorSpheres[3];
|
||||||
|
#else
|
||||||
CColSphere s_aDoorSpheres[4];
|
CColSphere s_aDoorSpheres[4];
|
||||||
|
#endif
|
||||||
CColSphere s_aBumperSpheres[4];
|
CColSphere s_aBumperSpheres[4];
|
||||||
CColSphere s_aPanelSpheres[4];
|
CColSphere s_aPanelSpheres[4];
|
||||||
CColSphere s_aBonnetSpheres[4];
|
CColSphere s_aBonnetSpheres[4];
|
||||||
@ -37,17 +40,17 @@ CTempColModels::Initialise(void)
|
|||||||
colmodel.numSpheres = ARRAY_SIZE(sphrs);\
|
colmodel.numSpheres = ARRAY_SIZE(sphrs);\
|
||||||
colmodel.spheres = sphrs;\
|
colmodel.spheres = sphrs;\
|
||||||
colmodel.level = LEVEL_GENERIC;\
|
colmodel.level = LEVEL_GENERIC;\
|
||||||
colmodel.ownsCollisionVolumes = false;\
|
colmodel.ownsCollisionVolumes = false;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
|
||||||
ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f), SURFACE_DEFAULT, 0);
|
ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f));
|
||||||
ms_colModelBBox.level = LEVEL_GENERIC;
|
ms_colModelBBox.level = LEVEL_GENERIC;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++) {
|
for (i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++) {
|
||||||
ms_colModelCutObj[i].boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelCutObj[i].boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
|
||||||
ms_colModelCutObj[i].boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f), SURFACE_DEFAULT, 0);
|
ms_colModelCutObj[i].boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f));
|
||||||
ms_colModelCutObj[i].level = LEVEL_GENERIC;
|
ms_colModelCutObj[i].level = LEVEL_GENERIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,8 +72,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aPedSpheres[i].piece = 0;
|
s_aPedSpheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f));
|
||||||
ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f), SURFACE_DEFAULT, 0);
|
ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f));
|
||||||
SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres);
|
||||||
|
|
||||||
// Ped 2 Spheres
|
// Ped 2 Spheres
|
||||||
@ -88,8 +91,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aPed2Spheres[i].piece = 0;
|
s_aPed2Spheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelPed2.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelPed2.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
|
||||||
ms_colModelPed2.boundingBox.Set(CVector(-0.7f, -0.7f, -1.2f), CVector(0.7f, 0.7f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelPed2.boundingBox.Set(CVector(-0.7f, -0.7f, -1.2f), CVector(0.7f, 0.7f, 0.0f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelPed2, s_aPed2Spheres);
|
SET_COLMODEL_SPHERES(ms_colModelPed2, s_aPed2Spheres);
|
||||||
|
|
||||||
@ -114,8 +117,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aPedGSpheres[2].piece = 0;
|
s_aPedGSpheres[2].piece = 0;
|
||||||
s_aPedGSpheres[3].piece = 6;
|
s_aPedGSpheres[3].piece = 6;
|
||||||
|
|
||||||
ms_colModelPedGroundHit.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelPedGroundHit.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
|
||||||
ms_colModelPedGroundHit.boundingBox.Set(CVector(-0.4f, -1.0f, -1.25f), CVector(0.4f, 1.2f, -0.5f), SURFACE_DEFAULT, 0);
|
ms_colModelPedGroundHit.boundingBox.Set(CVector(-0.4f, -1.0f, -1.25f), CVector(0.4f, 1.2f, -0.5f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelPedGroundHit, s_aPedGSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelPedGroundHit, s_aPedGSpheres);
|
||||||
|
|
||||||
@ -129,13 +132,17 @@ CTempColModels::Initialise(void)
|
|||||||
s_aDoorSpheres[1].center = CVector(0.0f, -0.95f, -0.35f);
|
s_aDoorSpheres[1].center = CVector(0.0f, -0.95f, -0.35f);
|
||||||
s_aDoorSpheres[2].center = CVector(0.0f, -0.6f, 0.25f);
|
s_aDoorSpheres[2].center = CVector(0.0f, -0.6f, 0.25f);
|
||||||
|
|
||||||
|
#ifdef FIX_BUGS
|
||||||
for (i = 0; i < ARRAY_SIZE(s_aDoorSpheres); i++) {
|
for (i = 0; i < ARRAY_SIZE(s_aDoorSpheres); i++) {
|
||||||
|
#else
|
||||||
|
for (i = 0; i < ARRAY_SIZE(s_aPed2Spheres); i++) {
|
||||||
|
#endif
|
||||||
s_aDoorSpheres[i].surface = SURFACE_CAR_PANEL;
|
s_aDoorSpheres[i].surface = SURFACE_CAR_PANEL;
|
||||||
s_aDoorSpheres[i].piece = 0;
|
s_aDoorSpheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelDoor1.boundingSphere.Set(1.5f, CVector(0.0f, -0.6f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelDoor1.boundingSphere.Set(1.5f, CVector(0.0f, -0.6f, 0.0f));
|
||||||
ms_colModelDoor1.boundingBox.Set(CVector(-0.3f, 0.0f, -0.6f), CVector(0.3f, -1.2f, 0.6f), SURFACE_DEFAULT, 0);
|
ms_colModelDoor1.boundingBox.Set(CVector(-0.3f, 0.0f, -0.6f), CVector(0.3f, -1.2f, 0.6f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelDoor1, s_aDoorSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelDoor1, s_aDoorSpheres);
|
||||||
|
|
||||||
@ -154,8 +161,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aBumperSpheres[i].piece = 0;
|
s_aBumperSpheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelBumper1.boundingSphere.Set(2.2f, CVector(0.0f, -0.6f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelBumper1.boundingSphere.Set(2.2f, CVector(0.0f, -0.6f, 0.0f));
|
||||||
ms_colModelBumper1.boundingBox.Set(CVector(-1.2f, -0.3f, -0.2f), CVector(1.2f, 0.3f, 0.2f), SURFACE_DEFAULT, 0);
|
ms_colModelBumper1.boundingBox.Set(CVector(-1.2f, -0.3f, -0.2f), CVector(1.2f, 0.3f, 0.2f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelBumper1, s_aBumperSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelBumper1, s_aBumperSpheres);
|
||||||
|
|
||||||
@ -174,8 +181,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aPanelSpheres[i].piece = 0;
|
s_aPanelSpheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelPanel1.boundingSphere.Set(1.4f, CVector(0.0f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelPanel1.boundingSphere.Set(1.4f, CVector(0.0f, 0.0f, 0.0f));
|
||||||
ms_colModelPanel1.boundingBox.Set(CVector(-0.3f, -0.6f, -0.15f), CVector(0.3f, 0.6f, 0.15f), SURFACE_DEFAULT, 0);
|
ms_colModelPanel1.boundingBox.Set(CVector(-0.3f, -0.6f, -0.15f), CVector(0.3f, 0.6f, 0.15f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelPanel1, s_aPanelSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelPanel1, s_aPanelSpheres);
|
||||||
|
|
||||||
@ -194,8 +201,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aBonnetSpheres[i].piece = 0;
|
s_aBonnetSpheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelBonnet1.boundingSphere.Set(1.7f, CVector(0.0f, 0.5f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelBonnet1.boundingSphere.Set(1.7f, CVector(0.0f, 0.5f, 0.0f));
|
||||||
ms_colModelBonnet1.boundingBox.Set(CVector(-0.7f, -0.2f, -0.3f), CVector(0.7f, 1.2f, 0.3f), SURFACE_DEFAULT, 0);
|
ms_colModelBonnet1.boundingBox.Set(CVector(-0.7f, -0.2f, -0.3f), CVector(0.7f, 1.2f, 0.3f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelBonnet1, s_aBonnetSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelBonnet1, s_aBonnetSpheres);
|
||||||
|
|
||||||
@ -214,8 +221,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aBootSpheres[i].piece = 0;
|
s_aBootSpheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelBoot1.boundingSphere.Set(1.4f, CVector(0.0f, -0.4f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelBoot1.boundingSphere.Set(1.4f, CVector(0.0f, -0.4f, 0.0f));
|
||||||
ms_colModelBoot1.boundingBox.Set(CVector(-0.7f, -0.9f, -0.3f), CVector(0.7f, 0.2f, 0.3f), SURFACE_DEFAULT, 0);
|
ms_colModelBoot1.boundingBox.Set(CVector(-0.7f, -0.9f, -0.3f), CVector(0.7f, 0.2f, 0.3f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelBoot1, s_aBootSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelBoot1, s_aBootSpheres);
|
||||||
|
|
||||||
@ -236,8 +243,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aWheelSpheres[i].piece = 0;
|
s_aWheelSpheres[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelWheel1.boundingSphere.Set(1.4f, CVector(0.0f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelWheel1.boundingSphere.Set(1.4f, CVector(0.0f, 0.0f, 0.0f));
|
||||||
ms_colModelWheel1.boundingBox.Set(CVector(-0.7f, -0.4f, -0.4f), CVector(0.7f, 0.4f, 0.4f), SURFACE_DEFAULT, 0);
|
ms_colModelWheel1.boundingBox.Set(CVector(-0.7f, -0.4f, -0.4f), CVector(0.7f, 0.4f, 0.4f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelWheel1, s_aWheelSpheres);
|
SET_COLMODEL_SPHERES(ms_colModelWheel1, s_aWheelSpheres);
|
||||||
|
|
||||||
@ -258,8 +265,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aBodyPartSpheres1[i].piece = 0;
|
s_aBodyPartSpheres1[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelBodyPart1.boundingSphere.Set(0.7f, CVector(0.4f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelBodyPart1.boundingSphere.Set(0.7f, CVector(0.4f, 0.0f, 0.0f));
|
||||||
ms_colModelBodyPart1.boundingBox.Set(CVector(-0.3f, -0.3f, -0.3f), CVector(1.1f, 0.3f, 0.3f), SURFACE_DEFAULT, 0);
|
ms_colModelBodyPart1.boundingBox.Set(CVector(-0.3f, -0.3f, -0.3f), CVector(1.1f, 0.3f, 0.3f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelBodyPart1, s_aBodyPartSpheres1);
|
SET_COLMODEL_SPHERES(ms_colModelBodyPart1, s_aBodyPartSpheres1);
|
||||||
|
|
||||||
@ -280,8 +287,8 @@ CTempColModels::Initialise(void)
|
|||||||
s_aBodyPartSpheres2[i].piece = 0;
|
s_aBodyPartSpheres2[i].piece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ms_colModelBodyPart2.boundingSphere.Set(0.5f, CVector(0.25f, 0.0f, 0.0f), SURFACE_DEFAULT, 0);
|
ms_colModelBodyPart2.boundingSphere.Set(0.5f, CVector(0.25f, 0.0f, 0.0f));
|
||||||
ms_colModelBodyPart2.boundingBox.Set(CVector(-0.2f, -0.2f, -0.2f), CVector(0.7f, 0.2f, 0.2f), SURFACE_DEFAULT, 0);
|
ms_colModelBodyPart2.boundingBox.Set(CVector(-0.2f, -0.2f, -0.2f), CVector(0.7f, 0.2f, 0.2f));
|
||||||
|
|
||||||
SET_COLMODEL_SPHERES(ms_colModelBodyPart2, s_aBodyPartSpheres2);
|
SET_COLMODEL_SPHERES(ms_colModelBodyPart2, s_aBodyPartSpheres2);
|
||||||
|
|
282
src/collision/VuCollision.cpp
Normal file
282
src/collision/VuCollision.cpp
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#ifdef VU_COLLISION
|
||||||
|
#include "VuVector.h"
|
||||||
|
#include "VuCollision.h"
|
||||||
|
|
||||||
|
#ifndef GTA_PS2
|
||||||
|
int16 vi01;
|
||||||
|
CVuVector vf01;
|
||||||
|
CVuVector vf02;
|
||||||
|
CVuVector vf03;
|
||||||
|
|
||||||
|
CVuVector
|
||||||
|
DistanceBetweenSphereAndLine(const CVuVector ¢er, const CVuVector &p0, const CVuVector &line)
|
||||||
|
{
|
||||||
|
// center VF12
|
||||||
|
// p0 VF14
|
||||||
|
// line VF15
|
||||||
|
CVuVector ret; // VF16
|
||||||
|
CVuVector p1 = p0+line;
|
||||||
|
CVuVector dist0 = center - p0; // VF20
|
||||||
|
CVuVector dist1 = center - p1; // VF25
|
||||||
|
float lenSq = line.MagnitudeSqr(); // VF21
|
||||||
|
float distSq0 = dist0.MagnitudeSqr(); // VF22
|
||||||
|
float distSq1 = dist1.MagnitudeSqr();
|
||||||
|
float dot = DotProduct(dist0, line); // VF23
|
||||||
|
if(dot < 0.0f){
|
||||||
|
// not above line, closest to p0
|
||||||
|
ret = p0;
|
||||||
|
ret.w = distSq0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
float t = dot/lenSq; // param of nearest point on infinite line
|
||||||
|
if(t > 1.0f){
|
||||||
|
// not above line, closest to p1
|
||||||
|
ret = p1;
|
||||||
|
ret.w = distSq1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
// closest to line
|
||||||
|
ret = p0 + line*t;
|
||||||
|
ret.w = (ret - center).MagnitudeSqr();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
inline int SignFlags(const CVector &v)
|
||||||
|
{
|
||||||
|
int f = 0;
|
||||||
|
if(v.x < 0.0f) f |= 1;
|
||||||
|
if(v.y < 0.0f) f |= 2;
|
||||||
|
if(v.z < 0.0f) f |= 4;
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
LineToTriangleCollision(const CVuVector &p0, const CVuVector &p1,
|
||||||
|
const CVuVector &v0, const CVuVector &v1, const CVuVector &v2,
|
||||||
|
const CVuVector &plane)
|
||||||
|
{
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
__asm__ volatile (
|
||||||
|
".set noreorder\n"
|
||||||
|
"lqc2 vf12, 0x0(%0)\n"
|
||||||
|
"lqc2 vf13, 0x0(%1)\n"
|
||||||
|
"lqc2 vf14, 0x0(%2)\n"
|
||||||
|
"lqc2 vf15, 0x0(%3)\n"
|
||||||
|
"lqc2 vf16, 0x0(%4)\n"
|
||||||
|
"lqc2 vf17, 0x0(%5)\n"
|
||||||
|
"vcallms Vu0LineToTriangleCollisionStart\n"
|
||||||
|
".set reorder\n"
|
||||||
|
:
|
||||||
|
: "r" (&p0), "r" (&p1), "r" (&v0), "r" (&v1), "r" (&v2), "r" (&plane)
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
float dot0 = DotProduct(plane, p0);
|
||||||
|
float dot1 = DotProduct(plane, p1);
|
||||||
|
float dist0 = plane.w - dot0;
|
||||||
|
float dist1 = plane.w - dot1;
|
||||||
|
|
||||||
|
// if points are on the same side, no collision
|
||||||
|
if(dist0 * dist1 > 0.0f){
|
||||||
|
vi01 = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CVuVector diff = p1 - p0;
|
||||||
|
float t = dist0/(dot1 - dot0);
|
||||||
|
CVuVector p = p0 + diff*t;
|
||||||
|
p.w = 0.0f;
|
||||||
|
vf01 = p;
|
||||||
|
vf03.x = t;
|
||||||
|
|
||||||
|
// Check if point is inside
|
||||||
|
CVector cross1 = CrossProduct(p-v0, v1-v0);
|
||||||
|
CVector cross2 = CrossProduct(p-v1, v2-v1);
|
||||||
|
CVector cross3 = CrossProduct(p-v2, v0-v2);
|
||||||
|
// Only check relevant directions
|
||||||
|
int flagmask = 0;
|
||||||
|
if(Abs(plane.x) > 0.5f) flagmask |= 1;
|
||||||
|
if(Abs(plane.y) > 0.5f) flagmask |= 2;
|
||||||
|
if(Abs(plane.z) > 0.5f) flagmask |= 4;
|
||||||
|
int flags1 = SignFlags(cross1) & flagmask;
|
||||||
|
int flags2 = SignFlags(cross2) & flagmask;
|
||||||
|
int flags3 = SignFlags(cross3) & flagmask;
|
||||||
|
// inside if on the same side of all edges
|
||||||
|
if(flags1 != flags2 || flags1 != flags3){
|
||||||
|
vi01 = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
vi01 = 1;
|
||||||
|
vf02 = plane;
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
LineToTriangleCollisionCompressed(const CVuVector &p0, const CVuVector &p1, VuTriangle &tri)
|
||||||
|
{
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
__asm__ volatile (
|
||||||
|
".set noreorder\n"
|
||||||
|
"lqc2 vf12, 0x0(%0)\n"
|
||||||
|
"lqc2 vf13, 0x0(%1)\n"
|
||||||
|
"lqc2 vf14, 0x0(%2)\n"
|
||||||
|
"lqc2 vf15, 0x10(%2)\n"
|
||||||
|
"lqc2 vf16, 0x20(%2)\n"
|
||||||
|
"lqc2 vf17, 0x30(%2)\n"
|
||||||
|
"vcallms Vu0LineToTriangleCollisionCompressedStart\n"
|
||||||
|
".set reorder\n"
|
||||||
|
:
|
||||||
|
: "r" (&p0), "r" (&p1), "r" (&tri)
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
CVuVector v0, v1, v2, plane;
|
||||||
|
v0.x = tri.v0[0]/128.0f;
|
||||||
|
v0.y = tri.v0[1]/128.0f;
|
||||||
|
v0.z = tri.v0[2]/128.0f;
|
||||||
|
v0.w = tri.v0[3]/128.0f;
|
||||||
|
v1.x = tri.v1[0]/128.0f;
|
||||||
|
v1.y = tri.v1[1]/128.0f;
|
||||||
|
v1.z = tri.v1[2]/128.0f;
|
||||||
|
v1.w = tri.v1[3]/128.0f;
|
||||||
|
v2.x = tri.v2[0]/128.0f;
|
||||||
|
v2.y = tri.v2[1]/128.0f;
|
||||||
|
v2.z = tri.v2[2]/128.0f;
|
||||||
|
v2.w = tri.v2[3]/128.0f;
|
||||||
|
plane.x = tri.plane[0]/4096.0f;
|
||||||
|
plane.y = tri.plane[1]/4096.0f;
|
||||||
|
plane.z = tri.plane[2]/4096.0f;
|
||||||
|
plane.w = tri.plane[3]/128.0f;
|
||||||
|
LineToTriangleCollision(p0, p1, v0, v1, v2, plane);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
SphereToTriangleCollision(const CVuVector &sph,
|
||||||
|
const CVuVector &v0, const CVuVector &v1, const CVuVector &v2,
|
||||||
|
const CVuVector &plane)
|
||||||
|
{
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
__asm__ volatile (
|
||||||
|
".set noreorder\n"
|
||||||
|
"lqc2 vf12, 0x0(%0)\n"
|
||||||
|
"lqc2 vf14, 0x0(%1)\n"
|
||||||
|
"lqc2 vf15, 0x0(%2)\n"
|
||||||
|
"lqc2 vf16, 0x0(%3)\n"
|
||||||
|
"lqc2 vf17, 0x0(%4)\n"
|
||||||
|
"vcallms Vu0SphereToTriangleCollisionStart\n"
|
||||||
|
".set reorder\n"
|
||||||
|
:
|
||||||
|
: "r" (&sph), "r" (&v0), "r" (&v1), "r" (&v2), "r" (&plane)
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
float planedist = DotProduct(plane, sph) - plane.w; // VF02
|
||||||
|
if(Abs(planedist) > sph.w){
|
||||||
|
vi01 = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// point on plane
|
||||||
|
CVuVector p = sph - planedist*plane;
|
||||||
|
p.w = 0.0f;
|
||||||
|
vf01 = p;
|
||||||
|
planedist = Abs(planedist);
|
||||||
|
// edges
|
||||||
|
CVuVector v01 = v1 - v0;
|
||||||
|
CVuVector v12 = v2 - v1;
|
||||||
|
CVuVector v20 = v0 - v2;
|
||||||
|
// VU code calculates normal again for some weird reason...
|
||||||
|
// Check sides of point
|
||||||
|
CVector cross1 = CrossProduct(p-v0, v01);
|
||||||
|
CVector cross2 = CrossProduct(p-v1, v12);
|
||||||
|
CVector cross3 = CrossProduct(p-v2, v20);
|
||||||
|
// Only check relevant directions
|
||||||
|
int flagmask = 0;
|
||||||
|
if(Abs(plane.x) > 0.1f) flagmask |= 1;
|
||||||
|
if(Abs(plane.y) > 0.1f) flagmask |= 2;
|
||||||
|
if(Abs(plane.z) > 0.1f) flagmask |= 4;
|
||||||
|
int nflags = SignFlags(plane) & flagmask;
|
||||||
|
int flags1 = SignFlags(cross1) & flagmask;
|
||||||
|
int flags2 = SignFlags(cross2) & flagmask;
|
||||||
|
int flags3 = SignFlags(cross3) & flagmask;
|
||||||
|
int testcase = 0;
|
||||||
|
CVuVector closest(0.0f, 0.0f, 0.0f); // VF04
|
||||||
|
if(flags1 == nflags){
|
||||||
|
closest += v2;
|
||||||
|
testcase++;
|
||||||
|
}
|
||||||
|
if(flags2 == nflags){
|
||||||
|
closest += v0;
|
||||||
|
testcase++;
|
||||||
|
}
|
||||||
|
if(flags3 == nflags){
|
||||||
|
closest += v1;
|
||||||
|
testcase++;
|
||||||
|
}
|
||||||
|
if(testcase == 3){
|
||||||
|
// inside triangle - dist to plane already checked
|
||||||
|
vf02 = plane;
|
||||||
|
vf02.w = vf03.x = planedist;
|
||||||
|
vi01 = 1;
|
||||||
|
}else if(testcase == 1){
|
||||||
|
// outside two sides - closest to point opposide inside edge
|
||||||
|
vf01 = closest;
|
||||||
|
vf02 = sph - closest;
|
||||||
|
float distSq = vf02.MagnitudeSqr();
|
||||||
|
vi01 = sph.w*sph.w > distSq;
|
||||||
|
vf03.x = Sqrt(distSq);
|
||||||
|
vf02 *= 1.0f/vf03.x;
|
||||||
|
}else{
|
||||||
|
// inside two sides - closest to third edge
|
||||||
|
if(flags1 != nflags)
|
||||||
|
closest = DistanceBetweenSphereAndLine(sph, v0, v01);
|
||||||
|
else if(flags2 != nflags)
|
||||||
|
closest = DistanceBetweenSphereAndLine(sph, v1, v12);
|
||||||
|
else
|
||||||
|
closest = DistanceBetweenSphereAndLine(sph, v2, v20);
|
||||||
|
vi01 = sph.w*sph.w > closest.w;
|
||||||
|
vf01 = closest;
|
||||||
|
vf02 = sph - closest;
|
||||||
|
vf03.x = Sqrt(closest.w);
|
||||||
|
vf02 *= 1.0f/vf03.x;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
SphereToTriangleCollisionCompressed(const CVuVector &sph, VuTriangle &tri)
|
||||||
|
{
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
__asm__ volatile (
|
||||||
|
".set noreorder\n"
|
||||||
|
"lqc2 vf12, 0x0(%0)\n"
|
||||||
|
"lqc2 vf14, 0x0(%1)\n"
|
||||||
|
"lqc2 vf15, 0x10(%1)\n"
|
||||||
|
"lqc2 vf16, 0x20(%1)\n"
|
||||||
|
"lqc2 vf17, 0x30(%1)\n"
|
||||||
|
"vcallms Vu0SphereToTriangleCollisionCompressedStart\n"
|
||||||
|
".set reorder\n"
|
||||||
|
:
|
||||||
|
: "r" (&sph), "r" (&tri)
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
CVuVector v0, v1, v2, plane;
|
||||||
|
v0.x = tri.v0[0]/128.0f;
|
||||||
|
v0.y = tri.v0[1]/128.0f;
|
||||||
|
v0.z = tri.v0[2]/128.0f;
|
||||||
|
v0.w = tri.v0[3]/128.0f;
|
||||||
|
v1.x = tri.v1[0]/128.0f;
|
||||||
|
v1.y = tri.v1[1]/128.0f;
|
||||||
|
v1.z = tri.v1[2]/128.0f;
|
||||||
|
v1.w = tri.v1[3]/128.0f;
|
||||||
|
v2.x = tri.v2[0]/128.0f;
|
||||||
|
v2.y = tri.v2[1]/128.0f;
|
||||||
|
v2.z = tri.v2[2]/128.0f;
|
||||||
|
v2.w = tri.v2[3]/128.0f;
|
||||||
|
plane.x = tri.plane[0]/4096.0f;
|
||||||
|
plane.y = tri.plane[1]/4096.0f;
|
||||||
|
plane.z = tri.plane[2]/4096.0f;
|
||||||
|
plane.w = tri.plane[3]/128.0f;
|
||||||
|
SphereToTriangleCollision(sph, v0, v1, v2, plane);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
32
src/collision/VuCollision.h
Normal file
32
src/collision/VuCollision.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
struct VuTriangle
|
||||||
|
{
|
||||||
|
// Compressed int16 but unpacked
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
uint128 v0;
|
||||||
|
uint128 v1;
|
||||||
|
uint128 v2;
|
||||||
|
uint128 plane;
|
||||||
|
#else
|
||||||
|
int32 v0[4];
|
||||||
|
int32 v1[4];
|
||||||
|
int32 v2[4];
|
||||||
|
int32 plane[4];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef GTA_PS2
|
||||||
|
extern int16 vi01;
|
||||||
|
extern CVuVector vf01;
|
||||||
|
extern CVuVector vf02;
|
||||||
|
extern CVuVector vf03;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void LineToTriangleCollision(const CVuVector &p0, const CVuVector &p1, const CVuVector &v0, const CVuVector &v1, const CVuVector &v2, const CVuVector &plane);
|
||||||
|
void LineToTriangleCollisionCompressed(const CVuVector &p0, const CVuVector &p1, VuTriangle &tri);
|
||||||
|
void SphereToTriangleCollision(const CVuVector &sph, const CVuVector &v0, const CVuVector &v1, const CVuVector &v2, const CVuVector &plane);
|
||||||
|
void SphereToTriangleCollisionCompressed(const CVuVector &sph, VuTriangle &tri);
|
||||||
|
}
|
@ -103,9 +103,9 @@ void CAutoPilot::Load(uint8*& buf)
|
|||||||
m_nNextDirection = ReadSaveBuf<int8>(buf);
|
m_nNextDirection = ReadSaveBuf<int8>(buf);
|
||||||
m_nCurrentLane = ReadSaveBuf<int8>(buf);
|
m_nCurrentLane = ReadSaveBuf<int8>(buf);
|
||||||
m_nNextLane = ReadSaveBuf<int8>(buf);
|
m_nNextLane = ReadSaveBuf<int8>(buf);
|
||||||
m_nDrivingStyle = (eCarDrivingStyle)ReadSaveBuf<uint8>(buf);
|
m_nDrivingStyle = ReadSaveBuf<uint8>(buf);
|
||||||
m_nCarMission = (eCarMission)ReadSaveBuf<uint8>(buf);
|
m_nCarMission = ReadSaveBuf<uint8>(buf);
|
||||||
m_nTempAction = (eCarTempAction)ReadSaveBuf<uint8>(buf);
|
m_nTempAction = ReadSaveBuf<uint8>(buf);
|
||||||
m_nTimeTempAction = ReadSaveBuf<uint32>(buf);
|
m_nTimeTempAction = ReadSaveBuf<uint32>(buf);
|
||||||
m_fMaxTrafficSpeed = ReadSaveBuf<float>(buf);
|
m_fMaxTrafficSpeed = ReadSaveBuf<float>(buf);
|
||||||
m_nCruiseSpeed = ReadSaveBuf<uint8>(buf);
|
m_nCruiseSpeed = ReadSaveBuf<uint8>(buf);
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
class CVehicle;
|
class CVehicle;
|
||||||
struct CPathNode;
|
struct CPathNode;
|
||||||
|
|
||||||
enum eCarMission : uint8
|
enum eCarMission
|
||||||
{
|
{
|
||||||
MISSION_NONE,
|
MISSION_NONE,
|
||||||
MISSION_CRUISE,
|
MISSION_CRUISE,
|
||||||
@ -28,7 +28,7 @@ enum eCarMission : uint8
|
|||||||
MISSION_BLOCKCAR_HANDBRAKESTOP,
|
MISSION_BLOCKCAR_HANDBRAKESTOP,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eCarTempAction : uint8
|
enum eCarTempAction
|
||||||
{
|
{
|
||||||
TEMPACT_NONE,
|
TEMPACT_NONE,
|
||||||
TEMPACT_WAIT,
|
TEMPACT_WAIT,
|
||||||
@ -43,7 +43,7 @@ enum eCarTempAction : uint8
|
|||||||
TEMPACT_SWERVERIGHT
|
TEMPACT_SWERVERIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eCarDrivingStyle : uint8
|
enum eCarDrivingStyle
|
||||||
{
|
{
|
||||||
DRIVINGSTYLE_STOP_FOR_CARS,
|
DRIVINGSTYLE_STOP_FOR_CARS,
|
||||||
DRIVINGSTYLE_SLOW_DOWN_FOR_CARS,
|
DRIVINGSTYLE_SLOW_DOWN_FOR_CARS,
|
||||||
@ -69,9 +69,9 @@ public:
|
|||||||
int8 m_nNextDirection;
|
int8 m_nNextDirection;
|
||||||
int8 m_nCurrentLane;
|
int8 m_nCurrentLane;
|
||||||
int8 m_nNextLane;
|
int8 m_nNextLane;
|
||||||
eCarDrivingStyle m_nDrivingStyle;
|
uint8 m_nDrivingStyle;
|
||||||
eCarMission m_nCarMission;
|
uint8 m_nCarMission;
|
||||||
eCarTempAction m_nTempAction;
|
uint8 m_nTempAction;
|
||||||
uint32 m_nTimeTempAction;
|
uint32 m_nTimeTempAction;
|
||||||
float m_fMaxTrafficSpeed;
|
float m_fMaxTrafficSpeed;
|
||||||
uint8 m_nCruiseSpeed;
|
uint8 m_nCruiseSpeed;
|
||||||
|
@ -539,7 +539,7 @@ void CCarAI::TellCarToBlockOtherCar(CVehicle* pVehicle, CVehicle* pTarget)
|
|||||||
pVehicle->AutoPilot.m_nCruiseSpeed = Max(6, pVehicle->AutoPilot.m_nCruiseSpeed);
|
pVehicle->AutoPilot.m_nCruiseSpeed = Max(6, pVehicle->AutoPilot.m_nCruiseSpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
eCarMission CCarAI::FindPoliceCarMissionForWantedLevel()
|
uint8 CCarAI::FindPoliceCarMissionForWantedLevel()
|
||||||
{
|
{
|
||||||
switch (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nWantedLevel){
|
switch (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nWantedLevel){
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -19,7 +19,7 @@ public:
|
|||||||
static void TellOccupantsToLeaveCar(CVehicle*);
|
static void TellOccupantsToLeaveCar(CVehicle*);
|
||||||
static void TellCarToRamOtherCar(CVehicle*, CVehicle*);
|
static void TellCarToRamOtherCar(CVehicle*, CVehicle*);
|
||||||
static void TellCarToBlockOtherCar(CVehicle*, CVehicle*);
|
static void TellCarToBlockOtherCar(CVehicle*, CVehicle*);
|
||||||
static eCarMission FindPoliceCarMissionForWantedLevel();
|
static uint8 FindPoliceCarMissionForWantedLevel();
|
||||||
static int32 FindPoliceCarSpeedForWantedLevel(CVehicle*);
|
static int32 FindPoliceCarSpeedForWantedLevel(CVehicle*);
|
||||||
static void MellowOutChaseSpeed(CVehicle*);
|
static void MellowOutChaseSpeed(CVehicle*);
|
||||||
static void MakeWayForCarWithSiren(CVehicle *veh);
|
static void MakeWayForCarWithSiren(CVehicle *veh);
|
||||||
|
@ -408,11 +408,6 @@ CCarCtrl::GenerateOneRandomCar()
|
|||||||
float directionNextLinkX;
|
float directionNextLinkX;
|
||||||
float directionNextLinkY;
|
float directionNextLinkY;
|
||||||
if (positionBetweenNodes < 0.5f) {
|
if (positionBetweenNodes < 0.5f) {
|
||||||
float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX();
|
|
||||||
float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY();
|
|
||||||
float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX();
|
|
||||||
float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY();
|
|
||||||
|
|
||||||
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
||||||
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
||||||
positionOnCurrentLinkIncludingLane = CVector(
|
positionOnCurrentLinkIncludingLane = CVector(
|
||||||
@ -442,11 +437,6 @@ CCarCtrl::GenerateOneRandomCar()
|
|||||||
pVehicle->AutoPilot.m_nTimeEnteredCurve = CTimer::GetTimeInMilliseconds() -
|
pVehicle->AutoPilot.m_nTimeEnteredCurve = CTimer::GetTimeInMilliseconds() -
|
||||||
(uint32)((positionBetweenNodes - 0.5f) * pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve);
|
(uint32)((positionBetweenNodes - 0.5f) * pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve);
|
||||||
|
|
||||||
float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX();
|
|
||||||
float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY();
|
|
||||||
float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX();
|
|
||||||
float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY();
|
|
||||||
|
|
||||||
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
||||||
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
||||||
positionOnCurrentLinkIncludingLane = CVector(
|
positionOnCurrentLinkIncludingLane = CVector(
|
||||||
@ -2348,7 +2338,11 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv
|
|||||||
switch (pVehicle->AutoPilot.m_nDrivingStyle) {
|
switch (pVehicle->AutoPilot.m_nDrivingStyle) {
|
||||||
case DRIVINGSTYLE_STOP_FOR_CARS:
|
case DRIVINGSTYLE_STOP_FOR_CARS:
|
||||||
case DRIVINGSTYLE_SLOW_DOWN_FOR_CARS:
|
case DRIVINGSTYLE_SLOW_DOWN_FOR_CARS:
|
||||||
speedStyleMultiplier = FindMaximumSpeedForThisCarInTraffic(pVehicle) / pVehicle->AutoPilot.m_nCruiseSpeed;
|
speedStyleMultiplier = FindMaximumSpeedForThisCarInTraffic(pVehicle);
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (pVehicle->AutoPilot.m_nCruiseSpeed != 0)
|
||||||
|
#endif
|
||||||
|
speedStyleMultiplier /= pVehicle->AutoPilot.m_nCruiseSpeed;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
speedStyleMultiplier = 1.0f;
|
speedStyleMultiplier = 1.0f;
|
||||||
@ -2578,7 +2572,7 @@ void CCarCtrl::SwitchVehicleToRealPhysics(CVehicle* pVehicle)
|
|||||||
void CCarCtrl::JoinCarWithRoadSystem(CVehicle* pVehicle)
|
void CCarCtrl::JoinCarWithRoadSystem(CVehicle* pVehicle)
|
||||||
{
|
{
|
||||||
pVehicle->AutoPilot.m_nPrevRouteNode = pVehicle->AutoPilot.m_nCurrentRouteNode = pVehicle->AutoPilot.m_nNextRouteNode = 0;
|
pVehicle->AutoPilot.m_nPrevRouteNode = pVehicle->AutoPilot.m_nCurrentRouteNode = pVehicle->AutoPilot.m_nNextRouteNode = 0;
|
||||||
pVehicle->AutoPilot.m_nCurrentRouteNode = pVehicle->AutoPilot.m_nPreviousPathNodeInfo = pVehicle->AutoPilot.m_nNextPathNodeInfo = 0;
|
pVehicle->AutoPilot.m_nCurrentPathNodeInfo = pVehicle->AutoPilot.m_nPreviousPathNodeInfo = pVehicle->AutoPilot.m_nNextPathNodeInfo = 0;
|
||||||
int nodeId = ThePaths.FindNodeClosestToCoorsFavourDirection(pVehicle->GetPosition(), 0, pVehicle->GetForward().x, pVehicle->GetForward().y);
|
int nodeId = ThePaths.FindNodeClosestToCoorsFavourDirection(pVehicle->GetPosition(), 0, pVehicle->GetForward().x, pVehicle->GetForward().y);
|
||||||
CPathNode* pNode = &ThePaths.m_pathNodes[nodeId];
|
CPathNode* pNode = &ThePaths.m_pathNodes[nodeId];
|
||||||
int prevNodeId = -1;
|
int prevNodeId = -1;
|
||||||
@ -2692,7 +2686,7 @@ void CCarCtrl::GenerateEmergencyServicesCar(void)
|
|||||||
float distance = 30.0f;
|
float distance = 30.0f;
|
||||||
CFire* pNearestFire = gFireManager.FindNearestFire(FindPlayerCoors(), &distance);
|
CFire* pNearestFire = gFireManager.FindNearestFire(FindPlayerCoors(), &distance);
|
||||||
if (pNearestFire) {
|
if (pNearestFire) {
|
||||||
if (CountCarsOfType(MI_FIRETRUCK) < 2 && CTimer::GetTimeInMilliseconds() > LastTimeFireTruckCreated + 30000){
|
if (CountCarsOfType(MI_FIRETRUCK) < 2 && CTimer::GetTimeInMilliseconds() > LastTimeFireTruckCreated + 35000){
|
||||||
CStreaming::RequestModel(MI_FIRETRUCK, STREAMFLAGS_DEPENDENCY);
|
CStreaming::RequestModel(MI_FIRETRUCK, STREAMFLAGS_DEPENDENCY);
|
||||||
CStreaming::RequestModel(MI_FIREMAN, STREAMFLAGS_DONT_REMOVE);
|
CStreaming::RequestModel(MI_FIREMAN, STREAMFLAGS_DONT_REMOVE);
|
||||||
if (CStreaming::HasModelLoaded(MI_FIRETRUCK) && CStreaming::HasModelLoaded(MI_FIREMAN)){
|
if (CStreaming::HasModelLoaded(MI_FIRETRUCK) && CStreaming::HasModelLoaded(MI_FIREMAN)){
|
||||||
|
@ -13,6 +13,9 @@
|
|||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
#include "Replay.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define FRENZY_ANY_PED -1
|
#define FRENZY_ANY_PED -1
|
||||||
#define FRENZY_ANY_CAR -2
|
#define FRENZY_ANY_CAR -2
|
||||||
@ -60,18 +63,30 @@ CDarkel::CalcFade(uint32 time, uint32 start, uint32 end)
|
|||||||
void
|
void
|
||||||
CDarkel::DrawMessages()
|
CDarkel::DrawMessages()
|
||||||
{
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (CReplay::IsPlayingBack())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
switch (Status) {
|
switch (Status) {
|
||||||
case KILLFRENZY_ONGOING:
|
case KILLFRENZY_ONGOING:
|
||||||
{
|
{
|
||||||
CFont::SetJustifyOff();
|
CFont::SetJustifyOff();
|
||||||
CFont::SetBackgroundOff();
|
CFont::SetBackgroundOff();
|
||||||
CFont::SetCentreSize(SCREEN_SCALE_FROM_RIGHT(30.0f));
|
#ifdef FIX_BUGS
|
||||||
|
CFont::SetCentreSize(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH - 30));
|
||||||
|
#else
|
||||||
|
CFont::SetCentreSize(SCREEN_WIDTH - 30);
|
||||||
|
#endif
|
||||||
CFont::SetCentreOn();
|
CFont::SetCentreOn();
|
||||||
CFont::SetPropOn();
|
CFont::SetPropOn();
|
||||||
uint32 timePassedSinceStart = CTimer::GetTimeInMilliseconds() - CDarkel::TimeOfFrenzyStart;
|
uint32 timePassedSinceStart = CTimer::GetTimeInMilliseconds() - CDarkel::TimeOfFrenzyStart;
|
||||||
if (CDarkel::bStandardSoundAndMessages) {
|
if (CDarkel::bStandardSoundAndMessages) {
|
||||||
if (timePassedSinceStart >= 3000 && timePassedSinceStart < 11000) {
|
if (timePassedSinceStart >= 3000 && timePassedSinceStart < 11000) {
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::SetScale(SCREEN_SCALE_X(1.3f), SCREEN_SCALE_Y(1.3f));
|
CFont::SetScale(SCREEN_SCALE_X(1.3f), SCREEN_SCALE_Y(1.3f));
|
||||||
|
#else
|
||||||
|
CFont::SetScale(1.3f, 1.3f);
|
||||||
|
#endif
|
||||||
CFont::SetJustifyOff();
|
CFont::SetJustifyOff();
|
||||||
CFont::SetColor(CRGBA(255, 255, 128, CalcFade(timePassedSinceStart, 3000, 11000)));
|
CFont::SetColor(CRGBA(255, 255, 128, CalcFade(timePassedSinceStart, 3000, 11000)));
|
||||||
CFont::SetFontStyle(FONT_BANK);
|
CFont::SetFontStyle(FONT_BANK);
|
||||||
@ -81,7 +96,11 @@ CDarkel::DrawMessages()
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (timePassedSinceStart < 8000) {
|
if (timePassedSinceStart < 8000) {
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::SetScale(SCREEN_SCALE_X(1.3f), SCREEN_SCALE_Y(1.3f));
|
CFont::SetScale(SCREEN_SCALE_X(1.3f), SCREEN_SCALE_Y(1.3f));
|
||||||
|
#else
|
||||||
|
CFont::SetScale(1.3f, 1.3f);
|
||||||
|
#endif
|
||||||
CFont::SetJustifyOff();
|
CFont::SetJustifyOff();
|
||||||
CFont::SetColor(CRGBA(255, 255, 128, CalcFade(timePassedSinceStart, 0, 8000)));
|
CFont::SetColor(CRGBA(255, 255, 128, CalcFade(timePassedSinceStart, 0, 8000)));
|
||||||
CFont::SetFontStyle(FONT_BANK);
|
CFont::SetFontStyle(FONT_BANK);
|
||||||
@ -90,7 +109,11 @@ CDarkel::DrawMessages()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::SetScale(SCREEN_SCALE_X(0.75f), SCREEN_SCALE_Y(1.5f));
|
CFont::SetScale(SCREEN_SCALE_X(0.75f), SCREEN_SCALE_Y(1.5f));
|
||||||
|
#else
|
||||||
|
CFont::SetScale(0.75f, 1.5f);
|
||||||
|
#endif
|
||||||
CFont::SetCentreOff();
|
CFont::SetCentreOff();
|
||||||
CFont::SetRightJustifyOn();
|
CFont::SetRightJustifyOn();
|
||||||
CFont::SetFontStyle(FONT_HEADING);
|
CFont::SetFontStyle(FONT_HEADING);
|
||||||
@ -100,7 +123,15 @@ CDarkel::DrawMessages()
|
|||||||
AsciiToUnicode(gString, gUString);
|
AsciiToUnicode(gString, gUString);
|
||||||
if (timeLeft > 4000 || CTimer::GetFrameCounter() & 1) {
|
if (timeLeft > 4000 || CTimer::GetFrameCounter() & 1) {
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(109.0f), gUString);
|
#if defined(PS2_HUD) || defined(FIX_BUGS)
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f - 1.0f), SCREEN_SCALE_Y(108.0f + 1.0f), gUString);
|
||||||
|
#else -
|
||||||
|
CFont::PrintString(SCREEN_WIDTH-(34.0f - 1.0f), 108.0f + 1.0f, gUString);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f + 1.0f), SCREEN_SCALE_Y(108.0f + 1.0f), gUString);
|
||||||
|
#endif
|
||||||
CFont::SetColor(CRGBA(150, 100, 255, 255));
|
CFont::SetColor(CRGBA(150, 100, 255, 255));
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(108.0f), gUString);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(108.0f), gUString);
|
||||||
}
|
}
|
||||||
@ -113,7 +144,16 @@ CDarkel::DrawMessages()
|
|||||||
#else
|
#else
|
||||||
#define DARKEL_COUNTER_HEIGHT 128.0f
|
#define DARKEL_COUNTER_HEIGHT 128.0f
|
||||||
#endif
|
#endif
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT + 1.0f), gUString);
|
|
||||||
|
#if defined(PS2_HUD) || defined(FIX_BUGS)
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f - 1.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT + 1.0f), gUString);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_WIDTH-(34.0f - 1.0f), DARKEL_COUNTER_HEIGHT + 1.0f, gUString);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f + 1.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT + 1.0f), gUString);
|
||||||
|
#endif
|
||||||
CFont::SetColor(CRGBA(255, 128, 128, 255));
|
CFont::SetColor(CRGBA(255, 128, 128, 255));
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT), gUString);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT), gUString);
|
||||||
#undef DARKEL_COUNTER_HEIGHT
|
#undef DARKEL_COUNTER_HEIGHT
|
||||||
@ -125,13 +165,25 @@ CDarkel::DrawMessages()
|
|||||||
uint32 timePassedSinceStart = CTimer::GetTimeInMilliseconds() - CDarkel::TimeOfFrenzyStart;
|
uint32 timePassedSinceStart = CTimer::GetTimeInMilliseconds() - CDarkel::TimeOfFrenzyStart;
|
||||||
if (CTimer::GetTimeInMilliseconds() - CDarkel::TimeOfFrenzyStart < 5000) {
|
if (CTimer::GetTimeInMilliseconds() - CDarkel::TimeOfFrenzyStart < 5000) {
|
||||||
CFont::SetBackgroundOff();
|
CFont::SetBackgroundOff();
|
||||||
CFont::SetCentreSize(SCREEN_SCALE_FROM_RIGHT(20.0f));
|
#ifdef FIX_BUGS
|
||||||
|
CFont::SetCentreSize(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH - 20));
|
||||||
|
#else
|
||||||
|
CFont::SetCentreSize(SCREEN_WIDTH - 20);
|
||||||
|
#endif
|
||||||
CFont::SetCentreOn();
|
CFont::SetCentreOn();
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::SetScale(SCREEN_SCALE_X(1.5f), SCREEN_SCALE_Y(1.5f));
|
CFont::SetScale(SCREEN_SCALE_X(1.5f), SCREEN_SCALE_Y(1.5f));
|
||||||
|
#else
|
||||||
|
CFont::SetScale(1.5f, 1.5f);
|
||||||
|
#endif
|
||||||
CFont::SetJustifyOff();
|
CFont::SetJustifyOff();
|
||||||
CFont::SetColor(CRGBA(128, 255, 128, CalcFade(timePassedSinceStart, 0, 5000)));
|
CFont::SetColor(CRGBA(128, 255, 128, CalcFade(timePassedSinceStart, 0, 5000)));
|
||||||
CFont::SetFontStyle(FONT_BANK);
|
CFont::SetFontStyle(FONT_BANK);
|
||||||
|
#ifdef FIX_BUGS
|
||||||
int y = SCREEN_HEIGHT / 2 + SCREEN_SCALE_Y(25.0f - timePassedSinceStart * 0.01f);
|
int y = SCREEN_HEIGHT / 2 + SCREEN_SCALE_Y(25.0f - timePassedSinceStart * 0.01f);
|
||||||
|
#else
|
||||||
|
int y = (SCREEN_HEIGHT / 2 + 25) - (timePassedSinceStart * 0.01f);
|
||||||
|
#endif
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2, y, TheText.Get("KF_3"));
|
CFont::PrintString(SCREEN_WIDTH / 2, y, TheText.Get("KF_3"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -171,6 +223,10 @@ CDarkel::ReadStatus()
|
|||||||
void
|
void
|
||||||
CDarkel::RegisterCarBlownUpByPlayer(CVehicle *vehicle)
|
CDarkel::RegisterCarBlownUpByPlayer(CVehicle *vehicle)
|
||||||
{
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (CReplay::IsPlayingBack())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
if (FrenzyOnGoing()) {
|
if (FrenzyOnGoing()) {
|
||||||
int32 model = vehicle->GetModelIndex();
|
int32 model = vehicle->GetModelIndex();
|
||||||
if (ModelToKill == FRENZY_ANY_CAR || ModelToKill == model || ModelToKill2 == model || ModelToKill3 == model || ModelToKill4 == model) {
|
if (ModelToKill == FRENZY_ANY_CAR || ModelToKill == model || ModelToKill2 == model || ModelToKill3 == model || ModelToKill4 == model) {
|
||||||
@ -185,6 +241,10 @@ CDarkel::RegisterCarBlownUpByPlayer(CVehicle *vehicle)
|
|||||||
void
|
void
|
||||||
CDarkel::RegisterKillByPlayer(CPed *victim, eWeaponType weapon, bool headshot)
|
CDarkel::RegisterKillByPlayer(CPed *victim, eWeaponType weapon, bool headshot)
|
||||||
{
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (CReplay::IsPlayingBack())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
if (FrenzyOnGoing() && (weapon == WeaponType
|
if (FrenzyOnGoing() && (weapon == WeaponType
|
||||||
|| weapon == WEAPONTYPE_EXPLOSION
|
|| weapon == WEAPONTYPE_EXPLOSION
|
||||||
|| weapon == WEAPONTYPE_UZI_DRIVEBY && WeaponType == WEAPONTYPE_UZI
|
|| weapon == WEAPONTYPE_UZI_DRIVEBY && WeaponType == WEAPONTYPE_UZI
|
||||||
@ -210,6 +270,10 @@ CDarkel::RegisterKillByPlayer(CPed *victim, eWeaponType weapon, bool headshot)
|
|||||||
void
|
void
|
||||||
CDarkel::RegisterKillNotByPlayer(CPed* victim, eWeaponType weapontype)
|
CDarkel::RegisterKillNotByPlayer(CPed* victim, eWeaponType weapontype)
|
||||||
{
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (CReplay::IsPlayingBack())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
CStats::PeopleKilledByOthers++;
|
CStats::PeopleKilledByOthers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,6 +365,11 @@ CDarkel::StartFrenzy(eWeaponType weaponType, int32 time, uint16 kill, int32 mode
|
|||||||
void
|
void
|
||||||
CDarkel::Update()
|
CDarkel::Update()
|
||||||
{
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (CReplay::IsPlayingBack())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (Status != KILLFRENZY_ONGOING)
|
if (Status != KILLFRENZY_ONGOING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "Fire.h"
|
#include "Fire.h"
|
||||||
#include "Script.h"
|
#include "Script.h"
|
||||||
#include "Garages.h"
|
#include "Garages.h"
|
||||||
|
#include "screendroplets.h"
|
||||||
|
|
||||||
uint8 CGameLogic::ActivePlayers;
|
uint8 CGameLogic::ActivePlayers;
|
||||||
|
|
||||||
@ -117,6 +118,9 @@ CGameLogic::Update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CEventList::Initialise();
|
CEventList::Initialise();
|
||||||
|
#ifdef SCREEN_DROPLETS
|
||||||
|
ScreenDroplets::Initialise();
|
||||||
|
#endif
|
||||||
CMessages::ClearMessages();
|
CMessages::ClearMessages();
|
||||||
CCarCtrl::ClearInterestingVehicleList();
|
CCarCtrl::ClearInterestingVehicleList();
|
||||||
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
||||||
@ -196,6 +200,9 @@ CGameLogic::Update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CEventList::Initialise();
|
CEventList::Initialise();
|
||||||
|
#ifdef SCREEN_DROPLETS
|
||||||
|
ScreenDroplets::Initialise();
|
||||||
|
#endif
|
||||||
CMessages::ClearMessages();
|
CMessages::ClearMessages();
|
||||||
CCarCtrl::ClearInterestingVehicleList();
|
CCarCtrl::ClearInterestingVehicleList();
|
||||||
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
||||||
@ -245,6 +252,9 @@ CGameLogic::Update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CEventList::Initialise();
|
CEventList::Initialise();
|
||||||
|
#ifdef SCREEN_DROPLETS
|
||||||
|
ScreenDroplets::Initialise();
|
||||||
|
#endif
|
||||||
CMessages::ClearMessages();
|
CMessages::ClearMessages();
|
||||||
CCarCtrl::ClearInterestingVehicleList();
|
CCarCtrl::ClearInterestingVehicleList();
|
||||||
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
CWorld::ClearExcitingStuffFromArea(pPlayerInfo.GetPos(), 4000.0f, 1);
|
||||||
|
@ -129,7 +129,7 @@ int32 CGarages::PoliceCarsCollected;
|
|||||||
CStoredCar CGarages::aCarsInSafeHouse1[NUM_GARAGE_STORED_CARS];
|
CStoredCar CGarages::aCarsInSafeHouse1[NUM_GARAGE_STORED_CARS];
|
||||||
CStoredCar CGarages::aCarsInSafeHouse2[NUM_GARAGE_STORED_CARS];
|
CStoredCar CGarages::aCarsInSafeHouse2[NUM_GARAGE_STORED_CARS];
|
||||||
CStoredCar CGarages::aCarsInSafeHouse3[NUM_GARAGE_STORED_CARS];
|
CStoredCar CGarages::aCarsInSafeHouse3[NUM_GARAGE_STORED_CARS];
|
||||||
int32 CGarages::AudioEntity = AEHANDLE_NONE;
|
int32 hGarages = AEHANDLE_NONE;
|
||||||
CGarage CGarages::aGarages[NUM_GARAGES];
|
CGarage CGarages::aGarages[NUM_GARAGES];
|
||||||
bool CGarages::bCamShouldBeOutisde;
|
bool CGarages::bCamShouldBeOutisde;
|
||||||
|
|
||||||
@ -156,12 +156,12 @@ void CGarages::Init(void)
|
|||||||
aCarsInSafeHouse2[i].Init();
|
aCarsInSafeHouse2[i].Init();
|
||||||
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++)
|
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++)
|
||||||
aCarsInSafeHouse3[i].Init();
|
aCarsInSafeHouse3[i].Init();
|
||||||
AudioEntity = DMAudio.CreateEntity(AUDIOTYPE_GARAGE, (void*)1);
|
hGarages = DMAudio.CreateEntity(AUDIOTYPE_GARAGE, (void*)1);
|
||||||
if (AudioEntity >= 0)
|
if (hGarages >= 0)
|
||||||
DMAudio.SetEntityStatus(AudioEntity, 1);
|
DMAudio.SetEntityStatus(hGarages, true);
|
||||||
AddOne(
|
AddOne(
|
||||||
CRUSHER_GARAGE_X1, CRUSHER_GARAGE_Y1, CRUSHER_GARAGE_Z1,
|
CVector(CRUSHER_GARAGE_X1, CRUSHER_GARAGE_Y1, CRUSHER_GARAGE_Z1),
|
||||||
CRUSHER_GARAGE_X2, CRUSHER_GARAGE_Y2, CRUSHER_GARAGE_Z2,
|
CVector(CRUSHER_GARAGE_X2, CRUSHER_GARAGE_Y2, CRUSHER_GARAGE_Z2),
|
||||||
GARAGE_CRUSHER, 0);
|
GARAGE_CRUSHER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,20 +169,18 @@ void CGarages::Init(void)
|
|||||||
void CGarages::Shutdown(void)
|
void CGarages::Shutdown(void)
|
||||||
{
|
{
|
||||||
NumGarages = 0;
|
NumGarages = 0;
|
||||||
if (AudioEntity < 0)
|
if (hGarages < 0)
|
||||||
return;
|
return;
|
||||||
DMAudio.DestroyEntity(AudioEntity);
|
DMAudio.DestroyEntity(hGarages);
|
||||||
AudioEntity = AEHANDLE_NONE;
|
hGarages = AEHANDLE_NONE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void CGarages::Update(void)
|
void CGarages::Update(void)
|
||||||
{
|
{
|
||||||
static int GarageToBeTidied = 0;
|
static int GarageToBeTidied = 0;
|
||||||
#ifndef PS2
|
|
||||||
if (CReplay::IsPlayingBack())
|
if (CReplay::IsPlayingBack())
|
||||||
return;
|
return;
|
||||||
#endif
|
|
||||||
bCamShouldBeOutisde = false;
|
bCamShouldBeOutisde = false;
|
||||||
TheCamera.pToGarageWeAreIn = nil;
|
TheCamera.pToGarageWeAreIn = nil;
|
||||||
TheCamera.pToGarageWeAreInForHackAvoidFirstPerson = nil;
|
TheCamera.pToGarageWeAreInForHackAvoidFirstPerson = nil;
|
||||||
@ -202,23 +200,23 @@ void CGarages::Update(void)
|
|||||||
aGarages[GarageToBeTidied].TidyUpGarage();
|
aGarages[GarageToBeTidied].TidyUpGarage();
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 CGarages::AddOne(float X1, float Y1, float Z1, float X2, float Y2, float Z2, eGarageType type, int32 targetId)
|
int16 CGarages::AddOne(CVector p1, CVector p2, uint8 type, int32 targetId)
|
||||||
{
|
{
|
||||||
if (NumGarages >= NUM_GARAGES) {
|
if (NumGarages >= NUM_GARAGES) {
|
||||||
assert(0);
|
assert(0);
|
||||||
return NumGarages++;
|
return NumGarages++;
|
||||||
}
|
}
|
||||||
CGarage* pGarage = &aGarages[NumGarages];
|
CGarage* pGarage = &aGarages[NumGarages];
|
||||||
pGarage->m_fX1 = Min(X1, X2);
|
pGarage->m_fX1 = Min(p1.x, p2.x);
|
||||||
pGarage->m_fX2 = Max(X1, X2);
|
pGarage->m_fX2 = Max(p1.x, p2.x);
|
||||||
pGarage->m_fY1 = Min(Y1, Y2);
|
pGarage->m_fY1 = Min(p1.y, p2.y);
|
||||||
pGarage->m_fY2 = Max(Y1, Y2);
|
pGarage->m_fY2 = Max(p1.y, p2.y);
|
||||||
pGarage->m_fZ1 = Min(Z1, Z2);
|
pGarage->m_fZ1 = Min(p1.z, p2.z);
|
||||||
pGarage->m_fZ2 = Max(Z1, Z2);
|
pGarage->m_fZ2 = Max(p1.z, p2.z);
|
||||||
pGarage->m_pDoor1 = nil;
|
pGarage->m_pDoor1 = nil;
|
||||||
pGarage->m_pDoor2 = nil;
|
pGarage->m_pDoor2 = nil;
|
||||||
pGarage->m_fDoor1Z = Z1;
|
pGarage->m_fDoor1Z = p1.z;
|
||||||
pGarage->m_fDoor2Z = Z1;
|
pGarage->m_fDoor2Z = p1.z;
|
||||||
pGarage->m_eGarageType = type;
|
pGarage->m_eGarageType = type;
|
||||||
pGarage->m_bRecreateDoorOnNextRefresh = false;
|
pGarage->m_bRecreateDoorOnNextRefresh = false;
|
||||||
pGarage->m_bRotatedDoor = false;
|
pGarage->m_bRotatedDoor = false;
|
||||||
@ -285,7 +283,7 @@ int16 CGarages::AddOne(float X1, float Y1, float Z1, float X2, float Y2, float Z
|
|||||||
return NumGarages++;
|
return NumGarages++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGarages::ChangeGarageType(int16 garage, eGarageType type, int32 mi)
|
void CGarages::ChangeGarageType(int16 garage, uint8 type, int32 mi)
|
||||||
{
|
{
|
||||||
CGarage* pGarage = &aGarages[garage];
|
CGarage* pGarage = &aGarages[garage];
|
||||||
pGarage->m_eGarageType = type;
|
pGarage->m_eGarageType = type;
|
||||||
@ -368,7 +366,7 @@ void CGarage::Update()
|
|||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_RESPRAY;
|
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_RESPRAY;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
CStats::CheckPointReachedSuccessfully();
|
CStats::CheckPointReachedSuccessfully();
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
@ -464,7 +462,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENEDCONTAINSCAR;
|
m_eGarageState = GS_OPENEDCONTAINSCAR;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -510,7 +508,7 @@ void CGarage::Update()
|
|||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_SETUP_BOMB;
|
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_SETUP_BOMB;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -575,7 +573,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENEDCONTAINSCAR;
|
m_eGarageState = GS_OPENEDCONTAINSCAR;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -599,7 +597,8 @@ void CGarage::Update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!FindPlayerVehicle() && m_pTarget && IsEntityEntirelyInside3D(m_pTarget, 0.0f) &&
|
else if (!FindPlayerVehicle() && m_pTarget && IsEntityEntirelyInside3D(m_pTarget, 0.0f) &&
|
||||||
!IsAnyOtherCarTouchingGarage(m_pTarget) && IsEntityEntirelyOutside(FindPlayerPed(), 2.0f)) {
|
!IsAnyOtherCarTouchingGarage(m_pTarget) && IsEntityEntirelyOutside(FindPlayerPed(), 2.0f) &&
|
||||||
|
!IsAnyOtherCarTouchingGarage(m_pTarget)) {
|
||||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_GARAGE);
|
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_GARAGE);
|
||||||
FindPlayerPed()->m_pWanted->m_bIgnoredByCops = true;
|
FindPlayerPed()->m_pWanted->m_bIgnoredByCops = true;
|
||||||
m_eGarageState = GS_CLOSING;
|
m_eGarageState = GS_CLOSING;
|
||||||
@ -609,7 +608,7 @@ void CGarage::Update()
|
|||||||
case GS_CLOSING:
|
case GS_CLOSING:
|
||||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
if (m_bClosingWithoutTargetCar)
|
if (m_bClosingWithoutTargetCar)
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
else {
|
else {
|
||||||
@ -639,7 +638,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -676,7 +675,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
if (m_pTarget) {
|
if (m_pTarget) {
|
||||||
DestroyVehicleAndDriverAndPassengers(m_pTarget);
|
DestroyVehicleAndDriverAndPassengers(m_pTarget);
|
||||||
m_pTarget = nil;
|
m_pTarget = nil;
|
||||||
@ -723,7 +722,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -772,7 +771,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
if (m_pTarget) {
|
if (m_pTarget) {
|
||||||
MarkThisCarAsCollectedForCraig(m_pTarget->GetModelIndex());
|
MarkThisCarAsCollectedForCraig(m_pTarget->GetModelIndex());
|
||||||
DestroyVehicleAndDriverAndPassengers(m_pTarget);
|
DestroyVehicleAndDriverAndPassengers(m_pTarget);
|
||||||
@ -812,7 +811,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -833,7 +832,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
}
|
}
|
||||||
if (!IsGarageEmpty())
|
if (!IsGarageEmpty())
|
||||||
m_eGarageState = GS_OPENING;
|
m_eGarageState = GS_OPENING;
|
||||||
@ -844,7 +843,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -893,7 +892,7 @@ void CGarage::Update()
|
|||||||
m_pTarget = nil;
|
m_pTarget = nil;
|
||||||
m_eGarageState = GS_AFTERDROPOFF;
|
m_eGarageState = GS_AFTERDROPOFF;
|
||||||
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_CRUSH_CAR;
|
m_nTimeToStartAction = CTimer::GetTimeInMilliseconds() + TIME_TO_CRUSH_CAR;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -913,7 +912,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(HALFPI, m_fDoorPos + CTimer::GetTimeStep() * CRUSHER_CRANE_SPEED);
|
m_fDoorPos = Min(HALFPI, m_fDoorPos + CTimer::GetTimeStep() * CRUSHER_CRANE_SPEED);
|
||||||
if (m_fDoorPos == HALFPI) {
|
if (m_fDoorPos == HALFPI) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateCrusherAngle();
|
UpdateCrusherAngle();
|
||||||
break;
|
break;
|
||||||
@ -945,7 +944,7 @@ void CGarage::Update()
|
|||||||
case GS_CLOSING:
|
case GS_CLOSING:
|
||||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
if (m_bClosingWithoutTargetCar)
|
if (m_bClosingWithoutTargetCar)
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
else {
|
else {
|
||||||
@ -974,7 +973,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -994,7 +993,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -1014,7 +1013,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -1022,7 +1021,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -1045,8 +1044,8 @@ void CGarage::Update()
|
|||||||
// Close car doors either if player is far, or if he is in vehicle and garage is full,
|
// Close car doors either if player is far, or if he is in vehicle and garage is full,
|
||||||
// or if player is very very far so that we can remove whatever is blocking garage door without him noticing
|
// or if player is very very far so that we can remove whatever is blocking garage door without him noticing
|
||||||
if ((distance > SQR(DISTANCE_TO_CLOSE_HIDEOUT_GARAGE_IN_CAR) ||
|
if ((distance > SQR(DISTANCE_TO_CLOSE_HIDEOUT_GARAGE_IN_CAR) ||
|
||||||
!FindPlayerVehicle() && distance > SQR(DISTANCE_TO_CLOSE_HIDEOUT_GARAGE_ON_FOOT) &&
|
!FindPlayerVehicle() && distance > SQR(DISTANCE_TO_CLOSE_HIDEOUT_GARAGE_ON_FOOT)) &&
|
||||||
!IsAnyCarBlockingDoor()))
|
!IsAnyCarBlockingDoor())
|
||||||
m_eGarageState = GS_CLOSING;
|
m_eGarageState = GS_CLOSING;
|
||||||
else if (FindPlayerVehicle() &&
|
else if (FindPlayerVehicle() &&
|
||||||
CountCarsWithCenterPointWithinGarage(FindPlayerVehicle()) >=
|
CountCarsWithCenterPointWithinGarage(FindPlayerVehicle()) >=
|
||||||
@ -1064,7 +1063,7 @@ void CGarage::Update()
|
|||||||
if (!IsPlayerOutsideGarage())
|
if (!IsPlayerOutsideGarage())
|
||||||
m_eGarageState = GS_OPENING;
|
m_eGarageState = GS_OPENING;
|
||||||
else if (m_fDoorPos == 0.0f) {
|
else if (m_fDoorPos == 0.0f) {
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
switch (m_eGarageType) {
|
switch (m_eGarageType) {
|
||||||
case GARAGE_HIDEOUT_ONE: StoreAndRemoveCarsForThisHideout(CGarages::aCarsInSafeHouse1, MAX_STORED_CARS_IN_INDUSTRIAL); break;
|
case GARAGE_HIDEOUT_ONE: StoreAndRemoveCarsForThisHideout(CGarages::aCarsInSafeHouse1, MAX_STORED_CARS_IN_INDUSTRIAL); break;
|
||||||
@ -1111,7 +1110,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + HIDEOUT_DOOR_SPEED_COEFFICIENT * (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + HIDEOUT_DOOR_SPEED_COEFFICIENT * (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -1136,7 +1135,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Max(0.0f, m_fDoorPos - (m_bRotatedDoor ? ROTATED_DOOR_CLOSE_SPEED : DEFAULT_DOOR_CLOSE_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == 0.0f) {
|
if (m_fDoorPos == 0.0f) {
|
||||||
m_eGarageState = GS_FULLYCLOSED;
|
m_eGarageState = GS_FULLYCLOSED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_CLOSED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -1152,7 +1151,7 @@ void CGarage::Update()
|
|||||||
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
m_fDoorPos = Min(m_fDoorHeight, m_fDoorPos + (m_bRotatedDoor ? ROTATED_DOOR_OPEN_SPEED : DEFAULT_DOOR_OPEN_SPEED) * CTimer::GetTimeStep());
|
||||||
if (m_fDoorPos == m_fDoorHeight) {
|
if (m_fDoorPos == m_fDoorHeight) {
|
||||||
m_eGarageState = GS_OPENED;
|
m_eGarageState = GS_OPENED;
|
||||||
DMAudio.PlayOneShot(CGarages::AudioEntity, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
DMAudio.PlayOneShot(hGarages, SOUND_GARAGE_DOOR_OPENED, 1.0f);
|
||||||
}
|
}
|
||||||
UpdateDoorsHeight();
|
UpdateDoorsHeight();
|
||||||
break;
|
break;
|
||||||
@ -1260,9 +1259,9 @@ bool CGarage::IsPlayerOutsideGarage()
|
|||||||
bool CGarage::IsEntityTouching3D(CEntity * pEntity)
|
bool CGarage::IsEntityTouching3D(CEntity * pEntity)
|
||||||
{
|
{
|
||||||
float radius = pEntity->GetBoundRadius();
|
float radius = pEntity->GetBoundRadius();
|
||||||
if (pEntity->GetPosition().x - radius < m_fX1 || pEntity->GetPosition().x + radius > m_fX2 ||
|
if (m_fX1 - radius > pEntity->GetPosition().x || m_fX2 + radius < pEntity->GetPosition().x ||
|
||||||
pEntity->GetPosition().y - radius < m_fY1 || pEntity->GetPosition().y + radius > m_fY2 ||
|
m_fY1 - radius > pEntity->GetPosition().y || m_fY2 + radius < pEntity->GetPosition().y ||
|
||||||
pEntity->GetPosition().z - radius < m_fZ1 || pEntity->GetPosition().z + radius > m_fZ2)
|
m_fZ1 - radius > pEntity->GetPosition().z || m_fZ2 + radius < pEntity->GetPosition().z)
|
||||||
return false;
|
return false;
|
||||||
CColModel* pColModel = pEntity->GetColModel();
|
CColModel* pColModel = pEntity->GetColModel();
|
||||||
for (int i = 0; i < pColModel->numSpheres; i++) {
|
for (int i = 0; i < pColModel->numSpheres; i++) {
|
||||||
@ -1271,9 +1270,9 @@ bool CGarage::IsEntityTouching3D(CEntity * pEntity)
|
|||||||
if (pos.x + radius > m_fX1 && pos.x - radius < m_fX2 &&
|
if (pos.x + radius > m_fX1 && pos.x - radius < m_fX2 &&
|
||||||
pos.y + radius > m_fY1 && pos.y - radius < m_fY2 &&
|
pos.y + radius > m_fY1 && pos.y - radius < m_fY2 &&
|
||||||
pos.z + radius > m_fZ1 && pos.z - radius < m_fZ2)
|
pos.z + radius > m_fZ1 && pos.z - radius < m_fZ2)
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGarage::EntityHasASphereWayOutsideGarage(CEntity * pEntity, float fMargin)
|
bool CGarage::EntityHasASphereWayOutsideGarage(CEntity * pEntity, float fMargin)
|
||||||
@ -1387,7 +1386,9 @@ void CGarage::RemoveCarsBlockingDoorNotInside()
|
|||||||
if (!pVehicle->bIsLocked && pVehicle->CanBeDeleted()) {
|
if (!pVehicle->bIsLocked && pVehicle->CanBeDeleted()) {
|
||||||
CWorld::Remove(pVehicle);
|
CWorld::Remove(pVehicle);
|
||||||
delete pVehicle;
|
delete pVehicle;
|
||||||
return; // WHY?
|
#ifndef FIX_BUGS
|
||||||
|
return; // makes no sense
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1396,44 +1397,68 @@ void CGarage::RemoveCarsBlockingDoorNotInside()
|
|||||||
void CGarages::PrintMessages()
|
void CGarages::PrintMessages()
|
||||||
{
|
{
|
||||||
if (CTimer::GetTimeInMilliseconds() > MessageStartTime && CTimer::GetTimeInMilliseconds() < MessageEndTime) {
|
if (CTimer::GetTimeInMilliseconds() > MessageStartTime && CTimer::GetTimeInMilliseconds() < MessageEndTime) {
|
||||||
CFont::SetScale(SCREEN_SCALE_X(1.2f), SCREEN_SCALE_Y(1.5f)); // BUG: game doesn't use macro here.
|
#ifdef FIX_BUGS
|
||||||
|
CFont::SetScale(SCREEN_SCALE_X(1.2f), SCREEN_SCALE_Y(1.5f));
|
||||||
|
#else
|
||||||
|
CFont::SetScale(1.2f, 1.5f);
|
||||||
|
#endif
|
||||||
CFont::SetPropOn();
|
CFont::SetPropOn();
|
||||||
CFont::SetJustifyOff();
|
CFont::SetJustifyOff();
|
||||||
CFont::SetBackgroundOff();
|
CFont::SetBackgroundOff();
|
||||||
CFont::SetCentreSize(SCREEN_SCALE_FROM_RIGHT(50.0f));
|
#ifdef FIX_BUGS
|
||||||
|
CFont::SetCentreSize(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH - 50));
|
||||||
|
#else
|
||||||
|
CFont::SetCentreSize(SCREEN_WIDTH - 50);
|
||||||
|
#endif
|
||||||
CFont::SetCentreOn();
|
CFont::SetCentreOn();
|
||||||
CFont::SetFontStyle(FONT_LOCALE(FONT_BANK));
|
CFont::SetFontStyle(FONT_LOCALE(FONT_BANK));
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
|
|
||||||
#if defined(PS2) || defined (FIX_BUGS)
|
#if defined(PS2_HUD) || defined (FIX_BUGS)
|
||||||
float y_offset = SCREEN_HEIGHT / 3; // THIS is PS2 calculation
|
float y_offset = SCREEN_HEIGHT / 3; // THIS is PS2 calculation
|
||||||
#else
|
#else
|
||||||
float y_offset = SCREEN_HEIGHT / 2 - SCREEN_SCALE_Y(84.0f); // This is PC and results in text being written over some HUD elements
|
float y_offset = SCREEN_HEIGHT / 2 - SCREEN_SCALE_Y(84.0f); // This is PC and results in text being written over some HUD elements
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (MessageNumberInString2 < 0) {
|
if (MessageNumberInString2 >= 0) {
|
||||||
if (MessageNumberInString < 0) {
|
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, MessageNumberInString2, -1, -1, -1, -1, gUString);
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2 - SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(2.0f), TheText.Get(MessageIDString));
|
#ifdef FIX_BUGS
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2 + 2.0f, y_offset - 40.0f + 2.0f, gUString);
|
||||||
|
#endif
|
||||||
|
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - 40.0f, gUString);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if (MessageNumberInString >= 0) {
|
||||||
|
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, -1, -1, -1, -1, -1, gUString);
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2 + 2.0f, y_offset - 40.0f + 2.0f, gUString);
|
||||||
|
#endif
|
||||||
|
|
||||||
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
||||||
|
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - 40.0f, gUString);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2 - SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(2.0f), TheText.Get(MessageIDString));
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_WIDTH / 2 - 2.0f, y_offset - 2.0f, TheText.Get(MessageIDString));
|
||||||
|
#endif
|
||||||
|
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset, TheText.Get(MessageIDString));
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset, TheText.Get(MessageIDString));
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, -1, -1, -1, -1, -1, gUString);
|
|
||||||
|
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
|
||||||
|
|
||||||
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, MessageNumberInString2, -1, -1, -1, -1, gUString);
|
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
|
||||||
|
|
||||||
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
|
||||||
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1508,41 +1533,54 @@ void CGarage::UpdateCrusherShake(float X, float Y)
|
|||||||
m_pDoor2->GetMatrix().GetPosition().y -= Y;
|
m_pDoor2->GetMatrix().GetPosition().y -= Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is dumb but there is no way to avoid goto. What was there originally even?
|
|
||||||
static bool DoINeedToRefreshPointer(CEntity * pDoor, bool bIsDummy, int8 nIndex)
|
|
||||||
{
|
|
||||||
bool bNeedToFindDoorEntities = false;
|
|
||||||
if (pDoor) {
|
|
||||||
if (bIsDummy) {
|
|
||||||
if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex((CDummy*)pDoor)))
|
|
||||||
return true;
|
|
||||||
if (nIndex != (CPools::GetDummyPool()->GetIndex((CDummy*)pDoor) & 0x7F))
|
|
||||||
bNeedToFindDoorEntities = true;
|
|
||||||
if (!CGarages::IsModelIndexADoor(pDoor->GetModelIndex()))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex((CObject*)pDoor)))
|
|
||||||
return true;
|
|
||||||
if (nIndex != (CPools::GetObjectPool()->GetIndex((CObject*)pDoor) & 0x7F))
|
|
||||||
bNeedToFindDoorEntities = true;
|
|
||||||
if (!CGarages::IsModelIndexADoor(pDoor->GetModelIndex()))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return bNeedToFindDoorEntities;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CGarage::RefreshDoorPointers(bool bCreate)
|
void CGarage::RefreshDoorPointers(bool bCreate)
|
||||||
{
|
{
|
||||||
bool bNeedToFindDoorEntities = true;
|
bool bNeedToFindDoorEntities = bCreate || m_bRecreateDoorOnNextRefresh;
|
||||||
if (!bCreate && !m_bRecreateDoorOnNextRefresh)
|
|
||||||
bNeedToFindDoorEntities = false;
|
|
||||||
m_bRecreateDoorOnNextRefresh = false;
|
m_bRecreateDoorOnNextRefresh = false;
|
||||||
if (DoINeedToRefreshPointer(m_pDoor1, m_bDoor1IsDummy, m_bDoor1PoolIndex))
|
if (m_pDoor1) {
|
||||||
|
if (m_bDoor1IsDummy) {
|
||||||
|
if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex_NoFreeAssert((CDummy*)m_pDoor1)))
|
||||||
bNeedToFindDoorEntities = true;
|
bNeedToFindDoorEntities = true;
|
||||||
if (DoINeedToRefreshPointer(m_pDoor2, m_bDoor2IsDummy, m_bDoor2PoolIndex))
|
else {
|
||||||
|
if (m_bDoor1PoolIndex != (CPools::GetDummyPool()->GetIndex((CDummy*)m_pDoor1) & 0x7F))
|
||||||
bNeedToFindDoorEntities = true;
|
bNeedToFindDoorEntities = true;
|
||||||
|
if (!CGarages::IsModelIndexADoor(m_pDoor1->GetModelIndex()))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert((CObject*)m_pDoor1)))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
else {
|
||||||
|
if (m_bDoor1PoolIndex != (CPools::GetObjectPool()->GetIndex((CObject*)m_pDoor1) & 0x7F))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
if (!CGarages::IsModelIndexADoor(m_pDoor1->GetModelIndex()))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_pDoor2) {
|
||||||
|
if (m_bDoor2IsDummy) {
|
||||||
|
if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex_NoFreeAssert((CDummy*)m_pDoor2)))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
else {
|
||||||
|
if (m_bDoor2PoolIndex != (CPools::GetDummyPool()->GetIndex((CDummy*)m_pDoor2) & 0x7F))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
if (!CGarages::IsModelIndexADoor(m_pDoor2->GetModelIndex()))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert((CObject*)m_pDoor2)))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
else {
|
||||||
|
if (m_bDoor2PoolIndex != (CPools::GetObjectPool()->GetIndex((CObject*)m_pDoor2) & 0x7F))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
if (!CGarages::IsModelIndexADoor(m_pDoor2->GetModelIndex()))
|
||||||
|
bNeedToFindDoorEntities = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (bNeedToFindDoorEntities)
|
if (bNeedToFindDoorEntities)
|
||||||
FindDoorsEntities();
|
FindDoorsEntities();
|
||||||
}
|
}
|
||||||
@ -2158,7 +2196,7 @@ void CGarages::CloseHideOutGaragesBeforeSave()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 CGarages::CountCarsInHideoutGarage(eGarageType type)
|
int32 CGarages::CountCarsInHideoutGarage(uint8 type)
|
||||||
{
|
{
|
||||||
int32 total = 0;
|
int32 total = 0;
|
||||||
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++) {
|
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++) {
|
||||||
@ -2178,7 +2216,7 @@ int32 CGarages::CountCarsInHideoutGarage(eGarageType type)
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 CGarages::FindMaxNumStoredCarsForGarage(eGarageType type)
|
int32 CGarages::FindMaxNumStoredCarsForGarage(uint8 type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GARAGE_HIDEOUT_ONE:
|
case GARAGE_HIDEOUT_ONE:
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
class CVehicle;
|
class CVehicle;
|
||||||
class CCamera;
|
class CCamera;
|
||||||
|
|
||||||
enum eGarageState : int8
|
enum eGarageState
|
||||||
{
|
{
|
||||||
GS_FULLYCLOSED,
|
GS_FULLYCLOSED,
|
||||||
GS_OPENED,
|
GS_OPENED,
|
||||||
@ -18,7 +18,7 @@ enum eGarageState : int8
|
|||||||
GS_AFTERDROPOFF,
|
GS_AFTERDROPOFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eGarageType : int8
|
enum eGarageType
|
||||||
{
|
{
|
||||||
GARAGE_NONE,
|
GARAGE_NONE,
|
||||||
GARAGE_MISSION,
|
GARAGE_MISSION,
|
||||||
@ -81,8 +81,8 @@ VALIDATE_SIZE(CStoredCar, 0x28);
|
|||||||
|
|
||||||
class CGarage
|
class CGarage
|
||||||
{
|
{
|
||||||
eGarageType m_eGarageType;
|
uint8 m_eGarageType;
|
||||||
eGarageState m_eGarageState;
|
uint8 m_eGarageState;
|
||||||
bool field_2; // unused
|
bool field_2; // unused
|
||||||
bool m_bClosingWithoutTargetCar;
|
bool m_bClosingWithoutTargetCar;
|
||||||
bool m_bDeactivated;
|
bool m_bDeactivated;
|
||||||
@ -198,7 +198,6 @@ class CGarages
|
|||||||
static CStoredCar aCarsInSafeHouse1[NUM_GARAGE_STORED_CARS];
|
static CStoredCar aCarsInSafeHouse1[NUM_GARAGE_STORED_CARS];
|
||||||
static CStoredCar aCarsInSafeHouse2[NUM_GARAGE_STORED_CARS];
|
static CStoredCar aCarsInSafeHouse2[NUM_GARAGE_STORED_CARS];
|
||||||
static CStoredCar aCarsInSafeHouse3[NUM_GARAGE_STORED_CARS];
|
static CStoredCar aCarsInSafeHouse3[NUM_GARAGE_STORED_CARS];
|
||||||
static int32 AudioEntity;
|
|
||||||
static bool bCamShouldBeOutisde;
|
static bool bCamShouldBeOutisde;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -208,8 +207,8 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
static void Update(void);
|
static void Update(void);
|
||||||
|
|
||||||
static int16 AddOne(float X1, float Y1, float Z1, float X2, float Y2, float Z2, eGarageType type, int32 targetId);
|
static int16 AddOne(CVector pos1, CVector pos2, uint8 type, int32 targetId);
|
||||||
static void ChangeGarageType(int16, eGarageType, int32);
|
static void ChangeGarageType(int16, uint8, int32);
|
||||||
static void PrintMessages(void);
|
static void PrintMessages(void);
|
||||||
static void TriggerMessage(const char* text, int16, uint16 time, int16);
|
static void TriggerMessage(const char* text, int16, uint16 time, int16);
|
||||||
static void SetTargetCarForMissonGarage(int16, CVehicle*);
|
static void SetTargetCarForMissonGarage(int16, CVehicle*);
|
||||||
@ -245,11 +244,14 @@ private:
|
|||||||
static bool IsCarSprayable(CVehicle*);
|
static bool IsCarSprayable(CVehicle*);
|
||||||
static float FindDoorHeightForMI(int32);
|
static float FindDoorHeightForMI(int32);
|
||||||
static void CloseHideOutGaragesBeforeSave(void);
|
static void CloseHideOutGaragesBeforeSave(void);
|
||||||
static int32 CountCarsInHideoutGarage(eGarageType);
|
static int32 CountCarsInHideoutGarage(uint8);
|
||||||
static int32 FindMaxNumStoredCarsForGarage(eGarageType);
|
static int32 FindMaxNumStoredCarsForGarage(uint8);
|
||||||
static int32 GetBombTypeForGarageType(eGarageType type) { return type - GARAGE_BOMBSHOP1 + 1; }
|
static int32 GetBombTypeForGarageType(uint8 type) { return type - GARAGE_BOMBSHOP1 + 1; }
|
||||||
static int32 GetCarsCollectedIndexForGarageType(eGarageType type) { return type - GARAGE_COLLECTCARS_1; }
|
static int32 GetCarsCollectedIndexForGarageType(uint8 type) { return type - GARAGE_COLLECTCARS_1; }
|
||||||
|
|
||||||
friend class cAudioManager;
|
friend class cAudioManager;
|
||||||
friend class CGarage;
|
friend class CGarage;
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
friend class CReplay;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
87
src/control/NameGrid.cpp
Normal file
87
src/control/NameGrid.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "NameGrid.h"
|
||||||
|
|
||||||
|
// TODO: reverse mobile code
|
||||||
|
|
||||||
|
CPlayerName::CPlayerName()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerName::DisplayName(int)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
CRow::CRow()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CRow::SetLetter(int, wchar *)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
CGrid::CGrid()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::ProcessAnyLeftJustDown()
|
||||||
|
{
|
||||||
|
unk_int2--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::ProcessAnyRightJustDown()
|
||||||
|
{
|
||||||
|
unk_int2++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::ProcessAnyUpJustDown()
|
||||||
|
{
|
||||||
|
unk_int1--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::ProcessAnyDownJustDown()
|
||||||
|
{
|
||||||
|
unk_int1++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::AllDoneMakePlayerName()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::ProcessDPadCrossJustDown()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::DisplayGrid()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::ProcessControllerInput()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGrid::Process()
|
||||||
|
{
|
||||||
|
ProcessControllerInput();
|
||||||
|
DisplayGrid();
|
||||||
|
playerName.DisplayName(2 * playerName.unk_4c);
|
||||||
|
}
|
53
src/control/NameGrid.h
Normal file
53
src/control/NameGrid.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// TODO: reverse mobile code
|
||||||
|
|
||||||
|
class CPlayerName
|
||||||
|
{
|
||||||
|
friend class CGrid;
|
||||||
|
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
wchar unk_8[34];
|
||||||
|
int unk_4c;
|
||||||
|
public:
|
||||||
|
CPlayerName();
|
||||||
|
void DisplayName(int);
|
||||||
|
};
|
||||||
|
|
||||||
|
class CRow
|
||||||
|
{
|
||||||
|
friend class CGrid;
|
||||||
|
|
||||||
|
int unk_0;
|
||||||
|
int unk_4;
|
||||||
|
wchar unk_8[20];
|
||||||
|
int unk_30;
|
||||||
|
public:
|
||||||
|
CRow();
|
||||||
|
void SetLetter(int, wchar *);
|
||||||
|
};
|
||||||
|
|
||||||
|
class CGrid
|
||||||
|
{
|
||||||
|
CRow rows[5];
|
||||||
|
int unk_int1;
|
||||||
|
int unk_int2;
|
||||||
|
int unk_int3;
|
||||||
|
float unk_float1;
|
||||||
|
float unk_float2;
|
||||||
|
CPlayerName playerName;
|
||||||
|
char unk2[4];
|
||||||
|
char unk3[4];
|
||||||
|
public:
|
||||||
|
CGrid();
|
||||||
|
void ProcessAnyLeftJustDown();
|
||||||
|
void ProcessAnyRightJustDown();
|
||||||
|
void ProcessAnyUpJustDown();
|
||||||
|
void ProcessAnyDownJustDown();
|
||||||
|
void AllDoneMakePlayerName();
|
||||||
|
void ProcessDPadCrossJustDown();
|
||||||
|
void DisplayGrid();
|
||||||
|
void ProcessControllerInput();
|
||||||
|
void Process();
|
||||||
|
};
|
@ -542,6 +542,22 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor
|
|||||||
int done, cont;
|
int done, cont;
|
||||||
int tileStart;
|
int tileStart;
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
for (i = 0; i < m_numMapObjects-1; i++)
|
||||||
|
for (j = i+1; j < m_numMapObjects; j++) {
|
||||||
|
CTreadable *obj1 = m_mapObjects[i];
|
||||||
|
CTreadable *obj2 = m_mapObjects[j];
|
||||||
|
if (obj1->GetModelIndex() == obj2->GetModelIndex() &&
|
||||||
|
obj1->GetPosition().x == obj2->GetPosition().x && obj1->GetPosition().y == obj2->GetPosition().y && obj1->GetPosition().z == obj2->GetPosition().z &&
|
||||||
|
obj1->GetRight().x == obj2->GetRight().x && obj1->GetForward().x == obj2->GetForward().x && obj1->GetUp().x == obj2->GetUp().x &&
|
||||||
|
obj1->GetRight().y == obj2->GetRight().y && obj1->GetForward().y == obj2->GetForward().y && obj1->GetUp().y == obj2->GetUp().y &&
|
||||||
|
obj1->GetRight().z == obj2->GetRight().z && obj1->GetForward().z == obj2->GetForward().z && obj1->GetUp().z == obj2->GetUp().z) {
|
||||||
|
printf("THIS IS VERY BAD INDEED. FIX IMMEDIATELY!!!\n");
|
||||||
|
printf("Double road objects at the following coors: %f %f %f\n", obj1->GetPosition().x, obj1->GetPosition().y, obj1->GetPosition().z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // !MASTER
|
||||||
|
|
||||||
oldNumPathNodes = m_numPathNodes;
|
oldNumPathNodes = m_numPathNodes;
|
||||||
oldNumLinks = m_numConnections;
|
oldNumLinks = m_numConnections;
|
||||||
|
|
||||||
@ -1633,10 +1649,18 @@ CPathFind::TestCoorsCloseness(CVector target, uint8 type, CVector start)
|
|||||||
DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 999999.88f, -1);
|
DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 999999.88f, -1);
|
||||||
else
|
else
|
||||||
DoPathSearch(type, start, -1, target, nil, &DummyResult2, 0, nil, &dist, 50.0f, -1);
|
DoPathSearch(type, start, -1, target, nil, &DummyResult2, 0, nil, &dist, 50.0f, -1);
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
// dist has GenerationDistMultiplier as a factor, so our reference dist should have it too
|
||||||
|
if(type == PATH_CAR)
|
||||||
|
return dist < 160.0f*TheCamera.GenerationDistMultiplier;
|
||||||
|
else
|
||||||
|
return dist < 100.0f*TheCamera.GenerationDistMultiplier;
|
||||||
|
#else
|
||||||
if(type == PATH_CAR)
|
if(type == PATH_CAR)
|
||||||
return dist < 160.0f;
|
return dist < 160.0f;
|
||||||
else
|
else
|
||||||
return dist < 100.0f;
|
return dist < 100.0f;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -67,7 +67,7 @@ CPhoneInfo::Update(void)
|
|||||||
} else {
|
} else {
|
||||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PHONE);
|
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PHONE);
|
||||||
if (player->m_nPedState == PED_MAKE_CALL)
|
if (player->m_nPedState == PED_MAKE_CALL)
|
||||||
player->m_nPedState = PED_IDLE;
|
player->SetPedState(PED_IDLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool notInCar;
|
bool notInCar;
|
||||||
@ -114,7 +114,7 @@ CPhoneInfo::Update(void)
|
|||||||
player->m_fRotationCur = angleToFace;
|
player->m_fRotationCur = angleToFace;
|
||||||
player->m_fRotationDest = angleToFace;
|
player->m_fRotationDest = angleToFace;
|
||||||
player->SetHeading(angleToFace);
|
player->SetHeading(angleToFace);
|
||||||
player->m_nPedState = PED_MAKE_CALL;
|
player->SetPedState(PED_MAKE_CALL);
|
||||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PHONE);
|
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PHONE);
|
||||||
TheCamera.SetWideScreenOn();
|
TheCamera.SetWideScreenOn();
|
||||||
playerInfo->MakePlayerSafe(true);
|
playerInfo->MakePlayerSafe(true);
|
||||||
@ -387,7 +387,7 @@ INITSAVEBUF
|
|||||||
|
|
||||||
// Convert entity pointer to building pool index while saving
|
// Convert entity pointer to building pool index while saving
|
||||||
if (phone->m_pEntity) {
|
if (phone->m_pEntity) {
|
||||||
phone->m_pEntity = (CEntity*) (CPools::GetBuildingPool()->GetJustIndex((CBuilding*)phone->m_pEntity) + 1);
|
phone->m_pEntity = (CEntity*) (CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert((CBuilding*)phone->m_pEntity) + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VALIDATESAVEBUF(*size)
|
VALIDATESAVEBUF(*size)
|
||||||
@ -412,7 +412,7 @@ PhonePutDownCB(CAnimBlendAssociation *assoc, void *arg)
|
|||||||
ped->bUpdateAnimHeading = true;
|
ped->bUpdateAnimHeading = true;
|
||||||
|
|
||||||
if (ped->m_nPedState == PED_MAKE_CALL)
|
if (ped->m_nPedState == PED_MAKE_CALL)
|
||||||
ped->m_nPedState = PED_IDLE;
|
ped->SetPedState(PED_IDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -54,20 +54,15 @@ uint8 aWeaponGreens[] = { 0, 255, 128, 255, 0, 255, 128, 255, 0, 255, 255, 0, 25
|
|||||||
uint8 aWeaponBlues[] = { 0, 0, 255, 0, 255, 255, 0, 128, 255, 0, 255, 0, 128, 255, 0, 0 };
|
uint8 aWeaponBlues[] = { 0, 0, 255, 0, 255, 255, 0, 128, 255, 0, 255, 0, 128, 255, 0, 0 };
|
||||||
float aWeaponScale[] = { 1.0f, 2.0f, 1.5f, 1.0f, 1.0f, 1.5f, 1.0f, 2.0f, 1.0f, 2.0f, 2.5f, 1.0f, 1.0f, 1.0f, 1.0f };
|
float aWeaponScale[] = { 1.0f, 2.0f, 1.5f, 1.0f, 1.0f, 1.5f, 1.0f, 2.0f, 1.0f, 2.0f, 2.5f, 1.0f, 1.0f, 1.0f, 1.0f };
|
||||||
|
|
||||||
void
|
|
||||||
CPickup::RemoveKeepType()
|
inline void
|
||||||
|
CPickup::Remove()
|
||||||
{
|
{
|
||||||
CWorld::Remove(m_pObject);
|
CWorld::Remove(m_pObject);
|
||||||
delete m_pObject;
|
delete m_pObject;
|
||||||
|
|
||||||
m_bRemoved = true;
|
m_bRemoved = true;
|
||||||
m_pObject = nil;
|
m_pObject = nil;
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPickup::Remove()
|
|
||||||
{
|
|
||||||
RemoveKeepType();
|
|
||||||
m_eType = PICKUP_NONE;
|
m_eType = PICKUP_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,11 +71,11 @@ CPickup::GiveUsAPickUpObject(int32 handle)
|
|||||||
{
|
{
|
||||||
CObject *object;
|
CObject *object;
|
||||||
|
|
||||||
if (handle <= 0) object = new CObject(m_eModelIndex, false);
|
if (handle >= 0) {
|
||||||
else {
|
|
||||||
CPools::MakeSureSlotInObjectPoolIsEmpty(handle);
|
CPools::MakeSureSlotInObjectPoolIsEmpty(handle);
|
||||||
object = new(handle) CObject(m_eModelIndex, false);
|
object = new (handle) CObject(m_eModelIndex, false);
|
||||||
}
|
} else
|
||||||
|
object = new CObject(m_eModelIndex, false);
|
||||||
|
|
||||||
if (object == nil) return nil;
|
if (object == nil) return nil;
|
||||||
object->ObjectCreatedBy = MISSION_OBJECT;
|
object->ObjectCreatedBy = MISSION_OBJECT;
|
||||||
@ -131,7 +126,6 @@ CPickup::GiveUsAPickUpObject(int32 handle)
|
|||||||
bool
|
bool
|
||||||
CPickup::CanBePickedUp(CPlayerPed *player)
|
CPickup::CanBePickedUp(CPlayerPed *player)
|
||||||
{
|
{
|
||||||
assert(m_pObject != nil);
|
|
||||||
bool cannotBePickedUp =
|
bool cannotBePickedUp =
|
||||||
(m_pObject->GetModelIndex() == MI_PICKUP_BODYARMOUR && player->m_fArmour > 99.5f)
|
(m_pObject->GetModelIndex() == MI_PICKUP_BODYARMOUR && player->m_fArmour > 99.5f)
|
||||||
|| (m_pObject->GetModelIndex() == MI_PICKUP_HEALTH && player->m_fHealth > 99.5f)
|
|| (m_pObject->GetModelIndex() == MI_PICKUP_HEALTH && player->m_fHealth > 99.5f)
|
||||||
@ -144,6 +138,7 @@ bool
|
|||||||
CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
||||||
{
|
{
|
||||||
float waterLevel;
|
float waterLevel;
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
if (m_bRemoved) {
|
if (m_bRemoved) {
|
||||||
if (CTimer::GetTimeInMilliseconds() > m_nTimer) {
|
if (CTimer::GetTimeInMilliseconds() > m_nTimer) {
|
||||||
@ -204,9 +199,12 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
player->m_nSelectedWepSlot = player->GetWeaponSlot(CPickups::WeaponForModel(m_pObject->GetModelIndex()));
|
player->m_nSelectedWepSlot = player->GetWeaponSlot(CPickups::WeaponForModel(m_pObject->GetModelIndex()));
|
||||||
DMAudio.PlayFrontEndSound(SOUND_PICKUP_WEAPON_BOUGHT, m_pObject->GetModelIndex() - MI_GRENADE);
|
DMAudio.PlayFrontEndSound(SOUND_PICKUP_WEAPON_BOUGHT, m_pObject->GetModelIndex() - MI_GRENADE);
|
||||||
}
|
}
|
||||||
RemoveKeepType();
|
result = true;
|
||||||
|
CWorld::Remove(m_pObject);
|
||||||
|
delete m_pObject;
|
||||||
|
m_pObject = nil;
|
||||||
m_nTimer = CTimer::GetTimeInMilliseconds() + 5000;
|
m_nTimer = CTimer::GetTimeInMilliseconds() + 5000;
|
||||||
return true;
|
m_bRemoved = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PICKUP_ON_STREET:
|
case PICKUP_ON_STREET:
|
||||||
@ -235,8 +233,12 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
m_nTimer = CTimer::GetTimeInMilliseconds() + 720000;
|
m_nTimer = CTimer::GetTimeInMilliseconds() + 720000;
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveKeepType();
|
result = true;
|
||||||
return true;
|
CWorld::Remove(m_pObject);
|
||||||
|
delete m_pObject;
|
||||||
|
m_pObject = nil;
|
||||||
|
m_bRemoved = true;
|
||||||
|
break;
|
||||||
case PICKUP_ONCE:
|
case PICKUP_ONCE:
|
||||||
case PICKUP_ONCE_TIMEOUT:
|
case PICKUP_ONCE_TIMEOUT:
|
||||||
if (!CPickups::GivePlayerGoodiesWithPickUpMI(m_pObject->GetModelIndex(), playerId)) {
|
if (!CPickups::GivePlayerGoodiesWithPickUpMI(m_pObject->GetModelIndex(), playerId)) {
|
||||||
@ -247,8 +249,9 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
}
|
}
|
||||||
DMAudio.PlayFrontEndSound(SOUND_PICKUP_WEAPON, m_pObject->GetModelIndex() - MI_GRENADE);
|
DMAudio.PlayFrontEndSound(SOUND_PICKUP_WEAPON, m_pObject->GetModelIndex() - MI_GRENADE);
|
||||||
}
|
}
|
||||||
|
result = true;
|
||||||
Remove();
|
Remove();
|
||||||
return true;
|
break;
|
||||||
case PICKUP_COLLECTABLE1:
|
case PICKUP_COLLECTABLE1:
|
||||||
CWorld::Players[playerId].m_nCollectedPackages++;
|
CWorld::Players[playerId].m_nCollectedPackages++;
|
||||||
CWorld::Players[playerId].m_nMoney += 1000;
|
CWorld::Players[playerId].m_nMoney += 1000;
|
||||||
@ -260,18 +263,20 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
} else
|
} else
|
||||||
CGarages::TriggerMessage("CO_ONE", CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages, 5000, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
CGarages::TriggerMessage("CO_ONE", CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages, 5000, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||||
|
|
||||||
|
result = true;
|
||||||
Remove();
|
Remove();
|
||||||
DMAudio.PlayFrontEndSound(SOUND_PICKUP_HIDDEN_PACKAGE, 0);
|
DMAudio.PlayFrontEndSound(SOUND_PICKUP_HIDDEN_PACKAGE, 0);
|
||||||
return true;
|
break;
|
||||||
case PICKUP_MONEY:
|
case PICKUP_MONEY:
|
||||||
CWorld::Players[playerId].m_nMoney += m_nQuantity;
|
CWorld::Players[playerId].m_nMoney += m_nQuantity;
|
||||||
sprintf(gString, "$%d", m_nQuantity);
|
sprintf(gString, "$%d", m_nQuantity);
|
||||||
#ifdef MONEY_MESSAGES
|
#ifdef MONEY_MESSAGES
|
||||||
CMoneyMessages::RegisterOne(m_vecPos + CVector(0.0f, 0.0f, 1.0f), gString, 0, 255, 0, 0.5f, 0.5f);
|
CMoneyMessages::RegisterOne(m_vecPos + CVector(0.0f, 0.0f, 1.0f), gString, 0, 255, 0, 0.5f, 0.5f);
|
||||||
#endif
|
#endif
|
||||||
|
result = true;
|
||||||
Remove();
|
Remove();
|
||||||
DMAudio.PlayFrontEndSound(SOUND_PICKUP_MONEY, 0);
|
DMAudio.PlayFrontEndSound(SOUND_PICKUP_MONEY, 0);
|
||||||
return true;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -298,7 +303,9 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
CVehicle *vehicle = CPools::GetVehiclePool()->GetSlot(i);
|
CVehicle *vehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||||
if (vehicle != nil && vehicle->IsSphereTouchingVehicle(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z, 1.5f)) {
|
if (vehicle != nil && vehicle->IsSphereTouchingVehicle(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z, 1.5f)) {
|
||||||
touched = true;
|
touched = true;
|
||||||
break; // added break here
|
#ifdef FIX_BUGS
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,12 +327,17 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
bool explode = false;
|
bool explode = false;
|
||||||
if (CTimer::GetTimeInMilliseconds() > m_nTimer)
|
if (CTimer::GetTimeInMilliseconds() > m_nTimer)
|
||||||
explode = true;
|
explode = true;
|
||||||
else {// added else here since vehicle lookup is useless
|
#ifdef FIX_BUGS
|
||||||
|
else// added else here since vehicle lookup is useless
|
||||||
|
#endif
|
||||||
|
{
|
||||||
for (int32 i = CPools::GetVehiclePool()->GetSize()-1; i >= 0; i--) {
|
for (int32 i = CPools::GetVehiclePool()->GetSize()-1; i >= 0; i--) {
|
||||||
CVehicle *vehicle = CPools::GetVehiclePool()->GetSlot(i);
|
CVehicle *vehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||||
if (vehicle != nil && vehicle->IsSphereTouchingVehicle(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z, 1.5f)) {
|
if (vehicle != nil && vehicle->IsSphereTouchingVehicle(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z, 1.5f)) {
|
||||||
explode = true;
|
explode = true;
|
||||||
break; // added break here
|
#ifdef FIX_BUGS
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -341,19 +353,19 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
|
|
||||||
m_pObject->GetMatrix().UpdateRW();
|
m_pObject->GetMatrix().UpdateRW();
|
||||||
m_pObject->UpdateRwFrame();
|
m_pObject->UpdateRwFrame();
|
||||||
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, 0) && waterLevel >= m_pObject->GetPosition().z)
|
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, false) && waterLevel >= m_pObject->GetPosition().z)
|
||||||
m_eType = PICKUP_FLOATINGPACKAGE_FLOATING;
|
m_eType = PICKUP_FLOATINGPACKAGE_FLOATING;
|
||||||
break;
|
break;
|
||||||
case PICKUP_FLOATINGPACKAGE_FLOATING:
|
case PICKUP_FLOATINGPACKAGE_FLOATING:
|
||||||
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, 0))
|
if (CWaterLevel::GetWaterLevel(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z + 5.0f, &waterLevel, false))
|
||||||
m_pObject->GetMatrix().GetPosition().z = waterLevel;
|
m_pObject->GetMatrix().GetPosition().z = waterLevel;
|
||||||
|
|
||||||
m_pObject->GetMatrix().UpdateRW();
|
m_pObject->GetMatrix().UpdateRW();
|
||||||
m_pObject->UpdateRwFrame();
|
m_pObject->UpdateRwFrame();
|
||||||
if (vehicle != nil && vehicle->IsSphereTouchingVehicle(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z, 2.0f)) {
|
if (vehicle != nil && vehicle->IsSphereTouchingVehicle(m_pObject->GetPosition().x, m_pObject->GetPosition().y, m_pObject->GetPosition().z, 2.0f)) {
|
||||||
Remove();
|
Remove();
|
||||||
|
result = true;
|
||||||
DMAudio.PlayFrontEndSound(SOUND_PICKUP_FLOAT_PACKAGE, 0);
|
DMAudio.PlayFrontEndSound(SOUND_PICKUP_FLOAT_PACKAGE, 0);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
@ -361,7 +373,7 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId)
|
|||||||
}
|
}
|
||||||
if (!m_bRemoved && (m_eType == PICKUP_ONCE_TIMEOUT || m_eType == PICKUP_MONEY) && CTimer::GetTimeInMilliseconds() > m_nTimer)
|
if (!m_bRemoved && (m_eType == PICKUP_ONCE_TIMEOUT || m_eType == PICKUP_MONEY) && CTimer::GetTimeInMilliseconds() > m_nTimer)
|
||||||
Remove();
|
Remove();
|
||||||
return false;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -523,7 +535,7 @@ CPickups::GenerateNewOne(CVector pos, uint32 modelIndex, uint8 type, uint32 quan
|
|||||||
|
|
||||||
if (slot >= NUMPICKUPS) return -1;
|
if (slot >= NUMPICKUPS) return -1;
|
||||||
|
|
||||||
aPickUps[slot].m_eType = (ePickupType)type;
|
aPickUps[slot].m_eType = type;
|
||||||
aPickUps[slot].m_bRemoved = false;
|
aPickUps[slot].m_bRemoved = false;
|
||||||
aPickUps[slot].m_nQuantity = quantity;
|
aPickUps[slot].m_nQuantity = quantity;
|
||||||
if (type == PICKUP_ONCE_TIMEOUT)
|
if (type == PICKUP_ONCE_TIMEOUT)
|
||||||
@ -628,7 +640,7 @@ CPickups::Update()
|
|||||||
#ifdef CAMERA_PICKUP
|
#ifdef CAMERA_PICKUP
|
||||||
if ( bPickUpcamActivated ) // taken from PS2
|
if ( bPickUpcamActivated ) // taken from PS2
|
||||||
{
|
{
|
||||||
float dist = (FindPlayerCoors() - StaticCamCoors).Magnitude2D();
|
float dist = Distance2D(StaticCamCoors, FindPlayerCoors());
|
||||||
float mult;
|
float mult;
|
||||||
if ( dist < 10.0f )
|
if ( dist < 10.0f )
|
||||||
mult = 1.0f - (dist / 10.0f );
|
mult = 1.0f - (dist / 10.0f );
|
||||||
@ -644,8 +656,7 @@ CPickups::Update()
|
|||||||
TheCamera.TakeControl(FindPlayerVehicle(), CCam::MODE_FIXED, JUMP_CUT, CAMCONTROL_SCRIPT);
|
TheCamera.TakeControl(FindPlayerVehicle(), CCam::MODE_FIXED, JUMP_CUT, CAMCONTROL_SCRIPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( FindPlayerVehicle() != pPlayerVehicle
|
if ( FindPlayerVehicle() != pPlayerVehicle || Distance(StaticCamCoors, FindPlayerCoors()) > 40.0f
|
||||||
|| (FindPlayerCoors() - StaticCamCoors).Magnitude() > 40.0f
|
|
||||||
|| ((CTimer::GetTimeInMilliseconds() - StaticCamStartTime) > 60000) )
|
|| ((CTimer::GetTimeInMilliseconds() - StaticCamStartTime) > 60000) )
|
||||||
{
|
{
|
||||||
TheCamera.RestoreWithJumpCut();
|
TheCamera.RestoreWithJumpCut();
|
||||||
@ -715,7 +726,7 @@ CPickups::DoPickUpEffects(CEntity *entity)
|
|||||||
|
|
||||||
CObject *object = (CObject*)entity;
|
CObject *object = (CObject*)entity;
|
||||||
if (object->bPickupObjWithMessage || object->bOutOfStock || object->m_nBonusValue) {
|
if (object->bPickupObjWithMessage || object->bOutOfStock || object->m_nBonusValue) {
|
||||||
float dist = (TheCamera.GetPosition() - pos).Magnitude();
|
float dist = Distance2D(pos, TheCamera.GetPosition());
|
||||||
const float MAXDIST = 12.0f;
|
const float MAXDIST = 12.0f;
|
||||||
|
|
||||||
if (dist < MAXDIST && NumMessages < NUMPICKUPMESSAGES) {
|
if (dist < MAXDIST && NumMessages < NUMPICKUPMESSAGES) {
|
||||||
@ -746,7 +757,7 @@ void
|
|||||||
CPickups::DoMineEffects(CEntity *entity)
|
CPickups::DoMineEffects(CEntity *entity)
|
||||||
{
|
{
|
||||||
const CVector &pos = entity->GetPosition();
|
const CVector &pos = entity->GetPosition();
|
||||||
float dist = (TheCamera.GetPosition() - pos).Magnitude();
|
float dist = Distance(pos, TheCamera.GetPosition());
|
||||||
const float MAXDIST = 20.0f;
|
const float MAXDIST = 20.0f;
|
||||||
|
|
||||||
if (dist < MAXDIST) {
|
if (dist < MAXDIST) {
|
||||||
@ -765,7 +776,7 @@ void
|
|||||||
CPickups::DoMoneyEffects(CEntity *entity)
|
CPickups::DoMoneyEffects(CEntity *entity)
|
||||||
{
|
{
|
||||||
const CVector &pos = entity->GetPosition();
|
const CVector &pos = entity->GetPosition();
|
||||||
float dist = (TheCamera.GetPosition() - pos).Magnitude();
|
float dist = Distance(pos, TheCamera.GetPosition());
|
||||||
const float MAXDIST = 20.0f;
|
const float MAXDIST = 20.0f;
|
||||||
|
|
||||||
if (dist < MAXDIST) {
|
if (dist < MAXDIST) {
|
||||||
@ -784,7 +795,7 @@ void
|
|||||||
CPickups::DoCollectableEffects(CEntity *entity)
|
CPickups::DoCollectableEffects(CEntity *entity)
|
||||||
{
|
{
|
||||||
const CVector &pos = entity->GetPosition();
|
const CVector &pos = entity->GetPosition();
|
||||||
float dist = (TheCamera.GetPosition() - pos).Magnitude();
|
float dist = Distance(pos, TheCamera.GetPosition());
|
||||||
const float MAXDIST = 14.0f;
|
const float MAXDIST = 14.0f;
|
||||||
|
|
||||||
if (dist < MAXDIST) {
|
if (dist < MAXDIST) {
|
||||||
@ -953,7 +964,11 @@ CPickups::RenderPickUpText()
|
|||||||
float fScaleX = aMessages[i].m_dist.x / 100.0f;
|
float fScaleX = aMessages[i].m_dist.x / 100.0f;
|
||||||
if (fScaleX > MAX_SCALE) fScaleX = MAX_SCALE;
|
if (fScaleX > MAX_SCALE) fScaleX = MAX_SCALE;
|
||||||
|
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::SetScale(SCREEN_SCALE_X(fScaleX), SCREEN_SCALE_Y(fScaleY));
|
||||||
|
#else
|
||||||
CFont::SetScale(fScaleX, fScaleY);
|
CFont::SetScale(fScaleX, fScaleY);
|
||||||
|
#endif
|
||||||
CFont::SetCentreOn();
|
CFont::SetCentreOn();
|
||||||
CFont::SetCentreSize(SCREEN_WIDTH);
|
CFont::SetCentreSize(SCREEN_WIDTH);
|
||||||
CFont::SetJustifyOff();
|
CFont::SetJustifyOff();
|
||||||
@ -998,7 +1013,7 @@ INITSAVEBUF
|
|||||||
for (int32 i = 0; i < NUMPICKUPS; i++) {
|
for (int32 i = 0; i < NUMPICKUPS; i++) {
|
||||||
CPickup *buf_pickup = WriteSaveBuf(buf, aPickUps[i]);
|
CPickup *buf_pickup = WriteSaveBuf(buf, aPickUps[i]);
|
||||||
if (buf_pickup->m_eType != PICKUP_NONE && buf_pickup->m_pObject != nil)
|
if (buf_pickup->m_eType != PICKUP_NONE && buf_pickup->m_pObject != nil)
|
||||||
buf_pickup->m_pObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex(buf_pickup->m_pObject) + 1);
|
buf_pickup->m_pObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(buf_pickup->m_pObject) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
WriteSaveBuf(buf, CollectedPickUpIndex);
|
WriteSaveBuf(buf, CollectedPickUpIndex);
|
||||||
@ -1421,3 +1436,85 @@ CPacManPickups::ResetPowerPillsCarriedByPlayer()
|
|||||||
FindPlayerVehicle()->m_fForceMultiplier = 1.0f;
|
FindPlayerVehicle()->m_fForceMultiplier = 1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPed::CreateDeadPedMoney(void)
|
||||||
|
{
|
||||||
|
if (!CGame::nastyGame)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int mi = GetModelIndex();
|
||||||
|
|
||||||
|
if ((mi >= MI_COP && mi <= MI_FIREMAN) || CharCreatedBy == MISSION_CHAR || bInVehicle)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int money = CGeneral::GetRandomNumber() % 60;
|
||||||
|
if (money < 10)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (money == 43)
|
||||||
|
money = 700;
|
||||||
|
|
||||||
|
int pickupCount = money / 40 + 1;
|
||||||
|
int moneyPerPickup = money / pickupCount;
|
||||||
|
|
||||||
|
for(int i = 0; i < pickupCount; i++) {
|
||||||
|
// (CGeneral::GetRandomNumber() % 256) * PI / 128 gives a float up to something TWOPI-ish.
|
||||||
|
float pickupX = 1.5f * Sin((CGeneral::GetRandomNumber() % 256) * PI / 128) + GetPosition().x;
|
||||||
|
float pickupY = 1.5f * Cos((CGeneral::GetRandomNumber() % 256) * PI / 128) + GetPosition().y;
|
||||||
|
bool found = false;
|
||||||
|
float groundZ = CWorld::FindGroundZFor3DCoord(pickupX, pickupY, GetPosition().z, &found) + 0.5f;
|
||||||
|
if (found) {
|
||||||
|
CPickups::GenerateNewOne(CVector(pickupX, pickupY, groundZ), MI_MONEY, PICKUP_MONEY, moneyPerPickup + (CGeneral::GetRandomNumber() & 7));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPed::CreateDeadPedWeaponPickups(void)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
float angleToPed;
|
||||||
|
CVector pickupPos;
|
||||||
|
|
||||||
|
if (bInVehicle)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(int i = 0; i < WEAPONTYPE_TOTAL_INVENTORY_WEAPONS; i++) {
|
||||||
|
|
||||||
|
eWeaponType weapon = GetWeapon(i).m_eWeaponType;
|
||||||
|
int weaponAmmo = GetWeapon(i).m_nAmmoTotal;
|
||||||
|
if (weapon == WEAPONTYPE_UNARMED || weapon == WEAPONTYPE_DETONATOR || weaponAmmo == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
angleToPed = i * 1.75f;
|
||||||
|
pickupPos = GetPosition();
|
||||||
|
pickupPos.x += 1.5f * Sin(angleToPed);
|
||||||
|
pickupPos.y += 1.5f * Cos(angleToPed);
|
||||||
|
pickupPos.z = CWorld::FindGroundZFor3DCoord(pickupPos.x, pickupPos.y, pickupPos.z, &found) + 0.5f;
|
||||||
|
|
||||||
|
CVector pedPos = GetPosition();
|
||||||
|
pedPos.z += 0.3f;
|
||||||
|
|
||||||
|
CVector pedToPickup = pickupPos - pedPos;
|
||||||
|
float distance = pedToPickup.Magnitude();
|
||||||
|
|
||||||
|
// outer edge of pickup
|
||||||
|
distance = (distance + 0.3f) / distance;
|
||||||
|
CVector pickupPos2 = pedPos;
|
||||||
|
pickupPos2 += distance * pedToPickup;
|
||||||
|
|
||||||
|
// pickup must be on ground and line to its edge must be clear
|
||||||
|
if (!found || CWorld::GetIsLineOfSightClear(pickupPos2, pedPos, true, false, false, false, false, false, false)) {
|
||||||
|
// otherwise try another position (but disregard second check apparently)
|
||||||
|
angleToPed += 3.14f;
|
||||||
|
pickupPos = GetPosition();
|
||||||
|
pickupPos.x += 1.5f * Sin(angleToPed);
|
||||||
|
pickupPos.y += 1.5f * Cos(angleToPed);
|
||||||
|
pickupPos.z = CWorld::FindGroundZFor3DCoord(pickupPos.x, pickupPos.y, pickupPos.z, &found) + 0.5f;
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
CPickups::GenerateNewOne_WeaponType(pickupPos, weapon, PICKUP_ONCE_TIMEOUT, Min(weaponAmmo, AmmoForWeapon_OnStreet[weapon]));
|
||||||
|
}
|
||||||
|
ClearWeapons();
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Weapon.h"
|
#include "Weapon.h"
|
||||||
|
|
||||||
enum ePickupType : uint8
|
enum ePickupType
|
||||||
{
|
{
|
||||||
PICKUP_NONE = 0,
|
PICKUP_NONE = 0,
|
||||||
PICKUP_IN_SHOP,
|
PICKUP_IN_SHOP,
|
||||||
@ -29,7 +29,7 @@ class CPlayerPed;
|
|||||||
class CPickup
|
class CPickup
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ePickupType m_eType;
|
uint8 m_eType;
|
||||||
bool m_bRemoved;
|
bool m_bRemoved;
|
||||||
uint16 m_nQuantity;
|
uint16 m_nQuantity;
|
||||||
CObject *m_pObject;
|
CObject *m_pObject;
|
||||||
@ -41,10 +41,9 @@ public:
|
|||||||
CObject *GiveUsAPickUpObject(int32 handle);
|
CObject *GiveUsAPickUpObject(int32 handle);
|
||||||
bool Update(CPlayerPed *player, CVehicle *vehicle, int playerId);
|
bool Update(CPlayerPed *player, CVehicle *vehicle, int playerId);
|
||||||
private:
|
private:
|
||||||
bool IsMine() { return m_eType >= PICKUP_MINE_INACTIVE && m_eType <= PICKUP_FLOATINGPACKAGE_FLOATING; }
|
inline bool IsMine() { return m_eType >= PICKUP_MINE_INACTIVE && m_eType <= PICKUP_FLOATINGPACKAGE_FLOATING; }
|
||||||
inline bool CanBePickedUp(CPlayerPed *player);
|
inline bool CanBePickedUp(CPlayerPed *player);
|
||||||
void RemoveKeepType();
|
inline void Remove();
|
||||||
void Remove();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
VALIDATE_SIZE(CPickup, 0x1C);
|
VALIDATE_SIZE(CPickup, 0x1C);
|
||||||
|
@ -402,15 +402,17 @@ void CRecordDataForChase::ProcessControlCars(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(GTA_PS2) || defined(FIX_BUGS))
|
|
||||||
bool CRecordDataForChase::ShouldThisPadBeLeftAlone(uint8 pad)
|
bool CRecordDataForChase::ShouldThisPadBeLeftAlone(uint8 pad)
|
||||||
{
|
{
|
||||||
// may be wrong
|
// may be wrong
|
||||||
if (Status == STATE_NONE || Status == STATE_PLAYBACK)
|
if (Status == STATE_PLAYBACK_INIT) // this is useless but ps2 def checks if it's STATE_PLAYBACK_INIT
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (Status == STATE_RECORD)
|
||||||
return pad != 0;
|
return pad != 0;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void CRecordDataForChase::GiveUsACar(int32 mi, CVector pos, float angle, CAutomobile** ppCar, uint8 colour1, uint8 colour2)
|
void CRecordDataForChase::GiveUsACar(int32 mi, CVector pos, float angle, CAutomobile** ppCar, uint8 colour1, uint8 colour2)
|
||||||
{
|
{
|
||||||
|
@ -57,9 +57,7 @@ public:
|
|||||||
static void RestoreInfoForMatrix(CMatrix&, CCarStateEachFrame*);
|
static void RestoreInfoForMatrix(CMatrix&, CCarStateEachFrame*);
|
||||||
static void RestoreInfoForCar(CAutomobile*, CCarStateEachFrame*, bool);
|
static void RestoreInfoForCar(CAutomobile*, CCarStateEachFrame*, bool);
|
||||||
static void ProcessControlCars(void);
|
static void ProcessControlCars(void);
|
||||||
#if (defined(GTA_PS2) || defined(FIX_BUGS))
|
|
||||||
static bool ShouldThisPadBeLeftAlone(uint8 pad);
|
static bool ShouldThisPadBeLeftAlone(uint8 pad);
|
||||||
#endif
|
|
||||||
static void GiveUsACar(int32, CVector, float, CAutomobile**, uint8, uint8);
|
static void GiveUsACar(int32, CVector, float, CAutomobile**, uint8, uint8);
|
||||||
static void StartChaseScene(float);
|
static void StartChaseScene(float);
|
||||||
static void CleanUpChaseScene(void);
|
static void CleanUpChaseScene(void);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#ifdef GTA_REPLAY
|
||||||
#include "AnimBlendAssociation.h"
|
#include "AnimBlendAssociation.h"
|
||||||
#include "Boat.h"
|
#include "Boat.h"
|
||||||
#include "SpecialFX.h"
|
#include "SpecialFX.h"
|
||||||
@ -10,6 +10,10 @@
|
|||||||
#include "DMAudio.h"
|
#include "DMAudio.h"
|
||||||
#include "Draw.h"
|
#include "Draw.h"
|
||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
#include "Fire.h"
|
||||||
|
#include "Garages.h"
|
||||||
|
#endif
|
||||||
#include "Heli.h"
|
#include "Heli.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "Matrix.h"
|
#include "Matrix.h"
|
||||||
@ -22,6 +26,10 @@
|
|||||||
#include "Plane.h"
|
#include "Plane.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Population.h"
|
#include "Population.h"
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
#include "Projectile.h"
|
||||||
|
#include "ProjectileInfo.h"
|
||||||
|
#endif
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
#include "References.h"
|
#include "References.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
@ -102,6 +110,11 @@ float CReplay::fDistanceLookAroundCam;
|
|||||||
float CReplay::fBetaAngleLookAroundCam;
|
float CReplay::fBetaAngleLookAroundCam;
|
||||||
float CReplay::fAlphaAngleLookAroundCam;
|
float CReplay::fAlphaAngleLookAroundCam;
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
|
uint8* CReplay::pGarages;
|
||||||
|
CFire* CReplay::FireArray;
|
||||||
|
uint32 CReplay::NumOfFires;
|
||||||
|
uint8* CReplay::paProjectileInfo;
|
||||||
|
uint8* CReplay::paProjectiles;
|
||||||
int CReplay::nHandleOfPlayerPed[NUMPLAYERS];
|
int CReplay::nHandleOfPlayerPed[NUMPLAYERS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1052,10 +1065,10 @@ void CReplay::ProcessReplayCamera(void)
|
|||||||
TheCamera.GetUp() = CVector(0.0f, 1.0f, 0.0f);
|
TheCamera.GetUp() = CVector(0.0f, 1.0f, 0.0f);
|
||||||
TheCamera.GetRight() = CVector(1.0f, 0.0f, 0.0f);
|
TheCamera.GetRight() = CVector(1.0f, 0.0f, 0.0f);
|
||||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
pm->pos = *(RwV3d*)&TheCamera.GetPosition();
|
pm->pos = TheCamera.GetPosition();
|
||||||
pm->at = *(RwV3d*)&TheCamera.GetForward();
|
pm->at = TheCamera.GetForward();
|
||||||
pm->up = *(RwV3d*)&TheCamera.GetUp();
|
pm->up = TheCamera.GetUp();
|
||||||
pm->right = *(RwV3d*)&TheCamera.GetRight();
|
pm->right = TheCamera.GetRight();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case REPLAYCAMMODE_FIXED:
|
case REPLAYCAMMODE_FIXED:
|
||||||
@ -1071,10 +1084,10 @@ void CReplay::ProcessReplayCamera(void)
|
|||||||
TheCamera.GetMatrix().GetUp() = up;
|
TheCamera.GetMatrix().GetUp() = up;
|
||||||
TheCamera.GetMatrix().GetRight() = right;
|
TheCamera.GetMatrix().GetRight() = right;
|
||||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
pm->pos = *(RwV3d*)&TheCamera.GetMatrix().GetPosition();
|
pm->pos = TheCamera.GetMatrix().GetPosition();
|
||||||
pm->at = *(RwV3d*)&TheCamera.GetMatrix().GetForward();
|
pm->at = TheCamera.GetMatrix().GetForward();
|
||||||
pm->up = *(RwV3d*)&TheCamera.GetMatrix().GetUp();
|
pm->up = TheCamera.GetMatrix().GetUp();
|
||||||
pm->right = *(RwV3d*)&TheCamera.GetMatrix().GetRight();
|
pm->right = TheCamera.GetMatrix().GetRight();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -1183,6 +1196,17 @@ void CReplay::StoreStuffInMem(void)
|
|||||||
if (ped)
|
if (ped)
|
||||||
StoreDetailedPedAnimation(ped, &pPedAnims[i]);
|
StoreDetailedPedAnimation(ped, &pPedAnims[i]);
|
||||||
}
|
}
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
pGarages = new uint8[sizeof(CGarages::aGarages)];
|
||||||
|
memcpy(pGarages, CGarages::aGarages, sizeof(CGarages::aGarages));
|
||||||
|
FireArray = new CFire[NUM_FIRES];
|
||||||
|
memcpy(FireArray, gFireManager.m_aFires, sizeof(gFireManager.m_aFires));
|
||||||
|
NumOfFires = gFireManager.m_nTotalFires;
|
||||||
|
paProjectileInfo = new uint8[sizeof(gaProjectileInfo)];
|
||||||
|
memcpy(paProjectileInfo, gaProjectileInfo, sizeof(gaProjectileInfo));
|
||||||
|
paProjectiles = new uint8[sizeof(CProjectileInfo::ms_apProjectile)];
|
||||||
|
memcpy(paProjectiles, CProjectileInfo::ms_apProjectile, sizeof(CProjectileInfo::ms_apProjectile));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CReplay::RestoreStuffFromMem(void)
|
void CReplay::RestoreStuffFromMem(void)
|
||||||
@ -1233,7 +1257,7 @@ void CReplay::RestoreStuffFromMem(void)
|
|||||||
ped->m_rwObject = nil;
|
ped->m_rwObject = nil;
|
||||||
ped->m_modelIndex = -1;
|
ped->m_modelIndex = -1;
|
||||||
ped->SetModelIndex(mi);
|
ped->SetModelIndex(mi);
|
||||||
ped->m_pVehicleAnim = 0;
|
ped->m_pVehicleAnim = nil;
|
||||||
ped->m_audioEntityId = DMAudio.CreateEntity(AUDIOTYPE_PHYSICAL, ped);
|
ped->m_audioEntityId = DMAudio.CreateEntity(AUDIOTYPE_PHYSICAL, ped);
|
||||||
DMAudio.SetEntityStatus(ped->m_audioEntityId, true);
|
DMAudio.SetEntityStatus(ped->m_audioEntityId, true);
|
||||||
CPopulation::UpdatePedCount((ePedType)ped->m_nPedType, false);
|
CPopulation::UpdatePedCount((ePedType)ped->m_nPedType, false);
|
||||||
@ -1349,6 +1373,22 @@ void CReplay::RestoreStuffFromMem(void)
|
|||||||
}
|
}
|
||||||
delete[] pPedAnims;
|
delete[] pPedAnims;
|
||||||
pPedAnims = nil;
|
pPedAnims = nil;
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
memcpy(CGarages::aGarages, pGarages, sizeof(CGarages::aGarages));
|
||||||
|
delete[] pGarages;
|
||||||
|
pGarages = nil;
|
||||||
|
memcpy(gFireManager.m_aFires, FireArray, sizeof(gFireManager.m_aFires));
|
||||||
|
delete[] FireArray;
|
||||||
|
FireArray = nil;
|
||||||
|
gFireManager.m_nTotalFires = NumOfFires;
|
||||||
|
memcpy(gaProjectileInfo, paProjectileInfo, sizeof(gaProjectileInfo));
|
||||||
|
delete[] paProjectileInfo;
|
||||||
|
paProjectileInfo = nil;
|
||||||
|
memcpy(CProjectileInfo::ms_apProjectile, paProjectiles, sizeof(CProjectileInfo::ms_apProjectile));
|
||||||
|
delete[] paProjectiles;
|
||||||
|
paProjectiles = nil;
|
||||||
|
//CExplosion::ClearAllExplosions(); not in III
|
||||||
|
#endif
|
||||||
DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
|
DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
|
||||||
DMAudio.SetRadioInCar(OldRadioStation);
|
DMAudio.SetRadioInCar(OldRadioStation);
|
||||||
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
|
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
|
||||||
@ -1576,10 +1616,10 @@ void CReplay::ProcessLookAroundCam(void)
|
|||||||
TheCamera.GetRight() = right;
|
TheCamera.GetRight() = right;
|
||||||
TheCamera.SetPosition(camera_pt);
|
TheCamera.SetPosition(camera_pt);
|
||||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
pm->pos = *(RwV3d*)&TheCamera.GetPosition();
|
pm->pos = TheCamera.GetPosition();
|
||||||
pm->at = *(RwV3d*)&TheCamera.GetForward();
|
pm->at = TheCamera.GetForward();
|
||||||
pm->up = *(RwV3d*)&TheCamera.GetUp();
|
pm->up = TheCamera.GetUp();
|
||||||
pm->right = *(RwV3d*)&TheCamera.GetRight();
|
pm->right = TheCamera.GetRight();
|
||||||
TheCamera.CalculateDerivedValues();
|
TheCamera.CalculateDerivedValues();
|
||||||
RwMatrixUpdate(RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera)));
|
RwMatrixUpdate(RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera)));
|
||||||
RwFrameUpdateObjects(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwFrameUpdateObjects(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
@ -1611,12 +1651,20 @@ void CReplay::Display()
|
|||||||
TimeCount = (TimeCount + 1) % UINT16_MAX;
|
TimeCount = (TimeCount + 1) % UINT16_MAX;
|
||||||
if ((TimeCount & 0x20) == 0)
|
if ((TimeCount & 0x20) == 0)
|
||||||
return;
|
return;
|
||||||
CFont::SetPropOn();
|
|
||||||
CFont::SetBackgroundOff();
|
|
||||||
CFont::SetScale(SCREEN_SCALE_X(1.5f), SCREEN_SCALE_Y(1.5f));
|
CFont::SetScale(SCREEN_SCALE_X(1.5f), SCREEN_SCALE_Y(1.5f));
|
||||||
CFont::SetAlignment(ALIGN_LEFT);
|
CFont::SetJustifyOff();
|
||||||
|
CFont::SetBackgroundOff();
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CFont::SetCentreSize(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-20));
|
||||||
|
#else
|
||||||
|
CFont::SetCentreSize(SCREEN_WIDTH-20);
|
||||||
|
#endif
|
||||||
|
CFont::SetCentreOff();
|
||||||
|
CFont::SetPropOn();
|
||||||
CFont::SetColor(CRGBA(255, 255, 200, 200));
|
CFont::SetColor(CRGBA(255, 255, 200, 200));
|
||||||
CFont::SetFontStyle(FONT_BANK);
|
CFont::SetFontStyle(FONT_BANK);
|
||||||
if (Mode == MODE_PLAYBACK)
|
if (Mode == MODE_PLAYBACK)
|
||||||
CFont::PrintString(SCREEN_SCALE_X(63.5f), SCREEN_SCALE_Y(30.0f), TheText.Get("REPLAY"));
|
CFont::PrintString(SCREEN_WIDTH/15, SCREEN_HEIGHT/10, TheText.Get("REPLAY"));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@ -63,6 +63,12 @@ struct CStoredDetailedAnimationState
|
|||||||
|
|
||||||
void PlayReplayFromHD(void);
|
void PlayReplayFromHD(void);
|
||||||
|
|
||||||
|
#ifdef GTA_REPLAY
|
||||||
|
#define REPLAY_STUB
|
||||||
|
#else
|
||||||
|
#define REPLAY_STUB {}
|
||||||
|
#endif
|
||||||
|
|
||||||
class CReplay
|
class CReplay
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
@ -269,24 +275,33 @@ private:
|
|||||||
static float fAlphaAngleLookAroundCam;
|
static float fAlphaAngleLookAroundCam;
|
||||||
static float fBetaAngleLookAroundCam;
|
static float fBetaAngleLookAroundCam;
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
|
static uint8* pGarages;
|
||||||
|
static CFire* FireArray;
|
||||||
|
static uint32 NumOfFires;
|
||||||
|
static uint8* paProjectileInfo;
|
||||||
|
static uint8* paProjectiles;
|
||||||
static int nHandleOfPlayerPed[NUMPLAYERS];
|
static int nHandleOfPlayerPed[NUMPLAYERS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void Init(void);
|
static void Init(void) REPLAY_STUB;
|
||||||
static void DisableReplays(void);
|
static void DisableReplays(void) REPLAY_STUB;
|
||||||
static void EnableReplays(void);
|
static void EnableReplays(void) REPLAY_STUB;
|
||||||
static void Update(void);
|
static void Update(void) REPLAY_STUB;
|
||||||
static void FinishPlayback(void);
|
static void FinishPlayback(void) REPLAY_STUB;
|
||||||
static void EmptyReplayBuffer(void);
|
static void EmptyReplayBuffer(void) REPLAY_STUB;
|
||||||
static void Display(void);
|
static void Display(void) REPLAY_STUB;
|
||||||
static void TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float cam_z, bool load_scene);
|
static void TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float cam_z, bool load_scene) REPLAY_STUB;
|
||||||
static void StreamAllNecessaryCarsAndPeds(void);
|
static void StreamAllNecessaryCarsAndPeds(void) REPLAY_STUB;
|
||||||
static bool ShouldStandardCameraBeProcessed(void);
|
|
||||||
|
|
||||||
|
#ifndef GTA_REPLAY
|
||||||
|
static bool ShouldStandardCameraBeProcessed(void) { return true; }
|
||||||
|
static bool IsPlayingBack() { return false; }
|
||||||
|
static bool IsPlayingBackFromFile() { return false; }
|
||||||
|
#else
|
||||||
|
static bool ShouldStandardCameraBeProcessed(void);
|
||||||
static bool IsPlayingBack() { return Mode == MODE_PLAYBACK; }
|
static bool IsPlayingBack() { return Mode == MODE_PLAYBACK; }
|
||||||
static bool IsPlayingBackFromFile() { return bPlayingBackFromFile; }
|
static bool IsPlayingBackFromFile() { return bPlayingBackFromFile; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void RecordThisFrame(void);
|
static void RecordThisFrame(void);
|
||||||
static void StorePedUpdate(CPed *ped, int id);
|
static void StorePedUpdate(CPed *ped, int id);
|
||||||
@ -314,4 +329,5 @@ private:
|
|||||||
|
|
||||||
/* Absolute nonsense, but how could this function end up being outside of class? */
|
/* Absolute nonsense, but how could this function end up being outside of class? */
|
||||||
friend void PlayReplayFromHD(void);
|
friend void PlayReplayFromHD(void);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -81,7 +81,7 @@ CRestart::FindClosestHospitalRestartPoint(const CVector &pos, CVector *outPos, f
|
|||||||
}
|
}
|
||||||
|
|
||||||
eLevelName curlevel = CTheZones::FindZoneForPoint(pos);
|
eLevelName curlevel = CTheZones::FindZoneForPoint(pos);
|
||||||
float fMinDist = 16000000.0f;
|
float fMinDist = SQR(4000.0f);
|
||||||
int closestPoint = NUM_RESTART_POINTS;
|
int closestPoint = NUM_RESTART_POINTS;
|
||||||
|
|
||||||
// find closest point on this level
|
// find closest point on this level
|
||||||
@ -128,7 +128,7 @@ CRestart::FindClosestPoliceRestartPoint(const CVector &pos, CVector *outPos, flo
|
|||||||
}
|
}
|
||||||
|
|
||||||
eLevelName curlevel = CTheZones::FindZoneForPoint(pos);
|
eLevelName curlevel = CTheZones::FindZoneForPoint(pos);
|
||||||
float fMinDist = 16000000.0f;
|
float fMinDist = SQR(4000.0f);
|
||||||
int closestPoint = NUM_RESTART_POINTS;
|
int closestPoint = NUM_RESTART_POINTS;
|
||||||
|
|
||||||
// find closest point on this level
|
// find closest point on this level
|
||||||
|
@ -90,8 +90,7 @@ CRoadBlocks::GenerateRoadBlockCopsForCar(CVehicle* pVehicle, int32 roadBlockType
|
|||||||
pCopPed->m_nRoadblockNode = roadBlockNode;
|
pCopPed->m_nRoadblockNode = roadBlockNode;
|
||||||
pCopPed->bCrouchWhenShooting = roadBlockType != 2;
|
pCopPed->bCrouchWhenShooting = roadBlockType != 2;
|
||||||
if (pEntityToAttack) {
|
if (pEntityToAttack) {
|
||||||
pCopPed->m_pPointGunAt = pEntityToAttack;
|
pCopPed->SetWeaponLockOnTarget(pEntityToAttack);
|
||||||
pEntityToAttack->RegisterReference(&pCopPed->m_pPointGunAt);
|
|
||||||
pCopPed->SetAttack(pEntityToAttack);
|
pCopPed->SetAttack(pEntityToAttack);
|
||||||
}
|
}
|
||||||
pCopPed->m_pMyVehicle = pVehicle;
|
pCopPed->m_pMyVehicle = pVehicle;
|
||||||
@ -165,7 +164,7 @@ CRoadBlocks::GenerateRoadBlocks(void)
|
|||||||
vehicleMatrix.GetPosition().z += fModelRadius - 0.6f;
|
vehicleMatrix.GetPosition().z += fModelRadius - 0.6f;
|
||||||
pVehicle->m_matrix = vehicleMatrix;
|
pVehicle->m_matrix = vehicleMatrix;
|
||||||
pVehicle->PlaceOnRoadProperly();
|
pVehicle->PlaceOnRoadProperly();
|
||||||
pVehicle->bIsStatic = false;
|
pVehicle->SetIsStatic(false);
|
||||||
pVehicle->m_matrix.UpdateRW();
|
pVehicle->m_matrix.UpdateRW();
|
||||||
pVehicle->m_nDoorLock = CARLOCK_UNLOCKED;
|
pVehicle->m_nDoorLock = CARLOCK_UNLOCKED;
|
||||||
CCarCtrl::JoinCarWithRoadSystem(pVehicle);
|
CCarCtrl::JoinCarWithRoadSystem(pVehicle);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include "SceneEdit.h"
|
#include "SceneEdit.h"
|
||||||
|
#ifdef GTA_SCENE_EDIT
|
||||||
#include "Automobile.h"
|
#include "Automobile.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "CarCtrl.h"
|
#include "CarCtrl.h"
|
||||||
@ -279,24 +279,44 @@ void CSceneEdit::Draw(void)
|
|||||||
#endif
|
#endif
|
||||||
sprintf(str, "Action");
|
sprintf(str, "Action");
|
||||||
AsciiToUnicode(str, wstr);
|
AsciiToUnicode(str, wstr);
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 0));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(ACTION_MESSAGE_X_RIGHT - SHADOW_OFFSET), SCREEN_SCALE_Y(ACTION_MESSAGE_Y + SHADOW_OFFSET), wstr);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(ACTION_MESSAGE_X_RIGHT - SHADOW_OFFSET), SCREEN_SCALE_Y(ACTION_MESSAGE_Y + SHADOW_OFFSET), wstr);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-ACTION_MESSAGE_X_RIGHT) + SHADOW_OFFSET, SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-ACTION_MESSAGE_Y) + SHADOW_OFFSET, wstr);
|
||||||
|
#endif
|
||||||
CFont::SetColor(CRGBA(193, 164, 120, 255));
|
CFont::SetColor(CRGBA(193, 164, 120, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(ACTION_MESSAGE_X_RIGHT), SCREEN_SCALE_Y(ACTION_MESSAGE_Y), wstr);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(ACTION_MESSAGE_X_RIGHT), SCREEN_SCALE_Y(ACTION_MESSAGE_Y), wstr);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-ACTION_MESSAGE_X_RIGHT), SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-ACTION_MESSAGE_Y), wstr);
|
||||||
|
#endif
|
||||||
sprintf(str, "Selected");
|
sprintf(str, "Selected");
|
||||||
AsciiToUnicode(str, wstr);
|
AsciiToUnicode(str, wstr);
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 0));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(SELECTED_MESSAGE_X_RIGHT - SHADOW_OFFSET), SCREEN_SCALE_Y(SELECTED_MESSAGE_Y + SHADOW_OFFSET), wstr);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(SELECTED_MESSAGE_X_RIGHT - SHADOW_OFFSET), SCREEN_SCALE_Y(SELECTED_MESSAGE_Y + SHADOW_OFFSET), wstr);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-SELECTED_MESSAGE_X_RIGHT) + SHADOW_OFFSET, SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-SELECTED_MESSAGE_Y) + SHADOW_OFFSET, wstr);
|
||||||
|
#endif
|
||||||
CFont::SetColor(CRGBA(193, 164, 120, 255));
|
CFont::SetColor(CRGBA(193, 164, 120, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(SELECTED_MESSAGE_X_RIGHT), SCREEN_SCALE_Y(SELECTED_MESSAGE_Y), wstr);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(SELECTED_MESSAGE_X_RIGHT), SCREEN_SCALE_Y(SELECTED_MESSAGE_Y), wstr);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-SELECTED_MESSAGE_X_RIGHT), SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-SELECTED_MESSAGE_Y), wstr);
|
||||||
|
#endif
|
||||||
CFont::SetCentreOff();
|
CFont::SetCentreOff();
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::SetScale(SCREEN_SCALE_X(0.7f), SCREEN_SCALE_Y(0.7f));
|
CFont::SetScale(SCREEN_SCALE_X(0.7f), SCREEN_SCALE_Y(0.7f));
|
||||||
|
#else
|
||||||
|
CFont::SetScale(0.7f, 0.7f);
|
||||||
|
#endif
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
CFont::SetFontStyle(FONT_BANK);
|
CFont::SetFontStyle(FONT_BANK);
|
||||||
#else
|
#else
|
||||||
CFont::SetFontStyle(FONT_HEADING);
|
CFont::SetFontStyle(FONT_HEADING);
|
||||||
#endif
|
#endif
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 0));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
for (int i = 0; i < NUM_COMMANDS_TO_DRAW; i++) {
|
for (int i = 0; i < NUM_COMMANDS_TO_DRAW; i++) {
|
||||||
int16 nCommandDrawn = m_nCurrentCommand + i - NUM_COMMANDS_TO_DRAW / 2;
|
int16 nCommandDrawn = m_nCurrentCommand + i - NUM_COMMANDS_TO_DRAW / 2;
|
||||||
if (nCommandDrawn >= MOVIE_TOTAL_COMMANDS)
|
if (nCommandDrawn >= MOVIE_TOTAL_COMMANDS)
|
||||||
@ -305,13 +325,21 @@ void CSceneEdit::Draw(void)
|
|||||||
nCommandDrawn += (MOVIE_TOTAL_COMMANDS - 1);
|
nCommandDrawn += (MOVIE_TOTAL_COMMANDS - 1);
|
||||||
sprintf(str, "%s", pCommandStrings[nCommandDrawn]);
|
sprintf(str, "%s", pCommandStrings[nCommandDrawn]);
|
||||||
AsciiToUnicode(str, wstr);
|
AsciiToUnicode(str, wstr);
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 0));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(COMMAND_NAME_X_RIGHT - SHADOW_OFFSET), SCREEN_SCALE_Y(COMMAND_NAME_Y + SHADOW_OFFSET + i * COMMAND_NAME_HEIGHT), wstr);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(COMMAND_NAME_X_RIGHT - SHADOW_OFFSET), SCREEN_SCALE_Y(COMMAND_NAME_Y + SHADOW_OFFSET + i * COMMAND_NAME_HEIGHT), wstr);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-COMMAND_NAME_X_RIGHT) + SHADOW_OFFSET, SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-COMMAND_NAME_Y) + SHADOW_OFFSET + i * COMMAND_NAME_HEIGHT), wstr);
|
||||||
|
#endif
|
||||||
if (nCommandDrawn == m_nCurrentCommand)
|
if (nCommandDrawn == m_nCurrentCommand)
|
||||||
CFont::SetColor(CRGBA(156, 91, 40, 255));
|
CFont::SetColor(CRGBA(156, 91, 40, 255));
|
||||||
else
|
else
|
||||||
CFont::SetColor(CRGBA(193, 164, 120, 255));
|
CFont::SetColor(CRGBA(193, 164, 120, 255));
|
||||||
|
#ifdef FIX_BUGS
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(COMMAND_NAME_X_RIGHT), SCREEN_SCALE_Y(COMMAND_NAME_Y + i * COMMAND_NAME_HEIGHT), wstr);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(COMMAND_NAME_X_RIGHT), SCREEN_SCALE_Y(COMMAND_NAME_Y + i * COMMAND_NAME_HEIGHT), wstr);
|
||||||
|
#else
|
||||||
|
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-COMMAND_NAME_X_RIGHT), SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-COMMAND_NAME_Y) + i * COMMAND_NAME_HEIGHT), wstr);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1096,3 +1124,4 @@ bool CSceneEdit::SelectWeapon(void)
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#ifdef GTA_SCENE_EDIT
|
||||||
class CPed;
|
class CPed;
|
||||||
class CVehicle;
|
class CVehicle;
|
||||||
|
|
||||||
@ -93,3 +93,4 @@ public:
|
|||||||
static void SelectVehicle(void);
|
static void SelectVehicle(void);
|
||||||
static bool SelectWeapon(void);
|
static bool SelectWeapon(void);
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "Ped.h"
|
||||||
#include "PedType.h"
|
#include "PedType.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
#include "Sprite2d.h"
|
#include "Sprite2d.h"
|
||||||
@ -13,8 +14,35 @@ class CPlayerInfo;
|
|||||||
|
|
||||||
class CRunningScript;
|
class CRunningScript;
|
||||||
|
|
||||||
|
extern int32 ScriptParams[32];
|
||||||
|
|
||||||
|
void FlushLog();
|
||||||
|
#define script_assert(_Expression) FlushLog(); assert(_Expression);
|
||||||
|
|
||||||
|
#define PICKUP_PLACEMENT_OFFSET 0.5f
|
||||||
|
#define PED_FIND_Z_OFFSET 5.0f
|
||||||
|
|
||||||
|
#define SPHERE_MARKER_R 0
|
||||||
|
#define SPHERE_MARKER_G 128
|
||||||
|
#define SPHERE_MARKER_B 255
|
||||||
|
#define SPHERE_MARKER_A 128
|
||||||
|
#define SPHERE_MARKER_PULSE_PERIOD 2048
|
||||||
|
#define SPHERE_MARKER_PULSE_FRACTION 0.1f
|
||||||
|
|
||||||
|
#ifdef USE_PRECISE_MEASUREMENT_CONVERTION
|
||||||
|
#define METERS_IN_FOOT 0.3048f
|
||||||
|
#define FEET_IN_METER 3.28084f
|
||||||
|
#else
|
||||||
|
#define METERS_IN_FOOT 0.3f
|
||||||
|
#define FEET_IN_METER 3.33f
|
||||||
|
#endif
|
||||||
|
|
||||||
#define KEY_LENGTH_IN_SCRIPT 8
|
#define KEY_LENGTH_IN_SCRIPT 8
|
||||||
|
|
||||||
|
#if GTA_VERSION <= GTA_PS2_160
|
||||||
|
#define GTA_SCRIPT_COLLECTIVE
|
||||||
|
#endif
|
||||||
|
|
||||||
struct intro_script_rectangle
|
struct intro_script_rectangle
|
||||||
{
|
{
|
||||||
bool m_bIsUsed;
|
bool m_bIsUsed;
|
||||||
@ -190,8 +218,8 @@ enum {
|
|||||||
|
|
||||||
struct tCollectiveData
|
struct tCollectiveData
|
||||||
{
|
{
|
||||||
int32 index;
|
int32 colIndex;
|
||||||
uint32 unk_data;
|
int32 pedIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -263,7 +291,7 @@ class CTheScripts
|
|||||||
static bool StoreVehicleWasRandom;
|
static bool StoreVehicleWasRandom;
|
||||||
static CRunningScript *pIdleScripts;
|
static CRunningScript *pIdleScripts;
|
||||||
static CRunningScript *pActiveScripts;
|
static CRunningScript *pActiveScripts;
|
||||||
static uint32 NextFreeCollectiveIndex;
|
static int32 NextFreeCollectiveIndex;
|
||||||
static int32 LastRandomPedId;
|
static int32 LastRandomPedId;
|
||||||
static uint16 NumberOfUsedObjects;
|
static uint16 NumberOfUsedObjects;
|
||||||
static bool bAlreadyRunningAMissionScript;
|
static bool bAlreadyRunningAMissionScript;
|
||||||
@ -370,12 +398,36 @@ private:
|
|||||||
static int32 GetNewUniqueScriptSphereIndex(int32 index);
|
static int32 GetNewUniqueScriptSphereIndex(int32 index);
|
||||||
static void RemoveScriptSphere(int32 index);
|
static void RemoveScriptSphere(int32 index);
|
||||||
|
|
||||||
|
#ifdef GTA_SCRIPT_COLLECTIVE
|
||||||
|
static void AdvanceCollectiveIndex()
|
||||||
|
{
|
||||||
|
if (NextFreeCollectiveIndex == INT32_MAX)
|
||||||
|
NextFreeCollectiveIndex = 0;
|
||||||
|
else
|
||||||
|
NextFreeCollectiveIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int AddPedsInVehicleToCollective(int);
|
||||||
|
static int AddPedsInAreaToCollective(float, float, float, float);
|
||||||
|
static int FindFreeSlotInCollectiveArray();
|
||||||
|
static void SetObjectiveForAllPedsInCollective(int, eObjective, int16, int16);
|
||||||
|
static void SetObjectiveForAllPedsInCollective(int, eObjective, CVector, float);
|
||||||
|
static void SetObjectiveForAllPedsInCollective(int, eObjective, CVector);
|
||||||
|
static void SetObjectiveForAllPedsInCollective(int, eObjective, void*);
|
||||||
|
static void SetObjectiveForAllPedsInCollective(int, eObjective);
|
||||||
|
#endif
|
||||||
|
|
||||||
friend class CRunningScript;
|
friend class CRunningScript;
|
||||||
friend class CHud;
|
friend class CHud;
|
||||||
friend void CMissionCleanup::Process();
|
friend void CMissionCleanup::Process();
|
||||||
#ifdef FIX_BUGS
|
#ifdef MISSION_REPLAY
|
||||||
friend void RetryMission(int, int);
|
friend void RetryMission(int, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MISSION_SWITCHER
|
||||||
|
public:
|
||||||
|
static void SwitchToMission(int32 mission);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -483,6 +535,14 @@ private:
|
|||||||
void CharInAreaCheckCommand(int32, uint32*);
|
void CharInAreaCheckCommand(int32, uint32*);
|
||||||
void CarInAreaCheckCommand(int32, uint32*);
|
void CarInAreaCheckCommand(int32, uint32*);
|
||||||
|
|
||||||
|
#ifdef GTA_SCRIPT_COLLECTIVE
|
||||||
|
void LocateCollectiveCommand(int32, uint32*);
|
||||||
|
void LocateCollectiveCharCommand(int32, uint32*);
|
||||||
|
void LocateCollectiveCarCommand(int32, uint32*);
|
||||||
|
void LocateCollectivePlayerCommand(int32, uint32*);
|
||||||
|
void CollectiveInAreaCheckCommand(int32, uint32*);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MISSION_REPLAY
|
#ifdef MISSION_REPLAY
|
||||||
bool CanAllowMissionReplay();
|
bool CanAllowMissionReplay();
|
||||||
#endif
|
#endif
|
||||||
@ -514,6 +574,8 @@ private:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
friend class CTheScripts;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef MISSION_REPLAY
|
#ifdef MISSION_REPLAY
|
||||||
|
1555
src/control/Script2.cpp
Normal file
1555
src/control/Script2.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2360
src/control/Script3.cpp
Normal file
2360
src/control/Script3.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2177
src/control/Script4.cpp
Normal file
2177
src/control/Script4.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2517
src/control/Script5.cpp
Normal file
2517
src/control/Script5.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user