Compare commits

..

28 Commits

Author SHA1 Message Date
withmorten 3233ffe1c4
Merge pull request #1233 from madebr/cmake-fixes
Fix cmake installation with conan
2021-09-03 00:38:46 +02:00
Sergeanur 3569b7edfe Fix ped comments on oal 2021-09-02 19:22:29 +03:00
Sergeanur a15d5589b3 Fix reflection counter 2021-09-02 18:49:49 +03:00
Sergeanur d23c045d11 Audio: small refactoring 2021-09-02 18:30:15 +03:00
Sergeanur 3bc6aa85da Audio: a bit more PS2 changes 2021-09-02 17:52:11 +03:00
Sergeanur 5aa149f0bc PS2 ProcessReverb 2021-09-02 12:58:42 +03:00
Sergeanur 8c1f1cc7b8 PS2 mission audio length 2021-09-02 12:43:15 +03:00
Sergeanur 9b511d28ec Audio: PS2 cAudioManager::ServicePoliceRadioChannel 2021-09-02 08:31:22 +03:00
Sergeanur c41239ed5e Ped comments fixes 2021-09-02 08:00:04 +03:00
Sergeanur 787f1922f4 Audio: fix types for IsSampleBankLoaded/IsPedCommentLoaded, reverse ProcessSpecial from PS2 2021-09-02 07:13:35 +03:00
withmorten 6d44cee7c2 fix librw to be most recent 2021-09-01 15:57:05 +02:00
Sergeanur 6c3cb330c1 Audio: PS2 mission audio 2021-09-01 13:25:47 +03:00
Sergeanur 57757e6c6f Audio: PS2 pager code 2021-09-01 10:44:38 +03:00
Sergeanur 1c426fdff1 Audio: some PS2 code 2021-09-01 08:09:33 +03:00
Sergeanur bcdeb71070 Audio: ps2 code ifdef 2021-08-30 11:25:14 +03:00
Nikolay Korolev 9bb34fab25 ps2 fix 2021-08-29 19:45:52 +03:00
Nikolay Korolev 8593fff48b fix PS2 script 2021-08-29 19:36:44 +03:00
Sergeanur 55e950fe84 Audio: fixing bugs, fixing types, making code more accurate to original 2021-08-29 09:42:24 +03:00
Nikolay af543350db
Merge pull request #1322 from x87/master
Mention CLEO Redux
2021-08-28 14:16:45 +03:00
x87 9c71524583
Mention CLEO Redux 2021-08-27 13:29:32 -04:00
Nikolay Korolev 399fb28f77 fix debug teleport 2021-08-26 21:50:19 +03:00
Sergeanur 2e02aed5d5 Fix acceleration sound on exiting the vehicle 2021-08-26 08:15:03 +03:00
Nikolay Korolev 885467bcd0 keep noinline only for broken vs versions 2021-08-26 01:24:31 +03:00
Sergeanur 5017e09dd0 Refactor cPedComments 2021-08-25 13:41:29 +03:00
Sergeanur ee93e4bc7d Audio: refactoring, type fixes, renaming cAudioManager fields 2021-08-25 08:49:42 +03:00
Sergeanur 9ecca45bf3 Audio: fix PS2 ifdefs 2021-08-24 15:24:28 +03:00
Anonymous Maarten 152148d71f conan: copy gamefiles to source folder so cmake install succeeds 2021-07-12 18:00:04 +02:00
Anonymous Maarten 3d922c90e9 cmake: add _INSTALL cmake option 2021-07-12 18:00:02 +02:00
441 changed files with 102376 additions and 158231 deletions

24
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,24 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Version**
Tell us what version you're running. Find out using the debug menu (Ctrl-M, Debug -> Version Text)
If you send a screenshot just enable it beforehand.

View File

@ -1,4 +1,4 @@
name: reVC conan+cmake
name: re3 conan+cmake
on:
pull_request:
push:
@ -96,13 +96,13 @@ jobs:
conan export re3mss miles-sdk/master@
- name: "Download/build dependencies (conan install)"
run: |
conan install ${{ github.workspace }} reVC/master@ -if build -o reVC:audio=${{ matrix.audio }} -o librw:platform=${{ matrix.platform }} -o librw:gl3_gfxlib=${{ matrix.gl3_gfxlib || 'glfw' }} --build missing -pr:h ./host_profile -pr:b default -s reVC:build_type=RelWithDebInfo -s librw:build_type=RelWithDebInfo
conan install ${{ github.workspace }} re3/master@ -if build -o re3:audio=${{ matrix.audio }} -o librw:platform=${{ matrix.platform }} -o librw:gl3_gfxlib=${{ matrix.gl3_gfxlib || 'glfw' }} --build missing -pr:h ./host_profile -pr:b default -s re3:build_type=RelWithDebInfo -s librw:build_type=RelWithDebInfo
env:
CONAN_SYSREQUIRES_MODE: enabled
- name: "Build reVC (conan build)"
- name: "Build re3 (conan build)"
run: |
conan build ${{ github.workspace }} -if build -bf build -pf package
- name: "Package reVC (conan package)"
- name: "Package re3 (conan package)"
run: |
conan package ${{ github.workspace }} -if build -bf build -pf package
- name: "Create binary package (cpack)"
@ -113,5 +113,5 @@ jobs:
uses: actions/upload-artifact@v2
with:
name: "${{ matrix.os }}-${{ matrix.platform }}"
path: build/*.tar.xz
path: build/*.zip
if-no-files-found: error

View File

@ -1,5 +1,4 @@
name: reVC cmake devkitA64 (Nintendo Switch)
name: re3 cmake devkitA64 (Nintendo Switch)
on:
pull_request:
push:
@ -15,7 +14,7 @@ jobs:
submodules: 'true'
- name: "Build files"
run: |
/opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -S. -Bbuild -DREVC_AUDIO=OAL -DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=GLFW -DREVC_WITH_OPUS=False -DREVC_VENDORED_LIBRW=True -DREVC_INSTALL=True
/opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -S. -Bbuild -DRE3_AUDIO=OAL -DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=GLFW -DRE3_WITH_OPUS=False -DRE3_VENDORED_LIBRW=True -DRE3_INSTALL=True
cmake --build build --parallel
- name: "Create binary package (cpack)"
working-directory: ./build
@ -25,5 +24,5 @@ jobs:
uses: actions/upload-artifact@v2
with:
name: "switch-gl3"
path: build/*.tar.xz
path: build/*.zip
if-no-files-found: error

View File

@ -1,4 +1,4 @@
name: reVC premake amd64
name: re3 premake amd64
on:
pull_request:
@ -37,14 +37,14 @@ jobs:
./premake5 vs2019 --with-librw --no-full-paths --glfwdir64=${{env.GLFW_BASE}}
- name: Build
run: |
msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
# - name: Pack artifacts
# run: |
# 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
# 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
- name: Move binaries to gamefiles
run: |
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.exe ./gamefiles/
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.pdb ./gamefiles/
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.exe ./gamefiles/
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.pdb ./gamefiles/
- name: Move dynamic dependencies to gamefiles
run: |
mv ./vendor/mpg123/dist/Win64/libmpg123-0.dll ./gamefiles/
@ -52,12 +52,12 @@ jobs:
- name: Upload artifact to actions
uses: actions/upload-artifact@v2
with:
name: reVC_${{matrix.buildtype}}_${{matrix.platform}}
name: re3_${{matrix.buildtype}}_${{matrix.platform}}
path: ./gamefiles/*
# - name: Upload artifact to Bintray
# uses: hpcsc/upload-bintray-docker-action@v1
# with:
# repository: reVC
# repository: re3
# package: ${{matrix.buildtype}}_${{matrix.platform}}
# version: 1.0-$(echo ${GITHUB_SHA}
# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}}

View File

@ -1,4 +1,4 @@
name: reVC premake x86
name: re3 premake x86
on:
pull_request:
@ -37,14 +37,14 @@ jobs:
./premake5 vs2019 --with-librw --no-full-paths --glfwdir32=${{env.GLFW_BASE}}
- name: Build
run: |
msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
# - name: Pack artifacts
# run: |
# 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
# 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
- name: Move binaries to gamefiles
run: |
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.exe ./gamefiles/
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.pdb ./gamefiles/
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.exe ./gamefiles/
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.pdb ./gamefiles/
- if: contains(matrix.platform, 'oal')
name: Move dynamic dependencies to gamefiles
run: |
@ -53,12 +53,12 @@ jobs:
- name: Upload artifact to actions
uses: actions/upload-artifact@v2
with:
name: reVC_${{matrix.buildtype}}_${{matrix.platform}}
name: re3_${{matrix.buildtype}}_${{matrix.platform}}
path: ./gamefiles/*
# - name: Upload artifact to Bintray
# uses: hpcsc/upload-bintray-docker-action@v1
# with:
# repository: reVC
# repository: re3
# package: ${{matrix.buildtype}}_${{matrix.platform}}
# version: 1.0-$(echo ${GITHUB_SHA}
# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}}

4
.gitignore vendored
View File

@ -355,8 +355,8 @@ vendor/glfw-3.3.2.bin.WIN64/
sdk/
codewarrior/reVC.mcp
codewarrior/reVC_Data/
codewarrior/re3.mcp
codewarrior/re3_Data/
codewarrior/Release/
codewarrior/Debug/

View File

@ -20,9 +20,9 @@
"src/peds",
"src/renderer",
"src/rw",
"src/save",
"src/save/glfw",
"src/skel",
"src/save/",
"src/skel/",
"src/skel/glfw",
"src/text",
"src/vehicles",
"src/weapons",

View File

@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.14)
set(EXECUTABLE reVC)
set(PROJECT REVC)
set(EXECUTABLE re3)
set(PROJECT RE3)
project(${EXECUTABLE} C CXX)
set(${PROJECT}_AUTHOR "${PROJECT} Team")
@ -11,14 +11,13 @@ include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1 "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}")
if(NINTENDO_SWITCH)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/nx")
include(NXFunctions)
endif()
if(NOT COMMAND reVC_platform_target)
function(reVC_platform_target)
if(NOT COMMAND re3_platform_target)
function(re3_platform_target)
endfunction()
endif()
@ -30,6 +29,7 @@ endif()
set(${PROJECT}_AUDIO "OAL" CACHE STRING "Audio")
option(${PROJECT}_INSTALL "Enable installation of ${EXECUTABLE} + gamefiles" OFF)
option(${PROJECT}_WITH_OPUS "Build ${EXECUTABLE} with opus support" OFF)
option(${PROJECT}_WITH_LIBSNDFILE "Build ${EXECUTABLE} with libsndfile (instead of internal decoder)" OFF)
@ -95,6 +95,6 @@ if(${PROJECT}_INSTALL)
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
set(CPACK_GENERATOR "TXZ")
set(CPACK_GENERATOR "ZIP")
include(CPack)
endif()

View File

@ -1,6 +1,6 @@
<img src="https://github.com/GTAmodding/re3/blob/miami/res/images/logo_1024.png?raw=true" alt="reVC logo" width="200">
<img src="https://github.com/GTAmodding/re3/blob/master/res/images/logo_1024.png?raw=true" alt="re3 logo" width="200">
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FGTAmodding%2Fre3%2Fbadge%3Fref%3Dmiami&style=flat)](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=miami)
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FGTAmodding%2Fre3%2Fbadge%3Fref%3Dmaster&style=flat)](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=master)
<a href="https://discord.gg/RFNbjsUMGg"><img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" /></a>
## Intro
@ -12,25 +12,29 @@ Rendering is handled either by original RenderWare (D3D8)
or the reimplementation [librw](https://github.com/aap/librw) (D3D9, OpenGL 2.1 or above, OpenGL ES 2.0 or above).\
Audio is done with MSS (using dlls from original GTA) or OpenAL.
The project has also been ported to the [Nintendo Switch](https://github.com/AGraber/re3-nx/),
[Playstation Vita](https://github.com/Rinnegatamante/re3) and
[Nintendo Wii U](https://github.com/GaryOderNichts/re3-wiiu/).
We cannot build for PS2 or Xbox yet. If you're interested in doing so, get in touch with us.
## Installation
- reVC requires game assets to work, so you **must** own [a copy of GTA Vice City](https://store.steampowered.com/app/12110/Grand_Theft_Auto_Vice_City/).
- Build reVC or download the latest build:
- [Windows D3D9 MSS 32bit](https://nightly.link/GTAmodding/re3/workflows/reVC_msvc_x86/miami/reVC_Release_win-x86-librw_d3d9-mss.zip)
- [Windows D3D9 64bit](https://nightly.link/GTAmodding/re3/workflows/reVC_msvc_amd64/miami/reVC_Release_win-amd64-librw_d3d9-oal.zip)
- [Windows OpenGL 64bit](https://nightly.link/GTAmodding/re3/workflows/reVC_msvc_amd64/miami/reVC_Release_win-amd64-librw_gl3_glfw-oal.zip)
- [Linux 64bit](https://nightly.link/GTAmodding/re3/workflows/build-cmake-conan/miami/ubuntu-18.04-gl3.zip)
- [MacOS 64bit x86-64](https://nightly.link/GTAmodding/re3/workflows/build-cmake-conan/miami/macos-latest-gl3.zip)
- Extract the downloaded zip over your GTA VC directory and run reVC. The zip includes the binary, updated and additional gamefiles and in case of OpenAL the required dlls.
- re3 requires PC game assets to work, so you **must** own [a copy of GTA III](https://store.steampowered.com/app/12100/Grand_Theft_Auto_III/).
- Build re3 or download the latest build:
- [Windows D3D9 MSS 32bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_x86/master/re3_Release_win-x86-librw_d3d9-mss.zip)
- [Windows D3D9 64bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_amd64/master/re3_Release_win-amd64-librw_d3d9-oal.zip)
- [Windows OpenGL 64bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_amd64/master/re3_Release_win-amd64-librw_gl3_glfw-oal.zip)
- [Linux 64bit](https://nightly.link/GTAmodding/re3/workflows/build-cmake-conan/master/ubuntu-18.04-gl3.zip)
- [MacOS 64bit x86-64](https://nightly.link/GTAmodding/re3/workflows/build-cmake-conan/master/macos-latest-gl3.zip)
- Extract the downloaded zip over your GTA 3 directory and run re3. The zip includes the binary, updated and additional gamefiles and in case of OpenAL the required dlls.
## Screenshots
![screen_ 1613087332](https://user-images.githubusercontent.com/1521437/107714111-f84f3200-6ccc-11eb-902e-d757481d579a.png)
![screen_ 1613086852](https://user-images.githubusercontent.com/1521437/107714115-fa18f580-6ccc-11eb-9de5-eb4cd04865d3.png)
![screen_ 1613086989](https://user-images.githubusercontent.com/1521437/107714103-f38a7e00-6ccc-11eb-88a3-c8c2033c51d6.png)
![screen_ 1613087193](https://user-images.githubusercontent.com/1521437/107714106-f4bbab00-6ccc-11eb-96a9-13821d9b9684.png)
![re3 2021-02-11 22-57-03-23](https://user-images.githubusercontent.com/1521437/107704085-fbdabd00-6cbc-11eb-8406-8951a80ccb16.png)
![re3 2021-02-11 22-43-44-98](https://user-images.githubusercontent.com/1521437/107703339-cbdeea00-6cbb-11eb-8f0b-07daa105d470.png)
![re3 2021-02-11 22-46-33-76](https://user-images.githubusercontent.com/1521437/107703343-cd101700-6cbb-11eb-9ccd-012cb90524b7.png)
![re3 2021-02-11 22-50-29-54](https://user-images.githubusercontent.com/1521437/107703348-d00b0780-6cbb-11eb-8afd-054249c2b95e.png)
## Improvements
@ -40,22 +44,25 @@ Some of them can be toggled at runtime, some cannot.
* Fixed a lot of smaller and bigger bugs
* User files (saves and settings) stored in GTA root directory
* Settings stored in reVC.ini file instead of gta_vc.set
* Settings stored in re3.ini file instead of gta3.set
* Debug menu to do and change various things (Ctrl-M to open)
* Debug camera (Ctrl-B to toggle)
* Rotatable camera
* XInput controller support (Windows)
* No loading screens between islands ("map memory usage" in menu)
* Skinned ped support (models from Xbox or Mobile)
* Rendering
* Widescreen support (properly scaled HUD, Menu and FOV)
* PS2 MatFX (vehicle reflections)
* PS2 alpha test (better rendering of transparency)
* PS2 particles
* Xbox vehicle rendering
* Xbox world lightmap rendering (needs Xbox map)
* Xbox ped rim light
* Xbox screen rain droplets
* More customizable colourfilter
* Menu
* Map
* More options
* Controller configuration menu
* ...
@ -68,6 +75,7 @@ The following things would be nice to have/do:
* Fix physics for high FPS
* Improve performance on lower end devices, especially the OpenGL layer on the Raspberry Pi (if you have experience with this, please get in touch)
* Compare code with PS2 code (tedious, no good decompiler)
* [PS2 port](https://github.com/GTAmodding/re3/wiki/PS2-port)
* Xbox port (not quite as important)
* reverse remaining unused/debug functions
@ -77,7 +85,9 @@ The following things would be nice to have/do:
Asset modifications (models, texture, handling, script, ...) should work the same way as with original GTA for the most part.
Mods that make changes to the code (dll/asi, CLEO, limit adjusters) will *not* work.
CLEO scripts work with [CLEO Redux](https://github.com/cleolibrary/CLEO-Redux).
Mods that make changes to the code (dll/asi, limit adjusters) will *not* work.
Some things these mods do are already implemented in re3 (much of SkyGFX, GInput, SilentPatch, Widescreen fix),
others can easily be achieved (increasing limis, see `config.h`),
others will simply have to be rewritten and integrated into the code directly.
@ -85,9 +95,9 @@ Sorry for the inconvenience.
## Building from Source
When using premake, you may want to point GTA_VC_RE_DIR environment variable to GTA Vice City root folder if you want the executable to be moved there via post-build script.
When using premake, you may want to point GTA_III_RE_DIR environment variable to GTA3 root folder if you want the executable to be moved there via post-build script.
Clone the repository with `git clone --recursive -b miami https://github.com/GTAmodding/re3.git reVC`. Then `cd reVC` into the cloned repository.
Clone the repository with `git clone --recursive https://github.com/GTAmodding/re3.git`. Then `cd re3` into the cloned repository.
<details><summary>Linux Premake</summary>
@ -102,7 +112,7 @@ Install python and conan, and then run build.
conan export vendor/librw librw/master@
mkdir build
cd build
conan install .. reVC/master@ -if build -o reVC:audio=openal -o librw:platform=gl3 -o librw:gl3_gfxlib=glfw --build missing -s reVC:build_type=RelWithDebInfo -s librw:build_type=RelWithDebInfo
conan install .. re3/master@ -if build -o re3:audio=openal -o librw:platform=gl3 -o librw:gl3_gfxlib=glfw --build missing -s re3:build_type=RelWithDebInfo -s librw:build_type=RelWithDebInfo
conan build .. -if build -bf build -pf package
```
</details>
@ -123,8 +133,8 @@ For FreeBSD using premake, proceed: [Building on FreeBSD](https://github.com/GTA
Assuming you have Visual Studio 2015/2017/2019:
- Run one of the `premake-vsXXXX.cmd` variants on root folder.
- Open build/reVC.sln with Visual Studio and compile the solution.
- Open build/re3.sln with Visual Studio and compile the solution.
Microsoft recently discontinued its downloads of the DX9 SDK. You can download an archived version here: https://archive.org/details/dxsdk_jun10
**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).
@ -132,11 +142,11 @@ Microsoft recently discontinued its downloads of the DX9 SDK. You can download a
> :information_source: premake has an `--with-lto` option if you want the project to be compiled with Link Time Optimization.
> :information_source: There are various settings in [config.h](https://github.com/GTAmodding/re3/tree/miami/src/core/config.h), you may want to take a look there.
> :information_source: There are various settings in [config.h](https://github.com/GTAmodding/re3/tree/master/src/core/config.h), you may want to take a look there.
> :information_source: reVC 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: 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.
If you feel the need, you can also use CodeWarrior 7 to compile reVC using the supplied codewarrior/reVC.mcp project - this requires the original RW34 libraries, and the DX8 SDK. The build is unstable compared to the MSVC builds though, and is mostly meant to serve as a reference.
If you feel the need, you can also use CodeWarrior 7 to compile re3 using the supplied codewarrior/re3.mcp project - this requires the original RW33 libraries, and the DX8 SDK. The build is unstable compared to the MSVC builds though, and is mostly meant to serve as a reference.
## Contributing
As long as it's not linux/cross-platform skeleton/compatibility layer, all of the code on the repo that's not behind a preprocessor condition(like FIX_BUGS) are **completely** reversed code from original binaries.

View File

@ -8,7 +8,7 @@ endif()
set(CMAKE_EXECUTABLE_SUFFIX ".elf")
function(reVC_platform_target TARGET)
function(re3_platform_target TARGET)
cmake_parse_arguments(RPT "INSTALL" "" "" ${ARGN})
get_target_property(TARGET_TYPE "${TARGET}" TYPE)

File diff suppressed because it is too large Load Diff

View File

@ -5,8 +5,8 @@ import shutil
import textwrap
class ReVCConan(ConanFile):
name = "reVC"
class Re3Conan(ConanFile):
name = "re3"
version = "master"
license = "???" # FIXME: https://github.com/GTAmodding/re3/issues/794
settings = "os", "arch", "compiler", "build_type"
@ -60,7 +60,7 @@ class ReVCConan(ConanFile):
self.requires("opusfile/0.12")
def export_sources(self):
for d in ("cmake", "src"):
for d in ("cmake", "gamefiles", "src"):
shutil.copytree(src=d, dst=os.path.join(self.export_sources_folder, d))
self.copy("CMakeLists.txt")
@ -69,10 +69,10 @@ class ReVCConan(ConanFile):
raise ConanInvalidConfiguration("Only `glfw` is supported as gl3_gfxlib.")
#if not self.options.with_opus:
# if not self.options["libsndfile"].with_external_libs:
# raise ConanInvalidConfiguration("reVC with opus support requires a libsndfile built with external libs (=ogg/flac/opus/vorbis)")
# raise ConanInvalidConfiguration("re3 with opus support requires a libsndfile built with external libs (=ogg/flac/opus/vorbis)")
@property
def _reVC_audio(self):
def _re3_audio(self):
return {
"miles": "MSS",
"openal": "OAL",
@ -111,16 +111,16 @@ class ReVCConan(ConanFile):
include("{}/conanbuildinfo.cmake")
conan_basic_setup(TARGETS NO_OUTPUT_DIRS)
add_subdirectory("{}" reVC)
add_subdirectory("{}" re3)
""").format(self.install_folder.replace("\\", "/"),
self.source_folder.replace("\\", "/")))
except FileNotFoundError:
pass
cmake = CMake(self)
cmake.definitions["REVC_AUDIO"] = self._reVC_audio
cmake.definitions["REVC_WITH_OPUS"] = self.options.with_opus
cmake.definitions["REVC_INSTALL"] = True
cmake.definitions["REVC_VENDORED_LIBRW"] = False
cmake.definitions["RE3_AUDIO"] = self._re3_audio
cmake.definitions["RE3_WITH_OPUS"] = self.options.with_opus
cmake.definitions["RE3_INSTALL"] = True
cmake.definitions["RE3_VENDORED_LIBRW"] = False
env = {}
if self._os_is_playstation2:
cmake.definitions["CMAKE_TOOLCHAIN_FILE"] = self.deps_user_info["ps2dev-cmaketoolchain"].cmake_toolchain_file

BIN
gamefiles/TEXT/JAPANESE.gxt Normal file

Binary file not shown.

Binary file not shown.

BIN
gamefiles/TEXT/english.gxt Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
gamefiles/TEXT/polish.gxt Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

363
gamefiles/data/PARTICLE.CFG Normal file
View File

@ -0,0 +1,363 @@
; Author: Alexander Roger
; Date: 21/12/2000
;
; Author: Andrzej Madajczyk
; Date: 26/02/2001
; 14/03/2001 - Alpha (opacity) support added;
; 10/05/2001 - Drag/Friction Decceleration changed to constants;
; 28/08/2001 - Initial Color Variation added;
;
;
;
;
; Note! Last line of the file MUST BE ";the end\n", otherwise you'll get parsing error(s) of the file;
;
;
;
;Particle Systems Configuration Data:: Format
;
;
;A: Particle Type Name (max 20 chars)
;
;B/C/D: Render Colouring (r,g,b) (0-255)
;
;CV: Initial Color Variation (for r,g,b only, in %) (0-100);
; (i.e. Color=(100,100,100) and CV=20, then v=random(-20,20), real_color=(100+v, 100+v, 100+v));
;
;
;
;B2/C2/D2: Fade Destination Color (r,g,b) (0-255)
;
;FT: Color Fade Time for (B,C,D)->(B2,C2,D2), (0 for none);
;
;
;
;
;E: Default Initial Radius (float)
;F: Expansion Rate (float)
;
;
; Color "Fade-to-Black" options:
;G: Initial Intensity (0-255)
;H: Fade Time (time between fade steps in frames)
;I: Fade Amount (-255 to 255) can get brighter or dimmer
;
; "Fade Alpha" options:
;GA: Initial Intensity (0-255)
;HA: Fade Time (time between fade steps in frames)
;IA: Fade Amount
;
; "Z Rotation" options:
;GZA: Initial Angle (0-1023)
;HZA: Change Time (time between steps in frames)
;IZA: Angle Change Amount
;
;GZR: Initial Z Radius
;HZR: Change Time (time between steps in frames)
;IZR: Z Radius Change Amount
;
;
;J: Animation Speed (0=no animation)(time between steps msec)
;K: Start Animation Frame ( 0 -> )
;L: Final Animation Frame ( H -> )
;
;
;M: Rotation Speed (0=None,i-deg/frame)
;N: Gravitational Acceleration (0=none, float)
;O: Drag/Friction Decceleration (int: 0=none, 50=0.50, 80=0.80, 90=0.90, 95=0.95, 96=0.96, 99=0.99)
;
;P: Default Life-Span of Particle (msec)
;
;Q: Position Random Error [position += (+/-)rand(a)]
;R: Velocity Random Error [velocity += (+/-)rand(b)]
;S: Expansion Rate Error [exp_rate += (+)rand(c)]
;T: Rotation Rate Error [rot_speed = (+/-)rand(d)]
;U: Life-Span Error Shape [shape distribution, e=0->all at default, e->Inf then shape->0] (max=255!!)
;V: Trail Length Multiplier [length *= (float) multiplier] (only used if trail flag active)
;
;CR:Particle Create Range (in meters: 0=no check); if particles are created enough far away from camera, they are deleted (not added to particle system);
;
;
;Z: Flags! Guide: 1=ZCHECK_FIRST, 2=ZCHECK_STEP, 4=DRAW_OPAQUE, 8=SCREEN_TRAIL,
; 16=SPEED_TRAIL, 32=RAND_VERT_V, 64=CYCLE_ANIM, 128=DRAW_DARK, 256=VERT_TRAIL
; 1024=DRAWTOP2D, 2048=CLIPOUT2D
; 4096=ZCHECK_BUMP, 8192=ZCHECK_BUMP_FIRST
;
;
;
;default:
;GUNFLASH 255 255 255 0 0.1 0.0 255 0 128 0 0 0 0 0.0 1.0 250 0.0 0.0 0.0 0 0 1.0 0
;
;good idea for fire-smudge?
;GUNFLASH 255 255 255 0 1.0 0.0 255 0 32 100 0 3 0 0.0 1.0 400 0.0 0.0 0.0 0 0 1.0 0
;
;current:
;GUNFLASH 255 255 255 0 1.0 0.0 255 0 32 100 0 3 0 0.0 1.0 400 0.0 0.0 0.0 0 0 1.0 0
;
;
;SPARK_SMALL 255 255 128 0 0.005 0.0 255 0 0 0 0 0 0 0.0 1.0 500 0.0 0.05 0.0 0 0 0.5 40
;
;
;
;
;
;
;
; A B C D CV B2 C2 D2 FT E F G H I GA HA IA GZA HZA IZA GZR HZR IZR J K L M N O P Q R S T U V CR Z
;
SPARK 255 128 64 0 0 0 0 0 0.005 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.001 1 300 0.0 0.07 0.0 0 0 1.0 20.0 48
SPARK_SMALL 255 255 128 0 0 0 0 0 0.005 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.001 1 500 0.0 0.05 0.0 0 0 0.6 20.0 40
;
WHEEL_DIRT 8 24 8 0 0 0 0 0 0.05 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.002 1 1000 0.15 0.015 0.0 0 0 1.0 30.0 4
;
;
;WHEEL_WATER 24 24 24 0 0 0 0 0 0.05 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.002 1 1000 0.15 0.015 0.0 0 0 1.0 20.0 0
WHEEL_WATER 24 24 32 0 0 0 0 0 0.05 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.004 1 1000 0.15 0.015 0.0 0 0 1.0 20.0 1
;
;
BLOOD 128 128 128 0 0 0 0 0 0.02 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.03 1 2000 0.3 0.05 0.0 0 0 1.0 50.0 5
BLOOD_SMALL 255 32 32 0 0 0 0 0 0.007 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.005 1 2000 0.05 0.05 0.0 0 0 1.0 50.0 53
;BLOOD_SPLAT 128 128 128 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 200 0.3 0.0 0.0 0 0 1.0 400.0 36
BLOOD_SPURT 255 32 32 0 0 0 0 0 0.008 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.005 1 2000 0.0 0.01 0.0 0 0 2.0 50.0 52
DEBRIS 64 64 64 0 0 0 0 0 0.5 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 95 1000 0.2 0.0 0.0 0 0 1.0 50.0 4
DEBRIS2 64 64 64 0 0 0 0 0 0.04 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 5 0.01 99 1000 0.03 0.04 0.0 0 0 1.0 50.0 38
WATER 64 64 128 0 0 0 0 0 0.01 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 2000 0.0 0.0 0.0 0 0 1.0 100.0 0
;
;
;FLAME 255 74 30 0 0 0 0 0 0.2 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 0.0 1 100 0.05 0.0 0.0 0 0 1.0 400.0 0
;FLAME 255 74 30 0 0 255 0 400 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 1 2000 0.02 0.01 0.01 0 0 1.0 200.0 0
FLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 1 2000 0.02 0.01 0.01 0 0 1.0 200.0 0
;
;
;
;FIREBALL 255 74 30 0 0 0 0 0 0.1 0.04 255 1 8 255 0 0 0 0 0 0.0 0 0.0 32 0 7 0 0.0 96 1000 0.1 0.0 0.0 0 0 1.0 400.0 0
;
;FIREBALL 255 74 30 0 0 0 0 0 0.1 0.05 255 0 6 255 0 0 0 0 0 0.0 0 0.0 1 0 7 0 -0.002 96 2000 0.1 0.02 0.02 3 0 1.0 200.0 0
FIREBALL 255 74 30 0 0 0 0 0 0.1 0.02 255 0 6 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.003 96 2000 0.1 0.03 0.014 2.5 0 1.0 200.0 0
;
;
;
GUNFLASH 170 170 170 0 0 0 0 0 0.1 0.0 255 1 50 255 0 0 0 0 0 0.0 0 0.0 51 0 3 0 0.0 1 250 0.0 0.0 0.0 0 0 1.0 35.0 0
GUNFLASH_NOANIM 128 128 128 0 0 0 0 0 0.1 0.0 255 1 128 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 25 0.0 0.0 0.0 0 0 1.0 35.0 0
;
GUNSMOKE 64 64 64 0 0 0 0 0 0.15 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 2 0 7 0 -0.002 95 1000 0.0 0.0 0.0 0 0 1.0 60.0 0
GUNSMOKE2 255 255 255 0 0 0 0 0 0.05 0.02 255 0 0 255 0 8 0 0 0 0.0 0 0.0 0 0 3 4 -0.001 80 1400 0.05 0.05 0.01 3 0 1.0 60.0 4
;
;
SMOKE 32 32 32 0 0 0 0 0 0.15 0.015 255 5 25 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.01 95 1000 0.05 0.05 0.01 3 0 1.0 150.0 0
;SMOKE_SLOWMOTION 32 32 32 0 0 0 0 0 0.15 0.015 255 5 15 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.003 95 1000 0.05 0.05 0.01 3 0 1.0 400.0 0
SMOKE_SLOWMOTION 32 32 32 0 0 0 0 0 0.15 0.015 128 5 11 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.003 95 3000 0.05 0.05 0.01 3 0 1.0 150.0 0
;
;
;
;GARAGEPAINT_SPRAY 32 32 32 0 0 0 0 0 0.15 0.015 255 0 5 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 -0.001 95 2000 0.05 0.05 0.01 3 0 1.0 400.0 0
GARAGEPAINT_SPRAY 32 32 32 0 0 0 0 0 0.15 0.015 255 0 5 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 -0.0005 95 4000 0.05 0.05 0.01 3 0 1.0 100.0 0
SHARD 255 255 255 0 0 0 0 0 0.03 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 96 300 0.0 0.0 0.0 0 0 1.0 100.0 0
SPLASH 64 64 128 0 0 0 0 0 0.1 0.007 255 1 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 100.0 0
;BLOOD_SPLASH 24 64 0 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 96 300 0.0 0.0 0.0 0 0 1.0 100.0 0
;
;
;CARFLAME 255 74 30 0 0 0 0 0 0.5 0.04 255 2 20 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 0.0 1 1000 0.4 0.0 0.0 0 0 1.0 400.0 64
;CARFLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.001 1 2000 0.4 0.01 0.01 0 0 1.0 400.0 64
;CARFLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.001 1 2000 0.4 0.01 0.01 0 0 1.0 400.0 64
;
CARFLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 1 2000 0.02 0.01 0.01 0 0 1.0 100.0 0
;
;
STEAM 64 64 64 0 0 0 0 0 0.5 0.05 255 1 16 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 85.0 0
;
;default:
;STEAM2 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 128 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 400.0 4
STEAM2 255 255 255 0 0 0 0 0 0.5 0.015 255 0 0 192 0 1 0 0 10 0.5 1 0.02 32 0 4 0 -0.002 95 8000 0.01 0.03 0.0 0 0 1.0 85.0 4
;
;
;STEAM_NY 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 128 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 400.0 4
STEAM_NY 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 96 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 1400 0.01 0.03 0.0 0 0 1.0 85.0 4
STEAM_NY_SLOWMOTION 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 96 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.0015 95 1400 0.01 0.03 0.0 0 0 1.0 85.0 4
;
;
;ENGINE_STEAM 210 210 210 0 0 0 0 0 0.5 0.05 255 0 0 192 2 16 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 250.0 4
ENGINE_STEAM 210 210 210 0 0 0 0 0 0.5 0.05 255 0 0 192 0 10 0 0 0 0.0 0 0.0 32 0 4 1 -0.005 95 4000 0.03 0.03 0.02 0 0 1.0 85.0 4
;
;
;RAINDROP 32 32 32 0 0 0 0 0 0.6 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.025 1 1000 0.0 0.0 0.0 0 0 1.0 15.0 1
RAINDROP 64 64 64 0 0 0 0 0 0.4 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 3 0 0.05 1 1000 0.0 0.0 0.0 0 0 1.0 15.0 1
RAINDROP_SMALL 16 16 16 0 0 0 0 0 0.3 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.05 1 1000 0.0 0.0 0.0 0 0 1.0 15.0 1
RAIN_SPLASH 32 32 32 0 0 0 0 0 0.08 0.0 255 0 5 255 0 0 0 0 0 0.0 0 0.0 1 0 4 0 0.0 1 500 0.0 0.0 0.0 0 0 1.0 15.0 0
RAIN_SPLASH_BIGGROW 128 128 128 0 0 0 0 0 0.5 0.06 255 0 2 255 0 0 0 0 0 0.0 0 0.0 2 1 4 0 0.0 1 5500 0.0 0.0 0.0 0 0 1.0 15.0 0
RAIN_SPLASHUP 48 48 48 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 1 0 0.0 1 50 0.0 0.0 0.0 0 0 1.0 15.0 0
;
WATERSPRAY 64 64 64 0 0 0 0 0 0.2 0.0 255 0 25 255 0 0 0 0 0 0.0 0 0.0 3 0 2 0 0.002 1 800 0.05 0.0 0.01 0 0 1.0 20.0 0
;
;
;
;EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 5 8 255 0 0 0 0 0 0.0 0 0.0 8 0 11 0 0.0 96 15000 0.2 0.0 0.0 3 0 1.0 400.0 0
;EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 5 8 255 0 0 0 0 0 0.0 0 0.0 8 0 11 0 0.0 96 15000 0.8 0.0 0.0 3 0 1.0 400.0 0
;EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 1 4 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 0.0 96 7000 0.2 0.0 0.0 0 0 1.0 400.0 0
;EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 1 4 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 0.0 96 7000 0.8 0.0 0.0 0 0 1.0 400.0 0
;
;EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 -0.001 96 6000 0.2 0.0 0.0 0 0 1.0 400.0 0
;EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 -0.001 96 6000 0.8 0.0 0.0 0 0 1.0 400.0 0
EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 6000 0.2 0.0 0.0 0 0 1.0 200.0 0
EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 6000 0.8 0.0 0.0 0 0 1.0 200.0 0
EXPLOSION_MFAST 80 80 80 0 0 0 0 0 0.6 0.04 255 0 6 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 3500 0.2 0.0 0.0 0 0 1.0 200.0 0
EXPLOSION_LFAST 80 80 80 0 0 0 0 0 1.1 0.04 255 0 6 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 3500 0.8 0.0 0.0 0 0 1.0 200.0 0
;
;
;
;
;BOAT_SPLASH 32 64 32 0 0 0 0 0 0.2 0.2 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 2000 0.0 0.0 0.0 0 0 1.0 200.0 0
;BOAT_THRUSTJET 24 32 24 0 0 0 0 0 0.5 0.1 255 0 0 255 0 0 0 0 0 0.0 0 0.0 250 0 4 0 0.01 50 1000 0.0 0.0 0.0 0 4 1.0 200.0 8
;BOAT_SPLASH 16 32 32 0 0 0 0 0 0.2 0.2 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 2000 0.0 0.0 0.0 0 0 1.0 200.0 0
;BOAT_THRUSTJET 8 24 24 0 0 0 0 0 0.5 0.1 255 0 0 255 0 0 0 0 0 0.0 0 0.0 250 0 4 0 0.01 50 1000 0.0 0.0 0.0 0 4 1.0 200.0 8
;CAR_SPLASH 64 64 64 0 0 0 0 0 2.0 0.25 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.02 1 2000 0.0 0.0 0.0 0 0 1.0 250.0 0
;CAR_SPLASH 64 64 64 0 0 0 0 0 2.0 0.25 255 0 0 200 0 8 0 0 0 0.0 0 0.0 0 0 0 0 0.04 1 2000 0.0 0.0 0.0 0 0 1.0 150.0 4
;CAR_SPLASH 64 64 64 0 0 0 0 0 2.0 0.35 255 0 0 200 0 8 0 0 0 0.0 0 0.0 0 0 0 0 0.05 1 2000 0.0 0.0 0.0 0 0 1.0 150.0 4
;CAR_SPLASH 64 64 64 0 0 0 0 0 1.0 0.25 255 0 0 180 0 5 0 0 0 0.0 0 0.0 2 1 3 0 0.05 1 1000 0.0 0.0 0.0 0 0 1.0 150.0 12
;
;
;CAR_SPLASH 64 64 64 0 0 0 0 0 1.0 0.15 255 0 0 180 0 2 0 0 0 0.0 0 0.0 2 0 3 0 0.02 1 2000 0.0 0.0 0.0 0 0 1.0 150.0 12
;CAR_SPLASH 48 48 64 0 0 0 0 0 1.0 0.15 96 0 0 255 0 0 0 0 0 0.0 0 0.0 6 0 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 2.0 150.0 288
;CAR_SPLASH 48 48 64 0 0 0 0 0 1.0 0.05 96 0 0 255 0 0 0 0 0 0.0 0 0.0 0 1 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 2.0 150.0 288
; A B C D CV B2 C2 D2 FT E F G H I GA HA IA GZA HZA IZA GZR HZR IZR J K L M N O P Q R S T U V CR Z
CAR_SPLASH 48 48 60 0 0 0 0 0 1.0 0.00 128 1 4 128 0 0 0 0 0 0.0 0 0.0 0 0 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 1.4 150.0 272
;
;
;
;BOAT_SPLASH 70 70 70 0 0 0 0 0 0.2 0.2 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 1000 0.0 0.0 0.0 0 0 1.0 150.0 0
BOAT_SPLASH 64 64 64 0 0 0 0 0 0.2 0.2 255 0 2 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 1000 0.0 0.0 0.0 0 0 1.0 150.0 0
;
;
;BOAT_THRUSTJET 90 90 90 0 0 0 0 0 1.8 0.1 255 0 0 120 0 1 0 0 0 0.0 0 0.0 0 1 4 0 0.01 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
BOAT_THRUSTJET 90 90 90 0 0 0 0 0 1.4 0.06 255 0 0 96 0 1 0 0 0 0.0 0 0.0 0 1 4 0 0.01 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
;
;
;BOAT_WAKE 255 255 255 0 0 0 0 0 2.0 0.2 255 0 0 128 0 1 0 0 0 0.0 0 0.0 0 0 0 0 0.03 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
BOAT_WAKE 255 255 255 0 0 0 0 0 1.5 0.45 255 0 0 192 0 2 0 0 0 0.0 0 0.0 0 0 0 0 0.0 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
;
;
;
;
;
; A B C D CV B2 C2 D2 FT E F G H I GA HA IA GZA HZA IZA GZR HZR IZR J K L M N O P Q R S T U V CR Z
WATER_HYDRANT 64 64 64 0 0 0 0 0 0.8 0.01 255 1 16 255 1 16 0 0 0 0.0 0 0.0 0 0 2 0 0.007 99 500 0.02 0.08 0.0 0 4 1.0 85.0 16
WATER_CANNON 64 64 128 0 0 0 0 0 0.03 0.03 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
EXTINGUISH_STEAM 32 32 32 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
;
;
;
;PED_SPLASH 32 32 64 0 0 0 0 0 0.1 0.05 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
PED_SPLASH 48 48 60 0 0 0 0 0 0.1 0.06 96 0 0 255 0 0 0 0 0 0.0 0 0.0 0 1 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 1.4 50.0 256
;
;
PEDFOOT_DUST 170 166 150 0 0 0 0 0 0.01 0.015 255 0 0 63 0 4 0 0 0 0.0 0 0.0 0 0 0 0 -0.0005 1 1000 0.0 0.0 0.0 0 0 1.0 6.0 4
;
HELI_DUST 17 15 9 0 0 0 0 0 0.2 0.1 255 1 8 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.001 1 1000 0.2 0.05 0.0 0 0 1.0 85.0 0
HELI_ATTACK 255 255 128 0 0 0 0 0 0.01 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 500 0.0 0.0 0.0 0 0 0.5 85.0 10
;
;
;ENGINE_SMOKE 16 16 16 0 0 0 0 0 0.5 0.04 255 0 0 63 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 150.0 4
;ENGINE_SMOKE2 8 8 8 0 0 0 0 0 1.0 0.2 128 2 4 63 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.001 1 1000 0.0 0.0 0.0 0 3 1.0 150.0 4
ENGINE_SMOKE 16 16 16 0 0 0 0 0 0.5 0.04 255 0 0 52 0 2 10 0 80 0.0 0 0.0 0 0 5 2 -0.009 95 2000 0.11 0.03 0.01 1 0 1.0 85.0 4
ENGINE_SMOKE2 9 9 9 80 0 0 0 0 1.0 0.06 128 0 1 140 0 5 10 0 80 0.0 0 0.0 0 0 0 2 0.002 1 1300 0.0 0.01 0.0 3 3 1.0 85.0 4
;
;
CARFLAME_SMOKE 32 32 32 0 0 0 0 0 0.05 0.01 255 0 0 64 0 2 0 0 0 0.0 0 0.0 0 0 0 0 -0.008 95 2000 0.01 0.03 0.01 0 0 1.0 85.0 4
FIREBALL_SMOKE 32 32 32 0 0 0 0 0 0.05 0.03 255 0 0 128 0 2 0 0 0 0.0 0 0.0 0 0 0 0 -0.004 95 2000 0.01 0.03 0.01 0 0 1.0 85.0 4
;
PAINT_SMOKE 255 0 0 0 0 0 0 0 0.1 0.01 255 1 8 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 95 3000 0.0 0.005 0.0 0 0 1.0 85.0 0
TREE_LEAVES 64 64 64 0 0 0 0 0 0.2 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
;
;
;CARCOLLISION_DUST 224 224 224 0 0 0 0 0 0.15 0.04 255 0 0 127 1 8 0 0 0 0.0 0 0.0 0 0 0 0 -0.002 90 2000 0.02 0.02 0.0 0 0 1.0 80.0 4
CARCOLLISION_DUST 76 76 76 0 0 0 0 0 0.10 0.02 255 0 0 160 0 4 0 0 0 0.0 0 0.0 0 0 0 0 -0.0015 90 2000 0.02 0.02 0.0 0 0 1.0 30.0 4
;
;
CAR_DEBRIS 32 32 32 0 0 0 0 0 0.5 0.0 224 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 50.0 4
HELI_DEBRIS 32 32 32 0 0 0 0 0 1.5 0.0 224 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.065 90 1500 0.02 0.02 0.0 0 0 1.0 150.0 4
;
;
;
;EXHAUST_FUMES 80 80 80 0 0 0 0 0 0.03 0.03 255 0 0 122 0 4 0 0 0 0.0 0 0.0 2 0 4 0 -0.001 95 1500 0.01 0.03 0.0 0 0 1.0 50.0 4
EXHAUST_FUMES 98 98 108 0 0 0 0 0 0.03 0.06 255 0 0 152 0 12 0 0 0 0.0 0 0.0 2 0 4 0 -0.002 96 1000 0.01 0.03 0.0 0 0 1.0 25.0 4
;
;
;RUBBER 40 40 40 0 0 0 0 0 0.4 0.005 255 21 20 255 0 0 0 0 0 0.0 0 0.0 3 0 4 0 -0.0005 1 1000 0.02 0.0 0.0 0 0 1.0 400.0 4
RUBBER_SMOKE 255 255 255 0 0 0 0 0 0.4 0.005 255 0 0 127 1 8 0 0 0 0.0 0 0.0 3 0 4 0 -0.0005 1 1000 0.02 0.0 0.0 0 0 1.0 50.0 4
;BURNINGRUBBER_SMOKE128 128 128 0 0 0 0 0 0.35 0.06 255 0 0 192 1 6 0 0 0 0.0 0 0.0 0 0 0 0 -0.002 90 4000 0.02 0.02 0.0 0 0 1.0 400.0 4
BURNINGRUBBER_SMOKE 128 128 128 0 0 0 0 0 0.35 0.06 255 0 0 128 0 4 0 0 0 0.0 0 0.0 0 0 0 0 -0.002 90 2000 0.02 0.02 0.0 0 0 1.0 50.0 4
;
;
BULLETHIT_SMOKE 192 192 192 0 0 0 0 0 0.15 0.03 70 0 2 255 1 10 0 0 0 0.0 0 0.0 0 0 0 0 -0.001 90 2000 0.04 0.02 0.0 0 0 1.0 150.0 0
;
;
GUNSHELL_FIRST 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 0.0 12292
GUNSHELL 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 12.0 4100
GUNSHELL_BUMP1 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 8.0 4100
GUNSHELL_BUMP2 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 400 0.02 0.02 0.0 0 0 1.0 8.0 4100
;
;
TEST 255 64 64 0 0 0 0 0 0.2 0.025 255 1 20 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 3000 0.0 0.0 0.0 0 0 1.0 400.0 128
;
;
;Particles with flag DRAWTOP2D should be placed last and VR (Visibility Range) set to 0!
;
;BIRD_FRONT 8 8 8 0 0 0 0 0 0.05 0.0 255 0 0 255 2 1 0 0 0 0.0 0 0.0 1 0 3 0 0.0 1 10000 0.0 0.0 0.0 0 0 1.0 0.0 3140
BIRD_FRONT 8 8 8 0 0 0 0 0 1.05 0.0 255 0 0 255 2 2 0 0 0 0.0 0 0.0 1 0 3 0 0.0 1 8000 0.0 0.0 0.0 0 0 1.0 0.0 68
;
RAINDROP_2D 32 32 32 0 0 0 0 0 0.5 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 1 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 0.0 3072
;
;
;
;
;
;
;
;
;
;
;
;
; below is just backup of above values:
;
;SPARK 255 128 64 0.005 0.0 255 0 0 0 0 0 0 0.0 1.0 300 0.0 0.07 0.0 0 0 1.0 48
;SPARK_SMALL 255 255 128 0.005 0.0 255 0 0 0 0 0 0 0.0 1.0 500 0.0 0.05 0.0 0 0 0.6 40
;BLOOD 128 128 128 0.02 0.0 255 0 0 0 0 0 0 0.03 1.0 2000 0.3 0.05 0.0 0 0 1.0 6
;BLOOD_SMALL 255 32 32 0.007 0.0 255 0 0 0 0 0 0 0.005 1.0 2000 0.05 0.05 0.0 0 0 1.0 54
;BLOOD_SPLAT 128 128 128 0.1 0.0 255 0 0 0 0 0 0 0.0 1.0 200 0.3 0.0 0.0 0 0 1.0 36
;BLOOD_SPURT 255 32 32 0.008 0.0 255 0 0 0 0 0 0 0.005 1.0 2000 0.0 0.01 0.0 0 0 2.0 52
;DEBRIS 64 64 64 0.5 0.0 255 0 0 0 0 0 0 0.01 0.95 1000 0.2 0.0 0.0 0 0 1.0 4
;DEBRIS2 64 64 64 0.04 0.0 255 0 0 0 0 0 5 0.01 0.99 1000 0.03 0.04 0.0 0 0 1.0 38
;WATER 64 64 128 0.01 0.0 255 0 0 0 0 0 0 0.0 1.0 2000 0.0 0.0 0.0 0 0 1.0 0
;FLAME 255 74 30 0.2 0.0 255 0 0 31 0 5 0 0.0 1.0 100 0.05 0.0 0.0 0 0 1.0 0
;FIREBALL 255 74 30 0.1 0.04 255 0 8 31 0 8 0 0.0 0.96 1000 0.1 0.0 0.0 0 0 1.0 0
;GUNFLASH 255 255 255 0.1 0.0 255 0 50 50 0 3 0 0.0 1.0 250 0.0 0.0 0.0 0 0 1.0 0
;GUNFLASHSTATIC 255 255 255 0.1 0.0 255 0 128 0 0 0 0 0.0 1.0 25 0.0 0.0 0.0 0 0 1.0 0
;SMOKE 32 32 32 0.15 0.015 255 4 25 31 0 5 0 -0.01 0.95 1000 0.05 0.05 0.01 3 0 1.0 0
;SHARD 255 255 255 0.03 0.0 255 0 0 0 0 0 0 0.0 0.96 300 0.0 0.0 0.0 0 0 1.0 0
;SPLASH 64 64 128 0.1 0.007 255 0 10 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
;BLOOD_SPLASH 24 64 0 0.1 0.0 255 0 0 0 0 0 0 0.0 0.96 300 0.0 0.0 0.0 0 0 1.0 0
;RUBBER 40 40 40 0.4 0.005 255 1 25 31 0 5 0 0.0 1.0 1000 0.02 0.0 0.0 0 0 1.0 0
;CARFLAME 255 74 30 0.5 0.04 255 1 20 31 0 5 0 0.0 1.0 1000 0.4 0.0 0.0 0 0 1.0 64
;STEAM 64 64 64 0.5 0.05 255 0 16 31 0 5 0 -0.005 0.95 2000 0.01 0.03 0.0 0 0 1.0 0
;RAINDROP 32 32 32 0.6 0.0 255 0 0 0 0 0 0 0.1 1.0 1000 0.0 0.0 0.0 0 0 1.0 1
;RAIN_SPLASH 32 32 32 0.08 0.0 255 0 0 1 0 4 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
;RAINDROP_SMALL 32 32 32 0.3 0.0 255 0 0 0 0 0 0 0.1 1.0 1000 0.0 0.0 0.0 0 0 1.0 1
;EXPLOSION_MEDIUM 80 80 80 0.6 0.04 255 4 8 7 0 11 0 0.0 0.96 30000 0.2 0.0 0.0 3 0 1.0 0
;EXPLOSION_LARGE 80 80 80 1.1 0.04 255 4 8 7 0 11 0 0.0 0.96 30000 0.8 0.0 0.0 3 0 1.0 0
;BOAT_SPLASH 32 64 32 0.2 0.2 255 0 0 0 0 0 0 0.01 1.0 2000 0.0 0.0 0.0 0 0 1.0 0
;BOAT_THRUSTJET 24 32 24 0.5 0.1 255 0 0 250 0 5 0 0.01 0.5 1000 0.0 0.0 0.0 0 4 1.0 8
;WATER_HYDRANT 64 64 128 0.4 0.01 255 1 2 20 0 5 0 0.007 0.99 500 0.02 0.05 0.0 0 4 1.0 256
;WATER_CANNON 64 64 128 0.03 0.03 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
;EXTINGUISH_STEAM 32 32 32 0.1 0.0 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
;PED_SPLASH 32 32 64 0.1 0.05 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
;HELI_DUST 17 15 9 0.2 0.1 255 0 8 0 0 0 0 -0.001 1.0 1000 0.2 0.05 0.0 0 0 1.0 0
;HELI_ATTACK 255 255 128 0.01 0.0 255 0 0 0 0 0 0 0.0 1.0 500 0.0 0.0 0.0 0 0 0.5 10
;ENGINE_SMOKE 16 16 16 0.5 0.04 255 0 0 0 0 0 0 -0.005 0.95 2000 0.01 0.03 0.0 0 0 1.0 4
;ENGINE_SMOKE2 4 4 4 1.0 0.2 255 1 4 0 0 0 0 0.001 1.0 1000 0.0 0.0 0.0 0 3 1.0 4
;PAINT_SMOKE 255 0 0 0.1 0.01 255 0 8 0 0 0 0 0.0 0.95 3000 0.0 0.005 0.0 0 0 1.0 0
;TREE_LEAVES 64 64 64 0.2 0.0 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
;TEST 255 64 64 0.2 0.05 255 0 16 0 0 0 0 0.0 1.0 3000 0.0 0.0 0.0 0 0 1.0 128
;
;
;the end

Binary file not shown.

BIN
gamefiles/data/main_d.scm Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
gamefiles/models/menu.txd Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,104 +1,104 @@
# Fresnel RO Table
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # Midnight
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 1am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 2am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 3am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 4am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 5am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 6am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 7am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 8am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 9am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 10am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 11am
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # Midday
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 1pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 2pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 3pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 4pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 5pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 6pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 7pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 8pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 9pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 10pm
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 11pm
# Specular Power Table (ther higher, the tighter the highlite)
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
25 15 70 10 15 15 18 # Midnight
25 15 70 10 15 15 18 # 1am
25 15 70 10 15 15 18 # 2am
25 15 70 10 15 15 18 # 3am
25 15 70 10 15 15 18 # 4am
25 15 70 10 15 15 18 # 5am
25 15 70 10 15 15 18 # 6am
25 15 70 10 15 15 18 # 7am
25 15 70 10 15 15 18 # 8am
25 15 70 10 15 15 18 # 9am
25 15 70 10 15 15 18 # 10am
25 15 70 10 15 15 18 # 11am
25 15 70 10 15 15 18 # Midday
25 15 70 10 15 15 18 # 1pm
25 15 70 10 15 15 18 # 2pm
25 15 70 10 15 15 18 # 3pm
25 15 70 10 15 15 18 # 4pm
25 15 70 10 15 15 18 # 5pm
25 15 70 10 15 15 18 # 6pm
25 15 70 10 15 15 18 # 7pm
25 15 70 10 15 15 18 # 8pm
25 15 70 10 15 15 18 # 9pm
25 15 70 10 15 15 18 # 10pm
25 15 70 10 15 15 18 # 11pm
# Diffuse Colour Modifier Table (Red,Green,Blue,Amount)
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midnight
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midday
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11pm
# Specular Colour Table (Red,Green,Blue,Ignored)
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # Midnight
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 1am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 2am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 3am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 4am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 5am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 6am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 7am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 8am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 9am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 10am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 11am
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # Midday
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 1pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 2pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 3pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 4pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 5pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 6pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 7pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 8pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 9pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 10pm
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 11pm
# Fresnal RO Table
# SUNNY CLOUDY RAINY, FOGGY
0.400000 0.400000 0.400000 0.150000 # Midnight
0.400000 0.400000 0.400000 0.150000 # 1am
0.400000 0.400000 0.400000 0.150000 # 2am
0.400000 0.400000 0.400000 0.150000 # 3am
0.400000 0.400000 0.400000 0.150000 # 4am
0.400000 0.400000 0.400000 0.150000 # 5am
0.400000 0.400000 0.400000 0.150000 # 6am
0.400000 0.400000 0.400000 0.150000 # 7am
0.400000 0.400000 0.400000 0.150000 # 8am
0.400000 0.400000 0.400000 0.150000 # 9am
0.400000 0.400000 0.400000 0.150000 # 10am
0.400000 0.400000 0.400000 0.150000 # 11am
0.400000 0.400000 0.400000 0.150000 # Midday
0.400000 0.400000 0.400000 0.150000 # 1pm
0.400000 0.400000 0.400000 0.150000 # 2pm
0.400000 0.400000 0.400000 0.150000 # 3pm
0.400000 0.400000 0.400000 0.150000 # 4pm
0.400000 0.400000 0.400000 0.150000 # 5pm
0.400000 0.400000 0.400000 0.150000 # 6pm
0.400000 0.400000 0.400000 0.150000 # 7pm
0.400000 0.400000 0.400000 0.150000 # 8pm
0.400000 0.400000 0.400000 0.150000 # 9pm
0.400000 0.400000 0.400000 0.150000 # 10pm
0.400000 0.400000 0.400000 0.150000 # 11pm
# Specular Power Table
# SUNNY CLOUDY RAINY, FOGGY
128.000000 80.000000 30.000000 128.000000 # Midnight
128.000000 80.000000 30.000000 128.000000 # 1am
128.000000 80.000000 30.000000 128.000000 # 2am
128.000000 80.000000 30.000000 128.000000 # 3am
128.000000 80.000000 30.000000 128.000000 # 4am
80.000000 60.000000 30.000000 128.000000 # 5am
80.000000 60.000000 30.000000 128.000000 # 6am
80.000000 60.000000 30.000000 128.000000 # 7am
80.000000 60.000000 30.000000 128.000000 # 8am
80.000000 60.000000 30.000000 128.000000 # 9am
80.000000 60.000000 30.000000 128.000000 # 10am
80.000000 60.000000 30.000000 128.000000 # 11am
80.000000 60.000000 30.000000 128.000000 # Midday
80.000000 60.000000 30.000000 128.000000 # 1pm
80.000000 60.000000 30.000000 128.000000 # 2pm
80.000000 60.000000 30.000000 128.000000 # 3pm
80.000000 60.000000 30.000000 128.000000 # 4pm
128.000000 80.000000 30.000000 128.000000 # 5pm
128.000000 80.000000 30.000000 128.000000 # 6pm
128.000000 80.000000 30.000000 128.000000 # 7pm
128.000000 80.000000 30.000000 128.000000 # 8pm
128.000000 80.000000 30.000000 128.000000 # 9pm
128.000000 80.000000 30.000000 128.000000 # 10pm
128.000000 80.000000 30.000000 128.000000 # 11pm
# Diffuse Colour Modifier Table (Red,Green,Blue,Amount)
# SUNNY CLOUDY RAINY, FOGGY
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midnight
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11am
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midday
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10pm
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11pm
# Specular Colour Table (Red,Green,Blue,Amount)
# SUNNY CLOUDY RAINY, FOGGY
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # Midnight
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 1am
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 2am
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 3am
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 4am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 5am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 6am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 7am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 8am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 9am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 10am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 11am
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # Midday
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 1pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 2pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 3pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 4pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 5pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 6pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 7pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 8pm
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 9pm
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 10pm
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 11pm

Binary file not shown.

View File

@ -1,130 +1,130 @@
# Ramp Start Table
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # Midnight
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 1am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 2am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 3am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 4am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 5am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 6am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 7am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 8am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 9am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 10am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 11am
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # Midday
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 1pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 2pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 3pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 4pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 5pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 6pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 7pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 8pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 9pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 10pm
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 11pm
# Ramp End Table
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # Midnight
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 1am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 2am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 3am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 4am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 5am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 6am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 7am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 8am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 9am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 10am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 11am
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # Midday
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 1pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 2pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 3pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 4pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 5pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 6pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 7pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 8pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 9pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 10pm
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 11pm
# Offset Table
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # Midnight
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 1am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 2am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 3am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 4am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 5am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 6am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 7am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 8am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 9am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 10am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 11am
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # Midday
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 1pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 2pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 3pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 4pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 5pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 6pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 7pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 8pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 9pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 10pm
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 11pm
# Scale Table (the lentgh of the light band?)
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
1 0.5 1.5 0.5 1.5 1.5 1.5 # Midnight
1 0.5 1.5 0.5 1.5 1.5 1.5 # 1am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 2am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 3am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 4am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 5am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 6am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 7am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 8am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 9am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 10am
1 0.5 1.5 0.5 1.5 1.5 1.5 # 11am
1 0.5 1.5 0.5 1.5 1.5 1.5 # Midday
1 0.5 1.5 0.5 1.5 1.5 1.5 # 1pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 2pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 3pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 4pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 5pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 6pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 7pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 8pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 9pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 10pm
1 0.5 1.5 0.5 1.5 1.5 1.5 # 11pm
# Scaling Table (how strong the overall effect is)
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS time multiplier
1 0.3 0.5 0.1 1 1 1 # Midnight 0.5
1 0.3 0.5 0.1 1 1 1 # 1am 0.5
1 0.3 0.5 0.1 1 1 1 # 2am 0.5
1 0.3 0.5 0.1 1 1 1 # 3am 0.5
1 0.3 0.5 0.1 1 1 1 # 4am 0.5
1 0.3 0.5 0.1 1 1 1 # 5am 0.5
1 0.3 0.5 0.1 1 1 1 # 6am 0.5
1.2 0.36 0.6 0.12 1.2 1.2 1.2 # 7am 0.6
1.4 0.42 0.7 0.14 1.4 1.4 1.4 # 8am 0.7
1.6 0.48 0.8 0.16 1.6 1.6 1.6 # 9am 0.8
1.8 0.54 0.9 0.18 1.8 1.8 1.8 # 10am 0.9
2 0.6 1 0.2 2 2 2 # 11am 1
2 0.6 1 0.2 2 2 2 # Midday tweaking value
2 0.6 1 0.2 2 2 2 # 1pm 1
2 0.6 1 0.2 2 2 2 # 2pm 1
2.2 0.66 1.1 0.22 2.2 2.2 2.2 # 3pm 1.1
2.2 0.66 1.1 0.22 2.2 2.2 2.2 # 4pm 1.1
2.4 0.72 1.2 0.24 2.4 2.4 2.4 # 5pm 1.2
2.4 0.72 1.2 0.24 2.4 2.4 2.4 # 6pm 1.2
2.2 0.66 1.1 0.22 2.2 2.2 2.2 # 7pm 1.1
2 0.6 1 0.2 2 2 2 # 8pm 1
1.6 0.48 0.8 0.16 1.6 1.6 1.6 # 9pm 0.8
1.2 0.36 0.6 0.12 1.2 1.2 1.2 # 10pm 0.6
1 0.3 0.5 0.1 1 1 1 # 11pm 0.5
# Ramp Start Table
# SUNNY CLOUDY RAINY, FOGGY
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # Midnight
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 1am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 2am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 3am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 4am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 5am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 6am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 7am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 8am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 9am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 10am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 11am
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # Midday
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 1pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 2pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 3pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 4pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 5pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 6pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 7pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 8pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 9pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 10pm
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 11pm
# Ramp End Table
# SUNNY CLOUDY RAINY, FOGGY
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # Midnight
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 1am
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 2am
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 3am
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 4am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 5am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 6am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 7am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 8am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 9am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 10am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 11am
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # Midday
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 1pm
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 2pm
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 3pm
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 4pm
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 5pm
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 6pm
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 7pm
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 8pm
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 9pm
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 10pm
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 11pm
# Offset Table
# SUNNY CLOUDY RAINY, FOGGY
0 0 0 0 # Midnight
0 0 0 0 # 1am
0 0 0 0 # 2am
0 0 0 0 # 3am
0 0 0 0 # 4am
0 0 0 0 # 5am
0 0 0 0 # 6am
0 0 0 0 # 7am
0 0 0 0 # 8am
0 0 0 0 # 9am
0 0 0 0 # 10am
0 0 0 0 # 11am
0 0 0 0 # Midday
0 0 0 0 # 1pm
0 0 0 0 # 2pm
0 0 0 0 # 3pm
0 0 0 0 # 4pm
0 0 0 0 # 5pm
0 0 0 0 # 6pm
0 0 0 0 # 7pm
0 0 0 0 # 8pm
0 0 0 0 # 9pm
0 0 0 0 # 10pm
0 0 0 0 # 11pm
# Scale Table
# SUNNY CLOUDY RAINY, FOGGY
1.5 1.5 1.0 1.0 # Midnight
1.5 1.5 1.0 1.0 # 1am
1.5 1.5 1.0 1.0 # 2am
1.5 1.5 1.5 1.5 # 3am
2.0 2.0 2.0 2.0 # 4am
2.0 2.0 2.0 2.0 # 5am
2.0 2.0 2.0 2.0 # 6am
2.5 2.5 2.0 2.0 # 7am
2.5 2.5 2.0 2.0 # 8am
2.5 2.5 2.0 2.0 # 9am
2.5 2.5 2.0 2.0 # 10am
2.5 2.5 2.0 2.0 # 11am
2.5 2.5 2.0 2.0 # Midday
2.5 2.5 2.0 2.0 # 1pm
2.5 2.5 2.0 2.0 # 2pm
2.5 2.5 2.0 2.0 # 3pm
2.5 2.5 2.0 2.0 # 4pm
2.0 2.0 2.0 2.0 # 5pm
2.0 2.0 2.0 2.0 # 6pm
2.0 2.0 2.0 2.0 # 7pm
1.5 1.5 1.5 1.5 # 8pm
1.5 1.5 1.0 1.0 # 9pm
1.5 1.5 1.0 1.0 # 10pm
1.5 1.5 1.0 1.0 # 11pm
# Scaling Table
# SUNNY CLOUDY RAINY, FOGGY
0.2 0.2 0.1 0.1 # Midnight
0.2 0.2 0.1 0.1 # 1am
0.7 0.7 0.2 0.2 # 6am
0.7 0.7 0.2 0.2 # 3am
0.7 0.7 0.2 0.2 # 4am
2.0 2.0 0.3 0.3 # 5am
3.0 3.0 0.3 0.3 # 6am
4.0 4.0 0.3 0.3 # 7am
5.0 5.0 0.3 0.3 # 8am
6.0 6.0 1.3 1.3 # 9am
6.0 6.0 2.0 2.0 # 10am
6.0 6.0 2.0 2.0 # 11am
6.0 6.0 2.0 2.0 # Midday
6.0 6.0 2.0 2.0 # 1pm
6.0 6.0 1.3 1.3 # 6pm
5.0 5.0 0.3 0.3 # 3pm
4.0 4.0 0.3 0.3 # 4pm
3.0 3.0 0.3 0.3 # 5pm
2.0 2.0 0.3 0.3 # 6pm
0.7 0.7 0.2 0.2 # 7pm
0.7 0.7 0.2 0.2 # 8pm
0.7 0.7 0.2 0.2 # 9pm
0.2 0.2 0.1 0.1 # 10pm
0.2 0.2 0.1 0.1 # 11pm

View File

@ -1,30 +1,26 @@
# LM blend Table
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS basic daytime ramp
0.45 0.6 0.75 0.525 0.45 0.75 0.375 # Midnight 0.75 0.1
0.48 0.64 0.8 0.56 0.48 0.8 0.4 # 1am 0.8 0.2
0.51 0.68 0.85 0.595 0.51 0.85 0.425 # 2am 0.85 0.3
0.54 0.72 0.9 0.63 0.54 0.9 0.45 # 3am 0.9 0.4
0.57 0.76 0.95 0.665 0.57 0.95 0.475 # 4am 0.95 0.6
0.6 0.8 1 0.7 0.6 1 0.5 # 5am 1 0.8
0.6 0.8 1 0.7 0.6 1 0.5 # 6am 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 7am 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 8am 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 9am 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 10am 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 11am 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # Midday 1 tweak here
0.6 0.8 1 0.7 0.6 1 0.5 # 1pm 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 2pm 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 3pm 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 4pm 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 5pm 1 1
0.6 0.8 1 0.7 0.6 1 0.5 # 6pm 1 0.8
0.57 0.76 0.95 0.665 0.57 0.95 0.475 # 7pm 0.95 0.6
0.54 0.72 0.9 0.63 0.54 0.9 0.45 # 8pm 0.9 0.5
0.51 0.68 0.85 0.595 0.51 0.85 0.425 # 9pm 0.85 0.4
0.48 0.64 0.8 0.56 0.48 0.8 0.4 # 10pm 0.8 0.3
0.45 0.6 0.75 0.525 0.45 0.75 0.375 # 11pm 0.75 0.2
# LM blend Table
# SUNNY CLOUDY RAINY FOGGY
0.700000 0.700000 0.700000 0.550000 # Midnight
0.700000 0.700000 0.700000 0.550000 # 1am
0.700000 0.700000 0.700000 0.550000 # 2am
0.700000 0.700000 0.700000 0.550000 # 3am
0.700000 0.700000 0.700000 0.550000 # 4am
0.750000 0.750000 0.700000 0.600000 # 5am
0.800000 0.800000 0.750000 0.600000 # 6am
0.850000 0.850000 0.800000 0.650000 # 7am
0.900000 0.900000 0.800000 0.700000 # 8am
0.950000 0.900000 0.800000 0.700000 # 9am
1.000000 0.900000 0.800000 0.700000 # 10am
1.000000 0.900000 0.800000 0.700000 # 11am
1.000000 0.900000 0.800000 0.700000 # Midday
1.000000 0.900000 0.800000 0.700000 # 1pm
1.000000 0.900000 0.800000 0.700000 # 2pm
0.950000 0.900000 0.800000 0.700000 # 3pm
0.900000 0.900000 0.800000 0.700000 # 4pm
0.850000 0.850000 0.800000 0.650000 # 5pm
0.800000 0.800000 0.750000 0.600000 # 6pm
0.750000 0.750000 0.700000 0.600000 # 7pm
0.700000 0.700000 0.700000 0.550000 # 8pm
0.700000 0.700000 0.700000 0.550000 # 9pm
0.700000 0.700000 0.700000 0.550000 # 10pm
0.700000 0.700000 0.700000 0.550000 # 11pm

View File

@ -68,10 +68,10 @@ function getarch(a)
return a
end
workspace "reVC"
workspace "re3"
language "C++"
configurations { "Debug", "Release" }
startproject "reVC"
startproject "re3"
location "build"
symbols "Full"
staticruntime "off"
@ -84,10 +84,10 @@ workspace "reVC"
filter { "system:windows" }
configurations { "Vanilla" }
platforms {
"win-x86-RW34_d3d8-mss",
"win-x86-RW33_d3d8-mss",
"win-x86-librw_d3d9-mss",
"win-x86-librw_gl3_glfw-mss",
"win-x86-RW34_d3d8-oal",
"win-x86-RW33_d3d8-oal",
"win-x86-librw_d3d9-oal",
"win-x86-librw_gl3_glfw-oal",
"win-amd64-librw_d3d9-oal",
@ -234,7 +234,7 @@ project "librw"
filter "platforms:*gl3_glfw*"
staticruntime "off"
filter "platforms:*RW34*"
filter "platforms:*RW33*"
flags { "ExcludeFromBuild" }
filter {}
end
@ -243,9 +243,9 @@ local function addSrcFiles( prefix )
return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc"
end
project "reVC"
project "re3"
kind "WindowedApp"
targetname "reVC"
targetname "re3"
targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}"
if(_OPTIONS["with-librw"]) then
@ -336,8 +336,8 @@ project "reVC"
defines { "AUDIO_OAL" }
filter {}
if(os.getenv("GTA_VC_RE_DIR")) then
setpaths(os.getenv("GTA_VC_RE_DIR") .. "/", "%(cfg.buildtarget.name)")
if(os.getenv("GTA_III_RE_DIR")) then
setpaths(os.getenv("GTA_III_RE_DIR") .. "/", "%(cfg.buildtarget.name)")
end
filter "platforms:win*"
@ -419,10 +419,10 @@ project "reVC"
links { "opusfile" }
end
filter "platforms:*RW34*"
filter "platforms:*RW33*"
includedirs { "sdk/rwsdk/include/d3d8" }
libdirs { "sdk/rwsdk/lib/d3d8/release" }
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtanim", "rtcharse", "rpanisot" }
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse", "rpanisot" }
defines { "RWLIBS" }
linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text"

View File

@ -7,51 +7,18 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="reVC.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07, custom)"
sodipodi:docname="re3_final.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
id="svg8"
version="1.1"
viewBox="0 0 270.93331 270.93334"
height="1024"
width="1024"
inkscape:export-filename="/home/hazelnot/Design/re3_final.png"
inkscape:export-filename="/home/hazelnot/Design/re3_red.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter1055">
<feFlood
flood-opacity="1"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood1045" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1047" />
<feGaussianBlur
in="composite1"
stdDeviation="0"
result="blur"
id="feGaussianBlur1049" />
<feOffset
dx="1"
dy="1"
result="offset"
id="feOffset1051" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite1053" />
</filter>
</defs>
id="defs2" />
<sodipodi:namedview
inkscape:window-maximized="1"
inkscape:window-y="0"
@ -63,10 +30,10 @@
inkscape:pagecheckerboard="false"
showgrid="false"
inkscape:document-rotation="0"
inkscape:current-layer="svg8"
inkscape:current-layer="g837"
inkscape:document-units="mm"
inkscape:cy="624.20389"
inkscape:cx="108.63858"
inkscape:cy="544.84615"
inkscape:cx="415.73725"
inkscape:zoom="0.7"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
@ -94,11 +61,10 @@
</metadata>
<g
id="g837"
transform="matrix(2.1130708,0,0,2.1130708,14.956432,63.50059)"
style="display:none">
transform="matrix(2.1130708,0,0,2.1130708,14.956432,63.50059)">
<path
id="path1450"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.83595;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.836;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="M 0.91799998,0.91799998 V 54.101316 H 17.960888 v 2.33009 c 0,2.95453 1.347497,6.384348 3.911905,8.332308 2.564408,1.947971 5.514112,2.433445 8.500257,2.433445 h 46.367194 v -14.5464 c 2.171993,1.134845 4.548071,1.450557 6.948413,1.450557 h 17.042893 c 2.98614,0 5.93584,-0.485482 8.50025,-2.433442 2.5644,-1.94796 3.91191,-5.377273 3.91191,-8.331793 V 30.964744 c 0,-1.094128 -0.25094,-2.296243 -0.70487,-3.457153 0.45593,-1.16196 0.70487,-2.363609 0.70487,-3.453019 V 11.81656 c 0,-2.9682265 -1.29681,-6.3966108 -3.85713,-8.3907028 -2.56031,-1.9940909 -5.55104,-2.50785722 -8.55503,-2.50785722 H 83.819398 c -3.003989,0 -5.99213,0.51376632 -8.55245,2.50785722 C 74.832145,3.7645045 74.436551,4.1470248 74.074773,4.5591214 73.713016,4.1470532 73.317379,3.7644843 72.8826,3.4258572 70.322288,1.4317663 67.332073,0.91799998 64.328081,0.91799998 H 47.285195 c -2.976748,0 -5.937909,0.51342982 -8.482687,2.46289872 C 36.275393,1.4370808 33.325985,0.91799998 30.37305,0.91799998 Z"
inkscape:label="Border" />
<g
@ -113,50 +79,10 @@
transform="translate(-2.6458322)"
inkscape:label="re" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:Pricedown;-inkscape-font-specification:Pricedown;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#c60000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:11.1359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:Pricedown;-inkscape-font-specification:Pricedown;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#c60000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:11.136;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 135.23613,125.97382 c -4.56245,0 -6.84367,-1.73285 -6.84367,-5.19855 v -7.89654 h 13.68733 v 2.50057 c 0,0.0877 0.0439,0.13161 0.13161,0.13161 h 3.09281 c 0.0877,0 0.13161,-0.0439 0.13161,-0.13161 v -6.11982 c 0,-0.0877 -0.0439,-0.13161 -0.13161,-0.13161 h -16.71434 v -8.35717 h 16.71434 c 0.0877,0 0.13161,-0.0439 0.13161,-0.13161 v -6.054011 c 0,-0.08774 -0.0439,-0.131609 -0.13161,-0.131609 h -3.09281 c -0.0877,0 -0.13161,0.04387 -0.13161,0.131609 v 2.434766 h -13.55572 v -7.764931 c 0,-3.553443 2.28122,-5.330164 6.84366,-5.330164 h 16.91176 c 4.56245,0 6.84367,1.776721 6.84367,5.330164 v 12.239636 c 0,2.01801 -1.14061,3.15862 -3.42184,3.42183 2.28123,0.30709 3.42184,1.46964 3.42184,3.48764 v 12.37125 c 0,3.4657 -2.28122,5.19855 -6.84367,5.19855 z"
id="path1458"
inkscape:label="3" />
</g>
</g>
<g
id="g3625-7"
inkscape:label="reVC_10"
transform="matrix(2.4113736,0,0,2.4113736,-122.44911,-160.08821)">
<path
style="display:inline;fill:#00bbe2;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 102.78895,112.11187 54.54276,9.96769 -30.34918,43.22598 z"
id="path1613-9"
sodipodi:nodetypes="cccc"
inkscape:label="triangle" />
<g
id="g3669-0"
style="display:inline;opacity:1"
inkscape:label="re">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#f17db2;stroke-width:1.60863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 57.388672,80.632812 v 48.632808 h 17.042969 v 4.60547 c 0,2.45514 1.029322,5.01368 3.011718,6.51953 1.982397,1.50586 4.425056,1.97071 7.123047,1.97071 H 128.6582 v -17.04688 h -1.47851 c 0.87224,-1.37715 1.47851,-2.92106 1.47851,-4.53906 v -7.23633 -3.95312 -20.330081 c 0,-2.481169 -1.00049,-5.053605 -2.98047,-6.595703 -1.97997,-1.542097 -4.44771,-2.027344 -7.15625,-2.027344 h -17.04296 c -2.708546,10e-7 -5.176278,0.485247 -7.156254,2.027344 -0.588908,0.458669 -0.913121,1.140613 -1.328125,1.751953 -0.409812,-0.606749 -0.72664,-1.284534 -1.308594,-1.742187 -1.967878,-1.547555 -4.428385,-2.03711 -7.119141,-2.03711 z m 6.582031,6.583985 h 20.595703 c 1.827819,0 2.757419,0.399739 3.048828,0.628906 0.29141,0.229167 0.4375,0.331111 0.4375,1.410156 v 12.238281 c 0,0.0702 0.0022,0.0438 0.002,0.0801 0.03874,-0.0312 0.06635,0.0114 -0.451172,0.0723 l -0.05469,6.53321 c 0.66816,0.0899 0.752817,0.24295 0.65625,0.14453 -0.09657,-0.0984 -0.08594,-0.3087 -0.08594,0.0801 v 20.07031 c 0,0.59276 0.198598,1.6281 0.996093,2.42578 0.797496,0.79768 1.834701,0.99805 2.427735,0.99805 h 30.53125 v 3.8789 H 84.566406 c -1.864454,0 -2.841799,-0.40191 -3.140625,-0.6289 -0.298826,-0.227 -0.410156,-0.26677 -0.410156,-1.27735 v -24.61132 c 0,-0.59276 -0.200551,-1.6281 -0.998047,-2.42579 -0.797496,-0.79768 -1.832748,-0.99804 -2.425781,-0.99804 h -6.517578 v 16.8457 h -7.103516 z m 37.507817,0 h 17.04296 c 1.8539,0 2.80813,0.402095 3.10938,0.636719 0.30124,0.234623 0.44336,0.33007 0.44336,1.402343 V 106.95508 H 105.0293 v 8.42383 c 0,0.59313 0.20067,1.63031 0.99804,2.42773 0.79738,0.79742 1.83258,0.99609 2.42578,0.99609 h 3.09376 c 0.59313,0 1.62836,-0.19872 2.42578,-0.99609 0.51996,-0.51993 0.73732,-1.1028 0.85937,-1.63672 h 7.24219 v 4.60547 c 0,1.01057 -0.11133,1.05035 -0.41016,1.27734 -0.29882,0.227 -1.27812,0.62891 -3.14258,0.62891 h -17.04296 c -1.864458,0 -2.841803,-0.40191 -3.140629,-0.62891 -0.298826,-0.22699 -0.410157,-0.26677 -0.410157,-1.27734 V 89.255859 c 0,-1.072272 0.140161,-1.167719 0.441407,-1.402343 0.301246,-0.234625 1.255472,-0.636719 3.109379,-0.636719 z M 71.074219,91.162109 V 104.0625 h 6.517578 c 0.592903,0 1.628193,-0.20031 2.425781,-0.99805 0.797588,-0.79773 0.998047,-1.83309 0.998047,-2.42578 v -6.052732 c 0,-0.592528 -0.200189,-1.629881 -0.998047,-2.427735 -0.797858,-0.797853 -1.83326,-0.996094 -2.425781,-0.996094 z m 37.378901,0 c -0.59275,0 -1.62809,0.198598 -2.42578,0.996094 -0.79768,0.797496 -0.99804,1.834701 -0.99804,2.427735 v 9.148442 h 9.9414 v -9.148442 c 0,-0.592903 -0.20031,-1.630147 -0.99804,-2.427735 -0.79774,-0.797588 -1.8331,-0.996094 -2.42578,-0.996094 z"
id="path3671-2"
inkscape:label="outline" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:9.53813;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 84.566726,139.06892 c -4.562445,0 -6.843668,-1.73285 -6.843668,-5.19856 v -24.61088 c 0,-0.0877 -0.04387,-0.13161 -0.131609,-0.13161 h -3.22442 v 16.84595 H 60.679694 V 83.92475 h 23.887032 c 4.518575,0 6.777863,1.776721 6.777863,5.330164 v 12.239636 c 0,2.01801 -1.118676,3.15862 -3.356029,3.42183 2.281223,0.30709 3.421834,1.46964 3.421834,3.48764 v 20.07037 c 0,0.0877 0.04387,0.13161 0.131609,0.13161 h 33.823507 v 10.46292 z M 77.723058,94.585079 c 0,-0.08774 -0.04387,-0.131609 -0.131609,-0.131609 h -3.22442 v 6.31723 h 3.22442 c 0.08774,0 0.131609,-0.0439 0.131609,-0.13161 z m 33.955122,0 c 0,-0.08774 -0.0439,-0.131609 -0.13161,-0.131609 h -3.09281 c -0.0877,0 -0.13161,0.04387 -0.13161,0.131609 v 5.856601 h 3.35603 z m -10.1997,31.388741 c -4.562444,0 -6.843666,-1.73285 -6.843666,-5.19855 V 89.254914 c 0,-3.553443 2.281222,-5.330164 6.843666,-5.330164 h 17.04337 c 4.56244,0 6.84366,1.776721 6.84366,5.330164 v 20.991636 h -17.04336 v 5.13275 c 0,0.0877 0.0439,0.13161 0.13161,0.13161 h 3.09281 c 0.0877,0 0.13161,-0.0439 0.13161,-0.13161 v -2.50057 h 13.68733 v 7.89654 c 0,3.4657 -2.28122,5.19855 -6.84366,5.19855 z"
id="path3673-3"
inkscape:label="text" />
</g>
<g
id="g861-9-7"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#f17db2;stroke-opacity:1;filter:url(#filter1055)"
transform="matrix(1.3835644,0,0,1.3835644,-22.936608,36.936115)"
inkscape:label="Vc">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#f17db2;stroke-width:3.175;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 115.29478,55.979585 a 1.0583349,1.0583349 0 0 0 -0.94727,0.53711 l -13.61915,24.06445 -1.763667,-7.15234 a 1.0583349,1.0583349 0 0 0 -1.28125,-0.77344 1.0583349,1.0583349 0 0 0 -0.77344,1.28125 l 2.40235,9.73438 a 1.0584408,1.0584408 0 0 0 1.947257,0.26757 l 14.9297,-26.38086 a 1.0583349,1.0583349 0 0 0 -0.39844,-1.4414 1.0583349,1.0583349 0 0 0 -0.49609,-0.13672 z"
id="path892-1-5" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#f17db2;stroke-width:3.175;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 118.1854,69.604585 a 1.0583349,1.0583349 0 0 0 -0.27343,0.0391 c 0,0 -2.1903,0.59881 -4.46875,2.08789 -2.27846,1.48909 -4.77359,3.96951 -5.16602,7.69531 -0.20107,1.90898 0.49022,3.43086 1.68359,4.15821 1.19338,0.72735 2.6066,0.75222 3.94727,0.60547 2.68134,-0.29351 5.29297,-1.44336 5.29297,-1.44336 a 1.0583349,1.0583349 0 0 0 0.55078,-1.39063 1.0583349,1.0583349 0 0 0 -1.39063,-0.55273 c 0,0 -2.46507,1.04035 -4.68359,1.2832 -1.10926,0.12142 -2.10191,0.002 -2.61523,-0.31055 -0.51333,-0.31286 -0.82729,-0.72566 -0.67969,-2.12695 0.3049,-2.89473 2.23993,-4.85323 4.21875,-6.14648 1.97882,-1.29326 3.87305,-1.82032 3.87305,-1.82032 a 1.0583349,1.0583349 0 0 0 0.73828,-1.30078 1.0583349,1.0583349 0 0 0 -1.02735,-0.77734 z"
id="path896-2-9" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -167,4 +167,4 @@ if(${PROJECT}_INSTALL)
endif()
endif()
reVC_platform_target(${EXECUTABLE} INSTALL)
re3_platform_target(${EXECUTABLE} INSTALL)

View File

@ -12,7 +12,6 @@
#include "General.h"
#include "RwHelper.h"
#include "ModelIndices.h"
#include "ModelInfo.h"
#include "AnimManager.h"
#include "RpAnimBlend.h"
@ -21,11 +20,8 @@
CAnimBlendAssocGroup::CAnimBlendAssocGroup(void)
{
animBlock = nil;
assocList = nil;
numAssociations = 0;
firstAnimId = 0;
groupId = -1;
}
CAnimBlendAssocGroup::~CAnimBlendAssocGroup(void)
@ -46,7 +42,7 @@ CAnimBlendAssocGroup::DestroyAssociations(void)
CAnimBlendAssociation*
CAnimBlendAssocGroup::GetAnimation(uint32 id)
{
return &assocList[id - firstAnimId];
return &assocList[id];
}
CAnimBlendAssociation*
@ -56,7 +52,6 @@ CAnimBlendAssocGroup::GetAnimation(const char *name)
for(i = 0; i < numAssociations; i++)
if(!CGeneral::faststricmp(assocList[i].hierarchy->name, name))
return &assocList[i];
debug("\n\nCan't find the fucking animation %s\n\n\n", name);
return nil;
}
@ -106,7 +101,7 @@ strcmpIgnoringDigits(const char *s1, const char *s2)
c2 = __ascii_toupper(c2);
#endif
if(c1 && c2 && c1 != c2)
if(c1 != c2)
return false;
}
}
@ -116,15 +111,6 @@ GetModelFromName(const char *name)
{
int i;
CBaseModelInfo *mi;
char playername[32];
if(strncasecmp(name, "CSplay", 6) == 0 &&
strncasecmp(CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName(), "ig", 2) == 0){
strcpy(playername, CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName());
playername[0] = 'C';
playername[1] = 'S';
name = playername;
}
for(i = 0; i < MODELINFOSIZE; i++){
mi = CModelInfo::GetModelInfo(i);
@ -141,7 +127,8 @@ CAnimBlendAssocGroup::CreateAssociations(const char *name)
int i;
CAnimBlock *animBlock;
DestroyAssociations();
if(assocList)
DestroyAssociations();
animBlock = CAnimManager::GetAnimationBlock(name);
assocList = new CAnimBlendAssociation[animBlock->numAnims];
@ -150,18 +137,17 @@ CAnimBlendAssocGroup::CreateAssociations(const char *name)
for(i = 0; i < animBlock->numAnims; i++){
CAnimBlendHierarchy *anim = CAnimManager::GetAnimation(animBlock->firstIndex + i);
CBaseModelInfo *model = GetModelFromName(anim->name);
if(model){
debug("Associated anim %s with model %s\n", anim->name, model->GetModelName());
RpClump *clump = (RpClump*)model->CreateInstance();
RpAnimBlendClumpInit(clump);
assocList[i].Init(clump, anim);
if(IsClumpSkinned(clump))
RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil);
RpClumpDestroy(clump);
assocList[i].animId = firstAnimId + i;
assocList[i].groupId = groupId;
}else
debug("\n\nCANNOT FIND MODELINFO WITH NAME %s\n\n\n", anim->name);
assert(model);
printf("Associated anim %s with model %s\n", anim->name, model->GetModelName());
RpClump *clump = (RpClump*)model->CreateInstance();
#ifdef PED_SKIN
if(IsClumpSkinned(clump))
RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil);
#endif
RpAnimBlendClumpInit(clump);
assocList[i].Init(clump, anim);
RpClumpDestroy(clump);
assocList[i].animId = i;
}
numAssociations = animBlock->numAnims;
}
@ -171,8 +157,10 @@ void
CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump, const char **animNames, int numAssocs)
{
int i;
CAnimBlock *animBlock;
DestroyAssociations();
if(assocList)
DestroyAssociations();
animBlock = CAnimManager::GetAnimationBlock(blockName);
assocList = new CAnimBlendAssociation[numAssocs];
@ -180,8 +168,7 @@ CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump,
numAssociations = 0;
for(i = 0; i < numAssocs; i++){
assocList[i].Init(clump, CAnimManager::GetAnimation(animNames[i], animBlock));
assocList[i].animId = firstAnimId + i;
assocList[i].groupId = groupId;
assocList[i].animId = i;
}
numAssociations = numAssocs;
}

View File

@ -1,16 +1,12 @@
#pragma once
class CAnimBlendAssociation;
struct CAnimBlock;
class CAnimBlendAssocGroup
{
public:
CAnimBlock *animBlock;
CAnimBlendAssociation *assocList;
int32 numAssociations;
int32 firstAnimId;
int32 groupId; // id of self in ms_aAnimAssocGroups
CAnimBlendAssocGroup(void);
~CAnimBlendAssocGroup(void);

View File

@ -9,7 +9,6 @@
CAnimBlendAssociation::CAnimBlendAssociation(void)
{
groupId = -1;
nodes = nil;
blendAmount = 1.0f;
blendDelta = 0.0f;
@ -55,8 +54,8 @@ CAnimBlendAssociation::AllocateAnimBlendNodeArray(int n)
void
CAnimBlendAssociation::FreeAnimBlendNodeArray(void)
{
if(nodes)
RwFreeAlign(nodes);
assert(nodes != nil);
RwFreeAlign(nodes);
}
void
@ -76,10 +75,7 @@ CAnimBlendAssociation::Init(RpClump *clump, CAnimBlendHierarchy *hier)
// NB: This is where the order of nodes is defined
for(i = 0; i < hier->numSequences; i++){
CAnimBlendSequence *seq = &hier->sequences[i];
if(seq->boneTag == -1)
frame = RpAnimBlendClumpFindFrame(clump, seq->name);
else
frame = RpAnimBlendClumpFindBone(clump, seq->boneTag);
frame = RpAnimBlendClumpFindFrame(clump, seq->name);
if(frame && seq->numFrames > 0)
nodes[frame - clumpData->frames].sequence = seq;
}
@ -94,7 +90,6 @@ CAnimBlendAssociation::Init(CAnimBlendAssociation &assoc)
numNodes = assoc.numNodes;
flags = assoc.flags;
animId = assoc.animId;
groupId = assoc.groupId;
AllocateAnimBlendNodeArray(numNodes);
for(i = 0; i < numNodes; i++){
nodes[i] = assoc.nodes[i];
@ -131,25 +126,12 @@ CAnimBlendAssociation::SetCurrentTime(float time)
int i;
for(currentTime = time; currentTime >= hierarchy->totalLength; currentTime -= hierarchy->totalLength)
if (!IsRepeating()) {
currentTime = hierarchy->totalLength;
break;
}
if(!IsRepeating())
return;
CAnimManager::UncompressAnimation(hierarchy);
#ifdef ANIM_COMPRESSION
// strangely PC has this but android doesn't
if(hierarchy->keepCompressed){
for(i = 0; i < numNodes; i++)
if(nodes[i].sequence)
nodes[i].SetupKeyFrameCompressed();
}else
#endif
{
for(i = 0; i < numNodes; i++)
if(nodes[i].sequence)
nodes[i].FindKeyFrame(currentTime);
}
for(i = 0; i < numNodes; i++)
if(nodes[i].sequence)
nodes[i].FindKeyFrame(currentTime);
}
void
@ -165,23 +147,13 @@ CAnimBlendAssociation::Start(float time)
SetCurrentTime(time);
}
void
CAnimBlendAssociation::UpdateTimeStep(float timeDelta, float relSpeed)
{
if(IsRunning())
timeStep = (flags & ASSOC_MOVEMENT ? relSpeed*hierarchy->totalLength : speed) * timeDelta;
}
bool
CAnimBlendAssociation::UpdateTime(float timeDelta, float relSpeed)
{
if(!IsRunning())
return true;
if(currentTime >= hierarchy->totalLength){
flags &= ~ASSOC_RUNNING;
return true;
}
timeStep = (flags & ASSOC_MOVEMENT ? relSpeed*hierarchy->totalLength : speed) * timeDelta;
currentTime += timeStep;
if(currentTime >= hierarchy->totalLength){
@ -191,6 +163,7 @@ CAnimBlendAssociation::UpdateTime(float timeDelta, float relSpeed)
currentTime -= hierarchy->totalLength;
else{
currentTime = hierarchy->totalLength;
flags &= ~ASSOC_RUNNING;
if(flags & ASSOC_FADEOUTWHENDONE){
flags |= ASSOC_DELETEFADEDOUT;
blendDelta = -4.0f;

View File

@ -12,13 +12,12 @@ enum {
ASSOC_PARTIAL = 0x10,
ASSOC_MOVEMENT = 0x20, // ???
ASSOC_HAS_TRANSLATION = 0x40,
ASSOC_HAS_X_TRANSLATION = 0x80, // for 2d velocity extraction
ASSOC_WALK = 0x100, // for CPed::PlayFootSteps(void)
ASSOC_IDLE = 0x200, // only xpress scratch has it by default, but game adds it to player's idle animations later
ASSOC_NOWALK = 0x400, // see CPed::PlayFootSteps(void)
ASSOC_BLOCK = 0x800, // unused in assoc description, blocks other anims from being played
ASSOC_FRONTAL = 0x1000, // anims that we fall to front
ASSOC_DRIVING = 0x2000, // new in VC
ASSOC_WALK = 0x80, // for CPed::PlayFootSteps(void)
ASSOC_IDLE = 0x100, // only used by xpress scratch, see CPed::Chat(void)
ASSOC_NOWALK = 0x200, // see CPed::PlayFootSteps(void)
ASSOC_BLOCK = 0x400, // unused in assoc description, blocks other anims from being played
ASSOC_FRONTAL = 0x800, // anims that we fall to front
ASSOC_HAS_X_TRANSLATION = 0x1000, // for 2d velocity extraction
};
// Anim hierarchy associated with a clump
@ -36,8 +35,7 @@ public:
CAnimBlendLink link;
int16 numNodes; // taken from CAnimBlendClumpData::numFrames
int16 groupId; // ID of CAnimBlendAssocGroup this is in
int32 numNodes; // taken from CAnimBlendClumpData::numFrames
// NB: Order of these depends on order of nodes in Clump this was built from
CAnimBlendNode *nodes;
CAnimBlendHierarchy *hierarchy;
@ -46,8 +44,8 @@ public:
float currentTime;
float speed;
float timeStep;
int16 animId;
int16 flags;
int32 animId;
int32 flags;
int32 callbackType;
void (*callback)(CAnimBlendAssociation*, void*);
void *callbackArg;
@ -78,16 +76,16 @@ public:
void SetCurrentTime(float time);
void SyncAnimation(CAnimBlendAssociation *other);
void Start(float time);
void UpdateTimeStep(float timeDelta, float relSpeed);
bool UpdateTime(float timeDelta, float relSpeed);
bool UpdateBlend(float timeDelta);
void SetRun(void) { flags |= ASSOC_RUNNING; }
float GetTimeLeft() { return hierarchy->totalLength - currentTime; }
float GetProgress() { return currentTime / hierarchy->totalLength; }
inline float GetTimeLeft() { return hierarchy->totalLength - currentTime; }
static CAnimBlendAssociation *FromLink(CAnimBlendLink *l) {
return (CAnimBlendAssociation*)((uint8*)l - offsetof(CAnimBlendAssociation, link));
}
};
VALIDATE_SIZE(CAnimBlendAssociation, 0x40);

View File

@ -10,19 +10,23 @@ struct AnimBlendFrameData
IGNORE_TRANSLATION = 4,
VELOCITY_EXTRACTION = 8,
VELOCITY_EXTRACTION_3D = 0x10,
UPDATE_KEYFRAMES = 0x20,
COMPRESSED = 0x40
};
uint8 flag;
RwV3d resetPos;
#ifdef PED_SKIN
union {
RwFrame *frame;
RpHAnimStdInterpFrame *hanimFrame;
};
int32 nodeID;
#else
RwFrame *frame;
#endif
};
VALIDATE_SIZE(AnimBlendFrameData, 0x18);
#ifndef PED_SKIN
VALIDATE_SIZE(AnimBlendFrameData, 0x14);
#endif
class CAnimBlendClumpData
@ -30,6 +34,9 @@ class CAnimBlendClumpData
public:
CAnimBlendLink link;
int32 numFrames;
#ifdef PED_SKIN
int32 modelNumber; // doesn't seem to be used
#endif
union {
CVector2D *velocity2d;
CVector *velocity3d;
@ -40,6 +47,11 @@ public:
CAnimBlendClumpData(void);
~CAnimBlendClumpData(void);
void SetNumberOfFrames(int n);
#ifdef PED_SKIN
void SetNumberOfBones(int n) { SetNumberOfFrames(n); }
#endif
void ForAllFrames(void (*cb)(AnimBlendFrameData*, void*), void *arg);
};
#ifndef PED_SKIN
VALIDATE_SIZE(CAnimBlendClumpData, 0x14);
#endif

View File

@ -2,7 +2,6 @@
#include "AnimBlendSequence.h"
#include "AnimBlendHierarchy.h"
#include "AnimManager.h"
CAnimBlendHierarchy::CAnimBlendHierarchy(void)
{
@ -16,10 +15,9 @@ CAnimBlendHierarchy::CAnimBlendHierarchy(void)
void
CAnimBlendHierarchy::Shutdown(void)
{
CAnimManager::RemoveFromUncompressedCache(this);
RemoveAnimSequences();
totalLength = 0.0f;
compressed = 0;
linkPtr = nil;
}
void
@ -32,43 +30,13 @@ void
CAnimBlendHierarchy::CalcTotalTime(void)
{
int i, j;
totalLength = 0.0f;
for(i = 0; i < numSequences; i++){
#ifdef FIX_BUGS
if(sequences[i].numFrames == 0)
continue;
#endif
totalLength = Max(totalLength, sequences[i].GetKeyFrame(sequences[i].numFrames-1)->deltaTime);
for(j = sequences[i].numFrames-1; j >= 1; j--){
KeyFrame *kf1 = sequences[i].GetKeyFrame(j);
KeyFrame *kf2 = sequences[i].GetKeyFrame(j-1);
kf1->deltaTime -= kf2->deltaTime;
}
}
}
void
CAnimBlendHierarchy::CalcTotalTimeCompressed(void)
{
int i, j;
totalLength = 0.0f;
for(i = 0; i < numSequences; i++){
#ifdef FIX_BUGS
if(sequences[i].numFrames == 0)
continue;
#endif
totalLength = Max(totalLength, sequences[i].GetKeyFrameCompressed(sequences[i].numFrames-1)->GetDeltaTime());
for(j = sequences[i].numFrames-1; j >= 1; j--){
KeyFrameCompressed *kf1 = sequences[i].GetKeyFrameCompressed(j);
KeyFrameCompressed *kf2 = sequences[i].GetKeyFrameCompressed(j-1);
kf1->deltaTime -= kf2->deltaTime;
}
float seqTime = 0.0f;
for(j = 0; j < sequences[i].numFrames; j++)
seqTime += sequences[i].GetKeyFrame(j)->deltaTime;
totalLength = Max(totalLength, seqTime);
}
}
@ -85,7 +53,6 @@ void
CAnimBlendHierarchy::RemoveAnimSequences(void)
{
delete[] sequences;
sequences = nil;
numSequences = 0;
}
@ -98,11 +65,9 @@ CAnimBlendHierarchy::Uncompress(void)
for(i = 0; i < numSequences; i++)
sequences[i].Uncompress();
#endif
compressed = 0;
if(totalLength == 0.0f){
RemoveQuaternionFlips();
if(totalLength == 0.0f)
CalcTotalTime();
}
compressed = 0;
}
void

View File

@ -15,8 +15,7 @@ public:
char name[24];
CAnimBlendSequence *sequences;
int16 numSequences;
bool compressed;
bool keepCompressed;
int16 compressed;
float totalLength;
CLink<CAnimBlendHierarchy*> *linkPtr;
@ -24,13 +23,11 @@ public:
void Shutdown(void);
void SetName(char *name);
void CalcTotalTime(void);
void CalcTotalTimeCompressed(void);
void RemoveQuaternionFlips(void);
void RemoveAnimSequences(void);
void Uncompress(void);
void RemoveUncompressedData(void);
void MoveMemory(bool onlyone = false);
bool IsCompressed() { return !!compressed; };
};
VALIDATE_SIZE(CAnimBlendHierarchy, 0x28);

View File

@ -45,44 +45,6 @@ CAnimBlendNode::Update(CVector &trans, CQuaternion &rot, float weight)
return looped;
}
bool
CAnimBlendNode::UpdateCompressed(CVector &trans, CQuaternion &rot, float weight)
{
bool looped = false;
trans = CVector(0.0f, 0.0f, 0.0f);
rot = CQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
if(association->IsRunning()){
remainingTime -= association->timeStep;
if(remainingTime <= 0.0f)
looped = NextKeyFrameCompressed();
}
float blend = association->GetBlendAmount(weight);
if(blend > 0.0f){
KeyFrameTransCompressed *kfA = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameA);
KeyFrameTransCompressed *kfB = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameB);
float t = kfA->deltaTime == 0 ? 0.0f : (kfA->GetDeltaTime() - remainingTime)/kfA->GetDeltaTime();
if(sequence->type & CAnimBlendSequence::KF_TRANS){
CVector transA, transB;
kfA->GetTranslation(&transA);
kfB->GetTranslation(&transB);
trans = transB + t*(transA - transB);
trans *= blend;
}
if(sequence->type & CAnimBlendSequence::KF_ROT){
CQuaternion rotA, rotB;
kfA->GetRotation(&rotA);
kfB->GetRotation(&rotB);
rot.Slerp(rotB, rotA, theta, invSin, t);
rot *= blend;
}
}
return looped;
}
bool
CAnimBlendNode::NextKeyFrame(void)
{
@ -120,43 +82,6 @@ CAnimBlendNode::NextKeyFrame(void)
return looped;
}
bool
CAnimBlendNode::NextKeyFrameCompressed(void)
{
bool looped;
if(sequence->numFrames <= 1)
return false;
looped = false;
frameB = frameA;
// Advance as long as we have to
while(remainingTime <= 0.0f){
frameA++;
if(frameA >= sequence->numFrames){
// reached end of animation
if(!association->IsRepeating()){
frameA--;
remainingTime = 0.0f;
return false;
}
looped = true;
frameA = 0;
}
remainingTime += sequence->GetKeyFrameCompressed(frameA)->GetDeltaTime();
}
frameB = frameA - 1;
if(frameB < 0)
frameB += sequence->numFrames;
CalcDeltasCompressed();
return looped;
}
// Set animation to time t
bool
CAnimBlendNode::FindKeyFrame(float t)
@ -167,22 +92,20 @@ CAnimBlendNode::FindKeyFrame(float t)
frameA = 0;
frameB = frameA;
if(sequence->numFrames == 1){
remainingTime = 0.0f;
}else{
if(sequence->numFrames >= 2){
frameA++;
// advance until t is between frameB and frameA
while (t > sequence->GetKeyFrame(++frameA)->deltaTime) {
while(t > sequence->GetKeyFrame(frameA)->deltaTime){
t -= sequence->GetKeyFrame(frameA)->deltaTime;
if (frameA + 1 >= sequence->numFrames) {
frameB = frameA++;
if(frameA >= sequence->numFrames){
// reached end of animation
if (!association->IsRepeating()) {
CalcDeltas();
remainingTime = 0.0f;
if(!association->IsRepeating())
return false;
}
frameA = 0;
frameB = 0;
}
frameB = frameA;
}
remainingTime = sequence->GetKeyFrame(frameA)->deltaTime - t;
@ -192,25 +115,6 @@ CAnimBlendNode::FindKeyFrame(float t)
return true;
}
bool
CAnimBlendNode::SetupKeyFrameCompressed(void)
{
if(sequence->numFrames < 1)
return false;
frameA = 1;
frameB = 0;
if(sequence->numFrames == 1){
frameA = 0;
remainingTime = 0.0f;
}else
remainingTime = sequence->GetKeyFrameCompressed(frameA)->GetDeltaTime();
CalcDeltasCompressed();
return true;
}
void
CAnimBlendNode::CalcDeltas(void)
{
@ -225,28 +129,6 @@ CAnimBlendNode::CalcDeltas(void)
invSin = theta == 0.0f ? 0.0f : 1.0f/Sin(theta);
}
void
CAnimBlendNode::CalcDeltasCompressed(void)
{
if((sequence->type & CAnimBlendSequence::KF_ROT) == 0)
return;
KeyFrameCompressed *kfA = sequence->GetKeyFrameCompressed(frameA);
KeyFrameCompressed *kfB = sequence->GetKeyFrameCompressed(frameB);
CQuaternion rotA, rotB;
kfA->GetRotation(&rotA);
kfB->GetRotation(&rotB);
float cos = DotProduct(rotA, rotB);
if(cos < 0.0f){
rotB *= -1.0f;
kfB->SetRotation(rotB);
}
cos = DotProduct(rotA, rotB);
if(cos > 1.0f)
cos = 1.0f;
theta = Acos(cos);
invSin = theta == 0.0f ? 0.0f : 1.0f/Sin(theta);
}
void
CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
{
@ -256,7 +138,7 @@ CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
if(blend > 0.0f){
KeyFrameTrans *kfA = (KeyFrameTrans*)sequence->GetKeyFrame(frameA);
KeyFrameTrans *kfB = (KeyFrameTrans*)sequence->GetKeyFrame(frameB);
float t = kfA->deltaTime == 0.0f ? 0.0f : (kfA->deltaTime - remainingTime)/kfA->deltaTime;
float t = (kfA->deltaTime - remainingTime)/kfA->deltaTime;
if(sequence->type & CAnimBlendSequence::KF_TRANS){
trans = kfB->translation + t*(kfA->translation - kfB->translation);
trans *= blend;
@ -264,26 +146,6 @@ CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
}
}
void
CAnimBlendNode::GetCurrentTranslationCompressed(CVector &trans, float weight)
{
trans = CVector(0.0f, 0.0f, 0.0f);
float blend = association->GetBlendAmount(weight);
if(blend > 0.0f){
KeyFrameTransCompressed *kfA = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameA);
KeyFrameTransCompressed *kfB = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameB);
float t = kfA->deltaTime == 0 ? 0.0f : (kfA->GetDeltaTime() - remainingTime)/kfA->GetDeltaTime();
if(sequence->type & CAnimBlendSequence::KF_TRANS){
CVector transA, transB;
kfA->GetTranslation(&transA);
kfB->GetTranslation(&transB);
trans = transB + t*(transA - transB);
trans *= blend;
}
}
}
void
CAnimBlendNode::GetEndTranslation(CVector &trans, float weight)
{
@ -296,19 +158,3 @@ CAnimBlendNode::GetEndTranslation(CVector &trans, float weight)
trans = kf->translation * blend;
}
}
void
CAnimBlendNode::GetEndTranslationCompressed(CVector &trans, float weight)
{
trans = CVector(0.0f, 0.0f, 0.0f);
float blend = association->GetBlendAmount(weight);
if(blend > 0.0f){
KeyFrameTransCompressed *kf = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(sequence->numFrames-1);
if(sequence->type & CAnimBlendSequence::KF_TRANS){
CVector pos;
kf->GetTranslation(&pos);
trans = pos * blend;
}
}
}

View File

@ -20,17 +20,11 @@ public:
void Init(void);
bool Update(CVector &trans, CQuaternion &rot, float weight);
bool UpdateCompressed(CVector &trans, CQuaternion &rot, float weight);
bool NextKeyFrame(void);
bool NextKeyFrameCompressed(void);
bool FindKeyFrame(float t);
bool SetupKeyFrameCompressed(void);
void CalcDeltas(void);
void CalcDeltasCompressed(void);
void GetCurrentTranslation(CVector &trans, float weight);
void GetCurrentTranslationCompressed(CVector &trans, float weight);
void GetEndTranslation(CVector &trans, float weight);
void GetEndTranslationCompressed(CVector &trans, float weight);
};

View File

@ -9,7 +9,9 @@ CAnimBlendSequence::CAnimBlendSequence(void)
numFrames = 0;
keyFrames = nil;
keyFramesCompressed = nil;
#ifdef PED_SKIN
boneTag = -1;
#endif
}
CAnimBlendSequence::~CAnimBlendSequence(void)
@ -27,21 +29,18 @@ CAnimBlendSequence::SetName(char *name)
}
void
CAnimBlendSequence::SetNumFrames(int numFrames, bool translation, bool compressed)
CAnimBlendSequence::SetNumFrames(int numFrames, bool translation)
{
int sz;
if(translation){
sz = sizeof(KeyFrameTrans);
type |= KF_ROT | KF_TRANS;
if(compressed)
keyFramesCompressed = RwMalloc(sizeof(KeyFrameTrans) * numFrames);
else
keyFrames = RwMalloc(sizeof(KeyFrameTrans) * numFrames);
}else{
sz = sizeof(KeyFrame);
type |= KF_ROT;
if(compressed)
keyFramesCompressed = RwMalloc(sizeof(KeyFrame) * numFrames);
else
keyFrames = RwMalloc(sizeof(KeyFrame) * numFrames);
}
keyFrames = RwMalloc(sz * numFrames);
this->numFrames = numFrames;
}
@ -77,7 +76,7 @@ CAnimBlendSequence::Uncompress(void)
float rotScale = 1.0f/4096.0f;
float timeScale = 1.0f/60.0f;
float transScale = 1.0f/1024.0f;
float transScale = 1.0f/128.0f;
if(type & KF_TRANS){
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTrans));
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)keyFramesCompressed;
@ -130,7 +129,7 @@ CAnimBlendSequence::CompressKeyframes(void)
float rotScale = 4096.0f;
float timeScale = 60.0f;
float transScale = 1024.0f;
float transScale = 128.0f;
if(type & KF_TRANS){
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTransCompressed));
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)newKfs;
@ -198,3 +197,4 @@ CAnimBlendSequence::MoveMemory(void)
return false;
}
#endif

View File

@ -19,38 +19,10 @@ struct KeyFrameTrans : KeyFrame {
struct KeyFrameCompressed {
int16 rot[4]; // 4096
int16 deltaTime; // 60
void GetRotation(CQuaternion *quat){
float scale = 1.0f/4096.0f;
quat->x = rot[0]*scale;
quat->y = rot[1]*scale;
quat->z = rot[2]*scale;
quat->w = rot[3]*scale;
}
void SetRotation(const CQuaternion &quat){
rot[0] = quat.x * 4096.0f;
rot[1] = quat.y * 4096.0f;
rot[2] = quat.z * 4096.0f;
rot[3] = quat.w * 4096.0f;
}
float GetDeltaTime(void) { return deltaTime/60.0f; }
void SetTime(float t) { deltaTime = t*60.0f + 0.5f; }
};
struct KeyFrameTransCompressed : KeyFrameCompressed {
int16 trans[3]; // 1024
void GetTranslation(CVector *vec) {
float scale = 1.0f/1024.0f;
vec->x = trans[0]*scale;
vec->y = trans[1]*scale;
vec->z = trans[2]*scale;
}
void SetTranslation(const CVector &vec){
trans[0] = vec.x*1024.0f;
trans[1] = vec.y*1024.0f;
trans[2] = vec.z*1024.0f;
}
int16 trans[3]; // 128
};
@ -65,31 +37,32 @@ public:
int32 type;
char name[24];
int32 numFrames;
#ifdef PED_SKIN
int16 boneTag;
#endif
void *keyFrames;
void *keyFramesCompressed;
CAnimBlendSequence(void);
virtual ~CAnimBlendSequence(void);
void SetName(char *name);
void SetNumFrames(int numFrames, bool translation, bool compressed);
void SetNumFrames(int numFrames, bool translation);
void RemoveQuaternionFlips(void);
KeyFrame *GetKeyFrame(int n) {
return type & KF_TRANS ?
&((KeyFrameTrans*)keyFrames)[n] :
&((KeyFrame*)keyFrames)[n];
}
KeyFrameCompressed *GetKeyFrameCompressed(int n) {
return type & KF_TRANS ?
&((KeyFrameTransCompressed*)keyFramesCompressed)[n] :
&((KeyFrameCompressed*)keyFramesCompressed)[n];
}
bool HasTranslation(void) { return !!(type & KF_TRANS); }
void Uncompress(void);
void CompressKeyframes(void);
void RemoveUncompressedData(void);
bool MoveMemory(void);
#ifdef PED_SKIN
void SetBoneTag(int tag) { boneTag = tag; }
#endif
};
VALIDATE_SIZE(CAnimBlendSequence, 0x30);
#ifndef PED_SKIN
VALIDATE_SIZE(CAnimBlendSequence, 0x2C);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -6,57 +6,24 @@
enum AssocGroupId
{
ASSOCGRP_STD,
ASSOCGRP_VAN,
ASSOCGRP_COACH,
ASSOCGRP_BIKE_STANDARD,
ASSOCGRP_BIKE_VESPA,
ASSOCGRP_BIKE_HARLEY,
ASSOCGRP_BIKE_DIRT,
ASSOCGRP_UNARMED,
ASSOCGRP_SCREWDRIVER,
ASSOCGRP_KNIFE,
ASSOCGRP_BASEBALLBAT,
ASSOCGRP_GOLFCLUB,
ASSOCGRP_CHAINSAW,
ASSOCGRP_PYTHON,
ASSOCGRP_COLT,
ASSOCGRP_SHOTGUN,
ASSOCGRP_BUDDY,
ASSOCGRP_TEC,
ASSOCGRP_UZI,
ASSOCGRP_RIFLE,
ASSOCGRP_M60,
ASSOCGRP_SNIPER,
ASSOCGRP_THROW,
ASSOCGRP_FLAMETHROWER,
ASSOCGRP_MEDIC,
ASSOCGRP_SUNBATHE,
ASSOCGRP_PLAYER_IDLE,
ASSOCGRP_RIOT,
ASSOCGRP_STRIP,
ASSOCGRP_LANCE,
ASSOCGRP_PLAYER,
ASSOCGRP_PLAYERROCKET,
ASSOCGRP_PLAYER1ARMED,
ASSOCGRP_PLAYER2ARMED,
ASSOCGRP_PLAYERBBBAT,
ASSOCGRP_PLAYERCHAINSAW,
ASSOCGRP_SHUFFLE,
ASSOCGRP_OLD,
ASSOCGRP_GANG1,
ASSOCGRP_GANG2,
ASSOCGRP_FAT,
ASSOCGRP_OLDFAT,
ASSOCGRP_JOGGER,
ASSOCGRP_WOMAN,
ASSOCGRP_WOMANSHOP,
ASSOCGRP_BUSYWOMAN,
ASSOCGRP_SEXYWOMAN,
ASSOCGRP_FATWOMAN,
ASSOCGRP_OLDWOMAN,
ASSOCGRP_JOGWOMAN,
ASSOCGRP_FATWOMAN,
ASSOCGRP_PANICCHUNKY,
ASSOCGRP_SKATE,
#ifdef PC_PLAYER_CONTROLS
ASSOCGRP_PLAYERBACK,
ASSOCGRP_PLAYERLEFT,
@ -64,9 +31,6 @@ enum AssocGroupId
ASSOCGRP_ROCKETBACK,
ASSOCGRP_ROCKETLEFT,
ASSOCGRP_ROCKETRIGHT,
ASSOCGRP_CHAINSAWBACK,
ASSOCGRP_CHAINSAWLEFT,
ASSOCGRP_CHAINSAWRIGHT,
#endif
NUM_ANIM_ASSOC_GROUPS
@ -75,15 +39,11 @@ enum AssocGroupId
class CAnimBlendAssociation;
class CAnimBlendAssocGroup;
#define MAX_ANIMBLOCK_NAME 20
// A block of hierarchies
struct CAnimBlock
{
char name[MAX_ANIMBLOCK_NAME];
bool isLoaded;
int16 refCount;
int32 firstIndex; // first animtion in ms_aAnimations
char name[24];
int32 firstIndex;
int32 numAnims;
};
@ -117,16 +77,7 @@ public:
static void Initialise(void);
static void Shutdown(void);
static void UncompressAnimation(CAnimBlendHierarchy *anim);
static void RemoveFromUncompressedCache(CAnimBlendHierarchy *hier);
static CAnimBlock *GetAnimationBlock(int32 block) { return &ms_aAnimBlocks[block]; }
static CAnimBlock *GetAnimationBlock(const char *name);
static int32 GetAnimationBlockIndex(const char *name);
static int32 RegisterAnimBlock(const char *name);
static int32 GetNumRefsToAnimBlock(int32 block);
static void AddAnimBlockRef(int32 block);
static void RemoveAnimBlockRefWithoutDelete(int32 block);
static void RemoveAnimBlockRef(int32 block);
static void RemoveAnimBlock(int32 block);
static CAnimBlendHierarchy *GetAnimation(const char *name, CAnimBlock *animBlock);
static CAnimBlendHierarchy *GetAnimation(int32 n) { return &ms_aAnimations[n]; }
static const char *GetAnimGroupName(AssocGroupId groupId);
@ -138,8 +89,6 @@ public:
static CAnimBlendAssociation *BlendAnimation(RpClump *clump, AssocGroupId groupId, AnimationId animId, float delta);
static void LoadAnimFiles(void);
static void LoadAnimFile(const char *filename);
static void LoadAnimFile(RwStream *stream, bool compress, char (*uncompressedAnims)[32] = nil);
static void CreateAnimAssocGroups(void);
static void LoadAnimFile(int fd, bool compress);
static void RemoveLastAnimFile(void);
static CAnimBlendAssocGroup* GetAnimAssocGroups(void) { return ms_aAnimAssocGroups; }
};

View File

@ -42,6 +42,9 @@ enum AnimationId
ANIM_STD_HIT_FLOOR,
/* names made up */
#if GTA_VERSION <= GTA3_PS2_160
ANIM_STD_HIT_BODY,
#endif
ANIM_STD_HIT_BODYBLOW,
ANIM_STD_HIT_CHEST,
ANIM_STD_HIT_HEAD,
@ -51,6 +54,42 @@ enum AnimationId
ANIM_STD_HIT_WALL,
ANIM_STD_HIT_FLOOR_FRONT,
ANIM_STD_HIT_BEHIND,
ANIM_STD_PUNCH,
ANIM_STD_KICKGROUND,
/* names made up */
ANIM_STD_WEAPON_BAT_H,
ANIM_STD_WEAPON_BAT_V,
ANIM_STD_WEAPON_HGUN_BODY,
ANIM_STD_WEAPON_AK_BODY,
ANIM_STD_WEAPON_PUMP,
ANIM_STD_WEAPON_SNIPER,
ANIM_STD_WEAPON_THROW,
/**/
ANIM_STD_THROW_UNDER,
/* names made up */
ANIM_STD_START_THROW,
/**/
ANIM_STD_DETONATE,
/* names made up */
ANIM_STD_HGUN_RELOAD,
ANIM_STD_AK_RELOAD,
#ifdef PC_PLAYER_CONTROLS
// maybe wrong define, but unused anyway
ANIM_FPS_PUNCH,
ANIM_FPS_BAT,
ANIM_FPS_UZI,
ANIM_FPS_PUMP,
ANIM_FPS_AK,
ANIM_FPS_M16,
ANIM_FPS_ROCKET,
#endif
/**/
ANIM_STD_FIGHT_IDLE,
ANIM_STD_FIGHT_2IDLE,
ANIM_STD_FIGHT_SHUFFLE_F,
@ -67,23 +106,6 @@ enum AnimationId
/**/
ANIM_STD_PARTIAL_PUNCH,
/* names made up */
ANIM_STD_FIGHT_JAB,
ANIM_STD_FIGHT_ELBOW_L,
ANIM_STD_FIGHT_ELBOW_R,
ANIM_STD_FIGHT_BKICK_L,
ANIM_STD_FIGHT_BKICK_R,
/**/
ANIM_STD_DETONATE,
ANIM_STD_PUNCH,
ANIM_STD_PARTIALPUNCH,
ANIM_STD_KICKGROUND,
ANIM_STD_THROW_UNDER,
ANIM_STD_FIGHT_SHUFFLE_B,
ANIM_STD_JACKEDCAR_RHS,
ANIM_STD_JACKEDCAR_LO_RHS,
ANIM_STD_JACKEDCAR_LHS,
@ -102,7 +124,6 @@ enum AnimationId
ANIM_STD_CAR_CLOSE_DOOR_LO_LHS,
ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LHS,
ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LO_LHS,
ANIM_STD_CAR_JUMP_IN_LO_LHS,
ANIM_STD_GETOUT_LHS,
ANIM_STD_GETOUT_LO_LHS,
ANIM_STD_CAR_CLOSE_LHS,
@ -128,36 +149,29 @@ enum AnimationId
ANIM_STD_CAR_DRIVE_RIGHT_LO,
ANIM_STD_CAR_DRIVEBY_LEFT,
ANIM_STD_CAR_DRIVEBY_RIGHT,
ANIM_STD_CAR_DRIVEBY_LEFT_LO,
ANIM_STD_CAR_DRIVEBY_RIGHT_LO,
ANIM_STD_CAR_LOOKBEHIND,
ANIM_STD_BOAT_DRIVE,
ANIM_STD_BOAT_DRIVE_LEFT,
ANIM_STD_BOAT_DRIVE_RIGHT,
ANIM_STD_BOAT_LOOKBEHIND,
ANIM_STD_BIKE_PICKUP_LHS,
ANIM_STD_BIKE_PICKUP_RHS,
ANIM_STD_BIKE_PULLUP_LHS,
ANIM_STD_BIKE_PULLUP_RHS,
ANIM_STD_BIKE_ELBOW_LHS,
ANIM_STD_BIKE_ELBOW_RHS,
ANIM_STD_BIKE_FALLOFF,
ANIM_STD_BIKE_FALLBACK,
ANIM_STD_GETOUT_RHS,
ANIM_STD_GETOUT_LO_RHS,
ANIM_STD_CAR_CLOSE_RHS,
ANIM_STD_CAR_HOOKERTALK,
ANIM_STD_COACH_OPEN_LHS,
ANIM_STD_COACH_OPEN_RHS,
ANIM_STD_COACH_GET_IN_LHS,
ANIM_STD_COACH_GET_IN_RHS,
ANIM_STD_COACH_GET_OUT_LHS,
ANIM_STD_TRAIN_GETIN,
ANIM_STD_TRAIN_GETOUT,
ANIM_STD_CRAWLOUT_LHS,
ANIM_STD_CRAWLOUT_RHS,
ANIM_STD_ROLLOUT_LHS,
ANIM_STD_ROLLOUT_RHS,
ANIM_STD_VAN_OPEN_DOOR_REAR_LHS,
ANIM_STD_VAN_GET_IN_REAR_LHS,
ANIM_STD_VAN_CLOSE_DOOR_REAR_LHS,
ANIM_STD_VAN_GET_OUT_REAR_LHS,
ANIM_STD_VAN_OPEN_DOOR_REAR_RHS,
ANIM_STD_VAN_GET_IN_REAR_RHS,
ANIM_STD_VAN_CLOSE_DOOR_REAR_RHS,
ANIM_STD_VAN_GET_OUT_REAR_RHS,
ANIM_STD_GET_UP,
ANIM_STD_GET_UP_LEFT,
ANIM_STD_GET_UP_RIGHT,
@ -169,9 +183,6 @@ enum AnimationId
ANIM_STD_FALL_GLIDE,
ANIM_STD_FALL_LAND,
ANIM_STD_FALL_COLLAPSE,
ANIM_STD_FALL_ONBACK,
ANIM_STD_FALL_ONFRONT,
ANIM_STD_EVADE_STEP,
ANIM_STD_EVADE_DIVE,
ANIM_STD_XPRESS_SCRATCH,
@ -179,12 +190,15 @@ enum AnimationId
ANIM_STD_TURN180,
ANIM_STD_ARREST,
ANIM_STD_DROWN,
ANIM_MEDIC_CPR,
ANIM_STD_DUCK_DOWN,
ANIM_STD_DUCK_LOW,
ANIM_STD_DUCK_WEAPON,
ANIM_STD_RBLOCK_SHOOT,
/* names made up */
ANIM_STD_THROW_UNDER2,
/**/
ANIM_STD_HANDSUP,
ANIM_STD_HANDSCOWER,
ANIM_STD_PARTIAL_FUCKU,
@ -192,96 +206,5 @@ enum AnimationId
ANIM_STD_PHONE_OUT,
ANIM_STD_PHONE_TALK,
ANIM_STD_SEAT_DOWN,
ANIM_STD_SEAT_UP,
ANIM_STD_SEAT_IDLE,
ANIM_STD_SEAT_RVRS,
ANIM_STD_ATM,
ANIM_STD_ABSEIL,
ANIM_STD_NUM,
ANIM_STD_VAN_OPEN_DOOR_REAR_LHS,
ANIM_STD_VAN_GET_IN_REAR_LHS,
ANIM_STD_VAN_CLOSE_DOOR_REAR_LHS,
ANIM_STD_VAN_GET_OUT_REAR_LHS,
ANIM_STD_VAN_OPEN_DOOR_REAR_RHS,
ANIM_STD_VAN_GET_IN_REAR_RHS,
ANIM_STD_VAN_CLOSE_DOOR_REAR_RHS,
ANIM_STD_VAN_GET_OUT_REAR_RHS,
ANIM_STD_COACH_OPEN_LHS,
ANIM_STD_COACH_OPEN_RHS,
ANIM_STD_COACH_GET_IN_LHS,
ANIM_STD_COACH_GET_IN_RHS,
ANIM_STD_COACH_GET_OUT_LHS,
ANIM_BIKE_RIDE,
ANIM_BIKE_READY,
ANIM_BIKE_LEFT,
ANIM_BIKE_RIGHT,
ANIM_BIKE_LEANB,
ANIM_BIKE_LEANF,
ANIM_BIKE_WALKBACK,
ANIM_BIKE_JUMPON_LHS,
ANIM_BIKE_JUMPON_RHS,
ANIM_BIKE_KICK,
ANIM_BIKE_HIT,
ANIM_BIKE_GETOFF_LHS,
ANIM_BIKE_GETOFF_RHS,
ANIM_BIKE_GETOFF_BACK,
ANIM_BIKE_DRIVEBY_LHS,
ANIM_BIKE_DRIVEBY_RHS,
ANIM_BIKE_DRIVEBY_FORWARD,
ANIM_BIKE_RIDE_P,
ANIM_ATTACK_1,
ANIM_ATTACK_2,
ANIM_ATTACK_EXTRA1,
ANIM_ATTACK_EXTRA2,
ANIM_ATTACK_3,
// our synonyms... because originals are hard to understand
ANIM_WEAPON_FIRE = ANIM_ATTACK_1,
ANIM_WEAPON_CROUCHFIRE,
ANIM_WEAPON_FIRE_2ND = ANIM_WEAPON_CROUCHFIRE,
ANIM_WEAPON_RELOAD,
ANIM_WEAPON_CROUCHRELOAD,
ANIM_WEAPON_FIRE_3RD,
ANIM_THROWABLE_THROW = ANIM_ATTACK_1,
ANIM_THROWABLE_THROWU,
ANIM_THROWABLE_START_THROW,
ANIM_MELEE_ATTACK = ANIM_ATTACK_1,
ANIM_MELEE_ATTACK_2ND,
ANIM_MELEE_ATTACK_START,
ANIM_MELEE_IDLE_FIGHTMODE,
ANIM_MELEE_ATTACK_FINISH,
ANIM_SUNBATHE_IDLE,
ANIM_SUNBATHE_DOWN,
ANIM_SUNBATHE_UP,
ANIM_SUNBATHE_ESCAPE,
ANIM_MEDIC_CPR,
ANIM_PLAYER_IDLE1,
ANIM_PLAYER_IDLE2,
ANIM_PLAYER_IDLE3,
ANIM_PLAYER_IDLE4,
ANIM_RIOT_ANGRY,
ANIM_RIOT_ANGRY_B,
ANIM_RIOT_CHANT,
ANIM_RIOT_PUNCHES,
ANIM_RIOT_SHOUT,
ANIM_RIOT_CHALLENGE,
ANIM_RIOT_FUCKYOU,
ANIM_STRIP_A,
ANIM_STRIP_B,
ANIM_STRIP_C,
ANIM_STRIP_D,
ANIM_STRIP_E,
ANIM_STRIP_F,
ANIM_STRIP_G,
ANIM_STD_NUM
};

View File

@ -2,29 +2,26 @@
#include "PedModelInfo.h"
#include "Bones.h"
#ifdef PED_SKIN
int
ConvertPedNode2BoneTag(int node)
{
switch(node){
case PED_MID: return BONE_spine1;
case PED_HEAD: return BONE_head;
case PED_UPPERARML: return BONE_l_upperarm;
case PED_UPPERARMR: return BONE_r_upperarm;
case PED_HANDL: return BONE_l_hand;
case PED_HANDR: return BONE_r_hand;
case PED_UPPERLEGL: return BONE_l_thigh;
case PED_UPPERLEGR: return BONE_r_thigh;
case PED_FOOTL: return BONE_l_foot;
case PED_FOOTR: return BONE_r_foot;
case PED_LOWERLEGR: return BONE_r_calf;
case PED_LOWERLEGL: return BONE_l_calf;
case PED_FOREARML: return BONE_l_forearm;
case PED_FOREARMR: return BONE_r_forearm;
case PED_CLAVICLEL: return BONE_l_clavicle;
case PED_CLAVICLER: return BONE_r_clavicle;
case PED_NECK: return BONE_neck;
case PED_TORSO: return BONE_waist;
case PED_MID: return BONE_torso; // this is what Xbox/Mobile use
// return BONE_mid; // this is what PS2/PC use
case PED_HEAD: return BONE_head;
case PED_UPPERARML: return BONE_upperarml;
case PED_UPPERARMR: return BONE_upperarmr;
case PED_HANDL: return BONE_Lhand;
case PED_HANDR: return BONE_Rhand;
case PED_UPPERLEGL: return BONE_upperlegl;
case PED_UPPERLEGR: return BONE_upperlegr;
case PED_FOOTL: return BONE_footl;
case PED_FOOTR: return BONE_footr;
case PED_LOWERLEGR: return BONE_lowerlegl;
}
assert(0 && "this node has no bone");
return -1;
}
@ -32,28 +29,24 @@ const char*
ConvertBoneTag2BoneName(int tag)
{
switch(tag){
case BONE_root: return "Root";
case BONE_pelvis: return "Pelvis";
case BONE_spine: return "Spine";
case BONE_spine1: return "Spine1";
case BONE_neck: return "Neck";
case BONE_head: return "Head";
case BONE_r_clavicle: return "Bip01 R Clavicle";
case BONE_r_upperarm: return "R UpperArm";
case BONE_r_forearm: return "R Forearm";
case BONE_r_hand: return "R Hand";
case BONE_r_finger: return "R Fingers";
case BONE_l_clavicle: return "Bip01 L Clavicle";
case BONE_l_upperarm: return "L UpperArm";
case BONE_l_forearm: return "L Forearm";
case BONE_l_hand: return "L Hand";
case BONE_l_finger: return "L Fingers";
case BONE_l_thigh: return "L Thigh";
case BONE_l_calf: return "L Calf";
case BONE_l_foot: return "L Foot";
case BONE_r_thigh: return "R Thigh";
case BONE_r_calf: return "R Calf";
case BONE_r_foot: return "R Foot";
case BONE_waist: return "Swaist";
case BONE_upperlegr: return "Supperlegr";
case BONE_lowerlegr: return "Slowerlegr";
case BONE_footr: return "Sfootr";
case BONE_upperlegl: return "Supperlegl";
case BONE_lowerlegl: return "Slowerlegl";
case BONE_footl: return "Sfootl";
case BONE_mid: return "Smid";
case BONE_torso: return "Storso";
case BONE_head: return "Shead";
case BONE_upperarmr: return "Supperarmr";
case BONE_lowerarmr: return "Slowerarmr";
case BONE_Rhand: return "SRhand";
case BONE_upperarml: return "Supperarml";
case BONE_lowerarml: return "Slowerarml";
case BONE_Lhand: return "SLhand";
}
return nil;
}
#endif

View File

@ -2,28 +2,22 @@
enum BoneTag
{
BONE_root = 0,
BONE_pelvis = 1,
BONE_spine = 2,
BONE_spine1 = 3,
BONE_neck = 4,
BONE_head = 5,
BONE_l_clavicle = 31,
BONE_l_upperarm = 32,
BONE_l_forearm = 33,
BONE_l_hand = 34,
BONE_l_finger = 35,
BONE_r_clavicle = 21,
BONE_r_upperarm = 22,
BONE_r_forearm = 23,
BONE_r_hand = 24,
BONE_r_finger = 25,
BONE_l_thigh = 41,
BONE_l_calf = 42,
BONE_l_foot = 43,
BONE_r_thigh = 51,
BONE_r_calf = 52,
BONE_r_foot = 53,
BONE_waist,
BONE_upperlegr,
BONE_lowerlegr,
BONE_footr,
BONE_upperlegl,
BONE_lowerlegl,
BONE_footl,
BONE_mid,
BONE_torso,
BONE_head,
BONE_upperarmr,
BONE_lowerarmr,
BONE_Rhand,
BONE_upperarml,
BONE_lowerarml,
BONE_Lhand,
};
int ConvertPedNode2BoneTag(int node);

View File

@ -16,92 +16,94 @@
#include "World.h"
#include "PlayerPed.h"
#include "Wanted.h"
#include "CutsceneHead.h"
#include "RpAnimBlend.h"
#include "ModelIndices.h"
#include "TempColModels.h"
#include "ColStore.h"
#include "Radar.h"
#include "Pools.h"
const struct {
const char *szTrackName;
int iTrackId;
} musicNameIdAssoc[] = {
{ "ASS_1", STREAMED_SOUND_CUTSCENE_ASS_1 },
{ "ASS_2", STREAMED_SOUND_CUTSCENE_ASS_2 },
{ "BANK_1", STREAMED_SOUND_CUTSCENE_BANK_1 },
{ "BANK_2A", STREAMED_SOUND_CUTSCENE_BANK_2A },
{ "BANK_2B", STREAMED_SOUND_CUTSCENE_BANK_2B },
{ "BANK_3A", STREAMED_SOUND_CUTSCENE_BANK_3A },
{ "BANK_3B", STREAMED_SOUND_CUTSCENE_BANK_3B },
{ "BANK_4", STREAMED_SOUND_CUTSCENE_BANK_4 },
{ "BIKE_1", STREAMED_SOUND_CUTSCENE_BIKE_1 },
{ "BIKE_2", STREAMED_SOUND_CUTSCENE_BIKE_2 },
{ "BIKE_3", STREAMED_SOUND_CUTSCENE_BIKE_3 },
{ "BUD_1", STREAMED_SOUND_CUTSCENE_BUD_1 },
{ "BUD_2", STREAMED_SOUND_CUTSCENE_BUD_2 },
{ "BUD_3", STREAMED_SOUND_CUTSCENE_BUD_3 },
{ "CAP_1", STREAMED_SOUND_CUTSCENE_CAP_1 },
{ "CAR_1", STREAMED_SOUND_CUTSCENE_CAR_1 },
{ "CNT_1A", STREAMED_SOUND_CUTSCENE_CNT_1A },
{ "CNT_1B", STREAMED_SOUND_CUTSCENE_CNT_1B },
{ "CNT_2", STREAMED_SOUND_CUTSCENE_CNT_2 },
{ "COK_1", STREAMED_SOUND_CUTSCENE_COK_1 },
{ "COK_2A", STREAMED_SOUND_CUTSCENE_COK_2A },
{ "COK_2B", STREAMED_SOUND_CUTSCENE_COK_2B },
{ "COK_3", STREAMED_SOUND_CUTSCENE_COK_3 },
{ "COK_4A", STREAMED_SOUND_CUTSCENE_COK_4A },
{ "COK_4A2", STREAMED_SOUND_CUTSCENE_COK_4A2 },
{ "COK_4B", STREAMED_SOUND_CUTSCENE_COK_4B },
{ "COL_1", STREAMED_SOUND_CUTSCENE_COL_1 },
{ "COL_2", STREAMED_SOUND_CUTSCENE_COL_2 },
{ "COL_3A", STREAMED_SOUND_CUTSCENE_COL_3A },
{ "COL_4A", STREAMED_SOUND_CUTSCENE_COL_4A },
{ "COL_5A", STREAMED_SOUND_CUTSCENE_COL_5A },
{ "COL_5B", STREAMED_SOUND_CUTSCENE_COL_5B },
{ "CUB_1", STREAMED_SOUND_CUTSCENE_CUB_1 },
{ "CUB_2", STREAMED_SOUND_CUTSCENE_CUB_2 },
{ "CUB_3", STREAMED_SOUND_CUTSCENE_CUB_3 },
{ "CUB_4", STREAMED_SOUND_CUTSCENE_CUB_4 },
{ "DRUG_1", STREAMED_SOUND_CUTSCENE_DRUG_1 },
{ "FIN", STREAMED_SOUND_CUTSCENE_FIN },
{ "FIN_2", STREAMED_SOUND_CUTSCENE_FIN2 },
{ "FINALE", STREAMED_SOUND_CUTSCENE_FINALE },
{ "HAT_1", STREAMED_SOUND_CUTSCENE_HAT_1 },
{ "HAT_2", STREAMED_SOUND_CUTSCENE_HAT_2 },
{ "HAT_3", STREAMED_SOUND_CUTSCENE_HAT_3 },
{ "ICE_1", STREAMED_SOUND_CUTSCENE_ICE_1 },
{ "INT_A", STREAMED_SOUND_CUTSCENE_INT_A },
{ "INT_B", STREAMED_SOUND_CUTSCENE_INT_B },
{ "INT_D", STREAMED_SOUND_CUTSCENE_INT_D },
{ "INT_M", STREAMED_SOUND_CUTSCENE_INT_M },
{ "LAW_1A", STREAMED_SOUND_CUTSCENE_LAW_1A },
{ "LAW_1B", STREAMED_SOUND_CUTSCENE_LAW_1B },
{ "LAW_2A", STREAMED_SOUND_CUTSCENE_LAW_2A },
{ "LAW_2B", STREAMED_SOUND_CUTSCENE_LAW_2B },
{ "LAW_2C", STREAMED_SOUND_CUTSCENE_LAW_2C },
{ "LAW_3", STREAMED_SOUND_CUTSCENE_LAW_3 },
{ "LAW_4", STREAMED_SOUND_CUTSCENE_LAW_4 },
{ "PHIL_1", STREAMED_SOUND_CUTSCENE_PHIL_1 },
{ "PHIL_2", STREAMED_SOUND_CUTSCENE_PHIL_2 },
{ "PORN_1", STREAMED_SOUND_CUTSCENE_PORN_1 },
{ "PORN_2", STREAMED_SOUND_CUTSCENE_PORN_2 },
{ "PORN_3", STREAMED_SOUND_CUTSCENE_PORN_3 },
{ "PORN_4", STREAMED_SOUND_CUTSCENE_PORN_4 },
{ "RESC_1A", STREAMED_SOUND_CUTSCENE_RESC_1A },
{ "ROK_1", STREAMED_SOUND_CUTSCENE_ROK_1 },
{ "ROK_2", STREAMED_SOUND_CUTSCENE_ROK_2 },
{ "ROK_3A", STREAMED_SOUND_CUTSCENE_ROK_3A },
{ "STRIPA", STREAMED_SOUND_CUTSCENE_STRIPA },
{ "TAX_1", STREAMED_SOUND_CUTSCENE_TAX_1 },
{ "TEX_1", STREAMED_SOUND_CUTSCENE_TEX_1 },
{ "TEX_2", STREAMED_SOUND_CUTSCENE_TEX_2 },
{ "TEX_3", STREAMED_SOUND_CUTSCENE_TEX_3 },
{ "GSPOT", STREAMED_SOUND_CUTSCENE_GLIGHT },
{ "FIST", STREAMED_SOUND_CUTSCENE_FIST },
{ "EL_PH1", STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1 },
{ "EL_PH2", STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2 },
{ NULL, 0 }
{ "JB", STREAMED_SOUND_NEWS_INTRO },
{ "BET", STREAMED_SOUND_BANK_INTRO },
{ "L1_LG", STREAMED_SOUND_CUTSCENE_LUIGI1_LG },
{ "L2_DSB", STREAMED_SOUND_CUTSCENE_LUIGI2_DSB },
{ "L3_DM", STREAMED_SOUND_CUTSCENE_LUIGI3_DM },
{ "L4_PAP", STREAMED_SOUND_CUTSCENE_LUIGI4_PAP },
{ "L5_TFB", STREAMED_SOUND_CUTSCENE_LUIGI5_TFB },
{ "J0_DM2", STREAMED_SOUND_CUTSCENE_JOEY0_DM2 },
{ "J1_LFL", STREAMED_SOUND_CUTSCENE_JOEY1_LFL },
{ "J2_KCL", STREAMED_SOUND_CUTSCENE_JOEY2_KCL },
{ "J3_VH", STREAMED_SOUND_CUTSCENE_JOEY3_VH },
{ "J4_ETH", STREAMED_SOUND_CUTSCENE_JOEY4_ETH },
{ "J5_DST", STREAMED_SOUND_CUTSCENE_JOEY5_DST },
{ "J6_TBJ", STREAMED_SOUND_CUTSCENE_JOEY6_TBJ },
{ "T1_TOL", STREAMED_SOUND_CUTSCENE_TONI1_TOL },
{ "T2_TPU", STREAMED_SOUND_CUTSCENE_TONI2_TPU },
{ "T3_MAS", STREAMED_SOUND_CUTSCENE_TONI3_MAS },
{ "T4_TAT", STREAMED_SOUND_CUTSCENE_TONI4_TAT },
{ "T5_BF", STREAMED_SOUND_CUTSCENE_TONI5_BF },
{ "S0_MAS", STREAMED_SOUND_CUTSCENE_SAL0_MAS },
{ "S1_PF", STREAMED_SOUND_CUTSCENE_SAL1_PF },
{ "S2_CTG", STREAMED_SOUND_CUTSCENE_SAL2_CTG },
{ "S3_RTC", STREAMED_SOUND_CUTSCENE_SAL3_RTC },
{ "S5_LRQ", STREAMED_SOUND_CUTSCENE_SAL5_LRQ },
{ "S4_BDBA", STREAMED_SOUND_CUTSCENE_SAL4_BDBA },
{ "S4_BDBB", STREAMED_SOUND_CUTSCENE_SAL4_BDBB },
{ "S2_CTG2", STREAMED_SOUND_CUTSCENE_SAL2_CTG2 },
{ "S4_BDBD", STREAMED_SOUND_CUTSCENE_SAL4_BDBD },
{ "S5_LRQB", STREAMED_SOUND_CUTSCENE_SAL5_LRQB },
{ "S5_LRQC", STREAMED_SOUND_CUTSCENE_SAL5_LRQC },
{ "A1_SS0", STREAMED_SOUND_CUTSCENE_ASUKA_1_SSO },
{ "A2_PP", STREAMED_SOUND_CUTSCENE_ASUKA_2_PP },
{ "A3_SS", STREAMED_SOUND_CUTSCENE_ASUKA_3_SS },
{ "A4_PDR", STREAMED_SOUND_CUTSCENE_ASUKA_4_PDR },
{ "A5_K2FT", STREAMED_SOUND_CUTSCENE_ASUKA_5_K2FT},
{ "K1_KBO", STREAMED_SOUND_CUTSCENE_KENJI1_KBO },
{ "K2_GIS", STREAMED_SOUND_CUTSCENE_KENJI2_GIS },
{ "K3_DS", STREAMED_SOUND_CUTSCENE_KENJI3_DS },
{ "K4_SHI", STREAMED_SOUND_CUTSCENE_KENJI4_SHI },
{ "K5_SD", STREAMED_SOUND_CUTSCENE_KENJI5_SD },
{ "R0_PDR2", STREAMED_SOUND_CUTSCENE_RAY0_PDR2 },
{ "R1_SW", STREAMED_SOUND_CUTSCENE_RAY1_SW },
{ "R2_AP", STREAMED_SOUND_CUTSCENE_RAY2_AP },
{ "R3_ED", STREAMED_SOUND_CUTSCENE_RAY3_ED },
{ "R4_GF", STREAMED_SOUND_CUTSCENE_RAY4_GF },
{ "R5_PB", STREAMED_SOUND_CUTSCENE_RAY5_PB },
{ "R6_MM", STREAMED_SOUND_CUTSCENE_RAY6_MM },
{ "D1_STOG", STREAMED_SOUND_CUTSCENE_DONALD1_STOG },
{ "D2_KK", STREAMED_SOUND_CUTSCENE_DONALD2_KK },
{ "D3_ADO", STREAMED_SOUND_CUTSCENE_DONALD3_ADO },
{ "D5_ES", STREAMED_SOUND_CUTSCENE_DONALD5_ES },
{ "D7_MLD", STREAMED_SOUND_CUTSCENE_DONALD7_MLD },
{ "D4_GTA", STREAMED_SOUND_CUTSCENE_DONALD4_GTA },
{ "D4_GTA2", STREAMED_SOUND_CUTSCENE_DONALD4_GTA2 },
{ "D6_STS", STREAMED_SOUND_CUTSCENE_DONALD6_STS },
{ "A6_BAIT", STREAMED_SOUND_CUTSCENE_ASUKA6_BAIT },
{ "A7_ETG", STREAMED_SOUND_CUTSCENE_ASUKA7_ETG },
{ "A8_PS", STREAMED_SOUND_CUTSCENE_ASUKA8_PS },
{ "A9_ASD", STREAMED_SOUND_CUTSCENE_ASUKA9_ASD },
{ "K4_SHI2", STREAMED_SOUND_CUTSCENE_KENJI4_SHI2 },
{ "C1_TEX", STREAMED_SOUND_CUTSCENE_CATALINA1_TEX },
{ "EL_PH1", STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1 },
{ "EL_PH2", STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2 },
{ "EL_PH3", STREAMED_SOUND_CUTSCENE_ELBURRO3_PH3 },
{ "EL_PH4", STREAMED_SOUND_CUTSCENE_ELBURRO4_PH4 },
{ "YD_PH1", STREAMED_SOUND_CUTSCENE_YARDIE_PH1 },
{ "YD_PH2", STREAMED_SOUND_CUTSCENE_YARDIE_PH2 },
{ "YD_PH3", STREAMED_SOUND_CUTSCENE_YARDIE_PH3 },
{ "YD_PH4", STREAMED_SOUND_CUTSCENE_YARDIE_PH4 },
{ "HD_PH1", STREAMED_SOUND_CUTSCENE_HOODS_PH1 },
{ "HD_PH2", STREAMED_SOUND_CUTSCENE_HOODS_PH2 },
{ "HD_PH3", STREAMED_SOUND_CUTSCENE_HOODS_PH3 },
{ "HD_PH4", STREAMED_SOUND_CUTSCENE_HOODS_PH4 },
{ "HD_PH5", STREAMED_SOUND_CUTSCENE_HOODS_PH5 },
{ "MT_PH1", STREAMED_SOUND_CUTSCENE_MARTY_PH1 },
{ "MT_PH2", STREAMED_SOUND_CUTSCENE_MARTY_PH2 },
{ "MT_PH3", STREAMED_SOUND_CUTSCENE_MARTY_PH3 },
{ "MT_PH4", STREAMED_SOUND_CUTSCENE_MARTY_PH4 },
{ NULL, 0 }
};
int
@ -126,18 +128,7 @@ char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE];
CAnimBlendAssocGroup CCutsceneMgr::ms_cutsceneAssociations;
CVector CCutsceneMgr::ms_cutsceneOffset;
float CCutsceneMgr::ms_cutsceneTimer;
bool CCutsceneMgr::ms_wasCutsceneSkipped;
uint32 CCutsceneMgr::ms_cutsceneLoadStatus;
bool CCutsceneMgr::ms_useCutsceneShadows = true;
bool bCamLoaded;
bool bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver; // pls don't shrink the name :P
int32 NumberOfSavedWeapons;
eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS];
int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS];
char uncompressedAnims[8][32];
uint32 numUncompressedAnims;
RpAtomic *
CalculateBoundingSphereRadiusCB(RpAtomic *atomic, void *data)
@ -159,17 +150,13 @@ CCutsceneMgr::Initialise(void)
{
ms_numCutsceneObjs = 0;
ms_loaded = false;
ms_wasCutsceneSkipped = false;
ms_running = false;
ms_useLodMultiplier = false;
ms_animLoaded = false;
ms_cutsceneProcessing = false;
ms_useLodMultiplier = false;
ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE);
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
numUncompressedAnims = 0;
uncompressedAnims[0][0] = '\0';
}
void
@ -187,10 +174,9 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
CPlayerPed *pPlayerPed;
ms_cutsceneProcessing = true;
ms_wasCutsceneSkipped = false;
CTimer::Suspend();
if (!bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver)
CStreaming::RemoveCurrentZonesModels();
if (!strcasecmp(szCutsceneName, "jb"))
ms_useLodMultiplier = true;
CTimer::Stop();
ms_pCutsceneDir->numEntries = 0;
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
@ -199,42 +185,32 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
CGame::DrasticTidyUpMemory(true);
strcpy(ms_cutsceneName, szCutsceneName);
RwStream *stream;
stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG");
assert(stream);
file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb");
// Load animations
sprintf(gString, "%s.IFP", szCutsceneName);
if (ms_pCutsceneDir->FindItem(gString, offset, size)) {
CStreaming::MakeSpaceFor(size << 11);
CStreaming::ImGonnaUseStreamingMemory();
RwStreamSkip(stream, offset << 11);
CAnimManager::LoadAnimFile(stream, true, uncompressedAnims);
CFileMgr::Seek(file, offset << 11, SEEK_SET);
CAnimManager::LoadAnimFile(file, false);
ms_cutsceneAssociations.CreateAssociations(szCutsceneName);
CStreaming::IHaveUsedStreamingMemory();
ms_animLoaded = true;
} else {
ms_animLoaded = false;
}
RwStreamClose(stream, nil);
// Load camera data
file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb");
sprintf(gString, "%s.DAT", szCutsceneName);
if (ms_pCutsceneDir->FindItem(gString, offset, size)) {
CStreaming::ImGonnaUseStreamingMemory();
CFileMgr::Seek(file, offset << 11, SEEK_SET);
TheCamera.LoadPathSplines(file);
CStreaming::IHaveUsedStreamingMemory();
bCamLoaded = true;
} else {
bCamLoaded = false;
}
CFileMgr::CloseFile(file);
if (CGeneral::faststricmp(ms_cutsceneName, "finale")) {
if (CGeneral::faststricmp(ms_cutsceneName, "end")) {
DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE);
int trackId = FindCutsceneAudioTrackId(szCutsceneName);
if (trackId != -1) {
@ -249,23 +225,30 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
ms_cutsceneOffset = CVector(0.0f, 0.0f, 0.0f);
pPlayerPed = FindPlayerPed();
CTimer::Update();
pPlayerPed->m_pWanted->ClearQdCrimes();
pPlayerPed->bIsVisible = false;
pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina;
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE);
CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(true);
}
CTimer::Resume();
void
CCutsceneMgr::SetHeadAnim(const char *animName, CObject *pObject)
{
CCutsceneHead *pCutsceneHead = (CCutsceneHead*)pObject;
char szAnim[CUTSCENENAMESIZE * 2];
sprintf(szAnim, "%s_%s", ms_cutsceneName, animName);
pCutsceneHead->PlayAnimation(szAnim);
}
void
CCutsceneMgr::FinishCutscene()
{
ms_wasCutsceneSkipped = true;
if (bCamLoaded) {
CCutsceneMgr::ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f;
TheCamera.FinishCutscene();
}
CCutsceneMgr::ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f;
TheCamera.FinishCutscene();
FindPlayerPed()->bIsVisible = true;
CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false);
@ -274,11 +257,9 @@ CCutsceneMgr::FinishCutscene()
void
CCutsceneMgr::SetupCutsceneToStart(void)
{
if (bCamLoaded) {
TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset);
TheCamera.TakeControlWithSpline(JUMP_CUT);
TheCamera.SetWideScreenOn();
}
TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset);
TheCamera.TakeControlWithSpline(JUMP_CUT);
TheCamera.SetWideScreenOn();
ms_cutsceneOffset.z++;
@ -286,27 +267,12 @@ CCutsceneMgr::SetupCutsceneToStart(void)
assert(RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP);
if (CAnimBlendAssociation *pAnimBlendAssoc = RpAnimBlendClumpGetFirstAssociation((RpClump*)ms_pCutsceneObjects[i]->m_rwObject)) {
assert(pAnimBlendAssoc->hierarchy->sequences[0].HasTranslation());
if (ms_pCutsceneObjects[i]->m_pAttachTo != nil) {
pAnimBlendAssoc->flags &= (~ASSOC_HAS_TRANSLATION);
} else {
if (pAnimBlendAssoc->hierarchy->IsCompressed()){
KeyFrameTransCompressed *keyFrames = ((KeyFrameTransCompressed*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0));
CVector trans;
keyFrames->GetTranslation(&trans);
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + trans);
}else{
KeyFrameTrans *keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0));
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + keyFrames->translation);
}
}
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0))->translation);
CWorld::Add(ms_pCutsceneObjects[i]);
pAnimBlendAssoc->SetRun();
} else {
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset);
}
CWorld::Add(ms_pCutsceneObjects[i]);
if (RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP) {
ms_pCutsceneObjects[i]->UpdateRpHAnim();
}
}
CTimer::Update();
@ -322,55 +288,25 @@ CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject)
CAnimBlendClumpData *pAnimBlendClumpData;
assert(RwObjectGetType(pObject->m_rwObject) == rpCLUMP);
debug("Give cutscene anim %s\n", animName);
RpAnimBlendClumpRemoveAllAssociations((RpClump*)pObject->m_rwObject);
pNewAnim = ms_cutsceneAssociations.GetAnimation(animName);
if (!pNewAnim) {
debug("\n\nHaven't I told you I can't find the fucking animation %s\n\n\n", animName);
return;
}
if (pNewAnim->hierarchy->IsCompressed())
pNewAnim->hierarchy->keepCompressed = true;
CStreaming::ImGonnaUseStreamingMemory();
pNewAnim = ms_cutsceneAssociations.CopyAnimation(animName);
CStreaming::IHaveUsedStreamingMemory();
pNewAnim->SetCurrentTime(0.0f);
pNewAnim->flags |= ASSOC_HAS_TRANSLATION;
pNewAnim->flags &= ~ASSOC_RUNNING;
pAnimBlendClumpData = *RPANIMBLENDCLUMPDATA(pObject->m_rwObject);
pAnimBlendClumpData->link.Prepend(&pNewAnim->link);
if (pNewAnim->hierarchy->keepCompressed)
pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::COMPRESSED;
}
void
CCutsceneMgr::SetCutsceneAnimToLoop(const char* animName)
{
ms_cutsceneAssociations.GetAnimation(animName)->flags |= ASSOC_REPEAT;
}
CCutsceneHead *
CCutsceneMgr::AddCutsceneHead(CObject *pObject, int modelId)
{
return nil;
}
void UpdateCutsceneObjectBoundingBox(RpClump* clump, int modelId)
{
if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) {
CColModel* pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01];
float radius = 0.0f;
RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius);
pColModel->boundingSphere.radius = radius;
pColModel->boundingBox.min = CVector(-radius, -radius, -radius);
pColModel->boundingBox.max = CVector(radius, radius, radius);
}
CCutsceneHead *pHead = new CCutsceneHead(pObject);
pHead->SetModelIndex(modelId);
CWorld::Add(pHead);
ms_pCutsceneObjects[ms_numCutsceneObjs++] = pHead;
return pHead;
}
CCutsceneObject *
@ -378,25 +314,20 @@ CCutsceneMgr::CreateCutsceneObject(int modelId)
{
CBaseModelInfo *pModelInfo;
CColModel *pColModel;
float radius;
RpClump *clump;
CCutsceneObject *pCutsceneObject;
CStreaming::ImGonnaUseStreamingMemory();
debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetModelName());
if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) {
pModelInfo = CModelInfo::GetModelInfo(modelId);
pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01];
radius = 0.0f;
pModelInfo->SetColModel(pColModel);
UpdateCutsceneObjectBoundingBox((RpClump*)pModelInfo->GetRwObject(), modelId);
} else if (modelId >= MI_SPECIAL01 && modelId <= MI_SPECIAL21) {
pModelInfo = CModelInfo::GetModelInfo(modelId);
if (pModelInfo->GetColModel() == &CTempColModels::ms_colModelPed1) {
CColModel *colModel = new CColModel();
colModel->boundingSphere.radius = 2.0f;
colModel->boundingSphere.center = CVector(0.0f, 0.0f, 0.0f);
pModelInfo->SetColModel(colModel, true);
}
pColModel = pModelInfo->GetColModel();
float radius = 2.0f;
clump = (RpClump*)pModelInfo->GetRwObject();
assert(RwObjectGetType((RwObject*)clump) == rpCLUMP);
RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius);
pColModel->boundingSphere.radius = radius;
pColModel->boundingBox.min = CVector(-radius, -radius, -radius);
pColModel->boundingBox.max = CVector(radius, radius, radius);
@ -404,10 +335,7 @@ CCutsceneMgr::CreateCutsceneObject(int modelId)
pCutsceneObject = new CCutsceneObject();
pCutsceneObject->SetModelIndex(modelId);
if (ms_useCutsceneShadows)
pCutsceneObject->CreateShadow();
ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject;
CStreaming::IHaveUsedStreamingMemory();
return pCutsceneObject;
}
@ -415,11 +343,9 @@ void
CCutsceneMgr::DeleteCutsceneData(void)
{
if (!ms_loaded) return;
CTimer::Suspend();
ms_cutsceneProcessing = false;
ms_useLodMultiplier = false;
ms_useCutsceneShadows = true;
for (--ms_numCutsceneObjs; ms_numCutsceneObjs >= 0; ms_numCutsceneObjs--) {
CWorld::Remove(ms_pCutsceneObjects[ms_numCutsceneObjs]);
@ -429,27 +355,12 @@ CCutsceneMgr::DeleteCutsceneData(void)
}
ms_numCutsceneObjs = 0;
for (int i = MI_SPECIAL01; i < MI_SPECIAL21; i++) {
CBaseModelInfo *minfo = CModelInfo::GetModelInfo(i);
CColModel *colModel = minfo->GetColModel();
if (colModel != &CTempColModels::ms_colModelPed1) {
delete colModel;
minfo->SetColModel(&CTempColModels::ms_colModelPed1);
}
}
if (ms_animLoaded)
CAnimManager::RemoveLastAnimFile();
ms_animLoaded = false;
numUncompressedAnims = 0;
uncompressedAnims[0][0] = '\0';
if (bCamLoaded) {
TheCamera.RestoreWithJumpCut();
TheCamera.SetWideScreenOff();
TheCamera.DeleteCutSceneCamDataMemory();
}
TheCamera.RestoreWithJumpCut();
TheCamera.SetWideScreenOff();
ms_running = false;
ms_loaded = false;
@ -457,42 +368,14 @@ CCutsceneMgr::DeleteCutsceneData(void)
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CUTSCENE);
CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false);
if (CGeneral::faststricmp(ms_cutsceneName, "finale")) {
if (CGeneral::faststricmp(ms_cutsceneName, "end")) {
DMAudio.StopCutSceneMusic();
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
if (CGeneral::faststricmp(ms_cutsceneName, "bet"))
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
}
CStreaming::ms_disableStreaming = false;
CWorld::bProcessCutsceneOnly = false;
if(bCamLoaded)
CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2);
CPad::GetPad(0)->Clear(false);
if (bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver) {
CStreaming::LoadInitialPeds();
CStreaming::LoadInitialWeapons();
CStreaming::LoadInitialVehicles();
bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = false;
CPlayerPed *pPlayerPed = FindPlayerPed();
for (int i = 0; i < NumberOfSavedWeapons; i++) {
int32 weaponModelId = CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModelId;
uint8 flags = CStreaming::ms_aInfoForModel[weaponModelId].m_flags;
CStreaming::RequestModel(weaponModelId, STREAMFLAGS_DONT_REMOVE);
CStreaming::LoadAllRequestedModels(false);
if (CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id != -1) {
CStreaming::RequestModel(CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id, 0);
CStreaming::LoadAllRequestedModels(false);
}
if (!(flags & STREAMFLAGS_DONT_REMOVE))
CStreaming::SetModelIsDeletable(weaponModelId);
pPlayerPed->GiveWeapon(SavedWeaponIDs[i], SavedWeaponAmmo[i], true);
}
NumberOfSavedWeapons = 0;
}
CTimer::Resume();
CTimer::Stop();
CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2);
CTimer::Update();
}
void
@ -509,7 +392,7 @@ CCutsceneMgr::Update(void)
switch (ms_cutsceneLoadStatus) {
case CUTSCENE_LOADING_AUDIO:
SetupCutsceneToStart();
if (CGeneral::faststricmp(ms_cutsceneName, "finale"))
if (CGeneral::faststricmp(ms_cutsceneName, "end"))
DMAudio.PlayPreloadedCutSceneMusic();
ms_cutsceneLoadStatus++;
break;
@ -527,157 +410,15 @@ CCutsceneMgr::Update(void)
if (!ms_running) return;
ms_cutsceneTimer += CTimer::GetTimeStepNonClippedInSeconds();
for (int i = 0; i < ms_numCutsceneObjs; i++) {
int modelId = ms_pCutsceneObjects[i]->GetModelIndex();
if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05)
UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId);
if (ms_pCutsceneObjects[i]->m_pAttachTo != nil && modelId >= MI_SPECIAL01 && modelId <= MI_SPECIAL21)
UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId);
}
if (bCamLoaded)
if (CGeneral::faststricmp(ms_cutsceneName, "finale") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADING_0) {
if (CPad::GetPad(0)->GetCrossJustDown()
|| (CGame::playingIntro && CPad::GetPad(0)->GetStartJustDown())
|| CPad::GetPad(0)->GetLeftMouseJustDown()
|| CPad::GetPad(0)->GetEnterJustDown()
|| CPad::GetPad(0)->GetCharJustDown(' '))
FinishCutscene();
}
}
bool CCutsceneMgr::HasCutsceneFinished(void) { return !bCamLoaded || TheCamera.GetPositionAlongSpline() == 1.0f; }
void
CCutsceneMgr::LoadAnimationUncompressed(char const* name)
{
strcpy(uncompressedAnims[numUncompressedAnims], name);
// Because that's how CAnimManager knows the end of array
++numUncompressedAnims;
assert(numUncompressedAnims < ARRAY_SIZE(uncompressedAnims));
uncompressedAnims[numUncompressedAnims][0] = '\0';
}
void
CCutsceneMgr::AttachObjectToParent(CObject *pObject, CEntity *pAttachTo)
{
((CCutsceneObject*)pObject)->m_pAttachmentObject = nil;
((CCutsceneObject*)pObject)->m_pAttachTo = RpClumpGetFrame(pAttachTo->GetClump());
debug("Attach %s to %s\n", CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName());
}
void
CCutsceneMgr::AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame)
{
((CCutsceneObject*)pObject)->m_pAttachmentObject = nil;
((CCutsceneObject*)pObject)->m_pAttachTo = RpAnimBlendClumpFindFrame(pAttachTo->GetClump(), frame)->frame;
debug("Attach %s to component %s of %s\n",
CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(),
frame,
CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName());
if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) {
RpClump *clump = (RpClump*)pObject->m_rwObject;
if (IsClumpSkinned(clump))
RpAtomicGetBoundingSphere(GetFirstAtomic(clump))->radius *= 1.1f;
if (CGeneral::faststricmp(ms_cutsceneName, "end") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADING_0) {
if (CPad::GetPad(0)->GetCrossJustDown()
|| (CGame::playingIntro && CPad::GetPad(0)->GetStartJustDown())
|| CPad::GetPad(0)->GetLeftMouseJustDown()
|| CPad::GetPad(0)->GetEnterJustDown()
|| CPad::GetPad(0)->GetCharJustDown(' '))
FinishCutscene();
}
}
void
CCutsceneMgr::AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int bone)
{
RpHAnimHierarchy *hanim = GetAnimHierarchyFromSkinClump(pAttachTo->GetClump());
RwInt32 id = RpHAnimIDGetIndex(hanim, bone);
RwMatrix *matrixArray = RpHAnimHierarchyGetMatrixArray(hanim);
((CCutsceneObject*)pObject)->m_pAttachmentObject = pAttachTo;
((CCutsceneObject*)pObject)->m_pAttachTo = &matrixArray[id];
debug("Attach %s to %s\n",
CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(),
CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName());
}
bool CCutsceneMgr::HasCutsceneFinished(void) { return TheCamera.GetPositionAlongSpline() == 1.0f; }
void
CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver()
{
CStreaming::ms_disableStreaming = true;
CColStore::RemoveAllCollision();
CWorld::bProcessCutsceneOnly = true;
ms_cutsceneProcessing = true;
for (int i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) {
CPed *pPed = CPools::GetPedPool()->GetSlot(i);
if (pPed) {
if (!pPed->IsPlayer() && pPed->CanBeDeleted()) {
CWorld::Remove(pPed);
delete pPed;
}
}
}
for (int i = CPools::GetVehiclePool()->GetSize() - 1; i >= 0; i--) {
CVehicle *pVehicle = CPools::GetVehiclePool()->GetSlot(i);
if (pVehicle) {
if (pVehicle->CanBeDeleted()) {
CWorld::Remove(pVehicle);
delete pVehicle;
}
}
}
bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true;
CStreaming::RemoveCurrentZonesModels();
CStreaming::SetModelIsDeletable(MI_MALE01);
CStreaming::SetModelTxdIsDeletable(MI_MALE01);
CStreaming::SetModelIsDeletable(MI_TAXI_D);
CStreaming::SetModelTxdIsDeletable(MI_TAXI_D);
CStreaming::SetModelIsDeletable(MI_NIGHTSTICK);
CStreaming::SetModelTxdIsDeletable(MI_NIGHTSTICK);
CStreaming::SetModelIsDeletable(MI_MISSILE);
CStreaming::SetModelTxdIsDeletable(MI_MISSILE);
CStreaming::SetModelIsDeletable(MI_POLICE);
CStreaming::SetModelTxdIsDeletable(MI_POLICE);
while (CStreaming::RemoveLoadedVehicle()) ;
CRadar::RemoveRadarSections();
for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) {
CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i);
if (pDummy)
pDummy->DeleteRwObject();
}
for (int i = CPools::GetObjectPool()->GetSize() - 1; i >= 0; i--) {
CObject* pObject = CPools::GetObjectPool()->GetSlot(i);
if (pObject)
pObject->DeleteRwObject();
}
for (int i = CPools::GetBuildingPool()->GetSize() - 1; i >= 0; i--) {
CBuilding* pBuilding = CPools::GetBuildingPool()->GetSlot(i);
if (pBuilding && pBuilding->m_rwObject != nil && pBuilding->bIsBIGBuilding && pBuilding->bStreamBIGBuilding) {
if (pBuilding->bIsBIGBuilding)
CStreaming::RequestModel(pBuilding->GetModelIndex(), 0);
if (!pBuilding->bImBeingRendered)
pBuilding->DeleteRwObject();
}
}
CPlayerPed *pPlayerPed = FindPlayerPed();
pPlayerPed->RemoveWeaponAnims(0, -1000.0f);
NumberOfSavedWeapons = 0;
for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) {
if (pPlayerPed->m_weapons[i].m_eWeaponType != WEAPONTYPE_UNARMED) {
SavedWeaponIDs[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_eWeaponType;
SavedWeaponAmmo[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_nAmmoTotal;
NumberOfSavedWeapons++;
}
}
pPlayerPed->ClearWeapons();
CGame::DrasticTidyUpMemory(true);
}

View File

@ -21,9 +21,7 @@ class CCutsceneMgr
static CAnimBlendAssocGroup ms_cutsceneAssociations;
static CVector ms_cutsceneOffset;
static float ms_cutsceneTimer;
static bool ms_wasCutsceneSkipped;
static bool ms_cutsceneProcessing;
static bool ms_useCutsceneShadows;
public:
static CDirectory *ms_pCutsceneDir;
static uint32 ms_cutsceneLoadStatus;
@ -32,7 +30,6 @@ public:
static bool IsRunning(void) { return ms_running; }
static bool HasLoaded(void) { return ms_loaded; }
static bool IsCutsceneProcessing(void) { return ms_cutsceneProcessing; }
static bool WasCutsceneSkipped(void) { return ms_wasCutsceneSkipped; }
static bool UseLodMultiplier(void) { return ms_useLodMultiplier; }
static CCutsceneObject* GetCutsceneObject(int id) { return ms_pCutsceneObjects[id]; }
static int GetCutsceneTimeInMilleseconds(void) { return 1000.0f * ms_cutsceneTimer; }
@ -44,18 +41,11 @@ public:
static void Shutdown(void);
static void LoadCutsceneData(const char *szCutsceneName);
static void FinishCutscene(void);
static void SetHeadAnim(const char *animName, CObject *pObject);
static void SetupCutsceneToStart(void);
static void SetCutsceneAnim(const char *animName, CObject *pObject);
static void SetCutsceneAnimToLoop(const char *animName);
static CCutsceneHead *AddCutsceneHead(CObject *pObject, int modelId);
static CCutsceneObject *CreateCutsceneObject(int modelId);
static void DeleteCutsceneData(void);
static void LoadAnimationUncompressed(char const*);
static void Update(void);
static void AttachObjectToParent(CObject *pObject, CEntity *pAttachTo);
static void AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame);
static void AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int frame);
static void RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver();
static void DisableCutsceneShadows() { ms_useCutsceneShadows = false; }
};

View File

@ -17,8 +17,6 @@ void FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackWithVelocityExtractionSkinned(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackWith3dVelocityExtractionSkinned(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
void
FrameUpdateCallBackNonSkinned(AnimBlendFrameData *frame, void *arg)
@ -230,11 +228,12 @@ FrameUpdateCallBackWith3dVelocityExtractionNonSkinned(AnimBlendFrameData *frame,
RwMatrixUpdate(mat);
}
#ifdef PED_SKIN
void
FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg)
{
CVector vec, pos(0.0f, 0.0f, 0.0f);
float transBlendAmount = 0.0f;
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
float totalBlendAmount = 0.0f;
RpHAnimStdInterpFrame *xform = frame->hanimFrame;
@ -258,13 +257,13 @@ FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg)
for(node = updateData->nodes; *node; node++){
if((*node)->sequence){
(*node)->Update(vec, q, 1.0f-totalBlendAmount);
if((*node)->sequence->HasTranslation()){
if((*node)->sequence->HasTranslation())
pos += vec;
transBlendAmount += (*node)->association->blendAmount;
}
#ifdef FIX_BUGS
if(DotProduct(rot, q) < 0.0f)
rot -= q;
else
#endif
rot += q;
}
++*node;
@ -279,12 +278,12 @@ FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg)
}
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
xform->t.x = transBlendAmount*pos.x;
xform->t.y = transBlendAmount*pos.y;
xform->t.z = transBlendAmount*pos.z;
xform->t.x += (1.0f-transBlendAmount)*frame->resetPos.x;
xform->t.y += (1.0f-transBlendAmount)*frame->resetPos.y;
xform->t.z += (1.0f-transBlendAmount)*frame->resetPos.z;
xform->t.x = pos.x;
xform->t.y = pos.y;
xform->t.z = pos.z;
xform->t.x += frame->resetPos.x;
xform->t.y += frame->resetPos.y;
xform->t.z += frame->resetPos.z;
}
}
@ -320,9 +319,11 @@ FrameUpdateCallBackWithVelocityExtractionSkinned(AnimBlendFrameData *frame, void
for(node = updateData->nodes; *node; node++){
if((*node)->sequence){
bool nodelooped = (*node)->Update(vec, q, 1.0f-totalBlendAmount);
#ifdef FIX_BUGS
if(DotProduct(rot, q) < 0.0f)
rot -= q;
else
#endif
rot += q;
if((*node)->sequence->HasTranslation()){
pos += vec;
@ -441,228 +442,4 @@ FrameUpdateCallBackWith3dVelocityExtractionSkinned(AnimBlendFrameData *frame, vo
}
}
void
FrameUpdateCallBackOffscreen(AnimBlendFrameData *frame, void *arg)
{
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION && gpAnimBlendClump->velocity2d)
FrameUpdateCallBackWithVelocityExtractionSkinned(frame, arg);
}
void
FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg)
{
CVector vec, pos(0.0f, 0.0f, 0.0f);
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
float totalBlendAmount = 0.0f;
CVector trans(0.0f, 0.0f, 0.0f);
CVector cur(0.0f, 0.0f, 0.0f);
CVector end(0.0f, 0.0f, 0.0f);
bool looped = false;
RwMatrix *mat = RwFrameGetMatrix(frame->frame);
CAnimBlendNode **node;
AnimBlendFrameUpdateData *updateData = (AnimBlendFrameUpdateData*)arg;
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION &&
gpAnimBlendClump->velocity2d){
if(updateData->foobar)
for(node = updateData->nodes; *node; node++)
if((*node)->sequence && (*node)->association->IsPartial())
totalBlendAmount += (*node)->association->blendAmount;
for(node = updateData->nodes; *node; node++)
if((*node)->sequence && (*node)->sequence->HasTranslation()){
if((*node)->association->HasTranslation()){
(*node)->GetCurrentTranslationCompressed(vec, 1.0f-totalBlendAmount);
cur += vec;
}
}
for(node = updateData->nodes; *node; node++){
if((*node)->sequence){
bool nodelooped = (*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
#ifdef FIX_BUGS
if(DotProduct(rot, q) < 0.0f)
rot -= q;
else
#endif
rot += q;
if((*node)->sequence->HasTranslation()){
pos += vec;
if((*node)->association->HasTranslation()){
trans += vec;
looped |= nodelooped;
if(nodelooped){
(*node)->GetEndTranslationCompressed(vec, 1.0f-totalBlendAmount);
end += vec;
}
}
}
}
++*node;
}
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
RwMatrixSetIdentity(mat);
rot.Normalise();
rot.Get(mat);
}
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
*gpAnimBlendClump->velocity3d = trans - cur;
if(looped)
*gpAnimBlendClump->velocity3d += end;
mat->pos.x = (pos - trans).x + frame->resetPos.x;
mat->pos.y = (pos - trans).y + frame->resetPos.y;
mat->pos.z = (pos - trans).z + frame->resetPos.z;
}
RwMatrixUpdate(mat);
}else{
if(updateData->foobar)
for(node = updateData->nodes; *node; node++)
if((*node)->sequence && (*node)->association->IsPartial())
totalBlendAmount += (*node)->association->blendAmount;
for(node = updateData->nodes; *node; node++){
if((*node)->sequence){
(*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
if((*node)->sequence->HasTranslation())
pos += vec;
#ifdef FIX_BUGS
if(DotProduct(rot, q) < 0.0f)
rot -= q;
else
#endif
rot += q;
}
++*node;
}
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
RwMatrixSetIdentity(mat);
rot.Normalise();
rot.Get(mat);
}
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
mat->pos.x = pos.x;
mat->pos.y = pos.y;
mat->pos.z = pos.z;
mat->pos.x += frame->resetPos.x;
mat->pos.y += frame->resetPos.y;
mat->pos.z += frame->resetPos.z;
}
RwMatrixUpdate(mat);
}
}
void
FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg)
{
CVector vec, pos(0.0f, 0.0f, 0.0f);
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
float totalBlendAmount = 0.0f;
CVector trans(0.0f, 0.0f, 0.0f);
CVector cur(0.0f, 0.0f, 0.0f);
CVector end(0.0f, 0.0f, 0.0f);
bool looped = false;
RpHAnimStdInterpFrame *xform = frame->hanimFrame;
CAnimBlendNode **node;
AnimBlendFrameUpdateData *updateData = (AnimBlendFrameUpdateData*)arg;
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION &&
gpAnimBlendClump->velocity2d){
if(updateData->foobar)
for(node = updateData->nodes; *node; node++)
if((*node)->sequence && (*node)->association->IsPartial())
totalBlendAmount += (*node)->association->blendAmount;
for(node = updateData->nodes; *node; node++)
if((*node)->sequence && (*node)->sequence->HasTranslation()){
if((*node)->association->HasTranslation()){
(*node)->GetCurrentTranslationCompressed(vec, 1.0f-totalBlendAmount);
cur += vec;
}
}
for(node = updateData->nodes; *node; node++){
if((*node)->sequence){
bool nodelooped = (*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
#ifdef FIX_BUGS
if(DotProduct(rot, q) < 0.0f)
rot -= q;
else
#endif
rot += q;
if((*node)->sequence->HasTranslation()){
pos += vec;
if((*node)->association->HasTranslation()){
trans += vec;
looped |= nodelooped;
if(nodelooped){
(*node)->GetEndTranslationCompressed(vec, 1.0f-totalBlendAmount);
end += vec;
}
}
}
}
++*node;
}
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
rot.Normalise();
xform->q.imag.x = rot.x;
xform->q.imag.y = rot.y;
xform->q.imag.z = rot.z;
xform->q.real = rot.w;
}
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
*gpAnimBlendClump->velocity3d = trans - cur;
if(looped)
*gpAnimBlendClump->velocity3d += end;
xform->t.x = (pos - trans).x + frame->resetPos.x;
xform->t.y = (pos - trans).y + frame->resetPos.y;
xform->t.z = (pos - trans).z + frame->resetPos.z;
}
}else{
float transBlendAmount = 0.0f;
if(updateData->foobar)
for(node = updateData->nodes; *node; node++)
if((*node)->sequence && (*node)->association->IsPartial())
totalBlendAmount += (*node)->association->blendAmount;
for(node = updateData->nodes; *node; node++){
if((*node)->sequence){
(*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
if((*node)->sequence->HasTranslation()){
pos += vec;
transBlendAmount += (*node)->association->blendAmount;
}
if(DotProduct(rot, q) < 0.0f)
rot -= q;
else
rot += q;
}
++*node;
}
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
rot.Normalise();
xform->q.imag.x = rot.x;
xform->q.imag.y = rot.y;
xform->q.imag.z = rot.z;
xform->q.real = rot.w;
}
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
xform->t.x = transBlendAmount*pos.x;
xform->t.y = transBlendAmount*pos.y;
xform->t.z = transBlendAmount*pos.z;
xform->t.x += (1.0f-transBlendAmount)*frame->resetPos.x;
xform->t.y += (1.0f-transBlendAmount)*frame->resetPos.y;
xform->t.z += (1.0f-transBlendAmount)*frame->resetPos.z;
}
}
}

View File

@ -10,7 +10,9 @@
#include "AnimBlendAssociation.h"
#include "AnimManager.h"
#include "RpAnimBlend.h"
#ifdef PED_SKIN
#include "PedModelInfo.h"
#endif
RwInt32 ClumpOffset;
@ -140,6 +142,7 @@ FrameInitCBskin(AnimBlendFrameData *frameData, void*)
frameData->flag = 0;
}
#ifdef PED_SKIN
void
RpAnimBlendClumpInitSkinned(RpClump *clump)
{
@ -153,7 +156,7 @@ RpAnimBlendClumpInitSkinned(RpClump *clump)
RpAnimBlendAllocateData(clump);
clumpData = *RPANIMBLENDCLUMPDATA(clump);
atomic = GetFirstAtomic(clump);
atomic = IsClumpSkinned(clump);
assert(atomic);
skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic));
assert(skin);
@ -168,15 +171,12 @@ RpAnimBlendClumpInitSkinned(RpClump *clump)
for(i = 0; i < numBones; i++){
frames[i].nodeID = HIERNODEID(hier, i);
frames[i].resetPos = boneTab[i];
#ifdef LIBRW
frames[i].hanimFrame = (RpHAnimStdInterpFrame*)rpHANIMHIERARCHYGETINTERPFRAME(hier, i);
#else
frames[i].hanimFrame = (RpHAnimStdInterpFrame*)rtANIMGETINTERPFRAME(hier->currentAnim, i);
#endif
}
clumpData->ForAllFrames(FrameInitCBskin, nil);
clumpData->frames[0].flag |= AnimBlendFrameData::VELOCITY_EXTRACTION;
}
#endif
void
RpAnimBlendClumpInitNotSkinned(RpClump *clump)
@ -200,9 +200,11 @@ RpAnimBlendClumpInitNotSkinned(RpClump *clump)
void
RpAnimBlendClumpInit(RpClump *clump)
{
#ifdef PED_SKIN
if(IsClumpSkinned(clump))
RpAnimBlendClumpInitSkinned(clump);
else
#endif
RpAnimBlendClumpInitNotSkinned(clump);
}
@ -362,6 +364,7 @@ FillFrameArrayCBnonskin(AnimBlendFrameData *frame, void *arg)
frames[CVisibilityPlugins::GetFrameHierarchyId(frame->frame)] = frame;
}
#ifdef PED_SKIN
void
RpAnimBlendClumpFillFrameArraySkin(RpClump *clump, AnimBlendFrameData **frames)
{
@ -371,18 +374,22 @@ RpAnimBlendClumpFillFrameArraySkin(RpClump *clump, AnimBlendFrameData **frames)
for(i = PED_MID; i < PED_NODE_MAX; i++)
frames[i] = &clumpData->frames[RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(i))];
}
#endif
void
RpAnimBlendClumpFillFrameArray(RpClump *clump, AnimBlendFrameData **frames)
{
#ifdef PED_SKIN
if(IsClumpSkinned(clump))
RpAnimBlendClumpFillFrameArraySkin(clump, frames);
else
#endif
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FillFrameArrayCBnonskin, frames);
}
AnimBlendFrameData *pFrameDataFound;
// FrameFindCallBack on PS2
void
FrameFindByNameCBnonskin(AnimBlendFrameData *frame, void *arg)
{
@ -391,6 +398,7 @@ FrameFindByNameCBnonskin(AnimBlendFrameData *frame, void *arg)
pFrameDataFound = frame;
}
#ifdef PED_SKIN
void
FrameFindByNameCBskin(AnimBlendFrameData *frame, void *arg)
{
@ -398,58 +406,25 @@ FrameFindByNameCBskin(AnimBlendFrameData *frame, void *arg)
if(name && CGeneral::faststricmp(name, (char*)arg) == 0)
pFrameDataFound = frame;
}
void
FrameFindByBoneCB(AnimBlendFrameData *frame, void *arg)
{
if(frame->nodeID == (int32)(uintptr)arg)
pFrameDataFound = frame;
}
#endif
AnimBlendFrameData*
RpAnimBlendClumpFindFrame(RpClump *clump, const char *name)
{
pFrameDataFound = nil;
#ifdef PED_SKIN
if(IsClumpSkinned(clump))
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FrameFindByNameCBskin, (void*)name);
else
#endif
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FrameFindByNameCBnonskin, (void*)name);
return pFrameDataFound;
}
AnimBlendFrameData*
RpAnimBlendClumpFindBone(RpClump *clump, uint32 boneTag)
{
pFrameDataFound = nil;
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FrameFindByBoneCB, (void*)boneTag);
return pFrameDataFound;
}
void
RpAnimBlendNodeUpdateKeyframes(AnimBlendFrameData *frames, AnimBlendFrameUpdateData *updateData, int32 numNodes)
{
CAnimBlendNode **node;
int i;
for(node = updateData->nodes; *node; node++){
CAnimBlendAssociation *a = (*node)->association;
for(i = 0; i < numNodes; i++)
if((frames[i].flag & AnimBlendFrameData::VELOCITY_EXTRACTION) == 0 ||
gpAnimBlendClump->velocity2d == nil){
if((*node)[i].sequence)
(*node)[i].FindKeyFrame(a->currentTime - a->timeStep);
}
}
}
// TODO:
// CAnimBlendClumpData::LoadFramesIntoSPR
// CAnimBlendClumpData::ForAllFramesInSPR
void
RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta, bool doRender)
RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
{
int i;
CAnimBlendAssociation *assoc;
AnimBlendFrameUpdateData updateData;
float totalLength = 0.0f;
float totalBlend = 0.0f;
@ -465,53 +440,30 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta, bool doRender)
updateData.foobar = 0;
for(link = clumpData->link.next; link; link = next){
next = link->next;
assoc = CAnimBlendAssociation::FromLink(link);
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
if(assoc->UpdateBlend(timeDelta)){
if(assoc->hierarchy->sequences){
CAnimManager::UncompressAnimation(assoc->hierarchy);
if(i < 11)
updateData.nodes[i++] = assoc->GetNode(0);
if(assoc->flags & ASSOC_MOVEMENT){
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
totalBlend += assoc->blendAmount;
}else
updateData.foobar = 1;
CAnimManager::UncompressAnimation(assoc->hierarchy);
updateData.nodes[i++] = assoc->GetNode(0);
if(assoc->flags & ASSOC_MOVEMENT){
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
totalBlend += assoc->blendAmount;
}else
debug("anim %s is not loaded\n", assoc->hierarchy->name);
updateData.foobar = 1;
}
}
for(link = clumpData->link.next; link; link = link->next){
assoc = CAnimBlendAssociation::FromLink(link);
assoc->UpdateTimeStep(timeDelta, totalLength == 0.0f ? 1.0f : totalBlend/totalLength);
}
updateData.nodes[i] = nil;
#ifdef ANIM_COMPRESSION
if(clumpData->frames[0].flag & AnimBlendFrameData::COMPRESSED){
if(IsClumpSkinned(clump))
clumpData->ForAllFrames(FrameUpdateCallBackSkinnedCompressed, &updateData);
else
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinnedCompressed, &updateData);
}else
#ifdef PED_SKIN
if(IsClumpSkinned(clump))
clumpData->ForAllFrames(FrameUpdateCallBackSkinned, &updateData);
else
#endif
if(doRender){
if(clumpData->frames[0].flag & AnimBlendFrameData::UPDATE_KEYFRAMES)
RpAnimBlendNodeUpdateKeyframes(clumpData->frames, &updateData, clumpData->numFrames);
if(IsClumpSkinned(clump))
clumpData->ForAllFrames(FrameUpdateCallBackSkinned, &updateData);
else
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinned, &updateData);
clumpData->frames[0].flag &= ~AnimBlendFrameData::UPDATE_KEYFRAMES;
}else{
clumpData->ForAllFrames(FrameUpdateCallBackOffscreen, &updateData);
clumpData->frames[0].flag |= AnimBlendFrameData::UPDATE_KEYFRAMES;
}
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinned, &updateData);
for(link = clumpData->link.next; link; link = link->next){
assoc = CAnimBlendAssociation::FromLink(link);
assoc->UpdateTime(timeDelta, totalLength == 0.0f ? 1.0f : totalBlend/totalLength);
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
float relSpeed = totalLength == 0.0f ? 1.0f : totalBlend/totalLength;
assoc->UpdateTime(timeDelta, relSpeed);
}
RwFrameUpdateObjects(RpClumpGetFrame(clump));
}

View File

@ -26,7 +26,6 @@ void RpAnimBlendClumpInit(RpClump *clump);
bool RpAnimBlendClumpIsInitialized(RpClump *clump);
void RpAnimBlendClumpFillFrameArray(RpClump* clump, AnimBlendFrameData** frames);
AnimBlendFrameData *RpAnimBlendClumpFindFrame(RpClump *clump, const char *name);
AnimBlendFrameData *RpAnimBlendClumpFindBone(RpClump *clump, uint32 boneTag);
void FillFrameArrayCallBack(AnimBlendFrameData *frame, void *arg);
CAnimBlendAssociation *RpAnimBlendClumpGetAssociation(RpClump *clump, uint32 id);
CAnimBlendAssociation *RpAnimBlendClumpGetMainAssociation(RpClump *clump, CAnimBlendAssociation **assocRet, float *blendRet);
@ -35,14 +34,9 @@ CAnimBlendAssociation *RpAnimBlendClumpGetMainAssociation_N(RpClump *clump, int
CAnimBlendAssociation *RpAnimBlendClumpGetMainPartialAssociation_N(RpClump *clump, int n);
CAnimBlendAssociation *RpAnimBlendClumpGetFirstAssociation(RpClump *clump, uint32 mask);
CAnimBlendAssociation *RpAnimBlendClumpGetFirstAssociation(RpClump *clump);
void RpAnimBlendNodeUpdateKeyframes(AnimBlendFrameData *frames, AnimBlendFrameUpdateData *updateData, int32 numNodes);
void RpAnimBlendClumpUpdateAnimations(RpClump* clump, float timeDelta, bool doRender = true);
void RpAnimBlendClumpUpdateAnimations(RpClump* clump, float timeDelta);
extern CAnimBlendClumpData *gpAnimBlendClump;
void FrameUpdateCallBackNonSkinned(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackOffscreen(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
void FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg);

View File

@ -169,9 +169,7 @@ static const uint32 gOneShotCol[] = {SFX_COL_TARMAC_1,
SFX_TYRE_BUMP,
SFX_COL_CARDBOARD_1,
SFX_COL_TARMAC_1,
SFX_COL_GATE,
SFX_COL_SAND_1,
SFX_COL_TARMAC_1 };
SFX_COL_GATE};
void
cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
@ -219,7 +217,7 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] % 4;
break;
case SFX_COL_PED_1:
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 2;
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 5;
break;
case SFX_COL_WOOD_CRATES_1:
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 4;
@ -268,7 +266,7 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
m_sQueueSample.m_MaxDistance = COLLISION_MAX_DIST;
m_sQueueSample.m_bStatic = TRUE;
SET_SOUND_REVERB(TRUE);
m_sQueueSample.m_bReverb = TRUE;
SET_SOUND_REFLECTION(FALSE);
AddSampleToRequestedQueue();
}
@ -279,12 +277,12 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
void
cAudioManager::SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter)
{
bool8 distCalculated = FALSE;
if(col.m_fIntensity2 > 0.0016f) {
uint8 emittingVol = SetLoopingCollisionRequestedSfxFreqAndGetVol(col);
if(emittingVol) {
CalculateDistance(distCalculated, m_sQueueSample.m_fDistance);
m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, COLLISION_MAX_DIST, m_sQueueSample.m_fDistance);
m_sQueueSample.m_fDistance = Sqrt(col.m_fDistance);
m_sQueueSample.m_nVolume =
ComputeVolume(emittingVol, COLLISION_MAX_DIST, m_sQueueSample.m_fDistance);
if(m_sQueueSample.m_nVolume > 0) {
m_sQueueSample.m_nCounter = counter;
m_sQueueSample.m_vecPos = col.m_vecPosition;
@ -293,12 +291,12 @@ cAudioManager::SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 coun
m_sQueueSample.m_nPriority = 7;
m_sQueueSample.m_nLoopCount = 0;
SET_EMITTING_VOLUME(emittingVol);
SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex)
SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex);
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
m_sQueueSample.m_MaxDistance = COLLISION_MAX_DIST;
m_sQueueSample.m_bStatic = FALSE;
m_sQueueSample.m_nFramesToPlay = 5;
SET_SOUND_REVERB(TRUE);
m_sQueueSample.m_bReverb = TRUE;
SET_SOUND_REFLECTION(FALSE);
AddSampleToRequestedQueue();
}
@ -325,8 +323,8 @@ cAudioManager::SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollisio
m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP;
m_sQueueSample.m_nFrequency = 6050.f * ratio + 16000;
vol = 30.f * ratio;
} else if(surface1 == SURFACE_GRAVEL || surface2 == SURFACE_GRAVEL || surface1 == SURFACE_MUD_DRY || surface2 == SURFACE_MUD_DRY ||
surface1 == SURFACE_SAND || surface2 == SURFACE_SAND || surface1 == SURFACE_SAND_BEACH || surface2 == SURFACE_SAND_BEACH) {
} else if(surface1 == SURFACE_GRAVEL || surface2 == SURFACE_GRAVEL || surface1 == SURFACE_MUD_DRY ||
surface2 == SURFACE_MUD_DRY || surface1 == SURFACE_SAND || surface2 == SURFACE_SAND) {
ratio = GetCollisionRatio(audioCollision.m_fIntensity2, 0.0001f, 0.09f, 0.0899f);
m_sQueueSample.m_nSampleIndex = SFX_GRAVEL_SKID;
m_sQueueSample.m_nFrequency = 6000.f * ratio + 10000;
@ -351,12 +349,11 @@ cAudioManager::GetCollisionOneShotRatio(uint32 a, float b)
case SURFACE_TARMAC:
case SURFACE_PAVEMENT:
case SURFACE_STEEP_CLIFF:
case SURFACE_TRANSPARENT_STONE:
case SURFACE_CONCRETE_BEACH: return GetCollisionRatio(b, 10.f, 60.f, 50.f);
case SURFACE_TRANSPARENT_STONE: return GetCollisionRatio(b, 10.f, 60.f, 50.f);
case SURFACE_GRASS:
case SURFACE_CARDBOARDBOX:
case SURFACE_GRAVEL:
case SURFACE_MUD_DRY:
case SURFACE_CARDBOARDBOX: return GetCollisionRatio(b, 0.f, 2.f, 2.f);
case SURFACE_MUD_DRY: return GetCollisionRatio(b, 0.f, 2.f, 2.f);
case SURFACE_CAR: return GetCollisionRatio(b, 6.f, 50.f, 44.f);
case SURFACE_GLASS:
case SURFACE_METAL_CHAIN_FENCE: return GetCollisionRatio(b, 0.1f, 10.f, 9.9f);
@ -365,7 +362,7 @@ cAudioManager::GetCollisionOneShotRatio(uint32 a, float b)
case SURFACE_GARAGE_DOOR: return GetCollisionRatio(b, 20.f, 100.f, 80.f);
case SURFACE_CAR_PANEL: return GetCollisionRatio(b, 0.f, 4.f, 4.f);
case SURFACE_SCAFFOLD_POLE:
case SURFACE_METAL_GATE:
case SURFACE_METAL_GATE:
case SURFACE_LAMP_POST: return GetCollisionRatio(b, 1.f, 10.f, 9.f);
case SURFACE_FIRE_HYDRANT: return GetCollisionRatio(b, 1.f, 15.f, 14.f);
case SURFACE_GIRDER: return GetCollisionRatio(b, 8.f, 50.f, 42.f);
@ -373,8 +370,7 @@ cAudioManager::GetCollisionOneShotRatio(uint32 a, float b)
case SURFACE_SAND:
case SURFACE_WATER:
case SURFACE_RUBBER:
case SURFACE_WHEELBASE:
case SURFACE_SAND_BEACH: return GetCollisionRatio(b, 0.f, 10.f, 10.f);
case SURFACE_WHEELBASE: return GetCollisionRatio(b, 0.f, 10.f, 10.f);
case SURFACE_WOOD_CRATES: return GetCollisionRatio(b, 1.f, 4.f, 3.f);
case SURFACE_WOOD_BENCH: return GetCollisionRatio(b, 0.1f, 5.f, 4.9f);
case SURFACE_WOOD_SOLID: return GetCollisionRatio(b, 0.1f, 40.f, 39.9f);

View File

@ -54,4 +54,4 @@ public:
void AddCollisionToRequestedQueue();
};
VALIDATE_SIZE(cAudioCollisionManager, 0x354);
VALIDATE_SIZE(cAudioCollisionManager, 852);

File diff suppressed because it is too large Load Diff

View File

@ -10,18 +10,21 @@
#include "sampman.h"
#include "Camera.h"
#include "World.h"
#include "ZoneCull.h"
#include "Entity.h"
cAudioManager AudioManager;
#define SPEED_OF_SOUND 343.f
#ifdef GTA_PS2
#define TIME_SPENT 40
#else
#define TIME_SPENT 50
#endif
cAudioManager::cAudioManager()
{
m_bIsInitialised = FALSE;
m_bIsSurround = TRUE;
m_nChannelOffset = 0;
m_fSpeedOfSound = SPEED_OF_SOUND / TIME_SPENT;
m_nTimeSpent = TIME_SPENT;
m_nActiveSamples = NUM_CHANNELS_GENERIC;
@ -87,7 +90,7 @@ cAudioManager::Terminate()
for (uint32 i = 0; i < NUM_AUDIOENTITIES; i++) {
m_asAudioEntities[i].m_bIsUsed = FALSE;
m_aAudioEntityOrderList[i] = ARRAY_SIZE(m_aAudioEntityOrderList);
m_aAudioEntityOrderList[i] = NUM_AUDIOENTITIES;
}
m_nAudioEntitiesCount = 0;
@ -197,7 +200,7 @@ cAudioManager::DestroyEntity(int32 id)
{
if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed) {
m_asAudioEntities[id].m_bIsUsed = FALSE;
for (uint32 i = 0; i < m_nAudioEntitiesCount; ++i) {
for (uint32 i = 0; i < m_nAudioEntitiesCount; i++) {
if (id == m_aAudioEntityOrderList[i]) {
if (i < NUM_AUDIOENTITIES - 1)
memmove(&m_aAudioEntityOrderList[i], &m_aAudioEntityOrderList[i + 1], sizeof(uint32) * (m_nAudioEntitiesCount - (i + 1)));
@ -232,17 +235,16 @@ cAudioManager::GetEntityPointer(int32 id)
}
static Const uint8 OneShotPriority[] = {
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 2, 5, 5, 3, 5, 2, 2, 1, 1, 3, 1, 3, 3, 1, 1, 1, 1, 4, 4, 4, 3, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 3, 4, 2, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 1, 1, 1, 9, 0, 0, 0, 1, 2, 2, 0, 0, 2, 3, 3, 3, 5, 1, 1,
1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 7, 1, 4, 3, 4, 2, 2, 2, 3, 1, 2, 1, 3, 5, 3, 4, 6, 4, 6, 3, 0, 0, 0, 0, 0,
0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0
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, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 1, 1, 1, 9,
2, 2, 0, 0, 0, 0, 3, 3, 5, 1, 1, 1, 1, 3, 4, 7, 6, 6, 6, 6, 1, 3, 4, 3, 4, 2, 1, 3, 5, 4, 6, 6, 1, 3,
1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
void
cAudioManager::PlayOneShot(int32 index, uint16 sound, float vol)
{
if (m_bIsInitialised) {
if (index >= 0 && index < NUM_AUDIOENTITIES) {
tAudioEntity &entity = m_asAudioEntities[index];
@ -296,12 +298,6 @@ cAudioManager::SetMusicMasterVolume(uint8 volume)
SampleManager.SetMusicMasterVolume(volume);
}
void
cAudioManager::SetMP3BoostVolume(uint8 volume)
{
SampleManager.SetMP3BoostVolume(volume);
}
void
cAudioManager::SetEffectsFadeVol(uint8 volume)
{
@ -315,9 +311,9 @@ cAudioManager::SetMusicFadeVol(uint8 volume)
}
void
cAudioManager::SetOutputMode(bool8 surround)
cAudioManager::SetMonoMode(bool8 mono)
{
// on ps2 this calls another method of cAudioManager to set DTS mode on or off
SampleManager.SetMonoMode(mono);
}
void
@ -337,13 +333,11 @@ cAudioManager::ResetTimers(uint32 time)
m_nActiveQueue = 0;
}
ClearActiveSamples();
ClearMissionAudio(0);
ClearMissionAudio(1);
ClearMissionAudio();
SampleManager.StopChannel(CHANNEL_POLICE_RADIO);
SampleManager.SetEffectsFadeVolume(0);
SampleManager.SetMusicFadeVolume(0);
MusicManager.ResetMusicAfterReload();
m_bIsPlayerShutUp = FALSE;
#ifdef AUDIO_OAL
SampleManager.Service();
#endif
@ -362,7 +356,7 @@ cAudioManager::DestroyAllGameCreatedEntities()
case AUDIOTYPE_PHYSICAL:
case AUDIOTYPE_EXPLOSION:
case AUDIOTYPE_WEATHER:
//case AUDIOTYPE_CRANE:
case AUDIOTYPE_CRANE:
case AUDIOTYPE_GARAGE:
case AUDIOTYPE_FIREHYDRANT:
DestroyEntity(i);
@ -426,17 +420,6 @@ cAudioManager::GetCurrent3DProviderIndex()
return -1;
}
int8
cAudioManager::AutoDetect3DProviders()
{
#ifdef EXTERNAL_3D_SOUND
if (m_bIsInitialised)
return SampleManager.AutoDetect3DProviders();
#endif
return -1;
}
int8
cAudioManager::SetCurrent3DProvider(uint8 which)
{
@ -456,9 +439,11 @@ cAudioManager::SetCurrent3DProvider(uint8 which)
ClearActiveSamples();
int8 current = SampleManager.SetCurrent3DProvider(which);
if (current > 0) {
#ifdef EXTERNAL_3D_SOUND
m_nActiveSamples = SampleManager.GetMaximumSupportedChannels();
if (m_nActiveSamples > 1)
m_nActiveSamples--;
#endif
}
return current;
#endif
@ -514,6 +499,7 @@ cAudioManager::GetCDAudioDriveLetter()
{
if (m_bIsInitialised)
return SampleManager.GetCDAudioDriveLetter();
return '\0';
}
@ -533,28 +519,9 @@ cAudioManager::ServiceSoundEffects()
#endif
m_bReduceReleasingPriority = (m_FrameCounter++ % 5) == 0;
if (m_bIsPaused && !m_bWasPaused) {
#ifdef GTA_PS2
if (m_bIsSurround) {
for (uint32 i = 0; i < NUM_CHANNELS_DTS_GENERIC; i++)
SampleManager.StopChannel(i);
SampleManager.SetChannelFrequency(CHANNEL_DTS_POLICE_RADIO, 0);
SampleManager.SetChannelFrequency(CHANNEL_DTS_MISSION_AUDIO_1, 0);
SampleManager.SetChannelFrequency(CHANNEL_DTS_MISSION_AUDIO_2, 0);
SampleManager.SetChannelFrequency(CHANNEL_DTS_PLAYER_VEHICLE_ENGINE, 0);
} else {
for (uint32 i = 0; i < NUM_CHANNELS_GENERIC; i++)
SampleManager.StopChannel(i);
SampleManager.SetChannelFrequency(CHANNEL_POLICE_RADIO, 0);
SampleManager.SetChannelFrequency(CHANNEL_MISSION_AUDIO_1, 0);
SampleManager.SetChannelFrequency(CHANNEL_MISSION_AUDIO_2, 0);
SampleManager.SetChannelFrequency(CHANNEL_PLAYER_VEHICLE_ENGINE, 0);
}
#else
for (uint32 i = 0; i < NUM_CHANNELS; i++)
for (int32 i = 0; i < NUM_CHANNELS; i++)
SampleManager.StopChannel(i);
#endif
ClearRequestedQueue();
if (m_nActiveQueue) {
m_nActiveQueue = 0;
@ -568,9 +535,7 @@ cAudioManager::ServiceSoundEffects()
ClearActiveSamples();
}
m_nActiveQueue = m_nActiveQueue == 1 ? 0 : 1;
#ifdef AUDIO_REVERB
if(m_bIsSurround) ProcessReverb();
#endif
ProcessReverb();
ProcessSpecial();
ClearRequestedQueue();
InterrogateAudioEntities();
@ -595,22 +560,22 @@ cAudioManager::ServiceSoundEffects()
m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal = 0;
}
uint32
cAudioManager::FL(float f)
{
return SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex) * f;
}
uint8
cAudioManager::ComputeVolume(uint8 emittingVolume, float maxDistance, float distance)
{
float minDistance;
uint8 newEmittingVolume;
if (maxDistance <= 0.0f)
return 0;
minDistance = maxDistance / 5.0f;
if (minDistance > distance)
return emittingVolume;
newEmittingVolume = emittingVolume * SQR((maxDistance - minDistance - (distance - minDistance))
/ (maxDistance - minDistance));
return Min(127, newEmittingVolume);
if (minDistance <= distance)
emittingVolume = sq((maxDistance - minDistance - (distance - minDistance)) / (maxDistance - minDistance)) * emittingVolume;
return emittingVolume;
}
void
@ -619,27 +584,16 @@ cAudioManager::TranslateEntity(Const CVector *in, CVector *out)
*out = MultiplyInverse(TheCamera.GetMatrix(), *in);
}
Const static uint8 PanTable[64] = { 0, 3, 8, 12, 16, 19, 22, 24, 26, 28, 30, 31, 33, 34, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53,
54, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63};
int32
cAudioManager::ComputeFrontRearMix(float dist, CVector *vec)
{
int32 index = vec->y / (dist / 64.0f);
index = Min(63, ABS(index));
if (vec->y > 0.0f)
return Max(0, 63 - (int8)PanTable[index]);
return Min(127, PanTable[index] + 63);
}
int32
cAudioManager::ComputePan(float dist, CVector *vec)
{
Const static uint8 PanTable[64] = {0, 3, 8, 12, 16, 19, 22, 24, 26, 28, 30, 31, 33, 34, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53,
54, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63};
int32 index = vec->x / (dist / 64.0f);
index = Min(63, ABS(index));
if (vec->x > 0.0f)
if (vec->x > 0.f)
return Max(20, 63 - (int8)PanTable[index]);
return Min(107, PanTable[index] + 63);
}
@ -675,7 +629,7 @@ cAudioManager::RandomDisplacement(uint32 seed)
value = m_anRandomTable[(Adjustment + seed) % 5] % seed;
Adjustment += value;
if (value % 2)
if (value % 2)
bPos = !bPos;
if (!bPos)
@ -710,10 +664,18 @@ cAudioManager::AddSampleToRequestedQueue()
return;
} else
m_nRequestedCount[m_nActiveQueue]++;
#if GTA_VERSION < GTA3_PC_10
if (m_sQueueSample.m_bStatic) {
if (m_sQueueSample.m_nLoopCount > 0)
m_sQueueSample.unk = m_nTimeSpent * SampleManager.GetSampleLength(m_sQueueSample.m_nSampleIndex) / m_sQueueSample.m_nFrequency;
else
m_sQueueSample.unk = -3;
}
#endif
m_sQueueSample.m_nFinalPriority = finalPriority;
m_sQueueSample.m_bIsPlayingFinished = FALSE;
#ifdef AUDIO_REFLECTIONS
if (m_sQueueSample.m_bIs2D || CCullZones::InRoomForAudio()) {
if (m_sQueueSample.m_bIs2D) {
m_sQueueSample.m_bReflections = FALSE;
m_sQueueSample.m_nReflectionDelay = 0;
}
@ -725,12 +687,8 @@ cAudioManager::AddSampleToRequestedQueue()
}
m_sQueueSample.m_bReflections = FALSE;
if ( m_bIsSurround && m_sQueueSample.m_bIs2D )
m_sQueueSample.m_nFrontRearPan = 30;
#ifdef AUDIO_REVERB
if (!m_bDynamicAcousticModelingStatus)
m_sQueueSample.m_bReverb = FALSE;
#endif
#endif
m_aRequestedQueue[m_nActiveQueue][sampleIndex] = m_sQueueSample;
@ -747,13 +705,13 @@ void
cAudioManager::AddDetailsToRequestedOrderList(uint8 sample)
{
uint32 i = 0;
if (sample > 0) {
if (sample != 0) {
for (; i < sample; i++) {
if (m_aRequestedQueue[m_nActiveQueue][m_aRequestedOrderList[m_nActiveQueue][i]].m_nFinalPriority >
m_aRequestedQueue[m_nActiveQueue][sample].m_nFinalPriority)
break;
}
if (i < sample)
if (i < sample)
memmove(&m_aRequestedOrderList[m_nActiveQueue][i + 1], &m_aRequestedOrderList[m_nActiveQueue][i], m_nActiveSamples - i - 1);
}
m_aRequestedOrderList[m_nActiveQueue][i] = sample;
@ -763,62 +721,27 @@ cAudioManager::AddDetailsToRequestedOrderList(uint8 sample)
void
cAudioManager::AddReflectionsToRequestedQueue()
{
#ifdef FIX_BUGS
uint32 oldFreq = 0;
#else
uint32 oldFreq;
#endif
float reflectionDistance;
int32 noise;
uint8 emittingVolume;
uint32 oldCounter = m_sQueueSample.m_nCounter;
float oldDist = m_sQueueSample.m_fDistance;
CVector oldPos = m_sQueueSample.m_vecPos;
#ifndef USE_TIME_SCALE_FOR_AUDIO
if ( CTimer::GetIsSlowMotionActive() ) {
emittingVolume = m_sQueueSample.m_nVolume;
oldFreq = m_sQueueSample.m_nFrequency;
} else
#endif
emittingVolume = (9 * m_sQueueSample.m_nVolume) >> 4;
m_sQueueSample.m_MaxDistance /= 2.0f;
uint32 halfOldFreq = oldFreq >> 1;
uint8 emittingVolume = (m_sQueueSample.m_nVolume >> 1) + (m_sQueueSample.m_nVolume >> 3);
for (uint32 i = 0; i < ARRAY_SIZE(m_afReflectionsDistances); i++) {
#ifndef USE_TIME_SCALE_FOR_AUDIO
if ( CTimer::GetIsSlowMotionActive() )
m_afReflectionsDistances[i] = (m_anRandomTable[i % 4] % 3) * 100.0f / 8.0f;
#endif
reflectionDistance = m_afReflectionsDistances[i];
if (reflectionDistance > 0.0f && reflectionDistance < 100.0f && reflectionDistance < m_sQueueSample.m_MaxDistance) {
#ifndef USE_TIME_SCALE_FOR_AUDIO
m_sQueueSample.m_nReflectionDelay = CTimer::GetIsSlowMotionActive() ? (reflectionDistance * 800.0f / 1029.0f) : (reflectionDistance * 500.0f / 1029.0f);
#else
m_sQueueSample.m_nReflectionDelay = reflectionDistance * 500.0f / 1029.0f;
#endif
if (m_sQueueSample.m_nReflectionDelay > 3) {
m_sQueueSample.m_nReflectionDelay = (reflectionDistance * 500.0f / 1029.0f);
if (m_sQueueSample.m_nReflectionDelay > 5) {
m_sQueueSample.m_fDistance = m_afReflectionsDistances[i];
SET_EMITTING_VOLUME(emittingVolume);
m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, m_sQueueSample.m_MaxDistance, m_sQueueSample.m_fDistance);
if (m_sQueueSample.m_nVolume > emittingVolume >> 4) {
m_sQueueSample.m_nCounter = oldCounter + ((i + 1) << 8);
if (m_sQueueSample.m_nLoopCount > 0) {
#ifndef USE_TIME_SCALE_FOR_AUDIO
if ( CTimer::GetIsSlowMotionActive() ) {
m_sQueueSample.m_nFrequency = halfOldFreq + ((halfOldFreq * i) / ARRAY_SIZE(m_afReflectionsDistances));
} else
#endif
{
noise = RandomDisplacement(m_sQueueSample.m_nFrequency >> 5);
if (noise > 0)
m_sQueueSample.m_nFrequency -= noise;
else
m_sQueueSample.m_nFrequency += noise;
}
noise = RandomDisplacement(m_sQueueSample.m_nFrequency >> 5);
if (noise > 0)
m_sQueueSample.m_nFrequency -= noise;
else
m_sQueueSample.m_nFrequency += noise;
}
m_sQueueSample.m_nPriority += 20;
m_sQueueSample.m_vecPos = m_avecReflectionsPos[i];
@ -827,8 +750,6 @@ cAudioManager::AddReflectionsToRequestedQueue()
}
}
}
m_sQueueSample.m_vecPos = oldPos;
m_sQueueSample.m_fDistance = oldDist;
}
void
@ -838,7 +759,6 @@ cAudioManager::UpdateReflections()
CColPoint colpoint;
CEntity *ent;
#if GTA_VERSION < GTAVC_PC_10
if (m_FrameCounter % 8 == 0) {
camPos = TheCamera.GetPosition();
m_avecReflectionsPos[0] = camPos;
@ -880,77 +800,6 @@ cAudioManager::UpdateReflections()
else
m_afReflectionsDistances[4] = 50.0f;
}
#else
if (m_FrameCounter % 8 == 0) {
camPos = TheCamera.GetPosition();
m_avecReflectionsPos[0] = camPos;
m_avecReflectionsPos[0].y += 100.f;
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[0], colpoint, ent, true, false, false, true, false, true, true))
m_afReflectionsDistances[0] = Distance(camPos, colpoint.point);
else
m_afReflectionsDistances[0] = 100.0f;
} else if ((m_FrameCounter + 1) % 8 == 0) {
camPos = TheCamera.GetPosition();
m_avecReflectionsPos[1] = camPos;
m_avecReflectionsPos[1].y -= 100.0f;
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[1], colpoint, ent, true, false, false, true, false, true, true))
m_afReflectionsDistances[1] = Distance(camPos, colpoint.point);
else
m_afReflectionsDistances[1] = 100.0f;
} else if ((m_FrameCounter + 2) % 8 == 0) {
camPos = TheCamera.GetPosition();
m_avecReflectionsPos[2] = camPos;
m_avecReflectionsPos[2].x -= 100.0f;
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[2], colpoint, ent, true, false, false, true, false, true, true))
m_afReflectionsDistances[2] = Distance(camPos, colpoint.point);
else
m_afReflectionsDistances[2] = 100.0f;
} else if ((m_FrameCounter + 3) % 8 == 0) {
camPos = TheCamera.GetPosition();
m_avecReflectionsPos[3] = camPos;
m_avecReflectionsPos[3].x += 100.0f;
if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[3], colpoint, ent, true, false, false, true, false, true, true))
m_afReflectionsDistances[3] = Distance(camPos, colpoint.point);
else
m_afReflectionsDistances[3] = 100.0f;
} else if ((m_FrameCounter + 4) % 8 == 0) {
camPos = TheCamera.GetPosition();
camPos.y += 1.0f;
m_avecReflectionsPos[4] = camPos;
m_avecReflectionsPos[4].z += 100.0f;
if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[4].z, colpoint, ent, true, false, false, false, true, false, nil))
m_afReflectionsDistances[4] = colpoint.point.z - camPos.z;
else
m_afReflectionsDistances[4] = 100.0f;
} else if ((m_FrameCounter + 5) % 8 == 0) {
camPos = TheCamera.GetPosition();
camPos.y -= 1.0f;
m_avecReflectionsPos[5] = camPos;
m_avecReflectionsPos[5].z += 100.0f;
if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[5].z, colpoint, ent, true, false, false, false, true, false, nil))
m_afReflectionsDistances[5] = colpoint.point.z - camPos.z;
else
m_afReflectionsDistances[5] = 100.0f;
} else if ((m_FrameCounter + 6) % 8 == 0) {
camPos = TheCamera.GetPosition();
camPos.x -= 1.0f;
m_avecReflectionsPos[6] = camPos;
m_avecReflectionsPos[6].z += 100.0f;
if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[6].z, colpoint, ent, true, false, false, false, true, false, nil))
m_afReflectionsDistances[6] = colpoint.point.z - camPos.z;
else
m_afReflectionsDistances[6] = 100.0f;
} else if ((m_FrameCounter + 7) % 8 == 0) {
camPos = TheCamera.GetPosition();
camPos.x += 1.0f;
m_avecReflectionsPos[7] = camPos;
m_avecReflectionsPos[7].z += 100.0f;
if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[7].z, colpoint, ent, true, false, false, false, true, false, nil))
m_afReflectionsDistances[7] = colpoint.point.z - camPos.z;
else
m_afReflectionsDistances[7] = 100.0f;
}
#endif
}
#endif // AUDIO_REFLECTIONS
@ -979,9 +828,9 @@ cAudioManager::AddReleasingSounds()
break;
}
}
if(!toProcess[i]) {
if (!toProcess[i]) {
#ifdef AUDIO_REFLECTIONS
if(sample.m_nCounter <= 255 || sample.m_nReflectionDelay == 0) // check if not delayed reflection
if (sample.m_nCounter <= 255 || sample.m_nReflectionDelay == 0) // check if not delayed reflection
#endif
{
#ifdef ATTACH_RELEASING_SOUNDS_TO_ENTITIES
@ -1021,6 +870,7 @@ cAudioManager::AddReleasingSounds()
}
#endif
#ifdef FIX_BUGS
// fixing emitting volume not being lowered and high fps bugs
if (sample.m_nFramesToPlay <= 0)
continue;
if (sample.m_nLoopCount == 0) {
@ -1100,14 +950,11 @@ cAudioManager::ProcessActiveQueues()
uint8 emittingVol;
CVector position;
bool8 isPhoneCall;
uint8 channelOffset = 0;
#ifdef EXTERNAL_3D_SOUND
#define WORKING_VOLUME_FIELD m_nEmittingVolume
#else
#define WORKING_VOLUME_FIELD m_nVolume
#endif
#endif
#ifdef USE_TIME_SCALE_FOR_AUDIO
float timeScale = m_bIsPaused ? 1.0f : CTimer::GetTimeScale();
@ -1123,22 +970,27 @@ cAudioManager::ProcessActiveQueues()
if (sample.m_nSampleIndex != NO_SAMPLE) {
for (uint8 j = 0; j < m_nActiveSamples; j++) {
if (sample.m_nEntityIndex == m_asActiveSamples[j].m_nEntityIndex && sample.m_nCounter == m_asActiveSamples[j].m_nCounter &&
sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) {
sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) {
if (sample.m_nLoopCount > 0) {
#if GTA_VERSION >= GTA3_PC_10
if (m_FrameCounter & 1)
flag = !!(j & 1);
else
flag = !(j & 1);
if (flag && !SampleManager.GetChannelUsedFlag(j)) {
#else
if (m_asActiveSamples[j].unk != 0)
m_asActiveSamples[j].unk--;
else if (SampleManager.GetChannelUsedFlag(j))
m_asActiveSamples[j].unk = m_nTimeSpent * SampleManager.GetSampleLength(m_asActiveSamples[j].m_nSampleIndex) / m_asActiveSamples[j].m_nFrequency;
else {
#endif
sample.m_bIsPlayingFinished = TRUE;
m_asActiveSamples[j].m_bIsPlayingFinished = TRUE;
m_asActiveSamples[j].m_nSampleIndex = NO_SAMPLE;
m_asActiveSamples[j].m_nEntityIndex = AEHANDLE_NONE;
continue;
}
if (sample.m_nFramesToPlay == 0)
sample.m_nFramesToPlay = 1;
}
sample.m_bIsBeingPlayed = TRUE;
m_asActiveSamples[j].m_bIsBeingPlayed = TRUE;
@ -1155,7 +1007,7 @@ cAudioManager::ProcessActiveQueues()
SampleManager.SetChannelEmittingVolume(j, emittingVol);
#else
SampleManager.SetChannelPan(j, sample.m_nPan);
SampleManager.SetChannelVolume(j, emittingVol);
SampleManager.SetChannelVolume(j, sample.m_nVolume);
#endif
} else {
position2 = sample.m_fDistance;
@ -1171,37 +1023,20 @@ cAudioManager::ProcessActiveQueues()
SampleManager.SetChannelFrequency(j, freq);
#endif
}
#ifdef EXTERNAL_3D_SOUND
if (sample.m_nEmittingVolume != m_asActiveSamples[j].m_nEmittingVolume) {
vol = Clamp2((int8)sample.m_nEmittingVolume, (int8)m_asActiveSamples[j].m_nEmittingVolume, 10);
SampleManager.SetChannelEmittingVolume(j, m_bDoubleVolume ? 2 * Min(63, vol) : vol);
m_asActiveSamples[j].m_nEmittingVolume = vol;
}
#else
if (sample.m_nVolume != m_asActiveSamples[j].m_nVolume) {
vol = Clamp2((int8)sample.m_nVolume, (int8)m_asActiveSamples[j].m_nVolume, 10);
#endif
emittingVol = m_bDoubleVolume ? 2 * Min(63, vol) : vol;
isPhoneCall = FALSE;
for (int32 k = 0; k < MISSION_AUDIO_SLOTS; k++) {
if (m_bIsMissionAudioPhoneCall[k]) {
isPhoneCall = TRUE;
break;
}
}
if (isPhoneCall) {
emittingVol = (emittingVol * m_nGlobalSfxVolumeMultiplier) / 127;
} else {
if (m_nGlobalSfxVolumeMultiplier < 127)
emittingVol = (emittingVol * m_nGlobalSfxVolumeMultiplier) / 127;
}
#ifdef EXTERNAL_3D_SOUND
SampleManager.SetChannelEmittingVolume(j, emittingVol);
m_asActiveSamples[j].m_nEmittingVolume = vol;
#else
SampleManager.SetChannelVolume(j, emittingVol);
m_asActiveSamples[j].m_nVolume = vol;
#endif
}
SampleManager.SetChannelVolume(j, m_bDoubleVolume ? 2 * Min(63, m_asActiveSamples[j].m_nVolume) : m_asActiveSamples[j].m_nVolume);
#endif
TranslateEntity(&sample.m_vecPos, &position);
#ifdef EXTERNAL_3D_SOUND
SampleManager.SetChannel3DPosition(j, position.x, position.y, position.z);
@ -1211,14 +1046,11 @@ cAudioManager::ProcessActiveQueues()
SampleManager.SetChannelPan(j, sample.m_nPan);
#endif
}
#if !defined(GTA_PS2) || defined(AUDIO_REVERB)
SampleManager.SetChannelReverbFlag(j, sample.m_bReverb);
#endif
break; //continue for i
break;
}
sample.m_bIsBeingPlayed = FALSE;
m_asActiveSamples[j].m_bIsBeingPlayed = FALSE;
//continue for j
}
}
}
@ -1241,8 +1073,7 @@ cAudioManager::ProcessActiveQueues()
#endif
{
for (uint8 j = 0; j < m_nActiveSamples; j++) {
uint8 k = (j + m_nChannelOffset) % m_nActiveSamples;
if (!m_asActiveSamples[k].m_bIsBeingPlayed) {
if (!m_asActiveSamples[j].m_bIsBeingPlayed) {
if (sample.m_nLoopCount > 0) {
samplesPerFrame = sample.m_nFrequency / m_nTimeSpent;
samplesToPlay = sample.m_nLoopCount * SampleManager.GetSampleLength(sample.m_nSampleIndex);
@ -1250,9 +1081,9 @@ cAudioManager::ProcessActiveQueues()
continue;
sample.m_nFramesToPlay = samplesToPlay / samplesPerFrame + 1;
}
memcpy(&m_asActiveSamples[k], &sample, sizeof(tSound));
if (!m_asActiveSamples[k].m_bIs2D) {
TranslateEntity(&m_asActiveSamples[k].m_vecPos, &position);
memcpy(&m_asActiveSamples[j], &sample, sizeof(tSound));
if (!m_asActiveSamples[j].m_bIs2D) {
TranslateEntity(&m_asActiveSamples[j].m_vecPos, &position);
#ifndef EXTERNAL_3D_SOUND
m_asActiveSamples[j].m_nPan = ComputePan(m_asActiveSamples[j].m_fDistance, &position);
#endif
@ -1260,67 +1091,50 @@ cAudioManager::ProcessActiveQueues()
emittingVol = m_bDoubleVolume ? 2 * Min(63, m_asActiveSamples[j].WORKING_VOLUME_FIELD) : m_asActiveSamples[j].WORKING_VOLUME_FIELD;
#ifdef GTA_PS2
{
SampleManager.InitialiseChannel(k, m_asActiveSamples[k].m_nSampleIndex, m_asActiveSamples[k].m_nBankIndex);
SampleManager.InitialiseChannel(j, m_asActiveSamples[j].m_nSampleIndex, m_asActiveSamples[j].m_nBankIndex);
#else
if (SampleManager.InitialiseChannel(k, m_asActiveSamples[k].m_nSampleIndex, m_asActiveSamples[k].m_nBankIndex)) {
if (SampleManager.InitialiseChannel(j, m_asActiveSamples[j].m_nSampleIndex, m_asActiveSamples[j].m_nBankIndex)) {
#endif
#ifdef USE_TIME_SCALE_FOR_AUDIO
SampleManager.SetChannelFrequency(k, m_asActiveSamples[k].m_nFrequency * timeScale);
SampleManager.SetChannelFrequency(j, m_asActiveSamples[j].m_nFrequency * timeScale);
#else
SampleManager.SetChannelFrequency(k, m_asActiveSamples[k].m_nFrequency);
SampleManager.SetChannelFrequency(j, m_asActiveSamples[j].m_nFrequency);
#endif
isPhoneCall = FALSE;
for (int32 l = 0; l < MISSION_AUDIO_SLOTS; l++) {
if (m_bIsMissionAudioPhoneCall[l]) {
isPhoneCall = TRUE;
break;
}
}
if (!isPhoneCall || m_asActiveSamples[k].m_bIs2D) {
if (m_nGlobalSfxVolumeMultiplier < 127)
emittingVol = (emittingVol * m_nGlobalSfxVolumeMultiplier) / 127;
vol = emittingVol;
} else {
vol = (emittingVol * m_nGlobalSfxVolumeMultiplier) / 127;
}
#ifdef EXTERNAL_3D_SOUND
SampleManager.SetChannelEmittingVolume(k, vol);
SampleManager.SetChannelEmittingVolume(j, emittingVol);
#else
SampleManager.SetChannelVolume(j, emittingVol);
SampleManager.SetChannelPan(j, m_asActiveSamples[j].m_nPan);
#endif
#ifndef GTA_PS2
SampleManager.SetChannelLoopPoints(k, m_asActiveSamples[k].m_nLoopStart, m_asActiveSamples[k].m_nLoopEnd);
#endif
SampleManager.SetChannelLoopCount(k, m_asActiveSamples[k].m_nLoopCount);
#if !defined(GTA_PS2) || defined(AUDIO_REVERB)
SampleManager.SetChannelReverbFlag(k, m_asActiveSamples[k].m_bReverb);
SampleManager.SetChannelLoopPoints(j, m_asActiveSamples[j].m_nLoopStart, m_asActiveSamples[j].m_nLoopEnd);
#endif
SampleManager.SetChannelLoopCount(j, m_asActiveSamples[j].m_nLoopCount);
SampleManager.SetChannelReverbFlag(j, m_asActiveSamples[j].m_bReverb);
#ifdef EXTERNAL_3D_SOUND
if (m_asActiveSamples[k].m_bIs2D) {
uint8 offset = m_asActiveSamples[k].m_nPan;
if (m_asActiveSamples[j].m_bIs2D) {
uint8 offset = m_asActiveSamples[j].m_nPan;
if (offset == 63)
x = 0.0f;
x = 0.f;
else if (offset >= 63)
x = (offset - 63) * 1000.0f / 63;
else
x = -(63 - offset) * 1000.0f / 63; //same like line below
x = -(63 - offset) * 1000.0f / 63;
usedX = x;
usedY = 0.0f;
usedZ = 0.0f;
m_asActiveSamples[k].m_MaxDistance = 100000.0f;
m_asActiveSamples[j].m_MaxDistance = 100000.0f;
} else {
usedX = position.x;
usedY = position.y;
usedZ = position.z;
}
SampleManager.SetChannel3DPosition(k, usedX, usedY, usedZ);
SampleManager.SetChannel3DDistances(k, m_asActiveSamples[k].m_MaxDistance, 0.25f * m_asActiveSamples[k].m_MaxDistance);
SampleManager.SetChannel3DPosition(j, usedX, usedY, usedZ);
SampleManager.SetChannel3DDistances(j, m_asActiveSamples[j].m_MaxDistance, 0.25f * m_asActiveSamples[j].m_MaxDistance);
#endif
SampleManager.StartChannel(k);
SampleManager.StartChannel(j);
}
m_asActiveSamples[k].m_bIsBeingPlayed = TRUE;
channelOffset++;
m_asActiveSamples[j].m_bIsBeingPlayed = TRUE;
sample.m_bIsBeingPlayed = TRUE;
sample.m_nVolumeChange = -1;
break;
@ -1330,11 +1144,6 @@ cAudioManager::ProcessActiveQueues()
}
}
#ifdef GTA_PS2
m_nChannelOffset += channelOffset;
#endif
m_nChannelOffset %= m_nActiveSamples;
#ifdef USE_TIME_SCALE_FOR_AUDIO
for (uint8 i = 0; i < m_nActiveSamples; i++) {
if (m_asActiveSamples[i].m_nSampleIndex != NO_SAMPLE && m_asActiveSamples[i].m_bIsBeingPlayed)
@ -1342,7 +1151,7 @@ cAudioManager::ProcessActiveQueues()
}
#endif
#undef WORKING_VOLUME_FIELD
#undef WORKING_VOLUME_FIELD
}
void
@ -1380,17 +1189,18 @@ cAudioManager::ClearActiveSamples()
m_asActiveSamples[i].m_MaxDistance = 200.0f;
m_asActiveSamples[i].m_nPan = 63;
m_asActiveSamples[i].m_bStatic = FALSE;
#if GTA_VERSION < GTA3_PC_10
m_asActiveSamples[i].unk = -3;
#endif
m_asActiveSamples[i].m_nFinalPriority = 0;
m_asActiveSamples[i].m_nFramesToPlay = 0;
m_asActiveSamples[i].m_nVolumeChange = -1;
m_asActiveSamples[i].m_vecPos = CVector(0.0f, 0.0f, 0.0f);
#ifdef AUDIO_REVERB
m_asActiveSamples[i].m_bReverb = FALSE;
#endif // AUDIO_REVERB
#ifdef AUDIO_REFLECTIONS
m_asActiveSamples[i].m_nReflectionDelay = 0;
m_asActiveSamples[i].m_bReflections = FALSE;
#endif // AUDIO_REFLECTIONS
#endif
}
}
@ -1402,11 +1212,12 @@ cAudioManager::GenerateIntegerRandomNumberTable()
}
#ifdef GTA_PS2
void
bool8
cAudioManager::LoadBankIfNecessary(uint8 bank)
{
if(!SampleManager.IsSampleBankLoaded(bank))
SampleManager.LoadSampleBank(bank);
return SampleManager.LoadSampleBank(bank);
return FALSE;
}
#endif

View File

@ -3,15 +3,17 @@
#include "audio_enums.h"
#include "AudioCollision.h"
#include "PolRadio.h"
#include "VehicleModelInfo.h"
#include "Vehicle.h"
class tSound
{
public:
int32 m_nEntityIndex; // audio entity index
#if GTA_VERSION >= GTA3_PC_10
uint32 m_nCounter; // I'm not sure what this is but it looks like a virtual counter to determine the same sound in queue
// Values higher than 255 are used by reflections
#else
uint8 m_nCounter;
#endif
uint32 m_nSampleIndex; // An index of sample from AudioSamples.h
uint8 m_nBankIndex; // A sound bank index. IDK what's the point of it here since samples are hardcoded anyway
bool8 m_bIs2D; // If TRUE then sound is played in 2D space (such as frontend or police radio)
@ -29,12 +31,14 @@ public:
uint8 m_nEmittingVolume; // The volume in 3D space, provided to 3D audio engine
#endif
float m_fSpeedMultiplier; // Used for doppler effect. 0.0f - unaffected by doppler
#if GTA_VERSION >= GTA3_PC_10
float m_MaxDistance; // The maximum distance at which sound could be heard. Minimum distance = MaxDistance / 5 or MaxDistance / 4 in case of emitting volume (useless if m_bIs2D == TRUE)
#else
uint32 m_MaxDistance;
#endif
bool8 m_bStatic; // If TRUE then sound parameters cannot be changed during playback (frequency, position, etc.)
CVector m_vecPos; // Position of sound in 3D space. Unused if m_bIs2D == TRUE
#if !defined(GTA_PS2) || defined(AUDIO_REVERB) // GTA_PS2 because this field exists on mobile but not on PS2
bool8 m_bReverb; // Toggles reverb effect
#endif
#ifdef AUDIO_REFLECTIONS
uint8 m_nReflectionDelay; // Number of frames before reflection could be played. This is calculated internally by AudioManager and shouldn't be set by queued sample
bool8 m_bReflections; // Add sound reflections
@ -43,7 +47,6 @@ public:
// 0 = L 100% R 0%
// 63 = L 100% R 100%
// 127 = L 0% R 100%
uint8 m_nFrontRearPan; // Used on PS2 for surround panning
#ifndef FIX_BUGS
uint32 m_nFramesToPlay; // Number of frames the sound would be played (if it stops being queued).
// This one is being set by queued sample for looping sounds, otherwise calculated inside AudioManager
@ -54,6 +57,11 @@ public:
// all fields below are internal to AudioManager calculations and aren't set by queued sample
bool8 m_bIsBeingPlayed; // Set to TRUE when the sound was added or changed on current frame to avoid it being overwritten
bool8 m_bIsPlayingFinished; // Not sure about the name. Set to TRUE when sampman channel becomes free
#if GTA_VERSION < GTA3_PC_10
int32 unk; // (inherited from GTA 2) Only on PS2, used by static non-looped sounds (AFAIK)
// Looks like it's keeping a number of frames left to play with the purpose of setting m_bIsPlayingFinished=TRUE once value reaches 0
// Default value is -3 for whatever reason
#endif
uint32 m_nFinalPriority; // Actual value used to compare priority, calculated using volume and m_nPriority. Lesser value means higher priority
int8 m_nVolumeChange; // How much m_nVolume should reduce per each frame.
#if defined(FIX_BUGS) && defined(EXTERNAL_3D_SOUND)
@ -61,7 +69,7 @@ public:
#endif
};
VALIDATE_SIZE(tSound, 96);
VALIDATE_SIZE(tSound, 92);
class CPhysical;
class CAutomobile;
@ -103,10 +111,6 @@ public:
uint8 m_aPedCommentOrderList[NUM_SOUND_QUEUES][NUM_PED_COMMENTS_SLOTS];
uint8 m_nPedCommentCount[NUM_SOUND_QUEUES];
uint8 m_nActiveQueue;
#ifdef GTA_PC
bool8 m_bDelay;
uint32 m_nDelayTimer;
#endif
cPedComments()
{
@ -124,9 +128,7 @@ public:
void Process();
};
VALIDATE_SIZE(cPedComments, 0x490);
#define MISSION_AUDIO_SLOTS (2)
VALIDATE_SIZE(cPedComments, 1164);
// name made up
class cAudioScriptObjectManager
@ -164,7 +166,6 @@ public:
class cVehicleParams
{
public:
int32 m_VehicleType;
bool8 m_bDistanceCalculated;
float m_fDistance;
CVehicle *m_pVehicle;
@ -174,7 +175,6 @@ public:
cVehicleParams()
{
m_VehicleType = -1;
m_bDistanceCalculated = false;
m_fDistance = 0.0f;
m_pVehicle = nil;
@ -184,9 +184,8 @@ public:
}
};
VALIDATE_SIZE(cVehicleParams, 0x1C);
VALIDATE_SIZE(cVehicleParams, 0x18);
#if GTA_VERSION < GTAVC_PC_10
enum {
/*
REFLECTION_YMAX = 0, top
@ -203,19 +202,6 @@ enum {
REFLECTION_UP,
MAX_REFLECTIONS,
};
#else
enum {
REFLECTION_NORTH = 0,
REFLECTION_SOUTH,
REFLECTION_WEST,
REFLECTION_EAST,
REFLECTION_CEIL_NORTH,
REFLECTION_CEIL_SOUTH,
REFLECTION_CEIL_WEST,
REFLECTION_CEIL_EAST,
MAX_REFLECTIONS,
};
#endif
enum PLAY_STATUS { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED };
enum LOADING_STATUS { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_LOADING };
@ -224,12 +210,13 @@ class cAudioManager
{
public:
bool8 m_bIsInitialised;
bool8 m_bIsSurround; // used on PS2
bool8 m_bIsSurround; // unused until VC
bool8 m_bReduceReleasingPriority;
uint8 m_nActiveSamples;
bool8 m_bDoubleVolume; // unused
#if GTA_VERSION >= GTA3_PC_10
bool8 m_bDynamicAcousticModelingStatus;
uint8 m_nChannelOffset;
#endif
float m_fSpeedOfSound;
bool8 m_bTimerJustReset;
uint32 m_nTimer;
@ -247,14 +234,6 @@ public:
float m_afReflectionsDistances[MAX_REFLECTIONS];
#endif
cAudioScriptObjectManager m_sAudioScriptObjectManager;
// miami
bool8 m_bIsPlayerShutUp;
uint8 m_nPlayerMood;
uint32 m_nPlayerMoodTimer;
uint32 field_4B38_vc;
bool8 m_bGenericSfx;
cPedComments m_sPedComments;
int32 m_nFireAudioEntity;
int32 m_nWaterCannonEntity;
@ -265,25 +244,17 @@ public:
int32 m_nCollisionEntity;
cAudioCollisionManager m_sCollisionManager;
int32 m_nProjectileEntity;
int32 m_nEscalatorEntity;
int32 m_nExtraSoundsEntity;
#ifdef GTA_BRIDGE
int32 m_nBridgeEntity;
#endif
// Mission audio stuff
// So instead of making an array of struct they've added [MISSION_AUDIO_SLOTS] to every field...
// Only someone with a VERY EXTRAORDINARY mind could have come up with that
CVector m_vecMissionAudioPosition[MISSION_AUDIO_SLOTS];
bool8 m_bIsMissionAudio2D[MISSION_AUDIO_SLOTS];
uint32 m_nMissionAudioSampleIndex[MISSION_AUDIO_SLOTS];
uint8 m_nMissionAudioLoadingStatus[MISSION_AUDIO_SLOTS];
uint8 m_nMissionAudioPlayStatus[MISSION_AUDIO_SLOTS];
bool8 m_bIsMissionAudioPlaying[MISSION_AUDIO_SLOTS];
int32 m_nMissionAudioFramesToPlay[MISSION_AUDIO_SLOTS]; // possibly unsigned
bool8 m_bIsMissionAudioAllowedToPlay[MISSION_AUDIO_SLOTS];
bool8 m_bIsMissionAudioPhoneCall[MISSION_AUDIO_SLOTS];
uint8 m_nGlobalSfxVolumeMultiplier; // used to lower sfx volume during phone calls
CVector m_vecMissionAudioPosition;
bool8 m_bIsMissionAudio2D;
uint32 m_nMissionAudioSampleIndex;
uint8 m_nMissionAudioLoadingStatus;
uint8 m_nMissionAudioPlayStatus;
bool8 m_bIsMissionAudioPlaying;
int32 m_nMissionAudioFramesToPlay; // possibly unsigned
bool8 m_bIsMissionAudioAllowedToPlay;
int32 m_anRandomTable[5];
uint8 m_nTimeSpent;
@ -298,25 +269,23 @@ public:
void Terminate();
void Service();
int32 CreateEntity(eAudioType type, void *entity);
void DestroyEntity(int32 id); // inlined in vc
void DestroyEntity(int32 id);
bool8 GetEntityStatus(int32 id);
void SetEntityStatus(int32 id, bool8 status);
void *GetEntityPointer(int32 id);
void PlayOneShot(int32 index, uint16 sound, float vol);
void SetEffectsMasterVolume(uint8 volume);
void SetMusicMasterVolume(uint8 volume);
void SetMP3BoostVolume(uint8 volume);
void SetEffectsFadeVol(uint8 volume);
void SetMusicFadeVol(uint8 volume);
void SetOutputMode(bool8 surround);
void SetMonoMode(bool8 mono);
void ResetTimers(uint32 time);
void DestroyAllGameCreatedEntities();
#ifdef GTA_PC
uint8 GetNum3DProvidersAvailable();
char *Get3DProviderName(uint8 id);
int8 GetCurrent3DProviderIndex();
int8 AutoDetect3DProviders();
int8 SetCurrent3DProvider(uint8 which);
void SetSpeakerConfig(int32 conf);
bool8 IsMP3RadioChannelAvailable();
@ -331,31 +300,31 @@ public:
#endif
void ServiceSoundEffects();
uint32 FL(float f); // not used
uint8 ComputeVolume(uint8 emittingVolume, float maxDistance, float distance);
void TranslateEntity(Const CVector *v1, CVector *v2);
int32 ComputeFrontRearMix(float, CVector *);
int32 ComputePan(float, CVector *);
uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier);
uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier); // inlined on PS2
int32 RandomDisplacement(uint32 seed);
void InterrogateAudioEntities(); // inlined
void InterrogateAudioEntities(); // inlined on PS2
void AddSampleToRequestedQueue();
void AddDetailsToRequestedOrderList(uint8 sample); // inlined in vc
void AddDetailsToRequestedOrderList(uint8 sample); // inlined on PS2
#ifdef AUDIO_REFLECTIONS
void AddReflectionsToRequestedQueue();
void UpdateReflections();
#endif
void AddReleasingSounds();
void ProcessActiveQueues();
void ClearRequestedQueue(); // inlined in vc
void ClearRequestedQueue(); // inlined on PS2
void ClearActiveSamples();
void GenerateIntegerRandomNumberTable();
void GenerateIntegerRandomNumberTable(); // inlined on PS2
#ifdef GTA_PS2
void LoadBankIfNecessary(uint8 bank); // this is used only on PS2 but technically not a platform code
bool8 LoadBankIfNecessary(uint8 bank); // this is used only on PS2 but technically not a platform code
#endif
#ifdef EXTERNAL_3D_SOUND // actually must have been && AUDIO_MSS as well
void AdjustSamplesVolume(); // inlined
uint8 ComputeEmittingVolume(uint8 emittingVolume, float maxDistance, float distance); // inlined
void AdjustSamplesVolume();
uint8 ComputeEmittingVolume(uint8 emittingVolume, float maxDistance, float distance);
#endif
// audio logic
@ -365,221 +334,197 @@ public:
void PostTerminateGameSpecificShutdown();
void ResetAudioLogicTimers(uint32 timer);
void ProcessReverb();
float GetDistanceSquared(const CVector &v); // inlined in vc
float GetDistanceSquared(const CVector &v);
void CalculateDistance(bool8 &condition, float dist);
CVehicle *FindVehicleOfPlayer();
void ProcessSpecial();
void ProcessEntity(int32 sound);
void ProcessEntity(int32 id);
void ProcessPhysical(int32 id);
// vehicles
void ProcessVehicle(CVehicle *vehicle);
bool8 ProcessCarHeli(cVehicleParams &params);
void ProcessRainOnVehicle(cVehicleParams &params);
bool8 ProcessReverseGear(cVehicleParams &params);
void ProcessModelHeliVehicle(cVehicleParams &params);
void ProcessModelVehicle(cVehicleParams &params);
bool8 ProcessVehicleFlatTyre(cVehicleParams &params);
void ProcessModelCarEngine(cVehicleParams &params);
bool8 ProcessVehicleRoadNoise(cVehicleParams &params);
bool8 ProcessWetRoadNoise(cVehicleParams &params);
bool8 ProcessVehicleEngine(cVehicleParams &params);
void UpdateGasPedalAudio(CVehicle *veh, int vehType);
void UpdateGasPedalAudio(CAutomobile *automobile); // inlined on PS2
void PlayerJustGotInCar();
void PlayerJustLeftCar();
void AddPlayerCarSample(uint8 emittingVolume, uint32 freq, uint32 sample, uint8 bank, uint8 counter, bool8 notLooping);
void ProcessCesna(cVehicleParams &params);
void ProcessPlayersVehicleEngine(cVehicleParams &params, CVehicle *veh);
void ProcessPlayersVehicleEngine(cVehicleParams &params, CAutomobile *automobile);
bool8 ProcessVehicleSkidding(cVehicleParams &params);
float GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange);
float GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange);
float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);
float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); // inlined on PS2
bool8 ProcessVehicleHorn(cVehicleParams &params);
bool8 UsesSiren(cVehicleParams &params);
bool8 UsesSirenSwitching(cVehicleParams &params);
bool8 UsesSiren(uint32 model); // inlined on PS2
bool8 UsesSirenSwitching(uint32 model); // inlined on PS2
bool8 ProcessVehicleSirenOrAlarm(cVehicleParams &params);
bool8 UsesReverseWarning(uint32 model);
bool8 UsesReverseWarning(uint32 model); // inlined on PS2
bool8 ProcessVehicleReverseWarning(cVehicleParams &params);
bool8 ProcessVehicleDoors(cVehicleParams &params);
bool8 ProcessAirBrakes(cVehicleParams &params);
bool8 HasAirBrakes(uint32 model);
bool8 HasAirBrakes(uint32 model); // inlined on PS2
bool8 ProcessEngineDamage(cVehicleParams &params);
bool8 ProcessCarBombTick(cVehicleParams &params);
void ProcessVehicleOneShots(cVehicleParams &params);
#ifdef GTA_TRAIN
bool8 ProcessTrainNoise(cVehicleParams &params);
#endif
bool8 ProcessBoatEngine(cVehicleParams &params);
bool8 ProcessBoatMovingOverWater(cVehicleParams &params);
void ProcessPlane(cVehicleParams &params);
bool8 ProcessHelicopter(cVehicleParams &params);
void ProcessPlane(cVehicleParams &params); // inlined on PS2
void ProcessJumbo(cVehicleParams &params);
void ProcessJumboTaxi();
void ProcessJumboTaxi(); // inlined on PS2
void ProcessJumboAccel(CPlane *plane);
void ProcessJumboTakeOff(CPlane *plane);
void ProcessJumboFlying();
void ProcessJumboLanding(CPlane *plane);
void ProcessJumboDecel(CPlane *plane);
void ProcessJumboTakeOff(CPlane *plane); // inlined on PS2
void ProcessJumboFlying(); // inlined on PS2
void ProcessJumboLanding(CPlane *plane); // inlined on PS2
void ProcessJumboDecel(CPlane *plane); // inlined on PS2
bool8 SetupJumboTaxiSound(uint8 vol);
bool8 SetupJumboWhineSound(uint8 emittingVol, uint32 freq);
bool8 SetupJumboEngineSound(uint8 vol, uint32 freq);
bool8 SetupJumboFlySound(uint8 emittingVol);
bool8 SetupJumboRumbleSound(uint8 emittingVol);
int32 GetJumboTaxiFreq(); // inlined in vc
int32 GetJumboTaxiFreq(); // inlined on PS2
// peds
void ProcessPed(CPhysical *ped);
void ProcessPed(CPhysical *ped); // inlined on PS2
void ProcessPedHeadphones(cPedParams &params);
void ProcessPedOneShots(cPedParams &params);
void SetPedTalkingStatus(CPed *ped, bool8 status);
void SetPlayersMood(uint8 mood, uint32 time);
void ProcessPlayerMood();
// ped comments
void SetupPedComments(cPedParams &params, uint16 sound);
uint32 GetPedCommentSfx(CPed *ped, uint16 sound);
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset);
uint32 GetPlayerTalkSfx(CPed *ped, uint16 sound);
uint32 GetGenericMaleTalkSfx(CPed *ped, uint16 sound); // inlined in vc
uint32 GetGenericFemaleTalkSfx(CPed *ped, uint16 sound); // inlined in vc
uint32 GetDefaultTalkSfx(CPed *ped, uint16 sound);
uint32 GetCopTalkSfx(CPed *ped, uint16 sound);
uint32 GetSwatTalkSfx(CPed *ped, uint16 sound);
uint32 GetFBITalkSfx(CPed *ped, uint16 sound);
uint32 GetArmyTalkSfx(CPed *ped, uint16 sound);
uint32 GetMedicTalkSfx(CPed *ped, uint16 sound);
uint32 GetFiremanTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYG1TalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYG2TalkSfx(CPed *ped, uint16 sound);
uint32 GetHFYSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetHFOSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetHMYSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetHMOSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetHFYRITalkSfx(CPed *ped, uint16 sound);
uint32 GetHFORITalkSfx(CPed *ped, uint16 sound);
uint32 GetHMYRITalkSfx(CPed *ped, uint16 sound);
uint32 GetHMORITalkSfx(CPed *ped, uint16 sound);
uint32 GetHFYBETalkSfx(CPed *ped, uint16 sound);
uint32 GetHFOBETalkSfx(CPed *ped, uint16 sound);
uint32 GetHMYBETalkSfx(CPed *ped, uint16 sound);
uint32 GetHMOBETalkSfx(CPed *ped, uint16 sound);
uint32 GetHFYBUTalkSfx(CPed *ped, uint16 sound);
uint32 GetHFYMDTalkSfx(CPed *ped, uint16 sound);
uint32 GetHFYCGTalkSfx(CPed *ped, uint16 sound);
uint32 GetHFYPRTalkSfx(CPed *ped, uint16 sound);
uint32 GetHFOTRTalkSfx(CPed *ped, uint16 sound);
uint32 GetHMOTRTalkSfx(CPed *ped, uint16 sound);
uint32 GetHMOCATalkSfx(CPed *ped, uint16 sound);
uint32 GetBMYCRTalkSfx(CPed *ped, uint16 sound);
uint32 GetBFYSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetBFOSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetBMYSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetBMOSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetBFYRITalkSfx(CPed *ped, uint16 sound);
uint32 GetBFORITalkSfx(CPed *ped, uint16 sound);
uint32 GetBMYRITalkSfx(CPed *ped, uint16 sound);
uint32 GetBFYBETalkSfx(CPed *ped, uint16 sound);
uint32 GetBMYBETalkSfx(CPed *ped, uint16 sound);
uint32 GetBFOBETalkSfx(CPed *ped, uint16 sound);
uint32 GetBMOBETalkSfx(CPed *ped, uint16 sound);
uint32 GetBMYBUTalkSfx(CPed *ped, uint16 sound);
uint32 GetBFYPRTalkSfx(CPed *ped, uint16 sound);
uint32 GetBFOTRTalkSfx(CPed *ped, uint16 sound);
uint32 GetBMOTRTalkSfx(CPed *ped, uint16 sound);
uint32 GetBMYPITalkSfx(CPed *ped, uint16 sound);
uint32 GetBMYBBTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYCRTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYSKTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYSKTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFOSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMOSTTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYRITalkSfx(CPed *ped, uint16 sound);
uint32 GetWFORITalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYRITalkSfx(CPed *ped, uint16 sound);
uint32 GetWMORITalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYBETalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYBETalkSfx(CPed *ped, uint16 sound);
uint32 GetWFOBETalkSfx(CPed *ped, uint16 sound);
uint32 GetWMOBETalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYCWTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYGOTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFOGOTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMOGOTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYLGTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYLGTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYBUTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYBUTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMOBUTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYPRTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFOTRTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMOTRTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYPITalkSfx(CPed *ped, uint16 sound);
uint32 GetWMOCATalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYSHTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFOSHTalkSfx(CPed *ped, uint16 sound);
uint32 GetJFOTOTalkSfx(CPed *ped, uint16 sound);
uint32 GetJMOTOTalkSfx(CPed *ped, uint16 sound);
uint32 GetHNTalkSfx(CPed *ped, uint16 sound);
uint32 GetBKTalkSfx(CPed *ped, uint16 sound);
uint32 GetCBTalkSfx(CPed *ped, uint16 sound);
uint32 GetSGTalkSfx(CPed *ped, uint16 sound);
uint32 GetCLTalkSfx(CPed *ped, uint16 sound);
uint32 GetGDTalkSfx(CPed *ped, uint16 sound);
uint32 GetPGTalkSfx(CPed *ped, uint16 sound);
uint32 GetViceWhiteTalkSfx(CPed *ped, uint16 sound);
uint32 GetViceBlackTalkSfx(CPed *ped, uint16 sound);
uint32 GetBMODKTalkSfx(CPed *ped, uint16 sound);
uint32 GetHMYAPTalkSfx(CPed *ped, uint16 sound);
uint32 GetWFYJGTalkSfx(CPed *ped, uint16 sound);
uint32 GetWMYJGTalkSfx(CPed *ped, uint16 sound);
uint32 GetSpecialCharacterTalkSfx(CPed *ped, int32 model, uint16 sound);
int32 GetPedCommentSfx(CPed *ped, uint16 sound);
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset); // inlined on PS2
uint32 GetPlayerTalkSfx(uint16 sound); // inlined on PS2
uint32 GetCopTalkSfx(uint16 sound);
uint32 GetSwatTalkSfx(uint16 sound);
uint32 GetFBITalkSfx(uint16 sound);
uint32 GetArmyTalkSfx(uint16 sound);
uint32 GetMedicTalkSfx(uint16 sound);
uint32 GetFiremanTalkSfx(uint16 sound); // inlined on PS2
uint32 GetBusinessMaleOldTalkSfx(uint16 sound);
uint32 GetBusinessMaleYoungTalkSfx(uint16 sound, uint32 model);
uint32 GetMafiaTalkSfx(uint16 sound);
uint32 GetTriadTalkSfx(uint16 sound);
uint32 GetDiabloTalkSfx(uint16 sound);
uint32 GetYakuzaTalkSfx(uint16 sound);
uint32 GetYardieTalkSfx(uint16 sound);
uint32 GetColumbianTalkSfx(uint16 sound);
uint32 GetHoodTalkSfx(uint16 sound);
uint32 GetBlackCriminalTalkSfx(uint16 sound);
uint32 GetWhiteCriminalTalkSfx(uint16 sound);
uint32 GetCasualMaleOldTalkSfx(uint16 sound);
uint32 GetCasualMaleYoungTalkSfx(uint16 sound);
uint32 GetBlackCasualFemaleTalkSfx(uint16 sound);
uint32 GetWhiteCasualFemaleTalkSfx(uint16 sound);
uint32 GetFemaleNo3TalkSfx(uint16 sound);
uint32 GetWhiteBusinessFemaleTalkSfx(uint16 sound, uint32 model);
uint32 GetBlackFatFemaleTalkSfx(uint16 sound);
uint32 GetWhiteFatMaleTalkSfx(uint16 sound);
uint32 GetBlackFatMaleTalkSfx(uint16 sound);
uint32 GetWhiteFatFemaleTalkSfx(uint16 sound);
uint32 GetBlackFemaleProstituteTalkSfx(uint16 sound);
uint32 GetWhiteFemaleProstituteTalkSfx(uint16 sound);
uint32 GetBlackProjectMaleTalkSfx(uint16 sound, uint32 model);
uint32 GetBlackProjectFemaleOldTalkSfx(uint16 sound);
uint32 GetBlackProjectFemaleYoungTalkSfx(uint16 sound);
uint32 GetChinatownMaleOldTalkSfx(uint16 sound);
uint32 GetChinatownMaleYoungTalkSfx(uint16 sound);
uint32 GetChinatownFemaleOldTalkSfx(uint16 sound);
uint32 GetChinatownFemaleYoungTalkSfx(uint16 sound);
uint32 GetLittleItalyMaleTalkSfx(uint16 sound);
uint32 GetLittleItalyFemaleOldTalkSfx(uint16 sound);
uint32 GetLittleItalyFemaleYoungTalkSfx(uint16 sound);
uint32 GetWhiteDockerMaleTalkSfx(uint16 sound);
uint32 GetBlackDockerMaleTalkSfx(uint16 sound);
uint32 GetScumMaleTalkSfx(uint16 sound);
uint32 GetScumFemaleTalkSfx(uint16 sound);
uint32 GetWhiteWorkerMaleTalkSfx(uint16 sound);
uint32 GetBlackWorkerMaleTalkSfx(uint16 sound);
uint32 GetBlackBusinessFemaleTalkSfx(uint16 sound);
uint32 GetSupermodelMaleTalkSfx(uint16 sound);
uint32 GetSupermodelFemaleTalkSfx(uint16 sound);
uint32 GetStewardMaleTalkSfx(uint16 sound);
uint32 GetStewardFemaleTalkSfx(uint16 sound);
uint32 GetFanMaleTalkSfx(uint16 sound, uint32 model);
uint32 GetFanFemaleTalkSfx(uint16 sound);
uint32 GetHospitalMaleTalkSfx(uint16 sound);
uint32 GetHospitalFemaleTalkSfx(uint16 sound); // inlined on PS2
uint32 GetWhiteConstructionWorkerTalkSfx(uint16 sound);
uint32 GetBlackConstructionWorkerTalkSfx(uint16 sound);
uint32 GetShopperFemaleTalkSfx(uint16 sound, uint32 model);
uint32 GetStudentMaleTalkSfx(uint16 sound);
uint32 GetStudentFemaleTalkSfx(uint16 sound);
void DebugPlayPedComment(int32 sound);
uint32 GetSpecialCharacterTalkSfx(uint32 modelIndex, uint16 sound);
uint32 GetEightBallTalkSfx(uint16 sound); // inlined on PS2
uint32 GetSalvatoreTalkSfx(uint16 sound); // inlined on PS2
uint32 GetMistyTalkSfx(uint16 sound);
uint32 GetOldJapTalkSfx(uint16 sound); // inlined on PS2
uint32 GetCatalinaTalkSfx(uint16 sound); // inlined on PS2
uint32 GetBomberTalkSfx(uint16 sound); // inlined on PS2
uint32 GetSecurityGuardTalkSfx(uint16 sound);
uint32 GetChunkyTalkSfx(uint16 sound); // inlined on PS2
uint32 GetAsianTaxiDriverTalkSfx(uint16 sound); // inlined on PS2
uint32 GetPimpTalkSfx(uint16 sound);
uint32 GetNormalMaleTalkSfx(uint16 sound);
uint32 GetGenericMaleTalkSfx(uint16 sound);
uint32 GetGenericFemaleTalkSfx(uint16 sound);
// particles
void ProcessExplosions(int32 explosion);
void ProcessFires(int32 entity);
void ProcessWaterCannon(int32);
void ProcessExplosions(int32 id);
void ProcessFires(int32 id);
void ProcessWaterCannon(int32 id);
// script objects
void ProcessScriptObject(int32 id);
void ProcessScriptObject(int32 id); // inlined on PS2
void ProcessOneShotScriptObject(uint8 sound);
void ProcessLoopingScriptObject(uint8 sound);
void ProcessPornCinema(uint8 sound);
void ProcessWorkShopScriptObject(uint8 sound);
void ProcessSawMillScriptObject(uint8 sound);
void ProcessLaunderetteScriptObject(uint8 sound);
void ProcessShopScriptObject(uint8 sound);
void ProcessAirportScriptObject(uint8 sound);
void ProcessCinemaScriptObject(uint8 sound);
void ProcessDocksScriptObject(uint8 sound);
void ProcessHomeScriptObject(uint8 sound);
void ProcessPoliceCellBeatingScriptObject(uint8 sound);
// misc
void ProcessWeather(int32 id);
void ProcessFrontEnd();
//void ProcessCrane();
void ProcessCrane();
void ProcessProjectiles();
void ProcessEscalators();
void ProcessExtraSounds();
void ProcessGarages();
void ProcessFireHydrant();
#ifdef GTA_BRIDGE
void ProcessBridge();
// bridge
void ProcessBridge(); // inlined on PS2
void ProcessBridgeWarning();
void ProcessBridgeMotor();
void ProcessBridgeOneShots();
#endif
// mission audio
const char *GetMissionAudioLoadedLabel(uint8 slot);
bool8 MissionScriptAudioUsesPoliceChannel(uint32 soundMission);
void PreloadMissionAudio(uint8 slot, Const char *name);
uint8 GetMissionAudioLoadingStatus(uint8 slot);
void SetMissionAudioLocation(uint8 slot, float x, float y, float z);
void PlayLoadedMissionAudio(uint8 slot);
bool8 ShouldDuckMissionAudio(uint8 slot);
bool8 IsMissionAudioSamplePlaying(uint8 slot);
bool8 IsMissionAudioSampleFinished(uint8 slot);
void ClearMissionAudio(uint8 slot); // inlined in vc
void ProcessMissionAudioSlot(uint8 slot);
void PreloadMissionAudio(Const char *name);
uint8 GetMissionAudioLoadingStatus();
void SetMissionAudioLocation(float x, float y, float z);
void PlayLoadedMissionAudio();
bool8 IsMissionAudioSampleFinished();
bool8 IsMissionAudioSamplePlaying() { return m_nMissionAudioPlayStatus == PLAY_STATUS_PLAYING; }
bool8 ShouldDuckMissionAudio() { return IsMissionAudioSamplePlaying(); }
void ClearMissionAudio();
void ProcessMissionAudio();
// police radio
void InitialisePoliceRadioZones();
void InitialisePoliceRadio();
void ResetPoliceRadio();
void SetMissionScriptPoliceAudio(uint32 sfx); // inlined and optimized
void SetMissionScriptPoliceAudio(uint32 sfx);
int8 GetMissionScriptPoliceAudioPlayingStatus();
void DoPoliceRadioCrackle();
void ServicePoliceRadio();
@ -588,7 +533,7 @@ public:
void SetupSuspectLastSeenReport();
void ReportCrime(eCrimeType crime, const CVector &pos);
void PlaySuspectLastSeen(float x, float y, float z);
void AgeCrimes(); // inlined in vc
void AgeCrimes(); // inlined on PS2
// collision stuff
void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2);
@ -598,9 +543,7 @@ public:
uint32 SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollision &audioCollision);
float GetCollisionOneShotRatio(uint32 a, float b);
float GetCollisionLoopingRatio(uint32 a, uint32 b, float c); // not used
float GetCollisionRatio(float a, float b, float c, float d); // inlined in vc
float Sqrt(float v) const { return v <= 0.0f ? 0.0f : ::Sqrt(v); }
float GetCollisionRatio(float a, float b, float c, float d); // inlined on PS2
};
/*
@ -629,14 +572,9 @@ public:
#else
#define SET_SOUND_REFLECTION(b)
#endif
#ifdef AUDIO_REVERB
#define SET_SOUND_REVERB(b) m_sQueueSample.m_bReverb = b
#else
#define SET_SOUND_REVERB(b)
#endif
#if defined(AUDIO_MSS) && !defined(PS2_AUDIO_CHANNELS)
static_assert(sizeof(cAudioManager) == 0x5558, "cAudioManager: error");
static_assert(sizeof(cAudioManager) == 19220, "cAudioManager: error");
#endif
extern cAudioManager AudioManager;

File diff suppressed because it is too large Load Diff

View File

@ -93,8 +93,6 @@ cAudioScriptObject::SaveAllAudioScriptObjects(uint8 *buf, uint32 *size)
void
PlayOneShotScriptObject(uint8 id, CVector const &pos)
{
if (!DMAudio.IsAudioInitialised()) return;
cAudioScriptObject *audioScriptObject = new cAudioScriptObject();
audioScriptObject->Posn = pos;
audioScriptObject->AudioId = id;

View File

@ -63,18 +63,9 @@ cDMAudio::DestroyAllGameCreatedEntities(void)
}
void
cDMAudio::SetOutputMode(bool8 surround)
cDMAudio::SetMonoMode(bool8 mono)
{
AudioManager.SetOutputMode(surround);
}
void
cDMAudio::SetMP3BoostVolume(uint8 volume)
{
uint8 vol = volume;
if (vol > MAX_VOLUME) vol = MAX_VOLUME;
AudioManager.SetMP3BoostVolume(vol);
AudioManager.SetMonoMode(mono);
}
void
@ -125,11 +116,6 @@ cDMAudio::Get3DProviderName(uint8 id)
return AudioManager.Get3DProviderName(id);
}
int8 cDMAudio::AutoDetect3DProviders(void)
{
return AudioManager.AutoDetect3DProviders();
}
int8
cDMAudio::GetCurrent3DProviderIndex(void)
{
@ -252,13 +238,13 @@ cDMAudio::PlayFrontEndSound(uint16 frontend, uint32 volume)
}
void
cDMAudio::PlayRadioAnnouncement(uint32 announcement)
cDMAudio::PlayRadioAnnouncement(uint8 announcement)
{
MusicManager.PlayAnnouncement(announcement);
}
void
cDMAudio::PlayFrontEndTrack(uint32 track, bool8 frontendFlag)
cDMAudio::PlayFrontEndTrack(uint8 track, bool8 frontendFlag)
{
MusicManager.PlayFrontEndTrack(track, frontendFlag);
}
@ -282,7 +268,7 @@ cDMAudio::ChangeMusicMode(uint8 mode)
}
void
cDMAudio::PreloadCutSceneMusic(uint32 track)
cDMAudio::PreloadCutSceneMusic(uint8 track)
{
MusicManager.PreloadCutSceneMusic(track);
}
@ -300,51 +286,39 @@ cDMAudio::StopCutSceneMusic(void)
}
void
cDMAudio::PreloadMissionAudio(uint8 slot, Const char *missionAudio)
cDMAudio::PreloadMissionAudio(Const char *missionAudio)
{
AudioManager.PreloadMissionAudio(slot, missionAudio);
AudioManager.PreloadMissionAudio(missionAudio);
}
uint8
cDMAudio::GetMissionAudioLoadingStatus(uint8 slot)
cDMAudio::GetMissionAudioLoadingStatus(void)
{
return AudioManager.GetMissionAudioLoadingStatus(slot);
return AudioManager.GetMissionAudioLoadingStatus();
}
void
cDMAudio::SetMissionAudioLocation(uint8 slot, float x, float y, float z)
cDMAudio::SetMissionAudioLocation(float x, float y, float z)
{
AudioManager.SetMissionAudioLocation(slot, x, y, z);
AudioManager.SetMissionAudioLocation(x, y, z);
}
void
cDMAudio::PlayLoadedMissionAudio(uint8 slot)
cDMAudio::PlayLoadedMissionAudio(void)
{
AudioManager.PlayLoadedMissionAudio(slot);
AudioManager.PlayLoadedMissionAudio();
}
bool8
cDMAudio::IsMissionAudioSamplePlaying(uint8 slot)
cDMAudio::IsMissionAudioSampleFinished(void)
{
return AudioManager.IsMissionAudioSamplePlaying(slot);
}
bool8
cDMAudio::IsMissionAudioSampleFinished(uint8 slot)
{
return AudioManager.IsMissionAudioSampleFinished(slot);
return AudioManager.IsMissionAudioSampleFinished();
}
void
cDMAudio::ClearMissionAudio(uint8 slot)
cDMAudio::ClearMissionAudio(void)
{
AudioManager.ClearMissionAudio(slot);
}
const char *
cDMAudio::GetMissionAudioLoadedLabel(uint8 slot)
{
return AudioManager.GetMissionAudioLoadedLabel(slot);
AudioManager.ClearMissionAudio();
}
uint8
@ -360,49 +334,7 @@ cDMAudio::SetRadioInCar(uint32 radio)
}
void
cDMAudio::SetRadioChannel(uint32 radio, int32 pos)
cDMAudio::SetRadioChannel(uint8 radio, int32 pos)
{
MusicManager.SetRadioChannelByScript(radio, pos);
}
void
cDMAudio::SetStartingTrackPositions(bool8 isStartGame)
{
MusicManager.SetStartingTrackPositions(isStartGame);
}
float *
cDMAudio::GetListenTimeArray()
{
return MusicManager.GetListenTimeArray();
}
uint32
cDMAudio::GetFavouriteRadioStation()
{
return MusicManager.GetFavouriteRadioStation();
}
int32
cDMAudio::GetRadioPosition(uint32 station)
{
return MusicManager.GetRadioPosition(station);
}
void
cDMAudio::SetPedTalkingStatus(CPed *ped, bool8 status)
{
return AudioManager.SetPedTalkingStatus(ped, status);
}
void
cDMAudio::SetPlayersMood(uint8 mood, uint32 time)
{
return AudioManager.SetPlayersMood(mood, time);
}
void
cDMAudio::ShutUpPlayerTalking(bool8 state)
{
AudioManager.m_bIsPlayerShutUp = state;
}

View File

@ -7,9 +7,6 @@
#define AEHANDLE_IS_FAILED(h) ((h)<0)
#define AEHANDLE_IS_OK(h) ((h)>=0)
#define NO_AUDIO_PROVIDER -3
#define AUDIO_PROVIDER_NOT_DETERMINED -99
class cAudioScriptObject;
class CEntity;
@ -30,8 +27,7 @@ public:
void PlayOneShot(int32 audioEntity, uint16 oneShot, float volume);
void DestroyAllGameCreatedEntities(void);
void SetOutputMode(bool8 surround);
void SetMP3BoostVolume(uint8 volume);
void SetMonoMode(bool8 mono);
void SetEffectsMasterVolume(uint8 volume);
void SetMusicMasterVolume(uint8 volume);
void SetEffectsFadeVol(uint8 volume);
@ -40,8 +36,6 @@ public:
uint8 GetNum3DProvidersAvailable(void);
char *Get3DProviderName(uint8 id);
int8 AutoDetect3DProviders(void);
int8 GetCurrent3DProviderIndex(void);
int8 SetCurrent3DProvider(uint8 which);
@ -71,37 +65,27 @@ public:
void ReportCollision(CEntity *entityA, CEntity *entityB, uint8 surfaceTypeA, uint8 surfaceTypeB, float collisionPower, float velocity);
void PlayFrontEndSound(uint16 frontend, uint32 volume);
void PlayRadioAnnouncement(uint32 announcement);
void PlayFrontEndTrack(uint32 track, bool8 frontendFlag);
void PlayRadioAnnouncement(uint8 announcement);
void PlayFrontEndTrack(uint8 track, bool8 frontendFlag);
void StopFrontEndTrack(void);
void ResetTimers(uint32 time);
void ChangeMusicMode(uint8 mode);
void PreloadCutSceneMusic(uint32 track);
void PreloadCutSceneMusic(uint8 track);
void PlayPreloadedCutSceneMusic(void);
void StopCutSceneMusic(void);
void PreloadMissionAudio(uint8 slot, Const char *missionAudio);
uint8 GetMissionAudioLoadingStatus(uint8 slot);
void SetMissionAudioLocation(uint8 slot, float x, float y, float z);
void PlayLoadedMissionAudio(uint8 slot);
bool8 IsMissionAudioSamplePlaying(uint8 slot);
bool8 IsMissionAudioSampleFinished(uint8 slot);
void ClearMissionAudio(uint8 slot);
const char *GetMissionAudioLoadedLabel(uint8 slot);
void PreloadMissionAudio(Const char *missionAudio);
uint8 GetMissionAudioLoadingStatus(void);
void SetMissionAudioLocation(float x, float y, float z);
void PlayLoadedMissionAudio(void);
bool8 IsMissionAudioSampleFinished(void);
void ClearMissionAudio(void);
uint8 GetRadioInCar(void);
void SetRadioInCar(uint32 radio);
void SetRadioChannel(uint32 radio, int32 pos);
void SetStartingTrackPositions(bool8 isStartGame);
float *GetListenTimeArray();
uint32 GetFavouriteRadioStation();
int32 GetRadioPosition(uint32 station);
void SetPedTalkingStatus(class CPed *ped, bool8 status);
void SetPlayersMood(uint8 mood, uint32 time);
void ShutUpPlayerTalking(bool8 state);
void SetRadioChannel(uint8 radio, int32 pos);
};
extern cDMAudio DMAudio;

File diff suppressed because it is too large Load Diff

View File

@ -11,53 +11,41 @@ public:
};
class CVehicle;
class CPed;
class cMusicManager
{
public:
bool8 m_bIsInitialised;
bool8 m_bDisabled;
uint8 m_nMusicMode;
uint8 m_nNextTrack;
uint8 m_nPlayingTrack;
bool8 m_bFrontendTrackFinished;
bool8 m_bPlayInFrontend;
bool8 m_bSetNextStation;
uint8 m_nVolumeLatency;
uint8 m_nCurrentVolume;
uint8 m_nMaxVolume;
uint32 m_nAnnouncement;
uint8 m_nAnnouncement;
bool8 m_bPreviousPlayerInCar;
bool8 m_bPlayerInCar;
bool8 m_bAnnouncementInProgress;
tStreamedSample m_aTracks[TOTAL_STREAMED_SOUNDS];
bool8 m_bResetTimers;
uint32 m_nResetTime;
uint32 m_nLastTrackServiceTime;
uint32 m_nTimer;
bool8 m_bDoTrackService;
bool8 m_bIgnoreTimeDelay;
bool8 m_bVerifyAmbienceTrackStartedToPlay;
bool8 m_bRadioSetByScript;
uint8 m_nRadioStationScript;
int32 m_nRadioPosition;
uint32 m_nRadioInCar;
uint32 m_nFrontendTrack;
uint32 m_nPlayingTrack;
uint8 m_nUpcomingMusicMode;
uint8 m_nMusicMode;
bool8 m_FrontendLoopFlag;
bool8 m_bTrackChangeStarted;
uint32 m_nNextTrack;
bool8 m_nNextLoopFlag;
bool8 m_bVerifyNextTrackStartedToPlay;
bool8 m_bGameplayAllowsRadio;
bool8 m_bRadioStreamReady;
int8 nFramesSinceCutsceneEnded;
bool8 m_bUserResumedGame;
bool8 m_bMusicModeChangeStarted;
uint8 m_nMusicModeToBeSet;
bool8 m_bEarlyFrontendTrack;
float aListenTimeArray[NUM_RADIOS];
float m_nLastTrackServiceTime;
uint8 m_nRadioInCar;
public:
cMusicManager();
bool8 IsInitialised() { return m_bIsInitialised; }
uint8 GetMusicMode() { return m_nMusicMode; }
uint32 GetCurrentTrack() { return m_nPlayingTrack; }
uint32 GetMusicMode() { return m_nMusicMode; }
uint8 GetNextTrack() { return m_nNextTrack; }
void ResetMusicAfterReload();
void SetStartingTrackPositions(bool8 isNewGameTimer);
bool8 Initialise();
void Terminate();
@ -67,47 +55,35 @@ public:
bool8 PlayerInCar();
void DisplayRadioStationName();
void PlayAnnouncement(uint32);
void PlayFrontEndTrack(uint32, bool8);
void PreloadCutSceneMusic(uint32);
void PlayAnnouncement(uint8);
void PlayFrontEndTrack(uint8, bool8);
void PreloadCutSceneMusic(uint8);
void PlayPreloadedCutSceneMusic(void);
void StopCutSceneMusic(void);
uint32 GetRadioInCar(void);
uint8 GetRadioInCar(void);
void SetRadioInCar(uint32);
void SetRadioChannelByScript(uint32, int32);
void SetRadioChannelByScript(uint8, int32);
void ResetMusicAfterReload();
void ResetTimers(uint32);
void Service();
void ServiceFrontEndMode();
void ServiceGameMode();
void ServiceAmbience();
void ServiceTrack(CVehicle *veh, CPed *ped);
void ServiceTrack();
bool8 UsesPoliceRadio(CVehicle *veh);
bool8 UsesTaxiRadio(CVehicle *veh);
uint32 GetTrackStartPos(uint32 track);
uint32 GetTrackStartPos(uint8);
void ComputeAmbienceVol(bool8 reset, uint8& outVolume);
bool8 ServiceAnnouncement();
uint32 GetCarTuning();
uint32 GetNextCarTuning();
uint8 GetCarTuning();
uint8 GetNextCarTuning();
bool8 ChangeRadioChannel();
void RecordRadioStats();
void SetUpCorrectAmbienceTrack();
float *GetListenTimeArray();
uint32 GetRadioPosition(uint32 station);
uint32 GetFavouriteRadioStation();
void SetMalibuClubTrackPos(uint8 pos);
void SetStripClubTrackPos(uint8 pos);
bool8 CheckForMusicInterruptions();
void Enable();
void Disable();
};
VALIDATE_SIZE(cMusicManager, 0x95C);
extern cMusicManager MusicManager;
extern bool8 g_bAnnouncementReadPosAlready; // we have a symbol of this so it was declared in .h
float GetHeightScale();

View File

@ -22,6 +22,8 @@ struct tPoliceRadioZone {
};
tPoliceRadioZone ZoneSfx[NUMAUDIOZONES];
char SubZo2Label[8];
char SubZo3Label[8];
uint32 g_nMissionAudioSfx = TOTAL_AUDIO_SAMPLES;
int8 g_nMissionAudioPlayingStatus = PLAY_STATUS_FINISHED;
@ -38,22 +40,46 @@ cAudioManager::InitialisePoliceRadioZones()
strcpy(ZoneSfx[i].m_aName, name); \
ZoneSfx[i].m_nSampleIndex = sample;
SETZONESFX(0, "VICE_C", SFX_POLICE_RADIO_VICE_CITY);
SETZONESFX(1, "IND_ZON", SFX_POLICE_RADIO_VICE_CITY_BEACH);
SETZONESFX(2, "COM_ZON", SFX_POLICE_RADIO_VICE_CITY_MAINLAND);
SETZONESFX(3, "BEACH1", SFX_POLICE_RADIO_OCEAN_BEACH);
SETZONESFX(4, "BEACH2", SFX_POLICE_RADIO_WASHINGTON_BEACH);
SETZONESFX(5, "BEACH3", SFX_POLICE_RADIO_VICE_POINT);
SETZONESFX(6, "GOLFC", SFX_POLICE_RADIO_LEAF_LINKS);
SETZONESFX(7, "STARI", SFX_POLICE_RADIO_STARFISH_ISLAND);
SETZONESFX(8, "DOCKS", SFX_POLICE_RADIO_VICEPORT);
SETZONESFX(9, "HAVANA", SFX_POLICE_RADIO_LITTLE_HAVANA);
SETZONESFX(10, "HAITI", SFX_POLICE_RADIO_LITTLE_HAITI);
SETZONESFX(11, "PORNI", SFX_POLICE_RADIO_PRAWN_ISLAND);
SETZONESFX(12, "DTOWN", SFX_POLICE_RADIO_DOWNTOWN);
SETZONESFX(13, "A_PORT", SFX_POLICE_RADIO_ESCOBAR_INTERNATIONAL);
SETZONESFX(0, "HOSPI_2", SFX_POLICE_RADIO_ROCKFORD);
SETZONESFX(1, "CONSTRU", SFX_POLICE_RADIO_FORT_STAUNTON);
SETZONESFX(2, "STADIUM", SFX_POLICE_RADIO_ASPATRIA);
SETZONESFX(3, "YAKUSA", SFX_POLICE_RADIO_TORRINGTON);
SETZONESFX(4, "SHOPING", SFX_POLICE_RADIO_BEDFORD_POINT);
SETZONESFX(5, "COM_EAS", SFX_POLICE_RADIO_NEWPORT);
SETZONESFX(6, "PARK", SFX_POLICE_RADIO_BELLEVILLE_PARK);
SETZONESFX(7, "UNIVERS", SFX_POLICE_RADIO_LIBERTY_CAMPUS);
SETZONESFX(8, "BIG_DAM", SFX_POLICE_RADIO_COCHRANE_DAM);
SETZONESFX(9, "SUB_IND", SFX_POLICE_RADIO_PIKE_CREEK);
SETZONESFX(10, "SWANKS", SFX_POLICE_RADIO_CEDAR_GROVE);
SETZONESFX(11, "PROJECT", SFX_POLICE_RADIO_WICHITA_GARDENS);
SETZONESFX(12, "AIRPORT", SFX_POLICE_RADIO_FRANCIS_INTERNATIONAL_AIRPORT);
SETZONESFX(13, "PORT_W", SFX_POLICE_RADIO_CALLAHAN_POINT);
SETZONESFX(14, "PORT_S", SFX_POLICE_RADIO_ATLANTIC_QUAYS);
SETZONESFX(15, "PORT_E", SFX_POLICE_RADIO_PORTLAND_HARBOUR);
SETZONESFX(16, "PORT_I", SFX_POLICE_RADIO_TRENTON);
SETZONESFX(17, "CHINA", SFX_POLICE_RADIO_CHINATOWN);
SETZONESFX(18, "REDLIGH", SFX_POLICE_RADIO_RED_LIGHT_DISTRICT);
SETZONESFX(19, "TOWERS", SFX_POLICE_RADIO_HEPBURN_HEIGHTS);
SETZONESFX(20, "LITTLEI", SFX_POLICE_RADIO_SAINT_MARKS);
SETZONESFX(21, "HARWOOD", SFX_POLICE_RADIO_HARWOOD);
SETZONESFX(22, "EASTBAY", SFX_POLICE_RADIO_PORTLAND_BEACH);
SETZONESFX(23, "S_VIEW", SFX_POLICE_RADIO_PORTLAND_STRAIGHTS);
SETZONESFX(24, "CITYZON", SFX_POLICE_RADIO_LIBERTY_CITY);
SETZONESFX(25, "IND_ZON", SFX_POLICE_RADIO_PORTLAND);
SETZONESFX(26, "COM_ZON", SFX_POLICE_RADIO_STAUNTON_ISLAND);
SETZONESFX(27, "SUB_ZON", SFX_POLICE_RADIO_SHORESIDE_VALE);
SETZONESFX(28, "SUB_ZO2", SFX_POLICE_RADIO_SHORESIDE_VALE);
SETZONESFX(29, "SUB_ZO3", SFX_POLICE_RADIO_SHORESIDE_VALE);
SETZONESFX(30, "A", SFX_POLICE_RADIO_ROCKFORD);
SETZONESFX(31, "A", SFX_POLICE_RADIO_ROCKFORD);
SETZONESFX(32, "A", SFX_POLICE_RADIO_ROCKFORD);
SETZONESFX(33, "A", SFX_POLICE_RADIO_ROCKFORD);
SETZONESFX(34, "A", SFX_POLICE_RADIO_ROCKFORD);
#undef SETZONESFX
strcpy(SubZo2Label, "SUB_ZO2");
strcpy(SubZo3Label, "SUB_ZO3");
}
void
@ -62,9 +88,8 @@ cAudioManager::InitialisePoliceRadio()
m_sPoliceRadioQueue.Reset();
for (int32 i = 0; i < ARRAY_SIZE(m_aCrimes); i++)
m_aCrimes[i].type = CRIME_NONE;
#if !defined(GTA_PS2) || defined(AUDIO_REVERB)
SampleManager.SetChannelReverbFlag(CHANNEL_POLICE_RADIO, FALSE);
#endif
gSpecialSuspectLastSeenReport = FALSE;
for (int32 i = 0; i < ARRAY_SIZE(gMinTimeToNextReport); i++)
gMinTimeToNextReport[i] = m_FrameCounter;
@ -109,7 +134,7 @@ cAudioManager::DoPoliceRadioCrackle()
SET_EMITTING_VOLUME(m_sQueueSample.m_nVolume);
SET_LOOP_OFFSETS(SFX_POLICE_RADIO_CRACKLE)
m_sQueueSample.m_bStatic = FALSE;
SET_SOUND_REVERB(FALSE);
m_sQueueSample.m_bReverb = FALSE;
m_sQueueSample.m_nPan = 63;
m_sQueueSample.m_nFramesToPlay = 3;
SET_SOUND_REFLECTION(FALSE);
@ -130,21 +155,18 @@ cAudioManager::ServicePoliceRadio()
if(CReplay::IsPlayingBack() || !FindPlayerPed() || !FindPlayerPed()->m_pWanted)
return;
#endif
CPlayerPed *playerPed = FindPlayerPed();
if (playerPed) {
wantedLevel = playerPed->m_pWanted->GetWantedLevel();
if (!crimeReport) {
if (wantedLevel != 0) {
if (nLastSeen != 0)
wantedLevel = FindPlayerPed()->m_pWanted->GetWantedLevel();
if (!crimeReport) {
if (wantedLevel != 0) {
if (nLastSeen != 0) {
#ifdef FIX_BUGS
nLastSeen -= CTimer::GetLogicalFramesPassed();
nLastSeen -= CTimer::GetLogicalFramesPassed();
#else
nLastSeen--;
nLastSeen--;
#endif
else {
nLastSeen = m_anRandomTable[1] % 1000 + 2000;
SetupSuspectLastSeenReport();
}
} else {
nLastSeen = m_anRandomTable[1] % 1000 + 2000;
SetupSuspectLastSeenReport();
}
}
}
@ -162,21 +184,29 @@ cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
static int cWait = 0;
static bool8 bChannelOpen = FALSE;
static uint8 bMissionAudioPhysicalPlayingStatus = PLAY_STATUS_STOPPED;
static uint32 PoliceChannelFreq = 22050;
static uint32 PoliceChannelFreq = 5500;
if (!m_bIsInitialised) return;
if (m_bIsPaused) {
#ifdef GTA_PS2
if (SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO))
SampleManager.SetChannelFrequency(CHANNEL_POLICE_RADIO, 0);
#else
if (SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO)) SampleManager.StopChannel(CHANNEL_POLICE_RADIO);
if (g_nMissionAudioSfx != NO_SAMPLE && bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING &&
SampleManager.IsStreamPlaying(1)) {
if (g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES && bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING &&
SampleManager.IsStreamPlaying(1))
SampleManager.PauseStream(TRUE, 1);
}
#endif
} else {
if (m_bWasPaused && g_nMissionAudioSfx != NO_SAMPLE &&
bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING) {
#ifdef GTA_PS2
if (m_bWasPaused)
SampleManager.SetChannelFrequency(CHANNEL_POLICE_RADIO, PoliceChannelFreq);
#else
if (m_bWasPaused && g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES &&
bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING)
SampleManager.PauseStream(FALSE, 1);
}
#endif
if (m_sPoliceRadioQueue.m_nSamplesInQueue == 0) bChannelOpen = FALSE;
if (cWait) {
#ifdef FIX_BUGS
@ -186,50 +216,69 @@ cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
#endif
return;
}
if (g_nMissionAudioSfx != NO_SAMPLE && !bChannelOpen) {
if (g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES && !bChannelOpen) {
if (g_nMissionAudioPlayingStatus != PLAY_STATUS_STOPPED) {
if (g_nMissionAudioPlayingStatus == PLAY_STATUS_PLAYING && bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_STOPPED &&
#ifdef GTA_PS2
SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO)) {
#else
SampleManager.IsStreamPlaying(1)) {
#endif
bMissionAudioPhysicalPlayingStatus = PLAY_STATUS_PLAYING;
}
if (bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING) {
#ifdef GTA_PS2
if (SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO)) {
#else
if (SampleManager.IsStreamPlaying(1)) {
#endif
DoPoliceRadioCrackle();
} else {
bMissionAudioPhysicalPlayingStatus = PLAY_STATUS_FINISHED;
g_nMissionAudioPlayingStatus = PLAY_STATUS_FINISHED;
g_nMissionAudioSfx = NO_SAMPLE;
g_nMissionAudioSfx = TOTAL_AUDIO_SAMPLES;
cWait = 30;
}
return;
}
} else if (!SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO)) {
#ifdef GTA_PS2
SampleManager.InitialiseChannel(CHANNEL_POLICE_RADIO, g_nMissionAudioSfx, SFX_BANK_PED_COMMENTS);
PoliceChannelFreq = SampleManager.GetSampleBaseFrequency(g_nMissionAudioSfx);
SampleManager.SetChannelFrequency(CHANNEL_POLICE_RADIO, PoliceChannelFreq);
SampleManager.SetChannelVolume(CHANNEL_POLICE_RADIO, MAX_VOLUME);
SampleManager.SetChannelPan(CHANNEL_POLICE_RADIO, 63);
SampleManager.StartChannel(CHANNEL_POLICE_RADIO);
#else
SampleManager.PreloadStreamedFile(g_nMissionAudioSfx, 1);
SampleManager.SetStreamedVolumeAndPan(MAX_VOLUME, 63, TRUE, 1);
SampleManager.StartPreloadedStreamedFile(1);
#endif
g_nMissionAudioPlayingStatus = PLAY_STATUS_PLAYING;
bMissionAudioPhysicalPlayingStatus = PLAY_STATUS_STOPPED;
return;
}
}
if (bChannelOpen) DoPoliceRadioCrackle();
if ((g_nMissionAudioSfx == NO_SAMPLE || g_nMissionAudioPlayingStatus != PLAY_STATUS_PLAYING) &&
if ((g_nMissionAudioSfx == TOTAL_AUDIO_SAMPLES || g_nMissionAudioPlayingStatus != PLAY_STATUS_PLAYING) &&
!SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO) && m_sPoliceRadioQueue.m_nSamplesInQueue != 0) {
sample = m_sPoliceRadioQueue.Remove();
if (wantedLevel == 0) {
if (gSpecialSuspectLastSeenReport) {
gSpecialSuspectLastSeenReport = FALSE;
} else if (sample == SFX_POLICE_RADIO_MESSAGE_NOISE_1) {
} else if (((sample >= SFX_POLICE_RADIO_MESSAGE_NOISE_1) && (sample <= SFX_POLICE_RADIO_MESSAGE_NOISE_3)) || sample == TOTAL_AUDIO_SAMPLES) {
bChannelOpen = FALSE;
processed = TRUE;
}
}
if (sample == NO_SAMPLE) {
if (sample == TOTAL_AUDIO_SAMPLES) {
if (!processed) cWait = 30;
} else {
SampleManager.InitialiseChannel(CHANNEL_POLICE_RADIO, sample, SFX_BANK_0);
switch (sample) {
case SFX_POLICE_RADIO_MESSAGE_NOISE_1:
case SFX_POLICE_RADIO_MESSAGE_NOISE_2:
case SFX_POLICE_RADIO_MESSAGE_NOISE_3:
freq = m_anRandomTable[4] % 2000 + 10025;
bChannelOpen = bChannelOpen == FALSE;
break;
@ -288,54 +337,49 @@ cAudioManager::SetupCrimeReport()
for (int j = 0; j < NUMAUDIOZONES; j++) {
if (strcmp(zone->name, ZoneSfx[j].m_aName) == 0) {
sampleIndex = ZoneSfx[j].m_nSampleIndex;
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(m_anRandomTable[0] % 3 + SFX_WEVE_GOT);
m_sPoliceRadioQueue.Add(SFX_A_10);
m_sPoliceRadioQueue.Add(m_anRandomTable[1] % 2 + SFX_A_10_1);
switch (m_aCrimes[i].type) {
case CRIME_PED_BURNED:
case CRIME_HIT_PED_NASTYWEAPON:
m_aCrimes[i].type = CRIME_HIT_PED;
break;
case CRIME_COP_BURNED:
case CRIME_HIT_COP_NASTYWEAPON:
m_aCrimes[i].type = CRIME_HIT_COP;
break;
case CRIME_PED_BURNED: m_aCrimes[i].type = CRIME_HIT_PED; break;
case CRIME_COP_BURNED: m_aCrimes[i].type = CRIME_HIT_COP; break;
case CRIME_VEHICLE_BURNED: m_aCrimes[i].type = CRIME_STEAL_CAR; break;
case CRIME_DESTROYED_CESSNA: m_aCrimes[i].type = CRIME_SHOOT_HELI; break;
case CRIME_EXPLOSION: m_aCrimes[i].type = CRIME_STEAL_CAR; break; // huh?
default: break;
}
#ifdef FIX_BUGS
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_CRIME_1 - 1);
#else
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_CRIME_1);
#endif
m_sPoliceRadioQueue.Add(SFX_IN);
rangeX = zone->maxx - zone->minx;
rangeY = zone->maxy - zone->miny;
halfX = 0.5f * rangeX + zone->minx;
halfY = 0.5f * rangeY + zone->miny;
quarterX = 0.25f * rangeX;
quarterY = 0.25f * rangeY;
if (m_aCrimes[i].position.y > halfY + quarterY) {
if (sampleIndex == SFX_POLICE_RADIO_SHORESIDE_VALE &&
(strcmp(zone->name, SubZo2Label) == 0 || strcmp(zone->name, SubZo3Label) == 0)) {
m_sPoliceRadioQueue.Add(SFX_NORTH);
processed = TRUE;
} else if (m_aCrimes[i].position.y < halfY - quarterY) {
m_sPoliceRadioQueue.Add(SFX_SOUTH);
processed = TRUE;
}
if (m_aCrimes[i].position.x > halfX + quarterX)
m_sPoliceRadioQueue.Add(SFX_EAST);
else if (m_aCrimes[i].position.x < halfX - quarterX)
m_sPoliceRadioQueue.Add(SFX_WEST);
else if (!processed)
m_sPoliceRadioQueue.Add(SFX_CENTRAL);
} else {
rangeX = zone->maxx - zone->minx;
rangeY = zone->maxy - zone->miny;
halfX = 0.5f * rangeX + zone->minx;
halfY = 0.5f * rangeY + zone->miny;
quarterX = 0.25f * rangeX;
quarterY = 0.25f * rangeY;
m_sPoliceRadioQueue.Add(sampleIndex);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(NO_SAMPLE);
if (m_aCrimes[i].position.y > halfY + quarterY) {
m_sPoliceRadioQueue.Add(SFX_NORTH);
processed = TRUE;
} else if (m_aCrimes[i].position.y < halfY - quarterY) {
m_sPoliceRadioQueue.Add(SFX_SOUTH);
processed = TRUE;
}
if (m_aCrimes[i].position.x > halfX + quarterX)
m_sPoliceRadioQueue.Add(SFX_EAST);
else if (m_aCrimes[i].position.x < halfX - quarterX)
m_sPoliceRadioQueue.Add(SFX_WEST);
else if (!processed)
m_sPoliceRadioQueue.Add(SFX_CENTRAL);
m_sPoliceRadioQueue.Add(sampleIndex);
m_sPoliceRadioQueue.Add(m_anRandomTable[2] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
}
break;
}
}
@ -346,101 +390,157 @@ cAudioManager::SetupCrimeReport()
}
Const uint32 gCarColourTable[][3] = {
{NO_SAMPLE, SFX_POLICE_RADIO_BLACK, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_WHITE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
{SFX_POLICE_RADIO_BRIGHT, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLACK, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_WHITE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_BRIGHT, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_BLUE, SFX_POLICE_RADIO_GREY},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE}
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
#else
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
#endif
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
#else
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
#endif
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
#else
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
#endif
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
#else
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
#endif
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
#else
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
#endif
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_PURPLE, SFX_POLICE_RADIO_BLUE},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
#else
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
#endif
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, SFX_POLICE_RADIO_GREY},
#else
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
#endif
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
#else
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
#endif
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
#ifdef FIX_BUGS
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
#else
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
#endif
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES}
};
void
@ -455,7 +555,7 @@ cAudioManager::SetupSuspectLastSeenReport()
uint32 color_post_modifier;
if (MusicManager.m_nMusicMode != MUSICMODE_CUTSCENE) {
veh = FindVehicleOfPlayer();
veh = FindPlayerVehicle();
if (veh != nil) {
if (POLICE_RADIO_QUEUE_MAX_SAMPLES - m_sPoliceRadioQueue.m_nSamplesInQueue > 9) {
color1 = veh->m_currentColour1;
@ -466,189 +566,136 @@ cAudioManager::SetupSuspectLastSeenReport()
color_pre_modifier = gCarColourTable[color1][0];
color_post_modifier = gCarColourTable[color1][2];
switch (veh->GetModelIndex()) {
#ifdef FIX_BUGS
case MI_COLUMB:
main_color = SFX_POLICE_RADIO_BLUE;
color_pre_modifier = color_post_modifier = TOTAL_AUDIO_SAMPLES;
#endif
case MI_LANDSTAL:
case MI_PATRIOT:
case MI_RANCHER:
case MI_FBIRANCH:
case MI_SANDKING:
sample = SFX_POLICE_RADIO_OFFROAD;
break;
case MI_BLISTA: sample = SFX_POLICE_RADIO_CRUISER; break;
#ifdef FIX_BUGS
case MI_YARDIE:
color_pre_modifier = TOTAL_AUDIO_SAMPLES;
main_color = SFX_POLICE_RADIO_RED;
color_post_modifier = SFX_POLICE_RADIO_YELLOW;
sample = SFX_POLICE_RADIO_CONVERTIBLE; break;
case MI_DIABLOS:
main_color = SFX_POLICE_RADIO_BLACK;
#endif
case MI_IDAHO:
case MI_MANANA:
case MI_ESPERANT:
case MI_CUBAN:
case MI_STALLION:
case MI_SABRE:
case MI_SABRETUR:
case MI_VIRGO:
case MI_BLISTAC:
sample = SFX_POLICE_RADIO_TUDOOR;
break;
case MI_STALLION: sample = SFX_POLICE_RADIO_CONVERTIBLE; break;
#ifdef FIX_BUGS
case MI_YAKUZA:
color_pre_modifier = TOTAL_AUDIO_SAMPLES;
main_color = SFX_POLICE_RADIO_SILVER;
color_post_modifier = SFX_POLICE_RADIO_RED;
#endif
case MI_STINGER:
case MI_INFERNUS:
case MI_CHEETAH:
case MI_BANSHEE:
case MI_PHEONIX:
case MI_COMET:
case MI_DELUXO:
case MI_HOTRING:
sample = SFX_POLICE_RADIO_SPORTS_CAR;
break;
case MI_LINERUN:
sample = SFX_POLICE_RADIO_RIG;
break;
case MI_BANSHEE: sample = SFX_POLICE_RADIO_SPORTS_CAR; break;
#ifdef FIX_BUGS
case MI_MAFIA:
color_pre_modifier = color_post_modifier = TOTAL_AUDIO_SAMPLES;
main_color = SFX_POLICE_RADIO_GREY;
case MI_KURUMA:
#endif
case MI_PEREN:
case MI_REGINA:
sample = SFX_POLICE_RADIO_STATION_WAGON;
break;
case MI_SENTINEL:
case MI_FBICAR:
case MI_WASHING:
case MI_SENTXS:
case MI_ADMIRAL:
case MI_GLENDALE:
case MI_OCEANIC:
case MI_HERMES:
case MI_GREENWOO:
sample = SFX_POLICE_RADIO_SEDAN;
break;
case MI_RIO:
sample = SFX_POLICE_RADIO_CRUISER;
break;
case MI_FIRETRUCK:
sample = SFX_POLICE_RADIO_FIRE_TRUCK;
break;
case MI_TRASH:
sample = SFX_POLICE_RADIO_GARBAGE_TRUCK;
break;
case MI_STRETCH:
case MI_LOVEFIST:
sample = SFX_POLICE_RADIO_STRETCH;
break;
case MI_VOODOO:
sample = SFX_POLICE_RADIO_LOWRIDER;
break;
case MI_PONY:
case MI_MOONBEAM:
case MI_SECURICA:
case MI_RUMPO:
case MI_GANGBUR:
case MI_YANKEE:
case MI_TOPFUN:
case MI_BURRITO:
case MI_SPAND:
sample = SFX_POLICE_RADIO_VAN;
break;
case MI_MULE:
case MI_BARRACKS:
case MI_PACKER:
case MI_FBICAR: sample = SFX_POLICE_RADIO_SALOON; break;
case MI_PATRIOT:
case MI_BOBCAT: sample = SFX_POLICE_RADIO_PICKUP; break;
case MI_FIRETRUCK: sample = SFX_POLICE_RADIO_FIRE_TRUCK; break;
#ifdef FIX_BUGS
case MI_LINERUN:
case MI_FLATBED:
sample = SFX_POLICE_RADIO_TRUCK;
break;
case MI_AMBULAN:
sample = SFX_POLICE_RADIO_AMBULANCE;
break;
#endif
case MI_TRASH:
case MI_BARRACKS: sample = SFX_POLICE_RADIO_TRUCK; break;
case MI_STRETCH: sample = SFX_POLICE_RADIO_LIMO; break;
#ifdef FIX_BUGS
case MI_CORPSE:
#endif
case MI_MANANA:
case MI_ESPERANT: sample = SFX_POLICE_RADIO_2_DOOR; break;
#ifdef FIX_BUGS
case MI_HOODS:
color_pre_modifier = TOTAL_AUDIO_SAMPLES;
main_color = SFX_POLICE_RADIO_BLUE;
color_post_modifier = SFX_POLICE_RADIO_GREEN;
case MI_BELLYUP:
case MI_YANKEE:
case MI_TOYZ:
case MI_MRWONGS:
case MI_PANLANT:
#endif
case MI_PONY:
case MI_MULE:
case MI_MOONBEAM:
case MI_ENFORCER:
case MI_SECURICA:
case MI_RUMPO: sample = SFX_POLICE_RADIO_VAN; break;
case MI_AMBULAN: sample = SFX_POLICE_RADIO_AMBULANCE; break;
case MI_TAXI:
case MI_CABBIE:
case MI_ZEBRA:
case MI_KAUFMAN:
sample = SFX_POLICE_RADIO_TAXI;
break;
case MI_BOBCAT:
case MI_WALTON:
sample = SFX_POLICE_RADIO_PICKUP;
break;
case MI_BORGNINE: sample = SFX_POLICE_RADIO_TAXI; break;
case MI_MRWHOOP:
sample = SFX_POLICE_RADIO_ICE_CREAM_VAN;
break;
case MI_BFINJECT:
sample = SFX_POLICE_RADIO_BUGGY;
break;
case MI_HUNTER:
case MI_CHOPPER:
case MI_SEASPAR:
case MI_SPARROW:
case MI_MAVERICK:
case MI_VCNMAV:
case MI_POLMAV:
sample = SFX_POLICE_RADIO_HELICOPTER;
break;
case MI_POLICE:
sample = SFX_POLICE_RADIO_POLICE_CAR;
break;
case MI_ENFORCER:
sample = SFX_POLICE_RADIO_SWAT_VAN;
break;
case MI_PREDATOR:
case MI_SQUALO:
case MI_BFINJECT: sample = SFX_POLICE_RADIO_BUGGY; break;
case MI_POLICE: sample = SFX_POLICE_RADIO_POLICE_CAR; break;
#ifdef FIX_BUGS
case MI_SPEEDER:
sample = SFX_POLICE_RADIO_SPEEDBOAT;
break;
case MI_REEFER:
case MI_GHOST:
#endif
case MI_PREDATOR: sample = SFX_POLICE_RADIO_BOAT; break;
case MI_BUS:
sample = SFX_POLICE_RADIO_BUS;
break;
case MI_COACH: sample = SFX_POLICE_RADIO_BUS; break;
case MI_RHINO:
sample = SFX_POLICE_RADIO_TANK;
main_color = TOTAL_AUDIO_SAMPLES;
color_post_modifier = TOTAL_AUDIO_SAMPLES;
break;
case MI_ANGEL:
case MI_PCJ600:
case MI_FREEWAY:
case MI_SANCHEZ:
sample = SFX_POLICE_RADIO_MOTOBIKE;
break;
case MI_COACH:
sample = SFX_POLICE_RADIO_COACH;
break;
case MI_ROMERO:
sample = SFX_POLICE_RADIO_HEARSE;
break;
case MI_PIZZABOY:
case MI_FAGGIO:
sample = SFX_POLICE_RADIO_MOPED;
break;
case MI_DEADDODO:
case MI_SKIMMER:
sample = SFX_POLICE_RADIO_PLANE;
break;
case MI_REEFER:
case MI_TROPIC:
case MI_COASTG:
case MI_MARQUIS:
case MI_JETMAX:
sample = SFX_POLICE_RADIO_BOAT;
break;
case MI_CADDY:
sample = SFX_POLICE_RADIO_GOLF_CART;
break;
case MI_DINGHY:
sample = SFX_POLICE_RADIO_DINGHY;
case MI_TRAIN:
sample = SFX_POLICE_RADIO_SUBWAY_CAR;
main_color = TOTAL_AUDIO_SAMPLES;
color_post_modifier = TOTAL_AUDIO_SAMPLES;
break;
default:
//debug("\n *** UNKNOWN CAR MODEL INDEX %d *** ", veh->GetModelIndex());
debug("\n *** UNKNOWN CAR MODEL INDEX %d *** ", veh->GetModelIndex());
return;
}
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT);
if (m_anRandomTable[3] % 2)
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_LAST_SEEN);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_IN_A);
if (color_pre_modifier != NO_SAMPLE)
#ifdef FIX_BUGS
if (main_color == SFX_POLICE_RADIO_ORANGE && color_pre_modifier == TOTAL_AUDIO_SAMPLES)
#else
if (main_color == SFX_POLICE_RADIO_ORANGE)
#endif
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_IN_AN);
else
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_IN_A);
if (color_pre_modifier != TOTAL_AUDIO_SAMPLES)
m_sPoliceRadioQueue.Add(color_pre_modifier);
if (main_color != NO_SAMPLE)
if (main_color != TOTAL_AUDIO_SAMPLES)
m_sPoliceRadioQueue.Add(main_color);
if (color_post_modifier != NO_SAMPLE)
if (color_post_modifier != TOTAL_AUDIO_SAMPLES)
m_sPoliceRadioQueue.Add(color_post_modifier);
m_sPoliceRadioQueue.Add(sample);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(NO_SAMPLE);
m_sPoliceRadioQueue.Add(m_anRandomTable[0] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
}
}
} else if (POLICE_RADIO_QUEUE_MAX_SAMPLES - m_sPoliceRadioQueue.m_nSamplesInQueue > 4) {
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_ON_FOOT);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(NO_SAMPLE);
m_sPoliceRadioQueue.Add(m_anRandomTable[0] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
}
}
}
@ -666,8 +713,9 @@ cAudioManager::ReportCrime(eCrimeType type, const CVector &pos)
m_aCrimes[i].timer = 0;
return;
}
} else
} else {
lastCrime = i;
}
}
if (lastCrime < ARRAY_SIZE(m_aCrimes)) {
@ -703,34 +751,41 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
for (int i = 0; i < NUMAUDIOZONES; i++) {
if (strcmp(zone->name, ZoneSfx[i].m_aName) == 0) {
sample = ZoneSfx[i].m_nSampleIndex;
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_LAST_SEEN);
m_sPoliceRadioQueue.Add(SFX_IN);
rangeX = zone->maxx - zone->minx;
rangeY = zone->maxy - zone->miny;
halfX = 0.5f * rangeX + zone->minx;
halfY = 0.5f * rangeY + zone->miny;
quarterX = 0.25f * rangeX;
quarterY = 0.25f * rangeY;
if (vec.y > halfY + quarterY) {
if (sample == SFX_POLICE_RADIO_SHORESIDE_VALE &&
(strcmp(zone->name, SubZo2Label) == 0 ||
strcmp(zone->name, SubZo3Label) == 0)) {
m_sPoliceRadioQueue.Add(SFX_NORTH);
processed = TRUE;
} else if (vec.y < halfY - quarterY) {
m_sPoliceRadioQueue.Add(SFX_SOUTH);
processed = TRUE;
}
if (vec.x > halfX + quarterX)
m_sPoliceRadioQueue.Add(SFX_EAST);
else if (vec.x < halfX - quarterX)
m_sPoliceRadioQueue.Add(SFX_WEST);
else if (!processed)
m_sPoliceRadioQueue.Add(SFX_CENTRAL);
} else {
rangeX = zone->maxx - zone->minx;
rangeY = zone->maxy - zone->miny;
halfX = 0.5f * rangeX + zone->minx;
halfY = 0.5f * rangeY + zone->miny;
quarterX = 0.25f * rangeX;
quarterY = 0.25f * rangeY;
if (vec.y > halfY + quarterY) {
m_sPoliceRadioQueue.Add(SFX_NORTH);
processed = TRUE;
} else if (vec.y < halfY - quarterY) {
m_sPoliceRadioQueue.Add(SFX_SOUTH);
processed = TRUE;
}
if (vec.x > halfX + quarterX)
m_sPoliceRadioQueue.Add(SFX_EAST);
else if (vec.x < halfX - quarterX)
m_sPoliceRadioQueue.Add(SFX_WEST);
else if (!processed)
m_sPoliceRadioQueue.Add(SFX_CENTRAL);
}
m_sPoliceRadioQueue.Add(sample);
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(NO_SAMPLE);
m_sPoliceRadioQueue.Add(m_anRandomTable[2] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
gSpecialSuspectLastSeenReport = TRUE;
break;
}
@ -744,7 +799,7 @@ cAudioManager::AgeCrimes()
{
for (uint8 i = 0; i < ARRAY_SIZE(m_aCrimes); i++) {
if (m_aCrimes[i].type != CRIME_NONE) {
if (++m_aCrimes[i].timer > 1200) m_aCrimes[i].type = CRIME_NONE;
if (++m_aCrimes[i].timer > 1500) m_aCrimes[i].type = CRIME_NONE;
}
}
}

View File

@ -50,7 +50,7 @@ public:
}
return FALSE;
}
uint32 Remove()
{
if (m_nSamplesInQueue != 0) {
@ -59,9 +59,8 @@ public:
m_nRemoveOffset = (m_nRemoveOffset + 1) % POLICE_RADIO_QUEUE_MAX_SAMPLES;
return sample;
}
return NO_SAMPLE;
return TOTAL_AUDIO_SAMPLES;
}
};
VALIDATE_SIZE(cPoliceRadioQueue, 244);

File diff suppressed because it is too large Load Diff

View File

@ -511,13 +511,6 @@ protected:
uint32 m_nChannels;
const char* m_pPath;
bool m_bFileNotOpenedYet;
CMP3File() :
m_pMH(nil),
m_bOpened(false),
m_nRate(0),
m_bFileNotOpenedYet(false),
m_nChannels(0) {}
public:
CMP3File(const char *path) :
m_pMH(nil),
@ -625,69 +618,6 @@ public:
}
};
class CADFFile : public CMP3File
{
static ssize_t r_read(void* fh, void* buf, size_t size)
{
size_t bytesRead = fread(buf, 1, size, (FILE*)fh);
uint8* _buf = (uint8*)buf;
for (size_t i = 0; i < size; i++)
_buf[i] ^= 0x22;
return bytesRead;
}
static off_t r_seek(void* fh, off_t pos, int seekType)
{
fseek((FILE*)fh, pos, seekType);
return ftell((FILE*)fh);
}
static void r_close(void* fh)
{
fclose((FILE*)fh);
}
public:
CADFFile(const char* path)
{
m_pMH = mpg123_new(nil, nil);
if (m_pMH)
{
mpg123_param(m_pMH, MPG123_FLAGS, MPG123_SEEKBUFFER | MPG123_GAPLESS, 0.0);
m_bOpened = true;
m_bFileNotOpenedYet = true;
m_pPath = path;
// It's possible to move this to audioFileOpsThread(), but effect isn't noticable + probably not compatible with our current cutscene audio handling
#if 1
FileOpen();
#endif
}
}
void FileOpen()
{
if(!m_bFileNotOpenedYet) return;
long rate = 0;
int channels = 0;
int encoding = 0;
FILE *f = fopen(m_pPath, "rb");
m_bOpened = f && mpg123_replace_reader_handle(m_pMH, r_read, r_seek, r_close) == MPG123_OK
&& mpg123_open_handle(m_pMH, f) == MPG123_OK && mpg123_getformat(m_pMH, &rate, &channels, &encoding) == MPG123_OK;
m_nRate = rate;
m_nChannels = channels;
if(IsOpened()) {
mpg123_format_none(m_pMH);
mpg123_format(m_pMH, rate, channels, encoding);
}
m_bFileNotOpenedYet = false;
}
};
#endif
#define VAG_LINE_SIZE (0x10)
#define VAG_SAMPLES_IN_LINE (28)
@ -1278,8 +1208,6 @@ bool CStream::Open(const char* filename, uint32 overrideSampleRate)
#ifdef AUDIO_OAL_USE_MPG123
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".mp3")], ".mp3"))
m_pSoundFile = new CMP3File(m_aFilename);
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".adf")], ".adf"))
m_pSoundFile = new CADFFile(m_aFilename);
#endif
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".vb")], ".VB"))
m_pSoundFile = new CVbFile(m_aFilename, overrideSampleRate);
@ -1572,7 +1500,7 @@ int32 CStream::FillBuffers()
void CStream::ClearBuffers()
{
if ( !HasSource() ) return;
ALint buffersQueued[2];
alGetSourcei(m_pAlSources[0], AL_BUFFERS_QUEUED, &buffersQueued[0]);
alGetSourcei(m_pAlSources[1], AL_BUFFERS_QUEUED, &buffersQueued[1]);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -115,11 +115,6 @@ cSampleManager::SetMusicMasterVolume(uint8 nVolume)
{
}
void
cSampleManager::SetMP3BoostVolume(uint8 nVolume)
{
}
void
cSampleManager::SetEffectsFadeVolume(uint8 nVolume)
{
@ -131,7 +126,7 @@ cSampleManager::SetMusicFadeVolume(uint8 nVolume)
}
void
cSampleManager::SetMonoMode(bool8 nMode)
cSampleManager::SetMonoMode(uint8 nMode)
{
}
@ -156,22 +151,6 @@ cSampleManager::IsSampleBankLoaded(uint8 nBank)
return LOADING_STATUS_NOT_LOADED;
}
uint8
cSampleManager::IsMissionAudioLoaded(uint8 nSlot, uint32 nSample)
{
ASSERT(nSlot < MISSION_AUDIO_COUNT);
return LOADING_STATUS_NOT_LOADED;
}
bool8
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
{
ASSERT(nSlot < MISSION_AUDIO_COUNT);
return FALSE;
}
uint8
cSampleManager::IsPedCommentLoaded(uint32 nComment)
{
@ -322,7 +301,7 @@ cSampleManager::StopChannel(uint32 nChannel)
}
void
cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream)
cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
{
ASSERT( nStream < MAX_STREAMS );
}
@ -340,7 +319,7 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
}
bool8
cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
{
ASSERT( nStream < MAX_STREAMS );
@ -362,7 +341,7 @@ cSampleManager::GetStreamedFilePosition(uint8 nStream)
}
void
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, bool8 nEffectFlag, uint8 nStream)
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffectFlag, uint8 nStream)
{
ASSERT( nStream < MAX_STREAMS );
}
@ -390,14 +369,4 @@ cSampleManager::InitialiseSampleBanks(void)
return TRUE;
}
void
cSampleManager::SetStreamedFileLoopFlag(bool8 nLoopFlag, uint8 nChannel)
{
}
int8 cSampleManager::AutoDetect3DProviders()
{
return -1;
}
#endif

View File

@ -66,14 +66,14 @@ int usingEAX3=0;
ALCdevice *ALDevice = NULL;
ALCcontext *ALContext = NULL;
unsigned int _maxSamples;
float _fPrevEaxRatioDestination;
float _fPrevEaxRatioDestination;
bool _effectsSupported = false;
bool _usingEFX;
float _fEffectsLevel;
ALuint ALEffect = AL_EFFECT_NULL;
ALuint ALEffectSlot = AL_EFFECTSLOT_NULL;
struct
{
{
const char *id;
char name[256];
int sources;
@ -102,11 +102,6 @@ int32 nPedSlotSfx [MAX_PEDSFX];
int32 nPedSlotSfxAddr[MAX_PEDSFX];
uint8 nCurrentPedSlot;
#ifdef FIX_BUGS
uint32 gPlayerTalkSfx = UINT32_MAX;
void *gPlayerTalkData = 0;
#endif
CChannel aChannel[NUM_CHANNELS];
uint8 nChannelVolume[NUM_CHANNELS];
@ -131,7 +126,6 @@ char _mp3DirectoryPath[MAX_PATH];
CStream *aStream[MAX_STREAMS];
uint8 nStreamPan [MAX_STREAMS];
uint8 nStreamVolume[MAX_STREAMS];
bool8 nStreamLoopedFlag[MAX_STREAMS];
uint32 _CurMP3Index;
int32 _CurMP3Pos;
bool8 _bIsMp3Active;
@ -163,7 +157,7 @@ static void
add_providers()
{
SampleManager.SetNum3DProvidersAvailable(0);
static ALDeviceList DeviceList;
ALDeviceList *pDeviceList = &DeviceList;
@ -176,7 +170,7 @@ add_providers()
int i = pDeviceList->GetDefaultDevice();
{
if ( n < MAXPROVIDERS )
{
{
providers[n].id = pDeviceList->GetDeviceName(i);
strcpy(providers[n].name, "OPENAL SOFT");
providers[n].sources = pDeviceList->GetMaxNumSources(i);
@ -189,10 +183,10 @@ add_providers()
|| pDeviceList->IsExtensionSupported(i, ADEXT_EAX3)
|| pDeviceList->IsExtensionSupported(i, ADEXT_EAX4)
|| pDeviceList->IsExtensionSupported(i, ADEXT_EAX5) )
{
{
providers[n - 1].bSupportsFx = true;
if ( n < MAXPROVIDERS )
{
{
providers[n].id = pDeviceList->GetDeviceName(i);
strcpy(providers[n].name, "OPENAL SOFT EAX");
providers[n].sources = pDeviceList->GetMaxNumSources(i);
@ -202,7 +196,7 @@ add_providers()
}
if ( n < MAXPROVIDERS )
{
{
providers[n].id = pDeviceList->GetDeviceName(i);
strcpy(providers[n].name, "OPENAL SOFT EAX3");
providers[n].sources = pDeviceList->GetMaxNumSources(i);
@ -216,7 +210,7 @@ add_providers()
for(int j=n;j<MAXPROVIDERS;j++)
SampleManager.Set3DProviderName(j, NULL);
// devices are gone now
//defaultProvider = pDeviceList->GetDefaultDevice();
//if ( defaultProvider > MAXPROVIDERS )
@ -239,7 +233,7 @@ release_existing()
alAuxiliaryEffectSloti(ALEffectSlot, AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL);
}
}
DEV("release_existing()\n");
}
@ -290,7 +284,7 @@ set_new_provider(int index)
}
//SampleManager.SetSpeakerConfig(speaker_type);
if ( IsFXSupported() )
{
for ( int32 i = 0; i < MAXCHANNELS; i++ )
@ -306,7 +300,7 @@ set_new_provider(int index)
static bool8
IsThisTrackAt16KHz(uint32 track)
{
return track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE;
return track == STREAMED_SOUND_RADIO_CHAT;
}
cSampleManager::cSampleManager(void)
@ -371,31 +365,6 @@ int8 cSampleManager::SetCurrent3DProvider(uint8 nProvider)
return curprovider;
}
int8
cSampleManager::AutoDetect3DProviders()
{
if (!AudioManager.IsAudioInitialised())
return -1;
if (defaultProvider >= 0 && defaultProvider < m_nNumberOfProviders) {
if (set_new_provider(defaultProvider))
return defaultProvider;
}
for (uint32 i = 0; i < GetNum3DProvidersAvailable(); i++)
{
char* providername = Get3DProviderName(i);
if (!strcasecmp(providername, "OPENAL SOFT")) {
SetCurrent3DProvider(i);
if (GetCurrent3DProviderIndex() == i)
return i;
}
}
return -1;
}
static bool8
_ResolveLink(char const *path, char *out)
{
@ -871,7 +840,7 @@ cSampleManager::Initialise(void)
alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
if ( alcIsExtensionPresent(ALDevice, (ALCchar*)ALC_EXT_EFX_NAME) )
{
{
_effectsSupported = providers[index].bSupportsFx;
alGenAuxiliaryEffectSlots(1, &ALEffectSlot);
alGenEffects(1, &ALEffect);
@ -880,14 +849,14 @@ cSampleManager::Initialise(void)
alGenSources(MAX_STREAMS*2, ALStreamSources[0]);
for ( int32 i = 0; i < MAX_STREAMS; i++ )
{
alGenBuffers(NUM_STREAMBUFFERS, ALStreamBuffers[i]);
alGenBuffers(NUM_STREAMBUFFERS, ALStreamBuffers[i]);
alSourcei(ALStreamSources[i][0], AL_SOURCE_RELATIVE, AL_TRUE);
alSource3f(ALStreamSources[i][0], AL_POSITION, 0.0f, 0.0f, 0.0f);
alSourcef(ALStreamSources[i][0], AL_GAIN, 1.0f);
alSourcei(ALStreamSources[i][1], AL_SOURCE_RELATIVE, AL_TRUE);
alSource3f(ALStreamSources[i][1], AL_POSITION, 0.0f, 0.0f, 0.0f);
alSourcef(ALStreamSources[i][1], AL_GAIN, 1.0f);
}
}
CChannel::InitChannels();
@ -906,7 +875,7 @@ cSampleManager::Initialise(void)
aChannel[i].SetReverbMix(ALEffectSlot, 0.0f);
}
}
{
for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ )
nStreamLength[i] = 0;
@ -925,15 +894,14 @@ cSampleManager::Initialise(void)
for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ )
{
if ( aStream[0] && (
if(aStream[0] && (
#ifdef PS2_AUDIO_PATHS
aStream[0]->Open(PS2StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000) ||
#endif
aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000)) )
aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000)))
{
uint32 tatalms = aStream[0]->GetLengthMS();
aStream[0]->Close();
nStreamLength[i] = tatalms;
} else
USERERROR("Can't open '%s'\n", StreamedNameTable[i]);
@ -968,17 +936,7 @@ cSampleManager::Initialise(void)
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX);
ASSERT(nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] != 0);
#ifdef FIX_BUGS
// Find biggest player comment
uint32 nMaxPedSize = 0;
for (uint32 i = PLAYER_COMMENTS_START; i <= PLAYER_COMMENTS_END; i++)
nMaxPedSize = Max(nMaxPedSize, m_aSamples[i].nSize);
gPlayerTalkData = malloc(nMaxPedSize);
ASSERT(gPlayerTalkData != 0);
#endif
LoadSampleBank(SFX_BANK_0);
}
@ -1077,7 +1035,7 @@ cSampleManager::Terminate(void)
for ( int32 i = 0; i < NUM_CHANNELS; i++ )
aChannel[i].Term();
if ( IsFXSupported() )
{
if ( alIsEffect(ALEffect) )
@ -1095,7 +1053,7 @@ cSampleManager::Terminate(void)
ALEffectSlot = AL_EFFECTSLOT_NULL;
}
}
for ( int32 i = 0; i < MAX_STREAMS; i++ )
{
alDeleteBuffers(NUM_STREAMBUFFERS, ALStreamBuffers[i]);
@ -1119,7 +1077,7 @@ cSampleManager::Terminate(void)
_fPrevEaxRatioDestination = 0.0f;
_usingEFX = false;
_fEffectsLevel = 0.0f;
_DeleteMP3Entries();
CStream::Terminate();
@ -1138,14 +1096,6 @@ cSampleManager::Terminate(void)
free((void *)nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS]);
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = 0;
}
#ifdef FIX_BUGS
if ( gPlayerTalkData != 0 )
{
free(gPlayerTalkData);
gPlayerTalkData = 0;
}
#endif
_bSampmanInitialised = FALSE;
}
@ -1189,12 +1139,6 @@ cSampleManager::SetMusicMasterVolume(uint8 nVolume)
m_nMusicVolume = nVolume;
}
void
cSampleManager::SetMP3BoostVolume(uint8 nVolume)
{
m_nMP3BoostVolume = nVolume;
}
void
cSampleManager::SetEffectsFadeVolume(uint8 nVolume)
{
@ -1209,7 +1153,7 @@ cSampleManager::SetMusicFadeVolume(uint8 nVolume)
}
void
cSampleManager::SetMonoMode(bool8 nMode)
cSampleManager::SetMonoMode(uint8 nMode)
{
m_nMonoMode = nMode;
}
@ -1271,33 +1215,6 @@ cSampleManager::IsSampleBankLoaded(uint8 nBank)
return gBankLoaded[nBank];
}
#ifdef FIX_BUGS
uint8
cSampleManager::IsMissionAudioLoaded(uint8 nSlot, uint32 nSample)
{
ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
return nSample == gPlayerTalkSfx ? LOADING_STATUS_LOADED : LOADING_STATUS_NOT_LOADED;
}
bool8
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
{
ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
ASSERT(nSample < TOTAL_AUDIO_SAMPLES);
if (fseek(fpSampleDataHandle, m_aSamples[nSample].nOffset, SEEK_SET) != 0)
return FALSE;
if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
return FALSE;
gPlayerTalkSfx = nSample;
return TRUE;
}
#endif
uint8
cSampleManager::IsPedCommentLoaded(uint32 nComment)
{
@ -1358,6 +1275,14 @@ cSampleManager::LoadPedComment(uint32 nComment)
break;
}
case MUSICMODE_FRONTEND:
{
if ( MusicManager.GetNextTrack() == STREAMED_SOUND_GAME_COMPLETED )
return FALSE;
break;
}
}
}
@ -1366,7 +1291,7 @@ cSampleManager::LoadPedComment(uint32 nComment)
int samplesSize = m_aSamples[nComment].nSize / 2;
op_pcm_seek(fpSampleDataHandle, m_aSamples[nComment].nOffset / 2);
while (samplesSize > 0) {
int size = op_read(fpSampleDataHandle, (opus_int16 *)(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] + PED_BLOCKSIZE * nCurrentPedSlot + samplesRead),
int size = op_read(fpSampleDataHandle, (opus_int16 *)(nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] + PED_BLOCKSIZE * nCurrentPedSlot + samplesRead),
samplesSize, NULL);
if (size <= 0) {
return FALSE;
@ -1438,25 +1363,29 @@ bool8 cSampleManager::UpdateReverb(void)
if ( AudioManager.m_FrameCounter & 15 )
return FALSE;
float fRatio = 0.0f;
#ifdef AUDIO_REFLECTIONS
#define MIN_DIST 0.5f
#define CALCULATE_RATIO(value, maxDist, maxRatio) (value > MIN_DIST && value < maxDist ? value / maxDist * maxRatio : 0)
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_NORTH], 10.0f, 1/2.f);
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_SOUTH], 10.0f, 1/2.f);
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_WEST], 10.0f, 1/2.f);
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_EAST], 10.0f, 1/2.f);
fRatio += CALCULATE_RATIO((AudioManager.m_afReflectionsDistances[REFLECTION_NORTH] + AudioManager.m_afReflectionsDistances[REFLECTION_SOUTH]) / 2.f, 4.0f, 1/3.f);
fRatio += CALCULATE_RATIO((AudioManager.m_afReflectionsDistances[REFLECTION_WEST] + AudioManager.m_afReflectionsDistances[REFLECTION_EAST]) / 2.f, 4.0f, 1/3.f);
#undef CALCULATE_RATIO
#undef MIN_DIST
float y = AudioManager.m_afReflectionsDistances[REFLECTION_TOP] + AudioManager.m_afReflectionsDistances[REFLECTION_BOTTOM];
float x = AudioManager.m_afReflectionsDistances[REFLECTION_LEFT] + AudioManager.m_afReflectionsDistances[REFLECTION_RIGHT];
float z = AudioManager.m_afReflectionsDistances[REFLECTION_UP];
#else
float x = 0.0f;
float y = 0.0f;
float z = 0.0f;
#endif
fRatio = Clamp(fRatio, 0.0f, 0.6f);
float normy = norm(y, 5.0f, 40.0f);
float normx = norm(x, 5.0f, 40.0f);
float normz = norm(z, 5.0f, 40.0f);
#define ZR(v, a, b) (((v)==0)?(a):(b))
#define CALCRATIO(x,y,z,min,max,val) (ZR(y, ZR(x, ZR(z, min, max), min), ZR(x, ZR(z, min, max), ZR(z, min, val))))
float fRatio = CALCRATIO(normx, normy, normz, 0.3f, 0.5f, (normy+normx+normz)/3.0f);
#undef CALCRATIO
#undef ZR
fRatio = Clamp(fRatio, usingEAX3==1 ? 0.0f : 0.30f, 1.0f);
if ( fRatio == _fPrevEaxRatioDestination )
return FALSE;
@ -1467,7 +1396,6 @@ bool8 cSampleManager::UpdateReverb(void)
if ( usingEAX3 )
#endif
{
fRatio = Min(fRatio * 1.67f, 1.0f);
if ( EAX3ListenerInterpolate(&StartEAX3, &FinishEAX3, fRatio, &EAX3Params, false) )
{
EAX_SetAll(&EAX3Params);
@ -1482,17 +1410,16 @@ bool8 cSampleManager::UpdateReverb(void)
}
*/
_fEffectsLevel = fRatio * 0.75f;
_fEffectsLevel = 1.0f - fRatio * 0.5f;
}
}
else
{
if ( _usingEFX )
_fEffectsLevel = fRatio * 0.8f;
_fEffectsLevel = (1.0f - fRatio) * 0.4f;
else
_fEffectsLevel = fRatio * 0.22f;
_fEffectsLevel = (1.0f - fRatio) * 0.7f;
}
_fEffectsLevel = Min(_fEffectsLevel, 1.0f);
_fPrevEaxRatioDestination = fRatio;
@ -1532,15 +1459,6 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset;
}
#ifdef FIX_BUGS
else if ( nSfx >= PLAYER_COMMENTS_START && nSfx <= PLAYER_COMMENTS_END )
{
if ( !IsMissionAudioLoaded(MISSION_AUDIO_PLAYER_COMMENT, nSfx) )
return FALSE;
addr = (uintptr)gPlayerTalkData;
}
#endif
else
{
int32 i;
@ -1590,11 +1508,12 @@ cSampleManager::SetChannelEmittingVolume(uint32 nChannel, uint32 nVolume)
nChannelVolume[nChannel] = vol;
if (MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE ) {
if (MusicManager.GetCurrentTrack() == STREAMED_SOUND_CUTSCENE_FINALE)
nChannelVolume[nChannel] = 0;
else
nChannelVolume[nChannel] >>= 2;
// reduce channel volume when JB.MP3 or S4_BDBD.MP3 playing
if ( MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE
&& MusicManager.GetNextTrack() != STREAMED_SOUND_NEWS_INTRO
&& MusicManager.GetNextTrack() != STREAMED_SOUND_CUTSCENE_SAL4_BDBD )
{
nChannelVolume[nChannel] = vol / 4;
}
// no idea, does this one looks like a bug or it's SetChannelVolume ?
@ -1629,14 +1548,14 @@ cSampleManager::SetChannelVolume(uint32 nChannel, uint32 nVolume)
nChannelVolume[nChannel] = vol;
// increase the volume for JB.MP3 and S4_BDBD.MP3
if (MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE ) {
if (MusicManager.GetCurrentTrack() == STREAMED_SOUND_CUTSCENE_FINALE)
nChannelVolume[nChannel] = 0;
else
nChannelVolume[nChannel] >>= 2;
// reduce the volume for JB.MP3 and S4_BDBD.MP3
if ( MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE
&& MusicManager.GetNextTrack() != STREAMED_SOUND_NEWS_INTRO
&& MusicManager.GetNextTrack() != STREAMED_SOUND_CUTSCENE_SAL4_BDBD )
{
nChannelVolume[nChannel] = vol / 4;
}
aChannel[nChannel].SetVolume(m_nEffectsFadeVolume*vol*m_nEffectsVolume >> 14);
}
}
@ -1702,8 +1621,8 @@ cSampleManager::StopChannel(uint32 nChannel)
}
void
cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream)
{
cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
{
ASSERT( nStream < MAX_STREAMS );
if ( nFile < TOTAL_STREAMED_SOUNDS )
@ -1711,6 +1630,7 @@ cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream)
CStream *stream = aStream[nStream];
stream->Close();
#ifdef PS2_AUDIO_PATHS
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
#endif
@ -1749,12 +1669,12 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
}
bool8
cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
{
uint32 i = 0;
uint32 position = nPos;
char filename[MAX_PATH];
if ( nFile >= TOTAL_STREAMED_SOUNDS )
return FALSE;
@ -1764,7 +1684,7 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
{
do
{
// Just switched to MP3 player
// Switched to MP3 player just now
if ( !_bIsMp3Active && i == 0 )
{
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
@ -1774,15 +1694,12 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
// Try to continue from previous song, if already started
if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
nFile = 0;
CStream *stream = aStream[nStream];
#ifdef PS2_AUDIO_PATHS
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
#endif
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
if ( stream->Setup() ) {
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
nStreamLoopedFlag[nStream] = TRUE;
if (position != 0)
stream->SetPosMS(position);
@ -1795,7 +1712,6 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
return FALSE;
} else {
if (e->pLinkPath != NULL)
aStream[nStream]->Open(e->pLinkPath, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
else {
@ -1804,7 +1720,7 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
aStream[nStream]->Open(filename);
}
if (aStream[nStream]->Setup()) {
if (position != 0)
aStream[nStream]->SetPosMS(position);
@ -1831,7 +1747,6 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
{
nFile = 0;
_bIsMp3Active = FALSE;
CStream *stream = aStream[nStream];
#ifdef PS2_AUDIO_PATHS
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
@ -1839,8 +1754,6 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
if (stream->Setup()) {
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
nStreamLoopedFlag[nStream] = TRUE;
if (position != 0)
stream->SetPosMS(position);
@ -1858,7 +1771,6 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
else {
strcpy(filename, _mp3DirectoryPath);
strcat(filename, mp3->aFilename);
aStream[nStream]->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
}
@ -1879,18 +1791,13 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
position = 0;
nFile = 0;
}
strcpy(filename, StreamedNameTable[nFile]);
CStream *stream = aStream[nStream];
#ifdef PS2_AUDIO_PATHS
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
#endif
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
if ( stream->Setup() ) {
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
nStreamLoopedFlag[nStream] = TRUE;
if (position != 0)
stream->SetPosMS(position);
@ -1946,20 +1853,15 @@ cSampleManager::GetStreamedFilePosition(uint8 nStream)
}
void
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, bool8 nEffectFlag, uint8 nStream)
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffectFlag, uint8 nStream)
{
ASSERT( nStream < MAX_STREAMS );
float boostMult = 0.0f;
if ( nVolume > MAX_VOLUME )
nVolume = MAX_VOLUME;
if ( nPan > MAX_VOLUME )
nPan = MAX_VOLUME;
if ( MusicManager.GetRadioInCar() == USERTRACK && !MusicManager.CheckForMusicInterruptions() )
boostMult = m_nMP3BoostVolume / 64.f;
nStreamVolume[nStream] = nVolume;
nStreamPan [nStream] = nPan;
@ -1968,14 +1870,10 @@ cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, bool8 nEffect
if ( stream->IsOpened() )
{
if ( nEffectFlag ) {
if ( nStream == 1 || nStream == 2 )
stream->SetVolume(128*nVolume*m_nEffectsVolume >> 14);
else
stream->SetVolume(m_nEffectsFadeVolume*nVolume*m_nEffectsVolume >> 14);
}
if ( nEffectFlag )
stream->SetVolume(m_nEffectsFadeVolume*nVolume*m_nEffectsVolume >> 14);
else
stream->SetVolume((m_nMusicFadeVolume*nVolume*(uint32)(m_nMusicVolume * boostMult + m_nMusicVolume)) >> 14);
stream->SetVolume(m_nMusicFadeVolume*nVolume*m_nMusicVolume >> 14);
stream->SetPan(nPan);
}
@ -2055,7 +1953,7 @@ cSampleManager::InitialiseSampleBanks(void)
fclose(fpSampleDescHandle);
fpSampleDescHandle = NULL;
for ( uint32 i = 0; i < TOTAL_AUDIO_SAMPLES; i++ )
for ( int32 i = 0; i < TOTAL_AUDIO_SAMPLES; i++ )
{
#ifdef FIX_BUGS
if (nBank >= MAX_SFX_BANKS) break;
@ -2072,11 +1970,4 @@ cSampleManager::InitialiseSampleBanks(void)
return TRUE;
}
void
cSampleManager::SetStreamedFileLoopFlag(bool8 nLoopFlag, uint8 nChannel)
{
nStreamLoopedFlag[nChannel] = nLoopFlag;
}
#endif

View File

@ -16,10 +16,8 @@ enum eSound
SOUND_CAR_DOOR_OPEN_BACK_RIGHT,
SOUND_CAR_WINDSHIELD_CRACK,
SOUND_CAR_JUMP,
SOUND_CAR_JUMP_2,
SOUND_CAR_TYRE_POP,
SOUND_16,
SOUND_17,
SOUND_E,
SOUND_F,
SOUND_CAR_ENGINE_START,
SOUND_CAR_LIGHT_BREAK,
SOUND_CAR_HYDRAULIC_1,
@ -33,33 +31,29 @@ enum eSound
SOUND_CAR_TANK_TURRET_ROTATE,
SOUND_CAR_BOMB_TICK,
SOUND_PLANE_ON_GROUND,
SOUND_HELI_BLADE,
SOUND_32,
SOUND_STEP_START,
SOUND_STEP_END,
SOUND_FALL_LAND,
SOUND_FALL_COLLAPSE,
SOUND_FIGHT_37,
SOUND_FIGHT_38,
SOUND_FIGHT_39,
SOUND_FIGHT_40,
SOUND_FIGHT_41,
SOUND_FIGHT_42,
SOUND_FIGHT_43,
SOUND_FIGHT_44,
SOUND_FIGHT_45,
SOUND_FIGHT_46,
SOUND_FIGHT_47,
SOUND_FIGHT_48,
SOUND_49,
SOUND_FIGHT_PUNCH_33,
SOUND_FIGHT_KICK_34,
SOUND_FIGHT_HEADBUTT_35,
SOUND_FIGHT_PUNCH_36,
SOUND_FIGHT_PUNCH_37,
SOUND_FIGHT_CLOSE_PUNCH_38,
SOUND_FIGHT_PUNCH_39,
SOUND_FIGHT_PUNCH_OR_KICK_BELOW_40,
SOUND_FIGHT_PUNCH_41,
SOUND_FIGHT_PUNCH_FROM_BEHIND_42,
SOUND_FIGHT_KNEE_OR_KICK_43,
SOUND_FIGHT_KICK_44,
SOUND_2D,
SOUND_WEAPON_BAT_ATTACK,
SOUND_WEAPON_KNIFE_ATTACK,
SOUND_WEAPON_CHAINSAW_IDLE,
SOUND_WEAPON_CHAINSAW_ATTACK,
SOUND_WEAPON_CHAINSAW_MADECONTACT,
SOUND_WEAPON_SHOT_FIRED,
SOUND_WEAPON_RELOAD,
SOUND_WEAPON_AK47_BULLET_ECHO,
SOUND_WEAPON_UZI_BULLET_ECHO,
SOUND_WEAPON_M16_BULLET_ECHO,
SOUND_WEAPON_FLAMETHROWER_FIRE,
SOUND_WEAPON_SNIPER_SHOT_NO_ZOOM,
SOUND_WEAPON_ROCKET_SHOT_NO_ZOOM,
@ -72,8 +66,8 @@ enum eSound
SOUND_GARAGE_BOMB1_SET,
SOUND_GARAGE_BOMB2_SET,
SOUND_GARAGE_BOMB3_SET,
SOUND_70,
SOUND_71,
SOUND_40,
SOUND_41,
SOUND_GARAGE_VEHICLE_DECLINED,
SOUND_GARAGE_VEHICLE_ACCEPTED,
SOUND_GARAGE_DOOR_CLOSED,
@ -82,8 +76,8 @@ enum eSound
SOUND_PICKUP_WEAPON_BOUGHT,
SOUND_PICKUP_WEAPON,
SOUND_PICKUP_HEALTH,
SOUND_80,
SOUND_81,
SOUND_PICKUP_ERROR,
SOUND_4B,
SOUND_PICKUP_ADRENALINE,
SOUND_PICKUP_ARMOUR,
SOUND_PICKUP_BONUS,
@ -93,7 +87,7 @@ enum eSound
SOUND_PICKUP_PACMAN_PACKAGE,
SOUND_PICKUP_FLOAT_PACKAGE,
SOUND_BOMB_TIMED_ACTIVATED,
SOUND_91,
SOUND_55,
SOUND_BOMB_ONIGNITION_ACTIVATED,
SOUND_BOMB_TICK,
SOUND_RAMPAGE_START,
@ -110,16 +104,12 @@ enum eSound
SOUND_PED_HIT,
SOUND_PED_LAND,
SOUND_PED_BULLET_HIT,
SOUND_PED_BOMBER,
SOUND_PED_BURNING,
SOUND_PED_PLAYER_REACTTOCOP,
SOUND_PED_ARREST_FBI,
SOUND_PED_ARREST_SWAT,
SOUND_PED_ARREST_COP,
SOUND_PED_MIAMIVICE_EXITING_CAR,
SOUND_PED_COP_HELIPILOTPHRASE,
SOUND_PED_PULLOUTWEAPON,
SOUND_PED_HELI_PLAYER_FOUND,
SOUND_PED_VCPA_PLAYER_FOUND,
SOUND_PED_ON_FIRE,
SOUND_PED_AIMING,
SOUND_PED_HANDS_UP,
SOUND_PED_HANDS_COWER,
SOUND_PED_FLEE_SPRINT,
@ -127,40 +117,30 @@ enum eSound
SOUND_PED_MUGGING,
SOUND_PED_CAR_JACKED,
SOUND_PED_ROBBED,
SOUND_PED_ACCIDENTREACTION1,
SOUND_PED_INNOCENT,
SOUND_PED_PLAYER_AFTERSEX,
SOUND_PED_PLAYER_BEFORESEX,
SOUND_PED_COP_TARGETING, // also used for medics
SOUND_PED_COP_MANYCOPSAROUND, // also used for medics
SOUND_PED_GUNAIMEDAT2,
SOUND_PED_COP_ALONE, // also used for medics
SOUND_PED_GUNAIMEDAT3,
SOUND_PED_COP_ASK_FOR_ID,
SOUND_PED_COP_LITTLECOPSAROUND, // also used for medics
SOUND_PED_PLAYER_FARFROMCOPS, // also used for medics
SOUND_PED_TAXI_WAIT,
SOUND_PED_ATTACK,
SOUND_PED_DEFEND,
SOUND_PED_PURSUIT_ARMY,
SOUND_PED_PURSUIT_FBI,
SOUND_PED_PURSUIT_SWAT,
SOUND_PED_PURSUIT_COP,
SOUND_PED_HEALING,
SOUND_PED_7B,
SOUND_PED_LEAVE_VEHICLE,
SOUND_PED_EVADE,
SOUND_PED_FLEE_RUN,
SOUND_PED_CRASH_VEHICLE,
SOUND_PED_CRASH_CAR,
SOUND_PED_ANNOYED_DRIVER,
SOUND_PED_147,
SOUND_PED_SOLICIT,
SOUND_PED_JEER,
SOUND_PED_150,
SOUND_PED_EXTINGUISHING_FIRE,
SOUND_PED_WAIT_DOUBLEBACK,
SOUND_PED_CHAT_SEXY_FEMALE,
SOUND_PED_CHAT_SEXY_MALE,
SOUND_PED_CHAT_SEXY,
SOUND_PED_CHAT_EVENT,
SOUND_PED_PED_COLLISION,
SOUND_PED_CHAT,
SOUND_PED_BODYCAST_HIT,
SOUND_PED_TAXI_CALL,
SOUND_INJURED_PED_MALE_OUCH,
SOUND_INJURED_PED_FEMALE,
SOUND_INJURED_PED_MALE_PRISON,
SOUND_RACE_START_3,
SOUND_RACE_START_2,
SOUND_RACE_START_1,
@ -171,101 +151,143 @@ enum eSound
SOUND_CAR_PED_COLLISION,
SOUND_CLOCK_TICK,
SOUND_PART_MISSION_COMPLETE,
SOUND_FRONTEND_MENU_STARTING, // same sound as SOUND_HUD
// TODO(Miami): What are 170-175??
SOUND_FRONTEND_RADIO_TURN_OFF = 176, // those 2 are same sound
SOUND_FRONTEND_RADIO_TURN_ON,
SOUND_FRONTEND_HURRICANE, // yes, frontend
SOUND_HUD,
SOUND_180,
SOUND_181,
SOUND_182,
SOUND_LIGHTNING,
SOUND_BULLETTRACE_1,
SOUND_BULLETTRACE_2,
SOUND_186, // makes same sound as 40
SOUND_187, // makes same sound as 46
SOUND_MELEE_ATTACK_START,
SOUND_SKATING,
SOUND_WEAPON_MINIGUN_ATTACK,
SOUND_WEAPON_MINIGUN_2,
SOUND_WEAPON_MINIGUN_3,
SOUND_AMMUNATION_IMRAN_ARM_BOMB,
SOUND_RADIO_CHANGE,
SOUND_FRONTEND_HIGHLIGHT_OPTION,
SOUND_FRONTEND_ENTER_OR_ADJUST,
SOUND_FRONTEND_BACK,
SOUND_FRONTEND_FAIL,
SOUND_FRONTEND_MENU_STARTING,
SOUND_FRONTEND_MENU_NEW_PAGE,
SOUND_FRONTEND_MENU_NAVIGATION,
SOUND_FRONTEND_MENU_SETTING_CHANGE,
SOUND_FRONTEND_MENU_BACK,
SOUND_FRONTEND_STEREO,
SOUND_FRONTEND_MONO,
SOUND_FRONTEND_AUDIO_TEST,
SOUND_INJURED_PED_MALE_OUCH,
SOUND_INJURED_PED_FEMALE,
SOUND_SHIRT_WIND_FLAP,
SOUND_SET_203,
SOUND_TOTAL_SOUNDS = 204,
SOUND_NO_SOUND = 205,
SOUND_FRONTEND_FAIL,
SOUND_FRONTEND_RADIO_TURN_OFF,
SOUND_FRONTEND_RADIO_CHANGE,
SOUND_HUD,
SOUND_AMMUNATION_WELCOME_1,
SOUND_AMMUNATION_WELCOME_2,
SOUND_AMMUNATION_WELCOME_3,
SOUND_LIGHTNING,
SOUND_A5,
SOUND_TOTAL_SOUNDS,
SOUND_NO_SOUND,
};
enum eScriptSounds {
SCRIPT_SOUND_BANK_ALARM_LOOP = 0,
SCRIPT_SOUND_0 = 0,
SCRIPT_SOUND_1,
SCRIPT_SOUND_2,
SCRIPT_SOUND_3,
SCRIPT_SOUND_PARTY_1_LOOP_S,
SCRIPT_SOUND_PARTY_1_LOOP_L,
SCRIPT_SOUND_PARTY_2_LOOP_S,
SCRIPT_SOUND_PARTY_2_LOOP_L,
SCRIPT_SOUND_PARTY_3_LOOP_S,
SCRIPT_SOUND_PARTY_3_LOOP_L,
SCRIPT_SOUND_PARTY_4_LOOP_S,
SCRIPT_SOUND_PARTY_4_LOOP_L,
SCRIPT_SOUND_PARTY_5_LOOP_S,
SCRIPT_SOUND_PARTY_5_LOOP_L,
SCRIPT_SOUND_PARTY_6_LOOP_S,
SCRIPT_SOUND_PARTY_6_LOOP_L,
SCRIPT_SOUND_PARTY_7_LOOP_S,
SCRIPT_SOUND_PARTY_7_LOOP_L,
SCRIPT_SOUND_PARTY_8_LOOP_S,
SCRIPT_SOUND_PARTY_8_LOOP_L,
SCRIPT_SOUND_PARTY_9_LOOP_S,
SCRIPT_SOUND_PARTY_9_LOOP_L,
SCRIPT_SOUND_PARTY_10_LOOP_S,
SCRIPT_SOUND_PARTY_10_LOOP_L,
SCRIPT_SOUND_PARTY_11_LOOP_S,
SCRIPT_SOUND_PARTY_11_LOOP_L,
SCRIPT_SOUND_PARTY_12_LOOP_S,
SCRIPT_SOUND_PARTY_12_LOOP_L,
SCRIPT_SOUND_PARTY_13_LOOP_S,
SCRIPT_SOUND_PARTY_13_LOOP_L,
SCRIPT_SOUND_STRIP_CLUB_LOOP_1_S,
SCRIPT_SOUND_STRIP_CLUB_LOOP_1_L,
SCRIPT_SOUND_STRIP_CLUB_LOOP_2_S,
SCRIPT_SOUND_STRIP_CLUB_LOOP_2_L,
SCRIPT_SOUND_WORK_SHOP_LOOP_S,
SCRIPT_SOUND_WORK_SHOP_LOOP_L,
SCRIPT_SOUND_SAWMILL_LOOP_S,
SCRIPT_SOUND_SAWMILL_LOOP_L,
SCRIPT_SOUND_DOG_FOOD_FACTORY_S,
SCRIPT_SOUND_DOG_FOOD_FACTORY_L,
SCRIPT_SOUND_LAUNDERETTE_LOOP_S,
SCRIPT_SOUND_LAUNDERETTE_LOOP_L,
SCRIPT_SOUND_CHINATOWN_RESTAURANT_S,
SCRIPT_SOUND_CHINATOWN_RESTAURANT_L,
SCRIPT_SOUND_CIPRIANI_RESAURANT_S,
SCRIPT_SOUND_CIPRIANI_RESAURANT_L,
SCRIPT_SOUND_46_S,
SCRIPT_SOUND_47_L,
SCRIPT_SOUND_MARCO_BISTRO_S,
SCRIPT_SOUND_MARCO_BISTRO_L,
SCRIPT_SOUND_AIRPORT_LOOP_S,
SCRIPT_SOUND_AIRPORT_LOOP_L,
SCRIPT_SOUND_SHOP_LOOP_S,
SCRIPT_SOUND_SHOP_LOOP_L,
SCRIPT_SOUND_CINEMA_LOOP_S,
SCRIPT_SOUND_CINEMA_LOOP_L,
SCRIPT_SOUND_DOCKS_LOOP_S,
SCRIPT_SOUND_DOCKS_LOOP_L,
SCRIPT_SOUND_HOME_LOOP_S,
SCRIPT_SOUND_HOME_LOOP_L,
SCRIPT_SOUND_FRANKIE_PIANO,
SCRIPT_SOUND_PARTY_1_LOOP,
SCRIPT_SOUND_PORN_CINEMA_1_S,
SCRIPT_SOUND_PORN_CINEMA_1_L,
SCRIPT_SOUND_PORN_CINEMA_2_S,
SCRIPT_SOUND_PORN_CINEMA_2_L,
SCRIPT_SOUND_PORN_CINEMA_3_S,
SCRIPT_SOUND_PORN_CINEMA_3_L,
SCRIPT_SOUND_BANK_ALARM_LOOP_S,
SCRIPT_SOUND_BANK_ALARM_LOOP_L,
SCRIPT_SOUND_POLICE_BALL_LOOP_S,
SCRIPT_SOUND_POLICE_BALL_LOOP_L,
SCRIPT_SOUND_RAVE_LOOP_INDUSTRIAL_S,
SCRIPT_SOUND_RAVE_LOOP_INDUSTRIAL_L,
SCRIPT_SOUND_74,
SCRIPT_SOUND_75,
SCRIPT_SOUND_POLICE_CELL_BEATING_LOOP_S,
SCRIPT_SOUND_POLICE_CELL_BEATING_LOOP_L,
SCRIPT_SOUND_INJURED_PED_MALE_OUCH_S,
SCRIPT_SOUND_INJURED_PED_MALE_OUCH_L,
SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_S,
SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_L,
SCRIPT_SOUND_EVIDENCE_PICKUP,
SCRIPT_SOUND_UNLOAD_GOLD,
SCRIPT_SOUND_RAVE_1_LOOP_S,
SCRIPT_SOUND_RAVE_1_LOOP_L,
SCRIPT_SOUND_RAVE_2_LOOP_S,
SCRIPT_SOUND_RAVE_2_LOOP_L,
SCRIPT_SOUND_RAVE_3_LOOP_S,
SCRIPT_SOUND_RAVE_3_LOOP_L,
SCRIPT_SOUND_MISTY_SEX_S,
SCRIPT_SOUND_MISTY_SEX_L,
SCRIPT_SOUND_GATE_START_CLUNK,
SCRIPT_SOUND_GATE_STOP_CLUNK,
SCRIPT_SOUND_PART_MISSION_COMPLETE,
SCRIPT_SOUND_POLICE_CELL_DOOR_SLIDING_LOOP,
SCRIPT_SOUND_POLICE_CELL_DOOR_CLUNK,
SCRIPT_SOUND_GARAGE_DOOR_SLIDING_LOOP,
SCRIPT_SOUND_GARAGE_DOOR_CLUNK,
SCRIPT_SOUND_SNORING_LOOP,
SCRIPT_SOUND_CHUNKY_RUN_SHOUT,
SCRIPT_SOUND_SECURITY_GUARD_AWAY_SHOUT,
SCRIPT_SOUND_RACE_START_3,
SCRIPT_SOUND_RACE_START_2,
SCRIPT_SOUND_RACE_START_1,
SCRIPT_SOUND_RACE_START_GO,
SCRIPT_SOUND_SHOOTING_RANGE_TARGET_MOVING_LOOP,
SCRIPT_SOUND_SHOOTING_RANGE_TARGET_HIT,
SCRIPT_SOUND_AMMUNATION_BUY_WEAPON,
SCRIPT_SOUND_AMMUNATION_BUY_WEAPON_DENIED,
SCRIPT_SOUND_WMYCW_TICKET_SPEECH,
SCRIPT_SOUND_IMRAN_ARM_BOMB,
SCRIPT_SOUND_ANDY_SNIPER_SHOT,
SCRIPT_SOUND_WILLIE_CARD_SWIPE,
SCRIPT_SOUND_MALE_AMBULANCE_OUCH,
SCRIPT_SOUND_FEMALE_AMBULANCE_OUCH,
SCRIPT_SOUND_BUILDING_BAR_1,
SCRIPT_SOUND_BUILDING_BAR_2,
SCRIPT_SOUND_BUILDING_BAR_3,
SCRIPT_SOUND_BUILDING_BAR_4,
SCRIPT_SOUND_BUILDING_BIKER_BAR,
SCRIPT_SOUND_BUILDING_CHURCH,
SCRIPT_SOUND_BUILDING_CLUB,
SCRIPT_SOUND_BUILDING_CUBA_1,
SCRIPT_SOUND_BUILDING_CUBA_2,
SCRIPT_SOUND_BUILDING_VOODOO,
SCRIPT_SOUND_BUILDING_MUSIC_SHOP,
SCRIPT_SOUND_BUILDING_STRIPCLUB_1,
SCRIPT_SOUND_BUILDING_STRIPCLUB_2,
SCRIPT_SOUND_BUILDING_SUPERSWEEP,
SCRIPT_SOUND_SEAPLANE_LOW_FUEL,
SCRIPT_SOUND_NEW_BUILDING_BAR_1,
SCRIPT_SOUND_NEW_BUILDING_BAR_2,
SCRIPT_SOUND_NEW_BUILDING_BAR_3,
SCRIPT_SOUND_NEW_BUILDING_BAR_4,
SCRIPT_SOUND_NEW_BUILDING_MALIBU_1,
SCRIPT_SOUND_NEW_BUILDING_MALIBU_2,
SCRIPT_SOUND_NEW_BUILDING_MALIBU_3,
SCRIPT_SOUND_NEW_BUILDING_STRIP_1,
SCRIPT_SOUND_NEW_BUILDING_STRIP_2,
SCRIPT_SOUND_NEW_BUILDING_STRIP_3,
SCRIPT_SOUND_NEW_BUILDING_CHURCH,
SCRIPT_SOUND_NEW_BUILDING_FAN_1,
SCRIPT_SOUND_NEW_BUILDING_FAN_2,
SCRIPT_SOUND_NEW_BUILDING_INSECT_1,
SCRIPT_SOUND_NEW_BUILDING_INSECT_2,
SCRIPT_SOUND_NEW_WATERFALL,
SCRIPT_SOUND_SWAT_PED_SHOUT,
SCRIPT_SOUND_PRETEND_FIRE_LOOP,
SCRIPT_SOUND_AMMUNATION_CHAT_1,
SCRIPT_SOUND_AMMUNATION_CHAT_2,
SCRIPT_SOUND_AMMUNATION_CHAT_3,
SCRIPT_SOUND_BULLET_HIT_GROUND_1,
SCRIPT_SOUND_BULLET_HIT_GROUND_2,
SCRIPT_SOUND_BULLET_HIT_GROUND_3,
SCRIPT_SOUND_BULLET_HIT_WATER, // no sound
SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_1,
SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_2,
SCRIPT_SOUND_PAYPHONE_RINGING,
SCRIPT_SOUND_113,
SCRIPT_SOUND_GLASS_BREAK_L,
SCRIPT_SOUND_GLASS_BREAK_S,
SCRIPT_SOUND_GLASS_CRACK,
@ -274,7 +296,6 @@ enum eScriptSounds {
SCRIPT_SOUND_BOX_DESTROYED_2,
SCRIPT_SOUND_METAL_COLLISION,
SCRIPT_SOUND_TIRE_COLLISION,
SCRIPT_SOUND_HIT_BALL,
SCRIPT_SOUND_GUNSHELL_DROP,
SCRIPT_SOUND_GUNSHELL_DROP_SOFT,
SCRIPT_SOUND_TOTAL,

View File

@ -20,25 +20,3 @@ CBuilding::ReplaceWithNewModel(int32 id)
if(m_level == LEVEL_GENERIC || m_level == CGame::currLevel)
CStreaming::RequestModel(id, STREAMFLAGS_DONT_REMOVE);
}
bool
IsBuildingPointerValid(CBuilding* pBuilding)
{
if (!pBuilding)
return false;
if (pBuilding->GetIsATreadable()) {
int index = CPools::GetTreadablePool()->GetJustIndex_NoFreeAssert((CTreadable*)pBuilding);
#ifdef FIX_BUGS
return index >= 0 && index < CPools::GetTreadablePool()->GetSize();
#else
return index >= 0 && index <= CPools::GetTreadablePool()->GetSize();
#endif
} else {
int index = CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert(pBuilding);
#ifdef FIX_BUGS
return index >= 0 && index < CPools::GetBuildingPool()->GetSize();
#else
return index >= 0 && index <= CPools::GetBuildingPool()->GetSize();
#endif
}
}

View File

@ -17,4 +17,5 @@ public:
virtual bool GetIsATreadable(void) { return false; }
};
bool IsBuildingPointerValid(CBuilding*);
VALIDATE_SIZE(CBuilding, 0x64);

View File

@ -8,5 +8,10 @@ public:
static void *operator new(size_t) throw();
static void operator delete(void*, size_t) throw();
int16 m_nodeIndices[2][12]; // first car, then ped
bool GetIsATreadable(void) { return true; }
};
VALIDATE_SIZE(CTreadable, 0x94);

View File

@ -2,21 +2,15 @@
#include "SurfaceTable.h"
struct CBox
struct CColBox
{
CVector min;
CVector max;
CVector GetSize(void) { return max - min; }
void Set(const CVector &min, const CVector &max) { this->min = min; this->max = max; }
};
struct CColBox : public CBox
{
uint8 surface;
uint8 piece;
void Set(const CVector &min, const CVector &max, uint8 surf, uint8 piece);
using CBox::Set;
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);
};

View File

@ -1,9 +1,7 @@
#include "common.h"
#include "ColModel.h"
#include "Collision.h"
#include "Game.h"
#include "MemoryHeap.h"
#include "Pools.h"
CColModel::CColModel(void)
{
@ -17,27 +15,14 @@ CColModel::CColModel(void)
vertices = nil;
triangles = nil;
trianglePlanes = nil;
level = LEVEL_GENERIC; // generic col slot
level = CGame::currLevel;
ownsCollisionVolumes = true;
}
CColModel::~CColModel(void)
{
RemoveCollisionVolumes();
}
void*
CColModel::operator new(size_t) throw()
{
CColModel* node = CPools::GetColModelPool()->New();
assert(node);
return node;
}
void
CColModel::operator delete(void *p, size_t) throw()
{
CPools::GetColModelPool()->Delete((CColModel*)p);
RemoveTrianglePlanes();
}
void
@ -49,7 +34,6 @@ CColModel::RemoveCollisionVolumes(void)
RwFree(boxes);
RwFree(vertices);
RwFree(triangles);
CCollision::RemoveTrianglePlanes(this);
}
numSpheres = 0;
numLines = 0;

View File

@ -9,14 +9,14 @@
struct CColModel
{
CSphere boundingSphere;
CBox boundingBox;
CColSphere boundingSphere;
CColBox boundingBox;
int16 numSpheres;
int16 numLines;
int16 numBoxes;
int16 numTriangles;
int8 numLines;
uint8 level; // colstore slot but probably still named level
bool ownsCollisionVolumes;
int32 level;
bool ownsCollisionVolumes; // missing on PS2
CColSphere *spheres;
CColLine *lines;
CColBox *boxes;
@ -33,7 +33,5 @@ struct CColModel
void SetLinkPtr(CLink<CColModel*>*);
void GetTrianglePoint(CVector &v, int i) const;
void *operator new(size_t) throw();
void operator delete(void *p, size_t) throw();
CColModel& operator=(const CColModel& other);
};

View File

@ -1,6 +1,5 @@
#include "common.h"
#include "ColSphere.h"
#include "General.h"
void
CColSphere::Set(float radius, const CVector &center, uint8 surf, uint8 piece)
@ -9,19 +8,4 @@ CColSphere::Set(float radius, const CVector &center, uint8 surf, uint8 piece)
this->center = center;
this->surface = surf;
this->piece = piece;
}
bool
CColSphere::IntersectRay(CVector const& from, CVector const& dir, CVector &entry, CVector &exit)
{
CVector distToCenter = from - center;
float distToTouchSqr = distToCenter.MagnitudeSqr() - sq(radius);
float root1, root2;
if (!CGeneral::SolveQuadratic(1.0f, DotProduct(distToCenter, dir) * 2.f, distToTouchSqr, root1, root2))
return false;
entry = from + dir * root1;
exit = from + dir * root2;
return true;
}

View File

@ -2,20 +2,12 @@
#include "SurfaceTable.h"
struct CSphere
struct CColSphere
{
// NB: this has to be compatible with a CVuVector
CVector center;
float radius;
void Set(float radius, const CVector &center) { this->center = center; this->radius = radius; }
};
struct CColSphere : public CSphere
{
uint8 surface;
uint8 piece;
void Set(float radius, const CVector &center, uint8 surf, uint8 piece);
bool IntersectRay(CVector const &from, CVector const &dir, CVector &entry, CVector &exit);
using CSphere::Set;
void Set(float radius, const CVector &center, uint8 surf = SURFACE_DEFAULT, uint8 piece = 0);
};

Some files were not shown because too many files have changed in this diff Show More