Compare commits
532 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 33abd1b4e7 | |||
| 6a12033942 | |||
| 232a45c9ac | |||
| 29383a6a11 | |||
| 9bd80324d1 | |||
| 27ddca26c2 | |||
| b67a087448 | |||
| 6df0cb1ddb | |||
| 8cbdf27228 | |||
| 145af411ab | |||
| 07a1339704 | |||
| 0df6fbb30a | |||
| a1c241af37 | |||
| c5c887cc11 | |||
| 453f8c05a4 | |||
| 47c23ba917 | |||
| a404689e50 | |||
| c6f9bbce8e | |||
| 07778c81bc | |||
| 5b0c8fb3e2 | |||
| 764762f236 | |||
| eeacbfeb6a | |||
| 2be8fcfa64 | |||
| e865e65955 | |||
| 2a69f34f93 | |||
| 6d1d60f699 | |||
| cc9398df14 | |||
| 9187873396 | |||
| d750a1101b | |||
| e1286fcb04 | |||
| 800ab92960 | |||
| 5f7de20cde | |||
| b89dd7f0e3 | |||
| 381d0b4e3e | |||
| 3cbf84f98b | |||
| 5cb1c8580d | |||
| e500b77cd3 | |||
| 3779a39f1f | |||
| e0be6beb18 | |||
| 6b958b957e | |||
| fe1e1ec8c7 | |||
| 811729ab41 | |||
| 071dbc3086 | |||
| 6ad85725d9 | |||
| 9c40489589 | |||
| aed313d81c | |||
| 2d41405e29 | |||
| 32fe837dca | |||
| 5ceb3aedeb | |||
| 136b25133d | |||
| c707f92d0a | |||
| e2014cfd92 | |||
| 2c4a3b5f5e | |||
| 7374fbf54c | |||
| 0c55f331cf | |||
| 2633295ada | |||
| dc28d52d08 | |||
| d7e764d519 | |||
| f4894952fc | |||
| 2f92ccecb1 | |||
| 8e2ed40f66 | |||
| 9ba2f7d43c | |||
| 495a447c8a | |||
| 25075decb2 | |||
| 1b178a55d7 | |||
| e30e1ccccd | |||
| 39d2c427e5 | |||
| ba859dc3b5 | |||
| 4141caa4d6 | |||
| ec22576e49 | |||
| 9a1b826021 | |||
| cb35f78511 | |||
| 68c37d2d88 | |||
| 80dc23621e | |||
| b289bb4edb | |||
| 2c79080e1b | |||
| e042ba6f24 | |||
| 4b7dc08bf5 | |||
| c851d9a6ba | |||
| c5af250959 | |||
| 26a9ac91ee | |||
| 729ef37040 | |||
| 7b9d8c5a1f | |||
| 68db861c45 | |||
| 74f00c3c63 | |||
| 9cc1201892 | |||
| e6b1a0691b | |||
| 0c4ab5b609 | |||
| 2672504e8a | |||
| a7e86e0510 | |||
| 827f0ffbb6 | |||
| 883e8390c9 | |||
| c69edce800 | |||
| 747705d430 | |||
| 621f941ff7 | |||
| 1cfd4f741e | |||
| 0338d4c393 | |||
| a481b900b9 | |||
| bf035b8167 | |||
| e8dcc8432d | |||
| 3f3e258d77 | |||
| b77d93ba4a | |||
| 04126cd18a | |||
| 92679555b9 | |||
| 7adc85995f | |||
| 98003d0d41 | |||
| 029e315f0a | |||
| f82c3c8ea7 | |||
| fbb42085bd | |||
| c4f5cbce5e | |||
| c26a57fb9f | |||
| ad2ccdb44a | |||
| ec7d702185 | |||
| 6dc8c5bd92 | |||
| 0461a36a4e | |||
| 9e374491c5 | |||
| c234cb4663 | |||
| c7d3b88cb7 | |||
| bf4b39781b | |||
| d83b8cf940 | |||
| 1619d2395e | |||
| b69222e017 | |||
| d86637daea | |||
| dc729009ac | |||
| cc13e31264 | |||
| 7a034142c9 | |||
| cb7f18f268 | |||
| 0a23afebb7 | |||
| ec5a07b049 | |||
| 026a2b3f1f | |||
| 3377709c4b | |||
| 17fca82401 | |||
| 81aece7117 | |||
| 6f0f9d7d69 | |||
| 91d958bf27 | |||
| bef07b6353 | |||
| 55d30a11ec | |||
| 776d46aacb | |||
| 6a2ce20313 | |||
| 71d1b46417 | |||
| 4981fe3091 | |||
| d781db6c0f | |||
| 7a1ff3b2ad | |||
| 62425b5866 | |||
| 5d5e0f62e8 | |||
| 10cc444482 | |||
| dd790b00e5 | |||
| 138abb91f6 | |||
| 1c5a864598 | |||
| eaebaa6db3 | |||
| 3e9c983f5c | |||
| 73e112a217 | |||
| 879761af2c | |||
| c7243aa2e9 | |||
| 883d8172b0 | |||
| 636f67ca3f | |||
| d4ba7c387b | |||
| 831737ecc8 | |||
| ebd980bf14 | |||
| 8a5afd0db2 | |||
| 940d6bf6d3 | |||
| a3ae267e83 | |||
| 7e7a2b74cd | |||
| e671fe682d | |||
| 1254c1202a | |||
| 74867af2e7 | |||
| 3ebc475494 | |||
| 27df328ec2 | |||
| 4351198bf5 | |||
| 7c3457257b | |||
| ba23408007 | |||
| eaaba8646b | |||
| 0910188058 | |||
| 3cc9eb1c1c | |||
| db1c7de125 | |||
| 7a351f18ba | |||
| 776e8ff2ee | |||
| 3aac4ea62a | |||
| 1558788df1 | |||
| 29d47da61e | |||
| e014bb5359 | |||
| fb03ee45b5 | |||
| 60bb16d26c | |||
| b5bc3a9000 | |||
| f34365dfc0 | |||
| 1fa0116f5f | |||
| c7821635fd | |||
| 0c3ee871f4 | |||
| 714cd47db9 | |||
| 008f8a1e19 | |||
| 499b16678f | |||
| 0682cdedbd | |||
| 1471c82a20 | |||
| 19dd95a1cb | |||
| 3596897961 | |||
| 288c3dfc8f | |||
| bd70540b53 | |||
| 247974afd3 | |||
| fdb6428c6b | |||
| 4e79d53661 | |||
| 8f54093de1 | |||
| 519218572a | |||
| f6f8a24335 | |||
| 62b8f0f553 | |||
| 49b3bf5f2e | |||
| f6910d35f7 | |||
| 82322293fe | |||
| 8dabde94bf | |||
| a2afe54f5a | |||
| 037c332158 | |||
| 73612215d8 | |||
| d37dc246eb | |||
| 396326014d | |||
| 184f12a214 | |||
| 0f46c8904d | |||
| 21278356ec | |||
| e38467ef3a | |||
| 78f4e8fdca | |||
| 08f0f275af | |||
| 826be7472f | |||
| 3b0c958600 | |||
| a2c2a364a4 | |||
| 8fb3a3ff23 | |||
| c06b971b65 | |||
| 031df36935 | |||
| 6db96753d2 | |||
| 9b9ffc4b13 | |||
| 410eb19ce6 | |||
| 3584dac5c0 | |||
| f6c8225dac | |||
| 4f7793a423 | |||
| ef28d12d85 | |||
| 3f60034c39 | |||
| 2343e69ce5 | |||
| 251b2aaeb8 | |||
| 48926fcade | |||
| bb47f3a8e4 | |||
| 3677749935 | |||
| 75a20216d9 | |||
| 07a5cc6544 | |||
| 01d4312251 | |||
| 2c29ab5542 | |||
| c3c2a4269d | |||
| a0c5d75f83 | |||
| d69b73eaa8 | |||
| 4270180b8b | |||
| 2d5f087041 | |||
| 9fc0ec0bf4 | |||
| 3f8e258055 | |||
| fa2eb24ba2 | |||
| 433baf5f3c | |||
| 70c1f0640d | |||
| 9b1db9709b | |||
| edb50b66a0 | |||
| 0862c79b21 | |||
| 2fea28f194 | |||
| 42d9d6abc8 | |||
| 46e63da4d8 | |||
| d7bd0be53e | |||
| 3f80e92f2c | |||
| 0ae6d1fecf | |||
| d898abf63d | |||
| ba4028b9dd | |||
| fb64bb314c | |||
| bc5f3abd3c | |||
| 1934bedde2 | |||
| cea8ad4b85 | |||
| 129d7333be | |||
| 9647901ba0 | |||
| c21e5f5e79 | |||
| 785bd8ebcc | |||
| a4c5b87b90 | |||
| fef87b9219 | |||
| 4f591aa87a | |||
| d6544933aa | |||
| a01a9e5943 | |||
| ed4edb93e7 | |||
| 8869f4ca4d | |||
| b137dba5db | |||
| ed2b985245 | |||
| d7e38b378e | |||
| ce7f166ba3 | |||
| 1ab96abb91 | |||
| 0ad1426950 | |||
| c1f0fe1da6 | |||
| a202e67349 | |||
| e79e8b30e0 | |||
| 1bee2caf5c | |||
| 9361aeb8eb | |||
| 8cbae5d62a | |||
| d68ec362dd | |||
| e9d58b5a90 | |||
| ee89c485fc | |||
| c1a7ded1e4 | |||
| 8cdc6b5d7c | |||
| c4f0b4fb6d | |||
| 2d00d9cbe6 | |||
| d28e9a7b62 | |||
| 37d1aa4129 | |||
| a1d6833bac | |||
| 13507d422b | |||
| de44a17e64 | |||
| e9689a0a07 | |||
| defbb01aaa | |||
| 904090cbb6 | |||
| 4bde3366c1 | |||
| cfac29b0ef | |||
| 3326603265 | |||
| a22b6168c6 | |||
| 20bcd4bd69 | |||
| 552497d71b | |||
| 8d0100f100 | |||
| a105003a7a | |||
| e03aaec030 | |||
| 0aad73f4a1 | |||
| 3565f179af | |||
| b35b0c598d | |||
| 6b54d04bfc | |||
| 965a3d6eec | |||
| 917cf44def | |||
| c884edd923 | |||
| bdb216bf7c | |||
| e019bd91fd | |||
| ea916b6ae5 | |||
| ba0b06f268 | |||
| cea6b20c09 | |||
| 8dab92d158 | |||
| b5deee823c | |||
| 7091ab5e75 | |||
| 0495d0f232 | |||
| e6d9a0d1ad | |||
| c8236d0dd2 | |||
| 6bdf005171 | |||
| ce77e80414 | |||
| de10f0dda6 | |||
| 37b9ba5bd7 | |||
| 035d655e47 | |||
| 06d8860d42 | |||
| 9d2509ab5b | |||
| f7ab5cb7c4 | |||
| 8520bbd2c7 | |||
| e8db0e3abb | |||
| 46ae5700ee | |||
| c8e715c33b | |||
| ed74182cc2 | |||
| 4ba19c9556 | |||
| a5be17d941 | |||
| 23831e38e6 | |||
| ad745aae63 | |||
| cc94419a72 | |||
| 95448eea3d | |||
| ba34d72183 | |||
| b4b4c996ba | |||
| b1454276ed | |||
| aa0f77043c | |||
| dac4dd560a | |||
| 7e136a792f | |||
| 8baae4c77f | |||
| c295981c5a | |||
| 3ebd08e38c | |||
| f38ff074c4 | |||
| c124bbe4bf | |||
| 061fd25c61 | |||
| 923abb94d8 | |||
| 47c697feca | |||
| 177680216c | |||
| 032a937b06 | |||
| 4f36a1fb77 | |||
| 14a1d3d251 | |||
| 239dd55146 | |||
| c09297997e | |||
| 776693235c | |||
| b5c09965a9 | |||
| 7a730384ef | |||
| 8d2aa61f9b | |||
| 8395704dc6 | |||
| a672860c40 | |||
| b73aaa4899 | |||
| 78cf2ead38 | |||
| 5e1113d884 | |||
| 45f1c96ff2 | |||
| 4703ec5164 | |||
| 9001a64ef9 | |||
| 186441e7f5 | |||
| e5af1edcb9 | |||
| 777ef6b663 | |||
| f5164f3804 | |||
| 6075bf3fc2 | |||
| e99cd8052c | |||
| d25420a33b | |||
| 9a7442c2fd | |||
| ef97134f50 | |||
| c28ed42617 | |||
| eb5fdac918 | |||
| 518bc555a6 | |||
| 19505b664c | |||
| b4f6a9336b | |||
| 708d5831e4 | |||
| 405a75f26b | |||
| 34942b5af3 | |||
| d2fac78413 | |||
| 481cebee7e | |||
| 96fdbac69a | |||
| 068093aae0 | |||
| d8f352ae7c | |||
| 21bb2ea063 | |||
| efae5d6a69 | |||
| 8989b5ea39 | |||
| 4bd7bafd7c | |||
| 8b6bcef4b7 | |||
| c00ebef329 | |||
| 8baa104453 | |||
| 97c9a4a02c | |||
| a9ab3ea5b4 | |||
| d63e3f1559 | |||
| 7388cc8a78 | |||
| d1b2dd2831 | |||
| 3e198086e3 | |||
| 49c8292e48 | |||
| ff057838ec | |||
| 94f25a429f | |||
| ec17355056 | |||
| a7ad2a7e1a | |||
| 510ad223f0 | |||
| b2ee24b549 | |||
| d68d1d9999 | |||
| 39dd219fbc | |||
| 660d040531 | |||
| 2088dfb3b3 | |||
| 3e6016dc6e | |||
| 096db533a6 | |||
| 3648ef4687 | |||
| f73e870bde | |||
| e6aa9f9d4e | |||
| 1c3f3c1842 | |||
| 55320a03f1 | |||
| 9b2037419f | |||
| 8888ee3974 | |||
| cb4b4d584c | |||
| 167a841010 | |||
| 2736c3a9d1 | |||
| dcb4eedeb0 | |||
| 3e6eea25b3 | |||
| 2ce6e59d9b | |||
| 132a710a0a | |||
| 6ef3b8c458 | |||
| 7496a463d4 | |||
| 091b40cb39 | |||
| 0f0812618a | |||
| 383142bcbe | |||
| a223157000 | |||
| 0345861b5f | |||
| 4422a3df23 | |||
| a214d0ed4c | |||
| 625376f0d3 | |||
| 8f925a2e84 | |||
| cf11b32849 | |||
| 53a99cb9ee | |||
| 7d877ab488 | |||
| 642970df95 | |||
| 75d1715442 | |||
| ca64363899 | |||
| 0508a62c91 | |||
| 93ea98520b | |||
| c3b6e9da43 | |||
| 5256f1c967 | |||
| c631e6c61c | |||
| 5fe6c2dcb4 | |||
| 453405f131 | |||
| 0ee87d7b46 | |||
| b0e395e853 | |||
| ad7855f995 | |||
| 9f288fc16f | |||
| 1b3047c812 | |||
| f5b97f1e8a | |||
| d3aa8a118c | |||
| 820bf37445 | |||
| 2639fba582 | |||
| 03c5fdef43 | |||
| 203dff9165 | |||
| 5a5f06ef2a | |||
| 92913c4c27 | |||
| 1f79fb608a | |||
| 3a2a4dee5c | |||
| c1e68b2c61 | |||
| a38d0a0fbd | |||
| b32301592f | |||
| 97c95b7639 | |||
| 852c3badbb | |||
| e5b7628802 | |||
| da10ce7b05 | |||
| b484638bb9 | |||
| 9a145ab15f | |||
| 7f5deb0f97 | |||
| 225b8953fd | |||
| 2ce925caba | |||
| 4a7b3d6d7b | |||
| 219af60102 | |||
| 14a5144de7 | |||
| 49d5c02d69 | |||
| a871da4fbe | |||
| 3ac74c86a1 | |||
| 2bf88fcef5 | |||
| b6875b41f4 | |||
| a9559f03b0 | |||
| de13141b68 | |||
| af09cb06f5 | |||
| 079b8e0e16 | |||
| 4debd89d8e | |||
| bf3135eb41 | |||
| e9001207ea | |||
| 95260371cb | |||
| 613d08d3e2 | |||
| 5fb3edf258 | |||
| ecdd751ec3 | |||
| ead2a1a606 | |||
| 8485dcdb03 | |||
| d68ffc2da6 | |||
| a99457ee29 | |||
| 0e2af13656 | |||
| 37a58a04f2 | |||
| 236b3b1c2b | |||
| ebdf08a514 | |||
| 5e10f1fe6a | |||
| 69d30f2204 | |||
| bec8f6b86c | |||
| 29b76fc4f5 | |||
| b4b9f9601b | |||
| 575845772f | |||
| b9b9dabd75 | |||
| ed5a9d5dc1 | |||
| 7339ebce60 |
@@ -1,4 +1,4 @@
|
||||
name: reVC conan+cmake
|
||||
name: reLCS 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 }} reLCS/master@ -if build -o reLCS: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 reLCS:build_type=RelWithDebInfo -s librw:build_type=RelWithDebInfo
|
||||
env:
|
||||
CONAN_SYSREQUIRES_MODE: enabled
|
||||
- name: "Build reVC (conan build)"
|
||||
- name: "Build reLCS (conan build)"
|
||||
run: |
|
||||
conan build ${{ github.workspace }} -if build -bf build -pf package
|
||||
- name: "Package reVC (conan package)"
|
||||
- name: "Package reLCS (conan package)"
|
||||
run: |
|
||||
conan package ${{ github.workspace }} -if build -bf build -pf package
|
||||
- name: "Create binary package (cpack)"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
name: reVC cmake devkitA64 (Nintendo Switch)
|
||||
name: reLCS cmake devkitA64 (Nintendo Switch)
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
@@ -1,4 +1,4 @@
|
||||
name: reVC premake amd64
|
||||
name: reLCS 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/reLCS.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 reLCS_${{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}}/reLCS.exe ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reLCS.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: reLCS_${{matrix.buildtype}}_${{matrix.platform}}
|
||||
path: ./gamefiles/*
|
||||
# - name: Upload artifact to Bintray
|
||||
# uses: hpcsc/upload-bintray-docker-action@v1
|
||||
# with:
|
||||
# repository: reVC
|
||||
# repository: reLCS
|
||||
# package: ${{matrix.buildtype}}_${{matrix.platform}}
|
||||
# version: 1.0-$(echo ${GITHUB_SHA}
|
||||
# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}}
|
||||
@@ -1,4 +1,4 @@
|
||||
name: reVC premake x86
|
||||
name: reLCS premake x86
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [win-x86-librw_d3d9-mss, win-x86-librw_gl3_glfw-mss, win-x86-librw_d3d9-oal, win-x86-librw_gl3_glfw-oal]
|
||||
buildtype: [Debug, Release, Vanilla]
|
||||
buildtype: [Debug, Release]
|
||||
steps:
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
@@ -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/reLCS.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 reLCS_${{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}}/reLCS.exe ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reLCS.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: reLCS_${{matrix.buildtype}}_${{matrix.platform}}
|
||||
path: ./gamefiles/*
|
||||
# - name: Upload artifact to Bintray
|
||||
# uses: hpcsc/upload-bintray-docker-action@v1
|
||||
# with:
|
||||
# repository: reVC
|
||||
# repository: reLCS
|
||||
# package: ${{matrix.buildtype}}_${{matrix.platform}}
|
||||
# version: 1.0-$(echo ${GITHUB_SHA}
|
||||
# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}}
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
set(EXECUTABLE reVC)
|
||||
set(PROJECT REVC)
|
||||
set(EXECUTABLE reLCS)
|
||||
set(PROJECT RELCS)
|
||||
|
||||
project(${EXECUTABLE} C CXX)
|
||||
set(${PROJECT}_AUTHOR "${PROJECT} Team")
|
||||
|
||||
@@ -1,196 +1,37 @@
|
||||
<img src="https://github.com/GTAmodding/re3/blob/miami/res/images/logo_1024.png?raw=true" alt="reVC logo" width="200">
|
||||
|
||||
[](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=miami)
|
||||
# reLCS
|
||||
[](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=lcs)
|
||||
<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
|
||||
|
||||
In this repository you'll find the fully reversed source code for GTA III ([master](https://github.com/GTAmodding/re3/tree/master/) branch) and GTA VC ([miami](https://github.com/GTAmodding/re3/tree/miami/) branch).
|
||||
The aim of this project is to reverse GTA Liberty City Stories.
|
||||
|
||||
It has been tested and works on Windows, Linux, MacOS and FreeBSD, on x86, amd64, arm and arm64.\
|
||||
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.
|
||||
## How can I try it?
|
||||
|
||||
We cannot build for PS2 or Xbox yet. If you're interested in doing so, get in touch with us.
|
||||
- reLCS requires game assets to work.
|
||||
- Build reLCS or download it from one of the above links (Debug or Release).
|
||||
- (Optional) If you want to use optional features, copy the files in /gamefiles folder to your game root folder.
|
||||
- Move reLCS.exe to GTA LCS directory and run it.
|
||||
|
||||
## Installation
|
||||
## Preparing the environment for building
|
||||
|
||||
- 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.
|
||||
You may want to point GTA_LCS_RE_DIR environment variable to GTA LCS root folder if you want executable to be moved there via post-build script.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
## Improvements
|
||||
|
||||
We have implemented a number of changes and improvements to the original game.
|
||||
They can be configured in `core/config.h`.
|
||||
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
|
||||
* 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)
|
||||
* Rendering
|
||||
* Widescreen support (properly scaled HUD, Menu and FOV)
|
||||
* PS2 MatFX (vehicle reflections)
|
||||
* PS2 alpha test (better rendering of transparency)
|
||||
* Xbox vehicle rendering
|
||||
* Xbox world lightmap rendering (needs Xbox map)
|
||||
* Xbox ped rim light
|
||||
* Xbox screen rain droplets
|
||||
* More customizable colourfilter
|
||||
* Menu
|
||||
* More options
|
||||
* Controller configuration menu
|
||||
* ...
|
||||
* Can load DFFs and TXDs from other platforms, possibly with a performance penalty
|
||||
* ...
|
||||
|
||||
## To-Do
|
||||
|
||||
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)
|
||||
* [PS2 port](https://github.com/GTAmodding/re3/wiki/PS2-port)
|
||||
* Xbox port (not quite as important)
|
||||
* reverse remaining unused/debug functions
|
||||
* compare CodeWarrior build with original binary for more accurate code (very tedious)
|
||||
|
||||
## Modding
|
||||
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
|
||||
Clone the repository with `git clone --recursive -b miami https://github.com/GTAmodding/re3.git reVC`. Then `cd reVC` into the cloned repository.
|
||||
|
||||
<details><summary>Linux Premake</summary>
|
||||
|
||||
For Linux using premake, proceed: [Building on Linux](https://github.com/GTAmodding/re3/wiki/Building-on-Linux)
|
||||
|
||||
</details>
|
||||
|
||||
<details><summary>Linux Conan</summary>
|
||||
|
||||
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 build .. -if build -bf build -pf package
|
||||
```
|
||||
</details>
|
||||
|
||||
<details><summary>MacOS Premake</summary>
|
||||
|
||||
For MacOS using premake, proceed: [Building on MacOS](https://github.com/GTAmodding/re3/wiki/Building-on-MacOS)
|
||||
|
||||
</details>
|
||||
|
||||
<details><summary>FreeBSD</summary>
|
||||
|
||||
For FreeBSD using premake, proceed: [Building on FreeBSD](https://github.com/GTAmodding/re3/wiki/Building-on-FreeBSD)
|
||||
|
||||
</details>
|
||||
|
||||
<details><summary>Windows</summary>
|
||||
|
||||
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.
|
||||
- For Linux, proceed: [Building on Linux](https://github.com/GTAmodding/re3/wiki/Building-on-Linux)
|
||||
- For FreeBSD, proceed: [Building on FreeBSD](https://github.com/GTAmodding/re3/wiki/Building-on-FreeBSD)
|
||||
- For Windows, assuming you have Visual Studio:
|
||||
- Clone the repo using the argument `--recursive`.
|
||||
- Run one of the `premake-vsXXXX.cmd` variants on root folder.
|
||||
- Open the project via Visual Studio
|
||||
|
||||
Microsoft recently discontinued its downloads of the DX9 SDK. You can download an archived version here: https://archive.org/details/dxsdk_jun10
|
||||
**If you use 64-bit D3D9**: We don't ship 64-bit Dx9 SDK. You need to download it from Microsoft if you don't have it(although it should come pre-installed after some Windows version)
|
||||
|
||||
**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).
|
||||
</details>
|
||||
There are various settings at the very bottom of [config.h](https://github.com/GTAmodding/re3/tree/lcs/src/core/config.h), you may want to take a look there. i.e. FIX_BUGS define fixes the bugs we've come across.
|
||||
|
||||
> :information_source: premake has an `--with-lto` option if you want the project to be compiled with Link Time Optimization.
|
||||
> :information_source: **If you choose OpenAL on Windows** You must read [Running OpenAL build on Windows](https://github.com/GTAmodding/re3/wiki/Running-OpenAL-build-on-Windows).
|
||||
|
||||
> :information_source: 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: 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.
|
||||
|
||||
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.
|
||||
> :information_source: **Did you notice librw?** reLCS uses completely homebrew RenderWare-replacement rendering engine; [librw](https://github.com/aap/librw/). librw comes as submodule of reLCS, but you also can use LIBRW enviorenment variable to specify path to your own librw.
|
||||
|
||||
## 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.
|
||||
Please read the [Coding Style](https://github.com/GTAmodding/re3/blob/master/CODING_STYLE.md) Document
|
||||
|
||||
We **don't** accept custom codes, as long as it's not wrapped via preprocessor conditions, or it's linux/cross-platform skeleton/compatibility layer.
|
||||
|
||||
We accept only these kinds of PRs;
|
||||
|
||||
- A new feature that exists in at least one of the GTAs (if it wasn't in III/VC then it doesn't have to be decompilation)
|
||||
- Game, UI or UX bug fixes (if it's a fix to original code, it should be behind FIX_BUGS)
|
||||
- Platform-specific and/or unused code that's not been reversed yet
|
||||
- Makes reversed code more understandable/accurate, as in "which code would produce this assembly".
|
||||
- A new cross-platform skeleton/compatibility layer, or improvements to them
|
||||
- Translation fixes, for languages original game supported
|
||||
- Code that increase maintainability
|
||||
|
||||
We have a [Coding Style](https://github.com/GTAmodding/re3/blob/master/CODING_STYLE.md) document that isn't followed or enforced very well.
|
||||
|
||||
Do not use features from C++11 or later.
|
||||
|
||||
|
||||
## History
|
||||
|
||||
re3 was started sometime in the spring of 2018,
|
||||
initially as a way to test reversed collision and physics code
|
||||
inside the game.
|
||||
This was done by replacing single functions of the game
|
||||
with their reversed counterparts using a dll.
|
||||
|
||||
After a bit of work the project lay dormant for about a year
|
||||
and was picked up again and pushed to github in May 2019.
|
||||
At the time I (aap) had reversed around 10k lines of code and estimated
|
||||
the final game to have around 200-250k.
|
||||
Others quickly joined the effort (Fire_Head, shfil, erorcun and Nick007J
|
||||
in time order, and Serge a bit later) and we made very quick progress
|
||||
throughout the summer of 2019
|
||||
after which the pace slowed down a bit.
|
||||
|
||||
Due to everyone staying home during the start of the Corona pandemic
|
||||
everybody had a lot of time to work on re3 again and
|
||||
we finally got a standalone exe in April 2020 (around 180k lines by then).
|
||||
|
||||
After the initial excitement and fixing and polishing the code further,
|
||||
reVC was started in early May 2020 by starting from re3 code,
|
||||
not by starting from scratch replacing functions with a dll.
|
||||
After a few months of mostly steady progress we considered reVC
|
||||
finished in December.
|
||||
|
||||
Since then we have started reLCS, which is currently work in progress.
|
||||
|
||||
|
||||
## License
|
||||
|
||||
We don't feel like we're in a position to give this code a license.\
|
||||
The code should only be used for educational, documentation and modding purposes.\
|
||||
We do not encourage piracy or commercial use.\
|
||||
Please keep derivate work open source and give proper credit.
|
||||
|
||||
+9
-9
@@ -5,8 +5,8 @@ import shutil
|
||||
import textwrap
|
||||
|
||||
|
||||
class ReVCConan(ConanFile):
|
||||
name = "reVC"
|
||||
class ReLCSConan(ConanFile):
|
||||
name = "reLCS"
|
||||
version = "master"
|
||||
license = "???" # FIXME: https://github.com/GTAmodding/re3/issues/794
|
||||
settings = "os", "arch", "compiler", "build_type"
|
||||
@@ -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("reLCS with opus support requires a libsndfile built with external libs (=ogg/flac/opus/vorbis)")
|
||||
|
||||
@property
|
||||
def _reVC_audio(self):
|
||||
def _reLCS_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("{}" reLCS)
|
||||
""").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["RELCS_AUDIO"] = self._reLCS_audio
|
||||
cmake.definitions["RELCS_WITH_OPUS"] = self.options.with_opus
|
||||
cmake.definitions["RELCS_INSTALL"] = True
|
||||
cmake.definitions["RELCS_VENDORED_LIBRW"] = False
|
||||
env = {}
|
||||
if self._os_is_playstation2:
|
||||
cmake.definitions["CMAKE_TOOLCHAIN_FILE"] = self.deps_user_info["ps2dev-cmaketoolchain"].cmake_toolchain_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.
+488
-477
@@ -1,477 +1,488 @@
|
||||
newoption {
|
||||
trigger = "glfwdir64",
|
||||
value = "PATH",
|
||||
description = "Directory of glfw",
|
||||
default = "vendor/glfw-3.3.2.bin.WIN64",
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "glfwdir32",
|
||||
value = "PATH",
|
||||
description = "Directory of glfw",
|
||||
default = "vendor/glfw-3.3.2.bin.WIN32",
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-asan",
|
||||
description = "Build with address sanitizer"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-librw",
|
||||
description = "Build and use librw from this solution"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-opus",
|
||||
description = "Build with opus"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-lto",
|
||||
description = "Build with link time optimization"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "no-git-hash",
|
||||
description = "Don't print git commit hash into binary"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "no-full-paths",
|
||||
description = "Don't print full paths into binary"
|
||||
}
|
||||
|
||||
require("autoconf")
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
Librw = "vendor/librw"
|
||||
else
|
||||
Librw = os.getenv("LIBRW") or "vendor/librw"
|
||||
end
|
||||
|
||||
function getsys(a)
|
||||
if a == 'windows' then
|
||||
return 'win'
|
||||
end
|
||||
return a
|
||||
end
|
||||
|
||||
function getarch(a)
|
||||
if a == 'x86_64' then
|
||||
return 'amd64'
|
||||
elseif a == 'ARM' then
|
||||
return 'arm'
|
||||
elseif a == 'ARM64' then
|
||||
return 'arm64'
|
||||
end
|
||||
return a
|
||||
end
|
||||
|
||||
workspace "reVC"
|
||||
language "C++"
|
||||
configurations { "Debug", "Release" }
|
||||
startproject "reVC"
|
||||
location "build"
|
||||
symbols "Full"
|
||||
staticruntime "off"
|
||||
|
||||
if _OPTIONS["with-asan"] then
|
||||
buildoptions { "-fsanitize=address -g3 -fno-omit-frame-pointer" }
|
||||
linkoptions { "-fsanitize=address" }
|
||||
end
|
||||
|
||||
filter { "system:windows" }
|
||||
configurations { "Vanilla" }
|
||||
platforms {
|
||||
"win-x86-RW34_d3d8-mss",
|
||||
"win-x86-librw_d3d9-mss",
|
||||
"win-x86-librw_gl3_glfw-mss",
|
||||
"win-x86-RW34_d3d8-oal",
|
||||
"win-x86-librw_d3d9-oal",
|
||||
"win-x86-librw_gl3_glfw-oal",
|
||||
"win-amd64-librw_d3d9-oal",
|
||||
"win-amd64-librw_gl3_glfw-oal",
|
||||
}
|
||||
|
||||
filter { "system:linux" }
|
||||
platforms {
|
||||
"linux-x86-librw_gl3_glfw-oal",
|
||||
"linux-amd64-librw_gl3_glfw-oal",
|
||||
"linux-arm-librw_gl3_glfw-oal",
|
||||
"linux-arm64-librw_gl3_glfw-oal",
|
||||
}
|
||||
|
||||
filter { "system:bsd" }
|
||||
platforms {
|
||||
"bsd-x86-librw_gl3_glfw-oal",
|
||||
"bsd-amd64-librw_gl3_glfw-oal",
|
||||
"bsd-arm-librw_gl3_glfw-oal",
|
||||
"bsd-arm64-librw_gl3_glfw-oal"
|
||||
}
|
||||
|
||||
filter { "system:macosx" }
|
||||
platforms {
|
||||
"macosx-arm64-librw_gl3_glfw-oal",
|
||||
"macosx-amd64-librw_gl3_glfw-oal",
|
||||
}
|
||||
|
||||
filter "configurations:Debug"
|
||||
defines { "DEBUG" }
|
||||
|
||||
filter "configurations:not Debug"
|
||||
defines { "NDEBUG" }
|
||||
optimize "Speed"
|
||||
if(_OPTIONS["with-lto"]) then
|
||||
flags { "LinkTimeOptimization" }
|
||||
end
|
||||
|
||||
filter { "platforms:win*" }
|
||||
system "windows"
|
||||
|
||||
filter { "platforms:linux*" }
|
||||
system "linux"
|
||||
|
||||
filter { "platforms:bsd*" }
|
||||
system "bsd"
|
||||
|
||||
filter { "platforms:macosx*" }
|
||||
system "macosx"
|
||||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
|
||||
filter { "platforms:*amd64*" }
|
||||
architecture "amd64"
|
||||
|
||||
filter { "platforms:*arm*" }
|
||||
architecture "ARM"
|
||||
|
||||
filter { "platforms:macosx-arm64-*", "files:**.cpp"}
|
||||
buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" }
|
||||
|
||||
filter { "platforms:macosx-arm64-*", "files:**.c"}
|
||||
buildoptions { "-target", "arm64-apple-macos11" }
|
||||
|
||||
filter { "platforms:macosx-amd64-*", "files:**.cpp"}
|
||||
buildoptions { "-target", "x86_64-apple-macos10.12", "-std=gnu++14" }
|
||||
|
||||
filter { "platforms:macosx-amd64-*", "files:**.c"}
|
||||
buildoptions { "-target", "x86_64-apple-macos10.12" }
|
||||
|
||||
filter { "platforms:*librw_d3d9*" }
|
||||
defines { "RW_D3D9" }
|
||||
if(not _OPTIONS["with-librw"]) then
|
||||
libdirs { path.join(Librw, "lib/win-%{getarch(cfg.architecture)}-d3d9/%{cfg.buildcfg}") }
|
||||
end
|
||||
|
||||
filter "platforms:*librw_gl3_glfw*"
|
||||
defines { "RW_GL3" }
|
||||
if(not _OPTIONS["with-librw"]) then
|
||||
libdirs { path.join(Librw, "lib/%{getsys(cfg.system)}-%{getarch(cfg.architecture)}-gl3/%{cfg.buildcfg}") }
|
||||
end
|
||||
|
||||
filter "platforms:*x86-librw_gl3_glfw*"
|
||||
includedirs { path.join(_OPTIONS["glfwdir32"], "include") }
|
||||
|
||||
filter "platforms:*amd64-librw_gl3_glfw*"
|
||||
includedirs { path.join(_OPTIONS["glfwdir64"], "include") }
|
||||
|
||||
filter {}
|
||||
|
||||
function setpaths (gamepath, exepath)
|
||||
if (gamepath) then
|
||||
postbuildcommands {
|
||||
'{COPYFILE} "%{cfg.buildtarget.abspath}" "' .. gamepath .. '%{cfg.buildtarget.name}"'
|
||||
}
|
||||
debugdir (gamepath)
|
||||
if (exepath) then
|
||||
-- Used VS variable $(TargetFileName) because it doesn't accept premake tokens. Does debugcommand even work outside VS??
|
||||
debugcommand (gamepath .. "$(TargetFileName)")
|
||||
dir, file = exepath:match'(.*/)(.*)'
|
||||
debugdir (gamepath .. (dir or ""))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
project "librw"
|
||||
kind "StaticLib"
|
||||
targetname "rw"
|
||||
targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}"))
|
||||
files { path.join(Librw, "src/*.*") }
|
||||
files { path.join(Librw, "src/*/*.*") }
|
||||
files { path.join(Librw, "src/gl/*/*.*") }
|
||||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
|
||||
filter { "platforms:*amd64*" }
|
||||
architecture "amd64"
|
||||
|
||||
filter "platforms:win*"
|
||||
defines { "_CRT_SECURE_NO_WARNINGS", "_CRT_NONSTDC_NO_DEPRECATE" }
|
||||
staticruntime "on"
|
||||
buildoptions { "/Zc:sizedDealloc-" }
|
||||
|
||||
filter "platforms:bsd*"
|
||||
includedirs { "/usr/local/include" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
-- Support MacPorts and Homebrew
|
||||
filter "platforms:macosx-arm64-*"
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/opt/homebrew/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/opt/homebrew/lib" }
|
||||
|
||||
filter "platforms:macosx-amd64-*"
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/usr/local/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
filter "platforms:*gl3_glfw*"
|
||||
staticruntime "off"
|
||||
|
||||
filter "platforms:*RW34*"
|
||||
flags { "ExcludeFromBuild" }
|
||||
filter {}
|
||||
end
|
||||
|
||||
local function addSrcFiles( prefix )
|
||||
return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc"
|
||||
end
|
||||
|
||||
project "reVC"
|
||||
kind "WindowedApp"
|
||||
targetname "reVC"
|
||||
targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}"
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
dependson "librw"
|
||||
end
|
||||
|
||||
files { addSrcFiles("src") }
|
||||
files { addSrcFiles("src/animation") }
|
||||
files { addSrcFiles("src/audio") }
|
||||
files { addSrcFiles("src/audio/eax") }
|
||||
files { addSrcFiles("src/audio/oal") }
|
||||
files { addSrcFiles("src/buildings") }
|
||||
files { addSrcFiles("src/collision") }
|
||||
files { addSrcFiles("src/control") }
|
||||
files { addSrcFiles("src/core") }
|
||||
files { addSrcFiles("src/entities") }
|
||||
files { addSrcFiles("src/math") }
|
||||
files { addSrcFiles("src/modelinfo") }
|
||||
files { addSrcFiles("src/objects") }
|
||||
files { addSrcFiles("src/peds") }
|
||||
files { addSrcFiles("src/renderer") }
|
||||
files { addSrcFiles("src/rw") }
|
||||
files { addSrcFiles("src/save") }
|
||||
files { addSrcFiles("src/skel") }
|
||||
files { addSrcFiles("src/skel/glfw") }
|
||||
files { addSrcFiles("src/text") }
|
||||
files { addSrcFiles("src/vehicles") }
|
||||
files { addSrcFiles("src/weapons") }
|
||||
files { addSrcFiles("src/extras") }
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
files { "src/extras/GitSHA1.cpp" } -- this won't be in repo in first build
|
||||
else
|
||||
removefiles { "src/extras/GitSHA1.cpp" } -- but it will be everytime after
|
||||
end
|
||||
|
||||
includedirs { "src" }
|
||||
includedirs { "src/animation" }
|
||||
includedirs { "src/audio" }
|
||||
includedirs { "src/audio/eax" }
|
||||
includedirs { "src/audio/oal" }
|
||||
includedirs { "src/buildings" }
|
||||
includedirs { "src/collision" }
|
||||
includedirs { "src/control" }
|
||||
includedirs { "src/core" }
|
||||
includedirs { "src/entities" }
|
||||
includedirs { "src/math" }
|
||||
includedirs { "src/modelinfo" }
|
||||
includedirs { "src/objects" }
|
||||
includedirs { "src/peds" }
|
||||
includedirs { "src/renderer" }
|
||||
includedirs { "src/rw" }
|
||||
includedirs { "src/save/" }
|
||||
includedirs { "src/skel/" }
|
||||
includedirs { "src/skel/glfw" }
|
||||
includedirs { "src/text" }
|
||||
includedirs { "src/vehicles" }
|
||||
includedirs { "src/weapons" }
|
||||
includedirs { "src/extras" }
|
||||
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
defines { "USE_OUR_VERSIONING" }
|
||||
end
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
includedirs { "vendor/ogg/include" }
|
||||
includedirs { "vendor/opus/include" }
|
||||
includedirs { "vendor/opusfile/include" }
|
||||
end
|
||||
|
||||
filter "configurations:Vanilla"
|
||||
defines { "VANILLA_DEFINES" }
|
||||
|
||||
filter "platforms:*mss"
|
||||
defines { "AUDIO_MSS" }
|
||||
includedirs { "vendor/milessdk/include" }
|
||||
libdirs { "vendor/milessdk/lib" }
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
filter "platforms:win*"
|
||||
libdirs { "vendor/ogg/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "vendor/opus/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "vendor/opusfile/win32/VS2015/Win32/Release-NoHTTP" }
|
||||
filter {}
|
||||
defines { "AUDIO_OPUS" }
|
||||
end
|
||||
|
||||
filter "platforms:*oal"
|
||||
defines { "AUDIO_OAL" }
|
||||
|
||||
filter {}
|
||||
if(os.getenv("GTA_VC_RE_DIR")) then
|
||||
setpaths(os.getenv("GTA_VC_RE_DIR") .. "/", "%(cfg.buildtarget.name)")
|
||||
end
|
||||
|
||||
filter "platforms:win*"
|
||||
files { addSrcFiles("src/skel/win") }
|
||||
includedirs { "src/skel/win" }
|
||||
buildoptions { "/Zc:sizedDealloc-" }
|
||||
linkoptions "/SAFESEH:NO"
|
||||
characterset ("MBCS")
|
||||
targetextension ".exe"
|
||||
if(_OPTIONS["no-full-paths"]) then
|
||||
usefullpaths "off"
|
||||
linkoptions "/PDBALTPATH:%_PDB%"
|
||||
end
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
-- external librw is dynamic
|
||||
staticruntime "on"
|
||||
end
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
prebuildcommands { '"%{prj.location}..\\printHash.bat" "%{prj.location}..\\src\\extras\\GitSHA1.cpp"' }
|
||||
end
|
||||
|
||||
filter "platforms:not win*"
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
prebuildcommands { '"%{prj.location}/../printHash.sh" "%{prj.location}/../src/extras/GitSHA1.cpp"' }
|
||||
end
|
||||
|
||||
filter "platforms:win*glfw*"
|
||||
staticruntime "off"
|
||||
|
||||
filter "platforms:*glfw*"
|
||||
premake.modules.autoconf.parameters = "-lglfw -lX11"
|
||||
autoconfigure {
|
||||
-- iterates all configs and runs on them
|
||||
["dontWrite"] = function (cfg)
|
||||
check_symbol_exists(cfg, "haveX11", "glfwGetX11Display", { "X11/Xlib.h", "X11/XKBlib.h", "GLFW/glfw3.h", "GLFW/glfw3native.h" }, "GLFW_EXPOSE_NATIVE_X11")
|
||||
if cfg.autoconf["haveX11"] ~= nil and cfg.autoconf["haveX11"] == 1 then
|
||||
table.insert(cfg.links, "X11")
|
||||
table.insert(cfg.defines, "GET_KEYBOARD_INPUT_FROM_X11")
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
filter "platforms:win*oal"
|
||||
includedirs { "vendor/openal-soft/include" }
|
||||
includedirs { "vendor/libsndfile/include" }
|
||||
includedirs { "vendor/mpg123/include" }
|
||||
|
||||
filter "platforms:win-x86*oal"
|
||||
libdirs { "vendor/mpg123/lib/Win32" }
|
||||
libdirs { "vendor/libsndfile/lib/Win32" }
|
||||
libdirs { "vendor/openal-soft/libs/Win32" }
|
||||
|
||||
filter "platforms:win-amd64*oal"
|
||||
libdirs { "vendor/mpg123/lib/Win64" }
|
||||
libdirs { "vendor/libsndfile/lib/Win64" }
|
||||
libdirs { "vendor/openal-soft/libs/Win64" }
|
||||
|
||||
filter "platforms:linux*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
filter "platforms:bsd*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
filter "platforms:macosx*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
filter "platforms:macosx-arm64-*oal"
|
||||
includedirs { "/opt/homebrew/opt/openal-soft/include" }
|
||||
libdirs { "/opt/homebrew/opt/openal-soft/lib" }
|
||||
|
||||
filter "platforms:macosx-amd64-*oal"
|
||||
includedirs { "/usr/local/opt/openal-soft/include" }
|
||||
libdirs { "/usr/local/opt/openal-soft/lib" }
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
filter {}
|
||||
links { "libogg" }
|
||||
links { "opus" }
|
||||
links { "opusfile" }
|
||||
end
|
||||
|
||||
filter "platforms:*RW34*"
|
||||
includedirs { "sdk/rwsdk/include/d3d8" }
|
||||
libdirs { "sdk/rwsdk/lib/d3d8/release" }
|
||||
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtanim", "rtcharse", "rpanisot" }
|
||||
defines { "RWLIBS" }
|
||||
linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text"
|
||||
|
||||
filter "platforms:*librw*"
|
||||
defines { "LIBRW" }
|
||||
files { addSrcFiles("src/fakerw") }
|
||||
includedirs { "src/fakerw" }
|
||||
includedirs { Librw }
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
libdirs { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" }
|
||||
end
|
||||
links { "rw" }
|
||||
|
||||
filter "platforms:*d3d9*"
|
||||
defines { "USE_D3D9" }
|
||||
links { "d3d9" }
|
||||
|
||||
filter "platforms:*x86*d3d*"
|
||||
includedirs { "sdk/dx8sdk/include" }
|
||||
libdirs { "sdk/dx8sdk/lib" }
|
||||
|
||||
filter "platforms:win-x86*gl3_glfw*"
|
||||
libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
||||
links { "opengl32", "glfw3" }
|
||||
|
||||
filter "platforms:win-amd64*gl3_glfw*"
|
||||
libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
||||
links { "opengl32", "glfw3" }
|
||||
|
||||
filter "platforms:linux*gl3_glfw*"
|
||||
links { "GL", "glfw" }
|
||||
|
||||
filter "platforms:bsd*gl3_glfw*"
|
||||
links { "GL", "glfw", "sysinfo" }
|
||||
includedirs { "/usr/local/include" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
filter "platforms:macosx-arm64-*gl3_glfw*"
|
||||
links { "glfw" }
|
||||
linkoptions { "-framework OpenGL" }
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/opt/homebrew/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/opt/homebrew/lib" }
|
||||
|
||||
filter "platforms:macosx-amd64-*gl3_glfw*"
|
||||
links { "glfw" }
|
||||
linkoptions { "-framework OpenGL" }
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/usr/local/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
newoption {
|
||||
trigger = "glfwdir64",
|
||||
value = "PATH",
|
||||
description = "Directory of glfw",
|
||||
default = "vendor/glfw-3.3.2.bin.WIN64",
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "glfwdir32",
|
||||
value = "PATH",
|
||||
description = "Directory of glfw",
|
||||
default = "vendor/glfw-3.3.2.bin.WIN32",
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-asan",
|
||||
description = "Build with address sanitizer"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-librw",
|
||||
description = "Build and use librw from this solution"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-opus",
|
||||
description = "Build with opus"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "with-lto",
|
||||
description = "Build with link time optimization"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "no-git-hash",
|
||||
description = "Don't print git commit hash into binary"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "no-full-paths",
|
||||
description = "Don't print full paths into binary"
|
||||
}
|
||||
|
||||
require("autoconf")
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
Librw = "vendor/librw"
|
||||
else
|
||||
Librw = os.getenv("LIBRW") or "vendor/librw"
|
||||
end
|
||||
|
||||
function getsys(a)
|
||||
if a == 'windows' then
|
||||
return 'win'
|
||||
end
|
||||
return a
|
||||
end
|
||||
|
||||
function getarch(a)
|
||||
if a == 'x86_64' then
|
||||
return 'amd64'
|
||||
elseif a == 'ARM' then
|
||||
return 'arm'
|
||||
elseif a == 'ARM64' then
|
||||
return 'arm64'
|
||||
end
|
||||
return a
|
||||
end
|
||||
|
||||
workspace "reLCS"
|
||||
language "C++"
|
||||
configurations { "Debug", "Release" }
|
||||
startproject "reLCS"
|
||||
location "build"
|
||||
symbols "Full"
|
||||
staticruntime "off"
|
||||
|
||||
-- for CVECTORHACK
|
||||
configuration { "gmake*" }
|
||||
buildoptions { "-fpermissive" }
|
||||
|
||||
filter { "platforms:macosx*" }
|
||||
buildoptions { "-Wno-address-of-temporary" }
|
||||
|
||||
if _OPTIONS["with-asan"] then
|
||||
buildoptions { "-fsanitize=address -g3 -fno-omit-frame-pointer" }
|
||||
linkoptions { "-fsanitize=address" }
|
||||
end
|
||||
|
||||
filter { "system:windows" }
|
||||
configurations { "Vanilla" }
|
||||
platforms {
|
||||
"win-x86-RW34_d3d8-mss",
|
||||
"win-x86-librw_d3d9-mss",
|
||||
"win-x86-librw_gl3_glfw-mss",
|
||||
"win-x86-RW34_d3d8-oal",
|
||||
"win-x86-librw_d3d9-oal",
|
||||
"win-x86-librw_gl3_glfw-oal",
|
||||
"win-amd64-librw_d3d9-oal",
|
||||
"win-amd64-librw_gl3_glfw-oal",
|
||||
}
|
||||
|
||||
filter { "system:linux" }
|
||||
platforms {
|
||||
"linux-x86-librw_gl3_glfw-oal",
|
||||
"linux-amd64-librw_gl3_glfw-oal",
|
||||
"linux-arm-librw_gl3_glfw-oal",
|
||||
"linux-arm64-librw_gl3_glfw-oal",
|
||||
}
|
||||
|
||||
filter { "system:bsd" }
|
||||
platforms {
|
||||
"bsd-x86-librw_gl3_glfw-oal",
|
||||
"bsd-amd64-librw_gl3_glfw-oal",
|
||||
"bsd-arm-librw_gl3_glfw-oal",
|
||||
"bsd-arm64-librw_gl3_glfw-oal"
|
||||
}
|
||||
|
||||
filter { "system:macosx" }
|
||||
platforms {
|
||||
"macosx-arm64-librw_gl3_glfw-oal",
|
||||
"macosx-amd64-librw_gl3_glfw-oal",
|
||||
}
|
||||
|
||||
filter "configurations:Debug"
|
||||
defines { "DEBUG" }
|
||||
|
||||
filter "configurations:not Debug"
|
||||
defines { "NDEBUG" }
|
||||
optimize "Speed"
|
||||
if(_OPTIONS["with-lto"]) then
|
||||
flags { "LinkTimeOptimization" }
|
||||
end
|
||||
|
||||
filter { "platforms:win*" }
|
||||
system "windows"
|
||||
|
||||
filter { "platforms:linux*" }
|
||||
system "linux"
|
||||
|
||||
filter { "platforms:bsd*" }
|
||||
system "bsd"
|
||||
|
||||
filter { "platforms:macosx*" }
|
||||
system "macosx"
|
||||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
|
||||
filter { "platforms:*amd64*" }
|
||||
architecture "amd64"
|
||||
|
||||
filter { "platforms:*arm*" }
|
||||
architecture "ARM"
|
||||
|
||||
filter { "platforms:macosx-arm64-*", "files:**.cpp"}
|
||||
buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" }
|
||||
|
||||
filter { "platforms:macosx-arm64-*", "files:**.c"}
|
||||
buildoptions { "-target", "arm64-apple-macos11" }
|
||||
|
||||
filter { "platforms:macosx-amd64-*", "files:**.cpp"}
|
||||
buildoptions { "-target", "x86_64-apple-macos10.12", "-std=gnu++14" }
|
||||
|
||||
filter { "platforms:macosx-amd64-*", "files:**.c"}
|
||||
buildoptions { "-target", "x86_64-apple-macos10.12" }
|
||||
|
||||
filter { "platforms:*librw_d3d9*" }
|
||||
defines { "RW_D3D9" }
|
||||
if(not _OPTIONS["with-librw"]) then
|
||||
libdirs { path.join(Librw, "lib/win-%{getarch(cfg.architecture)}-d3d9/%{cfg.buildcfg}") }
|
||||
end
|
||||
|
||||
filter "platforms:*librw_gl3_glfw*"
|
||||
defines { "RW_GL3" }
|
||||
if(not _OPTIONS["with-librw"]) then
|
||||
libdirs { path.join(Librw, "lib/%{getsys(cfg.system)}-%{getarch(cfg.architecture)}-gl3/%{cfg.buildcfg}") }
|
||||
end
|
||||
|
||||
filter "platforms:*x86-librw_gl3_glfw*"
|
||||
includedirs { path.join(_OPTIONS["glfwdir32"], "include") }
|
||||
|
||||
filter "platforms:*amd64-librw_gl3_glfw*"
|
||||
includedirs { path.join(_OPTIONS["glfwdir64"], "include") }
|
||||
|
||||
filter {}
|
||||
|
||||
function setpaths (gamepath, exepath)
|
||||
if (gamepath) then
|
||||
postbuildcommands {
|
||||
'{COPYFILE} "%{cfg.buildtarget.abspath}" "' .. gamepath .. '%{cfg.buildtarget.name}"'
|
||||
}
|
||||
debugdir (gamepath)
|
||||
if (exepath) then
|
||||
-- Used VS variable $(TargetFileName) because it doesn't accept premake tokens. Does debugcommand even work outside VS??
|
||||
debugcommand (gamepath .. "$(TargetFileName)")
|
||||
dir, file = exepath:match'(.*/)(.*)'
|
||||
debugdir (gamepath .. (dir or ""))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
project "librw"
|
||||
kind "StaticLib"
|
||||
targetname "rw"
|
||||
targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}"))
|
||||
files { path.join(Librw, "src/*.*") }
|
||||
files { path.join(Librw, "src/*/*.*") }
|
||||
files { path.join(Librw, "src/gl/*/*.*") }
|
||||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
|
||||
filter { "platforms:*amd64*" }
|
||||
architecture "amd64"
|
||||
|
||||
filter "platforms:win*"
|
||||
defines { "_CRT_SECURE_NO_WARNINGS", "_CRT_NONSTDC_NO_DEPRECATE" }
|
||||
staticruntime "on"
|
||||
buildoptions { "/Zc:sizedDealloc-" }
|
||||
|
||||
filter "platforms:bsd*"
|
||||
includedirs { "/usr/local/include" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
-- Support MacPorts and Homebrew
|
||||
filter "platforms:macosx-arm64-*"
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/opt/homebrew/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/opt/homebrew/lib" }
|
||||
|
||||
filter "platforms:macosx-amd64-*"
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/usr/local/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
filter "platforms:*gl3_glfw*"
|
||||
staticruntime "off"
|
||||
|
||||
filter "platforms:*RW34*"
|
||||
flags { "ExcludeFromBuild" }
|
||||
filter {}
|
||||
end
|
||||
|
||||
local function addSrcFiles( prefix )
|
||||
return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc"
|
||||
end
|
||||
|
||||
project "reLCS"
|
||||
kind "WindowedApp"
|
||||
targetname "reLCS"
|
||||
targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}"
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
dependson "librw"
|
||||
end
|
||||
|
||||
files { addSrcFiles("src") }
|
||||
files { addSrcFiles("src/animation") }
|
||||
files { addSrcFiles("src/audio") }
|
||||
files { addSrcFiles("src/audio/eax") }
|
||||
files { addSrcFiles("src/audio/oal") }
|
||||
files { addSrcFiles("src/buildings") }
|
||||
files { addSrcFiles("src/collision") }
|
||||
files { addSrcFiles("src/control") }
|
||||
files { addSrcFiles("src/core") }
|
||||
files { addSrcFiles("src/entities") }
|
||||
files { addSrcFiles("src/leeds") }
|
||||
files { addSrcFiles("src/leeds/base") }
|
||||
files { addSrcFiles("src/math") }
|
||||
files { addSrcFiles("src/modelinfo") }
|
||||
files { addSrcFiles("src/objects") }
|
||||
files { addSrcFiles("src/peds") }
|
||||
files { addSrcFiles("src/renderer") }
|
||||
files { addSrcFiles("src/rw") }
|
||||
files { addSrcFiles("src/save") }
|
||||
files { addSrcFiles("src/skel") }
|
||||
files { addSrcFiles("src/skel/glfw") }
|
||||
files { addSrcFiles("src/text") }
|
||||
files { addSrcFiles("src/vehicles") }
|
||||
files { addSrcFiles("src/weapons") }
|
||||
files { addSrcFiles("src/extras") }
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
files { "src/extras/GitSHA1.cpp" } -- this won't be in repo in first build
|
||||
else
|
||||
removefiles { "src/extras/GitSHA1.cpp" } -- but it will be everytime after
|
||||
end
|
||||
|
||||
includedirs { "src" }
|
||||
includedirs { "src/animation" }
|
||||
includedirs { "src/audio" }
|
||||
includedirs { "src/audio/eax" }
|
||||
includedirs { "src/audio/oal" }
|
||||
includedirs { "src/buildings" }
|
||||
includedirs { "src/collision" }
|
||||
includedirs { "src/control" }
|
||||
includedirs { "src/core" }
|
||||
includedirs { "src/entities" }
|
||||
includedirs { "src/leeds" }
|
||||
includedirs { "src/leeds/base" }
|
||||
includedirs { "src/math" }
|
||||
includedirs { "src/modelinfo" }
|
||||
includedirs { "src/objects" }
|
||||
includedirs { "src/peds" }
|
||||
includedirs { "src/renderer" }
|
||||
includedirs { "src/rw" }
|
||||
includedirs { "src/save/" }
|
||||
includedirs { "src/skel/" }
|
||||
includedirs { "src/skel/glfw" }
|
||||
includedirs { "src/text" }
|
||||
includedirs { "src/vehicles" }
|
||||
includedirs { "src/weapons" }
|
||||
includedirs { "src/extras" }
|
||||
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
defines { "USE_OUR_VERSIONING" }
|
||||
end
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
includedirs { "vendor/ogg/include" }
|
||||
includedirs { "vendor/opus/include" }
|
||||
includedirs { "vendor/opusfile/include" }
|
||||
end
|
||||
|
||||
filter "configurations:Vanilla"
|
||||
defines { "VANILLA_DEFINES" }
|
||||
|
||||
filter "platforms:*mss"
|
||||
defines { "AUDIO_MSS" }
|
||||
includedirs { "vendor/milessdk/include" }
|
||||
libdirs { "vendor/milessdk/lib" }
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
filter "platforms:win*"
|
||||
libdirs { "vendor/ogg/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "vendor/opus/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "vendor/opusfile/win32/VS2015/Win32/Release-NoHTTP" }
|
||||
filter {}
|
||||
defines { "AUDIO_OPUS" }
|
||||
end
|
||||
|
||||
filter "platforms:*oal"
|
||||
defines { "AUDIO_OAL" }
|
||||
|
||||
filter {}
|
||||
if(os.getenv("GTA_LCS_RE_DIR")) then
|
||||
setpaths(os.getenv("GTA_LCS_RE_DIR") .. "/", "%(cfg.buildtarget.name)")
|
||||
end
|
||||
|
||||
filter "platforms:win*"
|
||||
files { addSrcFiles("src/skel/win") }
|
||||
includedirs { "src/skel/win" }
|
||||
buildoptions { "/Zc:sizedDealloc-" }
|
||||
linkoptions "/SAFESEH:NO"
|
||||
characterset ("MBCS")
|
||||
targetextension ".exe"
|
||||
if(_OPTIONS["no-full-paths"]) then
|
||||
usefullpaths "off"
|
||||
linkoptions "/PDBALTPATH:%_PDB%"
|
||||
end
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
-- external librw is dynamic
|
||||
staticruntime "on"
|
||||
end
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
prebuildcommands { '"%{prj.location}..\\printHash.bat" "%{prj.location}..\\src\\extras\\GitSHA1.cpp"' }
|
||||
end
|
||||
|
||||
filter "platforms:not win*"
|
||||
if(not _OPTIONS["no-git-hash"]) then
|
||||
prebuildcommands { '"%{prj.location}/../printHash.sh" "%{prj.location}/../src/extras/GitSHA1.cpp"' }
|
||||
end
|
||||
|
||||
filter "platforms:win*glfw*"
|
||||
staticruntime "off"
|
||||
|
||||
filter "platforms:*glfw*"
|
||||
premake.modules.autoconf.parameters = "-lglfw -lX11"
|
||||
autoconfigure {
|
||||
-- iterates all configs and runs on them
|
||||
["dontWrite"] = function (cfg)
|
||||
check_symbol_exists(cfg, "haveX11", "glfwGetX11Display", { "X11/Xlib.h", "X11/XKBlib.h", "GLFW/glfw3.h", "GLFW/glfw3native.h" }, "GLFW_EXPOSE_NATIVE_X11")
|
||||
if cfg.autoconf["haveX11"] ~= nil and cfg.autoconf["haveX11"] == 1 then
|
||||
table.insert(cfg.links, "X11")
|
||||
table.insert(cfg.defines, "GET_KEYBOARD_INPUT_FROM_X11")
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
filter "platforms:win*oal"
|
||||
includedirs { "vendor/openal-soft/include" }
|
||||
includedirs { "vendor/libsndfile/include" }
|
||||
includedirs { "vendor/mpg123/include" }
|
||||
|
||||
filter "platforms:win-x86*oal"
|
||||
libdirs { "vendor/mpg123/lib/Win32" }
|
||||
libdirs { "vendor/libsndfile/lib/Win32" }
|
||||
libdirs { "vendor/openal-soft/libs/Win32" }
|
||||
|
||||
filter "platforms:win-amd64*oal"
|
||||
libdirs { "vendor/mpg123/lib/Win64" }
|
||||
libdirs { "vendor/libsndfile/lib/Win64" }
|
||||
libdirs { "vendor/openal-soft/libs/Win64" }
|
||||
|
||||
filter "platforms:linux*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
filter "platforms:bsd*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
filter "platforms:macosx*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
filter "platforms:macosx-arm64-*oal"
|
||||
includedirs { "/opt/homebrew/opt/openal-soft/include" }
|
||||
libdirs { "/opt/homebrew/opt/openal-soft/lib" }
|
||||
|
||||
filter "platforms:macosx-amd64-*oal"
|
||||
includedirs { "/usr/local/opt/openal-soft/include" }
|
||||
libdirs { "/usr/local/opt/openal-soft/lib" }
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
filter {}
|
||||
links { "libogg" }
|
||||
links { "opus" }
|
||||
links { "opusfile" }
|
||||
end
|
||||
|
||||
filter "platforms:*RW34*"
|
||||
includedirs { "sdk/rwsdk/include/d3d8" }
|
||||
libdirs { "sdk/rwsdk/lib/d3d8/release" }
|
||||
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtanim", "rtcharse", "rpanisot" }
|
||||
defines { "RWLIBS" }
|
||||
linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text"
|
||||
|
||||
filter "platforms:*librw*"
|
||||
defines { "LIBRW" }
|
||||
files { addSrcFiles("src/fakerw") }
|
||||
includedirs { "src/fakerw" }
|
||||
includedirs { Librw }
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
libdirs { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" }
|
||||
end
|
||||
links { "rw" }
|
||||
|
||||
filter "platforms:*d3d9*"
|
||||
defines { "USE_D3D9" }
|
||||
links { "d3d9" }
|
||||
|
||||
filter "platforms:*x86*d3d*"
|
||||
includedirs { "sdk/dx8sdk/include" }
|
||||
libdirs { "sdk/dx8sdk/lib" }
|
||||
|
||||
filter "platforms:win-x86*gl3_glfw*"
|
||||
libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
||||
links { "opengl32", "glfw3" }
|
||||
|
||||
filter "platforms:win-amd64*gl3_glfw*"
|
||||
libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
||||
links { "opengl32", "glfw3" }
|
||||
|
||||
filter "platforms:linux*gl3_glfw*"
|
||||
links { "GL", "glfw" }
|
||||
|
||||
filter "platforms:bsd*gl3_glfw*"
|
||||
links { "GL", "glfw", "sysinfo" }
|
||||
includedirs { "/usr/local/include" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
filter "platforms:macosx-arm64-*gl3_glfw*"
|
||||
links { "glfw" }
|
||||
linkoptions { "-framework OpenGL" }
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/opt/homebrew/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/opt/homebrew/lib" }
|
||||
|
||||
filter "platforms:macosx-amd64-*gl3_glfw*"
|
||||
links { "glfw" }
|
||||
linkoptions { "-framework OpenGL" }
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs {"/usr/local/include" }
|
||||
libdirs { "/opt/local/lib" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
@@ -112,6 +112,8 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang
|
||||
if (NOT LIBRW_PLATFORM_PS2)
|
||||
target_compile_options(${EXECUTABLE}
|
||||
PRIVATE
|
||||
-fpermissive # for CVECTORHACK
|
||||
-Wno-address-of-temporary # for CVECTORHACK
|
||||
-Wextra
|
||||
-Wdouble-promotion
|
||||
-Wpedantic
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "RpAnimBlend.h"
|
||||
#include "AnimBlendAssociation.h"
|
||||
#include "AnimBlendAssocGroup.h"
|
||||
#include "KeyGen.h"
|
||||
|
||||
CAnimBlendAssocGroup::CAnimBlendAssocGroup(void)
|
||||
{
|
||||
@@ -111,27 +112,34 @@ strcmpIgnoringDigits(const char *s1, const char *s2)
|
||||
}
|
||||
}
|
||||
|
||||
extern const char* csPlayerNames[];
|
||||
extern const char* playerNames[];
|
||||
|
||||
CBaseModelInfo*
|
||||
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;
|
||||
CBaseModelInfo* mi;
|
||||
if (CKeyGen::GetUppercaseKey(name) == CKeyGen::GetUppercaseKey("cstoni_a")) {
|
||||
i = 0;
|
||||
while (csPlayerNames[i][0] != '\0') {
|
||||
if (CModelInfo::GetModelInfo(0)->GetNameHashKey() == CKeyGen::GetUppercaseKey(playerNames[i])) {
|
||||
name = csPlayerNames[i];
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < MODELINFOSIZE; i++){
|
||||
uint32 hashKey = CKeyGen::GetUppercaseKey(name);
|
||||
for (i = 0; i < CModelInfo::GetNumModelInfos(); i++) {
|
||||
mi = CModelInfo::GetModelInfo(i);
|
||||
if(mi && mi->GetRwObject() && RwObjectGetType(mi->GetRwObject()) == rpCLUMP &&
|
||||
strcmpIgnoringDigits(mi->GetModelName(), name))
|
||||
if (mi && mi->GetRwObject()
|
||||
&& RwObjectGetType(mi->GetRwObject()) == rpCLUMP &&
|
||||
hashKey == mi->GetNameHashKey())
|
||||
return mi;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
@@ -185,3 +193,45 @@ CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump,
|
||||
}
|
||||
numAssociations = numAssocs;
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendAssocGroup::CreateAssociations(const char *blockName, const char *animNames, const char *objectNames, int numChars)
|
||||
{
|
||||
if (!objectNames) {
|
||||
CreateAssociations(blockName);
|
||||
return;
|
||||
}
|
||||
|
||||
if (assocList)
|
||||
DestroyAssociations();
|
||||
|
||||
animBlock = CAnimManager::GetAnimationBlock(blockName);
|
||||
assocList = new CAnimBlendAssociation[animBlock->numAnims];
|
||||
|
||||
numAssociations = 0;
|
||||
if (animBlock->numAnims > 0)
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < animBlock->numAnims; i++) {
|
||||
int animId = -1;
|
||||
for (j = 0; j != animBlock->numAnims; j++)
|
||||
if (strcmp(CAnimManager::GetAnimation(i + animBlock->firstIndex)->name, animNames + numChars * j) == 0)
|
||||
animId = j;
|
||||
|
||||
if (animId != -1) {
|
||||
CBaseModelInfo* minfo = GetModelFromName(objectNames + numChars * animId);
|
||||
if (minfo)
|
||||
{
|
||||
RpClump* clump = (RpClump*)minfo->CreateInstance();
|
||||
RpAnimBlendClumpInit(clump);
|
||||
assocList[numAssociations].Init(clump, CAnimManager::GetAnimation(i + animBlock->firstIndex));
|
||||
if (IsClumpSkinned(clump))
|
||||
RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil);
|
||||
RpClumpDestroy(clump);
|
||||
assocList[numAssociations].animId = i + numAssociations;
|
||||
assocList[numAssociations++].groupId = groupId;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,4 +21,5 @@ public:
|
||||
CAnimBlendAssociation *CopyAnimation(const char *name);
|
||||
void CreateAssociations(const char *name);
|
||||
void CreateAssociations(const char *blockName, RpClump *clump, const char **animNames, int numAssocs);
|
||||
void CreateAssociations(const char *blockName, const char *animNames, const char *objectNames, int numChars);
|
||||
};
|
||||
|
||||
@@ -230,3 +230,9 @@ CAnimBlendAssociation::UpdateBlend(float timeDelta)
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendAssociation::Remove()
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
|
||||
@@ -81,6 +81,7 @@ public:
|
||||
void UpdateTimeStep(float timeDelta, float relSpeed);
|
||||
bool UpdateTime(float timeDelta, float relSpeed);
|
||||
bool UpdateBlend(float timeDelta);
|
||||
void Remove();
|
||||
|
||||
void SetRun(void) { flags |= ASSOC_RUNNING; }
|
||||
|
||||
|
||||
+568
-368
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,7 @@ enum AssocGroupId
|
||||
ASSOCGRP_SNIPER,
|
||||
ASSOCGRP_THROW,
|
||||
ASSOCGRP_FLAMETHROWER,
|
||||
ASSOCGRP_ROCKETLAUNCHER,
|
||||
ASSOCGRP_MEDIC,
|
||||
ASSOCGRP_SUNBATHE,
|
||||
ASSOCGRP_PLAYER_IDLE,
|
||||
@@ -40,6 +41,7 @@ enum AssocGroupId
|
||||
ASSOCGRP_PLAYER1ARMED,
|
||||
ASSOCGRP_PLAYER2ARMED,
|
||||
ASSOCGRP_PLAYERBBBAT,
|
||||
ASSOCGRP_AICHAINSAW,
|
||||
ASSOCGRP_PLAYERCHAINSAW,
|
||||
ASSOCGRP_SHUFFLE,
|
||||
ASSOCGRP_OLD,
|
||||
@@ -64,11 +66,33 @@ enum AssocGroupId
|
||||
ASSOCGRP_ROCKETBACK,
|
||||
ASSOCGRP_ROCKETLEFT,
|
||||
ASSOCGRP_ROCKETRIGHT,
|
||||
ASSOCGRP_CHAINSAWBACK,
|
||||
ASSOCGRP_CHAINSAWLEFT,
|
||||
ASSOCGRP_CHAINSAWRIGHT,
|
||||
#endif
|
||||
|
||||
ASSOCGRP_MPNOTE,
|
||||
ASSOCGRP_CSMISC,
|
||||
ASSOCGRP_DONH2,
|
||||
ASSOCGRP_DONH3,
|
||||
ASSOCGRP_JDT2,
|
||||
ASSOCGRP_JDT4,
|
||||
ASSOCGRP_JDT5,
|
||||
ASSOCGRP_JDT6,
|
||||
ASSOCGRP_MAR1,
|
||||
ASSOCGRP_MAR2,
|
||||
ASSOCGRP_MAR3,
|
||||
ASSOCGRP_SAL1,
|
||||
ASSOCGRP_SAL2,
|
||||
ASSOCGRP_SAL3,
|
||||
ASSOCGRP_SAL4,
|
||||
ASSOCGRP_SAL6,
|
||||
ASSOCGRP_SAL7,
|
||||
ASSOCGRP_VIC2,
|
||||
ASSOCGRP_VIC3,
|
||||
ASSOCGRP_VIC4,
|
||||
ASSOCGRP_VIC6,
|
||||
ASSOCGRP_TOURIST,
|
||||
ASSOCGRP_MAC2,
|
||||
ASSOCGRP_VIC7,
|
||||
|
||||
NUM_ANIM_ASSOC_GROUPS
|
||||
};
|
||||
|
||||
|
||||
+74
-29
@@ -40,42 +40,25 @@ enum AnimationId
|
||||
ANIM_STD_HIT_BACK,
|
||||
ANIM_STD_HIT_RIGHT,
|
||||
ANIM_STD_HIT_FLOOR,
|
||||
|
||||
/* names made up */
|
||||
ANIM_STD_HIT_BODYBLOW,
|
||||
ANIM_STD_HIT_CHEST,
|
||||
ANIM_STD_HIT_HEAD,
|
||||
ANIM_STD_HIT_WALK,
|
||||
/**/
|
||||
|
||||
ANIM_STD_HIT_WALL,
|
||||
ANIM_STD_HIT_FLOOR_FRONT,
|
||||
ANIM_STD_HIT_BEHIND,
|
||||
ANIM_STD_FIGHT_IDLE,
|
||||
ANIM_STD_FIGHT_2IDLE,
|
||||
ANIM_STD_FIGHT_SHUFFLE_F,
|
||||
|
||||
/* names made up */
|
||||
ANIM_STD_FIGHT_BODYBLOW,
|
||||
ANIM_STD_FIGHT_HEAD,
|
||||
ANIM_STD_FIGHT_KICK,
|
||||
ANIM_STD_FIGHT_KNEE,
|
||||
ANIM_STD_FIGHT_LHOOK,
|
||||
ANIM_STD_FIGHT_PUNCH,
|
||||
ANIM_STD_FIGHT_ROUNDHOUSE,
|
||||
ANIM_STD_FIGHT_LONGKICK,
|
||||
/**/
|
||||
|
||||
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_FIGHT_ATTACK_A1,
|
||||
ANIM_FIGHT_ATTACK_A2,
|
||||
ANIM_FIGHT_ATTACK_A3,
|
||||
ANIM_FIGHT_ATTACK_B1,
|
||||
ANIM_FIGHT_ATTACK_B2,
|
||||
ANIM_FIGHT_ATTACK_B3,
|
||||
ANIM_FIGHT_HIT_A1,
|
||||
ANIM_FIGHT_HIT_A2,
|
||||
ANIM_FIGHT_HIT_A3,
|
||||
ANIM_FIGHT_HIT_B1,
|
||||
ANIM_FIGHT_HIT_B2,
|
||||
ANIM_FIGHT_HIT_B3,
|
||||
ANIM_STD_DETONATE,
|
||||
ANIM_STD_PUNCH,
|
||||
ANIM_STD_PARTIALPUNCH,
|
||||
@@ -174,6 +157,7 @@ enum AnimationId
|
||||
|
||||
ANIM_STD_EVADE_STEP,
|
||||
ANIM_STD_EVADE_DIVE,
|
||||
ANIM_STD_COMMANDO_ROLL,
|
||||
ANIM_STD_XPRESS_SCRATCH,
|
||||
ANIM_STD_ROADCROSS,
|
||||
ANIM_STD_TURN180,
|
||||
@@ -284,4 +268,65 @@ enum AnimationId
|
||||
ANIM_STRIP_E,
|
||||
ANIM_STRIP_F,
|
||||
ANIM_STRIP_G,
|
||||
|
||||
|
||||
ANIM_MULTIPLAYER_CUTSCENE_MPNOTE,
|
||||
ANIM_MULTIPLAYER_CUTSCENE_MPNOTE_LOOP,
|
||||
|
||||
ANIM_CS_MISC_IDLE_LOOK,
|
||||
ANIM_CS_MISC_IDLE_NO,
|
||||
ANIM_CS_MISC_IDLE_YES,
|
||||
ANIM_CS_MISC_IDLE_CHAT2,
|
||||
ANIM_CS_MISC_IDLE_COUGH,
|
||||
ANIM_CS_MISC_IDLE_GIGGLE_FEMALE,
|
||||
ANIM_CS_MISC_IDLE_TOUGH_CHAT,
|
||||
ANIM_CS_MISC_IDLE_CELL_TALK,
|
||||
|
||||
ANIM_DONH2_CAMERA,
|
||||
ANIM_DONH3_HAPPY,
|
||||
|
||||
ANIM_JDT2_ANXIOUS_TALK,
|
||||
ANIM_JDT2_SHRUG,
|
||||
ANIM_JDT4_DILDO_TALK,
|
||||
ANIM_JDT5_CALM_DOWN,
|
||||
ANIM_JDT5_POINT,
|
||||
ANIM_JDT6_PICKUP,
|
||||
ANIM_JDT6_KNOCK,
|
||||
|
||||
ANIM_MAR1_SKIRT,
|
||||
ANIM_MAR2_CELL_ANSWER,
|
||||
ANIM_MAR2_CELL_END,
|
||||
ANIM_MAR2_CELL_TALK,
|
||||
ANIM_MAR2_FOOT_TAP,
|
||||
ANIM_MAR3_HOOCHY,
|
||||
ANIM_MAR3_NOTE_IDLE,
|
||||
ANIM_MAR3_NOTE_PICKUP,
|
||||
|
||||
ANIM_SAL1_BIREFCASE_DOWN,
|
||||
ANIM_SAL2_IDLE_SEATED,
|
||||
ANIM_SAL2_SEAT_TO_STAND,
|
||||
ANIM_SAL3_SEATED_TALK,
|
||||
ANIM_SAL3_SEATED_IDLE,
|
||||
ANIM_SAL3_SIT_DOWN,
|
||||
ANIM_SAL4_DUST_DOWN,
|
||||
ANIM_SAL4_GIRL_RUN,
|
||||
ANIM_SAL6_ANGRY_SEATED,
|
||||
ANIM_SAL6_IDLE_SEATED,
|
||||
ANIM_SAL7_LOOKOUT,
|
||||
|
||||
ANIM_VIC2_POINT_ANGRY,
|
||||
ANIM_VIC3_WAFT,
|
||||
ANIM_VIC3_PICKUP_ROLL,
|
||||
ANIM_VIC4_CARRY_BOX,
|
||||
ANIM_VIC4_CELL_LOOK,
|
||||
ANIM_VIC4_CRATE_IDLE,
|
||||
ANIM_VIC6_CELL_ANGRY,
|
||||
|
||||
ANIM_TOURIST3,
|
||||
ANIM_TOURIST2,
|
||||
ANIM_TOURIST1,
|
||||
|
||||
ANIM_MAC2_PLEAD,
|
||||
|
||||
ANIM_VIC7_PROD_WITH_FOOT
|
||||
};
|
||||
+115
-561
@@ -22,154 +22,54 @@
|
||||
#include "ColStore.h"
|
||||
#include "Radar.h"
|
||||
#include "Pools.h"
|
||||
#include "crossplatform.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 }
|
||||
};
|
||||
static bool bModelsRemovedForCutscene;
|
||||
static int32 NumberOfSavedWeapons;
|
||||
static eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS];
|
||||
static int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS];
|
||||
|
||||
int
|
||||
FindCutsceneAudioTrackId(const char *szCutsceneName)
|
||||
{
|
||||
for (int i = 0; musicNameIdAssoc[i].szTrackName; i++) {
|
||||
if (!CGeneral::faststricmp(musicNameIdAssoc[i].szTrackName, szCutsceneName))
|
||||
return musicNameIdAssoc[i].iTrackId;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool CCutsceneMgr::ms_running;
|
||||
bool CCutsceneMgr::ms_cutsceneProcessing;
|
||||
char CCutsceneMgr::ms_cAppendAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
||||
char CCutsceneMgr::ms_cAppendObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
||||
int CCutsceneMgr::ms_numAppendObjectNames;
|
||||
CDirectory *CCutsceneMgr::ms_pCutsceneDir;
|
||||
CCutsceneObject *CCutsceneMgr::ms_pCutsceneObjects[NUMCUTSCENEOBJECTS];
|
||||
int32 CCutsceneMgr::ms_numCutsceneObjs;
|
||||
bool CCutsceneMgr::ms_loaded;
|
||||
bool CCutsceneMgr::ms_animLoaded;
|
||||
bool CCutsceneMgr::ms_useLodMultiplier;
|
||||
char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE];
|
||||
CAnimBlendAssocGroup CCutsceneMgr::ms_cutsceneAssociations;
|
||||
CVector CCutsceneMgr::ms_cutsceneOffset;
|
||||
float CCutsceneMgr::ms_cutsceneTimer;
|
||||
bool CCutsceneMgr::ms_hasFileInfo;
|
||||
bool CCutsceneMgr::ms_wasCutsceneSkipped;
|
||||
bool CCutsceneMgr::ms_useLodMultiplier;
|
||||
bool CCutsceneMgr::ms_cutsceneProcessing;
|
||||
bool CCutsceneMgr::ms_running;
|
||||
bool CCutsceneMgr::ms_animLoaded;
|
||||
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)
|
||||
{
|
||||
float radius = RpAtomicGetBoundingSphere(atomic)->radius;
|
||||
RwV3d center = RpAtomicGetBoundingSphere(atomic)->center;
|
||||
|
||||
for (RwFrame *frame = RpAtomicGetFrame(atomic); RwFrameGetParent(frame); frame = RwFrameGetParent(frame))
|
||||
RwV3dTransformPoints(¢er, ¢er, 1, RwFrameGetMatrix(frame));
|
||||
|
||||
float size = RwV3dLength(¢er) + radius;
|
||||
if (size > *(float *)data)
|
||||
*(float *)data = size;
|
||||
return atomic;
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::Initialise(void)
|
||||
CCutsceneMgr::Initialise(void *dir)
|
||||
{
|
||||
ms_numCutsceneObjs = 0;
|
||||
ms_loaded = false;
|
||||
ms_wasCutsceneSkipped = false;
|
||||
ms_cutsceneLoadStatus = CUTSCENE_NOT_LOADED;
|
||||
ms_running = false;
|
||||
ms_useLodMultiplier = false;
|
||||
ms_animLoaded = false;
|
||||
ms_cutsceneProcessing = false;
|
||||
ms_useLodMultiplier = false;
|
||||
ms_wasCutsceneSkipped = false;
|
||||
ms_hasFileInfo = false;
|
||||
//ms_numCutsceneObjs = 0;
|
||||
//ms_loaded = false;
|
||||
if (gMakeResources) {
|
||||
ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE);
|
||||
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
|
||||
}
|
||||
else
|
||||
ms_pCutsceneDir = (CDirectory*)dir;
|
||||
|
||||
ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE);
|
||||
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
|
||||
//numUncompressedAnims = 0;
|
||||
//uncompressedAnims[0][0] = '\0';
|
||||
}
|
||||
|
||||
numUncompressedAnims = 0;
|
||||
uncompressedAnims[0][0] = '\0';
|
||||
void CCutsceneMgr::Write(base::cRelocatableChunkWriter& writer)
|
||||
{
|
||||
writer.AllocateRaw(ms_pCutsceneDir, sizeof(*ms_pCutsceneDir), 4, false, true);
|
||||
writer.AllocateRaw(ms_pCutsceneDir->entries, sizeof(CDirectory::DirectoryInfo) * ms_pCutsceneDir->numEntries, 4, false, true);
|
||||
writer.AddPatch(ms_pCutsceneDir);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -181,431 +81,25 @@ CCutsceneMgr::Shutdown(void)
|
||||
void
|
||||
CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
|
||||
{
|
||||
int file;
|
||||
uint32 size;
|
||||
uint32 offset;
|
||||
CPlayerPed *pPlayerPed;
|
||||
|
||||
ms_cutsceneProcessing = true;
|
||||
ms_wasCutsceneSkipped = false;
|
||||
CTimer::Suspend();
|
||||
if (!bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver)
|
||||
CStreaming::RemoveCurrentZonesModels();
|
||||
|
||||
ms_pCutsceneDir->numEntries = 0;
|
||||
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
|
||||
|
||||
CStreaming::RemoveUnusedModelsInLoadedList();
|
||||
CGame::DrasticTidyUpMemory(true);
|
||||
|
||||
strcpy(ms_cutsceneName, szCutsceneName);
|
||||
|
||||
RwStream *stream;
|
||||
stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG");
|
||||
assert(stream);
|
||||
|
||||
// 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);
|
||||
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")) {
|
||||
DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE);
|
||||
int trackId = FindCutsceneAudioTrackId(szCutsceneName);
|
||||
if (trackId != -1) {
|
||||
printf("Start preload audio %s\n", szCutsceneName);
|
||||
DMAudio.PreloadCutSceneMusic(trackId);
|
||||
printf("End preload audio %s\n", szCutsceneName);
|
||||
}
|
||||
}
|
||||
|
||||
ms_cutsceneTimer = 0.0f;
|
||||
ms_loaded = true;
|
||||
ms_cutsceneOffset = CVector(0.0f, 0.0f, 0.0f);
|
||||
|
||||
pPlayerPed = FindPlayerPed();
|
||||
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::FinishCutscene()
|
||||
{
|
||||
ms_wasCutsceneSkipped = true;
|
||||
if (bCamLoaded) {
|
||||
CCutsceneMgr::ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f;
|
||||
TheCamera.FinishCutscene();
|
||||
}
|
||||
|
||||
FindPlayerPed()->bIsVisible = true;
|
||||
CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false);
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::SetupCutsceneToStart(void)
|
||||
{
|
||||
if (bCamLoaded) {
|
||||
TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset);
|
||||
TheCamera.TakeControlWithSpline(JUMP_CUT);
|
||||
TheCamera.SetWideScreenOn();
|
||||
}
|
||||
|
||||
ms_cutsceneOffset.z++;
|
||||
|
||||
for (int i = ms_numCutsceneObjs - 1; i >= 0; i--) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
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();
|
||||
CTimer::Update();
|
||||
ms_running = true;
|
||||
ms_cutsceneTimer = 0.0f;
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject)
|
||||
{
|
||||
CAnimBlendAssociation *pNewAnim;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
CCutsceneObject *
|
||||
CCutsceneMgr::CreateCutsceneObject(int modelId)
|
||||
{
|
||||
CBaseModelInfo *pModelInfo;
|
||||
CColModel *pColModel;
|
||||
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];
|
||||
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;
|
||||
pColModel->boundingSphere.radius = radius;
|
||||
pColModel->boundingBox.min = CVector(-radius, -radius, -radius);
|
||||
pColModel->boundingBox.max = CVector(radius, radius, radius);
|
||||
}
|
||||
|
||||
pCutsceneObject = new CCutsceneObject();
|
||||
pCutsceneObject->SetModelIndex(modelId);
|
||||
if (ms_useCutsceneShadows)
|
||||
pCutsceneObject->CreateShadow();
|
||||
ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject;
|
||||
CStreaming::IHaveUsedStreamingMemory();
|
||||
return pCutsceneObject;
|
||||
LoadCutsceneData_overlay(szCutsceneName);
|
||||
}
|
||||
|
||||
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]);
|
||||
ms_pCutsceneObjects[ms_numCutsceneObjs]->DeleteRwObject();
|
||||
delete ms_pCutsceneObjects[ms_numCutsceneObjs];
|
||||
ms_pCutsceneObjects[ms_numCutsceneObjs] = nil;
|
||||
}
|
||||
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();
|
||||
}
|
||||
ms_running = false;
|
||||
ms_loaded = false;
|
||||
|
||||
FindPlayerPed()->bIsVisible = true;
|
||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CUTSCENE);
|
||||
CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false);
|
||||
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "finale")) {
|
||||
DMAudio.StopCutSceneMusic();
|
||||
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();
|
||||
DeleteCutsceneData_overlay();
|
||||
if (bModelsRemovedForCutscene)
|
||||
LoadEverythingBecauseCutsceneDeletedAllOfIt();
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::Update(void)
|
||||
CCutsceneMgr::RemoveEverythingBecauseCutsceneDoesntFitInMemory()
|
||||
{
|
||||
enum {
|
||||
CUTSCENE_LOADING_0 = 0,
|
||||
CUTSCENE_LOADING_AUDIO,
|
||||
CUTSCENE_LOADING_2,
|
||||
CUTSCENE_LOADING_3,
|
||||
CUTSCENE_LOADING_4
|
||||
};
|
||||
|
||||
switch (ms_cutsceneLoadStatus) {
|
||||
case CUTSCENE_LOADING_AUDIO:
|
||||
SetupCutsceneToStart();
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "finale"))
|
||||
DMAudio.PlayPreloadedCutSceneMusic();
|
||||
ms_cutsceneLoadStatus++;
|
||||
break;
|
||||
case CUTSCENE_LOADING_2:
|
||||
case CUTSCENE_LOADING_3:
|
||||
ms_cutsceneLoadStatus++;
|
||||
break;
|
||||
case CUTSCENE_LOADING_4:
|
||||
ms_cutsceneLoadStatus = CUTSCENE_LOADING_0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver()
|
||||
{
|
||||
CStreaming::ms_disableStreaming = true;
|
||||
//CStreaming::ms_disableStreaming = true;
|
||||
CWorld::ClearExcitingStuffFromArea(FindPlayerCoors(), 120.0f, true);
|
||||
CColStore::RemoveAllCollision();
|
||||
CWorld::bProcessCutsceneOnly = true;
|
||||
ms_cutsceneProcessing = true;
|
||||
/*ms_cutsceneProcessing = true;
|
||||
|
||||
for (int i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) {
|
||||
CPed *pPed = CPools::GetPedPool()->GetSlot(i);
|
||||
@@ -626,25 +120,21 @@ CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true;
|
||||
CWorld::bProcessCutsceneOnly = true;
|
||||
//bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true;*/
|
||||
CStreaming::RemoveCurrentZonesModels();
|
||||
while (CStreaming::RemoveLoadedVehicle());
|
||||
CRadar::RemoveRadarSections();
|
||||
CStreaming::SetModelIsDeletable(MI_MALE01);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_MALE01);
|
||||
CStreaming::SetModelIsDeletable(MI_TAXI_D);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_TAXI_D);
|
||||
CStreaming::SetModelIsDeletable(MI_COLT45);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_COLT45);
|
||||
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--) {
|
||||
/*for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) {
|
||||
CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i);
|
||||
if (pDummy)
|
||||
pDummy->DeleteRwObject();
|
||||
@@ -664,7 +154,7 @@ CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver()
|
||||
if (!pBuilding->bImBeingRendered)
|
||||
pBuilding->DeleteRwObject();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
CPlayerPed *pPlayerPed = FindPlayerPed();
|
||||
pPlayerPed->RemoveWeaponAnims(0, -1000.0f);
|
||||
@@ -679,5 +169,69 @@ CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver()
|
||||
}
|
||||
|
||||
pPlayerPed->ClearWeapons();
|
||||
CGame::DrasticTidyUpMemory(true);
|
||||
bModelsRemovedForCutscene = true;
|
||||
//CGame::DrasticTidyUpMemory(true);
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::LoadEverythingBecauseCutsceneDeletedAllOfIt()
|
||||
{
|
||||
bModelsRemovedForCutscene = false;
|
||||
CStreaming::LoadInitialPeds();
|
||||
CStreaming::LoadInitialWeapons();
|
||||
//CStreaming::LoadInitialVehicles();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::Update(void)
|
||||
{
|
||||
if (ms_cutsceneLoadStatus != CUTSCENE_NOT_LOADED)
|
||||
Update_overlay();
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::LoadAnimationUncompressed(char const* name)
|
||||
{
|
||||
strcpy(ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims], name);
|
||||
|
||||
// Because that's how CAnimManager knows the end of array
|
||||
++ms_numUncompressedCutsceneAnims;
|
||||
assert(ms_numUncompressedCutsceneAnims < ARRAY_SIZE(ms_aUncompressedCutsceneAnims));
|
||||
ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims][0] = '\0';
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
CCutsceneMgr::IsCutsceneSkipButtonBeingPressed()
|
||||
{
|
||||
return (CPad::GetPad(0)->GetCrossJustDown()
|
||||
|| CPad::GetPad(0)->GetLeftMouseJustDown()
|
||||
|| CPad::GetPad(0)->GetEnterJustDown()
|
||||
|| CPad::GetPad(0)->GetCharJustDown(' '));
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::AppendToNextCutscene(const char *object, const char *anim)
|
||||
{
|
||||
strcpy(ms_cAppendObjectName[ms_numAppendObjectNames], object);
|
||||
strlwr(ms_cAppendObjectName[ms_numAppendObjectNames]);
|
||||
strcpy(ms_cAppendAnimName[ms_numAppendObjectNames], anim);
|
||||
strlwr(ms_cAppendAnimName[ms_numAppendObjectNames]);
|
||||
ms_numAppendObjectNames++;
|
||||
}
|
||||
+123
-5
@@ -1,14 +1,69 @@
|
||||
#pragma once
|
||||
#include "CutsceneObject.h"
|
||||
|
||||
#define CUTSCENENAMESIZE 8
|
||||
|
||||
class CDirectory;
|
||||
class CAnimBlendAssocGroup;
|
||||
class CCutsceneHead;
|
||||
|
||||
enum {
|
||||
CUTSCENE_NOT_LOADED = 0,
|
||||
CUTSCENE_LOADING,
|
||||
CUTSCENE_LOADED,
|
||||
};
|
||||
|
||||
enum {
|
||||
CUTSCENE_PLAYING_0 = 0,
|
||||
CUTSCENE_STARTED,
|
||||
CUTSCENE_PLAYING_2,
|
||||
CUTSCENE_PLAYING_3,
|
||||
CUTSCENE_PLAYING_4,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
NAMELENGTH = 32,
|
||||
NUM_CUTS_PARTICLE_EFFECTS = 8,
|
||||
NUM_CUTS_MAX_TEXTS = 64,
|
||||
NUM_CUTS_UNCOMPRESSED_ANIMS = 8,
|
||||
TEXT_KEY_SIZE = 8,
|
||||
CUTSCENENAMESIZE = 8
|
||||
};
|
||||
|
||||
struct sToHideItem
|
||||
{
|
||||
float x, y, z;
|
||||
char name[NAMELENGTH];
|
||||
};
|
||||
|
||||
// TODO: figure out from SA
|
||||
// this is unused in LCS anyway
|
||||
struct sParticleEffect
|
||||
{
|
||||
char name[NAMELENGTH];
|
||||
bool bPlayed; // ??
|
||||
int iTime;
|
||||
int unk1;
|
||||
int unk2;
|
||||
char name2[NAMELENGTH];
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
float unkX;
|
||||
float unkY;
|
||||
float unkZ;
|
||||
bool unk10;
|
||||
bool unk11;
|
||||
};
|
||||
|
||||
struct sAttachInfo
|
||||
{
|
||||
int attachToId, objectId, boneId;
|
||||
};
|
||||
|
||||
class CCutsceneMgr
|
||||
{
|
||||
|
||||
static bool ms_running;
|
||||
static CCutsceneObject *ms_pCutsceneObjects[NUMCUTSCENEOBJECTS];
|
||||
|
||||
@@ -24,10 +79,55 @@ class CCutsceneMgr
|
||||
static bool ms_wasCutsceneSkipped;
|
||||
static bool ms_cutsceneProcessing;
|
||||
static bool ms_useCutsceneShadows;
|
||||
static bool ms_hasFileInfo;
|
||||
static int ms_numLoadObjectNames;
|
||||
|
||||
static char ms_cAppendAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
||||
static char ms_cAppendObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
||||
static int ms_numAppendObjectNames;
|
||||
public:
|
||||
static CDirectory *ms_pCutsceneDir;
|
||||
static uint32 ms_cutsceneLoadStatus;
|
||||
|
||||
static bool mCutsceneSkipFading;
|
||||
static int mCutsceneSkipFadeTime;
|
||||
|
||||
static float m_fPrevCarDensity;
|
||||
static float m_fPrevPedDensity;
|
||||
|
||||
static bool m_PrevExtraColourOn;
|
||||
static uint32 m_PrevExtraColour;
|
||||
|
||||
static uint32 ms_iNumParticleEffects;
|
||||
static sParticleEffect ms_pParticleEffects[NUM_CUTS_PARTICLE_EFFECTS];
|
||||
|
||||
static sToHideItem ms_crToHideItems[NUMCUTSCENEOBJECTS];
|
||||
static uint32 ms_iNumHiddenEntities;
|
||||
static CEntity *ms_pHiddenEntities[NUMCUTSCENEOBJECTS];
|
||||
|
||||
static int ms_numAttachObjectToBones;
|
||||
static bool ms_bRepeatObject[NUMCUTSCENEOBJECTS];
|
||||
|
||||
static sAttachInfo ms_iAttachObjectToBone[NUMCUTSCENEOBJECTS];
|
||||
|
||||
static uint32 ms_numUncompressedCutsceneAnims;
|
||||
|
||||
static char ms_aUncompressedCutsceneAnims[NUM_CUTS_UNCOMPRESSED_ANIMS][NAMELENGTH];
|
||||
|
||||
static uint32 ms_iTextDuration[NUM_CUTS_MAX_TEXTS];
|
||||
static uint32 ms_iTextStartTime[NUM_CUTS_MAX_TEXTS];
|
||||
static char ms_cTextOutput[NUM_CUTS_MAX_TEXTS][TEXT_KEY_SIZE];
|
||||
|
||||
static uint32 ms_currTextOutput;
|
||||
static uint32 ms_numTextOutput;
|
||||
static uint32 ms_iModelIndex[NUMCUTSCENEOBJECTS];
|
||||
|
||||
static char ms_cLoadAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
||||
static char ms_cLoadObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
||||
|
||||
static uint32 ms_cutscenePlayStatus;
|
||||
|
||||
static void StartCutscene();
|
||||
static void StartCutsceneProcessing() { ms_cutsceneProcessing = true; }
|
||||
static bool IsRunning(void) { return ms_running; }
|
||||
static bool HasLoaded(void) { return ms_loaded; }
|
||||
@@ -35,19 +135,19 @@ public:
|
||||
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; }
|
||||
static uint32 GetCutsceneTimeInMilleseconds(void);
|
||||
static char *GetCutsceneName(void) { return ms_cutsceneName; }
|
||||
static void SetCutsceneOffset(const CVector& vec) { ms_cutsceneOffset = vec; }
|
||||
static bool HasCutsceneFinished(void);
|
||||
|
||||
static void Initialise(void);
|
||||
static void Initialise(void *dir = nil);
|
||||
static void Shutdown(void);
|
||||
static void LoadCutsceneData(const char *szCutsceneName);
|
||||
static void FinishCutscene(void);
|
||||
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 CCutsceneHead *SetHeadAnim(const char*, CObject *pObject);
|
||||
static CCutsceneObject *CreateCutsceneObject(int modelId);
|
||||
static void DeleteCutsceneData(void);
|
||||
static void LoadAnimationUncompressed(char const*);
|
||||
@@ -56,6 +156,24 @@ public:
|
||||
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 RemoveEverythingBecauseCutsceneDoesntFitInMemory();
|
||||
static void LoadEverythingBecauseCutsceneDeletedAllOfIt();
|
||||
static void DisableCutsceneShadows() { ms_useCutsceneShadows = false; }
|
||||
|
||||
|
||||
static void LoadCutsceneData_overlay(const char* szCutsceneName);
|
||||
static bool LoadCutsceneData_postload(bool b = false);
|
||||
static void Update_overlay(void);
|
||||
static void DeleteCutsceneData_overlay(void);
|
||||
|
||||
static bool IsCutsceneSkipButtonBeingPressed();
|
||||
static void AppendToNextCutscene(const char *object, const char *anim);
|
||||
|
||||
static void LoadCutsceneData_preload();
|
||||
static void LoadCutsceneData_loading();
|
||||
static void HideRequestedObjects();
|
||||
|
||||
static bool PresubBodge();
|
||||
|
||||
static void Write(base::cRelocatableChunkWriter& writer);
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#define NUMAUDIOCOLLISIONS 10
|
||||
#define NUMAUDIOCOLLISIONS 14
|
||||
|
||||
class CEntity;
|
||||
|
||||
|
||||
+2654
-908
File diff suppressed because it is too large
Load Diff
+64
-29
@@ -15,7 +15,7 @@
|
||||
cAudioManager AudioManager;
|
||||
|
||||
#define SPEED_OF_SOUND 343.f
|
||||
#define TIME_SPENT 40
|
||||
#define TIME_SPENT 30
|
||||
|
||||
cAudioManager::cAudioManager()
|
||||
{
|
||||
@@ -340,6 +340,8 @@ cAudioManager::ResetTimers(uint32 time)
|
||||
ClearMissionAudio(0);
|
||||
ClearMissionAudio(1);
|
||||
SampleManager.StopChannel(CHANNEL_POLICE_RADIO);
|
||||
SampleManager.StopChannel(CHANNEL_MISSION_AUDIO_1);
|
||||
SampleManager.StopChannel(CHANNEL_MISSION_AUDIO_2);
|
||||
SampleManager.SetEffectsFadeVolume(0);
|
||||
SampleManager.SetMusicFadeVolume(0);
|
||||
MusicManager.ResetMusicAfterReload();
|
||||
@@ -533,27 +535,17 @@ 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 (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.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE);
|
||||
#if defined(GTA_PS2) || defined(GTA_PSP)
|
||||
// PSP and PS2 just stop the sound, mobile doesn't. Let's not have it on PC either
|
||||
uint8 missionAudioChannel = m_bIsSurround ? CHANNEL_DTS_MISSION_AUDIO_1 : CHANNEL_MISSION_AUDIO_1;
|
||||
SampleManager.StopChannel(missionAudioChannel);
|
||||
SampleManager.StopChannel(missionAudioChannel+1);
|
||||
#endif
|
||||
ClearRequestedQueue();
|
||||
if (m_nActiveQueue) {
|
||||
@@ -574,11 +566,14 @@ cAudioManager::ServiceSoundEffects()
|
||||
ProcessSpecial();
|
||||
ClearRequestedQueue();
|
||||
InterrogateAudioEntities();
|
||||
m_sPedComments.Process();
|
||||
ServicePoliceRadio();
|
||||
ServiceCollisions();
|
||||
if (!m_bIsPaused) {
|
||||
m_sPedComments.Process();
|
||||
//ServicePoliceRadio(); // LCS: removed
|
||||
ServiceCollisions();
|
||||
}
|
||||
AddReleasingSounds();
|
||||
ProcessMissionAudio();
|
||||
if (!m_bIsPaused)
|
||||
ProcessMissionAudio();
|
||||
#ifdef EXTERNAL_3D_SOUND
|
||||
AdjustSamplesVolume();
|
||||
#endif
|
||||
@@ -693,7 +688,7 @@ cAudioManager::InterrogateAudioEntities()
|
||||
}
|
||||
|
||||
void
|
||||
cAudioManager::AddSampleToRequestedQueue()
|
||||
cAudioManager::AddSampleToRequestedQueue(uint8 unk_lcs)
|
||||
{
|
||||
uint32 finalPriority;
|
||||
uint8 sampleIndex;
|
||||
@@ -732,6 +727,7 @@ cAudioManager::AddSampleToRequestedQueue()
|
||||
m_sQueueSample.m_bReverb = FALSE;
|
||||
#endif
|
||||
#endif
|
||||
m_sQueueSample.field_51_lcs = unk_lcs;
|
||||
|
||||
m_aRequestedQueue[m_nActiveQueue][sampleIndex] = m_sQueueSample;
|
||||
|
||||
@@ -789,15 +785,15 @@ cAudioManager::AddReflectionsToRequestedQueue()
|
||||
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;
|
||||
m_afReflectionsDistances[i] = (m_anRandomTable[i % 4] % 3) * 50.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);
|
||||
m_sQueueSample.m_nReflectionDelay = CTimer::GetIsSlowMotionActive() ? (reflectionDistance * 600.0f / 1029.0f) : (reflectionDistance * 300.0f / 1029.0f);
|
||||
#else
|
||||
m_sQueueSample.m_nReflectionDelay = reflectionDistance * 500.0f / 1029.0f;
|
||||
m_sQueueSample.m_nReflectionDelay = reflectionDistance * 300.0f / 1029.0f;
|
||||
#endif
|
||||
if (m_sQueueSample.m_nReflectionDelay > 3) {
|
||||
m_sQueueSample.m_fDistance = m_afReflectionsDistances[i];
|
||||
@@ -1410,6 +1406,45 @@ cAudioManager::LoadBankIfNecessary(uint8 bank)
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
cAudioManager::DirectlyEnqueueSample(uint32 sample, uint8 bank, uint32 counter, uint32 priority, uint32 freq, uint8 volume, uint8 framesToPlay, uint32 notStereo)
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
if (!m_bIsInitialised || m_nExtraSoundsEntity < 0) return;
|
||||
m_sQueueSample.m_nEntityIndex = m_nExtraSoundsEntity; // not setting entity ID could cause bugs, let's use extra sounds one
|
||||
#endif
|
||||
m_sQueueSample.m_nSampleIndex = sample;
|
||||
m_sQueueSample.m_nBankIndex = bank;
|
||||
m_sQueueSample.m_nCounter = counter;
|
||||
m_sQueueSample.m_nFrequency = freq;
|
||||
m_sQueueSample.m_nVolume = volume;
|
||||
SET_EMITTING_VOLUME(volume);
|
||||
m_sQueueSample.m_nPriority = priority;
|
||||
m_sQueueSample.m_nFramesToPlay = framesToPlay;
|
||||
SET_SOUND_REFLECTION(FALSE);
|
||||
m_sQueueSample.m_nLoopCount = 0;
|
||||
SET_LOOP_OFFSETS(sample)
|
||||
#ifdef FIX_BUGS
|
||||
m_sQueueSample.m_bIs2D = TRUE;
|
||||
#else
|
||||
m_sQueueSample.m_bIs2D = FALSE;
|
||||
#endif
|
||||
m_sQueueSample.m_bStatic = FALSE;
|
||||
SET_SOUND_REVERB(FALSE);
|
||||
#ifdef FIX_BUGS
|
||||
m_sQueueSample.m_nPan = 63;
|
||||
AddSampleToRequestedQueue();
|
||||
#else
|
||||
// this is dumb and wrong, what were they thinking?
|
||||
m_sQueueSample.m_nPan = 0;
|
||||
AudioManager.AddSampleToRequestedQueue();
|
||||
if (!notStereo) {
|
||||
m_sQueueSample.m_nPan = 127;
|
||||
AudioManager.AddSampleToRequestedQueue();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef EXTERNAL_3D_SOUND
|
||||
void
|
||||
cAudioManager::AdjustSamplesVolume()
|
||||
|
||||
@@ -59,6 +59,7 @@ public:
|
||||
#if defined(FIX_BUGS) && defined(EXTERNAL_3D_SOUND)
|
||||
int8 m_nEmittingVolumeChange; // same as above but for m_nEmittingVolume
|
||||
#endif
|
||||
uint8 field_51_lcs;
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(tSound, 96);
|
||||
@@ -126,7 +127,11 @@ public:
|
||||
|
||||
VALIDATE_SIZE(cPedComments, 0x490);
|
||||
|
||||
#ifdef FIX_BUGS // LCS extends the number of mission slots but not audio channels, the game would crash on ClearMissionAudio trying to stop channels that don't exist
|
||||
#define MISSION_AUDIO_SLOTS (2)
|
||||
#else
|
||||
#define MISSION_AUDIO_SLOTS (5)
|
||||
#endif
|
||||
|
||||
// name made up
|
||||
class cAudioScriptObjectManager
|
||||
@@ -248,6 +253,7 @@ public:
|
||||
#endif
|
||||
cAudioScriptObjectManager m_sAudioScriptObjectManager;
|
||||
|
||||
bool8 field_4348_lcs;
|
||||
// miami
|
||||
bool8 m_bIsPlayerShutUp;
|
||||
uint8 m_nPlayerMood;
|
||||
@@ -291,6 +297,10 @@ public:
|
||||
bool8 m_bWasPaused;
|
||||
uint32 m_FrameCounter;
|
||||
|
||||
uint32 field_5644_lcs;
|
||||
uint32 field_5648_lcs;
|
||||
uint8 field_564C_lcs;
|
||||
|
||||
cAudioManager();
|
||||
~cAudioManager();
|
||||
|
||||
@@ -338,7 +348,7 @@ public:
|
||||
uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier);
|
||||
int32 RandomDisplacement(uint32 seed);
|
||||
void InterrogateAudioEntities(); // inlined
|
||||
void AddSampleToRequestedQueue();
|
||||
void AddSampleToRequestedQueue(uint8 unk_lcs = 0);
|
||||
void AddDetailsToRequestedOrderList(uint8 sample); // inlined in vc
|
||||
#ifdef AUDIO_REFLECTIONS
|
||||
void AddReflectionsToRequestedQueue();
|
||||
@@ -352,6 +362,7 @@ public:
|
||||
#ifdef GTA_PS2
|
||||
void LoadBankIfNecessary(uint8 bank); // this is used only on PS2 but technically not a platform code
|
||||
#endif
|
||||
void DirectlyEnqueueSample(uint32 sample, uint8 bank, uint32 counter, uint32 priority, uint32 freq, uint8 volume, uint8 framesToPlay, uint32 notStereo = 0);
|
||||
|
||||
#ifdef EXTERNAL_3D_SOUND // actually must have been && AUDIO_MSS as well
|
||||
void AdjustSamplesVolume(); // inlined
|
||||
@@ -407,6 +418,7 @@ public:
|
||||
#ifdef GTA_TRAIN
|
||||
bool8 ProcessTrainNoise(cVehicleParams ¶ms);
|
||||
#endif
|
||||
bool8 ProcessFerryNoise(cVehicleParams ¶ms);
|
||||
bool8 ProcessBoatEngine(cVehicleParams ¶ms);
|
||||
bool8 ProcessBoatMovingOverWater(cVehicleParams ¶ms);
|
||||
void ProcessPlane(cVehicleParams ¶ms);
|
||||
@@ -436,6 +448,17 @@ public:
|
||||
uint32 GetPedCommentSfx(CPed *ped, uint16 sound);
|
||||
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset);
|
||||
uint32 GetPlayerTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetMariaTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetDonaldLoveTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetJdOtooleTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetleonMcaffreyTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetSalvatoreTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetToshikoTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetMickeyHamfistsTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBiker1TalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBiker2TalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetGrdAng1TalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetGrdAng2TalkSfx(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);
|
||||
@@ -556,9 +579,6 @@ public:
|
||||
|
||||
#ifdef GTA_BRIDGE
|
||||
void ProcessBridge();
|
||||
void ProcessBridgeWarning();
|
||||
void ProcessBridgeMotor();
|
||||
void ProcessBridgeOneShots();
|
||||
#endif
|
||||
|
||||
// mission audio
|
||||
@@ -635,10 +655,15 @@ public:
|
||||
#define SET_SOUND_REVERB(b)
|
||||
#endif
|
||||
|
||||
#if defined(AUDIO_MSS) && !defined(PS2_AUDIO_CHANNELS)
|
||||
static_assert(sizeof(cAudioManager) == 0x5558, "cAudioManager: error");
|
||||
#ifndef GTA_PS2
|
||||
#define CHANNEL_PLAYER_VEHICLE_ENGINE m_nActiveSamples
|
||||
#endif
|
||||
|
||||
//#if defined(AUDIO_MSS) && !defined(PS2_AUDIO_CHANNELS)
|
||||
//static_assert(sizeof(cAudioManager) == 0x5558, "cAudioManager: error");
|
||||
//#endif
|
||||
|
||||
|
||||
extern cAudioManager AudioManager;
|
||||
|
||||
enum
|
||||
|
||||
+5529
-9935
File diff suppressed because it is too large
Load Diff
+19
-33
@@ -164,8 +164,8 @@ cMusicManager::SetStartingTrackPositions(bool8 isNewGameTimer)
|
||||
|
||||
if (i < STREAMED_SOUND_CITY_AMBIENT && isNewGameTimer)
|
||||
m_aTracks[i].m_nPosition = NewGameRadioTimers[i];
|
||||
else if (i < STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED)
|
||||
m_aTracks[i].m_nPosition = (pos * AudioManager.m_anRandomTable[i % 5]) % m_aTracks[i].m_nLength;
|
||||
//else if (i < STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED)
|
||||
// m_aTracks[i].m_nPosition = (pos * AudioManager.GetRandomNumber(i % 5)) % m_aTracks[i].m_nLength;
|
||||
else
|
||||
m_aTracks[i].m_nPosition = 0;
|
||||
|
||||
@@ -315,7 +315,7 @@ cMusicManager::ChangeMusicMode(uint8 mode)
|
||||
|
||||
#ifdef PAUSE_RADIO_IN_FRONTEND
|
||||
// rewind those streams we weren't listening right now
|
||||
for( uint32 i = STREAMED_SOUND_RADIO_WILD; i < STREAMED_SOUND_CUTSCENE_ASS_1; i++ ) {
|
||||
for( uint32 i = STREAMED_SOUND_RADIO_HEAD; i < STREAMED_SOUND_CUTSCENE_BIKER; i++ ) {
|
||||
m_aTracks[i].m_nPosition = GetTrackStartPos(i);
|
||||
m_aTracks[i].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
|
||||
}
|
||||
@@ -427,7 +427,7 @@ cMusicManager::ServiceFrontEndMode()
|
||||
|
||||
#ifdef PAUSE_RADIO_IN_FRONTEND
|
||||
// pause radio
|
||||
for (uint32 i = STREAMED_SOUND_RADIO_WILD; i < STREAMED_SOUND_CUTSCENE_ASS_1; i++)
|
||||
for( uint32 i = STREAMED_SOUND_RADIO_HEAD; i < STREAMED_SOUND_CUTSCENE_BIKER; i++ )
|
||||
m_aTracks[i].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
|
||||
#endif
|
||||
|
||||
@@ -595,7 +595,7 @@ cMusicManager::ServiceGameMode()
|
||||
if (!m_bRadioStreamReady)
|
||||
{
|
||||
if(vehicle == nil) {
|
||||
m_nFrontendTrack = STREAMED_SOUND_RADIO_WAVE; // huh?
|
||||
m_nFrontendTrack = STREAMED_SOUND_RADIO_LCFR; // huh?
|
||||
return;
|
||||
}
|
||||
if(m_bRadioSetByScript) {
|
||||
@@ -768,7 +768,7 @@ cMusicManager::SetUpCorrectAmbienceTrack()
|
||||
else if (TheCamera.DistanceToWater <= 90.0f) {
|
||||
if (CCullZones::bAtBeachForAudio) {
|
||||
if (CWeather::OldWeatherType != WEATHER_HURRICANE && CWeather::NewWeatherType != WEATHER_HURRICANE || CWeather::Wind <= 1.0f)
|
||||
m_nFrontendTrack = STREAMED_SOUND_BEACH_AMBIENT;
|
||||
m_nFrontendTrack = STREAMED_SOUND_SAWMILL;
|
||||
else
|
||||
m_nFrontendTrack = STREAMED_SOUND_HAVANA_BEACH_AMBIENT;
|
||||
}
|
||||
@@ -1320,27 +1320,12 @@ cMusicManager::DisplayRadioStationName()
|
||||
case RADIO_ESPANTOSO: string = TheText.Get("FEA_FM6"); break;
|
||||
case EMOTION: string = TheText.Get("FEA_FM7"); break;
|
||||
case WAVE: string = TheText.Get("FEA_FM8"); break;
|
||||
case USERTRACK:
|
||||
case 9: string = TheText.Get("FEA_FM9"); break;
|
||||
case 10:
|
||||
if (!SampleManager.IsMP3RadioChannelAvailable())
|
||||
return;
|
||||
string = TheText.Get("FEA_MP3"); break;
|
||||
#ifdef RADIO_OFF_TEXT
|
||||
case RADIO_OFF: {
|
||||
// Otherwise RADIO OFF will be seen after pausing-resuming game and Mission Complete text
|
||||
if (!m_bRadioStreamReady || !m_bGameplayAllowsRadio)
|
||||
return;
|
||||
|
||||
extern wchar WideErrorString[];
|
||||
|
||||
string = TheText.Get("FEA_NON");
|
||||
if (string == WideErrorString) {
|
||||
pCurrentStation = nil;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default: return;
|
||||
default: string = TheText.Get("FEA_NON"); break;
|
||||
};
|
||||
|
||||
if (pCurrentStation != string) {
|
||||
@@ -1358,21 +1343,22 @@ cMusicManager::DisplayRadioStationName()
|
||||
|
||||
CFont::SetJustifyOff();
|
||||
CFont::SetBackgroundOff();
|
||||
CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
|
||||
CFont::SetDropShadowPosition(2);
|
||||
CFont::SetScale(PSP_SCREEN_SCALE_X(0.5f), PSP_SCREEN_SCALE_Y(0.88f));
|
||||
CFont::SetPropOn();
|
||||
CFont::SetFontStyle(FONT_STANDARD);
|
||||
CFont::SetFontStyle(FONT_BANK);
|
||||
CFont::SetCentreOn();
|
||||
CFont::SetCentreSize(SCREEN_STRETCH_X(DEFAULT_SCREEN_WIDTH));
|
||||
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), SCREEN_SCALE_Y(22.0f) + SCREEN_SCALE_Y(2.0f), pCurrentStation);
|
||||
CFont::SetCentreSize(PSP_SCREEN_SCALE_X(260.0f));
|
||||
CFont::SetDropColor(CRGBA(0, 0, 0, 255));
|
||||
|
||||
if (gNumRetunePresses)
|
||||
CFont::SetColor(CRGBA(102, 133, 143, 255));
|
||||
CFont::SetColor(CRGBA(77, 155, 210, 255));
|
||||
else
|
||||
CFont::SetColor(CRGBA(147, 196, 211, 255));
|
||||
CFont::SetColor(CRGBA(77, 155, 210, 255));
|
||||
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, SCREEN_SCALE_Y(22.0f), pCurrentStation);
|
||||
CFont::PrintString(SCREEN_WIDTH / 2, PSP_SCREEN_SCALE_Y(7.0f), pCurrentStation);
|
||||
CFont::DrawFonts();
|
||||
CFont::SetCentreSize(SCREEN_STRETCH_X(DEFAULT_SCREEN_WIDTH));
|
||||
}
|
||||
}
|
||||
// Always show station text after entering car. Same behaviour as III and SA.
|
||||
@@ -1403,7 +1389,7 @@ cMusicManager::UsesPoliceRadio(CVehicle *veh)
|
||||
bool8
|
||||
cMusicManager::UsesTaxiRadio(CVehicle *veh)
|
||||
{
|
||||
if (veh->GetModelIndex() != MI_KAUFMAN) return FALSE;
|
||||
if (veh->GetModelIndex() != MI_CABBIE) return FALSE;
|
||||
return CTheScripts::bPlayerHasMetDebbieHarry;
|
||||
}
|
||||
|
||||
|
||||
+104
-103
@@ -38,20 +38,20 @@ 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, "VICE_C", SFX_SFX_POLICE_RADIO_VICE_CITY);
|
||||
SETZONESFX(1, "IND_ZON", SFX_SFX_POLICE_RADIO_VICE_CITY_BEACH);
|
||||
SETZONESFX(2, "COM_ZON", SFX_SFX_POLICE_RADIO_VICE_CITY_MAINLAND);
|
||||
SETZONESFX(3, "BEACH1", SFX_SFX_POLICE_RADIO_OCEAN_BEACH);
|
||||
SETZONESFX(4, "BEACH2", SFX_SFX_POLICE_RADIO_WASHINGTON_BEACH);
|
||||
SETZONESFX(5, "BEACH3", SFX_SFX_POLICE_RADIO_VICE_POINT);
|
||||
SETZONESFX(6, "GOLFC", SFX_SFX_POLICE_RADIO_LEAF_LINKS);
|
||||
SETZONESFX(7, "STARI", SFX_SFX_POLICE_RADIO_STARFISH_ISLAND);
|
||||
SETZONESFX(8, "DOCKS", SFX_SFX_POLICE_RADIO_VICEPORT);
|
||||
SETZONESFX(9, "HAVANA", SFX_SFX_POLICE_RADIO_LITTLE_HAVANA);
|
||||
SETZONESFX(10, "HAITI", SFX_SFX_POLICE_RADIO_LITTLE_HAITI);
|
||||
SETZONESFX(11, "PORNI", SFX_SFX_POLICE_RADIO_PRAWN_ISLAND);
|
||||
SETZONESFX(12, "DTOWN", SFX_SFX_POLICE_RADIO_DOWNTOWN);
|
||||
SETZONESFX(13, "A_PORT", SFX_SFX_POLICE_RADIO_ESCOBAR_INTERNATIONAL);
|
||||
|
||||
#undef SETZONESFX
|
||||
}
|
||||
@@ -119,6 +119,7 @@ cAudioManager::DoPoliceRadioCrackle()
|
||||
void
|
||||
cAudioManager::ServicePoliceRadio()
|
||||
{
|
||||
/*
|
||||
int32 wantedLevel = 0; // uninitialized variable
|
||||
static uint32 nLastSeen = 300;
|
||||
|
||||
@@ -150,6 +151,7 @@ cAudioManager::ServicePoliceRadio()
|
||||
}
|
||||
}
|
||||
ServicePoliceRadioChannel(wantedLevel);
|
||||
*/
|
||||
}
|
||||
|
||||
void
|
||||
@@ -306,9 +308,9 @@ cAudioManager::SetupCrimeReport()
|
||||
default: break;
|
||||
}
|
||||
#ifdef FIX_BUGS
|
||||
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_CRIME_1 - 1);
|
||||
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_SFX_CRIME_1 - 1);
|
||||
#else
|
||||
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_CRIME_1);
|
||||
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_SFX_CRIME_1);
|
||||
#endif
|
||||
m_sPoliceRadioQueue.Add(SFX_IN);
|
||||
rangeX = zone->maxx - zone->minx;
|
||||
@@ -346,85 +348,85 @@ 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},
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_BLUE, SFX_POLICE_RADIO_GREY},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_BLACK, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_WHITE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_BRIGHT, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_SFX_POLICE_RADIO_BLUE, SFX_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_DARK, SFX_SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_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},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_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},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_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},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_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},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_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},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_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},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_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},
|
||||
@@ -471,7 +473,7 @@ cAudioManager::SetupSuspectLastSeenReport()
|
||||
case MI_RANCHER:
|
||||
case MI_FBIRANCH:
|
||||
case MI_SANDKING:
|
||||
sample = SFX_POLICE_RADIO_OFFROAD;
|
||||
sample = SFX_SFX_POLICE_RADIO_OFFROAD;
|
||||
break;
|
||||
case MI_IDAHO:
|
||||
case MI_MANANA:
|
||||
@@ -482,7 +484,7 @@ cAudioManager::SetupSuspectLastSeenReport()
|
||||
case MI_SABRETUR:
|
||||
case MI_VIRGO:
|
||||
case MI_BLISTAC:
|
||||
sample = SFX_POLICE_RADIO_TUDOOR;
|
||||
sample = SFX_SFX_POLICE_RADIO_TUDOOR;
|
||||
break;
|
||||
case MI_STINGER:
|
||||
case MI_INFERNUS:
|
||||
@@ -492,14 +494,14 @@ cAudioManager::SetupSuspectLastSeenReport()
|
||||
case MI_COMET:
|
||||
case MI_DELUXO:
|
||||
case MI_HOTRING:
|
||||
sample = SFX_POLICE_RADIO_SPORTS_CAR;
|
||||
sample = SFX_SFX_POLICE_RADIO_SPORTS_CAR;
|
||||
break;
|
||||
case MI_LINERUN:
|
||||
sample = SFX_POLICE_RADIO_RIG;
|
||||
sample = SFX_SFX_POLICE_RADIO_RIG;
|
||||
break;
|
||||
case MI_PEREN:
|
||||
case MI_REGINA:
|
||||
sample = SFX_POLICE_RADIO_STATION_WAGON;
|
||||
sample = SFX_SFX_POLICE_RADIO_STATION_WAGON;
|
||||
break;
|
||||
case MI_SENTINEL:
|
||||
case MI_FBICAR:
|
||||
@@ -510,23 +512,23 @@ cAudioManager::SetupSuspectLastSeenReport()
|
||||
case MI_OCEANIC:
|
||||
case MI_HERMES:
|
||||
case MI_GREENWOO:
|
||||
sample = SFX_POLICE_RADIO_SEDAN;
|
||||
sample = SFX_SFX_POLICE_RADIO_SEDAN;
|
||||
break;
|
||||
case MI_RIO:
|
||||
sample = SFX_POLICE_RADIO_CRUISER;
|
||||
sample = SFX_SFX_POLICE_RADIO_CRUISER;
|
||||
break;
|
||||
case MI_FIRETRUCK:
|
||||
sample = SFX_POLICE_RADIO_FIRE_TRUCK;
|
||||
sample = SFX_SFX_POLICE_RADIO_FIRE_TRUCK;
|
||||
break;
|
||||
case MI_TRASH:
|
||||
sample = SFX_POLICE_RADIO_GARBAGE_TRUCK;
|
||||
sample = SFX_SFX_POLICE_RADIO_GARBAGE_TRUCK;
|
||||
break;
|
||||
case MI_STRETCH:
|
||||
case MI_LOVEFIST:
|
||||
sample = SFX_POLICE_RADIO_STRETCH;
|
||||
sample = SFX_SFX_POLICE_RADIO_STRETCH;
|
||||
break;
|
||||
case MI_VOODOO:
|
||||
sample = SFX_POLICE_RADIO_LOWRIDER;
|
||||
sample = SFX_SFX_POLICE_RADIO_LOWRIDER;
|
||||
break;
|
||||
case MI_PONY:
|
||||
case MI_MOONBEAM:
|
||||
@@ -537,32 +539,31 @@ cAudioManager::SetupSuspectLastSeenReport()
|
||||
case MI_TOPFUN:
|
||||
case MI_BURRITO:
|
||||
case MI_SPAND:
|
||||
sample = SFX_POLICE_RADIO_VAN;
|
||||
sample = SFX_SFX_POLICE_RADIO_VAN;
|
||||
break;
|
||||
case MI_MULE:
|
||||
case MI_BARRACKS:
|
||||
case MI_PACKER:
|
||||
case MI_FLATBED:
|
||||
sample = SFX_POLICE_RADIO_TRUCK;
|
||||
sample = SFX_SFX_POLICE_RADIO_TRUCK;
|
||||
break;
|
||||
case MI_AMBULAN:
|
||||
sample = SFX_POLICE_RADIO_AMBULANCE;
|
||||
sample = SFX_SFX_POLICE_RADIO_AMBULANCE;
|
||||
break;
|
||||
case MI_TAXI:
|
||||
case MI_CABBIE:
|
||||
case MI_ZEBRA:
|
||||
case MI_KAUFMAN:
|
||||
sample = SFX_POLICE_RADIO_TAXI;
|
||||
case MI_BORGNINE:
|
||||
sample = SFX_SFX_POLICE_RADIO_TAXI;
|
||||
break;
|
||||
case MI_BOBCAT:
|
||||
case MI_WALTON:
|
||||
sample = SFX_POLICE_RADIO_PICKUP;
|
||||
sample = SFX_SFX_POLICE_RADIO_PICKUP;
|
||||
break;
|
||||
case MI_MRWHOOP:
|
||||
sample = SFX_POLICE_RADIO_ICE_CREAM_VAN;
|
||||
sample = SFX_SFX_POLICE_RADIO_ICE_CREAM_VAN;
|
||||
break;
|
||||
case MI_BFINJECT:
|
||||
sample = SFX_POLICE_RADIO_BUGGY;
|
||||
sample = SFX_SFX_POLICE_RADIO_BUGGY;
|
||||
break;
|
||||
case MI_HUNTER:
|
||||
case MI_CHOPPER:
|
||||
@@ -571,57 +572,57 @@ cAudioManager::SetupSuspectLastSeenReport()
|
||||
case MI_MAVERICK:
|
||||
case MI_VCNMAV:
|
||||
case MI_POLMAV:
|
||||
sample = SFX_POLICE_RADIO_HELICOPTER;
|
||||
sample = SFX_SFX_POLICE_RADIO_HELICOPTER;
|
||||
break;
|
||||
case MI_POLICE:
|
||||
sample = SFX_POLICE_RADIO_POLICE_CAR;
|
||||
sample = SFX_SFX_POLICE_RADIO_POLICE_CAR;
|
||||
break;
|
||||
case MI_ENFORCER:
|
||||
sample = SFX_POLICE_RADIO_SWAT_VAN;
|
||||
sample = SFX_SFX_POLICE_RADIO_SWAT_VAN;
|
||||
break;
|
||||
case MI_PREDATOR:
|
||||
case MI_SQUALO:
|
||||
case MI_SPEEDER:
|
||||
sample = SFX_POLICE_RADIO_SPEEDBOAT;
|
||||
sample = SFX_SFX_POLICE_RADIO_SPEEDBOAT;
|
||||
break;
|
||||
case MI_BUS:
|
||||
sample = SFX_POLICE_RADIO_BUS;
|
||||
sample = SFX_SFX_POLICE_RADIO_BUS;
|
||||
break;
|
||||
case MI_RHINO:
|
||||
sample = SFX_POLICE_RADIO_TANK;
|
||||
sample = SFX_SFX_POLICE_RADIO_TANK;
|
||||
break;
|
||||
case MI_ANGEL:
|
||||
case MI_PCJ600:
|
||||
case MI_FREEWAY:
|
||||
case MI_SANCHEZ:
|
||||
sample = SFX_POLICE_RADIO_MOTOBIKE;
|
||||
sample = SFX_SFX_POLICE_RADIO_MOTOBIKE;
|
||||
break;
|
||||
case MI_COACH:
|
||||
sample = SFX_POLICE_RADIO_COACH;
|
||||
sample = SFX_SFX_POLICE_RADIO_COACH;
|
||||
break;
|
||||
case MI_ROMERO:
|
||||
sample = SFX_POLICE_RADIO_HEARSE;
|
||||
case MI_HEARSE:
|
||||
sample = SFX_SFX_POLICE_RADIO_HEARSE;
|
||||
break;
|
||||
case MI_PIZZABOY:
|
||||
case MI_FAGGIO:
|
||||
sample = SFX_POLICE_RADIO_MOPED;
|
||||
sample = SFX_SFX_POLICE_RADIO_MOPED;
|
||||
break;
|
||||
case MI_DEADDODO:
|
||||
case MI_SKIMMER:
|
||||
sample = SFX_POLICE_RADIO_PLANE;
|
||||
sample = SFX_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;
|
||||
sample = SFX_SFX_POLICE_RADIO_BOAT;
|
||||
break;
|
||||
case MI_CADDY:
|
||||
sample = SFX_POLICE_RADIO_GOLF_CART;
|
||||
sample = SFX_SFX_POLICE_RADIO_GOLF_CART;
|
||||
break;
|
||||
case MI_DINGHY:
|
||||
sample = SFX_POLICE_RADIO_DINGHY;
|
||||
sample = SFX_SFX_POLICE_RADIO_DINGHY;
|
||||
break;
|
||||
default:
|
||||
//debug("\n *** UNKNOWN CAR MODEL INDEX %d *** ", veh->GetModelIndex());
|
||||
|
||||
+65
-1221
File diff suppressed because it is too large
Load Diff
+73
-2460
File diff suppressed because it is too large
Load Diff
+199
-93
@@ -39,10 +39,11 @@ int32 nPedSlotSfx [MAX_PEDSFX];
|
||||
int32 nPedSlotSfxAddr[MAX_PEDSFX];
|
||||
uint8 nCurrentPedSlot;
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
uint32 nMissionSlotSfx[MISSION_AUDIO_SLOTS] = { UINT32_MAX, UINT32_MAX };
|
||||
uintptr nMissionSlotSfxStartAddress;
|
||||
|
||||
uint32 gPlayerTalkSfx = UINT32_MAX;
|
||||
void *gPlayerTalkData = 0;
|
||||
#endif
|
||||
|
||||
uint8 nChannelVolume[MAXCHANNELS+MAX2DCHANNELS];
|
||||
|
||||
@@ -332,6 +333,80 @@ cSampleManager::~cSampleManager(void)
|
||||
|
||||
}
|
||||
|
||||
int gBankStartOffset[67];
|
||||
|
||||
void
|
||||
SetUpDebugBanksInfo()
|
||||
{
|
||||
gBankStartOffset[3] = SFX_FE_BACK;
|
||||
gBankStartOffset[4] = SFX_CAR_ACCEL_1;
|
||||
gBankStartOffset[5] = SFX_CAR_ACCEL_2;
|
||||
gBankStartOffset[9] = SFX_CAR_ACCEL_6;
|
||||
gBankStartOffset[10] = SFX_CAR_ACCEL_7;
|
||||
gBankStartOffset[1] = SFX_EMPTY;
|
||||
gBankStartOffset[11] = SFX_CAR_ACCEL_8;
|
||||
gBankStartOffset[7] = SFX_CAR_ACCEL_4;
|
||||
gBankStartOffset[15] = SFX_CAR_ACCEL_12;
|
||||
gBankStartOffset[13] = SFX_CAR_ACCEL_10;
|
||||
gBankStartOffset[16] = SFX_CAR_CHAINSAW_IDLE;
|
||||
gBankStartOffset[0] = SFX_AIR_BRAKES;
|
||||
gBankStartOffset[17] = SFX_RC_IDLE;
|
||||
gBankStartOffset[6] = SFX_CAR_ACCEL_3;
|
||||
gBankStartOffset[19] = SFX_CAR_ACCEL_16;
|
||||
gBankStartOffset[12] = SFX_CAR_ACCEL_9;
|
||||
gBankStartOffset[2] = SFX_AMBULAN_VOICE_1_VAN_1;
|
||||
gBankStartOffset[21] = SFX_CAR_ACCEL_18;
|
||||
gBankStartOffset[22] = SFX_CAR_ACCEL_19;
|
||||
gBankStartOffset[8] = SFX_CAR_ACCEL_5;
|
||||
gBankStartOffset[23] = SFX_CAR_ACCEL_20;
|
||||
gBankStartOffset[14] = SFX_CAR_ACCEL_11;
|
||||
gBankStartOffset[20] = SFX_CAR_ACCEL_17;
|
||||
gBankStartOffset[18] = SFX_CAR_RC_HELI;
|
||||
gBankStartOffset[25] = SFX_CAR_AFTER_ACCEL_21;
|
||||
gBankStartOffset[26] = SFX_CAR_FINGER_OFF_ACCEL_21;
|
||||
gBankStartOffset[27] = SFX_CAR_ACCEL_22;
|
||||
gBankStartOffset[28] = SFX_CAR_AFTER_ACCEL_22;
|
||||
gBankStartOffset[29] = SFX_CAR_FINGER_OFF_ACCEL_22;
|
||||
gBankStartOffset[24] = SFX_CAR_ACCEL_21;
|
||||
gBankStartOffset[30] = SFX_HELI_APACHE_1;
|
||||
gBankStartOffset[31] = SFX_HELI_UNUSED_1;
|
||||
gBankStartOffset[32] = SFX_HELI_UNUSED_2;
|
||||
gBankStartOffset[33] = SFX_HELI_UNUSED_3;
|
||||
gBankStartOffset[34] = SFX_HELI_UNUSED_4;
|
||||
gBankStartOffset[35] = SFX_SEAPLANE_LOW;
|
||||
gBankStartOffset[37] = SFX_PLANE_UNUSED_2;
|
||||
gBankStartOffset[38] = SFX_PLANE_UNUSED_3;
|
||||
gBankStartOffset[39] = SFX_PLANE_UNUSED_4;
|
||||
gBankStartOffset[40] = SFX_BUILDINGS_BANK_ALARM;
|
||||
gBankStartOffset[41] = SFX_BUILDING_SNORE;
|
||||
gBankStartOffset[36] = SFX_PLANE_UNUSED_1;
|
||||
gBankStartOffset[43] = SFX_BUILDING_BAR_2;
|
||||
gBankStartOffset[44] = SFX_BUILDING_BAR_3;
|
||||
gBankStartOffset[45] = SFX_BUILDING_BAR_4;
|
||||
gBankStartOffset[46] = SFX_BUILDING_MALIBU_1;
|
||||
gBankStartOffset[47] = SFX_BUILDING_MALIBU_2;
|
||||
gBankStartOffset[42] = SFX_BUILDING_BAR_1;
|
||||
gBankStartOffset[49] = SFX_BUILDING_STRIP_1;
|
||||
gBankStartOffset[50] = SFX_BUILDING_STRIP_2;
|
||||
gBankStartOffset[51] = SFX_BUILDING_STRIP_3;
|
||||
gBankStartOffset[52] = SFX_BUILDING_CHURCH;
|
||||
gBankStartOffset[53] = SFX_BUILDING_FAN_1;
|
||||
gBankStartOffset[48] = SFX_BUILDING_MALIBU_3;
|
||||
gBankStartOffset[55] = SFX_BUILDING_INSECTS_1;
|
||||
gBankStartOffset[56] = SFX_BUILDING_INSECTS_2;
|
||||
gBankStartOffset[54] = SFX_BUILDING_FAN_2;
|
||||
gBankStartOffset[57] = SFX_CLUB_1;
|
||||
gBankStartOffset[58] = SFX_CLUB_2;
|
||||
gBankStartOffset[59] = SFX_CLUB_3;
|
||||
gBankStartOffset[60] = SFX_CLUB_4;
|
||||
gBankStartOffset[61] = SFX_FOOTSTEP_GRASS_1;
|
||||
gBankStartOffset[62] = SFX_FOOTSTEP_GRAVEL_1;
|
||||
gBankStartOffset[63] = SFX_FOOTSTEP_WOOD_1;
|
||||
gBankStartOffset[64] = SFX_FOOTSTEP_METAL_1;
|
||||
gBankStartOffset[65] = SFX_FOOTSTEP_WATER_1;
|
||||
gBankStartOffset[66] = SFX_FOOTSTEP_SAND_1;
|
||||
}
|
||||
|
||||
#ifdef EXTERNAL_3D_SOUND
|
||||
void
|
||||
cSampleManager::SetSpeakerConfig(int32 which)
|
||||
@@ -1041,20 +1116,20 @@ cSampleManager::Initialise(void)
|
||||
|
||||
if ( GetDriveType(m_szCDRomRootPath) == DRIVE_CDROM )
|
||||
{
|
||||
FILE *f;
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filepath, m_szCDRomRootPath);
|
||||
strcat(filepath, PS2StreamedNameTable[0]);
|
||||
f = fopen(filepath, "rb");
|
||||
|
||||
strcat(filepath, StreamedNameTable[0]);
|
||||
strcat(filepath, ".VB");
|
||||
|
||||
FILE *f = fopen(filepath, "rb");
|
||||
|
||||
if ( !f )
|
||||
#endif
|
||||
{
|
||||
strcpy(filepath, m_szCDRomRootPath);
|
||||
strcat(filepath, StreamedNameTable[0]);
|
||||
|
||||
strcat(filepath, ".MP3");
|
||||
f = fopen(filepath, "rb");
|
||||
}
|
||||
|
||||
if ( f )
|
||||
{
|
||||
fclose(f);
|
||||
@@ -1082,26 +1157,16 @@ cSampleManager::Initialise(void)
|
||||
m_szCDRomRootPath[0] = '\0';
|
||||
|
||||
strcpy(m_WavFilesPath, m_szCDRomRootPath);
|
||||
|
||||
/*
|
||||
#ifdef AUDIO_CACHE
|
||||
if ( CreateCache )
|
||||
#endif
|
||||
for ( int32 i = STREAMED_SOUND_MISSION_MOBR1; i < TOTAL_STREAMED_SOUNDS; i++ )
|
||||
{
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filepath, m_szCDRomRootPath);
|
||||
strcat(filepath, PS2StreamedNameTable[i]);
|
||||
|
||||
strcat(filepath, StreamedNameTable[i]);
|
||||
|
||||
mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
|
||||
|
||||
if ( !mp3Stream[0] )
|
||||
#endif
|
||||
{
|
||||
strcpy(filepath, m_szCDRomRootPath);
|
||||
strcat(filepath, StreamedNameTable[i]);
|
||||
|
||||
mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
|
||||
}
|
||||
|
||||
if ( mp3Stream[0] )
|
||||
{
|
||||
@@ -1119,7 +1184,7 @@ cSampleManager::Initialise(void)
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
// Find path of MP3s (originally in CD-Rom)
|
||||
// if NO_CDCHECK is NOT defined but AUDIO_CACHE is defined, we still need to find MP3s' path, but will exit after the first file
|
||||
#ifndef NO_CDCHECK
|
||||
@@ -1137,20 +1202,18 @@ cSampleManager::Initialise(void)
|
||||
{
|
||||
#endif
|
||||
|
||||
for (int32 i = 0; i < STREAMED_SOUND_MISSION_MOBR1; i++)
|
||||
for (int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++)
|
||||
{
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filepath, m_MP3FilesPath);
|
||||
strcat(filepath, PS2StreamedNameTable[i]);
|
||||
strcat(filepath, StreamedNameTable[i]);
|
||||
strcat(filepath, ".VB");
|
||||
|
||||
mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
|
||||
|
||||
if ( !mp3Stream[0] )
|
||||
#endif
|
||||
if (!mp3Stream[0])
|
||||
{
|
||||
strcpy(filepath, m_MP3FilesPath);
|
||||
strcat(filepath, StreamedNameTable[i]);
|
||||
|
||||
strcat(filepath, ".MP3");
|
||||
mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
|
||||
}
|
||||
|
||||
@@ -1188,26 +1251,16 @@ cSampleManager::Initialise(void)
|
||||
#endif
|
||||
|
||||
if ( !bFileNotFound ) {
|
||||
|
||||
/*
|
||||
#ifdef AUDIO_CACHE
|
||||
if ( CreateCache )
|
||||
#endif
|
||||
for ( int32 i = STREAMED_SOUND_MISSION_COMPLETED4; i < STREAMED_SOUND_MISSION_PAGER; i++ )
|
||||
{
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filepath, m_MiscomPath);
|
||||
strcat(filepath, PS2StreamedNameTable[i]);
|
||||
|
||||
mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
|
||||
|
||||
if ( !mp3Stream[0] )
|
||||
#endif
|
||||
{
|
||||
strcpy(filepath, m_MiscomPath);
|
||||
strcat(filepath, StreamedNameTable[i]);
|
||||
strcat(filepath, StreamedNameTable[i]);
|
||||
|
||||
mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
|
||||
}
|
||||
mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
|
||||
|
||||
if ( mp3Stream[0] )
|
||||
{
|
||||
@@ -1224,7 +1277,7 @@ cSampleManager::Initialise(void)
|
||||
bFileNotFound = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
m_bInitialised = !bFileNotFound;
|
||||
@@ -1271,7 +1324,13 @@ cSampleManager::Initialise(void)
|
||||
|
||||
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = (int32)AIL_mem_alloc_lock(PED_BLOCKSIZE*MAX_PEDSFX);
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
nMissionSlotSfxStartAddress = (uintptr)AIL_mem_alloc_lock(PED_BLOCKSIZE*MAX_PEDSFX);
|
||||
if ( !nMissionSlotSfxStartAddress )
|
||||
{
|
||||
Terminate();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Find biggest player comment
|
||||
uint32 nMaxPedSize = 0;
|
||||
for (uint32 i = PLAYER_COMMENTS_START; i <= PLAYER_COMMENTS_END; i++)
|
||||
@@ -1283,7 +1342,6 @@ cSampleManager::Initialise(void)
|
||||
Terminate();
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
LoadSampleBank(SFX_BANK_0);
|
||||
|
||||
@@ -1439,13 +1497,20 @@ cSampleManager::Terminate(void)
|
||||
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = 0;
|
||||
}
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
if ( nMissionSlotSfxStartAddress != 0 )
|
||||
{
|
||||
AIL_mem_free_lock((void *)nMissionSlotSfxStartAddress);
|
||||
nMissionSlotSfxStartAddress = 0;
|
||||
|
||||
for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ )
|
||||
nMissionSlotSfx[i] = UINT32_MAX;
|
||||
}
|
||||
|
||||
if ( gPlayerTalkData != 0)
|
||||
{
|
||||
AIL_mem_free_lock(gPlayerTalkData);
|
||||
gPlayerTalkData = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( DIG )
|
||||
{
|
||||
@@ -1463,7 +1528,6 @@ cSampleManager::CheckForAnAudioFileOnCD(void)
|
||||
{
|
||||
#if !defined(NO_CDCHECK) // TODO: check steam, probably GTAVC_STEAM_PATCH needs to be added
|
||||
char filepath[MAX_PATH];
|
||||
FILE *f;
|
||||
|
||||
strcpy(filepath, m_MiscomPath);
|
||||
strcat(filepath, StreamedNameTable[STREAMED_SOUND_MISSION_COMPLETED4]);
|
||||
@@ -1612,32 +1676,50 @@ 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
|
||||
ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
|
||||
|
||||
return nSample == gPlayerTalkSfx ? LOADING_STATUS_LOADED : LOADING_STATUS_NOT_LOADED;
|
||||
switch (nSlot)
|
||||
{
|
||||
case MISSION_AUDIO_SLOT_1:
|
||||
case MISSION_AUDIO_SLOT_2:
|
||||
return nMissionSlotSfx[nSlot] == nSample ? LOADING_STATUS_LOADED : LOADING_STATUS_NOT_LOADED;
|
||||
case MISSION_AUDIO_PLAYER_COMMENT:
|
||||
return nSample == gPlayerTalkSfx ? LOADING_STATUS_LOADED : LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8
|
||||
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
|
||||
{
|
||||
ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
|
||||
ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
|
||||
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;
|
||||
switch (nSlot)
|
||||
{
|
||||
case MISSION_AUDIO_SLOT_1:
|
||||
case MISSION_AUDIO_SLOT_2:
|
||||
if (fread((void*)(nMissionSlotSfxStartAddress + nSlot*MISSION_AUDIO_BLOCKSIZE), 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
|
||||
return FALSE;
|
||||
|
||||
gPlayerTalkSfx = nSample;
|
||||
nMissionSlotSfx[nSlot] = nSample;
|
||||
break;
|
||||
case MISSION_AUDIO_PLAYER_COMMENT:
|
||||
if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
|
||||
return FALSE;
|
||||
|
||||
gPlayerTalkSfx = nSample;
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8
|
||||
cSampleManager::IsPedCommentLoaded(uint32 nComment)
|
||||
@@ -1815,6 +1897,8 @@ cSampleManager::SetChannelReverbFlag(uint32 nChannel, bool8 nReverbFlag)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -1846,6 +1930,8 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -1862,7 +1948,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) )
|
||||
@@ -1870,9 +1955,15 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
|
||||
addr = (uintptr)gPlayerTalkData;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
{
|
||||
for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ ) {
|
||||
if ( IsMissionAudioLoaded(i, nSfx) ) {
|
||||
addr = nMissionSlotSfxStartAddress + i * MISSION_AUDIO_BLOCKSIZE;
|
||||
goto MissionAudioFound;
|
||||
}
|
||||
}
|
||||
|
||||
int32 i;
|
||||
for ( i = 0; i < _TODOCONST(3); i++ )
|
||||
{
|
||||
@@ -1892,6 +1983,7 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MissionAudioFound:
|
||||
#ifdef EXTERNAL_3D_SOUND
|
||||
if ( b2d )
|
||||
{
|
||||
@@ -1974,6 +2066,8 @@ cSampleManager::SetChannelVolume(uint32 nChannel, uint32 nVolume)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
#endif
|
||||
nChannelVolume[nChannel] = vol;
|
||||
@@ -2005,6 +2099,8 @@ cSampleManager::SetChannelPan(uint32 nChannel, uint32 nPan)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
#endif
|
||||
#if !defined(FIX_BUGS) && defined(EXTERNAL_3D_SOUND)
|
||||
@@ -2030,6 +2126,8 @@ cSampleManager::SetChannelFrequency(uint32 nChannel, uint32 nFreq)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -2060,6 +2158,8 @@ cSampleManager::SetChannelLoopPoints(uint32 nChannel, uint32 nLoopStart, int32 n
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -2090,6 +2190,8 @@ cSampleManager::SetChannelLoopCount(uint32 nChannel, uint32 nLoopCount)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -2120,6 +2222,8 @@ cSampleManager::GetChannelUsedFlag(uint32 nChannel)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -2155,6 +2259,8 @@ cSampleManager::StartChannel(uint32 nChannel)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -2185,6 +2291,8 @@ cSampleManager::StopChannel(uint32 nChannel)
|
||||
switch ( nChannel )
|
||||
{
|
||||
case CHANNEL_POLICE_RADIO:
|
||||
case CHANNEL_MISSION_AUDIO_1:
|
||||
case CHANNEL_MISSION_AUDIO_2:
|
||||
{
|
||||
b2d = TRUE;
|
||||
break;
|
||||
@@ -2223,18 +2331,18 @@ cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream)
|
||||
}
|
||||
|
||||
char filepath[MAX_PATH];
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filepath, nFile < STREAMED_SOUND_MISSION_COMPLETED4 ? m_MP3FilesPath : (nFile < STREAMED_SOUND_MISSION_MOBR1 ? m_MiscomPath : m_WavFilesPath));
|
||||
strcat(filepath, PS2StreamedNameTable[nFile]);
|
||||
|
||||
|
||||
strcpy(filepath, m_MP3FilesPath);
|
||||
strcat(filepath, StreamedNameTable[nFile]);
|
||||
strcat(filepath, ".VB");
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0);
|
||||
|
||||
if ( !mp3Stream[nStream] )
|
||||
#endif
|
||||
if(!mp3Stream[nStream])
|
||||
{
|
||||
strcpy(filepath, nFile < STREAMED_SOUND_MISSION_COMPLETED4 ? m_MP3FilesPath : (nFile < STREAMED_SOUND_MISSION_MOBR1 ? m_MiscomPath : m_WavFilesPath));
|
||||
strcpy(filepath, m_MP3FilesPath);
|
||||
strcat(filepath, StreamedNameTable[nFile]);
|
||||
|
||||
strcat(filepath, ".MP3");
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0);
|
||||
}
|
||||
|
||||
@@ -2298,19 +2406,18 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
// Try to continue from previous song, if already started
|
||||
if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
|
||||
nFile = 0;
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filename, m_MiscomPath);
|
||||
strcat(filename, PS2StreamedNameTable[nFile]);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
strcat(filename, ".VB");
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
|
||||
if ( !mp3Stream[nStream] )
|
||||
#endif
|
||||
if(!mp3Stream[nStream])
|
||||
{
|
||||
strcpy(filename, m_MiscomPath);
|
||||
strcpy(filename, m_MP3FilesPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
strcat(filename, ".MP3");
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
}
|
||||
if(mp3Stream[nStream]) {
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
@@ -2355,19 +2462,18 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
{
|
||||
nFile = 0;
|
||||
_bIsMp3Active = FALSE;
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filename, m_MiscomPath);
|
||||
strcat(filename, PS2StreamedNameTable[nFile]);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
strcat(filename, ".VB");
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
|
||||
if ( !mp3Stream[nStream] )
|
||||
#endif
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
if(!mp3Stream[nStream])
|
||||
{
|
||||
strcpy(filename, m_MiscomPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
strcat(filename, ".MP3");
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
}
|
||||
if(mp3Stream[nStream]) {
|
||||
AIL_set_stream_loop_count(
|
||||
@@ -2409,20 +2515,18 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
position = 0;
|
||||
nFile = 0;
|
||||
}
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
strcpy(filename, m_MiscomPath);
|
||||
strcat(filename, PS2StreamedNameTable[nFile]);
|
||||
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
strcat(filename, ".VB");
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
|
||||
if ( !mp3Stream[nStream] )
|
||||
#endif
|
||||
if( !mp3Stream[nStream] )
|
||||
{
|
||||
strcpy(filename, m_MiscomPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
strcat(filename, ".MP3");
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
}
|
||||
|
||||
if ( mp3Stream[nStream] )
|
||||
{
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
@@ -2546,6 +2650,8 @@ cSampleManager::IsStreamPlaying(uint8 nStream)
|
||||
bool8
|
||||
cSampleManager::InitialiseSampleBanks(void)
|
||||
{
|
||||
SetUpDebugBanksInfo();
|
||||
|
||||
int32 nBank = SFX_BANK_0;
|
||||
|
||||
fpSampleDescHandle = fopen(SampleBankDescFilename, "rb");
|
||||
@@ -2569,7 +2675,7 @@ cSampleManager::InitialiseSampleBanks(void)
|
||||
|
||||
fclose(fpSampleDescHandle);
|
||||
fpSampleDescHandle = NULL;
|
||||
|
||||
|
||||
for ( uint32 i = 0; i < TOTAL_AUDIO_SAMPLES; i++ )
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
|
||||
+188
-52
@@ -102,10 +102,11 @@ int32 nPedSlotSfx [MAX_PEDSFX];
|
||||
int32 nPedSlotSfxAddr[MAX_PEDSFX];
|
||||
uint8 nCurrentPedSlot;
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
uint32 nMissionSlotSfx[MISSION_AUDIO_SLOTS] = { UINT32_MAX, UINT32_MAX };
|
||||
uintptr nMissionSlotSfxStartAddress;
|
||||
|
||||
uint32 gPlayerTalkSfx = UINT32_MAX;
|
||||
void *gPlayerTalkData = 0;
|
||||
#endif
|
||||
|
||||
CChannel aChannel[NUM_CHANNELS];
|
||||
uint8 nChannelVolume[NUM_CHANNELS];
|
||||
@@ -306,7 +307,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 false;// track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE;
|
||||
}
|
||||
|
||||
cSampleManager::cSampleManager(void)
|
||||
@@ -319,6 +320,80 @@ cSampleManager::~cSampleManager(void)
|
||||
|
||||
}
|
||||
|
||||
int gBankStartOffset[67];
|
||||
|
||||
void
|
||||
SetUpDebugBanksInfo()
|
||||
{
|
||||
gBankStartOffset[3] = SFX_FE_BACK;
|
||||
gBankStartOffset[4] = SFX_CAR_ACCEL_1;
|
||||
gBankStartOffset[5] = SFX_CAR_ACCEL_2;
|
||||
gBankStartOffset[9] = SFX_CAR_ACCEL_6;
|
||||
gBankStartOffset[10] = SFX_CAR_ACCEL_7;
|
||||
gBankStartOffset[1] = SFX_EMPTY;
|
||||
gBankStartOffset[11] = SFX_CAR_ACCEL_8;
|
||||
gBankStartOffset[7] = SFX_CAR_ACCEL_4;
|
||||
gBankStartOffset[15] = SFX_CAR_ACCEL_12;
|
||||
gBankStartOffset[13] = SFX_CAR_ACCEL_10;
|
||||
gBankStartOffset[16] = SFX_CAR_CHAINSAW_IDLE;
|
||||
gBankStartOffset[0] = SFX_AIR_BRAKES;
|
||||
gBankStartOffset[17] = SFX_RC_IDLE;
|
||||
gBankStartOffset[6] = SFX_CAR_ACCEL_3;
|
||||
gBankStartOffset[19] = SFX_CAR_ACCEL_16;
|
||||
gBankStartOffset[12] = SFX_CAR_ACCEL_9;
|
||||
gBankStartOffset[2] = SFX_AMBULAN_VOICE_1_VAN_1;
|
||||
gBankStartOffset[21] = SFX_CAR_ACCEL_18;
|
||||
gBankStartOffset[22] = SFX_CAR_ACCEL_19;
|
||||
gBankStartOffset[8] = SFX_CAR_ACCEL_5;
|
||||
gBankStartOffset[23] = SFX_CAR_ACCEL_20;
|
||||
gBankStartOffset[14] = SFX_CAR_ACCEL_11;
|
||||
gBankStartOffset[20] = SFX_CAR_ACCEL_17;
|
||||
gBankStartOffset[18] = SFX_CAR_RC_HELI;
|
||||
gBankStartOffset[25] = SFX_CAR_AFTER_ACCEL_21;
|
||||
gBankStartOffset[26] = SFX_CAR_FINGER_OFF_ACCEL_21;
|
||||
gBankStartOffset[27] = SFX_CAR_ACCEL_22;
|
||||
gBankStartOffset[28] = SFX_CAR_AFTER_ACCEL_22;
|
||||
gBankStartOffset[29] = SFX_CAR_FINGER_OFF_ACCEL_22;
|
||||
gBankStartOffset[24] = SFX_CAR_ACCEL_21;
|
||||
gBankStartOffset[30] = SFX_HELI_APACHE_1;
|
||||
gBankStartOffset[31] = SFX_HELI_UNUSED_1;
|
||||
gBankStartOffset[32] = SFX_HELI_UNUSED_2;
|
||||
gBankStartOffset[33] = SFX_HELI_UNUSED_3;
|
||||
gBankStartOffset[34] = SFX_HELI_UNUSED_4;
|
||||
gBankStartOffset[35] = SFX_SEAPLANE_LOW;
|
||||
gBankStartOffset[37] = SFX_PLANE_UNUSED_2;
|
||||
gBankStartOffset[38] = SFX_PLANE_UNUSED_3;
|
||||
gBankStartOffset[39] = SFX_PLANE_UNUSED_4;
|
||||
gBankStartOffset[40] = SFX_BUILDINGS_BANK_ALARM;
|
||||
gBankStartOffset[41] = SFX_BUILDING_SNORE;
|
||||
gBankStartOffset[36] = SFX_PLANE_UNUSED_1;
|
||||
gBankStartOffset[43] = SFX_BUILDING_BAR_2;
|
||||
gBankStartOffset[44] = SFX_BUILDING_BAR_3;
|
||||
gBankStartOffset[45] = SFX_BUILDING_BAR_4;
|
||||
gBankStartOffset[46] = SFX_BUILDING_MALIBU_1;
|
||||
gBankStartOffset[47] = SFX_BUILDING_MALIBU_2;
|
||||
gBankStartOffset[42] = SFX_BUILDING_BAR_1;
|
||||
gBankStartOffset[49] = SFX_BUILDING_STRIP_1;
|
||||
gBankStartOffset[50] = SFX_BUILDING_STRIP_2;
|
||||
gBankStartOffset[51] = SFX_BUILDING_STRIP_3;
|
||||
gBankStartOffset[52] = SFX_BUILDING_CHURCH;
|
||||
gBankStartOffset[53] = SFX_BUILDING_FAN_1;
|
||||
gBankStartOffset[48] = SFX_BUILDING_MALIBU_3;
|
||||
gBankStartOffset[55] = SFX_BUILDING_INSECTS_1;
|
||||
gBankStartOffset[56] = SFX_BUILDING_INSECTS_2;
|
||||
gBankStartOffset[54] = SFX_BUILDING_FAN_2;
|
||||
gBankStartOffset[57] = SFX_CLUB_1;
|
||||
gBankStartOffset[58] = SFX_CLUB_2;
|
||||
gBankStartOffset[59] = SFX_CLUB_3;
|
||||
gBankStartOffset[60] = SFX_CLUB_4;
|
||||
gBankStartOffset[61] = SFX_FOOTSTEP_GRASS_1;
|
||||
gBankStartOffset[62] = SFX_FOOTSTEP_GRAVEL_1;
|
||||
gBankStartOffset[63] = SFX_FOOTSTEP_WOOD_1;
|
||||
gBankStartOffset[64] = SFX_FOOTSTEP_METAL_1;
|
||||
gBankStartOffset[65] = SFX_FOOTSTEP_WATER_1;
|
||||
gBankStartOffset[66] = SFX_FOOTSTEP_SAND_1;
|
||||
}
|
||||
|
||||
void cSampleManager::SetSpeakerConfig(int32 nConfig)
|
||||
{
|
||||
|
||||
@@ -764,7 +839,7 @@ cSampleManager::Initialise(void)
|
||||
{
|
||||
if ( _bSampmanInitialised )
|
||||
return TRUE;
|
||||
|
||||
SetUpDebugBanksInfo();
|
||||
EFXInit();
|
||||
|
||||
for(int i = 0; i < MAX_STREAMS; i++)
|
||||
@@ -925,11 +1000,21 @@ cSampleManager::Initialise(void)
|
||||
|
||||
for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ )
|
||||
{
|
||||
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)) )
|
||||
bool opened = false;
|
||||
char filename[MAX_PATH];
|
||||
sprintf(filename, "%s.VB", StreamedNameTable[i]);
|
||||
if ( aStream[0] )
|
||||
opened = aStream[0]->Open(filename, IsThisTrackAt16KHz(i) ? 16000 : 32000);
|
||||
|
||||
if ( !opened )
|
||||
{
|
||||
sprintf(filename, "%s.MP3", StreamedNameTable[i]);
|
||||
if ( aStream[0] )
|
||||
{
|
||||
opened = aStream[0]->Open(filename, IsThisTrackAt16KHz(i) ? 16000 : 32000);
|
||||
}
|
||||
}
|
||||
if ( opened )
|
||||
{
|
||||
uint32 tatalms = aStream[0]->GetLengthMS();
|
||||
aStream[0]->Close();
|
||||
@@ -969,7 +1054,9 @@ cSampleManager::Initialise(void)
|
||||
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX);
|
||||
ASSERT(nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] != 0);
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
nMissionSlotSfxStartAddress = (uintptr)malloc(MISSION_AUDIO_BLOCKSIZE*MISSION_AUDIO_SLOTS);
|
||||
ASSERT(nMissionSlotSfxStartAddress != 0);
|
||||
|
||||
// Find biggest player comment
|
||||
uint32 nMaxPedSize = 0;
|
||||
for (uint32 i = PLAYER_COMMENTS_START; i <= PLAYER_COMMENTS_END; i++)
|
||||
@@ -977,7 +1064,6 @@ cSampleManager::Initialise(void)
|
||||
|
||||
gPlayerTalkData = malloc(nMaxPedSize);
|
||||
ASSERT(gPlayerTalkData != 0);
|
||||
#endif
|
||||
|
||||
LoadSampleBank(SFX_BANK_0);
|
||||
}
|
||||
@@ -1139,13 +1225,20 @@ cSampleManager::Terminate(void)
|
||||
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = 0;
|
||||
}
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
if ( nMissionSlotSfxStartAddress != 0 )
|
||||
{
|
||||
free((void*)nMissionSlotSfxStartAddress);
|
||||
nMissionSlotSfxStartAddress = 0;
|
||||
|
||||
for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ )
|
||||
nMissionSlotSfx[i] = UINT32_MAX;
|
||||
}
|
||||
|
||||
if ( gPlayerTalkData != 0 )
|
||||
{
|
||||
free(gPlayerTalkData);
|
||||
gPlayerTalkData = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
_bSampmanInitialised = FALSE;
|
||||
}
|
||||
@@ -1271,32 +1364,50 @@ 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;
|
||||
ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
|
||||
|
||||
switch (nSlot)
|
||||
{
|
||||
case MISSION_AUDIO_SLOT_1:
|
||||
case MISSION_AUDIO_SLOT_2:
|
||||
return nMissionSlotSfx[nSlot] == nSample ? LOADING_STATUS_LOADED : LOADING_STATUS_NOT_LOADED;
|
||||
case MISSION_AUDIO_PLAYER_COMMENT:
|
||||
return nSample == gPlayerTalkSfx ? LOADING_STATUS_LOADED : LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8
|
||||
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
|
||||
{
|
||||
ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
|
||||
ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
|
||||
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;
|
||||
switch (nSlot)
|
||||
{
|
||||
case MISSION_AUDIO_SLOT_1:
|
||||
case MISSION_AUDIO_SLOT_2:
|
||||
if (fread((void*)(nMissionSlotSfxStartAddress + nSlot*MISSION_AUDIO_BLOCKSIZE), 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
|
||||
return FALSE;
|
||||
|
||||
gPlayerTalkSfx = nSample;
|
||||
nMissionSlotSfx[nSlot] = nSample;
|
||||
break;
|
||||
case MISSION_AUDIO_PLAYER_COMMENT:
|
||||
if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
|
||||
return FALSE;
|
||||
|
||||
gPlayerTalkSfx = nSample;
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8
|
||||
cSampleManager::IsPedCommentLoaded(uint32 nComment)
|
||||
@@ -1532,7 +1643,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) )
|
||||
@@ -1540,9 +1650,15 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
|
||||
addr = (uintptr)gPlayerTalkData;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ ) {
|
||||
if ( IsMissionAudioLoaded(i, nSfx) ) {
|
||||
addr = nMissionSlotSfxStartAddress + i * MISSION_AUDIO_BLOCKSIZE;
|
||||
goto MissionAudioFound;
|
||||
}
|
||||
}
|
||||
|
||||
int32 i;
|
||||
for ( i = 0; i < _TODOCONST(3); i++ )
|
||||
{
|
||||
@@ -1561,7 +1677,8 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
if (i == _TODOCONST(3))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
MissionAudioFound:
|
||||
if ( GetChannelUsedFlag(nChannel) )
|
||||
{
|
||||
TRACE("Stopping channel %d - really!!!", nChannel);
|
||||
@@ -1622,7 +1739,7 @@ cSampleManager::SetChannelVolume(uint32 nChannel, uint32 nVolume)
|
||||
ASSERT( nChannel >= MAXCHANNELS );
|
||||
ASSERT( nChannel < NUM_CHANNELS );
|
||||
|
||||
if ( nChannel == CHANNEL_POLICE_RADIO )
|
||||
if( nChannel >= CHANNEL_POLICE_RADIO )
|
||||
{
|
||||
uint32 vol = nVolume;
|
||||
if ( vol > MAX_VOLUME ) vol = MAX_VOLUME;
|
||||
@@ -1647,7 +1764,7 @@ cSampleManager::SetChannelPan(uint32 nChannel, uint32 nPan)
|
||||
ASSERT( nChannel >= MAXCHANNELS );
|
||||
ASSERT( nChannel < NUM_CHANNELS );
|
||||
|
||||
if ( nChannel == CHANNEL_POLICE_RADIO )
|
||||
if ( nChannel >= CHANNEL_POLICE_RADIO )
|
||||
{
|
||||
aChannel[nChannel].SetPan(nPan);
|
||||
}
|
||||
@@ -1703,7 +1820,9 @@ cSampleManager::StopChannel(uint32 nChannel)
|
||||
|
||||
void
|
||||
cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream)
|
||||
{
|
||||
{
|
||||
char filename[MAX_PATH];
|
||||
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
|
||||
if ( nFile < TOTAL_STREAMED_SOUNDS )
|
||||
@@ -1711,11 +1830,15 @@ 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
|
||||
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
if ( !stream->Setup() )
|
||||
sprintf(filename, "%s.VB", StreamedNameTable[nFile]);
|
||||
bool opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
if ( !opened )
|
||||
{
|
||||
sprintf(filename, "%s.MP3", StreamedNameTable[nFile]);
|
||||
opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
}
|
||||
|
||||
if ( opened && !stream->Setup() )
|
||||
{
|
||||
stream->Close();
|
||||
}
|
||||
@@ -1775,12 +1898,18 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
|
||||
nFile = 0;
|
||||
|
||||
sprintf(filename, "%s.VB", 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() ) {
|
||||
bool opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
|
||||
if ( !opened )
|
||||
{
|
||||
sprintf(filename, "%s.MP3", StreamedNameTable[nFile]);
|
||||
opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
}
|
||||
|
||||
if ( opened && stream->Setup() ) {
|
||||
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
nStreamLoopedFlag[nStream] = TRUE;
|
||||
if (position != 0)
|
||||
@@ -1831,14 +1960,18 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
{
|
||||
nFile = 0;
|
||||
_bIsMp3Active = FALSE;
|
||||
sprintf(filename, "%s.VB", 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);
|
||||
CStream* stream = aStream[nStream];
|
||||
bool opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
|
||||
if (stream->Setup()) {
|
||||
if ( !opened )
|
||||
{
|
||||
sprintf(filename, "%s.MP3", StreamedNameTable[nFile]);
|
||||
opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
}
|
||||
|
||||
if (opened && stream->Setup()) {
|
||||
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
nStreamLoopedFlag[nStream] = TRUE;
|
||||
if (position != 0)
|
||||
@@ -1879,16 +2012,19 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
position = 0;
|
||||
nFile = 0;
|
||||
}
|
||||
strcpy(filename, StreamedNameTable[nFile]);
|
||||
|
||||
CStream *stream = aStream[nStream];
|
||||
sprintf(filename, "%s.VB", StreamedNameTable[nFile]);
|
||||
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
|
||||
#endif
|
||||
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
CStream *stream = aStream[nStream];
|
||||
|
||||
if ( stream->Setup() ) {
|
||||
bool opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
|
||||
if ( !opened )
|
||||
{
|
||||
sprintf(filename, "%s.MP3", StreamedNameTable[nFile]);
|
||||
opened = stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
}
|
||||
|
||||
if ( opened && stream->Setup() ) {
|
||||
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
nStreamLoopedFlag[nStream] = TRUE;
|
||||
if (position != 0)
|
||||
|
||||
@@ -19,4 +19,12 @@ struct CColBox : public CBox
|
||||
using CBox::Set;
|
||||
|
||||
CColBox& operator=(const CColBox &other);
|
||||
};
|
||||
};
|
||||
|
||||
// no name for this
|
||||
// bounds for a number of triangles
|
||||
struct CColTriBBox : public CBox
|
||||
{
|
||||
int32 first;
|
||||
int32 last;
|
||||
};
|
||||
|
||||
@@ -4,9 +4,9 @@ struct CColLine
|
||||
{
|
||||
// NB: this has to be compatible with two CVuVectors
|
||||
CVector p0;
|
||||
int pad0;
|
||||
// int pad0;
|
||||
CVector p1;
|
||||
int pad1;
|
||||
// int pad1;
|
||||
|
||||
CColLine(void) { };
|
||||
CColLine(const CVector &p0, const CVector &p1) { this->p0 = p0; this->p1 = p1; };
|
||||
|
||||
+100
-38
@@ -1,4 +1,5 @@
|
||||
#include "common.h"
|
||||
#include "main.h"
|
||||
#include "ColModel.h"
|
||||
#include "Collision.h"
|
||||
#include "Game.h"
|
||||
@@ -7,6 +8,10 @@
|
||||
|
||||
CColModel::CColModel(void)
|
||||
{
|
||||
boundingSphere.Set(0.0001f, CVector(0.0f, 0.0f, 0.0f));
|
||||
boundingBox.Set(CVector(0.0f, 0.0f, 0.0f), CVector(0.0f, 0.0f, 0.0f));
|
||||
numTriBBoxes = 0;
|
||||
triBBoxes = nil;
|
||||
numSpheres = 0;
|
||||
spheres = nil;
|
||||
numLines = 0;
|
||||
@@ -18,14 +23,18 @@ CColModel::CColModel(void)
|
||||
triangles = nil;
|
||||
trianglePlanes = nil;
|
||||
level = LEVEL_GENERIC; // generic col slot
|
||||
ownsCollisionVolumes = true;
|
||||
// ownsCollisionVolumes = true;
|
||||
}
|
||||
|
||||
CColModel::~CColModel(void)
|
||||
{
|
||||
RemoveCollisionVolumes();
|
||||
if(!gNASTY_NASTY_MEM_SHUTDOWN_HACK){
|
||||
RemoveTrianglePlanes();
|
||||
RemoveCollisionVolumes();
|
||||
}
|
||||
}
|
||||
|
||||
//--LCS: no pool used, but maybe we better keep it?
|
||||
void*
|
||||
CColModel::operator new(size_t) throw()
|
||||
{
|
||||
@@ -43,19 +52,28 @@ CColModel::operator delete(void *p, size_t) throw()
|
||||
void
|
||||
CColModel::RemoveCollisionVolumes(void)
|
||||
{
|
||||
if(ownsCollisionVolumes){
|
||||
RwFree(spheres);
|
||||
RwFree(lines);
|
||||
RwFree(boxes);
|
||||
RwFree(vertices);
|
||||
RwFree(triangles);
|
||||
CCollision::RemoveTrianglePlanes(this);
|
||||
#ifdef FIX_BUGS
|
||||
// why is this missing?
|
||||
if(ownsCollisionVolumes)
|
||||
#endif
|
||||
if(!gUseChunkFiles){
|
||||
delete[] triBBoxes;
|
||||
delete[] spheres;
|
||||
delete[] lines;
|
||||
delete[] boxes;
|
||||
delete[] vertices;
|
||||
delete[] triangles;
|
||||
}
|
||||
CCollision::RemoveTrianglePlanes(this);
|
||||
numSpheres = 0;
|
||||
numTriBBoxes = 0;
|
||||
numLines = 0;
|
||||
numBoxes = 0;
|
||||
numTriangles = 0;
|
||||
spheres = nil;
|
||||
#ifdef FIX_BUGS
|
||||
triBBoxes = nil;
|
||||
#endif
|
||||
lines = nil;
|
||||
boxes = nil;
|
||||
vertices = nil;
|
||||
@@ -68,7 +86,7 @@ CColModel::CalculateTrianglePlanes(void)
|
||||
PUSH_MEMID(MEMID_COLLISION);
|
||||
|
||||
// HACK: allocate space for one more element to stuff the link pointer into
|
||||
trianglePlanes = (CColTrianglePlane*)RwMalloc(sizeof(CColTrianglePlane) * (numTriangles+1));
|
||||
trianglePlanes = new CColTrianglePlane[numTriangles+1];
|
||||
REGISTER_MEMPTR(&trianglePlanes);
|
||||
for(int i = 0; i < numTriangles; i++)
|
||||
trianglePlanes[i].Set(vertices, triangles[i]);
|
||||
@@ -79,8 +97,10 @@ CColModel::CalculateTrianglePlanes(void)
|
||||
void
|
||||
CColModel::RemoveTrianglePlanes(void)
|
||||
{
|
||||
RwFree(trianglePlanes);
|
||||
trianglePlanes = nil;
|
||||
if(trianglePlanes){
|
||||
delete[] trianglePlanes;
|
||||
trianglePlanes = nil;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -112,20 +132,33 @@ CColModel::operator=(const CColModel &other)
|
||||
boundingSphere = other.boundingSphere;
|
||||
boundingBox = other.boundingBox;
|
||||
|
||||
// copy tri bboxes
|
||||
if(other.numTriBBoxes){
|
||||
if(numTriBBoxes != other.numTriBBoxes){
|
||||
numTriBBoxes = other.numTriBBoxes;
|
||||
delete[] triBBoxes;
|
||||
triBBoxes = new CColTriBBox[numTriBBoxes];
|
||||
}
|
||||
for(i = 0; i < numTriBBoxes; i++)
|
||||
triBBoxes[i] = other.triBBoxes[i];
|
||||
}else{
|
||||
numTriBBoxes = 0;
|
||||
delete[] triBBoxes;
|
||||
triBBoxes = nil;
|
||||
}
|
||||
|
||||
// copy spheres
|
||||
if(other.numSpheres){
|
||||
if(numSpheres != other.numSpheres){
|
||||
numSpheres = other.numSpheres;
|
||||
if(spheres)
|
||||
RwFree(spheres);
|
||||
spheres = (CColSphere*)RwMalloc(numSpheres*sizeof(CColSphere));
|
||||
delete[] spheres;
|
||||
spheres = new CColSphere[numSpheres];
|
||||
}
|
||||
for(i = 0; i < numSpheres; i++)
|
||||
spheres[i] = other.spheres[i];
|
||||
}else{
|
||||
numSpheres = 0;
|
||||
if(spheres)
|
||||
RwFree(spheres);
|
||||
delete[] spheres;
|
||||
spheres = nil;
|
||||
}
|
||||
|
||||
@@ -133,16 +166,14 @@ CColModel::operator=(const CColModel &other)
|
||||
if(other.numLines){
|
||||
if(numLines != other.numLines){
|
||||
numLines = other.numLines;
|
||||
if(lines)
|
||||
RwFree(lines);
|
||||
lines = (CColLine*)RwMalloc(numLines*sizeof(CColLine));
|
||||
delete[] lines;
|
||||
lines = new CColLine[numLines];
|
||||
}
|
||||
for(i = 0; i < numLines; i++)
|
||||
lines[i] = other.lines[i];
|
||||
}else{
|
||||
numLines = 0;
|
||||
if(lines)
|
||||
RwFree(lines);
|
||||
delete[] lines;
|
||||
lines = nil;
|
||||
}
|
||||
|
||||
@@ -150,23 +181,21 @@ CColModel::operator=(const CColModel &other)
|
||||
if(other.numBoxes){
|
||||
if(numBoxes != other.numBoxes){
|
||||
numBoxes = other.numBoxes;
|
||||
if(boxes)
|
||||
RwFree(boxes);
|
||||
boxes = (CColBox*)RwMalloc(numBoxes*sizeof(CColBox));
|
||||
delete[] boxes;
|
||||
boxes = new CColBox[numBoxes];
|
||||
}
|
||||
for(i = 0; i < numBoxes; i++)
|
||||
boxes[i] = other.boxes[i];
|
||||
}else{
|
||||
numBoxes = 0;
|
||||
if(boxes)
|
||||
RwFree(boxes);
|
||||
delete[] boxes;
|
||||
boxes = nil;
|
||||
}
|
||||
|
||||
// copy mesh
|
||||
if(other.numTriangles){
|
||||
// copy vertices
|
||||
numVerts = 0;
|
||||
numVerts = -1;
|
||||
for(i = 0; i < other.numTriangles; i++){
|
||||
if(other.triangles[i].a > numVerts)
|
||||
numVerts = other.triangles[i].a;
|
||||
@@ -176,10 +205,9 @@ CColModel::operator=(const CColModel &other)
|
||||
numVerts = other.triangles[i].c;
|
||||
}
|
||||
numVerts++;
|
||||
if(vertices)
|
||||
RwFree(vertices);
|
||||
delete[] vertices;
|
||||
if(numVerts){
|
||||
vertices = (CompressedVector*)RwMalloc(numVerts*sizeof(CompressedVector));
|
||||
vertices = new CompressedVector[numVerts];
|
||||
for(i = 0; i < numVerts; i++)
|
||||
vertices[i] = other.vertices[i];
|
||||
}
|
||||
@@ -187,20 +215,54 @@ CColModel::operator=(const CColModel &other)
|
||||
// copy triangles
|
||||
if(numTriangles != other.numTriangles){
|
||||
numTriangles = other.numTriangles;
|
||||
if(triangles)
|
||||
RwFree(triangles);
|
||||
triangles = (CColTriangle*)RwMalloc(numTriangles*sizeof(CColTriangle));
|
||||
delete[] triangles;
|
||||
triangles = new CColTriangle[numTriangles];
|
||||
}
|
||||
for(i = 0; i < numTriangles; i++)
|
||||
triangles[i] = other.triangles[i];
|
||||
}else{
|
||||
numTriangles = 0;
|
||||
if(triangles)
|
||||
RwFree(triangles);
|
||||
delete[] triangles;
|
||||
triangles = nil;
|
||||
if(vertices)
|
||||
RwFree(vertices);
|
||||
delete[] vertices;
|
||||
vertices = nil;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool
|
||||
CColModel::Write(base::cRelocatableChunkWriter &writer, bool allocSpace)
|
||||
{
|
||||
int numVerts = -1;
|
||||
for(int i = 0; i < numTriangles; i++){
|
||||
if(triangles[i].a > numVerts)
|
||||
numVerts = triangles[i].a;
|
||||
if(triangles[i].b > numVerts)
|
||||
numVerts = triangles[i].b;
|
||||
if(triangles[i].c > numVerts)
|
||||
numVerts = triangles[i].c;
|
||||
}
|
||||
numVerts++;
|
||||
|
||||
if(allocSpace)
|
||||
writer.AllocateRaw(this, sizeof(*this), 16, false, true);
|
||||
writer.AllocateRaw(spheres, sizeof(*spheres)*numSpheres, 16, false, true);
|
||||
writer.AddPatch(&spheres);
|
||||
writer.AllocateRaw(lines, sizeof(*lines)*numLines, 16, false, true);
|
||||
writer.AddPatch(&lines);
|
||||
writer.AllocateRaw(boxes, sizeof(*boxes)*numBoxes, 16, false, true);
|
||||
writer.AddPatch(&boxes);
|
||||
if(triBBoxes && numTriBBoxes != 0){
|
||||
writer.AllocateRaw(triBBoxes, sizeof(*triBBoxes)*numTriBBoxes, 16, false, true);
|
||||
writer.AddPatch(&triBBoxes);
|
||||
}else
|
||||
triBBoxes = nil;
|
||||
if(numTriangles != 0){
|
||||
writer.AllocateRaw(vertices, sizeof(*vertices)*numVerts, 2, false, true);
|
||||
writer.AddPatch(&vertices);
|
||||
writer.AllocateRaw(triangles, sizeof(*triangles)*numTriangles, 2, false, true);
|
||||
writer.AddPatch(&triangles);
|
||||
RemoveTrianglePlanes();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -15,11 +15,13 @@ struct CColModel
|
||||
int16 numBoxes;
|
||||
int16 numTriangles;
|
||||
int8 numLines;
|
||||
int8 numTriBBoxes;
|
||||
uint8 level; // colstore slot but probably still named level
|
||||
bool ownsCollisionVolumes;
|
||||
CColSphere *spheres;
|
||||
CColLine *lines;
|
||||
CColBox *boxes;
|
||||
CColTriBBox *triBBoxes;
|
||||
CompressedVector *vertices;
|
||||
CColTriangle *triangles;
|
||||
CColTrianglePlane *trianglePlanes;
|
||||
@@ -36,4 +38,6 @@ struct CColModel
|
||||
void *operator new(size_t) throw();
|
||||
void operator delete(void *p, size_t) throw();
|
||||
CColModel& operator=(const CColModel& other);
|
||||
|
||||
bool Write(base::cRelocatableChunkWriter &writer, bool allocSpace);
|
||||
};
|
||||
@@ -3,15 +3,13 @@
|
||||
struct CColPoint
|
||||
{
|
||||
CVector point;
|
||||
int pad1;
|
||||
float depth;
|
||||
// the surface normal on the surface of point
|
||||
CVector normal;
|
||||
int pad2;
|
||||
uint8 surfaceA;
|
||||
uint8 pieceA;
|
||||
uint8 surfaceB;
|
||||
uint8 pieceB;
|
||||
float depth;
|
||||
|
||||
const CVector &GetNormal() { return normal; }
|
||||
float GetDepth() { return depth; }
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
|
||||
#include "SurfaceTable.h"
|
||||
|
||||
struct CSphere
|
||||
// TODO(LCS): maybe this was in a union with CVuVector? or is the alignment manual?
|
||||
struct TYPEALIGN(16) CSphere
|
||||
{
|
||||
// NB: this has to be compatible with a CVuVector
|
||||
CVector center;
|
||||
RwV3d center;
|
||||
float radius;
|
||||
void Set(float radius, const CVector ¢er) { this->center = center; this->radius = radius; }
|
||||
};
|
||||
|
||||
+162
-14
@@ -1,5 +1,7 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "smallHeap.h"
|
||||
#include "templates.h"
|
||||
#include "General.h"
|
||||
#include "ModelInfo.h"
|
||||
@@ -8,6 +10,9 @@
|
||||
#include "Script.h"
|
||||
#include "Timer.h"
|
||||
#include "Camera.h"
|
||||
#include "World.h"
|
||||
#include "Zones.h"
|
||||
#include "Garages.h"
|
||||
#include "Frontend.h"
|
||||
#include "Physical.h"
|
||||
#include "ColStore.h"
|
||||
@@ -15,16 +20,55 @@
|
||||
#include "Pools.h"
|
||||
|
||||
CPool<ColDef,ColDef> *CColStore::ms_pColPool;
|
||||
bool CColStore::m_onlyBB;
|
||||
#ifndef MASTER
|
||||
bool bDispColInMem;
|
||||
#endif
|
||||
|
||||
// LCS: file done except unused:
|
||||
// CColStore::LoadCol(int,char const*)
|
||||
// CColStore::LoadAllBoundingBoxes(void)
|
||||
// CColStore::Write(base::cRelocatableChunkWriter &)
|
||||
|
||||
const CVector&
|
||||
LevelPos(eLevelName level)
|
||||
{
|
||||
static CVector pos[4] = {
|
||||
CVector(1060.0f, -800.0f, 0.0f),
|
||||
CVector(1060.0f, -800.0f, 0.0f),
|
||||
CVector(350.0f, -624.0f, 0.0f),
|
||||
CVector(-670.0f, -511.0f, 0.0f)
|
||||
};
|
||||
return pos[level];
|
||||
};
|
||||
|
||||
static eLevelName
|
||||
PosLevel(const CVector &pos)
|
||||
{
|
||||
static eLevelName lastPlayerLevel = LEVEL_INDUSTRIAL;
|
||||
static eLevelName lastOtherLevel = LEVEL_INDUSTRIAL;
|
||||
|
||||
if(Abs(FindPlayerCoors().x - pos.x) < 5.0f &&
|
||||
Abs(FindPlayerCoors().y - pos.y) < 5.0f &&
|
||||
Abs(FindPlayerCoors().z - pos.z) < 5.0f){
|
||||
if(CGame::currLevel != LEVEL_GENERIC)
|
||||
lastPlayerLevel = CGame::currLevel;
|
||||
return lastPlayerLevel;
|
||||
}else{
|
||||
eLevelName lvl = CTheZones::GetLevelFromPosition(&pos);
|
||||
if(lvl != LEVEL_GENERIC)
|
||||
lastOtherLevel = lvl;
|
||||
return lastOtherLevel;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CColStore::Initialise(void)
|
||||
{
|
||||
if(ms_pColPool == nil)
|
||||
if(ms_pColPool == nil){
|
||||
ms_pColPool = new CPool<ColDef,ColDef>(COLSTORESIZE, "CollisionFiles");
|
||||
AddColSlot("generic"); // slot 0. not streamed
|
||||
AddColSlot("generic"); // slot 0. not streamed
|
||||
}
|
||||
#ifndef MASTER
|
||||
VarConsole.Add("Display collision in memory", &bDispColInMem, true);
|
||||
#endif
|
||||
@@ -38,7 +82,9 @@ CColStore::Shutdown(void)
|
||||
RemoveColSlot(i);
|
||||
if(ms_pColPool)
|
||||
delete ms_pColPool;
|
||||
#ifdef FIX_BUGS
|
||||
ms_pColPool = nil;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
@@ -119,11 +165,34 @@ CColStore::LoadCol(int32 slot, uint8 *buffer, int32 bufsize)
|
||||
return success;
|
||||
}
|
||||
|
||||
struct ColChunkEntry
|
||||
{
|
||||
int32 modelId; // -1 marks end
|
||||
CColModel *colModel;
|
||||
};
|
||||
|
||||
void
|
||||
CColStore::LoadColCHK(int32 slot, void *data, void *chunk)
|
||||
{
|
||||
ColDef *def = GetSlot(slot);
|
||||
def->chunk = chunk;
|
||||
CStreaming::RegisterPointer(&def->chunk, 1, true);
|
||||
for(ColChunkEntry *entry = (ColChunkEntry*)data; entry->modelId != -1; entry++){
|
||||
CBaseModelInfo *mi = CModelInfo::GetModelInfo(entry->modelId);
|
||||
mi->SetColModel(entry->colModel, true); // we own this? can that work?
|
||||
CStreaming::RegisterPointer(&mi->m_colModel, 1, true);
|
||||
}
|
||||
def->isLoaded = true;
|
||||
}
|
||||
|
||||
CColModel nullCollision;
|
||||
|
||||
void
|
||||
CColStore::RemoveCol(int32 slot)
|
||||
{
|
||||
int id;
|
||||
GetSlot(slot)->isLoaded = false;
|
||||
ColDef *def = GetSlot(slot);
|
||||
def->isLoaded = false;
|
||||
for(id = 0; id < MODELINFOSIZE; id++){
|
||||
CBaseModelInfo *mi = CModelInfo::GetModelInfo(id);
|
||||
if(mi){
|
||||
@@ -132,6 +201,23 @@ CColStore::RemoveCol(int32 slot)
|
||||
col->RemoveCollisionVolumes();
|
||||
}
|
||||
}
|
||||
if(gUseChunkFiles){
|
||||
for(id = 0; id < MODELINFOSIZE; id++){
|
||||
CBaseModelInfo *mi = CModelInfo::GetModelInfo(id);
|
||||
if(mi){
|
||||
CColModel *col = mi->GetColModel();
|
||||
if(col && col->level == slot){
|
||||
mi->SetColModel(&nullCollision);
|
||||
CStreaming::UnregisterPointer(&mi->m_colModel, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(def->chunk){
|
||||
CStreaming::UnregisterPointer(&def->chunk, 1);
|
||||
cSmallHeap::msInstance.Free(def->chunk);
|
||||
def->chunk = nil;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -156,29 +242,49 @@ CColStore::RemoveAllCollision(void)
|
||||
}
|
||||
|
||||
static bool bLoadAtSecondPosition;
|
||||
static CVector2D secondPosition;
|
||||
static CVector secondPosition;
|
||||
|
||||
void
|
||||
CColStore::AddCollisionNeededAtPosn(const CVector2D &pos)
|
||||
CColStore::AddCollisionNeededAtPosn(const CVector &pos)
|
||||
{
|
||||
bLoadAtSecondPosition = true;
|
||||
secondPosition = pos;
|
||||
}
|
||||
|
||||
void
|
||||
CColStore::LoadCollision(const CVector2D &pos)
|
||||
CColStore::LoadCollision(const CVector &pos, eLevelName level)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(CStreaming::ms_disableStreaming)
|
||||
return;
|
||||
|
||||
if(level == LEVEL_GENERIC)
|
||||
level = PosLevel(pos);
|
||||
|
||||
eLevelName allowedLevel = (eLevelName)CTheScripts::AllowedCollision[0];
|
||||
if(allowedLevel == LEVEL_GENERIC)
|
||||
allowedLevel = (eLevelName)CTheScripts::AllowedCollision[1];
|
||||
|
||||
bool requestedSomething = false;
|
||||
|
||||
for(i = 1; i < COLSTORESIZE; i++){
|
||||
if(GetSlot(i) == nil)
|
||||
if(GetSlot(i) == nil || !DoScriptsWantThisIn(i))
|
||||
continue;
|
||||
|
||||
bool wantThisOne = false;
|
||||
|
||||
if(strcmp(GetColName(i), "indust") == 0){
|
||||
if(allowedLevel != LEVEL_GENERIC && level != LEVEL_INDUSTRIAL)
|
||||
wantThisOne = allowedLevel == LEVEL_INDUSTRIAL;
|
||||
else
|
||||
wantThisOne = level == LEVEL_INDUSTRIAL;
|
||||
}else if(GetBoundingBox(i).IsPointInside(LevelPos(level)))
|
||||
wantThisOne = true;
|
||||
else if(allowedLevel != LEVEL_GENERIC && GetBoundingBox(i).IsPointInside(LevelPos(allowedLevel)))
|
||||
wantThisOne = true;
|
||||
|
||||
/* // LCS: removed
|
||||
if(GetBoundingBox(i).IsPointInside(pos) ||
|
||||
bLoadAtSecondPosition && GetBoundingBox(i).IsPointInside(secondPosition, -119.0f) ||
|
||||
strcmp(GetColName(i), "yacht") == 0){
|
||||
@@ -203,28 +309,38 @@ CColStore::LoadCollision(const CVector2D &pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if(wantThisOne)
|
||||
if(wantThisOne){
|
||||
CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY);
|
||||
else
|
||||
requestedSomething = true;
|
||||
}else
|
||||
CStreaming::RemoveCol(i);
|
||||
}
|
||||
if(requestedSomething){
|
||||
CTimer::Suspend();
|
||||
// BUG? request was done with priority but now loading non-priority?
|
||||
CStreaming::LoadAllRequestedModels(false);
|
||||
CGarages::SetupAnyGaragesForThisIsland();
|
||||
CTimer::Resume();
|
||||
}
|
||||
bLoadAtSecondPosition = false;
|
||||
}
|
||||
|
||||
void
|
||||
CColStore::RequestCollision(const CVector2D &pos)
|
||||
CColStore::RequestCollision(const CVector &pos)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 1; i < COLSTORESIZE; i++)
|
||||
if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -115.0f))
|
||||
if(GetSlot(i) && DoScriptsWantThisIn(i) && GetBoundingBox(i).IsPointInside(LevelPos(PosLevel(pos)), -115.0f))
|
||||
CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY);
|
||||
}
|
||||
|
||||
void
|
||||
CColStore::EnsureCollisionIsInMemory(const CVector2D &pos)
|
||||
CColStore::EnsureCollisionIsInMemory(const CVector &pos)
|
||||
{
|
||||
/* // LCS: removed
|
||||
int i;
|
||||
|
||||
if(CStreaming::ms_disableStreaming)
|
||||
@@ -240,16 +356,48 @@ CColStore::EnsureCollisionIsInMemory(const CVector2D &pos)
|
||||
CStreaming::LoadAllRequestedModels(false);
|
||||
CTimer::Resume();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
bool
|
||||
CColStore::HasCollisionLoaded(const CVector2D &pos)
|
||||
CColStore::DoScriptsWantThisIn(int32 slot)
|
||||
{
|
||||
if(slot == 0)
|
||||
return false;
|
||||
ColDef *coldef = GetSlot(slot);
|
||||
if(coldef == nil)
|
||||
return false;
|
||||
if(strcmp(coldef->name, "fortstaunton") == 0)
|
||||
return !CTheScripts::IsFortStauntonDestroyed();
|
||||
if(strcmp(coldef->name, "fortdestroyed") == 0)
|
||||
return CTheScripts::IsFortStauntonDestroyed();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CColStore::HasCollisionLoaded(eLevelName level)
|
||||
{
|
||||
int i;
|
||||
|
||||
const CVector &pos = LevelPos(level);
|
||||
for(i = 1; i < COLSTORESIZE; i++)
|
||||
if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -115.0f) &&
|
||||
if(GetSlot(i) && DoScriptsWantThisIn(i) &&
|
||||
(!CGeneral::faststricmp(GetColName(i), "indust") && level == LEVEL_INDUSTRIAL ||
|
||||
GetBoundingBox(i).IsPointInside(pos)) &&
|
||||
!GetSlot(i)->isLoaded)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CColStore::HasCollisionLoaded(const CVector &pos)
|
||||
{
|
||||
return HasCollisionLoaded(PosLevel(pos));
|
||||
}
|
||||
|
||||
void
|
||||
CColStore::Load(bool onlyBB, CPool<ColDef> *pool)
|
||||
{
|
||||
ms_pColPool = pool;
|
||||
m_onlyBB = onlyBB;
|
||||
}
|
||||
|
||||
@@ -9,11 +9,13 @@ struct ColDef { // made up name
|
||||
char name[20];
|
||||
int16 minIndex;
|
||||
int16 maxIndex;
|
||||
void *chunk;
|
||||
};
|
||||
|
||||
class CColStore
|
||||
{
|
||||
static CPool<ColDef,ColDef> *ms_pColPool;
|
||||
static bool m_onlyBB;
|
||||
|
||||
public:
|
||||
static void Initialise(void);
|
||||
@@ -25,14 +27,18 @@ public:
|
||||
static CRect &GetBoundingBox(int32 slot);
|
||||
static void IncludeModelIndex(int32 slot, int32 modelIndex);
|
||||
static bool LoadCol(int32 storeID, uint8 *buffer, int32 bufsize);
|
||||
static void LoadColCHK(int32 slot, void *data, void *chunk);
|
||||
static void RemoveCol(int32 slot);
|
||||
static void AddCollisionNeededAtPosn(const CVector2D &pos);
|
||||
static void AddCollisionNeededAtPosn(const CVector &pos);
|
||||
static void LoadAllCollision(void);
|
||||
static void RemoveAllCollision(void);
|
||||
static void LoadCollision(const CVector2D &pos);
|
||||
static void RequestCollision(const CVector2D &pos);
|
||||
static void EnsureCollisionIsInMemory(const CVector2D &pos);
|
||||
static bool HasCollisionLoaded(const CVector2D &pos);
|
||||
static void LoadCollision(const CVector &pos, eLevelName level = LEVEL_GENERIC);
|
||||
static void RequestCollision(const CVector &pos);
|
||||
static void EnsureCollisionIsInMemory(const CVector &pos);
|
||||
static bool DoScriptsWantThisIn(int32 slot);
|
||||
static bool HasCollisionLoaded(eLevelName level);
|
||||
static bool HasCollisionLoaded(const CVector &pos);
|
||||
static void Load(bool, CPool<ColDef> *pool);
|
||||
|
||||
static ColDef *GetSlot(int slot) {
|
||||
assert(slot >= 0);
|
||||
@@ -41,3 +47,5 @@ public:
|
||||
return ms_pColPool->GetSlot(slot);
|
||||
}
|
||||
};
|
||||
|
||||
const CVector& LevelPos(eLevelName level);
|
||||
|
||||
@@ -62,6 +62,7 @@ struct CColTrianglePlane
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
// TODO(LCS): LCS actually uses CompressedVector too
|
||||
CVector normal;
|
||||
float dist;
|
||||
uint8 dir;
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
#include "Camera.h"
|
||||
#include "ColStore.h"
|
||||
|
||||
// gotta figure out how they handled CSphere exactly
|
||||
// so using this to remind me to look into it again.
|
||||
#define CVECTORHACK(rwv3d) CVector(rwv3d)
|
||||
|
||||
#ifdef VU_COLLISION
|
||||
#include "VuCollision.h"
|
||||
|
||||
@@ -398,7 +402,7 @@ CCollision::TestLineSphere(const CColLine &line, const CColSphere &sph)
|
||||
// The length of the tangent would be this: Sqrt((c-p0)^2 - r^2).
|
||||
// Negative if p0 is inside the sphere! This breaks the test!
|
||||
float tansq = 4.0f * linesq *
|
||||
(sph.center.MagnitudeSqr() - 2.0f*DotProduct(sph.center, line.p0) + line.p0.MagnitudeSqr() - sph.radius*sph.radius);
|
||||
(CVECTORHACK(sph.center).MagnitudeSqr() - 2.0f*DotProduct(sph.center, line.p0) + line.p0.MagnitudeSqr() - sph.radius*sph.radius);
|
||||
float diffsq = projline*projline - tansq;
|
||||
// if diffsq < 0 that means the line is a passant, so no intersection
|
||||
if(diffsq < 0.0f)
|
||||
@@ -477,9 +481,9 @@ CCollision::TestSphereTriangle(const CColSphere &sphere,
|
||||
case 2:
|
||||
// closest to an edge
|
||||
// looks like original game as DistToLine manually inlined
|
||||
if(!insideAB) dist = DistToLine(&va, &vb, &sphere.center);
|
||||
else if(!insideAC) dist = DistToLine(&va, &vc, &sphere.center);
|
||||
else if(!insideBC) dist = DistToLine(&vb, &vc, &sphere.center);
|
||||
if(!insideAB) dist = DistToLine(&va, &vb, &CVECTORHACK(sphere.center));
|
||||
else if(!insideAC) dist = DistToLine(&va, &vc, &CVECTORHACK(sphere.center));
|
||||
else if(!insideBC) dist = DistToLine(&vb, &vc, &CVECTORHACK(sphere.center));
|
||||
else assert(0);
|
||||
break;
|
||||
case 3:
|
||||
@@ -1295,9 +1299,9 @@ CCollision::ProcessSphereTriangle(const CColSphere &sphere,
|
||||
case 2:
|
||||
// closest to an edge
|
||||
// looks like original game as DistToLine manually inlined
|
||||
if(!insideAB) dist = DistToLine(&va, &vb, &sphere.center, p);
|
||||
else if(!insideAC) dist = DistToLine(&va, &vc, &sphere.center, p);
|
||||
else if(!insideBC) dist = DistToLine(&vb, &vc, &sphere.center, p);
|
||||
if(!insideAB) dist = DistToLine(&va, &vb, &CVECTORHACK(sphere.center), p);
|
||||
else if(!insideAC) dist = DistToLine(&va, &vc, &CVECTORHACK(sphere.center), p);
|
||||
else if(!insideBC) dist = DistToLine(&vb, &vc, &CVECTORHACK(sphere.center), p);
|
||||
else assert(0);
|
||||
break;
|
||||
case 3:
|
||||
|
||||
@@ -1,22 +1,25 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "TempColModels.h"
|
||||
#include "Game.h"
|
||||
|
||||
CColModel CTempColModels::ms_colModelPed1;
|
||||
// LCS: haven't yet checked the numbers but they probably haven't changed
|
||||
|
||||
CColModel CTempColModels::ms_colModelPed2;
|
||||
CColModel CTempColModels::ms_colModelBBox;
|
||||
CColModel CTempColModels::ms_colModelBumper1;
|
||||
CColModel CTempColModels::ms_colModelWheel1;
|
||||
CColModel CTempColModels::ms_colModelPanel1;
|
||||
CColModel CTempColModels::ms_colModelBodyPart2;
|
||||
CColModel CTempColModels::ms_colModelBodyPart1;
|
||||
CColModel CTempColModels::ms_colModelCutObj[5];
|
||||
CColModel CTempColModels::ms_colModelCutObj[10];
|
||||
CColModel CTempColModels::ms_colModelPedGroundHit;
|
||||
CColModel CTempColModels::ms_colModelBoot1;
|
||||
CColModel CTempColModels::ms_colModelDoor1;
|
||||
CColModel CTempColModels::ms_colModelBonnet1;
|
||||
CColModel CTempColModels::ms_colModelWeapon;
|
||||
CColModel CTempColModels::ms_colModelFerryDocked;
|
||||
|
||||
CTempColModels *gpTempColModels;
|
||||
|
||||
|
||||
CColSphere s_aPedSpheres[3];
|
||||
@@ -34,6 +37,7 @@ CColSphere s_aBootSpheres[4];
|
||||
CColSphere s_aWheelSpheres[2];
|
||||
CColSphere s_aBodyPartSpheres1[2];
|
||||
CColSphere s_aBodyPartSpheres2[2];
|
||||
CColBox S_aFerryDockedBoxes[1];
|
||||
|
||||
void
|
||||
CTempColModels::Initialise(void)
|
||||
@@ -44,11 +48,26 @@ CTempColModels::Initialise(void)
|
||||
colmodel.level = LEVEL_GENERIC;\
|
||||
colmodel.ownsCollisionVolumes = false;
|
||||
|
||||
int i;
|
||||
if(gMakeResources){
|
||||
if(gpTempColModels == nil){
|
||||
gpTempColModels = new CTempColModels;
|
||||
gpTempColModels->Initialise();
|
||||
return;
|
||||
}
|
||||
|
||||
ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
|
||||
ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f));
|
||||
ms_colModelBBox.level = LEVEL_GENERIC;
|
||||
ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
|
||||
ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f));
|
||||
ms_colModelBBox.level = LEVEL_GENERIC;
|
||||
|
||||
ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f));
|
||||
ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f));
|
||||
SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres);
|
||||
|
||||
ms_colModelWeapon.boundingSphere.Set(0.25f, CVector(0.0f, 0.0f, 0.0f));
|
||||
ms_colModelWeapon.boundingBox.Set(CVector(-0.25f, -0.25f, -0.25f), CVector(0.25f, 0.25f, 0.25f));
|
||||
}
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++) {
|
||||
ms_colModelCutObj[i].boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
|
||||
@@ -74,10 +93,6 @@ CTempColModels::Initialise(void)
|
||||
s_aPedSpheres[i].piece = 0;
|
||||
}
|
||||
|
||||
ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f));
|
||||
ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f));
|
||||
SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres);
|
||||
|
||||
// Ped 2 Spheres
|
||||
|
||||
s_aPed2Spheres[0].radius = 0.3f;
|
||||
@@ -294,13 +309,47 @@ CTempColModels::Initialise(void)
|
||||
|
||||
SET_COLMODEL_SPHERES(ms_colModelBodyPart2, s_aBodyPartSpheres2);
|
||||
|
||||
ms_colModelWeapon.boundingSphere.radius = 0.25f;
|
||||
ms_colModelWeapon.boundingBox.min.x = -0.25f;
|
||||
ms_colModelWeapon.boundingBox.min.y = -0.25f;
|
||||
ms_colModelWeapon.boundingBox.min.z = -0.25f;
|
||||
ms_colModelWeapon.boundingBox.max.x = 0.25f;
|
||||
ms_colModelWeapon.boundingBox.max.y = 0.25f;
|
||||
ms_colModelWeapon.boundingBox.max.z = 0.25f;
|
||||
// Ferry Docked
|
||||
|
||||
S_aFerryDockedBoxes[0].Set(CVector(-6.3f, -22.78f, -2.0f), CVector(6.3f, 22.78f, 2.8f), SURFACE_THICK_METAL_PLATE, SURFACE_DEFAULT);
|
||||
|
||||
ms_colModelFerryDocked.boundingSphere.Set(35.0f, CVector(0.0f, -0.0f, 0.0f));
|
||||
ms_colModelFerryDocked.boundingBox.Set(S_aFerryDockedBoxes[0].min, S_aFerryDockedBoxes[0].max);
|
||||
ms_colModelFerryDocked.spheres = nil;
|
||||
ms_colModelFerryDocked.numSpheres = 0;
|
||||
ms_colModelFerryDocked.boxes = S_aFerryDockedBoxes;
|
||||
ms_colModelFerryDocked.numBoxes = ARRAY_SIZE(S_aFerryDockedBoxes);
|
||||
ms_colModelFerryDocked.level = LEVEL_GENERIC;
|
||||
|
||||
|
||||
#undef SET_COLMODEL_SPHERES
|
||||
}
|
||||
|
||||
void
|
||||
CTempColModels::Write(base::cRelocatableChunkWriter &writer)
|
||||
{
|
||||
writer.AllocateRaw(this, sizeof(*this), 0x10, false, true);
|
||||
|
||||
ms_colModelBBox.Write(writer, false);
|
||||
writer.AddPatch(&ms_colModelBBox);
|
||||
|
||||
ms_colModelPed1.Write(writer, false);
|
||||
writer.AddPatch(&ms_colModelPed1);
|
||||
|
||||
ms_colModelWeapon.Write(writer, false);
|
||||
writer.AddPatch(&ms_colModelWeapon);
|
||||
|
||||
for(int i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++)
|
||||
ms_colModelCutObj[i].Write(writer, true);
|
||||
ms_colModelPed2.Write(writer, true);
|
||||
ms_colModelPedGroundHit.Write(writer, true);
|
||||
ms_colModelDoor1.Write(writer, true);
|
||||
ms_colModelBumper1.Write(writer, true);
|
||||
ms_colModelPanel1.Write(writer, true);
|
||||
ms_colModelBonnet1.Write(writer, true);
|
||||
ms_colModelBoot1.Write(writer, true);
|
||||
ms_colModelWheel1.Write(writer, true);
|
||||
ms_colModelBodyPart1.Write(writer, true);
|
||||
ms_colModelBodyPart2.Write(writer, true);
|
||||
ms_colModelFerryDocked.Write(writer, true);
|
||||
}
|
||||
|
||||
@@ -5,20 +5,25 @@
|
||||
class CTempColModels
|
||||
{
|
||||
public:
|
||||
static CColModel ms_colModelPed1;
|
||||
CColModel ms_colModelPed1;
|
||||
CColModel ms_colModelBBox;
|
||||
CColModel ms_colModelWeapon;
|
||||
|
||||
static CColModel ms_colModelPed2;
|
||||
static CColModel ms_colModelBBox;
|
||||
static CColModel ms_colModelBumper1;
|
||||
static CColModel ms_colModelWheel1;
|
||||
static CColModel ms_colModelPanel1;
|
||||
static CColModel ms_colModelBodyPart2;
|
||||
static CColModel ms_colModelBodyPart1;
|
||||
static CColModel ms_colModelCutObj[5];
|
||||
static CColModel ms_colModelCutObj[10];
|
||||
static CColModel ms_colModelPedGroundHit;
|
||||
static CColModel ms_colModelBoot1;
|
||||
static CColModel ms_colModelDoor1;
|
||||
static CColModel ms_colModelBonnet1;
|
||||
static CColModel ms_colModelWeapon;
|
||||
static CColModel ms_colModelFerryDocked;
|
||||
|
||||
static void Initialise(void);
|
||||
void Initialise(void);
|
||||
void Write(base::cRelocatableChunkWriter &writer);
|
||||
};
|
||||
|
||||
extern CTempColModels *gpTempColModels;
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
#include "PathFind.h"
|
||||
#include "SaveBuf.h"
|
||||
|
||||
//--LCS: file done
|
||||
|
||||
void CAutoPilot::ModifySpeed(float speed)
|
||||
{
|
||||
m_fMaxTrafficSpeed = Max(0.01f, speed);
|
||||
|
||||
+44
-19
@@ -6,6 +6,8 @@
|
||||
#include "PathFind.h"
|
||||
#include "Stats.h"
|
||||
|
||||
//--LCS: file done except TODO
|
||||
|
||||
CEntity *CBridge::pLiftRoad;
|
||||
CEntity *CBridge::pLiftPart;
|
||||
CEntity *CBridge::pWeight;
|
||||
@@ -25,14 +27,14 @@ void CBridge::Init()
|
||||
{
|
||||
#ifdef GTA_BRIDGE
|
||||
FindBridgeEntities();
|
||||
State = STATE_BRIDGE_LOCKED;
|
||||
OldLift = -1.0f;
|
||||
if (pLiftPart && pWeight)
|
||||
{
|
||||
DefaultZLiftPart = pLiftPart->GetPosition().z;
|
||||
DefaultZLiftWeight = pWeight->GetPosition().z;
|
||||
|
||||
if (pLiftRoad)
|
||||
DefaultZLiftRoad = pLiftRoad->GetPosition().z;
|
||||
DefaultZLiftWeight = pWeight->GetPosition().z;
|
||||
|
||||
ThePaths.SetLinksBridgeLights(-330.0, -230.0, -700.0, -588.0, true);
|
||||
}
|
||||
@@ -49,36 +51,42 @@ void CBridge::Update()
|
||||
|
||||
float liftHeight;
|
||||
|
||||
// Set bridge height and state
|
||||
if (CStats::CommercialPassed)
|
||||
{
|
||||
if (State == STATE_BRIDGE_LOCKED) {
|
||||
liftHeight = 25.0f;
|
||||
TimeOfBridgeBecomingOperational = 0;
|
||||
}
|
||||
else if (State == STATE_BRIDGE_ALWAYS_UNLOCKED) {
|
||||
liftHeight = 0.0f;
|
||||
TimeOfBridgeBecomingOperational = CTimer::GetTimeInMilliseconds() - 20001;
|
||||
}
|
||||
else {
|
||||
if (TimeOfBridgeBecomingOperational == 0)
|
||||
TimeOfBridgeBecomingOperational = CTimer::GetTimeInMilliseconds();
|
||||
|
||||
// Time remaining for bridge to become operational
|
||||
// uint16, so after about a minute it overflows to 0 and the cycle repeats
|
||||
uint16 timeElapsed = CTimer::GetTimeInMilliseconds() - TimeOfBridgeBecomingOperational;
|
||||
// this time cycle duration is 0x20000, so ~2:11
|
||||
uint32 timeElapsed = (CTimer::GetTimeInMilliseconds() - TimeOfBridgeBecomingOperational) % 0x20000;
|
||||
|
||||
// Calculate lift part height and bridge state
|
||||
if (timeElapsed < 10000)
|
||||
if (timeElapsed < 20000)
|
||||
{
|
||||
State = STATE_LIFT_PART_MOVING_DOWN;
|
||||
liftHeight = 25.0f - timeElapsed / 10000.0f * 25.0f;
|
||||
liftHeight = 25.0f - timeElapsed / 20000.0f * 25.0f;
|
||||
}
|
||||
else if (timeElapsed < 40000)
|
||||
else if (timeElapsed < 80000)
|
||||
{
|
||||
liftHeight = 0.0f;
|
||||
State = STATE_LIFT_PART_IS_DOWN;
|
||||
}
|
||||
else if (timeElapsed < 50000)
|
||||
else if (timeElapsed < 90000)
|
||||
{
|
||||
liftHeight = 0.0f;
|
||||
State = STATE_LIFT_PART_ABOUT_TO_MOVE_UP;
|
||||
}
|
||||
else if (timeElapsed < 60000)
|
||||
else if (timeElapsed < 110000)
|
||||
{
|
||||
State = STATE_LIFT_PART_MOVING_UP;
|
||||
liftHeight = (timeElapsed - 50000) / 10000.0f * 25.0f;
|
||||
liftHeight = (timeElapsed - 90000) / 20000.0f * 25.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -86,12 +94,7 @@ void CBridge::Update()
|
||||
State = STATE_LIFT_PART_IS_UP;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
liftHeight = 25.0f;
|
||||
TimeOfBridgeBecomingOperational = 0;
|
||||
State = STATE_BRIDGE_LOCKED;
|
||||
}
|
||||
|
||||
|
||||
// Move bridge part
|
||||
if (liftHeight != OldLift)
|
||||
@@ -112,6 +115,8 @@ void CBridge::Update()
|
||||
OldLift = liftHeight;
|
||||
}
|
||||
|
||||
// TODO(LCS): cWorldStream
|
||||
|
||||
if (State == STATE_LIFT_PART_ABOUT_TO_MOVE_UP && OldState == STATE_LIFT_PART_IS_DOWN)
|
||||
ThePaths.SetLinksBridgeLights(-330.0, -230.0, -700.0, -588.0, true);
|
||||
else if (State == STATE_LIFT_PART_IS_DOWN && OldState == STATE_LIFT_PART_MOVING_DOWN)
|
||||
@@ -161,3 +166,23 @@ bool CBridge::ThisIsABridgeObjectMovingUp(int index)
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void CBridge::ForceBridgeState(uint8 state)
|
||||
{
|
||||
#ifdef GTA_BRIDGE
|
||||
State = state;
|
||||
switch (state)
|
||||
{
|
||||
case STATE_BRIDGE_LOCKED:
|
||||
case STATE_LIFT_PART_MOVING_DOWN:
|
||||
case STATE_LIFT_PART_ABOUT_TO_MOVE_UP:
|
||||
ThePaths.SetLinksBridgeLights(-330.0f, -230.0f, -700.0f, -588.0f, true);
|
||||
break;
|
||||
case STATE_BRIDGE_ALWAYS_UNLOCKED:
|
||||
ThePaths.SetLinksBridgeLights(-330.0f, -230.0f, -700.0f, -588.0f, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -8,7 +8,8 @@ enum bridgeStates {
|
||||
STATE_LIFT_PART_MOVING_DOWN,
|
||||
STATE_LIFT_PART_IS_DOWN,
|
||||
STATE_LIFT_PART_ABOUT_TO_MOVE_UP,
|
||||
STATE_LIFT_PART_MOVING_UP
|
||||
STATE_LIFT_PART_MOVING_UP,
|
||||
STATE_BRIDGE_ALWAYS_UNLOCKED
|
||||
};
|
||||
|
||||
class CBridge
|
||||
@@ -25,4 +26,5 @@ public:
|
||||
static bool ShouldLightsBeFlashing();
|
||||
static void FindBridgeEntities();
|
||||
static bool ThisIsABridgeObjectMovingUp(int);
|
||||
static void ForceBridgeState(uint8 state);
|
||||
};
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "Accident.h"
|
||||
#include "AutoPilot.h"
|
||||
#include "Bridge.h"
|
||||
#include "CarCtrl.h"
|
||||
#include "General.h"
|
||||
#include "HandlingMgr.h"
|
||||
@@ -20,6 +21,8 @@
|
||||
#include "World.h"
|
||||
#include "ZoneCull.h"
|
||||
|
||||
//--LCS: file done
|
||||
|
||||
#define DISTANCE_TO_SWITCH_DISTANCE_GOTO 20.0f
|
||||
|
||||
float CCarAI::FindSwitchDistanceClose(CVehicle* pVehicle)
|
||||
@@ -72,6 +75,18 @@ void CCarAI::UpdateCarAI(CVehicle* pVehicle)
|
||||
case STATUS_PLAYER_DISABLED:
|
||||
break;
|
||||
case STATUS_SIMPLE:
|
||||
{
|
||||
if (pVehicle->m_pCurGroundEntity && CBridge::ThisIsABridgeObjectMovingUp(pVehicle->m_pCurGroundEntity->GetModelIndex()))
|
||||
pVehicle->SetStatus(STATUS_PHYSICS);
|
||||
CColPoint colPoint;
|
||||
CEntity* pEntity;
|
||||
if ((pVehicle->m_randomSeed & 0x3F) == (CTimer::GetFrameCounter() & 0x3F) &&
|
||||
!CWorld::ProcessVerticalLine(pVehicle->GetPosition(), -2.0f, colPoint, pEntity, true, false, false, false, true, false, nil)) {
|
||||
debug("FLOATING CAR TURNED INTO PHYSICS CAR!\n");
|
||||
pVehicle->SetStatus(STATUS_PHYSICS);
|
||||
}
|
||||
}
|
||||
// fallthough
|
||||
case STATUS_PHYSICS:
|
||||
switch (pVehicle->AutoPilot.m_nCarMission) {
|
||||
case MISSION_RAMPLAYER_FARAWAY:
|
||||
|
||||
+409
-158
@@ -11,11 +11,13 @@
|
||||
#include "Cranes.h"
|
||||
#include "Curves.h"
|
||||
#include "CutsceneMgr.h"
|
||||
#include "Frontend.h"
|
||||
#include "Gangs.h"
|
||||
#include "Game.h"
|
||||
#include "Garages.h"
|
||||
#include "General.h"
|
||||
#include "IniFile.h"
|
||||
#include "Lines.h"
|
||||
#include "ModelIndices.h"
|
||||
#include "PathFind.h"
|
||||
#include "Ped.h"
|
||||
@@ -37,7 +39,9 @@
|
||||
#include "Zones.h"
|
||||
#include "Pickups.h"
|
||||
|
||||
#define DISTANCE_TO_SPAWN_ROADBLOCK_PEDS (51.0f)
|
||||
//--LCS: file done except TODO
|
||||
|
||||
#define DISTANCE_TO_SPAWN_ROADBLOCK_PEDS (51.0f) // apparently POPULATION_CULL_RANGE? TODO: unite with CPopulation
|
||||
#define DISTANCE_TO_SCAN_FOR_DANGER (14.0f)
|
||||
#define DISTANCE_TO_SCAN_FOR_PED_DANGER (11.0f)
|
||||
#define SAFE_DISTANCE_TO_PED (3.0f)
|
||||
@@ -77,12 +81,30 @@
|
||||
#define DISTANCE_BETWEEN_CAR_AND_DEAD_PED (6.0f)
|
||||
#define PROBABILITY_OF_PASSENGER_IN_VEHICLE (0.125f)
|
||||
|
||||
#define ONSCREEN_DESPAWN_RANGE (120.0f)
|
||||
#ifdef GTA_PSP
|
||||
#define ONSCREEN_DESPAWN_RANGE (160.0f)
|
||||
#define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (100.0f)
|
||||
#define REQUEST_ONSCREEN_DISTANCE ((ONSCREEN_DESPAWN_RANGE + MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) / 2)
|
||||
#define OFFSCREEN_DESPAWN_RANGE (40.0f)
|
||||
#define MAX_DISTANCE_FROM_CAMERA_TO_SPAWN_ONSCREEN (82.5f)
|
||||
#else
|
||||
#define ONSCREEN_DESPAWN_RANGE (190.0f)
|
||||
#define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (130.0f)
|
||||
#define MAX_DISTANCE_FROM_CAMERA_TO_SPAWN_ONSCREEN (105.0f)
|
||||
#endif
|
||||
|
||||
#define REQUEST_ONSCREEN_DISTANCE (140.0f)
|
||||
#define OFFSCREEN_DESPAWN_RANGE (60.0f)
|
||||
#define MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN (40.0f)
|
||||
#define EXTENDED_RANGE_DESPAWN_MULTIPLIER (1.5f)
|
||||
|
||||
#ifdef GTA_NETWORK
|
||||
const int32 CCarCtrl::MultiplayerCarBanks[TOTAL_MULTIPLAYER_CAR_BANKS][CARS_IN_MULTIPLAYER_BANK] =
|
||||
{
|
||||
MI_SANCHEZ, MI_KURUMA, MI_ESPRIT, MI_MULE, MI_DIABLOS, MI_KURUMA, MI_PEREN, MI_STINGER,
|
||||
MI_PCJ600, MI_BOBCAT, MI_BLISTA, MI_LANDSTAL,MI_SENTINEL,MI_MOONBEAM,MI_MANANA, MI_PEREN,
|
||||
MI_SANCHEZ2,MI_PCJ600, MI_STALLION,MI_MANANA, MI_LINERUN, MI_RCBANDIT,MI_MRWONGS, MI_STINGER
|
||||
};
|
||||
#endif
|
||||
|
||||
bool CCarCtrl::bMadDriversCheat;
|
||||
int CCarCtrl::NumLawEnforcerCars;
|
||||
int CCarCtrl::NumAmbulancesOnDuty;
|
||||
@@ -108,6 +130,15 @@ int32 CCarCtrl::CarFreqArrays[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY];
|
||||
int32 CCarCtrl::LoadedCarsArray[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY];
|
||||
CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP];
|
||||
uint32 aCarsToKeepTime[MAX_CARS_TO_KEEP];
|
||||
uint32 CCarCtrl::maxRandomMpCars = 20;
|
||||
bool CCarCtrl::scriptControlsMpCarLimit = false;
|
||||
|
||||
bool gbEmergencyVehiclesEnabled = true;
|
||||
|
||||
#ifdef GTA_NETWORK // TMP
|
||||
extern bool gIsMultiplayerGame;
|
||||
extern int8 nAmbientCarBank; // actually gMultiGame.nAmbientCarBank (TODO)
|
||||
#endif
|
||||
|
||||
void
|
||||
CCarCtrl::GenerateRandomCars()
|
||||
@@ -141,31 +172,60 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
CZoneInfo zone;
|
||||
CTheZones::GetZoneInfoForTimeOfDay(&vecTargetPos, &zone);
|
||||
pPlayer->m_nTrafficMultiplier = pPlayer->m_fRoadDensity * zone.carDensity;
|
||||
if (NumRandomCars >= pPlayer->m_nTrafficMultiplier * CarDensityMultiplier * CIniFile::CarNumberMultiplier)
|
||||
return;
|
||||
if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars + NumLawEnforcerCars + NumRandomCars >= MaxNumberOfCarsInUse)
|
||||
return;
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame) {
|
||||
// TODO (count number of players within 250 meters from spawn position
|
||||
int numPlayersClose = 1;
|
||||
if (NumRandomCars >= pPlayer->m_nTrafficMultiplier * CarDensityMultiplier * CIniFile::CarNumberMultiplier * numPlayersClose)
|
||||
return;
|
||||
if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars + NumLawEnforcerCars + NumRandomCars >= MaxNumberOfCarsInUse)
|
||||
return;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (NumRandomCars >= pPlayer->m_nTrafficMultiplier * CarDensityMultiplier * CIniFile::CarNumberMultiplier)
|
||||
return;
|
||||
if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars + NumLawEnforcerCars + NumRandomCars >= MaxNumberOfCarsInUse)
|
||||
return;
|
||||
}
|
||||
CWanted* pWanted = pPlayer->m_pPed->m_pWanted;
|
||||
int carClass;
|
||||
int carModel;
|
||||
if (pWanted->GetWantedLevel() > 1 && NumLawEnforcerCars < pWanted->m_MaximumLawEnforcerVehicles &&
|
||||
pWanted->m_CurrentCops < pWanted->m_MaxCops && !CGame::IsInInterior() && (
|
||||
pWanted->GetWantedLevel() > 3 ||
|
||||
pWanted->GetWantedLevel() > 2 && CTimer::GetTimeInMilliseconds() > LastTimeLawEnforcerCreated + 5000 ||
|
||||
pWanted->GetWantedLevel() > 1 && CTimer::GetTimeInMilliseconds() > LastTimeLawEnforcerCreated + 8000)) {
|
||||
/* Last pWanted->GetWantedLevel() > 1 is unnecessary but I added it for better readability. */
|
||||
/* Wouldn't be surprised it was there originally but was optimized out. */
|
||||
carClass = COPS;
|
||||
carModel = ChoosePoliceCarModel();
|
||||
}else{
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame) {
|
||||
carModel = ChooseModel(&zone, &carClass);
|
||||
if (carModel == -1 || (carClass == COPS && pWanted->GetWantedLevel() >= 1))
|
||||
/* All cop spawns with wanted level are handled by condition above. */
|
||||
/* In particular it means that cop cars never spawn if player has wanted level of 1. */
|
||||
if (carModel == -1)
|
||||
return;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (pWanted->GetWantedLevel() > 1 && NumLawEnforcerCars < pWanted->m_MaximumLawEnforcerVehicles &&
|
||||
pWanted->m_CurrentCops < pWanted->m_MaxCops && !CGame::IsInInterior() && (
|
||||
pWanted->GetWantedLevel() > 3 ||
|
||||
pWanted->GetWantedLevel() > 2 && CTimer::GetTimeInMilliseconds() > LastTimeLawEnforcerCreated + 5000 ||
|
||||
pWanted->GetWantedLevel() > 1 && CTimer::GetTimeInMilliseconds() > LastTimeLawEnforcerCreated + 8000)) {
|
||||
/* Last pWanted->GetWantedLevel() > 1 is unnecessary but I added it for better readability. */
|
||||
/* Wouldn't be surprised it was there originally but was optimized out. */
|
||||
carClass = COPS;
|
||||
carModel = ChoosePoliceCarModel();
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < 5; i++) {
|
||||
carModel = ChooseModel(&zone, &carClass);
|
||||
if (carModel == -1)
|
||||
return;
|
||||
if (!(carClass == COPS && pWanted->GetWantedLevel() >= 1))
|
||||
/* All cop spawns with wanted level are handled by condition above. */
|
||||
/* In particular it means that cop cars never spawn if player has wanted level of 1. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
float frontX, frontY;
|
||||
float preferredDistance, angleLimit;
|
||||
float requestMultiplier = 1.0f;
|
||||
bool invertAngleLimitTest;
|
||||
CVector spawnPosition;
|
||||
int32 curNodeId, nextNodeId;
|
||||
@@ -185,11 +245,14 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
angleLimit = -1.0f;
|
||||
bTopDownCamera = true;
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = OFFSCREEN_DESPAWN_RANGE + 15.0f;
|
||||
preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN + 15.0f;
|
||||
/* BUG: testForCollision not initialized in original game. */
|
||||
testForCollision = false;
|
||||
}else if (!pPlayerVehicle){
|
||||
/* Player is not in vehicle. */
|
||||
requestMultiplier = 13.0f / 20.0f;
|
||||
if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static
|
||||
requestMultiplier *= 4.0f / 3.0f;
|
||||
testForCollision = true;
|
||||
frontX = TheCamera.CamFrontXNorm;
|
||||
frontY = TheCamera.CamFrontYNorm;
|
||||
@@ -199,95 +262,105 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
/* Forward to his current direction (camera direction). */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 1:
|
||||
/* Spawn a vehicle close to player to his side. */
|
||||
/* Kinda not within camera angle. */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = false;
|
||||
preferredDistance = OFFSCREEN_DESPAWN_RANGE;
|
||||
preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
|
||||
break;
|
||||
}
|
||||
}else if (fPlayerVehicleSpeed > 0.4f){ /* 72 km/h */
|
||||
}
|
||||
else {
|
||||
requestMultiplier = 13.0f / 20.0f;
|
||||
if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen)
|
||||
requestMultiplier *= 0.9f;
|
||||
if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static
|
||||
requestMultiplier *= 4.0f / 3.0f;
|
||||
if (fPlayerVehicleSpeed > 0.4f) { /* 72 km/h */
|
||||
/* Player is moving fast in vehicle */
|
||||
/* Prefer spawning vehicles very far away from him. */
|
||||
frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed;
|
||||
frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed;
|
||||
testForCollision = false;
|
||||
switch (CTimer::GetFrameCounter() & 3) {
|
||||
case 0:
|
||||
case 1:
|
||||
/* Spawn a vehicle in a very narrow gap in front of a player */
|
||||
angleLimit = 0.85f; /* approx 30 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 2:
|
||||
/* Spawn a vehicle relatively far away from player. */
|
||||
/* Forward to his current direction (camera direction). */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 3:
|
||||
/* Spawn a vehicle close to player to his side. */
|
||||
/* Kinda not within camera angle. */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = false;
|
||||
preferredDistance = OFFSCREEN_DESPAWN_RANGE;
|
||||
break;
|
||||
frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed;
|
||||
frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed;
|
||||
testForCollision = false;
|
||||
switch (CTimer::GetFrameCounter() & 3) {
|
||||
case 0:
|
||||
case 1:
|
||||
/* Spawn a vehicle in a very narrow gap in front of a player */
|
||||
angleLimit = 0.85f; /* approx 30 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 2:
|
||||
/* Spawn a vehicle relatively far away from player. */
|
||||
/* Forward to his current direction (camera direction). */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 3:
|
||||
/* Spawn a vehicle close to player to his side. */
|
||||
/* Kinda not within camera angle. */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = false;
|
||||
preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}else if (fPlayerVehicleSpeed > 0.1f){ /* 18 km/h */
|
||||
/* Player is moving moderately fast in vehicle */
|
||||
/* Spawn more vehicles to player's side. */
|
||||
frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed;
|
||||
frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed;
|
||||
testForCollision = false;
|
||||
switch (CTimer::GetFrameCounter() & 3) {
|
||||
case 0:
|
||||
/* Spawn a vehicle in a very narrow gap in front of a player */
|
||||
angleLimit = 0.85f; /* approx 30 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 1:
|
||||
/* Spawn a vehicle relatively far away from player. */
|
||||
/* Forward to his current direction (camera direction). */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
/* Spawn a vehicle close to player to his side. */
|
||||
/* Kinda not within camera angle. */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = false;
|
||||
preferredDistance = OFFSCREEN_DESPAWN_RANGE;
|
||||
break;
|
||||
else if (fPlayerVehicleSpeed > 0.1f) { /* 18 km/h */
|
||||
/* Player is moving moderately fast in vehicle */
|
||||
/* Spawn more vehicles to player's side. */
|
||||
frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed;
|
||||
frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed;
|
||||
testForCollision = false;
|
||||
switch (CTimer::GetFrameCounter() & 3) {
|
||||
case 0:
|
||||
/* Spawn a vehicle in a very narrow gap in front of a player */
|
||||
angleLimit = 0.85f; /* approx 30 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 1:
|
||||
/* Spawn a vehicle relatively far away from player. */
|
||||
/* Forward to his current direction (camera direction). */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
/* Spawn a vehicle close to player to his side. */
|
||||
/* Kinda not within camera angle. */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = false;
|
||||
preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
/* Player is in vehicle but moving very slow. */
|
||||
/* Then use camera direction instead of vehicle direction. */
|
||||
testForCollision = true;
|
||||
frontX = TheCamera.CamFrontXNorm;
|
||||
frontY = TheCamera.CamFrontYNorm;
|
||||
switch (CTimer::GetFrameCounter() & 1) {
|
||||
case 0:
|
||||
/* Spawn a vehicle relatively far away from player. */
|
||||
/* Forward to his current direction (camera direction). */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 1:
|
||||
/* Spawn a vehicle close to player to his side. */
|
||||
/* Kinda not within camera angle. */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = false;
|
||||
preferredDistance = OFFSCREEN_DESPAWN_RANGE;
|
||||
break;
|
||||
else {
|
||||
/* Player is in vehicle but moving very slow. */
|
||||
/* Then use camera direction instead of vehicle direction. */
|
||||
testForCollision = true;
|
||||
frontX = TheCamera.CamFrontXNorm;
|
||||
frontY = TheCamera.CamFrontYNorm;
|
||||
switch (CTimer::GetFrameCounter() & 1) {
|
||||
case 0:
|
||||
/* Spawn a vehicle relatively far away from player. */
|
||||
/* Forward to his current direction (camera direction). */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = true;
|
||||
preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
|
||||
break;
|
||||
case 1:
|
||||
/* Spawn a vehicle close to player to his side. */
|
||||
/* Kinda not within camera angle. */
|
||||
angleLimit = 0.707f; /* 45 degrees */
|
||||
invertAngleLimitTest = false;
|
||||
preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!ThePaths.GenerateCarCreationCoors(vecTargetPos.x, vecTargetPos.y, frontX, frontY,
|
||||
@@ -297,6 +370,8 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
CPathNode* pCurNode = &ThePaths.m_pathNodes[curNodeId];
|
||||
CPathNode* pNextNode = &ThePaths.m_pathNodes[nextNodeId];
|
||||
bool bBoatGenerated = false;
|
||||
if (!OkToCreateVehicleAtThisPosition(spawnPosition))
|
||||
return;
|
||||
if ((CGeneral::GetRandomNumber() & 0xF) > Min(pCurNode->spawnRate, pNextNode->spawnRate))
|
||||
return;
|
||||
if (pCurNode->bWaterPath) {
|
||||
@@ -346,10 +421,16 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
CVehicle* pVehicle;
|
||||
if (CModelInfo::IsBoatModel(carModel))
|
||||
pVehicle = new CBoat(carModel, RANDOM_VEHICLE);
|
||||
else if (CModelInfo::IsBikeModel(carModel))
|
||||
pVehicle = new CBike(carModel, RANDOM_VEHICLE);
|
||||
else
|
||||
pVehicle = new CAutomobile(carModel, RANDOM_VEHICLE);
|
||||
{
|
||||
if (CModelInfo::IsBikeModel(carModel))
|
||||
pVehicle = new CBike(carModel, RANDOM_VEHICLE);
|
||||
else
|
||||
pVehicle = new CAutomobile(carModel, RANDOM_VEHICLE);
|
||||
#ifdef GTA_NETWORK
|
||||
// TODO
|
||||
#endif
|
||||
}
|
||||
pVehicle->AutoPilot.m_nPrevRouteNode = 0;
|
||||
pVehicle->AutoPilot.m_nCurrentRouteNode = curNodeId;
|
||||
pVehicle->AutoPilot.m_nNextRouteNode = nextNodeId;
|
||||
@@ -367,7 +448,7 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
pVehicle->AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_STOP_FOR_CARS;
|
||||
pVehicle->AutoPilot.m_nCarMission = MISSION_CRUISE;
|
||||
}
|
||||
if (carModel == MI_FBIRANCH){
|
||||
if (carModel == MI_FBICAR){
|
||||
pVehicle->m_currentColour1 = 0;
|
||||
pVehicle->m_currentColour2 = 0;
|
||||
}
|
||||
@@ -589,6 +670,9 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
break;
|
||||
}
|
||||
CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), 0);
|
||||
#ifdef GTA_MOBILE
|
||||
//CVisibilityPlugins::SetObjectDistanceAlpha(pVehicle->GetClump(), 0) // TODO(LCS)
|
||||
#endif
|
||||
if (!pVehicle->GetIsOnScreen()){
|
||||
if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > OFFSCREEN_DESPAWN_RANGE * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f)) {
|
||||
/* Too far away cars that are not visible aren't needed. */
|
||||
@@ -596,12 +680,12 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
return;
|
||||
}
|
||||
}else{
|
||||
if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE ||
|
||||
(vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) {
|
||||
if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * requestMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE ||
|
||||
(vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * requestMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) {
|
||||
delete pVehicle;
|
||||
return;
|
||||
}
|
||||
if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < 82.5f * TheCamera.GenerationDistMultiplier || bTopDownCamera) {
|
||||
if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < MAX_DISTANCE_FROM_CAMERA_TO_SPAWN_ONSCREEN * requestMultiplier * TheCamera.GenerationDistMultiplier || bTopDownCamera) {
|
||||
delete pVehicle;
|
||||
return;
|
||||
}
|
||||
@@ -635,29 +719,34 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
CCarAI::AddPoliceCarOccupants(pVehicle);
|
||||
else {
|
||||
pVehicle->SetUpDriver();
|
||||
int32 passengers = 0;
|
||||
for (int i = 0; i < pVehicle->m_nNumMaxPassengers; i++)
|
||||
passengers += (CGeneral::GetRandomNumberInRange(0.0f, 1.0f) < PROBABILITY_OF_PASSENGER_IN_VEHICLE) ? 1 : 0;
|
||||
if (CModelInfo::IsCarModel(carModel) && (CModelInfo::GetModelInfo(carModel)->GetAnimFileIndex() == CAnimManager::GetAnimationBlockIndex("van") && passengers >= 1))
|
||||
passengers = 1;
|
||||
for (int i = 0; i < passengers; i++) {
|
||||
CPed* pPassenger = pVehicle->SetupPassenger(i);
|
||||
if (pPassenger) {
|
||||
++CPopulation::ms_nTotalCarPassengerPeds;
|
||||
pPassenger->bCarPassenger = true;
|
||||
#ifdef GTA_NETWORK
|
||||
if (!gIsMultiplayerGame)
|
||||
#endif
|
||||
{
|
||||
int32 passengers = 0;
|
||||
for (int i = 0; i < pVehicle->m_nNumMaxPassengers; i++)
|
||||
passengers += (CGeneral::GetRandomNumberInRange(0.0f, 1.0f) < PROBABILITY_OF_PASSENGER_IN_VEHICLE) ? 1 : 0;
|
||||
if (CModelInfo::IsCarModel(carModel) && (CModelInfo::GetModelInfo(carModel)->GetAnimFileIndex() == CAnimManager::GetAnimationBlockIndex("van") && passengers >= 1))
|
||||
passengers = 1;
|
||||
for (int i = 0; i < passengers; i++) {
|
||||
CPed* pPassenger = pVehicle->SetupPassenger(i);
|
||||
if (pPassenger) {
|
||||
++CPopulation::ms_nTotalCarPassengerPeds;
|
||||
pPassenger->bCarPassenger = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int nMadDrivers;
|
||||
switch (pVehicle->GetVehicleAppearance()) {
|
||||
case VEHICLE_APPEARANCE_BIKE:
|
||||
nMadDrivers = 30;
|
||||
nMadDrivers = 20;
|
||||
break;
|
||||
case VEHICLE_APPEARANCE_BOAT:
|
||||
nMadDrivers = 40;
|
||||
break;
|
||||
default:
|
||||
nMadDrivers = 6;
|
||||
nMadDrivers = 3;
|
||||
break;
|
||||
}
|
||||
if ((CGeneral::GetRandomNumber() & 0x7F) < nMadDrivers || bMadDriversCheat) {
|
||||
@@ -714,12 +803,9 @@ CCarCtrl::GenerateOneRandomCar()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
CCarCtrl::BoatWithTallMast(int32 mi)
|
||||
{
|
||||
return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS;
|
||||
#ifdef GTA_NETWORK
|
||||
// TODO
|
||||
#endif
|
||||
}
|
||||
|
||||
int32
|
||||
@@ -755,6 +841,22 @@ int32
|
||||
CCarCtrl::ChooseModel(CZoneInfo* pZone, int* pClass) {
|
||||
int32 model = -1;
|
||||
int32 i;
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame) {
|
||||
for (i = 10; i > 0 && (model == -1 || !CStreaming::HasModelLoaded(model)); i--) {
|
||||
*pClass = ChooseCarRating(pZone);
|
||||
model = ChooseCarModel(*pClass);
|
||||
bool found = false;
|
||||
for (int j = 0; j < 8; j++) {
|
||||
if (model == MultiplayerCarBanks[nAmbientCarBank][j])
|
||||
found = true;
|
||||
}
|
||||
if (!found)
|
||||
model = -1;
|
||||
}
|
||||
return model;
|
||||
}
|
||||
#endif
|
||||
for (i = 10; i > 0 && (model == -1 || !CStreaming::HasModelLoaded(model)); i--) {
|
||||
int rnd = CGeneral::GetRandomNumberInRange(0, 1000);
|
||||
|
||||
@@ -781,6 +883,9 @@ CCarCtrl::ChooseModel(CZoneInfo* pZone, int* pClass) {
|
||||
}
|
||||
if (i == 0)
|
||||
return -1;
|
||||
CColModel* pColModel = CModelInfo::GetColModel(model);
|
||||
if (!pColModel || pColModel->boundingSphere.radius > 20.0f)
|
||||
return -1;
|
||||
return model;
|
||||
}
|
||||
|
||||
@@ -941,6 +1046,7 @@ CCarCtrl::RemoveCarsIfThePoolGetsFull(void)
|
||||
}
|
||||
}
|
||||
if (pClosestVehicle) {
|
||||
debug(":::::::::::\'Nearest removed\' cause pools was full -> NumRandomCars %d\n", NumRandomCars);
|
||||
CWorld::Remove(pClosestVehicle);
|
||||
delete pClosestVehicle;
|
||||
}
|
||||
@@ -963,7 +1069,12 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle)
|
||||
return;
|
||||
}
|
||||
float distanceToPlayer = (pVehicle->GetPosition() - vecPlayerPos).Magnitude2D();
|
||||
float threshold = OFFSCREEN_DESPAWN_RANGE;
|
||||
float despawnMultiplier = 1.0f;
|
||||
#if !defined EXTENDED_OFFSCREEN_DESPAWN_RANGE || defined GTA_PSP
|
||||
if (FindPlayerVehicle() && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen)
|
||||
despawnMultiplier = 0.75f;
|
||||
#endif
|
||||
float threshold = OFFSCREEN_DESPAWN_RANGE * despawnMultiplier;
|
||||
#ifndef EXTENDED_OFFSCREEN_DESPAWN_RANGE
|
||||
if (pVehicle->GetIsOnScreen() ||
|
||||
TheCamera.Cams[TheCamera.ActiveCam].LookingLeft ||
|
||||
@@ -979,7 +1090,7 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle)
|
||||
)
|
||||
#endif
|
||||
{
|
||||
threshold = ONSCREEN_DESPAWN_RANGE * TheCamera.GenerationDistMultiplier;
|
||||
threshold = ONSCREEN_DESPAWN_RANGE * despawnMultiplier * TheCamera.GenerationDistMultiplier;
|
||||
}
|
||||
#ifndef EXTENDED_OFFSCREEN_DESPAWN_RANGE
|
||||
if (TheCamera.GetForward().z < -0.9f)
|
||||
@@ -991,6 +1102,14 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle)
|
||||
if (pVehicle->GetIsOnScreen()){
|
||||
pVehicle->bFadeOut = true;
|
||||
}else{
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame) {
|
||||
// TODO
|
||||
if (false)
|
||||
MultiPlayerRemoveVehicleAndDriver(pVehicle);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
}
|
||||
@@ -1008,10 +1127,33 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle)
|
||||
!CTrafficLights::ShouldCarStopForLight(pVehicle, true) &&
|
||||
!CTrafficLights::ShouldCarStopForBridge(pVehicle) &&
|
||||
!CGarages::IsPointWithinHideOutGarage(pVehicle->GetPosition())){
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
#ifdef GTA_NETWORK
|
||||
if (!gIsMultiplayerGame)
|
||||
#endif
|
||||
{
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
return;
|
||||
}
|
||||
#ifdef GTA_NETWORK
|
||||
if (false) // TODO(LCS): figure out condition for mp
|
||||
MultiPlayerRemoveVehicleAndDriver(pVehicle);
|
||||
#endif
|
||||
}
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame) {
|
||||
if (pVehicle->GetStatus() == STATUS_WRECKED && CTimer::GetLogicalFrameCounter() == pVehicle->m_randomSeed) {
|
||||
if ((pVehicle->GetPosition() - vecPlayerPos).MagnitudeSqr() > SQR(6.5f)) {
|
||||
if (pVehicle->GetMoveSpeed().MagnitudeSqr() <= SQR(0.01f)) {
|
||||
printf("viciously removing dead vehicle");
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (pVehicle->GetStatus() == STATUS_WRECKED) {
|
||||
if (pVehicle->m_nTimeOfDeath != 0) {
|
||||
if (CTimer::GetTimeInMilliseconds() > pVehicle->m_nTimeOfDeath + 60000 &&
|
||||
@@ -1347,6 +1489,10 @@ void CCarCtrl::SlowCarDownForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle,
|
||||
pVehicle->AutoPilot.m_bSlowedDownBecauseOfCars = true;
|
||||
*pSpeed = Min(*pSpeed, minProximity * curSpeed);
|
||||
}
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame)
|
||||
return;
|
||||
#endif
|
||||
if (minProximity >= 0.0f && minProximity < 0.5f && pOtherEntity->IsVehicle() &&
|
||||
CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeToStartMission > 15000 &&
|
||||
CTimer::GetTimeInMilliseconds() - pOtherVehicle->AutoPilot.m_nTimeToStartMission > 15000){
|
||||
@@ -1594,16 +1740,12 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float
|
||||
diffToLeftAngle = ABS(diffToLeftAngle);
|
||||
float angleToWeave = lengthToEvade / 2;
|
||||
if (diffToLeftAngle < angleToWeave){
|
||||
*pAngleToWeaveLeft = angleBetweenVehicles - angleToWeave;
|
||||
while (*pAngleToWeaveLeft < -PI)
|
||||
*pAngleToWeaveLeft += TWOPI;
|
||||
*pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicles - angleToWeave);
|
||||
}
|
||||
float diffToRightAngle = LimitRadianAngle(angleBetweenVehicles - *pAngleToWeaveRight);
|
||||
diffToRightAngle = ABS(diffToRightAngle);
|
||||
if (diffToRightAngle < angleToWeave){
|
||||
*pAngleToWeaveRight = angleBetweenVehicles + angleToWeave;
|
||||
while (*pAngleToWeaveRight > PI)
|
||||
*pAngleToWeaveRight -= TWOPI;
|
||||
*pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicles + angleToWeave);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1642,16 +1784,12 @@ void CCarCtrl::WeaveForPed(CEntity* pOtherEntity, CVehicle* pVehicle, float* pAn
|
||||
diffToLeftAngle = ABS(diffToLeftAngle);
|
||||
float angleToWeave = lengthToEvade / 2;
|
||||
if (diffToLeftAngle < angleToWeave) {
|
||||
*pAngleToWeaveLeft = angleBetweenVehicleAndPed - angleToWeave;
|
||||
while (*pAngleToWeaveLeft < -PI)
|
||||
*pAngleToWeaveLeft += TWOPI;
|
||||
*pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndPed - angleToWeave);
|
||||
}
|
||||
float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveRight);
|
||||
diffToRightAngle = ABS(diffToRightAngle);
|
||||
if (diffToRightAngle < angleToWeave) {
|
||||
*pAngleToWeaveRight = angleBetweenVehicleAndPed + angleToWeave;
|
||||
while (*pAngleToWeaveRight > PI)
|
||||
*pAngleToWeaveRight -= TWOPI;
|
||||
*pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndPed + angleToWeave);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1714,16 +1852,12 @@ void CCarCtrl::WeaveForObject(CEntity* pOtherEntity, CVehicle* pVehicle, float*
|
||||
diffToLeftAngle = ABS(diffToLeftAngle);
|
||||
float angleToWeave = lengthToEvade / 2;
|
||||
if (diffToLeftAngle < angleToWeave) {
|
||||
*pAngleToWeaveLeft = angleBetweenVehicleAndObject - angleToWeave;
|
||||
while (*pAngleToWeaveLeft < -PI)
|
||||
*pAngleToWeaveLeft += TWOPI;
|
||||
*pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndObject - angleToWeave);
|
||||
}
|
||||
float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveRight);
|
||||
diffToRightAngle = ABS(diffToRightAngle);
|
||||
if (diffToRightAngle < angleToWeave) {
|
||||
*pAngleToWeaveRight = angleBetweenVehicleAndObject + angleToWeave;
|
||||
while (*pAngleToWeaveRight > PI)
|
||||
*pAngleToWeaveRight -= TWOPI;
|
||||
*pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndObject + angleToWeave);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1765,7 +1899,7 @@ bool CCarCtrl::PickNextNodeAccordingStrategy(CVehicle* pVehicle)
|
||||
void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle)
|
||||
{
|
||||
if (pVehicle->m_nRouteSeed)
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed);
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++);
|
||||
int32 prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode;
|
||||
int32 curNode = pVehicle->AutoPilot.m_nNextRouteNode;
|
||||
uint8 totalLinks = ThePaths.m_pathNodes[curNode].numLinks;
|
||||
@@ -1851,13 +1985,15 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle)
|
||||
pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode];
|
||||
if ((!pNextPathNode->bDisabled || pPrevPathNode->bDisabled) &&
|
||||
(!pNextPathNode->bBetweenLevels || pPrevPathNode->bBetweenLevels || !pVehicle->AutoPilot.m_bStayInCurrentLevel))
|
||||
/* Nice way to exit loop but this will fail because this is used for indexing! */
|
||||
nextLink = 1000;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (nextLink < 999)
|
||||
if (nextLink >= totalLinks) {
|
||||
/* If everything else failed, turn vehicle around */
|
||||
nextLink = 0;
|
||||
debug("Couldn\'t find ANYTHING. Just go back from where we came.\n");
|
||||
pVehicle->AutoPilot.m_nNextRouteNode = prevNode;
|
||||
}
|
||||
}
|
||||
pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode];
|
||||
pNextLink = &ThePaths.m_carPathLinks[ThePaths.m_carPathConnections[nextLink + pCurPathNode->firstLink]];
|
||||
@@ -1970,7 +2106,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t
|
||||
#endif
|
||||
{
|
||||
if (pVehicle->m_nRouteSeed)
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed);
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++);
|
||||
int prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode;
|
||||
int curNode = pVehicle->AutoPilot.m_nNextRouteNode;
|
||||
CPathNode* pPrevNode = &ThePaths.m_pathNodes[prevNode];
|
||||
@@ -1984,7 +2120,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t
|
||||
#else
|
||||
CVector(targetX, targetY, 0.0f),
|
||||
#endif
|
||||
pTargetNode, &numNodes, 2, pVehicle, &distanceToTargetNode, 999999.9f, -1);
|
||||
pTargetNode, &numNodes, 2, pVehicle, &distanceToTargetNode, 100.0f, -1);
|
||||
|
||||
int newNextNode;
|
||||
int nextLink;
|
||||
@@ -2099,14 +2235,14 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t
|
||||
bool CCarCtrl::PickNextNodeToFollowPath(CVehicle* pVehicle)
|
||||
{
|
||||
if (pVehicle->m_nRouteSeed)
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed);
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++);
|
||||
int curNode = pVehicle->AutoPilot.m_nNextRouteNode;
|
||||
CPathNode* pCurNode = &ThePaths.m_pathNodes[curNode];
|
||||
if (pVehicle->AutoPilot.m_nPathFindNodesCount == 0){
|
||||
ThePaths.DoPathSearch(0, pVehicle->GetPosition(), curNode,
|
||||
pVehicle->AutoPilot.m_vecDestinationCoors, pVehicle->AutoPilot.m_aPathFindNodesInfo,
|
||||
&pVehicle->AutoPilot.m_nPathFindNodesCount, NUM_PATH_NODES_IN_AUTOPILOT,
|
||||
pVehicle, nil, 999999.9f, -1);
|
||||
pVehicle, nil, 100.0f, -1);
|
||||
if (pVehicle->AutoPilot.m_nPathFindNodesCount < 2)
|
||||
return true;
|
||||
pVehicle->AutoPilot.RemoveOnePathNode();
|
||||
@@ -2418,6 +2554,16 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe
|
||||
*pHandbrake = true;
|
||||
return;
|
||||
case MISSION_CRUISE:
|
||||
if (CTrafficLights::ShouldCarStopForBridge(pVehicle)) {
|
||||
*pAccel = 0.0f;
|
||||
*pBrake = 1.0f;
|
||||
*pHandbrake = true;
|
||||
#ifdef FIX_BUGS
|
||||
*pSwerve = 0.0f;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
// fallthough
|
||||
case MISSION_RAMPLAYER_FARAWAY:
|
||||
case MISSION_BLOCKPLAYER_FARAWAY:
|
||||
case MISSION_GOTOCOORDS:
|
||||
@@ -2488,11 +2634,19 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe
|
||||
*pHandbrake = false;
|
||||
return;
|
||||
case MISSION_RAMCAR_CLOSE:
|
||||
if (!pVehicle->AutoPilot.m_pTargetCar) {
|
||||
debug("NO TARGET VEHICLE FOR MISSION_RAMCAR_CLOSE\n");
|
||||
return;
|
||||
}
|
||||
SteerAICarWithPhysicsHeadingForTarget(pVehicle, pVehicle->AutoPilot.m_pTargetCar,
|
||||
pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y,
|
||||
pSwerve, pAccel, pBrake, pHandbrake);
|
||||
return;
|
||||
case MISSION_BLOCKCAR_CLOSE:
|
||||
if (!pVehicle->AutoPilot.m_pTargetCar) {
|
||||
debug("NO TARGET VEHICLE FOR MISSION_BLOCKCAR_CLOSE\n");
|
||||
return;
|
||||
}
|
||||
SteerAICarWithPhysicsTryingToBlockTarget(pVehicle,
|
||||
pVehicle->AutoPilot.m_pTargetCar->GetPosition().x,
|
||||
pVehicle->AutoPilot.m_pTargetCar->GetPosition().y,
|
||||
@@ -2501,6 +2655,9 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe
|
||||
pSwerve, pAccel, pBrake, pHandbrake);
|
||||
return;
|
||||
case MISSION_BLOCKCAR_HANDBRAKESTOP:
|
||||
if (!pVehicle->AutoPilot.m_pTargetCar) {
|
||||
return;
|
||||
}
|
||||
SteerAICarWithPhysicsTryingToBlockTarget_Stop(pVehicle,
|
||||
pVehicle->AutoPilot.m_pTargetCar->GetPosition().x,
|
||||
pVehicle->AutoPilot.m_pTargetCar->GetPosition().y,
|
||||
@@ -3109,7 +3266,7 @@ bool CCarCtrl::JoinCarWithRoadSystemGotoCoors(CVehicle* pVehicle, CVector vecTar
|
||||
{
|
||||
pVehicle->AutoPilot.m_vecDestinationCoors = vecTarget;
|
||||
ThePaths.DoPathSearch(0, pVehicle->GetPosition(), -1, vecTarget, pVehicle->AutoPilot.m_aPathFindNodesInfo,
|
||||
&pVehicle->AutoPilot.m_nPathFindNodesCount, NUM_PATH_NODES_IN_AUTOPILOT, pVehicle, nil, 999999.9f, -1);
|
||||
&pVehicle->AutoPilot.m_nPathFindNodesCount, NUM_PATH_NODES_IN_AUTOPILOT, pVehicle, nil, 100.0f, -1);
|
||||
ThePaths.RemoveBadStartNode(pVehicle->GetPosition(),
|
||||
pVehicle->AutoPilot.m_aPathFindNodesInfo, &pVehicle->AutoPilot.m_nPathFindNodesCount);
|
||||
if (pVehicle->AutoPilot.m_nPathFindNodesCount < 2){
|
||||
@@ -3130,7 +3287,7 @@ bool CCarCtrl::JoinCarWithRoadSystemGotoCoors(CVehicle* pVehicle, CVector vecTar
|
||||
void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle)
|
||||
{
|
||||
if (pVehicle->m_nRouteSeed)
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed);
|
||||
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++);
|
||||
int nextLink;
|
||||
CPathNode* pCurNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nCurrentRouteNode];
|
||||
for (nextLink = 0; nextLink < 12; nextLink++)
|
||||
@@ -3168,14 +3325,22 @@ void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle)
|
||||
|
||||
void CCarCtrl::GenerateEmergencyServicesCar(void)
|
||||
{
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame)
|
||||
return;
|
||||
#endif
|
||||
if (FindPlayerPed()->m_pWanted->GetWantedLevel() > 3)
|
||||
return;
|
||||
if (CGame::IsInInterior())
|
||||
return;
|
||||
#ifndef GTA_PSP
|
||||
if (TheCamera.m_WideScreenOn)
|
||||
return;
|
||||
#endif
|
||||
if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars +
|
||||
NumLawEnforcerCars + NumRandomCars > MaxNumberOfCarsInUse)
|
||||
return;
|
||||
if (NumAmbulancesOnDuty == 0){
|
||||
if (NumAmbulancesOnDuty == 0 && gbEmergencyVehiclesEnabled){
|
||||
if (gAccidentManager.CountActiveAccidents() < 2){
|
||||
if (CStreaming::HasModelLoaded(MI_AMBULAN))
|
||||
CStreaming::SetModelIsDeletable(MI_MEDIC);
|
||||
@@ -3195,7 +3360,7 @@ void CCarCtrl::GenerateEmergencyServicesCar(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (NumFiretrucksOnDuty == 0){
|
||||
if (NumFiretrucksOnDuty == 0 && gbEmergencyVehiclesEnabled){
|
||||
if (gFireManager.GetTotalActiveFires() < 3){
|
||||
if (CStreaming::HasModelLoaded(MI_FIRETRUCK))
|
||||
CStreaming::SetModelIsDeletable(MI_FIREMAN);
|
||||
@@ -3225,6 +3390,10 @@ void CCarCtrl::GenerateEmergencyServicesCar(void)
|
||||
|
||||
bool CCarCtrl::GenerateOneEmergencyServicesCar(uint32 mi, CVector vecPos)
|
||||
{
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame)
|
||||
return;
|
||||
#endif
|
||||
CVector pPlayerPos = FindPlayerCentreOfWorld(CWorld::PlayerInFocus);
|
||||
bool created = false;
|
||||
int attempts = 0;
|
||||
@@ -3290,6 +3459,11 @@ bool CCarCtrl::GenerateOneEmergencyServicesCar(uint32 mi, CVector vecPos)
|
||||
pVehicle->m_bSirenOrAlarm = true;
|
||||
CWorld::Add(pVehicle);
|
||||
printf("CREATED EMERGENCY VEHICLE\n");
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame) {
|
||||
// TODO (register car for network)
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3359,6 +3533,22 @@ bool CCarCtrl::MapCouldMoveInThisArea(float x, float y)
|
||||
#endif
|
||||
}
|
||||
|
||||
bool
|
||||
CCarCtrl::BoatWithTallMast(int32 mi)
|
||||
{
|
||||
return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS;
|
||||
}
|
||||
|
||||
bool CCarCtrl::OkToCreateVehicleAtThisPosition(const CVector& pos)
|
||||
{
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame) {
|
||||
// TODO
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type)
|
||||
{
|
||||
switch (type)
|
||||
@@ -3368,3 +3558,64 @@ float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type)
|
||||
}
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
void CCarCtrl::RenderDebugInfo(CVehicle* pVehicle)
|
||||
{
|
||||
if (!pVehicle->AutoPilot.m_nNextRouteNode || !pVehicle->AutoPilot.m_nCurrentRouteNode)
|
||||
return;
|
||||
|
||||
CPathNode* pCurNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nCurrentRouteNode];
|
||||
CPathNode* pNextNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode];
|
||||
CCarPathLink* pCurLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
||||
CCarPathLink* pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
||||
|
||||
CVector vCurNodePos(pCurNode->GetPosition());
|
||||
vCurNodePos.z += 1.0f;
|
||||
CVector vNextNodePos(pNextNode->GetPosition());
|
||||
vNextNodePos.z += 1.0f;
|
||||
CVector vCurLinkDir(pCurLink->GetDirX() * pVehicle->AutoPilot.m_nCurrentDirection, pCurLink->GetDirY() * pVehicle->AutoPilot.m_nCurrentDirection, 0.0f);
|
||||
CVector vNextLinkDir(pNextLink->GetDirX() * pVehicle->AutoPilot.m_nNextDirection, pNextLink->GetDirY() * pVehicle->AutoPilot.m_nNextDirection, 0.0f);
|
||||
vCurLinkDir.Normalise();
|
||||
vNextLinkDir.Normalise();
|
||||
|
||||
if (vCurLinkDir.x * vNextLinkDir.x + vCurLinkDir.y * vNextLinkDir.y < 0.5f) {
|
||||
CVector vCurPos(vCurNodePos);
|
||||
CVector vCurDir(0.0f, 0.0f, 1.0f);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
CVector vPrevPos = vCurPos;
|
||||
CCurves::CalcCurvePoint(&vCurNodePos, &vNextNodePos, &vCurLinkDir, &vNextLinkDir, i * 0.1f, pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve, &vCurPos, &vCurDir);
|
||||
// Render3DLine(&vCurPos, &vNextPos, CVector(255.0f, 255.0f, 0.0f, 255.0f)); // <- originally this is called, let's reuse stuff we have
|
||||
// TODO: not drawing :(
|
||||
CLines::RenderLineWithClipping(vPrevPos.x, vPrevPos.y, vCurNodePos.z, vCurPos.x, vCurPos.y, vNextNodePos.z, 0xFFFF00FF, 0xFFFF00FF); // using NodePos for Z coord cause Curves set it to 0
|
||||
}
|
||||
DefinedState();
|
||||
}
|
||||
}
|
||||
|
||||
void CCarCtrl::SetMultiplayerAmbientCarLimit(uint32 limit)
|
||||
{
|
||||
maxRandomMpCars = limit;
|
||||
}
|
||||
|
||||
void CCarCtrl::ToggleScriptControlsMpCarLimit(bool toggle)
|
||||
{
|
||||
scriptControlsMpCarLimit = toggle;
|
||||
}
|
||||
|
||||
void CCarCtrl::MultiPlayerRemoveVehicleAndDriver(CVehicle* pVehicle)
|
||||
{
|
||||
CPed* pDriver = pVehicle->pDriver;
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
if (pDriver) {
|
||||
CWorld::Remove(pDriver);
|
||||
delete pDriver;
|
||||
}
|
||||
}
|
||||
|
||||
void CCarCtrl::Write(base::cRelocatableChunkWriter& writer)
|
||||
{
|
||||
writer.AllocateRaw(CarArrays, sizeof(CarArrays), 4);
|
||||
writer.AllocateRaw(TotalNumOfCarsOfRating, sizeof(TotalNumOfCarsOfRating), 4, false, true);
|
||||
}
|
||||
|
||||
|
||||
+26
-6
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include "PathFind.h"
|
||||
#include "Boat.h"
|
||||
#include "General.h"
|
||||
#include "Vehicle.h"
|
||||
|
||||
#define GAME_SPEED_TO_METERS_PER_SECOND 50.0f
|
||||
@@ -16,6 +17,13 @@ enum{
|
||||
MAX_CAR_MODELS_IN_ARRAY = 25,
|
||||
};
|
||||
|
||||
#ifdef GTA_NETWORK
|
||||
enum {
|
||||
TOTAL_MULTIPLAYER_CAR_BANKS = 3,
|
||||
CARS_IN_MULTIPLAYER_BANK = 8
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
#define FIX_PATHFIND_BUG
|
||||
#endif
|
||||
@@ -130,6 +138,13 @@ public:
|
||||
static void SteerAIBoatWithPhysicsAttackingPlayer(CVehicle*, float*, float*, float*, bool*);
|
||||
static void SteerAICarBlockingPlayerForwardAndBack(CVehicle*, float*, float*, float*, bool*);
|
||||
|
||||
static bool OkToCreateVehicleAtThisPosition(const CVector&);
|
||||
static void RenderDebugInfo(CVehicle*);
|
||||
static void SetMultiplayerAmbientCarLimit(uint32);
|
||||
static void ToggleScriptControlsMpCarLimit(bool);
|
||||
static void MultiPlayerRemoveVehicleAndDriver(CVehicle*);
|
||||
static void Write(base::cRelocatableChunkWriter&);
|
||||
|
||||
static float GetPositionAlongCurrentCurve(CVehicle* pVehicle)
|
||||
{
|
||||
uint32 timeInCurve = CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeEnteredCurve;
|
||||
@@ -138,11 +153,7 @@ public:
|
||||
|
||||
static float LimitRadianAngle(float angle)
|
||||
{
|
||||
while (angle < -PI)
|
||||
angle += TWOPI;
|
||||
while (angle > PI)
|
||||
angle -= TWOPI;
|
||||
return angle;
|
||||
return CGeneral::LimitRadianAngle(angle);
|
||||
}
|
||||
|
||||
static bool bMadDriversCheat;
|
||||
@@ -169,6 +180,15 @@ public:
|
||||
static int32 NumOfLoadedCarsOfRating[TOTAL_CUSTOM_CLASSES];
|
||||
static int32 CarFreqArrays[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY];
|
||||
static int32 LoadedCarsArray[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY];
|
||||
|
||||
#ifdef GTA_NETWORK
|
||||
static const int32 MultiplayerCarBanks[TOTAL_MULTIPLAYER_CAR_BANKS][CARS_IN_MULTIPLAYER_BANK];
|
||||
#endif
|
||||
|
||||
static uint32 maxRandomMpCars;
|
||||
static bool scriptControlsMpCarLimit;
|
||||
|
||||
};
|
||||
|
||||
extern CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP];
|
||||
extern CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP];
|
||||
extern bool gbEmergencyVehiclesEnabled;
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "Curves.h"
|
||||
|
||||
//--LCS: file done except TODO
|
||||
|
||||
float CCurves::CalcSpeedScaleFactor(CVector* pPoint1, CVector* pPoint2, float dir1X, float dir1Y, float dir2X, float dir2Y)
|
||||
{
|
||||
CVector2D dir1(dir1X, dir1Y);
|
||||
|
||||
@@ -46,6 +46,7 @@ float CGameLogic::AfterDeathStartPointOrientation[NUM_SHORTCUT_START_POINTS];
|
||||
CVector CGameLogic::ShortCutDropOffForMission;
|
||||
float CGameLogic::ShortCutDropOffOrientationForMission;
|
||||
bool CGameLogic::MissionDropOffReadyToBeUsed;
|
||||
char CGameLogic::mStoredPlayerOutfit[8] = "plr3";
|
||||
|
||||
#define SHORTCUT_TAXI_COST (9)
|
||||
#define TOTAL_BUSTED_AUDIO (28)
|
||||
@@ -89,7 +90,7 @@ CGameLogic::SortOutStreamingAndMemory(const CVector &pos)
|
||||
CStreaming::DeleteRwObjectsAfterDeath(pos);
|
||||
CStreaming::RemoveUnusedModelsInLoadedList();
|
||||
CGame::DrasticTidyUpMemory(true);
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_pPed->Undress("player");
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_pPed->Undress(mStoredPlayerOutfit);
|
||||
CStreaming::LoadSceneCollision(pos);
|
||||
CStreaming::LoadScene(pos);
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_pPed->Dress();
|
||||
@@ -102,15 +103,6 @@ CGameLogic::Update()
|
||||
CVector vecRestartPos;
|
||||
float fRestartFloat;
|
||||
|
||||
#ifdef MISSION_REPLAY
|
||||
// what a place to check!
|
||||
if (gbTryingPorn4Again) {
|
||||
CRunningScript* pScript = CTheScripts::pActiveScripts;
|
||||
if (pScript && !CGeneral::faststricmp(pScript->m_abScriptName, "porno4"))
|
||||
gbTryingPorn4Again = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (CCutsceneMgr::IsCutsceneProcessing()) return;
|
||||
|
||||
UpdateShortCut();
|
||||
@@ -401,7 +393,7 @@ CGameLogic::RestorePlayerStuffDuringResurrection(CPlayerPed *pPlayerPed, CVector
|
||||
CWorld::Add(pPlayerPed);
|
||||
CHud::ResetWastedText();
|
||||
CStreaming::StreamZoneModels(pos);
|
||||
clearWaterDrop = true;
|
||||
//clearWaterDrop = true;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -428,7 +420,7 @@ CGameLogic::SetUpShortCut(CVector vStartPos, float fStartAngle, CVector vEndPos,
|
||||
ShortCutStartOrientation = fStartAngle;
|
||||
ShortCutDestination = vEndPos;
|
||||
ShortCutDestinationOrientation = fEndAngle;
|
||||
CStreaming::RequestModel(MI_KAUFMAN, 0);
|
||||
CStreaming::RequestModel(MI_CABBIE, 0);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -460,11 +452,11 @@ CGameLogic::UpdateShortCut()
|
||||
{
|
||||
switch (ShortCutState) {
|
||||
case SHORTCUT_INIT:
|
||||
if (!CStreaming::HasModelLoaded(MI_KAUFMAN)) {
|
||||
CStreaming::RequestModel(MI_KAUFMAN, 0);
|
||||
if (!CStreaming::HasModelLoaded(MI_CABBIE)) {
|
||||
CStreaming::RequestModel(MI_CABBIE, 0);
|
||||
return;
|
||||
}
|
||||
pShortCutTaxi = new CAutomobile(MI_KAUFMAN, RANDOM_VEHICLE);
|
||||
pShortCutTaxi = new CAutomobile(MI_CABBIE, RANDOM_VEHICLE);
|
||||
if (!pShortCutTaxi)
|
||||
return;
|
||||
pShortCutTaxi->SetPosition(ShortCutStart);
|
||||
|
||||
@@ -48,4 +48,5 @@ public:
|
||||
static CVector ShortCutDropOffForMission;
|
||||
static float ShortCutDropOffOrientationForMission;
|
||||
static bool MissionDropOffReadyToBeUsed;
|
||||
static char mStoredPlayerOutfit[8];
|
||||
};
|
||||
+651
-131
File diff suppressed because it is too large
Load Diff
+46
-10
@@ -15,6 +15,7 @@ enum eGarageState
|
||||
GS_OPENEDCONTAINSCAR,
|
||||
GS_CLOSEDCONTAINSCAR,
|
||||
GS_AFTERDROPOFF,
|
||||
GS_WAITINGFORCAR
|
||||
};
|
||||
|
||||
enum eGarageType
|
||||
@@ -31,7 +32,7 @@ enum eGarageType
|
||||
GARAGE_COLLECTCARS_2,
|
||||
GARAGE_COLLECTCARS_3,
|
||||
GARAGE_FORCARTOCOMEOUTOF,
|
||||
GARAGE_60SECONDS,
|
||||
GARAGE_CRATE_GARAGE,
|
||||
GARAGE_CRUSHER,
|
||||
GARAGE_MISSION_KEEPCAR,
|
||||
GARAGE_FOR_SCRIPT_TO_OPEN,
|
||||
@@ -58,7 +59,7 @@ enum
|
||||
{
|
||||
TOTAL_COLLECTCARS_GARAGES = 4,
|
||||
TOTAL_HIDEOUT_GARAGES = 12,
|
||||
TOTAL_COLLECTCARS_CARS = 6
|
||||
TOTAL_COLLECTCARS_CARS = 16
|
||||
};
|
||||
|
||||
class CStoredCar
|
||||
@@ -69,10 +70,22 @@ class CStoredCar
|
||||
FLAG_EXPLOSIONPROOF = 0x4,
|
||||
FLAG_COLLISIONPROOF = 0x8,
|
||||
FLAG_MELEEPROOF = 0x10,
|
||||
FLAG_TIRES_INVULNERABLE = 0x20,
|
||||
FLAG_STRONG = 0x40,
|
||||
FLAG_HEAVY = 0x80,
|
||||
FLAG_PERMANENT_COLOUR = 0x100,
|
||||
FLAG_BOMB = 0x200,
|
||||
FLAG_NOT_DAMAGED_UPSIDEDOWN = 0x400,
|
||||
FLAG_REWARD_VEHICLE = 0x8000
|
||||
};
|
||||
int32 m_nModelIndex;
|
||||
CVector m_vecPos;
|
||||
CVector m_vecAngle;
|
||||
float m_fPosX;
|
||||
float m_fPosY;
|
||||
float m_fPosZ;
|
||||
float m_fForwardX;
|
||||
float m_fForwardY;
|
||||
float m_fForwardZ;
|
||||
float m_fTractionMultiplier;
|
||||
int32 m_nFlags;
|
||||
int8 m_nPrimaryColor;
|
||||
int8 m_nSecondaryColor;
|
||||
@@ -84,7 +97,6 @@ public:
|
||||
void Init() { m_nModelIndex = 0; }
|
||||
void Clear() { m_nModelIndex = 0; }
|
||||
bool HasCar() { return m_nModelIndex != 0; }
|
||||
const CStoredCar &operator=(const CStoredCar& other);
|
||||
void StoreCar(CVehicle*);
|
||||
CVehicle* RestoreCar();
|
||||
};
|
||||
@@ -118,12 +130,16 @@ public:
|
||||
CVector2D m_vDir1;
|
||||
CVector2D m_vDir2;
|
||||
float m_fSupZ;
|
||||
CVector m_vecSSGaragePos;
|
||||
float m_fSSGarageAngle;
|
||||
float m_fDir1Len;
|
||||
float m_fDir2Len;
|
||||
float m_fInfX;
|
||||
float m_fSupX;
|
||||
float m_fInfY;
|
||||
float m_fSupY;
|
||||
uint32 m_nTimeCrusherCraneActivated;
|
||||
CVehicle* m_pSSTargetCar;
|
||||
float m_fDoorPos;
|
||||
float m_fDoorHeight;
|
||||
float m_fDoor1X;
|
||||
@@ -136,6 +152,14 @@ public:
|
||||
uint8 m_bCollectedCarsState;
|
||||
CVehicle *m_pTarget;
|
||||
CStoredCar m_sStoredCar; // not needed
|
||||
bool m_bInitialized;
|
||||
#ifdef GTA_NETWORK
|
||||
void* m_pSSVehicle; // some multiplayer vehicle structure, +104 == GetVehiclePointer
|
||||
#endif
|
||||
bool m_bSSGarageAcceptedVehicle;
|
||||
bool m_bLocked;
|
||||
bool m_nSSGarageState;
|
||||
bool m_bSSGarageStateChanging;
|
||||
|
||||
void OpenThisGarage();
|
||||
void CloseThisGarage();
|
||||
@@ -222,6 +246,7 @@ public:
|
||||
static CGarage aGarages[NUM_GARAGES];
|
||||
static CStoredCar aCarsInSafeHouses[TOTAL_HIDEOUT_GARAGES][NUM_GARAGE_STORED_CARS];
|
||||
static bool bCamShouldBeOutisde;
|
||||
static uint8 CrusherRewardMultiplier;
|
||||
|
||||
static void Init(void);
|
||||
#ifndef PS2
|
||||
@@ -269,13 +294,13 @@ public:
|
||||
static void CloseHideOutGaragesBeforeSave(void);
|
||||
static int32 CountCarsInHideoutGarage(uint8);
|
||||
static int32 GetBombTypeForGarageType(uint8 type) { return type - GARAGE_BOMBSHOP1 + 1; }
|
||||
static int32 GetCarsCollectedIndexForGarageType(uint8 type)
|
||||
static int32 GetCarsCollectedIndexForGarageType(uint8 type, uint32& total)
|
||||
{
|
||||
switch (type) {
|
||||
case GARAGE_COLLECTCARS_1: return 0;
|
||||
case GARAGE_COLLECTCARS_2: return 1;
|
||||
case GARAGE_COLLECTCARS_3: return 2;
|
||||
case GARAGE_COLLECTCARS_4: return 3;
|
||||
case GARAGE_COLLECTCARS_1: total = TOTAL_COLLECTCARS_CARS; return 0;
|
||||
case GARAGE_COLLECTCARS_2: total = 0; return 1;
|
||||
case GARAGE_COLLECTCARS_3: total = 0; return 2;
|
||||
case GARAGE_COLLECTCARS_4: total = 0; return 3;
|
||||
default: assert(0);
|
||||
}
|
||||
return 0;
|
||||
@@ -300,4 +325,15 @@ public:
|
||||
}
|
||||
static bool IsThisGarageTypeSafehouse(uint8 type) { return FindSafeHouseIndexForGarageType(type) >= 0; }
|
||||
|
||||
static bool InitDoorGubbins(uint32, uint8);
|
||||
static void SetupAnyGaragesForThisIsland(void);
|
||||
static void LockGarage(int16, bool);
|
||||
static int16 AddCrateGarage(CVector, float);
|
||||
|
||||
#ifdef GTA_NETWORK
|
||||
static void RemoveAllCrateGarages();
|
||||
static bool HasSSGarageAcceptedVehicle(int16 garage);
|
||||
static void SetVehicleForSSGarage(bool state, int16 garage, void* pVehicle); // void* -> ?
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
@@ -9,18 +9,31 @@
|
||||
#include "OnscreenTimer.h"
|
||||
#include "Camera.h"
|
||||
|
||||
CRGBA gbColour(255, 255, 255, 255);
|
||||
CRGBA gbColour2(255, 255, 255, 255);
|
||||
|
||||
void
|
||||
COnscreenTimer::Init()
|
||||
{
|
||||
m_bDisabled = false;
|
||||
for(uint32 i = 0; i < NUMONSCREENCOUNTERS; i++) {
|
||||
m_sCounters[i].m_nCounterOffset = 0;
|
||||
m_sCounters[i].m_nTotal = -1;
|
||||
|
||||
for(uint32 j = 0; j < ARRAY_SIZE(m_sCounters[0].m_aCounterText); j++)
|
||||
m_sCounters[i].m_aCounterText[j] = '\0';
|
||||
for (uint32 j = 0; j < ARRAY_SIZE(m_sCounters[0].m_aCounterText1); j++) {
|
||||
m_sCounters[i].m_aCounterText1[j] = '\0';
|
||||
}
|
||||
|
||||
for (uint32 j = 0; j < ARRAY_SIZE(m_sCounters[0].m_aCounterText2); j++) {
|
||||
m_sCounters[i].m_aCounterText2[j] = '\0';
|
||||
}
|
||||
|
||||
m_sCounters[i].m_nType = COUNTER_DISPLAY_NUMBER;
|
||||
m_sCounters[i].m_nTypeOfTotal = 0;
|
||||
m_sCounters[i].m_bCounterProcessed = false;
|
||||
m_sCounters[i].m_colour1 = CRGBA(112, 132, 157, 255);
|
||||
m_sCounters[i].m_colour2 = CRGBA(42, 58, 81, 255);
|
||||
|
||||
}
|
||||
for(uint32 i = 0; i < NUMONSCREENCLOCKS; i++) {
|
||||
m_sClocks[i].m_nClockOffset = 0;
|
||||
@@ -30,6 +43,8 @@ COnscreenTimer::Init()
|
||||
|
||||
m_sClocks[i].m_bClockProcessed = false;
|
||||
m_sClocks[i].m_bClockGoingDown = true;
|
||||
m_sClocks[i].m_aClockColour = CRGBA(244, 225, 91, 255);
|
||||
m_sClocks[i].m_bClockTickThisFrame = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +59,10 @@ COnscreenTimer::Process()
|
||||
void
|
||||
COnscreenTimer::ProcessForDisplay()
|
||||
{
|
||||
#ifdef GTA_NETWORK
|
||||
if (gIsMultiplayerGame)
|
||||
return;
|
||||
#endif
|
||||
if(CHud::m_Wants_To_Draw_Hud) {
|
||||
m_bProcessed = false;
|
||||
for(uint32 i = 0; i < NUMONSCREENCLOCKS; i++) {
|
||||
@@ -71,9 +90,12 @@ COnscreenTimer::ClearCounter(uint32 offset)
|
||||
for(uint32 i = 0; i < NUMONSCREENCOUNTERS; i++) {
|
||||
if(offset == m_sCounters[i].m_nCounterOffset) {
|
||||
m_sCounters[i].m_nCounterOffset = 0;
|
||||
m_sCounters[i].m_aCounterText[0] = '\0';
|
||||
m_sCounters[i].m_aCounterText1[0] = '\0';
|
||||
m_sCounters[i].m_aCounterText2[0] = '\0';
|
||||
m_sCounters[i].m_nTypeOfTotal = 0;
|
||||
m_sCounters[i].m_nType = COUNTER_DISPLAY_NUMBER;
|
||||
m_sCounters[i].m_bCounterProcessed = false;
|
||||
m_sCounters[i].m_bAddDollarPrefix = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -87,22 +109,45 @@ COnscreenTimer::ClearClock(uint32 offset)
|
||||
m_sClocks[i].m_aClockText[0] = '\0';
|
||||
m_sClocks[i].m_bClockProcessed = false;
|
||||
m_sClocks[i].m_bClockGoingDown = true;
|
||||
m_sClocks[i].m_bClockTickThisFrame = false;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
COnscreenTimer::AddCounter(uint32 offset, uint16 type, char* text, uint16 pos)
|
||||
COnscreenTimer::AddCounter(uint32 offset, uint16 type, char* text1, uint16 pos, int32 total, char* text2, uint16 totalType)
|
||||
{
|
||||
if (m_sCounters[pos].m_aCounterText[0] != '\0')
|
||||
if (m_sCounters[pos].m_nCounterOffset)
|
||||
return;
|
||||
|
||||
m_sCounters[pos].m_nCounterOffset = offset;
|
||||
if(text)
|
||||
strncpy(m_sCounters[pos].m_aCounterText, text, ARRAY_SIZE(m_sCounters[0].m_aCounterText));
|
||||
m_sCounters[pos].m_nTotal = total;
|
||||
if(text1)
|
||||
strncpy(m_sCounters[pos].m_aCounterText1, text1, ARRAY_SIZE(m_sCounters[0].m_aCounterText1));
|
||||
else
|
||||
m_sCounters[pos].m_aCounterText[0] = '\0';
|
||||
m_sCounters[pos].m_aCounterText1[0] = '\0';
|
||||
|
||||
if (text2)
|
||||
strncpy(m_sCounters[pos].m_aCounterText2, text2, ARRAY_SIZE(m_sCounters[0].m_aCounterText2));
|
||||
else
|
||||
m_sCounters[pos].m_aCounterText2[0] = '\0';
|
||||
|
||||
m_sCounters[pos].m_nTypeOfTotal = totalType;
|
||||
m_sCounters[pos].m_nType = type;
|
||||
m_sCounters[pos].m_bAddDollarPrefix = 0;
|
||||
|
||||
if (gbColour == CRGBA(255, 255, 255, 255))
|
||||
m_sCounters[pos].m_colour1 = CRGBA(112, 132, 157, 255);
|
||||
else {
|
||||
m_sCounters[pos].m_colour1 = gbColour;
|
||||
gbColour = CRGBA(255, 255, 255, 255);
|
||||
}
|
||||
|
||||
if (gbColour == CRGBA(255, 255, 255, 255))
|
||||
m_sCounters[pos].m_colour2 = CRGBA(42, 58, 81, 255);
|
||||
else {
|
||||
m_sCounters[pos].m_colour2 = gbColour;
|
||||
gbColour = CRGBA(255, 255, 255, 255);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -112,6 +157,13 @@ COnscreenTimer::AddClock(uint32 offset, char* text, bool bGoingDown)
|
||||
if(m_sClocks[i].m_nClockOffset == 0) {
|
||||
m_sClocks[i].m_nClockOffset = offset;
|
||||
m_sClocks[i].m_bClockGoingDown = bGoingDown;
|
||||
m_sClocks[i].m_bClockTickThisFrame = false;
|
||||
if (gbColour == CRGBA(255, 255, 255, 255))
|
||||
m_sClocks[i].m_aClockColour = CRGBA(244, 225, 91, 255);
|
||||
else {
|
||||
m_sClocks[i].m_aClockColour = gbColour;
|
||||
gbColour = CRGBA(255, 255, 255, 255);
|
||||
}
|
||||
if(text)
|
||||
strncpy(m_sClocks[i].m_aClockText, text, ARRAY_SIZE(m_sClocks[0].m_aClockText));
|
||||
else
|
||||
@@ -140,8 +192,12 @@ COnscreenTimerEntry::Process()
|
||||
}
|
||||
else {
|
||||
int32 oldTimeSeconds = oldTime / 1000;
|
||||
if (oldTimeSeconds < 12 && newTime / 1000 != oldTimeSeconds && !TheCamera.m_WideScreenOn) {
|
||||
DMAudio.PlayFrontEndSound(SOUND_CLOCK_TICK, newTime / 1000);
|
||||
if (oldTimeSeconds < 12) {
|
||||
m_bClockTickThisFrame = false;
|
||||
if (newTime / 1000 != oldTimeSeconds) {
|
||||
m_bClockTickThisFrame = true;
|
||||
DMAudio.PlayFrontEndSound(SOUND_CLOCK_TICK, newTime / 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -153,7 +209,7 @@ void
|
||||
COnscreenTimerEntry::ProcessForDisplayClock()
|
||||
{
|
||||
uint32 time = *CTheScripts::GetPointerToScriptVariable(m_nClockOffset);
|
||||
sprintf(m_aClockBuffer, "%02d:%02d", time / 1000 / 60 % 100,
|
||||
sprintf(m_aClockBuffer, "%d:%02d", time / 1000 / 60 % 100,
|
||||
time / 1000 % 60);
|
||||
}
|
||||
|
||||
@@ -161,5 +217,28 @@ void
|
||||
COnscreenCounterEntry::ProcessForDisplayCounter()
|
||||
{
|
||||
uint32 counter = *CTheScripts::GetPointerToScriptVariable(m_nCounterOffset);
|
||||
sprintf(m_aCounterBuffer, "%d", counter);
|
||||
char prefix[2] = { '\0' };
|
||||
if (m_bAddDollarPrefix)
|
||||
sprintf(prefix, "$");
|
||||
#ifdef FIX_BUGS
|
||||
char suffix[4] = { '\0' };
|
||||
#else
|
||||
char suffix[2] = { '\0' };
|
||||
#endif
|
||||
if (m_nTotal != -1) {
|
||||
m_nTotal = Min(99, m_nTotal);
|
||||
sprintf(suffix, "/%d", m_nTotal);
|
||||
}
|
||||
sprintf(m_aCounterBuffer, "%s%d%s", prefix, counter, suffix);
|
||||
}
|
||||
|
||||
void
|
||||
COnscreenTimer::ChangeCounterPrefix(uint32 offset, bool bChange)
|
||||
{
|
||||
for (uint32 i = 0; i < NUMONSCREENCOUNTERS; i++) {
|
||||
if (offset == m_sCounters[i].m_nCounterOffset) {
|
||||
m_sCounters[i].m_bAddDollarPrefix = bChange;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
|
||||
enum
|
||||
{
|
||||
COUNTER_DISPLAY_NUMBER,
|
||||
@@ -14,27 +16,31 @@ public:
|
||||
char m_aClockBuffer[40];
|
||||
bool m_bClockProcessed;
|
||||
bool m_bClockGoingDown;
|
||||
CRGBA m_aClockColour;
|
||||
bool m_bClockTickThisFrame;
|
||||
|
||||
void Process();
|
||||
void ProcessForDisplayClock();
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(COnscreenTimerEntry, 0x3C);
|
||||
|
||||
class COnscreenCounterEntry
|
||||
{
|
||||
public:
|
||||
uint32 m_nCounterOffset;
|
||||
char m_aCounterText[10];
|
||||
int32 m_nTotal;
|
||||
char m_aCounterText1[10];
|
||||
char m_aCounterText2[10];
|
||||
uint16 m_nTypeOfTotal;
|
||||
uint16 m_nType;
|
||||
char m_aCounterBuffer[40];
|
||||
bool m_bCounterProcessed;
|
||||
CRGBA m_colour1;
|
||||
CRGBA m_colour2;
|
||||
bool m_bAddDollarPrefix;
|
||||
|
||||
void ProcessForDisplayCounter();
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(COnscreenCounterEntry, 0x3C);
|
||||
|
||||
class COnscreenTimer
|
||||
{
|
||||
public:
|
||||
@@ -50,8 +56,12 @@ public:
|
||||
void ClearCounter(uint32 offset);
|
||||
void ClearClock(uint32 offset);
|
||||
|
||||
void AddCounter(uint32 offset, uint16 type, char* text, uint16 pos);
|
||||
void AddCounter(uint32 offset, uint16 type, char* text, uint16 pos, int32, char*, uint16);
|
||||
void AddClock(uint32 offset, char* text, bool bGoingDown);
|
||||
|
||||
void ChangeCounterPrefix(uint32 offset, bool bChange);
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(COnscreenTimer, 0xF4);
|
||||
extern CRGBA gbColour;
|
||||
extern CRGBA gbColour2;
|
||||
|
||||
|
||||
@@ -1763,18 +1763,18 @@ CPathFind::TestCoorsCloseness(CVector target, uint8 type, CVector start)
|
||||
float dist;
|
||||
|
||||
if(type == PATH_CAR)
|
||||
DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 999999.88f, -1);
|
||||
DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 170.0f, -1);
|
||||
else
|
||||
DoPathSearch(type, start, -1, target, nil, &DummyResult2, 0, nil, &dist, 50.0f, -1);
|
||||
#ifdef FIX_BUGS
|
||||
// dist has GenerationDistMultiplier as a factor, so our reference dist should have it too
|
||||
if(type == PATH_CAR)
|
||||
return dist < 150.0f*TheCamera.GenerationDistMultiplier;
|
||||
return dist < 180.0f*TheCamera.GenerationDistMultiplier;
|
||||
else
|
||||
return dist < 100.0f*TheCamera.GenerationDistMultiplier;
|
||||
#else
|
||||
if(type == PATH_CAR)
|
||||
return dist < 150.0f;
|
||||
return dist < 180.0f;
|
||||
else
|
||||
return dist < 100.0f;
|
||||
#endif
|
||||
|
||||
+21
-3
@@ -709,8 +709,10 @@ bool
|
||||
CPickups::TestForPickupsInBubble(CVector pos, float range)
|
||||
{
|
||||
for (int i = 0; i < NUMPICKUPS; i++) {
|
||||
if ((aPickUps[i].m_vecPos - pos).Magnitude() < range)
|
||||
return true;
|
||||
if (aPickUps[i].m_eType != PICKUP_NONE) {
|
||||
if ((aPickUps[i].m_vecPos - pos).Magnitude() < range)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1739,4 +1741,20 @@ CPed::CreateDeadPedPickupCoors(float *x, float *y, float *z)
|
||||
*y = GetPosition().y;
|
||||
*z = GetPosition().z + 0.4f;
|
||||
#undef NUMBER_OF_ATTEMPTS
|
||||
}
|
||||
}
|
||||
|
||||
float CPickups::GetValue(int index)
|
||||
{
|
||||
int i = GetActualPickupIndex(index);
|
||||
if (i == -1)
|
||||
return 0.0f;
|
||||
return aPickUps[i].m_fRevenue;
|
||||
}
|
||||
|
||||
void CPickups::SetValue(int index, float value)
|
||||
{
|
||||
int i = GetActualPickupIndex(index);
|
||||
if (i == -1)
|
||||
return;
|
||||
aPickUps[i].m_fRevenue = value;
|
||||
}
|
||||
|
||||
@@ -117,6 +117,9 @@ public:
|
||||
|
||||
static void RemoveAllPickupsOfACertainWeaponGroupWithNoAmmo(eWeaponType);
|
||||
static CPickup *FindPickUpForThisObject(CEntity*);
|
||||
|
||||
static float GetValue(int);
|
||||
static void SetValue(int, float);
|
||||
};
|
||||
|
||||
extern uint16 AmmoForWeapon[WEAPONTYPE_TOTALWEAPONS + 1];
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include "PlayerInfo.h"
|
||||
#include "Vehicle.h"
|
||||
|
||||
void
|
||||
CVehicle*
|
||||
CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uint16 model)
|
||||
{
|
||||
CAutomobile *car = new CAutomobile(model, MISSION_VEHICLE);
|
||||
@@ -40,6 +40,7 @@ CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uin
|
||||
TheCamera.SetZoomValueCamStringScript(0);
|
||||
} else
|
||||
TheCamera.TakeControl(car, CCam::MODE_BEHINDCAR, INTERPOLATION, CAMCONTROL_SCRIPT);
|
||||
return car;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
class CRemote
|
||||
{
|
||||
public:
|
||||
static void GivePlayerRemoteControlledCar(float, float, float, float, uint16);
|
||||
static CVehicle* GivePlayerRemoteControlledCar(float, float, float, float, uint16);
|
||||
static void TakeRemoteControlledCarFromPlayer(bool blowUp = true);
|
||||
};
|
||||
|
||||
@@ -1285,7 +1285,7 @@ void CReplay::TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float ca
|
||||
DMAudio.SetEffectsFadeVol(0);
|
||||
DMAudio.SetMusicFadeVol(0);
|
||||
CEscalators::Shutdown();
|
||||
CWaterCreatures::RemoveAll();
|
||||
//CWaterCreatures::RemoveAll();
|
||||
int current;
|
||||
for (current = 0; current < NUM_REPLAYBUFFERS; current++)
|
||||
if (BufferStatus[current] == REPLAYBUFFER_RECORD)
|
||||
|
||||
@@ -46,7 +46,7 @@ enum {
|
||||
|
||||
struct CStoredDetailedAnimationState
|
||||
{
|
||||
uint8 aAnimId[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
uint16 aAnimId[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
uint8 aCurTime[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
uint8 aSpeed[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
uint8 aBlendAmount[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
@@ -54,7 +54,7 @@ struct CStoredDetailedAnimationState
|
||||
uint8 aFunctionCallbackID[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
uint16 aFlags[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
uint8 aGroupId[NUM_MAIN_ANIMS_IN_REPLAY];
|
||||
uint8 aAnimId2[NUM_PARTIAL_ANIMS_IN_REPLAY];
|
||||
uint16 aAnimId2[NUM_PARTIAL_ANIMS_IN_REPLAY];
|
||||
uint8 aCurTime2[NUM_PARTIAL_ANIMS_IN_REPLAY];
|
||||
uint8 aSpeed2[NUM_PARTIAL_ANIMS_IN_REPLAY];
|
||||
uint8 aBlendAmount2[NUM_PARTIAL_ANIMS_IN_REPLAY];
|
||||
|
||||
+702
-555
File diff suppressed because it is too large
Load Diff
+138
-50
@@ -1,7 +1,9 @@
|
||||
#pragma once
|
||||
#include "Font.h"
|
||||
#include "Font.h"
|
||||
#include "Ped.h"
|
||||
#include "PedType.h"
|
||||
#include "Text.h"
|
||||
#include "sList.h"
|
||||
#include "Sprite2d.h"
|
||||
|
||||
class CEntity;
|
||||
@@ -17,7 +19,7 @@ class CRunningScript;
|
||||
extern int32 ScriptParams[32];
|
||||
|
||||
void FlushLog();
|
||||
#define script_assert(_Expression) FlushLog(); assert(_Expression);
|
||||
#define script_assert(_Expression) { FlushLog(); assert(_Expression); }
|
||||
|
||||
#define PICKUP_PLACEMENT_OFFSET (0.5f)
|
||||
#define PED_FIND_Z_OFFSET (5.0f)
|
||||
@@ -28,9 +30,9 @@ void FlushLog();
|
||||
#define UPSIDEDOWN_TURN_SPEED_THRESHOLD (0.02f)
|
||||
#define UPSIDEDOWN_TIMER_THRESHOLD (1000)
|
||||
|
||||
#define SPHERE_MARKER_R (252)
|
||||
#define SPHERE_MARKER_G (138)
|
||||
#define SPHERE_MARKER_B (242)
|
||||
#define SPHERE_MARKER_R (255)
|
||||
#define SPHERE_MARKER_G (255)
|
||||
#define SPHERE_MARKER_B (128)
|
||||
#define SPHERE_MARKER_A (228)
|
||||
#define SPHERE_MARKER_PULSE_PERIOD 2048
|
||||
#define SPHERE_MARKER_PULSE_FRACTION 0.1f
|
||||
@@ -48,6 +50,15 @@ void FlushLog();
|
||||
#define KEY_LENGTH_IN_SCRIPT (8)
|
||||
|
||||
//#define GTA_SCRIPT_COLLECTIVE
|
||||
#define GET_INTEGER_PARAM(i) (ScriptParams[i])
|
||||
#define GET_FLOAT_PARAM(i) (*(float*)&ScriptParams[i])
|
||||
#define GET_VECTOR_PARAM(i) (CVector(GET_FLOAT_PARAM(i), GET_FLOAT_PARAM(i+1), GET_FLOAT_PARAM(i+2)))
|
||||
|
||||
#define SET_INTEGER_PARAM(i, x) ScriptParams[i] = x
|
||||
#define SET_FLOAT_PARAM(i, x) *(float*)&ScriptParams[i] = x
|
||||
#define SET_VECTOR_PARAM(i, v) { *(float*)&ScriptParams[i] = (v).x; *(float*)&ScriptParams[i+1] = (v).y; *(float*)&ScriptParams[i+2] = (v).z; }
|
||||
|
||||
#define GTA_SCRIPT_COLLECTIVE
|
||||
|
||||
struct intro_script_rectangle
|
||||
{
|
||||
@@ -214,16 +225,34 @@ public:
|
||||
bool HasCarBeenStuckForAWhile(int32);
|
||||
};
|
||||
|
||||
enum {
|
||||
MAX_STACK_DEPTH = 16,
|
||||
NUM_LOCAL_VARS = 96,
|
||||
NUM_TIMERS = 2,
|
||||
NUM_GLOBAL_SLOTS = 26
|
||||
};
|
||||
|
||||
enum {
|
||||
ARGUMENT_END = 0,
|
||||
ARGUMENT_INT_ZERO,
|
||||
ARGUMENT_FLOAT_ZERO,
|
||||
ARGUMENT_FLOAT_1BYTE,
|
||||
ARGUMENT_FLOAT_2BYTES,
|
||||
ARGUMENT_FLOAT_3BYTES,
|
||||
ARGUMENT_INT32,
|
||||
ARGUMENT_GLOBALVAR,
|
||||
ARGUMENT_LOCALVAR,
|
||||
ARGUMENT_INT8,
|
||||
ARGUMENT_INT16,
|
||||
ARGUMENT_FLOAT
|
||||
ARGUMENT_FLOAT,
|
||||
ARGUMENT_TIMER,
|
||||
ARGUMENT_LOCAL = ARGUMENT_TIMER + NUM_TIMERS,
|
||||
ARGUMENT_LOCAL_ARRAY = ARGUMENT_LOCAL + NUM_LOCAL_VARS,
|
||||
ARGUMENT_GLOBAL = ARGUMENT_LOCAL_ARRAY + NUM_LOCAL_VARS,
|
||||
ARGUMENT_GLOBAL_ARRAY = ARGUMENT_GLOBAL + NUM_GLOBAL_SLOTS,
|
||||
MAX_ARGUMENT = ARGUMENT_GLOBAL_ARRAY + NUM_GLOBAL_SLOTS
|
||||
};
|
||||
|
||||
static_assert(MAX_ARGUMENT <= 256, "MAX_ARGUMENT must be less or equal to 256");
|
||||
|
||||
struct tCollectiveData
|
||||
{
|
||||
int32 colIndex;
|
||||
@@ -247,11 +276,18 @@ struct tBuildingSwap
|
||||
int32 m_nOldModel;
|
||||
};
|
||||
|
||||
|
||||
enum {
|
||||
MAX_STACK_DEPTH = 6,
|
||||
NUM_LOCAL_VARS = 16,
|
||||
NUM_TIMERS = 2
|
||||
struct script_corona
|
||||
{
|
||||
int id;
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
float size;
|
||||
uint8 r;
|
||||
uint8 g;
|
||||
uint8 b;
|
||||
int type;
|
||||
int flareType;
|
||||
};
|
||||
|
||||
class CRunningScript
|
||||
@@ -276,14 +312,25 @@ class CRunningScript
|
||||
ORS_8
|
||||
};
|
||||
|
||||
enum {
|
||||
STACKVALUE_IP_BITS = 22,
|
||||
STACKVALUE_INVERT_RETURN_BIT = STACKVALUE_IP_BITS,
|
||||
STACKVALUE_IS_FUNCTION_CALL_BIT,
|
||||
STACKVALUE_IP_PARAMS_OFFSET,
|
||||
|
||||
STACKVALUE_IP_MASK = ((1 << STACKVALUE_IP_BITS) - 1)
|
||||
};
|
||||
|
||||
public:
|
||||
CRunningScript* next;
|
||||
CRunningScript* prev;
|
||||
int32 m_nId;
|
||||
char m_abScriptName[8];
|
||||
uint32 m_nIp;
|
||||
uint32 m_anStack[MAX_STACK_DEPTH];
|
||||
uint16 m_nStackPointer;
|
||||
int32 m_anLocalVariables[NUM_LOCAL_VARS + NUM_TIMERS];
|
||||
int32 m_anLocalVariables[NUM_LOCAL_VARS + 8 + NUM_TIMERS]; // TODO(LCS): figure out why 106
|
||||
int32 m_nLocalsPointer;
|
||||
bool m_bIsActive;
|
||||
bool m_bCondResult;
|
||||
bool m_bIsMissionScript;
|
||||
@@ -303,8 +350,8 @@ public:
|
||||
void Load(uint8*& buf);
|
||||
|
||||
void UpdateTimers(float timeStep) {
|
||||
m_anLocalVariables[NUM_LOCAL_VARS] += timeStep;
|
||||
m_anLocalVariables[NUM_LOCAL_VARS + 1] += timeStep;
|
||||
for (int i = 0; i < NUM_TIMERS; i++)
|
||||
m_anLocalVariables[NUM_LOCAL_VARS + 8 + i] += timeStep;
|
||||
}
|
||||
|
||||
void Init();
|
||||
@@ -315,14 +362,37 @@ public:
|
||||
|
||||
static const uint32 nSaveStructSize;
|
||||
|
||||
void CollectParameters(uint32*, int16);
|
||||
void CollectParameters(uint32*, int16, int* pParams = (int*)&ScriptParams);
|
||||
int32 CollectNextParameterWithoutIncreasingPC(uint32);
|
||||
int32* GetPointerToScriptVariable(uint32*, int16);
|
||||
void StoreParameters(uint32*, int16);
|
||||
|
||||
int8 ProcessOneCommand();
|
||||
void DoDeatharrestCheck();
|
||||
void UpdateCompareFlag(bool);
|
||||
void UpdateCompareFlag(bool flag)
|
||||
{
|
||||
if (m_bNotFlag)
|
||||
flag = !flag;
|
||||
if (m_nAndOrState == ANDOR_NONE) {
|
||||
m_bCondResult = flag;
|
||||
return;
|
||||
}
|
||||
if (m_nAndOrState >= ANDS_1 && m_nAndOrState <= ANDS_8) {
|
||||
m_bCondResult &= flag;
|
||||
if (m_nAndOrState == ANDS_1) {
|
||||
m_nAndOrState = ANDOR_NONE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_bCondResult |= flag;
|
||||
if (m_nAndOrState <= ORS_1) {
|
||||
m_nAndOrState = ANDOR_NONE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_nAndOrState--;
|
||||
}
|
||||
int16 GetPadState(uint16, uint16);
|
||||
|
||||
int8 ProcessCommands0To99(int32);
|
||||
@@ -340,7 +410,10 @@ public:
|
||||
int8 ProcessCommands1200To1299(int32);
|
||||
int8 ProcessCommands1300To1399(int32);
|
||||
int8 ProcessCommands1400To1499(int32);
|
||||
int8 ProcessCommands1500To1599(int32);
|
||||
int8 ProcessCommands1600To1699(int32);
|
||||
|
||||
uint32 CollectLocateParameters(uint32*, bool);
|
||||
void LocatePlayerCommand(int32, uint32*);
|
||||
void LocatePlayerCharCommand(int32, uint32*);
|
||||
void LocatePlayerCarCommand(int32, uint32*);
|
||||
@@ -385,9 +458,10 @@ public:
|
||||
|
||||
bool ThisIsAValidRandomCop(uint32 mi, int cop, int swat, int fbi, int army, int miami);
|
||||
bool ThisIsAValidRandomPed(uint32 pedtype, int civ, int gang, int criminal);
|
||||
bool CheckDamagedWeaponType(int32 actual, int32 type);
|
||||
|
||||
void ReturnFromGosubOrFunction();
|
||||
|
||||
bool CheckDamagedWeaponType(int32 actual, int32 type);
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -396,38 +470,31 @@ enum {
|
||||
VAR_GLOBAL = 2,
|
||||
};
|
||||
|
||||
enum {
|
||||
#ifdef PS2
|
||||
SIZE_MAIN_SCRIPT = 205512,
|
||||
#else
|
||||
SIZE_MAIN_SCRIPT = 225512,
|
||||
#endif
|
||||
SIZE_MISSION_SCRIPT = 35000,
|
||||
SIZE_SCRIPT_SPACE = SIZE_MAIN_SCRIPT + SIZE_MISSION_SCRIPT
|
||||
};
|
||||
|
||||
enum {
|
||||
MAX_NUM_SCRIPTS = 128,
|
||||
MAX_NUM_INTRO_TEXT_LINES = 48,
|
||||
MAX_NUM_INTRO_RECTANGLES = 16,
|
||||
MAX_NUM_SCRIPT_SRPITES = 16,
|
||||
MAX_NUM_SCRIPT_SPHERES = 16,
|
||||
MAX_NUM_USED_OBJECTS = 220,
|
||||
MAX_NUM_MISSION_SCRIPTS = 120,
|
||||
MAX_NUM_BUILDING_SWAPS = 25,
|
||||
MAX_NUM_INVISIBILITY_SETTINGS = 20,
|
||||
MAX_NUM_STORED_LINES = 1024
|
||||
MAX_NUM_COLLECTIVES = 32,
|
||||
MAX_NUM_USED_OBJECTS = 305,
|
||||
MAX_NUM_MISSION_SCRIPTS = 150,
|
||||
MAX_NUM_BUILDING_SWAPS = 80,
|
||||
MAX_NUM_INVISIBILITY_SETTINGS = 52,
|
||||
MAX_NUM_STORED_LINES = 1024,
|
||||
MAX_ALLOWED_COLLISIONS = 2
|
||||
};
|
||||
|
||||
class CTheScripts
|
||||
{
|
||||
public:
|
||||
static uint8 ScriptSpace[SIZE_SCRIPT_SPACE];
|
||||
static uint8* ScriptSpace;
|
||||
static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS];
|
||||
static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES];
|
||||
static intro_script_rectangle IntroRectangles[MAX_NUM_INTRO_RECTANGLES];
|
||||
static CSprite2d ScriptSprites[MAX_NUM_SCRIPT_SRPITES];
|
||||
static script_sphere_struct ScriptSphereArray[MAX_NUM_SCRIPT_SPHERES];
|
||||
static tCollectiveData CollectiveArray[MAX_NUM_COLLECTIVES];
|
||||
static tUsedObject UsedObjectArray[MAX_NUM_USED_OBJECTS];
|
||||
static int32 MultiScriptArray[MAX_NUM_MISSION_SCRIPTS];
|
||||
static tBuildingSwap BuildingSwapArray[MAX_NUM_BUILDING_SWAPS];
|
||||
@@ -459,20 +526,24 @@ public:
|
||||
static uint16 ScriptsUpdated;
|
||||
static uint32 LastMissionPassedTime;
|
||||
static uint16 NumberOfExclusiveMissionScripts;
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
#define CARDS_IN_SUIT (13)
|
||||
#define NUM_SUITS (4)
|
||||
#define MAX_DECKS (6)
|
||||
#define CARDS_IN_DECK (CARDS_IN_SUIT * NUM_SUITS)
|
||||
#define CARDS_IN_STACK (CARDS_IN_DECK * MAX_DECKS)
|
||||
static int16 CardStack[CARDS_IN_STACK];
|
||||
static int16 CardStackPosition;
|
||||
#endif
|
||||
|
||||
static bool bPlayerIsInTheStatium;
|
||||
static uint8 RiotIntensity;
|
||||
static bool bPlayerHasMetDebbieHarry;
|
||||
|
||||
static void Init();
|
||||
static int AllowedCollision[MAX_ALLOWED_COLLISIONS];
|
||||
static uint16* SavedVarIndices;
|
||||
static int NumSaveVars;
|
||||
static int FSDestroyedFlag;
|
||||
static int NextProcessId;
|
||||
static bool InTheScripts;
|
||||
static CRunningScript* pCurrent;
|
||||
static uint16 NumTrueGlobals;
|
||||
static uint16 MostGlobals;
|
||||
static base::cSList<script_corona> mCoronas;
|
||||
static int NextScriptCoronaID;
|
||||
|
||||
static bool Init(bool loaddata = false);
|
||||
static void Process();
|
||||
|
||||
static CRunningScript* StartTestScript();
|
||||
@@ -482,11 +553,13 @@ public:
|
||||
static void UndoBuildingSwaps();
|
||||
static void UndoEntityInvisibilitySettings();
|
||||
|
||||
/*
|
||||
static void ScriptDebugLine3D(float x1, float y1, float z1, float x2, float y2, float z2, uint32 col, uint32 col2);
|
||||
static void RenderTheScriptDebugLines();
|
||||
*/
|
||||
|
||||
static void SaveAllScripts(uint8*, uint32*);
|
||||
static void LoadAllScripts(uint8*, uint32);
|
||||
static bool LoadAllScripts(uint8*, uint32);
|
||||
|
||||
static bool IsDebugOn() { return DbgFlag; };
|
||||
static void InvertDebugFlag() { DbgFlag = !DbgFlag; }
|
||||
@@ -542,10 +615,12 @@ public:
|
||||
static void DrawScriptSpheres();
|
||||
static void HighlightImportantArea(uint32, float, float, float, float, float);
|
||||
static void HighlightImportantAngledArea(uint32, float, float, float, float, float, float, float, float, float);
|
||||
/*
|
||||
static void DrawDebugSquare(float, float, float, float);
|
||||
static void DrawDebugAngledSquare(float, float, float, float, float, float, float, float);
|
||||
static void DrawDebugCube(float, float, float, float, float, float);
|
||||
static void DrawDebugAngledCube(float, float, float, float, float, float, float, float, float, float);
|
||||
*/
|
||||
|
||||
static void AddToInvisibilitySwapArray(CEntity*, bool);
|
||||
static void AddToBuildingSwapArray(CBuilding*, int32, int32);
|
||||
@@ -554,7 +629,7 @@ public:
|
||||
static int32 AddScriptSphere(int32 id, CVector pos, float radius);
|
||||
static int32 GetNewUniqueScriptSphereIndex(int32 index);
|
||||
static void RemoveScriptSphere(int32 index);
|
||||
static void RemoveScriptTextureDictionary();
|
||||
//static void RemoveScriptTextureDictionary();
|
||||
public:
|
||||
static void RemoveThisPed(CPed* pPed);
|
||||
|
||||
@@ -563,6 +638,10 @@ public:
|
||||
static void SwitchToMission(int32 mission);
|
||||
#endif
|
||||
|
||||
static int GetSaveVarIndex(int);
|
||||
static void Shutdown(void);
|
||||
static void SwapNearestBuildingModel(float, float, float, float, int, int);
|
||||
|
||||
#ifdef GTA_SCRIPT_COLLECTIVE
|
||||
static void AdvanceCollectiveIndex()
|
||||
{
|
||||
@@ -585,9 +664,11 @@ public:
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
static bool MissionSupportsMissionReplay(int index)
|
||||
{
|
||||
return index >= 3 && index <= 35 || index >= 51 && index <= 65 || index >= 67 && index <= 74 || index >= 83 && index <= 87;
|
||||
return (index >= 48 && index <= 61) || (index >= 63 && index <= 117);
|
||||
}
|
||||
#endif
|
||||
static bool IsFortStauntonDestroyed() { return FSDestroyedFlag && *(int32*)&ScriptSpace[FSDestroyedFlag] == 1; }
|
||||
|
||||
|
||||
#ifdef USE_DEBUG_SCRIPT_LOADER
|
||||
static int ScriptToLoad;
|
||||
@@ -601,6 +682,10 @@ public:
|
||||
#endif
|
||||
};
|
||||
|
||||
extern int ScriptParams[32];
|
||||
|
||||
VALIDATE_SIZE(uStackReturnValue, 4);
|
||||
|
||||
#ifdef MISSION_REPLAY
|
||||
extern int AllowMissionReplay;
|
||||
extern uint32 WaitForMissionActivate;
|
||||
@@ -613,7 +698,6 @@ extern int IsInAmmunation;
|
||||
extern int MissionSkipLevel;
|
||||
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
extern bool UsingMobileScript;
|
||||
extern bool AlreadySavedGame;
|
||||
#endif
|
||||
|
||||
@@ -637,3 +721,7 @@ enum {
|
||||
MISSION_RETRY_STAGE_WAIT_FOR_TIMER_AFTER_RESTART,
|
||||
};
|
||||
#endif
|
||||
|
||||
extern int gScriptsFile;
|
||||
extern CVector gVectorSetInLua;
|
||||
|
||||
|
||||
@@ -0,0 +1,426 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "Script.h"
|
||||
#include "ScriptCommands.h"
|
||||
|
||||
#include "CarCtrl.h"
|
||||
#include "DMAudio.h"
|
||||
#include "Frontend.h"
|
||||
#include "GameLogic.h"
|
||||
#include "Garages.h"
|
||||
#include "General.h"
|
||||
#include "Hud.h"
|
||||
#include "Messages.h"
|
||||
#include "Object.h"
|
||||
#include "Pad.h"
|
||||
#include "Pickups.h"
|
||||
#include "PlayerPed.h"
|
||||
#include "Pools.h"
|
||||
#include "Vehicle.h"
|
||||
#include "SpecialFX.h"
|
||||
#include "Stats.h"
|
||||
#include "User.h"
|
||||
#include "Weather.h"
|
||||
#include "World.h"
|
||||
|
||||
bool gDeveloperFlag;
|
||||
|
||||
int8 CRunningScript::ProcessCommands1600To1699(int32 command)
|
||||
{
|
||||
switch (command) {
|
||||
case COMMAND_ADD_NOODLES_DELIVERED:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::NoodlesDelievered += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_SCRAPYARD_CHALLENGE_SCORE:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::TopScrapyardChallengeScore = Max(CStats::TopScrapyardChallengeScore, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_9MM_MAYHEM_SCORE:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::Top9mmMayhemScore = Max(CStats::Top9mmMayhemScore, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_SCOOTER_SHOOTER_SCORE:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::TopScooterShooterScore = Max(CStats::TopScooterShooterScore, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_ADD_MONEY_MADE_FROM_TOURIST:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::MoneyMadeFromTourist += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_ADD_TOURISTS_TAKEN_TO_SPOTS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::TouristsTakenToSpots += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_ADD_EXPORTED_CARS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::NumberOfExportedCars += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_SET_TOTAL_EXPORT_CARS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::TotalNumberOfCarExport = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_DIRT_BIKE_FASTEST_LAP:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
// CStats::RegisterDirtBikeFastestLap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_DIRT_BIKE_FASTEST_TIME:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
// CStats::RegisterDirtBikeFastestTime(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_DIRT_BIKE_AIR_TIME:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::DirtBikeMostAir = Max(CStats::DirtBikeMostAir, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_ADD_ARROW_3D_MARKER:
|
||||
{
|
||||
uint32 ip = m_nIp;
|
||||
uint32 id = (uint32)(uintptr)GetPointerToScriptVariable(&ip, 0);
|
||||
CollectParameters(&m_nIp, 10);
|
||||
CVector pos = GET_VECTOR_PARAM(0);
|
||||
CVector dir = GET_VECTOR_PARAM(3);
|
||||
pos.z += GET_FLOAT_PARAM(9) + 7.0f;
|
||||
//C3dMarkers::PlaceMarker(id, MARKERTYPE_ARROW, pos, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), 200, 1, 3.2f, 1, dir, 1.0f, 0, 0); - TODO
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_NOW_OVERRIDE_FADE:
|
||||
{
|
||||
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // true, true
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_PICKUP_VALUE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
SET_INTEGER_PARAM(0, CPickups::GetValue(GET_INTEGER_PARAM(0)));
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_PICKUP_VALUE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPickups::SetValue(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_DEVELOPER:
|
||||
#ifdef GTA_NETWORK
|
||||
UpdateCompareFlag(gDeveloperFlag || gIsMultiplayerGame);
|
||||
#else
|
||||
UpdateCompareFlag(gDeveloperFlag);
|
||||
#endif
|
||||
return 0;
|
||||
case COMMAND_SET_DEVELOPER_FLAG:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
gDeveloperFlag = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_WICHITA_WIPEOUT_SCORE:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::TopWichitaWipeoutScore = Max(CStats::TopWichitaWipeoutScore, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_ATTACH_OBJECT_TO_CAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 5);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1));
|
||||
script_assert(pVehicle);
|
||||
CVector offset = GET_VECTOR_PARAM(2);
|
||||
// pObject->AttachObjectToEntity(pVehicle, offset);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DETACH_OBJECT_FROM_CAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
// if (pObject && pObject->m_pAttachedTo)
|
||||
// pObject->DettachObjectFromEntity();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_PAD_STICKS_MULTIPLIER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPad::GetPad(0)->unk_B4 = GET_FLOAT_PARAM(0);
|
||||
CPad::GetPad(0)->unk_B8 = GET_FLOAT_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_SUBTITLE_NOW:
|
||||
{
|
||||
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 2);
|
||||
if (FrontEndMenuManager.m_PrefsShowSubtitles)
|
||||
CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // false, true
|
||||
else
|
||||
CMessages::AddToPreviousBriefArray(key, -1, -1, -1, -1, -1, -1, nil);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_SUBTITLE_NOW_OVERRIDE_FADE:
|
||||
{
|
||||
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 2);
|
||||
if (FrontEndMenuManager.m_PrefsShowSubtitles)
|
||||
CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // true, true
|
||||
else
|
||||
CMessages::AddToPreviousBriefArray(key, -1, -1, -1, -1, -1, -1, nil);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_SUBTITLE_NOW_NO_BRIEF:
|
||||
{
|
||||
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 2);
|
||||
if (FrontEndMenuManager.m_PrefsShowSubtitles)
|
||||
CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); // false, false
|
||||
else
|
||||
CMessages::AddToPreviousBriefArray(key, -1, -1, -1, -1, -1, -1, nil);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_WITH_NUMBER_NOW_NO_BRIEF:
|
||||
{
|
||||
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 3);
|
||||
CMessages::AddMessageJumpQWithNumber(key, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); // 0
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_ANGLE_BETWEEN_POINTS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
SET_FLOAT_PARAM(0, CGeneral::GetAngleBetweenPoints(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), GET_FLOAT_PARAM(3)));
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_OVERRIDE_CHAR_MOVE_ANIM:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->bOverrideMoveAnim = true;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_1627:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// something related to debug menu, not implemented
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ENABLE_EMERGENCY_VEHICLES:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
gbEmergencyVehiclesEnabled = GET_INTEGER_PARAM(0) != 0;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ADD_UNLOCKED_COSTUME:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::AddUnlockedCostume(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_CLEAR_MULTIPLAYER_SPLASH_SCREEN:
|
||||
// ClearMultiplayerSplashScreen();
|
||||
return 0;
|
||||
case COMMAND_PRINT_WITH_2_NUMBERS_NOW_NO_BRIEF:
|
||||
{
|
||||
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CMessages::AddMessageJumpQWithNumber(key, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); // 0
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_OBJECT_ORIENTATION:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
SET_FLOAT_PARAM(1, LimitAngleOnCircle(RADTODEG(Asin(pObject->GetForward().z))));
|
||||
SET_FLOAT_PARAM(2, LimitAngleOnCircle(RADTODEG(Atan2(-pObject->GetForward().x, pObject->GetForward().y))));
|
||||
SET_FLOAT_PARAM(0, LimitAngleOnCircle(RADTODEG(Atan2(-pObject->GetRight().z, pObject->GetUp().z))));
|
||||
StoreParameters(&m_nIp, 3);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_OBJECT_ORIENTATION:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
pObject->SetOrientation(DEGTORAD(GET_FLOAT_PARAM(2)), DEGTORAD(GET_FLOAT_PARAM(1)), DEGTORAD(GET_FLOAT_PARAM(3)));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CHANGE_ONSCREEN_COUNTER_PREFIX:
|
||||
{
|
||||
uint16 offset = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace;
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CUserDisplay::OnscnTimer.ChangeCounterPrefix(offset, GET_INTEGER_PARAM(0) != 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_STORE_PLAYER_OUTFIT:
|
||||
{
|
||||
char tmp[12]; // TODO
|
||||
CTheScripts::ReadTextLabelFromScript(&m_nIp, tmp);
|
||||
for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++)
|
||||
CGameLogic::mStoredPlayerOutfit[i] = tmp[i];
|
||||
printf("STORED PLAYOUR OUTFIT : %s\n", CGameLogic::mStoredPlayerOutfit);
|
||||
m_nIp += KEY_LENGTH_IN_SCRIPT;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_STRING:
|
||||
{
|
||||
char onscreen_str1[12];
|
||||
uint16 var = (uint8*)GetPointerToScriptVariable(&m_nIp, 0) - CTheScripts::ScriptSpace;
|
||||
CollectParameters(&m_nIp, 2);
|
||||
wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]);
|
||||
strncpy(onscreen_str1, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT);
|
||||
m_nIp += KEY_LENGTH_IN_SCRIPT;
|
||||
CUserDisplay::OnscnTimer.AddCounter(var, GET_INTEGER_PARAM(1), onscreen_str1, 0, GET_INTEGER_PARAM(0), nil, 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_PLAYER_CURRENT_WEAPON_AMMO_IN_CLIP:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CWeapon* pWeapon = FindPlayerPed()->GetWeapon();
|
||||
if (pWeapon && GET_INTEGER_PARAM(0))
|
||||
pWeapon->m_nAmmoInClip = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_WAIT_STATE_REPEAT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 3);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
if (pPed)
|
||||
pPed->SetWaitState((eWaitState)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2) >= 0 ? &GET_INTEGER_PARAM(2) : nil, true);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_BEST_TIME_GOGO_FAGGIO:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::RegisterBestTimeGoGoFaggio(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_LOCK_GARAGE:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CGarages::LockGarage(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_IS_FINAL_GAME:
|
||||
#ifdef FINAL
|
||||
UpdateCompareFlag(true);
|
||||
#else
|
||||
UpdateCompareFlag(false);
|
||||
#endif
|
||||
return 0;
|
||||
case COMMAND_SET_ALLOWED_COLLISION:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CTheScripts::AllowedCollision[0] = GET_INTEGER_PARAM(0);
|
||||
CTheScripts::AllowedCollision[1] = GET_INTEGER_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_GUARDIAN_ANGEL_LEVEL:
|
||||
CollectParameters(&m_nIp, 3);
|
||||
//CStats::GuardianAngelHighestLevel_Ind = Max(CStats::GuardianAngelHighestLevel_Ind, GET_INTEGER_PARAM(0));
|
||||
//CStats::GuardianAngelHighestLevel_Com = Max(CStats::GuardianAngelHighestLevel_Com, GET_INTEGER_PARAM(1));
|
||||
//CStats::GuardianAngelHighestLevel_Sub = Max(CStats::GuardianAngelHighestLevel_Sub, GET_INTEGER_PARAM(2));
|
||||
return 0;
|
||||
case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_2_STRINGS:
|
||||
{
|
||||
char onscreen_str1[12];
|
||||
char onscreen_str2[12];
|
||||
uint16 var = (uint8*)GetPointerToScriptVariable(&m_nIp, 0) - CTheScripts::ScriptSpace;
|
||||
CollectParameters(&m_nIp, 3);
|
||||
wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]);
|
||||
strncpy(onscreen_str1, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT);
|
||||
m_nIp += KEY_LENGTH_IN_SCRIPT;
|
||||
wchar* text2 = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]);
|
||||
strncpy(onscreen_str2, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT);
|
||||
m_nIp += KEY_LENGTH_IN_SCRIPT;
|
||||
CUserDisplay::OnscnTimer.AddCounter(var, GET_INTEGER_PARAM(1), onscreen_str2, 0, GET_INTEGER_PARAM(0), onscreen_str1, GET_INTEGER_PARAM(2));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_PLAYER_STORED_WEAPON:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed;
|
||||
script_assert(pPed);
|
||||
SET_INTEGER_PARAM(0, pPed->m_storedWeapon);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DISABLE_PAUSE_MENU:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// FrontEndMenuManager.mDisablePauseMenu = GET_INTEGER_PARAM(0) != 0; // TODO: static + member
|
||||
return 0;
|
||||
case COMMAND_IS_CHANNEL_PLAYING:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//UpdateCompareFlag(DMAudio.IsChannelPlaying(GET_INTEGER_PARAM(0));
|
||||
UpdateCompareFlag(false);
|
||||
return 0;
|
||||
case COMMAND_SET_CLOCK_EVENT_WARNING:
|
||||
CollectParameters(&m_nIp, 3);
|
||||
/*
|
||||
if (CHud::m_ClockEventWarningMinutes || GET_INTEGER_PARAMS(2)){
|
||||
CHud::m_ClockEventWarningMinutes = GET_INTEGER_PARAMS(2);
|
||||
CHud::m_ClockEventMinutes = GET_INTEGER_PARAMS(1);
|
||||
CHud::m_ClockEventHours = GET_INTEGER_PARAMS(0);
|
||||
CHud::m_ClockEventFlashTimer = 0;
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
case COMMAND_SET_EXTRA_COLOUR_LIGHT_DIRECTION:
|
||||
CollectParameters(&m_nIp, 3);
|
||||
// CWeather::ExtraColourLightDir = GET_VECTOR_PARAM(0);
|
||||
// CWeather::ExtraColourLightDir.Normalise();
|
||||
return 0;
|
||||
case COMMAND_SET_CHAR_CAN_BE_TARGETTED_BY_LEADER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->bCanBeTargettedByLeader = GET_INTEGER_PARAM(1) != 0;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_HELP_NO_BRIEF:
|
||||
{
|
||||
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CHud::SetHelpMessage(text, false); // + false, false
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_HELP_FOREVER_NO_BRIEF:
|
||||
{
|
||||
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CHud::SetHelpMessage(text, false, true); // + false
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_HELP_ALWAYS_NO_BRIEF:
|
||||
{
|
||||
// CHud::mAlwaysAllowHelpText = true;
|
||||
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CHud::SetHelpMessage(text, false); // + false, false
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_HELP_FOREVER_ALWAYS_NO_BRIEF:
|
||||
{
|
||||
// CHud::mAlwaysAllowHelpText = true;
|
||||
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CHud::SetHelpMessage(text, false, true); // + false
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CAR_IS_REWARD:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
pVehicle->bRewardVehicle = (GET_INTEGER_PARAM(1) != 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_FREEZE_ALL_PLAYER_FOLLOWERS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPlayerPed* pPlayerPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed;
|
||||
script_assert(pPlayerPed);
|
||||
for (int i = 0; i < CPools::GetVehiclePool()->GetSize(); i++) {
|
||||
CPed* pPed = CPools::GetPedPool()->GetSlot(i);
|
||||
if (pPed && IsPedPointerValid(pPed)) {
|
||||
if (pPed->m_leader == pPlayerPed || (pPed->m_objective == OBJECTIVE_FOLLOW_CHAR_IN_FORMATION && pPed->m_pedInObjective == pPlayerPed))
|
||||
pPed->bIsFrozen = (GET_INTEGER_PARAM(1) != 0);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
script_assert(0);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
+421
-369
File diff suppressed because it is too large
Load Diff
+603
-556
File diff suppressed because it is too large
Load Diff
+427
-399
File diff suppressed because it is too large
Load Diff
+348
-301
File diff suppressed because it is too large
Load Diff
+422
-369
File diff suppressed because it is too large
Load Diff
+376
-248
File diff suppressed because it is too large
Load Diff
+446
-255
@@ -3,8 +3,9 @@
|
||||
#include "Script.h"
|
||||
#include "ScriptCommands.h"
|
||||
|
||||
#include "Bike.h"
|
||||
#include "DMAudio.h"
|
||||
#if ((defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) && defined MORE_LANGUAGES)
|
||||
#ifdef MORE_LANGUAGES
|
||||
#include "Frontend.h"
|
||||
#endif
|
||||
#include "GameLogic.h"
|
||||
@@ -12,13 +13,10 @@
|
||||
#ifdef MISSION_REPLAY
|
||||
#include "GenericGameStorage.h"
|
||||
#endif
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
#include "General.h"
|
||||
#include "maths.h"
|
||||
#endif
|
||||
#include "Hud.h"
|
||||
#include "Pad.h"
|
||||
#include "PedAttractor.h"
|
||||
#include "Pickups.h"
|
||||
#include "Population.h"
|
||||
#include "Pools.h"
|
||||
#include "RpAnimBlend.h"
|
||||
@@ -29,19 +27,20 @@
|
||||
#include "World.h"
|
||||
#include "Zones.h"
|
||||
|
||||
// LCS: file done except TODOs (also check commented out strings)
|
||||
|
||||
int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
{
|
||||
switch (command) {
|
||||
case COMMAND_REGISTER_VIGILANTE_LEVEL:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::RegisterLevelVigilanteMission(ScriptParams[0]);
|
||||
CStats::RegisterLevelVigilanteMission(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_CLEAR_ALL_CHAR_ANIMS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
script_assert(pPed);
|
||||
if (!pPed->bInVehicle) {
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
if (pPed && pPed->GetPedState() != PED_DRIVING && pPed->GetPedState() != PED_AIM_GUN) {
|
||||
pPed->m_pVehicleAnim = nil;
|
||||
pPed->RestartNonPartialAnims();
|
||||
RpAnimBlendClumpRemoveAllAssociations(pPed->GetClump());
|
||||
@@ -62,7 +61,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
}
|
||||
case COMMAND_SET_MAXIMUM_NUMBER_OF_CARS_IN_GARAGE:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CGarages::SetMaxNumStoredCarsForGarage(ScriptParams[0], ScriptParams[1]);
|
||||
CGarages::SetMaxNumStoredCarsForGarage(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_WANTED_STARS_ARE_FLASHING:
|
||||
{
|
||||
@@ -72,25 +71,25 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
}
|
||||
case COMMAND_SET_ALLOW_HURRICANES:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::NoMoreHurricanes = ScriptParams[0];
|
||||
CStats::NoMoreHurricanes = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_PLAY_ANNOUNCEMENT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
DMAudio.PlayRadioAnnouncement(ScriptParams[0] + STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED);
|
||||
DMAudio.PlayRadioAnnouncement(GET_INTEGER_PARAM(0) + STREAMED_SOUND_NEWS_A);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_PLAYER_IS_IN_STADIUM:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CTheScripts::bPlayerIsInTheStatium = ScriptParams[0];
|
||||
CTheScripts::bPlayerIsInTheStatium = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_BUS_FARES_COLLECTED_BY_PLAYER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]];
|
||||
ScriptParams[0] = pPlayerInfo->m_pPed->m_nLastBusFareCollected;
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)];
|
||||
SET_INTEGER_PARAM(0, pPlayerInfo->m_pPed->m_nLastBusFareCollected);
|
||||
pPlayerInfo->m_pPed->m_nLastBusFareCollected = 0;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
@@ -98,11 +97,11 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_SET_CHAR_OBJ_BUY_ICE_CREAM:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1));
|
||||
script_assert(pVehicle);
|
||||
ScriptParams[0] = 0;
|
||||
SET_INTEGER_PARAM(0, 0);
|
||||
if (pPed->m_objective == OBJECTIVE_NONE && !pPed->bHasAlreadyUsedAttractor) {
|
||||
C2dEffect* pEffect = (C2dEffect*)GetPedAttractorManager()->GetEffectForIceCreamVan(pVehicle, pPed->GetPosition()); // has to be casted, because inner methods are const
|
||||
if (pEffect) {
|
||||
@@ -111,7 +110,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
if ((pPed->GetPosition() - pos).MagnitudeSqr() < SQR(20.0f)) {
|
||||
if (GetPedAttractorManager()->HasEmptySlot(pEffect) && GetPedAttractorManager()->IsApproachable(pEffect, pVehicle->GetMatrix(), 0, pPed)) {
|
||||
if (GetPedAttractorManager()->RegisterPedWithAttractor(pPed, pEffect, pVehicle->GetMatrix()))
|
||||
ScriptParams[0] = 1;
|
||||
SET_INTEGER_PARAM(0, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -121,16 +120,17 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
}
|
||||
case COMMAND_DISPLAY_RADAR:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CHud::m_HideRadar = ScriptParams[0] == 0;
|
||||
CHud::m_HideRadar = GET_INTEGER_PARAM(0) == 0;
|
||||
// on PS2 two flags are set, on mobile none
|
||||
return 0;
|
||||
case COMMAND_REGISTER_BEST_POSITION:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CStats::RegisterBestPosition(ScriptParams[0], ScriptParams[1]);
|
||||
CStats::RegisterBestPosition(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_IS_PLAYER_IN_INFO_ZONE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]];
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)];
|
||||
char key[KEY_LENGTH_IN_SCRIPT];
|
||||
memset(key, 0, KEY_LENGTH_IN_SCRIPT);
|
||||
CTheScripts::ReadTextLabelFromScript(&m_nIp, key);
|
||||
@@ -143,7 +143,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_CLEAR_CHAR_ICE_CREAM_PURCHASE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
if (pPed->m_attractor)
|
||||
GetPedAttractorManager()->DeRegisterPed(pPed, pPed->m_attractor);
|
||||
@@ -155,7 +155,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_HAS_CHAR_ATTEMPTED_ATTRACTOR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(pPed->bHasAlreadyUsedAttractor);
|
||||
return 0;
|
||||
@@ -163,9 +163,9 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_SET_LOAD_COLLISION_FOR_CAR_FLAG:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
if (ScriptParams[1]) {
|
||||
if (GET_INTEGER_PARAM(1)) {
|
||||
pVehicle->bDontLoadCollision = false;
|
||||
if (m_bMissionFlag) {
|
||||
CWorld::Remove(pVehicle);
|
||||
@@ -186,9 +186,9 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_SET_LOAD_COLLISION_FOR_CHAR_FLAG:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
if (ScriptParams[1]) {
|
||||
if (GET_INTEGER_PARAM(1)) {
|
||||
pPed->bDontLoadCollision = false;
|
||||
if (m_bMissionFlag) {
|
||||
CWorld::Remove(pPed);
|
||||
@@ -210,31 +210,31 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_ADD_BIG_GUN_FLASH:
|
||||
{
|
||||
CollectParameters(&m_nIp, 6);
|
||||
CWeapon::AddGunFlashBigGuns(*(CVector*)&ScriptParams[0], *(CVector*)&ScriptParams[3]);
|
||||
CWeapon::AddGunFlashBigGuns(GET_VECTOR_PARAM(0), GET_VECTOR_PARAM(3));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_HAS_CHAR_BOUGHT_ICE_CREAM:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(pPed->bBoughtIceCream);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_PROGRESS_PERCENTAGE:
|
||||
*(float*)&ScriptParams[0] = CStats::GetPercentageProgress();
|
||||
SET_FLOAT_PARAM(0, CStats::GetPercentageProgress());
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_SET_SHORTCUT_PICKUP_POINT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CGameLogic::AddShortCutPointAfterDeath(*(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3]);
|
||||
CGameLogic::AddShortCutPointAfterDeath(GET_VECTOR_PARAM(0), GET_FLOAT_PARAM(3));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_SHORTCUT_DROPOFF_POINT_FOR_MISSION:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CGameLogic::AddShortCutDropOffPointForMission(*(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3]);
|
||||
CGameLogic::AddShortCutDropOffPointForMission(GET_VECTOR_PARAM(0), GET_FLOAT_PARAM(3));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_RANDOM_ICE_CREAM_CUSTOMER_IN_AREA:
|
||||
@@ -242,10 +242,10 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
CollectParameters(&m_nIp, 7);
|
||||
int ped_handle = -1;
|
||||
CVector pos = FindPlayerCoors();
|
||||
float x1 = *(float*)&ScriptParams[0];
|
||||
float y1 = *(float*)&ScriptParams[1];
|
||||
float x2 = *(float*)&ScriptParams[2];
|
||||
float y2 = *(float*)&ScriptParams[3];
|
||||
float x1 = GET_FLOAT_PARAM(0);
|
||||
float y1 = GET_FLOAT_PARAM(1);
|
||||
float x2 = GET_FLOAT_PARAM(2);
|
||||
float y2 = GET_FLOAT_PARAM(3);
|
||||
int i = CPools::GetPedPool()->GetSize();
|
||||
while (--i && ped_handle == -1) {
|
||||
CPed* pPed = CPools::GetPedPool()->GetSlot(i);
|
||||
@@ -267,7 +267,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
continue;
|
||||
if (pPed->m_attractor)
|
||||
continue;
|
||||
if (!ThisIsAValidRandomPed(pPed->m_nPedType, ScriptParams[4], ScriptParams[5], ScriptParams[6]))
|
||||
if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6)))
|
||||
continue;
|
||||
if (pPed->bIsLeader || pPed->m_leader)
|
||||
continue;
|
||||
@@ -285,7 +285,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
ScriptParams[0] = ped_handle;
|
||||
SET_INTEGER_PARAM(0, ped_handle);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
@@ -294,10 +294,10 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
float infX = *(float*)&ScriptParams[0];
|
||||
float infY = *(float*)&ScriptParams[1];
|
||||
float supX = *(float*)&ScriptParams[2];
|
||||
float supY = *(float*)&ScriptParams[3];
|
||||
float infX = GET_FLOAT_PARAM(0);
|
||||
float infY = GET_FLOAT_PARAM(1);
|
||||
float supX = GET_FLOAT_PARAM(2);
|
||||
float supY = GET_FLOAT_PARAM(3);
|
||||
while (i--) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle)
|
||||
@@ -309,22 +309,23 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
}
|
||||
case COMMAND_SET_GANG_ATTACK_PLAYER_WITH_COPS:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CGangs::SetWillAttackPlayerWithCops((ePedType)((int)PEDTYPE_GANG1 + ScriptParams[0]), !!ScriptParams[1]);
|
||||
CGangs::SetWillAttackPlayerWithCops((ePedType)((int)PEDTYPE_GANG1 + GET_INTEGER_PARAM(0)), !!GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_SET_CHAR_FRIGHTENED_IN_JACKED_CAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->bHeldHostageInCar = ScriptParams[1];
|
||||
pPed->bHeldHostageInCar = GET_INTEGER_PARAM(1);
|
||||
pPed->b1A4_2 = GET_INTEGER_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_VEHICLE_TO_FADE_IN:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), ScriptParams[1]);
|
||||
CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_ODDJOB_MISSION_PASSED:
|
||||
@@ -336,7 +337,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_IS_PLAYER_IN_SHORTCUT_TAXI:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed;
|
||||
CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed;
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle && pPed->m_pMyVehicle == CGameLogic::pShortCutTaxi);
|
||||
return 0;
|
||||
@@ -344,7 +345,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_IS_CHAR_DUCKING:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(RpAnimBlendClumpGetAssociation(pPed->GetClump(), ANIM_STD_DUCK_DOWN) != nil);
|
||||
return 0;
|
||||
@@ -352,24 +353,24 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_CREATE_DUST_EFFECT_FOR_CUTSCENE_HELI:
|
||||
{
|
||||
CollectParameters(&m_nIp, 3);
|
||||
CObject* pHeli = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CObject* pHeli = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
bool found = false;
|
||||
float waterLevel = -1000.0f;
|
||||
CVector pos = pHeli->GetPosition();
|
||||
float radius = *(float*)&ScriptParams[1];
|
||||
float radius = GET_FLOAT_PARAM(1);
|
||||
float ground = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &found);
|
||||
if (!CWaterLevel::GetWaterLevel(pos.x, pos.y, pos.z, &waterLevel, false))
|
||||
waterLevel = 0.0f;
|
||||
if (waterLevel > ground)
|
||||
ground = waterLevel;
|
||||
if (ScriptParams[2] > 8)
|
||||
ScriptParams[2] = 8;
|
||||
CVehicle::HeliDustGenerate(pHeli, (pos.z - ground - 1.0f - radius) * 0.3 + radius, ground, ScriptParams[2]);
|
||||
if (GET_INTEGER_PARAM(2) > 8)
|
||||
SET_INTEGER_PARAM(2, 8);
|
||||
CVehicle::HeliDustGenerate(pHeli, (pos.z - ground - 1.0f - radius) * 0.3 + radius, ground, GET_INTEGER_PARAM(2));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_FIRE_LEVEL:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::RegisterLevelFireMission(ScriptParams[0]);
|
||||
CStats::RegisterLevelFireMission(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_IS_AUSTRALIAN_GAME:
|
||||
UpdateCompareFlag(false); // should we make some check?
|
||||
@@ -377,14 +378,23 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
case COMMAND_DISARM_CAR_BOMB:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||
if (pVehicle->m_bombType != CARBOMB_NONE) {
|
||||
pVehicle->m_bombType = CARBOMB_NONE;
|
||||
pVehicle->m_pBombRigger = nil;
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
if (pVehicle->IsCar()) {
|
||||
if (((CAutomobile*)pVehicle)->m_bombType != CARBOMB_NONE) {
|
||||
((CAutomobile*)pVehicle)->m_bombType = CARBOMB_NONE;
|
||||
((CAutomobile*)pVehicle)->m_pBombRigger = nil;
|
||||
}
|
||||
}
|
||||
#ifdef FIX_BUGS
|
||||
else if (pVehicle->IsBike()) {
|
||||
if (((CBike*)pVehicle)->m_bombType != CARBOMB_NONE) {
|
||||
((CBike*)pVehicle)->m_bombType = CARBOMB_NONE;
|
||||
((CBike*)pVehicle)->m_pBombRigger = nil;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT)
|
||||
case COMMAND_IS_JAPANESE_GAME:
|
||||
#ifdef MORE_LANGUAGES
|
||||
UpdateCompareFlag(FrontEndMenuManager.m_PrefsLanguage == CMenuManager::LANGUAGE_JAPANESE);
|
||||
@@ -394,223 +404,404 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
UpdateCompareFlag(false);
|
||||
#endif
|
||||
return 0;
|
||||
#elif (!defined GTA_PS2)
|
||||
case COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED:
|
||||
{
|
||||
script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR);
|
||||
uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CUserDisplay::OnscnTimer.SetCounterFlashWhenFirstDisplayed(var, ScriptParams[0]);
|
||||
case COMMAND_1442:
|
||||
CollectParameters(&m_nIp, 4);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
case COMMAND_SHUFFLE_CARD_DECKS:
|
||||
//case COMMAND_1443:
|
||||
case COMMAND_GET_DISTANCE_BETWEEN_2D_POINTS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
script_assert(ScriptParams[0] >= 0 && ScriptParams[0] <= 6);
|
||||
for (int i = 0; i < CARDS_IN_STACK; i++)
|
||||
CTheScripts::CardStack[i] = 0;
|
||||
int16 seq[CARDS_IN_STACK];
|
||||
for (int i = 0; i < MAX_DECKS * CARDS_IN_DECK; i++)
|
||||
seq[i] = i;
|
||||
int cards_left = CARDS_IN_DECK * ScriptParams[0];
|
||||
for (int k = 1; k < CARDS_IN_DECK + 1; k++) {
|
||||
for (int deck = 0; deck < ScriptParams[0]; deck++) {
|
||||
int index = CGeneral::GetRandomNumberInRange(0, cards_left);
|
||||
CTheScripts::CardStack[seq[index]] = k;
|
||||
for (int l = index; l < cards_left; l++) {
|
||||
if (l + 1 < CARDS_IN_STACK)
|
||||
seq[l] = seq[l + 1];
|
||||
else
|
||||
seq[l] = 0;
|
||||
}
|
||||
--cards_left;
|
||||
}
|
||||
}
|
||||
CTheScripts::CardStackPosition = 0;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_FETCH_NEXT_CARD:
|
||||
{
|
||||
if (CTheScripts::CardStack[CTheScripts::CardStackPosition] == 0)
|
||||
CTheScripts::CardStackPosition = 0;
|
||||
ScriptParams[0] = CTheScripts::CardStack[CTheScripts::CardStackPosition++];
|
||||
if (CTheScripts::CardStackPosition == CARDS_IN_DECK * MAX_DECKS)
|
||||
CTheScripts::CardStackPosition = 0;
|
||||
CollectParameters(&m_nIp, 4);
|
||||
float X1 = GET_FLOAT_PARAM(0);
|
||||
float Y1 = GET_FLOAT_PARAM(1);
|
||||
float X2 = GET_FLOAT_PARAM(2);
|
||||
float Y2 = GET_FLOAT_PARAM(3);
|
||||
float fDistance = Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
|
||||
SET_FLOAT_PARAM(0, fDistance);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_OBJECT_VELOCITY:
|
||||
case COMMAND_GET_DISTANCE_BETWEEN_3D_POINTS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
*(CVector*)&ScriptParams[0] = GAME_SPEED_TO_METERS_PER_SECOND * pObject->GetMoveSpeed();
|
||||
StoreParameters(&m_nIp, 3);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_DEBUG_CAMERA_ON:
|
||||
UpdateCompareFlag(TheCamera.WorldViewerBeingUsed);
|
||||
return 0;
|
||||
case COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CVector newSpeed = pObject->GetTurnSpeed() + *(CVector*)&ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
if (pObject->bIsStatic) {
|
||||
pObject->SetIsStatic(false);
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_OBJECT_ROTATION_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CVector newSpeed = *(CVector*)&ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
if (pObject->bIsStatic) {
|
||||
pObject->SetIsStatic(false);
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_OBJECT_STATIC:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
UpdateCompareFlag(pObject->GetIsStatic());
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CVector2D v1 = *(CVector2D*)&ScriptParams[0];
|
||||
CVector2D v2 = *(CVector2D*)&ScriptParams[2];
|
||||
float c = DotProduct2D(v1, v2) / (v1.Magnitude() * v2.Magnitude());
|
||||
#ifdef FIX_BUGS // command is a SA leftover where it was fixed to this
|
||||
*(float*)&ScriptParams[0] = RADTODEG(Acos(c));
|
||||
#else
|
||||
*(float*)&ScriptParams[0] = Acos(c);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_DO_2D_RECTANGLES_COLLIDE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 8);
|
||||
float infX1 = *(float*)&ScriptParams[0] - *(float*)&ScriptParams[2] * 0.5; // NB: not float
|
||||
float supX1 = *(float*)&ScriptParams[0] + *(float*)&ScriptParams[2] * 0.5;
|
||||
float infX2 = *(float*)&ScriptParams[4] - *(float*)&ScriptParams[6] * 0.5;
|
||||
float supX2 = *(float*)&ScriptParams[4] + *(float*)&ScriptParams[6] * 0.5;
|
||||
float infY1 = *(float*)&ScriptParams[1] - *(float*)&ScriptParams[3] * 0.5;
|
||||
float supY1 = *(float*)&ScriptParams[1] + *(float*)&ScriptParams[3] * 0.5;
|
||||
float infY2 = *(float*)&ScriptParams[5] - *(float*)&ScriptParams[7] * 0.5;
|
||||
float supY2 = *(float*)&ScriptParams[5] + *(float*)&ScriptParams[7] * 0.5;
|
||||
bool collide = true;
|
||||
if (infY2 > supY1)
|
||||
collide = false;
|
||||
if (infY1 > supY2)
|
||||
collide = false;
|
||||
if (infX2 > supX1)
|
||||
collide = false;
|
||||
if (infX1 > supX2)
|
||||
collide = false;
|
||||
UpdateCompareFlag(collide);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_OBJECT_ROTATION_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
*(CVector*)&ScriptParams[0] = pObject->GetTurnSpeed() * GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
StoreParameters(&m_nIp, 3);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
CVector vecAddition = *(CVector*)&ScriptParams[1] * CTimer::GetTimeStep() / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
if (!pObject->bIsStatic) {
|
||||
CVector vecCurrSpeed = pObject->GetSpeed();
|
||||
vecCurrSpeed.Normalise();
|
||||
if (vecCurrSpeed.z != 1.0) { // NB: not float!
|
||||
CVector vx = CrossProduct(vecCurrSpeed, CVector(0.0f, 0.0f, 1.0f));
|
||||
vx.Normalise();
|
||||
CVector vz = CrossProduct(vx, vecCurrSpeed);
|
||||
vz.Normalise();
|
||||
CVector vecNewSpeed = pObject->GetSpeed() + vecAddition.x * vx + vecAddition.y * vecCurrSpeed + vecAddition.z * vecCurrSpeed;
|
||||
if (pObject->bIsStatic) {
|
||||
pObject->SetIsStatic(false);
|
||||
pObject->AddToMovingList();
|
||||
}
|
||||
pObject->SetMoveSpeed(vecNewSpeed);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_OBJECT_SPEED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
|
||||
*(float*)&ScriptParams[0] = pObject->GetMoveSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
CollectParameters(&m_nIp, 6);
|
||||
float X1 = GET_FLOAT_PARAM(0);
|
||||
float Y1 = GET_FLOAT_PARAM(1);
|
||||
float Z1 = GET_FLOAT_PARAM(2);
|
||||
float X2 = GET_FLOAT_PARAM(3);
|
||||
float Y2 = GET_FLOAT_PARAM(4);
|
||||
float Z2 = GET_FLOAT_PARAM(5);
|
||||
float fDistance = Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2) + (Z1 - Z2) * (Z1 - Z2));
|
||||
SET_FLOAT_PARAM(0, fDistance);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#if (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
case COMMAND_IS_MISSION_SKIP:
|
||||
#ifdef MISSION_REPLAY
|
||||
ScriptParams[0] = MissionSkipLevel;
|
||||
#else
|
||||
ScriptParams[0] = 0;
|
||||
#endif
|
||||
case COMMAND_DOT_PRODUCT_2D:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
float X1 = GET_FLOAT_PARAM(0);
|
||||
float Y1 = GET_FLOAT_PARAM(1);
|
||||
float X2 = GET_FLOAT_PARAM(2);
|
||||
float Y2 = GET_FLOAT_PARAM(3);
|
||||
float fDistance = X1 * X2 + Y1 * Y2;
|
||||
SET_FLOAT_PARAM(0, fDistance);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_SET_IN_AMMUNATION:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
#ifdef MISSION_REPLAY
|
||||
IsInAmmunation = ScriptParams[0];
|
||||
#endif
|
||||
}
|
||||
case COMMAND_DOT_PRODUCT_3D:
|
||||
{
|
||||
CollectParameters(&m_nIp, 6);
|
||||
float X1 = GET_FLOAT_PARAM(0);
|
||||
float Y1 = GET_FLOAT_PARAM(1);
|
||||
float Z1 = GET_FLOAT_PARAM(2);
|
||||
float X2 = GET_FLOAT_PARAM(3);
|
||||
float Y2 = GET_FLOAT_PARAM(4);
|
||||
float Z2 = GET_FLOAT_PARAM(5);
|
||||
float fDistance = X1 * X2 + Y1 * Y2 + Z1 * Z2;
|
||||
SET_FLOAT_PARAM(0, fDistance);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_DO_SAVE_GAME:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
UsingMobileScript = true;
|
||||
#endif
|
||||
#ifdef MISSION_REPLAY
|
||||
SaveGameForPause(ScriptParams[0]);
|
||||
#endif
|
||||
}
|
||||
case COMMAND_DEBUG_PRINT_WITH_1_FLOAT:
|
||||
return 0;
|
||||
case COMMAND_IS_RETRY:
|
||||
#ifdef MISSION_REPLAY
|
||||
if (strcmp(m_abScriptName, "porno4") != 0)
|
||||
ScriptParams[0] = AllowMissionReplay;
|
||||
#ifdef FIX_BUGS
|
||||
case COMMAND_DEBUG_PRINT_WITH_2_FLOATS:
|
||||
return 0;
|
||||
case COMMAND_DEBUG_PRINT_WITH_3_FLOATS:
|
||||
return 0;
|
||||
case COMMAND_GET_PAD_BUTTON_STATE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
switch (GET_INTEGER_PARAM(0)) {
|
||||
case 0: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetOddJobTrigger()); break;
|
||||
case 1: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetBrake()); break;
|
||||
case 2: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSteeringLeftRight()); break;
|
||||
case 3: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSteeringUpDown()); break;
|
||||
case 4: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetCarGunLeftRight()); break;
|
||||
case 5: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetCarGunUpDown()); break;
|
||||
case 6: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetPedWalkLeftRight()); break;
|
||||
case 7: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetPedWalkUpDown()); break;
|
||||
case 8: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookLeft()); break;
|
||||
case 9: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookRight()); break;
|
||||
case 10: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookBehindForCar()); break;
|
||||
case 11: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetLookBehindForPed()); break;
|
||||
case 12: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetHorn()); break;
|
||||
case 13: SET_INTEGER_PARAM(0, CPad::GetPad(0)->HornJustDown()); break;
|
||||
case 14: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetCarGunFired()); break;
|
||||
case 15: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CarGunJustDown()); break;
|
||||
case 16: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetHandBrake()); break;
|
||||
case 17: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetBrake()); break;
|
||||
case 18: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetExitVehicle()); break;
|
||||
case 19: SET_INTEGER_PARAM(0, CPad::GetPad(0)->ExitVehicleJustDown()); break;
|
||||
case 20: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetWeapon()); break;
|
||||
case 21: SET_INTEGER_PARAM(0, CPad::GetPad(0)->WeaponJustDown()); break;
|
||||
case 22: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetAccelerate()); break;
|
||||
case 23: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CycleCameraModeUpJustDown()); break;
|
||||
case 24: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CycleWeaponLeftJustDown()); break;
|
||||
case 25: SET_INTEGER_PARAM(0, CPad::GetPad(0)->CycleWeaponRightJustDown()); break;
|
||||
case 26: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetTarget()); break;
|
||||
case 27: SET_INTEGER_PARAM(0, CPad::GetPad(0)->TargetJustDown()); break;
|
||||
case 28: SET_INTEGER_PARAM(0, CPad::GetPad(0)->JumpJustDown()); break;
|
||||
case 29: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSprint()); break;
|
||||
case 30: SET_INTEGER_PARAM(0, CPad::GetPad(0)->ShiftTargetLeftJustDown()); break;
|
||||
case 31: SET_INTEGER_PARAM(0, CPad::GetPad(0)->ForceCameraBehindPlayer()); break;
|
||||
case 32: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperZoomIn()); break;
|
||||
case 33: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperZoomOut()); break;
|
||||
case 34: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperModeLookLeftRight()); break;
|
||||
case 35: SET_INTEGER_PARAM(0, CPad::GetPad(0)->SniperModeLookUpDown()); break;
|
||||
case 36: SET_INTEGER_PARAM(0, CPad::GetPad(0)->LookAroundLeftRight()); break;
|
||||
case 37: SET_INTEGER_PARAM(0, CPad::GetPad(0)->LookAroundUpDown()); break;
|
||||
case 38: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiLeft()); break;
|
||||
case 39: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiRight()); break;
|
||||
case 40: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiUp()); break;
|
||||
case 41: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiDown()); break;
|
||||
case 42: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiSelect()); break;
|
||||
case 43: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GuiBack()); break;
|
||||
case 44: SET_INTEGER_PARAM(0, CPad::GetPad(0)->GetSkipCutscene()); if (GET_INTEGER_PARAM(0)) TheCamera.m_bIgnoreFadingStuffForMusic = false; break; // spectacular hack
|
||||
}
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_NAVIGATION_ARROW:
|
||||
{
|
||||
CollectParameters(&m_nIp, 3);
|
||||
// cNavArrow::SetTarget(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(0)); // TODO, although it's unused
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CLEAR_NAVIGATION_ARROW:
|
||||
{
|
||||
// cNavArrow::ClearTarget(); // TODO, although it's unused
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CALL:
|
||||
case COMMAND_CALLNOT:
|
||||
{
|
||||
m_anStack[m_nStackPointer++] = m_nIp | BIT(STACKVALUE_IS_FUNCTION_CALL_BIT) | ((command == COMMAND_CALLNOT) ? BIT(STACKVALUE_INVERT_RETURN_BIT) : 0);
|
||||
uint8 nInputParams = CTheScripts::Read1ByteFromScript(&m_nIp);
|
||||
uint8 nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp);
|
||||
uint8 nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp);
|
||||
uint32 nIPBeforeParameters = m_nIp;
|
||||
CollectParameters(&m_nIp, 1);
|
||||
if (nInputParams)
|
||||
CollectParameters(&m_nIp, nInputParams, &m_anLocalVariables[m_nLocalsPointer + nLocalsOffset]);
|
||||
m_nLocalsPointer += nLocalsOffset;
|
||||
m_anStack[m_nStackPointer - 1] |= (m_nIp - nIPBeforeParameters) << STACKVALUE_IP_PARAMS_OFFSET;
|
||||
if (GET_INTEGER_PARAM(0) < 0)
|
||||
m_nIp = CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0);
|
||||
else
|
||||
ScriptParams[0] = gbTryingPorn4Again;
|
||||
#else
|
||||
else if (gbTryingPorn4Again)
|
||||
ScriptParams[0] = 1;
|
||||
#endif
|
||||
#else
|
||||
ScriptParams[0] = 0;
|
||||
m_nIp = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_CAR_AUTOMOBILE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_FIRST_VEHICLE && pVehicle->GetModelIndex() < MI_FERRY);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_CAR_BIKE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_ANGEL && pVehicle->GetModelIndex() <= MI_SANCHEZ);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
case COMMAND_IS_CAR_PLANE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_AIRTRAIN && pVehicle->GetModelIndex() <= MI_DEADDODO);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_CAR_HELI:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
UpdateCompareFlag(pVehicle->GetModelIndex() >= MI_ESCAPE && pVehicle->GetModelIndex() <= MI_CHOPPER);
|
||||
return 0;
|
||||
}
|
||||
#ifdef FIX_BUGS
|
||||
case COMMAND_1476: // they DO have it in script
|
||||
return 0;
|
||||
#endif
|
||||
case COMMAND_RETURN_IF_TRUE:
|
||||
if (m_bCondResult) {
|
||||
ReturnFromGosubOrFunction();
|
||||
}
|
||||
return 0;
|
||||
case COMMAND_RETURN_TRUE_IF_TRUE:
|
||||
if (m_bCondResult) {
|
||||
UpdateCompareFlag(false);
|
||||
ReturnFromGosubOrFunction();
|
||||
}
|
||||
return 0;
|
||||
case COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_BEHIND:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->bOnlyAllowedToSitBehind = GET_INTEGER_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_RC_HELI_HEIGHT_LIMIT:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle::rcHeliHeightLimit = GET_FLOAT_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_CREATE_SCRIPT_CORONA:
|
||||
{
|
||||
CollectParameters(&m_nIp, 9);
|
||||
base::cSList<script_corona>::tSItem* pCorona = new base::cSList<script_corona>::tSItem();
|
||||
pCorona->item.x = GET_FLOAT_PARAM(0);
|
||||
pCorona->item.y = GET_FLOAT_PARAM(1);
|
||||
pCorona->item.z = GET_FLOAT_PARAM(2);
|
||||
pCorona->item.id = CTheScripts::NextScriptCoronaID++;
|
||||
if (pCorona->item.z <= MAP_Z_LOW_LIMIT)
|
||||
pCorona->item.z = CWorld::FindGroundZForCoord(pCorona->item.x, pCorona->item.y);
|
||||
pCorona->item.size = GET_FLOAT_PARAM(3);
|
||||
pCorona->item.r = GET_INTEGER_PARAM(6);
|
||||
pCorona->item.g = GET_INTEGER_PARAM(7);
|
||||
pCorona->item.b = GET_INTEGER_PARAM(8);
|
||||
pCorona->item.type = GET_INTEGER_PARAM(4);
|
||||
pCorona->item.flareType = GET_INTEGER_PARAM(5);
|
||||
SET_INTEGER_PARAM(0, pCorona->item.id);
|
||||
CTheScripts::mCoronas.Insert(pCorona);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_DUMMY:
|
||||
}
|
||||
case COMMAND_REMOVE_SCRIPT_CORONA:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
for (base::cSList<script_corona>::tSItem* i = CTheScripts::mCoronas.first; i; i = i->next) {
|
||||
if (i->item.id == GET_INTEGER_PARAM(0)) {
|
||||
CTheScripts::mCoronas.Remove(i);
|
||||
delete i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_BOAT_IN_WATER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CBoat* pVehicle = (CBoat*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle && pVehicle->IsBoat());
|
||||
UpdateCompareFlag(pVehicle->bBoatInWater);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_CAR_DRIVER_BEING_JACKED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
UpdateCompareFlag(pVehicle->bIsBeingCarJacked);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_IN_FRONT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->bOnlyAllowedToSitInFront = GET_INTEGER_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CAR_TILTED_BY_CHAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1));
|
||||
script_assert(pVehicle);
|
||||
pVehicle->ApplyTurnForce(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(-0.8f, -1.2f)* pPed->m_fMass,
|
||||
pPed->GetPosition().x - pVehicle->GetPosition().x, pPed->GetPosition().y - pVehicle->GetPosition().y, 0.0f);
|
||||
DMAudio.PlayOneShot(pVehicle->m_audioEntityId, SOUND_CAR_JERK, 0.0f);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_WEAPON_TYPE_FOR_PICKUP_IN_AREA:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
float X = GET_FLOAT_PARAM(0);
|
||||
float Y = GET_FLOAT_PARAM(1);
|
||||
float Z = GET_FLOAT_PARAM(2);
|
||||
float radius = GET_FLOAT_PARAM(3);
|
||||
int model = -1;
|
||||
bool found = false;
|
||||
for (uint32 i = 0; i < NUMPICKUPS; i++) {
|
||||
CPickup* pPickup = &CPickups::aPickUps[i];
|
||||
if (pPickup->m_eType != PICKUP_NONE) {
|
||||
CVector fDist = pPickup->m_vecPos - CVector(X, Y, Z);
|
||||
#ifndef FIX_BUGS // this breaks ALL pickups!
|
||||
pPickup->m_eModelIndex = 4;
|
||||
#endif
|
||||
#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
// it is unknown what these commands do but they don't take parameters
|
||||
case COMMAND_MARK_CUTSCENE_START:
|
||||
if (fDist.Magnitude() < radius && pPickup->m_pObject) {
|
||||
found = true;
|
||||
model = CPickups::WeaponForModel(pPickup->m_pObject->GetModelIndex());
|
||||
}
|
||||
}
|
||||
}
|
||||
SET_INTEGER_PARAM(0, model);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
}
|
||||
case COMMAND_IS_PLAYER_USING_FIRST_PERSON_WEAPON_CAMERA:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
UpdateCompareFlag(TheCamera.Using1stPersonWeaponMode());
|
||||
return 0;
|
||||
case COMMAND_MARK_CUTSCENE_END:
|
||||
//case COMMAND_1489:
|
||||
//case COMMAND_1490:
|
||||
//case COMMAND_1491:
|
||||
case COMMAND_SET_DEBUG_MENU_ACTIVE:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// this sets two values on PS2 and PSP, but not on mobile - TODO?
|
||||
return 0;
|
||||
case COMMAND_CUTSCENE_SCROLL:
|
||||
case COMMAND_SET_DRAW_HUD:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CHud::m_Wants_To_Draw_Hud = (GET_INTEGER_PARAM(0) != 0);
|
||||
return 0;
|
||||
case COMMAND_GET_RANDOM_CHAR_IN_AREA_NO_CHECKS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
int ped_handle = -1;
|
||||
CVector pos = FindPlayerCoors();
|
||||
float x1 = GET_FLOAT_PARAM(0);
|
||||
float y1 = GET_FLOAT_PARAM(1);
|
||||
float x2 = GET_FLOAT_PARAM(2);
|
||||
float y2 = GET_FLOAT_PARAM(3);
|
||||
int i = CPools::GetPedPool()->GetSize();
|
||||
while (--i && ped_handle == -1) {
|
||||
CPed* pPed = CPools::GetPedPool()->GetSlot(i);
|
||||
if (!pPed)
|
||||
continue;
|
||||
if (pPed->bRemoveFromWorld)
|
||||
continue;
|
||||
if (pPed->bFadeOut)
|
||||
continue;
|
||||
if (pPed->m_nWaitState != WAITSTATE_FALSE)
|
||||
continue;
|
||||
if (!pPed->IsWithinArea(x1, y1, x2, y2))
|
||||
continue;
|
||||
if (pos.z - PED_FIND_Z_OFFSET > pPed->GetPosition().z)
|
||||
continue;
|
||||
if (pos.z + PED_FIND_Z_OFFSET < pPed->GetPosition().z)
|
||||
continue;
|
||||
ped_handle = CPools::GetPedPool()->GetIndex(pPed);
|
||||
CTheScripts::LastRandomPedId = ped_handle;
|
||||
pPed->CharCreatedBy = MISSION_CHAR;
|
||||
pPed->bRespondsToThreats = false;
|
||||
++CPopulation::ms_nTotalMissionPeds;
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR);
|
||||
}
|
||||
SET_INTEGER_PARAM(0, ped_handle);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_RANDOM_CAR_IN_AREA_NO_CHECKS_NO_SAVE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
int handle = -1;
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
float infX = GET_FLOAT_PARAM(0);
|
||||
float infY = GET_FLOAT_PARAM(1);
|
||||
float supX = GET_FLOAT_PARAM(2);
|
||||
float supY = GET_FLOAT_PARAM(3);
|
||||
while (i-- && handle == -1) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle)
|
||||
continue;
|
||||
if (!pVehicle->IsWithinArea(infX, infY, supX, supY))
|
||||
continue;
|
||||
handle = CPools::GetVehiclePool()->GetIndex(pVehicle);
|
||||
}
|
||||
SET_INTEGER_PARAM(0, handle);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_STORE_CAR_COLLIDED_WITH_NO_SAVE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
if (!pVehicle)
|
||||
printf("STORE_CAR_COLLIDED_WITH_NO_SAVE - Car doesn\'t exist\n");
|
||||
else {
|
||||
if (pVehicle->m_pLastDamageEntity == nil)
|
||||
SET_INTEGER_PARAM(0, -1);
|
||||
else {
|
||||
// what they are doing is not very safe as m_pLastDamageEntity doesn't have to be CVehicle
|
||||
#ifdef FIX_BUGS
|
||||
if (!pVehicle->m_pLastDamageEntity->IsVehicle()) {
|
||||
SET_INTEGER_PARAM(0, -1);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
SET_INTEGER_PARAM(0, CPools::GetVehiclePool()->GetIndex((CVehicle*)pVehicle->m_pLastDamageEntity));
|
||||
pVehicle->m_pLastDamageEntity = nil;
|
||||
}
|
||||
}
|
||||
}
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
script_assert(0);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,781 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "Script.h"
|
||||
#include "ScriptCommands.h"
|
||||
|
||||
#include "Bridge.h"
|
||||
#include "CarCtrl.h"
|
||||
#include "Camera.h"
|
||||
#include "CutsceneMgr.h"
|
||||
#include "Ferry.h"
|
||||
#include "Garages.h"
|
||||
#include "GameLogic.h"
|
||||
#include "Hud.h"
|
||||
#include "Messages.h"
|
||||
#include "Object.h"
|
||||
#include "OnscreenTimer.h"
|
||||
#include "Pad.h"
|
||||
#include "Ped.h"
|
||||
#include "Pools.h"
|
||||
#include "Remote.h"
|
||||
#include "SpecialFX.h"
|
||||
#include "Stats.h"
|
||||
#include "Vehicle.h"
|
||||
#include "World.h"
|
||||
|
||||
// LCS: file done except TODOs (also check commented out strings)
|
||||
|
||||
int8 CRunningScript::ProcessCommands1500To1599(int32 command)
|
||||
{
|
||||
switch (command) {
|
||||
case COMMAND_DISABLE_FERRY_PATH:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry::DissableFerryPath(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ENABLE_FERRY_PATH:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry::EnableFerryPath(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_CLOSEST_DOCKED_FERRY:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CFerry* pFerry = CFerry::GetClosestFerry(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1));
|
||||
int id = -1;
|
||||
if (pFerry && pFerry->IsDocked())
|
||||
id = pFerry->m_nFerryId;
|
||||
SET_INTEGER_PARAM(0, id);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_OPEN_FERRY_DOOR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
pFerry->OpenDoor();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CLOSE_FERRY_DOOR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
pFerry->CloseDoor();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_FERRY_DOOR_OPEN:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
UpdateCompareFlag(pFerry->IsDoorOpen());
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_FERRY_DOOR_CLOSED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
UpdateCompareFlag(pFerry->IsDoorClosed());
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SKIP_FERRY_TO_NEXT_DOCK:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
pFerry->SkipFerryToNextDock();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_DROPS_WEAPONS_ON_DEATH:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->bDropsWeaponsOnDeath = (GET_INTEGER_PARAM(1) != 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_CHAR_CROUCHING:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
UpdateCompareFlag(pPed->bIsDucking);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_FERRY_BOARDING_SPACE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
CVector space = pFerry->GetBoardingSpace((CFerry::eSpaceUse)GET_INTEGER_PARAM(1), (CFerry::eSpaceStyle)GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3));
|
||||
SET_FLOAT_PARAM(0, space.x);
|
||||
SET_FLOAT_PARAM(1, space.y);
|
||||
StoreParameters(&m_nIp, 2);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_FERRY_HEADING:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
float fHeading = Atan2(-pFerry->GetForward().x, pFerry->GetForward().y);
|
||||
SET_FLOAT_PARAM(0, fHeading);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_FERRIES_DISABLED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CFerry::SetFerriesDisabled(GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_COMPLETE_FERRY_DOOR_MOVEMENT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry* pFerry = CFerry::GetFerry(GET_INTEGER_PARAM(0));
|
||||
script_assert(pFerry);
|
||||
pFerry->CompleteDorrMovement();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_OVERRIDE_CAR_REMOTE_CONTROL:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
pVehicle->SetStatus(STATUS_PLAYER_REMOTE);
|
||||
CVehicle::bDisableRemoteDetonation = true;
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = pVehicle;
|
||||
pVehicle->RegisterReference((CEntity**)&CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle);
|
||||
if (pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI || pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) {
|
||||
TheCamera.TakeControl(pVehicle, CCam::MODE_CAM_ON_A_STRING, GET_INTEGER_PARAM(1) ? INTERPOLATION : JUMP_CUT, CAMCONTROL_SCRIPT);
|
||||
TheCamera.SetZoomValueCamStringScript(0);
|
||||
}
|
||||
else {
|
||||
TheCamera.TakeControl(pVehicle, CCam::MODE_1STPERSON, GET_INTEGER_PARAM(1) ? INTERPOLATION : JUMP_CUT, CAMCONTROL_SCRIPT);
|
||||
script_assert(pVehicle->IsCar());
|
||||
((CAutomobile*)pVehicle)->Damage.m_bSmashedDoorDoesntClose = true;
|
||||
}
|
||||
if (m_bIsMissionScript)
|
||||
CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR);
|
||||
if (FindPlayerVehicle())
|
||||
FindPlayerVehicle()->bCanBeDamaged = false;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CANCEL_REMOTE_MODE:
|
||||
{
|
||||
if (FindPlayerVehicle())
|
||||
FindPlayerVehicle()->bCanBeDamaged = true;
|
||||
CRemote::TakeRemoteControlledCarFromPlayer(false);
|
||||
CWorld::Players[CWorld::PlayerInFocus].field_D6 = false;
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = nil;
|
||||
TheCamera.Restore();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_CAR_SOLD:
|
||||
// CStats::CarsSold++;
|
||||
return 0;
|
||||
case COMMAND_ADD_MONEY_MADE_WITH_CAR_SALES:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::MoneyMadeWithCarSales += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_SET_BRIDGE_STATE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
#ifdef GTA_BRIDGE
|
||||
/*
|
||||
* 0 = locked
|
||||
* 1 = unlocked
|
||||
* 2 = operational
|
||||
*/
|
||||
switch (GET_INTEGER_PARAM(0)) {
|
||||
case 0: CBridge::ForceBridgeState(STATE_BRIDGE_LOCKED); break;
|
||||
case 1: CBridge::ForceBridgeState(STATE_BRIDGE_ALWAYS_UNLOCKED); break;
|
||||
case 2:
|
||||
if (CBridge::State == STATE_LIFT_PART_IS_DOWN || CBridge::State == STATE_BRIDGE_ALWAYS_UNLOCKED)
|
||||
CBridge::ForceBridgeState(STATE_LIFT_PART_ABOUT_TO_MOVE_UP);
|
||||
else
|
||||
CBridge::ForceBridgeState(STATE_LIFT_PART_MOVING_DOWN);
|
||||
break;
|
||||
default: script_assert(false);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_OBJECT_TURN_SPEED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
CVector vSpeed = GET_VECTOR_PARAM(1) / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
pObject->SetTurnSpeed(vSpeed.x, vSpeed.y, vSpeed.z);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_OBJECT_MASS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
pObject->m_fMass = GET_FLOAT_PARAM(1);
|
||||
pObject->m_fTurnMass = GET_FLOAT_PARAM(2);
|
||||
pObject->m_fAirResistance = GET_FLOAT_PARAM(3);
|
||||
if (pObject->m_fMass < 99998.0f) {
|
||||
pObject->bInfiniteMass = false;
|
||||
pObject->m_phy_flagA08 = false;
|
||||
pObject->bAffectedByGravity = true;
|
||||
}
|
||||
else {
|
||||
pObject->bInfiniteMass = true;
|
||||
pObject->m_phy_flagA08 = true;
|
||||
pObject->bAffectedByGravity = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_HAS_CUTSCENE_LOADED:
|
||||
UpdateCompareFlag(CCutsceneMgr::ms_cutsceneLoadStatus == CUTSCENE_LOADED);
|
||||
return 0;
|
||||
case COMMAND_SET_UNIQUE_JUMPS_FOUND:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::NumberOfUniqueJumpsFound = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_SET_HIDDEN_PACKAGES_COLLECTED:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_BIKE_SOLD:
|
||||
// CStats::BikesSold++;
|
||||
return 0;
|
||||
case COMMAND_ADD_MONEY_MADE_WITH_BIKE_SALES:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::MoneyMadeWithBikeSales += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_PACKAGE_SMUGGLED:
|
||||
// CStats::PackagesSmuggled++;
|
||||
return 0;
|
||||
case COMMAND_REGISTER_SMUGGLER_WASTED:
|
||||
// CStats::SmugglersWasted++;
|
||||
return 0;
|
||||
case COMMAND_REGISTER_FASTEST_SMUGGLING_TIME:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::RegisterFastestSmugglingTime(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_SET_CHAR_DIVE_FROM_CAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1));
|
||||
script_assert(pPed);
|
||||
pPed->bRespondsToThreats = true;
|
||||
pPed->SetEvasiveDive(pVehicle, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_WRECK_CAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CAutomobile* pVehicle = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
script_assert(pVehicle->IsCar());
|
||||
pVehicle->m_fHealth = 0.0f;
|
||||
pVehicle->SetStatus(STATUS_WRECKED);
|
||||
pVehicle->bRenderScorched = true;
|
||||
pVehicle->Damage.FuckCarCompletely();
|
||||
if (pVehicle->GetModelIndex() != MI_RCBANDIT) {
|
||||
pVehicle->SetBumperDamage(CAR_BUMP_FRONT, VEHBUMPER_FRONT);
|
||||
pVehicle->SetBumperDamage(CAR_BUMP_REAR, VEHBUMPER_REAR);
|
||||
pVehicle->SetDoorDamage(CAR_BONNET, DOOR_BONNET);
|
||||
pVehicle->SetDoorDamage(CAR_BOOT, DOOR_BOOT);
|
||||
pVehicle->SetDoorDamage(CAR_DOOR_LF, DOOR_FRONT_LEFT);
|
||||
pVehicle->SetDoorDamage(CAR_DOOR_RF, DOOR_FRONT_RIGHT);
|
||||
pVehicle->SetDoorDamage(CAR_DOOR_LR, DOOR_REAR_LEFT);
|
||||
pVehicle->SetDoorDamage(CAR_DOOR_RR, DOOR_REAR_RIGHT);
|
||||
}
|
||||
pVehicle->m_bombType = CARBOMB_NONE;
|
||||
pVehicle->bEngineOn = false;
|
||||
pVehicle->bLightsOn = false;
|
||||
pVehicle->m_fHealth = 0.0f;
|
||||
pVehicle->m_nBombTimer = 0;
|
||||
pVehicle->m_bSirenOrAlarm = false;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ADD_MONEY_MADE_IN_COACH:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::MoneyMadeInCoach += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_ADD_MONEY_MADE_COLLECTING_TRASH:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::MoneyMadeCollectingTrash += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_HITMAN_KILLED:
|
||||
// CStats::HitmenKilled++;
|
||||
return 0;
|
||||
case COMMAND_REGISTER_GUARDIAN_ANGEL_MISSION_PASSED:
|
||||
// CStats::GaurdianAngelMissionsPassed++;
|
||||
return 0;
|
||||
case COMMAND_REGISTER_HIGHEST_GUARDIAN_ANGEL_JUSTICE_DISHED:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::RegisterHighestGaurdianAngelJusticeDished(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_BEST_BANDIT_LAP_TIME:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
// CStats::RegisterBestBanditLapTime(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_BEST_BANDIT_POSITION:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
// CStats::RegisterBestBanditPosition(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_MOST_TIME_LEFT_TRAIN_RACE:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::RegisterMostTimeLeftTrainRace(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_HIGHEST_TRAIN_CASH_EARNED:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
// CStats::RegisterHighestTrainCashEarned(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_FASTEST_HELI_RACE_TIME:
|
||||
// CStats::RegisterFastestHeliRaceTime(GET_INTEGER_PARAM(0));
|
||||
CollectParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_BEST_HELI_RACE_POSITION:
|
||||
// CStats::RegisterBestHeliRacePosition(GET_INTEGER_PARAM(0));
|
||||
CollectParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_OUTFIT_CHANGE:
|
||||
// CStats::NumberOutfitChanges++;
|
||||
return 0;
|
||||
case COMMAND_REGISTER_STREET_RACE_FASTEST_TIME:
|
||||
// CStats::RegisterStreetRaceFastestTime(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
CollectParameters(&m_nIp, 2);
|
||||
return 0;
|
||||
case COMMAND_REGISTER_STREET_RACE_FASTEST_LAP:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
// CStats::RegisterStreetRaceFastestLap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_STREET_RACE_BEST_POSITION:
|
||||
CollectParameters(&m_nIp, 2);
|
||||
// CStats::RegisterStreetRaceBestPosition(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
case COMMAND_HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
bool result = false;
|
||||
if (!pObject) {
|
||||
printf("HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON - Object doesn\'t exist\n");
|
||||
}
|
||||
else {
|
||||
if (GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYMELEE || GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYWEAPON)
|
||||
result = CheckDamagedWeaponType(pObject->m_nLastWeaponToDamage, GET_INTEGER_PARAM(1));
|
||||
else
|
||||
result = GET_INTEGER_PARAM(1) == pObject->m_nLastWeaponToDamage;
|
||||
}
|
||||
UpdateCompareFlag(result);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CLEAR_OBJECT_LAST_WEAPON_DAMAGE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
if (!pObject)
|
||||
printf("CLEAR_OBJECT_LAST_WEAPON_DAMAGE - pObject doesn\'t exist");
|
||||
else
|
||||
pObject->m_nLastWeaponToDamage = -1;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CAR_TURN_SPEED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
CVector vSpeed = GET_VECTOR_PARAM(1) / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
pVehicle->SetTurnSpeed(vSpeed.x, vSpeed.y, vSpeed.z);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CAR_MOVE_SPEED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
CVector vSpeed = GET_VECTOR_PARAM(1) / GAME_SPEED_TO_METERS_PER_SECOND;
|
||||
pVehicle->SetMoveSpeed(vSpeed);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_OBJECT_PROOFS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 6);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
pObject->bBulletProof = (GET_INTEGER_PARAM(1) != 0);
|
||||
pObject->bFireProof = (GET_INTEGER_PARAM(2) != 0);
|
||||
pObject->bExplosionProof = (GET_INTEGER_PARAM(3) != 0);
|
||||
pObject->bCollisionProof = (GET_INTEGER_PARAM(4) != 0);
|
||||
pObject->bMeleeProof = (GET_INTEGER_PARAM(5) != 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_CAMERA_PED_ZOOM_INDICATOR:
|
||||
if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FOLLOWPED)
|
||||
SET_INTEGER_PARAM(0, TheCamera.PedZoomIndicator);
|
||||
else
|
||||
SET_INTEGER_PARAM(0, -1);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_SET_CAMERA_PED_ZOOM_INDICATOR:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FOLLOWPED)
|
||||
TheCamera.PedZoomIndicator = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_GET_CAR_ORIENTATION:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
SET_FLOAT_PARAM(1, LimitAngleOnCircle(RADTODEG(Asin(pVehicle->GetForward().z))));
|
||||
SET_FLOAT_PARAM(2, LimitAngleOnCircle(RADTODEG(Atan2(-pVehicle->GetForward().x, pVehicle->GetForward().y))));
|
||||
SET_FLOAT_PARAM(0, LimitAngleOnCircle(RADTODEG(Atan2(-pVehicle->GetRight().z, pVehicle->GetUp().z))));
|
||||
StoreParameters(&m_nIp, 3);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CAR_ORIENTATION:
|
||||
{
|
||||
CollectParameters(&m_nIp, 4);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
pVehicle->SetOrientation(DEGTORAD(GET_FLOAT_PARAM(2)), DEGTORAD(GET_FLOAT_PARAM(1)), DEGTORAD(GET_FLOAT_PARAM(3)));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_DEBUG_MENU_ON:
|
||||
// on PS2 it's something actual - TODO
|
||||
UpdateCompareFlag(false);
|
||||
return 0;
|
||||
case COMMAND_OPEN_VAN_BACK_DOORS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
assert(pVehicle);
|
||||
pVehicle->ProcessOpenDoor(CAR_DOOR_RR, ANIM_STD_VAN_OPEN_DOOR_REAR_RHS, 1.0f);
|
||||
pVehicle->ProcessOpenDoor(CAR_DOOR_LR, ANIM_STD_VAN_OPEN_DOOR_REAR_LHS, 1.0f);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_CHAR_THREAT_CHAR:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
SET_INTEGER_PARAM(0, 0);
|
||||
CEntity* pThreat = pPed->m_threatEntity;
|
||||
if (pThreat && pThreat->IsPed())
|
||||
SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex((CPed*)pThreat));
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_FREEZE_PED_ZOOM_SWITCH:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
TheCamera.m_bFreezePedZoomSwitch = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_SET_OBJECT_RENDERED_DAMAGED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pObject);
|
||||
pObject->bRenderDamaged = true;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_RANDOM_CAR_IN_AREA_NO_SAVE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 5);
|
||||
int handle = -1;
|
||||
uint32 i = CPools::GetVehiclePool()->GetSize();
|
||||
float infX = GET_FLOAT_PARAM(0);
|
||||
float infY = GET_FLOAT_PARAM(1);
|
||||
float supX = GET_FLOAT_PARAM(2);
|
||||
float supY = GET_FLOAT_PARAM(3);
|
||||
while (i-- && handle == -1) {
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (!pVehicle)
|
||||
continue;
|
||||
if (pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR && pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_BIKE)
|
||||
continue;
|
||||
#ifdef FIX_BUGS
|
||||
if (pVehicle->m_fHealth <= 0.0f)
|
||||
#else
|
||||
if (pVehicle->m_fHealth == 0.0f)
|
||||
#endif
|
||||
continue;
|
||||
if (pVehicle->GetModelIndex() != GET_INTEGER_PARAM(4) && GET_INTEGER_PARAM(4) >= 0)
|
||||
continue;
|
||||
if (pVehicle->VehicleCreatedBy != RANDOM_VEHICLE)
|
||||
continue;
|
||||
if (!pVehicle->IsWithinArea(infX, infY, supX, supY))
|
||||
continue;
|
||||
handle = CPools::GetVehiclePool()->GetIndex(pVehicle);
|
||||
}
|
||||
SET_INTEGER_PARAM(0, handle);
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_PLAYER_MADE_SAFE:
|
||||
{
|
||||
UpdateCompareFlag(CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_PLAYERINFO));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_IF_FREE:
|
||||
{
|
||||
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CollectParameters(&m_nIp, 2);
|
||||
//CMessages::AddMessageIfFree(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); TODO
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_E3_BUILD:
|
||||
UpdateCompareFlag(false);
|
||||
return 0;
|
||||
case COMMAND_DECLARE_FORT_STAUNTON_DESTROYED_FLAG:
|
||||
CTheScripts::FSDestroyedFlag = (uint8*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - CTheScripts::ScriptSpace;
|
||||
return 0;
|
||||
case COMMAND_CLEAR_BIG_MESSAGES:
|
||||
//CMessages::ClearBigMessagesOnly(); TODO
|
||||
//CHud::ClearBigMessagesExcept(2, 2); TODO
|
||||
CGarages::MessageEndTime = CGarages::MessageStartTime;
|
||||
return 0;
|
||||
case COMMAND_CLEAR_AREA_OF_OBJECTS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 6);
|
||||
uint32 i = CPools::GetObjectPool()->GetSize();
|
||||
float infX = GET_FLOAT_PARAM(0);
|
||||
float infY = GET_FLOAT_PARAM(1);
|
||||
float infZ = GET_FLOAT_PARAM(2);
|
||||
float supX = GET_FLOAT_PARAM(3);
|
||||
float supY = GET_FLOAT_PARAM(4);
|
||||
float supZ = GET_FLOAT_PARAM(5);
|
||||
while (i--) {
|
||||
CObject* pObject = CPools::GetObjectPool()->GetSlot(i);
|
||||
if (pObject && pObject->CanBeDeleted() && pObject->IsWithinArea(infX, infY, infZ, supX, supY, supZ)) {
|
||||
pObject->DeleteRwObject();
|
||||
CWorld::Remove(pObject);
|
||||
delete pObject;
|
||||
}
|
||||
}
|
||||
i = CPools::GetDummyPool()->GetSize();
|
||||
while (i--) {
|
||||
CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i);
|
||||
if (pDummy && pDummy->IsObject() && pDummy->IsWithinArea(infX, infY, infZ, supX, supY, supZ)) {
|
||||
pDummy->DeleteRwObject();
|
||||
CWorld::Remove(pDummy);
|
||||
delete pDummy;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_LOAD_NON_STANDARD_PED_ANIM:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed::LoadNonStandardPedAnim((eWaitState)GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_UNLOAD_NON_STANDARD_PED_ANIM:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CPed::UnloadNonStandardPedAnim((eWaitState)GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_1566:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_BUILD_WORLD_GEOMETRY:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
if (/*gBuildWorldGeom*/ false) {
|
||||
//base::cWorldGeom::GetInstance()->Build(GET_INTEGER_PARAM(0));
|
||||
UpdateCompareFlag(true);
|
||||
}
|
||||
else {
|
||||
UpdateCompareFlag(false);
|
||||
}
|
||||
return 0;
|
||||
case COMMAND_STORE_BUILDING_SWAP:
|
||||
CollectParameters(&m_nIp, 4);
|
||||
// base::cWorldGeom::GetInstance()->StoreBuildingSwap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3) != 0);
|
||||
return 0;
|
||||
case COMMAND_IS_MULTIPLAYER_ACTIVE:
|
||||
#ifdef GTA_NETWORK
|
||||
UpdateCompareFlag(gIsMultiplayerGame);
|
||||
#else
|
||||
UpdateCompareFlag(false);
|
||||
#endif
|
||||
return 0;
|
||||
case COMMAND_GET_MULTIPLAYER_MODE:
|
||||
SET_INTEGER_PARAM(0, 0); // TODO
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_MULTIPLAYER_SCRIPT_DONE:
|
||||
printf("COMMAND_MULTIPLAYER_SCRIPT_DONE\n");
|
||||
//gbStartingScriptsFromLua = false; TODO?
|
||||
return 0;
|
||||
case COMMAND_IS_MULTIPLAYER_SERVER:
|
||||
UpdateCompareFlag(false); // TODO?
|
||||
return 0;
|
||||
case COMMAND_IS_MULTIPLAYER_TEAM_GAME:
|
||||
UpdateCompareFlag(false); // TODO?
|
||||
return 0;
|
||||
case COMMAND_GET_MULTIPLAYER_TEAM_ID:
|
||||
SET_INTEGER_PARAM(0, 0); // TODO
|
||||
StoreParameters(&m_nIp, 1);
|
||||
return 0;
|
||||
case COMMAND_DOES_SHORTCUT_TAXI_EXIST:
|
||||
UpdateCompareFlag(CGameLogic::pShortCutTaxi != nil);
|
||||
return 0;
|
||||
case COMMAND_SET_ONSCREEN_TIMER_COLOUR:
|
||||
CollectParameters(&m_nIp, 4);
|
||||
gbColour = CRGBA(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3));
|
||||
return 0;
|
||||
case COMMAND_SET_ONSCREEN_TIMER_BACKGROUND_COLOUR:
|
||||
CollectParameters(&m_nIp, 4);
|
||||
gbColour2 = CRGBA(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3));
|
||||
return 0;
|
||||
case COMMAND_REMOVE_CAR_BOOT:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pVehicle);
|
||||
script_assert(pVehicle->IsCar());
|
||||
CAutomobile* pAutomobile = (CAutomobile*)pVehicle;
|
||||
pAutomobile->Damage.SetDoorStatus(DOOR_BOOT, DOOR_STATUS_MISSING);
|
||||
pAutomobile->SetDoorDamage(CAR_BOOT, DOOR_BOOT, true);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_ADD_POINT_3D_MARKER:
|
||||
{
|
||||
uint32 ip = m_nIp;
|
||||
uint32 id = (uint32)(uintptr)GetPointerToScriptVariable(&ip, 0);
|
||||
static CVector vPreviousLocation;
|
||||
CollectParameters(&m_nIp, 7);
|
||||
CVector pos = GET_VECTOR_PARAM(0);
|
||||
if (pos.z <= MAP_Z_LOW_LIMIT)
|
||||
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
|
||||
if (vPreviousLocation != pos) {
|
||||
//C3dMarkers::CopyMarker(id, id - 1, 1, 1);
|
||||
}
|
||||
// TODO: 5 is not a valid type
|
||||
//C3dMarkers::PlaceMarker(id, 5, pos, GET_FLOAT_PARAM(3) * 0.7f, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), 255, 128, 0.0f, 1); // TODO: 0, 100.0f, 1, 0
|
||||
vPreviousLocation = pos;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_GET_VECTOR_FROM_MULTIPLAYER:
|
||||
SET_VECTOR_PARAM(0, gVectorSetInLua);
|
||||
StoreParameters(&m_nIp, 3);
|
||||
return 0;
|
||||
case COMMAND_PRINT_HELP_ALWAYS:
|
||||
{
|
||||
// CHud::mAlwaysAllowHelpText = true; // TODO
|
||||
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CHud::SetHelpMessage(text, false); // + false, true
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_PRINT_HELP_FOREVER_ALWAYS:
|
||||
{
|
||||
// CHud::mAlwaysAllowHelpText = true; // TODO
|
||||
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
CHud::SetHelpMessage(text, false, true); // + true
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SWITCH_FERRY_COLLISION:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CFerry::SwitchFerryCollision(GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_SET_CHAR_MAX_HEALTH:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->m_fHealth = GET_INTEGER_PARAM(1);
|
||||
pPed->m_fMaxHealth = GET_INTEGER_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_SHOOT_TIMER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->m_nScriptShootTimer = GET_INTEGER_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_ATTACK_TIMER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->m_nScriptAttackTimer = GET_INTEGER_PARAM(1);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_HELI_ROTOR_BLADES_FULLSPEED:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pHeli);
|
||||
if (pHeli->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
|
||||
pHeli->m_aWheelSpeed[1] = 0.22f;
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CRUSHER_REWARD_MULTIPLIER:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CGarages::CrusherRewardMultiplier = GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SWAP_BUILDINGS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
// base::cWorldStream::Instance()->SwapBuilding(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_STREAM_BUILDING_SWAPS:
|
||||
{
|
||||
// UpdateCompareFlag(base::cWorldStream::Instance()->StreamBuildingSwaps());
|
||||
UpdateCompareFlag(true);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_IS_WORLD_STREAMING_COMPLETE:
|
||||
{
|
||||
// UpdateCompareFlag(base::cWorldStream::Instance()->IsStreamingComplet());
|
||||
UpdateCompareFlag(true);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SWAP_TO_STREAMED_SECTOR:
|
||||
{
|
||||
// base::cWorldStream::Instance()->SwapToStreamedSector();
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CHAR_ATTACKS_PLAYER_WITH_COPS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
script_assert(pPed);
|
||||
pPed->bAttacksPlayerWithCops = (GET_INTEGER_PARAM(1) != 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_REGISTER_FACE_PLANT_DISTANCE:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::LongestFacePlantDist = Max(CStats::LongestFacePlantDist, GET_FLOAT_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_MAX_SECONDS_ON_CARNAGE_LEFT:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::MaxSecondsOnCarnageLeft = Max(CStats::MaxSecondsOnCarnageLeft, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_MAX_KILLS_ON_RC_TRIAD:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::MaxKillsOnRcTriad = Max(CStats::MaxKillsOnRcTriad, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_REGISTER_HIGHEST_LEVEL_SLASH_TV:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::HighestLevelSlashTv = Max(CStats::HighestLevelSlashTv, GET_INTEGER_PARAM(0));
|
||||
return 0;
|
||||
case COMMAND_ADD_MONEY_MADE_WITH_SLASH_TV:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::MoneyMadeWithSlashTv += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
case COMMAND_ADD_TOTAL_KILLS_ON_SLASH_TV:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
//CStats::TotalKillsOnSlashTV += GET_INTEGER_PARAM(0);
|
||||
return 0;
|
||||
default:
|
||||
script_assert(0);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
+223
-33
@@ -215,6 +215,11 @@ enum {
|
||||
COMMAND_WHILE,
|
||||
COMMAND_WHILENOT,
|
||||
COMMAND_ENDWHILE,
|
||||
COMMAND_214,
|
||||
COMMAND_215,
|
||||
COMMAND_216,
|
||||
COMMAND_217,
|
||||
COMMAND_218,
|
||||
COMMAND_ANDOR,
|
||||
COMMAND_LAUNCH_MISSION,
|
||||
COMMAND_MISSION_HAS_FINISHED,
|
||||
@@ -1441,39 +1446,222 @@ enum {
|
||||
COMMAND_REGISTER_FIRE_LEVEL,
|
||||
COMMAND_IS_AUSTRALIAN_GAME,
|
||||
COMMAND_DISARM_CAR_BOMB,
|
||||
#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT)
|
||||
COMMAND_IS_JAPANESE_GAME,
|
||||
#elif (!defined GTA_PS2)
|
||||
COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED,
|
||||
#endif
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
COMMAND_SHUFFLE_CARD_DECKS,
|
||||
COMMAND_FETCH_NEXT_CARD,
|
||||
COMMAND_GET_OBJECT_VELOCITY,
|
||||
COMMAND_IS_DEBUG_CAMERA_ON,
|
||||
COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY,
|
||||
COMMAND_SET_OBJECT_ROTATION_VELOCITY,
|
||||
COMMAND_IS_OBJECT_STATIC,
|
||||
COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS,
|
||||
COMMAND_DO_2D_RECTANGLES_COLLIDE,
|
||||
COMMAND_GET_OBJECT_ROTATION_VELOCITY,
|
||||
COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY,
|
||||
COMMAND_GET_OBJECT_SPEED,
|
||||
#endif
|
||||
#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT)
|
||||
COMMAND_MARK_CUTSCENE_START,
|
||||
COMMAND_MARK_CUTSCENE_END,
|
||||
COMMAND_CUTSCENE_SCROLL,
|
||||
#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
COMMAND_IS_MISSION_SKIP,
|
||||
COMMAND_SET_IN_AMMUNATION,
|
||||
COMMAND_DO_SAVE_GAME,
|
||||
COMMAND_IS_RETRY,
|
||||
COMMAND_DUMMY,
|
||||
COMMAND_MARK_CUTSCENE_START,
|
||||
COMMAND_MARK_CUTSCENE_END,
|
||||
COMMAND_CUTSCENE_SCROLL,
|
||||
#endif
|
||||
COMMAND_1442,
|
||||
COMMAND_1443,
|
||||
COMMAND_GET_DISTANCE_BETWEEN_2D_POINTS,
|
||||
COMMAND_GET_DISTANCE_BETWEEN_3D_POINTS,
|
||||
COMMAND_DOT_PRODUCT_2D,
|
||||
COMMAND_DOT_PRODUCT_3D,
|
||||
COMMAND_DEBUG_PRINT_WITH_1_FLOAT,
|
||||
COMMAND_DEBUG_PRINT_WITH_2_FLOATS,
|
||||
COMMAND_DEBUG_PRINT_WITH_3_FLOATS,
|
||||
COMMAND_GET_PAD_BUTTON_STATE,
|
||||
COMMAND_SET_NAVIGATION_ARROW,
|
||||
COMMAND_CLEAR_NAVIGATION_ARROW,
|
||||
COMMAND_CALL,
|
||||
COMMAND_CALLNOT,
|
||||
COMMAND_IS_CAR_AUTOMOBILE,
|
||||
COMMAND_IS_CAR_BIKE,
|
||||
COMMAND_IS_CAR_PLANE,
|
||||
COMMAND_IS_CAR_HELI,
|
||||
COMMAND_1460,
|
||||
COMMAND_1461,
|
||||
COMMAND_1462,
|
||||
COMMAND_1463,
|
||||
COMMAND_1464,
|
||||
COMMAND_1465,
|
||||
COMMAND_1466,
|
||||
COMMAND_1467,
|
||||
COMMAND_1468,
|
||||
COMMAND_1469,
|
||||
COMMAND_1470,
|
||||
COMMAND_1471,
|
||||
COMMAND_1472,
|
||||
COMMAND_1473,
|
||||
COMMAND_1474,
|
||||
COMMAND_1475,
|
||||
COMMAND_1476,
|
||||
COMMAND_RETURN_IF_TRUE,
|
||||
COMMAND_RETURN_TRUE_IF_TRUE,
|
||||
COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_BEHIND,
|
||||
COMMAND_SET_RC_HELI_HEIGHT_LIMIT,
|
||||
COMMAND_CREATE_SCRIPT_CORONA,
|
||||
COMMAND_REMOVE_SCRIPT_CORONA,
|
||||
COMMAND_IS_BOAT_IN_WATER,
|
||||
COMMAND_IS_CAR_DRIVER_BEING_JACKED,
|
||||
COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_IN_FRONT,
|
||||
COMMAND_SET_CAR_TILTED_BY_CHAR,
|
||||
COMMAND_GET_WEAPON_TYPE_FOR_PICKUP_IN_AREA,
|
||||
COMMAND_IS_PLAYER_USING_FIRST_PERSON_WEAPON_CAMERA,
|
||||
COMMAND_1489,
|
||||
COMMAND_1490,
|
||||
COMMAND_1491,
|
||||
COMMAND_SET_DEBUG_MENU_ACTIVE,
|
||||
COMMAND_SET_DRAW_HUD,
|
||||
COMMAND_GET_RANDOM_CHAR_IN_AREA_NO_CHECKS,
|
||||
COMMAND_GET_RANDOM_CAR_IN_AREA_NO_CHECKS_NO_SAVE,
|
||||
COMMAND_STORE_CAR_COLLIDED_WITH_NO_SAVE,
|
||||
COMMAND_DISABLE_FERRY_PATH,
|
||||
COMMAND_ENABLE_FERRY_PATH,
|
||||
COMMAND_GET_CLOSEST_DOCKED_FERRY,
|
||||
COMMAND_OPEN_FERRY_DOOR,
|
||||
COMMAND_CLOSE_FERRY_DOOR,
|
||||
COMMAND_IS_FERRY_DOOR_OPEN,
|
||||
COMMAND_IS_FERRY_DOOR_CLOSED,
|
||||
COMMAND_SKIP_FERRY_TO_NEXT_DOCK,
|
||||
COMMAND_SET_CHAR_DROPS_WEAPONS_ON_DEATH,
|
||||
COMMAND_IS_CHAR_CROUCHING,
|
||||
COMMAND_GET_FERRY_BOARDING_SPACE,
|
||||
COMMAND_GET_FERRY_HEADING,
|
||||
COMMAND_SET_FERRIES_DISABLED,
|
||||
COMMAND_COMPLETE_FERRY_DOOR_MOVEMENT,
|
||||
COMMAND_OVERRIDE_CAR_REMOTE_CONTROL,
|
||||
COMMAND_CANCEL_REMOTE_MODE,
|
||||
COMMAND_REGISTER_CAR_SOLD,
|
||||
COMMAND_ADD_MONEY_MADE_WITH_CAR_SALES,
|
||||
COMMAND_SET_BRIDGE_STATE,
|
||||
COMMAND_SET_OBJECT_TURN_SPEED,
|
||||
COMMAND_SET_OBJECT_MASS,
|
||||
COMMAND_HAS_CUTSCENE_LOADED,
|
||||
COMMAND_SET_UNIQUE_JUMPS_FOUND,
|
||||
COMMAND_SET_HIDDEN_PACKAGES_COLLECTED,
|
||||
COMMAND_REGISTER_BIKE_SOLD,
|
||||
COMMAND_ADD_MONEY_MADE_WITH_BIKE_SALES,
|
||||
COMMAND_REGISTER_PACKAGE_SMUGGLED,
|
||||
COMMAND_REGISTER_SMUGGLER_WASTED,
|
||||
COMMAND_REGISTER_FASTEST_SMUGGLING_TIME,
|
||||
COMMAND_SET_CHAR_DIVE_FROM_CAR,
|
||||
COMMAND_WRECK_CAR,
|
||||
COMMAND_ADD_MONEY_MADE_IN_COACH,
|
||||
COMMAND_ADD_MONEY_MADE_COLLECTING_TRASH,
|
||||
COMMAND_REGISTER_HITMAN_KILLED,
|
||||
COMMAND_REGISTER_GUARDIAN_ANGEL_MISSION_PASSED,
|
||||
COMMAND_REGISTER_HIGHEST_GUARDIAN_ANGEL_JUSTICE_DISHED,
|
||||
COMMAND_REGISTER_BEST_BANDIT_LAP_TIME,
|
||||
COMMAND_REGISTER_BEST_BANDIT_POSITION,
|
||||
COMMAND_REGISTER_MOST_TIME_LEFT_TRAIN_RACE,
|
||||
COMMAND_REGISTER_HIGHEST_TRAIN_CASH_EARNED,
|
||||
COMMAND_REGISTER_FASTEST_HELI_RACE_TIME,
|
||||
COMMAND_REGISTER_BEST_HELI_RACE_POSITION,
|
||||
COMMAND_REGISTER_OUTFIT_CHANGE,
|
||||
COMMAND_REGISTER_STREET_RACE_FASTEST_TIME,
|
||||
COMMAND_REGISTER_STREET_RACE_FASTEST_LAP,
|
||||
COMMAND_REGISTER_STREET_RACE_BEST_POSITION,
|
||||
COMMAND_HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON,
|
||||
COMMAND_CLEAR_OBJECT_LAST_WEAPON_DAMAGE,
|
||||
COMMAND_SET_CAR_TURN_SPEED,
|
||||
COMMAND_SET_CAR_MOVE_SPEED,
|
||||
COMMAND_SET_OBJECT_PROOFS,
|
||||
COMMAND_GET_CAMERA_PED_ZOOM_INDICATOR,
|
||||
COMMAND_SET_CAMERA_PED_ZOOM_INDICATOR,
|
||||
COMMAND_GET_CAR_ORIENTATION,
|
||||
COMMAND_SET_CAR_ORIENTATION,
|
||||
COMMAND_IS_DEBUG_MENU_ON,
|
||||
COMMAND_OPEN_VAN_BACK_DOORS,
|
||||
COMMAND_GET_CHAR_THREAT_CHAR,
|
||||
COMMAND_FREEZE_PED_ZOOM_SWITCH,
|
||||
COMMAND_SET_OBJECT_RENDERED_DAMAGED,
|
||||
COMMAND_GET_RANDOM_CAR_IN_AREA_NO_SAVE,
|
||||
COMMAND_IS_PLAYER_MADE_SAFE,
|
||||
COMMAND_PRINT_IF_FREE,
|
||||
COMMAND_IS_E3_BUILD,
|
||||
COMMAND_DECLARE_FORT_STAUNTON_DESTROYED_FLAG,
|
||||
COMMAND_CLEAR_BIG_MESSAGES,
|
||||
COMMAND_CLEAR_AREA_OF_OBJECTS,
|
||||
COMMAND_LOAD_NON_STANDARD_PED_ANIM,
|
||||
COMMAND_UNLOAD_NON_STANDARD_PED_ANIM,
|
||||
COMMAND_1566,
|
||||
COMMAND_BUILD_WORLD_GEOMETRY,
|
||||
COMMAND_STORE_BUILDING_SWAP,
|
||||
COMMAND_IS_MULTIPLAYER_ACTIVE,
|
||||
COMMAND_GET_MULTIPLAYER_MODE,
|
||||
COMMAND_MULTIPLAYER_SCRIPT_DONE,
|
||||
COMMAND_IS_MULTIPLAYER_SERVER,
|
||||
COMMAND_IS_MULTIPLAYER_TEAM_GAME,
|
||||
COMMAND_GET_MULTIPLAYER_TEAM_ID,
|
||||
COMMAND_DOES_SHORTCUT_TAXI_EXIST,
|
||||
COMMAND_SET_ONSCREEN_TIMER_COLOUR,
|
||||
COMMAND_SET_ONSCREEN_TIMER_BACKGROUND_COLOUR,
|
||||
COMMAND_REMOVE_CAR_BOOT,
|
||||
COMMAND_ADD_POINT_3D_MARKER,
|
||||
COMMAND_GET_VECTOR_FROM_MULTIPLAYER,
|
||||
COMMAND_PRINT_HELP_ALWAYS,
|
||||
COMMAND_PRINT_HELP_FOREVER_ALWAYS,
|
||||
COMMAND_SWITCH_FERRY_COLLISION,
|
||||
COMMAND_SET_CHAR_MAX_HEALTH,
|
||||
COMMAND_SET_CHAR_SHOOT_TIMER,
|
||||
COMMAND_SET_CHAR_ATTACK_TIMER,
|
||||
COMMAND_SET_HELI_ROTOR_BLADES_FULLSPEED,
|
||||
COMMAND_SET_CRUSHER_REWARD_MULTIPLIER,
|
||||
COMMAND_SWAP_BUILDINGS,
|
||||
COMMAND_STREAM_BUILDING_SWAPS,
|
||||
COMMAND_IS_WORLD_STREAMING_COMPLETE,
|
||||
COMMAND_SWAP_TO_STREAMED_SECTOR,
|
||||
COMMAND_SET_CHAR_ATTACKS_PLAYER_WITH_COPS,
|
||||
COMMAND_REGISTER_FACE_PLANT_DISTANCE,
|
||||
COMMAND_REGISTER_MAX_SECONDS_ON_CARNAGE_LEFT,
|
||||
COMMAND_REGISTER_MAX_KILLS_ON_RC_TRIAD,
|
||||
COMMAND_REGISTER_HIGHEST_LEVEL_SLASH_TV,
|
||||
COMMAND_ADD_MONEY_MADE_WITH_SLASH_TV,
|
||||
COMMAND_ADD_TOTAL_KILLS_ON_SLASH_TV,
|
||||
COMMAND_ADD_NOODLES_DELIVERED,
|
||||
COMMAND_REGISTER_SCRAPYARD_CHALLENGE_SCORE,
|
||||
COMMAND_REGISTER_9MM_MAYHEM_SCORE,
|
||||
COMMAND_REGISTER_SCOOTER_SHOOTER_SCORE,
|
||||
COMMAND_ADD_MONEY_MADE_FROM_TOURIST,
|
||||
COMMAND_ADD_TOURISTS_TAKEN_TO_SPOTS,
|
||||
COMMAND_ADD_EXPORTED_CARS,
|
||||
COMMAND_SET_TOTAL_EXPORT_CARS,
|
||||
COMMAND_REGISTER_DIRT_BIKE_FASTEST_LAP,
|
||||
COMMAND_REGISTER_DIRT_BIKE_FASTEST_TIME,
|
||||
COMMAND_REGISTER_DIRT_BIKE_AIR_TIME,
|
||||
COMMAND_ADD_ARROW_3D_MARKER,
|
||||
COMMAND_PRINT_NOW_OVERRIDE_FADE,
|
||||
COMMAND_GET_PICKUP_VALUE,
|
||||
COMMAND_SET_PICKUP_VALUE,
|
||||
COMMAND_IS_DEVELOPER,
|
||||
COMMAND_SET_DEVELOPER_FLAG,
|
||||
COMMAND_REGISTER_WICHITA_WIPEOUT_SCORE,
|
||||
COMMAND_ATTACH_OBJECT_TO_CAR,
|
||||
COMMAND_DETACH_OBJECT_FROM_CAR,
|
||||
COMMAND_SET_PAD_STICKS_MULTIPLIER,
|
||||
COMMAND_PRINT_SUBTITLE_NOW,
|
||||
COMMAND_PRINT_SUBTITLE_NOW_OVERRIDE_FADE,
|
||||
COMMAND_PRINT_SUBTITLE_NOW_NO_BRIEF,
|
||||
COMMAND_PRINT_WITH_NUMBER_NOW_NO_BRIEF,
|
||||
COMMAND_GET_ANGLE_BETWEEN_POINTS,
|
||||
COMMAND_OVERRIDE_CHAR_MOVE_ANIM,
|
||||
COMMAND_1627,
|
||||
COMMAND_ENABLE_EMERGENCY_VEHICLES,
|
||||
COMMAND_ADD_UNLOCKED_COSTUME,
|
||||
COMMAND_CLEAR_MULTIPLAYER_SPLASH_SCREEN,
|
||||
COMMAND_PRINT_WITH_2_NUMBERS_NOW_NO_BRIEF,
|
||||
COMMAND_GET_OBJECT_ORIENTATION,
|
||||
COMMAND_SET_OBJECT_ORIENTATION,
|
||||
COMMAND_CHANGE_ONSCREEN_COUNTER_PREFIX,
|
||||
COMMAND_STORE_PLAYER_OUTFIT,
|
||||
COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_STRING,
|
||||
COMMAND_SET_PLAYER_CURRENT_WEAPON_AMMO_IN_CLIP,
|
||||
COMMAND_SET_CHAR_WAIT_STATE_REPEAT,
|
||||
COMMAND_REGISTER_BEST_TIME_GOGO_FAGGIO,
|
||||
COMMAND_LOCK_GARAGE,
|
||||
COMMAND_IS_FINAL_GAME,
|
||||
COMMAND_SET_ALLOWED_COLLISION,
|
||||
COMMAND_REGISTER_GUARDIAN_ANGEL_LEVEL,
|
||||
COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_2_STRINGS,
|
||||
COMMAND_GET_PLAYER_STORED_WEAPON,
|
||||
COMMAND_DISABLE_PAUSE_MENU,
|
||||
COMMAND_IS_CHANNEL_PLAYING,
|
||||
COMMAND_SET_CLOCK_EVENT_WARNING,
|
||||
COMMAND_SET_EXTRA_COLOUR_LIGHT_DIRECTION,
|
||||
COMMAND_SET_CHAR_CAN_BE_TARGETTED_BY_LEADER,
|
||||
COMMAND_PRINT_HELP_NO_BRIEF,
|
||||
COMMAND_PRINT_HELP_FOREVER_NO_BRIEF,
|
||||
COMMAND_PRINT_HELP_ALWAYS_NO_BRIEF,
|
||||
COMMAND_PRINT_HELP_FOREVER_ALWAYS_NO_BRIEF,
|
||||
COMMAND_SET_CAR_IS_REWARD,
|
||||
COMMAND_FREEZE_ALL_PLAYER_FOLLOWERS,
|
||||
#ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
|
||||
LAST_SCRIPT_COMMAND
|
||||
#endif
|
||||
@@ -1492,7 +1680,9 @@ enum eScriptArgument
|
||||
ARGTYPE_PED_HANDLE,
|
||||
ARGTYPE_VEHICLE_HANDLE,
|
||||
ARGTYPE_OBJECT_HANDLE,
|
||||
ARGTYPE_ANDOR
|
||||
ARGTYPE_ANDOR,
|
||||
ARGTYPE_LIST,
|
||||
ARGTYPE_FUNCTION
|
||||
};
|
||||
|
||||
struct tScriptCommandData
|
||||
|
||||
+327
-89
@@ -239,6 +239,11 @@ const tScriptCommandData commands[] = {
|
||||
REGISTER_COMMAND(COMMAND_WHILE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_WHILENOT, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ENDWHILE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_214, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_215, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_216, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_217, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_218, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ANDOR, INPUT_ARGUMENTS(ARGTYPE_ANDOR,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_LAUNCH_MISSION, INPUT_ARGUMENTS(ARGTYPE_LABEL,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_MISSION_HAS_FINISHED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
@@ -293,7 +298,7 @@ const tScriptCommandData commands[] = {
|
||||
REGISTER_COMMAND(COMMAND_ADD_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_SCORE_GREATER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_STORE_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GIVE_REMOTE_CONTROLLED_CAR_TO_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GIVE_REMOTE_CONTROLLED_CAR_TO_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ALTER_WANTED_LEVEL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ALTER_WANTED_LEVEL_NO_DROP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_WANTED_LEVEL_GREATER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
@@ -1105,7 +1110,7 @@ const tScriptCommandData commands[] = {
|
||||
REGISTER_COMMAND(COMMAND_IS_CAR_PASSENGER_SEAT_FREE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_CHAR_IN_CAR_PASSENGER_SEAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_IS_CHRIS_CRIMINAL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_START_CREDITS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_START_CREDITS, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_STOP_CREDITS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ARE_CREDITS_FINISHED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CREATE_SINGLE_PARTICLE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
@@ -1193,7 +1198,7 @@ const tScriptCommandData commands[] = {
|
||||
REGISTER_COMMAND(COMMAND_SHUT_CHAR_UP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_ENABLE_RC_DETONATE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CAR_RANDOM_ROUTE_SEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_ANY_PICKUP_AT_COORDS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_ANY_PICKUP_AT_COORDS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_FIRST_PICKUP_COORDS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_NEXT_PICKUP_COORDS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REMOVE_ALL_CHAR_WEAPONS, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
@@ -1465,39 +1470,222 @@ const tScriptCommandData commands[] = {
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_FIRE_LEVEL, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_AUSTRALIAN_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DISARM_CAR_BOMB, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT)
|
||||
REGISTER_COMMAND(COMMAND_IS_JAPANESE_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
#elif (!defined GTA_PS2)
|
||||
REGISTER_COMMAND(COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
#endif
|
||||
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
REGISTER_COMMAND(COMMAND_SHUFFLE_CARD_DECKS, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_FETCH_NEXT_CARD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_OBJECT_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_DEBUG_CAMERA_ON, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_OBJECT_STATIC, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DO_2D_RECTANGLES_COLLIDE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_OBJECT_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
#endif
|
||||
#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT)
|
||||
REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_START, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_END, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CUTSCENE_SCROLL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
|
||||
REGISTER_COMMAND(COMMAND_IS_MISSION_SKIP, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_IN_AMMUNATION, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DO_SAVE_GAME, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_RETRY, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DUMMY, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_START, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_END, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CUTSCENE_SCROLL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
#endif
|
||||
REGISTER_COMMAND(COMMAND_1442, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1443, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_DISTANCE_BETWEEN_2D_POINTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_DISTANCE_BETWEEN_3D_POINTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DOT_PRODUCT_2D, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DOT_PRODUCT_3D, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DEBUG_PRINT_WITH_1_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DEBUG_PRINT_WITH_2_FLOATS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DEBUG_PRINT_WITH_3_FLOATS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_PAD_BUTTON_STATE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_NAVIGATION_ARROW, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CLEAR_NAVIGATION_ARROW, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CALL, INPUT_ARGUMENTS(ARGTYPE_FUNCTION,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CALLNOT, INPUT_ARGUMENTS(ARGTYPE_FUNCTION,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_CAR_AUTOMOBILE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_CAR_BIKE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_CAR_PLANE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_CAR_HELI, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1460, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1461, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1462, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1463, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1464, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1465, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1466, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1467, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1468, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1469, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1470, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1471, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1472, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1473, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1474, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1475, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1476, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_RETURN_IF_TRUE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_RETURN_TRUE_IF_TRUE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_BEHIND, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_RC_HELI_HEIGHT_LIMIT, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CREATE_SCRIPT_CORONA, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REMOVE_SCRIPT_CORONA, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_BOAT_IN_WATER, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_CAR_DRIVER_BEING_JACKED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_ONLY_ALLOWED_TO_SIT_IN_FRONT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CAR_TILTED_BY_CHAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_WEAPON_TYPE_FOR_PICKUP_IN_AREA, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_PLAYER_USING_FIRST_PERSON_WEAPON_CAMERA, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1489, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1490, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1491, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_DEBUG_MENU_ACTIVE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_DRAW_HUD, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_RANDOM_CHAR_IN_AREA_NO_CHECKS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_RANDOM_CAR_IN_AREA_NO_CHECKS_NO_SAVE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_STORE_CAR_COLLIDED_WITH_NO_SAVE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DISABLE_FERRY_PATH, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ENABLE_FERRY_PATH, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_CLOSEST_DOCKED_FERRY, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_OPEN_FERRY_DOOR, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CLOSE_FERRY_DOOR, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_FERRY_DOOR_OPEN, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_FERRY_DOOR_CLOSED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SKIP_FERRY_TO_NEXT_DOCK, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_DROPS_WEAPONS_ON_DEATH, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_CHAR_CROUCHING, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_FERRY_BOARDING_SPACE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_FERRY_HEADING, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_FERRIES_DISABLED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_COMPLETE_FERRY_DOOR_MOVEMENT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_OVERRIDE_CAR_REMOTE_CONTROL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CANCEL_REMOTE_MODE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_CAR_SOLD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_WITH_CAR_SALES, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_BRIDGE_STATE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_OBJECT_TURN_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_OBJECT_MASS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_HAS_CUTSCENE_LOADED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_UNIQUE_JUMPS_FOUND, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_HIDDEN_PACKAGES_COLLECTED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_BIKE_SOLD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_WITH_BIKE_SALES, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_PACKAGE_SMUGGLED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_SMUGGLER_WASTED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_FASTEST_SMUGGLING_TIME, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_DIVE_FROM_CAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_WRECK_CAR, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_IN_COACH, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_COLLECTING_TRASH, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_HITMAN_KILLED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_GUARDIAN_ANGEL_MISSION_PASSED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_HIGHEST_GUARDIAN_ANGEL_JUSTICE_DISHED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_BEST_BANDIT_LAP_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_BEST_BANDIT_POSITION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_MOST_TIME_LEFT_TRAIN_RACE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_HIGHEST_TRAIN_CASH_EARNED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_FASTEST_HELI_RACE_TIME, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_BEST_HELI_RACE_POSITION, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_OUTFIT_CHANGE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_STREET_RACE_FASTEST_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_STREET_RACE_FASTEST_LAP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_STREET_RACE_BEST_POSITION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_HAS_OBJECT_BEEN_DAMAGED_BY_WEAPON, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CLEAR_OBJECT_LAST_WEAPON_DAMAGE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CAR_TURN_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CAR_MOVE_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_OBJECT_PROOFS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_CAMERA_PED_ZOOM_INDICATOR, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CAMERA_PED_ZOOM_INDICATOR, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_CAR_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CAR_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_DEBUG_MENU_ON, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_OPEN_VAN_BACK_DOORS, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_CHAR_THREAT_CHAR, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_FREEZE_PED_ZOOM_SWITCH, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_OBJECT_RENDERED_DAMAGED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_RANDOM_CAR_IN_AREA_NO_SAVE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_PLAYER_MADE_SAFE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_IF_FREE, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_E3_BUILD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DECLARE_FORT_STAUNTON_DESTROYED_FLAG, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CLEAR_BIG_MESSAGES, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CLEAR_AREA_OF_OBJECTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_LOAD_NON_STANDARD_PED_ANIM, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_UNLOAD_NON_STANDARD_PED_ANIM, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1566, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_BUILD_WORLD_GEOMETRY, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_STORE_BUILDING_SWAP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_MULTIPLAYER_ACTIVE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_MULTIPLAYER_MODE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_MULTIPLAYER_SCRIPT_DONE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_MULTIPLAYER_SERVER, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_MULTIPLAYER_TEAM_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_MULTIPLAYER_TEAM_ID, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DOES_SHORTCUT_TAXI_EXIST, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_ONSCREEN_TIMER_COLOUR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_ONSCREEN_TIMER_BACKGROUND_COLOUR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REMOVE_CAR_BOOT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_POINT_3D_MARKER, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_VECTOR_FROM_MULTIPLAYER, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_HELP_ALWAYS, INPUT_ARGUMENTS(ARGTYPE_STRING,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_HELP_FOREVER_ALWAYS, INPUT_ARGUMENTS(ARGTYPE_STRING,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SWITCH_FERRY_COLLISION, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_MAX_HEALTH, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_SHOOT_TIMER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_ATTACK_TIMER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_HELI_ROTOR_BLADES_FULLSPEED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CRUSHER_REWARD_MULTIPLIER, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SWAP_BUILDINGS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_STREAM_BUILDING_SWAPS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_WORLD_STREAMING_COMPLETE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SWAP_TO_STREAMED_SECTOR, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_ATTACKS_PLAYER_WITH_COPS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_FACE_PLANT_DISTANCE, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_MAX_SECONDS_ON_CARNAGE_LEFT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_MAX_KILLS_ON_RC_TRIAD, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_HIGHEST_LEVEL_SLASH_TV, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_WITH_SLASH_TV, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_TOTAL_KILLS_ON_SLASH_TV, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_NOODLES_DELIVERED, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_SCRAPYARD_CHALLENGE_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_9MM_MAYHEM_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_SCOOTER_SHOOTER_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_MONEY_MADE_FROM_TOURIST, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_TOURISTS_TAKEN_TO_SPOTS, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_EXPORTED_CARS, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_TOTAL_EXPORT_CARS, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_DIRT_BIKE_FASTEST_LAP, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_DIRT_BIKE_FASTEST_TIME, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_DIRT_BIKE_AIR_TIME, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_ARROW_3D_MARKER, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_NOW_OVERRIDE_FADE, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_PICKUP_VALUE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_PICKUP_VALUE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_DEVELOPER, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_DEVELOPER_FLAG, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_WICHITA_WIPEOUT_SCORE, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ATTACH_OBJECT_TO_CAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DETACH_OBJECT_FROM_CAR, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_PAD_STICKS_MULTIPLIER, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_SUBTITLE_NOW, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_SUBTITLE_NOW_OVERRIDE_FADE, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_SUBTITLE_NOW_NO_BRIEF, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_WITH_NUMBER_NOW_NO_BRIEF, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_ANGLE_BETWEEN_POINTS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_OVERRIDE_CHAR_MOVE_ANIM, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_1627, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ENABLE_EMERGENCY_VEHICLES, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_ADD_UNLOCKED_COSTUME, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CLEAR_MULTIPLAYER_SPLASH_SCREEN, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_WITH_2_NUMBERS_NOW_NO_BRIEF, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_OBJECT_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_OBJECT_ORIENTATION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_CHANGE_ONSCREEN_COUNTER_PREFIX, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_STORE_PLAYER_OUTFIT, INPUT_ARGUMENTS(ARGTYPE_STRING,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_STRING, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_STRING,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_PLAYER_CURRENT_WEAPON_AMMO_IN_CLIP, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_WAIT_STATE_REPEAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_BEST_TIME_GOGO_FAGGIO, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_LOCK_GARAGE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_FINAL_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_ALLOWED_COLLISION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_REGISTER_GUARDIAN_ANGEL_LEVEL, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_NUMBER_AND_2_STRINGS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_STRING, ARGTYPE_STRING,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_GET_PLAYER_STORED_WEAPON, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_DISABLE_PAUSE_MENU, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_IS_CHANNEL_PLAYING, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), true, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CLOCK_EVENT_WARNING, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_EXTRA_COLOUR_LIGHT_DIRECTION, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CHAR_CAN_BE_TARGETTED_BY_LEADER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_HELP_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_HELP_FOREVER_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_HELP_ALWAYS_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_PRINT_HELP_FOREVER_ALWAYS_NO_BRIEF, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_SET_CAR_IS_REWARD, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
REGISTER_COMMAND(COMMAND_FREEZE_ALL_PLAYER_FOLLOWERS, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""),
|
||||
};
|
||||
#undef REGISTER_COMMAND
|
||||
#undef INPUT_ARGUMENTS
|
||||
@@ -1539,62 +1727,89 @@ void FlushLog()
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
|
||||
int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, char* buf)
|
||||
{
|
||||
char tmpstr[24];
|
||||
uint8 type = CTheScripts::Read1ByteFromScript(pIp);
|
||||
if (type >= ARGUMENT_GLOBAL_ARRAY) {
|
||||
uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp);
|
||||
uint8 index_id = CTheScripts::Read1ByteFromScript(pIp);
|
||||
uint8 size = CTheScripts::Read1ByteFromScript(pIp);
|
||||
script_assert(size > 0);
|
||||
script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size);
|
||||
uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1);
|
||||
sprintf(tmpstr, " $%d[%d@ (%d)]", ((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index_in_block, index_id, pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id]);
|
||||
strcat(buf, tmpstr);
|
||||
return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block)];
|
||||
}
|
||||
else if (type >= ARGUMENT_GLOBAL) {
|
||||
uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp);
|
||||
sprintf(tmpstr, " $%d", ((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block);
|
||||
strcat(buf, tmpstr);
|
||||
return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block)];
|
||||
}
|
||||
else if (type >= ARGUMENT_LOCAL_ARRAY) {
|
||||
uint8 index_id = CTheScripts::Read1ByteFromScript(pIp);
|
||||
uint8 size = CTheScripts::Read1ByteFromScript(pIp);
|
||||
script_assert(size > 0);
|
||||
script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size);
|
||||
uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1);
|
||||
sprintf(tmpstr, " %d@[%d@ (%d)]", (type - ARGUMENT_LOCAL_ARRAY), index_id, pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id]);
|
||||
strcat(buf, tmpstr);
|
||||
return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL_ARRAY) + index];
|
||||
}
|
||||
else if (type >= ARGUMENT_LOCAL) {
|
||||
sprintf(tmpstr, " %d@", (type - ARGUMENT_LOCAL));
|
||||
strcat(buf, tmpstr);
|
||||
return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)];
|
||||
}
|
||||
else if (type >= ARGUMENT_TIMER) {
|
||||
sprintf(tmpstr, " TIMER%d@", (type - ARGUMENT_TIMER));
|
||||
strcat(buf, tmpstr);
|
||||
return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; // why 8?
|
||||
}
|
||||
script_assert(false && "wrong type for variable");
|
||||
return nil;
|
||||
}
|
||||
|
||||
int CRunningScript::CollectParameterForDebug(char* buf, bool& var)
|
||||
{
|
||||
uint16 varIndex;
|
||||
char tmpstr[24];
|
||||
var = false;
|
||||
int tmp;
|
||||
switch (CTheScripts::Read1ByteFromScript(&m_nIp))
|
||||
{
|
||||
case ARGUMENT_END:
|
||||
return 0; // TODO(LCS)
|
||||
case ARGUMENT_INT_ZERO:
|
||||
return 0;
|
||||
case ARGUMENT_FLOAT_ZERO:
|
||||
return 0;
|
||||
case ARGUMENT_FLOAT_1BYTE:
|
||||
return (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 24;
|
||||
case ARGUMENT_FLOAT_2BYTES:
|
||||
return (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16;
|
||||
case ARGUMENT_FLOAT_3BYTES:
|
||||
tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 8;
|
||||
tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16;
|
||||
return tmp;
|
||||
case ARGUMENT_INT32:
|
||||
case ARGUMENT_FLOAT:
|
||||
return CTheScripts::Read4BytesFromScript(&m_nIp);
|
||||
case ARGUMENT_GLOBALVAR:
|
||||
varIndex = CTheScripts::Read2BytesFromScript(&m_nIp);
|
||||
script_assert(varIndex >= 8 && varIndex < CTheScripts::GetSizeOfVariableSpace());
|
||||
var = true;
|
||||
sprintf(tmpstr, " $%d", varIndex / 4);
|
||||
strcat(buf, tmpstr);
|
||||
return *((int32*)&CTheScripts::ScriptSpace[varIndex]);
|
||||
case ARGUMENT_LOCALVAR:
|
||||
varIndex = CTheScripts::Read2BytesFromScript(&m_nIp);
|
||||
script_assert(varIndex >= 0 && varIndex < ARRAY_SIZE(m_anLocalVariables));
|
||||
var = true;
|
||||
sprintf(tmpstr, " %d@", varIndex);
|
||||
strcat(buf, tmpstr);
|
||||
return m_anLocalVariables[varIndex];
|
||||
case ARGUMENT_INT8:
|
||||
return CTheScripts::Read1ByteFromScript(&m_nIp);
|
||||
case ARGUMENT_INT16:
|
||||
return CTheScripts::Read2BytesFromScript(&m_nIp);
|
||||
default:
|
||||
PrintToLog("%s - script assertion failed in CollectParameterForDebug", buf);
|
||||
script_assert(0);
|
||||
break;
|
||||
var = true;
|
||||
--m_nIp;
|
||||
return *GetPointerToScriptVariableForDebug(this, &m_nIp, buf);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CRunningScript::GetStoredParameterForDebug(char* buf)
|
||||
{
|
||||
uint16 varIndex;
|
||||
char tmpstr[24];
|
||||
switch (CTheScripts::Read1ByteFromScript(&m_nIp)) {
|
||||
case ARGUMENT_GLOBALVAR:
|
||||
varIndex = CTheScripts::Read2BytesFromScript(&m_nIp);
|
||||
sprintf(tmpstr, " $%d", varIndex / 4);
|
||||
strcat(buf, tmpstr);
|
||||
break;
|
||||
case ARGUMENT_LOCALVAR:
|
||||
varIndex = CTheScripts::Read2BytesFromScript(&m_nIp);
|
||||
sprintf(tmpstr, " %d@", varIndex);
|
||||
strcat(buf, tmpstr);
|
||||
break;
|
||||
default:
|
||||
PrintToLog("%s - script_assertion failed in GetStoredParameterForDebug", buf);
|
||||
script_assert(0);
|
||||
}
|
||||
GetPointerToScriptVariableForDebug(this, &m_nIp, buf);
|
||||
}
|
||||
|
||||
void CTheScripts::LogAfterScriptInitializing()
|
||||
@@ -1641,17 +1856,41 @@ void CRunningScript::LogOnStartProcessing()
|
||||
void CRunningScript::LogBeforeProcessingCommand(int32 command)
|
||||
{
|
||||
storedIp = m_nIp;
|
||||
uint8 nInputParams;
|
||||
uint8 nOutputParameters;
|
||||
uint8 nLocalsOffset;
|
||||
if (command < ARRAY_SIZE(commands)) {
|
||||
script_assert(commands[command].id == command);
|
||||
m_nIp -= 2;
|
||||
sprintf(commandInfo, m_nIp >= SIZE_MAIN_SCRIPT ? "M<%5d> " : "<%6d> ", m_nIp >= SIZE_MAIN_SCRIPT ? m_nIp - SIZE_MAIN_SCRIPT : m_nIp);
|
||||
sprintf(commandInfo, m_nIp >= CTheScripts::MainScriptSize ? "M<%5d> " : "<%6d> ", m_nIp >= CTheScripts::MainScriptSize ? m_nIp - CTheScripts::MainScriptSize : m_nIp);
|
||||
m_nIp += 2;
|
||||
if (m_bNotFlag)
|
||||
strcat(commandInfo, "NOT ");
|
||||
if (commands[command].position == -1)
|
||||
strcat(commandInfo, commands[command].name + sizeof("COMMAND_") - 1);
|
||||
if (commands[command].input[0] == ARGTYPE_FUNCTION) {
|
||||
char tmp[32];
|
||||
bool var = false;
|
||||
nInputParams = CTheScripts::Read1ByteFromScript(&m_nIp);
|
||||
nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp);
|
||||
nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp);
|
||||
int value = CollectParameterForDebug(commandInfo, var);
|
||||
sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value));
|
||||
strcat(commandInfo, tmp);
|
||||
strcat(commandInfo, "{");
|
||||
for (int i = 0; i < nInputParams; i++) {
|
||||
if (i != 0)
|
||||
strcat(commandInfo, ", ");
|
||||
value = CollectParameterForDebug(commandInfo, var);
|
||||
sprintf(tmp, var ? "(%d)" : "%d", value);
|
||||
strcat(commandInfo, tmp);
|
||||
|
||||
}
|
||||
strcat(commandInfo, "}");
|
||||
}
|
||||
else {
|
||||
for (int i = 0; commands[command].input[i] != ARGTYPE_NONE; i++) {
|
||||
char tmp[16];
|
||||
char tmp[32];
|
||||
bool var = false;
|
||||
int value;
|
||||
switch (commands[command].input[i]) {
|
||||
@@ -1663,13 +1902,14 @@ void CRunningScript::LogBeforeProcessingCommand(int32 command)
|
||||
case ARGTYPE_STRING: sprintf(tmp, " '%s'", (const char*)&CTheScripts::ScriptSpace[m_nIp]); m_nIp += KEY_LENGTH_IN_SCRIPT; break;
|
||||
case ARGTYPE_LABEL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value)); break;
|
||||
case ARGTYPE_BOOL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s)" : " %s", value ? "TRUE" : "FALSE"); break;
|
||||
case ARGTYPE_ANDOR: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, " %d %ss", (value + 1) % 10, value / 10 == 0 ? "AND" : "OR"); break;
|
||||
case ARGTYPE_ANDOR: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, " %d %ss", (value) % 10, value / 10 == 0 ? "AND" : "OR"); break;
|
||||
default: script_assert(0);
|
||||
}
|
||||
strcat(commandInfo, tmp);
|
||||
if (commands[command].position == i)
|
||||
strcat(commandInfo, commands[command].name_override);
|
||||
}
|
||||
}
|
||||
uint32 t = m_nIp;
|
||||
m_nIp = storedIp;
|
||||
storedIp = t;
|
||||
@@ -1686,8 +1926,9 @@ void CRunningScript::LogAfterProcessingCommand(int32 command)
|
||||
uint32 t = m_nIp;
|
||||
m_nIp = storedIp;
|
||||
storedIp = t;
|
||||
if (commands[command].input[0] != ARGTYPE_FUNCTION) {
|
||||
for (int i = 0; commands[command].output[i] != ARGTYPE_NONE; i++) {
|
||||
char tmp[16];
|
||||
char tmp[32];
|
||||
switch (commands[command].output[i]) {
|
||||
case ARGTYPE_INT:
|
||||
case ARGTYPE_PED_HANDLE:
|
||||
@@ -1697,6 +1938,7 @@ void CRunningScript::LogAfterProcessingCommand(int32 command)
|
||||
default: script_assert(0 && "Script only returns INTs and FLOATs");
|
||||
}
|
||||
}
|
||||
}
|
||||
m_nIp = storedIp;
|
||||
}
|
||||
PrintToLog("%s\n", commandInfo);
|
||||
@@ -1710,8 +1952,6 @@ void CRunningScript::LogAfterProcessingCommand(int32 command)
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef MISSION_SWITCHER
|
||||
void
|
||||
CTheScripts::SwitchToMission(int32 mission)
|
||||
@@ -1745,21 +1985,19 @@ CTheScripts::SwitchToMission(int32 mission)
|
||||
#endif
|
||||
#endif
|
||||
CTimer::Suspend();
|
||||
int offset = CTheScripts::MultiScriptArray[mission];
|
||||
#ifdef USE_DEBUG_SCRIPT_LOADER
|
||||
int handle = OpenScript();
|
||||
#else
|
||||
CFileMgr::ChangeDir("\\");
|
||||
int handle = CFileMgr::OpenFile("data\\main.scm", "rb");
|
||||
#endif
|
||||
CFileMgr::Seek(handle, offset, 0);
|
||||
CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[SIZE_MAIN_SCRIPT], SIZE_MISSION_SCRIPT);
|
||||
CFileMgr::CloseFile(handle);
|
||||
CRunningScript* pMissionScript = CTheScripts::StartNewScript(SIZE_MAIN_SCRIPT);
|
||||
int offset = CTheScripts::MultiScriptArray[mission] + 8;
|
||||
int size = CTheScripts::MultiScriptArray[mission + 1] - CTheScripts::MultiScriptArray[mission];
|
||||
if (size <= 0)
|
||||
size = CTheScripts::LargestMissionScriptSize;
|
||||
CFileMgr::Seek(gScriptsFile, offset, 0);
|
||||
CFileMgr::Read(gScriptsFile, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], size);
|
||||
CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize);
|
||||
CTimer::Resume();
|
||||
pMissionScript->m_bIsMissionScript = true;
|
||||
pMissionScript->m_bMissionFlag = true;
|
||||
CTheScripts::bAlreadyRunningAMissionScript = true;
|
||||
memset(&CTheScripts::ScriptSpace[CTheScripts::NumTrueGlobals * 4 + 8], 0, CTheScripts::MostGlobals * 4);
|
||||
CGameLogic::ClearShortCut();
|
||||
pMissionScript->Process();
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -114,6 +114,32 @@ CTrafficLights::DisplayActualLight(CEntity *ent)
|
||||
|
||||
CBrightLights::RegisterOne(pos1, ent->GetUp(), ent->GetRight(), CVector(0.0f, 0.0f, 0.0f), id + BRIGHTLIGHT_TRAFFIC_GREEN);
|
||||
CBrightLights::RegisterOne(pos2, ent->GetUp(), -ent->GetRight(), CVector(0.0f, 0.0f, 0.0f), id + BRIGHTLIGHT_TRAFFIC_GREEN);
|
||||
|
||||
// TODO(LCS): check coordinates
|
||||
static const float top = -0.127f;
|
||||
static const float bot = -0.539f;
|
||||
static const float mid = bot + (top - bot) / 3.0f;
|
||||
static const float left = 1.256f;
|
||||
static const float right = 0.706f;
|
||||
phase = CTrafficLights::LightForPeds();
|
||||
if (phase == PED_LIGHTS_DONT_WALK) {
|
||||
CVector p0(2.7f, right, top);
|
||||
CVector p1(2.7f, left, top);
|
||||
CVector p2(2.7f, right, mid);
|
||||
CVector p3(2.7f, left, mid);
|
||||
CShinyTexts::RegisterOne(ent->GetMatrix() * p0, ent->GetMatrix() * p1, ent->GetMatrix() * p2, ent->GetMatrix() * p3,
|
||||
1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||
SHINYTEXT_WALK, 255, 0, 0, 60.0f);
|
||||
}
|
||||
else if (phase == PED_LIGHTS_WALK || CTimer::GetTimeInMilliseconds() & 0x100) {
|
||||
CVector p0(2.7f, right, mid);
|
||||
CVector p1(2.7f, left, mid);
|
||||
CVector p2(2.7f, right, bot);
|
||||
CVector p3(2.7f, left, bot);
|
||||
CShinyTexts::RegisterOne(ent->GetMatrix() * p0, ent->GetMatrix() * p1, ent->GetMatrix() * p2, ent->GetMatrix() * p3,
|
||||
1.0f, 0.5f, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||
SHINYTEXT_WALK, 255, 255, 255, 60.0f);
|
||||
}
|
||||
}
|
||||
else if (MI_TRAFFICLIGHTS_VERTICAL == m) {
|
||||
CBaseModelInfo* mi = CModelInfo::GetModelInfo(ent->GetModelIndex());
|
||||
|
||||
@@ -81,7 +81,7 @@ CAnimViewer::Initialise(void) {
|
||||
CCollision::Init();
|
||||
CWorld::Initialise();
|
||||
mod_HandlingManager.Initialise();
|
||||
CTempColModels::Initialise();
|
||||
gpTempColModels->Initialise();
|
||||
CAnimManager::Initialise();
|
||||
CModelInfo::Initialise();
|
||||
CParticle::Initialise();
|
||||
@@ -92,7 +92,7 @@ CAnimViewer::Initialise(void) {
|
||||
CFileLoader::LoadLevel("DATA\\DEFAULT.DAT");
|
||||
CFileLoader::LoadLevel("DATA\\ANIMVIEWER.DAT");
|
||||
CStreaming::Init();
|
||||
for(int i = 0; i < MODELINFOSIZE; i++)
|
||||
for(int i = 0; i < CModelInfo::GetNumModelInfos(); i++)
|
||||
if(CModelInfo::GetModelInfo(i))
|
||||
CModelInfo::GetModelInfo(i)->ConvertAnimFileIndex();
|
||||
CStreaming::LoadInitialPeds();
|
||||
@@ -166,7 +166,7 @@ LastPedModelId(int modelId)
|
||||
{
|
||||
CBaseModelInfo *model;
|
||||
for(;;){
|
||||
assert(modelId < MODELINFOSIZE);
|
||||
assert(modelId < CModelInfo::GetNumModelInfos());
|
||||
model = CModelInfo::GetModelInfo(modelId);
|
||||
if (model && model->GetModelType() == MITYPE_PED)
|
||||
break;
|
||||
@@ -180,7 +180,7 @@ FirstCarModelId(int modelId)
|
||||
{
|
||||
CBaseModelInfo *model;
|
||||
for(;;){
|
||||
assert(modelId < MODELINFOSIZE);
|
||||
assert(modelId < CModelInfo::GetNumModelInfos());
|
||||
model = CModelInfo::GetModelInfo(modelId);
|
||||
if (model && model->GetModelType() == MITYPE_VEHICLE)
|
||||
break;
|
||||
@@ -200,7 +200,7 @@ NextModelId(int modelId, int wantedChange)
|
||||
|
||||
while(tryCount != 0) {
|
||||
modelId += wantedChange;
|
||||
if (modelId < 0 || modelId >= MODELINFOSIZE) {
|
||||
if (modelId < 0 || modelId >= CModelInfo::GetNumModelInfos()) {
|
||||
tryCount--;
|
||||
wantedChange = -wantedChange;
|
||||
} else if (modelId != 5 && modelId != 6 && modelId != 405) {
|
||||
|
||||
+9
-65
@@ -121,6 +121,7 @@ CCam::Process(void)
|
||||
else
|
||||
TargetOrientation = CGeneral::GetATanOfXY(CamTargetEntity->GetForward().x, CamTargetEntity->GetForward().y);
|
||||
|
||||
/* LCS: removed
|
||||
CVector Fwd(0.0f, 0.0f, 0.0f);
|
||||
Fwd.x = CamTargetEntity->GetForward().x;
|
||||
Fwd.y = CamTargetEntity->GetForward().y;
|
||||
@@ -138,6 +139,9 @@ CCam::Process(void)
|
||||
else
|
||||
TargetSpeedVar = -Min(Sqrt(SQR(FwdSpeedX) + SQR(FwdSpeedY))/1.8f, 0.5f);
|
||||
SpeedVar = 0.895f*SpeedVar + 0.105*TargetSpeedVar;
|
||||
*/
|
||||
SpeedVar = 0.0f;
|
||||
TargetSpeedVar = 0.0f;
|
||||
}else{
|
||||
if(CamTargetEntity == FindPlayerPed()){
|
||||
// Some fancy smoothing of player position and speed
|
||||
@@ -5059,6 +5063,11 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
// Using GetCarGun(LR/UD) will give us same unprocessed RightStick value as SA
|
||||
float stickX = -(pad->GetCarGunLeftRight());
|
||||
float stickY = -pad->GetCarGunUpDown();
|
||||
// HACK to disable rotation on tank for now
|
||||
if(car->GetModelIndex() == MI_RHINO){
|
||||
stickX = 0.0f;
|
||||
stickY = 0.0f;
|
||||
}
|
||||
|
||||
// In SA this checks for m_bUseMouse3rdPerson so num2 / num8 do not move camera
|
||||
// when Keyboard & Mouse controls are used. To make it work better with III/VC, check for actual pad state instead
|
||||
@@ -5353,70 +5362,5 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
// SA
|
||||
// gTargetCoordsForLookingBehind = TargetCoors;
|
||||
|
||||
// SA code from CAutomobile::TankControl/FireTruckControl.
|
||||
if (car->GetModelIndex() == MI_RHINO || car->GetModelIndex() == MI_FIRETRUCK) {
|
||||
|
||||
float &carGunLR = ((CAutomobile*)car)->m_fCarGunLR;
|
||||
CVector hi = Multiply3x3(Front, car->GetMatrix());
|
||||
|
||||
// III/VC's firetruck turret angle is reversed
|
||||
float angleToFace = (car->GetModelIndex() == MI_FIRETRUCK ? -hi.Heading() : hi.Heading());
|
||||
|
||||
if (angleToFace <= carGunLR + PI) {
|
||||
if (angleToFace < carGunLR - PI)
|
||||
angleToFace = angleToFace + TWOPI;
|
||||
} else {
|
||||
angleToFace = angleToFace - TWOPI;
|
||||
}
|
||||
|
||||
float neededTurn = angleToFace - carGunLR;
|
||||
float turnPerFrame = CTimer::GetTimeStep() * (car->GetModelIndex() == MI_FIRETRUCK ? 0.05f : 0.015f);
|
||||
if (neededTurn <= turnPerFrame) {
|
||||
if (neededTurn < -turnPerFrame)
|
||||
angleToFace = carGunLR - turnPerFrame;
|
||||
} else {
|
||||
angleToFace = turnPerFrame + carGunLR;
|
||||
}
|
||||
|
||||
if (car->GetModelIndex() == MI_RHINO && carGunLR != angleToFace) {
|
||||
DMAudio.PlayOneShot(car->m_audioEntityId, SOUND_CAR_TANK_TURRET_ROTATE, Abs(angleToFace - carGunLR));
|
||||
}
|
||||
carGunLR = angleToFace;
|
||||
|
||||
if (carGunLR < -PI) {
|
||||
carGunLR += TWOPI;
|
||||
} else if (carGunLR > PI) {
|
||||
carGunLR -= TWOPI;
|
||||
}
|
||||
|
||||
// Because firetruk turret also has Y movement
|
||||
if (car->GetModelIndex() == MI_FIRETRUCK) {
|
||||
float &carGunUD = ((CAutomobile*)car)->m_fCarGunUD;
|
||||
|
||||
float alphaToFace = Atan2(hi.z, hi.Magnitude2D()) + DEGTORAD(15.0f);
|
||||
float neededAlphaTurn = alphaToFace - carGunUD;
|
||||
float alphaTurnPerFrame = CTimer::GetTimeStepInSeconds();
|
||||
|
||||
if (neededAlphaTurn > alphaTurnPerFrame) {
|
||||
neededTurn = alphaTurnPerFrame;
|
||||
carGunUD = neededTurn + carGunUD;
|
||||
} else {
|
||||
if (neededAlphaTurn >= -alphaTurnPerFrame) {
|
||||
carGunUD = alphaToFace;
|
||||
} else {
|
||||
carGunUD = carGunUD - alphaTurnPerFrame;
|
||||
}
|
||||
}
|
||||
|
||||
float turretMinY = -DEGTORAD(20.0f);
|
||||
float turretMaxY = DEGTORAD(20.0f);
|
||||
if (turretMinY <= carGunUD) {
|
||||
if (carGunUD > turretMaxY)
|
||||
carGunUD = turretMaxY;
|
||||
} else {
|
||||
carGunUD = turretMinY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
+5
-3
@@ -114,6 +114,7 @@ CCamera::Init(void)
|
||||
m_1rstPersonRunCloseToAWall = false;
|
||||
m_fPositionAlongSpline = 0.0f;
|
||||
m_bCameraJustRestored = false;
|
||||
m_bFreezePedZoomSwitch = false;
|
||||
Cams[0].Init();
|
||||
Cams[1].Init();
|
||||
Cams[2].Init();
|
||||
@@ -985,7 +986,7 @@ CCamera::CamControl(void)
|
||||
// Change user selected mode
|
||||
if(CPad::GetPad(0)->CycleCameraModeUpJustDown() && !CReplay::IsPlayingBack() &&
|
||||
(m_bLookingAtPlayer || WhoIsInControlOfTheCamera == CAMCONTROL_OBBE) &&
|
||||
!m_WideScreenOn && !m_bFailedCullZoneTestPreviously && !m_bFirstPersonBeingUsed){
|
||||
!m_WideScreenOn && !m_bFailedCullZoneTestPreviously && !m_bFirstPersonBeingUsed && !m_bFreezePedZoomSwitch){
|
||||
if(FrontEndMenuManager.m_ControlMethod == CONTROL_STANDARD){
|
||||
if(PedZoomIndicator == CAM_ZOOM_3)
|
||||
PedZoomIndicator = CAM_ZOOM_1;
|
||||
@@ -3863,7 +3864,7 @@ CCamera::GetScreenFadeStatus(void)
|
||||
}
|
||||
|
||||
|
||||
|
||||
//--LCS: TODO
|
||||
void
|
||||
CCamera::RenderMotionBlur(void)
|
||||
{
|
||||
@@ -3872,7 +3873,8 @@ CCamera::RenderMotionBlur(void)
|
||||
|
||||
CMBlur::MotionBlurRender(m_pRwCamera,
|
||||
m_BlurRed, m_BlurGreen, m_BlurBlue,
|
||||
m_motionBlur, m_BlurType, m_imotionBlurAddAlpha);
|
||||
// m_motionBlur, m_BlurType, m_imotionBlurAddAlpha);
|
||||
m_motionBlur, m_BlurType, 32); // hack hack
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -368,6 +368,7 @@ public:
|
||||
bool m_bVehicleSuspenHigh;
|
||||
bool m_bEnable1rstPersonCamCntrlsScript;
|
||||
bool m_bAllow1rstPersonWeaponsCamera;
|
||||
bool m_bFreezePedZoomSwitch;
|
||||
bool m_bFailedCullZoneTestPreviously;
|
||||
|
||||
bool m_FadeTargetIsSplashScreen;
|
||||
|
||||
@@ -18,6 +18,7 @@ uint16 CClock::ms_Stored_nGameClockSeconds;
|
||||
uint32 CClock::ms_nMillisecondsPerGameMinute;
|
||||
uint32 CClock::ms_nLastClockTick;
|
||||
bool CClock::ms_bClockHasBeenStored;
|
||||
float CClock::ms_EnvMapTimeMultiplicator;
|
||||
|
||||
#ifndef MASTER
|
||||
bool gbFreezeTime;
|
||||
@@ -33,6 +34,7 @@ CClock::Initialise(uint32 scale)
|
||||
ms_nMillisecondsPerGameMinute = scale;
|
||||
ms_nLastClockTick = CTimer::GetTimeInMilliseconds();
|
||||
ms_bClockHasBeenStored = false;
|
||||
ms_EnvMapTimeMultiplicator = 1.0f;
|
||||
debug("CClock ready\n");
|
||||
#ifndef MASTER
|
||||
VarConsole.Add("Time (hour of day)", &ms_nGameClockHours, 1, 0, 23, true);
|
||||
@@ -134,3 +136,10 @@ CClock::RestoreClock(void)
|
||||
ms_nGameClockMinutes = ms_Stored_nGameClockMinutes;
|
||||
ms_nGameClockSeconds = ms_Stored_nGameClockSeconds;
|
||||
}
|
||||
|
||||
void
|
||||
CClock::CalcEnvMapTimeMultiplicator(void)
|
||||
{
|
||||
float nightness = Abs(ms_nGameClockHours/24.0f - 0.5f);
|
||||
ms_EnvMapTimeMultiplicator = SQR(1.0f - nightness);;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ public:
|
||||
static uint32 ms_nMillisecondsPerGameMinute;
|
||||
static uint32 ms_nLastClockTick;
|
||||
static bool ms_bClockHasBeenStored;
|
||||
static float ms_EnvMapTimeMultiplicator;
|
||||
|
||||
static void Initialise(uint32 scale);
|
||||
static void Update(void);
|
||||
@@ -21,6 +22,8 @@ public:
|
||||
static void StoreClock(void);
|
||||
static void RestoreClock(void);
|
||||
|
||||
static void CalcEnvMapTimeMultiplicator(void);
|
||||
|
||||
static uint8 GetHours(void) { return ms_nGameClockHours; }
|
||||
static uint8 GetMinutes(void) { return ms_nGameClockMinutes; }
|
||||
static int16 GetSeconds(void) { return ms_nGameClockSeconds; }
|
||||
|
||||
+96
-23
@@ -291,7 +291,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
{
|
||||
int i;
|
||||
|
||||
model.boundingSphere.radius = *(float*)(buf);
|
||||
model.boundingSphere.radius = Max(*(float*)(buf), 0.1f);
|
||||
model.boundingSphere.center.x = *(float*)(buf+4);
|
||||
model.boundingSphere.center.y = *(float*)(buf+8);
|
||||
model.boundingSphere.center.z = *(float*)(buf+12);
|
||||
@@ -304,10 +304,13 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
model.numSpheres = *(int16*)(buf+40);
|
||||
buf += 44;
|
||||
if(model.numSpheres > 0){
|
||||
model.spheres = (CColSphere*)RwMalloc(model.numSpheres*sizeof(CColSphere));
|
||||
model.spheres = new CColSphere[model.numSpheres];
|
||||
REGISTER_MEMPTR(&model.spheres);
|
||||
for(i = 0; i < model.numSpheres; i++){
|
||||
model.spheres[i].Set(*(float*)buf, *(CVector*)(buf+4), buf[16], buf[17]);
|
||||
float radius = *(float*)buf;
|
||||
if(radius > model.boundingSphere.radius)
|
||||
model.boundingSphere.radius = radius + 0.01f;
|
||||
model.spheres[i].Set(radius, *(CVector*)(buf+4), buf[16], buf[17]);
|
||||
buf += 20;
|
||||
}
|
||||
}else
|
||||
@@ -316,7 +319,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
model.numLines = *(int16*)buf;
|
||||
buf += 4;
|
||||
if(model.numLines > 0){
|
||||
//model.lines = (CColLine*)RwMalloc(model.numLines*sizeof(CColLine));
|
||||
//model.lines = new CColLine[model.numLines];;
|
||||
REGISTER_MEMPTR(&model.lines);
|
||||
for(i = 0; i < model.numLines; i++){
|
||||
//model.lines[i].Set(*(CVector*)buf, *(CVector*)(buf+12));
|
||||
@@ -330,7 +333,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
model.numBoxes = *(int16*)buf;
|
||||
buf += 4;
|
||||
if(model.numBoxes > 0){
|
||||
model.boxes = (CColBox*)RwMalloc(model.numBoxes*sizeof(CColBox));
|
||||
model.boxes = new CColBox[model.numBoxes];
|
||||
REGISTER_MEMPTR(&model.boxes);
|
||||
for(i = 0; i < model.numBoxes; i++){
|
||||
model.boxes[i].Set(*(CVector*)buf, *(CVector*)(buf+12), buf[24], buf[25]);
|
||||
@@ -342,7 +345,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
int32 numVertices = *(int16*)buf;
|
||||
buf += 4;
|
||||
if(numVertices > 0){
|
||||
model.vertices = (CompressedVector*)RwMalloc(numVertices*sizeof(CompressedVector));
|
||||
model.vertices = new CompressedVector[numVertices];
|
||||
REGISTER_MEMPTR(&model.vertices);
|
||||
for(i = 0; i < numVertices; i++){
|
||||
model.vertices[i].Set(*(float*)buf, *(float*)(buf+4), *(float*)(buf+8));
|
||||
@@ -360,14 +363,64 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname)
|
||||
model.numTriangles = *(int16*)buf;
|
||||
buf += 4;
|
||||
if(model.numTriangles > 0){
|
||||
model.triangles = (CColTriangle*)RwMalloc(model.numTriangles*sizeof(CColTriangle));
|
||||
model.triangles = new CColTriangle[model.numTriangles];
|
||||
REGISTER_MEMPTR(&model.triangles);
|
||||
for(i = 0; i < model.numTriangles; i++){
|
||||
model.triangles[i].Set(*(int32*)buf, *(int32*)(buf+4), *(int32*)(buf+8), buf[12]);
|
||||
buf += 16;
|
||||
|
||||
// skip small triangles
|
||||
CVector vA = model.vertices[model.triangles[i].a].Get();
|
||||
CVector vB = model.vertices[model.triangles[i].b].Get();
|
||||
CVector vC = model.vertices[model.triangles[i].c].Get();
|
||||
float area = CrossProduct(vA - vB, vA - vC).Magnitude();
|
||||
if(area < 0.001f || vA == vB || vA == vC || vB == vC){
|
||||
i--;
|
||||
model.numTriangles--;
|
||||
}
|
||||
}
|
||||
}else
|
||||
model.triangles = nil;
|
||||
|
||||
SplitColTrianglesIntoSections(model);
|
||||
}
|
||||
|
||||
void
|
||||
CFileLoader::SplitColTrianglesIntoSections(CColModel &model)
|
||||
{
|
||||
if(model.triangles == nil || model.numTriangles == 0)
|
||||
return;
|
||||
|
||||
model.numTriBBoxes = 1;
|
||||
model.triBBoxes = new CColTriBBox[1];
|
||||
model.triBBoxes[0].first = 0;
|
||||
model.triBBoxes[0].last = model.numTriangles-1;
|
||||
CVector v = model.vertices[model.triangles[0].a].Get();
|
||||
model.triBBoxes[0].Set(v, v);
|
||||
|
||||
for(int i = 0; i < model.numTriangles; i++){
|
||||
CVector vA = model.vertices[model.triangles[i].a].Get();
|
||||
CVector vB = model.vertices[model.triangles[i].b].Get();
|
||||
CVector vC = model.vertices[model.triangles[i].c].Get();
|
||||
model.triBBoxes[0].min.x = Min(vA.x, model.triBBoxes[0].min.x);
|
||||
model.triBBoxes[0].min.y = Min(vA.y, model.triBBoxes[0].min.y);
|
||||
model.triBBoxes[0].min.z = Min(vA.z, model.triBBoxes[0].min.z);
|
||||
model.triBBoxes[0].min.x = Min(vB.x, model.triBBoxes[0].min.x);
|
||||
model.triBBoxes[0].min.y = Min(vB.y, model.triBBoxes[0].min.y);
|
||||
model.triBBoxes[0].min.z = Min(vB.z, model.triBBoxes[0].min.z);
|
||||
model.triBBoxes[0].min.x = Min(vC.x, model.triBBoxes[0].min.x);
|
||||
model.triBBoxes[0].min.y = Min(vC.y, model.triBBoxes[0].min.y);
|
||||
model.triBBoxes[0].min.z = Min(vC.z, model.triBBoxes[0].min.z);
|
||||
model.triBBoxes[0].max.x = Max(vA.x, model.triBBoxes[0].max.x);
|
||||
model.triBBoxes[0].max.y = Max(vA.y, model.triBBoxes[0].max.y);
|
||||
model.triBBoxes[0].max.z = Max(vA.z, model.triBBoxes[0].max.z);
|
||||
model.triBBoxes[0].max.x = Max(vB.x, model.triBBoxes[0].max.x);
|
||||
model.triBBoxes[0].max.y = Max(vB.y, model.triBBoxes[0].max.y);
|
||||
model.triBBoxes[0].max.z = Max(vB.z, model.triBBoxes[0].max.z);
|
||||
model.triBBoxes[0].max.x = Max(vC.x, model.triBBoxes[0].max.x);
|
||||
model.triBBoxes[0].max.y = Max(vC.y, model.triBBoxes[0].max.y);
|
||||
model.triBBoxes[0].max.z = Max(vC.z, model.triBBoxes[0].max.z);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -608,11 +661,14 @@ CFileLoader::LoadObjectTypes(const char *filename)
|
||||
int section;
|
||||
int pathIndex;
|
||||
int id, pathType;
|
||||
int minID, maxID;
|
||||
//int minID, maxID;
|
||||
|
||||
for(int i = 0; i < ARRAY_SIZE(m_sTempIdeData); i++)
|
||||
m_sTempIdeData[i].id = -1;
|
||||
|
||||
section = NONE;
|
||||
minID = INT32_MAX;
|
||||
maxID = -1;
|
||||
//minID = INT32_MAX;
|
||||
//maxID = -1;
|
||||
pathIndex = -1;
|
||||
debug("Loading object types from %s...\n", filename);
|
||||
|
||||
@@ -636,13 +692,13 @@ CFileLoader::LoadObjectTypes(const char *filename)
|
||||
}else switch(section){
|
||||
case OBJS:
|
||||
id = LoadObject(line);
|
||||
if(id > maxID) maxID = id;
|
||||
if(id < minID) minID = id;
|
||||
//if(id > maxID) maxID = id;
|
||||
//if(id < minID) minID = id;
|
||||
break;
|
||||
case TOBJ:
|
||||
id = LoadTimeObject(line);
|
||||
if(id > maxID) maxID = id;
|
||||
if(id < minID) minID = id;
|
||||
//if(id > maxID) maxID = id;
|
||||
//if(id < minID) minID = id;
|
||||
break;
|
||||
case WEAP:
|
||||
LoadWeaponObject(line);
|
||||
@@ -679,10 +735,10 @@ CFileLoader::LoadObjectTypes(const char *filename)
|
||||
}
|
||||
CFileMgr::CloseFile(fd);
|
||||
|
||||
for(id = minID; id <= maxID; id++){
|
||||
for(id = 0; id < MODELINFOSIZE; id++){
|
||||
CSimpleModelInfo *mi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(id);
|
||||
if(mi && mi->IsBuilding())
|
||||
mi->SetupBigBuilding(minID, maxID);
|
||||
mi->SetupBigBuilding();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -715,6 +771,13 @@ CFileLoader::LoadObject(const char *line)
|
||||
if(sscanf(line, "%d %s %s %d", &id, model, txd, &numObjs) != 4)
|
||||
return 0; // game returns return value
|
||||
|
||||
for(int i = 0; i < ARRAY_SIZE(m_sTempIdeData); i++)
|
||||
if(m_sTempIdeData[i].id == -1){
|
||||
m_sTempIdeData[i].id = id;
|
||||
strcpy(m_sTempIdeData[i].name, model);
|
||||
break;
|
||||
}
|
||||
|
||||
switch(numObjs){
|
||||
case 1:
|
||||
sscanf(line, "%d %s %s %d %f %d",
|
||||
@@ -763,6 +826,13 @@ CFileLoader::LoadTimeObject(const char *line)
|
||||
if(sscanf(line, "%d %s %s %d", &id, model, txd, &numObjs) != 4)
|
||||
return 0; // game returns return value
|
||||
|
||||
for(int i = 0; i < ARRAY_SIZE(m_sTempIdeData); i++)
|
||||
if(m_sTempIdeData[i].id < 0){
|
||||
m_sTempIdeData[i].id = id;
|
||||
strcpy(m_sTempIdeData[i].name, model);
|
||||
break;
|
||||
}
|
||||
|
||||
switch(numObjs){
|
||||
case 1:
|
||||
sscanf(line, "%d %s %s %d %f %d %d %d",
|
||||
@@ -793,7 +863,7 @@ CFileLoader::LoadTimeObject(const char *line)
|
||||
mi->m_firstDamaged = damaged;
|
||||
mi->SetTimes(timeOn, timeOff);
|
||||
mi->SetTexDictionary(txd);
|
||||
other = mi->FindOtherTimeModel();
|
||||
other = mi->FindOtherTimeModel(model);
|
||||
if(other)
|
||||
other->SetOtherTimeModel(id);
|
||||
MatchModelString(model, id);
|
||||
@@ -817,7 +887,7 @@ CFileLoader::LoadWeaponObject(const char *line)
|
||||
mi->m_lodDistances[0] = dist;
|
||||
mi->SetTexDictionary(txd);
|
||||
mi->SetAnimFile(animFile);
|
||||
mi->SetColModel(&CTempColModels::ms_colModelWeapon);
|
||||
mi->SetColModel(&gpTempColModels->ms_colModelWeapon);
|
||||
MatchModelString(model, id);
|
||||
return id;
|
||||
}
|
||||
@@ -833,7 +903,7 @@ CFileLoader::LoadClumpObject(const char *line)
|
||||
mi = CModelInfo::AddClumpModel(id);
|
||||
mi->SetModelName(model);
|
||||
mi->SetTexDictionary(txd);
|
||||
mi->SetColModel(&CTempColModels::ms_colModelBBox);
|
||||
mi->SetColModel(&gpTempColModels->ms_colModelBBox);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -845,14 +915,15 @@ CFileLoader::LoadVehicleObject(const char *line)
|
||||
char type[8], handlingId[16], gamename[32], animFile[16], vehclass[12];
|
||||
uint32 frequency, comprules;
|
||||
int32 level, misc;
|
||||
float wheelScale;
|
||||
float wheelScale, normalSplay;
|
||||
CVehicleModelInfo *mi;
|
||||
char *p;
|
||||
|
||||
sscanf(line, "%d %s %s %s %s %s %s %s %d %d %x %d %f",
|
||||
sscanf(line, "%d %s %s %s %s %s %s %s %d %d %x %d %f %f",
|
||||
&id, model, txd,
|
||||
type, handlingId, gamename, animFile, vehclass,
|
||||
&frequency, &level, &comprules, &misc, &wheelScale);
|
||||
&frequency, &level, &comprules, &misc, &wheelScale,
|
||||
&normalSplay);
|
||||
|
||||
mi = CModelInfo::AddVehicleModel(id);
|
||||
mi->SetModelName(model);
|
||||
@@ -872,6 +943,8 @@ CFileLoader::LoadVehicleObject(const char *line)
|
||||
mi->m_vehicleType = VEHICLE_TYPE_BOAT;
|
||||
}else if(strcmp(type, "train") == 0){
|
||||
mi->m_vehicleType = VEHICLE_TYPE_TRAIN;
|
||||
}else if(strcmp(type, "ferry") == 0){
|
||||
mi->m_vehicleType = VEHICLE_TYPE_FERRY;
|
||||
}else if(strcmp(type, "heli") == 0){
|
||||
mi->m_vehicleType = VEHICLE_TYPE_HELI;
|
||||
}else if(strcmp(type, "plane") == 0){
|
||||
@@ -937,7 +1010,7 @@ CFileLoader::LoadPedObject(const char *line)
|
||||
mi->SetModelName(model);
|
||||
mi->SetTexDictionary(txd);
|
||||
mi->SetAnimFile(animFile);
|
||||
mi->SetColModel(&CTempColModels::ms_colModelPed1);
|
||||
mi->SetColModel(&gpTempColModels->ms_colModelPed1);
|
||||
mi->m_pedType = CPedType::FindPedType(pedType);
|
||||
mi->m_pedStatType = CPedStats::GetPedStatType(pedStats);
|
||||
for(animGroupId = 0; animGroupId < NUM_ANIM_ASSOC_GROUPS; animGroupId++)
|
||||
|
||||
@@ -11,6 +11,7 @@ public:
|
||||
static bool LoadCollisionFileFirstTime(uint8 *buffer, uint32 size, uint8 colSlot);
|
||||
static bool LoadCollisionFile(uint8 *buffer, uint32 size, uint8 colSlot);
|
||||
static void LoadCollisionModel(uint8 *buf, struct CColModel &model, char *name);
|
||||
static void SplitColTrianglesIntoSections(CColModel &model);
|
||||
static void LoadModelFile(const char *filename);
|
||||
static RpAtomic *FindRelatedModelInfoCB(RpAtomic *atomic, void *data);
|
||||
static void LoadClumpFile(const char *filename);
|
||||
|
||||
+72
-58
@@ -36,15 +36,16 @@
|
||||
#include "User.h"
|
||||
#include "sampman.h"
|
||||
|
||||
// --LCS: changed a bit to have lcs feel, needs more work
|
||||
// Similar story to Hud.cpp:
|
||||
// Game has colors inlined in code.
|
||||
// For easier modification we collect them here:
|
||||
const CRGBA LABEL_COLOR(255, 150, 225, 255);
|
||||
const CRGBA LABEL_COLOR(115, 173, 216, 255);
|
||||
const CRGBA SELECTIONBORDER_COLOR(25, 130, 70, 255);
|
||||
const CRGBA MENUOPTION_COLOR = LABEL_COLOR;
|
||||
const CRGBA SELECTEDMENUOPTION_COLOR = LABEL_COLOR;
|
||||
const CRGBA HEADER_COLOR = LABEL_COLOR;
|
||||
const CRGBA DARKMENUOPTION_COLOR(195, 90, 165, 255);
|
||||
const CRGBA SELECTEDMENUOPTION_COLOR(255, 255, 255, 255);
|
||||
const CRGBA HEADER_COLOR(197, 0, 0, 255);
|
||||
const CRGBA DARKMENUOPTION_COLOR(115/2, 173/2, 216 / 2, 255);
|
||||
const CRGBA SLIDERON_COLOR(97, 194, 247, 255);
|
||||
const CRGBA SLIDEROFF_COLOR(27, 89, 130, 255);
|
||||
const CRGBA LIST_BACKGROUND_COLOR(49, 101, 148, 130);
|
||||
@@ -53,6 +54,19 @@ const CRGBA RADIO_SELECTOR_COLOR = SLIDEROFF_COLOR;
|
||||
const CRGBA INACTIVE_RADIO_COLOR(100, 100, 255, 100);
|
||||
const CRGBA SCROLLBAR_COLOR = LABEL_COLOR;
|
||||
|
||||
#if 0
|
||||
// Mobile
|
||||
#define DEFAULT_BRIGHTNESS 0x150
|
||||
#define MIN_BRIGHTNESS 180
|
||||
#define MAX_BRIGHTNESS 700
|
||||
#else
|
||||
// PS2, also PSP probably
|
||||
// 8 bars (32 step)
|
||||
#define DEFAULT_BRIGHTNESS 0x120
|
||||
#define MIN_BRIGHTNESS 0x80
|
||||
#define MAX_BRIGHTNESS 0x180
|
||||
#endif
|
||||
|
||||
#define MAP_MIN_SIZE 162.f
|
||||
#define MAP_SIZE_TO_ALLOW_X_MOVE 297.f
|
||||
|
||||
@@ -187,7 +201,7 @@ wchar* CMenuManager::m_pDialogText = nil;
|
||||
#endif
|
||||
|
||||
#define SET_FONT_FOR_MENU_HEADER \
|
||||
CFont::SetRightJustifyOn(); \
|
||||
CFont::SetRightJustifyOff(); \
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING)); \
|
||||
CFont::SetScale(MENU_X(MENUHEADER_WIDTH), MENU_Y(MENUHEADER_HEIGHT)); \
|
||||
CFont::SetDropShadowPosition(0);
|
||||
@@ -472,7 +486,7 @@ CMenuManager::CMenuManager()
|
||||
m_PrefsMusicVolume = 49;
|
||||
m_PrefsRadioStation = 0;
|
||||
m_PrefsStereoMono = 1;
|
||||
m_PrefsBrightness = 256;
|
||||
m_PrefsBrightness = DEFAULT_BRIGHTNESS;
|
||||
m_PrefsLOD = CRenderer::ms_lodDistScale;
|
||||
m_KeyPressedCode = -1;
|
||||
m_bFrontEnd_ReloadObrTxtGxt = false;
|
||||
@@ -719,12 +733,8 @@ CMenuManager::CheckSliderMovement(int value)
|
||||
{
|
||||
switch (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action) {
|
||||
case MENUACTION_BRIGHTNESS:
|
||||
#ifdef FIX_BUGS
|
||||
m_PrefsBrightness += value * (384 / MENUSLIDER_LOGICAL_BARS);
|
||||
#else
|
||||
m_PrefsBrightness += value * 24.19f;
|
||||
#endif
|
||||
m_PrefsBrightness = Clamp(m_PrefsBrightness, 0, 384);
|
||||
m_PrefsBrightness += value * (float)(MAX_BRIGHTNESS - MIN_BRIGHTNESS) / MENUSLIDER_LOGICAL_BARS;
|
||||
m_PrefsBrightness = Clamp(m_PrefsBrightness, MIN_BRIGHTNESS, MAX_BRIGHTNESS);
|
||||
break;
|
||||
case MENUACTION_DRAWDIST:
|
||||
if(value > 0)
|
||||
@@ -960,14 +970,14 @@ CMenuManager::DrawStandardMenus(bool activeScreen)
|
||||
#endif
|
||||
|
||||
switch (m_nCurrScreen) {
|
||||
case MENUPAGE_CHOOSE_LOAD_SLOT:
|
||||
/*case MENUPAGE_CHOOSE_LOAD_SLOT:
|
||||
case MENUPAGE_CHOOSE_DELETE_SLOT:
|
||||
case MENUPAGE_CHOOSE_SAVE_SLOT:
|
||||
CSprite2d::Draw2DPolygon(MENU_X_LEFT_ALIGNED(38.0f), MENU_Y(85.0f),
|
||||
MENU_X_LEFT_ALIGNED(615.0f), MENU_Y(75.0f),
|
||||
MENU_X_LEFT_ALIGNED(30.0f), MENU_Y(320.0f),
|
||||
MENU_X_LEFT_ALIGNED(605.0f), MENU_Y(330.0f), CRGBA(LIST_BACKGROUND_COLOR.r, LIST_BACKGROUND_COLOR.g, LIST_BACKGROUND_COLOR.b, FadeIn(LIST_BACKGROUND_COLOR.a)));
|
||||
break;
|
||||
break;*/
|
||||
case MENUPAGE_SOUND_SETTINGS:
|
||||
PrintRadioSelector();
|
||||
break;
|
||||
@@ -983,11 +993,11 @@ CMenuManager::DrawStandardMenus(bool activeScreen)
|
||||
if (aScreens[m_nCurrScreen].m_ScreenName[0] != '\0') {
|
||||
|
||||
SET_FONT_FOR_MENU_HEADER
|
||||
CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255)));
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName));
|
||||
//CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255)));
|
||||
//CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName));
|
||||
|
||||
CFont::SetColor(CRGBA(HEADER_COLOR.r, HEADER_COLOR.g, HEADER_COLOR.b, FadeIn(255)));
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName));
|
||||
CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get(aScreens[m_nCurrScreen].m_ScreenName));
|
||||
}
|
||||
|
||||
// Label
|
||||
@@ -1063,18 +1073,21 @@ CMenuManager::DrawStandardMenus(bool activeScreen)
|
||||
#endif
|
||||
wchar* rightText = nil;
|
||||
wchar* leftText;
|
||||
if (aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot >= SAVESLOT_1 && aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot <= SAVESLOT_8) {
|
||||
/*if (aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot >= SAVESLOT_1 && aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot <= SAVESLOT_8) {
|
||||
CFont::SetColor(CRGBA(0, 0, 0, FadeIn(255)));
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetScale(MENU_X(MEDIUMTEXT_X_SCALE), MENU_Y(MEDIUMTEXT_Y_SCALE));
|
||||
CFont::SetDropShadowPosition(0);
|
||||
} else {
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
|
||||
} else {*/
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE));
|
||||
CFont::SetDropShadowPosition(2);
|
||||
CFont::SetDropColor(CRGBA(0, 0, 0, FadeIn(255)));
|
||||
CFont::SetColor(CRGBA(MENUOPTION_COLOR.r, MENUOPTION_COLOR.g, MENUOPTION_COLOR.b, FadeIn(255)));
|
||||
}
|
||||
if (i == m_nCurrOption && itemsAreSelectable)
|
||||
CFont::SetColor(CRGBA(SELECTEDMENUOPTION_COLOR.r, SELECTEDMENUOPTION_COLOR.g, SELECTEDMENUOPTION_COLOR.b, FadeIn(255)));
|
||||
else
|
||||
CFont::SetColor(CRGBA(MENUOPTION_COLOR.r, MENUOPTION_COLOR.g, MENUOPTION_COLOR.b, FadeIn(255)));
|
||||
//}
|
||||
if (aScreens[m_nCurrScreen].m_aEntries[i].m_Align == MENUALIGN_LEFT) {
|
||||
CFont::SetCentreOff();
|
||||
CFont::SetRightJustifyOff();
|
||||
@@ -1434,7 +1447,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen)
|
||||
// Actually bottomRight and bottomLeft should be exchanged here(although this is original code).
|
||||
// So this shows us either R* didn't use same struct for menu BG and highlight, or they just kept fields as x1,y1 etc. Yikes.
|
||||
|
||||
if (m_nOptionHighlightTransitionBlend == 0) {
|
||||
/*if (m_nOptionHighlightTransitionBlend == 0) {
|
||||
if (m_firstStartCounter == 255 && m_nMenuFadeAlpha == 255 && !bMenuChangeOngoing) {
|
||||
CSprite2d::Draw2DPolygon(MENU_X_LEFT_ALIGNED(menuOptionHighlight.topLeft_x), MENU_Y(menuOptionHighlight.topLeft_y),
|
||||
MENU_X_LEFT_ALIGNED(menuOptionHighlight.topRight_x), MENU_Y(menuOptionHighlight.topRight_y),
|
||||
@@ -1470,7 +1483,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen)
|
||||
MENU_X_LEFT_ALIGNED(menuOptionHighlight.bottomRight_x), MENU_Y(menuOptionHighlight.bottomRight_y),
|
||||
MENU_X_LEFT_ALIGNED(menuOptionHighlight.bottomLeft_x), MENU_Y(menuOptionHighlight.bottomLeft_y), SELECTIONBORDER_COLOR);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
static uint32 lastBlendChange = 0;
|
||||
if (m_nOptionHighlightTransitionBlend <= 255) {
|
||||
@@ -1502,7 +1515,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen)
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetScale(MENU_X(MEDIUMTEXT_X_SCALE), MENU_Y(MEDIUMTEXT_Y_SCALE));
|
||||
} else {
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE));
|
||||
}
|
||||
CFont::PrintString(MENU_X_LEFT_ALIGNED(DEFAULT_SCREEN_WIDTH - RIGHT_ALIGNED_TEXT_RIGHT_MARGIN(xMargin)), MENU_Y(aScreens[m_nCurrScreen].m_aEntries[i].m_Y MINUS_SCROLL_OFFSET), rightText);
|
||||
@@ -1558,7 +1571,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen)
|
||||
int lastActiveBarX;
|
||||
switch (aScreens[m_nCurrScreen].m_aEntries[i].m_Action) {
|
||||
case MENUACTION_BRIGHTNESS:
|
||||
ProcessSlider(m_PrefsBrightness / 384.0f, SLIDER_Y(70.0f), HOVEROPTION_INCREASE_BRIGHTNESS, HOVEROPTION_DECREASE_BRIGHTNESS, SCREEN_WIDTH, true);
|
||||
ProcessSlider((float)(m_PrefsBrightness - MIN_BRIGHTNESS) / (MAX_BRIGHTNESS - MIN_BRIGHTNESS), SLIDER_Y(70.0f), HOVEROPTION_INCREASE_BRIGHTNESS, HOVEROPTION_DECREASE_BRIGHTNESS, SCREEN_WIDTH, true);
|
||||
break;
|
||||
case MENUACTION_DRAWDIST:
|
||||
ProcessSlider((m_PrefsLOD - 0.925f) / 0.875f, SLIDER_Y(99.0f), HOVEROPTION_INCREASE_DRAWDIST, HOVEROPTION_DECREASE_DRAWDIST, SCREEN_WIDTH, true);
|
||||
@@ -2096,18 +2109,18 @@ CMenuManager::DrawControllerSetupScreen()
|
||||
// Shadow
|
||||
CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255)));
|
||||
|
||||
if (m_ControlMethod == CONTROL_STANDARD)
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_STI"));
|
||||
else if (m_ControlMethod == CONTROL_CLASSIC)
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_CTI"));
|
||||
//if (m_ControlMethod == CONTROL_STANDARD)
|
||||
// CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_STI"));
|
||||
//else if (m_ControlMethod == CONTROL_CLASSIC)
|
||||
// CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_CTI"));
|
||||
|
||||
// Real header
|
||||
CFont::SetColor(CRGBA(HEADER_COLOR.r, HEADER_COLOR.g, HEADER_COLOR.b, FadeIn(255)));
|
||||
|
||||
if (m_ControlMethod == CONTROL_STANDARD)
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_STI"));
|
||||
CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_STI"));
|
||||
else if (m_ControlMethod == CONTROL_CLASSIC)
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_CTI"));
|
||||
CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_CTI"));
|
||||
|
||||
wchar *actionTexts[33];
|
||||
actionTexts[0] = TheText.Get("FEC_FIR");
|
||||
@@ -2260,7 +2273,7 @@ CMenuManager::DrawControllerSetupScreen()
|
||||
}
|
||||
|
||||
// Back button and it's shadow
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE));
|
||||
CFont::SetRightJustifyOn();
|
||||
CFont::SetDropShadowPosition(2);
|
||||
@@ -2319,7 +2332,7 @@ CMenuManager::DrawBackground(bool transitionCall)
|
||||
PrintMap();
|
||||
|
||||
// Left border
|
||||
CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT,
|
||||
/*CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT,
|
||||
SCREEN_STRETCH_X(menuBg.topLeft_x), SCREEN_STRETCH_Y(menuBg.topLeft_y), 0.0f, 0.0f, CRGBA(0, 0, 0, 255));
|
||||
|
||||
// Top border
|
||||
@@ -2332,7 +2345,7 @@ CMenuManager::DrawBackground(bool transitionCall)
|
||||
|
||||
// Right border
|
||||
CSprite2d::Draw2DPolygon(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_STRETCH_X(menuBg.bottomRight_x), SCREEN_STRETCH_Y(menuBg.bottomRight_y),
|
||||
SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255));
|
||||
SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255));*/
|
||||
} else {
|
||||
m_nMenuFadeAlpha = 255;
|
||||
m_firstStartCounter = 255;
|
||||
@@ -2341,7 +2354,7 @@ CMenuManager::DrawBackground(bool transitionCall)
|
||||
PrintMap();
|
||||
|
||||
// Left border
|
||||
CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT,
|
||||
/*CSprite2d::Draw2DPolygon(SCREEN_STRETCH_X(menuBg.bottomLeft_x), SCREEN_STRETCH_Y(menuBg.bottomLeft_y), 0.0f, SCREEN_HEIGHT,
|
||||
SCREEN_STRETCH_X(menuBg.topLeft_x), SCREEN_STRETCH_Y(menuBg.topLeft_y), 0.0f, 0.0f, CRGBA(0, 0, 0, 255));
|
||||
|
||||
// Top border
|
||||
@@ -2354,7 +2367,7 @@ CMenuManager::DrawBackground(bool transitionCall)
|
||||
|
||||
// Right border
|
||||
CSprite2d::Draw2DPolygon(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_STRETCH_X(menuBg.bottomRight_x), SCREEN_STRETCH_Y(menuBg.bottomRight_y),
|
||||
SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255));
|
||||
SCREEN_WIDTH, 0.0f, SCREEN_STRETCH_X(menuBg.topRight_x), SCREEN_STRETCH_Y(menuBg.topRight_y), CRGBA(0, 0, 0, 255));*/
|
||||
}
|
||||
} else {
|
||||
menuBg.SaveCurrentCoors();
|
||||
@@ -2444,9 +2457,9 @@ CMenuManager::DrawBackground(bool transitionCall)
|
||||
if (CTimer::GetTimeInMillisecondsPauseMode() - LastFade > 30
|
||||
|| forceFadeInCounter > 30
|
||||
) {
|
||||
m_nMenuFadeAlpha += 20;
|
||||
m_nMenuFadeAlpha += 50;
|
||||
if (m_firstStartCounter < 255) {
|
||||
m_firstStartCounter = Min(m_firstStartCounter + 20, 255);
|
||||
m_firstStartCounter = Min(m_firstStartCounter + 50, 255);
|
||||
}
|
||||
LastFade = CTimer::GetTimeInMillisecondsPauseMode();
|
||||
#ifdef FIX_BUGS
|
||||
@@ -2505,12 +2518,12 @@ CMenuManager::DrawBackground(bool transitionCall)
|
||||
CFont::DrawFonts();
|
||||
SetFrontEndRenderStates();
|
||||
|
||||
if (m_nCurrScreen != MENUPAGE_OUTRO)
|
||||
if (m_firstStartCounter == 255) {
|
||||
m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, 255));
|
||||
} else {
|
||||
m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, FadeIn(255)));
|
||||
}
|
||||
//if (m_nCurrScreen != MENUPAGE_OUTRO)
|
||||
// if (m_firstStartCounter == 255) {
|
||||
// m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, 255));
|
||||
// } else {
|
||||
// m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(27.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, FadeIn(255)));
|
||||
// }
|
||||
|
||||
if (m_ShowEmptyBindingError) {
|
||||
static uint32 lastBindingError = CTimer::GetTimeInMillisecondsPauseMode();
|
||||
@@ -2629,11 +2642,11 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen)
|
||||
MENU_X_RIGHT_ALIGNED(PLAYERSETUP_LIST_RIGHT), SCREEN_SCALE_FROM_BOTTOM(PLAYERSETUP_LIST_BOTTOM)), CRGBA(LIST_BACKGROUND_COLOR.r, LIST_BACKGROUND_COLOR.g, LIST_BACKGROUND_COLOR.b, FadeIn(LIST_BACKGROUND_COLOR.a)));
|
||||
|
||||
SET_FONT_FOR_MENU_HEADER
|
||||
CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255)));
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_PS"));
|
||||
//CFont::SetColor(CRGBA(30, 30, 30, FadeIn(255)));
|
||||
//CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X) - MENU_X(7.f), SCREEN_SCALE_Y(MENUHEADER_POS_Y + 7.f), TheText.Get("FET_PS"));
|
||||
|
||||
CFont::SetColor(CRGBA(HEADER_COLOR.r, HEADER_COLOR.g, HEADER_COLOR.b, FadeIn(255)));
|
||||
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_PS"));
|
||||
CFont::PrintString(SCREEN_STRETCH_X(MENUHEADER_POS_X), SCREEN_SCALE_Y(MENUHEADER_POS_Y), TheText.Get("FET_PS"));
|
||||
|
||||
// Header (Skin - Date)
|
||||
if (m_nCurrExLayer == HOVEROPTION_LIST) {
|
||||
@@ -2813,7 +2826,7 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen)
|
||||
|
||||
// Big apply button
|
||||
if (strcmp(m_aSkinName, m_PrefsSkinFile) != 0) {
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
switch (m_PrefsLanguage) {
|
||||
case LANGUAGE_FRENCH:
|
||||
CFont::SetScale(MENU_X(1.1f), MENU_Y(1.9f));
|
||||
@@ -2833,7 +2846,7 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen)
|
||||
CFont::SetRightJustifyOff();
|
||||
CFont::PrintString(MENU_X_LEFT_ALIGNED(24.0f), MENU_Y(220.0f), TheText.Get("FET_APP"));
|
||||
}
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
|
||||
CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE));
|
||||
|
||||
@@ -2905,7 +2918,7 @@ CMenuManager::DrawPlayerSetupScreen(bool activeScreen)
|
||||
m_nHoverOption = HOVEROPTION_NOT_HOVERING;
|
||||
}
|
||||
}
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE));
|
||||
CFont::SetRightJustifyOn();
|
||||
CFont::SetColor(CRGBA(MENUOPTION_COLOR.r, MENUOPTION_COLOR.g, MENUOPTION_COLOR.b, FadeIn(255)));
|
||||
@@ -3341,7 +3354,7 @@ CMenuManager::SmallMessageScreen(const char* text)
|
||||
void
|
||||
CMenuManager::PrintBriefs()
|
||||
{
|
||||
CFont::SetColor(CRGBA(0, 0, 0, FadeIn(255)));
|
||||
CFont::SetColor(CRGBA(255, 255, 255, FadeIn(255)));
|
||||
CFont::SetRightJustifyOff();
|
||||
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
|
||||
CFont::SetScale(MENU_X(MEDIUMTEXT_X_SCALE), MENU_Y(MEDIUMTEXT_Y_SCALE));
|
||||
@@ -3497,9 +3510,9 @@ CMenuManager::Process(void)
|
||||
#ifdef XBOX_MESSAGE_SCREEN
|
||||
ProcessDialogTimer();
|
||||
#endif
|
||||
|
||||
if (TheCamera.GetScreenFadeStatus() != FADE_0)
|
||||
return;
|
||||
// tmp hack to get saving to work
|
||||
//if (TheCamera.GetScreenFadeStatus() != FADE_0)
|
||||
// return;
|
||||
|
||||
InitialiseChangedLanguageSettings();
|
||||
|
||||
@@ -4836,7 +4849,8 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u
|
||||
break;
|
||||
case MENUACTION_CANCELGAME:
|
||||
DMAudio.Service();
|
||||
SwitchToNewScreen(MENUPAGE_OUTRO);
|
||||
RsEventHandler(rsQUITAPP, nil);
|
||||
//SwitchToNewScreen(MENUPAGE_OUTRO);
|
||||
break;
|
||||
case MENUACTION_RESUME:
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
@@ -4908,7 +4922,7 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u
|
||||
DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, TRUE);
|
||||
SaveSettings();
|
||||
} else if (m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) {
|
||||
m_PrefsBrightness = 256;
|
||||
m_PrefsBrightness = DEFAULT_BRIGHTNESS;
|
||||
m_PrefsLOD = 1.2f;
|
||||
#ifdef LEGACY_MENU_OPTIONS
|
||||
m_PrefsVsync = true;
|
||||
@@ -5779,7 +5793,7 @@ CMenuManager::DrawQuitGameScreen(void)
|
||||
static CSprite2d *splash = nil;
|
||||
|
||||
if (splash == nil)
|
||||
splash = LoadSplash("OUTRO");
|
||||
splash = LoadSplash("sceelee");
|
||||
|
||||
m_aFrontEndSprites[MENUSPRITE_VCLOGO].Draw(CRect(SCREEN_STRETCH_X(28.0f), MENU_Y(8.0f), SCREEN_STRETCH_X(27.0f) + MENU_X(130.f), MENU_Y(138.0f)), CRGBA(255, 255, 255, 255 - alpha));
|
||||
|
||||
|
||||
+52
-31
@@ -22,6 +22,7 @@
|
||||
#include "Darkel.h"
|
||||
#include "Debug.h"
|
||||
#include "EventList.h"
|
||||
#include "Ferry.h"
|
||||
#include "FileLoader.h"
|
||||
#include "FileMgr.h"
|
||||
#include "Fire.h"
|
||||
@@ -322,7 +323,7 @@ bool CGame::InitialiseOnceAfterRW(void)
|
||||
{
|
||||
TheText.Load();
|
||||
CTimer::Initialise();
|
||||
CTempColModels::Initialise();
|
||||
gpTempColModels->Initialise();
|
||||
mod_HandlingManager.Initialise();
|
||||
CSurfaceTable::Initialise("DATA\\SURFACE.DAT");
|
||||
CPedStats::Initialise();
|
||||
@@ -374,6 +375,9 @@ bool CGame::Initialise(const char* datFile)
|
||||
|
||||
CPools::Initialise();
|
||||
|
||||
if(gMakeResources)
|
||||
CVehicleModelInfo::Load(nil);
|
||||
|
||||
#ifndef GTA_PS2
|
||||
#ifdef PED_CAR_DENSITY_SLIDERS
|
||||
// Load density values from gta3.ini only if our reVC.ini have them 0.6f
|
||||
@@ -384,7 +388,7 @@ bool CGame::Initialise(const char* datFile)
|
||||
#ifdef USE_TEXTURE_POOL
|
||||
_TexturePoolsUnknown(false);
|
||||
#endif
|
||||
currLevel = LEVEL_BEACH;
|
||||
currLevel = LEVEL_INDUSTRIAL;
|
||||
currArea = AREA_MAIN_MAP;
|
||||
|
||||
PUSH_MEMID(MEMID_TEXTURES);
|
||||
@@ -455,7 +459,7 @@ bool CGame::Initialise(const char* datFile)
|
||||
|
||||
CdStreamAddImage("MODELS\\GTA3.IMG");
|
||||
|
||||
CFileLoader::LoadLevel("DATA\\DEFAULT.DAT");
|
||||
// CFileLoader::LoadLevel("DATA\\DEFAULT.DAT");
|
||||
CFileLoader::LoadLevel(datFile);
|
||||
|
||||
LoadingScreen("Loading the Game", "Add Particles", nil);
|
||||
@@ -550,6 +554,7 @@ bool CGame::Initialise(const char* datFile)
|
||||
LoadingScreen("Loading the Game", "Position dynamic objects", nil);
|
||||
LoadingScreen("Loading the Game", "Initialise vehicle paths", nil);
|
||||
|
||||
CFerry::InitFerrys();
|
||||
CTrain::InitTrains();
|
||||
CPlane::InitPlanes();
|
||||
CCredits::Init();
|
||||
@@ -598,7 +603,7 @@ bool CGame::ShutDown(void)
|
||||
CPlane::Shutdown();
|
||||
CTrain::Shutdown();
|
||||
CScriptPaths::Shutdown();
|
||||
CWaterCreatures::RemoveAll();
|
||||
//CWaterCreatures::RemoveAll();
|
||||
CSpecialFX::Shutdown();
|
||||
CGarages::Shutdown();
|
||||
CMovingThings::Shutdown();
|
||||
@@ -649,7 +654,7 @@ bool CGame::ShutDown(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGame::ReInitGameObjectVariables(void)
|
||||
bool CGame::ReInitGameObjectVariables(bool load)
|
||||
{
|
||||
CGameLogic::InitAtStartOfGame();
|
||||
#ifdef PS2_MENU
|
||||
@@ -672,8 +677,9 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
CDraw::SetFOV(120.0f);
|
||||
CDraw::ms_fLODDistance = 500.0f;
|
||||
CStreaming::RequestBigBuildings(LEVEL_GENERIC);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_BEACH);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_MAINLAND);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_INDUSTRIAL);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_COMMERCIAL);
|
||||
CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN);
|
||||
CStreaming::LoadAllRequestedModels(false);
|
||||
currArea = AREA_MAIN_MAP;
|
||||
CPed::Initialise();
|
||||
@@ -693,7 +699,7 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
gPhoneInfo.Initialise();
|
||||
|
||||
PUSH_MEMID(MEMID_SCRIPT);
|
||||
CTheScripts::Init();
|
||||
bool res = CTheScripts::Init(load);
|
||||
CGangs::Initialise();
|
||||
POP_MEMID();
|
||||
|
||||
@@ -706,12 +712,14 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
CStats::Init();
|
||||
CPickups::Init();
|
||||
CPacManPickups::Init();
|
||||
CGarages::Init();
|
||||
if (!load)
|
||||
CGarages::Init();
|
||||
CSpecialFX::Init();
|
||||
CRopes::Init();
|
||||
CWaterCannons::Init();
|
||||
CScriptPaths::Init();
|
||||
CParticle::ReloadConfig();
|
||||
CParticle::SetPixelData();
|
||||
|
||||
#ifdef PS2_MENU
|
||||
if ( !TheMemoryCard.m_bWantToLoad )
|
||||
@@ -723,12 +731,15 @@ void CGame::ReInitGameObjectVariables(void)
|
||||
CTheScripts::StartTestScript();
|
||||
CTheScripts::Process();
|
||||
TheCamera.Process();
|
||||
CFerry::InitFerrys();
|
||||
CTrain::InitTrains();
|
||||
CPlane::InitPlanes();
|
||||
}
|
||||
|
||||
for (int32 i = 0; i < MAX_PADS; i++)
|
||||
CPad::GetPad(i)->Clear(true);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void CGame::ReloadIPLs(void)
|
||||
@@ -759,7 +770,7 @@ void CGame::ShutDownForRestart(void)
|
||||
CRadar::RemoveRadarSections();
|
||||
FrontEndMenuManager.UnloadTextures();
|
||||
CParticleObject::RemoveAllExpireableParticleObjects();
|
||||
CWaterCreatures::RemoveAll();
|
||||
//CWaterCreatures::RemoveAll();
|
||||
CSetPieces::Init();
|
||||
CPedType::Shutdown();
|
||||
CSpecialFX::Shutdown();
|
||||
@@ -799,15 +810,15 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
RestoreForStartLoad();
|
||||
}
|
||||
|
||||
ReInitGameObjectVariables();
|
||||
bool bLoadSuccessful = ReInitGameObjectVariables(FrontEndMenuManager.m_bWantToLoad);
|
||||
|
||||
if ( FrontEndMenuManager.m_bWantToLoad == true )
|
||||
{
|
||||
FrontEndMenuManager.m_bWantToLoad = false;
|
||||
InitRadioStationPositionList();
|
||||
if ( GenericLoad() == true )
|
||||
if ( bLoadSuccessful == true )
|
||||
{
|
||||
DMAudio.ResetTimers(CTimer::GetTimeInMilliseconds());
|
||||
CFerry::InitFerrys();
|
||||
CTrain::InitTrains();
|
||||
CPlane::InitPlanes();
|
||||
}
|
||||
@@ -823,8 +834,8 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
ShutDownForRestart();
|
||||
CTimer::Stop();
|
||||
CTimer::Initialise();
|
||||
FrontEndMenuManager.m_bWantToLoad = false;
|
||||
ReInitGameObjectVariables();
|
||||
//FrontEndMenuManager.m_bWantToLoad = false;
|
||||
ReInitGameObjectVariables(false);
|
||||
currLevel = LEVEL_GENERIC;
|
||||
CCollision::SortOutCollisionAfterLoad();
|
||||
}
|
||||
@@ -833,6 +844,7 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
FrontEndMenuManager.m_bWantToLoad = true;
|
||||
CTimer::Update();
|
||||
|
||||
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
|
||||
@@ -843,6 +855,20 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
|
||||
void CGame::Process(void)
|
||||
{
|
||||
if (FrontEndMenuManager.m_bWantToLoad) {
|
||||
CTheScripts::StartTestScript();
|
||||
CTheScripts::Process();
|
||||
TheCamera.Process();
|
||||
CStreaming::LoadScene(TheCamera.GetPosition());
|
||||
//CGame::GenerateTempPedAtStartOfNetworkGame();
|
||||
if (!CStreaming::HasModelLoaded(MI_PLAYER)){
|
||||
CStreaming::RequestSpecialModel(MI_PLAYER, "player", STREAMFLAGS_DEPENDENCY | STREAMFLAGS_DONT_REMOVE);
|
||||
CStreaming::LoadAllRequestedModels(false);
|
||||
}
|
||||
TheCamera.Process();
|
||||
CStreaming::LoadScene(TheCamera.GetPosition());
|
||||
FrontEndMenuManager.m_bWantToLoad = false;
|
||||
}
|
||||
CPad::UpdatePads();
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
ProcessTidyUpMemory();
|
||||
@@ -864,9 +890,9 @@ void CGame::Process(void)
|
||||
gameProcessPirateCheck = 2;
|
||||
}
|
||||
#endif
|
||||
uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
|
||||
//uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
|
||||
CStreaming::Update();
|
||||
uint32 processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
|
||||
//uint32 processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
|
||||
CWindModifiers::Number = 0;
|
||||
if (!CTimer::GetIsPaused())
|
||||
{
|
||||
@@ -891,6 +917,7 @@ void CGame::Process(void)
|
||||
|
||||
CCollision::Update();
|
||||
CScriptPaths::Update();
|
||||
CFerry::UpdateFerrys();
|
||||
CTrain::UpdateTrains();
|
||||
CPlane::UpdatePlanes();
|
||||
CHeli::UpdateHelis();
|
||||
@@ -905,26 +932,20 @@ void CGame::Process(void)
|
||||
CEventList::Update();
|
||||
CParticle::Update();
|
||||
gFireManager.Update();
|
||||
|
||||
// Otherwise even on 30 fps most probably you won't see any peds around Ocean View Hospital
|
||||
#if defined FIX_BUGS && !defined SQUEEZE_PERFORMANCE
|
||||
if (processTime > 2) {
|
||||
#else
|
||||
if (processTime >= 2) {
|
||||
#endif
|
||||
CPopulation::Update(false);
|
||||
} else {
|
||||
uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
|
||||
//if (processTime >= 2) {
|
||||
// CPopulation::Update(false);
|
||||
//} else {
|
||||
// uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
|
||||
CPopulation::Update(true);
|
||||
processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
|
||||
}
|
||||
// processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
|
||||
//}
|
||||
CWeapon::UpdateWeapons();
|
||||
if (!CCutsceneMgr::IsRunning())
|
||||
CTheCarGenerators::Process();
|
||||
if (!CReplay::IsPlayingBack())
|
||||
CCranes::UpdateCranes();
|
||||
CClouds::Update();
|
||||
CMovingThings::Update();
|
||||
//CMovingThings::Update(); // TODO
|
||||
CWaterCannons::Update();
|
||||
CUserDisplay::Process();
|
||||
CReplay::Update();
|
||||
@@ -955,7 +976,7 @@ void CGame::Process(void)
|
||||
if (!CReplay::IsPlayingBack())
|
||||
{
|
||||
PUSH_MEMID(MEMID_CARS);
|
||||
if (processTime < 2)
|
||||
//if (processTime < 2)
|
||||
CCarCtrl::GenerateRandomCars();
|
||||
CRoadBlocks::GenerateRoadBlocks();
|
||||
CCarCtrl::RemoveDistantCars();
|
||||
|
||||
+6
-4
@@ -3,8 +3,10 @@
|
||||
enum eLevelName {
|
||||
LEVEL_IGNORE = -1, // beware, this is only used in CPhysical's m_nZoneLevel
|
||||
LEVEL_GENERIC = 0,
|
||||
LEVEL_BEACH,
|
||||
LEVEL_MAINLAND,
|
||||
LEVEL_INDUSTRIAL,
|
||||
LEVEL_COMMERCIAL,
|
||||
LEVEL_SUBURBAN,
|
||||
LEVEL_UNDERGROUND,
|
||||
|
||||
NUM_LEVELS
|
||||
};
|
||||
@@ -60,7 +62,7 @@ public:
|
||||
static void FinalShutdown(void);
|
||||
static bool Initialise(const char *datFile);
|
||||
static bool ShutDown(void);
|
||||
static void ReInitGameObjectVariables(void);
|
||||
static bool ReInitGameObjectVariables(bool);
|
||||
static void ReloadIPLs(void);
|
||||
static void ShutDownForRestart(void);
|
||||
static void InitialiseWhenRestarting(void);
|
||||
@@ -78,4 +80,4 @@ public:
|
||||
static void ProcessTidyUpMemory(void);
|
||||
};
|
||||
|
||||
inline bool IsAreaVisible(int area) { return area == CGame::currArea || area == AREA_EVERYWHERE; }
|
||||
inline bool IsAreaVisible(int area) { return true; }
|
||||
|
||||
+4
-30
@@ -6,36 +6,10 @@ class CGeneral
|
||||
{
|
||||
public:
|
||||
static float GetATanOfXY(float x, float y){
|
||||
if(x == 0.0f && y == 0.0f)
|
||||
return 0.0f;
|
||||
float xabs = Abs(x);
|
||||
float yabs = Abs(y);
|
||||
|
||||
if(xabs < yabs){
|
||||
if(y > 0.0f){
|
||||
if(x > 0.0f)
|
||||
return 0.5f*PI - Atan2(x / y, 1.0f);
|
||||
else
|
||||
return 0.5f*PI + Atan2(-x / y, 1.0f);
|
||||
}else{
|
||||
if(x > 0.0f)
|
||||
return 1.5f*PI + Atan2(x / -y, 1.0f);
|
||||
else
|
||||
return 1.5f*PI - Atan2(-x / -y, 1.0f);
|
||||
}
|
||||
}else{
|
||||
if(y > 0.0f){
|
||||
if(x > 0.0f)
|
||||
return Atan2(y / x, 1.0f);
|
||||
else
|
||||
return PI - Atan2(y / -x, 1.0f);
|
||||
}else{
|
||||
if(x > 0.0f)
|
||||
return 2.0f*PI - Atan2(-y / x, 1.0f);
|
||||
else
|
||||
return PI + Atan2(-y / -x, 1.0f);
|
||||
}
|
||||
}
|
||||
float arc = atan2f(y, x);
|
||||
if(arc < 0.0f)
|
||||
arc += TWOPI;
|
||||
return arc;
|
||||
}
|
||||
|
||||
static float LimitAngle(float angle)
|
||||
|
||||
@@ -8,7 +8,12 @@
|
||||
#include "Population.h"
|
||||
|
||||
float CIniFile::PedNumberMultiplier = 0.6f;
|
||||
float CIniFile::CarNumberMultiplier = 0.6f;
|
||||
float CIniFile::CarNumberMultiplier =
|
||||
#ifdef GTA_PSP
|
||||
0.7f;
|
||||
#else
|
||||
0.8f;
|
||||
#endif
|
||||
|
||||
void CIniFile::LoadIniFile()
|
||||
{
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
#define DEFAULT_MAX_NUMBER_OF_PEDS 25.0f
|
||||
#define DEFAULT_MAX_NUMBER_OF_PEDS_INTERIOR 40.0f
|
||||
#define DEFAULT_MAX_NUMBER_OF_CARS 12.0f
|
||||
#define DEFAULT_MAX_NUMBER_OF_CARS 30.0f
|
||||
|
||||
class CIniFile
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user