Compare commits

..
Author SHA1 Message Date
phobos2077 39b369f7df Fix build after last merge 2024-06-07 17:53:37 +02:00
phobos2077 76ac71bc08 Merge remote-tracking branch 'y0lo/feature/y0lo/fast-barter-auto-calc-change-money' into sfall-port
# Conflicts:
#	src/inventory.cc
2024-06-04 15:03:52 +02:00
102 changed files with 4818 additions and 3649 deletions
-31
View File
@@ -1,31 +0,0 @@
### 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.
--->
-99
View File
@@ -1,99 +0,0 @@
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 }}
+74 -210
View File
@@ -40,32 +40,8 @@ jobs:
- name: Clone
uses: actions/checkout@v4
- name: Show clang-format version
run: |
clang-format --version
- name: clang-format
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 }}
run: find src -type f -name \*.cc -o -name \*.h | xargs clang-format --dry-run --Werror
android:
name: Android
@@ -87,7 +63,7 @@ jobs:
uses: actions/cache@v4
with:
path: os/android/app/.cxx
key: android-cmake-v2
key: android-cmake-v1
- name: Setup signing config
if: env.KEYSTORE_FILE_BASE64 != '' && env.KEYSTORE_PROPERTIES_FILE_BASE64 != ''
@@ -104,21 +80,17 @@ 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/fallout2-ce.apk
path: os/android/app/build/outputs/apk/debug/app-debug.apk
retention-days: 7
ios:
name: iOS
runs-on: macos-14
runs-on: macos-12
steps:
- name: Clone
@@ -127,33 +99,44 @@ jobs:
- name: Cache cmake build
uses: actions/cache@v4
with:
path: out
key: ios-cmake-v5
path: build
key: ios-cmake-v2
- name: Configure
run: |
cmake --preset ios
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
- name: Build
run: |
cmake --build --preset ios-debug
cmake \
--build build \
--config RelWithDebInfo \
-j $(sysctl -n hw.physicalcpu) \
# EOL
- name: Pack
run: |
cd out/build/ios
cpack -C Debug
cd build
cpack -C RelWithDebInfo
- name: Upload
uses: actions/upload-artifact@v4
with:
name: fallout2-ce.ipa
path: out/build/ios/fallout2-ce.ipa
path: build/fallout2-ce.ipa
retention-days: 7
linux:
name: Linux (${{ matrix.arch }})
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
strategy:
fail-fast: false
@@ -171,6 +154,7 @@ 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)
@@ -182,103 +166,44 @@ jobs:
- name: Cache cmake build
uses: actions/cache@v4
with:
path: out
key: linux-${{ matrix.arch }}-cmake-v3
path: build
key: linux-${{ matrix.arch }}-cmake-v1
- name: Configure
- name: Configure (x86)
if: matrix.arch == 'x86'
run: |
cmake --preset linux-${{ matrix.arch }}-debug
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
- name: Build
run: |
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 }}
cmake \
--build build \
-j $(nproc) \
# EOL
- name: Upload
uses: actions/upload-artifact@v4
with:
name: fallout2-ce-linux-${{ matrix.arch }}
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
path: build/fallout2-ce
retention-days: 7
macos:
name: macOS
runs-on: macos-14
runs-on: macos-11
steps:
- name: Clone
@@ -287,27 +212,35 @@ jobs:
- name: Cache cmake build
uses: actions/cache@v4
with:
path: out
key: macos-cmake-v6
path: build
key: macos-cmake-v4
- name: Configure
run: |
cmake --preset macos
cmake \
-B build \
-G Xcode \
-D CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY='' \
# EOL
- name: Build
run: |
cmake --build --preset macos-debug
cmake \
--build build \
--config RelWithDebInfo \
-j $(sysctl -n hw.physicalcpu) \
# EOL
- name: Pack
run: |
cd out/build/macos
cpack -C Debug
cd build
cpack -C RelWithDebInfo
- name: Upload
uses: actions/upload-artifact@v4
with:
name: fallout2-ce-macos.dmg
path: out/build/macos/Fallout II Community Edition.dmg
path: build/Fallout II Community Edition.dmg
retention-days: 7
windows:
@@ -331,96 +264,27 @@ jobs:
- name: Cache cmake build
uses: actions/cache@v4
with:
path: out
key: windows-${{ matrix.arch }}-cmake-v2
path: build
key: windows-${{ matrix.arch }}-cmake-v1
- name: Configure
run: |
cmake --preset windows-${{ matrix.arch }}
cmake \
-B build \
-G "Visual Studio 16 2019" \
-A ${{ matrix.generator-platform }} \
# EOL
- name: Build
run: |
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
cmake \
--build build \
--config RelWithDebInfo \
# EOL
- name: Upload
uses: actions/upload-artifact@v4
with:
name: fallout2-ce-windows-${{ matrix.arch }}
path: out/build/windows-${{ matrix.arch }}/RelWithDebInfo/fallout2-ce-${{ matrix.arch }}.exe
path: build/RelWithDebInfo/fallout2-ce.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
@@ -1,33 +0,0 @@
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
+1 -1
View File
@@ -59,7 +59,7 @@ jobs:
ios:
name: iOS
runs-on: macos-14
runs-on: macos-12
steps:
- name: Clone
-8
View File
@@ -9,7 +9,6 @@
*.user
*.userosscache
*.sln.docstates
.DS_Store
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
@@ -389,13 +388,6 @@ FodyWeavers.xsd
.idea/
*.sln.iml
# VSCode
.vscode
# CMake
/out
/build
# versioning header
src/platform/git_version.h
CMakeUserPresets.json
+17 -122
View File
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.18)
cmake_minimum_required(VERSION 3.13)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
@@ -6,10 +6,10 @@ set(EXECUTABLE_NAME fallout2-ce)
if(APPLE)
if(IOS)
set(CMAKE_OSX_DEPLOYMENT_TARGET "12" CACHE STRING "")
set(CMAKE_OSX_DEPLOYMENT_TARGET "11" CACHE STRING "")
set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "")
else()
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "")
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "")
endif()
endif()
@@ -20,17 +20,12 @@ 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"
@@ -202,6 +197,8 @@ 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"
@@ -228,11 +225,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"
@@ -270,8 +267,6 @@ 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"
@@ -305,14 +300,12 @@ if(WIN32)
_CRT_NONSTDC_NO_WARNINGS
NOMINMAX
WIN32_LEAN_AND_MEAN
_STATIC_CPPLIB
)
endif()
if(WIN32)
target_link_libraries(${EXECUTABLE_NAME}
winmm
libcpmt
)
endif()
@@ -367,63 +360,17 @@ if(APPLE)
set(MACOSX_BUNDLE_BUNDLE_VERSION "1.3.0")
endif()
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()
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} ${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")
else()
find_package(ZLIB)
find_package(SDL2)
endif()
target_link_libraries(${EXECUTABLE_NAME} ${ZLIB_LIBRARIES})
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${ZLIB_INCLUDE_DIRS})
@@ -449,55 +396,3 @@ 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()
-205
View File
@@ -1,205 +0,0 @@
{
"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"
}
]
}
+50
View File
@@ -0,0 +1,50 @@
{
"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": []
}
]
}
+6 -37
View File
@@ -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. This is a fork of the original project, which isn't getting regular updates.
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.
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.
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.
There is also [Fallout Community Edition](https://github.com/alexbatalov/fallout1-ce) (not affiliated with this fork).
There is also [Fallout Community Edition](https://github.com/alexbatalov/fallout1-ce).
## Installation
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.
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.
### Windows
@@ -18,14 +18,6 @@ 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):
@@ -44,14 +36,6 @@ $ 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`.
@@ -82,14 +66,6 @@ $ mv app /Applications/Fallout2
- 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`.
@@ -102,11 +78,7 @@ The second configuration file is `f2_res.ini`. Use it to change game window size
[MAIN]
SCR_WIDTH=1280
SCR_HEIGHT=720
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)
WINDOWED=1
```
Recommendations:
@@ -116,10 +88,7 @@ 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. For high res configs, the following is recommended:
```[Main]
HiResMode=1
```
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.
## Contributing
-48
View File
@@ -1,48 +0,0 @@
# 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
)
-18
View File
@@ -1,18 +0,0 @@
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()
+4
View File
@@ -0,0 +1,4 @@
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
+99 -114
View File
@@ -73,32 +73,30 @@ 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* _, Object* toDestroy);
static int _internal_destroy(Object* a1, Object* a2);
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 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_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_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*, Object*);
static int _finished_explosion(Object* a1, Object* a2);
static int _compute_explosion_damage(int min, int max, Object* defender, int* knockbackDistancePtr);
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 _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 _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr, int damageType);
static int hideProjectile(void* _, void* projectile);
static int hideProjectile(void* a1, void* a2);
// 0x410468
int actionKnockdown(Object* obj, int* anim, int maxDistance, int rotation, int delay)
@@ -283,9 +281,9 @@ int _check_death(Object* obj, int anim, int minViolenceLevel, bool hitFromFront)
}
// 0x4108C8
int _internal_destroy(Object* _, Object* toDestroy)
int _internal_destroy(Object* a1, Object* a2)
{
return _obj_destroy(toDestroy);
return _obj_destroy(a2);
}
// TODO: Check very carefully, lots of conditions and jumps.
@@ -465,7 +463,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*)(uintptr_t)anim, (AnimationCallback*)_show_death, -1);
animationRegisterCallbackForced(defender, (void*)anim, (AnimationCallback*)_show_death, -1);
}
}
@@ -987,10 +985,10 @@ int _action_ranged(Attack* attack, int anim)
}
// 0x411D68
int _is_next_to(Object* obj1, Object* obj2)
int _is_next_to(Object* a1, Object* a2)
{
if (objectGetDistanceBetween(obj1, obj2) > 1) {
if (obj2 == gDude) {
if (objectGetDistanceBetween(a1, a2) > 1) {
if (a2 == gDude) {
MessageListItem messageListItem;
// You cannot get there.
messageListItem.num = 2000;
@@ -1005,9 +1003,9 @@ int _is_next_to(Object* obj1, Object* obj2)
}
// 0x411DB4
int _action_climb_ladder(Object* critter, Object* ladder)
int _action_climb_ladder(Object* a1, Object* a2)
{
if (critter == gDude) {
if (a1 == gDude) {
int anim = FID_ANIM_TYPE(gDude->fid);
if (anim == ANIM_WALK || anim == ANIM_RUNNING) {
reg_anim_clear(gDude);
@@ -1018,46 +1016,44 @@ int _action_climb_ladder(Object* critter, Object* ladder)
int actionPoints;
if (isInCombat()) {
animationRequestOptions = ANIMATION_REQUEST_RESERVED;
actionPoints = critter->data.critter.combat.ap;
actionPoints = a1->data.critter.combat.ap;
} else {
animationRequestOptions = ANIMATION_REQUEST_UNRESERVED;
actionPoints = -1;
}
if (critter == gDude) {
if (a1 == gDude) {
animationRequestOptions = ANIMATION_REQUEST_RESERVED;
}
animationRequestOptions |= ANIMATION_REQUEST_NO_STAND;
reg_anim_begin(animationRequestOptions);
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);
int tile = tileGetTileInDirection(a2->tile, ROTATION_SE, 1);
if (actionPoints != -1 || objectGetDistanceBetween(a1, a2) < 5) {
animationRegisterMoveToTile(a1, tile, a2->elevation, actionPoints, 0);
} else {
animationRegisterRunToTile(critter, tile, ladder->elevation, actionPoints, 0);
animationRegisterRunToTile(a1, tile, a2->elevation, actionPoints, 0);
}
animationRegisterCallbackForced(critter, ladder, (AnimationCallback*)_is_next_to, -1);
animationRegisterRotateToTile(critter, ladder->tile);
animationRegisterCallbackForced(critter, ladder, (AnimationCallback*)_check_scenery_ap_cost, -1);
animationRegisterCallbackForced(a1, a2, (AnimationCallback*)_is_next_to, -1);
animationRegisterRotateToTile(a1, a2->tile);
animationRegisterCallbackForced(a1, a2, (AnimationCallback*)_check_scenery_ap_cost, -1);
int weaponAnimationCode = (critter->fid & 0xF000) >> 12;
int weaponAnimationCode = (a1->fid & 0xF000) >> 12;
if (weaponAnimationCode != 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* puttingAwaySfx = sfxBuildCharName(a1, ANIM_PUT_AWAY, CHARACTER_SOUND_EFFECT_UNUSED);
animationRegisterPlaySoundEffect(a1, puttingAwaySfx, -1);
animationRegisterAnimate(a1, ANIM_PUT_AWAY, 0);
}
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);
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);
if (weaponAnimationCode != 0) {
animationRegisterTakeOutWeapon(critter, weaponAnimationCode, -1);
animationRegisterTakeOutWeapon(a1, weaponAnimationCode, -1);
}
return reg_anim_end();
@@ -1101,9 +1097,7 @@ int _action_use_an_item_on_object(Object* user, Object* targetObj, Object* item)
reg_anim_begin(animationRequestOptions);
int walkDistance = 5;
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_USE_WALK_DISTANCE, &walkDistance);
if (actionPoints != -1 || objectGetDistanceBetween(user, targetObj) < walkDistance) {
if (actionPoints != -1 || objectGetDistanceBetween(user, targetObj) < 5) {
animationRegisterMoveToObject(user, targetObj, actionPoints, 0);
} else {
animationRegisterRunToObject(user, targetObj, -1, 0);
@@ -1173,15 +1167,12 @@ 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) >= walkDistance) {
if (objectGetDistanceBetween(critter, item) >= 5) {
animationRegisterRunToObject(critter, item, -1, 0);
} else {
animationRegisterMoveToObject(critter, item, -1, 0);
@@ -1281,16 +1272,13 @@ 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) < walkDistance) {
if (objectGetDistanceBetween(critter, container) < 5) {
animationRegisterMoveToObject(critter, container, -1, 0);
} else {
animationRegisterRunToObject(critter, container, -1, 0);
@@ -1488,16 +1476,13 @@ 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) >= walkDistance) {
if (objectGetDistanceBetween(performer, target) >= 5) {
animationRegisterRunToObject(performer, target, -1, 0);
} else {
animationRegisterMoveToObject(performer, target, -1, 0);
@@ -1519,14 +1504,14 @@ int actionUseSkill(Object* user, Object* target, int skill)
animationRegisterAnimate(performer, anim, -1);
// TODO: Get rid of casts.
animationRegisterCallback3(performer, target, (void*)(uintptr_t)skill, (AnimationCallback3*)_obj_use_skill_on, -1);
animationRegisterCallback3(performer, target, (void*)skill, (AnimationCallback3*)_obj_use_skill_on, -1);
return reg_anim_end();
}
// 0x412BC4
bool _is_hit_from_front(Object* attacker, Object* defender)
bool _is_hit_from_front(Object* a1, Object* a2)
{
int diff = attacker->rotation - defender->rotation;
int diff = a1->rotation - a2->rotation;
if (diff < 0) {
diff = -diff;
}
@@ -1535,11 +1520,11 @@ bool _is_hit_from_front(Object* attacker, Object* defender)
}
// 0x412BEC
bool _can_see(Object* source, Object* target)
bool _can_see(Object* a1, Object* a2)
{
int diff;
diff = source->rotation - tileGetRotationTo(source->tile, target->tile);
diff = a1->rotation - tileGetRotationTo(a1->tile, a2->tile);
if (diff < 0) {
diff = -diff;
}
@@ -1815,7 +1800,7 @@ int _report_explosion(Attack* attack, Object* sourceObj)
}
// 0x4132C0
int _finished_explosion(Object* _, Object* __)
int _finished_explosion(Object* a1, Object* a2)
{
_action_in_explode = false;
return 0;
@@ -1844,13 +1829,13 @@ int _compute_explosion_damage(int min, int max, Object* defender, int* knockback
}
// 0x413330
int actionTalk(Object* obj, Object* critter)
int actionTalk(Object* a1, Object* a2)
{
if (obj != gDude) {
if (a1 != gDude) {
return -1;
}
if (FID_TYPE(critter->fid) != OBJ_TYPE_CRITTER) {
if (FID_TYPE(a2->fid) != OBJ_TYPE_CRITTER) {
return -1;
}
@@ -1861,25 +1846,25 @@ int actionTalk(Object* obj, Object* critter)
if (isInCombat()) {
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
animationRegisterMoveToObject(obj, critter, obj->data.critter.combat.ap, 0);
animationRegisterMoveToObject(a1, a2, a1->data.critter.combat.ap, 0);
} else {
reg_anim_begin(obj == gDude ? ANIMATION_REQUEST_RESERVED : ANIMATION_REQUEST_UNRESERVED);
reg_anim_begin(a1 == gDude ? ANIMATION_REQUEST_RESERVED : ANIMATION_REQUEST_UNRESERVED);
if (objectGetDistanceBetween(obj, critter) >= 9 || _combat_is_shot_blocked(obj, obj->tile, critter->tile, critter, nullptr)) {
animationRegisterRunToObject(obj, critter, -1, 0);
if (objectGetDistanceBetween(a1, a2) >= 9 || _combat_is_shot_blocked(a1, a1->tile, a2->tile, a2, nullptr)) {
animationRegisterRunToObject(a1, a2, -1, 0);
}
}
animationRegisterCallbackForced(obj, critter, (AnimationCallback*)_can_talk_to, -1);
animationRegisterCallback(obj, critter, (AnimationCallback*)_talk_to, -1);
animationRegisterCallbackForced(a1, a2, (AnimationCallback*)_can_talk_to, -1);
animationRegisterCallback(a1, a2, (AnimationCallback*)_talk_to, -1);
return reg_anim_end();
}
// 0x413420
int _can_talk_to(Object* obj, Object* critter)
int _can_talk_to(Object* a1, Object* a2)
{
if (_combat_is_shot_blocked(obj, obj->tile, critter->tile, critter, nullptr) || objectGetDistanceBetween(obj, critter) >= 9) {
if (obj == gDude) {
if (_combat_is_shot_blocked(a1, a1->tile, a2->tile, a2, nullptr) || objectGetDistanceBetween(a1, a2) >= 9) {
if (a1 == gDude) {
// You cannot get there. (used in actions.c)
MessageListItem messageListItem;
messageListItem.num = 2000;
@@ -1895,9 +1880,9 @@ int _can_talk_to(Object* obj, Object* critter)
}
// 0x413488
int _talk_to(Object* _, Object* critter)
int _talk_to(Object* a1, Object* a2)
{
scriptsRequestDialog(critter);
scriptsRequestDialog(a2);
return 0;
}
@@ -1971,7 +1956,7 @@ void actionDamage(int tile, int elevation, int minDamage, int maxDamage, int dam
}
// 0x41363C
int _report_dmg(Attack* attack, Object* _)
int _report_dmg(Attack* attack, Object* a2)
{
_combat_display(attack);
_apply_damage(attack, false);
@@ -2008,42 +1993,42 @@ int _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr
}
// 0x4136EC
bool actionCheckPush(Object* obj, Object* target)
bool actionCheckPush(Object* a1, Object* a2)
{
// Cannot push anything but critters.
if (FID_TYPE(target->fid) != OBJ_TYPE_CRITTER) {
if (FID_TYPE(a2->fid) != OBJ_TYPE_CRITTER) {
return false;
}
// Cannot push itself.
if (obj == target) {
if (a1 == a2) {
return false;
}
// Cannot push inactive critters.
if (!critterIsActive(target)) {
if (!critterIsActive(a2)) {
return false;
}
if (_action_can_talk_to(obj, target) != 0) {
if (_action_can_talk_to(a1, a2) != 0) {
return false;
}
// Can only push critters that have push handler.
if (!scriptHasProc(target->sid, SCRIPT_PROC_PUSH)) {
if (!scriptHasProc(a2->sid, SCRIPT_PROC_PUSH)) {
return false;
}
if (isInCombat()) {
if (target->data.critter.combat.team == obj->data.critter.combat.team
&& target == obj->data.critter.combat.whoHitMe) {
if (a2->data.critter.combat.team == a1->data.critter.combat.team
&& a2 == a1->data.critter.combat.whoHitMe) {
return false;
}
// TODO: Check.
Object* whoHitMe = target->data.critter.combat.whoHitMe;
Object* whoHitMe = a2->data.critter.combat.whoHitMe;
if (whoHitMe != nullptr
&& whoHitMe->data.critter.combat.team == obj->data.critter.combat.team) {
&& whoHitMe->data.critter.combat.team == a1->data.critter.combat.team) {
return false;
}
}
@@ -2052,15 +2037,15 @@ bool actionCheckPush(Object* obj, Object* target)
}
// 0x413790
int actionPush(Object* obj, Object* target)
int actionPush(Object* a1, Object* a2)
{
if (!actionCheckPush(obj, target)) {
if (!actionCheckPush(a1, a2)) {
return -1;
}
int sid;
if (_obj_sid(target, &sid) == 0) {
scriptSetObjects(sid, obj, target);
if (_obj_sid(a2, &sid) == 0) {
scriptSetObjects(sid, a1, a2);
scriptExecProc(sid, SCRIPT_PROC_PUSH);
bool scriptOverrides = false;
@@ -2075,36 +2060,36 @@ int actionPush(Object* obj, Object* target)
}
}
int rotation = tileGetRotationTo(obj->tile, target->tile);
int rotation = tileGetRotationTo(a1->tile, a2->tile);
int tile;
do {
tile = tileGetTileInDirection(target->tile, rotation, 1);
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
tile = tileGetTileInDirection(a2->tile, rotation, 1);
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
break;
}
tile = tileGetTileInDirection(target->tile, (rotation + 1) % ROTATION_COUNT, 1);
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
tile = tileGetTileInDirection(a2->tile, (rotation + 1) % ROTATION_COUNT, 1);
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
break;
}
tile = tileGetTileInDirection(target->tile, (rotation + 5) % ROTATION_COUNT, 1);
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
tile = tileGetTileInDirection(a2->tile, (rotation + 5) % ROTATION_COUNT, 1);
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
break;
}
tile = tileGetTileInDirection(target->tile, (rotation + 2) % ROTATION_COUNT, 1);
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
tile = tileGetTileInDirection(a2->tile, (rotation + 2) % ROTATION_COUNT, 1);
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
break;
}
tile = tileGetTileInDirection(target->tile, (rotation + 4) % ROTATION_COUNT, 1);
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
tile = tileGetTileInDirection(a2->tile, (rotation + 4) % ROTATION_COUNT, 1);
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
break;
}
tile = tileGetTileInDirection(target->tile, (rotation + 3) % ROTATION_COUNT, 1);
if (_obj_blocking_at(target, tile, target->elevation) == nullptr) {
tile = tileGetTileInDirection(a2->tile, (rotation + 3) % ROTATION_COUNT, 1);
if (_obj_blocking_at(a2, tile, a2->elevation) == nullptr) {
break;
}
@@ -2113,14 +2098,14 @@ int actionPush(Object* obj, Object* target)
int actionPoints;
if (isInCombat()) {
actionPoints = target->data.critter.combat.ap;
actionPoints = a2->data.critter.combat.ap;
} else {
actionPoints = -1;
}
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
animationRegisterRotateToTile(target, tile);
animationRegisterMoveToTile(target, tile, target->elevation, actionPoints, 0);
animationRegisterRotateToTile(a2, tile);
animationRegisterMoveToTile(a2, tile, a2->elevation, actionPoints, 0);
return reg_anim_end();
}
@@ -2128,29 +2113,29 @@ int actionPush(Object* obj, Object* target)
// Returns -2 if it's too far (> 12 tiles).
//
// 0x413970
int _action_can_talk_to(Object* obj, Object* target)
int _action_can_talk_to(Object* a1, Object* a2)
{
if (pathfinderFindPath(obj, obj->tile, target->tile, nullptr, 0, _obj_sight_blocking_at) == 0) {
if (pathfinderFindPath(a1, a1->tile, a2->tile, nullptr, 0, _obj_sight_blocking_at) == 0) {
return -1;
}
if (tileDistanceBetween(obj->tile, target->tile) > 12) {
if (tileDistanceBetween(a1->tile, a2->tile) > 12) {
return -2;
}
return 0;
}
static int hideProjectile(void* _, void* projectile)
static int hideProjectile(void* a1, void* a2)
{
Object* proj = reinterpret_cast<Object*>(projectile);
Object* projectile = reinterpret_cast<Object*>(a2);
Rect rect;
if (objectHide(proj, &rect) == 0) {
tileWindowRefreshRect(&rect, proj->elevation);
if (objectHide(projectile, &rect) == 0) {
tileWindowRefreshRect(&rect, projectile->elevation);
}
proj->flags |= OBJECT_NO_SAVE;
projectile->flags |= OBJECT_NO_SAVE;
return 0;
}
+5 -5
View File
@@ -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* source, Object* target);
bool _can_see(Object* a1, Object* a2);
bool _action_explode_running();
int actionExplode(int tile, int elevation, int minDamage, int maxDamage, Object* sourceObj, bool animate);
int actionTalk(Object* obj, Object* critter);
int actionTalk(Object* a1, Object* a2);
void actionDamage(int tile, int elevation, int minDamage, int maxDamage, int damageType, bool animated, bool bypassArmor);
bool actionCheckPush(Object* obj, Object* target);
int actionPush(Object* obj, Object* target);
int _action_can_talk_to(Object* obj, Object* critter);
bool actionCheckPush(Object* a1, Object* a2);
int actionPush(Object* a1, Object* a2);
int _action_can_talk_to(Object* a1, Object* a2);
} // namespace fallout
+99 -109
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -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
View File
@@ -31,8 +31,8 @@ typedef struct HeadDescription {
} HeadDescription;
static int artReadList(const char* path, char** out_arr, int* out_count);
static int artCacheGetFileSizeImpl(int fid, int* out_size);
static int artCacheReadDataImpl(int fid, int* sizePtr, unsigned char* data);
static int artCacheGetFileSizeImpl(int a1, int* out_size);
static int artCacheReadDataImpl(int a1, int* a2, 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 (type < OBJ_TYPE_ITEM || type >= OBJ_TYPE_COUNT) {
if (v3 >= gArtListDescriptions[type].fileNamesLength) {
return nullptr;
}
if (v3 >= gArtListDescriptions[type].fileNamesLength) {
if (type < OBJ_TYPE_ITEM || type >= OBJ_TYPE_COUNT) {
return nullptr;
}
+5 -5
View File
@@ -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 id, char* a3);
int _art_get_code(int animation, int weaponType, char* a3, char* a4);
char* artBuildFilePath(int fid);
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 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 index);
int artCritterFidShouldRun(int fid);
int _art_alias_num(int a1);
int artCritterFidShouldRun(int a1);
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