mirror of
https://github.com/fallout2-ce/fallout2-ce.git
synced 2026-07-27 16:47:11 -07:00
Compare commits
361
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e574882f3 | ||
|
|
5995592664 | ||
|
|
982c5fcb42 | ||
|
|
9cd309b263 | ||
|
|
de7f12f3ca | ||
|
|
7a2edd5677 | ||
|
|
66b68f84dc | ||
|
|
fef49692e1 | ||
|
|
6c3c0d34c2 | ||
|
|
42e016e4f9 | ||
|
|
66542dc28a | ||
|
|
5270cf0d55 | ||
|
|
e598d06c4a | ||
|
|
66f7137f74 | ||
|
|
cf59439352 | ||
|
|
02ee5cba5d | ||
|
|
218fd20700 | ||
|
|
7e18a6980a | ||
|
|
66c0218741 | ||
|
|
8fc789d6f9 | ||
|
|
ddc5be3b6d | ||
|
|
833b6d8213 | ||
|
|
4f117678ee | ||
|
|
499f994c37 | ||
|
|
d6c17c1876 | ||
|
|
347bf8b135 | ||
|
|
faf6439293 | ||
|
|
a259a3318e | ||
|
|
50e9fab544 | ||
|
|
54a3b0c05c | ||
|
|
0873eaab37 | ||
|
|
dff92e56fc | ||
|
|
34748a2894 | ||
|
|
39160992ef | ||
|
|
eaa53b3e8e | ||
|
|
39bcb9875d | ||
|
|
9097c2e76d | ||
|
|
50db3587e4 | ||
|
|
9e5a440895 | ||
|
|
61ca374c03 | ||
|
|
8f2b3a10dd | ||
|
|
bbc4f44845 | ||
|
|
5367eba4f2 | ||
|
|
2d617883d3 | ||
|
|
34f666fe55 | ||
|
|
5ae46be317 | ||
|
|
a4f9d7b940 | ||
|
|
251656e15b | ||
|
|
e1a8dc7adc | ||
|
|
ca029b3412 | ||
|
|
70c3035cde | ||
|
|
57b6b0caed | ||
|
|
37ec7b1874 | ||
|
|
2395a6da3f | ||
|
|
7338c2f428 | ||
|
|
2e2655ee1a | ||
|
|
43c633bb89 | ||
|
|
d5b4486d6e | ||
|
|
590b832ba7 | ||
|
|
cc7d9ed866 | ||
|
|
8ad2cb7e2e | ||
|
|
e638c4cf0d | ||
|
|
2f40ce663c | ||
|
|
7b1a99a706 | ||
|
|
398c7adb9a | ||
|
|
424f2ffecc | ||
|
|
d4c4022f55 | ||
|
|
1d0212ef5a | ||
|
|
c7417bb7e5 | ||
|
|
4d05fc1c4a | ||
|
|
aa70a28509 | ||
|
|
49471a6154 | ||
|
|
1b65466d44 | ||
|
|
aed6c37c67 | ||
|
|
1d48fb35b2 | ||
|
|
1d4171727b | ||
|
|
af046127e9 | ||
|
|
5a2c429956 | ||
|
|
ff5fa993f2 | ||
|
|
5a0507200b | ||
|
|
54442f0cfe | ||
|
|
ae9912b7ea | ||
|
|
f6da491246 | ||
|
|
5fa6ec679d | ||
|
|
d029bf3cd0 | ||
|
|
f81e1f7ba7 | ||
|
|
f672ba4ddf | ||
|
|
14cd1844d0 | ||
|
|
2b8f18ff0c | ||
|
|
07b52e0b76 | ||
|
|
c79696326d | ||
|
|
132626912a | ||
|
|
3163319290 | ||
|
|
252d2ef263 | ||
|
|
ef09142375 | ||
|
|
a4ba0240f1 | ||
|
|
2e8a65593e | ||
|
|
f35d1efab2 | ||
|
|
42a6a16f73 | ||
|
|
85389ef2f3 | ||
|
|
f7c1ccfada | ||
|
|
767ae9af25 | ||
|
|
0ba670f0f7 | ||
|
|
58fdf2ff9e | ||
|
|
cb1d2d6ed3 | ||
|
|
4ce09d8cdb | ||
|
|
787fa1b1b1 | ||
|
|
3d4fcf23ba | ||
|
|
74c2125606 | ||
|
|
b1df5a084c | ||
|
|
2a610cf479 | ||
|
|
7d093030e7 | ||
|
|
01be11fce5 | ||
|
|
12fe582e6f | ||
|
|
6f321c7882 | ||
|
|
e05dacebca | ||
|
|
917c1bc49e | ||
|
|
ca9618bf0b | ||
|
|
2112b04c5b | ||
|
|
52e1954aea | ||
|
|
2f144fb421 | ||
|
|
fe472abc2f | ||
|
|
bdb4feedf9 | ||
|
|
5e93479192 | ||
|
|
7960b3cb65 | ||
|
|
7d0a495ce8 | ||
|
|
4e8c3a4815 | ||
|
|
55af34472a | ||
|
|
503695cd4d | ||
|
|
9db0a4d29e | ||
|
|
325577db56 | ||
|
|
cf17f42cf8 | ||
|
|
cc6d803517 | ||
|
|
de5ee7d7f8 | ||
|
|
4dfc7538db | ||
|
|
afeec298bf | ||
|
|
eeed6e87a5 | ||
|
|
0aa0f064e5 | ||
|
|
dd49ddb7c7 | ||
|
|
2922162412 | ||
|
|
35c59913f0 | ||
|
|
5b93794660 | ||
|
|
8f3ab4df6f | ||
|
|
498bdfcd13 | ||
|
|
4f1c239118 | ||
|
|
b7374ffb24 | ||
|
|
14e119f014 | ||
|
|
a5de358845 | ||
|
|
7957246c73 | ||
|
|
07da6c53be | ||
|
|
4020d6a500 | ||
|
|
6c30ce64bf | ||
|
|
53337cbb76 | ||
|
|
bc47279a93 | ||
|
|
512e403771 | ||
|
|
2ffdad43fa | ||
|
|
0e9fee8cec | ||
|
|
35e9f71810 | ||
|
|
607b95f2c4 | ||
|
|
3c59f111cd | ||
|
|
c981fdc700 | ||
|
|
38b1a01c26 | ||
|
|
bf3e817a3e | ||
|
|
43bb53b2e2 | ||
|
|
d55944a8c4 | ||
|
|
3b23a1cfe0 | ||
|
|
d364579925 | ||
|
|
25106684ba | ||
|
|
b25ee43682 | ||
|
|
9b6fbeecb9 | ||
|
|
bc25c97e93 | ||
|
|
f3f92187ae | ||
|
|
168f250028 | ||
|
|
db6967feb5 | ||
|
|
806ac12a72 | ||
|
|
3c63aa30ee | ||
|
|
b4ad5ea8a7 | ||
|
|
71d56fcf98 | ||
|
|
b3f8abbcbb | ||
|
|
16d786bd25 | ||
|
|
91ae593aac | ||
|
|
03e26a4551 | ||
|
|
acb470f34a | ||
|
|
3c01ff7477 | ||
|
|
68d9405a0a | ||
|
|
dd9c521363 | ||
|
|
51e8056430 | ||
|
|
b336e06401 | ||
|
|
fc788a3795 | ||
|
|
a9878cbe98 | ||
|
|
5891072346 | ||
|
|
e97087b958 | ||
|
|
b31cea9331 | ||
|
|
f5ade9fb19 | ||
|
|
f59637d0cc | ||
|
|
236774c7b2 | ||
|
|
f7d4fc4ffe | ||
|
|
135c62758f | ||
|
|
2de74728ce | ||
|
|
d631bfcdd0 | ||
|
|
4382d67c19 | ||
|
|
e38e7060d4 | ||
|
|
d6fc3bb2d8 | ||
|
|
82793d14f4 | ||
|
|
a5d252f19b | ||
|
|
e5d4d310c0 | ||
|
|
fa1621ff56 | ||
|
|
52e5611e1b | ||
|
|
d540a9ff04 | ||
|
|
1b6fe7e15b | ||
|
|
900140f8f7 | ||
|
|
14430c4f0a | ||
|
|
a1fc68f13a | ||
|
|
2e15d01be3 | ||
|
|
96335aebc9 | ||
|
|
6ab3c508e6 | ||
|
|
f790a10e88 | ||
|
|
6b879e71b8 | ||
|
|
9878e205e6 | ||
|
|
0a5afd1e18 | ||
|
|
625bf69b33 | ||
|
|
48c01eb8a1 | ||
|
|
b105517ab3 | ||
|
|
7d6371fd1c | ||
|
|
dc9824e2be | ||
|
|
60a0d3ab8c | ||
|
|
58c82f9268 | ||
|
|
8fcdbe0bee | ||
|
|
afff399fca | ||
|
|
080f999626 | ||
|
|
593f80144c | ||
|
|
4df9ee557d | ||
|
|
f6ba9d38fd | ||
|
|
8ad0067510 | ||
|
|
894d9aab52 | ||
|
|
043b43d04b | ||
|
|
277faa114e | ||
|
|
1f91ab4d41 | ||
|
|
0e68bfc280 | ||
|
|
c26488f2a0 | ||
|
|
bf49e6b7e2 | ||
|
|
c4cc713272 | ||
|
|
dad514c2a4 | ||
|
|
09ba154dcf | ||
|
|
f9af163495 | ||
|
|
9d6f4d9686 | ||
|
|
17042491c6 | ||
|
|
cfea9072db | ||
|
|
3d541f2be3 | ||
|
|
d53bda5012 | ||
|
|
97a7e4cc6a | ||
|
|
9b7c48a197 | ||
|
|
bf04bec410 | ||
|
|
7796238030 | ||
|
|
e91880c26a | ||
|
|
321892dd03 | ||
|
|
e42b7ad2c9 | ||
|
|
c91057ec16 | ||
|
|
ed6930a5e5 | ||
|
|
edde0470a6 | ||
|
|
f79cff3565 | ||
|
|
d0c0a81ec8 | ||
|
|
a791930acf | ||
|
|
25b5e9d272 | ||
|
|
3f15d3055c | ||
|
|
e611956cb0 | ||
|
|
2abf530797 | ||
|
|
3883b68c86 | ||
|
|
090fa331cc | ||
|
|
1f0f08f3e4 | ||
|
|
1e3aacebdd | ||
|
|
843e2f515a | ||
|
|
0aaf9e6125 | ||
|
|
eceb96194c | ||
|
|
c1c143aa43 | ||
|
|
7fc23de62a | ||
|
|
bc577641fe | ||
|
|
31abd327fd | ||
|
|
2e14e4620e | ||
|
|
95d92d8bd0 | ||
|
|
acc52383ed | ||
|
|
75c5f777fd | ||
|
|
f06eb813e0 | ||
|
|
4270ee33cc | ||
|
|
46c2f460fb | ||
|
|
a852e88bf8 | ||
|
|
178de356f1 | ||
|
|
04b8c847d3 | ||
|
|
d586e81827 | ||
|
|
26574914ff | ||
|
|
67375a5857 | ||
|
|
9be2e45f43 | ||
|
|
3dbea2e400 | ||
|
|
bd7321b128 | ||
|
|
7bb9104a7d | ||
|
|
18c5ce786e | ||
|
|
eb9f745b78 | ||
|
|
3a9f0a500f | ||
|
|
38717c9710 | ||
|
|
ad7b0e56ab | ||
|
|
e770e64a48 | ||
|
|
5956227dcb | ||
|
|
f443e365cc | ||
|
|
b443e21c6e | ||
|
|
19ed168d42 | ||
|
|
29b8c7bfe5 | ||
|
|
939211d640 | ||
|
|
b5d857547e | ||
|
|
0a9aaab4d1 | ||
|
|
5c6e5e826a | ||
|
|
aed3723306 | ||
|
|
319c116048 | ||
|
|
61da360180 | ||
|
|
9d6134367a | ||
|
|
9b96e3118d | ||
|
|
f5507c8c5a | ||
|
|
926efeb0c5 | ||
|
|
d3346b5d1b | ||
|
|
b6c2fc02b6 | ||
|
|
983092944d | ||
|
|
68e363429c | ||
|
|
eaab620c84 | ||
|
|
61742535d5 | ||
|
|
a66618cbff | ||
|
|
f8b63280f2 | ||
|
|
a24e0630d7 | ||
|
|
be11208a88 | ||
|
|
4a2174c8aa | ||
|
|
39733665fc | ||
|
|
50467d3296 | ||
|
|
959d40dc06 | ||
|
|
b2efcffec7 | ||
|
|
8675d89a39 | ||
|
|
a99a250a37 | ||
|
|
98cf43438c | ||
|
|
8eae8a4cb0 | ||
|
|
1d3b5c1951 | ||
|
|
5786f56606 | ||
|
|
ef3f3f3fc9 | ||
|
|
64a53ff4d0 | ||
|
|
3b211b2d71 | ||
|
|
c920078f7e | ||
|
|
660df2578a | ||
|
|
ea02ad0481 | ||
|
|
78e577892a | ||
|
|
9811069d7b | ||
|
|
451524e6e0 | ||
|
|
30cfd0f089 | ||
|
|
e44aeb6894 | ||
|
|
74eb64b594 | ||
|
|
a59bfdb64b | ||
|
|
1d53594961 | ||
|
|
6375269f69 | ||
|
|
144b3beb79 | ||
|
|
30bbb3702a | ||
|
|
28c3908862 | ||
|
|
d843a662b3 | ||
|
|
0e31ac4753 | ||
|
|
a949178e30 | ||
|
|
0e806d9be3 | ||
|
|
2d88189b4c |
@@ -0,0 +1,31 @@
|
||||
### Description
|
||||
|
||||
<!--- Clearly describe the changes introduced by this PR. What was fixed, added, or updated? --->
|
||||
|
||||
### Reproduction Steps and Savefile (if available)
|
||||
|
||||
<!--- Provide detailed steps to reproduce the issue. Include a savefile if applicable, preferrably for Sonora --->
|
||||
|
||||
### Screenshots
|
||||
|
||||
<!--- If the PR includes visual changes, add screenshots here. --->
|
||||
|
||||
|
||||
<!---
|
||||
|
||||
**Important Notes**
|
||||
|
||||
- *Preview builds are not available for pull requests from forked repositories.* To enable preview builds, submit the PR from a branch within this repository.
|
||||
|
||||
- *Formatting issues? You have two options:*
|
||||
1. **Fix formatting automatically** using the following Docker command: *(If you're using Windows, remove `--user $(id -u):$(id -g)`)*
|
||||
```bash
|
||||
docker run --rm \
|
||||
-v $(pwd):/app --workdir /app \
|
||||
--user $(id -u):$(id -g) silkeh/clang:18 \
|
||||
bash -c 'find src -type f -name \*.cc -o -name \*.h | xargs clang-format -i'
|
||||
```
|
||||
2. **Skip formatting check** by adding the `skip-formatting` label to this PR.
|
||||
|
||||
--->
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
name: Build and deploy webassembly version
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
|
||||
jobs:
|
||||
build_webassembly_version:
|
||||
name: Build webassembly version
|
||||
runs-on: ubuntu-latest
|
||||
permissions: write-all
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Emscripten SDK
|
||||
run: |
|
||||
git clone https://github.com/emscripten-core/emsdk.git
|
||||
cd emsdk
|
||||
./emsdk install 4.0.4
|
||||
./emsdk activate 4.0.4
|
||||
|
||||
- name: Build fallout2 wasm module
|
||||
run: |
|
||||
source emsdk/emsdk_env.sh
|
||||
git config --global --add safe.directory "*"
|
||||
mkdir -p build
|
||||
cd build
|
||||
emcmake cmake ../ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release && emmake make VERBOSE=1 -j 4
|
||||
cd ..
|
||||
|
||||
- name: Add node
|
||||
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '22'
|
||||
|
||||
- name: Checkout web interface
|
||||
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: fallout2-ce/fallout2-ce-ems
|
||||
ref: 8dc61ba6e8e62116f4810ffe89d0cece00f508d7
|
||||
path: fallout2-ce-ems
|
||||
|
||||
- name: Set deployment path
|
||||
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
|
||||
id: set-path
|
||||
run: |
|
||||
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||
echo "DEST_DIR=PR-${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
|
||||
echo "SITE_BASE=/fallout2-ce/PR-${{ github.event.pull_request.number }}/" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "DEST_DIR=." >> $GITHUB_OUTPUT
|
||||
echo "SITE_BASE=/fallout2-ce/" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
echo ===============================
|
||||
cat $GITHUB_OUTPUT
|
||||
|
||||
- name: Build web interface
|
||||
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
|
||||
run: |
|
||||
cd fallout2-ce-ems
|
||||
npm install
|
||||
cp ../build/fallout2-ce.js src/assets/fallout2ce
|
||||
cp ../build/fallout2-ce.wasm src/assets/fallout2ce
|
||||
export F2_WEB_INFO=Web=$(git rev-parse HEAD)
|
||||
echo "F2_WEB_INFO=$F2_WEB_INFO"
|
||||
echo "F2_GAME_VERSION=$F2_GAME_VERSION"
|
||||
npm run build
|
||||
env:
|
||||
SITE_BASE: ${{ steps.set-path.outputs.SITE_BASE }}
|
||||
F2_GAME_VERSION: Game=${{github.event.pull_request.head.sha || github.sha }}
|
||||
|
||||
- name: Install rsync (required for the next step)
|
||||
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
|
||||
run: |
|
||||
sudo apt-get update && sudo apt-get install -y rsync
|
||||
|
||||
- name: Deploy PR preview or main site
|
||||
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
|
||||
uses: JamesIves/github-pages-deploy-action@v4
|
||||
with:
|
||||
branch: gh-pages
|
||||
folder: fallout2-ce-ems/dist
|
||||
target-folder: ${{ steps.set-path.outputs.DEST_DIR }}
|
||||
clean: false
|
||||
|
||||
- name: Comment preview URL on PR
|
||||
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
|
||||
run: |
|
||||
gh pr comment ${{ github.event.pull_request.number }} \
|
||||
--body "🚀 WebAssembly PR Preview for ${{github.event.pull_request.head.sha || github.sha }} is available at: https://${{ github.repository_owner }}.github.io/fallout2-ce/PR-${{ github.event.pull_request.number }}/"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
+210
-74
@@ -40,8 +40,32 @@ jobs:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Show clang-format version
|
||||
run: |
|
||||
clang-format --version
|
||||
|
||||
- name: clang-format
|
||||
run: find src -type f -name \*.cc -o -name \*.h | xargs clang-format --dry-run --Werror
|
||||
run: |
|
||||
if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then
|
||||
echo "Showing PR labels..."
|
||||
gh pr view ${{ github.event.pull_request.number }} --repo "${{ github.repository }}" --json labels
|
||||
echo "Checking labels on PR..."
|
||||
if gh pr view ${{ github.event.pull_request.number }} --repo "${{ github.repository }}" --json labels --jq '.labels[].name' | grep -q "skip-formatting"; then
|
||||
echo "skip-formatting label found - do not raise error"
|
||||
echo "==============================="
|
||||
find src -type f \( -name \*.cc -o -name \*.h \) | xargs clang-format --dry-run
|
||||
exit 0
|
||||
fi
|
||||
echo "skip-formatting label not found - raise error if formatting is not correct"
|
||||
else
|
||||
echo "Not a PR, do not check labels"
|
||||
fi
|
||||
|
||||
find src -type f \( -name \*.cc -o -name \*.h \) | xargs clang-format --dry-run --Werror
|
||||
|
||||
echo "Code is formatted correctly"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
android:
|
||||
name: Android
|
||||
@@ -63,7 +87,7 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: os/android/app/.cxx
|
||||
key: android-cmake-v1
|
||||
key: android-cmake-v2
|
||||
|
||||
- name: Setup signing config
|
||||
if: env.KEYSTORE_FILE_BASE64 != '' && env.KEYSTORE_PROPERTIES_FILE_BASE64 != ''
|
||||
@@ -80,17 +104,21 @@ jobs:
|
||||
cd os/android
|
||||
./gradlew assembleDebug
|
||||
|
||||
- name: Change apk file name
|
||||
run: |
|
||||
mv os/android/app/build/outputs/apk/debug/app-debug.apk os/android/app/build/outputs/apk/debug/fallout2-ce.apk
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fallout2-ce-debug.apk
|
||||
path: os/android/app/build/outputs/apk/debug/app-debug.apk
|
||||
path: os/android/app/build/outputs/apk/debug/fallout2-ce.apk
|
||||
retention-days: 7
|
||||
|
||||
ios:
|
||||
name: iOS
|
||||
|
||||
runs-on: macos-12
|
||||
runs-on: macos-14
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
@@ -99,44 +127,33 @@ jobs:
|
||||
- name: Cache cmake build
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: build
|
||||
key: ios-cmake-v2
|
||||
path: out
|
||||
key: ios-cmake-v5
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-D CMAKE_TOOLCHAIN_FILE=cmake/toolchain/ios.toolchain.cmake \
|
||||
-D ENABLE_BITCODE=0 \
|
||||
-D PLATFORM=OS64 \
|
||||
-G Xcode \
|
||||
-D CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY='' \
|
||||
# EOL
|
||||
cmake --preset ios
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake \
|
||||
--build build \
|
||||
--config RelWithDebInfo \
|
||||
-j $(sysctl -n hw.physicalcpu) \
|
||||
# EOL
|
||||
cmake --build --preset ios-debug
|
||||
|
||||
- name: Pack
|
||||
run: |
|
||||
cd build
|
||||
cpack -C RelWithDebInfo
|
||||
cd out/build/ios
|
||||
cpack -C Debug
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fallout2-ce.ipa
|
||||
path: build/fallout2-ce.ipa
|
||||
path: out/build/ios/fallout2-ce.ipa
|
||||
retention-days: 7
|
||||
|
||||
linux:
|
||||
name: Linux (${{ matrix.arch }})
|
||||
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -154,7 +171,6 @@ jobs:
|
||||
run: |
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo apt update
|
||||
sudo apt install --allow-downgrades libpcre2-8-0=10.34-7
|
||||
sudo apt install g++-multilib libsdl2-dev:i386 zlib1g-dev:i386
|
||||
|
||||
- name: Dependencies (x64)
|
||||
@@ -166,44 +182,103 @@ jobs:
|
||||
- name: Cache cmake build
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: build
|
||||
key: linux-${{ matrix.arch }}-cmake-v1
|
||||
path: out
|
||||
key: linux-${{ matrix.arch }}-cmake-v3
|
||||
|
||||
- name: Configure (x86)
|
||||
if: matrix.arch == 'x86'
|
||||
- name: Configure
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-D CMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-D CMAKE_TOOLCHAIN_FILE=cmake/toolchain/Linux32.cmake \
|
||||
# EOL
|
||||
|
||||
- name: Configure (x64)
|
||||
if: matrix.arch == 'x64'
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-D CMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
# EOL
|
||||
cmake --preset linux-${{ matrix.arch }}-debug
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake \
|
||||
--build build \
|
||||
-j $(nproc) \
|
||||
# EOL
|
||||
cmake --build --preset linux-${{ matrix.arch }}-debug
|
||||
|
||||
- name: Change executable file name
|
||||
run: |
|
||||
mv out/build/linux-${{ matrix.arch }}-debug/fallout2-ce out/build/linux-${{ matrix.arch }}-debug/fallout2-ce-linux-${{ matrix.arch }}
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fallout2-ce-linux-${{ matrix.arch }}
|
||||
path: build/fallout2-ce
|
||||
path: out/build/linux-${{ matrix.arch }}-debug/fallout2-ce-linux-${{ matrix.arch }}
|
||||
retention-days: 7
|
||||
|
||||
linux-armhf:
|
||||
name: Linux (armhf)
|
||||
|
||||
runs-on: ubuntu-22.04-arm
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Dependencies
|
||||
run: |
|
||||
sudo dpkg --add-architecture armhf
|
||||
sudo apt update
|
||||
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libsdl2-dev:armhf zlib1g-dev:armhf
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-D CMAKE_BUILD_TYPE=Debug \
|
||||
-D FALLOUT_VENDORED=OFF \
|
||||
-D CMAKE_SYSTEM_PROCESSOR=arm \
|
||||
-D CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
|
||||
-D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
|
||||
# EOL
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Change executable file name
|
||||
run: |
|
||||
mv build/fallout2-ce build/fallout2-ce-linux-armhf
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fallout2-ce-linux-armhf
|
||||
path: build/fallout2-ce-linux-armhf
|
||||
retention-days: 7
|
||||
|
||||
linux-arm64:
|
||||
name: Linux (arm64)
|
||||
|
||||
runs-on: ubuntu-22.04-arm
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Dependencies
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install libsdl2-dev zlib1g-dev
|
||||
|
||||
- name: Configure
|
||||
run: cmake -B build -D CMAKE_BUILD_TYPE=Debug -D FALLOUT_VENDORED=OFF
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Change executable file name
|
||||
run: |
|
||||
mv build/fallout2-ce build/fallout2-ce-linux-arm64
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fallout2-ce-linux-arm64
|
||||
path: build/fallout2-ce-linux-arm64
|
||||
retention-days: 7
|
||||
|
||||
macos:
|
||||
name: macOS
|
||||
|
||||
runs-on: macos-11
|
||||
runs-on: macos-14
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
@@ -212,35 +287,27 @@ jobs:
|
||||
- name: Cache cmake build
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: build
|
||||
key: macos-cmake-v4
|
||||
path: out
|
||||
key: macos-cmake-v6
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-G Xcode \
|
||||
-D CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY='' \
|
||||
# EOL
|
||||
cmake --preset macos
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake \
|
||||
--build build \
|
||||
--config RelWithDebInfo \
|
||||
-j $(sysctl -n hw.physicalcpu) \
|
||||
# EOL
|
||||
cmake --build --preset macos-debug
|
||||
|
||||
- name: Pack
|
||||
run: |
|
||||
cd build
|
||||
cpack -C RelWithDebInfo
|
||||
cd out/build/macos
|
||||
cpack -C Debug
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fallout2-ce-macos.dmg
|
||||
path: build/Fallout II Community Edition.dmg
|
||||
path: out/build/macos/Fallout II Community Edition.dmg
|
||||
retention-days: 7
|
||||
|
||||
windows:
|
||||
@@ -264,27 +331,96 @@ jobs:
|
||||
- name: Cache cmake build
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: build
|
||||
key: windows-${{ matrix.arch }}-cmake-v1
|
||||
path: out
|
||||
key: windows-${{ matrix.arch }}-cmake-v2
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-G "Visual Studio 16 2019" \
|
||||
-A ${{ matrix.generator-platform }} \
|
||||
# EOL
|
||||
cmake --preset windows-${{ matrix.arch }}
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake \
|
||||
--build build \
|
||||
--config RelWithDebInfo \
|
||||
# EOL
|
||||
cmake --build --preset windows-${{ matrix.arch }}-release
|
||||
|
||||
- name: Change executable file name
|
||||
run: |
|
||||
mv out/build/windows-${{ matrix.arch }}/RelWithDebInfo/fallout2-ce.exe out/build/windows-${{ matrix.arch }}/RelWithDebInfo/fallout2-ce-${{ matrix.arch }}.exe
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fallout2-ce-windows-${{ matrix.arch }}
|
||||
path: build/RelWithDebInfo/fallout2-ce.exe
|
||||
path: out/build/windows-${{ matrix.arch }}/RelWithDebInfo/fallout2-ce-${{ matrix.arch }}.exe
|
||||
retention-days: 7
|
||||
|
||||
|
||||
release:
|
||||
name: Release Continuous build
|
||||
runs-on: ubuntu-latest
|
||||
needs: [android, ios, linux, linux-armhf, linux-arm64, macos, windows]
|
||||
permissions: write-all
|
||||
steps:
|
||||
- name: Fetch artifacts
|
||||
if: ${{ always() && github.ref == 'refs/heads/main' && github.event_name == 'push' }}
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
path: artifacts/
|
||||
|
||||
- name: Remove old release
|
||||
if: ${{ always() && github.ref == 'refs/heads/main' && github.event_name == 'push' }}
|
||||
uses: dev-drprasad/delete-tag-and-release@v0.2.1
|
||||
with:
|
||||
delete_release: true
|
||||
tag_name: continious
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Move unpacked artifacts to root folder
|
||||
if: ${{ always() && github.ref == 'refs/heads/main' && github.event_name == 'push' }}
|
||||
run: |
|
||||
ls -Rlah .
|
||||
find .
|
||||
cd artifacts/
|
||||
for folder in *; do
|
||||
if [[ -d "$folder" && "$folder" != "." ]]; then
|
||||
echo "Processing $folder"
|
||||
mv "$folder" "$folder.dir"
|
||||
cd "$folder.dir"
|
||||
for file in *; do
|
||||
if [ -f "$file" ]; then
|
||||
if [ -f "../$file" ]; then
|
||||
echo "ERROR: Duplicate artifact file name $file"
|
||||
exit 1
|
||||
fi
|
||||
if [ -d "../$file" ]; then
|
||||
echo "ERROR: Duplicate artifact folder $file"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Moving $file"
|
||||
mv "$file" "../$file"
|
||||
fi
|
||||
done
|
||||
cd ..
|
||||
rm -rf "$folder.dir"
|
||||
fi
|
||||
done
|
||||
ls -Rlah .
|
||||
find .
|
||||
cd ../
|
||||
|
||||
- name: Allow GitHub to process removed release for few seconds
|
||||
if: ${{ always() && github.ref == 'refs/heads/main' && github.event_name == 'push' }}
|
||||
run: |
|
||||
sleep 20s
|
||||
|
||||
- name: Upload new release
|
||||
if: ${{ always() && github.ref == 'refs/heads/main' && github.event_name == 'push' }}
|
||||
uses: softprops/action-gh-release@v0.1.15
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
files: artifacts/*
|
||||
tag_name: continious
|
||||
draft: false
|
||||
prerelease: true
|
||||
name: Fallout2-CE Continuous Build
|
||||
@@ -0,0 +1,33 @@
|
||||
name: Cleanup PR Preview
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
|
||||
jobs:
|
||||
delete_pr_preview:
|
||||
name: Delete PR preview from gh-pages
|
||||
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout gh-pages branch
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: gh-pages
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Remove PR preview folder
|
||||
run: |
|
||||
PR_FOLDER="PR-${{ github.event.pull_request.number }}"
|
||||
echo "Removing preview folder: $PR_FOLDER"
|
||||
git rm -r --ignore-unmatch "$PR_FOLDER" || true
|
||||
|
||||
- name: Commit and push changes
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
git commit -am "đźš® Remove preview for closed PR #${{ github.event.pull_request.number }}"
|
||||
git push
|
||||
@@ -59,7 +59,7 @@ jobs:
|
||||
ios:
|
||||
name: iOS
|
||||
|
||||
runs-on: macos-12
|
||||
runs-on: macos-14
|
||||
|
||||
steps:
|
||||
- name: Clone
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
.DS_Store
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
@@ -388,6 +389,13 @@ FodyWeavers.xsd
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# VSCode
|
||||
.vscode
|
||||
|
||||
# CMake
|
||||
/out
|
||||
/build
|
||||
|
||||
# versioning header
|
||||
src/platform/git_version.h
|
||||
CMakeUserPresets.json
|
||||
|
||||
+121
-16
@@ -1,4 +1,4 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
||||
|
||||
@@ -6,10 +6,10 @@ set(EXECUTABLE_NAME fallout2-ce)
|
||||
|
||||
if(APPLE)
|
||||
if(IOS)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "11" CACHE STRING "")
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "12" CACHE STRING "")
|
||||
set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "")
|
||||
else()
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "")
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "")
|
||||
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "")
|
||||
endif()
|
||||
endif()
|
||||
@@ -20,12 +20,17 @@ set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
||||
set(CMAKE_CXX_EXTENSIONS NO)
|
||||
|
||||
option(FALLOUT_VENDORED "Use vendored third-party libraries" ON)
|
||||
|
||||
if(ANDROID)
|
||||
add_library(${EXECUTABLE_NAME} SHARED)
|
||||
else()
|
||||
add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE)
|
||||
endif()
|
||||
|
||||
# Git Info
|
||||
include("cmake/gitver.cmake")
|
||||
|
||||
target_sources(${EXECUTABLE_NAME} PUBLIC
|
||||
"src/actions.cc"
|
||||
"src/actions.h"
|
||||
@@ -197,8 +202,6 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
|
||||
"src/scripts.h"
|
||||
"src/select_file_list.cc"
|
||||
"src/select_file_list.h"
|
||||
"src/selfrun.cc"
|
||||
"src/selfrun.h"
|
||||
"src/skill_defs.h"
|
||||
"src/skill.cc"
|
||||
"src/skill.h"
|
||||
@@ -225,11 +228,11 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
|
||||
"src/text_object.h"
|
||||
"src/tile.cc"
|
||||
"src/tile.h"
|
||||
"src/tile_hires_stencil.cc"
|
||||
"src/tile_hires_stencil.h"
|
||||
"src/trait_defs.h"
|
||||
"src/trait.cc"
|
||||
"src/trait.h"
|
||||
"src/vcr.cc"
|
||||
"src/vcr.h"
|
||||
"src/version.cc"
|
||||
"src/version.h"
|
||||
"src/widget.cc"
|
||||
@@ -267,6 +270,8 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
|
||||
"src/settings.h"
|
||||
"src/sfall_config.cc"
|
||||
"src/sfall_config.h"
|
||||
"src/sfall_ext.cc"
|
||||
"src/sfall_ext.h"
|
||||
"src/sfall_global_vars.cc"
|
||||
"src/sfall_global_vars.h"
|
||||
"src/sfall_global_scripts.cc"
|
||||
@@ -300,12 +305,14 @@ if(WIN32)
|
||||
_CRT_NONSTDC_NO_WARNINGS
|
||||
NOMINMAX
|
||||
WIN32_LEAN_AND_MEAN
|
||||
_STATIC_CPPLIB
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
target_link_libraries(${EXECUTABLE_NAME}
|
||||
winmm
|
||||
libcpmt
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -360,18 +367,64 @@ if(APPLE)
|
||||
set(MACOSX_BUNDLE_BUNDLE_VERSION "1.3.0")
|
||||
endif()
|
||||
|
||||
add_subdirectory("third_party/fpattern")
|
||||
target_link_libraries(${EXECUTABLE_NAME} ${FPATTERN_LIBRARY})
|
||||
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${FPATTERN_INCLUDE_DIR})
|
||||
|
||||
if((NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux") AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD"))
|
||||
add_subdirectory("third_party/zlib")
|
||||
add_subdirectory("third_party/sdl2")
|
||||
if((NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten"))
|
||||
if(FALLOUT_VENDORED)
|
||||
add_subdirectory("third_party/zlib")
|
||||
add_subdirectory("third_party/sdl2")
|
||||
else()
|
||||
find_package(ZLIB)
|
||||
find_package(SDL2)
|
||||
endif()
|
||||
else()
|
||||
find_package(ZLIB)
|
||||
find_package(SDL2)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
|
||||
--use-port=sdl2 \
|
||||
--use-port=sdl2_mixer \
|
||||
--use-port=zlib" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
|
||||
--use-port=sdl2 \
|
||||
--use-port=sdl2_mixer \
|
||||
--use-port=zlib \
|
||||
-std=c++17" )
|
||||
|
||||
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
|
||||
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O1")
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O1")
|
||||
|
||||
if(OPTION_WASM_64)
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sMEMORY64" )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -sMEMORY64" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -sMEMORY64" )
|
||||
add_compile_options( -sMEMORY64 )
|
||||
endif()
|
||||
|
||||
if(OPTION_WASM_JSPI)
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sJSPI" )
|
||||
else()
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sASYNCIFY" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sASYNCIFY_STACK_SIZE=20480" )
|
||||
endif()
|
||||
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sENVIRONMENT=web" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sALLOW_MEMORY_GROWTH" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-MEMORY_GROWTH_LINEAR_STEP=32mb" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sNO_DISABLE_EXCEPTION_CATCHING" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-lidbfs.js" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sCASE_INSENSITIVE_FS" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sMODULARIZE" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXPORTED_RUNTIME_METHODS=callMain,addRunDependency,removeRunDependency" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXPORT_ALL" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXPORT_NAME=fallout2ce" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXIT_RUNTIME" )
|
||||
target_link_options( ${EXECUTABLE_NAME} PRIVATE "$<$<CONFIG:DEBUG>:-g>" )
|
||||
endif()
|
||||
|
||||
|
||||
add_subdirectory("third_party/fpattern")
|
||||
target_link_libraries(${EXECUTABLE_NAME} fpattern::fpattern)
|
||||
|
||||
target_link_libraries(${EXECUTABLE_NAME} ${ZLIB_LIBRARIES})
|
||||
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${ZLIB_INCLUDE_DIRS})
|
||||
|
||||
@@ -396,3 +449,55 @@ if(APPLE)
|
||||
|
||||
include(CPack)
|
||||
endif()
|
||||
|
||||
# Add option to enable AddressSanitizer
|
||||
option(ENABLE_ASAN "Enable AddressSanitizer for debug builds" OFF)
|
||||
|
||||
# Set C++ standard and other existing settings
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
||||
set(CMAKE_CXX_EXTENSIONS NO)
|
||||
|
||||
# Define ASan flags for supported compilers (GCC, Clang, MSVC)
|
||||
if(ENABLE_ASAN)
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Emscripten|Android|iOS")
|
||||
message(WARNING "AddressSanitizer is not supported on ${CMAKE_SYSTEM_NAME}. Disabling ASan.")
|
||||
set(ENABLE_ASAN OFF)
|
||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
message(STATUS "Enabling AddressSanitizer for debug build (GCC/Clang)")
|
||||
set(ASAN_FLAGS "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls")
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
# Check if using clang-cl or native MSVC
|
||||
if(CMAKE_CXX_COMPILER MATCHES "clang-cl")
|
||||
message(STATUS "Enabling AddressSanitizer for debug build (clang-cl)")
|
||||
set(ASAN_FLAGS "-fsanitize=address -fno-omit-frame-pointer")
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=address")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -fsanitize=address")
|
||||
else()
|
||||
message(STATUS "Enabling AddressSanitizer for debug build (MSVC)")
|
||||
set(ASAN_FLAGS "/fsanitize=address")
|
||||
# MSVC requires /Zi or /Z7 for debug info with ASan
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${ASAN_FLAGS} /Zi")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${ASAN_FLAGS} /Zi")
|
||||
# No additional linker flags needed for MSVC ASan
|
||||
# Disable incremental linking as it's incompatible with ASan
|
||||
string(REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
|
||||
string(REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
|
||||
endif()
|
||||
else()
|
||||
message(WARNING "AddressSanitizer is not supported with ${CMAKE_CXX_COMPILER_ID}. Disabling ASan.")
|
||||
set(ENABLE_ASAN OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Existing debug flags for Emscripten (ensure ASan doesn't conflict)
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Emscripten")
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
{
|
||||
"version": 6,
|
||||
"cmakeMinimumRequired": {
|
||||
"major": 3,
|
||||
"minor": 19,
|
||||
"patch": 0
|
||||
},
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "base",
|
||||
"hidden": true,
|
||||
"binaryDir": "${sourceDir}/out/build/${presetName}"
|
||||
},
|
||||
{
|
||||
"name": "windows-base",
|
||||
"hidden": true,
|
||||
"inherits": [
|
||||
"base"
|
||||
],
|
||||
"condition": {
|
||||
"type": "equals",
|
||||
"lhs": "${hostSystemName}",
|
||||
"rhs": "Windows"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "windows-x86",
|
||||
"inherits": [
|
||||
"windows-base"
|
||||
],
|
||||
"generator": "Visual Studio 16 2019",
|
||||
"architecture": "Win32",
|
||||
"cacheVariables": {
|
||||
"CMAKE_GENERATOR_TOOLSET": "v141_xp",
|
||||
"CMAKE_C_FLAGS": "/D_WIN32_WINNT=0x0501",
|
||||
"CMAKE_CXX_FLAGS": "/D_WIN32_WINNT=0x0501 /D_STATIC_CPPLIB",
|
||||
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$<CONFIG:Debug>:Debug>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "windows-x64",
|
||||
"inherits": [
|
||||
"windows-base"
|
||||
],
|
||||
"generator": "Visual Studio 16 2019",
|
||||
"architecture": "x64",
|
||||
"cacheVariables": {
|
||||
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$<CONFIG:Debug>:Debug>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "linux-base",
|
||||
"hidden": true,
|
||||
"inherits": [
|
||||
"base"
|
||||
],
|
||||
"condition": {
|
||||
"type": "equals",
|
||||
"lhs": "${hostSystemName}",
|
||||
"rhs": "Linux"
|
||||
},
|
||||
"cacheVariables": {
|
||||
"FALLOUT_VENDORED": "OFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "linux-x86-base",
|
||||
"hidden": true,
|
||||
"inherits": [
|
||||
"linux-base"
|
||||
],
|
||||
"cacheVariables": {
|
||||
"CMAKE_C_FLAGS": "-m32",
|
||||
"CMAKE_CXX_FLAGS": "-m32",
|
||||
"CMAKE_SYSTEM_NAME": "Linux",
|
||||
"CMAKE_SYSTEM_PROCESSOR": "i386"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "linux-x86-debug",
|
||||
"inherits": [
|
||||
"linux-x86-base"
|
||||
],
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "Debug"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "linux-x86-release",
|
||||
"inherits": [
|
||||
"linux-x86-base"
|
||||
],
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "linux-x64-debug",
|
||||
"inherits": [
|
||||
"linux-base"
|
||||
],
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "Debug"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "linux-x64-release",
|
||||
"inherits": [
|
||||
"linux-base"
|
||||
],
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "darwin-base",
|
||||
"hidden": true,
|
||||
"inherits": [
|
||||
"base"
|
||||
],
|
||||
"generator": "Xcode",
|
||||
"cacheVariables": {
|
||||
"CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY": ""
|
||||
},
|
||||
"condition": {
|
||||
"type": "equals",
|
||||
"lhs": "${hostSystemName}",
|
||||
"rhs": "Darwin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "macos",
|
||||
"inherits": [
|
||||
"darwin-base"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ios",
|
||||
"inherits": [
|
||||
"darwin-base"
|
||||
],
|
||||
"cacheVariables": {
|
||||
"CMAKE_SYSTEM_NAME": "iOS"
|
||||
}
|
||||
}
|
||||
],
|
||||
"buildPresets": [
|
||||
{
|
||||
"name": "windows-x86-debug",
|
||||
"configurePreset": "windows-x86",
|
||||
"configuration": "Debug"
|
||||
},
|
||||
{
|
||||
"name": "windows-x86-release",
|
||||
"configurePreset": "windows-x86",
|
||||
"configuration": "RelWithDebInfo"
|
||||
},
|
||||
{
|
||||
"name": "windows-x64-debug",
|
||||
"configurePreset": "windows-x64",
|
||||
"configuration": "Debug"
|
||||
},
|
||||
{
|
||||
"name": "windows-x64-release",
|
||||
"configurePreset": "windows-x64",
|
||||
"configuration": "RelWithDebInfo"
|
||||
},
|
||||
{
|
||||
"name": "linux-x86-debug",
|
||||
"configurePreset": "linux-x86-debug"
|
||||
},
|
||||
{
|
||||
"name": "linux-x86-release",
|
||||
"configurePreset": "linux-x86-release"
|
||||
},
|
||||
{
|
||||
"name": "linux-x64-debug",
|
||||
"configurePreset": "linux-x64-debug"
|
||||
},
|
||||
{
|
||||
"name": "linux-x64-release",
|
||||
"configurePreset": "linux-x64-release"
|
||||
},
|
||||
{
|
||||
"name": "macos-debug",
|
||||
"configurePreset": "macos",
|
||||
"configuration": "Debug"
|
||||
},
|
||||
{
|
||||
"name": "macos-release",
|
||||
"configurePreset": "macos",
|
||||
"configuration": "RelWithDebInfo"
|
||||
},
|
||||
{
|
||||
"name": "ios-debug",
|
||||
"configurePreset": "ios",
|
||||
"configuration": "Debug"
|
||||
},
|
||||
{
|
||||
"name": "ios-release",
|
||||
"configurePreset": "ios",
|
||||
"configuration": "RelWithDebInfo"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "x86-Debug",
|
||||
"generator": "Visual Studio 16 2019",
|
||||
"configurationType": "Debug",
|
||||
"inheritEnvironments": [ "msvc_x86" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": ""
|
||||
},
|
||||
{
|
||||
"name": "x86-Release",
|
||||
"generator": "Visual Studio 16 2019",
|
||||
"configurationType": "Release",
|
||||
"inheritEnvironments": [ "msvc_x86" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": ""
|
||||
},
|
||||
{
|
||||
"name": "x64-Debug",
|
||||
"generator": "Visual Studio 16 2019 Win64",
|
||||
"configurationType": "Debug",
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"inheritEnvironments": [ "msvc_x64_x64" ],
|
||||
"variables": []
|
||||
},
|
||||
{
|
||||
"name": "x64-Release",
|
||||
"generator": "Visual Studio 16 2019 Win64",
|
||||
"configurationType": "Release",
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"inheritEnvironments": [ "msvc_x64_x64" ],
|
||||
"variables": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
# Fallout 2 Community Edition
|
||||
|
||||
Fallout 2 Community Edition is a fully working re-implementation of Fallout 2, with the same original gameplay, engine bugfixes, and some quality of life improvements, that works (mostly) hassle-free on multiple platforms.
|
||||
Fallout 2 Community Edition is a fully working re-implementation of Fallout 2, with the same original gameplay, engine bugfixes, and some quality of life improvements, that works (mostly) hassle-free on multiple platforms. This is a fork of the original project, which isn't getting regular updates.
|
||||
|
||||
Popular Fallout 2 total conversion mods are partially supported. Original versions of Nevada and Sonora (that do not rely on extended features provided by Sfall) likely work, although there is no complete walkthrough confirmation yet. [Fallout 2 Restoration Project](https://github.com/BGforgeNet/Fallout2_Restoration_Project), [Fallout Et Tu](https://github.com/rotators/Fo1in2) and [Olympus 2207](https://olympus2207.com) are not yet supported. Other mods (particularly Resurrection and Yesterday) are not tested.
|
||||
Popular Fallout 2 total conversion mods are partially supported. Original versions of Nevada and Sonora (that do not rely on extended features provided by Sfall) work. [Fallout 2 Restoration Project](https://github.com/BGforgeNet/Fallout2_Restoration_Project), [Fallout Et Tu](https://github.com/rotators/Fo1in2) and [Olympus 2207](https://olympus2207.com) are not yet supported. Other mods (particularly Resurrection and Yesterday) are not tested.
|
||||
|
||||
There is also [Fallout Community Edition](https://github.com/alexbatalov/fallout1-ce).
|
||||
There is also [Fallout Community Edition](https://github.com/alexbatalov/fallout1-ce) (not affiliated with this fork).
|
||||
|
||||
## Installation
|
||||
|
||||
You must own the game to play. Purchase your copy on [GOG](https://www.gog.com/game/fallout_2) or [Steam](https://store.steampowered.com/app/38410). Download latest [release](https://github.com/alexbatalov/fallout2-ce/releases) or build from source. You can also check latest [debug](https://github.com/alexbatalov/fallout2-ce/actions) build intended for testers.
|
||||
You must own the game to play. Purchase your copy on [GOG](https://www.gog.com/game/fallout_2), [Epic Games](https://store.epicgames.com/p/fallout-2) or [Steam](https://store.steampowered.com/app/38410). Download latest [release](https://github.com/fallout2-ce/fallout2-ce/releases) or build from source.
|
||||
|
||||
### Windows
|
||||
|
||||
@@ -18,6 +18,14 @@ Download and copy `fallout2-ce.exe` to your `Fallout2` folder. It serves as a dr
|
||||
|
||||
- Use Windows installation as a base - it contains data assets needed to play. Copy `Fallout2` folder somewhere, for example `/home/john/Desktop/Fallout2`.
|
||||
|
||||
- Alternatively you can extract the needed files from the GoG installer:
|
||||
|
||||
```console
|
||||
$ sudo apt install innoextract
|
||||
$ innoextract ~/Downloads/setup_fallout2_2.1.0.18.exe -I app
|
||||
$ mv app Fallout2
|
||||
```
|
||||
|
||||
- Download and copy `fallout2-ce` to this folder.
|
||||
|
||||
- Install [SDL2](https://libsdl.org/download-2.0.php):
|
||||
@@ -36,6 +44,14 @@ $ sudo apt install libsdl2-2.0-0
|
||||
|
||||
- Alternatively you can use Fallout 2 from Macplay/The Omni Group as a base - you need to extract game assets from the original bundle. Mount CD/DMG, right click `Fallout 2` -> `Show Package Contents`, navigate to `Contents/Resources`. Copy `GameData` folder somewhere, for example `/Applications/Fallout2`.
|
||||
|
||||
- Or if you're a Terminal user and have Homebrew installed you can extract the needed files from the GoG installer:
|
||||
|
||||
```console
|
||||
$ brew install innoextract
|
||||
$ innoextract ~/Downloads/setup_fallout2_2.1.0.18.exe -I app
|
||||
$ mv app /Applications/Fallout2
|
||||
```
|
||||
|
||||
- Download and copy `fallout2-ce.app` to this folder.
|
||||
|
||||
- Run `fallout2-ce.app`.
|
||||
@@ -66,6 +82,14 @@ $ sudo apt install libsdl2-2.0-0
|
||||
|
||||
- Use Finder (macOS Catalina and later) or iTunes (Windows and macOS Mojave or earlier) to copy `master.dat`, `critter.dat`, `patch000.dat`, and `data` folder to "Fallout 2" app ([how-to](https://support.apple.com/HT210598)). Watch for file names - keep (or make) them lowercased (see [Configuration](#configuration)).
|
||||
|
||||
### Browser
|
||||
|
||||
> **NOTE**: WebAssebly build with emscripten
|
||||
```
|
||||
docker run --rm -v $(pwd):/src emscripten/emsdk:3.1.74 sh -c 'git config --global --add safe.directory "*" && mkdir -p build && cd build && emcmake cmake ../ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain/Emscripten.cmake && emmake make'
|
||||
```
|
||||
- Demo available at https://github.com/ololoken/fallout2-ce-ems.git
|
||||
|
||||
## Configuration
|
||||
|
||||
The main configuration file is `fallout2.cfg`. There are several important settings you might need to adjust for your installation. Depending on your Fallout distribution main game assets `master.dat`, `critter.dat`, `patch000.dat`, and `data` folder might be either all lowercased, or all uppercased. You can either update `master_dat`, `critter_dat`, `master_patches` and `critter_patches` settings to match your file names, or rename files to match entries in your `fallout2.cfg`.
|
||||
@@ -78,7 +102,11 @@ The second configuration file is `f2_res.ini`. Use it to change game window size
|
||||
[MAIN]
|
||||
SCR_WIDTH=1280
|
||||
SCR_HEIGHT=720
|
||||
WINDOWED=1
|
||||
WINDOWED=1 ; 0 = fullscreen
|
||||
SCALE_2X=1 ; 0 = original scale, 1 = 2x
|
||||
|
||||
[IFACE]
|
||||
IFACE_BAR_MODE, IFACE_BAR_SIDE_ART, IFACE_BAR_SIDES_ORI, IFACE_BAR_WIDTH supported (require assets in appropriate places)
|
||||
```
|
||||
|
||||
Recommendations:
|
||||
@@ -88,7 +116,10 @@ Recommendations:
|
||||
|
||||
In time this stuff will receive in-game interface, right now you have to do it manually.
|
||||
|
||||
The third configuration file is `ddraw.ini` (part of Sfall). There are dozens of options that adjust or override engine behaviour and gameplay mechanics. This file is intended for modders and advanced users. Currently only a small subset of these settings are actually implemented.
|
||||
The third configuration file is `ddraw.ini` (part of Sfall). There are dozens of options that adjust or override engine behaviour and gameplay mechanics. This file is intended for modders and advanced users. Currently only a small subset of these settings are actually implemented. For high res configs, the following is recommended:
|
||||
```[Main]
|
||||
HiResMode=1
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# Get author name
|
||||
execute_process(
|
||||
COMMAND git log -1 --pretty=format:%an
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE AUTHOR
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
# Get current branch
|
||||
execute_process(
|
||||
COMMAND git branch --show-current
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE BRANCH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
# Get hash of the latest commit
|
||||
execute_process(
|
||||
COMMAND git log --pretty=format:%h -n 1
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
# Get last tag
|
||||
execute_process(
|
||||
COMMAND git describe --tags --abbrev=0
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE LATEST_TAG
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
# Get date of the latest commit
|
||||
execute_process(
|
||||
COMMAND git log -1 --date=format:"%b %d %Y %H:%M:%S" --pretty=format:%cd
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE DATE
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
# Define a variable for CI_BUILD
|
||||
set(CI_BUILD 0)
|
||||
|
||||
# Create git_version.h file
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/platform/git_version.h.in
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/platform/git_version.h
|
||||
)
|
||||
@@ -0,0 +1,18 @@
|
||||
set( CMAKE_SYSTEM_NAME "Emscripten" )
|
||||
|
||||
add_compile_definitions("DEBUG=$<CONFIG:Debug>")
|
||||
|
||||
set( CMAKE_C_COMPILER "emcc" )
|
||||
set( CMAKE_CXX_COMPILER "em++" )
|
||||
|
||||
|
||||
|
||||
set( EXECUTABLE_NAME fallout2-ce.js )
|
||||
|
||||
option(OPTION_WASM_64 "Build wasm64 module" OFF)
|
||||
option(OPTION_WASM_JSPI "Build wasm with JSPI support instead of asyncify module" OFF)
|
||||
|
||||
# Touch toolchain variable to suppress "unused variable" warning.
|
||||
# This happens if CMake is invoked with the same command line the second time.
|
||||
if(CMAKE_TOOLCHAIN_FILE)
|
||||
endif()
|
||||
@@ -1,4 +0,0 @@
|
||||
set( CMAKE_SYSTEM_NAME "Linux" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "i386" )
|
||||
set( CMAKE_C_FLAGS "-m32" )
|
||||
set( CMAKE_CXX_FLAGS "-m32" )
|
||||
File diff suppressed because it is too large
Load Diff
+114
-99
@@ -73,30 +73,32 @@ static const int gMaximumBloodDeathAnimations[DAMAGE_TYPE_COUNT] = {
|
||||
ANIM_EXPLODED_TO_NOTHING,
|
||||
};
|
||||
|
||||
// Note: some of these are callbacks that always take two Object*, but may not use them.
|
||||
// Ignored parameters are marked with underscores.
|
||||
static int actionKnockdown(Object* obj, int* anim, int maxDistance, int rotation, int delay);
|
||||
static int _action_blood(Object* obj, int anim, int delay);
|
||||
static int _pick_death(Object* attacker, Object* defender, Object* weapon, int damage, int attackerAnimation, bool hitFromFront);
|
||||
static int _check_death(Object* obj, int anim, int minViolenceLevel, bool hitFromFront);
|
||||
static int _internal_destroy(Object* a1, Object* a2);
|
||||
static int _internal_destroy(Object* _, Object* toDestroy);
|
||||
static void _show_damage_to_object(Object* defender, int damage, int flags, Object* weapon, bool hitFromFront, int knockbackDistance, int knockbackRotation, int attackerAnimation, Object* attacker, int delay);
|
||||
static int _show_death(Object* obj, int anim);
|
||||
static int _show_damage_extras(Attack* attack);
|
||||
static void _show_damage(Attack* attack, int attackerAnimation, int delay);
|
||||
static int _action_melee(Attack* attack, int a2);
|
||||
static int _action_ranged(Attack* attack, int a2);
|
||||
static int _is_next_to(Object* a1, Object* a2);
|
||||
static int _action_climb_ladder(Object* a1, Object* a2);
|
||||
static int _action_melee(Attack* attack, int anim);
|
||||
static int _action_ranged(Attack* attack, int anim);
|
||||
static int _is_next_to(Object* obj1, Object* obj2);
|
||||
static int _action_climb_ladder(Object* critter, Object* ladder);
|
||||
static int _action_use_skill_in_combat_error(Object* critter);
|
||||
static int _pick_fall(Object* obj, int anim);
|
||||
static int _report_explosion(Attack* attack, Object* sourceObj);
|
||||
static int _finished_explosion(Object* a1, Object* a2);
|
||||
static int _finished_explosion(Object*, Object*);
|
||||
static int _compute_explosion_damage(int min, int max, Object* defender, int* knockbackDistancePtr);
|
||||
static int _can_talk_to(Object* a1, Object* a2);
|
||||
static int _talk_to(Object* a1, Object* a2);
|
||||
static int _report_dmg(Attack* attack, Object* a2);
|
||||
static int _can_talk_to(Object* obj, Object* critter);
|
||||
static int _talk_to(Object* _, Object* critter);
|
||||
static int _report_dmg(Attack* attack, Object* _);
|
||||
static int _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr, int damageType);
|
||||
|
||||
static int hideProjectile(void* a1, void* a2);
|
||||
static int hideProjectile(void* _, void* projectile);
|
||||
|
||||
// 0x410468
|
||||
int actionKnockdown(Object* obj, int* anim, int maxDistance, int rotation, int delay)
|
||||
@@ -281,9 +283,9 @@ int _check_death(Object* obj, int anim, int minViolenceLevel, bool hitFromFront)
|
||||
}
|
||||
|
||||
// 0x4108C8
|
||||
int _internal_destroy(Object* a1, Object* a2)
|
||||
int _internal_destroy(Object* _, Object* toDestroy)
|
||||
{
|
||||
return _obj_destroy(a2);
|
||||
return _obj_destroy(toDestroy);
|
||||
}
|
||||
|
||||
// TODO: Check very carefully, lots of conditions and jumps.
|
||||
@@ -463,7 +465,7 @@ void _show_damage_to_object(Object* defender, int damage, int flags, Object* wea
|
||||
|
||||
if ((flags & DAM_DEAD) != 0) {
|
||||
// TODO: Get rid of casts.
|
||||
animationRegisterCallbackForced(defender, (void*)anim, (AnimationCallback*)_show_death, -1);
|
||||
animationRegisterCallbackForced(defender, (void*)(uintptr_t)anim, (AnimationCallback*)_show_death, -1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -985,10 +987,10 @@ int _action_ranged(Attack* attack, int anim)
|
||||
}
|
||||
|
||||
// 0x411D68
|
||||
int _is_next_to(Object* a1, Object* a2)
|
||||
int _is_next_to(Object* obj1, Object* obj2)
|
||||
{
|
||||
if (objectGetDistanceBetween(a1, a2) > 1) {
|
||||
if (a2 == gDude) {
|
||||
if (objectGetDistanceBetween(obj1, obj2) > 1) {
|
||||
if (obj2 == gDude) {
|
||||
MessageListItem messageListItem;
|
||||
// You cannot get there.
|
||||
messageListItem.num = 2000;
|
||||
@@ -1003,9 +1005,9 @@ int _is_next_to(Object* a1, Object* a2)
|
||||
}
|
||||
|
||||
// 0x411DB4
|
||||
int _action_climb_ladder(Object* a1, Object* a2)
|
||||
int _action_climb_ladder(Object* critter, Object* ladder)
|
||||
{
|
||||
if (a1 == gDude) {
|
||||
if (critter == gDude) {
|
||||
int anim = FID_ANIM_TYPE(gDude->fid);
|
||||
if (anim == ANIM_WALK || anim == ANIM_RUNNING) {
|
||||
reg_anim_clear(gDude);
|
||||
@@ -1016,44 +1018,46 @@ int _action_climb_ladder(Object* a1, Object* a2)
|
||||
int actionPoints;
|
||||
if (isInCombat()) {
|
||||
animationRequestOptions = ANIMATION_REQUEST_RESERVED;
|
||||
actionPoints = a1->data.critter.combat.ap;
|
||||
actionPoints = critter->data.critter.combat.ap;
|
||||
} else {
|
||||
animationRequestOptions = ANIMATION_REQUEST_UNRESERVED;
|
||||
actionPoints = -1;
|
||||
}
|
||||
|
||||
if (a1 == gDude) {
|
||||
if (critter == gDude) {
|
||||
animationRequestOptions = ANIMATION_REQUEST_RESERVED;
|
||||
}
|
||||
|
||||
animationRequestOptions |= ANIMATION_REQUEST_NO_STAND;
|
||||
reg_anim_begin(animationRequestOptions);
|
||||
|
||||
int tile = tileGetTileInDirection(a2->tile, ROTATION_SE, 1);
|
||||
if (actionPoints != -1 || objectGetDistanceBetween(a1, a2) < 5) {
|
||||
animationRegisterMoveToTile(a1, tile, a2->elevation, actionPoints, 0);
|
||||
int tile = tileGetTileInDirection(ladder->tile, ROTATION_SE, 1);
|
||||
int walkDistance = 5;
|
||||
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_USE_WALK_DISTANCE, &walkDistance);
|
||||
if (actionPoints != -1 || objectGetDistanceBetween(critter, ladder) < walkDistance) {
|
||||
animationRegisterMoveToTile(critter, tile, ladder->elevation, actionPoints, 0);
|
||||
} else {
|
||||
animationRegisterRunToTile(a1, tile, a2->elevation, actionPoints, 0);
|
||||
animationRegisterRunToTile(critter, tile, ladder->elevation, actionPoints, 0);
|
||||
}
|
||||
|
||||
animationRegisterCallbackForced(a1, a2, (AnimationCallback*)_is_next_to, -1);
|
||||
animationRegisterRotateToTile(a1, a2->tile);
|
||||
animationRegisterCallbackForced(a1, a2, (AnimationCallback*)_check_scenery_ap_cost, -1);
|
||||
animationRegisterCallbackForced(critter, ladder, (AnimationCallback*)_is_next_to, -1);
|
||||
animationRegisterRotateToTile(critter, ladder->tile);
|
||||
animationRegisterCallbackForced(critter, ladder, (AnimationCallback*)_check_scenery_ap_cost, -1);
|
||||
|
||||
int weaponAnimationCode = (a1->fid & 0xF000) >> 12;
|
||||
int weaponAnimationCode = (critter->fid & 0xF000) >> 12;
|
||||
if (weaponAnimationCode != 0) {
|
||||
const char* puttingAwaySfx = sfxBuildCharName(a1, ANIM_PUT_AWAY, CHARACTER_SOUND_EFFECT_UNUSED);
|
||||
animationRegisterPlaySoundEffect(a1, puttingAwaySfx, -1);
|
||||
animationRegisterAnimate(a1, ANIM_PUT_AWAY, 0);
|
||||
const char* puttingAwaySfx = sfxBuildCharName(critter, ANIM_PUT_AWAY, CHARACTER_SOUND_EFFECT_UNUSED);
|
||||
animationRegisterPlaySoundEffect(critter, puttingAwaySfx, -1);
|
||||
animationRegisterAnimate(critter, ANIM_PUT_AWAY, 0);
|
||||
}
|
||||
|
||||
const char* climbingSfx = sfxBuildCharName(a1, ANIM_CLIMB_LADDER, CHARACTER_SOUND_EFFECT_UNUSED);
|
||||
animationRegisterPlaySoundEffect(a1, climbingSfx, -1);
|
||||
animationRegisterAnimate(a1, ANIM_CLIMB_LADDER, 0);
|
||||
animationRegisterCallback(a1, a2, (AnimationCallback*)_obj_use, -1);
|
||||
const char* climbingSfx = sfxBuildCharName(critter, ANIM_CLIMB_LADDER, CHARACTER_SOUND_EFFECT_UNUSED);
|
||||
animationRegisterPlaySoundEffect(critter, climbingSfx, -1);
|
||||
animationRegisterAnimate(critter, ANIM_CLIMB_LADDER, 0);
|
||||
animationRegisterCallback(critter, ladder, (AnimationCallback*)_obj_use, -1);
|
||||
|
||||
if (weaponAnimationCode != 0) {
|
||||
animationRegisterTakeOutWeapon(a1, weaponAnimationCode, -1);
|
||||
animationRegisterTakeOutWeapon(critter, weaponAnimationCode, -1);
|
||||
}
|
||||
|
||||
return reg_anim_end();
|
||||
@@ -1097,7 +1101,9 @@ int _action_use_an_item_on_object(Object* user, Object* targetObj, Object* item)
|
||||
|
||||
reg_anim_begin(animationRequestOptions);
|
||||
|
||||
if (actionPoints != -1 || objectGetDistanceBetween(user, targetObj) < 5) {
|
||||
int walkDistance = 5;
|
||||
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_USE_WALK_DISTANCE, &walkDistance);
|
||||
if (actionPoints != -1 || objectGetDistanceBetween(user, targetObj) < walkDistance) {
|
||||
animationRegisterMoveToObject(user, targetObj, actionPoints, 0);
|
||||
} else {
|
||||
animationRegisterRunToObject(user, targetObj, -1, 0);
|
||||
@@ -1167,12 +1173,15 @@ int actionPickUp(Object* critter, Object* item)
|
||||
}
|
||||
}
|
||||
|
||||
int walkDistance = 5;
|
||||
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_USE_WALK_DISTANCE, &walkDistance);
|
||||
|
||||
if (isInCombat()) {
|
||||
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
|
||||
animationRegisterMoveToObject(critter, item, critter->data.critter.combat.ap, 0);
|
||||
} else {
|
||||
reg_anim_begin(critter == gDude ? ANIMATION_REQUEST_RESERVED : ANIMATION_REQUEST_UNRESERVED);
|
||||
if (objectGetDistanceBetween(critter, item) >= 5) {
|
||||
if (objectGetDistanceBetween(critter, item) >= walkDistance) {
|
||||
animationRegisterRunToObject(critter, item, -1, 0);
|
||||
} else {
|
||||
animationRegisterMoveToObject(critter, item, -1, 0);
|
||||
@@ -1272,13 +1281,16 @@ int _action_loot_container(Object* critter, Object* container)
|
||||
}
|
||||
}
|
||||
|
||||
int walkDistance = 5;
|
||||
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_USE_WALK_DISTANCE, &walkDistance);
|
||||
|
||||
if (isInCombat()) {
|
||||
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
|
||||
animationRegisterMoveToObject(critter, container, critter->data.critter.combat.ap, 0);
|
||||
} else {
|
||||
reg_anim_begin(critter == gDude ? ANIMATION_REQUEST_RESERVED : ANIMATION_REQUEST_UNRESERVED);
|
||||
|
||||
if (objectGetDistanceBetween(critter, container) < 5) {
|
||||
if (objectGetDistanceBetween(critter, container) < walkDistance) {
|
||||
animationRegisterMoveToObject(critter, container, -1, 0);
|
||||
} else {
|
||||
animationRegisterRunToObject(critter, container, -1, 0);
|
||||
@@ -1476,13 +1488,16 @@ int actionUseSkill(Object* user, Object* target, int skill)
|
||||
}
|
||||
}
|
||||
|
||||
int walkDistance = 5;
|
||||
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_USE_WALK_DISTANCE, &walkDistance);
|
||||
|
||||
if (isInCombat()) {
|
||||
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
|
||||
animationRegisterMoveToObject(performer, target, performer->data.critter.combat.ap, 0);
|
||||
} else {
|
||||
reg_anim_begin(user == gDude ? ANIMATION_REQUEST_RESERVED : ANIMATION_REQUEST_UNRESERVED);
|
||||
if (target != gDude) {
|
||||
if (objectGetDistanceBetween(performer, target) >= 5) {
|
||||
if (objectGetDistanceBetween(performer, target) >= walkDistance) {
|
||||
animationRegisterRunToObject(performer, target, -1, 0);
|
||||
} else {
|
||||
animationRegisterMoveToObject(performer, target, -1, 0);
|
||||
@@ -1504,14 +1519,14 @@ int actionUseSkill(Object* user, Object* target, int skill)
|
||||
|
||||
animationRegisterAnimate(performer, anim, -1);
|
||||
// TODO: Get rid of casts.
|
||||
animationRegisterCallback3(performer, target, (void*)skill, (AnimationCallback3*)_obj_use_skill_on, -1);
|
||||
animationRegisterCallback3(performer, target, (void*)(uintptr_t)skill, (AnimationCallback3*)_obj_use_skill_on, -1);
|
||||
return reg_anim_end();
|
||||
}
|
||||
|
||||
// 0x412BC4
|
||||
bool _is_hit_from_front(Object* a1, Object* a2)
|
||||
bool _is_hit_from_front(Object* attacker, Object* defender)
|
||||
{
|
||||
int diff = a1->rotation - a2->rotation;
|
||||
int diff = attacker->rotation - defender->rotation;
|
||||
if (diff < 0) {
|
||||
diff = -diff;
|
||||
}
|
||||
@@ -1520,11 +1535,11 @@ bool _is_hit_from_front(Object* a1, Object* a2)
|
||||
}
|
||||
|
||||
// 0x412BEC
|
||||
bool _can_see(Object* a1, Object* a2)
|
||||
bool _can_see(Object* source, Object* target)
|
||||
{
|
||||
int diff;
|
||||
|
||||
diff = a1->rotation - tileGetRotationTo(a1->tile, a2->tile);
|
||||
diff = source->rotation - tileGetRotationTo(source->tile, target->tile);
|
||||
if (diff < 0) {
|
||||
diff = -diff;
|
||||
}
|
||||
@@ -1800,7 +1815,7 @@ int _report_explosion(Attack* attack, Object* sourceObj)
|
||||
}
|
||||
|
||||
// 0x4132C0
|
||||
int _finished_explosion(Object* a1, Object* a2)
|
||||
int _finished_explosion(Object* _, Object* __)
|
||||
{
|
||||
_action_in_explode = false;
|
||||
return 0;
|
||||
@@ -1829,13 +1844,13 @@ int _compute_explosion_damage(int min, int max, Object* defender, int* knockback
|
||||
}
|
||||
|
||||
// 0x413330
|
||||
int actionTalk(Object* a1, Object* a2)
|
||||
int actionTalk(Object* obj, Object* critter)
|
||||
{
|
||||
if (a1 != gDude) {
|
||||
if (obj != gDude) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (FID_TYPE(a2->fid) != OBJ_TYPE_CRITTER) {
|
||||
if (FID_TYPE(critter->fid) != OBJ_TYPE_CRITTER) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1846,25 +1861,25 @@ int actionTalk(Object* a1, Object* a2)
|
||||
|
||||
if (isInCombat()) {
|
||||
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
|
||||
animationRegisterMoveToObject(a1, a2, a1->data.critter.combat.ap, 0);
|
||||
animationRegisterMoveToObject(obj, critter, obj->data.critter.combat.ap, 0);
|
||||
} else {
|
||||
reg_anim_begin(a1 == gDude ? ANIMATION_REQUEST_RESERVED : ANIMATION_REQUEST_UNRESERVED);
|
||||
reg_anim_begin(obj == gDude ? ANIMATION_REQUEST_RESERVED : ANIMATION_REQUEST_UNRESERVED);
|
||||
|
||||
if (objectGetDistanceBetween(a1, a2) >= 9 || _combat_is_shot_blocked(a1, a1->tile, a2->tile, a2, nullptr)) {
|
||||
animationRegisterRunToObject(a1, a2, -1, 0);
|
||||
if (objectGetDistanceBetween(obj, critter) >= 9 || _combat_is_shot_blocked(obj, obj->tile, critter->tile, critter, nullptr)) {
|
||||
animationRegisterRunToObject(obj, critter, -1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
animationRegisterCallbackForced(a1, a2, (AnimationCallback*)_can_talk_to, -1);
|
||||
animationRegisterCallback(a1, a2, (AnimationCallback*)_talk_to, -1);
|
||||
animationRegisterCallbackForced(obj, critter, (AnimationCallback*)_can_talk_to, -1);
|
||||
animationRegisterCallback(obj, critter, (AnimationCallback*)_talk_to, -1);
|
||||
return reg_anim_end();
|
||||
}
|
||||
|
||||
// 0x413420
|
||||
int _can_talk_to(Object* a1, Object* a2)
|
||||
int _can_talk_to(Object* obj, Object* critter)
|
||||
{
|
||||
if (_combat_is_shot_blocked(a1, a1->tile, a2->tile, a2, nullptr) || objectGetDistanceBetween(a1, a2) >= 9) {
|
||||
if (a1 == gDude) {
|
||||
if (_combat_is_shot_blocked(obj, obj->tile, critter->tile, critter, nullptr) || objectGetDistanceBetween(obj, critter) >= 9) {
|
||||
if (obj == gDude) {
|
||||
// You cannot get there. (used in actions.c)
|
||||
MessageListItem messageListItem;
|
||||
messageListItem.num = 2000;
|
||||
@@ -1880,9 +1895,9 @@ int _can_talk_to(Object* a1, Object* a2)
|
||||
}
|
||||
|
||||
// 0x413488
|
||||
int _talk_to(Object* a1, Object* a2)
|
||||
int _talk_to(Object* _, Object* critter)
|
||||
{
|
||||
scriptsRequestDialog(a2);
|
||||
scriptsRequestDialog(critter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1956,7 +1971,7 @@ void actionDamage(int tile, int elevation, int minDamage, int maxDamage, int dam
|
||||
}
|
||||
|
||||
// 0x41363C
|
||||
int _report_dmg(Attack* attack, Object* a2)
|
||||
int _report_dmg(Attack* attack, Object* _)
|
||||
{
|
||||
_combat_display(attack);
|
||||
_apply_damage(attack, false);
|
||||
@@ -1993,42 +2008,42 @@ int _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr
|
||||
}
|
||||
|
||||
// 0x4136EC
|
||||
bool actionCheckPush(Object* a1, Object* a2)
|
||||
bool actionCheckPush(Object* obj, Object* target)
|
||||
{
|
||||
// Cannot push anything but critters.
|
||||
if (FID_TYPE(a2->fid) != OBJ_TYPE_CRITTER) {
|
||||
if (FID_TYPE(target->fid) != OBJ_TYPE_CRITTER) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Cannot push itself.
|
||||
if (a1 == a2) {
|
||||
if (obj == target) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Cannot push inactive critters.
|
||||
if (!critterIsActive(a2)) {
|
||||
if (!critterIsActive(target)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_action_can_talk_to(a1, a2) != 0) {
|
||||
if (_action_can_talk_to(obj, target) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Can only push critters that have push handler.
|
||||
if (!scriptHasProc(a2->sid, SCRIPT_PROC_PUSH)) {
|
||||
if (!scriptHasProc(target->sid, SCRIPT_PROC_PUSH)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isInCombat()) {
|
||||
if (a2->data.critter.combat.team == a1->data.critter.combat.team
|
||||
&& a2 == a1->data.critter.combat.whoHitMe) {
|
||||
if (target->data.critter.combat.team == obj->data.critter.combat.team
|
||||
&& target == obj->data.critter.combat.whoHitMe) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: Check.
|
||||
Object* whoHitMe = a2->data.critter.combat.whoHitMe;
|
||||
Object* whoHitMe = target->data.critter.combat.whoHitMe;
|
||||
if (whoHitMe != nullptr
|
||||
&& whoHitMe->data.critter.combat.team == a1->data.critter.combat.team) {
|
||||
&& whoHitMe->data.critter.combat.team == obj->data.critter.combat.team) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -2037,15 +2052,15 @@ bool actionCheckPush(Object* a1, Object* a2)
|
||||
}
|
||||
|
||||
// 0x413790
|
||||
int actionPush(Object* a1, Object* a2)
|
||||
int actionPush(Object* obj, Object* target)
|
||||
{
|
||||
if (!actionCheckPush(a1, a2)) {
|
||||
if (!actionCheckPush(obj, target)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int sid;
|
||||
if (_obj_sid(a2, &sid) == 0) {
|
||||
scriptSetObjects(sid, a1, a2);
|
||||
if (_obj_sid(target, &sid) == 0) {
|
||||
scriptSetObjects(sid, obj, target);
|
||||
scriptExecProc(sid, SCRIPT_PROC_PUSH);
|
||||
|
||||
bool scriptOverrides = false;
|
||||
@@ -2060,36 +2075,36 @@ int actionPush(Object* a1, Object* a2)
|
||||
}
|
||||
}
|
||||
|
||||
int rotation = tileGetRotationTo(a1->tile, a2->tile);
|
||||
int rotation = tileGetRotationTo(obj->tile, target->tile);
|
||||
int tile;
|
||||
do {
|
||||
tile = tileGetTileInDirection(a2->tile, rotation, 1);
|
||||
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
|
||||
tile = tileGetTileInDirection(target->tile, rotation, 1);
|
||||
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
|
||||
break;
|
||||
}
|
||||
|
||||
tile = tileGetTileInDirection(a2->tile, (rotation + 1) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
|
||||
tile = tileGetTileInDirection(target->tile, (rotation + 1) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
|
||||
break;
|
||||
}
|
||||
|
||||
tile = tileGetTileInDirection(a2->tile, (rotation + 5) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
|
||||
tile = tileGetTileInDirection(target->tile, (rotation + 5) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
|
||||
break;
|
||||
}
|
||||
|
||||
tile = tileGetTileInDirection(a2->tile, (rotation + 2) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
|
||||
tile = tileGetTileInDirection(target->tile, (rotation + 2) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
|
||||
break;
|
||||
}
|
||||
|
||||
tile = tileGetTileInDirection(a2->tile, (rotation + 4) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
|
||||
tile = tileGetTileInDirection(target->tile, (rotation + 4) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
|
||||
break;
|
||||
}
|
||||
|
||||
tile = tileGetTileInDirection(a2->tile, (rotation + 3) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
|
||||
tile = tileGetTileInDirection(target->tile, (rotation + 3) % ROTATION_COUNT, 1);
|
||||
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2098,14 +2113,14 @@ int actionPush(Object* a1, Object* a2)
|
||||
|
||||
int actionPoints;
|
||||
if (isInCombat()) {
|
||||
actionPoints = a2->data.critter.combat.ap;
|
||||
actionPoints = target->data.critter.combat.ap;
|
||||
} else {
|
||||
actionPoints = -1;
|
||||
}
|
||||
|
||||
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
|
||||
animationRegisterRotateToTile(a2, tile);
|
||||
animationRegisterMoveToTile(a2, tile, a2->elevation, actionPoints, 0);
|
||||
animationRegisterRotateToTile(target, tile);
|
||||
animationRegisterMoveToTile(target, tile, target->elevation, actionPoints, 0);
|
||||
return reg_anim_end();
|
||||
}
|
||||
|
||||
@@ -2113,29 +2128,29 @@ int actionPush(Object* a1, Object* a2)
|
||||
// Returns -2 if it's too far (> 12 tiles).
|
||||
//
|
||||
// 0x413970
|
||||
int _action_can_talk_to(Object* a1, Object* a2)
|
||||
int _action_can_talk_to(Object* obj, Object* target)
|
||||
{
|
||||
if (pathfinderFindPath(a1, a1->tile, a2->tile, nullptr, 0, _obj_sight_blocking_at) == 0) {
|
||||
if (pathfinderFindPath(obj, obj->tile, target->tile, nullptr, 0, _obj_sight_blocking_at) == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (tileDistanceBetween(a1->tile, a2->tile) > 12) {
|
||||
if (tileDistanceBetween(obj->tile, target->tile) > 12) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hideProjectile(void* a1, void* a2)
|
||||
static int hideProjectile(void* _, void* projectile)
|
||||
{
|
||||
Object* projectile = reinterpret_cast<Object*>(a2);
|
||||
Object* proj = reinterpret_cast<Object*>(projectile);
|
||||
|
||||
Rect rect;
|
||||
if (objectHide(projectile, &rect) == 0) {
|
||||
tileWindowRefreshRect(&rect, projectile->elevation);
|
||||
if (objectHide(proj, &rect) == 0) {
|
||||
tileWindowRefreshRect(&rect, proj->elevation);
|
||||
}
|
||||
|
||||
projectile->flags |= OBJECT_NO_SAVE;
|
||||
proj->flags |= OBJECT_NO_SAVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+5
-5
@@ -16,14 +16,14 @@ int _action_loot_container(Object* critter, Object* container);
|
||||
int _action_skill_use(int skill);
|
||||
int actionUseSkill(Object* user, Object* target, int skill);
|
||||
bool _is_hit_from_front(Object* attacker, Object* defender);
|
||||
bool _can_see(Object* a1, Object* a2);
|
||||
bool _can_see(Object* source, Object* target);
|
||||
bool _action_explode_running();
|
||||
int actionExplode(int tile, int elevation, int minDamage, int maxDamage, Object* sourceObj, bool animate);
|
||||
int actionTalk(Object* a1, Object* a2);
|
||||
int actionTalk(Object* obj, Object* critter);
|
||||
void actionDamage(int tile, int elevation, int minDamage, int maxDamage, int damageType, bool animated, bool bypassArmor);
|
||||
bool actionCheckPush(Object* a1, Object* a2);
|
||||
int actionPush(Object* a1, Object* a2);
|
||||
int _action_can_talk_to(Object* a1, Object* a2);
|
||||
bool actionCheckPush(Object* obj, Object* target);
|
||||
int actionPush(Object* obj, Object* target);
|
||||
int _action_can_talk_to(Object* obj, Object* critter);
|
||||
|
||||
} // namespace fallout
|
||||
|
||||
|
||||
+109
-99
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -92,7 +92,7 @@ typedef enum AnimationType {
|
||||
LAST_SF_DEATH_ANIM = ANIM_FALL_FRONT_BLOOD_SF,
|
||||
} AnimationType;
|
||||
|
||||
#define FID_ANIM_TYPE(value) ((value)&0xFF0000) >> 16
|
||||
#define FID_ANIM_TYPE(value) ((value) & 0xFF0000) >> 16
|
||||
|
||||
// Signature of animation callback accepting 2 parameters.
|
||||
typedef int(AnimationCallback)(void* a1, void* a2);
|
||||
|
||||
+5
-5
@@ -31,8 +31,8 @@ typedef struct HeadDescription {
|
||||
} HeadDescription;
|
||||
|
||||
static int artReadList(const char* path, char** out_arr, int* out_count);
|
||||
static int artCacheGetFileSizeImpl(int a1, int* out_size);
|
||||
static int artCacheReadDataImpl(int a1, int* a2, unsigned char* data);
|
||||
static int artCacheGetFileSizeImpl(int fid, int* out_size);
|
||||
static int artCacheReadDataImpl(int fid, int* sizePtr, unsigned char* data);
|
||||
static void artCacheFreeImpl(void* ptr);
|
||||
static int artReadFrameData(unsigned char* data, File* stream, int count, int* paddingPtr);
|
||||
static int artReadHeader(Art* art, File* stream);
|
||||
@@ -525,7 +525,7 @@ int artCopyFileName(int objectType, int id, char* dest)
|
||||
{
|
||||
ArtListDescription* ptr;
|
||||
|
||||
if (objectType < OBJ_TYPE_ITEM && objectType >= OBJ_TYPE_COUNT) {
|
||||
if (objectType < OBJ_TYPE_ITEM || objectType >= OBJ_TYPE_COUNT) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -633,11 +633,11 @@ char* artBuildFilePath(int fid)
|
||||
v5 = (v2 & 0xF000) >> 12;
|
||||
type = FID_TYPE(v2);
|
||||
|
||||
if (v3 >= gArtListDescriptions[type].fileNamesLength) {
|
||||
if (type < OBJ_TYPE_ITEM || type >= OBJ_TYPE_COUNT) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (type < OBJ_TYPE_ITEM || type >= OBJ_TYPE_COUNT) {
|
||||
if (v3 >= gArtListDescriptions[type].fileNamesLength) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -129,9 +129,9 @@ unsigned char* artLockFrameData(int fid, int frame, int direction, CacheEntry**
|
||||
unsigned char* artLockFrameDataReturningSize(int fid, CacheEntry** out_cache_entry, int* widthPtr, int* heightPtr);
|
||||
int artUnlock(CacheEntry* cache_entry);
|
||||
int artCacheFlush();
|
||||
int artCopyFileName(int objectType, int a2, char* a3);
|
||||
int _art_get_code(int a1, int a2, char* a3, char* a4);
|
||||
char* artBuildFilePath(int a1);
|
||||
int artCopyFileName(int objectType, int id, char* a3);
|
||||
int _art_get_code(int animation, int weaponType, char* a3, char* a4);
|
||||
char* artBuildFilePath(int fid);
|
||||
int artGetFramesPerSecond(Art* art);
|
||||
int artGetActionFrame(Art* art);
|
||||
int artGetFrameCount(Art* art);
|
||||
@@ -144,8 +144,8 @@ unsigned char* artGetFrameData(Art* art, int frame, int direction);
|
||||
ArtFrame* artGetFrame(Art* art, int frame, int direction);
|
||||
bool artExists(int fid);
|
||||
bool _art_fid_valid(int fid);
|
||||
int _art_alias_num(int a1);
|
||||
int artCritterFidShouldRun(int a1);
|
||||
int _art_alias_num(int index);
|
||||
int artCritterFidShouldRun(int fid);
|
||||
int artAliasFid(int fid);
|
||||
int buildFid(int objectType, int frmId, int animType, int weaponCode, int rotation);
|
||||
Art* artLoad(const char* path);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user