Compare commits
1948 Commits
Author | SHA1 | Date |
---|---|---|
Sergeanur | a16fcd8d6a | |
Sergeanur | a04a84e00b | |
Sergeanur | abe6c22f56 | |
Sergeanur | 669c8c8988 | |
Fire-Head | 4b747e567a | |
Sergeanur | 320624edc8 | |
Sergeanur | 355c260bf2 | |
Sergeanur | 9a7b469f4e | |
Nikolay | 8ef1e29a5c | |
Nikolay Korolev | 7a80acf6a1 | |
Nikolay Korolev | b2daa0e502 | |
Nikolay Korolev | 915888d275 | |
Sergeanur | a94812b28d | |
Sergeanur | 8de1ffb84d | |
Nikolay Korolev | b7db2a12d4 | |
Sergeanur | f87f14b432 | |
Sergeanur | c8492ab5e0 | |
Sergeanur | d4a2113a8a | |
Sergeanur | a5ec7a45db | |
Sergeanur | abbfb09a64 | |
Sergeanur | ef0ba763b9 | |
erorcun | 09f693b9b9 | |
erorcun | 285fee01f2 | |
erorcun | d81890f6a8 | |
erorcun | d4ce6bcde0 | |
Sergeanur | 7c80093efa | |
Sergeanur | fe51abd534 | |
erorcun | 80b7d52eeb | |
erorcun | 0256790e1c | |
Nikolay Korolev | 8b7f469ae1 | |
Nikolay Korolev | 11f2d941f1 | |
Sergeanur | 239367663b | |
Sergeanur | a401f926d3 | |
aap | c8623cfe09 | |
withmorten | 843b43001a | |
Sergeanur | a9798d0645 | |
Sergeanur | 71e0895dc6 | |
Sergeanur | 51ba90dd52 | |
Sergeanur | 2120d4d3ce | |
Sergeanur | 296e7ed9ad | |
Sergeanur | a13089cd2e | |
withmorten | dff327df40 | |
Adrian Graber | ba07534d99 | |
aap | a9604a88c2 | |
aap | dc4ee41b70 | |
erorcun | e73e965d5b | |
erorcun | 4e40c6f2ed | |
Sergeanur | 176cadff05 | |
Sergeanur | cd0a765f66 | |
Sergeanur | 76f2191476 | |
Sergeanur | d6fbf9fbe7 | |
Sergeanur | c7e05c74b9 | |
Sergeanur | 9ed94f310a | |
aap | 77f692c669 | |
Nikolay Korolev | 7d1cfe50af | |
Nikolay Korolev | dec09bde1c | |
erorcun | 9deabc7b60 | |
Nikolay Korolev | 6bdfb0d386 | |
Nikolay Korolev | 26e5a7eed1 | |
Nikolay Korolev | 042284de8b | |
erorcun | 435b8fe52e | |
Nikolay Korolev | 3441714a13 | |
erorcun | f4e723e690 | |
erorcun | 0db14d718c | |
erorcun | fd52285074 | |
Nikolay Korolev | eadf0496bf | |
erorcun | 4a5f7464c1 | |
Nikolay Korolev | 958e2f36bb | |
erorcun | 3a95c77c9e | |
withmorten | 81c6c5e47a | |
Sergeanur | 0a2df3ca4c | |
Sergeanur | 92c5cf1877 | |
Sergeanur | 43fbf297c8 | |
Nikolay Korolev | b99edf9a6b | |
Sergeanur | 75f812cfcd | |
Sergeanur | 463fdab6a4 | |
Sergeanur | d7a28c4d2b | |
Sergeanur | 0544beb00d | |
withmorten | ab5965cc8d | |
Nikolay Korolev | 3869369703 | |
Nikolay Korolev | 2ee32abf84 | |
Barracuda6 | 42ad9c4378 | |
Sergeanur | 76a22c0d13 | |
Sergeanur | f887d515fa | |
Nikolay Korolev | e17504a36a | |
Nikolay Korolev | 4673f509f6 | |
Nikolay Korolev | 8d9508bda4 | |
Nikolay Korolev | 873840a6a5 | |
Nikolay Korolev | 478bdcc1ca | |
Nikolay Korolev | 668311a444 | |
Nikolay Korolev | 88b4c7b50b | |
Nikolay | e947081622 | |
aap | bec1cbc1cb | |
Nikolay Korolev | 80d00fe31a | |
Nikolay Korolev | 6fbb7da82d | |
Nikolay Korolev | 5a22896197 | |
Nikolay Korolev | 8bcbee4ea7 | |
Nikolay Korolev | 5999ddc76d | |
aap | 4a047f56bc | |
erorcun | ae1deb2209 | |
erorcun | 418bf3ab69 | |
erorcun | 192190769d | |
Nikolay Korolev | 1479093d33 | |
Nikolay Korolev | 70080f1fdb | |
erorcun | e80cbf8bb2 | |
Magnus Larsen | d923cd2f24 | |
Sergeanur | 835fa4e74b | |
aap | 30061396e8 | |
Sergeanur | 7bacf3b6f4 | |
Sergeanur | cce97588fe | |
Sergeanur | 2aa37813d2 | |
Sergeanur | 8960ffaf0b | |
Sergeanur | 61176acbad | |
Sergeanur | 49ee711c75 | |
Sergeanur | 16f892b667 | |
Sergeanur | 9dbaa7a77f | |
Sergeanur | 7aa8d7c073 | |
Sergeanur | 782d38c6b7 | |
Sergeanur | c0488b3190 | |
Sergeanur | 1180f32d9c | |
Sergeanur | 371f1be9b3 | |
Sergeanur | 250727c9ca | |
Sergeanur | f7a2c265b3 | |
Sergeanur | 123f2fda9b | |
Sergeanur | 1aac4d802f | |
Sergeanur | ed9c911a0e | |
Sergeanur | a510a03b8a | |
Sergeanur | 5032d24ad8 | |
Sergeanur | 601f63f4fb | |
Sergeanur | bf757fc960 | |
Sergeanur | aec797671e | |
Sergeanur | 5e34b1efcf | |
Sergeanur | 953e4fc4ff | |
Sergeanur | bbbe9b2632 | |
Sergeanur | a1444b992f | |
withmorten | 76558e9313 | |
Sergeanur | c937bdbfea | |
withmorten | c8cb1ed013 | |
Sergeanur | 780cd225e9 | |
Sergeanur | 02c4ada807 | |
Magnus Larsen | fb5a207abc | |
Adrian Graber | 7f544f9049 | |
Adrian Graber | 6665b16ba2 | |
withmorten | 523b23339c | |
Sergeanur | c982700a69 | |
withmorten | b69cee3801 | |
withmorten | 6c097398d1 | |
withmorten | 2f7ae611ed | |
Sergeanur | 3f5fdc39a5 | |
withmorten | 6f52ad190e | |
erorcun | 02e84b4b97 | |
Sergeanur | dc29e7c044 | |
withmorten | f686065769 | |
withmorten | 58de524d70 | |
withmorten | 8a114514d9 | |
erorcun | 9f0a96ac89 | |
withmorten | 6f103a3b82 | |
withmorten | 61c2398b67 | |
withmorten | 41f3d4d9d7 | |
withmorten | df8ef2d58d | |
Sergeanur | ddf2b09e55 | |
withmorten | 026cd10f3f | |
withmorten | ffe199290b | |
withmorten | 0b269571d7 | |
Sergeanur | 72f6780905 | |
withmorten | 79c010f082 | |
withmorten | e6544a6983 | |
mssx86 | 37a43ebf45 | |
mssx86 | c5e896c420 | |
withmorten | 0b27a3dc23 | |
erorcun | 74fd58513b | |
Adrian Graber | 2029ac3d62 | |
withmorten | 10d7b303a5 | |
withmorten | 70876d3cde | |
erorcun | 3750124dcc | |
erorcun | 1d51734d0b | |
Sergeanur | 3ed4cdf109 | |
withmorten | a92dcaa0b1 | |
erorcun | 1c0878f65b | |
withmorten | 43631ba203 | |
withmorten | f9f854c4a8 | |
erorcun | 4eea98c66b | |
Sergeanur | 987e09515b | |
Sergeanur | 9ea3549743 | |
Sergeanur | ae4bfef590 | |
Sergeanur | 8e6e46a919 | |
withmorten | 65219365db | |
Sergeanur | 3988fec6e7 | |
withmorten | 2d38eb923d | |
Sergeanur | cb72fee941 | |
Sergeanur | a73a2c9179 | |
Sergeanur | b1c9340fd3 | |
withmorten | abe57fefa0 | |
Sergeanur | d31a7e24a8 | |
erorcun | cac1c5bd42 | |
erorcun | 9f0daee186 | |
withmorten | de4699a97e | |
erorcun | fdbd414299 | |
withmorten | d17d437de3 | |
Sergeanur | f8297df9c5 | |
erorcun | 3587cb029e | |
erorcun | 05a29c7e6c | |
Leandro Guedes | ab38b0089e | |
erorcun | 9c8ef3cca0 | |
erorcun | 107c4df69c | |
withmorten | 9ab4f1a2d9 | |
withmorten | d8f5e86ede | |
withmorten | 85d60b36da | |
Sergeanur | 225530ef04 | |
withmorten | c869602b6d | |
erorcun | 9382e86d38 | |
erorcun | 0b057f34c9 | |
withmorten | 4e3fc35401 | |
withmorten | 5341840943 | |
Sergeanur | f46461331c | |
Sergeanur | 4660491243 | |
Sergeanur | e5aa150557 | |
Sergeanur | 14c71f39ff | |
Sergeanur | b8cf8c53e7 | |
Sergeanur | 5156626582 | |
majestic | fe65f20a30 | |
Sergeanur | 4b8b0a6d74 | |
Sergeanur | 0f0cb40151 | |
Sergeanur | 2b8ae07ec6 | |
Sergeanur | 1b5dbc4b41 | |
Sergeanur | 6426963807 | |
Sergeanur | 23755fdfb4 | |
Sergeanur | 793e1223de | |
Sergeanur | fad64667a7 | |
Sergeanur | 6e4a2947ea | |
Sergeanur | f2c8522daa | |
aap | 93e9929925 | |
Sergeanur | be019c6126 | |
Sergeanur | 02655313e9 | |
Sergeanur | 59ed4d0029 | |
majestic | 42e655b4cc | |
Sergeanur | 5bcdb933a7 | |
Sergeanur | bd94c16e78 | |
erorcun | 618d689dff | |
Sergeanur | 0c41734c20 | |
Sergeanur | 3a7cb9c5ce | |
Sergeanur | 8a728faeb6 | |
Sergeanur | 2fc431d1bb | |
Sergeanur | fc1bfcbc21 | |
Sergeanur | 4da733145e | |
Sergeanur | 3dda658e42 | |
Sergeanur | 1817727a66 | |
aap | ceb22d71dd | |
erorcun | 97008905b6 | |
aap | 6122f6980b | |
aap | 7c42ed6edb | |
aap | ce604c77ba | |
aap | 82245789ed | |
aap | d2b5a422e4 | |
erorcun | a311f643f9 | |
Sergeanur | c5303c2ea4 | |
Sergeanur | 478f6e07d4 | |
Sergeanur | b01d6be3f4 | |
Haydn Trigg | d506f8588c | |
erorcun | 1d336d851d | |
erorcun | 71cf666bbd | |
erorcun | 040c6f9027 | |
erorcun | 14dcd8f04c | |
aap | b88cf7b939 | |
withmorten | 111ccf5d34 | |
withmorten | 60bc816af5 | |
erorcun | 3d5f0ef318 | |
RuesanG | c274c05ce3 | |
erorcun | dfa0c8bf19 | |
withmorten | 4eea06e620 | |
withmorten | 781617d484 | |
erorcun | 946be081b0 | |
aap | 11bc8ea602 | |
aap | 3457ff48ce | |
aap | 146ad3b4a1 | |
aap | 996772faf2 | |
aap | bb8b823c30 | |
aap | 9bdc4aace2 | |
Sergeanur | cba1f85026 | |
aap | 59bf3a1cc4 | |
Fire-Head | 5ce7a0bde4 | |
Fire-Head | 33a648e5f5 | |
aap | f670658407 | |
aap | 3feca1c530 | |
withmorten | 8dca3182a6 | |
Sergeanur | ac88a00f06 | |
erorcun | a73a3380d7 | |
erorcun | 691c8e7702 | |
withmorten | 0b6fad7619 | |
erorcun | 75d8dd2bf2 | |
withmorten | f603f4397d | |
aap | 0810abd294 | |
aap | ed38118008 | |
Steve Wills | 2b6628aa65 | |
Adrian Graber | 88c11e92d3 | |
erorcun | 1bfd7c0345 | |
Adrian Graber | ee287f6120 | |
Adrian Graber | 48227bd350 | |
erorcun | 4368841f02 | |
erorcun | b451be6c7f | |
erorcun | 7c382c85b8 | |
Fire-Head | 63e5afda0b | |
aap | adf688635a | |
withmorten | a58d76d27d | |
withmorten | a76c962aa3 | |
erorcun | 5ce5000b14 | |
Fire-Head | 6fcea142a2 | |
erorcun | e604be65d9 | |
Fire-Head | 0681fe3eca | |
Nikolay Korolev | 3d90a146d8 | |
Nikolay Korolev | 6ba0d2e6bd | |
erorcun | 70b919137d | |
withmorten | d6fbfab7b6 | |
aap | d0afa692f5 | |
Sergeanur | 9f6f9a7af3 | |
withmorten | 49d9aa8188 | |
Fire-Head | f5fdb91a43 | |
Sergeanur | 83fdad7e0d | |
withmorten | 44511e28a8 | |
withmorten | e5d5160492 | |
IlDucci | ae8b2198e2 | |
withmorten | ddcc19d7cf | |
aap | 333530e260 | |
aap | 65f9917b65 | |
aap | 3db0e827e5 | |
aap | 9df19cbac3 | |
aap | 0916971584 | |
erorcun | 035f0010d8 | |
erorcun | 0ec16a5b0e | |
erorcun | 80e4b3db55 | |
Filip Gawin | 0c60ceeb33 | |
erorcun | 2c784d979a | |
Sergeanur | e98164ec41 | |
Sergeanur | b1698948e6 | |
Sergeanur | df336f5ba2 | |
Sergeanur | aadc39eccd | |
Sergeanur | c5042dcdf6 | |
Sergeanur | 9e22eaf798 | |
aap | c3ced5825d | |
aap | c5db1e697b | |
aap | 879838c9f2 | |
withmorten | 031195f11d | |
withmorten | 46e229c069 | |
Sergeanur | 438277408b | |
Sergeanur | 998d88763d | |
Sergeanur | e4320c02cf | |
Sergeanur | 579ad052ed | |
Nikolay Korolev | 7c74c01741 | |
Sergeanur | 9d8e32d9b2 | |
Sergeanur | 28f9160bca | |
Sergeanur | 4f27a28762 | |
Sergeanur | 9f3f0ee2d2 | |
Sergeanur | 7c485560c5 | |
withmorten | 84ede57205 | |
erorcun | 6d56fb41c6 | |
erorcun | 775db94a96 | |
Sergeanur | 3c7a7bc8a7 | |
Sergeanur | 5072c8b6f0 | |
Sergeanur | ca85e44c9e | |
Sergeanur | 5f3e68ec45 | |
Sergeanur | d6068c421d | |
Sergeanur | bf8687590e | |
Sergeanur | b6af7393e8 | |
Sergeanur | 12330e38cb | |
aap | 26bbbe0037 | |
erorcun | 94eed33940 | |
erorcun | b464bb7fd4 | |
erorcun | 2cad49940e | |
erorcun | 675aef29cf | |
aap | 425f360363 | |
aap | cc435ea711 | |
IlDucci | b864103976 | |
Nikolay Korolev | 102d105e0a | |
IlDucci | 86513cb2c9 | |
aap | 9125e604b9 | |
Nikolay Korolev | 09de511c37 | |
withmorten | a78212ea80 | |
withmorten | 8553120fdb | |
withmorten | 42342745f3 | |
withmorten | 958c828a2c | |
withmorten | 1525b105e2 | |
withmorten | bba01a42e1 | |
erorcun | ca48ebcb6e | |
Nikolay Korolev | ca65c76419 | |
Sergeanur | 2e7726c574 | |
withmorten | edc3c48e05 | |
IlDucci | 1ffa9bb30f | |
erorcun | 2ea365e5da | |
erorcun | 713562685a | |
withmorten | 1b293a3cfb | |
withmorten | 4281730b16 | |
erorcun | 1eb77c4d6d | |
erorcun | 902e539c0d | |
Sergeanur | 3e0dbf42d4 | |
shfil | 264d7d98d7 | |
withmorten | 2e37001881 | |
Nikolay Korolev | e5190481e4 | |
Nikolay Korolev | 2420325c02 | |
withmorten | 5dfe396af3 | |
Sergeanur | c193ade58b | |
Nikolay Korolev | 8b08098d4e | |
Nikolay Korolev | dbf5c06144 | |
withmorten | 990637bf52 | |
erorcun | f5f153dbfd | |
erorcun | c4328afce7 | |
withmorten | 7db28f9f7f | |
withmorten | 934aa92a9b | |
erorcun | 982b024c5c | |
aap | 595a000f6a | |
withmorten | 8482180706 | |
withmorten | 2fc6b542bc | |
erorcun | 810bad9fd8 | |
Nikolay Korolev | 7056f9954f | |
aap | 9e3c192376 | |
erorcun | e1e4be9017 | |
erorcun | 0d7e0d351a | |
erorcun | 8150f55dbc | |
kusst | 8a7c7efe85 | |
erorcun | be88a42bad | |
erorcun | 9c2f067403 | |
erorcun | a216bb56ee | |
erorcun | ab939e059b | |
Sergeanur | e8a10748a4 | |
Sergeanur | 97cf189d15 | |
Sergeanur | 97351ad2c2 | |
kusst | e1e13d14a4 | |
kusst | 30c26e5a9c | |
Sergeanur | 2d2625bf75 | |
withmorten | 3948a1f726 | |
Sergeanur | c5ff13abca | |
erorcun | 202ccd4c56 | |
withmorten | 9d4053419b | |
aap | 453a16c978 | |
shfil | 513d418771 | |
erorcun | 071e503856 | |
withmorten | 29fb996b00 | |
erorcun | b728f8de64 | |
shfil | ca1de3cd17 | |
Nikolay Korolev | 4e477a17b2 | |
Nikolay Korolev | de32fbe75e | |
Nikolay Korolev | 4abebbe3b2 | |
aap | 4269e613a3 | |
Zach Charo | 77051ddc78 | |
erorcun | 770456d0c8 | |
erorcun | 1b32840424 | |
erorcun | 45c2488e36 | |
erorcun | 73f1340afb | |
Nikolay Korolev | b5c4866964 | |
aap | f6fb473cf9 | |
aap | 2814f2e8cf | |
erorcun | 10120eb12f | |
erorcun | f85b5e99ed | |
withmorten | cc6d5374d5 | |
withmorten | 1d3e84b712 | |
withmorten | feb993e751 | |
aap | 4acc9b08a2 | |
withmorten | d1317f8fa6 | |
aap | 1999427225 | |
aap | 94ff966994 | |
aap | e99589a3eb | |
Nikolay Korolev | 50cde66067 | |
Nikolay Korolev | f0097ff733 | |
aap | 24de9f92e8 | |
Sergeanur | c7c7eff918 | |
Sergeanur | 3b52b683e3 | |
withmorten | 8590457d41 | |
Sergeanur | 9b820cc0b6 | |
aap | 2c1c5debca | |
Nikolay Korolev | 03cf1e7535 | |
Nikolay Korolev | 8b80a8803b | |
aap | d01deec11d | |
withmorten | 20dabf0b49 | |
withmorten | df4e22e3d0 | |
withmorten | 4babb11e2f | |
aap | 2b4b00b388 | |
aap | 913a001375 | |
Nikolay Korolev | 72b25cd3a8 | |
Nikolay Korolev | df98d04d79 | |
Sergeanur | 21a6ed247b | |
Nikolay Korolev | 32ab01cd32 | |
Nikolay Korolev | 7ea77d8da4 | |
Nikolay | 193fb2a381 | |
Filip Gawin | 6bebde8279 | |
Sergeanur | 19749effce | |
withmorten | d5ce8b1ea3 | |
Filip Gawin | 7541fa7cb7 | |
Filip Gawin | 5acbf9ef59 | |
Filip Gawin | 1082b13830 | |
Filip Gawin | a0a88b4663 | |
Filip Gawin | c7b905c0ec | |
Nikolay Korolev | 0b0d286f5c | |
shfil | 42df203389 | |
Filip Gawin | 70358d90b4 | |
Filip Gawin | 57cc70c6af | |
Filip Gawin | 85f93ef135 | |
Filip Gawin | 40d3a900a0 | |
Filip Gawin | 7c8933f8c4 | |
Nikolay Korolev | 6a93cc49be | |
erorcun | 13b52229be | |
aap | ab14a0bc61 | |
aap | 3a6935f126 | |
aap | 7994b80dcf | |
Nikolay Korolev | 9f914dcd10 | |
Nikolay Korolev | daf1de550c | |
withmorten | dacd389799 | |
aap | 361808923a | |
Sergeanur | 0e9a44dd43 | |
aap | ac3ba5b4a6 | |
aap | 2804ad2363 | |
aap | e3a261d29c | |
Filip Gawin | 4741afd2cf | |
aap | 1b55a9956f | |
erorcun | 679755de35 | |
erorcun | 3553f467b2 | |
erorcun | 542a5393ac | |
withmorten | 5d4917a5d7 | |
withmorten | e122a75dd2 | |
withmorten | 2b91af4493 | |
withmorten | 232d990e6d | |
Sergeanur | 92b1e8ab75 | |
Nikolay Korolev | 4505b8795a | |
aap | b407f6a011 | |
aap | faab9f4aa4 | |
aap | 8858df2185 | |
aap | 0afa027ab4 | |
Nikolay Korolev | 6cfc61ac0e | |
aap | 99a6976f53 | |
withmorten | 75367e714a | |
Sergeanur | 7e888a6379 | |
aap | afcb794d59 | |
Nikolay Korolev | daf5cfe425 | |
Nikolay Korolev | 42e4e7c063 | |
Fire-Head | f728c58383 | |
Fire-Head | e2095bf70b | |
Nikolay Korolev | c7052b3d6f | |
withmorten | 4a8a1af885 | |
Nikolay Korolev | 81b5e66dd4 | |
erorcun | b5711b21dc | |
Sergeanur | 585300cd33 | |
Fire-Head | adc7127055 | |
aap | ebca91e0d0 | |
Nikolay | d90de7f13c | |
Seemann | c2265e29d2 | |
aap | e906a807f1 | |
aap | 434bc01f0b | |
aap | f6f0cb708e | |
Sergeanur | 322d93ab0c | |
aap | e473d234fd | |
Fire-Head | 6b78bab99a | |
Fire-Head | 8e7cce0634 | |
Nikolay | b7f9bfda4a | |
Fire-Head | 91c6389754 | |
Fire-Head | 7a3ee349da | |
Sergeanur | faa9e6441b | |
Sergeanur | 68e8c1ce04 | |
Sergeanur | c6c55d0130 | |
Nikolay Korolev | e92666d988 | |
aap | 8be0567924 | |
Nikolay Korolev | 824ca7599c | |
Nikolay Korolev | f8569a74cb | |
aap | d820df0dbe | |
Sergeanur | 556b9ae574 | |
Sergeanur | 24d73aeb71 | |
Sergeanur | debf39fe64 | |
Sergeanur | c423c59365 | |
Sergeanur | 6b0fa20b8b | |
Sergeanur | 0428b5b694 | |
Sergeanur | c2672bd630 | |
Sergeanur | eecf095077 | |
Nikolay Korolev | 9d6db921bd | |
Nikolay Korolev | db1bdfd62d | |
Sergeanur | 0845abf640 | |
Nikolay | 08ddef6a93 | |
majestic | f61e2d04f1 | |
Sergeanur | 0b73b13b9a | |
Filip Gawin | ff9d6e4fd6 | |
Filip Gawin | 2bcb2a40e4 | |
Filip Gawin | d9e2b1f0de | |
Sergeanur | a51757429e | |
Sergeanur | bc363a74f5 | |
erorcun | bafaa6acc6 | |
Sergeanur | f639aae2ae | |
erorcun | 0d3e6a3dce | |
Sergeanur | 32d3ea0a2d | |
aap | 33fd33b03a | |
aap | 8026bba723 | |
Nikolay Korolev | a6680e38d5 | |
Nikolay Korolev | 6fa081e004 | |
Sergeanur | 6753d39dd0 | |
Sergeanur | 09c213738b | |
Sergeanur | a346461ea8 | |
Sergeanur | 4f9bfb4387 | |
Sergeanur | 7adac51152 | |
Nikolay Korolev | 601f77b5c8 | |
Nikolay Korolev | 2d072325ad | |
Sergeanur | 2db0d7cfa1 | |
erorcun | ae388c48d0 | |
aap | 362f2b5ec4 | |
erorcun | 22e8202d27 | |
Sergeanur | 1efbd7ead2 | |
Nikolay Korolev | 33f467453e | |
erorcun | 5b081398b5 | |
Nikolay Korolev | 21e151cadd | |
Nikolay Korolev | 0392145512 | |
aap | 6579645934 | |
aap | 12a869c62a | |
TheOfficialFloW | 0c2ea268d1 | |
Nikolay Korolev | 06fd054eb3 | |
Sergeanur | 2e06e4b6b8 | |
erorcun | c4479a0185 | |
TheOfficialFloW | e46b06491c | |
Nikolay Korolev | 5e019ed9f8 | |
Nikolay Korolev | 29e0cfa98b | |
Sergeanur | 9ae3fac08e | |
Sergeanur | 1169437ec6 | |
aap | 57677b7b55 | |
aap | ec1e8b6c86 | |
aap | e58acce9e4 | |
Sergeanur | 30bc51ae9e | |
erorcun | 2268365c3b | |
Sergeanur | 42e4a068bb | |
Sergeanur | e7c46ac658 | |
aap | 3fffcb47d9 | |
Filip Gawin | 55af046c92 | |
Nikolay Korolev | a7f053776a | |
Nikolay Korolev | c75c4603fc | |
aap | ec00a1eb0d | |
Sergeanur | c3f49386ca | |
aap | 60197c2d7e | |
aap | 0127d7eb8b | |
Nikolay Korolev | 4604b45852 | |
Nikolay Korolev | 9fd93e8e57 | |
Sergeanur | 4f3e4cd542 | |
Sergeanur | ccf6232039 | |
aap | c74c7ce1d4 | |
aap | 4d1305efb2 | |
Filip Gawin | 9d29b33ff4 | |
Filip Gawin | a0a3a095ac | |
aap | 14eb16d5d4 | |
aap | 613bb72eb7 | |
Filip Gawin | ed9c288db8 | |
Nikolay Korolev | a9bf0fa97e | |
Nikolay Korolev | 56ea1c7be7 | |
shfil | d11325cf0f | |
aap | d89d3db126 | |
aap | 80d15d142d | |
Filip Gawin | f77c8990ce | |
shfil | 0b3690a59c | |
aap | 2e38b51e1c | |
aap | 426364b961 | |
Sergeanur | 1867a6c47b | |
Filip Gawin | 3a59d9075f | |
Filip Gawin | a73f5340a2 | |
Sergeanur | 2bc843fdcd | |
Sergeanur | b9e97ab79d | |
Sergeanur | 06df781bca | |
aap | c93fb5e443 | |
Fire-Head | ad560ffaf9 | |
Sergeanur | 5ebcef2718 | |
Sergeanur | 6b52fb5fb6 | |
erorcun | 5780200ba3 | |
erorcun | 7b2f17826a | |
erorcun | d3f2f4f6ac | |
erorcun | 2dbe3d5b83 | |
erorcun | 9e7cb046b3 | |
erorcun | 9afcc355ff | |
aap | 637cff3180 | |
aap | d33f1071ae | |
aap | 013e9b9992 | |
aap | 00da91b73f | |
aap | 54ce7885bc | |
Sergeanur | 7959b7fd1f | |
aap | 76e744bb7b | |
aap | 5a74495d7b | |
erorcun | 904746054c | |
Sergeanur | 759f91ce91 | |
erorcun | a4ec3cdf0b | |
aap | 0f020127f3 | |
aap | 9d62bed9f3 | |
aap | e9d0a1d015 | |
aap | 17640302bf | |
aap | 7613528e7e | |
aap | b41f93fcd6 | |
Sergeanur | c9c447e7a9 | |
aap | 688e277e89 | |
aap | 8737a1d76a | |
Nikolay Korolev | f6fe5c96c9 | |
Nikolay Korolev | 149aef929d | |
Sergeanur | 3b2558bb9e | |
erorcun | 57098a77ec | |
Sergeanur | 99a3fe0a13 | |
Sergeanur | 441b3864f3 | |
Sergeanur | 18bea3cfa5 | |
Sergeanur | 783d1edaf1 | |
Sergeanur | 977a1a08e9 | |
Sergeanur | 90ef1d2d31 | |
Sergeanur | 9345efbafb | |
Sergeanur | fa6eb3a64f | |
Sergeanur | 587c788ce3 | |
Sergeanur | 356f101078 | |
Sergeanur | e00b8a93bf | |
shfil | dc72729a40 | |
Filip Gawin | cf8799d116 | |
Sergeanur | c0be4a3f7d | |
erorcun | 3b85457020 | |
erorcun | a50244dc16 | |
Nikolay Korolev | 5f98b4fdca | |
Sergeanur | 4846564c78 | |
Nikolay Korolev | 86f04884de | |
Sergeanur | bf52620175 | |
Sergeanur | e14ed9c7dd | |
Sergeanur | 74276ae878 | |
Sergeanur | 1cc8a1d247 | |
Sergeanur | 6a2edcea46 | |
Sergeanur | 0768026938 | |
Filip Gawin | 19cc1d7854 | |
aap | 450cd17d16 | |
Filip Gawin | 35473e653d | |
aap | aefaa17a84 | |
aap | 88b0134e72 | |
shfil | c0260b4167 | |
aap | b574996334 | |
aap | adcfb30d7d | |
aap | f251803f55 | |
aap | fb97335d9f | |
erorcun | 05fb47bdb0 | |
erorcun | 9b9545b92a | |
erorcun | 26aed6611e | |
erorcun | ca4602d788 | |
aap | f60b450ee8 | |
aap | 036263993e | |
aap | b48445cc7e | |
aap | fc312113d2 | |
Sergeanur | 2e90ce9cc5 | |
Sergeanur | be92b57b54 | |
aap | 6697ab6b63 | |
aap | 2a51e1da04 | |
Nikolay | 867133e93d | |
Nikolay Korolev | b6298915dd | |
Nikolay Korolev | 196a13b1cc | |
Nikolay Korolev | 76a564df2e | |
Nikolay Korolev | 17efc38e35 | |
Nikolay Korolev | bf90fed2b7 | |
Nikolay Korolev | e3aac6263f | |
Nikolay Korolev | 8d1996833b | |
aap | 9982f1f21b | |
aap | 73d080bcc8 | |
aap | c17ccc50ab | |
aap | 75a9976cbc | |
aap | f3a356375e | |
aap | 55cf1a37cb | |
aap | a7050458ae | |
aap | db752d141b | |
Sergeanur | cfda5eb148 | |
Sergeanur | 2903ebe296 | |
aap | 1af5065df7 | |
aap | e9df32a983 | |
erorcun | 12d16ddc06 | |
aap | 9200810f60 | |
aap | 78c7459b3a | |
aap | 0d97a31ce9 | |
aap | c56bfe064a | |
withmorten | ce9eafcd51 | |
erorcun | 59caa98c43 | |
aap | 81aaddb0e7 | |
Walied K. Yassen | 37d3188ce7 | |
Sergeanur | 8f2abc6750 | |
Sergeanur | e970e5f246 | |
Sergeanur | ac95138c18 | |
Sergeanur | ab3e258f19 | |
erorcun | 0f5893ed60 | |
erorcun | 91902a031e | |
aap | e8fe09cf23 | |
aap | e3616c1ce1 | |
aap | 35cac6b93b | |
Nikolay Korolev | 6d61f9d2e1 | |
Nikolay Korolev | bfe382c315 | |
erorcun | b3f97cdce4 | |
Nikolay Korolev | 229b8f304a | |
Nikolay Korolev | 78718700f9 | |
aap | 4f3be49728 | |
IlDucci | c7ce056728 | |
Nikolay Korolev | 4197498e2d | |
aap | ccbbde549e | |
erorcun | c504cf02e4 | |
erorcun | 95fe5004c8 | |
erorcun | cf4aedd97c | |
erorcun | ba0c9e8b29 | |
erorcun | b473adcf80 | |
erorcun | ac3484b82e | |
aap | c8b0f0bdf8 | |
Filip Gawin | 5a7e62e4a9 | |
Filip Gawin | 6ba442577f | |
Filip Gawin | 99e54aed80 | |
Nikolay Korolev | 016ff5b4aa | |
Sergeanur | f3e9c82432 | |
Sergeanur | 579efc05fc | |
Sergeanur | aae4f3319f | |
Sergeanur | 8844caf44d | |
aap | 61c6b28237 | |
Sergeanur | 64049f0f81 | |
Sergeanur | 4b4f59a5d4 | |
withmorten | 4c0744260d | |
withmorten | 912e71be53 | |
withmorten | 16ed00aede | |
withmorten | e6a7a9353c | |
withmorten | 7ad86595e4 | |
Walied K. Yassen | 190bcf68f3 | |
Nikolay Korolev | 406f646949 | |
Nikolay Korolev | 17a939e38d | |
Nikolay Korolev | f6818f9654 | |
Nikolay | b5cdc33e7c | |
Nikolay Korolev | fe918d41c2 | |
Nikolay Korolev | a82188ac07 | |
Nikolay Korolev | 0bd373cd56 | |
aap | e145593c28 | |
aap | 43fb7fe342 | |
shfil | bee2408413 | |
aap | 0d166081ad | |
erorcun | a37ce3ee9f | |
erorcun | ab3e810a95 | |
erorcun | 469deeb141 | |
erorcun | 8b47774aee | |
erorcun | 774aa1570f | |
erorcun | bd8b907d13 | |
aap | 1172056833 | |
Sergeanur | 43d5831394 | |
Sergeanur | a259b6b8ab | |
Sergeanur | 24b5406a1d | |
aap | 8de7072720 | |
aap | d545246bbf | |
majestic | cd23695116 | |
Sergeanur | 5a3a058ed3 | |
Sergeanur | 16abbad6b2 | |
withmorten | b8d3d8f5e4 | |
Walied K. Yassen | 1dcd7c5b14 | |
Walied K. Yassen | ac7ea2b9fa | |
Walied K. Yassen | a1ab82b188 | |
Walied K. Yassen | afe70003f4 | |
Walied K. Yassen | 03ef438a72 | |
Nikolay Korolev | 8cb3c07151 | |
Zach Charo | b47c505438 | |
Sergeanur | 2e3d5162f7 | |
erorcun | 53162e23b6 | |
Sergeanur | 164f16c85b | |
Sergeanur | 8f5e60f787 | |
aap | 1906a08f72 | |
Sergeanur | a35b3b4602 | |
erorcun | b7783b19d2 | |
aap | b2f9b3175b | |
Sergeanur | 3289bfaa87 | |
Sergeanur | 87e6edd554 | |
Nikolay | 2b53f267a7 | |
Nikolay | 6a6551f39b | |
aap | b9b7d5ac21 | |
Sergeanur | fe40f65703 | |
aap | 07fe099b4e | |
erorcun | 54214dd2c4 | |
Greg V | 2ce9e540da | |
Greg V | 4091d00057 | |
Greg V | 1544acff05 | |
Greg V | 7c1497a058 | |
Greg V | d05c50ea74 | |
aap | 8963cbcb7c | |
aap | acb29e0dad | |
Filip Gawin | f043b6e095 | |
aap | 8c70c2a136 | |
aap | 448c56647f | |
erorcun | 1d600c640a | |
erorcun | c6f53d25b0 | |
Sergeanur | e71da86a5c | |
Sergeanur | cdd30f4da5 | |
Nikolay Korolev | 15b7126243 | |
Nikolay Korolev | 0ac621588e | |
aap | b82b79fa11 | |
aap | acdf602505 | |
aap | 6804ad62c6 | |
aap | 8a8f2d4e5b | |
Sergeanur | 9bb8ebaa10 | |
Nikolay Korolev | 26c6908d25 | |
Nikolay Korolev | 6682e56f71 | |
Nikolay Korolev | 3048a77a05 | |
aap | 257f45c3c3 | |
aap | 8ab0d25b4a | |
Nikolay Korolev | a3f24d1bbf | |
Nikolay Korolev | 2e915780aa | |
aap | 3d46f2a3af | |
erorcun | 4f8029ad7c | |
erorcun | b67ed1988f | |
Nikolay Korolev | 55c9a81922 | |
aap | 90b624a3e0 | |
aap | 0115b0827b | |
aap | 79432dce20 | |
aap | ff44f29616 | |
Nikolay | a76c6b2307 | |
Nikolay | 984708dfd3 | |
Nikolay | a8b5303207 | |
Nikolay Korolev | 35874b5fd2 | |
Nikolay Korolev | a67d4c70d7 | |
Nikolay Korolev | be92957328 | |
aap | 48d0653331 | |
Nikolay Korolev | 612a6dd06c | |
Nikolay Korolev | ef2089cafb | |
Sergeanur | 5c64dba65a | |
aap | e87cd7077e | |
majestic | cf6a9a8341 | |
Sergeanur | 51e7f44433 | |
Sergeanur | 23d294fef5 | |
Roman Masanin | fb2173c396 | |
Roman Masanin | 363a2c6098 | |
Roman Masanin | 0853a47a3f | |
erorcun | fe5d0c9cdf | |
Roman Masanin | 95bd5b073a | |
Roman Masanin | a553ac8716 | |
Roman Masanin | f8cc86c227 | |
Roman Masanin | 23d23f6462 | |
Sergeanur | a2e0373d22 | |
Sergeanur | 7ede8685ec | |
aap | 092f32ba67 | |
Filip Gawin | e24513d2ad | |
aap | ee8366adba | |
Sergeanur | 5a59542679 | |
aap | 0d55b6182a | |
aap | 67c894cda9 | |
aap | 0662de5323 | |
aap | 244b91ee80 | |
Roman Masanin | 89b622eea8 | |
aap | e1279b01bc | |
aap | 6857e26411 | |
aap | 3c5bb4e8f3 | |
Nikolay Korolev | e473123a6a | |
Nikolay Korolev | 0ccc70c843 | |
aap | 8acc98563e | |
aap | 7041f11987 | |
Nikolay Korolev | bae6c24209 | |
Roman Masanin | 174424c520 | |
Roman Masanin | cebf32c46c | |
Roman Masanin | 5ea9285c5b | |
Roman Masanin | 55c4346610 | |
Nikolay Korolev | 5edd9e75da | |
Nikolay Korolev | 45c09224f7 | |
Nikolay Korolev | 370d693f9d | |
Nikolay Korolev | 63a27fbc5f | |
Sergeanur | db84afd263 | |
aap | b8b3292161 | |
aap | 9598a90627 | |
aap | 7f5806b727 | |
Sergeanur | 20ea2fde84 | |
majestic | c124e7381c | |
Sergeanur | d370c2076d | |
aap | 32c1135cd4 | |
aap | 9203a33646 | |
aap | 3665a82418 | |
aap | 7d64698322 | |
aap | ea5b86774d | |
Sergeanur | 0e1257cf17 | |
Sergeanur | b8d2c4e452 | |
Filip Gawin | a25005a84c | |
Sergeanur | 86b1d9aea5 | |
aap | f1c935ac4c | |
aap | a4d198005d | |
Sergeanur | 9a3758bfc1 | |
Roman Masanin | c3cbf4353d | |
Roman Masanin | 4bcd176944 | |
Roman Masanin | 44bbcbd14a | |
Roman Masanin | 96ccb1333b | |
Roman Masanin | 04b841c719 | |
Nikolay Korolev | 3bdc974ff5 | |
aap | adfa2645bf | |
aap | 537c0960fe | |
erorcun | 0a36629502 | |
Roman Masanin | 211ab16ddb | |
erorcun | 5b8437172a | |
shfil | 62cb4da833 | |
Sergeanur | 6647dd043d | |
Sergeanur | a520243563 | |
Sergeanur | 93b318cfdf | |
erorcun | de09a80a35 | |
Sergeanur | d1394c6994 | |
Roman Masanin | a12789c632 | |
Roman Masanin | 63c7df9f09 | |
Roman Masanin | c4707fe887 | |
Sergeanur | 04845a72bc | |
Roman Masanin | a9db60a1d9 | |
Roman Masanin | beae41b207 | |
erorcun | 29a2d810a7 | |
Roman Masanin | 19ffb9c8df | |
Adrian Graber | 28fb26f792 | |
erorcun | 07d1637342 | |
erorcun | 088065e0a8 | |
erorcun | 0913abe616 | |
Sergeanur | 3d14097bf6 | |
Roman Masanin | 39b7075502 | |
Sergeanur | a0efb89aa0 | |
majestic | 6a89fe401a | |
Sergeanur | ca497e2cbd | |
Sergeanur | 1544683bdc | |
Sergeanur | d237bb694b | |
Sergeanur | 89a7007c6a | |
Sergeanur | 281e45ce01 | |
erorcun | 08d78fb6ff | |
erorcun | 1587815fca | |
Sergeanur | 1cdc647324 | |
Sergeanur | ee61f19253 | |
erorcun | 86002b093f | |
Sergeanur | ff2665942e | |
Sergeanur | 2709531f09 | |
Sergeanur | e9a89236a2 | |
erorcun | 0265804003 | |
majestic | 1fef3e106c | |
majestic | b36759b586 | |
majestic | 815cc0559e | |
erorcun | 0750f04019 | |
erorcun | 42fbe7572e | |
Roman Masanin | 0594ed5b46 | |
Nikolay Korolev | a1112183de | |
Nikolay Korolev | 6173e1dd10 | |
Nikolay Korolev | e2c29a3b28 | |
Nikolay Korolev | fb80236214 | |
Nikolay Korolev | bc42b3a78e | |
erorcun | 1858904ce0 | |
erorcun | 10758088ef | |
erorcun | 4bfc75c2f9 | |
erorcun | 70f9832e14 | |
erorcun | 497c179245 | |
erorcun | 20ab7d1739 | |
erorcun | 937290db09 | |
Nikolay Korolev | d7789661cd | |
Sergeanur | 8697eebbc2 | |
Sergeanur | 0d20f1c364 | |
erorcun | 1b59b2c9bc | |
Nikolay Korolev | 8d92a0681a | |
eray orçunus | ab071163e5 | |
eray orçunus | f60e3d667a | |
shfil | cafe4e38db | |
Nikolay Korolev | c856d88691 | |
Sergeanur | b3385015e5 | |
Roman Masanin | 1e3aabf654 | |
Nikolay Korolev | 720abca826 | |
Roman Masanin | 3cbccd2ad3 | |
Nikolay Korolev | cae3990eac | |
Nikolay Korolev | 1195f3db7b | |
erorcun | 4e4e0e8e04 | |
Sergeanur | 588fb26728 | |
eray orçunus | dc80884ab5 | |
Sergeanur | e465cea07b | |
eray orçunus | b98864d134 | |
Sergeanur | 7fc70179ed | |
Roman Masanin | eeee5012b7 | |
Sergeanur | 7f3b51dd17 | |
Sergeanur | 63666391d4 | |
Nikolay Korolev | 0cf2c8505e | |
Nikolay Korolev | 40434eadfd | |
Sergeanur | ef47dad566 | |
Roman Masanin | 97fc5224e7 | |
Roman Masanin | 894a1ae93a | |
Nikolay Korolev | 000c5edc4a | |
Roman Masanin | 63c2b98c5e | |
Roman Masanin | 34b4efe242 | |
Fire-Head | e4ac934dbf | |
eray orçunus | 7bf2373fed | |
Nikolay Korolev | 2634d3b427 | |
erorcun | 971b7cba65 | |
shfil | 3b40e003ab | |
Sergeanur | 6450fd2692 | |
erorcun | 1e11c1eac6 | |
Roman Masanin | a4fd1a9f39 | |
erorcun | 4e07297503 | |
eray orçunus | 342da2430b | |
eray orçunus | be6b97b5d8 | |
eray orçunus | d18a55f429 | |
Roman Masanin | e34261d3ef | |
Nikolay Korolev | d3788a9c70 | |
Roman Masanin | 417646819c | |
Roman Masanin | 56bb7d721a | |
Roman Masanin | e6a1ea9d4f | |
erorcun | 96f36d16ae | |
eray orçunus | 40020f4e1e | |
eray orçunus | b1e235535c | |
Nikolay Korolev | 49c48f2ec2 | |
erorcun | 9e0b23f065 | |
eray orçunus | 8a622a0e72 | |
Sergeanur | 239e09ad07 | |
Roman Masanin | ca1d899413 | |
Roman Masanin | 7a3e1ef19a | |
Nikolay Korolev | 28b47b601f | |
Nikolay Korolev | 91a274da2b | |
Nikolay Korolev | 68779a4dac | |
Nikolay Korolev | 49ad471b2d | |
Nikolay Korolev | 552f308e9e | |
Nikolay Korolev | c4d4821327 | |
Sergeanur | a5ea709edc | |
Sergeanur | b0becb5a2d | |
Sergeanur | 9dba2386bb | |
Sergeanur | 43af5d9c1f | |
majestic | e7ef45a606 | |
Sergeanur | f1bb09826d | |
Sergeanur | 6fe6d0cb9a | |
Sergeanur | dd039677a0 | |
Nikolay | 63611408b1 | |
Roman Masanin | 881db86895 | |
eray orçunus | a01b14f301 | |
majestic | c091a5c11a | |
eray orçunus | ed82c55475 | |
eray orçunus | 570ccb7db1 | |
erorcun | b3b21e0af3 | |
eray orçunus | 73a3e9d5bb | |
erorcun | b97f86deea | |
aap | eae9e7e685 | |
Roman Masanin | e52c5ca1bb | |
majestic | 9a10501698 | |
eray orçunus | a252e3a02a | |
Filip Gawin | 6bae5a6031 | |
eray orçunus | fec01aeff1 | |
Andrew Udvare | 1a3e254b6c | |
Andrew Udvare | ef9455c324 | |
Andrew Udvare | 2bb29a50b7 | |
Andrew Udvare | d590fdddf6 | |
erorcun | 3435d6656c | |
majestic | 7861992fe6 | |
majestic | f5e6a3a274 | |
erorcun | fa373c7fdb | |
erorcun | 8b7bf76260 | |
eray orçunus | da39624f1c | |
majestic | 6556dc1fdf | |
Roman Masanin | a6a1de5006 | |
Filip Gawin | e3571510ae | |
Roman Masanin | 4fd93fea51 | |
Roman Masanin | e3273d7268 | |
majestic | fd0602a9ac | |
eray orçunus | 6f3f581d8a | |
Roman Masanin | 4867d9949d | |
eray orçunus | 49ae7da5ce | |
Roman Masanin | 1b3144f978 | |
Roman Masanin | 063a80ecfb | |
Roman Masanin | 55d94c99b8 | |
majestic | 3a2be9a4ed | |
shfil | 9d53b738cc | |
Nikolay Korolev | 8761763d95 | |
Roman Masanin | 1991f9b362 | |
erorcun | 72f342245d | |
Roman Masanin | 6ff138ca76 | |
Roman Masanin | 064f2e66e1 | |
Roman Masanin | e5a48faf89 | |
Roman Masanin | 63e5faef11 | |
Roman Masanin | e54b540bd4 | |
Roman Masanin | 311cffa901 | |
Roman Masanin | eb0e89d3ea | |
majestic | 2f9dd8bad9 | |
Roman Masanin | 049c993ce0 | |
Roman Masanin | fe46aa5cc2 | |
Filip Gawin | 4ec5e44b68 | |
Nikolay Korolev | 0a58e3e430 | |
Nikolay Korolev | 4c582b19eb | |
Nikolay Korolev | 6068188453 | |
Roman Masanin | db0758690e | |
majestic | d4efd003bc | |
eray orçunus | f740588780 | |
eray orçunus | f71953077d | |
Sergeanur | fae4c73ad3 | |
Filip Gawin | 73e4350320 | |
Filip Gawin | 6c59d97520 | |
Filip Gawin | 855c6a3c05 | |
Filip Gawin | ff2998bee3 | |
Sergeanur | 2129cc2906 | |
Nikolay Korolev | 9cce324316 | |
shfil | f35fd97c76 | |
Filip Gawin | 35656fe0e8 | |
shfil | 35d7591def | |
erorcun | f9dc00a458 | |
erorcun | 1fa852f118 | |
eray orçunus | 7646ceeaaa | |
eray orçunus | a0588ef8b1 | |
erorcun | e2314c7852 | |
Roman Masanin | a729f32c83 | |
Roman Masanin | a5269b998b | |
Roman Masanin | c317d3d9b1 | |
shfil | bc0bdd02f4 | |
Roman Masanin | ca73f0344c | |
Roman Masanin | b956be0f44 | |
Roman Masanin | f67275be13 | |
eray orçunus | a5d6c952a7 | |
Sergeanur | 4cfc61da14 | |
Roman Masanin | c403df0861 | |
Roman Masanin | bb2e601e13 | |
Nikolay Korolev | c5699a9b30 | |
Nikolay Korolev | 3c5624bc56 | |
Nikolay Korolev | f7d5021ac5 | |
Roman Masanin | 4c220b1f95 | |
Roman Masanin | 356c50ec1e | |
Roman Masanin | ec8ac117ed | |
Roman Masanin | c61160fee3 | |
Roman Masanin | 1bd497effc | |
Sergeanur | 4d1182bdb1 | |
Roman Masanin | e256eaf014 | |
Sergeanur | dd93a90ab2 | |
Roman Masanin | a75ddd0d0c | |
Sergeanur | c3d7a73c0b | |
Roman Masanin | 6e3523d594 | |
Roman Masanin | 4d1023ca30 | |
Roman Masanin | f097b9c972 | |
Roman Masanin | 4414288b86 | |
Roman Masanin | b3cbe3d338 | |
Roman Masanin | 1d22c78f9f | |
guyE | 01845812a1 | |
eray orçunus | dbc458a4d7 | |
Sergeanur | 288f99d507 | |
Roman Masanin | b2e3d90734 | |
Sergeanur | a043902d9a | |
Roman Masanin | a9c3fdd63f | |
Sergeanur | bde17bb395 | |
Roman Masanin | 579d96534d | |
Roman Masanin | 0f119ed371 | |
Roman Masanin | 5b9e4c4780 | |
shfil | 3bad82db3b | |
Sergeanur | ec2f4fde93 | |
Roman Masanin | 223cd11835 | |
Roman Masanin | 5f810ff21c | |
Roman Masanin | 7f77e8a441 | |
Roman Masanin | 3ab01fa6a3 | |
Roman Masanin | c19c5ca083 | |
Roman Masanin | 2d3d5d67ee | |
Sergeanur | dff49e9c23 | |
Roman Masanin | 97550b4fd9 | |
Roman Masanin | 16dab00bec | |
Sergeanur | a8a28c1512 | |
Roman Masanin | 8f948228d5 | |
Roman Masanin | aa2f1b6b29 | |
Nikolay Korolev | 084efb1f14 | |
Sergeanur | 25a22cc6f2 | |
Nikolay Korolev | e5faeea2e5 | |
Nikolay Korolev | f0b15ee053 | |
erorcun | e9a7ab789d | |
Sergeanur | bc0a97af04 | |
Sergeanur | f6c0bcf201 | |
Sergeanur | 7aca08a954 | |
Sergeanur | c5b411c1ed | |
Sergeanur | f0ccbcb281 | |
Sergeanur | 4f4b1f9145 | |
erorcun | 350b1ec67e | |
eray orçunus | 3f402d23ff | |
Sergeanur | 9b47625115 | |
Sergeanur | fa7334c74f | |
Nikolay Korolev | 3e4f7b7bdf | |
eray orçunus | 16e10d788a | |
majestic | 9f43b1988b | |
aap | 0640ec7f5a | |
aap | e3f607dba0 | |
aap | 6fc6ed8635 | |
Sergeanur | 3bb0e78e1c | |
Sergeanur | 6778640b52 | |
Sergeanur | df67c73d81 | |
Sergeanur | 024f0a5027 | |
Sergeanur | 8a0a29c64e | |
Nikolay Korolev | 647ddfa05e | |
Nikolay Korolev | 4ffca8954f | |
Nikolay Korolev | ed799fb555 | |
erorcun | b7456c604d | |
Fire-Head | c22d252246 | |
eray orçunus | 3e549a7d44 | |
aap | e0f6459674 | |
Fire_Head | a8999bbf38 | |
Fire-Head | 210c7b8785 | |
Fire-Head | a38702a7d2 | |
Nikolay Korolev | 1fff83eeee | |
aap | 24e74f785e | |
aap | 8e7989087d | |
Sergeanur | 963e85f047 | |
Sergeanur | 14ed50a559 | |
Sergeanur | 041d342faf | |
Sergeanur | 85cf043e4a | |
Sergeanur | a3322f17d5 | |
Sergeanur | bbcf3fd7d2 | |
aap | 56b80cb0ab | |
aap | 0a19925e99 | |
aap | 38a01a59fa | |
Nikolay Korolev | 0fd6fb1ff4 | |
aap | 4545ddee6d | |
aap | 13c34b0863 | |
aap | cc2f13710d | |
aap | 23c52c1c86 | |
aap | 537b63acb5 | |
aap | a6fe606ce6 | |
aap | 857cef776d | |
majestic | 03c90b7c40 | |
aap | 7da4f7fc35 | |
aap | 764af8735c | |
aap | 30dadcfb22 | |
Sergeanur | 9fd91e6250 | |
Sergeanur | dab6d6dd6d | |
Sergeanur | 827b240078 | |
aap | bb948904b6 | |
aap | c1367ebdca | |
aap | 895055a3d1 | |
aap | 827ba62671 | |
aap | 5ac83e4b4c | |
aap | dba992f388 | |
Nikolay Korolev | 1c275695c4 | |
Nikolay Korolev | cc66df18ac | |
Nikolay Korolev | d303c33c2e | |
eray orçunus | 980dd1b5a1 | |
Nikolay Korolev | 7669b97ac6 | |
Nikolay Korolev | b612e84be8 | |
Sergeanur | 9956b27767 | |
erorcun | 07038ce88e | |
eray orçunus | 8b3ca9564b | |
eray orçunus | f403a63a5c | |
Sergeanur | 56388472cb | |
Sergeanur | 0ae41be16b | |
Sergeanur | 28dc67dc86 | |
aap | 85d76dc171 | |
eray orçunus | 80a83d48f3 | |
eray orçunus | b54bb62c94 | |
aap | cdebea71f3 | |
aap | 0d8fcb41ee | |
aap | 18647717df | |
aap | 878ffa8998 | |
aap | a9935dcd45 | |
aap | 4635daf6b3 | |
aap | b468d010a8 | |
aap | c3443bff99 | |
majestic | 2d1b48267d | |
Sergeanur | 1c1fa25e6c | |
aap | c2c65207a3 | |
aap | 2f987e315e | |
majestic | 70029752f5 | |
majestic | b73b6b8e13 | |
aap | e57d450809 | |
aap | 43bf854374 | |
aap | 4118d2aa55 | |
aap | 0bb46f3f8c | |
aap | 6514bc6b39 | |
aap | 951439486f | |
aap | b02c7cdc44 | |
Fire-Head | d2d8bea51e | |
Fire_Head | dbaeaa45cf | |
Fire-Head | 1a72701903 | |
Fire-Head | 265b07a8d9 | |
Fire-Head | d2e090317f | |
Nikolay Korolev | db406e3c82 | |
Sergeanur | 0328cb04d7 | |
Sergeanur | 2d9b898271 | |
Sergeanur | b5cd52b9b3 | |
Sergeanur | f3d8f44c4e | |
aap | 658f94f155 | |
Sergeanur | 7d8ffa9ebd | |
aap | 40185161b8 | |
Fire_Head | 6fcc75032e | |
Fire-Head | 89fd7759a3 | |
aap | d801167637 | |
majestic | 394134f774 | |
Sergeanur | 3e24ae8812 | |
erorcun | bda383c9cd | |
Fire-Head | f6663b01bc | |
Fire-Head | 224fd77641 | |
eray orçunus | eafa9cc107 | |
Fire-Head | e2ded2d6ce | |
eray orçunus | 4a55f19761 | |
Sergeanur | 9df1d08348 | |
Sergeanur | 86cc86ac12 | |
Sergeanur | acdc52116e | |
Fire-Head | f2f19ccea3 | |
Fire_Head | 52e77c6634 | |
Fire-Head | 1803dcc873 | |
aap | c649028b01 | |
aap | fb4de46626 | |
erorcun | 3d91d4fc6a | |
eray orçunus | c87b639a84 | |
erorcun | ef7afe5f2f | |
eray orçunus | 429f6b03c4 | |
aap | c0eb3d10e2 | |
aap | 6b7a8f96a6 | |
erorcun | 5d266ace64 | |
aap | 90fdc4328b | |
eray orçunus | 7fea567eb2 | |
aap | 1c44368f0a | |
erorcun | b05cb3f1a3 | |
eray orçunus | ad6094ca1d | |
erorcun | 53e7cbbd5a | |
eray orçunus | 732b760829 | |
aap | 8117bcb56f | |
Sergeanur | f882586eb8 | |
erorcun | b182fa4bb8 | |
erorcun | 7e54a226e2 | |
eray orçunus | f40f44b14e | |
aap | c813630aad | |
aap | bde159291c | |
aap | 34b162d2c9 | |
aap | 0fba76a565 | |
aap | 5bedca7692 | |
aap | ee2d0ffc14 | |
aap | f0f3ce018d | |
aap | 2612c9f12c | |
majestic | 1ff27e3363 | |
aap | e74b569115 | |
Sergeanur | a1412d1cdb | |
Sergeanur | eaf569eb6d | |
Sergeanur | 87eb96453a | |
Sergeanur | dd717b2d93 | |
Sergeanur | cf5dd6289e | |
Sergeanur | 30384bb4ef | |
Sergeanur | de8759eabd | |
Sergeanur | ebdc5cca7f | |
aap | 4e3e1d0b87 | |
Sergeanur | d0f5464200 | |
erorcun | 30723cf723 | |
eray orçunus | 67a3c7d2ee | |
erorcun | 592a6cc792 | |
Dominik | fa1263b6a4 | |
aap | 515559d00c | |
Dominik | 478d4246c4 | |
eray orçunus | c483a044b5 | |
eray orçunus | 70fa4ab79c | |
eray orçunus | ceb1defc4e | |
aap | 2c50cf8ac6 | |
aap | 0acade08ca | |
aap | 1e679dcb8d | |
eray orçunus | 716740f918 | |
Fire-Head | 4c65ec28d6 | |
Nikolay Korolev | 49a8dd7459 | |
Nikolay Korolev | 9bb8b39956 | |
Nikolay Korolev | 48ebbb7292 | |
Fire-Head | d4004805f5 | |
aap | 2141247e08 | |
Nikolay Korolev | 389123cff3 | |
Nikolay Korolev | ade5dff217 | |
Sergeanur | 8045bec6a5 | |
Sergeanur | cbed027c0e | |
Sergeanur | 87fa69385c | |
Sergeanur | 1d2d5fe6ae | |
Sergeanur | 6f81e84bd4 | |
Filip Gawin | 6cf698badd | |
aap | 94ce376a76 | |
Sergeanur | b26eec5daf | |
aap | 3370ae04cb | |
eray orçunus | c72fab15b4 | |
aap | 592a6aef0b | |
aap | 2b21f92347 | |
aap | 077bcf1c82 | |
aap | 3989e3df18 | |
eray orçunus | f3ed6659c3 | |
aap | 60f736f20f | |
aap | b81bf1e138 | |
aap | e563450cb6 | |
eray orçunus | d6a853bd60 | |
eray orçunus | cc60ad1946 | |
eray orçunus | 2d2833f2e4 | |
eray orçunus | fd3cd2c26a | |
eray orçunus | 0625954bb7 | |
aap | 7700970c93 | |
aap | c5205a89ee | |
Nikolay Korolev | 144f12525e | |
Nikolay Korolev | eab6741afe | |
Nikolay Korolev | e9e533b0cb | |
eray orçunus | e44704dc82 | |
eray orçunus | e9d5d42ea9 | |
Nikolay Korolev | f54af8b973 | |
erorcun | ee456481cb | |
erorcun | d322a8033e | |
erorcun | 812b26b668 | |
eray orçunus | a822692c26 | |
erorcun | 7ae0b8ef06 | |
erorcun | 6f0304f90e | |
eray orçunus | c6bb1f5d0d | |
aap | 7ceedc1d47 | |
eray orçunus | 3a600b4684 | |
aap | dc7d4e1134 | |
eray orçunus | 595576b151 | |
eray orçunus | c4e129509b | |
aap | 62024217b7 | |
Sergeanur | 655eaa36ce | |
eray orçunus | 686d6e9834 | |
eray orçunus | ef4c8f53c5 | |
eray orçunus | 2d976827dd | |
aap | 0741fd5b1d | |
erorcun | f64d3ad7de | |
eray orçunus | db6110e996 | |
majestic | 015921522d | |
aap | 75fcedb030 | |
aap | c7a32bb83d | |
Nikolay Korolev | f78f707935 | |
Nikolay Korolev | 3900366a6b | |
Nikolay Korolev | 17dd26e1ca | |
aap | 9ab3683148 | |
majestic | 2cc8ecbb90 | |
majestic | 94e3c30054 | |
majestic | 669db1a293 | |
majestic | cf8fcada6e | |
majestic | 287987b8fe | |
majestic | a99da7b94e | |
aap | b07b1f0b51 | |
eray orçunus | dba2b052a6 | |
Sergeanur | 0321f3b55f | |
Sergeanur | 85d845c5ce | |
Sergeanur | 95e9fe7693 | |
Sergeanur | 8cd87236c9 | |
aap | f8b4c0ee1d | |
aap | d5515c9d0e | |
Sergeanur | 65032389a4 | |
Sergeanur | 5942f1a8f9 | |
Sergeanur | 36a6d124aa | |
Sergeanur | 0afb1d9e24 | |
Nikolay Korolev | 2de3c6d67b | |
Nikolay Korolev | b498ad800c | |
Nikolay Korolev | d48749f797 | |
eray orçunus | 94e9101ce0 | |
Nikolay Korolev | 16a5c2f676 | |
Nikolay Korolev | 5ec46bcdfb | |
eray orçunus | a77b181e32 | |
Nikolay Korolev | 5a09eeea27 | |
eray orçunus | e07b6fdce7 | |
Nikolay Korolev | 23f20ceaf8 | |
Nikolay Korolev | 27eaa10873 | |
Nikolay Korolev | 2f9becbac6 | |
eray orçunus | 6cc39e9bdb | |
eray orçunus | 88f066f469 | |
aap | dda9d03e54 | |
aap | 464b232321 | |
Nikolay Korolev | c5a24eaf70 | |
Nikolay Korolev | 1748aabd69 | |
aap | 3f5ecbe007 | |
Nikolay Korolev | b14e034344 | |
Nikolay Korolev | d0213e466c | |
Nikolay Korolev | 0b156f1d26 | |
Sergeanur | fe3a3ad8b5 | |
Nikolay Korolev | c50a61d52a | |
eray orçunus | de4323f949 | |
eray orçunus | d1a02e6ddc | |
Nikolay Korolev | 5fd330b35e | |
aap | 1234fe9c1c | |
Sergeanur | a44510d1df | |
Sergeanur | 0d0e519e68 | |
Sergeanur | 950cb9a717 | |
Sergeanur | 91e2b427ef | |
Sergeanur | fc7e35e1cd | |
Sergeanur | 24bf4c2cba | |
Sergeanur | 1c01899799 | |
Sergeanur | 678a19ce3b | |
aap | 5711159e68 | |
eray orçunus | db9057f5a8 | |
eray orçunus | 096ecc1d14 | |
eray orçunus | fc0498b3a8 | |
eray orçunus | 4e4a3489ef | |
aap | d6640832f1 | |
aap | ef4f8ec713 | |
aap | c0481e7207 | |
Sergeanur | afa4fa6510 | |
aap | 68caac1abd | |
majestic | f014b29fc4 | |
majestic | 66262b14ad | |
aap | fe71a58f28 | |
eray orçunus | d3736ccb17 | |
eray orçunus | f045ce4386 | |
aap | 1bfb01d5f5 | |
Nikolay Korolev | 83e4023dc0 | |
aap | 2641cd6737 | |
Nikolay Korolev | d325a3d247 | |
majestic | e2cc3e1a33 | |
aap | 647fd951ec | |
aap | 7f0474e9de | |
shfil | 4a7f0849ab | |
shfil | 7059bead84 | |
aap | f7612c4a49 | |
aap | 3e36428568 | |
Sergeanur | 07c6752cf7 | |
Sergeanur | a6e4619378 | |
Sergeanur | 07d336ddf0 | |
majestic | 20ffcb68b6 | |
aap | e1201fc6e2 | |
erorcun | 1e2b087601 | |
eray orçunus | 5dc410a999 | |
aap | c498af29aa | |
aap | ad03d9543b | |
aap | b73e42346e | |
Sergeanur | 509ca11d76 | |
aap | 2ca3c50463 | |
aap | 2e3cb77702 | |
aap | 06c761e9ac | |
aap | dbeaafbe99 | |
erorcun | 03d9525eb6 | |
aap | bfd13d58e0 | |
aap | fdf8f35049 | |
aap | d8272b8812 | |
aap | b7037e3cf7 | |
aap | 21afcd8767 | |
aap | 25273485d9 | |
eray orçunus | abef04c637 | |
eray orçunus | d930a25d94 | |
aap | de1018d7a6 | |
aap | 6d3e54369c | |
aap | 197c49d740 | |
Nikolay Korolev | 0631bd9d89 | |
Nikolay Korolev | 815d3e0f61 | |
Nikolay Korolev | f945dbc0fb | |
Nikolay Korolev | c1c163d78c | |
aap | 21ce0a4b28 | |
aap | 00dc86917e | |
aap | 218772c296 | |
aap | c1e13177a1 | |
Nikolay Korolev | 49a897c3b3 | |
Nikolay Korolev | 09c9e16cb1 | |
eray orçunus | dd162c3aa0 | |
eray orçunus | 529cec5653 | |
Nikolay Korolev | 627ffb0f82 | |
aap | ab7a21e017 | |
Fire-Head | 8280e04b23 | |
Fire_Head | 7f30a2ae1b | |
Fire-Head | fab2c8699c | |
Fire-Head | 98af5e4ddb | |
Fire-Head | 895580c724 | |
Fire_Head | e4649b41e1 | |
Fire-Head | 63d0bdc863 | |
aap | 717b0a6514 | |
Sergeanur | 53ac163a3e | |
Nikolay Korolev | d4ae40ae99 | |
aap | 02741dc64f | |
aap | d71cbae9df | |
aap | c068570192 | |
aap | 4868bf13a8 | |
Sergeanur | 591c35d51b | |
aap | d0d060d321 | |
Sergeanur | 408faf8a66 | |
Fire-Head | 90947a608f | |
Fire-Head | 6a32981ba5 | |
aap | ea09825d10 | |
Fire_Head | ae8a377f26 | |
aap | 7f60be9814 | |
Sergeanur | 1991aa388b | |
Sergeanur | 0ce2af7a0d | |
aap | 0cd883e2a1 | |
Nikolay Korolev | f40677c7a4 | |
aap | 314e56b7b9 | |
aap | dfa95002aa | |
aap | 800d706935 | |
aap | d8528ebbbe | |
aap | 0b8f045d36 | |
aap | 7bf8337854 | |
blingu | 79c652e115 | |
blingu | 55ece14f42 | |
nrb | 25d3f948d3 | |
nrb | d59862eb5e | |
Nikolay Korolev | 6235e2140e | |
Nikolay Korolev | 8705562559 | |
Nikolay Korolev | 8c510a8d5b | |
Nikolay Korolev | e248cbcc7d | |
Nikolay Korolev | 9c93cc7d6f | |
Nikolay Korolev | cda3752838 | |
aap | 19a0c8b462 | |
aap | 34f5e923ef | |
eray orçunus | 4870d9a31b | |
Nikolay Korolev | 6a7bd0e330 | |
Sergeanur | 88b6168f1c | |
Nikolay Korolev | 2966be41ba | |
Nikolay Korolev | 607175f02a | |
eray orçunus | 5276abb0fb | |
eray orçunus | c3b41d79a2 | |
erorcun | 530b5ff58d | |
eray orçunus | 5357957fe1 | |
aap | 9313bfa155 | |
Nikolay Korolev | 9c6046455e | |
aap | df763bdb98 | |
Nikolay Korolev | 7b7b0fb5f2 | |
Nikolay Korolev | f8a509ffb3 | |
Nikolay Korolev | b9115b4429 | |
Nikolay Korolev | 7bf561d440 | |
aap | b105403dc7 | |
aap | a1e4b15bcc | |
aap | 8fb72afac9 | |
Nikolay Korolev | 6e51ed3c53 | |
erorcun | 4b99d7127f | |
Xin | a878e09f0f | |
erorcun | 8b82e9c40f | |
aap | a53ca58e56 | |
aap | 380f7bc417 | |
erorcun | 4fd1771f71 | |
eray orçunus | a5f23a0342 | |
Nikolay Korolev | 5a18e69425 | |
Nikolay Korolev | 864847a6fe | |
Xinerki | 900d5a4ce0 | |
Xinerki | e0345732c0 | |
Xinerki | 0db3d03c3c | |
Xinerki | 1c00e3cf2c | |
Xinerki | 6692f5b2aa | |
Xinerki | 6912cfe98a | |
Xinerki | 46c6b0d29d | |
Xinerki | 3e75de9709 | |
Xinerki | 1cb7b9876f | |
Xinerki | b4060a4789 | |
Xinerki | 2db26d304f | |
Xinerki | 6d32cf4a11 | |
aap | ff219da3eb | |
aap | bc4d628940 | |
Nikolay Korolev | 7e5342e9f0 | |
Nikolay Korolev | 510261cb05 | |
Nikolay Korolev | 0085ed894f | |
eray orçunus | 5b953228b4 | |
aap | f2e55d57cc | |
aap | 71b9b2ecf9 | |
aap | 114208533a | |
Nikolay Korolev | f33a01e8c8 | |
Nikolay Korolev | d84650fbe5 | |
eray orçunus | 2ab3fb5dd0 | |
Sergeanur | c53b23cff0 | |
aap | fd4cd3e8f1 | |
aap | 98b158c783 | |
Nikolay Korolev | fec0028e12 | |
aap | c623ec8a2d | |
erorcun | ada5c245a8 | |
aap | bdbe5d1080 | |
Nikolay Korolev | 46d1889344 | |
Nikolay Korolev | e967db4a3c | |
Nikolay Korolev | 41d7b3244b | |
Nikolay Korolev | 4c822e8375 | |
eray orçunus | 99574ebfc6 | |
eray orçunus | a6972714b7 | |
aap | 8a90e32f1b | |
aap | 6b0b984909 | |
Xinerki | ffd175c705 | |
Xinerki | 12b48edada | |
aap | 53cdf6ab41 | |
aap | 401e45d63e | |
Xinerki | 9e14e8553f | |
Nikolay Korolev | ff0e039599 | |
aap | 9d16df5aa8 | |
Xinerki | 00ee82aba6 | |
aap | 62db8cd9b0 | |
Xinerki | d425358181 | |
Nikolay Korolev | a27fc8d9d9 | |
Nikolay Korolev | 6510b15704 | |
aap | abd230dcdd | |
aap | a8f4f74a76 | |
aap | 68f1c03a85 | |
aap | 2d4861454c | |
aap | 8f9ce275c8 | |
Sergeanur | af22bb1495 | |
Nikolay Korolev | 5ab2c85e97 | |
eray orçunus | f71cfdf8ef | |
eray orçunus | 96151ec0f0 | |
Nikolay Korolev | ad8a8913d9 | |
Nikolay Korolev | fd2948f045 | |
Nikolay Korolev | 39931a5284 | |
aap | 13903d7c46 | |
eray orçunus | 7bd6c70318 | |
Nikolay Korolev | d5d2f6a822 | |
Nikolay Korolev | 3cc20d7962 | |
Nikolay Korolev | a5b84eb9fe | |
aap | 8a7210cad1 | |
eray orçunus | 84f8312b86 | |
aap | a0703fd9e1 | |
aap | 3f2bdc096d | |
Sergeanur | 37480fb617 | |
Sergeanur | 77f97ad2ad | |
Nikolay Korolev | 5c8888d2ed | |
Nikolay Korolev | b587d835e8 | |
Sergeanur | 1a42d62d3a | |
Nikolay Korolev | e3291b0cb1 | |
eray orçunus | 40ee29fb99 | |
aap | 793a6a6d7e | |
Nikolay Korolev | 7b89baceaa | |
Nikolay Korolev | c33b93793f | |
aap | 9558baa353 | |
Nikolay Korolev | 81e711517d | |
Nikolay Korolev | 6556cb0db9 | |
Nikolay Korolev | 4defd8b75c | |
aap | 9dc5dca209 | |
Nikolay Korolev | 9067469f7c | |
Nikolay Korolev | cf5db73117 | |
Nikolay Korolev | 03c4a979c8 | |
Nikolay Korolev | 5abd466b5d | |
Nikolay Korolev | 5491a51daa | |
Sergeanur | 76dd769085 | |
Nikolay Korolev | a4562c5720 | |
Nikolay Korolev | f864698696 | |
Nikolay Korolev | 21329b8440 | |
Nikolay Korolev | 08b2138c7e | |
erorcun | 8ff72f0728 | |
eray orçunus | acd1ea9909 | |
aap | 1fde2ba468 | |
Nikolay Korolev | 09a0207e55 | |
Sergeanur | ede6b7db6a | |
Sergeanur | 24875f34d0 | |
aap | 41e9754338 | |
Nikolay Korolev | d031943f2a | |
Nikolay Korolev | d426588496 | |
Nikolay Korolev | 81ea6f0258 | |
Sergeanur | 7c2b9478d5 | |
Sergeanur | 33dfaf7da1 | |
Nikolay Korolev | dc444b9ca0 | |
aap | 40829b5242 | |
Nikolay Korolev | ca6ed7f00f | |
Nikolay Korolev | 4b566c26a3 | |
aap | 30b3f34d91 | |
Nikolay Korolev | 9647587447 | |
Nikolay Korolev | 3e64274f6b | |
aap | ce2071e1e6 | |
aap | 0eb5f93e96 | |
aap | 6e4710b717 | |
Nikolay Korolev | 9b23e33c36 | |
Sergeanur | d9db03d606 | |
Sergeanur | 5f1c3fa208 | |
Sergeanur | 0aa7f13c32 | |
Nikolay Korolev | 5f5babe7fe | |
Nikolay Korolev | 8fae2dcc26 | |
aap | d4250fc2c7 | |
aap | ad90a06a39 | |
Nikolay Korolev | 2f085ea5f5 | |
Nikolay Korolev | 2f979a8cde | |
aap | 198b80f560 | |
aap | 9e842f1628 | |
aap | 7919b92d28 | |
aap | d9a8bab631 | |
aap | c07727eed0 | |
Nikolay Korolev | 653d808417 | |
aap | 0552d49fce | |
Nikolay Korolev | 00cdcef36a | |
Nikolay Korolev | 512f5657f7 | |
Nikolay Korolev | 61eb361d26 | |
aap | f7aa4e108a | |
aap | f7300c7a27 | |
aap | 058690aad7 | |
Nikolay Korolev | 4b892e9eb9 | |
Nikolay Korolev | 662246b9e2 | |
Nikolay Korolev | 1f3f82eedc | |
aap | 58d9e9cd59 | |
Nikolay Korolev | a827f0dd55 | |
Nikolay Korolev | 2f7d2fa3ad | |
aap | 1b936f6ffb | |
aap | f0442960a2 | |
aap | e9fbd2ccfd | |
Sergeanur | 35c41208f5 | |
aap | e4683a3074 | |
Nikolay Korolev | 3de003a8e7 | |
Nikolay Korolev | 5fd8eec42c | |
aap | c020992e4d | |
Nikolay Korolev | 609caad7a4 | |
Nikolay Korolev | a55e738dfa | |
aap | f23ecfbc84 | |
aap | 97d5698e0c | |
aap | 989ded6052 | |
aap | 36e1f7b4fb | |
eray orçunus | b80c4bae6b | |
aap | ea053467b5 | |
aap | 40cfd0576f | |
aap | e8c0619226 | |
Sergeanur | 4b8d6a3223 | |
Nikolay Korolev | e30b538cd3 | |
Nikolay Korolev | 46d891b745 | |
Nikolay Korolev | 3d394c2f95 | |
Nikolay Korolev | 7e753c2596 | |
aap | 08de6d487a | |
aap | 87ea37248f | |
Nikolay Korolev | f902136b6a | |
Nikolay Korolev | 75943a57b2 | |
Sergeanur | 1ef8d61f36 | |
Nikolay Korolev | 756e4dd068 | |
Nikolay Korolev | 6065f5e52b | |
aap | 2eee4c5176 | |
aap | 78ca912434 | |
Nikolay Korolev | c11a20cb4f | |
Nikolay Korolev | fb1f51241d | |
aap | 2171ebe2da | |
Nikolay Korolev | db26700352 | |
Nikolay Korolev | 09dc1f9e1e | |
Nikolay Korolev | 49cf53644a | |
Nikolay Korolev | 44c5cdf453 | |
Sergeanur | a483243c52 | |
Nikolay Korolev | b99346e6ca | |
Nikolay Korolev | 2dc818e4d2 | |
aap | c715569d1d | |
aap | f80474f590 | |
aap | 19b21cafcd | |
Nikolay Korolev | 5780b4503e | |
Nikolay Korolev | 40888e9486 | |
aap | 8bb22b2ad8 | |
aap | 6a7d08ecc2 | |
Sergeanur | f13c4e6aca | |
aap | 54662674e6 | |
aap | dbbf390983 | |
Sergeanur | 7dc649ede6 | |
aap | f5c0bf3b60 | |
aap | 152c7c452c | |
Sergeanur | bef436400d | |
aap | aff89c6f5c | |
aap | 05a1d64fbb | |
aap | a8d8c0690d | |
Nikolay Korolev | a7c17a329a | |
aap | 3931dc795f | |
aap | a1c229784f | |
aap | 965ea93a61 | |
Nikolay Korolev | 31ebbf348f | |
Nikolay Korolev | 599b7301c8 | |
Nikolay Korolev | 03cecb6f1c | |
Nikolay Korolev | f34431a506 | |
Sergeanur | 6ad66fb2d7 | |
Nikolay Korolev | 53107d3b71 | |
Nikolay Korolev | 0930d70134 | |
Nikolay Korolev | d5e76471ae | |
aap | f1c1f56b12 | |
Sergeanur | fc8c28722f | |
aap | a76b88da08 | |
aap | c11912a8ec | |
Sergeanur | d015e09c92 | |
aap | 224727c14d | |
Nikolay Korolev | bd4d5d7c47 | |
Nikolay Korolev | 15520fe77d | |
Nikolay Korolev | 3b08efa2ad | |
Sergeanur | bb55430f75 | |
Nikolay Korolev | 88076a0050 | |
aap | 25a4091fa8 | |
Nikolay Korolev | 4d06271a29 | |
aap | 600cbee7d4 | |
aap | 13c24a310d | |
Nikolay Korolev | 8c036ec671 | |
Sergeanur | bb8b6348ec | |
Sergeanur | c0488d9ecf | |
aap | e0568a19d5 | |
Nikolay Korolev | 98177f27ba | |
aap | aa8968ecf2 | |
aap | ed021431e9 | |
aap | 31f9bb566b | |
Nikolay Korolev | a7036475c3 | |
Nikolay Korolev | e5da4c2b4d | |
Nikolay Korolev | 0b104a59fe | |
aap | 68d3ea9c42 | |
Nikolay Korolev | 35bf340401 | |
Nikolay Korolev | f0896ceba7 | |
Nikolay Korolev | 1291dd534b | |
Sergeanur | 0b61ae11ec | |
Sergeanur | a02b4c9592 | |
Sergeanur | 42a64a2379 | |
Sergeanur | 4bd4d24802 | |
Nikolay Korolev | f45ea0a1cf | |
Nikolay Korolev | 918d6dbf56 | |
aap | 7428590457 | |
aap | 559ad5c5e2 | |
Nikolay Korolev | 3e18b92ccc | |
aap | e81652c2fc | |
Nikolay Korolev | 6b4b708fa7 | |
Sergeanur | 22e8b0e419 | |
Sergeanur | 12fbf8cede | |
aap | 2c0b82ec1a | |
Nikolay Korolev | 2a29c6c214 | |
Nikolay Korolev | edeb8736f1 | |
Sergeanur | 7afa4f8316 | |
Sergeanur | 0aab36c5a7 | |
Sergeanur | cb8ffbac73 | |
Sergeanur | 74b522af71 | |
Sergeanur | c2b9ddc5b8 |
|
@ -1,24 +0,0 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior.
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Version**
|
||||
Tell us what version you're running. Find out using the debug menu (Ctrl-M, Debug -> Version Text)
|
||||
If you send a screenshot just enable it beforehand.
|
|
@ -1,4 +1,4 @@
|
|||
name: re3 conan+cmake
|
||||
name: reVC 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 }} re3/master@ -if build -o re3:audio=${{ matrix.audio }} -o librw:platform=${{ matrix.platform }} -o librw:gl3_gfxlib=${{ matrix.gl3_gfxlib || 'glfw' }} --build missing -pr:h ./host_profile -pr:b default -s re3:build_type=RelWithDebInfo -s librw:build_type=RelWithDebInfo
|
||||
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
|
||||
env:
|
||||
CONAN_SYSREQUIRES_MODE: enabled
|
||||
- name: "Build re3 (conan build)"
|
||||
- name: "Build reVC (conan build)"
|
||||
run: |
|
||||
conan build ${{ github.workspace }} -if build -bf build -pf package
|
||||
- name: "Package re3 (conan package)"
|
||||
- name: "Package reVC (conan package)"
|
||||
run: |
|
||||
conan package ${{ github.workspace }} -if build -bf build -pf package
|
||||
- name: "Create binary package (cpack)"
|
||||
|
@ -113,5 +113,5 @@ jobs:
|
|||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: "${{ matrix.os }}-${{ matrix.platform }}"
|
||||
path: build/*.zip
|
||||
path: build/*.tar.xz
|
||||
if-no-files-found: error
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
name: re3 cmake devkitA64 (Nintendo Switch)
|
||||
|
||||
name: reVC cmake devkitA64 (Nintendo Switch)
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
|
@ -14,7 +15,7 @@ jobs:
|
|||
submodules: 'true'
|
||||
- name: "Build files"
|
||||
run: |
|
||||
/opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -S. -Bbuild -DRE3_AUDIO=OAL -DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=GLFW -DRE3_WITH_OPUS=False -DRE3_VENDORED_LIBRW=True -DRE3_INSTALL=True
|
||||
/opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -S. -Bbuild -DREVC_AUDIO=OAL -DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=GLFW -DREVC_WITH_OPUS=False -DREVC_VENDORED_LIBRW=True -DREVC_INSTALL=True
|
||||
cmake --build build --parallel
|
||||
- name: "Create binary package (cpack)"
|
||||
working-directory: ./build
|
||||
|
@ -24,5 +25,5 @@ jobs:
|
|||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: "switch-gl3"
|
||||
path: build/*.zip
|
||||
path: build/*.tar.xz
|
||||
if-no-files-found: error
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name: re3 premake amd64
|
||||
name: reVC 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/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
|
||||
msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
|
||||
# - name: Pack artifacts
|
||||
# run: |
|
||||
# 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
|
||||
# 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
|
||||
- name: Move binaries to gamefiles
|
||||
run: |
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.exe ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.pdb ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.exe ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.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: re3_${{matrix.buildtype}}_${{matrix.platform}}
|
||||
name: reVC_${{matrix.buildtype}}_${{matrix.platform}}
|
||||
path: ./gamefiles/*
|
||||
# - name: Upload artifact to Bintray
|
||||
# uses: hpcsc/upload-bintray-docker-action@v1
|
||||
# with:
|
||||
# repository: re3
|
||||
# repository: reVC
|
||||
# package: ${{matrix.buildtype}}_${{matrix.platform}}
|
||||
# version: 1.0-$(echo ${GITHUB_SHA}
|
||||
# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}}
|
|
@ -1,4 +1,4 @@
|
|||
name: re3 premake x86
|
||||
name: reVC premake x86
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
|
@ -37,14 +37,14 @@ jobs:
|
|||
./premake5 vs2019 --with-librw --no-full-paths --glfwdir32=${{env.GLFW_BASE}}
|
||||
- name: Build
|
||||
run: |
|
||||
msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
|
||||
msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
|
||||
# - name: Pack artifacts
|
||||
# run: |
|
||||
# 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
|
||||
# 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/*
|
||||
- name: Move binaries to gamefiles
|
||||
run: |
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.exe ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/re3.pdb ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.exe ./gamefiles/
|
||||
mv ./bin/${{matrix.platform}}/${{matrix.buildtype}}/reVC.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: re3_${{matrix.buildtype}}_${{matrix.platform}}
|
||||
name: reVC_${{matrix.buildtype}}_${{matrix.platform}}
|
||||
path: ./gamefiles/*
|
||||
# - name: Upload artifact to Bintray
|
||||
# uses: hpcsc/upload-bintray-docker-action@v1
|
||||
# with:
|
||||
# repository: re3
|
||||
# repository: reVC
|
||||
# package: ${{matrix.buildtype}}_${{matrix.platform}}
|
||||
# version: 1.0-$(echo ${GITHUB_SHA}
|
||||
# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}}
|
|
@ -355,8 +355,8 @@ vendor/glfw-3.3.2.bin.WIN64/
|
|||
|
||||
sdk/
|
||||
|
||||
codewarrior/re3.mcp
|
||||
codewarrior/re3_Data/
|
||||
codewarrior/reVC.mcp
|
||||
codewarrior/reVC_Data/
|
||||
codewarrior/Release/
|
||||
codewarrior/Debug/
|
||||
|
||||
|
|
|
@ -20,9 +20,9 @@
|
|||
"src/peds",
|
||||
"src/renderer",
|
||||
"src/rw",
|
||||
"src/save/",
|
||||
"src/skel/",
|
||||
"src/skel/glfw",
|
||||
"src/save",
|
||||
"src/save/glfw",
|
||||
"src/skel",
|
||||
"src/text",
|
||||
"src/vehicles",
|
||||
"src/weapons",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
set(EXECUTABLE re3)
|
||||
set(PROJECT RE3)
|
||||
set(EXECUTABLE reVC)
|
||||
set(PROJECT REVC)
|
||||
|
||||
project(${EXECUTABLE} C CXX)
|
||||
set(${PROJECT}_AUTHOR "${PROJECT} Team")
|
||||
|
@ -11,13 +11,14 @@ include(GetGitRevisionDescription)
|
|||
get_git_head_revision(GIT_REFSPEC GIT_SHA1 "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
|
||||
message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}")
|
||||
|
||||
|
||||
if(NINTENDO_SWITCH)
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/nx")
|
||||
include(NXFunctions)
|
||||
endif()
|
||||
|
||||
if(NOT COMMAND re3_platform_target)
|
||||
function(re3_platform_target)
|
||||
if(NOT COMMAND reVC_platform_target)
|
||||
function(reVC_platform_target)
|
||||
endfunction()
|
||||
endif()
|
||||
|
||||
|
@ -94,6 +95,6 @@ if(${PROJECT}_INSTALL)
|
|||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}")
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
|
||||
set(CPACK_GENERATOR "ZIP")
|
||||
set(CPACK_GENERATOR "TXZ")
|
||||
include(CPack)
|
||||
endif()
|
||||
|
|
52
README.md
52
README.md
|
@ -1,6 +1,6 @@
|
|||
<img src="https://github.com/GTAmodding/re3/blob/master/res/images/logo_1024.png?raw=true" alt="re3 logo" width="200">
|
||||
<img src="https://github.com/GTAmodding/re3/blob/miami/res/images/logo_1024.png?raw=true" alt="reVC logo" width="200">
|
||||
|
||||
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FGTAmodding%2Fre3%2Fbadge%3Fref%3Dmaster&style=flat)](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=master)
|
||||
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FGTAmodding%2Fre3%2Fbadge%3Fref%3Dmiami&style=flat)](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=miami)
|
||||
<a href="https://discord.gg/RFNbjsUMGg"><img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" /></a>
|
||||
|
||||
## Intro
|
||||
|
@ -12,29 +12,25 @@ Rendering is handled either by original RenderWare (D3D8)
|
|||
or the reimplementation [librw](https://github.com/aap/librw) (D3D9, OpenGL 2.1 or above, OpenGL ES 2.0 or above).\
|
||||
Audio is done with MSS (using dlls from original GTA) or OpenAL.
|
||||
|
||||
The project has also been ported to the [Nintendo Switch](https://github.com/AGraber/re3-nx/),
|
||||
[Playstation Vita](https://github.com/Rinnegatamante/re3) and
|
||||
[Nintendo Wii U](https://github.com/GaryOderNichts/re3-wiiu/).
|
||||
|
||||
We cannot build for PS2 or Xbox yet. If you're interested in doing so, get in touch with us.
|
||||
|
||||
## Installation
|
||||
|
||||
- re3 requires PC game assets to work, so you **must** own [a copy of GTA III](https://store.steampowered.com/app/12100/Grand_Theft_Auto_III/).
|
||||
- Build re3 or download the latest build:
|
||||
- [Windows D3D9 MSS 32bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_x86/master/re3_Release_win-x86-librw_d3d9-mss.zip)
|
||||
- [Windows D3D9 64bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_amd64/master/re3_Release_win-amd64-librw_d3d9-oal.zip)
|
||||
- [Windows OpenGL 64bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_amd64/master/re3_Release_win-amd64-librw_gl3_glfw-oal.zip)
|
||||
- [Linux 64bit](https://nightly.link/GTAmodding/re3/workflows/build-cmake-conan/master/ubuntu-18.04-gl3.zip)
|
||||
- [MacOS 64bit x86-64](https://nightly.link/GTAmodding/re3/workflows/build-cmake-conan/master/macos-latest-gl3.zip)
|
||||
- Extract the downloaded zip over your GTA 3 directory and run re3. The zip includes the binary, updated and additional gamefiles and in case of OpenAL the required dlls.
|
||||
- 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.
|
||||
|
||||
## Screenshots
|
||||
|
||||
![re3 2021-02-11 22-57-03-23](https://user-images.githubusercontent.com/1521437/107704085-fbdabd00-6cbc-11eb-8406-8951a80ccb16.png)
|
||||
![re3 2021-02-11 22-43-44-98](https://user-images.githubusercontent.com/1521437/107703339-cbdeea00-6cbb-11eb-8f0b-07daa105d470.png)
|
||||
![re3 2021-02-11 22-46-33-76](https://user-images.githubusercontent.com/1521437/107703343-cd101700-6cbb-11eb-9ccd-012cb90524b7.png)
|
||||
![re3 2021-02-11 22-50-29-54](https://user-images.githubusercontent.com/1521437/107703348-d00b0780-6cbb-11eb-8afd-054249c2b95e.png)
|
||||
![screen_ 1613087332](https://user-images.githubusercontent.com/1521437/107714111-f84f3200-6ccc-11eb-902e-d757481d579a.png)
|
||||
![screen_ 1613086852](https://user-images.githubusercontent.com/1521437/107714115-fa18f580-6ccc-11eb-9de5-eb4cd04865d3.png)
|
||||
![screen_ 1613086989](https://user-images.githubusercontent.com/1521437/107714103-f38a7e00-6ccc-11eb-88a3-c8c2033c51d6.png)
|
||||
![screen_ 1613087193](https://user-images.githubusercontent.com/1521437/107714106-f4bbab00-6ccc-11eb-96a9-13821d9b9684.png)
|
||||
|
||||
## Improvements
|
||||
|
||||
|
@ -44,25 +40,22 @@ 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 re3.ini file instead of gta3.set
|
||||
* 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)
|
||||
* Skinned ped support (models from Xbox or Mobile)
|
||||
* Rendering
|
||||
* Widescreen support (properly scaled HUD, Menu and FOV)
|
||||
* PS2 MatFX (vehicle reflections)
|
||||
* PS2 alpha test (better rendering of transparency)
|
||||
* PS2 particles
|
||||
* Xbox vehicle rendering
|
||||
* Xbox world lightmap rendering (needs Xbox map)
|
||||
* Xbox ped rim light
|
||||
* Xbox screen rain droplets
|
||||
* More customizable colourfilter
|
||||
* Menu
|
||||
* Map
|
||||
* More options
|
||||
* Controller configuration menu
|
||||
* ...
|
||||
|
@ -75,7 +68,6 @@ The following things would be nice to have/do:
|
|||
|
||||
* Fix physics for high FPS
|
||||
* Improve performance on lower end devices, especially the OpenGL layer on the Raspberry Pi (if you have experience with this, please get in touch)
|
||||
* Compare code with PS2 code (tedious, no good decompiler)
|
||||
* [PS2 port](https://github.com/GTAmodding/re3/wiki/PS2-port)
|
||||
* Xbox port (not quite as important)
|
||||
* reverse remaining unused/debug functions
|
||||
|
@ -93,9 +85,9 @@ Sorry for the inconvenience.
|
|||
|
||||
## Building from Source
|
||||
|
||||
When using premake, you may want to point GTA_III_RE_DIR environment variable to GTA3 root folder if you want the executable to be moved there via post-build script.
|
||||
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 https://github.com/GTAmodding/re3.git`. Then `cd re3` into the cloned repository.
|
||||
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>
|
||||
|
||||
|
@ -110,7 +102,7 @@ Install python and conan, and then run build.
|
|||
conan export vendor/librw librw/master@
|
||||
mkdir build
|
||||
cd build
|
||||
conan install .. re3/master@ -if build -o re3:audio=openal -o librw:platform=gl3 -o librw:gl3_gfxlib=glfw --build missing -s re3:build_type=RelWithDebInfo -s librw:build_type=RelWithDebInfo
|
||||
conan 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>
|
||||
|
@ -131,7 +123,7 @@ For FreeBSD using premake, proceed: [Building on FreeBSD](https://github.com/GTA
|
|||
|
||||
Assuming you have Visual Studio 2015/2017/2019:
|
||||
- Run one of the `premake-vsXXXX.cmd` variants on root folder.
|
||||
- Open build/re3.sln with Visual Studio and compile the solution.
|
||||
- Open build/reVC.sln with Visual Studio and compile the solution.
|
||||
|
||||
Microsoft recently discontinued its downloads of the DX9 SDK. You can download an archived version here: https://archive.org/details/dxsdk_jun10
|
||||
|
||||
|
@ -140,11 +132,11 @@ Microsoft recently discontinued its downloads of the DX9 SDK. You can download a
|
|||
|
||||
> :information_source: premake has an `--with-lto` option if you want the project to be compiled with Link Time Optimization.
|
||||
|
||||
> :information_source: There are various settings in [config.h](https://github.com/GTAmodding/re3/tree/master/src/core/config.h), you may want to take a look there.
|
||||
> :information_source: There are various settings in [config.h](https://github.com/GTAmodding/re3/tree/miami/src/core/config.h), you may want to take a look there.
|
||||
|
||||
> :information_source: re3 uses completely homebrew RenderWare-replacement rendering engine; [librw](https://github.com/aap/librw/). librw comes as submodule of re3, but you also can use LIBRW enviorenment variable to specify path to your own librw.
|
||||
> :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 re3 using the supplied codewarrior/re3.mcp project - this requires the original RW33 libraries, and the DX8 SDK. The build is unstable compared to the MSVC builds though, and is mostly meant to serve as a reference.
|
||||
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.
|
||||
|
||||
## 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.
|
||||
|
|
|
@ -8,7 +8,7 @@ endif()
|
|||
|
||||
set(CMAKE_EXECUTABLE_SUFFIX ".elf")
|
||||
|
||||
function(re3_platform_target TARGET)
|
||||
function(reVC_platform_target TARGET)
|
||||
cmake_parse_arguments(RPT "INSTALL" "" "" ${ARGN})
|
||||
|
||||
get_target_property(TARGET_TYPE "${TARGET}" TYPE)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
18
conanfile.py
18
conanfile.py
|
@ -5,8 +5,8 @@ import shutil
|
|||
import textwrap
|
||||
|
||||
|
||||
class Re3Conan(ConanFile):
|
||||
name = "re3"
|
||||
class ReVCConan(ConanFile):
|
||||
name = "reVC"
|
||||
version = "master"
|
||||
license = "???" # FIXME: https://github.com/GTAmodding/re3/issues/794
|
||||
settings = "os", "arch", "compiler", "build_type"
|
||||
|
@ -69,10 +69,10 @@ class Re3Conan(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("re3 with opus support requires a libsndfile built with external libs (=ogg/flac/opus/vorbis)")
|
||||
# raise ConanInvalidConfiguration("reVC with opus support requires a libsndfile built with external libs (=ogg/flac/opus/vorbis)")
|
||||
|
||||
@property
|
||||
def _re3_audio(self):
|
||||
def _reVC_audio(self):
|
||||
return {
|
||||
"miles": "MSS",
|
||||
"openal": "OAL",
|
||||
|
@ -111,16 +111,16 @@ class Re3Conan(ConanFile):
|
|||
include("{}/conanbuildinfo.cmake")
|
||||
conan_basic_setup(TARGETS NO_OUTPUT_DIRS)
|
||||
|
||||
add_subdirectory("{}" re3)
|
||||
add_subdirectory("{}" reVC)
|
||||
""").format(self.install_folder.replace("\\", "/"),
|
||||
self.source_folder.replace("\\", "/")))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
cmake = CMake(self)
|
||||
cmake.definitions["RE3_AUDIO"] = self._re3_audio
|
||||
cmake.definitions["RE3_WITH_OPUS"] = self.options.with_opus
|
||||
cmake.definitions["RE3_INSTALL"] = True
|
||||
cmake.definitions["RE3_VENDORED_LIBRW"] = False
|
||||
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
|
||||
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.
|
@ -1,363 +0,0 @@
|
|||
; Author: Alexander Roger
|
||||
; Date: 21/12/2000
|
||||
;
|
||||
; Author: Andrzej Madajczyk
|
||||
; Date: 26/02/2001
|
||||
; 14/03/2001 - Alpha (opacity) support added;
|
||||
; 10/05/2001 - Drag/Friction Decceleration changed to constants;
|
||||
; 28/08/2001 - Initial Color Variation added;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
; Note! Last line of the file MUST BE ";the end\n", otherwise you'll get parsing error(s) of the file;
|
||||
;
|
||||
;
|
||||
;
|
||||
;Particle Systems Configuration Data:: Format
|
||||
;
|
||||
;
|
||||
;A: Particle Type Name (max 20 chars)
|
||||
;
|
||||
;B/C/D: Render Colouring (r,g,b) (0-255)
|
||||
;
|
||||
;CV: Initial Color Variation (for r,g,b only, in %) (0-100);
|
||||
; (i.e. Color=(100,100,100) and CV=20, then v=random(-20,20), real_color=(100+v, 100+v, 100+v));
|
||||
;
|
||||
;
|
||||
;
|
||||
;B2/C2/D2: Fade Destination Color (r,g,b) (0-255)
|
||||
;
|
||||
;FT: Color Fade Time for (B,C,D)->(B2,C2,D2), (0 for none);
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;E: Default Initial Radius (float)
|
||||
;F: Expansion Rate (float)
|
||||
;
|
||||
;
|
||||
; Color "Fade-to-Black" options:
|
||||
;G: Initial Intensity (0-255)
|
||||
;H: Fade Time (time between fade steps in frames)
|
||||
;I: Fade Amount (-255 to 255) can get brighter or dimmer
|
||||
;
|
||||
; "Fade Alpha" options:
|
||||
;GA: Initial Intensity (0-255)
|
||||
;HA: Fade Time (time between fade steps in frames)
|
||||
;IA: Fade Amount
|
||||
;
|
||||
; "Z Rotation" options:
|
||||
;GZA: Initial Angle (0-1023)
|
||||
;HZA: Change Time (time between steps in frames)
|
||||
;IZA: Angle Change Amount
|
||||
;
|
||||
;GZR: Initial Z Radius
|
||||
;HZR: Change Time (time between steps in frames)
|
||||
;IZR: Z Radius Change Amount
|
||||
;
|
||||
;
|
||||
;J: Animation Speed (0=no animation)(time between steps msec)
|
||||
;K: Start Animation Frame ( 0 -> )
|
||||
;L: Final Animation Frame ( H -> )
|
||||
;
|
||||
;
|
||||
;M: Rotation Speed (0=None,i-deg/frame)
|
||||
;N: Gravitational Acceleration (0=none, float)
|
||||
;O: Drag/Friction Decceleration (int: 0=none, 50=0.50, 80=0.80, 90=0.90, 95=0.95, 96=0.96, 99=0.99)
|
||||
;
|
||||
;P: Default Life-Span of Particle (msec)
|
||||
;
|
||||
;Q: Position Random Error [position += (+/-)rand(a)]
|
||||
;R: Velocity Random Error [velocity += (+/-)rand(b)]
|
||||
;S: Expansion Rate Error [exp_rate += (+)rand(c)]
|
||||
;T: Rotation Rate Error [rot_speed = (+/-)rand(d)]
|
||||
;U: Life-Span Error Shape [shape distribution, e=0->all at default, e->Inf then shape->0] (max=255!!)
|
||||
;V: Trail Length Multiplier [length *= (float) multiplier] (only used if trail flag active)
|
||||
;
|
||||
;CR:Particle Create Range (in meters: 0=no check); if particles are created enough far away from camera, they are deleted (not added to particle system);
|
||||
;
|
||||
;
|
||||
;Z: Flags! Guide: 1=ZCHECK_FIRST, 2=ZCHECK_STEP, 4=DRAW_OPAQUE, 8=SCREEN_TRAIL,
|
||||
; 16=SPEED_TRAIL, 32=RAND_VERT_V, 64=CYCLE_ANIM, 128=DRAW_DARK, 256=VERT_TRAIL
|
||||
; 1024=DRAWTOP2D, 2048=CLIPOUT2D
|
||||
; 4096=ZCHECK_BUMP, 8192=ZCHECK_BUMP_FIRST
|
||||
;
|
||||
;
|
||||
;
|
||||
;default:
|
||||
;GUNFLASH 255 255 255 0 0.1 0.0 255 0 128 0 0 0 0 0.0 1.0 250 0.0 0.0 0.0 0 0 1.0 0
|
||||
;
|
||||
;good idea for fire-smudge?
|
||||
;GUNFLASH 255 255 255 0 1.0 0.0 255 0 32 100 0 3 0 0.0 1.0 400 0.0 0.0 0.0 0 0 1.0 0
|
||||
;
|
||||
;current:
|
||||
;GUNFLASH 255 255 255 0 1.0 0.0 255 0 32 100 0 3 0 0.0 1.0 400 0.0 0.0 0.0 0 0 1.0 0
|
||||
;
|
||||
;
|
||||
;SPARK_SMALL 255 255 128 0 0.005 0.0 255 0 0 0 0 0 0 0.0 1.0 500 0.0 0.05 0.0 0 0 0.5 40
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
; A B C D CV B2 C2 D2 FT E F G H I GA HA IA GZA HZA IZA GZR HZR IZR J K L M N O P Q R S T U V CR Z
|
||||
;
|
||||
SPARK 255 128 64 0 0 0 0 0 0.005 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.001 1 300 0.0 0.07 0.0 0 0 1.0 20.0 48
|
||||
SPARK_SMALL 255 255 128 0 0 0 0 0 0.005 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.001 1 500 0.0 0.05 0.0 0 0 0.6 20.0 40
|
||||
;
|
||||
WHEEL_DIRT 8 24 8 0 0 0 0 0 0.05 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.002 1 1000 0.15 0.015 0.0 0 0 1.0 30.0 4
|
||||
;
|
||||
;
|
||||
;WHEEL_WATER 24 24 24 0 0 0 0 0 0.05 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.002 1 1000 0.15 0.015 0.0 0 0 1.0 20.0 0
|
||||
WHEEL_WATER 24 24 32 0 0 0 0 0 0.05 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.004 1 1000 0.15 0.015 0.0 0 0 1.0 20.0 1
|
||||
;
|
||||
;
|
||||
BLOOD 128 128 128 0 0 0 0 0 0.02 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.03 1 2000 0.3 0.05 0.0 0 0 1.0 50.0 5
|
||||
BLOOD_SMALL 255 32 32 0 0 0 0 0 0.007 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.005 1 2000 0.05 0.05 0.0 0 0 1.0 50.0 53
|
||||
;BLOOD_SPLAT 128 128 128 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 200 0.3 0.0 0.0 0 0 1.0 400.0 36
|
||||
BLOOD_SPURT 255 32 32 0 0 0 0 0 0.008 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.005 1 2000 0.0 0.01 0.0 0 0 2.0 50.0 52
|
||||
DEBRIS 64 64 64 0 0 0 0 0 0.5 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 95 1000 0.2 0.0 0.0 0 0 1.0 50.0 4
|
||||
DEBRIS2 64 64 64 0 0 0 0 0 0.04 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 5 0.01 99 1000 0.03 0.04 0.0 0 0 1.0 50.0 38
|
||||
WATER 64 64 128 0 0 0 0 0 0.01 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 2000 0.0 0.0 0.0 0 0 1.0 100.0 0
|
||||
;
|
||||
;
|
||||
;FLAME 255 74 30 0 0 0 0 0 0.2 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 0.0 1 100 0.05 0.0 0.0 0 0 1.0 400.0 0
|
||||
;FLAME 255 74 30 0 0 255 0 400 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 1 2000 0.02 0.01 0.01 0 0 1.0 200.0 0
|
||||
FLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 1 2000 0.02 0.01 0.01 0 0 1.0 200.0 0
|
||||
;
|
||||
;
|
||||
;
|
||||
;FIREBALL 255 74 30 0 0 0 0 0 0.1 0.04 255 1 8 255 0 0 0 0 0 0.0 0 0.0 32 0 7 0 0.0 96 1000 0.1 0.0 0.0 0 0 1.0 400.0 0
|
||||
;
|
||||
;FIREBALL 255 74 30 0 0 0 0 0 0.1 0.05 255 0 6 255 0 0 0 0 0 0.0 0 0.0 1 0 7 0 -0.002 96 2000 0.1 0.02 0.02 3 0 1.0 200.0 0
|
||||
FIREBALL 255 74 30 0 0 0 0 0 0.1 0.02 255 0 6 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.003 96 2000 0.1 0.03 0.014 2.5 0 1.0 200.0 0
|
||||
;
|
||||
;
|
||||
;
|
||||
GUNFLASH 170 170 170 0 0 0 0 0 0.1 0.0 255 1 50 255 0 0 0 0 0 0.0 0 0.0 51 0 3 0 0.0 1 250 0.0 0.0 0.0 0 0 1.0 35.0 0
|
||||
GUNFLASH_NOANIM 128 128 128 0 0 0 0 0 0.1 0.0 255 1 128 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 25 0.0 0.0 0.0 0 0 1.0 35.0 0
|
||||
;
|
||||
GUNSMOKE 64 64 64 0 0 0 0 0 0.15 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 2 0 7 0 -0.002 95 1000 0.0 0.0 0.0 0 0 1.0 60.0 0
|
||||
GUNSMOKE2 255 255 255 0 0 0 0 0 0.05 0.02 255 0 0 255 0 8 0 0 0 0.0 0 0.0 0 0 3 4 -0.001 80 1400 0.05 0.05 0.01 3 0 1.0 60.0 4
|
||||
;
|
||||
;
|
||||
SMOKE 32 32 32 0 0 0 0 0 0.15 0.015 255 5 25 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.01 95 1000 0.05 0.05 0.01 3 0 1.0 150.0 0
|
||||
;SMOKE_SLOWMOTION 32 32 32 0 0 0 0 0 0.15 0.015 255 5 15 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.003 95 1000 0.05 0.05 0.01 3 0 1.0 400.0 0
|
||||
SMOKE_SLOWMOTION 32 32 32 0 0 0 0 0 0.15 0.015 128 5 11 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.003 95 3000 0.05 0.05 0.01 3 0 1.0 150.0 0
|
||||
;
|
||||
;
|
||||
;
|
||||
;GARAGEPAINT_SPRAY 32 32 32 0 0 0 0 0 0.15 0.015 255 0 5 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 -0.001 95 2000 0.05 0.05 0.01 3 0 1.0 400.0 0
|
||||
GARAGEPAINT_SPRAY 32 32 32 0 0 0 0 0 0.15 0.015 255 0 5 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 -0.0005 95 4000 0.05 0.05 0.01 3 0 1.0 100.0 0
|
||||
SHARD 255 255 255 0 0 0 0 0 0.03 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 96 300 0.0 0.0 0.0 0 0 1.0 100.0 0
|
||||
SPLASH 64 64 128 0 0 0 0 0 0.1 0.007 255 1 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 100.0 0
|
||||
;BLOOD_SPLASH 24 64 0 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 96 300 0.0 0.0 0.0 0 0 1.0 100.0 0
|
||||
;
|
||||
;
|
||||
;CARFLAME 255 74 30 0 0 0 0 0 0.5 0.04 255 2 20 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 0.0 1 1000 0.4 0.0 0.0 0 0 1.0 400.0 64
|
||||
;CARFLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.001 1 2000 0.4 0.01 0.01 0 0 1.0 400.0 64
|
||||
;CARFLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.001 1 2000 0.4 0.01 0.01 0 0 1.0 400.0 64
|
||||
;
|
||||
CARFLAME 255 74 30 0 0 0 0 0 0.8 -0.02 255 0 10 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 1 2000 0.02 0.01 0.01 0 0 1.0 100.0 0
|
||||
;
|
||||
;
|
||||
STEAM 64 64 64 0 0 0 0 0 0.5 0.05 255 1 16 255 0 0 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 85.0 0
|
||||
;
|
||||
;default:
|
||||
;STEAM2 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 128 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 400.0 4
|
||||
STEAM2 255 255 255 0 0 0 0 0 0.5 0.015 255 0 0 192 0 1 0 0 10 0.5 1 0.02 32 0 4 0 -0.002 95 8000 0.01 0.03 0.0 0 0 1.0 85.0 4
|
||||
;
|
||||
;
|
||||
;STEAM_NY 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 128 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 400.0 4
|
||||
STEAM_NY 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 96 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 1400 0.01 0.03 0.0 0 0 1.0 85.0 4
|
||||
STEAM_NY_SLOWMOTION 255 255 255 0 0 0 0 0 0.5 0.05 255 0 0 96 2 8 0 0 0 0.0 0 0.0 32 0 4 0 -0.0015 95 1400 0.01 0.03 0.0 0 0 1.0 85.0 4
|
||||
;
|
||||
;
|
||||
;ENGINE_STEAM 210 210 210 0 0 0 0 0 0.5 0.05 255 0 0 192 2 16 0 0 0 0.0 0 0.0 32 0 4 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 250.0 4
|
||||
ENGINE_STEAM 210 210 210 0 0 0 0 0 0.5 0.05 255 0 0 192 0 10 0 0 0 0.0 0 0.0 32 0 4 1 -0.005 95 4000 0.03 0.03 0.02 0 0 1.0 85.0 4
|
||||
;
|
||||
;
|
||||
;RAINDROP 32 32 32 0 0 0 0 0 0.6 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.025 1 1000 0.0 0.0 0.0 0 0 1.0 15.0 1
|
||||
RAINDROP 64 64 64 0 0 0 0 0 0.4 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 3 0 0.05 1 1000 0.0 0.0 0.0 0 0 1.0 15.0 1
|
||||
RAINDROP_SMALL 16 16 16 0 0 0 0 0 0.3 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.05 1 1000 0.0 0.0 0.0 0 0 1.0 15.0 1
|
||||
RAIN_SPLASH 32 32 32 0 0 0 0 0 0.08 0.0 255 0 5 255 0 0 0 0 0 0.0 0 0.0 1 0 4 0 0.0 1 500 0.0 0.0 0.0 0 0 1.0 15.0 0
|
||||
RAIN_SPLASH_BIGGROW 128 128 128 0 0 0 0 0 0.5 0.06 255 0 2 255 0 0 0 0 0 0.0 0 0.0 2 1 4 0 0.0 1 5500 0.0 0.0 0.0 0 0 1.0 15.0 0
|
||||
RAIN_SPLASHUP 48 48 48 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 1 0 0.0 1 50 0.0 0.0 0.0 0 0 1.0 15.0 0
|
||||
;
|
||||
WATERSPRAY 64 64 64 0 0 0 0 0 0.2 0.0 255 0 25 255 0 0 0 0 0 0.0 0 0.0 3 0 2 0 0.002 1 800 0.05 0.0 0.01 0 0 1.0 20.0 0
|
||||
;
|
||||
;
|
||||
;
|
||||
;EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 5 8 255 0 0 0 0 0 0.0 0 0.0 8 0 11 0 0.0 96 15000 0.2 0.0 0.0 3 0 1.0 400.0 0
|
||||
;EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 5 8 255 0 0 0 0 0 0.0 0 0.0 8 0 11 0 0.0 96 15000 0.8 0.0 0.0 3 0 1.0 400.0 0
|
||||
;EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 1 4 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 0.0 96 7000 0.2 0.0 0.0 0 0 1.0 400.0 0
|
||||
;EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 1 4 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 0.0 96 7000 0.8 0.0 0.0 0 0 1.0 400.0 0
|
||||
;
|
||||
;EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 -0.001 96 6000 0.2 0.0 0.0 0 0 1.0 400.0 0
|
||||
;EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 1 0 11 0 -0.001 96 6000 0.8 0.0 0.0 0 0 1.0 400.0 0
|
||||
EXPLOSION_MEDIUM 80 80 80 0 0 0 0 0 0.6 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 6000 0.2 0.0 0.0 0 0 1.0 200.0 0
|
||||
EXPLOSION_LARGE 80 80 80 0 0 0 0 0 1.1 0.04 255 0 3 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 6000 0.8 0.0 0.0 0 0 1.0 200.0 0
|
||||
EXPLOSION_MFAST 80 80 80 0 0 0 0 0 0.6 0.04 255 0 6 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 3500 0.2 0.0 0.0 0 0 1.0 200.0 0
|
||||
EXPLOSION_LFAST 80 80 80 0 0 0 0 0 1.1 0.04 255 0 6 255 0 0 0 0 0 0.0 0 0.0 2 0 5 0 -0.001 96 3500 0.8 0.0 0.0 0 0 1.0 200.0 0
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;BOAT_SPLASH 32 64 32 0 0 0 0 0 0.2 0.2 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 2000 0.0 0.0 0.0 0 0 1.0 200.0 0
|
||||
;BOAT_THRUSTJET 24 32 24 0 0 0 0 0 0.5 0.1 255 0 0 255 0 0 0 0 0 0.0 0 0.0 250 0 4 0 0.01 50 1000 0.0 0.0 0.0 0 4 1.0 200.0 8
|
||||
;BOAT_SPLASH 16 32 32 0 0 0 0 0 0.2 0.2 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 2000 0.0 0.0 0.0 0 0 1.0 200.0 0
|
||||
;BOAT_THRUSTJET 8 24 24 0 0 0 0 0 0.5 0.1 255 0 0 255 0 0 0 0 0 0.0 0 0.0 250 0 4 0 0.01 50 1000 0.0 0.0 0.0 0 4 1.0 200.0 8
|
||||
;CAR_SPLASH 64 64 64 0 0 0 0 0 2.0 0.25 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.02 1 2000 0.0 0.0 0.0 0 0 1.0 250.0 0
|
||||
;CAR_SPLASH 64 64 64 0 0 0 0 0 2.0 0.25 255 0 0 200 0 8 0 0 0 0.0 0 0.0 0 0 0 0 0.04 1 2000 0.0 0.0 0.0 0 0 1.0 150.0 4
|
||||
;CAR_SPLASH 64 64 64 0 0 0 0 0 2.0 0.35 255 0 0 200 0 8 0 0 0 0.0 0 0.0 0 0 0 0 0.05 1 2000 0.0 0.0 0.0 0 0 1.0 150.0 4
|
||||
;CAR_SPLASH 64 64 64 0 0 0 0 0 1.0 0.25 255 0 0 180 0 5 0 0 0 0.0 0 0.0 2 1 3 0 0.05 1 1000 0.0 0.0 0.0 0 0 1.0 150.0 12
|
||||
;
|
||||
;
|
||||
;CAR_SPLASH 64 64 64 0 0 0 0 0 1.0 0.15 255 0 0 180 0 2 0 0 0 0.0 0 0.0 2 0 3 0 0.02 1 2000 0.0 0.0 0.0 0 0 1.0 150.0 12
|
||||
;CAR_SPLASH 48 48 64 0 0 0 0 0 1.0 0.15 96 0 0 255 0 0 0 0 0 0.0 0 0.0 6 0 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 2.0 150.0 288
|
||||
;CAR_SPLASH 48 48 64 0 0 0 0 0 1.0 0.05 96 0 0 255 0 0 0 0 0 0.0 0 0.0 0 1 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 2.0 150.0 288
|
||||
; A B C D CV B2 C2 D2 FT E F G H I GA HA IA GZA HZA IZA GZR HZR IZR J K L M N O P Q R S T U V CR Z
|
||||
CAR_SPLASH 48 48 60 0 0 0 0 0 1.0 0.00 128 1 4 128 0 0 0 0 0 0.0 0 0.0 0 0 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 1.4 150.0 272
|
||||
;
|
||||
;
|
||||
;
|
||||
;BOAT_SPLASH 70 70 70 0 0 0 0 0 0.2 0.2 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 1000 0.0 0.0 0.0 0 0 1.0 150.0 0
|
||||
BOAT_SPLASH 64 64 64 0 0 0 0 0 0.2 0.2 255 0 2 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.01 1 1000 0.0 0.0 0.0 0 0 1.0 150.0 0
|
||||
;
|
||||
;
|
||||
;BOAT_THRUSTJET 90 90 90 0 0 0 0 0 1.8 0.1 255 0 0 120 0 1 0 0 0 0.0 0 0.0 0 1 4 0 0.01 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
|
||||
BOAT_THRUSTJET 90 90 90 0 0 0 0 0 1.4 0.06 255 0 0 96 0 1 0 0 0 0.0 0 0.0 0 1 4 0 0.01 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
|
||||
;
|
||||
;
|
||||
;BOAT_WAKE 255 255 255 0 0 0 0 0 2.0 0.2 255 0 0 128 0 1 0 0 0 0.0 0 0.0 0 0 0 0 0.03 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
|
||||
BOAT_WAKE 255 255 255 0 0 0 0 0 1.5 0.45 255 0 0 192 0 2 0 0 0 0.0 0 0.0 0 0 0 0 0.0 50 1600 0.8 0.4 0.02 0 4 1.0 150.0 4
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
; A B C D CV B2 C2 D2 FT E F G H I GA HA IA GZA HZA IZA GZR HZR IZR J K L M N O P Q R S T U V CR Z
|
||||
WATER_HYDRANT 64 64 64 0 0 0 0 0 0.8 0.01 255 1 16 255 1 16 0 0 0 0.0 0 0.0 0 0 2 0 0.007 99 500 0.02 0.08 0.0 0 4 1.0 85.0 16
|
||||
WATER_CANNON 64 64 128 0 0 0 0 0 0.03 0.03 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
|
||||
EXTINGUISH_STEAM 32 32 32 0 0 0 0 0 0.1 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
|
||||
;
|
||||
;
|
||||
;
|
||||
;PED_SPLASH 32 32 64 0 0 0 0 0 0.1 0.05 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
|
||||
PED_SPLASH 48 48 60 0 0 0 0 0 0.1 0.06 96 0 0 255 0 0 0 0 0 0.0 0 0.0 0 1 2 0 0.01 1 2000 0.5 0.04 0.0 0 0 1.4 50.0 256
|
||||
;
|
||||
;
|
||||
PEDFOOT_DUST 170 166 150 0 0 0 0 0 0.01 0.015 255 0 0 63 0 4 0 0 0 0.0 0 0.0 0 0 0 0 -0.0005 1 1000 0.0 0.0 0.0 0 0 1.0 6.0 4
|
||||
;
|
||||
HELI_DUST 17 15 9 0 0 0 0 0 0.2 0.1 255 1 8 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.001 1 1000 0.2 0.05 0.0 0 0 1.0 85.0 0
|
||||
HELI_ATTACK 255 255 128 0 0 0 0 0 0.01 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 500 0.0 0.0 0.0 0 0 0.5 85.0 10
|
||||
;
|
||||
;
|
||||
;ENGINE_SMOKE 16 16 16 0 0 0 0 0 0.5 0.04 255 0 0 63 0 0 0 0 0 0.0 0 0.0 0 0 0 0 -0.005 95 2000 0.01 0.03 0.0 0 0 1.0 150.0 4
|
||||
;ENGINE_SMOKE2 8 8 8 0 0 0 0 0 1.0 0.2 128 2 4 63 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.001 1 1000 0.0 0.0 0.0 0 3 1.0 150.0 4
|
||||
ENGINE_SMOKE 16 16 16 0 0 0 0 0 0.5 0.04 255 0 0 52 0 2 10 0 80 0.0 0 0.0 0 0 5 2 -0.009 95 2000 0.11 0.03 0.01 1 0 1.0 85.0 4
|
||||
ENGINE_SMOKE2 9 9 9 80 0 0 0 0 1.0 0.06 128 0 1 140 0 5 10 0 80 0.0 0 0.0 0 0 0 2 0.002 1 1300 0.0 0.01 0.0 3 3 1.0 85.0 4
|
||||
;
|
||||
;
|
||||
CARFLAME_SMOKE 32 32 32 0 0 0 0 0 0.05 0.01 255 0 0 64 0 2 0 0 0 0.0 0 0.0 0 0 0 0 -0.008 95 2000 0.01 0.03 0.01 0 0 1.0 85.0 4
|
||||
FIREBALL_SMOKE 32 32 32 0 0 0 0 0 0.05 0.03 255 0 0 128 0 2 0 0 0 0.0 0 0.0 0 0 0 0 -0.004 95 2000 0.01 0.03 0.01 0 0 1.0 85.0 4
|
||||
;
|
||||
PAINT_SMOKE 255 0 0 0 0 0 0 0 0.1 0.01 255 1 8 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 95 3000 0.0 0.005 0.0 0 0 1.0 85.0 0
|
||||
TREE_LEAVES 64 64 64 0 0 0 0 0 0.2 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 85.0 0
|
||||
;
|
||||
;
|
||||
;CARCOLLISION_DUST 224 224 224 0 0 0 0 0 0.15 0.04 255 0 0 127 1 8 0 0 0 0.0 0 0.0 0 0 0 0 -0.002 90 2000 0.02 0.02 0.0 0 0 1.0 80.0 4
|
||||
CARCOLLISION_DUST 76 76 76 0 0 0 0 0 0.10 0.02 255 0 0 160 0 4 0 0 0 0.0 0 0.0 0 0 0 0 -0.0015 90 2000 0.02 0.02 0.0 0 0 1.0 30.0 4
|
||||
;
|
||||
;
|
||||
CAR_DEBRIS 32 32 32 0 0 0 0 0 0.5 0.0 224 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 50.0 4
|
||||
HELI_DEBRIS 32 32 32 0 0 0 0 0 1.5 0.0 224 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.065 90 1500 0.02 0.02 0.0 0 0 1.0 150.0 4
|
||||
;
|
||||
;
|
||||
;
|
||||
;EXHAUST_FUMES 80 80 80 0 0 0 0 0 0.03 0.03 255 0 0 122 0 4 0 0 0 0.0 0 0.0 2 0 4 0 -0.001 95 1500 0.01 0.03 0.0 0 0 1.0 50.0 4
|
||||
EXHAUST_FUMES 98 98 108 0 0 0 0 0 0.03 0.06 255 0 0 152 0 12 0 0 0 0.0 0 0.0 2 0 4 0 -0.002 96 1000 0.01 0.03 0.0 0 0 1.0 25.0 4
|
||||
;
|
||||
;
|
||||
;RUBBER 40 40 40 0 0 0 0 0 0.4 0.005 255 21 20 255 0 0 0 0 0 0.0 0 0.0 3 0 4 0 -0.0005 1 1000 0.02 0.0 0.0 0 0 1.0 400.0 4
|
||||
RUBBER_SMOKE 255 255 255 0 0 0 0 0 0.4 0.005 255 0 0 127 1 8 0 0 0 0.0 0 0.0 3 0 4 0 -0.0005 1 1000 0.02 0.0 0.0 0 0 1.0 50.0 4
|
||||
;BURNINGRUBBER_SMOKE128 128 128 0 0 0 0 0 0.35 0.06 255 0 0 192 1 6 0 0 0 0.0 0 0.0 0 0 0 0 -0.002 90 4000 0.02 0.02 0.0 0 0 1.0 400.0 4
|
||||
BURNINGRUBBER_SMOKE 128 128 128 0 0 0 0 0 0.35 0.06 255 0 0 128 0 4 0 0 0 0.0 0 0.0 0 0 0 0 -0.002 90 2000 0.02 0.02 0.0 0 0 1.0 50.0 4
|
||||
;
|
||||
;
|
||||
BULLETHIT_SMOKE 192 192 192 0 0 0 0 0 0.15 0.03 70 0 2 255 1 10 0 0 0 0.0 0 0.0 0 0 0 0 -0.001 90 2000 0.04 0.02 0.0 0 0 1.0 150.0 0
|
||||
;
|
||||
;
|
||||
GUNSHELL_FIRST 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 0.0 12292
|
||||
GUNSHELL 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 12.0 4100
|
||||
GUNSHELL_BUMP1 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 1000 0.02 0.02 0.0 0 0 1.0 8.0 4100
|
||||
GUNSHELL_BUMP2 108 108 108 0 0 0 0 0 0.015 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 0 4 0 0.010 90 400 0.02 0.02 0.0 0 0 1.0 8.0 4100
|
||||
;
|
||||
;
|
||||
TEST 255 64 64 0 0 0 0 0 0.2 0.025 255 1 20 255 0 0 0 0 0 0.0 0 0.0 0 0 0 0 0.0 1 3000 0.0 0.0 0.0 0 0 1.0 400.0 128
|
||||
;
|
||||
;
|
||||
;Particles with flag DRAWTOP2D should be placed last and VR (Visibility Range) set to 0!
|
||||
;
|
||||
;BIRD_FRONT 8 8 8 0 0 0 0 0 0.05 0.0 255 0 0 255 2 1 0 0 0 0.0 0 0.0 1 0 3 0 0.0 1 10000 0.0 0.0 0.0 0 0 1.0 0.0 3140
|
||||
BIRD_FRONT 8 8 8 0 0 0 0 0 1.05 0.0 255 0 0 255 2 2 0 0 0 0.0 0 0.0 1 0 3 0 0.0 1 8000 0.0 0.0 0.0 0 0 1.0 0.0 68
|
||||
;
|
||||
RAINDROP_2D 32 32 32 0 0 0 0 0 0.5 0.0 255 0 0 255 0 0 0 0 0 0.0 0 0.0 0 1 0 0 0.0 1 1000 0.0 0.0 0.0 0 0 1.0 0.0 3072
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
; below is just backup of above values:
|
||||
;
|
||||
;SPARK 255 128 64 0.005 0.0 255 0 0 0 0 0 0 0.0 1.0 300 0.0 0.07 0.0 0 0 1.0 48
|
||||
;SPARK_SMALL 255 255 128 0.005 0.0 255 0 0 0 0 0 0 0.0 1.0 500 0.0 0.05 0.0 0 0 0.6 40
|
||||
;BLOOD 128 128 128 0.02 0.0 255 0 0 0 0 0 0 0.03 1.0 2000 0.3 0.05 0.0 0 0 1.0 6
|
||||
;BLOOD_SMALL 255 32 32 0.007 0.0 255 0 0 0 0 0 0 0.005 1.0 2000 0.05 0.05 0.0 0 0 1.0 54
|
||||
;BLOOD_SPLAT 128 128 128 0.1 0.0 255 0 0 0 0 0 0 0.0 1.0 200 0.3 0.0 0.0 0 0 1.0 36
|
||||
;BLOOD_SPURT 255 32 32 0.008 0.0 255 0 0 0 0 0 0 0.005 1.0 2000 0.0 0.01 0.0 0 0 2.0 52
|
||||
;DEBRIS 64 64 64 0.5 0.0 255 0 0 0 0 0 0 0.01 0.95 1000 0.2 0.0 0.0 0 0 1.0 4
|
||||
;DEBRIS2 64 64 64 0.04 0.0 255 0 0 0 0 0 5 0.01 0.99 1000 0.03 0.04 0.0 0 0 1.0 38
|
||||
;WATER 64 64 128 0.01 0.0 255 0 0 0 0 0 0 0.0 1.0 2000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;FLAME 255 74 30 0.2 0.0 255 0 0 31 0 5 0 0.0 1.0 100 0.05 0.0 0.0 0 0 1.0 0
|
||||
;FIREBALL 255 74 30 0.1 0.04 255 0 8 31 0 8 0 0.0 0.96 1000 0.1 0.0 0.0 0 0 1.0 0
|
||||
;GUNFLASH 255 255 255 0.1 0.0 255 0 50 50 0 3 0 0.0 1.0 250 0.0 0.0 0.0 0 0 1.0 0
|
||||
;GUNFLASHSTATIC 255 255 255 0.1 0.0 255 0 128 0 0 0 0 0.0 1.0 25 0.0 0.0 0.0 0 0 1.0 0
|
||||
;SMOKE 32 32 32 0.15 0.015 255 4 25 31 0 5 0 -0.01 0.95 1000 0.05 0.05 0.01 3 0 1.0 0
|
||||
;SHARD 255 255 255 0.03 0.0 255 0 0 0 0 0 0 0.0 0.96 300 0.0 0.0 0.0 0 0 1.0 0
|
||||
;SPLASH 64 64 128 0.1 0.007 255 0 10 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;BLOOD_SPLASH 24 64 0 0.1 0.0 255 0 0 0 0 0 0 0.0 0.96 300 0.0 0.0 0.0 0 0 1.0 0
|
||||
;RUBBER 40 40 40 0.4 0.005 255 1 25 31 0 5 0 0.0 1.0 1000 0.02 0.0 0.0 0 0 1.0 0
|
||||
;CARFLAME 255 74 30 0.5 0.04 255 1 20 31 0 5 0 0.0 1.0 1000 0.4 0.0 0.0 0 0 1.0 64
|
||||
;STEAM 64 64 64 0.5 0.05 255 0 16 31 0 5 0 -0.005 0.95 2000 0.01 0.03 0.0 0 0 1.0 0
|
||||
;RAINDROP 32 32 32 0.6 0.0 255 0 0 0 0 0 0 0.1 1.0 1000 0.0 0.0 0.0 0 0 1.0 1
|
||||
;RAIN_SPLASH 32 32 32 0.08 0.0 255 0 0 1 0 4 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;RAINDROP_SMALL 32 32 32 0.3 0.0 255 0 0 0 0 0 0 0.1 1.0 1000 0.0 0.0 0.0 0 0 1.0 1
|
||||
;EXPLOSION_MEDIUM 80 80 80 0.6 0.04 255 4 8 7 0 11 0 0.0 0.96 30000 0.2 0.0 0.0 3 0 1.0 0
|
||||
;EXPLOSION_LARGE 80 80 80 1.1 0.04 255 4 8 7 0 11 0 0.0 0.96 30000 0.8 0.0 0.0 3 0 1.0 0
|
||||
;BOAT_SPLASH 32 64 32 0.2 0.2 255 0 0 0 0 0 0 0.01 1.0 2000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;BOAT_THRUSTJET 24 32 24 0.5 0.1 255 0 0 250 0 5 0 0.01 0.5 1000 0.0 0.0 0.0 0 4 1.0 8
|
||||
;WATER_HYDRANT 64 64 128 0.4 0.01 255 1 2 20 0 5 0 0.007 0.99 500 0.02 0.05 0.0 0 4 1.0 256
|
||||
;WATER_CANNON 64 64 128 0.03 0.03 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;EXTINGUISH_STEAM 32 32 32 0.1 0.0 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;PED_SPLASH 32 32 64 0.1 0.05 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;HELI_DUST 17 15 9 0.2 0.1 255 0 8 0 0 0 0 -0.001 1.0 1000 0.2 0.05 0.0 0 0 1.0 0
|
||||
;HELI_ATTACK 255 255 128 0.01 0.0 255 0 0 0 0 0 0 0.0 1.0 500 0.0 0.0 0.0 0 0 0.5 10
|
||||
;ENGINE_SMOKE 16 16 16 0.5 0.04 255 0 0 0 0 0 0 -0.005 0.95 2000 0.01 0.03 0.0 0 0 1.0 4
|
||||
;ENGINE_SMOKE2 4 4 4 1.0 0.2 255 1 4 0 0 0 0 0.001 1.0 1000 0.0 0.0 0.0 0 3 1.0 4
|
||||
;PAINT_SMOKE 255 0 0 0.1 0.01 255 0 8 0 0 0 0 0.0 0.95 3000 0.0 0.005 0.0 0 0 1.0 0
|
||||
;TREE_LEAVES 64 64 64 0.2 0.0 255 0 0 0 0 0 0 0.0 1.0 1000 0.0 0.0 0.0 0 0 1.0 0
|
||||
;TEST 255 64 64 0.2 0.05 255 0 16 0 0 0 0 0.0 1.0 3000 0.0 0.0 0.0 0 0 1.0 128
|
||||
;
|
||||
;
|
||||
;the end
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,104 +1,104 @@
|
|||
# Fresnal RO Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
0.400000 0.400000 0.400000 0.150000 # Midnight
|
||||
0.400000 0.400000 0.400000 0.150000 # 1am
|
||||
0.400000 0.400000 0.400000 0.150000 # 2am
|
||||
0.400000 0.400000 0.400000 0.150000 # 3am
|
||||
0.400000 0.400000 0.400000 0.150000 # 4am
|
||||
0.400000 0.400000 0.400000 0.150000 # 5am
|
||||
0.400000 0.400000 0.400000 0.150000 # 6am
|
||||
0.400000 0.400000 0.400000 0.150000 # 7am
|
||||
0.400000 0.400000 0.400000 0.150000 # 8am
|
||||
0.400000 0.400000 0.400000 0.150000 # 9am
|
||||
0.400000 0.400000 0.400000 0.150000 # 10am
|
||||
0.400000 0.400000 0.400000 0.150000 # 11am
|
||||
0.400000 0.400000 0.400000 0.150000 # Midday
|
||||
0.400000 0.400000 0.400000 0.150000 # 1pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 2pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 3pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 4pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 5pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 6pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 7pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 8pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 9pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 10pm
|
||||
0.400000 0.400000 0.400000 0.150000 # 11pm
|
||||
# Specular Power Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
128.000000 80.000000 30.000000 128.000000 # Midnight
|
||||
128.000000 80.000000 30.000000 128.000000 # 1am
|
||||
128.000000 80.000000 30.000000 128.000000 # 2am
|
||||
128.000000 80.000000 30.000000 128.000000 # 3am
|
||||
128.000000 80.000000 30.000000 128.000000 # 4am
|
||||
80.000000 60.000000 30.000000 128.000000 # 5am
|
||||
80.000000 60.000000 30.000000 128.000000 # 6am
|
||||
80.000000 60.000000 30.000000 128.000000 # 7am
|
||||
80.000000 60.000000 30.000000 128.000000 # 8am
|
||||
80.000000 60.000000 30.000000 128.000000 # 9am
|
||||
80.000000 60.000000 30.000000 128.000000 # 10am
|
||||
80.000000 60.000000 30.000000 128.000000 # 11am
|
||||
80.000000 60.000000 30.000000 128.000000 # Midday
|
||||
80.000000 60.000000 30.000000 128.000000 # 1pm
|
||||
80.000000 60.000000 30.000000 128.000000 # 2pm
|
||||
80.000000 60.000000 30.000000 128.000000 # 3pm
|
||||
80.000000 60.000000 30.000000 128.000000 # 4pm
|
||||
128.000000 80.000000 30.000000 128.000000 # 5pm
|
||||
128.000000 80.000000 30.000000 128.000000 # 6pm
|
||||
128.000000 80.000000 30.000000 128.000000 # 7pm
|
||||
128.000000 80.000000 30.000000 128.000000 # 8pm
|
||||
128.000000 80.000000 30.000000 128.000000 # 9pm
|
||||
128.000000 80.000000 30.000000 128.000000 # 10pm
|
||||
128.000000 80.000000 30.000000 128.000000 # 11pm
|
||||
# Fresnel RO Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # Midnight
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 1am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 2am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 3am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 4am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 5am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 6am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 7am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 8am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 9am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 10am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 11am
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # Midday
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 1pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 2pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 3pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 4pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 5pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 6pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 7pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 8pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 9pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 10pm
|
||||
0.4 0.4 0.4 0.4 0.4 0.4 0.4 # 11pm
|
||||
# Specular Power Table (ther higher, the tighter the highlite)
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
25 15 70 10 15 15 18 # Midnight
|
||||
25 15 70 10 15 15 18 # 1am
|
||||
25 15 70 10 15 15 18 # 2am
|
||||
25 15 70 10 15 15 18 # 3am
|
||||
25 15 70 10 15 15 18 # 4am
|
||||
25 15 70 10 15 15 18 # 5am
|
||||
25 15 70 10 15 15 18 # 6am
|
||||
25 15 70 10 15 15 18 # 7am
|
||||
25 15 70 10 15 15 18 # 8am
|
||||
25 15 70 10 15 15 18 # 9am
|
||||
25 15 70 10 15 15 18 # 10am
|
||||
25 15 70 10 15 15 18 # 11am
|
||||
25 15 70 10 15 15 18 # Midday
|
||||
25 15 70 10 15 15 18 # 1pm
|
||||
25 15 70 10 15 15 18 # 2pm
|
||||
25 15 70 10 15 15 18 # 3pm
|
||||
25 15 70 10 15 15 18 # 4pm
|
||||
25 15 70 10 15 15 18 # 5pm
|
||||
25 15 70 10 15 15 18 # 6pm
|
||||
25 15 70 10 15 15 18 # 7pm
|
||||
25 15 70 10 15 15 18 # 8pm
|
||||
25 15 70 10 15 15 18 # 9pm
|
||||
25 15 70 10 15 15 18 # 10pm
|
||||
25 15 70 10 15 15 18 # 11pm
|
||||
# Diffuse Colour Modifier Table (Red,Green,Blue,Amount)
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midnight
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midday
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11pm
|
||||
# Specular Colour Table (Red,Green,Blue,Amount)
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # Midnight
|
||||
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 1am
|
||||
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 2am
|
||||
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 3am
|
||||
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 4am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 5am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 6am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 7am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 8am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 9am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 10am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 11am
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # Midday
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 1pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 2pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 3pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 4pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 5pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 6pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 7pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 8pm
|
||||
178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 9pm
|
||||
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 10pm
|
||||
81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 11pm
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midnight
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11am
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midday
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10pm
|
||||
0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11pm
|
||||
# Specular Colour Table (Red,Green,Blue,Ignored)
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # Midnight
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 1am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 2am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 3am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 4am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 5am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 6am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 7am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 8am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 9am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 10am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 11am
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # Midday
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 1pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 2pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 3pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 4pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 5pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 6pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 7pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 8pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 9pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 10pm
|
||||
178, 178, 178, 100 140, 140, 150, 50 220, 220, 220, 75 255, 255, 255, 20 178, 178, 178, 100 178, 178, 178, 75 178, 178, 178, 100 # 11pm
|
||||
|
|
Binary file not shown.
|
@ -1,130 +1,130 @@
|
|||
# Ramp Start Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # Midnight
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 1am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 2am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 3am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 4am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 5am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 6am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 7am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 8am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 9am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 10am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 11am
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # Midday
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 1pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 2pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 3pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 4pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 5pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 6pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 7pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 8pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 9pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 10pm
|
||||
60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 11pm
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # Midnight
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 1am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 2am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 3am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 4am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 5am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 6am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 7am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 8am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 9am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 10am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 11am
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # Midday
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 1pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 2pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 3pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 4pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 5pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 6pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 7pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 8pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 9pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 10pm
|
||||
0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 0, 0, 0, 255 # 11pm
|
||||
# Ramp End Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # Midnight
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 1am
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 2am
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 3am
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 4am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 5am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 6am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 7am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 8am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 9am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 10am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 11am
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # Midday
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 1pm
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 2pm
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 3pm
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 4pm
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 5pm
|
||||
255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 6pm
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 7pm
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 8pm
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 9pm
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 10pm
|
||||
190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 11pm
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # Midnight
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 1am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 2am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 3am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 4am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 5am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 6am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 7am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 8am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 9am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 10am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 11am
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # Midday
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 1pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 2pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 3pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 4pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 5pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 6pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 7pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 8pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 9pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 10pm
|
||||
255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 255, 255, 255, 255 # 11pm
|
||||
# Offset Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
0 0 0 0 # Midnight
|
||||
0 0 0 0 # 1am
|
||||
0 0 0 0 # 2am
|
||||
0 0 0 0 # 3am
|
||||
0 0 0 0 # 4am
|
||||
0 0 0 0 # 5am
|
||||
0 0 0 0 # 6am
|
||||
0 0 0 0 # 7am
|
||||
0 0 0 0 # 8am
|
||||
0 0 0 0 # 9am
|
||||
0 0 0 0 # 10am
|
||||
0 0 0 0 # 11am
|
||||
0 0 0 0 # Midday
|
||||
0 0 0 0 # 1pm
|
||||
0 0 0 0 # 2pm
|
||||
0 0 0 0 # 3pm
|
||||
0 0 0 0 # 4pm
|
||||
0 0 0 0 # 5pm
|
||||
0 0 0 0 # 6pm
|
||||
0 0 0 0 # 7pm
|
||||
0 0 0 0 # 8pm
|
||||
0 0 0 0 # 9pm
|
||||
0 0 0 0 # 10pm
|
||||
0 0 0 0 # 11pm
|
||||
# Scale Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
1.5 1.5 1.0 1.0 # Midnight
|
||||
1.5 1.5 1.0 1.0 # 1am
|
||||
1.5 1.5 1.0 1.0 # 2am
|
||||
1.5 1.5 1.5 1.5 # 3am
|
||||
2.0 2.0 2.0 2.0 # 4am
|
||||
2.0 2.0 2.0 2.0 # 5am
|
||||
2.0 2.0 2.0 2.0 # 6am
|
||||
2.5 2.5 2.0 2.0 # 7am
|
||||
2.5 2.5 2.0 2.0 # 8am
|
||||
2.5 2.5 2.0 2.0 # 9am
|
||||
2.5 2.5 2.0 2.0 # 10am
|
||||
2.5 2.5 2.0 2.0 # 11am
|
||||
2.5 2.5 2.0 2.0 # Midday
|
||||
2.5 2.5 2.0 2.0 # 1pm
|
||||
2.5 2.5 2.0 2.0 # 2pm
|
||||
2.5 2.5 2.0 2.0 # 3pm
|
||||
2.5 2.5 2.0 2.0 # 4pm
|
||||
2.0 2.0 2.0 2.0 # 5pm
|
||||
2.0 2.0 2.0 2.0 # 6pm
|
||||
2.0 2.0 2.0 2.0 # 7pm
|
||||
1.5 1.5 1.5 1.5 # 8pm
|
||||
1.5 1.5 1.0 1.0 # 9pm
|
||||
1.5 1.5 1.0 1.0 # 10pm
|
||||
1.5 1.5 1.0 1.0 # 11pm
|
||||
# Scaling Table
|
||||
# SUNNY CLOUDY RAINY, FOGGY
|
||||
0.2 0.2 0.1 0.1 # Midnight
|
||||
0.2 0.2 0.1 0.1 # 1am
|
||||
0.7 0.7 0.2 0.2 # 6am
|
||||
0.7 0.7 0.2 0.2 # 3am
|
||||
0.7 0.7 0.2 0.2 # 4am
|
||||
2.0 2.0 0.3 0.3 # 5am
|
||||
3.0 3.0 0.3 0.3 # 6am
|
||||
4.0 4.0 0.3 0.3 # 7am
|
||||
5.0 5.0 0.3 0.3 # 8am
|
||||
6.0 6.0 1.3 1.3 # 9am
|
||||
6.0 6.0 2.0 2.0 # 10am
|
||||
6.0 6.0 2.0 2.0 # 11am
|
||||
6.0 6.0 2.0 2.0 # Midday
|
||||
6.0 6.0 2.0 2.0 # 1pm
|
||||
6.0 6.0 1.3 1.3 # 6pm
|
||||
5.0 5.0 0.3 0.3 # 3pm
|
||||
4.0 4.0 0.3 0.3 # 4pm
|
||||
3.0 3.0 0.3 0.3 # 5pm
|
||||
2.0 2.0 0.3 0.3 # 6pm
|
||||
0.7 0.7 0.2 0.2 # 7pm
|
||||
0.7 0.7 0.2 0.2 # 8pm
|
||||
0.7 0.7 0.2 0.2 # 9pm
|
||||
0.2 0.2 0.1 0.1 # 10pm
|
||||
0.2 0.2 0.1 0.1 # 11pm
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # Midnight
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 1am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 2am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 3am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 4am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 5am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 6am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 7am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 8am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 9am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 10am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 11am
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # Midday
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 1pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 2pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 3pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 4pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 5pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 6pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 7pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 8pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 9pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 10pm
|
||||
0.5 0.5 0.5 0.5 0.5 0.5 0.5 # 11pm
|
||||
# Scale Table (the lentgh of the light band?)
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # Midnight
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 1am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 2am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 3am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 4am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 5am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 6am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 7am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 8am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 9am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 10am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 11am
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # Midday
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 1pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 2pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 3pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 4pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 5pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 6pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 7pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 8pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 9pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 10pm
|
||||
1 0.5 1.5 0.5 1.5 1.5 1.5 # 11pm
|
||||
# Scaling Table (how strong the overall effect is)
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS time multiplier
|
||||
1 0.3 0.5 0.1 1 1 1 # Midnight 0.5
|
||||
1 0.3 0.5 0.1 1 1 1 # 1am 0.5
|
||||
1 0.3 0.5 0.1 1 1 1 # 2am 0.5
|
||||
1 0.3 0.5 0.1 1 1 1 # 3am 0.5
|
||||
1 0.3 0.5 0.1 1 1 1 # 4am 0.5
|
||||
1 0.3 0.5 0.1 1 1 1 # 5am 0.5
|
||||
1 0.3 0.5 0.1 1 1 1 # 6am 0.5
|
||||
1.2 0.36 0.6 0.12 1.2 1.2 1.2 # 7am 0.6
|
||||
1.4 0.42 0.7 0.14 1.4 1.4 1.4 # 8am 0.7
|
||||
1.6 0.48 0.8 0.16 1.6 1.6 1.6 # 9am 0.8
|
||||
1.8 0.54 0.9 0.18 1.8 1.8 1.8 # 10am 0.9
|
||||
2 0.6 1 0.2 2 2 2 # 11am 1
|
||||
2 0.6 1 0.2 2 2 2 # Midday tweaking value
|
||||
2 0.6 1 0.2 2 2 2 # 1pm 1
|
||||
2 0.6 1 0.2 2 2 2 # 2pm 1
|
||||
2.2 0.66 1.1 0.22 2.2 2.2 2.2 # 3pm 1.1
|
||||
2.2 0.66 1.1 0.22 2.2 2.2 2.2 # 4pm 1.1
|
||||
2.4 0.72 1.2 0.24 2.4 2.4 2.4 # 5pm 1.2
|
||||
2.4 0.72 1.2 0.24 2.4 2.4 2.4 # 6pm 1.2
|
||||
2.2 0.66 1.1 0.22 2.2 2.2 2.2 # 7pm 1.1
|
||||
2 0.6 1 0.2 2 2 2 # 8pm 1
|
||||
1.6 0.48 0.8 0.16 1.6 1.6 1.6 # 9pm 0.8
|
||||
1.2 0.36 0.6 0.12 1.2 1.2 1.2 # 10pm 0.6
|
||||
1 0.3 0.5 0.1 1 1 1 # 11pm 0.5
|
||||
|
|
|
@ -1,26 +1,30 @@
|
|||
# LM blend Table
|
||||
# SUNNY CLOUDY RAINY FOGGY
|
||||
0.700000 0.700000 0.700000 0.550000 # Midnight
|
||||
0.700000 0.700000 0.700000 0.550000 # 1am
|
||||
0.700000 0.700000 0.700000 0.550000 # 2am
|
||||
0.700000 0.700000 0.700000 0.550000 # 3am
|
||||
0.700000 0.700000 0.700000 0.550000 # 4am
|
||||
0.750000 0.750000 0.700000 0.600000 # 5am
|
||||
0.800000 0.800000 0.750000 0.600000 # 6am
|
||||
0.850000 0.850000 0.800000 0.650000 # 7am
|
||||
0.900000 0.900000 0.800000 0.700000 # 8am
|
||||
0.950000 0.900000 0.800000 0.700000 # 9am
|
||||
1.000000 0.900000 0.800000 0.700000 # 10am
|
||||
1.000000 0.900000 0.800000 0.700000 # 11am
|
||||
1.000000 0.900000 0.800000 0.700000 # Midday
|
||||
1.000000 0.900000 0.800000 0.700000 # 1pm
|
||||
1.000000 0.900000 0.800000 0.700000 # 2pm
|
||||
0.950000 0.900000 0.800000 0.700000 # 3pm
|
||||
0.900000 0.900000 0.800000 0.700000 # 4pm
|
||||
0.850000 0.850000 0.800000 0.650000 # 5pm
|
||||
0.800000 0.800000 0.750000 0.600000 # 6pm
|
||||
0.750000 0.750000 0.700000 0.600000 # 7pm
|
||||
0.700000 0.700000 0.700000 0.550000 # 8pm
|
||||
0.700000 0.700000 0.700000 0.550000 # 9pm
|
||||
0.700000 0.700000 0.700000 0.550000 # 10pm
|
||||
0.700000 0.700000 0.700000 0.550000 # 11pm
|
||||
# SUNNY CLOUDY RAINY, FOGGY EXTRASUNNY HURRICANE EXTRACOLOURS basic daytime ramp
|
||||
0.45 0.6 0.75 0.525 0.45 0.75 0.375 # Midnight 0.75 0.1
|
||||
0.48 0.64 0.8 0.56 0.48 0.8 0.4 # 1am 0.8 0.2
|
||||
0.51 0.68 0.85 0.595 0.51 0.85 0.425 # 2am 0.85 0.3
|
||||
0.54 0.72 0.9 0.63 0.54 0.9 0.45 # 3am 0.9 0.4
|
||||
0.57 0.76 0.95 0.665 0.57 0.95 0.475 # 4am 0.95 0.6
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 5am 1 0.8
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 6am 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 7am 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 8am 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 9am 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 10am 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 11am 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # Midday 1 tweak here
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 1pm 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 2pm 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 3pm 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 4pm 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 5pm 1 1
|
||||
0.6 0.8 1 0.7 0.6 1 0.5 # 6pm 1 0.8
|
||||
0.57 0.76 0.95 0.665 0.57 0.95 0.475 # 7pm 0.95 0.6
|
||||
0.54 0.72 0.9 0.63 0.54 0.9 0.45 # 8pm 0.9 0.5
|
||||
0.51 0.68 0.85 0.595 0.51 0.85 0.425 # 9pm 0.85 0.4
|
||||
0.48 0.64 0.8 0.56 0.48 0.8 0.4 # 10pm 0.8 0.3
|
||||
0.45 0.6 0.75 0.525 0.45 0.75 0.375 # 11pm 0.75 0.2
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
22
premake5.lua
22
premake5.lua
|
@ -68,10 +68,10 @@ function getarch(a)
|
|||
return a
|
||||
end
|
||||
|
||||
workspace "re3"
|
||||
workspace "reVC"
|
||||
language "C++"
|
||||
configurations { "Debug", "Release" }
|
||||
startproject "re3"
|
||||
startproject "reVC"
|
||||
location "build"
|
||||
symbols "Full"
|
||||
staticruntime "off"
|
||||
|
@ -84,10 +84,10 @@ workspace "re3"
|
|||
filter { "system:windows" }
|
||||
configurations { "Vanilla" }
|
||||
platforms {
|
||||
"win-x86-RW33_d3d8-mss",
|
||||
"win-x86-RW34_d3d8-mss",
|
||||
"win-x86-librw_d3d9-mss",
|
||||
"win-x86-librw_gl3_glfw-mss",
|
||||
"win-x86-RW33_d3d8-oal",
|
||||
"win-x86-RW34_d3d8-oal",
|
||||
"win-x86-librw_d3d9-oal",
|
||||
"win-x86-librw_gl3_glfw-oal",
|
||||
"win-amd64-librw_d3d9-oal",
|
||||
|
@ -234,7 +234,7 @@ project "librw"
|
|||
filter "platforms:*gl3_glfw*"
|
||||
staticruntime "off"
|
||||
|
||||
filter "platforms:*RW33*"
|
||||
filter "platforms:*RW34*"
|
||||
flags { "ExcludeFromBuild" }
|
||||
filter {}
|
||||
end
|
||||
|
@ -243,9 +243,9 @@ local function addSrcFiles( prefix )
|
|||
return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc"
|
||||
end
|
||||
|
||||
project "re3"
|
||||
project "reVC"
|
||||
kind "WindowedApp"
|
||||
targetname "re3"
|
||||
targetname "reVC"
|
||||
targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}"
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
|
@ -336,8 +336,8 @@ project "re3"
|
|||
defines { "AUDIO_OAL" }
|
||||
|
||||
filter {}
|
||||
if(os.getenv("GTA_III_RE_DIR")) then
|
||||
setpaths(os.getenv("GTA_III_RE_DIR") .. "/", "%(cfg.buildtarget.name)")
|
||||
if(os.getenv("GTA_VC_RE_DIR")) then
|
||||
setpaths(os.getenv("GTA_VC_RE_DIR") .. "/", "%(cfg.buildtarget.name)")
|
||||
end
|
||||
|
||||
filter "platforms:win*"
|
||||
|
@ -419,10 +419,10 @@ project "re3"
|
|||
links { "opusfile" }
|
||||
end
|
||||
|
||||
filter "platforms:*RW33*"
|
||||
filter "platforms:*RW34*"
|
||||
includedirs { "sdk/rwsdk/include/d3d8" }
|
||||
libdirs { "sdk/rwsdk/lib/d3d8/release" }
|
||||
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse", "rpanisot" }
|
||||
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtanim", "rtcharse", "rpanisot" }
|
||||
defines { "RWLIBS" }
|
||||
linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text"
|
||||
|
||||
|
|
|
@ -7,18 +7,51 @@
|
|||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="re3_final.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
|
||||
sodipodi:docname="reVC.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07, custom)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 270.93331 270.93334"
|
||||
height="1024"
|
||||
width="1024"
|
||||
inkscape:export-filename="/home/hazelnot/Design/re3_red.png"
|
||||
inkscape:export-filename="/home/hazelnot/Design/re3_final.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<defs
|
||||
id="defs2" />
|
||||
id="defs2">
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter1055">
|
||||
<feFlood
|
||||
flood-opacity="1"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood1045" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite1047" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="0"
|
||||
result="blur"
|
||||
id="feGaussianBlur1049" />
|
||||
<feOffset
|
||||
dx="1"
|
||||
dy="1"
|
||||
result="offset"
|
||||
id="feOffset1051" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite1053" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="0"
|
||||
|
@ -30,10 +63,10 @@
|
|||
inkscape:pagecheckerboard="false"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g837"
|
||||
inkscape:current-layer="svg8"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="544.84615"
|
||||
inkscape:cx="415.73725"
|
||||
inkscape:cy="624.20389"
|
||||
inkscape:cx="108.63858"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
|
@ -61,10 +94,11 @@
|
|||
</metadata>
|
||||
<g
|
||||
id="g837"
|
||||
transform="matrix(2.1130708,0,0,2.1130708,14.956432,63.50059)">
|
||||
transform="matrix(2.1130708,0,0,2.1130708,14.956432,63.50059)"
|
||||
style="display:none">
|
||||
<path
|
||||
id="path1450"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.836;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.83595;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
d="M 0.91799998,0.91799998 V 54.101316 H 17.960888 v 2.33009 c 0,2.95453 1.347497,6.384348 3.911905,8.332308 2.564408,1.947971 5.514112,2.433445 8.500257,2.433445 h 46.367194 v -14.5464 c 2.171993,1.134845 4.548071,1.450557 6.948413,1.450557 h 17.042893 c 2.98614,0 5.93584,-0.485482 8.50025,-2.433442 2.5644,-1.94796 3.91191,-5.377273 3.91191,-8.331793 V 30.964744 c 0,-1.094128 -0.25094,-2.296243 -0.70487,-3.457153 0.45593,-1.16196 0.70487,-2.363609 0.70487,-3.453019 V 11.81656 c 0,-2.9682265 -1.29681,-6.3966108 -3.85713,-8.3907028 -2.56031,-1.9940909 -5.55104,-2.50785722 -8.55503,-2.50785722 H 83.819398 c -3.003989,0 -5.99213,0.51376632 -8.55245,2.50785722 C 74.832145,3.7645045 74.436551,4.1470248 74.074773,4.5591214 73.713016,4.1470532 73.317379,3.7644843 72.8826,3.4258572 70.322288,1.4317663 67.332073,0.91799998 64.328081,0.91799998 H 47.285195 c -2.976748,0 -5.937909,0.51342982 -8.482687,2.46289872 C 36.275393,1.4370808 33.325985,0.91799998 30.37305,0.91799998 Z"
|
||||
inkscape:label="Border" />
|
||||
<g
|
||||
|
@ -79,10 +113,50 @@
|
|||
transform="translate(-2.6458322)"
|
||||
inkscape:label="re" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:Pricedown;-inkscape-font-specification:Pricedown;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#c60000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:11.136;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:Pricedown;-inkscape-font-specification:Pricedown;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#c60000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:11.1359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
d="m 135.23613,125.97382 c -4.56245,0 -6.84367,-1.73285 -6.84367,-5.19855 v -7.89654 h 13.68733 v 2.50057 c 0,0.0877 0.0439,0.13161 0.13161,0.13161 h 3.09281 c 0.0877,0 0.13161,-0.0439 0.13161,-0.13161 v -6.11982 c 0,-0.0877 -0.0439,-0.13161 -0.13161,-0.13161 h -16.71434 v -8.35717 h 16.71434 c 0.0877,0 0.13161,-0.0439 0.13161,-0.13161 v -6.054011 c 0,-0.08774 -0.0439,-0.131609 -0.13161,-0.131609 h -3.09281 c -0.0877,0 -0.13161,0.04387 -0.13161,0.131609 v 2.434766 h -13.55572 v -7.764931 c 0,-3.553443 2.28122,-5.330164 6.84366,-5.330164 h 16.91176 c 4.56245,0 6.84367,1.776721 6.84367,5.330164 v 12.239636 c 0,2.01801 -1.14061,3.15862 -3.42184,3.42183 2.28123,0.30709 3.42184,1.46964 3.42184,3.48764 v 12.37125 c 0,3.4657 -2.28122,5.19855 -6.84367,5.19855 z"
|
||||
id="path1458"
|
||||
inkscape:label="3" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3625-7"
|
||||
inkscape:label="reVC_10"
|
||||
transform="matrix(2.4113736,0,0,2.4113736,-122.44911,-160.08821)">
|
||||
<path
|
||||
style="display:inline;fill:#00bbe2;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 102.78895,112.11187 54.54276,9.96769 -30.34918,43.22598 z"
|
||||
id="path1613-9"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:label="triangle" />
|
||||
<g
|
||||
id="g3669-0"
|
||||
style="display:inline;opacity:1"
|
||||
inkscape:label="re">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#f17db2;stroke-width:1.60863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
d="m 57.388672,80.632812 v 48.632808 h 17.042969 v 4.60547 c 0,2.45514 1.029322,5.01368 3.011718,6.51953 1.982397,1.50586 4.425056,1.97071 7.123047,1.97071 H 128.6582 v -17.04688 h -1.47851 c 0.87224,-1.37715 1.47851,-2.92106 1.47851,-4.53906 v -7.23633 -3.95312 -20.330081 c 0,-2.481169 -1.00049,-5.053605 -2.98047,-6.595703 -1.97997,-1.542097 -4.44771,-2.027344 -7.15625,-2.027344 h -17.04296 c -2.708546,10e-7 -5.176278,0.485247 -7.156254,2.027344 -0.588908,0.458669 -0.913121,1.140613 -1.328125,1.751953 -0.409812,-0.606749 -0.72664,-1.284534 -1.308594,-1.742187 -1.967878,-1.547555 -4.428385,-2.03711 -7.119141,-2.03711 z m 6.582031,6.583985 h 20.595703 c 1.827819,0 2.757419,0.399739 3.048828,0.628906 0.29141,0.229167 0.4375,0.331111 0.4375,1.410156 v 12.238281 c 0,0.0702 0.0022,0.0438 0.002,0.0801 0.03874,-0.0312 0.06635,0.0114 -0.451172,0.0723 l -0.05469,6.53321 c 0.66816,0.0899 0.752817,0.24295 0.65625,0.14453 -0.09657,-0.0984 -0.08594,-0.3087 -0.08594,0.0801 v 20.07031 c 0,0.59276 0.198598,1.6281 0.996093,2.42578 0.797496,0.79768 1.834701,0.99805 2.427735,0.99805 h 30.53125 v 3.8789 H 84.566406 c -1.864454,0 -2.841799,-0.40191 -3.140625,-0.6289 -0.298826,-0.227 -0.410156,-0.26677 -0.410156,-1.27735 v -24.61132 c 0,-0.59276 -0.200551,-1.6281 -0.998047,-2.42579 -0.797496,-0.79768 -1.832748,-0.99804 -2.425781,-0.99804 h -6.517578 v 16.8457 h -7.103516 z m 37.507817,0 h 17.04296 c 1.8539,0 2.80813,0.402095 3.10938,0.636719 0.30124,0.234623 0.44336,0.33007 0.44336,1.402343 V 106.95508 H 105.0293 v 8.42383 c 0,0.59313 0.20067,1.63031 0.99804,2.42773 0.79738,0.79742 1.83258,0.99609 2.42578,0.99609 h 3.09376 c 0.59313,0 1.62836,-0.19872 2.42578,-0.99609 0.51996,-0.51993 0.73732,-1.1028 0.85937,-1.63672 h 7.24219 v 4.60547 c 0,1.01057 -0.11133,1.05035 -0.41016,1.27734 -0.29882,0.227 -1.27812,0.62891 -3.14258,0.62891 h -17.04296 c -1.864458,0 -2.841803,-0.40191 -3.140629,-0.62891 -0.298826,-0.22699 -0.410157,-0.26677 -0.410157,-1.27734 V 89.255859 c 0,-1.072272 0.140161,-1.167719 0.441407,-1.402343 0.301246,-0.234625 1.255472,-0.636719 3.109379,-0.636719 z M 71.074219,91.162109 V 104.0625 h 6.517578 c 0.592903,0 1.628193,-0.20031 2.425781,-0.99805 0.797588,-0.79773 0.998047,-1.83309 0.998047,-2.42578 v -6.052732 c 0,-0.592528 -0.200189,-1.629881 -0.998047,-2.427735 -0.797858,-0.797853 -1.83326,-0.996094 -2.425781,-0.996094 z m 37.378901,0 c -0.59275,0 -1.62809,0.198598 -2.42578,0.996094 -0.79768,0.797496 -0.99804,1.834701 -0.99804,2.427735 v 9.148442 h 9.9414 v -9.148442 c 0,-0.592903 -0.20031,-1.630147 -0.99804,-2.427735 -0.79774,-0.797588 -1.8331,-0.996094 -2.42578,-0.996094 z"
|
||||
id="path3671-2"
|
||||
inkscape:label="outline" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:1.25;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:9.53813;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
d="m 84.566726,139.06892 c -4.562445,0 -6.843668,-1.73285 -6.843668,-5.19856 v -24.61088 c 0,-0.0877 -0.04387,-0.13161 -0.131609,-0.13161 h -3.22442 v 16.84595 H 60.679694 V 83.92475 h 23.887032 c 4.518575,0 6.777863,1.776721 6.777863,5.330164 v 12.239636 c 0,2.01801 -1.118676,3.15862 -3.356029,3.42183 2.281223,0.30709 3.421834,1.46964 3.421834,3.48764 v 20.07037 c 0,0.0877 0.04387,0.13161 0.131609,0.13161 h 33.823507 v 10.46292 z M 77.723058,94.585079 c 0,-0.08774 -0.04387,-0.131609 -0.131609,-0.131609 h -3.22442 v 6.31723 h 3.22442 c 0.08774,0 0.131609,-0.0439 0.131609,-0.13161 z m 33.955122,0 c 0,-0.08774 -0.0439,-0.131609 -0.13161,-0.131609 h -3.09281 c -0.0877,0 -0.13161,0.04387 -0.13161,0.131609 v 5.856601 h 3.35603 z m -10.1997,31.388741 c -4.562444,0 -6.843666,-1.73285 -6.843666,-5.19855 V 89.254914 c 0,-3.553443 2.281222,-5.330164 6.843666,-5.330164 h 17.04337 c 4.56244,0 6.84366,1.776721 6.84366,5.330164 v 20.991636 h -17.04336 v 5.13275 c 0,0.0877 0.0439,0.13161 0.13161,0.13161 h 3.09281 c 0.0877,0 0.13161,-0.0439 0.13161,-0.13161 v -2.50057 h 13.68733 v 7.89654 c 0,3.4657 -2.28122,5.19855 -6.84366,5.19855 z"
|
||||
id="path3673-3"
|
||||
inkscape:label="text" />
|
||||
</g>
|
||||
<g
|
||||
id="g861-9-7"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#f17db2;stroke-opacity:1;filter:url(#filter1055)"
|
||||
transform="matrix(1.3835644,0,0,1.3835644,-22.936608,36.936115)"
|
||||
inkscape:label="Vc">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#f17db2;stroke-width:3.175;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
d="m 115.29478,55.979585 a 1.0583349,1.0583349 0 0 0 -0.94727,0.53711 l -13.61915,24.06445 -1.763667,-7.15234 a 1.0583349,1.0583349 0 0 0 -1.28125,-0.77344 1.0583349,1.0583349 0 0 0 -0.77344,1.28125 l 2.40235,9.73438 a 1.0584408,1.0584408 0 0 0 1.947257,0.26757 l 14.9297,-26.38086 a 1.0583349,1.0583349 0 0 0 -0.39844,-1.4414 1.0583349,1.0583349 0 0 0 -0.49609,-0.13672 z"
|
||||
id="path892-1-5" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#f17db2;stroke-width:3.175;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
|
||||
d="m 118.1854,69.604585 a 1.0583349,1.0583349 0 0 0 -0.27343,0.0391 c 0,0 -2.1903,0.59881 -4.46875,2.08789 -2.27846,1.48909 -4.77359,3.96951 -5.16602,7.69531 -0.20107,1.90898 0.49022,3.43086 1.68359,4.15821 1.19338,0.72735 2.6066,0.75222 3.94727,0.60547 2.68134,-0.29351 5.29297,-1.44336 5.29297,-1.44336 a 1.0583349,1.0583349 0 0 0 0.55078,-1.39063 1.0583349,1.0583349 0 0 0 -1.39063,-0.55273 c 0,0 -2.46507,1.04035 -4.68359,1.2832 -1.10926,0.12142 -2.10191,0.002 -2.61523,-0.31055 -0.51333,-0.31286 -0.82729,-0.72566 -0.67969,-2.12695 0.3049,-2.89473 2.23993,-4.85323 4.21875,-6.14648 1.97882,-1.29326 3.87305,-1.82032 3.87305,-1.82032 a 1.0583349,1.0583349 0 0 0 0.73828,-1.30078 1.0583349,1.0583349 0 0 0 -1.02735,-0.77734 z"
|
||||
id="path896-2-9" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 21 KiB |
Binary file not shown.
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 57 KiB |
Binary file not shown.
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 30 KiB |
|
@ -167,4 +167,4 @@ if(${PROJECT}_INSTALL)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
re3_platform_target(${EXECUTABLE} INSTALL)
|
||||
reVC_platform_target(${EXECUTABLE} INSTALL)
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "General.h"
|
||||
#include "RwHelper.h"
|
||||
#include "ModelIndices.h"
|
||||
#include "ModelInfo.h"
|
||||
#include "AnimManager.h"
|
||||
#include "RpAnimBlend.h"
|
||||
|
@ -20,8 +21,11 @@
|
|||
|
||||
CAnimBlendAssocGroup::CAnimBlendAssocGroup(void)
|
||||
{
|
||||
animBlock = nil;
|
||||
assocList = nil;
|
||||
numAssociations = 0;
|
||||
firstAnimId = 0;
|
||||
groupId = -1;
|
||||
}
|
||||
|
||||
CAnimBlendAssocGroup::~CAnimBlendAssocGroup(void)
|
||||
|
@ -42,7 +46,7 @@ CAnimBlendAssocGroup::DestroyAssociations(void)
|
|||
CAnimBlendAssociation*
|
||||
CAnimBlendAssocGroup::GetAnimation(uint32 id)
|
||||
{
|
||||
return &assocList[id];
|
||||
return &assocList[id - firstAnimId];
|
||||
}
|
||||
|
||||
CAnimBlendAssociation*
|
||||
|
@ -52,6 +56,7 @@ CAnimBlendAssocGroup::GetAnimation(const char *name)
|
|||
for(i = 0; i < numAssociations; i++)
|
||||
if(!CGeneral::faststricmp(assocList[i].hierarchy->name, name))
|
||||
return &assocList[i];
|
||||
debug("\n\nCan't find the fucking animation %s\n\n\n", name);
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
@ -101,7 +106,7 @@ strcmpIgnoringDigits(const char *s1, const char *s2)
|
|||
c2 = __ascii_toupper(c2);
|
||||
#endif
|
||||
|
||||
if(c1 != c2)
|
||||
if(c1 && c2 && c1 != c2)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -111,6 +116,15 @@ GetModelFromName(const char *name)
|
|||
{
|
||||
int i;
|
||||
CBaseModelInfo *mi;
|
||||
char playername[32];
|
||||
|
||||
if(strncasecmp(name, "CSplay", 6) == 0 &&
|
||||
strncasecmp(CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName(), "ig", 2) == 0){
|
||||
strcpy(playername, CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName());
|
||||
playername[0] = 'C';
|
||||
playername[1] = 'S';
|
||||
name = playername;
|
||||
}
|
||||
|
||||
for(i = 0; i < MODELINFOSIZE; i++){
|
||||
mi = CModelInfo::GetModelInfo(i);
|
||||
|
@ -127,7 +141,6 @@ CAnimBlendAssocGroup::CreateAssociations(const char *name)
|
|||
int i;
|
||||
CAnimBlock *animBlock;
|
||||
|
||||
if(assocList)
|
||||
DestroyAssociations();
|
||||
|
||||
animBlock = CAnimManager::GetAnimationBlock(name);
|
||||
|
@ -137,17 +150,18 @@ CAnimBlendAssocGroup::CreateAssociations(const char *name)
|
|||
for(i = 0; i < animBlock->numAnims; i++){
|
||||
CAnimBlendHierarchy *anim = CAnimManager::GetAnimation(animBlock->firstIndex + i);
|
||||
CBaseModelInfo *model = GetModelFromName(anim->name);
|
||||
assert(model);
|
||||
printf("Associated anim %s with model %s\n", anim->name, model->GetModelName());
|
||||
if(model){
|
||||
debug("Associated anim %s with model %s\n", anim->name, model->GetModelName());
|
||||
RpClump *clump = (RpClump*)model->CreateInstance();
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil);
|
||||
#endif
|
||||
RpAnimBlendClumpInit(clump);
|
||||
assocList[i].Init(clump, anim);
|
||||
if(IsClumpSkinned(clump))
|
||||
RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil);
|
||||
RpClumpDestroy(clump);
|
||||
assocList[i].animId = i;
|
||||
assocList[i].animId = firstAnimId + i;
|
||||
assocList[i].groupId = groupId;
|
||||
}else
|
||||
debug("\n\nCANNOT FIND MODELINFO WITH NAME %s\n\n\n", anim->name);
|
||||
}
|
||||
numAssociations = animBlock->numAnims;
|
||||
}
|
||||
|
@ -157,9 +171,7 @@ void
|
|||
CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump, const char **animNames, int numAssocs)
|
||||
{
|
||||
int i;
|
||||
CAnimBlock *animBlock;
|
||||
|
||||
if(assocList)
|
||||
DestroyAssociations();
|
||||
|
||||
animBlock = CAnimManager::GetAnimationBlock(blockName);
|
||||
|
@ -168,7 +180,8 @@ CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump,
|
|||
numAssociations = 0;
|
||||
for(i = 0; i < numAssocs; i++){
|
||||
assocList[i].Init(clump, CAnimManager::GetAnimation(animNames[i], animBlock));
|
||||
assocList[i].animId = i;
|
||||
assocList[i].animId = firstAnimId + i;
|
||||
assocList[i].groupId = groupId;
|
||||
}
|
||||
numAssociations = numAssocs;
|
||||
}
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
class CAnimBlendAssociation;
|
||||
struct CAnimBlock;
|
||||
|
||||
class CAnimBlendAssocGroup
|
||||
{
|
||||
public:
|
||||
CAnimBlock *animBlock;
|
||||
CAnimBlendAssociation *assocList;
|
||||
int32 numAssociations;
|
||||
int32 firstAnimId;
|
||||
int32 groupId; // id of self in ms_aAnimAssocGroups
|
||||
|
||||
CAnimBlendAssocGroup(void);
|
||||
~CAnimBlendAssocGroup(void);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
CAnimBlendAssociation::CAnimBlendAssociation(void)
|
||||
{
|
||||
groupId = -1;
|
||||
nodes = nil;
|
||||
blendAmount = 1.0f;
|
||||
blendDelta = 0.0f;
|
||||
|
@ -54,7 +55,7 @@ CAnimBlendAssociation::AllocateAnimBlendNodeArray(int n)
|
|||
void
|
||||
CAnimBlendAssociation::FreeAnimBlendNodeArray(void)
|
||||
{
|
||||
assert(nodes != nil);
|
||||
if(nodes)
|
||||
RwFreeAlign(nodes);
|
||||
}
|
||||
|
||||
|
@ -75,7 +76,10 @@ CAnimBlendAssociation::Init(RpClump *clump, CAnimBlendHierarchy *hier)
|
|||
// NB: This is where the order of nodes is defined
|
||||
for(i = 0; i < hier->numSequences; i++){
|
||||
CAnimBlendSequence *seq = &hier->sequences[i];
|
||||
if(seq->boneTag == -1)
|
||||
frame = RpAnimBlendClumpFindFrame(clump, seq->name);
|
||||
else
|
||||
frame = RpAnimBlendClumpFindBone(clump, seq->boneTag);
|
||||
if(frame && seq->numFrames > 0)
|
||||
nodes[frame - clumpData->frames].sequence = seq;
|
||||
}
|
||||
|
@ -90,6 +94,7 @@ CAnimBlendAssociation::Init(CAnimBlendAssociation &assoc)
|
|||
numNodes = assoc.numNodes;
|
||||
flags = assoc.flags;
|
||||
animId = assoc.animId;
|
||||
groupId = assoc.groupId;
|
||||
AllocateAnimBlendNodeArray(numNodes);
|
||||
for(i = 0; i < numNodes; i++){
|
||||
nodes[i] = assoc.nodes[i];
|
||||
|
@ -126,12 +131,25 @@ CAnimBlendAssociation::SetCurrentTime(float time)
|
|||
int i;
|
||||
|
||||
for(currentTime = time; currentTime >= hierarchy->totalLength; currentTime -= hierarchy->totalLength)
|
||||
if(!IsRepeating())
|
||||
return;
|
||||
if (!IsRepeating()) {
|
||||
currentTime = hierarchy->totalLength;
|
||||
break;
|
||||
}
|
||||
|
||||
CAnimManager::UncompressAnimation(hierarchy);
|
||||
#ifdef ANIM_COMPRESSION
|
||||
// strangely PC has this but android doesn't
|
||||
if(hierarchy->keepCompressed){
|
||||
for(i = 0; i < numNodes; i++)
|
||||
if(nodes[i].sequence)
|
||||
nodes[i].SetupKeyFrameCompressed();
|
||||
}else
|
||||
#endif
|
||||
{
|
||||
for(i = 0; i < numNodes; i++)
|
||||
if(nodes[i].sequence)
|
||||
nodes[i].FindKeyFrame(currentTime);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -147,13 +165,23 @@ CAnimBlendAssociation::Start(float time)
|
|||
SetCurrentTime(time);
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendAssociation::UpdateTimeStep(float timeDelta, float relSpeed)
|
||||
{
|
||||
if(IsRunning())
|
||||
timeStep = (flags & ASSOC_MOVEMENT ? relSpeed*hierarchy->totalLength : speed) * timeDelta;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendAssociation::UpdateTime(float timeDelta, float relSpeed)
|
||||
{
|
||||
if(!IsRunning())
|
||||
return true;
|
||||
if(currentTime >= hierarchy->totalLength){
|
||||
flags &= ~ASSOC_RUNNING;
|
||||
return true;
|
||||
}
|
||||
|
||||
timeStep = (flags & ASSOC_MOVEMENT ? relSpeed*hierarchy->totalLength : speed) * timeDelta;
|
||||
currentTime += timeStep;
|
||||
|
||||
if(currentTime >= hierarchy->totalLength){
|
||||
|
@ -163,7 +191,6 @@ CAnimBlendAssociation::UpdateTime(float timeDelta, float relSpeed)
|
|||
currentTime -= hierarchy->totalLength;
|
||||
else{
|
||||
currentTime = hierarchy->totalLength;
|
||||
flags &= ~ASSOC_RUNNING;
|
||||
if(flags & ASSOC_FADEOUTWHENDONE){
|
||||
flags |= ASSOC_DELETEFADEDOUT;
|
||||
blendDelta = -4.0f;
|
||||
|
|
|
@ -12,12 +12,13 @@ enum {
|
|||
ASSOC_PARTIAL = 0x10,
|
||||
ASSOC_MOVEMENT = 0x20, // ???
|
||||
ASSOC_HAS_TRANSLATION = 0x40,
|
||||
ASSOC_WALK = 0x80, // for CPed::PlayFootSteps(void)
|
||||
ASSOC_IDLE = 0x100, // only used by xpress scratch, see CPed::Chat(void)
|
||||
ASSOC_NOWALK = 0x200, // see CPed::PlayFootSteps(void)
|
||||
ASSOC_BLOCK = 0x400, // unused in assoc description, blocks other anims from being played
|
||||
ASSOC_FRONTAL = 0x800, // anims that we fall to front
|
||||
ASSOC_HAS_X_TRANSLATION = 0x1000, // for 2d velocity extraction
|
||||
ASSOC_HAS_X_TRANSLATION = 0x80, // for 2d velocity extraction
|
||||
ASSOC_WALK = 0x100, // for CPed::PlayFootSteps(void)
|
||||
ASSOC_IDLE = 0x200, // only xpress scratch has it by default, but game adds it to player's idle animations later
|
||||
ASSOC_NOWALK = 0x400, // see CPed::PlayFootSteps(void)
|
||||
ASSOC_BLOCK = 0x800, // unused in assoc description, blocks other anims from being played
|
||||
ASSOC_FRONTAL = 0x1000, // anims that we fall to front
|
||||
ASSOC_DRIVING = 0x2000, // new in VC
|
||||
};
|
||||
|
||||
// Anim hierarchy associated with a clump
|
||||
|
@ -35,7 +36,8 @@ public:
|
|||
|
||||
CAnimBlendLink link;
|
||||
|
||||
int32 numNodes; // taken from CAnimBlendClumpData::numFrames
|
||||
int16 numNodes; // taken from CAnimBlendClumpData::numFrames
|
||||
int16 groupId; // ID of CAnimBlendAssocGroup this is in
|
||||
// NB: Order of these depends on order of nodes in Clump this was built from
|
||||
CAnimBlendNode *nodes;
|
||||
CAnimBlendHierarchy *hierarchy;
|
||||
|
@ -44,8 +46,8 @@ public:
|
|||
float currentTime;
|
||||
float speed;
|
||||
float timeStep;
|
||||
int32 animId;
|
||||
int32 flags;
|
||||
int16 animId;
|
||||
int16 flags;
|
||||
int32 callbackType;
|
||||
void (*callback)(CAnimBlendAssociation*, void*);
|
||||
void *callbackArg;
|
||||
|
@ -76,16 +78,16 @@ public:
|
|||
void SetCurrentTime(float time);
|
||||
void SyncAnimation(CAnimBlendAssociation *other);
|
||||
void Start(float time);
|
||||
void UpdateTimeStep(float timeDelta, float relSpeed);
|
||||
bool UpdateTime(float timeDelta, float relSpeed);
|
||||
bool UpdateBlend(float timeDelta);
|
||||
|
||||
void SetRun(void) { flags |= ASSOC_RUNNING; }
|
||||
|
||||
inline float GetTimeLeft() { return hierarchy->totalLength - currentTime; }
|
||||
float GetTimeLeft() { return hierarchy->totalLength - currentTime; }
|
||||
float GetProgress() { return currentTime / hierarchy->totalLength; }
|
||||
|
||||
static CAnimBlendAssociation *FromLink(CAnimBlendLink *l) {
|
||||
return (CAnimBlendAssociation*)((uint8*)l - offsetof(CAnimBlendAssociation, link));
|
||||
}
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(CAnimBlendAssociation, 0x40);
|
||||
|
|
|
@ -10,23 +10,19 @@ struct AnimBlendFrameData
|
|||
IGNORE_TRANSLATION = 4,
|
||||
VELOCITY_EXTRACTION = 8,
|
||||
VELOCITY_EXTRACTION_3D = 0x10,
|
||||
UPDATE_KEYFRAMES = 0x20,
|
||||
COMPRESSED = 0x40
|
||||
};
|
||||
|
||||
uint8 flag;
|
||||
RwV3d resetPos;
|
||||
#ifdef PED_SKIN
|
||||
union {
|
||||
RwFrame *frame;
|
||||
RpHAnimStdInterpFrame *hanimFrame;
|
||||
};
|
||||
int32 nodeID;
|
||||
#else
|
||||
RwFrame *frame;
|
||||
#endif
|
||||
};
|
||||
#ifndef PED_SKIN
|
||||
VALIDATE_SIZE(AnimBlendFrameData, 0x14);
|
||||
#endif
|
||||
VALIDATE_SIZE(AnimBlendFrameData, 0x18);
|
||||
|
||||
|
||||
class CAnimBlendClumpData
|
||||
|
@ -34,9 +30,6 @@ class CAnimBlendClumpData
|
|||
public:
|
||||
CAnimBlendLink link;
|
||||
int32 numFrames;
|
||||
#ifdef PED_SKIN
|
||||
int32 modelNumber; // doesn't seem to be used
|
||||
#endif
|
||||
union {
|
||||
CVector2D *velocity2d;
|
||||
CVector *velocity3d;
|
||||
|
@ -47,11 +40,6 @@ public:
|
|||
CAnimBlendClumpData(void);
|
||||
~CAnimBlendClumpData(void);
|
||||
void SetNumberOfFrames(int n);
|
||||
#ifdef PED_SKIN
|
||||
void SetNumberOfBones(int n) { SetNumberOfFrames(n); }
|
||||
#endif
|
||||
void ForAllFrames(void (*cb)(AnimBlendFrameData*, void*), void *arg);
|
||||
};
|
||||
#ifndef PED_SKIN
|
||||
VALIDATE_SIZE(CAnimBlendClumpData, 0x14);
|
||||
#endif
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "AnimBlendSequence.h"
|
||||
#include "AnimBlendHierarchy.h"
|
||||
#include "AnimManager.h"
|
||||
|
||||
CAnimBlendHierarchy::CAnimBlendHierarchy(void)
|
||||
{
|
||||
|
@ -15,9 +16,10 @@ CAnimBlendHierarchy::CAnimBlendHierarchy(void)
|
|||
void
|
||||
CAnimBlendHierarchy::Shutdown(void)
|
||||
{
|
||||
CAnimManager::RemoveFromUncompressedCache(this);
|
||||
RemoveAnimSequences();
|
||||
totalLength = 0.0f;
|
||||
compressed = 0;
|
||||
linkPtr = nil;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -30,13 +32,43 @@ void
|
|||
CAnimBlendHierarchy::CalcTotalTime(void)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
totalLength = 0.0f;
|
||||
|
||||
for(i = 0; i < numSequences; i++){
|
||||
float seqTime = 0.0f;
|
||||
for(j = 0; j < sequences[i].numFrames; j++)
|
||||
seqTime += sequences[i].GetKeyFrame(j)->deltaTime;
|
||||
totalLength = Max(totalLength, seqTime);
|
||||
#ifdef FIX_BUGS
|
||||
if(sequences[i].numFrames == 0)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
totalLength = Max(totalLength, sequences[i].GetKeyFrame(sequences[i].numFrames-1)->deltaTime);
|
||||
for(j = sequences[i].numFrames-1; j >= 1; j--){
|
||||
KeyFrame *kf1 = sequences[i].GetKeyFrame(j);
|
||||
KeyFrame *kf2 = sequences[i].GetKeyFrame(j-1);
|
||||
kf1->deltaTime -= kf2->deltaTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendHierarchy::CalcTotalTimeCompressed(void)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
totalLength = 0.0f;
|
||||
|
||||
for(i = 0; i < numSequences; i++){
|
||||
#ifdef FIX_BUGS
|
||||
if(sequences[i].numFrames == 0)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
totalLength = Max(totalLength, sequences[i].GetKeyFrameCompressed(sequences[i].numFrames-1)->GetDeltaTime());
|
||||
for(j = sequences[i].numFrames-1; j >= 1; j--){
|
||||
KeyFrameCompressed *kf1 = sequences[i].GetKeyFrameCompressed(j);
|
||||
KeyFrameCompressed *kf2 = sequences[i].GetKeyFrameCompressed(j-1);
|
||||
kf1->deltaTime -= kf2->deltaTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,6 +85,7 @@ void
|
|||
CAnimBlendHierarchy::RemoveAnimSequences(void)
|
||||
{
|
||||
delete[] sequences;
|
||||
sequences = nil;
|
||||
numSequences = 0;
|
||||
}
|
||||
|
||||
|
@ -65,9 +98,11 @@ CAnimBlendHierarchy::Uncompress(void)
|
|||
for(i = 0; i < numSequences; i++)
|
||||
sequences[i].Uncompress();
|
||||
#endif
|
||||
if(totalLength == 0.0f)
|
||||
CalcTotalTime();
|
||||
compressed = 0;
|
||||
if(totalLength == 0.0f){
|
||||
RemoveQuaternionFlips();
|
||||
CalcTotalTime();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -15,7 +15,8 @@ public:
|
|||
char name[24];
|
||||
CAnimBlendSequence *sequences;
|
||||
int16 numSequences;
|
||||
int16 compressed;
|
||||
bool compressed;
|
||||
bool keepCompressed;
|
||||
float totalLength;
|
||||
CLink<CAnimBlendHierarchy*> *linkPtr;
|
||||
|
||||
|
@ -23,11 +24,13 @@ public:
|
|||
void Shutdown(void);
|
||||
void SetName(char *name);
|
||||
void CalcTotalTime(void);
|
||||
void CalcTotalTimeCompressed(void);
|
||||
void RemoveQuaternionFlips(void);
|
||||
void RemoveAnimSequences(void);
|
||||
void Uncompress(void);
|
||||
void RemoveUncompressedData(void);
|
||||
void MoveMemory(bool onlyone = false);
|
||||
bool IsCompressed() { return !!compressed; };
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(CAnimBlendHierarchy, 0x28);
|
|
@ -45,6 +45,44 @@ CAnimBlendNode::Update(CVector &trans, CQuaternion &rot, float weight)
|
|||
return looped;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendNode::UpdateCompressed(CVector &trans, CQuaternion &rot, float weight)
|
||||
{
|
||||
bool looped = false;
|
||||
|
||||
trans = CVector(0.0f, 0.0f, 0.0f);
|
||||
rot = CQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
if(association->IsRunning()){
|
||||
remainingTime -= association->timeStep;
|
||||
if(remainingTime <= 0.0f)
|
||||
looped = NextKeyFrameCompressed();
|
||||
}
|
||||
|
||||
float blend = association->GetBlendAmount(weight);
|
||||
if(blend > 0.0f){
|
||||
KeyFrameTransCompressed *kfA = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameA);
|
||||
KeyFrameTransCompressed *kfB = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameB);
|
||||
float t = kfA->deltaTime == 0 ? 0.0f : (kfA->GetDeltaTime() - remainingTime)/kfA->GetDeltaTime();
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
CVector transA, transB;
|
||||
kfA->GetTranslation(&transA);
|
||||
kfB->GetTranslation(&transB);
|
||||
trans = transB + t*(transA - transB);
|
||||
trans *= blend;
|
||||
}
|
||||
if(sequence->type & CAnimBlendSequence::KF_ROT){
|
||||
CQuaternion rotA, rotB;
|
||||
kfA->GetRotation(&rotA);
|
||||
kfB->GetRotation(&rotB);
|
||||
rot.Slerp(rotB, rotA, theta, invSin, t);
|
||||
rot *= blend;
|
||||
}
|
||||
}
|
||||
|
||||
return looped;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendNode::NextKeyFrame(void)
|
||||
{
|
||||
|
@ -82,6 +120,43 @@ CAnimBlendNode::NextKeyFrame(void)
|
|||
return looped;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendNode::NextKeyFrameCompressed(void)
|
||||
{
|
||||
bool looped;
|
||||
|
||||
if(sequence->numFrames <= 1)
|
||||
return false;
|
||||
|
||||
looped = false;
|
||||
frameB = frameA;
|
||||
|
||||
// Advance as long as we have to
|
||||
while(remainingTime <= 0.0f){
|
||||
frameA++;
|
||||
|
||||
if(frameA >= sequence->numFrames){
|
||||
// reached end of animation
|
||||
if(!association->IsRepeating()){
|
||||
frameA--;
|
||||
remainingTime = 0.0f;
|
||||
return false;
|
||||
}
|
||||
looped = true;
|
||||
frameA = 0;
|
||||
}
|
||||
|
||||
remainingTime += sequence->GetKeyFrameCompressed(frameA)->GetDeltaTime();
|
||||
}
|
||||
|
||||
frameB = frameA - 1;
|
||||
if(frameB < 0)
|
||||
frameB += sequence->numFrames;
|
||||
|
||||
CalcDeltasCompressed();
|
||||
return looped;
|
||||
}
|
||||
|
||||
// Set animation to time t
|
||||
bool
|
||||
CAnimBlendNode::FindKeyFrame(float t)
|
||||
|
@ -92,20 +167,22 @@ CAnimBlendNode::FindKeyFrame(float t)
|
|||
frameA = 0;
|
||||
frameB = frameA;
|
||||
|
||||
if(sequence->numFrames >= 2){
|
||||
frameA++;
|
||||
|
||||
if(sequence->numFrames == 1){
|
||||
remainingTime = 0.0f;
|
||||
}else{
|
||||
// advance until t is between frameB and frameA
|
||||
while(t > sequence->GetKeyFrame(frameA)->deltaTime){
|
||||
while (t > sequence->GetKeyFrame(++frameA)->deltaTime) {
|
||||
t -= sequence->GetKeyFrame(frameA)->deltaTime;
|
||||
frameB = frameA++;
|
||||
if(frameA >= sequence->numFrames){
|
||||
if (frameA + 1 >= sequence->numFrames) {
|
||||
// reached end of animation
|
||||
if(!association->IsRepeating())
|
||||
if (!association->IsRepeating()) {
|
||||
CalcDeltas();
|
||||
remainingTime = 0.0f;
|
||||
return false;
|
||||
frameA = 0;
|
||||
frameB = 0;
|
||||
}
|
||||
frameA = 0;
|
||||
}
|
||||
frameB = frameA;
|
||||
}
|
||||
|
||||
remainingTime = sequence->GetKeyFrame(frameA)->deltaTime - t;
|
||||
|
@ -115,6 +192,25 @@ CAnimBlendNode::FindKeyFrame(float t)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CAnimBlendNode::SetupKeyFrameCompressed(void)
|
||||
{
|
||||
if(sequence->numFrames < 1)
|
||||
return false;
|
||||
|
||||
frameA = 1;
|
||||
frameB = 0;
|
||||
|
||||
if(sequence->numFrames == 1){
|
||||
frameA = 0;
|
||||
remainingTime = 0.0f;
|
||||
}else
|
||||
remainingTime = sequence->GetKeyFrameCompressed(frameA)->GetDeltaTime();
|
||||
|
||||
CalcDeltasCompressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::CalcDeltas(void)
|
||||
{
|
||||
|
@ -129,6 +225,28 @@ CAnimBlendNode::CalcDeltas(void)
|
|||
invSin = theta == 0.0f ? 0.0f : 1.0f/Sin(theta);
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::CalcDeltasCompressed(void)
|
||||
{
|
||||
if((sequence->type & CAnimBlendSequence::KF_ROT) == 0)
|
||||
return;
|
||||
KeyFrameCompressed *kfA = sequence->GetKeyFrameCompressed(frameA);
|
||||
KeyFrameCompressed *kfB = sequence->GetKeyFrameCompressed(frameB);
|
||||
CQuaternion rotA, rotB;
|
||||
kfA->GetRotation(&rotA);
|
||||
kfB->GetRotation(&rotB);
|
||||
float cos = DotProduct(rotA, rotB);
|
||||
if(cos < 0.0f){
|
||||
rotB *= -1.0f;
|
||||
kfB->SetRotation(rotB);
|
||||
}
|
||||
cos = DotProduct(rotA, rotB);
|
||||
if(cos > 1.0f)
|
||||
cos = 1.0f;
|
||||
theta = Acos(cos);
|
||||
invSin = theta == 0.0f ? 0.0f : 1.0f/Sin(theta);
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
|
||||
{
|
||||
|
@ -138,7 +256,7 @@ CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
|
|||
if(blend > 0.0f){
|
||||
KeyFrameTrans *kfA = (KeyFrameTrans*)sequence->GetKeyFrame(frameA);
|
||||
KeyFrameTrans *kfB = (KeyFrameTrans*)sequence->GetKeyFrame(frameB);
|
||||
float t = (kfA->deltaTime - remainingTime)/kfA->deltaTime;
|
||||
float t = kfA->deltaTime == 0.0f ? 0.0f : (kfA->deltaTime - remainingTime)/kfA->deltaTime;
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
trans = kfB->translation + t*(kfA->translation - kfB->translation);
|
||||
trans *= blend;
|
||||
|
@ -146,6 +264,26 @@ CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::GetCurrentTranslationCompressed(CVector &trans, float weight)
|
||||
{
|
||||
trans = CVector(0.0f, 0.0f, 0.0f);
|
||||
|
||||
float blend = association->GetBlendAmount(weight);
|
||||
if(blend > 0.0f){
|
||||
KeyFrameTransCompressed *kfA = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameA);
|
||||
KeyFrameTransCompressed *kfB = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(frameB);
|
||||
float t = kfA->deltaTime == 0 ? 0.0f : (kfA->GetDeltaTime() - remainingTime)/kfA->GetDeltaTime();
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
CVector transA, transB;
|
||||
kfA->GetTranslation(&transA);
|
||||
kfB->GetTranslation(&transB);
|
||||
trans = transB + t*(transA - transB);
|
||||
trans *= blend;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::GetEndTranslation(CVector &trans, float weight)
|
||||
{
|
||||
|
@ -158,3 +296,19 @@ CAnimBlendNode::GetEndTranslation(CVector &trans, float weight)
|
|||
trans = kf->translation * blend;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendNode::GetEndTranslationCompressed(CVector &trans, float weight)
|
||||
{
|
||||
trans = CVector(0.0f, 0.0f, 0.0f);
|
||||
|
||||
float blend = association->GetBlendAmount(weight);
|
||||
if(blend > 0.0f){
|
||||
KeyFrameTransCompressed *kf = (KeyFrameTransCompressed*)sequence->GetKeyFrameCompressed(sequence->numFrames-1);
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
CVector pos;
|
||||
kf->GetTranslation(&pos);
|
||||
trans = pos * blend;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,11 +20,17 @@ public:
|
|||
|
||||
void Init(void);
|
||||
bool Update(CVector &trans, CQuaternion &rot, float weight);
|
||||
bool UpdateCompressed(CVector &trans, CQuaternion &rot, float weight);
|
||||
bool NextKeyFrame(void);
|
||||
bool NextKeyFrameCompressed(void);
|
||||
bool FindKeyFrame(float t);
|
||||
bool SetupKeyFrameCompressed(void);
|
||||
void CalcDeltas(void);
|
||||
void CalcDeltasCompressed(void);
|
||||
void GetCurrentTranslation(CVector &trans, float weight);
|
||||
void GetCurrentTranslationCompressed(CVector &trans, float weight);
|
||||
void GetEndTranslation(CVector &trans, float weight);
|
||||
void GetEndTranslationCompressed(CVector &trans, float weight);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -9,9 +9,7 @@ CAnimBlendSequence::CAnimBlendSequence(void)
|
|||
numFrames = 0;
|
||||
keyFrames = nil;
|
||||
keyFramesCompressed = nil;
|
||||
#ifdef PED_SKIN
|
||||
boneTag = -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
CAnimBlendSequence::~CAnimBlendSequence(void)
|
||||
|
@ -29,18 +27,21 @@ CAnimBlendSequence::SetName(char *name)
|
|||
}
|
||||
|
||||
void
|
||||
CAnimBlendSequence::SetNumFrames(int numFrames, bool translation)
|
||||
CAnimBlendSequence::SetNumFrames(int numFrames, bool translation, bool compressed)
|
||||
{
|
||||
int sz;
|
||||
|
||||
if(translation){
|
||||
sz = sizeof(KeyFrameTrans);
|
||||
type |= KF_ROT | KF_TRANS;
|
||||
if(compressed)
|
||||
keyFramesCompressed = RwMalloc(sizeof(KeyFrameTrans) * numFrames);
|
||||
else
|
||||
keyFrames = RwMalloc(sizeof(KeyFrameTrans) * numFrames);
|
||||
}else{
|
||||
sz = sizeof(KeyFrame);
|
||||
type |= KF_ROT;
|
||||
if(compressed)
|
||||
keyFramesCompressed = RwMalloc(sizeof(KeyFrame) * numFrames);
|
||||
else
|
||||
keyFrames = RwMalloc(sizeof(KeyFrame) * numFrames);
|
||||
}
|
||||
keyFrames = RwMalloc(sz * numFrames);
|
||||
this->numFrames = numFrames;
|
||||
}
|
||||
|
||||
|
@ -76,7 +77,7 @@ CAnimBlendSequence::Uncompress(void)
|
|||
|
||||
float rotScale = 1.0f/4096.0f;
|
||||
float timeScale = 1.0f/60.0f;
|
||||
float transScale = 1.0f/128.0f;
|
||||
float transScale = 1.0f/1024.0f;
|
||||
if(type & KF_TRANS){
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTrans));
|
||||
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)keyFramesCompressed;
|
||||
|
@ -129,7 +130,7 @@ CAnimBlendSequence::CompressKeyframes(void)
|
|||
|
||||
float rotScale = 4096.0f;
|
||||
float timeScale = 60.0f;
|
||||
float transScale = 128.0f;
|
||||
float transScale = 1024.0f;
|
||||
if(type & KF_TRANS){
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTransCompressed));
|
||||
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)newKfs;
|
||||
|
@ -197,4 +198,3 @@ CAnimBlendSequence::MoveMemory(void)
|
|||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -19,10 +19,38 @@ struct KeyFrameTrans : KeyFrame {
|
|||
struct KeyFrameCompressed {
|
||||
int16 rot[4]; // 4096
|
||||
int16 deltaTime; // 60
|
||||
|
||||
void GetRotation(CQuaternion *quat){
|
||||
float scale = 1.0f/4096.0f;
|
||||
quat->x = rot[0]*scale;
|
||||
quat->y = rot[1]*scale;
|
||||
quat->z = rot[2]*scale;
|
||||
quat->w = rot[3]*scale;
|
||||
}
|
||||
void SetRotation(const CQuaternion &quat){
|
||||
rot[0] = quat.x * 4096.0f;
|
||||
rot[1] = quat.y * 4096.0f;
|
||||
rot[2] = quat.z * 4096.0f;
|
||||
rot[3] = quat.w * 4096.0f;
|
||||
}
|
||||
float GetDeltaTime(void) { return deltaTime/60.0f; }
|
||||
void SetTime(float t) { deltaTime = t*60.0f + 0.5f; }
|
||||
};
|
||||
|
||||
struct KeyFrameTransCompressed : KeyFrameCompressed {
|
||||
int16 trans[3]; // 128
|
||||
int16 trans[3]; // 1024
|
||||
|
||||
void GetTranslation(CVector *vec) {
|
||||
float scale = 1.0f/1024.0f;
|
||||
vec->x = trans[0]*scale;
|
||||
vec->y = trans[1]*scale;
|
||||
vec->z = trans[2]*scale;
|
||||
}
|
||||
void SetTranslation(const CVector &vec){
|
||||
trans[0] = vec.x*1024.0f;
|
||||
trans[1] = vec.y*1024.0f;
|
||||
trans[2] = vec.z*1024.0f;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -37,32 +65,31 @@ public:
|
|||
int32 type;
|
||||
char name[24];
|
||||
int32 numFrames;
|
||||
#ifdef PED_SKIN
|
||||
int16 boneTag;
|
||||
#endif
|
||||
void *keyFrames;
|
||||
void *keyFramesCompressed;
|
||||
|
||||
CAnimBlendSequence(void);
|
||||
virtual ~CAnimBlendSequence(void);
|
||||
void SetName(char *name);
|
||||
void SetNumFrames(int numFrames, bool translation);
|
||||
void SetNumFrames(int numFrames, bool translation, bool compressed);
|
||||
void RemoveQuaternionFlips(void);
|
||||
KeyFrame *GetKeyFrame(int n) {
|
||||
return type & KF_TRANS ?
|
||||
&((KeyFrameTrans*)keyFrames)[n] :
|
||||
&((KeyFrame*)keyFrames)[n];
|
||||
}
|
||||
KeyFrameCompressed *GetKeyFrameCompressed(int n) {
|
||||
return type & KF_TRANS ?
|
||||
&((KeyFrameTransCompressed*)keyFramesCompressed)[n] :
|
||||
&((KeyFrameCompressed*)keyFramesCompressed)[n];
|
||||
}
|
||||
bool HasTranslation(void) { return !!(type & KF_TRANS); }
|
||||
void Uncompress(void);
|
||||
void CompressKeyframes(void);
|
||||
void RemoveUncompressedData(void);
|
||||
bool MoveMemory(void);
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void SetBoneTag(int tag) { boneTag = tag; }
|
||||
#endif
|
||||
};
|
||||
#ifndef PED_SKIN
|
||||
VALIDATE_SIZE(CAnimBlendSequence, 0x2C);
|
||||
#endif
|
||||
VALIDATE_SIZE(CAnimBlendSequence, 0x30);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,24 +6,57 @@
|
|||
enum AssocGroupId
|
||||
{
|
||||
ASSOCGRP_STD,
|
||||
ASSOCGRP_VAN,
|
||||
ASSOCGRP_COACH,
|
||||
ASSOCGRP_BIKE_STANDARD,
|
||||
ASSOCGRP_BIKE_VESPA,
|
||||
ASSOCGRP_BIKE_HARLEY,
|
||||
ASSOCGRP_BIKE_DIRT,
|
||||
ASSOCGRP_UNARMED,
|
||||
ASSOCGRP_SCREWDRIVER,
|
||||
ASSOCGRP_KNIFE,
|
||||
ASSOCGRP_BASEBALLBAT,
|
||||
ASSOCGRP_GOLFCLUB,
|
||||
ASSOCGRP_CHAINSAW,
|
||||
ASSOCGRP_PYTHON,
|
||||
ASSOCGRP_COLT,
|
||||
ASSOCGRP_SHOTGUN,
|
||||
ASSOCGRP_BUDDY,
|
||||
ASSOCGRP_TEC,
|
||||
ASSOCGRP_UZI,
|
||||
ASSOCGRP_RIFLE,
|
||||
ASSOCGRP_M60,
|
||||
ASSOCGRP_SNIPER,
|
||||
ASSOCGRP_THROW,
|
||||
ASSOCGRP_FLAMETHROWER,
|
||||
ASSOCGRP_MEDIC,
|
||||
ASSOCGRP_SUNBATHE,
|
||||
ASSOCGRP_PLAYER_IDLE,
|
||||
ASSOCGRP_RIOT,
|
||||
ASSOCGRP_STRIP,
|
||||
ASSOCGRP_LANCE,
|
||||
ASSOCGRP_PLAYER,
|
||||
ASSOCGRP_PLAYERROCKET,
|
||||
ASSOCGRP_PLAYER1ARMED,
|
||||
ASSOCGRP_PLAYER2ARMED,
|
||||
ASSOCGRP_PLAYERBBBAT,
|
||||
ASSOCGRP_PLAYERCHAINSAW,
|
||||
ASSOCGRP_SHUFFLE,
|
||||
ASSOCGRP_OLD,
|
||||
ASSOCGRP_GANG1,
|
||||
ASSOCGRP_GANG2,
|
||||
ASSOCGRP_FAT,
|
||||
ASSOCGRP_OLDFAT,
|
||||
ASSOCGRP_JOGGER,
|
||||
ASSOCGRP_WOMAN,
|
||||
ASSOCGRP_WOMANSHOP,
|
||||
ASSOCGRP_BUSYWOMAN,
|
||||
ASSOCGRP_SEXYWOMAN,
|
||||
ASSOCGRP_OLDWOMAN,
|
||||
ASSOCGRP_FATWOMAN,
|
||||
ASSOCGRP_OLDWOMAN,
|
||||
ASSOCGRP_JOGWOMAN,
|
||||
ASSOCGRP_PANICCHUNKY,
|
||||
ASSOCGRP_SKATE,
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
ASSOCGRP_PLAYERBACK,
|
||||
ASSOCGRP_PLAYERLEFT,
|
||||
|
@ -31,6 +64,9 @@ enum AssocGroupId
|
|||
ASSOCGRP_ROCKETBACK,
|
||||
ASSOCGRP_ROCKETLEFT,
|
||||
ASSOCGRP_ROCKETRIGHT,
|
||||
ASSOCGRP_CHAINSAWBACK,
|
||||
ASSOCGRP_CHAINSAWLEFT,
|
||||
ASSOCGRP_CHAINSAWRIGHT,
|
||||
#endif
|
||||
|
||||
NUM_ANIM_ASSOC_GROUPS
|
||||
|
@ -39,11 +75,15 @@ enum AssocGroupId
|
|||
class CAnimBlendAssociation;
|
||||
class CAnimBlendAssocGroup;
|
||||
|
||||
#define MAX_ANIMBLOCK_NAME 20
|
||||
|
||||
// A block of hierarchies
|
||||
struct CAnimBlock
|
||||
{
|
||||
char name[24];
|
||||
int32 firstIndex;
|
||||
char name[MAX_ANIMBLOCK_NAME];
|
||||
bool isLoaded;
|
||||
int16 refCount;
|
||||
int32 firstIndex; // first animtion in ms_aAnimations
|
||||
int32 numAnims;
|
||||
};
|
||||
|
||||
|
@ -77,7 +117,16 @@ public:
|
|||
static void Initialise(void);
|
||||
static void Shutdown(void);
|
||||
static void UncompressAnimation(CAnimBlendHierarchy *anim);
|
||||
static void RemoveFromUncompressedCache(CAnimBlendHierarchy *hier);
|
||||
static CAnimBlock *GetAnimationBlock(int32 block) { return &ms_aAnimBlocks[block]; }
|
||||
static CAnimBlock *GetAnimationBlock(const char *name);
|
||||
static int32 GetAnimationBlockIndex(const char *name);
|
||||
static int32 RegisterAnimBlock(const char *name);
|
||||
static int32 GetNumRefsToAnimBlock(int32 block);
|
||||
static void AddAnimBlockRef(int32 block);
|
||||
static void RemoveAnimBlockRefWithoutDelete(int32 block);
|
||||
static void RemoveAnimBlockRef(int32 block);
|
||||
static void RemoveAnimBlock(int32 block);
|
||||
static CAnimBlendHierarchy *GetAnimation(const char *name, CAnimBlock *animBlock);
|
||||
static CAnimBlendHierarchy *GetAnimation(int32 n) { return &ms_aAnimations[n]; }
|
||||
static const char *GetAnimGroupName(AssocGroupId groupId);
|
||||
|
@ -89,6 +138,8 @@ public:
|
|||
static CAnimBlendAssociation *BlendAnimation(RpClump *clump, AssocGroupId groupId, AnimationId animId, float delta);
|
||||
static void LoadAnimFiles(void);
|
||||
static void LoadAnimFile(const char *filename);
|
||||
static void LoadAnimFile(int fd, bool compress);
|
||||
static void LoadAnimFile(RwStream *stream, bool compress, char (*uncompressedAnims)[32] = nil);
|
||||
static void CreateAnimAssocGroups(void);
|
||||
static void RemoveLastAnimFile(void);
|
||||
static CAnimBlendAssocGroup* GetAnimAssocGroups(void) { return ms_aAnimAssocGroups; }
|
||||
};
|
||||
|
|
|
@ -42,9 +42,6 @@ enum AnimationId
|
|||
ANIM_STD_HIT_FLOOR,
|
||||
|
||||
/* names made up */
|
||||
#if GTA_VERSION <= GTA3_PS2_160
|
||||
ANIM_STD_HIT_BODY,
|
||||
#endif
|
||||
ANIM_STD_HIT_BODYBLOW,
|
||||
ANIM_STD_HIT_CHEST,
|
||||
ANIM_STD_HIT_HEAD,
|
||||
|
@ -54,42 +51,6 @@ enum AnimationId
|
|||
ANIM_STD_HIT_WALL,
|
||||
ANIM_STD_HIT_FLOOR_FRONT,
|
||||
ANIM_STD_HIT_BEHIND,
|
||||
ANIM_STD_PUNCH,
|
||||
ANIM_STD_KICKGROUND,
|
||||
|
||||
/* names made up */
|
||||
ANIM_STD_WEAPON_BAT_H,
|
||||
ANIM_STD_WEAPON_BAT_V,
|
||||
ANIM_STD_WEAPON_HGUN_BODY,
|
||||
ANIM_STD_WEAPON_AK_BODY,
|
||||
ANIM_STD_WEAPON_PUMP,
|
||||
ANIM_STD_WEAPON_SNIPER,
|
||||
ANIM_STD_WEAPON_THROW,
|
||||
/**/
|
||||
|
||||
ANIM_STD_THROW_UNDER,
|
||||
|
||||
/* names made up */
|
||||
ANIM_STD_START_THROW,
|
||||
/**/
|
||||
|
||||
ANIM_STD_DETONATE,
|
||||
|
||||
/* names made up */
|
||||
ANIM_STD_HGUN_RELOAD,
|
||||
ANIM_STD_AK_RELOAD,
|
||||
#ifdef PC_PLAYER_CONTROLS
|
||||
// maybe wrong define, but unused anyway
|
||||
ANIM_FPS_PUNCH,
|
||||
ANIM_FPS_BAT,
|
||||
ANIM_FPS_UZI,
|
||||
ANIM_FPS_PUMP,
|
||||
ANIM_FPS_AK,
|
||||
ANIM_FPS_M16,
|
||||
ANIM_FPS_ROCKET,
|
||||
#endif
|
||||
/**/
|
||||
|
||||
ANIM_STD_FIGHT_IDLE,
|
||||
ANIM_STD_FIGHT_2IDLE,
|
||||
ANIM_STD_FIGHT_SHUFFLE_F,
|
||||
|
@ -106,6 +67,23 @@ enum AnimationId
|
|||
/**/
|
||||
|
||||
ANIM_STD_PARTIAL_PUNCH,
|
||||
|
||||
/* names made up */
|
||||
ANIM_STD_FIGHT_JAB,
|
||||
ANIM_STD_FIGHT_ELBOW_L,
|
||||
ANIM_STD_FIGHT_ELBOW_R,
|
||||
ANIM_STD_FIGHT_BKICK_L,
|
||||
ANIM_STD_FIGHT_BKICK_R,
|
||||
/**/
|
||||
|
||||
ANIM_STD_DETONATE,
|
||||
ANIM_STD_PUNCH,
|
||||
ANIM_STD_PARTIALPUNCH,
|
||||
ANIM_STD_KICKGROUND,
|
||||
|
||||
ANIM_STD_THROW_UNDER,
|
||||
ANIM_STD_FIGHT_SHUFFLE_B,
|
||||
|
||||
ANIM_STD_JACKEDCAR_RHS,
|
||||
ANIM_STD_JACKEDCAR_LO_RHS,
|
||||
ANIM_STD_JACKEDCAR_LHS,
|
||||
|
@ -124,6 +102,7 @@ enum AnimationId
|
|||
ANIM_STD_CAR_CLOSE_DOOR_LO_LHS,
|
||||
ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LHS,
|
||||
ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LO_LHS,
|
||||
ANIM_STD_CAR_JUMP_IN_LO_LHS,
|
||||
ANIM_STD_GETOUT_LHS,
|
||||
ANIM_STD_GETOUT_LO_LHS,
|
||||
ANIM_STD_CAR_CLOSE_LHS,
|
||||
|
@ -149,29 +128,36 @@ enum AnimationId
|
|||
ANIM_STD_CAR_DRIVE_RIGHT_LO,
|
||||
ANIM_STD_CAR_DRIVEBY_LEFT,
|
||||
ANIM_STD_CAR_DRIVEBY_RIGHT,
|
||||
ANIM_STD_CAR_DRIVEBY_LEFT_LO,
|
||||
ANIM_STD_CAR_DRIVEBY_RIGHT_LO,
|
||||
ANIM_STD_CAR_LOOKBEHIND,
|
||||
ANIM_STD_BOAT_DRIVE,
|
||||
ANIM_STD_BOAT_DRIVE_LEFT,
|
||||
ANIM_STD_BOAT_DRIVE_RIGHT,
|
||||
ANIM_STD_BOAT_LOOKBEHIND,
|
||||
|
||||
ANIM_STD_BIKE_PICKUP_LHS,
|
||||
ANIM_STD_BIKE_PICKUP_RHS,
|
||||
ANIM_STD_BIKE_PULLUP_LHS,
|
||||
ANIM_STD_BIKE_PULLUP_RHS,
|
||||
ANIM_STD_BIKE_ELBOW_LHS,
|
||||
ANIM_STD_BIKE_ELBOW_RHS,
|
||||
ANIM_STD_BIKE_FALLOFF,
|
||||
ANIM_STD_BIKE_FALLBACK,
|
||||
|
||||
ANIM_STD_GETOUT_RHS,
|
||||
ANIM_STD_GETOUT_LO_RHS,
|
||||
ANIM_STD_CAR_CLOSE_RHS,
|
||||
ANIM_STD_CAR_HOOKERTALK,
|
||||
ANIM_STD_COACH_OPEN_LHS,
|
||||
ANIM_STD_COACH_OPEN_RHS,
|
||||
ANIM_STD_COACH_GET_IN_LHS,
|
||||
ANIM_STD_COACH_GET_IN_RHS,
|
||||
ANIM_STD_COACH_GET_OUT_LHS,
|
||||
|
||||
ANIM_STD_TRAIN_GETIN,
|
||||
ANIM_STD_TRAIN_GETOUT,
|
||||
|
||||
ANIM_STD_CRAWLOUT_LHS,
|
||||
ANIM_STD_CRAWLOUT_RHS,
|
||||
ANIM_STD_VAN_OPEN_DOOR_REAR_LHS,
|
||||
ANIM_STD_VAN_GET_IN_REAR_LHS,
|
||||
ANIM_STD_VAN_CLOSE_DOOR_REAR_LHS,
|
||||
ANIM_STD_VAN_GET_OUT_REAR_LHS,
|
||||
ANIM_STD_VAN_OPEN_DOOR_REAR_RHS,
|
||||
ANIM_STD_VAN_GET_IN_REAR_RHS,
|
||||
ANIM_STD_VAN_CLOSE_DOOR_REAR_RHS,
|
||||
ANIM_STD_VAN_GET_OUT_REAR_RHS,
|
||||
ANIM_STD_ROLLOUT_LHS,
|
||||
ANIM_STD_ROLLOUT_RHS,
|
||||
|
||||
ANIM_STD_GET_UP,
|
||||
ANIM_STD_GET_UP_LEFT,
|
||||
ANIM_STD_GET_UP_RIGHT,
|
||||
|
@ -183,6 +169,9 @@ enum AnimationId
|
|||
ANIM_STD_FALL_GLIDE,
|
||||
ANIM_STD_FALL_LAND,
|
||||
ANIM_STD_FALL_COLLAPSE,
|
||||
ANIM_STD_FALL_ONBACK,
|
||||
ANIM_STD_FALL_ONFRONT,
|
||||
|
||||
ANIM_STD_EVADE_STEP,
|
||||
ANIM_STD_EVADE_DIVE,
|
||||
ANIM_STD_XPRESS_SCRATCH,
|
||||
|
@ -190,15 +179,12 @@ enum AnimationId
|
|||
ANIM_STD_TURN180,
|
||||
ANIM_STD_ARREST,
|
||||
ANIM_STD_DROWN,
|
||||
ANIM_MEDIC_CPR,
|
||||
ANIM_STD_DUCK_DOWN,
|
||||
ANIM_STD_DUCK_LOW,
|
||||
|
||||
ANIM_STD_DUCK_WEAPON,
|
||||
|
||||
ANIM_STD_RBLOCK_SHOOT,
|
||||
|
||||
/* names made up */
|
||||
ANIM_STD_THROW_UNDER2,
|
||||
/**/
|
||||
|
||||
ANIM_STD_HANDSUP,
|
||||
ANIM_STD_HANDSCOWER,
|
||||
ANIM_STD_PARTIAL_FUCKU,
|
||||
|
@ -206,5 +192,96 @@ enum AnimationId
|
|||
ANIM_STD_PHONE_OUT,
|
||||
ANIM_STD_PHONE_TALK,
|
||||
|
||||
ANIM_STD_NUM
|
||||
ANIM_STD_SEAT_DOWN,
|
||||
ANIM_STD_SEAT_UP,
|
||||
ANIM_STD_SEAT_IDLE,
|
||||
ANIM_STD_SEAT_RVRS,
|
||||
ANIM_STD_ATM,
|
||||
ANIM_STD_ABSEIL,
|
||||
|
||||
ANIM_STD_NUM,
|
||||
|
||||
ANIM_STD_VAN_OPEN_DOOR_REAR_LHS,
|
||||
ANIM_STD_VAN_GET_IN_REAR_LHS,
|
||||
ANIM_STD_VAN_CLOSE_DOOR_REAR_LHS,
|
||||
ANIM_STD_VAN_GET_OUT_REAR_LHS,
|
||||
ANIM_STD_VAN_OPEN_DOOR_REAR_RHS,
|
||||
ANIM_STD_VAN_GET_IN_REAR_RHS,
|
||||
ANIM_STD_VAN_CLOSE_DOOR_REAR_RHS,
|
||||
ANIM_STD_VAN_GET_OUT_REAR_RHS,
|
||||
|
||||
ANIM_STD_COACH_OPEN_LHS,
|
||||
ANIM_STD_COACH_OPEN_RHS,
|
||||
ANIM_STD_COACH_GET_IN_LHS,
|
||||
ANIM_STD_COACH_GET_IN_RHS,
|
||||
ANIM_STD_COACH_GET_OUT_LHS,
|
||||
|
||||
ANIM_BIKE_RIDE,
|
||||
ANIM_BIKE_READY,
|
||||
ANIM_BIKE_LEFT,
|
||||
ANIM_BIKE_RIGHT,
|
||||
ANIM_BIKE_LEANB,
|
||||
ANIM_BIKE_LEANF,
|
||||
ANIM_BIKE_WALKBACK,
|
||||
ANIM_BIKE_JUMPON_LHS,
|
||||
ANIM_BIKE_JUMPON_RHS,
|
||||
ANIM_BIKE_KICK,
|
||||
ANIM_BIKE_HIT,
|
||||
ANIM_BIKE_GETOFF_LHS,
|
||||
ANIM_BIKE_GETOFF_RHS,
|
||||
ANIM_BIKE_GETOFF_BACK,
|
||||
ANIM_BIKE_DRIVEBY_LHS,
|
||||
ANIM_BIKE_DRIVEBY_RHS,
|
||||
ANIM_BIKE_DRIVEBY_FORWARD,
|
||||
ANIM_BIKE_RIDE_P,
|
||||
|
||||
ANIM_ATTACK_1,
|
||||
ANIM_ATTACK_2,
|
||||
ANIM_ATTACK_EXTRA1,
|
||||
ANIM_ATTACK_EXTRA2,
|
||||
ANIM_ATTACK_3,
|
||||
|
||||
// our synonyms... because originals are hard to understand
|
||||
ANIM_WEAPON_FIRE = ANIM_ATTACK_1,
|
||||
ANIM_WEAPON_CROUCHFIRE,
|
||||
ANIM_WEAPON_FIRE_2ND = ANIM_WEAPON_CROUCHFIRE,
|
||||
ANIM_WEAPON_RELOAD,
|
||||
ANIM_WEAPON_CROUCHRELOAD,
|
||||
ANIM_WEAPON_FIRE_3RD,
|
||||
ANIM_THROWABLE_THROW = ANIM_ATTACK_1,
|
||||
ANIM_THROWABLE_THROWU,
|
||||
ANIM_THROWABLE_START_THROW,
|
||||
ANIM_MELEE_ATTACK = ANIM_ATTACK_1,
|
||||
ANIM_MELEE_ATTACK_2ND,
|
||||
ANIM_MELEE_ATTACK_START,
|
||||
ANIM_MELEE_IDLE_FIGHTMODE,
|
||||
ANIM_MELEE_ATTACK_FINISH,
|
||||
|
||||
ANIM_SUNBATHE_IDLE,
|
||||
ANIM_SUNBATHE_DOWN,
|
||||
ANIM_SUNBATHE_UP,
|
||||
ANIM_SUNBATHE_ESCAPE,
|
||||
|
||||
ANIM_MEDIC_CPR,
|
||||
|
||||
ANIM_PLAYER_IDLE1,
|
||||
ANIM_PLAYER_IDLE2,
|
||||
ANIM_PLAYER_IDLE3,
|
||||
ANIM_PLAYER_IDLE4,
|
||||
|
||||
ANIM_RIOT_ANGRY,
|
||||
ANIM_RIOT_ANGRY_B,
|
||||
ANIM_RIOT_CHANT,
|
||||
ANIM_RIOT_PUNCHES,
|
||||
ANIM_RIOT_SHOUT,
|
||||
ANIM_RIOT_CHALLENGE,
|
||||
ANIM_RIOT_FUCKYOU,
|
||||
|
||||
ANIM_STRIP_A,
|
||||
ANIM_STRIP_B,
|
||||
ANIM_STRIP_C,
|
||||
ANIM_STRIP_D,
|
||||
ANIM_STRIP_E,
|
||||
ANIM_STRIP_F,
|
||||
ANIM_STRIP_G,
|
||||
};
|
|
@ -2,26 +2,29 @@
|
|||
#include "PedModelInfo.h"
|
||||
#include "Bones.h"
|
||||
|
||||
#ifdef PED_SKIN
|
||||
|
||||
int
|
||||
ConvertPedNode2BoneTag(int node)
|
||||
{
|
||||
switch(node){
|
||||
case PED_TORSO: return BONE_waist;
|
||||
case PED_MID: return BONE_torso; // this is what Xbox/Mobile use
|
||||
// return BONE_mid; // this is what PS2/PC use
|
||||
case PED_MID: return BONE_spine1;
|
||||
case PED_HEAD: return BONE_head;
|
||||
case PED_UPPERARML: return BONE_upperarml;
|
||||
case PED_UPPERARMR: return BONE_upperarmr;
|
||||
case PED_HANDL: return BONE_Lhand;
|
||||
case PED_HANDR: return BONE_Rhand;
|
||||
case PED_UPPERLEGL: return BONE_upperlegl;
|
||||
case PED_UPPERLEGR: return BONE_upperlegr;
|
||||
case PED_FOOTL: return BONE_footl;
|
||||
case PED_FOOTR: return BONE_footr;
|
||||
case PED_LOWERLEGR: return BONE_lowerlegl;
|
||||
case PED_UPPERARML: return BONE_l_upperarm;
|
||||
case PED_UPPERARMR: return BONE_r_upperarm;
|
||||
case PED_HANDL: return BONE_l_hand;
|
||||
case PED_HANDR: return BONE_r_hand;
|
||||
case PED_UPPERLEGL: return BONE_l_thigh;
|
||||
case PED_UPPERLEGR: return BONE_r_thigh;
|
||||
case PED_FOOTL: return BONE_l_foot;
|
||||
case PED_FOOTR: return BONE_r_foot;
|
||||
case PED_LOWERLEGR: return BONE_r_calf;
|
||||
case PED_LOWERLEGL: return BONE_l_calf;
|
||||
case PED_FOREARML: return BONE_l_forearm;
|
||||
case PED_FOREARMR: return BONE_r_forearm;
|
||||
case PED_CLAVICLEL: return BONE_l_clavicle;
|
||||
case PED_CLAVICLER: return BONE_r_clavicle;
|
||||
case PED_NECK: return BONE_neck;
|
||||
}
|
||||
assert(0 && "this node has no bone");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -29,24 +32,28 @@ const char*
|
|||
ConvertBoneTag2BoneName(int tag)
|
||||
{
|
||||
switch(tag){
|
||||
case BONE_waist: return "Swaist";
|
||||
case BONE_upperlegr: return "Supperlegr";
|
||||
case BONE_lowerlegr: return "Slowerlegr";
|
||||
case BONE_footr: return "Sfootr";
|
||||
case BONE_upperlegl: return "Supperlegl";
|
||||
case BONE_lowerlegl: return "Slowerlegl";
|
||||
case BONE_footl: return "Sfootl";
|
||||
case BONE_mid: return "Smid";
|
||||
case BONE_torso: return "Storso";
|
||||
case BONE_head: return "Shead";
|
||||
case BONE_upperarmr: return "Supperarmr";
|
||||
case BONE_lowerarmr: return "Slowerarmr";
|
||||
case BONE_Rhand: return "SRhand";
|
||||
case BONE_upperarml: return "Supperarml";
|
||||
case BONE_lowerarml: return "Slowerarml";
|
||||
case BONE_Lhand: return "SLhand";
|
||||
case BONE_root: return "Root";
|
||||
case BONE_pelvis: return "Pelvis";
|
||||
case BONE_spine: return "Spine";
|
||||
case BONE_spine1: return "Spine1";
|
||||
case BONE_neck: return "Neck";
|
||||
case BONE_head: return "Head";
|
||||
case BONE_r_clavicle: return "Bip01 R Clavicle";
|
||||
case BONE_r_upperarm: return "R UpperArm";
|
||||
case BONE_r_forearm: return "R Forearm";
|
||||
case BONE_r_hand: return "R Hand";
|
||||
case BONE_r_finger: return "R Fingers";
|
||||
case BONE_l_clavicle: return "Bip01 L Clavicle";
|
||||
case BONE_l_upperarm: return "L UpperArm";
|
||||
case BONE_l_forearm: return "L Forearm";
|
||||
case BONE_l_hand: return "L Hand";
|
||||
case BONE_l_finger: return "L Fingers";
|
||||
case BONE_l_thigh: return "L Thigh";
|
||||
case BONE_l_calf: return "L Calf";
|
||||
case BONE_l_foot: return "L Foot";
|
||||
case BONE_r_thigh: return "R Thigh";
|
||||
case BONE_r_calf: return "R Calf";
|
||||
case BONE_r_foot: return "R Foot";
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,22 +2,28 @@
|
|||
|
||||
enum BoneTag
|
||||
{
|
||||
BONE_waist,
|
||||
BONE_upperlegr,
|
||||
BONE_lowerlegr,
|
||||
BONE_footr,
|
||||
BONE_upperlegl,
|
||||
BONE_lowerlegl,
|
||||
BONE_footl,
|
||||
BONE_mid,
|
||||
BONE_torso,
|
||||
BONE_head,
|
||||
BONE_upperarmr,
|
||||
BONE_lowerarmr,
|
||||
BONE_Rhand,
|
||||
BONE_upperarml,
|
||||
BONE_lowerarml,
|
||||
BONE_Lhand,
|
||||
BONE_root = 0,
|
||||
BONE_pelvis = 1,
|
||||
BONE_spine = 2,
|
||||
BONE_spine1 = 3,
|
||||
BONE_neck = 4,
|
||||
BONE_head = 5,
|
||||
BONE_l_clavicle = 31,
|
||||
BONE_l_upperarm = 32,
|
||||
BONE_l_forearm = 33,
|
||||
BONE_l_hand = 34,
|
||||
BONE_l_finger = 35,
|
||||
BONE_r_clavicle = 21,
|
||||
BONE_r_upperarm = 22,
|
||||
BONE_r_forearm = 23,
|
||||
BONE_r_hand = 24,
|
||||
BONE_r_finger = 25,
|
||||
BONE_l_thigh = 41,
|
||||
BONE_l_calf = 42,
|
||||
BONE_l_foot = 43,
|
||||
BONE_r_thigh = 51,
|
||||
BONE_r_calf = 52,
|
||||
BONE_r_foot = 53,
|
||||
};
|
||||
|
||||
int ConvertPedNode2BoneTag(int node);
|
||||
|
|
|
@ -16,93 +16,91 @@
|
|||
#include "World.h"
|
||||
#include "PlayerPed.h"
|
||||
#include "Wanted.h"
|
||||
#include "CutsceneHead.h"
|
||||
#include "RpAnimBlend.h"
|
||||
#include "ModelIndices.h"
|
||||
#include "TempColModels.h"
|
||||
#include "ColStore.h"
|
||||
#include "Radar.h"
|
||||
#include "Pools.h"
|
||||
|
||||
const struct {
|
||||
const char *szTrackName;
|
||||
int iTrackId;
|
||||
} musicNameIdAssoc[] = {
|
||||
{ "JB", STREAMED_SOUND_NEWS_INTRO },
|
||||
{ "BET", STREAMED_SOUND_BANK_INTRO },
|
||||
{ "L1_LG", STREAMED_SOUND_CUTSCENE_LUIGI1_LG },
|
||||
{ "L2_DSB", STREAMED_SOUND_CUTSCENE_LUIGI2_DSB },
|
||||
{ "L3_DM", STREAMED_SOUND_CUTSCENE_LUIGI3_DM },
|
||||
{ "L4_PAP", STREAMED_SOUND_CUTSCENE_LUIGI4_PAP },
|
||||
{ "L5_TFB", STREAMED_SOUND_CUTSCENE_LUIGI5_TFB },
|
||||
{ "J0_DM2", STREAMED_SOUND_CUTSCENE_JOEY0_DM2 },
|
||||
{ "J1_LFL", STREAMED_SOUND_CUTSCENE_JOEY1_LFL },
|
||||
{ "J2_KCL", STREAMED_SOUND_CUTSCENE_JOEY2_KCL },
|
||||
{ "J3_VH", STREAMED_SOUND_CUTSCENE_JOEY3_VH },
|
||||
{ "J4_ETH", STREAMED_SOUND_CUTSCENE_JOEY4_ETH },
|
||||
{ "J5_DST", STREAMED_SOUND_CUTSCENE_JOEY5_DST },
|
||||
{ "J6_TBJ", STREAMED_SOUND_CUTSCENE_JOEY6_TBJ },
|
||||
{ "T1_TOL", STREAMED_SOUND_CUTSCENE_TONI1_TOL },
|
||||
{ "T2_TPU", STREAMED_SOUND_CUTSCENE_TONI2_TPU },
|
||||
{ "T3_MAS", STREAMED_SOUND_CUTSCENE_TONI3_MAS },
|
||||
{ "T4_TAT", STREAMED_SOUND_CUTSCENE_TONI4_TAT },
|
||||
{ "T5_BF", STREAMED_SOUND_CUTSCENE_TONI5_BF },
|
||||
{ "S0_MAS", STREAMED_SOUND_CUTSCENE_SAL0_MAS },
|
||||
{ "S1_PF", STREAMED_SOUND_CUTSCENE_SAL1_PF },
|
||||
{ "S2_CTG", STREAMED_SOUND_CUTSCENE_SAL2_CTG },
|
||||
{ "S3_RTC", STREAMED_SOUND_CUTSCENE_SAL3_RTC },
|
||||
{ "S5_LRQ", STREAMED_SOUND_CUTSCENE_SAL5_LRQ },
|
||||
{ "S4_BDBA", STREAMED_SOUND_CUTSCENE_SAL4_BDBA },
|
||||
{ "S4_BDBB", STREAMED_SOUND_CUTSCENE_SAL4_BDBB },
|
||||
{ "S2_CTG2", STREAMED_SOUND_CUTSCENE_SAL2_CTG2 },
|
||||
{ "S4_BDBD", STREAMED_SOUND_CUTSCENE_SAL4_BDBD },
|
||||
{ "S5_LRQB", STREAMED_SOUND_CUTSCENE_SAL5_LRQB },
|
||||
{ "S5_LRQC", STREAMED_SOUND_CUTSCENE_SAL5_LRQC },
|
||||
{ "A1_SS0", STREAMED_SOUND_CUTSCENE_ASUKA_1_SSO },
|
||||
{ "A2_PP", STREAMED_SOUND_CUTSCENE_ASUKA_2_PP },
|
||||
{ "A3_SS", STREAMED_SOUND_CUTSCENE_ASUKA_3_SS },
|
||||
{ "A4_PDR", STREAMED_SOUND_CUTSCENE_ASUKA_4_PDR },
|
||||
{ "A5_K2FT", STREAMED_SOUND_CUTSCENE_ASUKA_5_K2FT},
|
||||
{ "K1_KBO", STREAMED_SOUND_CUTSCENE_KENJI1_KBO },
|
||||
{ "K2_GIS", STREAMED_SOUND_CUTSCENE_KENJI2_GIS },
|
||||
{ "K3_DS", STREAMED_SOUND_CUTSCENE_KENJI3_DS },
|
||||
{ "K4_SHI", STREAMED_SOUND_CUTSCENE_KENJI4_SHI },
|
||||
{ "K5_SD", STREAMED_SOUND_CUTSCENE_KENJI5_SD },
|
||||
{ "R0_PDR2", STREAMED_SOUND_CUTSCENE_RAY0_PDR2 },
|
||||
{ "R1_SW", STREAMED_SOUND_CUTSCENE_RAY1_SW },
|
||||
{ "R2_AP", STREAMED_SOUND_CUTSCENE_RAY2_AP },
|
||||
{ "R3_ED", STREAMED_SOUND_CUTSCENE_RAY3_ED },
|
||||
{ "R4_GF", STREAMED_SOUND_CUTSCENE_RAY4_GF },
|
||||
{ "R5_PB", STREAMED_SOUND_CUTSCENE_RAY5_PB },
|
||||
{ "R6_MM", STREAMED_SOUND_CUTSCENE_RAY6_MM },
|
||||
{ "D1_STOG", STREAMED_SOUND_CUTSCENE_DONALD1_STOG },
|
||||
{ "D2_KK", STREAMED_SOUND_CUTSCENE_DONALD2_KK },
|
||||
{ "D3_ADO", STREAMED_SOUND_CUTSCENE_DONALD3_ADO },
|
||||
{ "D5_ES", STREAMED_SOUND_CUTSCENE_DONALD5_ES },
|
||||
{ "D7_MLD", STREAMED_SOUND_CUTSCENE_DONALD7_MLD },
|
||||
{ "D4_GTA", STREAMED_SOUND_CUTSCENE_DONALD4_GTA },
|
||||
{ "D4_GTA2", STREAMED_SOUND_CUTSCENE_DONALD4_GTA2 },
|
||||
{ "D6_STS", STREAMED_SOUND_CUTSCENE_DONALD6_STS },
|
||||
{ "A6_BAIT", STREAMED_SOUND_CUTSCENE_ASUKA6_BAIT },
|
||||
{ "A7_ETG", STREAMED_SOUND_CUTSCENE_ASUKA7_ETG },
|
||||
{ "A8_PS", STREAMED_SOUND_CUTSCENE_ASUKA8_PS },
|
||||
{ "A9_ASD", STREAMED_SOUND_CUTSCENE_ASUKA9_ASD },
|
||||
{ "K4_SHI2", STREAMED_SOUND_CUTSCENE_KENJI4_SHI2 },
|
||||
{ "C1_TEX", STREAMED_SOUND_CUTSCENE_CATALINA1_TEX },
|
||||
{ "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 },
|
||||
{ "EL_PH3", STREAMED_SOUND_CUTSCENE_ELBURRO3_PH3 },
|
||||
{ "EL_PH4", STREAMED_SOUND_CUTSCENE_ELBURRO4_PH4 },
|
||||
{ "YD_PH1", STREAMED_SOUND_CUTSCENE_YARDIE_PH1 },
|
||||
{ "YD_PH2", STREAMED_SOUND_CUTSCENE_YARDIE_PH2 },
|
||||
{ "YD_PH3", STREAMED_SOUND_CUTSCENE_YARDIE_PH3 },
|
||||
{ "YD_PH4", STREAMED_SOUND_CUTSCENE_YARDIE_PH4 },
|
||||
{ "HD_PH1", STREAMED_SOUND_CUTSCENE_HOODS_PH1 },
|
||||
{ "HD_PH2", STREAMED_SOUND_CUTSCENE_HOODS_PH2 },
|
||||
{ "HD_PH3", STREAMED_SOUND_CUTSCENE_HOODS_PH3 },
|
||||
{ "HD_PH4", STREAMED_SOUND_CUTSCENE_HOODS_PH4 },
|
||||
{ "HD_PH5", STREAMED_SOUND_CUTSCENE_HOODS_PH5 },
|
||||
{ "MT_PH1", STREAMED_SOUND_CUTSCENE_MARTY_PH1 },
|
||||
{ "MT_PH2", STREAMED_SOUND_CUTSCENE_MARTY_PH2 },
|
||||
{ "MT_PH3", STREAMED_SOUND_CUTSCENE_MARTY_PH3 },
|
||||
{ "MT_PH4", STREAMED_SOUND_CUTSCENE_MARTY_PH4 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
|
@ -128,7 +126,18 @@ char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE];
|
|||
CAnimBlendAssocGroup CCutsceneMgr::ms_cutsceneAssociations;
|
||||
CVector CCutsceneMgr::ms_cutsceneOffset;
|
||||
float CCutsceneMgr::ms_cutsceneTimer;
|
||||
bool CCutsceneMgr::ms_wasCutsceneSkipped;
|
||||
uint32 CCutsceneMgr::ms_cutsceneLoadStatus;
|
||||
bool CCutsceneMgr::ms_useCutsceneShadows = true;
|
||||
|
||||
bool bCamLoaded;
|
||||
bool bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver; // pls don't shrink the name :P
|
||||
int32 NumberOfSavedWeapons;
|
||||
eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS];
|
||||
int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS];
|
||||
char uncompressedAnims[8][32];
|
||||
uint32 numUncompressedAnims;
|
||||
|
||||
|
||||
RpAtomic *
|
||||
CalculateBoundingSphereRadiusCB(RpAtomic *atomic, void *data)
|
||||
|
@ -150,13 +159,17 @@ CCutsceneMgr::Initialise(void)
|
|||
{
|
||||
ms_numCutsceneObjs = 0;
|
||||
ms_loaded = false;
|
||||
ms_wasCutsceneSkipped = false;
|
||||
ms_running = false;
|
||||
ms_useLodMultiplier = false;
|
||||
ms_animLoaded = false;
|
||||
ms_cutsceneProcessing = false;
|
||||
ms_useLodMultiplier = false;
|
||||
|
||||
ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE);
|
||||
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
|
||||
|
||||
numUncompressedAnims = 0;
|
||||
uncompressedAnims[0][0] = '\0';
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -174,9 +187,10 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
|
|||
CPlayerPed *pPlayerPed;
|
||||
|
||||
ms_cutsceneProcessing = true;
|
||||
if (!strcasecmp(szCutsceneName, "jb"))
|
||||
ms_useLodMultiplier = true;
|
||||
CTimer::Stop();
|
||||
ms_wasCutsceneSkipped = false;
|
||||
CTimer::Suspend();
|
||||
if (!bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver)
|
||||
CStreaming::RemoveCurrentZonesModels();
|
||||
|
||||
ms_pCutsceneDir->numEntries = 0;
|
||||
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
|
||||
|
@ -185,32 +199,42 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
|
|||
CGame::DrasticTidyUpMemory(true);
|
||||
|
||||
strcpy(ms_cutsceneName, szCutsceneName);
|
||||
file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb");
|
||||
|
||||
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();
|
||||
CFileMgr::Seek(file, offset << 11, SEEK_SET);
|
||||
CAnimManager::LoadAnimFile(file, false);
|
||||
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, "end")) {
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "finale")) {
|
||||
DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE);
|
||||
int trackId = FindCutsceneAudioTrackId(szCutsceneName);
|
||||
if (trackId != -1) {
|
||||
|
@ -225,30 +249,23 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
|
|||
ms_cutsceneOffset = CVector(0.0f, 0.0f, 0.0f);
|
||||
|
||||
pPlayerPed = FindPlayerPed();
|
||||
CTimer::Update();
|
||||
|
||||
pPlayerPed->m_pWanted->ClearQdCrimes();
|
||||
pPlayerPed->bIsVisible = false;
|
||||
pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina;
|
||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE);
|
||||
CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(true);
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::SetHeadAnim(const char *animName, CObject *pObject)
|
||||
{
|
||||
CCutsceneHead *pCutsceneHead = (CCutsceneHead*)pObject;
|
||||
char szAnim[CUTSCENENAMESIZE * 2];
|
||||
|
||||
sprintf(szAnim, "%s_%s", ms_cutsceneName, animName);
|
||||
pCutsceneHead->PlayAnimation(szAnim);
|
||||
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);
|
||||
|
@ -257,9 +274,11 @@ CCutsceneMgr::FinishCutscene()
|
|||
void
|
||||
CCutsceneMgr::SetupCutsceneToStart(void)
|
||||
{
|
||||
if (bCamLoaded) {
|
||||
TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset);
|
||||
TheCamera.TakeControlWithSpline(JUMP_CUT);
|
||||
TheCamera.SetWideScreenOn();
|
||||
}
|
||||
|
||||
ms_cutsceneOffset.z++;
|
||||
|
||||
|
@ -267,12 +286,27 @@ CCutsceneMgr::SetupCutsceneToStart(void)
|
|||
assert(RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP);
|
||||
if (CAnimBlendAssociation *pAnimBlendAssoc = RpAnimBlendClumpGetFirstAssociation((RpClump*)ms_pCutsceneObjects[i]->m_rwObject)) {
|
||||
assert(pAnimBlendAssoc->hierarchy->sequences[0].HasTranslation());
|
||||
ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0))->translation);
|
||||
CWorld::Add(ms_pCutsceneObjects[i]);
|
||||
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();
|
||||
|
@ -288,25 +322,55 @@ CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject)
|
|||
CAnimBlendClumpData *pAnimBlendClumpData;
|
||||
|
||||
assert(RwObjectGetType(pObject->m_rwObject) == rpCLUMP);
|
||||
debug("Give cutscene anim %s\n", animName);
|
||||
RpAnimBlendClumpRemoveAllAssociations((RpClump*)pObject->m_rwObject);
|
||||
|
||||
pNewAnim = ms_cutsceneAssociations.GetAnimation(animName);
|
||||
if (!pNewAnim) {
|
||||
debug("\n\nHaven't I told you I can't find the fucking animation %s\n\n\n", animName);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pNewAnim->hierarchy->IsCompressed())
|
||||
pNewAnim->hierarchy->keepCompressed = true;
|
||||
|
||||
CStreaming::ImGonnaUseStreamingMemory();
|
||||
pNewAnim = ms_cutsceneAssociations.CopyAnimation(animName);
|
||||
CStreaming::IHaveUsedStreamingMemory();
|
||||
|
||||
pNewAnim->SetCurrentTime(0.0f);
|
||||
pNewAnim->flags |= ASSOC_HAS_TRANSLATION;
|
||||
pNewAnim->flags &= ~ASSOC_RUNNING;
|
||||
|
||||
pAnimBlendClumpData = *RPANIMBLENDCLUMPDATA(pObject->m_rwObject);
|
||||
pAnimBlendClumpData->link.Prepend(&pNewAnim->link);
|
||||
|
||||
if (pNewAnim->hierarchy->keepCompressed)
|
||||
pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::COMPRESSED;
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneMgr::SetCutsceneAnimToLoop(const char* animName)
|
||||
{
|
||||
ms_cutsceneAssociations.GetAnimation(animName)->flags |= ASSOC_REPEAT;
|
||||
}
|
||||
|
||||
CCutsceneHead *
|
||||
CCutsceneMgr::AddCutsceneHead(CObject *pObject, int modelId)
|
||||
{
|
||||
CCutsceneHead *pHead = new CCutsceneHead(pObject);
|
||||
pHead->SetModelIndex(modelId);
|
||||
CWorld::Add(pHead);
|
||||
ms_pCutsceneObjects[ms_numCutsceneObjs++] = pHead;
|
||||
return pHead;
|
||||
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 *
|
||||
|
@ -314,20 +378,25 @@ CCutsceneMgr::CreateCutsceneObject(int modelId)
|
|||
{
|
||||
CBaseModelInfo *pModelInfo;
|
||||
CColModel *pColModel;
|
||||
float radius;
|
||||
RpClump *clump;
|
||||
CCutsceneObject *pCutsceneObject;
|
||||
|
||||
CStreaming::ImGonnaUseStreamingMemory();
|
||||
debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetModelName());
|
||||
if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) {
|
||||
pModelInfo = CModelInfo::GetModelInfo(modelId);
|
||||
pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01];
|
||||
radius = 0.0f;
|
||||
|
||||
pModelInfo->SetColModel(pColModel);
|
||||
clump = (RpClump*)pModelInfo->GetRwObject();
|
||||
assert(RwObjectGetType((RwObject*)clump) == rpCLUMP);
|
||||
RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius);
|
||||
|
||||
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);
|
||||
|
@ -335,7 +404,10 @@ CCutsceneMgr::CreateCutsceneObject(int modelId)
|
|||
|
||||
pCutsceneObject = new CCutsceneObject();
|
||||
pCutsceneObject->SetModelIndex(modelId);
|
||||
if (ms_useCutsceneShadows)
|
||||
pCutsceneObject->CreateShadow();
|
||||
ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject;
|
||||
CStreaming::IHaveUsedStreamingMemory();
|
||||
return pCutsceneObject;
|
||||
}
|
||||
|
||||
|
@ -343,9 +415,11 @@ 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]);
|
||||
|
@ -355,12 +429,27 @@ CCutsceneMgr::DeleteCutsceneData(void)
|
|||
}
|
||||
ms_numCutsceneObjs = 0;
|
||||
|
||||
for (int i = MI_SPECIAL01; i < MI_SPECIAL21; i++) {
|
||||
CBaseModelInfo *minfo = CModelInfo::GetModelInfo(i);
|
||||
CColModel *colModel = minfo->GetColModel();
|
||||
if (colModel != &CTempColModels::ms_colModelPed1) {
|
||||
delete colModel;
|
||||
minfo->SetColModel(&CTempColModels::ms_colModelPed1);
|
||||
}
|
||||
}
|
||||
|
||||
if (ms_animLoaded)
|
||||
CAnimManager::RemoveLastAnimFile();
|
||||
|
||||
ms_animLoaded = false;
|
||||
numUncompressedAnims = 0;
|
||||
uncompressedAnims[0][0] = '\0';
|
||||
|
||||
if (bCamLoaded) {
|
||||
TheCamera.RestoreWithJumpCut();
|
||||
TheCamera.SetWideScreenOff();
|
||||
TheCamera.DeleteCutSceneCamDataMemory();
|
||||
}
|
||||
ms_running = false;
|
||||
ms_loaded = false;
|
||||
|
||||
|
@ -368,14 +457,42 @@ CCutsceneMgr::DeleteCutsceneData(void)
|
|||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CUTSCENE);
|
||||
CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false);
|
||||
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "end")) {
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "finale")) {
|
||||
DMAudio.StopCutSceneMusic();
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "bet"))
|
||||
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
|
||||
}
|
||||
CTimer::Stop();
|
||||
|
||||
CStreaming::ms_disableStreaming = false;
|
||||
CWorld::bProcessCutsceneOnly = false;
|
||||
|
||||
if(bCamLoaded)
|
||||
CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2);
|
||||
CTimer::Update();
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -392,7 +509,7 @@ CCutsceneMgr::Update(void)
|
|||
switch (ms_cutsceneLoadStatus) {
|
||||
case CUTSCENE_LOADING_AUDIO:
|
||||
SetupCutsceneToStart();
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "end"))
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "finale"))
|
||||
DMAudio.PlayPreloadedCutSceneMusic();
|
||||
ms_cutsceneLoadStatus++;
|
||||
break;
|
||||
|
@ -410,7 +527,18 @@ CCutsceneMgr::Update(void)
|
|||
if (!ms_running) return;
|
||||
|
||||
ms_cutsceneTimer += CTimer::GetTimeStepNonClippedInSeconds();
|
||||
if (CGeneral::faststricmp(ms_cutsceneName, "end") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADING_0) {
|
||||
|
||||
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()
|
||||
|
@ -420,5 +548,136 @@ CCutsceneMgr::Update(void)
|
|||
}
|
||||
}
|
||||
|
||||
bool CCutsceneMgr::HasCutsceneFinished(void) { return TheCamera.GetPositionAlongSpline() == 1.0f; }
|
||||
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;
|
||||
CColStore::RemoveAllCollision();
|
||||
CWorld::bProcessCutsceneOnly = true;
|
||||
ms_cutsceneProcessing = true;
|
||||
|
||||
for (int i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) {
|
||||
CPed *pPed = CPools::GetPedPool()->GetSlot(i);
|
||||
if (pPed) {
|
||||
if (!pPed->IsPlayer() && pPed->CanBeDeleted()) {
|
||||
CWorld::Remove(pPed);
|
||||
delete pPed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = CPools::GetVehiclePool()->GetSize() - 1; i >= 0; i--) {
|
||||
CVehicle *pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
||||
if (pVehicle) {
|
||||
if (pVehicle->CanBeDeleted()) {
|
||||
CWorld::Remove(pVehicle);
|
||||
delete pVehicle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true;
|
||||
CStreaming::RemoveCurrentZonesModels();
|
||||
CStreaming::SetModelIsDeletable(MI_MALE01);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_MALE01);
|
||||
CStreaming::SetModelIsDeletable(MI_TAXI_D);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_TAXI_D);
|
||||
CStreaming::SetModelIsDeletable(MI_NIGHTSTICK);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_NIGHTSTICK);
|
||||
CStreaming::SetModelIsDeletable(MI_MISSILE);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_MISSILE);
|
||||
CStreaming::SetModelIsDeletable(MI_POLICE);
|
||||
CStreaming::SetModelTxdIsDeletable(MI_POLICE);
|
||||
|
||||
while (CStreaming::RemoveLoadedVehicle()) ;
|
||||
|
||||
CRadar::RemoveRadarSections();
|
||||
|
||||
for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) {
|
||||
CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i);
|
||||
if (pDummy)
|
||||
pDummy->DeleteRwObject();
|
||||
}
|
||||
|
||||
for (int i = CPools::GetObjectPool()->GetSize() - 1; i >= 0; i--) {
|
||||
CObject* pObject = CPools::GetObjectPool()->GetSlot(i);
|
||||
if (pObject)
|
||||
pObject->DeleteRwObject();
|
||||
}
|
||||
|
||||
for (int i = CPools::GetBuildingPool()->GetSize() - 1; i >= 0; i--) {
|
||||
CBuilding* pBuilding = CPools::GetBuildingPool()->GetSlot(i);
|
||||
if (pBuilding && pBuilding->m_rwObject != nil && pBuilding->bIsBIGBuilding && pBuilding->bStreamBIGBuilding) {
|
||||
if (pBuilding->bIsBIGBuilding)
|
||||
CStreaming::RequestModel(pBuilding->GetModelIndex(), 0);
|
||||
if (!pBuilding->bImBeingRendered)
|
||||
pBuilding->DeleteRwObject();
|
||||
}
|
||||
}
|
||||
|
||||
CPlayerPed *pPlayerPed = FindPlayerPed();
|
||||
pPlayerPed->RemoveWeaponAnims(0, -1000.0f);
|
||||
NumberOfSavedWeapons = 0;
|
||||
|
||||
for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) {
|
||||
if (pPlayerPed->m_weapons[i].m_eWeaponType != WEAPONTYPE_UNARMED) {
|
||||
SavedWeaponIDs[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_eWeaponType;
|
||||
SavedWeaponAmmo[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_nAmmoTotal;
|
||||
NumberOfSavedWeapons++;
|
||||
}
|
||||
}
|
||||
|
||||
pPlayerPed->ClearWeapons();
|
||||
CGame::DrasticTidyUpMemory(true);
|
||||
}
|
|
@ -21,7 +21,9 @@ class CCutsceneMgr
|
|||
static CAnimBlendAssocGroup ms_cutsceneAssociations;
|
||||
static CVector ms_cutsceneOffset;
|
||||
static float ms_cutsceneTimer;
|
||||
static bool ms_wasCutsceneSkipped;
|
||||
static bool ms_cutsceneProcessing;
|
||||
static bool ms_useCutsceneShadows;
|
||||
public:
|
||||
static CDirectory *ms_pCutsceneDir;
|
||||
static uint32 ms_cutsceneLoadStatus;
|
||||
|
@ -30,6 +32,7 @@ public:
|
|||
static bool IsRunning(void) { return ms_running; }
|
||||
static bool HasLoaded(void) { return ms_loaded; }
|
||||
static bool IsCutsceneProcessing(void) { return ms_cutsceneProcessing; }
|
||||
static bool WasCutsceneSkipped(void) { return ms_wasCutsceneSkipped; }
|
||||
static bool UseLodMultiplier(void) { return ms_useLodMultiplier; }
|
||||
static CCutsceneObject* GetCutsceneObject(int id) { return ms_pCutsceneObjects[id]; }
|
||||
static int GetCutsceneTimeInMilleseconds(void) { return 1000.0f * ms_cutsceneTimer; }
|
||||
|
@ -41,11 +44,18 @@ public:
|
|||
static void Shutdown(void);
|
||||
static void LoadCutsceneData(const char *szCutsceneName);
|
||||
static void FinishCutscene(void);
|
||||
static void SetHeadAnim(const char *animName, CObject *pObject);
|
||||
static void SetupCutsceneToStart(void);
|
||||
static void SetCutsceneAnim(const char *animName, CObject *pObject);
|
||||
static void SetCutsceneAnimToLoop(const char *animName);
|
||||
static CCutsceneHead *AddCutsceneHead(CObject *pObject, int modelId);
|
||||
static CCutsceneObject *CreateCutsceneObject(int modelId);
|
||||
static void DeleteCutsceneData(void);
|
||||
static void LoadAnimationUncompressed(char const*);
|
||||
static void Update(void);
|
||||
|
||||
static void AttachObjectToParent(CObject *pObject, CEntity *pAttachTo);
|
||||
static void AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame);
|
||||
static void AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int frame);
|
||||
static void RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver();
|
||||
static void DisableCutsceneShadows() { ms_useCutsceneShadows = false; }
|
||||
};
|
||||
|
|
|
@ -17,6 +17,8 @@ void FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg);
|
|||
void FrameUpdateCallBackWithVelocityExtractionSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackWith3dVelocityExtractionSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
|
||||
void FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
|
||||
void
|
||||
FrameUpdateCallBackNonSkinned(AnimBlendFrameData *frame, void *arg)
|
||||
|
@ -228,12 +230,11 @@ FrameUpdateCallBackWith3dVelocityExtractionNonSkinned(AnimBlendFrameData *frame,
|
|||
RwMatrixUpdate(mat);
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
|
||||
void
|
||||
FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
CVector vec, pos(0.0f, 0.0f, 0.0f);
|
||||
float transBlendAmount = 0.0f;
|
||||
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
float totalBlendAmount = 0.0f;
|
||||
RpHAnimStdInterpFrame *xform = frame->hanimFrame;
|
||||
|
@ -257,13 +258,13 @@ FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg)
|
|||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
(*node)->Update(vec, q, 1.0f-totalBlendAmount);
|
||||
if((*node)->sequence->HasTranslation())
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
#ifdef FIX_BUGS
|
||||
transBlendAmount += (*node)->association->blendAmount;
|
||||
}
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
}
|
||||
++*node;
|
||||
|
@ -278,12 +279,12 @@ FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg)
|
|||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
xform->t.x = pos.x;
|
||||
xform->t.y = pos.y;
|
||||
xform->t.z = pos.z;
|
||||
xform->t.x += frame->resetPos.x;
|
||||
xform->t.y += frame->resetPos.y;
|
||||
xform->t.z += frame->resetPos.z;
|
||||
xform->t.x = transBlendAmount*pos.x;
|
||||
xform->t.y = transBlendAmount*pos.y;
|
||||
xform->t.z = transBlendAmount*pos.z;
|
||||
xform->t.x += (1.0f-transBlendAmount)*frame->resetPos.x;
|
||||
xform->t.y += (1.0f-transBlendAmount)*frame->resetPos.y;
|
||||
xform->t.z += (1.0f-transBlendAmount)*frame->resetPos.z;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -319,11 +320,9 @@ FrameUpdateCallBackWithVelocityExtractionSkinned(AnimBlendFrameData *frame, void
|
|||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
bool nodelooped = (*node)->Update(vec, q, 1.0f-totalBlendAmount);
|
||||
#ifdef FIX_BUGS
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
|
@ -442,4 +441,228 @@ FrameUpdateCallBackWith3dVelocityExtractionSkinned(AnimBlendFrameData *frame, vo
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
FrameUpdateCallBackOffscreen(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION && gpAnimBlendClump->velocity2d)
|
||||
FrameUpdateCallBackWithVelocityExtractionSkinned(frame, arg);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
CVector vec, pos(0.0f, 0.0f, 0.0f);
|
||||
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
float totalBlendAmount = 0.0f;
|
||||
CVector trans(0.0f, 0.0f, 0.0f);
|
||||
CVector cur(0.0f, 0.0f, 0.0f);
|
||||
CVector end(0.0f, 0.0f, 0.0f);
|
||||
bool looped = false;
|
||||
RwMatrix *mat = RwFrameGetMatrix(frame->frame);
|
||||
CAnimBlendNode **node;
|
||||
AnimBlendFrameUpdateData *updateData = (AnimBlendFrameUpdateData*)arg;
|
||||
|
||||
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION &&
|
||||
gpAnimBlendClump->velocity2d){
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->sequence->HasTranslation()){
|
||||
if((*node)->association->HasTranslation()){
|
||||
(*node)->GetCurrentTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
cur += vec;
|
||||
}
|
||||
}
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
bool nodelooped = (*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
#ifdef FIX_BUGS
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
if((*node)->association->HasTranslation()){
|
||||
trans += vec;
|
||||
looped |= nodelooped;
|
||||
if(nodelooped){
|
||||
(*node)->GetEndTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
end += vec;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
RwMatrixSetIdentity(mat);
|
||||
rot.Normalise();
|
||||
rot.Get(mat);
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
*gpAnimBlendClump->velocity3d = trans - cur;
|
||||
if(looped)
|
||||
*gpAnimBlendClump->velocity3d += end;
|
||||
mat->pos.x = (pos - trans).x + frame->resetPos.x;
|
||||
mat->pos.y = (pos - trans).y + frame->resetPos.y;
|
||||
mat->pos.z = (pos - trans).z + frame->resetPos.z;
|
||||
}
|
||||
RwMatrixUpdate(mat);
|
||||
}else{
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
(*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
if((*node)->sequence->HasTranslation())
|
||||
pos += vec;
|
||||
#ifdef FIX_BUGS
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
RwMatrixSetIdentity(mat);
|
||||
rot.Normalise();
|
||||
rot.Get(mat);
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
mat->pos.x = pos.x;
|
||||
mat->pos.y = pos.y;
|
||||
mat->pos.z = pos.z;
|
||||
mat->pos.x += frame->resetPos.x;
|
||||
mat->pos.y += frame->resetPos.y;
|
||||
mat->pos.z += frame->resetPos.z;
|
||||
}
|
||||
RwMatrixUpdate(mat);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
CVector vec, pos(0.0f, 0.0f, 0.0f);
|
||||
CQuaternion q, rot(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
float totalBlendAmount = 0.0f;
|
||||
CVector trans(0.0f, 0.0f, 0.0f);
|
||||
CVector cur(0.0f, 0.0f, 0.0f);
|
||||
CVector end(0.0f, 0.0f, 0.0f);
|
||||
bool looped = false;
|
||||
RpHAnimStdInterpFrame *xform = frame->hanimFrame;
|
||||
CAnimBlendNode **node;
|
||||
AnimBlendFrameUpdateData *updateData = (AnimBlendFrameUpdateData*)arg;
|
||||
|
||||
if(frame->flag & AnimBlendFrameData::VELOCITY_EXTRACTION &&
|
||||
gpAnimBlendClump->velocity2d){
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->sequence->HasTranslation()){
|
||||
if((*node)->association->HasTranslation()){
|
||||
(*node)->GetCurrentTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
cur += vec;
|
||||
}
|
||||
}
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
bool nodelooped = (*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
#ifdef FIX_BUGS
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
#endif
|
||||
rot += q;
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
if((*node)->association->HasTranslation()){
|
||||
trans += vec;
|
||||
looped |= nodelooped;
|
||||
if(nodelooped){
|
||||
(*node)->GetEndTranslationCompressed(vec, 1.0f-totalBlendAmount);
|
||||
end += vec;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
rot.Normalise();
|
||||
xform->q.imag.x = rot.x;
|
||||
xform->q.imag.y = rot.y;
|
||||
xform->q.imag.z = rot.z;
|
||||
xform->q.real = rot.w;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
*gpAnimBlendClump->velocity3d = trans - cur;
|
||||
if(looped)
|
||||
*gpAnimBlendClump->velocity3d += end;
|
||||
xform->t.x = (pos - trans).x + frame->resetPos.x;
|
||||
xform->t.y = (pos - trans).y + frame->resetPos.y;
|
||||
xform->t.z = (pos - trans).z + frame->resetPos.z;
|
||||
}
|
||||
}else{
|
||||
float transBlendAmount = 0.0f;
|
||||
|
||||
if(updateData->foobar)
|
||||
for(node = updateData->nodes; *node; node++)
|
||||
if((*node)->sequence && (*node)->association->IsPartial())
|
||||
totalBlendAmount += (*node)->association->blendAmount;
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
if((*node)->sequence){
|
||||
(*node)->UpdateCompressed(vec, q, 1.0f-totalBlendAmount);
|
||||
if((*node)->sequence->HasTranslation()){
|
||||
pos += vec;
|
||||
transBlendAmount += (*node)->association->blendAmount;
|
||||
}
|
||||
if(DotProduct(rot, q) < 0.0f)
|
||||
rot -= q;
|
||||
else
|
||||
rot += q;
|
||||
}
|
||||
++*node;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_ROTATION) == 0){
|
||||
rot.Normalise();
|
||||
xform->q.imag.x = rot.x;
|
||||
xform->q.imag.y = rot.y;
|
||||
xform->q.imag.z = rot.z;
|
||||
xform->q.real = rot.w;
|
||||
}
|
||||
|
||||
if((frame->flag & AnimBlendFrameData::IGNORE_TRANSLATION) == 0){
|
||||
xform->t.x = transBlendAmount*pos.x;
|
||||
xform->t.y = transBlendAmount*pos.y;
|
||||
xform->t.z = transBlendAmount*pos.z;
|
||||
xform->t.x += (1.0f-transBlendAmount)*frame->resetPos.x;
|
||||
xform->t.y += (1.0f-transBlendAmount)*frame->resetPos.y;
|
||||
xform->t.z += (1.0f-transBlendAmount)*frame->resetPos.z;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,9 +10,7 @@
|
|||
#include "AnimBlendAssociation.h"
|
||||
#include "AnimManager.h"
|
||||
#include "RpAnimBlend.h"
|
||||
#ifdef PED_SKIN
|
||||
#include "PedModelInfo.h"
|
||||
#endif
|
||||
|
||||
RwInt32 ClumpOffset;
|
||||
|
||||
|
@ -142,7 +140,6 @@ FrameInitCBskin(AnimBlendFrameData *frameData, void*)
|
|||
frameData->flag = 0;
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void
|
||||
RpAnimBlendClumpInitSkinned(RpClump *clump)
|
||||
{
|
||||
|
@ -156,7 +153,7 @@ RpAnimBlendClumpInitSkinned(RpClump *clump)
|
|||
|
||||
RpAnimBlendAllocateData(clump);
|
||||
clumpData = *RPANIMBLENDCLUMPDATA(clump);
|
||||
atomic = IsClumpSkinned(clump);
|
||||
atomic = GetFirstAtomic(clump);
|
||||
assert(atomic);
|
||||
skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic));
|
||||
assert(skin);
|
||||
|
@ -171,12 +168,15 @@ RpAnimBlendClumpInitSkinned(RpClump *clump)
|
|||
for(i = 0; i < numBones; i++){
|
||||
frames[i].nodeID = HIERNODEID(hier, i);
|
||||
frames[i].resetPos = boneTab[i];
|
||||
#ifdef LIBRW
|
||||
frames[i].hanimFrame = (RpHAnimStdInterpFrame*)rpHANIMHIERARCHYGETINTERPFRAME(hier, i);
|
||||
#else
|
||||
frames[i].hanimFrame = (RpHAnimStdInterpFrame*)rtANIMGETINTERPFRAME(hier->currentAnim, i);
|
||||
#endif
|
||||
}
|
||||
clumpData->ForAllFrames(FrameInitCBskin, nil);
|
||||
clumpData->frames[0].flag |= AnimBlendFrameData::VELOCITY_EXTRACTION;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
RpAnimBlendClumpInitNotSkinned(RpClump *clump)
|
||||
|
@ -200,11 +200,9 @@ RpAnimBlendClumpInitNotSkinned(RpClump *clump)
|
|||
void
|
||||
RpAnimBlendClumpInit(RpClump *clump)
|
||||
{
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
RpAnimBlendClumpInitSkinned(clump);
|
||||
else
|
||||
#endif
|
||||
RpAnimBlendClumpInitNotSkinned(clump);
|
||||
}
|
||||
|
||||
|
@ -364,7 +362,6 @@ FillFrameArrayCBnonskin(AnimBlendFrameData *frame, void *arg)
|
|||
frames[CVisibilityPlugins::GetFrameHierarchyId(frame->frame)] = frame;
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void
|
||||
RpAnimBlendClumpFillFrameArraySkin(RpClump *clump, AnimBlendFrameData **frames)
|
||||
{
|
||||
|
@ -374,22 +371,18 @@ RpAnimBlendClumpFillFrameArraySkin(RpClump *clump, AnimBlendFrameData **frames)
|
|||
for(i = PED_MID; i < PED_NODE_MAX; i++)
|
||||
frames[i] = &clumpData->frames[RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(i))];
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
RpAnimBlendClumpFillFrameArray(RpClump *clump, AnimBlendFrameData **frames)
|
||||
{
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
RpAnimBlendClumpFillFrameArraySkin(clump, frames);
|
||||
else
|
||||
#endif
|
||||
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FillFrameArrayCBnonskin, frames);
|
||||
}
|
||||
|
||||
AnimBlendFrameData *pFrameDataFound;
|
||||
|
||||
// FrameFindCallBack on PS2
|
||||
void
|
||||
FrameFindByNameCBnonskin(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
|
@ -398,7 +391,6 @@ FrameFindByNameCBnonskin(AnimBlendFrameData *frame, void *arg)
|
|||
pFrameDataFound = frame;
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void
|
||||
FrameFindByNameCBskin(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
|
@ -406,25 +398,58 @@ FrameFindByNameCBskin(AnimBlendFrameData *frame, void *arg)
|
|||
if(name && CGeneral::faststricmp(name, (char*)arg) == 0)
|
||||
pFrameDataFound = frame;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
FrameFindByBoneCB(AnimBlendFrameData *frame, void *arg)
|
||||
{
|
||||
if(frame->nodeID == (int32)(uintptr)arg)
|
||||
pFrameDataFound = frame;
|
||||
}
|
||||
|
||||
AnimBlendFrameData*
|
||||
RpAnimBlendClumpFindFrame(RpClump *clump, const char *name)
|
||||
{
|
||||
pFrameDataFound = nil;
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FrameFindByNameCBskin, (void*)name);
|
||||
else
|
||||
#endif
|
||||
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FrameFindByNameCBnonskin, (void*)name);
|
||||
return pFrameDataFound;
|
||||
}
|
||||
|
||||
AnimBlendFrameData*
|
||||
RpAnimBlendClumpFindBone(RpClump *clump, uint32 boneTag)
|
||||
{
|
||||
pFrameDataFound = nil;
|
||||
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FrameFindByBoneCB, (void*)boneTag);
|
||||
return pFrameDataFound;
|
||||
}
|
||||
|
||||
void
|
||||
RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
|
||||
RpAnimBlendNodeUpdateKeyframes(AnimBlendFrameData *frames, AnimBlendFrameUpdateData *updateData, int32 numNodes)
|
||||
{
|
||||
CAnimBlendNode **node;
|
||||
int i;
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
CAnimBlendAssociation *a = (*node)->association;
|
||||
for(i = 0; i < numNodes; i++)
|
||||
if((frames[i].flag & AnimBlendFrameData::VELOCITY_EXTRACTION) == 0 ||
|
||||
gpAnimBlendClump->velocity2d == nil){
|
||||
if((*node)[i].sequence)
|
||||
(*node)[i].FindKeyFrame(a->currentTime - a->timeStep);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO:
|
||||
// CAnimBlendClumpData::LoadFramesIntoSPR
|
||||
// CAnimBlendClumpData::ForAllFramesInSPR
|
||||
void
|
||||
RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta, bool doRender)
|
||||
{
|
||||
int i;
|
||||
CAnimBlendAssociation *assoc;
|
||||
AnimBlendFrameUpdateData updateData;
|
||||
float totalLength = 0.0f;
|
||||
float totalBlend = 0.0f;
|
||||
|
@ -440,30 +465,53 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
|
|||
updateData.foobar = 0;
|
||||
for(link = clumpData->link.next; link; link = next){
|
||||
next = link->next;
|
||||
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
||||
assoc = CAnimBlendAssociation::FromLink(link);
|
||||
if(assoc->UpdateBlend(timeDelta)){
|
||||
if(assoc->hierarchy->sequences){
|
||||
CAnimManager::UncompressAnimation(assoc->hierarchy);
|
||||
if(i < 11)
|
||||
updateData.nodes[i++] = assoc->GetNode(0);
|
||||
if(assoc->flags & ASSOC_MOVEMENT){
|
||||
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
|
||||
totalBlend += assoc->blendAmount;
|
||||
}else
|
||||
updateData.foobar = 1;
|
||||
}else
|
||||
debug("anim %s is not loaded\n", assoc->hierarchy->name);
|
||||
}
|
||||
}
|
||||
|
||||
for(link = clumpData->link.next; link; link = link->next){
|
||||
assoc = CAnimBlendAssociation::FromLink(link);
|
||||
assoc->UpdateTimeStep(timeDelta, totalLength == 0.0f ? 1.0f : totalBlend/totalLength);
|
||||
}
|
||||
|
||||
updateData.nodes[i] = nil;
|
||||
|
||||
#ifdef PED_SKIN
|
||||
#ifdef ANIM_COMPRESSION
|
||||
if(clumpData->frames[0].flag & AnimBlendFrameData::COMPRESSED){
|
||||
if(IsClumpSkinned(clump))
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackSkinnedCompressed, &updateData);
|
||||
else
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinnedCompressed, &updateData);
|
||||
}else
|
||||
#endif
|
||||
if(doRender){
|
||||
if(clumpData->frames[0].flag & AnimBlendFrameData::UPDATE_KEYFRAMES)
|
||||
RpAnimBlendNodeUpdateKeyframes(clumpData->frames, &updateData, clumpData->numFrames);
|
||||
if(IsClumpSkinned(clump))
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackSkinned, &updateData);
|
||||
else
|
||||
#endif
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinned, &updateData);
|
||||
clumpData->frames[0].flag &= ~AnimBlendFrameData::UPDATE_KEYFRAMES;
|
||||
}else{
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackOffscreen, &updateData);
|
||||
clumpData->frames[0].flag |= AnimBlendFrameData::UPDATE_KEYFRAMES;
|
||||
}
|
||||
|
||||
for(link = clumpData->link.next; link; link = link->next){
|
||||
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
||||
float relSpeed = totalLength == 0.0f ? 1.0f : totalBlend/totalLength;
|
||||
assoc->UpdateTime(timeDelta, relSpeed);
|
||||
assoc = CAnimBlendAssociation::FromLink(link);
|
||||
assoc->UpdateTime(timeDelta, totalLength == 0.0f ? 1.0f : totalBlend/totalLength);
|
||||
}
|
||||
RwFrameUpdateObjects(RpClumpGetFrame(clump));
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ void RpAnimBlendClumpInit(RpClump *clump);
|
|||
bool RpAnimBlendClumpIsInitialized(RpClump *clump);
|
||||
void RpAnimBlendClumpFillFrameArray(RpClump* clump, AnimBlendFrameData** frames);
|
||||
AnimBlendFrameData *RpAnimBlendClumpFindFrame(RpClump *clump, const char *name);
|
||||
AnimBlendFrameData *RpAnimBlendClumpFindBone(RpClump *clump, uint32 boneTag);
|
||||
void FillFrameArrayCallBack(AnimBlendFrameData *frame, void *arg);
|
||||
CAnimBlendAssociation *RpAnimBlendClumpGetAssociation(RpClump *clump, uint32 id);
|
||||
CAnimBlendAssociation *RpAnimBlendClumpGetMainAssociation(RpClump *clump, CAnimBlendAssociation **assocRet, float *blendRet);
|
||||
|
@ -34,9 +35,14 @@ CAnimBlendAssociation *RpAnimBlendClumpGetMainAssociation_N(RpClump *clump, int
|
|||
CAnimBlendAssociation *RpAnimBlendClumpGetMainPartialAssociation_N(RpClump *clump, int n);
|
||||
CAnimBlendAssociation *RpAnimBlendClumpGetFirstAssociation(RpClump *clump, uint32 mask);
|
||||
CAnimBlendAssociation *RpAnimBlendClumpGetFirstAssociation(RpClump *clump);
|
||||
void RpAnimBlendClumpUpdateAnimations(RpClump* clump, float timeDelta);
|
||||
void RpAnimBlendNodeUpdateKeyframes(AnimBlendFrameData *frames, AnimBlendFrameUpdateData *updateData, int32 numNodes);
|
||||
void RpAnimBlendClumpUpdateAnimations(RpClump* clump, float timeDelta, bool doRender = true);
|
||||
|
||||
|
||||
extern CAnimBlendClumpData *gpAnimBlendClump;
|
||||
void FrameUpdateCallBackNonSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackSkinned(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackOffscreen(AnimBlendFrameData *frame, void *arg);
|
||||
|
||||
void FrameUpdateCallBackNonSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
void FrameUpdateCallBackSkinnedCompressed(AnimBlendFrameData *frame, void *arg);
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
#include "SurfaceTable.h"
|
||||
#include "sampman.h"
|
||||
|
||||
const int CollisionSoundIntensity = 60;
|
||||
|
||||
void
|
||||
cAudioManager::ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower,
|
||||
float velocity)
|
||||
|
@ -18,7 +16,7 @@ cAudioManager::ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface
|
|||
CVector v1;
|
||||
CVector v2;
|
||||
|
||||
if(!m_bIsInitialised || m_nCollisionEntity < 0 || m_nUserPause ||
|
||||
if(!m_bIsInitialised || m_nCollisionEntity < 0 || m_bIsPaused ||
|
||||
(velocity < 0.0016f && collisionPower < 0.01f))
|
||||
return;
|
||||
|
||||
|
@ -32,7 +30,7 @@ cAudioManager::ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface
|
|||
}
|
||||
CVector pos = (v1 + v2) * 0.5f;
|
||||
distSquared = GetDistanceSquared(pos);
|
||||
if(distSquared < SQR(CollisionSoundIntensity)) {
|
||||
if(distSquared < SQR(COLLISION_MAX_DIST)) {
|
||||
m_sCollisionManager.m_sQueue.m_pEntity1 = entity1;
|
||||
m_sCollisionManager.m_sQueue.m_pEntity2 = entity2;
|
||||
m_sCollisionManager.m_sQueue.m_bSurface1 = surface1;
|
||||
|
@ -48,8 +46,8 @@ cAudioManager::ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface
|
|||
void
|
||||
cAudioCollisionManager::AddCollisionToRequestedQueue()
|
||||
{
|
||||
int32 collisionsIndex;
|
||||
int32 i;
|
||||
uint32 collisionsIndex;
|
||||
uint32 i;
|
||||
|
||||
|
||||
if (m_bCollisionsInQueue < NUMAUDIOCOLLISIONS)
|
||||
|
@ -139,7 +137,7 @@ cAudioManager::ServiceCollisions()
|
|||
m_sCollisionManager.m_bCollisionsInQueue = 0;
|
||||
}
|
||||
|
||||
static const int32 gOneShotCol[] = {SFX_COL_TARMAC_1,
|
||||
static const uint32 gOneShotCol[] = {SFX_COL_TARMAC_1,
|
||||
SFX_COL_TARMAC_1,
|
||||
SFX_COL_GRASS_1,
|
||||
SFX_COL_GRAVEL_1,
|
||||
|
@ -171,7 +169,9 @@ static const int32 gOneShotCol[] = {SFX_COL_TARMAC_1,
|
|||
SFX_TYRE_BUMP,
|
||||
SFX_COL_CARDBOARD_1,
|
||||
SFX_COL_TARMAC_1,
|
||||
SFX_COL_GATE};
|
||||
SFX_COL_GATE,
|
||||
SFX_COL_SAND_1,
|
||||
SFX_COL_TARMAC_1 };
|
||||
|
||||
void
|
||||
cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
||||
|
@ -179,7 +179,7 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
|||
uint16 s1;
|
||||
uint16 s2;
|
||||
|
||||
int32 emittingVol;
|
||||
uint32 emittingVol;
|
||||
float ratio;
|
||||
|
||||
static uint16 counter = 28;
|
||||
|
@ -198,11 +198,11 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
|||
s1 = SURFACE_CAR_PANEL;
|
||||
ratio = Min(1.f, 2.f * ratio);
|
||||
}
|
||||
emittingVol = 40.f * ratio;
|
||||
emittingVol = 40 * ratio;
|
||||
if(emittingVol) {
|
||||
m_sQueueSample.m_fDistance = Sqrt(col.m_fDistance);
|
||||
m_sQueueSample.m_nVolume =
|
||||
ComputeVolume(emittingVol, CollisionSoundIntensity, m_sQueueSample.m_fDistance);
|
||||
ComputeVolume(emittingVol, COLLISION_MAX_DIST, m_sQueueSample.m_fDistance);
|
||||
if(m_sQueueSample.m_nVolume > 0) {
|
||||
m_sQueueSample.m_nSampleIndex = gOneShotCol[s1];
|
||||
switch(m_sQueueSample.m_nSampleIndex) {
|
||||
|
@ -219,7 +219,7 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
|||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] % 4;
|
||||
break;
|
||||
case SFX_COL_PED_1:
|
||||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 5;
|
||||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 2;
|
||||
break;
|
||||
case SFX_COL_WOOD_CRATES_1:
|
||||
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 4;
|
||||
|
@ -266,9 +266,9 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
|||
SET_EMITTING_VOLUME(emittingVol);
|
||||
RESET_LOOP_OFFSETS
|
||||
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
|
||||
m_sQueueSample.m_MaxDistance = CollisionSoundIntensity;
|
||||
m_sQueueSample.m_MaxDistance = COLLISION_MAX_DIST;
|
||||
m_sQueueSample.m_bStatic = TRUE;
|
||||
m_sQueueSample.m_bReverb = TRUE;
|
||||
SET_SOUND_REVERB(TRUE);
|
||||
SET_SOUND_REFLECTION(FALSE);
|
||||
AddSampleToRequestedQueue();
|
||||
}
|
||||
|
@ -279,12 +279,12 @@ cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
|
|||
void
|
||||
cAudioManager::SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter)
|
||||
{
|
||||
bool8 distCalculated = FALSE;
|
||||
if(col.m_fIntensity2 > 0.0016f) {
|
||||
uint8 emittingVol = SetLoopingCollisionRequestedSfxFreqAndGetVol(col);
|
||||
if(emittingVol) {
|
||||
m_sQueueSample.m_fDistance = Sqrt(col.m_fDistance);
|
||||
m_sQueueSample.m_nVolume =
|
||||
ComputeVolume(emittingVol, CollisionSoundIntensity, m_sQueueSample.m_fDistance);
|
||||
CalculateDistance(distCalculated, m_sQueueSample.m_fDistance);
|
||||
m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, COLLISION_MAX_DIST, m_sQueueSample.m_fDistance);
|
||||
if(m_sQueueSample.m_nVolume > 0) {
|
||||
m_sQueueSample.m_nCounter = counter;
|
||||
m_sQueueSample.m_vecPos = col.m_vecPosition;
|
||||
|
@ -293,12 +293,12 @@ cAudioManager::SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 coun
|
|||
m_sQueueSample.m_nPriority = 7;
|
||||
m_sQueueSample.m_nLoopCount = 0;
|
||||
SET_EMITTING_VOLUME(emittingVol);
|
||||
SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex);
|
||||
SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex)
|
||||
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
|
||||
m_sQueueSample.m_MaxDistance = CollisionSoundIntensity;
|
||||
m_sQueueSample.m_MaxDistance = COLLISION_MAX_DIST;
|
||||
m_sQueueSample.m_bStatic = FALSE;
|
||||
m_sQueueSample.m_nFramesToPlay = 5;
|
||||
m_sQueueSample.m_bReverb = TRUE;
|
||||
SET_SOUND_REVERB(TRUE);
|
||||
SET_SOUND_REFLECTION(FALSE);
|
||||
AddSampleToRequestedQueue();
|
||||
}
|
||||
|
@ -325,8 +325,8 @@ cAudioManager::SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollisio
|
|||
m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP;
|
||||
m_sQueueSample.m_nFrequency = 6050.f * ratio + 16000;
|
||||
vol = 30.f * ratio;
|
||||
} else if(surface1 == SURFACE_GRAVEL || surface2 == SURFACE_GRAVEL || surface1 == SURFACE_MUD_DRY ||
|
||||
surface2 == SURFACE_MUD_DRY || surface1 == SURFACE_SAND || surface2 == SURFACE_SAND) {
|
||||
} else if(surface1 == SURFACE_GRAVEL || surface2 == SURFACE_GRAVEL || surface1 == SURFACE_MUD_DRY || surface2 == SURFACE_MUD_DRY ||
|
||||
surface1 == SURFACE_SAND || surface2 == SURFACE_SAND || surface1 == SURFACE_SAND_BEACH || surface2 == SURFACE_SAND_BEACH) {
|
||||
ratio = GetCollisionRatio(audioCollision.m_fIntensity2, 0.0001f, 0.09f, 0.0899f);
|
||||
m_sQueueSample.m_nSampleIndex = SFX_GRAVEL_SKID;
|
||||
m_sQueueSample.m_nFrequency = 6000.f * ratio + 10000;
|
||||
|
@ -351,11 +351,12 @@ cAudioManager::GetCollisionOneShotRatio(uint32 a, float b)
|
|||
case SURFACE_TARMAC:
|
||||
case SURFACE_PAVEMENT:
|
||||
case SURFACE_STEEP_CLIFF:
|
||||
case SURFACE_TRANSPARENT_STONE: return GetCollisionRatio(b, 10.f, 60.f, 50.f);
|
||||
case SURFACE_TRANSPARENT_STONE:
|
||||
case SURFACE_CONCRETE_BEACH: return GetCollisionRatio(b, 10.f, 60.f, 50.f);
|
||||
case SURFACE_GRASS:
|
||||
case SURFACE_CARDBOARDBOX:
|
||||
case SURFACE_GRAVEL:
|
||||
case SURFACE_MUD_DRY: return GetCollisionRatio(b, 0.f, 2.f, 2.f);
|
||||
case SURFACE_MUD_DRY:
|
||||
case SURFACE_CARDBOARDBOX: return GetCollisionRatio(b, 0.f, 2.f, 2.f);
|
||||
case SURFACE_CAR: return GetCollisionRatio(b, 6.f, 50.f, 44.f);
|
||||
case SURFACE_GLASS:
|
||||
case SURFACE_METAL_CHAIN_FENCE: return GetCollisionRatio(b, 0.1f, 10.f, 9.9f);
|
||||
|
@ -372,7 +373,8 @@ cAudioManager::GetCollisionOneShotRatio(uint32 a, float b)
|
|||
case SURFACE_SAND:
|
||||
case SURFACE_WATER:
|
||||
case SURFACE_RUBBER:
|
||||
case SURFACE_WHEELBASE: return GetCollisionRatio(b, 0.f, 10.f, 10.f);
|
||||
case SURFACE_WHEELBASE:
|
||||
case SURFACE_SAND_BEACH: return GetCollisionRatio(b, 0.f, 10.f, 10.f);
|
||||
case SURFACE_WOOD_CRATES: return GetCollisionRatio(b, 1.f, 4.f, 3.f);
|
||||
case SURFACE_WOOD_BENCH: return GetCollisionRatio(b, 0.1f, 5.f, 4.9f);
|
||||
case SURFACE_WOOD_SOLID: return GetCollisionRatio(b, 0.1f, 40.f, 39.9f);
|
||||
|
|
|
@ -54,4 +54,4 @@ public:
|
|||
void AddCollisionToRequestedQueue();
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(cAudioCollisionManager, 852);
|
||||
VALIDATE_SIZE(cAudioCollisionManager, 0x354);
|
||||
|
|
13296
src/audio/AudioLogic.cpp
13296
src/audio/AudioLogic.cpp
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -3,17 +3,15 @@
|
|||
#include "audio_enums.h"
|
||||
#include "AudioCollision.h"
|
||||
#include "PolRadio.h"
|
||||
#include "VehicleModelInfo.h"
|
||||
#include "Vehicle.h"
|
||||
|
||||
class tSound
|
||||
{
|
||||
public:
|
||||
int32 m_nEntityIndex; // audio entity index
|
||||
#if GTA_VERSION >= GTA3_PC_10
|
||||
uint32 m_nCounter; // I'm not sure what this is but it looks like a virtual counter to determine the same sound in queue
|
||||
// Values higher than 255 are used by reflections
|
||||
#else
|
||||
uint8 m_nCounter;
|
||||
#endif
|
||||
uint32 m_nSampleIndex; // An index of sample from AudioSamples.h
|
||||
uint8 m_nBankIndex; // A sound bank index. IDK what's the point of it here since samples are hardcoded anyway
|
||||
bool8 m_bIs2D; // If TRUE then sound is played in 2D space (such as frontend or police radio)
|
||||
|
@ -31,14 +29,12 @@ public:
|
|||
uint8 m_nEmittingVolume; // The volume in 3D space, provided to 3D audio engine
|
||||
#endif
|
||||
float m_fSpeedMultiplier; // Used for doppler effect. 0.0f - unaffected by doppler
|
||||
#if GTA_VERSION >= GTA3_PC_10
|
||||
float m_MaxDistance; // The maximum distance at which sound could be heard. Minimum distance = MaxDistance / 5 or MaxDistance / 4 in case of emitting volume (useless if m_bIs2D == TRUE)
|
||||
#else
|
||||
uint32 m_MaxDistance;
|
||||
#endif
|
||||
bool8 m_bStatic; // If TRUE then sound parameters cannot be changed during playback (frequency, position, etc.)
|
||||
CVector m_vecPos; // Position of sound in 3D space. Unused if m_bIs2D == TRUE
|
||||
#if !defined(GTA_PS2) || defined(AUDIO_REVERB) // GTA_PS2 because this field exists on mobile but not on PS2
|
||||
bool8 m_bReverb; // Toggles reverb effect
|
||||
#endif
|
||||
#ifdef AUDIO_REFLECTIONS
|
||||
uint8 m_nReflectionDelay; // Number of frames before reflection could be played. This is calculated internally by AudioManager and shouldn't be set by queued sample
|
||||
bool8 m_bReflections; // Add sound reflections
|
||||
|
@ -47,6 +43,7 @@ public:
|
|||
// 0 = L 100% R 0%
|
||||
// 63 = L 100% R 100%
|
||||
// 127 = L 0% R 100%
|
||||
uint8 m_nFrontRearPan; // Used on PS2 for surround panning
|
||||
#ifndef FIX_BUGS
|
||||
uint32 m_nFramesToPlay; // Number of frames the sound would be played (if it stops being queued).
|
||||
// This one is being set by queued sample for looping sounds, otherwise calculated inside AudioManager
|
||||
|
@ -57,11 +54,6 @@ public:
|
|||
// all fields below are internal to AudioManager calculations and aren't set by queued sample
|
||||
bool8 m_bIsBeingPlayed; // Set to TRUE when the sound was added or changed on current frame to avoid it being overwritten
|
||||
bool8 m_bIsPlayingFinished; // Not sure about the name. Set to TRUE when sampman channel becomes free
|
||||
#if GTA_VERSION < GTA3_PC_10
|
||||
int32 unk; // Only on PS2, used by static non-looped sounds (AFAIK)
|
||||
// Looks like it's keeping a number of frames left to play with the purpose of setting m_bIsPlayingFinished=TRUE once value reaches 0
|
||||
// Default value is -3 for whatever reason
|
||||
#endif
|
||||
uint32 m_nFinalPriority; // Actual value used to compare priority, calculated using volume and m_nPriority. Lesser value means higher priority
|
||||
int8 m_nVolumeChange; // How much m_nVolume should reduce per each frame.
|
||||
#if defined(FIX_BUGS) && defined(EXTERNAL_3D_SOUND)
|
||||
|
@ -69,7 +61,7 @@ public:
|
|||
#endif
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(tSound, 92);
|
||||
VALIDATE_SIZE(tSound, 96);
|
||||
|
||||
class CPhysical;
|
||||
class CAutomobile;
|
||||
|
@ -96,7 +88,7 @@ public:
|
|||
CVector m_vecPos;
|
||||
float m_fDistance;
|
||||
uint8 m_nVolume;
|
||||
int8 m_nProcess;
|
||||
int8 m_nLoadingTimeout; // how many iterations we gonna wait until dropping the sample if it's still not loaded (only useful on PS2)
|
||||
#if defined(EXTERNAL_3D_SOUND) && defined(FIX_BUGS)
|
||||
uint8 m_nEmittingVolume;
|
||||
#endif
|
||||
|
@ -107,28 +99,34 @@ VALIDATE_SIZE(tPedComment, 28);
|
|||
class cPedComments
|
||||
{
|
||||
public:
|
||||
tPedComment m_asPedComments[NUM_PED_COMMENTS_BANKS][NUM_PED_COMMENTS_SLOTS];
|
||||
uint8 m_nIndexMap[NUM_PED_COMMENTS_BANKS][NUM_PED_COMMENTS_SLOTS];
|
||||
uint8 m_nCommentsInBank[NUM_PED_COMMENTS_BANKS];
|
||||
uint8 m_nActiveBank;
|
||||
tPedComment m_aPedCommentQueue[NUM_SOUND_QUEUES][NUM_PED_COMMENTS_SLOTS];
|
||||
uint8 m_aPedCommentOrderList[NUM_SOUND_QUEUES][NUM_PED_COMMENTS_SLOTS];
|
||||
uint8 m_nPedCommentCount[NUM_SOUND_QUEUES];
|
||||
uint8 m_nActiveQueue;
|
||||
#ifdef GTA_PC
|
||||
bool8 m_bDelay;
|
||||
uint32 m_nDelayTimer;
|
||||
#endif
|
||||
|
||||
cPedComments()
|
||||
{
|
||||
for (int i = 0; i < NUM_PED_COMMENTS_SLOTS; i++)
|
||||
for (int j = 0; j < NUM_PED_COMMENTS_BANKS; j++) {
|
||||
m_asPedComments[j][i].m_nProcess = -1;
|
||||
m_nIndexMap[j][i] = NUM_PED_COMMENTS_SLOTS;
|
||||
for (int j = 0; j < NUM_SOUND_QUEUES; j++) {
|
||||
m_aPedCommentQueue[j][i].m_nLoadingTimeout = -1;
|
||||
m_aPedCommentOrderList[j][i] = NUM_PED_COMMENTS_SLOTS;
|
||||
}
|
||||
|
||||
for (int i = 0; i < NUM_PED_COMMENTS_BANKS; i++)
|
||||
m_nCommentsInBank[i] = 0;
|
||||
m_nActiveBank = 0;
|
||||
for (int i = 0; i < NUM_SOUND_QUEUES; i++)
|
||||
m_nPedCommentCount[i] = 0;
|
||||
m_nActiveQueue = 0;
|
||||
}
|
||||
void Add(tPedComment *com);
|
||||
void Process();
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(cPedComments, 1164);
|
||||
VALIDATE_SIZE(cPedComments, 0x490);
|
||||
|
||||
#define MISSION_AUDIO_SLOTS (2)
|
||||
|
||||
// name made up
|
||||
class cAudioScriptObjectManager
|
||||
|
@ -166,6 +164,7 @@ public:
|
|||
class cVehicleParams
|
||||
{
|
||||
public:
|
||||
int32 m_VehicleType;
|
||||
bool8 m_bDistanceCalculated;
|
||||
float m_fDistance;
|
||||
CVehicle *m_pVehicle;
|
||||
|
@ -175,6 +174,7 @@ public:
|
|||
|
||||
cVehicleParams()
|
||||
{
|
||||
m_VehicleType = -1;
|
||||
m_bDistanceCalculated = false;
|
||||
m_fDistance = 0.0f;
|
||||
m_pVehicle = nil;
|
||||
|
@ -184,8 +184,9 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(cVehicleParams, 0x18);
|
||||
VALIDATE_SIZE(cVehicleParams, 0x1C);
|
||||
|
||||
#if GTA_VERSION < GTAVC_PC_10
|
||||
enum {
|
||||
/*
|
||||
REFLECTION_YMAX = 0, top
|
||||
|
@ -202,38 +203,58 @@ enum {
|
|||
REFLECTION_UP,
|
||||
MAX_REFLECTIONS,
|
||||
};
|
||||
#else
|
||||
enum {
|
||||
REFLECTION_NORTH = 0,
|
||||
REFLECTION_SOUTH,
|
||||
REFLECTION_WEST,
|
||||
REFLECTION_EAST,
|
||||
REFLECTION_CEIL_NORTH,
|
||||
REFLECTION_CEIL_SOUTH,
|
||||
REFLECTION_CEIL_WEST,
|
||||
REFLECTION_CEIL_EAST,
|
||||
MAX_REFLECTIONS,
|
||||
};
|
||||
#endif
|
||||
|
||||
enum PLAY_STATUS { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED };
|
||||
enum LOADING_STATUS { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED };
|
||||
enum LOADING_STATUS { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_LOADING };
|
||||
|
||||
class cAudioManager
|
||||
{
|
||||
public:
|
||||
bool8 m_bIsInitialised;
|
||||
bool8 m_bIsSurround; // unused until VC
|
||||
bool8 m_bIsSurround; // used on PS2
|
||||
bool8 m_bReduceReleasingPriority;
|
||||
uint8 m_nActiveSamples;
|
||||
bool8 m_bDoubleVolume; // unused
|
||||
#if GTA_VERSION >= GTA3_PC_10
|
||||
bool8 m_bDynamicAcousticModelingStatus;
|
||||
#endif
|
||||
uint8 m_nChannelOffset;
|
||||
float m_fSpeedOfSound;
|
||||
bool8 m_bTimerJustReset;
|
||||
int32 m_nTimer;
|
||||
uint32 m_nTimer;
|
||||
tSound m_sQueueSample;
|
||||
uint8 m_nActiveSampleQueue;
|
||||
tSound m_asSamples[NUM_SOUNDS_SAMPLES_BANKS][NUM_CHANNELS_GENERIC];
|
||||
uint8 m_abSampleQueueIndexTable[NUM_SOUNDS_SAMPLES_BANKS][NUM_CHANNELS_GENERIC];
|
||||
uint8 m_SampleRequestQueuesStatus[NUM_SOUNDS_SAMPLES_BANKS];
|
||||
uint8 m_nActiveQueue;
|
||||
tSound m_aRequestedQueue[NUM_SOUND_QUEUES][NUM_CHANNELS_GENERIC];
|
||||
uint8 m_aRequestedOrderList[NUM_SOUND_QUEUES][NUM_CHANNELS_GENERIC];
|
||||
uint8 m_nRequestedCount[NUM_SOUND_QUEUES];
|
||||
tSound m_asActiveSamples[NUM_CHANNELS_GENERIC];
|
||||
tAudioEntity m_asAudioEntities[NUM_AUDIOENTITIES];
|
||||
int32 m_anAudioEntityIndices[NUM_AUDIOENTITIES];
|
||||
int32 m_nAudioEntitiesTotal;
|
||||
uint32 m_aAudioEntityOrderList[NUM_AUDIOENTITIES];
|
||||
uint32 m_nAudioEntitiesCount;
|
||||
#ifdef AUDIO_REFLECTIONS
|
||||
CVector m_avecReflectionsPos[MAX_REFLECTIONS];
|
||||
float m_afReflectionsDistances[MAX_REFLECTIONS];
|
||||
#endif
|
||||
cAudioScriptObjectManager m_sAudioScriptObjectManager;
|
||||
|
||||
// miami
|
||||
bool8 m_bIsPlayerShutUp;
|
||||
uint8 m_nPlayerMood;
|
||||
uint32 m_nPlayerMoodTimer;
|
||||
uint32 field_4B38_vc;
|
||||
bool8 m_bGenericSfx;
|
||||
|
||||
cPedComments m_sPedComments;
|
||||
int32 m_nFireAudioEntity;
|
||||
int32 m_nWaterCannonEntity;
|
||||
|
@ -244,22 +265,30 @@ public:
|
|||
int32 m_nCollisionEntity;
|
||||
cAudioCollisionManager m_sCollisionManager;
|
||||
int32 m_nProjectileEntity;
|
||||
int32 m_nEscalatorEntity;
|
||||
int32 m_nExtraSoundsEntity;
|
||||
#ifdef GTA_BRIDGE
|
||||
int32 m_nBridgeEntity;
|
||||
#endif
|
||||
|
||||
// Mission audio stuff
|
||||
CVector m_vecMissionAudioPosition;
|
||||
bool8 m_bIsMissionAudio2D;
|
||||
uint32 m_nMissionAudioSampleIndex;
|
||||
uint8 m_nMissionAudioLoadingStatus;
|
||||
uint8 m_nMissionAudioPlayStatus;
|
||||
bool8 m_bIsMissionAudioPlaying;
|
||||
int32 m_nMissionAudioFramesToPlay;
|
||||
bool8 m_bIsMissionAudioAllowedToPlay;
|
||||
// So instead of making an array of struct they've added [MISSION_AUDIO_SLOTS] to every field...
|
||||
// Only someone with a VERY EXTRAORDINARY mind could have come up with that
|
||||
CVector m_vecMissionAudioPosition[MISSION_AUDIO_SLOTS];
|
||||
bool8 m_bIsMissionAudio2D[MISSION_AUDIO_SLOTS];
|
||||
uint32 m_nMissionAudioSampleIndex[MISSION_AUDIO_SLOTS];
|
||||
uint8 m_nMissionAudioLoadingStatus[MISSION_AUDIO_SLOTS];
|
||||
uint8 m_nMissionAudioPlayStatus[MISSION_AUDIO_SLOTS];
|
||||
bool8 m_bIsMissionAudioPlaying[MISSION_AUDIO_SLOTS];
|
||||
int32 m_nMissionAudioFramesToPlay[MISSION_AUDIO_SLOTS]; // possibly unsigned
|
||||
bool8 m_bIsMissionAudioAllowedToPlay[MISSION_AUDIO_SLOTS];
|
||||
bool8 m_bIsMissionAudioPhoneCall[MISSION_AUDIO_SLOTS];
|
||||
uint8 m_nGlobalSfxVolumeMultiplier; // used to lower sfx volume during phone calls
|
||||
|
||||
int32 m_anRandomTable[5];
|
||||
uint8 m_nTimeSpent;
|
||||
bool8 m_nUserPause;
|
||||
bool8 m_nPreviousUserPause;
|
||||
bool8 m_bIsPaused;
|
||||
bool8 m_bWasPaused;
|
||||
uint32 m_FrameCounter;
|
||||
|
||||
cAudioManager();
|
||||
|
@ -269,16 +298,17 @@ public:
|
|||
void Terminate();
|
||||
void Service();
|
||||
int32 CreateEntity(eAudioType type, void *entity);
|
||||
void DestroyEntity(int32 id);
|
||||
void DestroyEntity(int32 id); // inlined in vc
|
||||
bool8 GetEntityStatus(int32 id);
|
||||
void SetEntityStatus(int32 id, bool8 status);
|
||||
void *GetEntityPointer(int32 id);
|
||||
void PlayOneShot(int32 index, uint16 sound, float vol);
|
||||
void SetEffectsMasterVolume(uint8 volume);
|
||||
void SetMusicMasterVolume(uint8 volume);
|
||||
void SetMP3BoostVolume(uint8 volume);
|
||||
void SetEffectsFadeVol(uint8 volume);
|
||||
void SetMusicFadeVol(uint8 volume);
|
||||
void SetMonoMode(bool8 mono);
|
||||
void SetOutputMode(bool8 surround);
|
||||
void ResetTimers(uint32 time);
|
||||
void DestroyAllGameCreatedEntities();
|
||||
|
||||
|
@ -286,6 +316,7 @@ public:
|
|||
uint8 GetNum3DProvidersAvailable();
|
||||
char *Get3DProviderName(uint8 id);
|
||||
int8 GetCurrent3DProviderIndex();
|
||||
int8 AutoDetect3DProviders();
|
||||
int8 SetCurrent3DProvider(uint8 which);
|
||||
void SetSpeakerConfig(int32 conf);
|
||||
bool8 IsMP3RadioChannelAvailable();
|
||||
|
@ -300,29 +331,31 @@ public:
|
|||
#endif
|
||||
|
||||
void ServiceSoundEffects();
|
||||
uint32 FL(float f); // not used
|
||||
uint8 ComputeVolume(uint8 emittingVolume, float maxDistance, float distance);
|
||||
void TranslateEntity(Const CVector *v1, CVector *v2);
|
||||
int32 ComputeFrontRearMix(float, CVector *);
|
||||
int32 ComputePan(float, CVector *);
|
||||
uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier); // inlined on PS2
|
||||
uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier);
|
||||
int32 RandomDisplacement(uint32 seed);
|
||||
void InterrogateAudioEntities(); // inlined on PS2
|
||||
void InterrogateAudioEntities(); // inlined
|
||||
void AddSampleToRequestedQueue();
|
||||
void AddDetailsToRequestedOrderList(uint8 sample); // inlined on PS2
|
||||
void AddDetailsToRequestedOrderList(uint8 sample); // inlined in vc
|
||||
#ifdef AUDIO_REFLECTIONS
|
||||
void AddReflectionsToRequestedQueue();
|
||||
void UpdateReflections();
|
||||
#endif
|
||||
void AddReleasingSounds();
|
||||
void ProcessActiveQueues();
|
||||
void ClearRequestedQueue(); // inlined on PS2
|
||||
void ClearRequestedQueue(); // inlined in vc
|
||||
void ClearActiveSamples();
|
||||
void GenerateIntegerRandomNumberTable(); // inlined on PS2
|
||||
void GenerateIntegerRandomNumberTable();
|
||||
#ifdef GTA_PS2
|
||||
void LoadBankIfNecessary(uint8 bank); // this is used only on PS2 but technically not a platform code
|
||||
#endif
|
||||
|
||||
#ifdef EXTERNAL_3D_SOUND // actually must have been && AUDIO_MSS as well
|
||||
void AdjustSamplesVolume();
|
||||
uint8 ComputeEmittingVolume(uint8 emittingVolume, float maxDistance, float distance);
|
||||
void AdjustSamplesVolume(); // inlined
|
||||
uint8 ComputeEmittingVolume(uint8 emittingVolume, float maxDistance, float distance); // inlined
|
||||
#endif
|
||||
|
||||
// audio logic
|
||||
|
@ -332,145 +365,174 @@ public:
|
|||
void PostTerminateGameSpecificShutdown();
|
||||
void ResetAudioLogicTimers(uint32 timer);
|
||||
void ProcessReverb();
|
||||
float GetDistanceSquared(const CVector &v);
|
||||
float GetDistanceSquared(const CVector &v); // inlined in vc
|
||||
void CalculateDistance(bool8 &condition, float dist);
|
||||
CVehicle *FindVehicleOfPlayer();
|
||||
void ProcessSpecial();
|
||||
void ProcessEntity(int32 sound);
|
||||
void ProcessPhysical(int32 id);
|
||||
|
||||
// vehicles
|
||||
void ProcessVehicle(CVehicle *vehicle);
|
||||
bool8 ProcessCarHeli(cVehicleParams ¶ms);
|
||||
void ProcessRainOnVehicle(cVehicleParams ¶ms);
|
||||
bool8 ProcessReverseGear(cVehicleParams ¶ms);
|
||||
void ProcessModelCarEngine(cVehicleParams ¶ms);
|
||||
void ProcessModelHeliVehicle(cVehicleParams ¶ms);
|
||||
void ProcessModelVehicle(cVehicleParams ¶ms);
|
||||
bool8 ProcessVehicleFlatTyre(cVehicleParams ¶ms);
|
||||
bool8 ProcessVehicleRoadNoise(cVehicleParams ¶ms);
|
||||
bool8 ProcessWetRoadNoise(cVehicleParams ¶ms);
|
||||
bool8 ProcessVehicleEngine(cVehicleParams ¶ms);
|
||||
void UpdateGasPedalAudio(CAutomobile *automobile); // inlined on PS2
|
||||
void UpdateGasPedalAudio(CVehicle *veh, int vehType);
|
||||
void PlayerJustGotInCar();
|
||||
void PlayerJustLeftCar();
|
||||
void AddPlayerCarSample(uint8 emittingVolume, uint32 freq, uint32 sample, uint8 bank, uint8 counter, bool8 notLooping);
|
||||
void ProcessCesna(cVehicleParams ¶ms);
|
||||
void ProcessPlayersVehicleEngine(cVehicleParams ¶ms, CAutomobile *automobile);
|
||||
void ProcessPlayersVehicleEngine(cVehicleParams ¶ms, CVehicle *veh);
|
||||
bool8 ProcessVehicleSkidding(cVehicleParams ¶ms);
|
||||
float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);
|
||||
float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); // inlined on PS2
|
||||
void ProcessVehicleHorn(cVehicleParams ¶ms);
|
||||
bool8 UsesSiren(uint32 model); // inlined on PS2
|
||||
bool8 UsesSirenSwitching(uint32 model); // inlined on PS2
|
||||
float GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange);
|
||||
float GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange);
|
||||
bool8 ProcessVehicleHorn(cVehicleParams ¶ms);
|
||||
bool8 UsesSiren(cVehicleParams ¶ms);
|
||||
bool8 UsesSirenSwitching(cVehicleParams ¶ms);
|
||||
bool8 ProcessVehicleSirenOrAlarm(cVehicleParams ¶ms);
|
||||
bool8 UsesReverseWarning(uint32 model); // inlined on PS2
|
||||
bool8 UsesReverseWarning(uint32 model);
|
||||
bool8 ProcessVehicleReverseWarning(cVehicleParams ¶ms);
|
||||
bool8 ProcessVehicleDoors(cVehicleParams ¶ms);
|
||||
bool8 ProcessAirBrakes(cVehicleParams ¶ms);
|
||||
bool8 HasAirBrakes(uint32 model); // inlined on PS2
|
||||
bool8 HasAirBrakes(uint32 model);
|
||||
bool8 ProcessEngineDamage(cVehicleParams ¶ms);
|
||||
bool8 ProcessCarBombTick(cVehicleParams ¶ms);
|
||||
void ProcessVehicleOneShots(cVehicleParams ¶ms);
|
||||
#ifdef GTA_TRAIN
|
||||
bool8 ProcessTrainNoise(cVehicleParams ¶ms);
|
||||
#endif
|
||||
bool8 ProcessBoatEngine(cVehicleParams ¶ms);
|
||||
bool8 ProcessBoatMovingOverWater(cVehicleParams ¶ms);
|
||||
bool8 ProcessHelicopter(cVehicleParams ¶ms);
|
||||
void ProcessPlane(cVehicleParams ¶ms); // inlined on PS2
|
||||
void ProcessPlane(cVehicleParams ¶ms);
|
||||
void ProcessJumbo(cVehicleParams ¶ms);
|
||||
void ProcessJumboTaxi(); // inlined on PS2
|
||||
void ProcessJumboTaxi();
|
||||
void ProcessJumboAccel(CPlane *plane);
|
||||
void ProcessJumboTakeOff(CPlane *plane); // inlined on PS2
|
||||
void ProcessJumboFlying(); // inlined on PS2
|
||||
void ProcessJumboLanding(CPlane *plane); // inlined on PS2
|
||||
void ProcessJumboDecel(CPlane *plane); // inlined on PS2
|
||||
void ProcessJumboTakeOff(CPlane *plane);
|
||||
void ProcessJumboFlying();
|
||||
void ProcessJumboLanding(CPlane *plane);
|
||||
void ProcessJumboDecel(CPlane *plane);
|
||||
bool8 SetupJumboTaxiSound(uint8 vol);
|
||||
bool8 SetupJumboWhineSound(uint8 emittingVol, uint32 freq);
|
||||
bool8 SetupJumboEngineSound(uint8 vol, uint32 freq);
|
||||
bool8 SetupJumboFlySound(uint8 emittingVol);
|
||||
bool8 SetupJumboRumbleSound(uint8 emittingVol);
|
||||
int32 GetJumboTaxiFreq(); // inlined on PS2
|
||||
int32 GetJumboTaxiFreq(); // inlined in vc
|
||||
|
||||
// peds
|
||||
void ProcessPed(CPhysical *ped); // inlined on PS2
|
||||
void ProcessPedHeadphones(cPedParams ¶ms);
|
||||
void ProcessPed(CPhysical *ped);
|
||||
void ProcessPedOneShots(cPedParams ¶ms);
|
||||
void SetPedTalkingStatus(CPed *ped, bool8 status);
|
||||
void SetPlayersMood(uint8 mood, uint32 time);
|
||||
void ProcessPlayerMood();
|
||||
|
||||
// ped comments
|
||||
void SetupPedComments(cPedParams ¶ms, uint16 sound);
|
||||
int32 GetPedCommentSfx(CPed *ped, uint16 sound);
|
||||
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset); // inlined on PS2
|
||||
uint32 GetPlayerTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetCopTalkSfx(uint16 sound);
|
||||
uint32 GetSwatTalkSfx(uint16 sound);
|
||||
uint32 GetFBITalkSfx(uint16 sound);
|
||||
uint32 GetArmyTalkSfx(uint16 sound);
|
||||
uint32 GetMedicTalkSfx(uint16 sound);
|
||||
uint32 GetFiremanTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetBusinessMaleOldTalkSfx(uint16 sound);
|
||||
uint32 GetBusinessMaleYoungTalkSfx(uint16 sound, uint32 model);
|
||||
uint32 GetMafiaTalkSfx(uint16 sound);
|
||||
uint32 GetTriadTalkSfx(uint16 sound);
|
||||
uint32 GetDiabloTalkSfx(uint16 sound);
|
||||
uint32 GetYakuzaTalkSfx(uint16 sound);
|
||||
uint32 GetYardieTalkSfx(uint16 sound);
|
||||
uint32 GetColumbianTalkSfx(uint16 sound);
|
||||
uint32 GetHoodTalkSfx(uint16 sound);
|
||||
uint32 GetBlackCriminalTalkSfx(uint16 sound);
|
||||
uint32 GetWhiteCriminalTalkSfx(uint16 sound);
|
||||
uint32 GetCasualMaleOldTalkSfx(uint16 sound);
|
||||
uint32 GetCasualMaleYoungTalkSfx(uint16 sound);
|
||||
uint32 GetBlackCasualFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetWhiteCasualFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetFemaleNo3TalkSfx(uint16 sound);
|
||||
uint32 GetWhiteBusinessFemaleTalkSfx(uint16 sound, uint32 model);
|
||||
uint32 GetBlackFatFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetWhiteFatMaleTalkSfx(uint16 sound);
|
||||
uint32 GetBlackFatMaleTalkSfx(uint16 sound);
|
||||
uint32 GetWhiteFatFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetBlackFemaleProstituteTalkSfx(uint16 sound);
|
||||
uint32 GetWhiteFemaleProstituteTalkSfx(uint16 sound);
|
||||
uint32 GetBlackProjectMaleTalkSfx(uint16 sound, uint32 model);
|
||||
uint32 GetBlackProjectFemaleOldTalkSfx(uint16 sound);
|
||||
uint32 GetBlackProjectFemaleYoungTalkSfx(uint16 sound);
|
||||
uint32 GetChinatownMaleOldTalkSfx(uint16 sound);
|
||||
uint32 GetChinatownMaleYoungTalkSfx(uint16 sound);
|
||||
uint32 GetChinatownFemaleOldTalkSfx(uint16 sound);
|
||||
uint32 GetChinatownFemaleYoungTalkSfx(uint16 sound);
|
||||
uint32 GetLittleItalyMaleTalkSfx(uint16 sound);
|
||||
uint32 GetLittleItalyFemaleOldTalkSfx(uint16 sound);
|
||||
uint32 GetLittleItalyFemaleYoungTalkSfx(uint16 sound);
|
||||
uint32 GetWhiteDockerMaleTalkSfx(uint16 sound);
|
||||
uint32 GetBlackDockerMaleTalkSfx(uint16 sound);
|
||||
uint32 GetScumMaleTalkSfx(uint16 sound);
|
||||
uint32 GetScumFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetWhiteWorkerMaleTalkSfx(uint16 sound);
|
||||
uint32 GetBlackWorkerMaleTalkSfx(uint16 sound);
|
||||
uint32 GetBlackBusinessFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetSupermodelMaleTalkSfx(uint16 sound);
|
||||
uint32 GetSupermodelFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetStewardMaleTalkSfx(uint16 sound);
|
||||
uint32 GetStewardFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetFanMaleTalkSfx(uint16 sound, uint32 model);
|
||||
uint32 GetFanFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetHospitalMaleTalkSfx(uint16 sound);
|
||||
uint32 GetHospitalFemaleTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetWhiteConstructionWorkerTalkSfx(uint16 sound);
|
||||
uint32 GetBlackConstructionWorkerTalkSfx(uint16 sound);
|
||||
uint32 GetShopperFemaleTalkSfx(uint16 sound, uint32 model);
|
||||
uint32 GetStudentMaleTalkSfx(uint16 sound);
|
||||
uint32 GetStudentFemaleTalkSfx(uint16 sound);
|
||||
uint32 GetPedCommentSfx(CPed *ped, uint16 sound);
|
||||
void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset);
|
||||
uint32 GetPlayerTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetGenericMaleTalkSfx(CPed *ped, uint16 sound); // inlined in vc
|
||||
uint32 GetGenericFemaleTalkSfx(CPed *ped, uint16 sound); // inlined in vc
|
||||
uint32 GetDefaultTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetCopTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetSwatTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetFBITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetArmyTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetMedicTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetFiremanTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYG1TalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYG2TalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFYSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFOSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMYSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMOSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFYRITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFORITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMYRITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMORITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFYBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFOBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMYBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMOBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFYBUTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFYMDTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFYCGTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFYPRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHFOTRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMOTRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMOCATalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMYCRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFYSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFOSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMYSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMOSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFYRITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFORITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMYRITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFYBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMYBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFOBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMOBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMYBUTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFYPRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBFOTRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMOTRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMYPITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMYBBTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYCRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYSKTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYSKTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFOSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMOSTTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYRITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFORITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYRITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMORITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFOBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMOBETalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYCWTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYGOTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFOGOTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMOGOTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYLGTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYLGTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYBUTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYBUTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMOBUTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYPRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFOTRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMOTRTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYPITalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMOCATalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYSHTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFOSHTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetJFOTOTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetJMOTOTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHNTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBKTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetCBTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetSGTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetCLTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetGDTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetPGTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetViceWhiteTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetViceBlackTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetBMODKTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetHMYAPTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWFYJGTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetWMYJGTalkSfx(CPed *ped, uint16 sound);
|
||||
uint32 GetSpecialCharacterTalkSfx(CPed *ped, int32 model, uint16 sound);
|
||||
|
||||
uint32 GetSpecialCharacterTalkSfx(uint32 modelIndex, uint16 sound);
|
||||
uint32 GetEightBallTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetSalvatoreTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetMistyTalkSfx(uint16 sound);
|
||||
uint32 GetOldJapTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetCatalinaTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetBomberTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetSecurityGuardTalkSfx(uint16 sound);
|
||||
uint32 GetChunkyTalkSfx(uint16 sound); // inlined on PS2
|
||||
|
||||
uint32 GetAsianTaxiDriverTalkSfx(uint16 sound); // inlined on PS2
|
||||
uint32 GetPimpTalkSfx(uint16 sound);
|
||||
uint32 GetNormalMaleTalkSfx(uint16 sound);
|
||||
uint32 GetGenericMaleTalkSfx(uint16 sound);
|
||||
uint32 GetGenericFemaleTalkSfx(uint16 sound);
|
||||
void DebugPlayPedComment(int32 sound);
|
||||
|
||||
// particles
|
||||
void ProcessExplosions(int32 explosion);
|
||||
|
@ -478,51 +540,46 @@ public:
|
|||
void ProcessWaterCannon(int32);
|
||||
|
||||
// script objects
|
||||
void ProcessScriptObject(int32 id); // inlined on PS2
|
||||
void ProcessScriptObject(int32 id);
|
||||
void ProcessOneShotScriptObject(uint8 sound);
|
||||
void ProcessLoopingScriptObject(uint8 sound);
|
||||
void ProcessPornCinema(uint8 sound);
|
||||
void ProcessWorkShopScriptObject(uint8 sound);
|
||||
void ProcessSawMillScriptObject(uint8 sound);
|
||||
void ProcessLaunderetteScriptObject(uint8 sound);
|
||||
void ProcessShopScriptObject(uint8 sound);
|
||||
void ProcessAirportScriptObject(uint8 sound);
|
||||
void ProcessCinemaScriptObject(uint8 sound);
|
||||
void ProcessDocksScriptObject(uint8 sound);
|
||||
void ProcessHomeScriptObject(uint8 sound);
|
||||
void ProcessPoliceCellBeatingScriptObject(uint8 sound);
|
||||
|
||||
// misc
|
||||
void ProcessWeather(int32 id);
|
||||
void ProcessFrontEnd();
|
||||
void ProcessCrane();
|
||||
//void ProcessCrane();
|
||||
void ProcessProjectiles();
|
||||
void ProcessEscalators();
|
||||
void ProcessExtraSounds();
|
||||
void ProcessGarages();
|
||||
void ProcessFireHydrant();
|
||||
|
||||
// bridge
|
||||
void ProcessBridge(); // inlined on PS2
|
||||
#ifdef GTA_BRIDGE
|
||||
void ProcessBridge();
|
||||
void ProcessBridgeWarning();
|
||||
void ProcessBridgeMotor();
|
||||
void ProcessBridgeOneShots();
|
||||
#endif
|
||||
|
||||
// mission audio
|
||||
const char *GetMissionAudioLoadedLabel(uint8 slot);
|
||||
bool8 MissionScriptAudioUsesPoliceChannel(uint32 soundMission);
|
||||
void PreloadMissionAudio(Const char *name);
|
||||
uint8 GetMissionAudioLoadingStatus();
|
||||
void SetMissionAudioLocation(float x, float y, float z);
|
||||
void PlayLoadedMissionAudio();
|
||||
bool8 IsMissionAudioSampleFinished();
|
||||
bool8 IsMissionAudioSamplePlaying() { return m_nMissionAudioPlayStatus == PLAY_STATUS_PLAYING; }
|
||||
bool8 ShouldDuckMissionAudio() { return IsMissionAudioSamplePlaying(); }
|
||||
void ClearMissionAudio();
|
||||
void PreloadMissionAudio(uint8 slot, Const char *name);
|
||||
uint8 GetMissionAudioLoadingStatus(uint8 slot);
|
||||
void SetMissionAudioLocation(uint8 slot, float x, float y, float z);
|
||||
void PlayLoadedMissionAudio(uint8 slot);
|
||||
bool8 ShouldDuckMissionAudio(uint8 slot);
|
||||
bool8 IsMissionAudioSamplePlaying(uint8 slot);
|
||||
bool8 IsMissionAudioSampleFinished(uint8 slot);
|
||||
void ClearMissionAudio(uint8 slot); // inlined in vc
|
||||
void ProcessMissionAudioSlot(uint8 slot);
|
||||
void ProcessMissionAudio();
|
||||
|
||||
// police radio
|
||||
void InitialisePoliceRadioZones();
|
||||
void InitialisePoliceRadio();
|
||||
void ResetPoliceRadio();
|
||||
void SetMissionScriptPoliceAudio(uint32 sfx);
|
||||
void SetMissionScriptPoliceAudio(uint32 sfx); // inlined and optimized
|
||||
int8 GetMissionScriptPoliceAudioPlayingStatus();
|
||||
void DoPoliceRadioCrackle();
|
||||
void ServicePoliceRadio();
|
||||
|
@ -531,7 +588,7 @@ public:
|
|||
void SetupSuspectLastSeenReport();
|
||||
void ReportCrime(eCrimeType crime, const CVector &pos);
|
||||
void PlaySuspectLastSeen(float x, float y, float z);
|
||||
void AgeCrimes(); // inlined on PS2
|
||||
void AgeCrimes(); // inlined in vc
|
||||
|
||||
// collision stuff
|
||||
void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2);
|
||||
|
@ -541,7 +598,9 @@ public:
|
|||
uint32 SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollision &audioCollision);
|
||||
float GetCollisionOneShotRatio(uint32 a, float b);
|
||||
float GetCollisionLoopingRatio(uint32 a, uint32 b, float c); // not used
|
||||
float GetCollisionRatio(float a, float b, float c, float d); // inlined on PS2
|
||||
float GetCollisionRatio(float a, float b, float c, float d); // inlined in vc
|
||||
|
||||
float Sqrt(float v) const { return v <= 0.0f ? 0.0f : ::Sqrt(v); }
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -570,9 +629,21 @@ public:
|
|||
#else
|
||||
#define SET_SOUND_REFLECTION(b)
|
||||
#endif
|
||||
#ifdef AUDIO_REVERB
|
||||
#define SET_SOUND_REVERB(b) m_sQueueSample.m_bReverb = b
|
||||
#else
|
||||
#define SET_SOUND_REVERB(b)
|
||||
#endif
|
||||
|
||||
#if defined(AUDIO_MSS) && !defined(PS2_AUDIO_CHANNELS)
|
||||
static_assert(sizeof(cAudioManager) == 19220, "cAudioManager: error");
|
||||
static_assert(sizeof(cAudioManager) == 0x5558, "cAudioManager: error");
|
||||
#endif
|
||||
|
||||
extern cAudioManager AudioManager;
|
||||
|
||||
enum
|
||||
{
|
||||
PED_COMMENT_VOLUME = 127,
|
||||
PED_COMMENT_VOLUME_BEHIND_WALL = 31,
|
||||
COLLISION_MAX_DIST = 60,
|
||||
};
|
||||
|
|
12989
src/audio/AudioSamples.h
12989
src/audio/AudioSamples.h
File diff suppressed because it is too large
Load Diff
|
@ -93,6 +93,8 @@ cAudioScriptObject::SaveAllAudioScriptObjects(uint8 *buf, uint32 *size)
|
|||
void
|
||||
PlayOneShotScriptObject(uint8 id, CVector const &pos)
|
||||
{
|
||||
if (!DMAudio.IsAudioInitialised()) return;
|
||||
|
||||
cAudioScriptObject *audioScriptObject = new cAudioScriptObject();
|
||||
audioScriptObject->Posn = pos;
|
||||
audioScriptObject->AudioId = id;
|
||||
|
|
|
@ -63,9 +63,18 @@ cDMAudio::DestroyAllGameCreatedEntities(void)
|
|||
}
|
||||
|
||||
void
|
||||
cDMAudio::SetMonoMode(bool8 mono)
|
||||
cDMAudio::SetOutputMode(bool8 surround)
|
||||
{
|
||||
AudioManager.SetMonoMode(mono);
|
||||
AudioManager.SetOutputMode(surround);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::SetMP3BoostVolume(uint8 volume)
|
||||
{
|
||||
uint8 vol = volume;
|
||||
if (vol > MAX_VOLUME) vol = MAX_VOLUME;
|
||||
|
||||
AudioManager.SetMP3BoostVolume(vol);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -116,6 +125,11 @@ cDMAudio::Get3DProviderName(uint8 id)
|
|||
return AudioManager.Get3DProviderName(id);
|
||||
}
|
||||
|
||||
int8 cDMAudio::AutoDetect3DProviders(void)
|
||||
{
|
||||
return AudioManager.AutoDetect3DProviders();
|
||||
}
|
||||
|
||||
int8
|
||||
cDMAudio::GetCurrent3DProviderIndex(void)
|
||||
{
|
||||
|
@ -238,13 +252,13 @@ cDMAudio::PlayFrontEndSound(uint16 frontend, uint32 volume)
|
|||
}
|
||||
|
||||
void
|
||||
cDMAudio::PlayRadioAnnouncement(uint8 announcement)
|
||||
cDMAudio::PlayRadioAnnouncement(uint32 announcement)
|
||||
{
|
||||
MusicManager.PlayAnnouncement(announcement);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::PlayFrontEndTrack(uint8 track, bool8 frontendFlag)
|
||||
cDMAudio::PlayFrontEndTrack(uint32 track, bool8 frontendFlag)
|
||||
{
|
||||
MusicManager.PlayFrontEndTrack(track, frontendFlag);
|
||||
}
|
||||
|
@ -268,7 +282,7 @@ cDMAudio::ChangeMusicMode(uint8 mode)
|
|||
}
|
||||
|
||||
void
|
||||
cDMAudio::PreloadCutSceneMusic(uint8 track)
|
||||
cDMAudio::PreloadCutSceneMusic(uint32 track)
|
||||
{
|
||||
MusicManager.PreloadCutSceneMusic(track);
|
||||
}
|
||||
|
@ -286,39 +300,51 @@ cDMAudio::StopCutSceneMusic(void)
|
|||
}
|
||||
|
||||
void
|
||||
cDMAudio::PreloadMissionAudio(Const char *missionAudio)
|
||||
cDMAudio::PreloadMissionAudio(uint8 slot, Const char *missionAudio)
|
||||
{
|
||||
AudioManager.PreloadMissionAudio(missionAudio);
|
||||
AudioManager.PreloadMissionAudio(slot, missionAudio);
|
||||
}
|
||||
|
||||
uint8
|
||||
cDMAudio::GetMissionAudioLoadingStatus(void)
|
||||
cDMAudio::GetMissionAudioLoadingStatus(uint8 slot)
|
||||
{
|
||||
return AudioManager.GetMissionAudioLoadingStatus();
|
||||
return AudioManager.GetMissionAudioLoadingStatus(slot);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::SetMissionAudioLocation(float x, float y, float z)
|
||||
cDMAudio::SetMissionAudioLocation(uint8 slot, float x, float y, float z)
|
||||
{
|
||||
AudioManager.SetMissionAudioLocation(x, y, z);
|
||||
AudioManager.SetMissionAudioLocation(slot, x, y, z);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::PlayLoadedMissionAudio(void)
|
||||
cDMAudio::PlayLoadedMissionAudio(uint8 slot)
|
||||
{
|
||||
AudioManager.PlayLoadedMissionAudio();
|
||||
AudioManager.PlayLoadedMissionAudio(slot);
|
||||
}
|
||||
|
||||
bool8
|
||||
cDMAudio::IsMissionAudioSampleFinished(void)
|
||||
cDMAudio::IsMissionAudioSamplePlaying(uint8 slot)
|
||||
{
|
||||
return AudioManager.IsMissionAudioSampleFinished();
|
||||
return AudioManager.IsMissionAudioSamplePlaying(slot);
|
||||
}
|
||||
|
||||
bool8
|
||||
cDMAudio::IsMissionAudioSampleFinished(uint8 slot)
|
||||
{
|
||||
return AudioManager.IsMissionAudioSampleFinished(slot);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::ClearMissionAudio(void)
|
||||
cDMAudio::ClearMissionAudio(uint8 slot)
|
||||
{
|
||||
AudioManager.ClearMissionAudio();
|
||||
AudioManager.ClearMissionAudio(slot);
|
||||
}
|
||||
|
||||
const char *
|
||||
cDMAudio::GetMissionAudioLoadedLabel(uint8 slot)
|
||||
{
|
||||
return AudioManager.GetMissionAudioLoadedLabel(slot);
|
||||
}
|
||||
|
||||
uint8
|
||||
|
@ -334,7 +360,49 @@ cDMAudio::SetRadioInCar(uint32 radio)
|
|||
}
|
||||
|
||||
void
|
||||
cDMAudio::SetRadioChannel(uint8 radio, int32 pos)
|
||||
cDMAudio::SetRadioChannel(uint32 radio, int32 pos)
|
||||
{
|
||||
MusicManager.SetRadioChannelByScript(radio, pos);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::SetStartingTrackPositions(bool8 isStartGame)
|
||||
{
|
||||
MusicManager.SetStartingTrackPositions(isStartGame);
|
||||
}
|
||||
|
||||
float *
|
||||
cDMAudio::GetListenTimeArray()
|
||||
{
|
||||
return MusicManager.GetListenTimeArray();
|
||||
}
|
||||
|
||||
uint32
|
||||
cDMAudio::GetFavouriteRadioStation()
|
||||
{
|
||||
return MusicManager.GetFavouriteRadioStation();
|
||||
}
|
||||
|
||||
int32
|
||||
cDMAudio::GetRadioPosition(uint32 station)
|
||||
{
|
||||
return MusicManager.GetRadioPosition(station);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::SetPedTalkingStatus(CPed *ped, bool8 status)
|
||||
{
|
||||
return AudioManager.SetPedTalkingStatus(ped, status);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::SetPlayersMood(uint8 mood, uint32 time)
|
||||
{
|
||||
return AudioManager.SetPlayersMood(mood, time);
|
||||
}
|
||||
|
||||
void
|
||||
cDMAudio::ShutUpPlayerTalking(bool8 state)
|
||||
{
|
||||
AudioManager.m_bIsPlayerShutUp = state;
|
||||
}
|
|
@ -7,6 +7,9 @@
|
|||
#define AEHANDLE_IS_FAILED(h) ((h)<0)
|
||||
#define AEHANDLE_IS_OK(h) ((h)>=0)
|
||||
|
||||
#define NO_AUDIO_PROVIDER -3
|
||||
#define AUDIO_PROVIDER_NOT_DETERMINED -99
|
||||
|
||||
class cAudioScriptObject;
|
||||
class CEntity;
|
||||
|
||||
|
@ -27,7 +30,8 @@ public:
|
|||
void PlayOneShot(int32 audioEntity, uint16 oneShot, float volume);
|
||||
void DestroyAllGameCreatedEntities(void);
|
||||
|
||||
void SetMonoMode(bool8 mono);
|
||||
void SetOutputMode(bool8 surround);
|
||||
void SetMP3BoostVolume(uint8 volume);
|
||||
void SetEffectsMasterVolume(uint8 volume);
|
||||
void SetMusicMasterVolume(uint8 volume);
|
||||
void SetEffectsFadeVol(uint8 volume);
|
||||
|
@ -36,6 +40,8 @@ public:
|
|||
uint8 GetNum3DProvidersAvailable(void);
|
||||
char *Get3DProviderName(uint8 id);
|
||||
|
||||
int8 AutoDetect3DProviders(void);
|
||||
|
||||
int8 GetCurrent3DProviderIndex(void);
|
||||
int8 SetCurrent3DProvider(uint8 which);
|
||||
|
||||
|
@ -65,27 +71,37 @@ public:
|
|||
void ReportCollision(CEntity *entityA, CEntity *entityB, uint8 surfaceTypeA, uint8 surfaceTypeB, float collisionPower, float velocity);
|
||||
|
||||
void PlayFrontEndSound(uint16 frontend, uint32 volume);
|
||||
void PlayRadioAnnouncement(uint8 announcement);
|
||||
void PlayFrontEndTrack(uint8 track, bool8 frontendFlag);
|
||||
void PlayRadioAnnouncement(uint32 announcement);
|
||||
void PlayFrontEndTrack(uint32 track, bool8 frontendFlag);
|
||||
void StopFrontEndTrack(void);
|
||||
|
||||
void ResetTimers(uint32 time);
|
||||
|
||||
void ChangeMusicMode(uint8 mode);
|
||||
|
||||
void PreloadCutSceneMusic(uint8 track);
|
||||
void PreloadCutSceneMusic(uint32 track);
|
||||
void PlayPreloadedCutSceneMusic(void);
|
||||
void StopCutSceneMusic(void);
|
||||
|
||||
void PreloadMissionAudio(Const char *missionAudio);
|
||||
uint8 GetMissionAudioLoadingStatus(void);
|
||||
void SetMissionAudioLocation(float x, float y, float z);
|
||||
void PlayLoadedMissionAudio(void);
|
||||
bool8 IsMissionAudioSampleFinished(void);
|
||||
void ClearMissionAudio(void);
|
||||
void PreloadMissionAudio(uint8 slot, Const char *missionAudio);
|
||||
uint8 GetMissionAudioLoadingStatus(uint8 slot);
|
||||
void SetMissionAudioLocation(uint8 slot, float x, float y, float z);
|
||||
void PlayLoadedMissionAudio(uint8 slot);
|
||||
bool8 IsMissionAudioSamplePlaying(uint8 slot);
|
||||
bool8 IsMissionAudioSampleFinished(uint8 slot);
|
||||
void ClearMissionAudio(uint8 slot);
|
||||
const char *GetMissionAudioLoadedLabel(uint8 slot);
|
||||
|
||||
uint8 GetRadioInCar(void);
|
||||
void SetRadioInCar(uint32 radio);
|
||||
void SetRadioChannel(uint8 radio, int32 pos);
|
||||
void SetRadioChannel(uint32 radio, int32 pos);
|
||||
|
||||
void SetStartingTrackPositions(bool8 isStartGame);
|
||||
float *GetListenTimeArray();
|
||||
uint32 GetFavouriteRadioStation();
|
||||
int32 GetRadioPosition(uint32 station);
|
||||
void SetPedTalkingStatus(class CPed *ped, bool8 status);
|
||||
void SetPlayersMood(uint8 mood, uint32 time);
|
||||
void ShutUpPlayerTalking(bool8 state);
|
||||
};
|
||||
extern cDMAudio DMAudio;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -11,41 +11,53 @@ public:
|
|||
};
|
||||
|
||||
class CVehicle;
|
||||
class CPed;
|
||||
|
||||
class cMusicManager
|
||||
{
|
||||
public:
|
||||
bool8 m_bIsInitialised;
|
||||
bool8 m_bDisabled;
|
||||
uint8 m_nMusicMode;
|
||||
uint8 m_nNextTrack;
|
||||
uint8 m_nPlayingTrack;
|
||||
bool8 m_bFrontendTrackFinished;
|
||||
bool8 m_bPlayInFrontend;
|
||||
bool8 m_bSetNextStation;
|
||||
uint8 m_nAnnouncement;
|
||||
bool8 m_bPreviousPlayerInCar;
|
||||
bool8 m_bPlayerInCar;
|
||||
uint8 m_nVolumeLatency;
|
||||
uint8 m_nCurrentVolume;
|
||||
uint8 m_nMaxVolume;
|
||||
uint32 m_nAnnouncement;
|
||||
bool8 m_bAnnouncementInProgress;
|
||||
tStreamedSample m_aTracks[TOTAL_STREAMED_SOUNDS];
|
||||
bool8 m_bResetTimers;
|
||||
uint32 m_nResetTime;
|
||||
uint32 m_nLastTrackServiceTime;
|
||||
uint32 m_nTimer;
|
||||
bool8 m_bDoTrackService;
|
||||
bool8 m_bIgnoreTimeDelay;
|
||||
bool8 m_bVerifyAmbienceTrackStartedToPlay;
|
||||
bool8 m_bRadioSetByScript;
|
||||
uint8 m_nRadioStationScript;
|
||||
int32 m_nRadioPosition;
|
||||
uint8 m_nRadioInCar;
|
||||
uint32 m_nRadioInCar;
|
||||
uint32 m_nFrontendTrack;
|
||||
uint32 m_nPlayingTrack;
|
||||
uint8 m_nUpcomingMusicMode;
|
||||
uint8 m_nMusicMode;
|
||||
bool8 m_FrontendLoopFlag;
|
||||
bool8 m_bTrackChangeStarted;
|
||||
uint32 m_nNextTrack;
|
||||
bool8 m_nNextLoopFlag;
|
||||
bool8 m_bVerifyNextTrackStartedToPlay;
|
||||
bool8 m_bGameplayAllowsRadio;
|
||||
bool8 m_bRadioStreamReady;
|
||||
int8 nFramesSinceCutsceneEnded;
|
||||
bool8 m_bUserResumedGame;
|
||||
bool8 m_bMusicModeChangeStarted;
|
||||
uint8 m_nMusicModeToBeSet;
|
||||
bool8 m_bEarlyFrontendTrack;
|
||||
float aListenTimeArray[NUM_RADIOS];
|
||||
float m_nLastTrackServiceTime;
|
||||
|
||||
public:
|
||||
cMusicManager();
|
||||
bool8 IsInitialised() { return m_bIsInitialised; }
|
||||
uint32 GetMusicMode() { return m_nMusicMode; }
|
||||
uint8 GetNextTrack() { return m_nNextTrack; }
|
||||
uint8 GetMusicMode() { return m_nMusicMode; }
|
||||
uint32 GetCurrentTrack() { return m_nPlayingTrack; }
|
||||
|
||||
void ResetMusicAfterReload();
|
||||
void SetStartingTrackPositions(bool8 isNewGameTimer);
|
||||
bool8 Initialise();
|
||||
void Terminate();
|
||||
|
||||
|
@ -55,35 +67,47 @@ public:
|
|||
bool8 PlayerInCar();
|
||||
void DisplayRadioStationName();
|
||||
|
||||
void PlayAnnouncement(uint8);
|
||||
void PlayFrontEndTrack(uint8, bool8);
|
||||
void PreloadCutSceneMusic(uint8);
|
||||
void PlayAnnouncement(uint32);
|
||||
void PlayFrontEndTrack(uint32, bool8);
|
||||
void PreloadCutSceneMusic(uint32);
|
||||
void PlayPreloadedCutSceneMusic(void);
|
||||
void StopCutSceneMusic(void);
|
||||
uint8 GetRadioInCar(void);
|
||||
uint32 GetRadioInCar(void);
|
||||
void SetRadioInCar(uint32);
|
||||
void SetRadioChannelByScript(uint8, int32);
|
||||
void SetRadioChannelByScript(uint32, int32);
|
||||
|
||||
void ResetMusicAfterReload();
|
||||
|
||||
void ResetTimers(int32);
|
||||
void ResetTimers(uint32);
|
||||
void Service();
|
||||
void ServiceFrontEndMode();
|
||||
void ServiceGameMode();
|
||||
void ServiceAmbience();
|
||||
void ServiceTrack();
|
||||
void ServiceTrack(CVehicle *veh, CPed *ped);
|
||||
|
||||
bool8 UsesPoliceRadio(CVehicle *veh);
|
||||
uint32 GetTrackStartPos(uint8);
|
||||
bool8 UsesTaxiRadio(CVehicle *veh);
|
||||
uint32 GetTrackStartPos(uint32 track);
|
||||
|
||||
void ComputeAmbienceVol(bool8 reset, uint8& outVolume);
|
||||
bool8 ServiceAnnouncement();
|
||||
|
||||
uint8 GetCarTuning();
|
||||
uint8 GetNextCarTuning();
|
||||
uint32 GetCarTuning();
|
||||
uint32 GetNextCarTuning();
|
||||
bool8 ChangeRadioChannel();
|
||||
void RecordRadioStats();
|
||||
void SetUpCorrectAmbienceTrack();
|
||||
float *GetListenTimeArray();
|
||||
uint32 GetRadioPosition(uint32 station);
|
||||
uint32 GetFavouriteRadioStation();
|
||||
void SetMalibuClubTrackPos(uint8 pos);
|
||||
void SetStripClubTrackPos(uint8 pos);
|
||||
bool8 CheckForMusicInterruptions();
|
||||
|
||||
void Enable();
|
||||
void Disable();
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(cMusicManager, 0x95C);
|
||||
|
||||
extern cMusicManager MusicManager;
|
||||
extern bool8 g_bAnnouncementReadPosAlready; // we have a symbol of this so it was declared in .h
|
||||
float GetHeightScale();
|
||||
|
|
|
@ -22,8 +22,6 @@ struct tPoliceRadioZone {
|
|||
};
|
||||
|
||||
tPoliceRadioZone ZoneSfx[NUMAUDIOZONES];
|
||||
char SubZo2Label[8];
|
||||
char SubZo3Label[8];
|
||||
|
||||
uint32 g_nMissionAudioSfx = TOTAL_AUDIO_SAMPLES;
|
||||
int8 g_nMissionAudioPlayingStatus = PLAY_STATUS_FINISHED;
|
||||
|
@ -40,46 +38,22 @@ cAudioManager::InitialisePoliceRadioZones()
|
|||
strcpy(ZoneSfx[i].m_aName, name); \
|
||||
ZoneSfx[i].m_nSampleIndex = sample;
|
||||
|
||||
SETZONESFX(0, "HOSPI_2", SFX_POLICE_RADIO_ROCKFORD);
|
||||
SETZONESFX(1, "CONSTRU", SFX_POLICE_RADIO_FORT_STAUNTON);
|
||||
SETZONESFX(2, "STADIUM", SFX_POLICE_RADIO_ASPATRIA);
|
||||
SETZONESFX(3, "YAKUSA", SFX_POLICE_RADIO_TORRINGTON);
|
||||
SETZONESFX(4, "SHOPING", SFX_POLICE_RADIO_BEDFORD_POINT);
|
||||
SETZONESFX(5, "COM_EAS", SFX_POLICE_RADIO_NEWPORT);
|
||||
SETZONESFX(6, "PARK", SFX_POLICE_RADIO_BELLEVILLE_PARK);
|
||||
SETZONESFX(7, "UNIVERS", SFX_POLICE_RADIO_LIBERTY_CAMPUS);
|
||||
SETZONESFX(8, "BIG_DAM", SFX_POLICE_RADIO_COCHRANE_DAM);
|
||||
SETZONESFX(9, "SUB_IND", SFX_POLICE_RADIO_PIKE_CREEK);
|
||||
SETZONESFX(10, "SWANKS", SFX_POLICE_RADIO_CEDAR_GROVE);
|
||||
SETZONESFX(11, "PROJECT", SFX_POLICE_RADIO_WICHITA_GARDENS);
|
||||
SETZONESFX(12, "AIRPORT", SFX_POLICE_RADIO_FRANCIS_INTERNATIONAL_AIRPORT);
|
||||
SETZONESFX(13, "PORT_W", SFX_POLICE_RADIO_CALLAHAN_POINT);
|
||||
SETZONESFX(14, "PORT_S", SFX_POLICE_RADIO_ATLANTIC_QUAYS);
|
||||
SETZONESFX(15, "PORT_E", SFX_POLICE_RADIO_PORTLAND_HARBOUR);
|
||||
SETZONESFX(16, "PORT_I", SFX_POLICE_RADIO_TRENTON);
|
||||
SETZONESFX(17, "CHINA", SFX_POLICE_RADIO_CHINATOWN);
|
||||
SETZONESFX(18, "REDLIGH", SFX_POLICE_RADIO_RED_LIGHT_DISTRICT);
|
||||
SETZONESFX(19, "TOWERS", SFX_POLICE_RADIO_HEPBURN_HEIGHTS);
|
||||
SETZONESFX(20, "LITTLEI", SFX_POLICE_RADIO_SAINT_MARKS);
|
||||
SETZONESFX(21, "HARWOOD", SFX_POLICE_RADIO_HARWOOD);
|
||||
SETZONESFX(22, "EASTBAY", SFX_POLICE_RADIO_PORTLAND_BEACH);
|
||||
SETZONESFX(23, "S_VIEW", SFX_POLICE_RADIO_PORTLAND_STRAIGHTS);
|
||||
SETZONESFX(24, "CITYZON", SFX_POLICE_RADIO_LIBERTY_CITY);
|
||||
SETZONESFX(25, "IND_ZON", SFX_POLICE_RADIO_PORTLAND);
|
||||
SETZONESFX(26, "COM_ZON", SFX_POLICE_RADIO_STAUNTON_ISLAND);
|
||||
SETZONESFX(27, "SUB_ZON", SFX_POLICE_RADIO_SHORESIDE_VALE);
|
||||
SETZONESFX(28, "SUB_ZO2", SFX_POLICE_RADIO_SHORESIDE_VALE);
|
||||
SETZONESFX(29, "SUB_ZO3", SFX_POLICE_RADIO_SHORESIDE_VALE);
|
||||
SETZONESFX(30, "A", SFX_POLICE_RADIO_ROCKFORD);
|
||||
SETZONESFX(31, "A", SFX_POLICE_RADIO_ROCKFORD);
|
||||
SETZONESFX(32, "A", SFX_POLICE_RADIO_ROCKFORD);
|
||||
SETZONESFX(33, "A", SFX_POLICE_RADIO_ROCKFORD);
|
||||
SETZONESFX(34, "A", SFX_POLICE_RADIO_ROCKFORD);
|
||||
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);
|
||||
|
||||
#undef SETZONESFX
|
||||
|
||||
strcpy(SubZo2Label, "SUB_ZO2");
|
||||
strcpy(SubZo3Label, "SUB_ZO3");
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -88,8 +62,9 @@ cAudioManager::InitialisePoliceRadio()
|
|||
m_sPoliceRadioQueue.Reset();
|
||||
for (int32 i = 0; i < ARRAY_SIZE(m_aCrimes); i++)
|
||||
m_aCrimes[i].type = CRIME_NONE;
|
||||
|
||||
#if !defined(GTA_PS2) || defined(AUDIO_REVERB)
|
||||
SampleManager.SetChannelReverbFlag(CHANNEL_POLICE_RADIO, FALSE);
|
||||
#endif
|
||||
gSpecialSuspectLastSeenReport = FALSE;
|
||||
for (int32 i = 0; i < ARRAY_SIZE(gMinTimeToNextReport); i++)
|
||||
gMinTimeToNextReport[i] = m_FrameCounter;
|
||||
|
@ -134,7 +109,7 @@ cAudioManager::DoPoliceRadioCrackle()
|
|||
SET_EMITTING_VOLUME(m_sQueueSample.m_nVolume);
|
||||
SET_LOOP_OFFSETS(SFX_POLICE_RADIO_CRACKLE)
|
||||
m_sQueueSample.m_bStatic = FALSE;
|
||||
m_sQueueSample.m_bReverb = FALSE;
|
||||
SET_SOUND_REVERB(FALSE);
|
||||
m_sQueueSample.m_nPan = 63;
|
||||
m_sQueueSample.m_nFramesToPlay = 3;
|
||||
SET_SOUND_REFLECTION(FALSE);
|
||||
|
@ -149,28 +124,31 @@ cAudioManager::ServicePoliceRadio()
|
|||
|
||||
if(!m_bIsInitialised) return;
|
||||
|
||||
if(!m_nUserPause) {
|
||||
if(!m_bIsPaused) {
|
||||
bool8 crimeReport = SetupCrimeReport();
|
||||
#ifdef FIX_BUGS // Crash at 0x5fe6ef
|
||||
if(CReplay::IsPlayingBack() || !FindPlayerPed() || !FindPlayerPed()->m_pWanted)
|
||||
return;
|
||||
#endif
|
||||
wantedLevel = FindPlayerPed()->m_pWanted->GetWantedLevel();
|
||||
if(!crimeReport) {
|
||||
if(wantedLevel != 0) {
|
||||
if(nLastSeen != 0) {
|
||||
CPlayerPed *playerPed = FindPlayerPed();
|
||||
if (playerPed) {
|
||||
wantedLevel = playerPed->m_pWanted->GetWantedLevel();
|
||||
if (!crimeReport) {
|
||||
if (wantedLevel != 0) {
|
||||
if (nLastSeen != 0)
|
||||
#ifdef FIX_BUGS
|
||||
nLastSeen -= CTimer::GetLogicalFramesPassed();
|
||||
#else
|
||||
--nLastSeen;
|
||||
nLastSeen--;
|
||||
#endif
|
||||
} else {
|
||||
else {
|
||||
nLastSeen = m_anRandomTable[1] % 1000 + 2000;
|
||||
SetupSuspectLastSeenReport();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ServicePoliceRadioChannel(wantedLevel);
|
||||
}
|
||||
|
||||
|
@ -179,23 +157,23 @@ cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
|
|||
{
|
||||
bool8 processed = FALSE;
|
||||
uint32 sample;
|
||||
int32 freq;
|
||||
uint32 freq;
|
||||
|
||||
static int cWait = 0;
|
||||
static bool8 bChannelOpen = FALSE;
|
||||
static uint8 bMissionAudioPhysicalPlayingStatus = PLAY_STATUS_STOPPED;
|
||||
static int32 PoliceChannelFreq = 5500;
|
||||
static uint32 PoliceChannelFreq = 22050;
|
||||
|
||||
if (!m_bIsInitialised) return;
|
||||
|
||||
if (m_nUserPause) {
|
||||
if (m_bIsPaused) {
|
||||
if (SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO)) SampleManager.StopChannel(CHANNEL_POLICE_RADIO);
|
||||
if (g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES && bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING &&
|
||||
if (g_nMissionAudioSfx != NO_SAMPLE && bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING &&
|
||||
SampleManager.IsStreamPlaying(1)) {
|
||||
SampleManager.PauseStream(TRUE, 1);
|
||||
}
|
||||
} else {
|
||||
if (m_nPreviousUserPause && g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES &&
|
||||
if (m_bWasPaused && g_nMissionAudioSfx != NO_SAMPLE &&
|
||||
bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_PLAYING) {
|
||||
SampleManager.PauseStream(FALSE, 1);
|
||||
}
|
||||
|
@ -208,7 +186,7 @@ cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
|
|||
#endif
|
||||
return;
|
||||
}
|
||||
if (g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES && !bChannelOpen) {
|
||||
if (g_nMissionAudioSfx != NO_SAMPLE && !bChannelOpen) {
|
||||
if (g_nMissionAudioPlayingStatus != PLAY_STATUS_STOPPED) {
|
||||
if (g_nMissionAudioPlayingStatus == PLAY_STATUS_PLAYING && bMissionAudioPhysicalPlayingStatus == PLAY_STATUS_STOPPED &&
|
||||
SampleManager.IsStreamPlaying(1)) {
|
||||
|
@ -220,7 +198,7 @@ cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
|
|||
} else {
|
||||
bMissionAudioPhysicalPlayingStatus = PLAY_STATUS_FINISHED;
|
||||
g_nMissionAudioPlayingStatus = PLAY_STATUS_FINISHED;
|
||||
g_nMissionAudioSfx = TOTAL_AUDIO_SAMPLES;
|
||||
g_nMissionAudioSfx = NO_SAMPLE;
|
||||
cWait = 30;
|
||||
}
|
||||
return;
|
||||
|
@ -235,25 +213,23 @@ cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
|
|||
}
|
||||
}
|
||||
if (bChannelOpen) DoPoliceRadioCrackle();
|
||||
if ((g_nMissionAudioSfx == TOTAL_AUDIO_SAMPLES || g_nMissionAudioPlayingStatus != PLAY_STATUS_PLAYING) &&
|
||||
if ((g_nMissionAudioSfx == NO_SAMPLE || g_nMissionAudioPlayingStatus != PLAY_STATUS_PLAYING) &&
|
||||
!SampleManager.GetChannelUsedFlag(CHANNEL_POLICE_RADIO) && m_sPoliceRadioQueue.m_nSamplesInQueue != 0) {
|
||||
sample = m_sPoliceRadioQueue.Remove();
|
||||
if (wantedLevel == 0) {
|
||||
if (gSpecialSuspectLastSeenReport) {
|
||||
gSpecialSuspectLastSeenReport = FALSE;
|
||||
} else if (((sample >= SFX_POLICE_RADIO_MESSAGE_NOISE_1) && (sample <= SFX_POLICE_RADIO_MESSAGE_NOISE_3)) || sample == TOTAL_AUDIO_SAMPLES) {
|
||||
} else if (sample == SFX_POLICE_RADIO_MESSAGE_NOISE_1) {
|
||||
bChannelOpen = FALSE;
|
||||
processed = TRUE;
|
||||
}
|
||||
}
|
||||
if (sample == TOTAL_AUDIO_SAMPLES) {
|
||||
if (sample == NO_SAMPLE) {
|
||||
if (!processed) cWait = 30;
|
||||
} else {
|
||||
SampleManager.InitialiseChannel(CHANNEL_POLICE_RADIO, sample, SFX_BANK_0);
|
||||
switch (sample) {
|
||||
case SFX_POLICE_RADIO_MESSAGE_NOISE_1:
|
||||
case SFX_POLICE_RADIO_MESSAGE_NOISE_2:
|
||||
case SFX_POLICE_RADIO_MESSAGE_NOISE_3:
|
||||
freq = m_anRandomTable[4] % 2000 + 10025;
|
||||
bChannelOpen = bChannelOpen == FALSE;
|
||||
break;
|
||||
|
@ -267,8 +243,8 @@ cAudioManager::ServicePoliceRadioChannel(uint8 wantedLevel)
|
|||
#endif
|
||||
SampleManager.SetChannelVolume(CHANNEL_POLICE_RADIO, 100);
|
||||
SampleManager.SetChannelPan(CHANNEL_POLICE_RADIO, 63);
|
||||
#ifndef GTA_PS2
|
||||
SampleManager.SetChannelLoopCount(CHANNEL_POLICE_RADIO, 1);
|
||||
#ifndef GTA_PS2
|
||||
SampleManager.SetChannelLoopPoints(CHANNEL_POLICE_RADIO, 0, -1);
|
||||
#endif
|
||||
SampleManager.StartChannel(CHANNEL_POLICE_RADIO);
|
||||
|
@ -312,23 +288,29 @@ cAudioManager::SetupCrimeReport()
|
|||
for (int j = 0; j < NUMAUDIOZONES; j++) {
|
||||
if (strcmp(zone->name, ZoneSfx[j].m_aName) == 0) {
|
||||
sampleIndex = ZoneSfx[j].m_nSampleIndex;
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[0] % 3 + SFX_WEVE_GOT);
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[1] % 2 + SFX_A_10_1);
|
||||
m_sPoliceRadioQueue.Add(SFX_A_10);
|
||||
switch (m_aCrimes[i].type) {
|
||||
case CRIME_PED_BURNED: m_aCrimes[i].type = CRIME_HIT_PED; break;
|
||||
case CRIME_COP_BURNED: m_aCrimes[i].type = CRIME_HIT_COP; break;
|
||||
case CRIME_PED_BURNED:
|
||||
case CRIME_HIT_PED_NASTYWEAPON:
|
||||
m_aCrimes[i].type = CRIME_HIT_PED;
|
||||
break;
|
||||
case CRIME_COP_BURNED:
|
||||
case CRIME_HIT_COP_NASTYWEAPON:
|
||||
m_aCrimes[i].type = CRIME_HIT_COP;
|
||||
break;
|
||||
case CRIME_VEHICLE_BURNED: m_aCrimes[i].type = CRIME_STEAL_CAR; break;
|
||||
case CRIME_DESTROYED_CESSNA: m_aCrimes[i].type = CRIME_SHOOT_HELI; break;
|
||||
case CRIME_EXPLOSION: m_aCrimes[i].type = CRIME_STEAL_CAR; break; // huh?
|
||||
default: break;
|
||||
}
|
||||
#ifdef FIX_BUGS
|
||||
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_CRIME_1 - 1);
|
||||
#else
|
||||
m_sPoliceRadioQueue.Add(m_aCrimes[i].type + SFX_CRIME_1);
|
||||
#endif
|
||||
m_sPoliceRadioQueue.Add(SFX_IN);
|
||||
if (sampleIndex == SFX_POLICE_RADIO_SHORESIDE_VALE &&
|
||||
(strcmp(zone->name, SubZo2Label) == 0 || strcmp(zone->name, SubZo3Label) == 0)) {
|
||||
m_sPoliceRadioQueue.Add(SFX_NORTH);
|
||||
m_sPoliceRadioQueue.Add(SFX_EAST);
|
||||
} else {
|
||||
rangeX = zone->maxx - zone->minx;
|
||||
rangeY = zone->maxy - zone->miny;
|
||||
halfX = 0.5f * rangeX + zone->minx;
|
||||
|
@ -352,9 +334,8 @@ cAudioManager::SetupCrimeReport()
|
|||
m_sPoliceRadioQueue.Add(SFX_CENTRAL);
|
||||
|
||||
m_sPoliceRadioQueue.Add(sampleIndex);
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[2] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
|
||||
}
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(NO_SAMPLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -364,173 +345,117 @@ cAudioManager::SetupCrimeReport()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
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},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_RED, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_ORANGE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_YELLOW, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_GREEN, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_BLUE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_PURPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{NO_SAMPLE, SFX_POLICE_RADIO_SILVER, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_LIGHT, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE},
|
||||
{SFX_POLICE_RADIO_DARK, NO_SAMPLE, NO_SAMPLE}
|
||||
};
|
||||
|
||||
void
|
||||
cAudioManager::SetupSuspectLastSeenReport()
|
||||
{
|
||||
CVehicle *veh;
|
||||
uint8 color1;
|
||||
int32 main_color;
|
||||
int32 sample;
|
||||
uint32 main_color;
|
||||
uint32 sample;
|
||||
|
||||
int32 color_pre_modifier;
|
||||
int32 color_post_modifier;
|
||||
|
||||
const int32 gCarColourTable[][3] = {
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLACK, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_WHITE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_BRIGHT, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_BLUE, SFX_POLICE_RADIO_GREY},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_RED, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_ORANGE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_YELLOW, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_GREEN, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_BLUE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_PURPLE, SFX_POLICE_RADIO_BLUE},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, SFX_POLICE_RADIO_GREY},
|
||||
#else
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_PURPLE, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
#ifdef FIX_BUGS
|
||||
{SFX_POLICE_RADIO_LIGHT, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
#else
|
||||
{TOTAL_AUDIO_SAMPLES, SFX_POLICE_RADIO_SILVER, TOTAL_AUDIO_SAMPLES},
|
||||
#endif
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_LIGHT, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES},
|
||||
{SFX_POLICE_RADIO_DARK, TOTAL_AUDIO_SAMPLES, TOTAL_AUDIO_SAMPLES}
|
||||
};
|
||||
uint32 color_pre_modifier;
|
||||
uint32 color_post_modifier;
|
||||
|
||||
if (MusicManager.m_nMusicMode != MUSICMODE_CUTSCENE) {
|
||||
veh = FindPlayerVehicle();
|
||||
veh = FindVehicleOfPlayer();
|
||||
if (veh != nil) {
|
||||
if (POLICE_RADIO_QUEUE_MAX_SAMPLES - m_sPoliceRadioQueue.m_nSamplesInQueue > 9) {
|
||||
color1 = veh->m_currentColour1;
|
||||
|
@ -541,136 +466,189 @@ cAudioManager::SetupSuspectLastSeenReport()
|
|||
color_pre_modifier = gCarColourTable[color1][0];
|
||||
color_post_modifier = gCarColourTable[color1][2];
|
||||
switch (veh->GetModelIndex()) {
|
||||
#ifdef FIX_BUGS
|
||||
case MI_COLUMB:
|
||||
main_color = SFX_POLICE_RADIO_BLUE;
|
||||
color_pre_modifier = color_post_modifier = TOTAL_AUDIO_SAMPLES;
|
||||
#endif
|
||||
case MI_LANDSTAL:
|
||||
case MI_BLISTA: sample = SFX_POLICE_RADIO_CRUISER; break;
|
||||
#ifdef FIX_BUGS
|
||||
case MI_YARDIE:
|
||||
color_pre_modifier = TOTAL_AUDIO_SAMPLES;
|
||||
main_color = SFX_POLICE_RADIO_RED;
|
||||
color_post_modifier = SFX_POLICE_RADIO_YELLOW;
|
||||
sample = SFX_POLICE_RADIO_CONVERTIBLE; break;
|
||||
case MI_DIABLOS:
|
||||
main_color = SFX_POLICE_RADIO_BLACK;
|
||||
#endif
|
||||
case MI_PATRIOT:
|
||||
case MI_RANCHER:
|
||||
case MI_FBIRANCH:
|
||||
case MI_SANDKING:
|
||||
sample = SFX_POLICE_RADIO_OFFROAD;
|
||||
break;
|
||||
case MI_IDAHO:
|
||||
case MI_STALLION: sample = SFX_POLICE_RADIO_CONVERTIBLE; break;
|
||||
#ifdef FIX_BUGS
|
||||
case MI_YAKUZA:
|
||||
color_pre_modifier = TOTAL_AUDIO_SAMPLES;
|
||||
main_color = SFX_POLICE_RADIO_SILVER;
|
||||
color_post_modifier = SFX_POLICE_RADIO_RED;
|
||||
#endif
|
||||
case MI_MANANA:
|
||||
case MI_ESPERANT:
|
||||
case MI_CUBAN:
|
||||
case MI_STALLION:
|
||||
case MI_SABRE:
|
||||
case MI_SABRETUR:
|
||||
case MI_VIRGO:
|
||||
case MI_BLISTAC:
|
||||
sample = SFX_POLICE_RADIO_TUDOOR;
|
||||
break;
|
||||
case MI_STINGER:
|
||||
case MI_INFERNUS:
|
||||
case MI_CHEETAH:
|
||||
case MI_BANSHEE: sample = SFX_POLICE_RADIO_SPORTS_CAR; break;
|
||||
#ifdef FIX_BUGS
|
||||
case MI_MAFIA:
|
||||
color_pre_modifier = color_post_modifier = TOTAL_AUDIO_SAMPLES;
|
||||
main_color = SFX_POLICE_RADIO_GREY;
|
||||
case MI_KURUMA:
|
||||
#endif
|
||||
case MI_PEREN:
|
||||
case MI_SENTINEL:
|
||||
case MI_FBICAR: sample = SFX_POLICE_RADIO_SALOON; break;
|
||||
case MI_PATRIOT:
|
||||
case MI_BOBCAT: sample = SFX_POLICE_RADIO_PICKUP; break;
|
||||
case MI_FIRETRUCK: sample = SFX_POLICE_RADIO_FIRE_TRUCK; break;
|
||||
#ifdef FIX_BUGS
|
||||
case MI_BANSHEE:
|
||||
case MI_PHEONIX:
|
||||
case MI_COMET:
|
||||
case MI_DELUXO:
|
||||
case MI_HOTRING:
|
||||
sample = SFX_POLICE_RADIO_SPORTS_CAR;
|
||||
break;
|
||||
case MI_LINERUN:
|
||||
case MI_FLATBED:
|
||||
#endif
|
||||
sample = SFX_POLICE_RADIO_RIG;
|
||||
break;
|
||||
case MI_PEREN:
|
||||
case MI_REGINA:
|
||||
sample = SFX_POLICE_RADIO_STATION_WAGON;
|
||||
break;
|
||||
case MI_SENTINEL:
|
||||
case MI_FBICAR:
|
||||
case MI_WASHING:
|
||||
case MI_SENTXS:
|
||||
case MI_ADMIRAL:
|
||||
case MI_GLENDALE:
|
||||
case MI_OCEANIC:
|
||||
case MI_HERMES:
|
||||
case MI_GREENWOO:
|
||||
sample = SFX_POLICE_RADIO_SEDAN;
|
||||
break;
|
||||
case MI_RIO:
|
||||
sample = SFX_POLICE_RADIO_CRUISER;
|
||||
break;
|
||||
case MI_FIRETRUCK:
|
||||
sample = SFX_POLICE_RADIO_FIRE_TRUCK;
|
||||
break;
|
||||
case MI_TRASH:
|
||||
case MI_BARRACKS: sample = SFX_POLICE_RADIO_TRUCK; break;
|
||||
case MI_STRETCH: sample = SFX_POLICE_RADIO_LIMO; break;
|
||||
#ifdef FIX_BUGS
|
||||
case MI_CORPSE:
|
||||
#endif
|
||||
case MI_MANANA:
|
||||
case MI_ESPERANT: sample = SFX_POLICE_RADIO_2_DOOR; break;
|
||||
#ifdef FIX_BUGS
|
||||
case MI_HOODS:
|
||||
color_pre_modifier = TOTAL_AUDIO_SAMPLES;
|
||||
main_color = SFX_POLICE_RADIO_BLUE;
|
||||
color_post_modifier = SFX_POLICE_RADIO_GREEN;
|
||||
case MI_BELLYUP:
|
||||
case MI_YANKEE:
|
||||
case MI_TOYZ:
|
||||
case MI_MRWONGS:
|
||||
case MI_PANLANT:
|
||||
#endif
|
||||
sample = SFX_POLICE_RADIO_GARBAGE_TRUCK;
|
||||
break;
|
||||
case MI_STRETCH:
|
||||
case MI_LOVEFIST:
|
||||
sample = SFX_POLICE_RADIO_STRETCH;
|
||||
break;
|
||||
case MI_VOODOO:
|
||||
sample = SFX_POLICE_RADIO_LOWRIDER;
|
||||
break;
|
||||
case MI_PONY:
|
||||
case MI_MULE:
|
||||
case MI_MOONBEAM:
|
||||
case MI_ENFORCER:
|
||||
case MI_SECURICA:
|
||||
case MI_RUMPO: sample = SFX_POLICE_RADIO_VAN; break;
|
||||
case MI_AMBULAN: sample = SFX_POLICE_RADIO_AMBULANCE; break;
|
||||
case MI_RUMPO:
|
||||
case MI_GANGBUR:
|
||||
case MI_YANKEE:
|
||||
case MI_TOPFUN:
|
||||
case MI_BURRITO:
|
||||
case MI_SPAND:
|
||||
sample = SFX_POLICE_RADIO_VAN;
|
||||
break;
|
||||
case MI_MULE:
|
||||
case MI_BARRACKS:
|
||||
case MI_PACKER:
|
||||
case MI_FLATBED:
|
||||
sample = SFX_POLICE_RADIO_TRUCK;
|
||||
break;
|
||||
case MI_AMBULAN:
|
||||
sample = SFX_POLICE_RADIO_AMBULANCE;
|
||||
break;
|
||||
case MI_TAXI:
|
||||
case MI_CABBIE:
|
||||
case MI_BORGNINE: sample = SFX_POLICE_RADIO_TAXI; break;
|
||||
case MI_ZEBRA:
|
||||
case MI_KAUFMAN:
|
||||
sample = SFX_POLICE_RADIO_TAXI;
|
||||
break;
|
||||
case MI_BOBCAT:
|
||||
case MI_WALTON:
|
||||
sample = SFX_POLICE_RADIO_PICKUP;
|
||||
break;
|
||||
case MI_MRWHOOP:
|
||||
sample = SFX_POLICE_RADIO_ICE_CREAM_VAN;
|
||||
break;
|
||||
case MI_BFINJECT: sample = SFX_POLICE_RADIO_BUGGY; break;
|
||||
case MI_POLICE: sample = SFX_POLICE_RADIO_POLICE_CAR; break;
|
||||
#ifdef FIX_BUGS
|
||||
case MI_BFINJECT:
|
||||
sample = SFX_POLICE_RADIO_BUGGY;
|
||||
break;
|
||||
case MI_HUNTER:
|
||||
case MI_CHOPPER:
|
||||
case MI_SEASPAR:
|
||||
case MI_SPARROW:
|
||||
case MI_MAVERICK:
|
||||
case MI_VCNMAV:
|
||||
case MI_POLMAV:
|
||||
sample = SFX_POLICE_RADIO_HELICOPTER;
|
||||
break;
|
||||
case MI_POLICE:
|
||||
sample = SFX_POLICE_RADIO_POLICE_CAR;
|
||||
break;
|
||||
case MI_ENFORCER:
|
||||
sample = SFX_POLICE_RADIO_SWAT_VAN;
|
||||
break;
|
||||
case MI_PREDATOR:
|
||||
case MI_SQUALO:
|
||||
case MI_SPEEDER:
|
||||
case MI_REEFER:
|
||||
case MI_GHOST:
|
||||
#endif
|
||||
case MI_PREDATOR: sample = SFX_POLICE_RADIO_BOAT; break;
|
||||
sample = SFX_POLICE_RADIO_SPEEDBOAT;
|
||||
break;
|
||||
case MI_BUS:
|
||||
case MI_COACH: sample = SFX_POLICE_RADIO_BUS; break;
|
||||
sample = SFX_POLICE_RADIO_BUS;
|
||||
break;
|
||||
case MI_RHINO:
|
||||
sample = SFX_POLICE_RADIO_TANK;
|
||||
main_color = TOTAL_AUDIO_SAMPLES;
|
||||
color_post_modifier = TOTAL_AUDIO_SAMPLES;
|
||||
break;
|
||||
case MI_TRAIN:
|
||||
sample = SFX_POLICE_RADIO_SUBWAY_CAR;
|
||||
main_color = TOTAL_AUDIO_SAMPLES;
|
||||
color_post_modifier = TOTAL_AUDIO_SAMPLES;
|
||||
|
||||
case MI_ANGEL:
|
||||
case MI_PCJ600:
|
||||
case MI_FREEWAY:
|
||||
case MI_SANCHEZ:
|
||||
sample = SFX_POLICE_RADIO_MOTOBIKE;
|
||||
break;
|
||||
case MI_COACH:
|
||||
sample = SFX_POLICE_RADIO_COACH;
|
||||
break;
|
||||
case MI_ROMERO:
|
||||
sample = SFX_POLICE_RADIO_HEARSE;
|
||||
break;
|
||||
case MI_PIZZABOY:
|
||||
case MI_FAGGIO:
|
||||
sample = SFX_POLICE_RADIO_MOPED;
|
||||
break;
|
||||
case MI_DEADDODO:
|
||||
case MI_SKIMMER:
|
||||
sample = SFX_POLICE_RADIO_PLANE;
|
||||
break;
|
||||
case MI_REEFER:
|
||||
case MI_TROPIC:
|
||||
case MI_COASTG:
|
||||
case MI_MARQUIS:
|
||||
case MI_JETMAX:
|
||||
sample = SFX_POLICE_RADIO_BOAT;
|
||||
break;
|
||||
case MI_CADDY:
|
||||
sample = SFX_POLICE_RADIO_GOLF_CART;
|
||||
break;
|
||||
case MI_DINGHY:
|
||||
sample = SFX_POLICE_RADIO_DINGHY;
|
||||
break;
|
||||
default:
|
||||
debug("\n *** UNKNOWN CAR MODEL INDEX %d *** ", veh->GetModelIndex());
|
||||
//debug("\n *** UNKNOWN CAR MODEL INDEX %d *** ", veh->GetModelIndex());
|
||||
return;
|
||||
}
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT);
|
||||
if (m_anRandomTable[3] % 2)
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_LAST_SEEN);
|
||||
#ifdef FIX_BUGS
|
||||
if (main_color == SFX_POLICE_RADIO_ORANGE && color_pre_modifier == TOTAL_AUDIO_SAMPLES)
|
||||
#else
|
||||
if (main_color == SFX_POLICE_RADIO_ORANGE)
|
||||
#endif
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_IN_AN);
|
||||
else
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_IN_A);
|
||||
if (color_pre_modifier != TOTAL_AUDIO_SAMPLES)
|
||||
if (color_pre_modifier != NO_SAMPLE)
|
||||
m_sPoliceRadioQueue.Add(color_pre_modifier);
|
||||
if (main_color != TOTAL_AUDIO_SAMPLES)
|
||||
if (main_color != NO_SAMPLE)
|
||||
m_sPoliceRadioQueue.Add(main_color);
|
||||
if (color_post_modifier != TOTAL_AUDIO_SAMPLES)
|
||||
if (color_post_modifier != NO_SAMPLE)
|
||||
m_sPoliceRadioQueue.Add(color_post_modifier);
|
||||
m_sPoliceRadioQueue.Add(sample);
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[0] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(NO_SAMPLE);
|
||||
}
|
||||
}
|
||||
} else if (POLICE_RADIO_QUEUE_MAX_SAMPLES - m_sPoliceRadioQueue.m_nSamplesInQueue > 4) {
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_ON_FOOT);
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[0] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(NO_SAMPLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -688,10 +666,9 @@ cAudioManager::ReportCrime(eCrimeType type, const CVector &pos)
|
|||
m_aCrimes[i].timer = 0;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
} else
|
||||
lastCrime = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (lastCrime < ARRAY_SIZE(m_aCrimes)) {
|
||||
m_aCrimes[lastCrime].type = type;
|
||||
|
@ -713,8 +690,8 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
|
|||
float halfY;
|
||||
float quarterX;
|
||||
float quarterY;
|
||||
int32 sample;
|
||||
bool8 processed = false;
|
||||
uint32 sample;
|
||||
bool8 processed = FALSE;
|
||||
CVector vec = CVector(x, y, z);
|
||||
|
||||
if (!m_bIsInitialised) return;
|
||||
|
@ -726,16 +703,10 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
|
|||
for (int i = 0; i < NUMAUDIOZONES; i++) {
|
||||
if (strcmp(zone->name, ZoneSfx[i].m_aName) == 0) {
|
||||
sample = ZoneSfx[i].m_nSampleIndex;
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_LAST_SEEN);
|
||||
m_sPoliceRadioQueue.Add(SFX_IN);
|
||||
if (sample == SFX_POLICE_RADIO_SHORESIDE_VALE &&
|
||||
(strcmp(zone->name, SubZo2Label) == 0 ||
|
||||
strcmp(zone->name, SubZo3Label) == 0)) {
|
||||
m_sPoliceRadioQueue.Add(SFX_NORTH);
|
||||
m_sPoliceRadioQueue.Add(SFX_EAST);
|
||||
} else {
|
||||
rangeX = zone->maxx - zone->minx;
|
||||
rangeY = zone->maxy - zone->miny;
|
||||
halfX = 0.5f * rangeX + zone->minx;
|
||||
|
@ -757,10 +728,9 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
|
|||
m_sPoliceRadioQueue.Add(SFX_WEST);
|
||||
else if (!processed)
|
||||
m_sPoliceRadioQueue.Add(SFX_CENTRAL);
|
||||
}
|
||||
m_sPoliceRadioQueue.Add(sample);
|
||||
m_sPoliceRadioQueue.Add(m_anRandomTable[2] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
|
||||
m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
|
||||
m_sPoliceRadioQueue.Add(NO_SAMPLE);
|
||||
gSpecialSuspectLastSeenReport = TRUE;
|
||||
break;
|
||||
}
|
||||
|
@ -774,7 +744,7 @@ cAudioManager::AgeCrimes()
|
|||
{
|
||||
for (uint8 i = 0; i < ARRAY_SIZE(m_aCrimes); i++) {
|
||||
if (m_aCrimes[i].type != CRIME_NONE) {
|
||||
if (++m_aCrimes[i].timer > 1500) m_aCrimes[i].type = CRIME_NONE;
|
||||
if (++m_aCrimes[i].timer > 1200) m_aCrimes[i].type = CRIME_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,8 +59,9 @@ public:
|
|||
m_nRemoveOffset = (m_nRemoveOffset + 1) % POLICE_RADIO_QUEUE_MAX_SAMPLES;
|
||||
return sample;
|
||||
}
|
||||
return TOTAL_AUDIO_SAMPLES;
|
||||
return NO_SAMPLE;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(cPoliceRadioQueue, 244);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -511,6 +511,13 @@ protected:
|
|||
uint32 m_nChannels;
|
||||
const char* m_pPath;
|
||||
bool m_bFileNotOpenedYet;
|
||||
|
||||
CMP3File() :
|
||||
m_pMH(nil),
|
||||
m_bOpened(false),
|
||||
m_nRate(0),
|
||||
m_bFileNotOpenedYet(false),
|
||||
m_nChannels(0) {}
|
||||
public:
|
||||
CMP3File(const char *path) :
|
||||
m_pMH(nil),
|
||||
|
@ -618,6 +625,69 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class CADFFile : public CMP3File
|
||||
{
|
||||
static ssize_t r_read(void* fh, void* buf, size_t size)
|
||||
{
|
||||
size_t bytesRead = fread(buf, 1, size, (FILE*)fh);
|
||||
uint8* _buf = (uint8*)buf;
|
||||
for (size_t i = 0; i < size; i++)
|
||||
_buf[i] ^= 0x22;
|
||||
return bytesRead;
|
||||
}
|
||||
static off_t r_seek(void* fh, off_t pos, int seekType)
|
||||
{
|
||||
fseek((FILE*)fh, pos, seekType);
|
||||
return ftell((FILE*)fh);
|
||||
}
|
||||
static void r_close(void* fh)
|
||||
{
|
||||
fclose((FILE*)fh);
|
||||
}
|
||||
public:
|
||||
CADFFile(const char* path)
|
||||
{
|
||||
m_pMH = mpg123_new(nil, nil);
|
||||
if (m_pMH)
|
||||
{
|
||||
mpg123_param(m_pMH, MPG123_FLAGS, MPG123_SEEKBUFFER | MPG123_GAPLESS, 0.0);
|
||||
|
||||
m_bOpened = true;
|
||||
m_bFileNotOpenedYet = true;
|
||||
m_pPath = path;
|
||||
// It's possible to move this to audioFileOpsThread(), but effect isn't noticable + probably not compatible with our current cutscene audio handling
|
||||
#if 1
|
||||
FileOpen();
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void FileOpen()
|
||||
{
|
||||
if(!m_bFileNotOpenedYet) return;
|
||||
|
||||
long rate = 0;
|
||||
int channels = 0;
|
||||
int encoding = 0;
|
||||
|
||||
FILE *f = fopen(m_pPath, "rb");
|
||||
|
||||
m_bOpened = f && mpg123_replace_reader_handle(m_pMH, r_read, r_seek, r_close) == MPG123_OK
|
||||
&& mpg123_open_handle(m_pMH, f) == MPG123_OK && mpg123_getformat(m_pMH, &rate, &channels, &encoding) == MPG123_OK;
|
||||
|
||||
m_nRate = rate;
|
||||
m_nChannels = channels;
|
||||
|
||||
if(IsOpened()) {
|
||||
mpg123_format_none(m_pMH);
|
||||
mpg123_format(m_pMH, rate, channels, encoding);
|
||||
}
|
||||
|
||||
m_bFileNotOpenedYet = false;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
#define VAG_LINE_SIZE (0x10)
|
||||
#define VAG_SAMPLES_IN_LINE (28)
|
||||
|
@ -1208,6 +1278,8 @@ bool CStream::Open(const char* filename, uint32 overrideSampleRate)
|
|||
#ifdef AUDIO_OAL_USE_MPG123
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".mp3")], ".mp3"))
|
||||
m_pSoundFile = new CMP3File(m_aFilename);
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".adf")], ".adf"))
|
||||
m_pSoundFile = new CADFFile(m_aFilename);
|
||||
#endif
|
||||
else if (!strcasecmp(&m_aFilename[strlen(m_aFilename) - strlen(".vb")], ".VB"))
|
||||
m_pSoundFile = new CVbFile(m_aFilename, overrideSampleRate);
|
||||
|
|
3042
src/audio/sampman.h
3042
src/audio/sampman.h
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -115,6 +115,11 @@ cSampleManager::SetMusicMasterVolume(uint8 nVolume)
|
|||
{
|
||||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetMP3BoostVolume(uint8 nVolume)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetEffectsFadeVolume(uint8 nVolume)
|
||||
{
|
||||
|
@ -126,7 +131,7 @@ cSampleManager::SetMusicFadeVolume(uint8 nVolume)
|
|||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetMonoMode(uint8 nMode)
|
||||
cSampleManager::SetMonoMode(bool8 nMode)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -143,20 +148,36 @@ cSampleManager::UnloadSampleBank(uint8 nBank)
|
|||
ASSERT( nBank < MAX_SFX_BANKS );
|
||||
}
|
||||
|
||||
bool8
|
||||
int8
|
||||
cSampleManager::IsSampleBankLoaded(uint8 nBank)
|
||||
{
|
||||
ASSERT( nBank < MAX_SFX_BANKS );
|
||||
|
||||
return FALSE;
|
||||
return LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
|
||||
uint8
|
||||
cSampleManager::IsMissionAudioLoaded(uint8 nSlot, uint32 nSample)
|
||||
{
|
||||
ASSERT(nSlot < MISSION_AUDIO_COUNT);
|
||||
|
||||
return LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
|
||||
bool8
|
||||
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
|
||||
{
|
||||
ASSERT(nSlot < MISSION_AUDIO_COUNT);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
uint8
|
||||
cSampleManager::IsPedCommentLoaded(uint32 nComment)
|
||||
{
|
||||
ASSERT( nComment < TOTAL_AUDIO_SAMPLES );
|
||||
|
||||
return FALSE;
|
||||
return LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
|
||||
|
||||
|
@ -179,14 +200,14 @@ cSampleManager::GetBankContainingSound(uint32 offset)
|
|||
return INVALID_SFX_BANK;
|
||||
}
|
||||
|
||||
int32
|
||||
uint32
|
||||
cSampleManager::GetSampleBaseFrequency(uint32 nSample)
|
||||
{
|
||||
ASSERT( nSample < TOTAL_AUDIO_SAMPLES );
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32
|
||||
uint32
|
||||
cSampleManager::GetSampleLoopStartOffset(uint32 nSample)
|
||||
{
|
||||
ASSERT( nSample < TOTAL_AUDIO_SAMPLES );
|
||||
|
@ -301,7 +322,7 @@ cSampleManager::StopChannel(uint32 nChannel)
|
|||
}
|
||||
|
||||
void
|
||||
cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
|
||||
cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream)
|
||||
{
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
}
|
||||
|
@ -319,7 +340,7 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
|
|||
}
|
||||
|
||||
bool8
|
||||
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
||||
cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
{
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
|
||||
|
@ -341,7 +362,7 @@ cSampleManager::GetStreamedFilePosition(uint8 nStream)
|
|||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffectFlag, uint8 nStream)
|
||||
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, bool8 nEffectFlag, uint8 nStream)
|
||||
{
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
}
|
||||
|
@ -369,4 +390,14 @@ cSampleManager::InitialiseSampleBanks(void)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetStreamedFileLoopFlag(bool8 nLoopFlag, uint8 nChannel)
|
||||
{
|
||||
}
|
||||
|
||||
int8 cSampleManager::AutoDetect3DProviders()
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -92,7 +92,7 @@ OggOpusFile *fpSampleDataHandle;
|
|||
#else
|
||||
FILE *fpSampleDataHandle;
|
||||
#endif
|
||||
bool8 bSampleBankLoaded [MAX_SFX_BANKS];
|
||||
int8 gBankLoaded [MAX_SFX_BANKS];
|
||||
int32 nSampleBankDiscStartOffset [MAX_SFX_BANKS];
|
||||
int32 nSampleBankSize [MAX_SFX_BANKS];
|
||||
uintptr nSampleBankMemoryStartAddress[MAX_SFX_BANKS];
|
||||
|
@ -102,6 +102,11 @@ int32 nPedSlotSfx [MAX_PEDSFX];
|
|||
int32 nPedSlotSfxAddr[MAX_PEDSFX];
|
||||
uint8 nCurrentPedSlot;
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
uint32 gPlayerTalkSfx = UINT32_MAX;
|
||||
void *gPlayerTalkData = 0;
|
||||
#endif
|
||||
|
||||
CChannel aChannel[NUM_CHANNELS];
|
||||
uint8 nChannelVolume[NUM_CHANNELS];
|
||||
|
||||
|
@ -126,6 +131,7 @@ char _mp3DirectoryPath[MAX_PATH];
|
|||
CStream *aStream[MAX_STREAMS];
|
||||
uint8 nStreamPan [MAX_STREAMS];
|
||||
uint8 nStreamVolume[MAX_STREAMS];
|
||||
bool8 nStreamLoopedFlag[MAX_STREAMS];
|
||||
uint32 _CurMP3Index;
|
||||
int32 _CurMP3Pos;
|
||||
bool8 _bIsMp3Active;
|
||||
|
@ -300,7 +306,7 @@ set_new_provider(int index)
|
|||
static bool8
|
||||
IsThisTrackAt16KHz(uint32 track)
|
||||
{
|
||||
return track == STREAMED_SOUND_RADIO_CHAT;
|
||||
return track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE;
|
||||
}
|
||||
|
||||
cSampleManager::cSampleManager(void)
|
||||
|
@ -365,6 +371,31 @@ int8 cSampleManager::SetCurrent3DProvider(uint8 nProvider)
|
|||
return curprovider;
|
||||
}
|
||||
|
||||
int8
|
||||
cSampleManager::AutoDetect3DProviders()
|
||||
{
|
||||
if (!AudioManager.IsAudioInitialised())
|
||||
return -1;
|
||||
|
||||
if (defaultProvider >= 0 && defaultProvider < m_nNumberOfProviders) {
|
||||
if (set_new_provider(defaultProvider))
|
||||
return defaultProvider;
|
||||
}
|
||||
|
||||
for (uint32 i = 0; i < GetNum3DProvidersAvailable(); i++)
|
||||
{
|
||||
char* providername = Get3DProviderName(i);
|
||||
|
||||
if (!strcasecmp(providername, "OPENAL SOFT")) {
|
||||
SetCurrent3DProvider(i);
|
||||
if (GetCurrent3DProviderIndex() == i)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static bool8
|
||||
_ResolveLink(char const *path, char *out)
|
||||
{
|
||||
|
@ -781,7 +812,7 @@ cSampleManager::Initialise(void)
|
|||
|
||||
for ( int32 i = 0; i < MAX_SFX_BANKS; i++ )
|
||||
{
|
||||
bSampleBankLoaded[i] = FALSE;
|
||||
gBankLoaded[i] = LOADING_STATUS_NOT_LOADED;
|
||||
nSampleBankDiscStartOffset[i] = 0;
|
||||
nSampleBankSize[i] = 0;
|
||||
nSampleBankMemoryStartAddress[i] = 0;
|
||||
|
@ -894,14 +925,15 @@ cSampleManager::Initialise(void)
|
|||
|
||||
for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ )
|
||||
{
|
||||
if(aStream[0] && (
|
||||
if ( aStream[0] && (
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
aStream[0]->Open(PS2StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000) ||
|
||||
#endif
|
||||
aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000)))
|
||||
aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000)) )
|
||||
{
|
||||
uint32 tatalms = aStream[0]->GetLengthMS();
|
||||
aStream[0]->Close();
|
||||
|
||||
nStreamLength[i] = tatalms;
|
||||
} else
|
||||
USERERROR("Can't open '%s'\n", StreamedNameTable[i]);
|
||||
|
@ -937,6 +969,16 @@ cSampleManager::Initialise(void)
|
|||
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX);
|
||||
ASSERT(nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] != 0);
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
// Find biggest player comment
|
||||
uint32 nMaxPedSize = 0;
|
||||
for (uint32 i = PLAYER_COMMENTS_START; i <= PLAYER_COMMENTS_END; i++)
|
||||
nMaxPedSize = Max(nMaxPedSize, m_aSamples[i].nSize);
|
||||
|
||||
gPlayerTalkData = malloc(nMaxPedSize);
|
||||
ASSERT(gPlayerTalkData != 0);
|
||||
#endif
|
||||
|
||||
LoadSampleBank(SFX_BANK_0);
|
||||
}
|
||||
|
||||
|
@ -1097,6 +1139,14 @@ cSampleManager::Terminate(void)
|
|||
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = 0;
|
||||
}
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
if ( gPlayerTalkData != 0 )
|
||||
{
|
||||
free(gPlayerTalkData);
|
||||
gPlayerTalkData = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
_bSampmanInitialised = FALSE;
|
||||
}
|
||||
|
||||
|
@ -1139,6 +1189,12 @@ cSampleManager::SetMusicMasterVolume(uint8 nVolume)
|
|||
m_nMusicVolume = nVolume;
|
||||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetMP3BoostVolume(uint8 nVolume)
|
||||
{
|
||||
m_nMP3BoostVolume = nVolume;
|
||||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetEffectsFadeVolume(uint8 nVolume)
|
||||
{
|
||||
|
@ -1153,7 +1209,7 @@ cSampleManager::SetMusicFadeVolume(uint8 nVolume)
|
|||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetMonoMode(uint8 nMode)
|
||||
cSampleManager::SetMonoMode(bool8 nMode)
|
||||
{
|
||||
m_nMonoMode = nMode;
|
||||
}
|
||||
|
@ -1194,7 +1250,7 @@ cSampleManager::LoadSampleBank(uint8 nBank)
|
|||
if ( fread((void *)nSampleBankMemoryStartAddress[nBank], 1, nSampleBankSize[nBank], fpSampleDataHandle) != nSampleBankSize[nBank] )
|
||||
return FALSE;
|
||||
#endif
|
||||
bSampleBankLoaded[nBank] = TRUE;
|
||||
gBankLoaded[nBank] = LOADING_STATUS_LOADED;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -1204,18 +1260,45 @@ cSampleManager::UnloadSampleBank(uint8 nBank)
|
|||
{
|
||||
ASSERT( nBank < MAX_SFX_BANKS);
|
||||
|
||||
bSampleBankLoaded[nBank] = FALSE;
|
||||
gBankLoaded[nBank] = LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
|
||||
bool8
|
||||
int8
|
||||
cSampleManager::IsSampleBankLoaded(uint8 nBank)
|
||||
{
|
||||
ASSERT( nBank < MAX_SFX_BANKS);
|
||||
|
||||
return bSampleBankLoaded[nBank];
|
||||
return gBankLoaded[nBank];
|
||||
}
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
uint8
|
||||
cSampleManager::IsMissionAudioLoaded(uint8 nSlot, uint32 nSample)
|
||||
{
|
||||
ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
|
||||
|
||||
return nSample == gPlayerTalkSfx ? LOADING_STATUS_LOADED : LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
|
||||
bool8
|
||||
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
|
||||
{
|
||||
ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
|
||||
ASSERT(nSample < TOTAL_AUDIO_SAMPLES);
|
||||
|
||||
if (fseek(fpSampleDataHandle, m_aSamples[nSample].nOffset, SEEK_SET) != 0)
|
||||
return FALSE;
|
||||
|
||||
if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
|
||||
return FALSE;
|
||||
|
||||
gPlayerTalkSfx = nSample;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8
|
||||
cSampleManager::IsPedCommentLoaded(uint32 nComment)
|
||||
{
|
||||
ASSERT( nComment < TOTAL_AUDIO_SAMPLES );
|
||||
|
@ -1230,10 +1313,10 @@ cSampleManager::IsPedCommentLoaded(uint32 nComment)
|
|||
uint8 slot = nCurrentPedSlot - i - 1;
|
||||
#endif
|
||||
if ( nComment == nPedSlotSfx[slot] )
|
||||
return TRUE;
|
||||
return LOADING_STATUS_LOADED;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return LOADING_STATUS_NOT_LOADED;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1275,14 +1358,6 @@ cSampleManager::LoadPedComment(uint32 nComment)
|
|||
|
||||
break;
|
||||
}
|
||||
|
||||
case MUSICMODE_FRONTEND:
|
||||
{
|
||||
if ( MusicManager.GetNextTrack() == STREAMED_SOUND_GAME_COMPLETED )
|
||||
return FALSE;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1291,7 +1366,7 @@ cSampleManager::LoadPedComment(uint32 nComment)
|
|||
int samplesSize = m_aSamples[nComment].nSize / 2;
|
||||
op_pcm_seek(fpSampleDataHandle, m_aSamples[nComment].nOffset / 2);
|
||||
while (samplesSize > 0) {
|
||||
int size = op_read(fpSampleDataHandle, (opus_int16 *)(nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] + PED_BLOCKSIZE * nCurrentPedSlot + samplesRead),
|
||||
int size = op_read(fpSampleDataHandle, (opus_int16 *)(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] + PED_BLOCKSIZE * nCurrentPedSlot + samplesRead),
|
||||
samplesSize, NULL);
|
||||
if (size <= 0) {
|
||||
return FALSE;
|
||||
|
@ -1327,14 +1402,14 @@ cSampleManager::GetBankContainingSound(uint32 offset)
|
|||
return INVALID_SFX_BANK;
|
||||
}
|
||||
|
||||
int32
|
||||
uint32
|
||||
cSampleManager::GetSampleBaseFrequency(uint32 nSample)
|
||||
{
|
||||
ASSERT( nSample < TOTAL_AUDIO_SAMPLES );
|
||||
return m_aSamples[nSample].nFrequency;
|
||||
}
|
||||
|
||||
int32
|
||||
uint32
|
||||
cSampleManager::GetSampleLoopStartOffset(uint32 nSample)
|
||||
{
|
||||
ASSERT( nSample < TOTAL_AUDIO_SAMPLES );
|
||||
|
@ -1363,29 +1438,25 @@ bool8 cSampleManager::UpdateReverb(void)
|
|||
if ( AudioManager.m_FrameCounter & 15 )
|
||||
return FALSE;
|
||||
|
||||
float fRatio = 0.0f;
|
||||
|
||||
#ifdef AUDIO_REFLECTIONS
|
||||
float y = AudioManager.m_afReflectionsDistances[REFLECTION_TOP] + AudioManager.m_afReflectionsDistances[REFLECTION_BOTTOM];
|
||||
float x = AudioManager.m_afReflectionsDistances[REFLECTION_LEFT] + AudioManager.m_afReflectionsDistances[REFLECTION_RIGHT];
|
||||
float z = AudioManager.m_afReflectionsDistances[REFLECTION_UP];
|
||||
#else
|
||||
float x = 0.0f;
|
||||
float y = 0.0f;
|
||||
float z = 0.0f;
|
||||
#define MIN_DIST 0.5f
|
||||
#define CALCULATE_RATIO(value, maxDist, maxRatio) (value > MIN_DIST && value < maxDist ? value / maxDist * maxRatio : 0)
|
||||
|
||||
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_NORTH], 10.0f, 1/2.f);
|
||||
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_SOUTH], 10.0f, 1/2.f);
|
||||
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_WEST], 10.0f, 1/2.f);
|
||||
fRatio += CALCULATE_RATIO(AudioManager.m_afReflectionsDistances[REFLECTION_CEIL_EAST], 10.0f, 1/2.f);
|
||||
|
||||
fRatio += CALCULATE_RATIO((AudioManager.m_afReflectionsDistances[REFLECTION_NORTH] + AudioManager.m_afReflectionsDistances[REFLECTION_SOUTH]) / 2.f, 4.0f, 1/3.f);
|
||||
fRatio += CALCULATE_RATIO((AudioManager.m_afReflectionsDistances[REFLECTION_WEST] + AudioManager.m_afReflectionsDistances[REFLECTION_EAST]) / 2.f, 4.0f, 1/3.f);
|
||||
|
||||
#undef CALCULATE_RATIO
|
||||
#undef MIN_DIST
|
||||
#endif
|
||||
|
||||
float normy = norm(y, 5.0f, 40.0f);
|
||||
float normx = norm(x, 5.0f, 40.0f);
|
||||
float normz = norm(z, 5.0f, 40.0f);
|
||||
|
||||
#define ZR(v, a, b) (((v)==0)?(a):(b))
|
||||
#define CALCRATIO(x,y,z,min,max,val) (ZR(y, ZR(x, ZR(z, min, max), min), ZR(x, ZR(z, min, max), ZR(z, min, val))))
|
||||
|
||||
float fRatio = CALCRATIO(normx, normy, normz, 0.3f, 0.5f, (normy+normx+normz)/3.0f);
|
||||
|
||||
#undef CALCRATIO
|
||||
#undef ZR
|
||||
|
||||
fRatio = Clamp(fRatio, usingEAX3==1 ? 0.0f : 0.30f, 1.0f);
|
||||
fRatio = Clamp(fRatio, 0.0f, 0.6f);
|
||||
|
||||
if ( fRatio == _fPrevEaxRatioDestination )
|
||||
return FALSE;
|
||||
|
@ -1396,6 +1467,7 @@ bool8 cSampleManager::UpdateReverb(void)
|
|||
if ( usingEAX3 )
|
||||
#endif
|
||||
{
|
||||
fRatio = Min(fRatio * 1.67f, 1.0f);
|
||||
if ( EAX3ListenerInterpolate(&StartEAX3, &FinishEAX3, fRatio, &EAX3Params, false) )
|
||||
{
|
||||
EAX_SetAll(&EAX3Params);
|
||||
|
@ -1410,16 +1482,17 @@ bool8 cSampleManager::UpdateReverb(void)
|
|||
}
|
||||
*/
|
||||
|
||||
_fEffectsLevel = 1.0f - fRatio * 0.5f;
|
||||
_fEffectsLevel = fRatio * 0.75f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( _usingEFX )
|
||||
_fEffectsLevel = (1.0f - fRatio) * 0.4f;
|
||||
_fEffectsLevel = fRatio * 0.8f;
|
||||
else
|
||||
_fEffectsLevel = (1.0f - fRatio) * 0.7f;
|
||||
_fEffectsLevel = fRatio * 0.22f;
|
||||
}
|
||||
_fEffectsLevel = Min(_fEffectsLevel, 1.0f);
|
||||
|
||||
_fPrevEaxRatioDestination = fRatio;
|
||||
|
||||
|
@ -1459,13 +1532,34 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
|||
|
||||
addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset;
|
||||
}
|
||||
else
|
||||
#ifdef FIX_BUGS
|
||||
else if ( nSfx >= PLAYER_COMMENTS_START && nSfx <= PLAYER_COMMENTS_END )
|
||||
{
|
||||
if ( !IsPedCommentLoaded(nSfx) )
|
||||
if ( !IsMissionAudioLoaded(MISSION_AUDIO_PLAYER_COMMENT, nSfx) )
|
||||
return FALSE;
|
||||
|
||||
int32 slot = _GetPedCommentSlot(nSfx);
|
||||
addr = (uintptr)gPlayerTalkData;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
int32 i;
|
||||
for ( i = 0; i < _TODOCONST(3); i++ )
|
||||
{
|
||||
int32 slot = nCurrentPedSlot - i - 1;
|
||||
#ifdef FIX_BUGS
|
||||
if (slot < 0)
|
||||
slot += ARRAY_SIZE(nPedSlotSfx);
|
||||
#endif
|
||||
if ( nSfx == nPedSlotSfx[slot] )
|
||||
{
|
||||
addr = (nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] + PED_BLOCKSIZE * slot);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == _TODOCONST(3))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( GetChannelUsedFlag(nChannel) )
|
||||
|
@ -1496,12 +1590,11 @@ cSampleManager::SetChannelEmittingVolume(uint32 nChannel, uint32 nVolume)
|
|||
|
||||
nChannelVolume[nChannel] = vol;
|
||||
|
||||
// reduce channel volume when JB.MP3 or S4_BDBD.MP3 playing
|
||||
if ( MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE
|
||||
&& MusicManager.GetNextTrack() != STREAMED_SOUND_NEWS_INTRO
|
||||
&& MusicManager.GetNextTrack() != STREAMED_SOUND_CUTSCENE_SAL4_BDBD )
|
||||
{
|
||||
nChannelVolume[nChannel] = vol / 4;
|
||||
if (MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE ) {
|
||||
if (MusicManager.GetCurrentTrack() == STREAMED_SOUND_CUTSCENE_FINALE)
|
||||
nChannelVolume[nChannel] = 0;
|
||||
else
|
||||
nChannelVolume[nChannel] >>= 2;
|
||||
}
|
||||
|
||||
// no idea, does this one looks like a bug or it's SetChannelVolume ?
|
||||
|
@ -1536,12 +1629,12 @@ cSampleManager::SetChannelVolume(uint32 nChannel, uint32 nVolume)
|
|||
|
||||
nChannelVolume[nChannel] = vol;
|
||||
|
||||
// reduce the volume for JB.MP3 and S4_BDBD.MP3
|
||||
if ( MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE
|
||||
&& MusicManager.GetNextTrack() != STREAMED_SOUND_NEWS_INTRO
|
||||
&& MusicManager.GetNextTrack() != STREAMED_SOUND_CUTSCENE_SAL4_BDBD )
|
||||
{
|
||||
nChannelVolume[nChannel] = vol / 4;
|
||||
// increase the volume for JB.MP3 and S4_BDBD.MP3
|
||||
if (MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE ) {
|
||||
if (MusicManager.GetCurrentTrack() == STREAMED_SOUND_CUTSCENE_FINALE)
|
||||
nChannelVolume[nChannel] = 0;
|
||||
else
|
||||
nChannelVolume[nChannel] >>= 2;
|
||||
}
|
||||
|
||||
aChannel[nChannel].SetVolume(m_nEffectsFadeVolume*vol*m_nEffectsVolume >> 14);
|
||||
|
@ -1609,7 +1702,7 @@ cSampleManager::StopChannel(uint32 nChannel)
|
|||
}
|
||||
|
||||
void
|
||||
cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
|
||||
cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream)
|
||||
{
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
|
||||
|
@ -1618,7 +1711,6 @@ cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
|
|||
CStream *stream = aStream[nStream];
|
||||
|
||||
stream->Close();
|
||||
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
|
||||
#endif
|
||||
|
@ -1657,7 +1749,7 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
|
|||
}
|
||||
|
||||
bool8
|
||||
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
||||
cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream)
|
||||
{
|
||||
uint32 i = 0;
|
||||
uint32 position = nPos;
|
||||
|
@ -1672,7 +1764,7 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
{
|
||||
do
|
||||
{
|
||||
// Switched to MP3 player just now
|
||||
// Just switched to MP3 player
|
||||
if ( !_bIsMp3Active && i == 0 )
|
||||
{
|
||||
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
|
||||
|
@ -1682,12 +1774,15 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
// Try to continue from previous song, if already started
|
||||
if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
|
||||
nFile = 0;
|
||||
|
||||
CStream *stream = aStream[nStream];
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
|
||||
#endif
|
||||
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
if ( stream->Setup() ) {
|
||||
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
nStreamLoopedFlag[nStream] = TRUE;
|
||||
if (position != 0)
|
||||
stream->SetPosMS(position);
|
||||
|
||||
|
@ -1700,6 +1795,7 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
return FALSE;
|
||||
|
||||
} else {
|
||||
|
||||
if (e->pLinkPath != NULL)
|
||||
aStream[nStream]->Open(e->pLinkPath, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
else {
|
||||
|
@ -1735,6 +1831,7 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
{
|
||||
nFile = 0;
|
||||
_bIsMp3Active = FALSE;
|
||||
|
||||
CStream *stream = aStream[nStream];
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
|
||||
|
@ -1742,6 +1839,8 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
|
||||
if (stream->Setup()) {
|
||||
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
nStreamLoopedFlag[nStream] = TRUE;
|
||||
if (position != 0)
|
||||
stream->SetPosMS(position);
|
||||
|
||||
|
@ -1759,6 +1858,7 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
else {
|
||||
strcpy(filename, _mp3DirectoryPath);
|
||||
strcat(filename, mp3->aFilename);
|
||||
|
||||
aStream[nStream]->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
}
|
||||
|
||||
|
@ -1779,13 +1879,18 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
position = 0;
|
||||
nFile = 0;
|
||||
}
|
||||
strcpy(filename, StreamedNameTable[nFile]);
|
||||
|
||||
CStream *stream = aStream[nStream];
|
||||
|
||||
#ifdef PS2_AUDIO_PATHS
|
||||
if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
|
||||
#endif
|
||||
stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
|
||||
if ( stream->Setup() ) {
|
||||
stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1);
|
||||
nStreamLoopedFlag[nStream] = TRUE;
|
||||
if (position != 0)
|
||||
stream->SetPosMS(position);
|
||||
|
||||
|
@ -1841,16 +1946,21 @@ cSampleManager::GetStreamedFilePosition(uint8 nStream)
|
|||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffectFlag, uint8 nStream)
|
||||
cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, bool8 nEffectFlag, uint8 nStream)
|
||||
{
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
|
||||
float boostMult = 0.0f;
|
||||
|
||||
if ( nVolume > MAX_VOLUME )
|
||||
nVolume = MAX_VOLUME;
|
||||
|
||||
if ( nPan > MAX_VOLUME )
|
||||
nPan = MAX_VOLUME;
|
||||
|
||||
if ( MusicManager.GetRadioInCar() == USERTRACK && !MusicManager.CheckForMusicInterruptions() )
|
||||
boostMult = m_nMP3BoostVolume / 64.f;
|
||||
|
||||
nStreamVolume[nStream] = nVolume;
|
||||
nStreamPan [nStream] = nPan;
|
||||
|
||||
|
@ -1858,10 +1968,14 @@ cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffect
|
|||
|
||||
if ( stream->IsOpened() )
|
||||
{
|
||||
if ( nEffectFlag )
|
||||
stream->SetVolume(m_nEffectsFadeVolume*nVolume*m_nEffectsVolume >> 14);
|
||||
if ( nEffectFlag ) {
|
||||
if ( nStream == 1 || nStream == 2 )
|
||||
stream->SetVolume(128*nVolume*m_nEffectsVolume >> 14);
|
||||
else
|
||||
stream->SetVolume(m_nMusicFadeVolume*nVolume*m_nMusicVolume >> 14);
|
||||
stream->SetVolume(m_nEffectsFadeVolume*nVolume*m_nEffectsVolume >> 14);
|
||||
}
|
||||
else
|
||||
stream->SetVolume((m_nMusicFadeVolume*nVolume*(uint32)(m_nMusicVolume * boostMult + m_nMusicVolume)) >> 14);
|
||||
|
||||
stream->SetPan(nPan);
|
||||
}
|
||||
|
@ -1941,7 +2055,7 @@ cSampleManager::InitialiseSampleBanks(void)
|
|||
fclose(fpSampleDescHandle);
|
||||
fpSampleDescHandle = NULL;
|
||||
|
||||
for ( int32 i = 0; i < TOTAL_AUDIO_SAMPLES; i++ )
|
||||
for ( uint32 i = 0; i < TOTAL_AUDIO_SAMPLES; i++ )
|
||||
{
|
||||
#ifdef FIX_BUGS
|
||||
if (nBank >= MAX_SFX_BANKS) break;
|
||||
|
@ -1958,4 +2072,11 @@ cSampleManager::InitialiseSampleBanks(void)
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
cSampleManager::SetStreamedFileLoopFlag(bool8 nLoopFlag, uint8 nChannel)
|
||||
{
|
||||
nStreamLoopedFlag[nChannel] = nLoopFlag;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -16,8 +16,10 @@ enum eSound
|
|||
SOUND_CAR_DOOR_OPEN_BACK_RIGHT,
|
||||
SOUND_CAR_WINDSHIELD_CRACK,
|
||||
SOUND_CAR_JUMP,
|
||||
SOUND_E,
|
||||
SOUND_F,
|
||||
SOUND_CAR_JUMP_2,
|
||||
SOUND_CAR_TYRE_POP,
|
||||
SOUND_16,
|
||||
SOUND_17,
|
||||
SOUND_CAR_ENGINE_START,
|
||||
SOUND_CAR_LIGHT_BREAK,
|
||||
SOUND_CAR_HYDRAULIC_1,
|
||||
|
@ -31,29 +33,33 @@ enum eSound
|
|||
SOUND_CAR_TANK_TURRET_ROTATE,
|
||||
SOUND_CAR_BOMB_TICK,
|
||||
SOUND_PLANE_ON_GROUND,
|
||||
SOUND_HELI_BLADE,
|
||||
SOUND_32,
|
||||
SOUND_STEP_START,
|
||||
SOUND_STEP_END,
|
||||
SOUND_FALL_LAND,
|
||||
SOUND_FALL_COLLAPSE,
|
||||
SOUND_FIGHT_PUNCH_33,
|
||||
SOUND_FIGHT_KICK_34,
|
||||
SOUND_FIGHT_HEADBUTT_35,
|
||||
SOUND_FIGHT_PUNCH_36,
|
||||
SOUND_FIGHT_PUNCH_37,
|
||||
SOUND_FIGHT_CLOSE_PUNCH_38,
|
||||
SOUND_FIGHT_PUNCH_39,
|
||||
SOUND_FIGHT_PUNCH_OR_KICK_BELOW_40,
|
||||
SOUND_FIGHT_PUNCH_41,
|
||||
SOUND_FIGHT_PUNCH_FROM_BEHIND_42,
|
||||
SOUND_FIGHT_KNEE_OR_KICK_43,
|
||||
SOUND_FIGHT_KICK_44,
|
||||
SOUND_2D,
|
||||
SOUND_FIGHT_37,
|
||||
SOUND_FIGHT_38,
|
||||
SOUND_FIGHT_39,
|
||||
SOUND_FIGHT_40,
|
||||
SOUND_FIGHT_41,
|
||||
SOUND_FIGHT_42,
|
||||
SOUND_FIGHT_43,
|
||||
SOUND_FIGHT_44,
|
||||
SOUND_FIGHT_45,
|
||||
SOUND_FIGHT_46,
|
||||
SOUND_FIGHT_47,
|
||||
SOUND_FIGHT_48,
|
||||
SOUND_49,
|
||||
SOUND_WEAPON_BAT_ATTACK,
|
||||
SOUND_WEAPON_KNIFE_ATTACK,
|
||||
SOUND_WEAPON_CHAINSAW_IDLE,
|
||||
SOUND_WEAPON_CHAINSAW_ATTACK,
|
||||
SOUND_WEAPON_CHAINSAW_MADECONTACT,
|
||||
SOUND_WEAPON_SHOT_FIRED,
|
||||
SOUND_WEAPON_RELOAD,
|
||||
SOUND_WEAPON_AK47_BULLET_ECHO,
|
||||
SOUND_WEAPON_UZI_BULLET_ECHO,
|
||||
SOUND_WEAPON_M16_BULLET_ECHO,
|
||||
SOUND_WEAPON_FLAMETHROWER_FIRE,
|
||||
SOUND_WEAPON_SNIPER_SHOT_NO_ZOOM,
|
||||
SOUND_WEAPON_ROCKET_SHOT_NO_ZOOM,
|
||||
|
@ -66,8 +72,8 @@ enum eSound
|
|||
SOUND_GARAGE_BOMB1_SET,
|
||||
SOUND_GARAGE_BOMB2_SET,
|
||||
SOUND_GARAGE_BOMB3_SET,
|
||||
SOUND_40,
|
||||
SOUND_41,
|
||||
SOUND_70,
|
||||
SOUND_71,
|
||||
SOUND_GARAGE_VEHICLE_DECLINED,
|
||||
SOUND_GARAGE_VEHICLE_ACCEPTED,
|
||||
SOUND_GARAGE_DOOR_CLOSED,
|
||||
|
@ -76,8 +82,8 @@ enum eSound
|
|||
SOUND_PICKUP_WEAPON_BOUGHT,
|
||||
SOUND_PICKUP_WEAPON,
|
||||
SOUND_PICKUP_HEALTH,
|
||||
SOUND_PICKUP_ERROR,
|
||||
SOUND_4B,
|
||||
SOUND_80,
|
||||
SOUND_81,
|
||||
SOUND_PICKUP_ADRENALINE,
|
||||
SOUND_PICKUP_ARMOUR,
|
||||
SOUND_PICKUP_BONUS,
|
||||
|
@ -87,7 +93,7 @@ enum eSound
|
|||
SOUND_PICKUP_PACMAN_PACKAGE,
|
||||
SOUND_PICKUP_FLOAT_PACKAGE,
|
||||
SOUND_BOMB_TIMED_ACTIVATED,
|
||||
SOUND_55,
|
||||
SOUND_91,
|
||||
SOUND_BOMB_ONIGNITION_ACTIVATED,
|
||||
SOUND_BOMB_TICK,
|
||||
SOUND_RAMPAGE_START,
|
||||
|
@ -104,12 +110,16 @@ enum eSound
|
|||
SOUND_PED_HIT,
|
||||
SOUND_PED_LAND,
|
||||
SOUND_PED_BULLET_HIT,
|
||||
SOUND_PED_BOMBER,
|
||||
SOUND_PED_BURNING,
|
||||
SOUND_PED_ARREST_FBI,
|
||||
SOUND_PED_ARREST_SWAT,
|
||||
SOUND_PED_PLAYER_REACTTOCOP,
|
||||
SOUND_PED_ARREST_COP,
|
||||
SOUND_PED_MIAMIVICE_EXITING_CAR,
|
||||
SOUND_PED_COP_HELIPILOTPHRASE,
|
||||
SOUND_PED_PULLOUTWEAPON,
|
||||
SOUND_PED_HELI_PLAYER_FOUND,
|
||||
SOUND_PED_VCPA_PLAYER_FOUND,
|
||||
SOUND_PED_ON_FIRE,
|
||||
SOUND_PED_AIMING,
|
||||
SOUND_PED_HANDS_UP,
|
||||
SOUND_PED_HANDS_COWER,
|
||||
SOUND_PED_FLEE_SPRINT,
|
||||
|
@ -117,30 +127,40 @@ enum eSound
|
|||
SOUND_PED_MUGGING,
|
||||
SOUND_PED_CAR_JACKED,
|
||||
SOUND_PED_ROBBED,
|
||||
SOUND_PED_ACCIDENTREACTION1,
|
||||
SOUND_PED_INNOCENT,
|
||||
SOUND_PED_PLAYER_AFTERSEX,
|
||||
SOUND_PED_PLAYER_BEFORESEX,
|
||||
SOUND_PED_COP_TARGETING, // also used for medics
|
||||
SOUND_PED_COP_MANYCOPSAROUND, // also used for medics
|
||||
SOUND_PED_GUNAIMEDAT2,
|
||||
SOUND_PED_COP_ALONE, // also used for medics
|
||||
SOUND_PED_GUNAIMEDAT3,
|
||||
SOUND_PED_COP_ASK_FOR_ID,
|
||||
SOUND_PED_COP_LITTLECOPSAROUND, // also used for medics
|
||||
SOUND_PED_PLAYER_FARFROMCOPS, // also used for medics
|
||||
SOUND_PED_TAXI_WAIT,
|
||||
SOUND_PED_ATTACK,
|
||||
SOUND_PED_DEFEND,
|
||||
SOUND_PED_PURSUIT_ARMY,
|
||||
SOUND_PED_PURSUIT_FBI,
|
||||
SOUND_PED_PURSUIT_SWAT,
|
||||
SOUND_PED_PURSUIT_COP,
|
||||
SOUND_PED_HEALING,
|
||||
SOUND_PED_7B,
|
||||
SOUND_PED_LEAVE_VEHICLE,
|
||||
SOUND_PED_EVADE,
|
||||
SOUND_PED_FLEE_RUN,
|
||||
SOUND_PED_CRASH_VEHICLE,
|
||||
SOUND_PED_CRASH_CAR,
|
||||
SOUND_PED_ANNOYED_DRIVER,
|
||||
SOUND_PED_147,
|
||||
SOUND_PED_SOLICIT,
|
||||
SOUND_PED_JEER,
|
||||
SOUND_PED_150,
|
||||
SOUND_PED_EXTINGUISHING_FIRE,
|
||||
SOUND_PED_WAIT_DOUBLEBACK,
|
||||
SOUND_PED_CHAT_SEXY,
|
||||
SOUND_PED_CHAT_SEXY_FEMALE,
|
||||
SOUND_PED_CHAT_SEXY_MALE,
|
||||
SOUND_PED_CHAT_EVENT,
|
||||
SOUND_PED_PED_COLLISION,
|
||||
SOUND_PED_CHAT,
|
||||
SOUND_PED_BODYCAST_HIT,
|
||||
SOUND_PED_TAXI_CALL,
|
||||
SOUND_INJURED_PED_MALE_OUCH,
|
||||
SOUND_INJURED_PED_FEMALE,
|
||||
SOUND_INJURED_PED_MALE_PRISON,
|
||||
SOUND_RACE_START_3,
|
||||
SOUND_RACE_START_2,
|
||||
SOUND_RACE_START_1,
|
||||
|
@ -151,143 +171,101 @@ enum eSound
|
|||
SOUND_CAR_PED_COLLISION,
|
||||
SOUND_CLOCK_TICK,
|
||||
SOUND_PART_MISSION_COMPLETE,
|
||||
SOUND_FRONTEND_MENU_STARTING,
|
||||
SOUND_FRONTEND_MENU_NEW_PAGE,
|
||||
SOUND_FRONTEND_MENU_NAVIGATION,
|
||||
SOUND_FRONTEND_MENU_SETTING_CHANGE,
|
||||
SOUND_FRONTEND_MENU_BACK,
|
||||
SOUND_FRONTEND_STEREO,
|
||||
SOUND_FRONTEND_MONO,
|
||||
SOUND_FRONTEND_AUDIO_TEST,
|
||||
SOUND_FRONTEND_FAIL,
|
||||
SOUND_FRONTEND_RADIO_TURN_OFF,
|
||||
SOUND_FRONTEND_RADIO_CHANGE,
|
||||
SOUND_FRONTEND_MENU_STARTING, // same sound as SOUND_HUD
|
||||
|
||||
// TODO(Miami): What are 170-175??
|
||||
|
||||
SOUND_FRONTEND_RADIO_TURN_OFF = 176, // those 2 are same sound
|
||||
SOUND_FRONTEND_RADIO_TURN_ON,
|
||||
SOUND_FRONTEND_HURRICANE, // yes, frontend
|
||||
SOUND_HUD,
|
||||
SOUND_AMMUNATION_WELCOME_1,
|
||||
SOUND_AMMUNATION_WELCOME_2,
|
||||
SOUND_AMMUNATION_WELCOME_3,
|
||||
SOUND_180,
|
||||
SOUND_181,
|
||||
SOUND_182,
|
||||
SOUND_LIGHTNING,
|
||||
SOUND_A5,
|
||||
SOUND_TOTAL_SOUNDS,
|
||||
SOUND_NO_SOUND,
|
||||
SOUND_BULLETTRACE_1,
|
||||
SOUND_BULLETTRACE_2,
|
||||
SOUND_186, // makes same sound as 40
|
||||
SOUND_187, // makes same sound as 46
|
||||
SOUND_MELEE_ATTACK_START,
|
||||
SOUND_SKATING,
|
||||
SOUND_WEAPON_MINIGUN_ATTACK,
|
||||
SOUND_WEAPON_MINIGUN_2,
|
||||
SOUND_WEAPON_MINIGUN_3,
|
||||
SOUND_AMMUNATION_IMRAN_ARM_BOMB,
|
||||
SOUND_RADIO_CHANGE,
|
||||
SOUND_FRONTEND_HIGHLIGHT_OPTION,
|
||||
SOUND_FRONTEND_ENTER_OR_ADJUST,
|
||||
SOUND_FRONTEND_BACK,
|
||||
SOUND_FRONTEND_FAIL,
|
||||
SOUND_FRONTEND_AUDIO_TEST,
|
||||
SOUND_INJURED_PED_MALE_OUCH,
|
||||
SOUND_INJURED_PED_FEMALE,
|
||||
SOUND_SHIRT_WIND_FLAP,
|
||||
SOUND_SET_203,
|
||||
SOUND_TOTAL_SOUNDS = 204,
|
||||
SOUND_NO_SOUND = 205,
|
||||
};
|
||||
|
||||
|
||||
enum eScriptSounds {
|
||||
SCRIPT_SOUND_0 = 0,
|
||||
SCRIPT_SOUND_1,
|
||||
SCRIPT_SOUND_2,
|
||||
SCRIPT_SOUND_3,
|
||||
SCRIPT_SOUND_PARTY_1_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_1_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_2_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_2_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_3_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_3_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_4_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_4_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_5_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_5_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_6_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_6_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_7_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_7_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_8_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_8_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_9_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_9_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_10_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_10_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_11_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_11_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_12_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_12_LOOP_L,
|
||||
SCRIPT_SOUND_PARTY_13_LOOP_S,
|
||||
SCRIPT_SOUND_PARTY_13_LOOP_L,
|
||||
SCRIPT_SOUND_STRIP_CLUB_LOOP_1_S,
|
||||
SCRIPT_SOUND_STRIP_CLUB_LOOP_1_L,
|
||||
SCRIPT_SOUND_STRIP_CLUB_LOOP_2_S,
|
||||
SCRIPT_SOUND_STRIP_CLUB_LOOP_2_L,
|
||||
SCRIPT_SOUND_WORK_SHOP_LOOP_S,
|
||||
SCRIPT_SOUND_WORK_SHOP_LOOP_L,
|
||||
SCRIPT_SOUND_SAWMILL_LOOP_S,
|
||||
SCRIPT_SOUND_SAWMILL_LOOP_L,
|
||||
SCRIPT_SOUND_38,
|
||||
SCRIPT_SOUND_39,
|
||||
SCRIPT_SOUND_LAUNDERETTE_LOOP_S,
|
||||
SCRIPT_SOUND_LAUNDERETTE_LOOP_L,
|
||||
SCRIPT_SOUND_CHINATOWN_RESTAURANT_S,
|
||||
SCRIPT_SOUND_CHINATOWN_RESTAURANT_L,
|
||||
SCRIPT_SOUND_CIPRIANI_RESAURANT_S,
|
||||
SCRIPT_SOUND_CIPRIANI_RESAURANT_L,
|
||||
SCRIPT_SOUND_46_S,
|
||||
SCRIPT_SOUND_47_L,
|
||||
SCRIPT_SOUND_MARCO_BISTRO_S,
|
||||
SCRIPT_SOUND_MARCO_BISTRO_L,
|
||||
SCRIPT_SOUND_AIRPORT_LOOP_S,
|
||||
SCRIPT_SOUND_AIRPORT_LOOP_L,
|
||||
SCRIPT_SOUND_SHOP_LOOP_S,
|
||||
SCRIPT_SOUND_SHOP_LOOP_L,
|
||||
SCRIPT_SOUND_CINEMA_LOOP_S,
|
||||
SCRIPT_SOUND_CINEMA_LOOP_L,
|
||||
SCRIPT_SOUND_DOCKS_LOOP_S,
|
||||
SCRIPT_SOUND_DOCKS_LOOP_L,
|
||||
SCRIPT_SOUND_HOME_LOOP_S,
|
||||
SCRIPT_SOUND_HOME_LOOP_L,
|
||||
SCRIPT_SOUND_FRANKIE_PIANO,
|
||||
SCRIPT_SOUND_PARTY_1_LOOP,
|
||||
SCRIPT_SOUND_PORN_CINEMA_1_S,
|
||||
SCRIPT_SOUND_PORN_CINEMA_1_L,
|
||||
SCRIPT_SOUND_PORN_CINEMA_2_S,
|
||||
SCRIPT_SOUND_PORN_CINEMA_2_L,
|
||||
SCRIPT_SOUND_PORN_CINEMA_3_S,
|
||||
SCRIPT_SOUND_PORN_CINEMA_3_L,
|
||||
SCRIPT_SOUND_BANK_ALARM_LOOP_S,
|
||||
SCRIPT_SOUND_BANK_ALARM_LOOP_L,
|
||||
SCRIPT_SOUND_POLICE_BALL_LOOP_S,
|
||||
SCRIPT_SOUND_POLICE_BALL_LOOP_L,
|
||||
SCRIPT_SOUND_RAVE_LOOP_INDUSTRIAL_S,
|
||||
SCRIPT_SOUND_RAVE_LOOP_INDUSTRIAL_L,
|
||||
SCRIPT_SOUND_74,
|
||||
SCRIPT_SOUND_75,
|
||||
SCRIPT_SOUND_POLICE_CELL_BEATING_LOOP_S,
|
||||
SCRIPT_SOUND_POLICE_CELL_BEATING_LOOP_L,
|
||||
SCRIPT_SOUND_INJURED_PED_MALE_OUCH_S,
|
||||
SCRIPT_SOUND_INJURED_PED_MALE_OUCH_L,
|
||||
SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_S,
|
||||
SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_L,
|
||||
SCRIPT_SOUND_EVIDENCE_PICKUP,
|
||||
SCRIPT_SOUND_UNLOAD_GOLD,
|
||||
SCRIPT_SOUND_RAVE_1_LOOP_S,
|
||||
SCRIPT_SOUND_RAVE_1_LOOP_L,
|
||||
SCRIPT_SOUND_RAVE_2_LOOP_S,
|
||||
SCRIPT_SOUND_RAVE_2_LOOP_L,
|
||||
SCRIPT_SOUND_RAVE_3_LOOP_S,
|
||||
SCRIPT_SOUND_RAVE_3_LOOP_L,
|
||||
SCRIPT_SOUND_MISTY_SEX_S,
|
||||
SCRIPT_SOUND_MISTY_SEX_L,
|
||||
SCRIPT_SOUND_GATE_START_CLUNK,
|
||||
SCRIPT_SOUND_GATE_STOP_CLUNK,
|
||||
SCRIPT_SOUND_BANK_ALARM_LOOP = 0,
|
||||
SCRIPT_SOUND_PART_MISSION_COMPLETE,
|
||||
SCRIPT_SOUND_CHUNKY_RUN_SHOUT,
|
||||
SCRIPT_SOUND_SECURITY_GUARD_AWAY_SHOUT,
|
||||
SCRIPT_SOUND_POLICE_CELL_DOOR_SLIDING_LOOP,
|
||||
SCRIPT_SOUND_POLICE_CELL_DOOR_CLUNK,
|
||||
SCRIPT_SOUND_GARAGE_DOOR_SLIDING_LOOP,
|
||||
SCRIPT_SOUND_GARAGE_DOOR_CLUNK,
|
||||
SCRIPT_SOUND_SNORING_LOOP,
|
||||
SCRIPT_SOUND_RACE_START_3,
|
||||
SCRIPT_SOUND_RACE_START_2,
|
||||
SCRIPT_SOUND_RACE_START_1,
|
||||
SCRIPT_SOUND_RACE_START_GO,
|
||||
SCRIPT_SOUND_SWAT_PED_SHOUT,
|
||||
SCRIPT_SOUND_PRETEND_FIRE_LOOP,
|
||||
SCRIPT_SOUND_AMMUNATION_CHAT_1,
|
||||
SCRIPT_SOUND_AMMUNATION_CHAT_2,
|
||||
SCRIPT_SOUND_AMMUNATION_CHAT_3,
|
||||
SCRIPT_SOUND_SHOOTING_RANGE_TARGET_MOVING_LOOP,
|
||||
SCRIPT_SOUND_SHOOTING_RANGE_TARGET_HIT,
|
||||
SCRIPT_SOUND_AMMUNATION_BUY_WEAPON,
|
||||
SCRIPT_SOUND_AMMUNATION_BUY_WEAPON_DENIED,
|
||||
SCRIPT_SOUND_WMYCW_TICKET_SPEECH,
|
||||
SCRIPT_SOUND_IMRAN_ARM_BOMB,
|
||||
SCRIPT_SOUND_ANDY_SNIPER_SHOT,
|
||||
SCRIPT_SOUND_WILLIE_CARD_SWIPE,
|
||||
SCRIPT_SOUND_MALE_AMBULANCE_OUCH,
|
||||
SCRIPT_SOUND_FEMALE_AMBULANCE_OUCH,
|
||||
SCRIPT_SOUND_BUILDING_BAR_1,
|
||||
SCRIPT_SOUND_BUILDING_BAR_2,
|
||||
SCRIPT_SOUND_BUILDING_BAR_3,
|
||||
SCRIPT_SOUND_BUILDING_BAR_4,
|
||||
SCRIPT_SOUND_BUILDING_BIKER_BAR,
|
||||
SCRIPT_SOUND_BUILDING_CHURCH,
|
||||
SCRIPT_SOUND_BUILDING_CLUB,
|
||||
SCRIPT_SOUND_BUILDING_CUBA_1,
|
||||
SCRIPT_SOUND_BUILDING_CUBA_2,
|
||||
SCRIPT_SOUND_BUILDING_VOODOO,
|
||||
SCRIPT_SOUND_BUILDING_MUSIC_SHOP,
|
||||
SCRIPT_SOUND_BUILDING_STRIPCLUB_1,
|
||||
SCRIPT_SOUND_BUILDING_STRIPCLUB_2,
|
||||
SCRIPT_SOUND_BUILDING_SUPERSWEEP,
|
||||
SCRIPT_SOUND_SEAPLANE_LOW_FUEL,
|
||||
SCRIPT_SOUND_NEW_BUILDING_BAR_1,
|
||||
SCRIPT_SOUND_NEW_BUILDING_BAR_2,
|
||||
SCRIPT_SOUND_NEW_BUILDING_BAR_3,
|
||||
SCRIPT_SOUND_NEW_BUILDING_BAR_4,
|
||||
SCRIPT_SOUND_NEW_BUILDING_MALIBU_1,
|
||||
SCRIPT_SOUND_NEW_BUILDING_MALIBU_2,
|
||||
SCRIPT_SOUND_NEW_BUILDING_MALIBU_3,
|
||||
SCRIPT_SOUND_NEW_BUILDING_STRIP_1,
|
||||
SCRIPT_SOUND_NEW_BUILDING_STRIP_2,
|
||||
SCRIPT_SOUND_NEW_BUILDING_STRIP_3,
|
||||
SCRIPT_SOUND_NEW_BUILDING_CHURCH,
|
||||
SCRIPT_SOUND_NEW_BUILDING_FAN_1,
|
||||
SCRIPT_SOUND_NEW_BUILDING_FAN_2,
|
||||
SCRIPT_SOUND_NEW_BUILDING_INSECT_1,
|
||||
SCRIPT_SOUND_NEW_BUILDING_INSECT_2,
|
||||
SCRIPT_SOUND_NEW_WATERFALL,
|
||||
SCRIPT_SOUND_BULLET_HIT_GROUND_1,
|
||||
SCRIPT_SOUND_BULLET_HIT_GROUND_2,
|
||||
SCRIPT_SOUND_BULLET_HIT_GROUND_3,
|
||||
SCRIPT_SOUND_BULLET_HIT_WATER, // no sound
|
||||
SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_1,
|
||||
SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_2,
|
||||
SCRIPT_SOUND_PAYPHONE_RINGING,
|
||||
SCRIPT_SOUND_113,
|
||||
SCRIPT_SOUND_GLASS_BREAK_L,
|
||||
SCRIPT_SOUND_GLASS_BREAK_S,
|
||||
SCRIPT_SOUND_GLASS_CRACK,
|
||||
|
@ -296,6 +274,7 @@ enum eScriptSounds {
|
|||
SCRIPT_SOUND_BOX_DESTROYED_2,
|
||||
SCRIPT_SOUND_METAL_COLLISION,
|
||||
SCRIPT_SOUND_TIRE_COLLISION,
|
||||
SCRIPT_SOUND_HIT_BALL,
|
||||
SCRIPT_SOUND_GUNSHELL_DROP,
|
||||
SCRIPT_SOUND_GUNSHELL_DROP_SOFT,
|
||||
SCRIPT_SOUND_TOTAL,
|
||||
|
|
|
@ -20,3 +20,25 @@ CBuilding::ReplaceWithNewModel(int32 id)
|
|||
if(m_level == LEVEL_GENERIC || m_level == CGame::currLevel)
|
||||
CStreaming::RequestModel(id, STREAMFLAGS_DONT_REMOVE);
|
||||
}
|
||||
|
||||
bool
|
||||
IsBuildingPointerValid(CBuilding* pBuilding)
|
||||
{
|
||||
if (!pBuilding)
|
||||
return false;
|
||||
if (pBuilding->GetIsATreadable()) {
|
||||
int index = CPools::GetTreadablePool()->GetJustIndex_NoFreeAssert((CTreadable*)pBuilding);
|
||||
#ifdef FIX_BUGS
|
||||
return index >= 0 && index < CPools::GetTreadablePool()->GetSize();
|
||||
#else
|
||||
return index >= 0 && index <= CPools::GetTreadablePool()->GetSize();
|
||||
#endif
|
||||
} else {
|
||||
int index = CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert(pBuilding);
|
||||
#ifdef FIX_BUGS
|
||||
return index >= 0 && index < CPools::GetBuildingPool()->GetSize();
|
||||
#else
|
||||
return index >= 0 && index <= CPools::GetBuildingPool()->GetSize();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,5 +17,4 @@ public:
|
|||
virtual bool GetIsATreadable(void) { return false; }
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(CBuilding, 0x64);
|
||||
|
||||
bool IsBuildingPointerValid(CBuilding*);
|
||||
|
|
|
@ -8,10 +8,5 @@ public:
|
|||
static void *operator new(size_t) throw();
|
||||
static void operator delete(void*, size_t) throw();
|
||||
|
||||
int16 m_nodeIndices[2][12]; // first car, then ped
|
||||
|
||||
bool GetIsATreadable(void) { return true; }
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(CTreadable, 0x94);
|
||||
|
||||
|
|
|
@ -2,15 +2,21 @@
|
|||
|
||||
#include "SurfaceTable.h"
|
||||
|
||||
struct CColBox
|
||||
struct CBox
|
||||
{
|
||||
CVector min;
|
||||
CVector max;
|
||||
CVector GetSize(void) { return max - min; }
|
||||
void Set(const CVector &min, const CVector &max) { this->min = min; this->max = max; }
|
||||
};
|
||||
|
||||
struct CColBox : public CBox
|
||||
{
|
||||
uint8 surface;
|
||||
uint8 piece;
|
||||
|
||||
void Set(const CVector &min, const CVector &max, uint8 surf = SURFACE_DEFAULT, uint8 piece = 0);
|
||||
CVector GetSize(void) { return max - min; }
|
||||
void Set(const CVector &min, const CVector &max, uint8 surf, uint8 piece);
|
||||
using CBox::Set;
|
||||
|
||||
CColBox& operator=(const CColBox &other);
|
||||
};
|
|
@ -1,7 +1,9 @@
|
|||
#include "common.h"
|
||||
#include "ColModel.h"
|
||||
#include "Collision.h"
|
||||
#include "Game.h"
|
||||
#include "MemoryHeap.h"
|
||||
#include "Pools.h"
|
||||
|
||||
CColModel::CColModel(void)
|
||||
{
|
||||
|
@ -15,14 +17,27 @@ CColModel::CColModel(void)
|
|||
vertices = nil;
|
||||
triangles = nil;
|
||||
trianglePlanes = nil;
|
||||
level = CGame::currLevel;
|
||||
level = LEVEL_GENERIC; // generic col slot
|
||||
ownsCollisionVolumes = true;
|
||||
}
|
||||
|
||||
CColModel::~CColModel(void)
|
||||
{
|
||||
RemoveCollisionVolumes();
|
||||
RemoveTrianglePlanes();
|
||||
}
|
||||
|
||||
void*
|
||||
CColModel::operator new(size_t) throw()
|
||||
{
|
||||
CColModel* node = CPools::GetColModelPool()->New();
|
||||
assert(node);
|
||||
return node;
|
||||
}
|
||||
|
||||
void
|
||||
CColModel::operator delete(void *p, size_t) throw()
|
||||
{
|
||||
CPools::GetColModelPool()->Delete((CColModel*)p);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -34,6 +49,7 @@ CColModel::RemoveCollisionVolumes(void)
|
|||
RwFree(boxes);
|
||||
RwFree(vertices);
|
||||
RwFree(triangles);
|
||||
CCollision::RemoveTrianglePlanes(this);
|
||||
}
|
||||
numSpheres = 0;
|
||||
numLines = 0;
|
||||
|
|
|
@ -9,14 +9,14 @@
|
|||
|
||||
struct CColModel
|
||||
{
|
||||
CColSphere boundingSphere;
|
||||
CColBox boundingBox;
|
||||
CSphere boundingSphere;
|
||||
CBox boundingBox;
|
||||
int16 numSpheres;
|
||||
int16 numLines;
|
||||
int16 numBoxes;
|
||||
int16 numTriangles;
|
||||
int32 level;
|
||||
bool ownsCollisionVolumes; // missing on PS2
|
||||
int8 numLines;
|
||||
uint8 level; // colstore slot but probably still named level
|
||||
bool ownsCollisionVolumes;
|
||||
CColSphere *spheres;
|
||||
CColLine *lines;
|
||||
CColBox *boxes;
|
||||
|
@ -33,5 +33,7 @@ struct CColModel
|
|||
void SetLinkPtr(CLink<CColModel*>*);
|
||||
void GetTrianglePoint(CVector &v, int i) const;
|
||||
|
||||
void *operator new(size_t) throw();
|
||||
void operator delete(void *p, size_t) throw();
|
||||
CColModel& operator=(const CColModel& other);
|
||||
};
|
|
@ -1,5 +1,6 @@
|
|||
#include "common.h"
|
||||
#include "ColSphere.h"
|
||||
#include "General.h"
|
||||
|
||||
void
|
||||
CColSphere::Set(float radius, const CVector ¢er, uint8 surf, uint8 piece)
|
||||
|
@ -9,3 +10,18 @@ CColSphere::Set(float radius, const CVector ¢er, uint8 surf, uint8 piece)
|
|||
this->surface = surf;
|
||||
this->piece = piece;
|
||||
}
|
||||
|
||||
bool
|
||||
CColSphere::IntersectRay(CVector const& from, CVector const& dir, CVector &entry, CVector &exit)
|
||||
{
|
||||
CVector distToCenter = from - center;
|
||||
float distToTouchSqr = distToCenter.MagnitudeSqr() - sq(radius);
|
||||
float root1, root2;
|
||||
|
||||
if (!CGeneral::SolveQuadratic(1.0f, DotProduct(distToCenter, dir) * 2.f, distToTouchSqr, root1, root2))
|
||||
return false;
|
||||
|
||||
entry = from + dir * root1;
|
||||
exit = from + dir * root2;
|
||||
return true;
|
||||
}
|
|
@ -2,12 +2,20 @@
|
|||
|
||||
#include "SurfaceTable.h"
|
||||
|
||||
struct CColSphere
|
||||
struct CSphere
|
||||
{
|
||||
// NB: this has to be compatible with a CVuVector
|
||||
CVector center;
|
||||
float radius;
|
||||
void Set(float radius, const CVector ¢er) { this->center = center; this->radius = radius; }
|
||||
};
|
||||
|
||||
struct CColSphere : public CSphere
|
||||
{
|
||||
uint8 surface;
|
||||
uint8 piece;
|
||||
void Set(float radius, const CVector ¢er, uint8 surf = SURFACE_DEFAULT, uint8 piece = 0);
|
||||
|
||||
void Set(float radius, const CVector ¢er, uint8 surf, uint8 piece);
|
||||
bool IntersectRay(CVector const &from, CVector const &dir, CVector &entry, CVector &exit);
|
||||
using CSphere::Set;
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue