diff --git a/.clang-tidy b/.clang-tidy
index ef0f6fde7..0b57ab8ea 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -1,282 +1,18 @@
---
-Checks: 'clang-diagnostic-*,clang-analyzer-*,misc-static-assert,modernize-use-auto,modernize-use-default,modernize-usenullptr,modernize-use-override,performance-*,readability-non-const-parameter,readability-redundant-*,readability-simplify-*,bugprone-*'
+Checks: 'clang-diagnostic-*,clang-analyzer-*,readability-non-const-parameter'
+WarningsAsErrors: ''
+HeaderFileExtensions:
+ - ''
+ - h
+ - hh
+ - hpp
+ - hxx
+ImplementationFileExtensions:
+ - c
+ - cc
+ - cpp
+ - cxx
HeaderFilterRegex: 'forms/.*|framework/.*|game/.*|library/.*|tests/.*|tools/.*'
-AnalyzeTemporaryDtors: false
-User: jonny
-CheckOptions:
- - key: google-readability-braces-around-statements.ShortStatementLines
- value: '1'
- - key: google-readability-function-size.StatementThreshold
- value: '800'
- - key: google-readability-namespace-comments.ShortNamespaceLines
- value: '10'
- - key: google-readability-namespace-comments.SpacesBeforeComments
- value: '2'
- - key: modernize-loop-convert.MaxCopySize
- value: '16'
- - key: modernize-loop-convert.MinConfidence
- value: reasonable
- - key: modernize-loop-convert.NamingStyle
- value: CamelCase
- - key: modernize-pass-by-value.IncludeStyle
- value: llvm
- - key: modernize-replace-auto-ptr.IncludeStyle
- value: llvm
- - key: modernize-use-nullptr.NullMacros
- value: 'NULL'
- - key: readability-identifier-naming.AbstractClassCase
- value: CamelCase
- - key: readability-identifier-naming.AbstractClassPrefix
- value: ''
- - key: readability-identifier-naming.AbstractClassSuffix
- value: ''
- - key: readability-identifier-naming.ClassCase
- value: CamelCase
- - key: readability-identifier-naming.ClassConstantCase
- value: aNy_CasE
- - key: readability-identifier-naming.ClassConstantPrefix
- value: ''
- - key: readability-identifier-naming.ClassConstantSuffix
- value: ''
- - key: readability-identifier-naming.ClassMemberCase
- value: aNy_CasE
- - key: readability-identifier-naming.ClassMemberPrefix
- value: ''
- - key: readability-identifier-naming.ClassMemberSuffix
- value: ''
- - key: readability-identifier-naming.ClassMethodCase
- value: camelBack
- - key: readability-identifier-naming.ClassMethodPrefix
- value: ''
- - key: readability-identifier-naming.ClassMethodSuffix
- value: ''
- - key: readability-identifier-naming.ClassPrefix
- value: ''
- - key: readability-identifier-naming.ClassSuffix
- value: ''
- - key: readability-identifier-naming.ConstantCase
- value: aNy_CasE
- - key: readability-identifier-naming.ConstantMemberCase
- value: aNy_CasE
- - key: readability-identifier-naming.ConstantMemberPrefix
- value: ''
- - key: readability-identifier-naming.ConstantMemberSuffix
- value: ''
- - key: readability-identifier-naming.ConstantParameterCase
- value: aNy_CasE
- - key: readability-identifier-naming.ConstantParameterPrefix
- value: ''
- - key: readability-identifier-naming.ConstantParameterSuffix
- value: ''
- - key: readability-identifier-naming.ConstantPrefix
- value: ''
- - key: readability-identifier-naming.ConstantSuffix
- value: ''
- - key: readability-identifier-naming.ConstexprFunctionCase
- value: aNy_CasE
- - key: readability-identifier-naming.ConstexprFunctionPrefix
- value: ''
- - key: readability-identifier-naming.ConstexprFunctionSuffix
- value: ''
- - key: readability-identifier-naming.ConstexprMethodCase
- value: camelBack
- - key: readability-identifier-naming.ConstexprMethodPrefix
- value: ''
- - key: readability-identifier-naming.ConstexprMethodSuffix
- value: ''
- - key: readability-identifier-naming.ConstexprVariableCase
- value: aNy_CasE
- - key: readability-identifier-naming.ConstexprVariablePrefix
- value: ''
- - key: readability-identifier-naming.ConstexprVariableSuffix
- value: ''
- - key: readability-identifier-naming.EnumCase
- value: CamelCase
- - key: readability-identifier-naming.EnumConstantCase
- value: aNy_CasE
- - key: readability-identifier-naming.EnumConstantPrefix
- value: ''
- - key: readability-identifier-naming.EnumConstantSuffix
- value: ''
- - key: readability-identifier-naming.EnumPrefix
- value: ''
- - key: readability-identifier-naming.EnumSuffix
- value: ''
- - key: readability-identifier-naming.FunctionCase
- value: aNy_CasE
- - key: readability-identifier-naming.FunctionPrefix
- value: ''
- - key: readability-identifier-naming.FunctionSuffix
- value: ''
- - key: readability-identifier-naming.GlobalConstantCase
- value: aNy_CasE
- - key: readability-identifier-naming.GlobalConstantPrefix
- value: ''
- - key: readability-identifier-naming.GlobalConstantSuffix
- value: ''
- - key: readability-identifier-naming.GlobalFunctionCase
- value: aNy_CasE
- - key: readability-identifier-naming.GlobalFunctionPrefix
- value: ''
- - key: readability-identifier-naming.GlobalFunctionSuffix
- value: ''
- - key: readability-identifier-naming.GlobalVariableCase
- value: aNy_CasE
- - key: readability-identifier-naming.GlobalVariablePrefix
- value: ''
- - key: readability-identifier-naming.GlobalVariableSuffix
- value: ''
- - key: readability-identifier-naming.IgnoreFailedSplit
- value: '0'
- - key: readability-identifier-naming.InlineNamespaceCase
- value: aNy_CasE
- - key: readability-identifier-naming.InlineNamespacePrefix
- value: ''
- - key: readability-identifier-naming.InlineNamespaceSuffix
- value: ''
- - key: readability-identifier-naming.LocalConstantCase
- value: aNy_CasE
- - key: readability-identifier-naming.LocalConstantPrefix
- value: ''
- - key: readability-identifier-naming.LocalConstantSuffix
- value: ''
- - key: readability-identifier-naming.LocalVariableCase
- value: aNy_CasE
- - key: readability-identifier-naming.LocalVariablePrefix
- value: ''
- - key: readability-identifier-naming.LocalVariableSuffix
- value: ''
- - key: readability-identifier-naming.MemberCase
- value: aNy_CasE
- - key: readability-identifier-naming.MemberPrefix
- value: ''
- - key: readability-identifier-naming.MemberSuffix
- value: ''
- - key: readability-identifier-naming.MethodCase
- value: camelBack
- - key: readability-identifier-naming.MethodPrefix
- value: ''
- - key: readability-identifier-naming.MethodSuffix
- value: ''
- - key: readability-identifier-naming.NamespaceCase
- value: aNy_CasE
- - key: readability-identifier-naming.NamespacePrefix
- value: ''
- - key: readability-identifier-naming.NamespaceSuffix
- value: ''
- - key: readability-identifier-naming.ParameterCase
- value: aNy_CasE
- - key: readability-identifier-naming.ParameterPackCase
- value: aNy_CasE
- - key: readability-identifier-naming.ParameterPackPrefix
- value: ''
- - key: readability-identifier-naming.ParameterPackSuffix
- value: ''
- - key: readability-identifier-naming.ParameterPrefix
- value: ''
- - key: readability-identifier-naming.ParameterSuffix
- value: ''
- - key: readability-identifier-naming.PrivateMemberCase
- value: aNy_CasE
- - key: readability-identifier-naming.PrivateMemberPrefix
- value: ''
- - key: readability-identifier-naming.PrivateMemberSuffix
- value: ''
- - key: readability-identifier-naming.PrivateMethodCase
- value: camelBack
- - key: readability-identifier-naming.PrivateMethodPrefix
- value: ''
- - key: readability-identifier-naming.PrivateMethodSuffix
- value: ''
- - key: readability-identifier-naming.ProtectedMemberCase
- value: aNy_CasE
- - key: readability-identifier-naming.ProtectedMemberPrefix
- value: ''
- - key: readability-identifier-naming.ProtectedMemberSuffix
- value: ''
- - key: readability-identifier-naming.ProtectedMethodCase
- value: camelBack
- - key: readability-identifier-naming.ProtectedMethodPrefix
- value: ''
- - key: readability-identifier-naming.ProtectedMethodSuffix
- value: ''
- - key: readability-identifier-naming.PublicMemberCase
- value: aNy_CasE
- - key: readability-identifier-naming.PublicMemberPrefix
- value: ''
- - key: readability-identifier-naming.PublicMemberSuffix
- value: ''
- - key: readability-identifier-naming.PublicMethodCase
- value: camelBack
- - key: readability-identifier-naming.PublicMethodPrefix
- value: ''
- - key: readability-identifier-naming.PublicMethodSuffix
- value: ''
- - key: readability-identifier-naming.StaticConstantCase
- value: aNy_CasE
- - key: readability-identifier-naming.StaticConstantPrefix
- value: ''
- - key: readability-identifier-naming.StaticConstantSuffix
- value: ''
- - key: readability-identifier-naming.StaticVariableCase
- value: aNy_CasE
- - key: readability-identifier-naming.StaticVariablePrefix
- value: ''
- - key: readability-identifier-naming.StaticVariableSuffix
- value: ''
- - key: readability-identifier-naming.StructCase
- value: CamelCase
- - key: readability-identifier-naming.StructPrefix
- value: ''
- - key: readability-identifier-naming.StructSuffix
- value: ''
- - key: readability-identifier-naming.TemplateParameterCase
- value: aNy_CasE
- - key: readability-identifier-naming.TemplateParameterPrefix
- value: ''
- - key: readability-identifier-naming.TemplateParameterSuffix
- value: ''
- - key: readability-identifier-naming.TemplateTemplateParameterCase
- value: aNy_CasE
- - key: readability-identifier-naming.TemplateTemplateParameterPrefix
- value: ''
- - key: readability-identifier-naming.TemplateTemplateParameterSuffix
- value: ''
- - key: readability-identifier-naming.TypeTemplateParameterCase
- value: aNy_CasE
- - key: readability-identifier-naming.TypeTemplateParameterPrefix
- value: ''
- - key: readability-identifier-naming.TypeTemplateParameterSuffix
- value: ''
- - key: readability-identifier-naming.TypedefCase
- value: aNy_CasE
- - key: readability-identifier-naming.TypedefPrefix
- value: ''
- - key: readability-identifier-naming.TypedefSuffix
- value: ''
- - key: readability-identifier-naming.UnionCase
- value: CamelCase
- - key: readability-identifier-naming.UnionPrefix
- value: ''
- - key: readability-identifier-naming.UnionSuffix
- value: ''
- - key: readability-identifier-naming.ValueTemplateParameterCase
- value: aNy_CasE
- - key: readability-identifier-naming.ValueTemplateParameterPrefix
- value: ''
- - key: readability-identifier-naming.ValueTemplateParameterSuffix
- value: ''
- - key: readability-identifier-naming.VariableCase
- value: aNy_CasE
- - key: readability-identifier-naming.VariablePrefix
- value: ''
- - key: readability-identifier-naming.VariableSuffix
- value: ''
- - key: readability-identifier-naming.VirtualMethodCase
- value: camelBack
- - key: readability-identifier-naming.VirtualMethodPrefix
- value: ''
- - key: readability-identifier-naming.VirtualMethodSuffix
- value: ''
+SystemHeaders: false
...
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
index e6fd7b204..d5e9b4577 100644
--- a/.github/workflows/cmake.yml
+++ b/.github/workflows/cmake.yml
@@ -12,7 +12,7 @@ jobs:
# well on Windows or Mac. You can convert this to a matrix build if you need
# cross-platform coverage.
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v2
@@ -34,7 +34,13 @@ jobs:
run: sudo apt-get update
- name: Install dependencies
- run: sudo apt-get install libsdl2-dev cmake build-essential git libunwind8-dev libboost-locale-dev libboost-filesystem-dev libboost-program-options-dev qtbase5-dev libvorbis-dev ninja-build g++-13
+ run: sudo apt-get install libsdl2-dev cmake build-essential git libunwind8-dev libboost-locale-dev libboost-filesystem-dev libboost-program-options-dev qt6-base-dev libvorbis-dev ninja-build
+
+ - name: Install gcc-14
+ run: sudo apt install gcc-14 g++-14
+
+ - name: GCC 14 version check
+ run: echo "GCC-14:"; which gcc-14;gcc-14 --version;
- name: Configure CMake
# Use a bash shell so we can use the same syntax for environment variable
@@ -44,7 +50,7 @@ jobs:
# Note the current convention is to use the -S and -B options here to specify source
# and build directories, but this is only available with CMake 3.13 and higher.
# The CMake binaries on the Github Actions machines are (as of this writing) 3.12
- run: CC=gcc-13 CXX=g++-13 cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -GNinja
+ run: CC=gcc-14 CXX=g++-14 cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -GNinja -DUSE_PCH=ON
- name: Build
working-directory: ${{runner.workspace}}/build
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 3041d03a5..979b6d858 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -5,6 +5,8 @@ on: [push, pull_request]
env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
BUILD_TYPE: Release
+ CLANG_FORMAT: clang-format-18
+ CLANG_TIDY: clang-tidy-18
jobs:
build:
@@ -35,7 +37,7 @@ jobs:
run: sudo apt-get update
- name: Install dependencies
- run: sudo apt-get install libsdl2-dev cmake build-essential git libunwind8-dev libboost-locale-dev libboost-filesystem-dev libboost-program-options-dev qtbase5-dev libvorbis-dev ninja-build clang-format-15 clang-tidy-15
+ run: sudo apt-get install libsdl2-dev cmake build-essential git libunwind8-dev libboost-locale-dev libboost-filesystem-dev libboost-program-options-dev qt6-base-dev libvorbis-dev ninja-build ${CLANG_FORMAT} ${CLANG_TIDY}
- name: Configure CMake
# Use a bash shell so we can use the same syntax for environment variable
@@ -45,7 +47,7 @@ jobs:
# Note the current convention is to use the -S and -B options here to specify source
# and build directories, but this is only available with CMake 3.13 and higher.
# The CMake binaries on the Github Actions machines are (as of this writing) 3.12
- run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -GNinja -DCLANG_FORMAT=clang-format-15 -DCLANG_TIDY=clang-tidy-15
+ run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -GNinja -DCLANG_FORMAT=${CLANG_FORMAT} -DCLANG_TIDY=${CLANG_TIDY}
- name: Setup Environment (PR)
if: ${{ github.event_name == 'pull_request' }}
@@ -65,14 +67,11 @@ jobs:
working-directory: ${{runner.workspace}}
shell: bash
run: |
- cd $GITHUB_WORKSPACE
- if [ "${{env.BEFORE_COMMIT_SHA}}" == "0000000000000000000000000000000000000000" ]
- then
- echo '$GITHUB_WORKSPACE/tools/lint.sh ${{env.AFTER_COMMIT_SHA}}'
- $GITHUB_WORKSPACE/tools/lint.sh ${{env.AFTER_COMMIT_SHA}}
- else
- echo '$GITHUB_WORKSPACE/tools/lint.sh ${{env.BEFORE_COMMIT_SHA}}..${{env.AFTER_COMMIT_SHA}}'
- $GITHUB_WORKSPACE/tools/lint.sh ${{env.BEFORE_COMMIT_SHA}}..${{env.AFTER_COMMIT_SHA}}
+ cmake --build ${{runner.workspace}}/build -t format-sources
+ if [[ `git -C $GITHUB_WORKSPACE status --porcelain` ]]; then
+ echo "Format mismatch:";
+ git -C $GITHUB_WORKSPACE diff;
+ exit 1;
fi
@@ -83,10 +82,10 @@ jobs:
cd $GITHUB_WORKSPACE
if [ "${{env.BEFORE_COMMIT_SHA}}" == "0000000000000000000000000000000000000000" ]
then
- echo 'CLANG_TIDY=clang-tidy-15 BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.AFTER_COMMIT_SHA}} || true;'
- CLANG_TIDY=clang-tidy-15 BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.AFTER_COMMIT_SHA}} || true;
+ echo 'BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.AFTER_COMMIT_SHA}} || true;'
+ BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.AFTER_COMMIT_SHA}} || true;
else
- echo 'CLANG_TIDY=clang-tidy-15 BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.BEFORE_COMMIT_SHA}}..${{env.AFTER_COMMIT_SHA}} || true;'
- CLANG_TIDY=clang-tidy-15 BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.BEFORE_COMMIT_SHA}}..${{env.AFTER_COMMIT_SHA}} || true;
+ echo 'BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.BEFORE_COMMIT_SHA}}..${{env.AFTER_COMMIT_SHA}} || true;'
+ BUILD_DIR=${{runner.workspace}}/build $GITHUB_WORKSPACE/tools/lint-tidy.sh ${{env.BEFORE_COMMIT_SHA}}..${{env.AFTER_COMMIT_SHA}} || true;
fi
diff --git a/.gitmodules b/.gitmodules
index cdae4ef5a..73205b622 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -23,3 +23,6 @@
[submodule "dependencies/fmt"]
path = dependencies/fmt
url = https://github.com/fmtlib/fmt.git
+[submodule "dependencies/magic_enum"]
+ path = dependencies/magic_enum
+ url = https://github.com/Neargye/magic_enum.git
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ee6b7d33a..3bcf19ce1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
# check cmake version
-CMAKE_MINIMUM_REQUIRED(VERSION 3.9)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.30)
# This changes the vcpkg features, so needs to be set before the first PROJECT() call
option(BUILD_LAUNCHER "Build the launcher" ON)
@@ -29,8 +29,9 @@ INCLUDE(CheckCCompilerFlag)
string(TOLOWER "${CMAKE_BUILD_TYPE}" lower_build_type)
option(LTO "Build using link-time-optimisations" OFF)
-option(MSVC_PDB "Always generate PDB files" OFF)
+option(MSVC_PDB "Always generate PDB files" ON)
option(ENABLE_TESTS "Build some unit tests" ON)
+option(USE_PCH "Enable precompiled header use during build" OFF)
option(EXTRACT_DATA "Run the data extractor as part of the default target" ON)
set(CD_PATH ${CMAKE_SOURCE_DIR}/data/cd.iso CACHE STRING "Path to cd.iso (used
@@ -76,6 +77,8 @@ endif(LTO)
# MSVC has default flags that CMake doesn't set
if (MSVC)
add_definitions(-DUNICODE -D_UNICODE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8")
if (MSVC_VERSION GREATER_EQUAL 1910)
if (MSVC_VERSION EQUAL 1928)
@@ -188,7 +191,7 @@ add_dependencies(format format-sources)
set(CLANG_FORMAT clang-format CACHE STRING "clang-format executable name in PATH")
foreach(FORMAT_SOURCE ${FORMAT_SOURCES})
- add_custom_command(TARGET format-sources COMMAND ${CLANG_FORMAT} -i ${FORMAT_SOURCE} DEPENDS ${FORMAT_SOURCE} .clang-format)
+ add_custom_command(TARGET format-sources COMMAND ${CLANG_FORMAT} -i ${FORMAT_SOURCE} POST_BUILD)
endforeach()
file(GLOB_RECURSE XML_FILES ${CMAKE_SOURCE_DIR}/data/*.xml)
diff --git a/CODE_STYLE.md b/CODE_STYLE.md
index ac62d02ab..bfac4af08 100644
--- a/CODE_STYLE.md
+++ b/CODE_STYLE.md
@@ -15,7 +15,7 @@ GCCIsntMuchBetter
C++11 features are heavily encouraged - patterns from 'older' c++ versions that have been superceded should be avoided.
-The formatting sections of this document are enforced by the [clang-format tool](http://llvm.org/releases/15.0.0/tools/clang/docs/ClangFormat.html). Currently, version '15.0' of ``clang-format`` is to be used. The configuration file ``.clang-format`` in the root of the OpenApoc source repository should match the formatting guidelines specified below.
+The formatting sections of this document are enforced by the [clang-format tool](https://releases.llvm.org/18.1.1/tools/clang/docs/ClangFormat.html). Currently, version '18.0' of ``clang-format`` is to be used. The configuration file ``.clang-format`` in the root of the OpenApoc source repository should match the formatting guidelines specified below.
With this, it is highly recommended to run ``clang-format`` on all modified files before check-in. This can be run on source files with the following command:
diff --git a/README.md b/README.md
index 1aead7d8f..c05586225 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# OpenApocalypse [](https://twitter.com/intent/tweet?text=Are%20you%20a%20fan%20of%20X-Com%20Apocalypse?%20OpenApoc%20is%20a%20clone%20of%20this%20great%20game%20-%20contribute!%20https://github.com/OpenApoc/OpenApoc&hashtags=games,openapoc,xcom)
-> OpenApoc is an open-source re-implementation of the original [X-COM: Apocalypse](https://www.ufopaedia.org/index.php/Apocalypse), that requires the original files to run, licensed under the GPL3 and written in C++ / SDL2. It was originally founded by PmProg in July 2014, and has since grown in [community](https://www.ufopaedia.org/index.php/Credits_(OpenApoc)).
+> OpenApoc is an open-source re-implementation of the original [X-COM: Apocalypse](https://www.ufopaedia.org/index.php/Apocalypse), that requires the original files to run, licensed under the GPL3 and written in C++ / SDL2. It was originally founded by PmProg in July 2014, and has since grown a significant [community](https://www.ufopaedia.org/index.php/Credits_(OpenApoc)).
[](https://travis-ci.com/github/OpenApoc/OpenApoc)
[](https://ci.appveyor.com/project/openapoc/openapoc/branch/master)
@@ -33,44 +33,46 @@
## Copyright
-All rights for the original game and its resources belong to their respective owners. We do not encourage and do not support any form of illegal usage of the original game. We strongly advise to purchase the original game on GOG or other platforms. Pirated ISOs are not supported and will cause issues such as crashes and map problems with OpenApoc.
+All rights for the original game and its resources belong to their respective owners.
+We do not encourage and do not support any form of illegal usage of the original game.
+We strongly advise to purchase the original game on STEAM or another platform of your choosing.
+Pirated disc images and archives are not supported and will cause issues such as crashes and map problems with OpenApoc.
## Key Features
-* Unlimited modding capabilities, which was not possible in the original
-* Port the game to any platform you like (windows, linux, android etc)
-* Support for modern screen resolutions
-* Added a full debug system ([hot keys](https://github.com/OpenApoc/OpenApoc/blob/master/README_HOTKEYS.txt), etc.)
-* Added 'more options' menu (with more than 40 improvements)
-* Added skirmish module (fast fight)
-* The new engine has ample opportunities for expansion and changes:
- * High FPS, smooth sound during the game without bugs from original
- * No limitations which were in vanilla
- * Modern formats
-* After release, we can add Julian Gollop's cut ideas to the game through mods. Many have already been added but they need functionality and balance.
* [](https://www.reddit.com/user/JulianGollop/) "Yes, I am aware of the openApoc project and I very much do support it."
-* Fans creating Big Apoc Concept, for modders, thats should make OpenApoc more balanced, to provide:
- * A variety of interesting gameplay solutions
- * Make the game more complex and diverse
- * L.O.R.E more fulfilling, deep and mysterious, intertwined with real history and other games
- * Ending the game can be more interesting and less predictable
+* Full modding capability - You can add or change almost anything!
+* Options for modding that allow opportunity to make OpenApoc:
+ * More balanced
+ * More diverse
+ * More immersive
+* Human-Readable Savegame editing - It's all XML in a ZIP archvive so you can edit/tweak in progress games to your liking!
+* Support for modern screen resolutions and display scaling at a silky smooth 60fps
+* Added a 'More Options' menu that allows players to select dozens of new optional improvements and enhancements
+* Added a full debug system ([Hot Keys](https://github.com/OpenApoc/OpenApoc/blob/master/README_HOTKEYS.txt), etc.)
+* Port the game to any platform you like (Windows, Linux, Etc.)
+* Added a Skirmish Mode for quick fights and custom battles (Experimental)
+* The new engine has ample opportunities for expansion and refinements including:
+ * High FPS
+ * Smooth sound playback with none of the pop/clicks/stutters of the original game
+* The potential to add cut and missing features from the Original Game - some of these are already included even at current Alpha state or with the handful of mods already available!
## What's left?
-1. [TO HAVE A TRULY PLAYABLE ALPHA STATE (DONE)](https://github.com/OpenApoc/OpenApoc/issues/263)
-2. [TO REACH A BETA STATE (When All features implemented)](https://github.com/OpenApoc/OpenApoc/issues/264)
-3. [TO REACH OPENAPOC RELEASE 1.0](https://github.com/OpenApoc/OpenApoc/issues/265)
+1. [TO HAVE A TRULY PLAYABLE ALPHA STATE](https://github.com/OpenApoc/OpenApoc/issues/263)
+2. [TO REACH A BETA STATE (All core Original Game features implemented)](https://github.com/OpenApoc/OpenApoc/issues/264)
+3. [TO REACH OPENAPOC RELEASE 1.0 (Final polishing and testing to match or exceed Original Game state)](https://github.com/OpenApoc/OpenApoc/issues/265)
4. [Modding Functions, Extra Features, Enhancements and Quality of Life Updates](https://github.com/OpenApoc/OpenApoc/issues/941)
## Contribute and FAQ
-http://openapoc.org/#contribute
+http://openapoc.org/#contribute - Currently Offline, please use [Discord](https://discord.gg/f8Rayre)
>Here you find news, detailing how you can participate in project.
You can support the project by testing, translating, modding, drawing, modeling, concepting etc..
-http://openapoc.org/#faq
->Here you find the detailed FAQ (frequently asked questions)
+http://openapoc.org/#faq - Currently Offline, please use [Discord](https://discord.gg/f8Rayre)
+>Here you find the detailed FAQ (Frequently Asked Questions)
## Building
@@ -94,6 +96,7 @@ The following libraries are also used, but are shipped as submodules in the repo
* [physfs](https://icculus.org/physfs/) - Library for reading data from .iso files or directory trees (Note: We use a patched version, available on [GitHub](https://github.com/JonnyH/physfs-hg-import/tree/fix-iso) - required to read the .iso files we use).
* [pugixml](https://pugixml.org) - XML library used for reading/writing the game data files.
* [fmtlib](https://github.com/fmtlib/fmt) - A c++ string formatting library - proposed for c++20 standard.
+* [magic_enum](https://github.com/Neargye/magic_enum) - Header-only C++17 library provides static reflection for enums, work with any enum type without any macro or boilerplate code.
### Building on Windows
@@ -112,13 +115,13 @@ git submodule update --init --recursive
* For x64 builds:
```cmd
-vcpkg --triplet x64-windows install sdl2 boost-locale boost-program-options boost-uuid boost-crc qt5-base libvorbis
+vcpkg --triplet x64-windows install sdl2 boost-locale boost-program-options boost-uuid boost-crc qt-base6-dev libvorbis
```
* For x86 builds:
```cmd
-vcpkg --triplet x86-windows install sdl2 boost-locale boost-program-options boost-uuid boost-crc qt5-base libvorbis
+vcpkg --triplet x86-windows install sdl2 boost-locale boost-program-options boost-uuid boost-crc qt-base6-dev libvorbis
```
* For list of all supported by Vcpkg architectures: `vcpkg help triplet`
@@ -146,25 +149,25 @@ vcpkg --triplet x86-windows install sdl2 boost-locale boost-program-options boos
### Building on Linux
-(Tested on Ubuntu 22.04)
+(Tested on Ubuntu 22.04 and 24.04)
* On Ubuntu, install the following packages:
```sh
-sudo apt-get install sdl2-dev cmake build-essential git libunwind8-dev libboost-locale-dev libboost-program-options-dev qtbase5-dev libvorbis-dev
+sudo apt-get install libsdl2-dev cmake build-essential git libunwind8-dev libboost-locale-dev libboost-program-options-dev qtbase5-dev libvorbis-dev
```
* On Mageia, install the following packages as root:
```sh
-urpmi "cmake(sdl2)" libstdc++-static-devel boost-devel boost unwind-devel task-c++-devel cmake git qtbase5-devel libvorbis-devel
+urpmi "cmake(sdl2)" libstdc++-static-devel boost-devel boost unwind-devel task-c++-devel cmake git qt6-devel libvorbis-devel
```
* On Fedora or other RedHat distro, install the folowing packages as root:
```sh
yum groupinstall "Development Tools" "Development Libraries"
-yum install git SDL2-devel cmake libunwind-devel qt5-qtbase-devel libvorbis-devel
+yum install git SDL2-devel cmake libunwind-devel qt6-qtbase-devel libvorbis-devel
```
* Checkout OpenApoc from GitHub.
@@ -205,7 +208,7 @@ make -j4
### Building on macOS
-(Tested on macOS Ventura 13.0 (22A380)
+(Tested on macOS Sequoia 15.6 (24G84)
* On macOS, install the [Homebrew](https://brew.sh):
@@ -229,8 +232,18 @@ git submodule update --init --recursive
* Use the homebrew install the following dependencies:
```sh
-brew install cmake boost pkg-config sdl2 qt@5 libvorbis
-echo 'export PATH="/opt/homebrew/opt/qt@5/bin:$PATH"' >> ~/.bashrc
+brew install cmake boost pkg-config sdl2 qt@6 libvorbis
+```
+
+* Add the Qt install to path.
+
+* If using zsh (MacOS default since Catalina 10.15):
+```sh
+echo 'export PATH="/opt/homebrew/opt/qt@6/bin:$PATH"' >> ~/.zprofile
+```
+* Or if using bash:
+```sh
+echo 'export PATH="/opt/homebrew/opt/qt@6/bin:$PATH"' >> ~/.bashrc
```
* Copy the cd.iso file to the 'data' directory under the repository root (Note - despite dosbox having good linux support, the steam version of X-Com Apocalypse will only install if Steam Play is enabled).
@@ -276,13 +289,13 @@ OPENGL 2.0 SUPPORTIVE VIDEO CARDS ARE REQUIRED
WINDOWS USERS: You will require the LATEST Visual C++ Libraries obtained from windows update to run OpenApoc
https://docs.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170
-(Keep in mind that OpenApoc is ALPHA STATE - this means bugs, crushes and not all features implemented, use our bug-tracker at https://github.com/OpenApoc/OpenApoc/issues to report bugs and navigate known ones)
+Simple steps to play OpenApoc on Windows right now
+(Keep in mind that it is ALPHA - this means bugs, crushes and not all features implemented, use our bug-tracker at https://github.com/OpenApoc/OpenApoc/issues to report bugs and navigate known ones)
-1) Download the OpenApoc core files: [](https://ci.appveyor.com/project/openapoc/openapoc/branch/master) (Latest master build)
-- If the build link above doesn't work, visit https://ci.appveyor.com/project/OpenApoc/openapoc/history
+1) Download the OpenApoc core files from https://github.com/OpenApoc/OpenApoc/releases
+- For experimental builds visit https://ci.appveyor.com/project/OpenApoc/openapoc/history
- If you see a green bar next to the latest build then you can download it, click a build that is green, or use "Show More" to list all builds
- Click ARTIFACTS (Currently only Windows x64)
-- If there are no artifacts use https://github.com/OpenApoc/OpenApoc/releases for the latest Winx64 compile
- Download the option that ends with a ".exe" (and without "debug" in it)
- Run the downloaded exe installer, this will guide you through the installation
- Use "portable install" if you want saves and settings to remain in the install directory
@@ -293,7 +306,7 @@ https://docs.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msv
- If the disc image is in .iso format, rename it to "cd.iso"
- We also support the GOG .cue / .bin files!
-3) Put cd.iso (image or folder) into the data folder under the specified OpenApoc install folder
+3) Put cd.iso (image or folder) into the "data" folder under the specified OpenApoc install folder
- If you have already specified the "cd.iso" location in the installer, you don't need to do this step
- To use GOG .cue/.bin you rename the XCOM.cue file to "cd.iso", put that in the OpenApoc data folder, then put the XCOM.BIN, without renaming it, into the data folder too
@@ -302,11 +315,13 @@ https://docs.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msv
## Contact us
-If you're interested, please visit our [website](http://openapoc.org).
-* We have [forums](http://openapoc.org/forum/) - please pop by and introduce yourself!
-* We have an [Discord](https://discord.gg/f8Rayre) channel
-* We have an IRC channel on [Freenode](http://webchat.freenode.net/?channels=openapoc) - [#openapoc](irc://irc.freenode.net/#openapoc).
+If you're interested, please visit our [website](http://openapoc.org) (Currently Offline, please use [Discord](https://discord.gg/f8Rayre)).
+* We have a [Discord](https://discord.gg/f8Rayre) - MOST ACTIVE PLACE FOR ALL THINGS OPENAPOC!
* We have a [Youtube](https://www.youtube.com/c/OpenApoc) channel.
+* We have a [forum](http://openapoc.org/forum/) (Currently Offline, please use [Discord](https://discord.gg/f8Rayre))
+
+## Unnofficial and Community Contacts
+
* We have a [Facebook](https://www.facebook.com/openapoc) page.
-* We have a [Vkontakte](https://vk.com/openapoc) page.
* We have a [Reddit](https://reddit.com/r/openapoc) page.
+* All VK Presence is currently unofficial
diff --git a/appveyor-dev.yml b/appveyor-dev.yml
index 794473c1c..3c0642e5d 100644
--- a/appveyor-dev.yml
+++ b/appveyor-dev.yml
@@ -7,25 +7,19 @@ skip_tags: true
os: Visual Studio 2022
configuration:
- Release
-# - Debug
platform:
- x64
-# - Win32
environment:
APPVEYOR_SAVE_CACHE_ON_ERROR: true
-init:
- - if "%PLATFORM%"=="x64" (set VCPKG_DEFAULT_TRIPLET=x64-windows)
- - if "%PLATFORM%"=="x64" (set VCVARS_ARCH=amd64)
- - if "%PLATFORM%"=="x64" (set QTPATH=C:\Qt\5.15\msvc2019_64)
- - if "%PLATFORM%"=="Win32" (set VCPKG_DEFAULT_TRIPLET=x86-windows)
- - if "%PLATFORM%"=="Win32" (set VCVARS_ARCH=amd64_x86)
- - if "%PLATFORM%"=="Win32" (set QTPATH=C:\Qt\5.15\msvc2019)
+ VCPKG_DEFAULT_TRIPLET: x64-windows
+ VCVARS_ARCH: amd64
+ QTPATH: C:\Qt\6.9\msvc2022_64
#clone_depth: 10
cache: C:\Users\appveyor\AppData\Local\vcpkg\archives -> appveyor-dev.yml
before_build:
- cd c:\tools\vcpkg
- git pull
- - git checkout 2023.08.09
+ - git checkout 2025.09.17
- .\bootstrap-vcpkg.bat
- cd %APPVEYOR_BUILD_FOLDER%
- vcpkg install
@@ -34,7 +28,7 @@ before_build:
- 7z e temp\cd.iso.xz -odata\
- call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" %VCVARS_ARCH%
build_script:
- - cmake -DMSVC_PDB=ON . -GNinja -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE="%CONFIGURATION%" -DCMAKE_PREFIX_PATH=%QTPATH% -DUSE_SYSTEM_QT=ON
+ - cmake -DMSVC_PDB=ON -DUSE_PCH=ON . -GNinja -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE="%CONFIGURATION%" -DCMAKE_PREFIX_PATH=%QTPATH% -DUSE_SYSTEM_QT=ON
- cmake --build .
after_build:
- git describe --tags > build-id
@@ -47,7 +41,7 @@ after_build:
- copy bin\*.dll OpenApoc-%OPENAPOC_VERSION%\
- copy bin\openapoc.exe OpenApoc-%OPENAPOC_VERSION%\
- copy bin\openapoc_launcher.exe OpenApoc-%OPENAPOC_VERSION%\
- - start %QTPATH%\bin\windeployqt --no-angle --no-opengl-sw --no-compiler-runtime OpenApoc-%OPENAPOC_VERSION%\OpenApoc_Launcher.exe
+ - start %QTPATH%\bin\windeployqt --no-opengl-sw --no-compiler-runtime OpenApoc-%OPENAPOC_VERSION%\OpenApoc_Launcher.exe
- del data\cd.iso
- xcopy /E data OpenApoc-%OPENAPOC_VERSION%\data\
- copy portable.txt OpenApoc-%OPENAPOC_VERSION%\
diff --git a/appveyor.yml b/appveyor.yml
index ecb2f42a3..717010aab 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -7,25 +7,19 @@ branches:
os: Visual Studio 2022
configuration:
- Release
-# - Debug
platform:
- x64
-# - Win32
environment:
APPVEYOR_SAVE_CACHE_ON_ERROR: true
-init:
- - if "%PLATFORM%"=="x64" (set VCPKG_DEFAULT_TRIPLET=x64-windows)
- - if "%PLATFORM%"=="x64" (set VCVARS_ARCH=amd64)
- - if "%PLATFORM%"=="x64" (set QTPATH=C:\Qt\5.15\msvc2019_64)
- - if "%PLATFORM%"=="Win32" (set VCPKG_DEFAULT_TRIPLET=x86-windows)
- - if "%PLATFORM%"=="Win32" (set VCVARS_ARCH=amd64_x86)
- - if "%PLATFORM%"=="Win32" (set QTPATH=C:\Qt\5.15\msvc2019)
+ VCPKG_DEFAULT_TRIPLET: x64-windows
+ VCVARS_ARCH: amd64
+ QTPATH: C:\Qt\6.9\msvc2022_64
#clone_depth: 10
cache: C:\Users\appveyor\AppData\Local\vcpkg\archives -> appveyor.yml
before_build:
- cd c:\tools\vcpkg
- git pull
- - git checkout 2023.08.09
+ - git checkout 2025.09.17
- .\bootstrap-vcpkg.bat
- cd %APPVEYOR_BUILD_FOLDER%
- vcpkg install
@@ -35,7 +29,7 @@ before_build:
- choco install nsis -pre
- call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" %VCVARS_ARCH%
build_script:
- - cmake -DMSVC_PDB=ON . -GNinja -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE="%CONFIGURATION%" -DCMAKE_PREFIX_PATH=%QTPATH% -DUSE_SYSTEM_QT=ON
+ - cmake -DMSVC_PDB=ON -DUSE_PCH=ON . -GNinja -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE="%CONFIGURATION%" -DCMAKE_PREFIX_PATH=%QTPATH% -DUSE_SYSTEM_QT=ON
- cmake --build .
after_build:
- git describe --tags > build-id
@@ -48,7 +42,7 @@ after_build:
- copy bin\*.dll OpenApoc-%OPENAPOC_VERSION%\
- copy bin\openapoc.exe OpenApoc-%OPENAPOC_VERSION%\
- copy bin\openapoc_launcher.exe OpenApoc-%OPENAPOC_VERSION%\
- - start %QTPATH%\bin\windeployqt --no-angle --no-opengl-sw --no-compiler-runtime OpenApoc-%OPENAPOC_VERSION%\OpenApoc_Launcher.exe
+ - start %QTPATH%\bin\windeployqt ---no-opengl-sw --no-compiler-runtime OpenApoc-%OPENAPOC_VERSION%\OpenApoc_Launcher.exe
- del data\cd.iso
- xcopy /E data OpenApoc-%OPENAPOC_VERSION%\data\
- copy portable.txt OpenApoc-%OPENAPOC_VERSION%\
@@ -59,6 +53,9 @@ after_build:
- del OpenApoc-%OPENAPOC_VERSION%\portable.txt
- '"C:\Program Files (x86)\NSIS\makensis.exe" /DGAME_VERSION=%OPENAPOC_VERSION% install\windows\installer.nsi'
- appveyor PushArtifact install\windows\install-openapoc-%OPENAPOC_VERSION%.exe
+ - copy bin\*.pdb OpenApoc-%OPENAPOC_VERSION%\
+ - 7z a %OPENAPOC_DEBUG_FILENAME% OpenApoc-%OPENAPOC_VERSION%\OpenApoc.pdb OpenApoc-%OPENAPOC_VERSION%\OpenApoc_Launcher.pdb -mx=9 -myx=7
+ - appveyor PushArtifact %OPENAPOC_DEBUG_FILENAME%
before_test:
- 7z e temp\cd.iso.xz -odata\
test_script:
diff --git a/data/forms/aequipscreen.form b/data/forms/aequipscreen.form
index 0504b6bb9..ef6124ad3 100644
--- a/data/forms/aequipscreen.form
+++ b/data/forms/aequipscreen.form
@@ -21,8 +21,8 @@
diff --git a/data/forms/basescreen.form b/data/forms/basescreen.form
index c1f767fc1..34b92db7c 100644
--- a/data/forms/basescreen.form
+++ b/data/forms/basescreen.form
@@ -21,8 +21,8 @@
bigfont
diff --git a/data/forms/cheatoptions.form b/data/forms/cheatoptions.form
index 03c982f51..d5e518690 100644
--- a/data/forms/cheatoptions.form
+++ b/data/forms/cheatoptions.form
@@ -15,8 +15,8 @@
bigfont
diff --git a/data/forms/city/alert.form b/data/forms/city/alert.form
index 4215b7efe..5ea1fe0f1 100644
--- a/data/forms/city/alert.form
+++ b/data/forms/city/alert.form
@@ -17,8 +17,8 @@
bigfont
diff --git a/data/forms/city/basebuy.form b/data/forms/city/basebuy.form
index 3cc36fa0f..1d15ebf66 100644
--- a/data/forms/city/basebuy.form
+++ b/data/forms/city/basebuy.form
@@ -27,8 +27,8 @@
bigfont
diff --git a/data/forms/city/baseselect.form b/data/forms/city/baseselect.form
index db8d66115..4b723acbe 100644
--- a/data/forms/city/baseselect.form
+++ b/data/forms/city/baseselect.form
@@ -18,8 +18,8 @@
bigfont
diff --git a/data/forms/city/bribe.form b/data/forms/city/bribe.form
index 67d8b09bf..39e3d1ae6 100644
--- a/data/forms/city/bribe.form
+++ b/data/forms/city/bribe.form
@@ -16,8 +16,8 @@
bigfont
diff --git a/data/forms/city/building.form b/data/forms/city/building.form
index 24ba321d4..482a877ea 100644
--- a/data/forms/city/building.form
+++ b/data/forms/city/building.form
@@ -16,8 +16,8 @@
bigfont
diff --git a/data/forms/city/debugoverlay_city.form b/data/forms/city/debugoverlay_city.form
index 601b6d2ea..a787f8657 100644
--- a/data/forms/city/debugoverlay_city.form
+++ b/data/forms/city/debugoverlay_city.form
@@ -47,7 +47,7 @@
smalfont
-
-
-
+
+
smalfont
diff --git a/data/forms/mapselector.form b/data/forms/mapselector.form
index 1bc70f188..e6e7ef036 100644
--- a/data/forms/mapselector.form
+++ b/data/forms/mapselector.form
@@ -16,8 +16,8 @@
bigfont
-
-
+
+
smalfont
diff --git a/data/forms/messagelog.form b/data/forms/messagelog.form
index 9ed607103..1ca946f22 100644
--- a/data/forms/messagelog.form
+++ b/data/forms/messagelog.form
@@ -16,8 +16,8 @@
bigfont
-
-
+
+
smalfont
diff --git a/data/forms/moreoptions.form b/data/forms/moreoptions.form
index 772539b7f..adcdb4f96 100644
--- a/data/forms/moreoptions.form
+++ b/data/forms/moreoptions.form
@@ -15,8 +15,8 @@
bigfont
-
-
+
+
smalfont
@@ -56,6 +56,7 @@
-->
+
@@ -122,6 +123,18 @@
+
+
+
+
+ BUTTON_CHECKBOX_FALSE
+ BUTTON_CHECKBOX_TRUE
+
+
+ smalfont
+
+
+
smalfont
diff --git a/data/forms/recruitscreen.form b/data/forms/recruitscreen.form
index a0e412711..bf1889e08 100644
--- a/data/forms/recruitscreen.form
+++ b/data/forms/recruitscreen.form
@@ -17,8 +17,8 @@
bigfont
-
-
+
+
smalfont
@@ -34,8 +34,8 @@
city/dollar-icon.png
-
-
+
+
smalfont
diff --git a/data/forms/researchscreen.form b/data/forms/researchscreen.form
index 349f0778c..cd8337252 100644
--- a/data/forms/researchscreen.form
+++ b/data/forms/researchscreen.form
@@ -16,8 +16,8 @@
bigfont
-
-
+
+
smalfont
@@ -82,8 +82,8 @@
smalfont
-
-
+
+
smalfont
diff --git a/data/forms/researchselect.form b/data/forms/researchselect.form
index e3f0f3305..91eaf7004 100644
--- a/data/forms/researchselect.form
+++ b/data/forms/researchselect.form
@@ -16,8 +16,8 @@
bigfont
-
-
+
+
smalfont
diff --git a/data/forms/savemenu.form b/data/forms/savemenu.form
index b6f9376e9..9a2984839 100644
--- a/data/forms/savemenu.form
+++ b/data/forms/savemenu.form
@@ -11,8 +11,8 @@
-
-
+
+
smalfont
diff --git a/data/forms/selectforces.form b/data/forms/selectforces.form
index f625d1167..2a6790063 100644
--- a/data/forms/selectforces.form
+++ b/data/forms/selectforces.form
@@ -17,8 +17,8 @@
bigfont
-
-
+
+
smalfont
diff --git a/data/forms/skirmish.form b/data/forms/skirmish.form
index 4000cc3a1..664098587 100644
--- a/data/forms/skirmish.form
+++ b/data/forms/skirmish.form
@@ -17,8 +17,8 @@
bigfont
-
-
+
+
smalfont
diff --git a/data/forms/transactionscreen.form b/data/forms/transactionscreen.form
index 704786f36..a21750647 100644
--- a/data/forms/transactionscreen.form
+++ b/data/forms/transactionscreen.form
@@ -15,8 +15,8 @@
bigfont
-
-
+
+
smalfont
@@ -31,8 +31,8 @@
city/dollar-icon.png
-
-
+
+
smalfont
diff --git a/data/forms/ufopaedia.form b/data/forms/ufopaedia.form
index db32120d4..a1e488ecd 100644
--- a/data/forms/ufopaedia.form
+++ b/data/forms/ufopaedia.form
@@ -85,6 +85,12 @@
smalfont
+
+
+
+
+ smalfont
+
@@ -139,6 +145,12 @@
smalfont
+
+
+
+
+ smalfont
+
diff --git a/data/forms/vequipscreen.form b/data/forms/vequipscreen.form
index 00f1e7890..14a586aa0 100644
--- a/data/forms/vequipscreen.form
+++ b/data/forms/vequipscreen.form
@@ -16,8 +16,8 @@
bigfont
-
-
+
+
smalfont
diff --git a/data/languages/ufo_string.pot b/data/languages/ufo_string.pot
index 5295cf704..563a8b8a6 100644
--- a/data/languages/ufo_string.pot
+++ b/data/languages/ufo_string.pot
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_string_cs.po b/data/languages/ufo_string_cs.po
index 6c3b47d54..71864e7d9 100644
--- a/data/languages/ufo_string_cs.po
+++ b/data/languages/ufo_string_cs.po
@@ -4450,7 +4450,7 @@ msgstr "Zásoba munice"
msgid "Cargo"
msgstr "Náklad"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Cizác. náklad"
msgid "Jamming"
diff --git a/data/languages/ufo_string_de_DE.po b/data/languages/ufo_string_de_DE.po
index fa57cf1f1..46405c45b 100644
--- a/data/languages/ufo_string_de_DE.po
+++ b/data/languages/ufo_string_de_DE.po
@@ -4449,7 +4449,7 @@ msgstr "Munitionskapazität"
msgid "Cargo"
msgstr "Fracht"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Fstglt. Aliens"
msgid "Jamming"
diff --git a/data/languages/ufo_string_en_GB.po b/data/languages/ufo_string_en_GB.po
index 5295cf704..563a8b8a6 100644
--- a/data/languages/ufo_string_en_GB.po
+++ b/data/languages/ufo_string_en_GB.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_string_es.po b/data/languages/ufo_string_es.po
index e81082f8a..d6b7ba2a6 100644
--- a/data/languages/ufo_string_es.po
+++ b/data/languages/ufo_string_es.po
@@ -4449,7 +4449,7 @@ msgstr "Capacidad de Munición"
msgid "Cargo"
msgstr "Carga"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Alienígenas"
msgid "Jamming"
diff --git a/data/languages/ufo_string_fr_FR.po b/data/languages/ufo_string_fr_FR.po
index e65e0bc42..788caf0d7 100644
--- a/data/languages/ufo_string_fr_FR.po
+++ b/data/languages/ufo_string_fr_FR.po
@@ -4450,7 +4450,7 @@ msgstr "Capacité de munitions"
msgid "Cargo"
msgstr "Cargaison"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Aliens pris"
msgid "Jamming"
diff --git a/data/languages/ufo_string_it.po b/data/languages/ufo_string_it.po
index 8b53d5d20..137097278 100644
--- a/data/languages/ufo_string_it.po
+++ b/data/languages/ufo_string_it.po
@@ -4450,7 +4450,7 @@ msgstr "Munizioni"
msgid "Cargo"
msgstr "Cargo"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Alieni cont."
msgid "Jamming"
diff --git a/data/languages/ufo_string_pl.po b/data/languages/ufo_string_pl.po
index 61424cdab..6df7443e2 100644
--- a/data/languages/ufo_string_pl.po
+++ b/data/languages/ufo_string_pl.po
@@ -4450,7 +4450,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_string_pt_BR.po b/data/languages/ufo_string_pt_BR.po
index 91330229c..5d14acca2 100644
--- a/data/languages/ufo_string_pt_BR.po
+++ b/data/languages/ufo_string_pt_BR.po
@@ -4450,7 +4450,7 @@ msgstr "Capacidade p/ munição"
msgid "Cargo"
msgstr "Carga"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Alienígenas Aprisionados"
msgid "Jamming"
diff --git a/data/languages/ufo_string_ru_RU.po b/data/languages/ufo_string_ru_RU.po
index 71f752955..838629822 100644
--- a/data/languages/ufo_string_ru_RU.po
+++ b/data/languages/ufo_string_ru_RU.po
@@ -4455,7 +4455,7 @@ msgstr "Боезапас"
msgid "Cargo"
msgstr "Груз"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Пришельцев удерживается"
msgid "Jamming"
diff --git a/data/languages/ufo_string_uk.po b/data/languages/ufo_string_uk.po
index 72926769b..463affb3b 100644
--- a/data/languages/ufo_string_uk.po
+++ b/data/languages/ufo_string_uk.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_cs.po b/data/languages/ufo_stringpo_cs.po
index 35609116b..fd9621fe1 100644
--- a/data/languages/ufo_stringpo_cs.po
+++ b/data/languages/ufo_stringpo_cs.po
@@ -4452,7 +4452,7 @@ msgstr "Zásoba munice"
msgid "Cargo"
msgstr "Náklad"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Cizác. náklad"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_de_DE.po b/data/languages/ufo_stringpo_de_DE.po
index 00479ca34..02a3c2439 100644
--- a/data/languages/ufo_stringpo_de_DE.po
+++ b/data/languages/ufo_stringpo_de_DE.po
@@ -4449,7 +4449,7 @@ msgstr "Munitionskapazität"
msgid "Cargo"
msgstr "Fracht"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Fstglt. Aliens"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_en.po b/data/languages/ufo_stringpo_en.po
index 639414b80..ee3e872d8 100644
--- a/data/languages/ufo_stringpo_en.po
+++ b/data/languages/ufo_stringpo_en.po
@@ -4448,8 +4448,8 @@ msgstr "Ammo capacity"
msgid "Cargo"
msgstr "Cargo"
-msgid "Aliens Held"
-msgstr "Aliens Held"
+msgid "Max Samples"
+msgstr "Max Samples"
msgid "Jamming"
msgstr "Jamming"
diff --git a/data/languages/ufo_stringpo_en_GB.po b/data/languages/ufo_stringpo_en_GB.po
index 0b3b375c0..98d00d97c 100644
--- a/data/languages/ufo_stringpo_en_GB.po
+++ b/data/languages/ufo_stringpo_en_GB.po
@@ -4450,7 +4450,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_es.po b/data/languages/ufo_stringpo_es.po
index 72bfe14b4..0386849c6 100644
--- a/data/languages/ufo_stringpo_es.po
+++ b/data/languages/ufo_stringpo_es.po
@@ -4450,7 +4450,7 @@ msgstr "Capacidad de Munición"
msgid "Cargo"
msgstr "Carga"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Alienígenas"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_et_EE.po b/data/languages/ufo_stringpo_et_EE.po
index 42cbc5343..00c0b7d3b 100644
--- a/data/languages/ufo_stringpo_et_EE.po
+++ b/data/languages/ufo_stringpo_et_EE.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_fi.po b/data/languages/ufo_stringpo_fi.po
index 54a0b942b..2c9513d6a 100644
--- a/data/languages/ufo_stringpo_fi.po
+++ b/data/languages/ufo_stringpo_fi.po
@@ -4450,7 +4450,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_fil_PH.po b/data/languages/ufo_stringpo_fil_PH.po
index b1d6e2e08..a3a57b14d 100644
--- a/data/languages/ufo_stringpo_fil_PH.po
+++ b/data/languages/ufo_stringpo_fil_PH.po
@@ -4449,7 +4449,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_fr_FR.po b/data/languages/ufo_stringpo_fr_FR.po
index 64c32fab1..8623da97e 100644
--- a/data/languages/ufo_stringpo_fr_FR.po
+++ b/data/languages/ufo_stringpo_fr_FR.po
@@ -4450,7 +4450,7 @@ msgstr "Capacité de munitions"
msgid "Cargo"
msgstr "Cargaison"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Aliens pris"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_hu_HU.po b/data/languages/ufo_stringpo_hu_HU.po
index 23772a79f..d1998bfa2 100644
--- a/data/languages/ufo_stringpo_hu_HU.po
+++ b/data/languages/ufo_stringpo_hu_HU.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_it.po b/data/languages/ufo_stringpo_it.po
index f78dc92aa..8955cd340 100644
--- a/data/languages/ufo_stringpo_it.po
+++ b/data/languages/ufo_stringpo_it.po
@@ -4450,7 +4450,7 @@ msgstr "Munizioni"
msgid "Cargo"
msgstr "Cargo"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Alieni cont."
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_ja.po b/data/languages/ufo_stringpo_ja.po
index 7980a6f1a..e3de7c65b 100644
--- a/data/languages/ufo_stringpo_ja.po
+++ b/data/languages/ufo_stringpo_ja.po
@@ -4448,7 +4448,7 @@ msgstr "装弾数"
msgid "Cargo"
msgstr "貨物"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "捕獲中のエイリアン"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_ja_JP.po b/data/languages/ufo_stringpo_ja_JP.po
index cc4d7af60..803897b8d 100644
--- a/data/languages/ufo_stringpo_ja_JP.po
+++ b/data/languages/ufo_stringpo_ja_JP.po
@@ -4449,7 +4449,7 @@ msgstr "装弾数"
msgid "Cargo"
msgstr "貨物"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "捕獲中のエイリアン"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_lt.po b/data/languages/ufo_stringpo_lt.po
index 960f1beee..29ad5bfe3 100644
--- a/data/languages/ufo_stringpo_lt.po
+++ b/data/languages/ufo_stringpo_lt.po
@@ -4449,7 +4449,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_nb_NO.po b/data/languages/ufo_stringpo_nb_NO.po
index 5f8ad78ae..3cb845123 100644
--- a/data/languages/ufo_stringpo_nb_NO.po
+++ b/data/languages/ufo_stringpo_nb_NO.po
@@ -4449,7 +4449,7 @@ msgstr "Ammunisjonskapasitet"
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_pl.po b/data/languages/ufo_stringpo_pl.po
index c9f273162..3e19d9ce5 100644
--- a/data/languages/ufo_stringpo_pl.po
+++ b/data/languages/ufo_stringpo_pl.po
@@ -4454,7 +4454,7 @@ msgstr "Pojemność amunicji"
msgid "Cargo"
msgstr "Ładunek"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Pod kontrolą obcych"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_pt_BR.po b/data/languages/ufo_stringpo_pt_BR.po
index 84da87de0..33d759328 100644
--- a/data/languages/ufo_stringpo_pt_BR.po
+++ b/data/languages/ufo_stringpo_pt_BR.po
@@ -4450,7 +4450,7 @@ msgstr "Capacidade p/ munição"
msgid "Cargo"
msgstr "Carga"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Alienígenas Aprisionados"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_pt_PT.po b/data/languages/ufo_stringpo_pt_PT.po
index 845f0bcf1..aab4c6b42 100644
--- a/data/languages/ufo_stringpo_pt_PT.po
+++ b/data/languages/ufo_stringpo_pt_PT.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_ro_RO.po b/data/languages/ufo_stringpo_ro_RO.po
index 6ad5ab3e2..7275a2d26 100644
--- a/data/languages/ufo_stringpo_ro_RO.po
+++ b/data/languages/ufo_stringpo_ro_RO.po
@@ -4449,7 +4449,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_ru_RU.po b/data/languages/ufo_stringpo_ru_RU.po
index 8efd52727..9d4b639a1 100644
--- a/data/languages/ufo_stringpo_ru_RU.po
+++ b/data/languages/ufo_stringpo_ru_RU.po
@@ -4453,7 +4453,7 @@ msgstr "Боезапас"
msgid "Cargo"
msgstr "Груз"
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr "Пришельцев удерживается"
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_sk.po b/data/languages/ufo_stringpo_sk.po
index 10ed82394..426016804 100644
--- a/data/languages/ufo_stringpo_sk.po
+++ b/data/languages/ufo_stringpo_sk.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_sl_SI.po b/data/languages/ufo_stringpo_sl_SI.po
index 6c07733fd..455504de5 100644
--- a/data/languages/ufo_stringpo_sl_SI.po
+++ b/data/languages/ufo_stringpo_sl_SI.po
@@ -4450,7 +4450,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_tr_TR.po b/data/languages/ufo_stringpo_tr_TR.po
index d83887fc8..fc515af56 100644
--- a/data/languages/ufo_stringpo_tr_TR.po
+++ b/data/languages/ufo_stringpo_tr_TR.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_uk.po b/data/languages/ufo_stringpo_uk.po
index e95edba5c..3b6cfa59f 100644
--- a/data/languages/ufo_stringpo_uk.po
+++ b/data/languages/ufo_stringpo_uk.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/data/languages/ufo_stringpo_zh_TW.po b/data/languages/ufo_stringpo_zh_TW.po
index 2cb6e5825..b45b09069 100644
--- a/data/languages/ufo_stringpo_zh_TW.po
+++ b/data/languages/ufo_stringpo_zh_TW.po
@@ -4448,7 +4448,7 @@ msgstr ""
msgid "Cargo"
msgstr ""
-msgid "Aliens Held"
+msgid "Max Samples"
msgstr ""
msgid "Jamming"
diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt
index 80643ec20..b680c8016 100644
--- a/dependencies/CMakeLists.txt
+++ b/dependencies/CMakeLists.txt
@@ -1,9 +1,6 @@
# project name, and type
PROJECT(OpenApoc_Dependencies C CXX)
-# check cmake version
-CMAKE_MINIMUM_REQUIRED(VERSION 3.9)
-
# hide dependency warnings
add_compile_options("-w")
diff --git a/dependencies/fmt b/dependencies/fmt
index f19b1a521..7bdf0628b 160000
--- a/dependencies/fmt
+++ b/dependencies/fmt
@@ -1 +1 @@
-Subproject commit f19b1a521ee8b606dedcadfda69fd10ddf882753
+Subproject commit 7bdf0628b1276379886c7f6dda2cef2b3b374f0b
diff --git a/dependencies/magic_enum b/dependencies/magic_enum
new file mode 160000
index 000000000..adc7d2ba5
--- /dev/null
+++ b/dependencies/magic_enum
@@ -0,0 +1 @@
+Subproject commit adc7d2ba57e142b6ad018e01057233478a74c1e8
diff --git a/dependencies/physfs b/dependencies/physfs
index 4b5c26a72..552e4f0ca 160000
--- a/dependencies/physfs
+++ b/dependencies/physfs
@@ -1 +1 @@
-Subproject commit 4b5c26a72a106b5f78b268674cf487054cccaacc
+Subproject commit 552e4f0ca47c9c304ad23f5210ced3405a16306e
diff --git a/forms/CMakeLists.txt b/forms/CMakeLists.txt
index dcf9492fe..c79c14da9 100644
--- a/forms/CMakeLists.txt
+++ b/forms/CMakeLists.txt
@@ -4,9 +4,6 @@ PROJECT(OpenApoc_Forms CXX C)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package (Threads REQUIRED)
-# check cmake version
-CMAKE_MINIMUM_REQUIRED(VERSION 3.9)
-
set (FORMS_SOURCE_FILES
checkbox.cpp
control.cpp
@@ -56,3 +53,7 @@ target_link_libraries(OpenApoc_Forms PUBLIC OpenApoc_Framework
OpenApoc_LibPugixml)
target_include_directories(OpenApoc_Forms PUBLIC ${CMAKE_SOURCE_DIR})
+
+if (USE_PCH)
+ target_precompile_headers(OpenApoc_Forms PUBLIC forms_pch.h)
+endif()
\ No newline at end of file
diff --git a/forms/control.cpp b/forms/control.cpp
index 07835eb1a..f2ba76080 100644
--- a/forms/control.cpp
+++ b/forms/control.cpp
@@ -10,7 +10,6 @@
#include "framework/image.h"
#include "framework/options.h"
#include "framework/renderer.h"
-#include "framework/sound.h"
#include "library/sp.h"
#include
@@ -23,8 +22,8 @@ Control::Control(bool takesFocus)
Size(0, 0), SelectionSize(0, 0), BackgroundColour(0, 0, 0, 0), takesFocus(takesFocus),
showBounds(false), Enabled(true), canCopy(true),
// Tooltip defaults
- ToolTipBackground{128, 128, 128}, ToolTipBorders{
- {1, {0, 0, 0}}, {1, {255, 255, 255}}, {1, {0, 0, 0, 0}}}
+ ToolTipBackground{128, 128, 128},
+ ToolTipBorders{{1, {0, 0, 0}}, {1, {255, 255, 255}}, {1, {0, 0, 0, 0}}}
{
this->ToolTipFont = ui().getFont(Options::defaultTooltipFont.get());
}
diff --git a/forms/forms_pch.h b/forms/forms_pch.h
index aa9734f1c..a402e3b2f 100644
--- a/forms/forms_pch.h
+++ b/forms/forms_pch.h
@@ -2,25 +2,10 @@
#include "dependencies/pugixml/src/pugixml.hpp"
#include "forms/control.h"
-#include "framework/apocresources/apocfont.h"
-#include "framework/configfile.h"
+#include "forms/forms_enums.h"
#include "framework/data.h"
#include "framework/event.h"
-#include "framework/font.h"
#include "framework/framework.h"
#include "framework/image.h"
-#include "framework/keycodes.h"
-#include "framework/logger.h"
#include "framework/renderer.h"
-#include "framework/sound.h"
-#include "framework/trace.h"
-#include "library/colour.h"
-#include "library/sp.h"
-#include "library/strings.h"
-#include "library/strings_format.h"
-#include "library/vec.h"
-#include
-#include
-#include