mirror of
https://github.com/fallout2-ce/fallout2-ce.git
synced 2026-07-27 16:47:11 -07:00
Compare commits
332
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2759d28997 | ||
|
|
cbc40e2df7 | ||
|
|
41c3fa2b8c | ||
|
|
4a6dc44419 | ||
|
|
9a4108f44d | ||
|
|
0ef73e73da | ||
|
|
9e5660d9fe | ||
|
|
620505bec3 | ||
|
|
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 | ||
|
|
f7c1ccfada | ||
|
|
767ae9af25 | ||
|
|
0ba670f0f7 | ||
|
|
58fdf2ff9e | ||
|
|
cb1d2d6ed3 | ||
|
|
4ce09d8cdb | ||
|
|
787fa1b1b1 | ||
|
|
3d4fcf23ba | ||
|
|
74c2125606 | ||
|
|
b1df5a084c | ||
|
|
2a610cf479 | ||
|
|
7d093030e7 | ||
|
|
01be11fce5 | ||
|
|
12fe582e6f | ||
|
|
6f321c7882 | ||
|
|
e05dacebca | ||
|
|
917c1bc49e | ||
|
|
ca9618bf0b | ||
|
|
2112b04c5b | ||
|
|
52e1954aea | ||
|
|
2f144fb421 | ||
|
|
fe472abc2f | ||
|
|
bdb4feedf9 | ||
|
|
7960b3cb65 | ||
|
|
7d0a495ce8 | ||
|
|
4e8c3a4815 | ||
|
|
55af34472a | ||
|
|
503695cd4d | ||
|
|
9db0a4d29e | ||
|
|
325577db56 | ||
|
|
cf17f42cf8 | ||
|
|
cc6d803517 | ||
|
|
de5ee7d7f8 | ||
|
|
4dfc7538db | ||
|
|
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,105 @@
|
||||
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
|
||||
if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then
|
||||
export BUILD_TYPE=Debug
|
||||
else
|
||||
export BUILD_TYPE=Release
|
||||
fi
|
||||
emcmake cmake ../ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain/Emscripten.cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
|
||||
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
|
||||
|
||||
+118
-15
@@ -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"
|
||||
@@ -360,18 +365,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 +447,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",
|
||||
"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": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -8,7 +8,7 @@ There is also [Fallout Community Edition](https://github.com/alexbatalov/fallout
|
||||
|
||||
## 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/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.
|
||||
|
||||
### 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`.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -95,10 +95,6 @@ static void audioEngineMixin(void* userData, Uint8* stream, int length)
|
||||
|
||||
bool audioEngineInit()
|
||||
{
|
||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_AudioSpec desiredSpec;
|
||||
desiredSpec.freq = 22050;
|
||||
desiredSpec.format = AUDIO_S16;
|
||||
@@ -122,10 +118,6 @@ void audioEngineExit()
|
||||
SDL_CloseAudioDevice(gAudioEngineDeviceId);
|
||||
gAudioEngineDeviceId = -1;
|
||||
}
|
||||
|
||||
if (SDL_WasInit(SDL_INIT_AUDIO)) {
|
||||
SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
||||
}
|
||||
}
|
||||
|
||||
void audioEnginePause()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user