diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..25cc3fffc
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,11 @@
+root = true
+
+[*.cpp]
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+
+[*.hpp]
+indent_style = space
+indent_size = 4
+insert_final_newline = true
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index ca2c6502e..9fbb82dba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,6 +26,7 @@ Doxygen
.settings
.directory
.idea
+files/windows/*.aps
## qt-creator
CMakeLists.txt.user*
diff --git a/.travis.yml b/.travis.yml
index c3f1cdfb6..6606b0290 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,7 @@
os:
- linux
- osx
-osx_image: xcode8.2
+osx_image: xcode8.3
language: cpp
sudo: required
dist: trusty
@@ -15,11 +15,7 @@ env:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key
- secure: "jybGzAdUbqt9vWR/GEnRd96BgAi/7Zd1+2HK68j/i/8+/1YH2XxLOy4Jv/DUBhBlJIkxs/Xv8dRcUlFOclZDHX1d/9Qnsqd3oUVkD7k1y7cTOWy9TBQaE/v/kZo3LpzA3xPwwthrb0BvqIbOfIELi5fS5s8ba85WFRg3AX70wWE="
- # macOS builds FTP upload login
- - secure: "MegynKyJpyL7XDwdWVEbypQh7CLjqOqOi9lGF97G7Fq0HosVZTmnwjHhmIPZspTP7ES4UbxM3rs/f3ce7sp9JN2ShRJpduD6UEFc8egQXBte9J3obUBIdUxPTRdhnht7VJ+u+pksK1S/Bm1Cs6l0eEluP3vmcaXWMykVQcZsPhY="
- # macOS builds FTP upload password
- - secure: "jQcAaWAdDy0+vlNu4POMX8322HanCOQEUTdpviWTAUjWQTjMa0UTM4+zVVgrtEaHMpBaVYYbTT3Rg5BQ9oG+2SiVLJBQQ2XoMcos/YrjPVT6inB02Gs0vFjP29LdPAQVrB8CkAcfQr6u+Z2C+RqAtwhE09LsBUMXjRDzPAtr1CM="
- - macos_qt_formula=qt@5.5
+ - macos_qt_formula=qt
addons:
apt:
sources:
@@ -32,7 +28,7 @@ addons:
# Tests
libgtest-dev, google-mock,
# Boost
- libboost-filesystem-dev, libboost-program-options-dev, libboost-system-dev, libboost-thread-dev,
+ libboost-filesystem-dev, libboost-program-options-dev, libboost-system-dev,
# FFmpeg
libavcodec-dev, libavformat-dev, libavutil-dev, libswscale-dev,
# Audio & Video
diff --git a/AUTHORS.md b/AUTHORS.md
index a37975d24..c48647f4e 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -50,6 +50,7 @@ Programmers
Edmondo Tommasina (edmondo)
Eduard Cot (trombonecot)
Eli2
+ elsid
Emanuel Guével (potatoesmaster)
eroen
escondida
@@ -61,8 +62,8 @@ Programmers
Hallfaer Tuilinn
hristoast
Internecine
- Jacob Essex (Yacoby)
- Jannik Heller (scrawl)
+ Jacob Essex (Yacoby)
+ Jake Westrip (16bitint)
Jason Hooks (jhooks)
jeaye
Jeffrey Haines (Jyby)
@@ -74,6 +75,7 @@ Programmers
Jordan Ayers
Jordan Milne
Jules Blok (Armada651)
+ julianko
Julien Voisin (jvoisin/ap0)
Karl-Felix Glatzer (k1ll)
Kevin Poitra (PuppyKevin)
@@ -108,6 +110,7 @@ Programmers
Narmo
Nathan Jeffords (blunted2night)
NeveHanter
+ Nialsy
Nikolay Kasyanov (corristo)
nobrakal
Nolan Poe (nopoe)
@@ -117,6 +120,7 @@ Programmers
Pi03k
Pieter van der Kloet (pvdk)
pkubik
+ PlutonicOverkill
Radu-Marius Popovici (rpopovici)
Rafael Moura (dhustkoder)
rdimesio
@@ -128,11 +132,14 @@ Programmers
Roman Proskuryakov (kpp)
Sandy Carter (bwrsandman)
Scott Howard
+ scrawl
Sebastian Wick (swick)
Sergey Shambir
ShadowRadiance
+ Siimacore
sir_herrbatka
smbas
+ spycrab
Stefan Galowicz (bogglez)
Stanislav Bobrov (Jiub)
stil-t
@@ -141,6 +148,7 @@ Programmers
t6
terrorfisch
Thomas Luppi (Digmaster)
+ Will Herrmann (Thunderforge)
Tom Mason (wheybags)
Torben Leif Carrington (TorbenC)
viadanna
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 87d826753..b390169c6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,82 @@
+0.42.0
+------
+
+ Bug #1956: Duplicate objects after loading the game, when a mod was edited
+ Bug #2100: Falling leaves in Vurt's Leafy West Gash II not rendered correctly
+ Bug #2116: Cant fit through some doorways pressed against staircases
+ Bug #2289: Some modal dialogs are not centered on the screen when the window resizes
+ Bug #2409: Softlock when pressing weapon/magic switch keys during chargen, afterwards switches weapons even though a text field is selected
+ Bug #2483: Previous/Next Weapon hotkeys triggered while typing the name of game save
+ Bug #2629: centeroncell, coc causes death / fall damage time to time when teleporting from high
+ Bug #2645: Cycling weapons is possible while console/pause menu is open
+ Bug #2678: Combat with water creatures do not end upon exiting water
+ Bug #2759: Light Problems in Therana's Chamber in Tel Branora
+ Bug #2771: unhandled sdl event of type 0x302
+ Bug #2777: (constant/on cast) disintegrate armor/weapon on self is seemingly not working
+ Bug #2838: Editor: '.' in a record name should be allowed
+ Bug #2909: NPCs appear floating when standing on a slope
+ Bug #3093: Controller movement cannot be used while mouse is moving
+ Bug #3134: Crash possible when using console with open container
+ Bug #3254: AI enemies hit between them.
+ Bug #3344: Editor: Verification results sorting by Type is not alphabetical.
+ Bug #3345: Editor: Cloned and added pathgrids are lost after reopen of saved omwgame file
+ Bug #3355: [MGSO] Physics maxing out in south cornerclub Balmora
+ Bug #3484: Editor: camera position is not set when changing cell via drag&drop
+ Bug #3508: Slowfall kills Jump momentum
+ Bug #3580: Crash: Error ElementBufferObject::remove BufferData<0> out of range
+ Bug #3581: NPCs wander too much
+ Bug #3601: Menu Titles not centered vertically
+ Bug #3607: [Mac OS] Beginning of NPC speech cut off (same issue as closed bug #3453)
+ Bug #3613: Can not map "next weapon" or "next spell" to controller
+ Bug #3617: Enchanted arrows don't explode when hitting the ground
+ Bug #3645: Unable to use steps in Vivec, Palace of Vivec
+ Bug #3650: Tamriel Rebuilt 16.09.1 – Hist Cuirass GND nif is rendered inside a Pink Box
+ Bug #3652: Item icon shadows get stuck in the alchemy GUI
+ Bug #3653: Incorrect swish sounds
+ Bug #3666: NPC collision should not be disabled until death animation has finished
+ Bug #3669: Editor: Text field was missing from book object editing dialogue
+ Bug #3670: Unhandled SDL event of type 0x304
+ Bug #3671: Incorrect local variable value after picking up bittercup
+ Bug #3686: Travelling followers doesn't increase travel fee
+ Bug #3689: Problematic greetings from Antares Big Mod that override the appropriate ones.
+ Bug #3690: Certain summoned creatures do not engage in combat with underwater creatures
+ Bug #3691: Enemies do not initiate combat with player followers on sight
+ Bug #3695: [Regression] Dispel does not always dispel spell effects in 0.41
+ Bug #3699: Crash on MWWorld::ProjectileManager::moveMagicBolts
+ Bug #3700: Climbing on rocks and mountains
+ Bug #3704: Creatures don't auto-equip their shields on creation
+ Bug #3705: AI combat engagement logic differs from vanilla
+ Bug #3707: Animation playing does some very odd things if pc comes in contact with the animated mesh
+ Bug #3712: [Mod] Freeze upon entering Adanumuran with mod Adanumuran Reclaimed
+ Bug #3713: [Regression] Cancelling dialogue or using travel with creatures throws a (possibly game-breaking) exception
+ Bug #3719: Dropped identification papers can't be picked up again
+ Bug #3722: Command spell doesn't bring enemies out of combat
+ Bug #3727: Using "Activate" mid-script-execution invalidates interpreter context
+ Bug #3746: Editor: Book records show attribute IDs instead of skill IDs for teached skills entry.
+ Bug #3755: Followers stop following after loading from savegame
+ Bug #3772: ModStat lowers attribute to 100 if it was greater
+ Bug #3781: Guns in Clean Hunter Rifles mod use crossbow sounds
+ Bug #3797: NPC and creature names don't show up in combat when RMB windows are displayed
+ Bug #3800: Wrong tooltip maximum width
+ Bug #3801: Drowning widget is bugged
+ Bug #3802: BarterOffer shouldn't limit pcMercantile
+ Bug #3813: Some fatal error
+ Bug #3816: Expression parser thinks the -> token is unexpected when a given explicit refID clashes with a journal ID
+ Bug #3822: Custom added creatures are not animated
+ Feature #451: Water sounds
+ Feature #2691: Light particles sometimes not shown in inventory character preview
+ Feature #3523: Light source on magic projectiles
+ Feature #3644: Nif NiSphericalCollider Unknown Record Type
+ Feature #3675: ess-Importer: convert mark location
+ Feature #3693: ess-Importer: convert last known exterior cell
+ Feature #3748: Editor: Replace "Scroll" check box in Book records with "Book Type" combo box.
+ Feature #3751: Editor: Replace "Xyz Blood" check boxes in NPC and Creature records with "Blood Type" combo box
+ Feature #3752: Editor: Replace emitter check boxes in Light records with "Emitter Type" combo box
+ Feature #3756: Editor: Replace "Female" check box in NPC records with "Gender" combo box
+ Feature #3757: Editor: Replace "Female" check box in BodyPart records with "Gender" combo box
+ Task #3092: const version of ContainerStoreIterator
+ Task #3795: /deps folder not in .gitignore
+
0.41.0
------
diff --git a/CI/before_install.osx.sh b/CI/before_install.osx.sh
index 2d20eb9a0..25e1c9517 100755
--- a/CI/before_install.osx.sh
+++ b/CI/before_install.osx.sh
@@ -2,10 +2,9 @@
brew update
-brew rm cmake || true
-brew rm pkgconfig || true
-brew rm qt5 || true
-brew install cmake pkgconfig $macos_qt_formula
+brew outdated cmake || brew upgrade cmake
+brew outdated pkgconfig || brew upgrade pkgconfig
+brew install $macos_qt_formula
-curl https://downloads.openmw.org/osx/dependencies/openmw-deps-c79172d.zip -o ~/openmw-deps.zip
+curl https://downloads.openmw.org/osx/dependencies/openmw-deps-5e144e2.zip -o ~/openmw-deps.zip
unzip ~/openmw-deps.zip -d /private/tmp/openmw-deps > /dev/null
diff --git a/CI/before_script.msvc.sh b/CI/before_script.msvc.sh
index aa8c565ba..14998a3c6 100644
--- a/CI/before_script.msvc.sh
+++ b/CI/before_script.msvc.sh
@@ -75,7 +75,7 @@ Options:
Set the build platform, can also be set with environment variable PLATFORM.
-u
Configure for unity builds.
- -v <2013/2015>
+ -v <2013/2015/2017>
Choose the Visual Studio version to use.
-V
Run verbosely
@@ -213,20 +213,28 @@ if [ -z $VS_VERSION ]; then
fi
case $VS_VERSION in
+ 15|15.0|2017 )
+ GENERATOR="Visual Studio 15 2017"
+ TOOLSET="vc140"
+ MSVC_VER="14"
+ MSVC_YEAR="2015"
+ MSVC_DISPLAY_YEAR="2017"
+ ;;
+
14|14.0|2015 )
GENERATOR="Visual Studio 14 2015"
- XP_TOOLSET="v140_xp"
- TOOLSET="v140"
+ TOOLSET="vc140"
MSVC_VER="14"
MSVC_YEAR="2015"
+ MSVC_DISPLAY_YEAR="2015"
;;
12|12.0|2013 )
GENERATOR="Visual Studio 12 2013"
- XP_TOOLSET="v120_xp"
- TOOLSET="v120"
+ TOOLSET="vc120"
MSVC_VER="12"
MSVC_YEAR="2013"
+ MSVC_DISPLAY_YEAR="2013"
;;
esac
@@ -278,7 +286,7 @@ fi
echo
echo "==================================="
-echo "Starting prebuild on MSVC${MSVC_YEAR} WIN${BITS}"
+echo "Starting prebuild on MSVC${MSVC_DISPLAY_YEAR} WIN${BITS}"
echo "==================================="
echo
@@ -305,11 +313,11 @@ if [ -z $SKIP_DOWNLOAD ]; then
"Bullet-2.86-msvc${MSVC_YEAR}-win${BITS}.7z"
# FFmpeg
- download "FFmpeg 3.0.1" \
- "http://ffmpeg.zeranoe.com/builds/win${BITS}/shared/ffmpeg-3.0.1-win${BITS}-shared.7z" \
- "ffmpeg-3.0.1-win${BITS}.7z" \
- "http://ffmpeg.zeranoe.com/builds/win${BITS}/dev/ffmpeg-3.0.1-win${BITS}-dev.7z" \
- "ffmpeg-3.0.1-dev-win${BITS}.7z"
+ download "FFmpeg 3.2.4" \
+ "http://ffmpeg.zeranoe.com/builds/win${BITS}/shared/ffmpeg-3.2.4-win${BITS}-shared.zip" \
+ "ffmpeg-3.2.4-win${BITS}.zip" \
+ "http://ffmpeg.zeranoe.com/builds/win${BITS}/dev/ffmpeg-3.2.4-win${BITS}-dev.zip" \
+ "ffmpeg-3.2.4-dev-win${BITS}.zip"
# MyGUI
download "MyGUI 3.2.3-git" \
@@ -350,7 +358,7 @@ fi
cd .. #/..
# Set up dependencies
-BUILD_DIR="MSVC${MSVC_YEAR}_${BITS}"
+BUILD_DIR="MSVC${MSVC_DISPLAY_YEAR}_${BITS}"
if [ -z $KEEP ]; then
echo
echo "(Re)Creating build directory."
@@ -395,6 +403,7 @@ fi
add_cmake_opts -DBOOST_ROOT="$BOOST_SDK" \
-DBOOST_LIBRARYDIR="${BOOST_SDK}/lib${BITS}-msvc-${MSVC_VER}.0"
+ add_cmake_opts -DBoost_COMPILER="-${TOOLSET}"
echo Done.
else
@@ -406,6 +415,7 @@ fi
fi
add_cmake_opts -DBOOST_ROOT="$BOOST_SDK" \
-DBOOST_LIBRARYDIR="${BOOST_SDK}/lib${BITS}-msvc-${MSVC_VER}.0"
+ add_cmake_opts -DBoost_COMPILER="-${TOOLSET}"
echo Done.
fi
@@ -434,21 +444,21 @@ cd $DEPS
echo
# FFmpeg
-printf "FFmpeg 3.0.1... "
+printf "FFmpeg 3.2.4... "
{
cd $DEPS_INSTALL
- if [ -d FFmpeg ] && grep "FFmpeg version: 3.0.1" FFmpeg/README.txt > /dev/null; then
+ if [ -d FFmpeg ] && grep "FFmpeg version: 3.2.4" FFmpeg/README.txt > /dev/null; then
printf "Exists. "
elif [ -z $SKIP_EXTRACT ]; then
rm -rf FFmpeg
- eval 7z x -y "${DEPS}/ffmpeg-3.0.1-win${BITS}.7z" $STRIP
- eval 7z x -y "${DEPS}/ffmpeg-3.0.1-dev-win${BITS}.7z" $STRIP
+ eval 7z x -y "${DEPS}/ffmpeg-3.2.4-win${BITS}.zip" $STRIP
+ eval 7z x -y "${DEPS}/ffmpeg-3.2.4-dev-win${BITS}.zip" $STRIP
- mv "ffmpeg-3.0.1-win${BITS}-shared" FFmpeg
- cp -r "ffmpeg-3.0.1-win${BITS}-dev/"* FFmpeg/
- rm -rf "ffmpeg-3.0.1-win${BITS}-dev"
+ mv "ffmpeg-3.2.4-win${BITS}-shared" FFmpeg
+ cp -r "ffmpeg-3.2.4-win${BITS}-dev/"* FFmpeg/
+ rm -rf "ffmpeg-3.2.4-win${BITS}-dev"
fi
export FFMPEG_HOME="$(real_pwd)/FFmpeg"
@@ -755,4 +765,4 @@ if [ -z $CI ]; then
echo
fi
-exit $RET
\ No newline at end of file
+exit $RET
diff --git a/CI/before_script.osx.sh b/CI/before_script.osx.sh
index bec26caf1..806b545e3 100755
--- a/CI/before_script.osx.sh
+++ b/CI/before_script.osx.sh
@@ -5,13 +5,12 @@ export CC=clang
DEPENDENCIES_ROOT="/private/tmp/openmw-deps/openmw-deps"
QT_PATH=`brew --prefix $macos_qt_formula`
-
mkdir build
cd build
cmake \
-D CMAKE_PREFIX_PATH="$DEPENDENCIES_ROOT;$QT_PATH" \
--D CMAKE_OSX_DEPLOYMENT_TARGET="10.8" \
+-D CMAKE_OSX_DEPLOYMENT_TARGET="10.9" \
-D CMAKE_OSX_SYSROOT="macosx10.12" \
-D CMAKE_BUILD_TYPE=Release \
-D OPENMW_OSX_DEPLOYMENT=TRUE \
diff --git a/CI/build.msvc.sh b/CI/build.msvc.sh
index f8d5a2f24..eac969b0d 100644
--- a/CI/build.msvc.sh
+++ b/CI/build.msvc.sh
@@ -77,9 +77,9 @@ if [ $? -ne 0 ]; then
fi
if [ -z $APPVEYOR ]; then
- msbuild OpenMW.sln //t:Build //m:8
+ msbuild OpenMW.sln //t:Build //p:Configuration=${CONFIGURATION} //m:8
else
- msbuild OpenMW.sln //t:Build //m:8 //logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
+ msbuild OpenMW.sln //t:Build //p:Configuration=${CONFIGURATION} //m:8 //logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
fi
RET=$?
diff --git a/CI/deploy.osx.sh b/CI/deploy.osx.sh
index 1ff6f89c3..53bfa18b5 100755
--- a/CI/deploy.osx.sh
+++ b/CI/deploy.osx.sh
@@ -6,4 +6,4 @@ DATE=`date +'%d%m%Y'`
SHORT_COMMIT=`git rev-parse --short ${TRAVIS_COMMIT}`
TARGET_FILENAME="OpenMW-${DATE}-${SHORT_COMMIT}.dmg"
-curl --ssl --ftp-create-dirs -T *.dmg -u $OSX_FTP_USER:$OSX_FTP_PASSWORD "ftp://s3.mydevil.net:21/nightly/${TARGET_FILENAME}"
+curl --ssl --ftp-create-dirs -T *.dmg -u $OSX_FTP_USER:$OSX_FTP_PASSWORD "${OSX_FTP_URL}${TARGET_FILENAME}"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7c8e8cd16..884dd622d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,7 +25,7 @@ endif()
message(STATUS "Configuring OpenMW...")
set(OPENMW_VERSION_MAJOR 0)
-set(OPENMW_VERSION_MINOR 41)
+set(OPENMW_VERSION_MINOR 42)
set(OPENMW_VERSION_RELEASE 0)
set(OPENMW_VERSION_COMMITHASH "")
@@ -343,7 +343,13 @@ endif()
# CXX Compiler settings
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wundef -Wno-unused-parameter -std=c++98 -pedantic -Wno-long-long")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wundef -Wno-unused-parameter -std=c++11 -pedantic -Wno-long-long")
+ add_definitions( -DBOOST_NO_CXX11_SCOPED_ENUMS=ON )
+
+ if (APPLE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
+ endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL Clang AND NOT APPLE)
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 3.6 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.6)
@@ -407,7 +413,7 @@ IF(NOT WIN32 AND NOT APPLE)
# Install icon and desktop file
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.desktop" DESTINATION "${DATAROOTDIR}/applications" COMPONENT "openmw")
INSTALL(FILES "${OpenMW_SOURCE_DIR}/files/launcher/images/openmw.png" DESTINATION "${ICONDIR}" COMPONENT "openmw")
- INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.appdata.xml" DESTINATION "${DATAROOTDIR}/appdata" COMPONENT "openmw")
+ INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.appdata.xml" DESTINATION "${DATAROOTDIR}/metainfo" COMPONENT "openmw")
IF(BUILD_OPENCS)
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw-cs.desktop" DESTINATION "${DATAROOTDIR}/applications" COMPONENT "opencs")
INSTALL(FILES "${OpenMW_SOURCE_DIR}/files/opencs/openmw-cs.png" DESTINATION "${ICONDIR}" COMPONENT "opencs")
@@ -620,6 +626,7 @@ if (WIN32)
4510 4512 # Unable to generate copy constructor/assignment operator as it's not public in the base
4706 # Assignment in conditional expression
4738 # Storing 32-bit float result in memory, possible loss of performance
+ 4774 # Format string expected in argument is not a string literal
4986 # Undocumented warning that occurs in the crtdbg.h file
4987 # nonstandard extension used (triggered by setjmp.h)
4996 # Function was declared deprecated
@@ -711,17 +718,19 @@ if (WIN32)
endif()
# Apple bundling
-if (APPLE)
+if (OPENMW_OSX_DEPLOYMENT AND APPLE AND DESIRED_QT_VERSION MATCHES 5)
get_property(QT_COCOA_PLUGIN_PATH TARGET Qt5::QCocoaIntegrationPlugin PROPERTY LOCATION_RELEASE)
get_filename_component(QT_COCOA_PLUGIN_DIR "${QT_COCOA_PLUGIN_PATH}" DIRECTORY)
get_filename_component(QT_COCOA_PLUGIN_GROUP "${QT_COCOA_PLUGIN_DIR}" NAME)
get_filename_component(QT_COCOA_PLUGIN_NAME "${QT_COCOA_PLUGIN_PATH}" NAME)
- configure_file("${QT_COCOA_PLUGIN_PATH}" "${APP_BUNDLE_DIR}/Contents/MacOS/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}" COPYONLY)
+ configure_file("${QT_COCOA_PLUGIN_PATH}" "${APP_BUNDLE_DIR}/Contents/PlugIns/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}" COPYONLY)
+ configure_file("${OpenMW_SOURCE_DIR}/files/mac/qt.conf" "${APP_BUNDLE_DIR}/Contents/Resources/qt.conf" COPYONLY)
if (BUILD_OPENCS)
get_property(OPENCS_BUNDLE_NAME_TMP TARGET openmw-cs PROPERTY OUTPUT_NAME)
set(OPENCS_BUNDLE_NAME "${OPENCS_BUNDLE_NAME_TMP}.app")
- configure_file("${QT_COCOA_PLUGIN_PATH}" "${OPENCS_BUNDLE_NAME}/Contents/MacOS/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}" COPYONLY)
+ configure_file("${QT_COCOA_PLUGIN_PATH}" "${OPENCS_BUNDLE_NAME}/Contents/PlugIns/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}" COPYONLY)
+ configure_file("${OpenMW_SOURCE_DIR}/files/mac/qt.conf" "${OPENCS_BUNDLE_NAME}/Contents/Resources/qt.conf" COPYONLY)
endif ()
install(DIRECTORY "${APP_BUNDLE_DIR}" USE_SOURCE_PERMISSIONS DESTINATION "." COMPONENT Runtime)
@@ -780,8 +789,8 @@ if (APPLE)
install_plugins_for_bundle("${APP_BUNDLE_NAME}" PLUGINS)
install_plugins_for_bundle("${OPENCS_BUNDLE_NAME}" OPENCS_PLUGINS)
- set(PLUGINS ${PLUGINS} "${INSTALLED_OPENMW_APP}/Contents/MacOS/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}")
- set(OPENCS_PLUGINS ${OPENCS_PLUGINS} "${INSTALLED_OPENCS_APP}/Contents/MacOS/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}")
+ set(PLUGINS ${PLUGINS} "${INSTALLED_OPENMW_APP}/Contents/PlugIns/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}")
+ set(OPENCS_PLUGINS ${OPENCS_PLUGINS} "${INSTALLED_OPENCS_APP}/Contents/PlugIns/${QT_COCOA_PLUGIN_GROUP}/${QT_COCOA_PLUGIN_NAME}")
install(CODE "
function(gp_item_default_embedded_path_override item default_embedded_path_var)
@@ -791,12 +800,11 @@ if (APPLE)
endif()
endfunction()
- cmake_policy(SET CMP0009 OLD)
fixup_bundle(\"${INSTALLED_OPENMW_APP}\" \"${PLUGINS}\" \"\")
fixup_bundle(\"${INSTALLED_OPENCS_APP}\" \"${OPENCS_PLUGINS}\" \"\")
" COMPONENT Runtime)
include(CPack)
-endif (APPLE)
+endif ()
# Doxygen Target -- simply run 'make doc' or 'make doc_pages'
# output directory for 'make doc' is "${OpenMW_BINARY_DIR}/docs/Doxygen"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a9cd6a690..b5a7423d2 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,16 +1,70 @@
-Description
-===========
+How to contribute to OpenMW
+=======================
-Your pull request description should include (if applicable):
+Not sure what to do with all your free time? Pick out a task from here:
+
+http://bugs.openmw.org/
+
+Currently, we are focused on completing the MW game experience and general polishing. Features out of this scope may be approved in some cases, but you should probably start a discussion first.
+
+Note:
+- Tasks set to 'openmw-future' are usually out of the current scope of the project and can't be started yet.
+- Bugs that are not 'Confirmed' should be confirmed first.
+- Larger Features should have a discussion before you start implementing.
+- In many cases, it's best to have a discussion about possible solutions before you jump into coding.
+
+Aside from coding, you can also help by triaging the issues list. Check for bugs that are 'Unconfirmed' and try to confirm them on your end, working out any details that may be necessary. Check for bugs that do not conform to [Bug reporting guidelines](https://wiki.openmw.org/index.php?title=Bug_Reporting_Guidelines) and improve them to do so!
+
+There are various [Tools](https://wiki.openmw.org/index.php?title=Tools) to facilitate testing/development.
+
+Pull Request Guidelines
+=======================
+
+Thought of a change? Great! To facilitate the review process, your pull request description should include the following (if applicable):
* A link back to the bug report or forum discussion that prompted the change
* Summary of the changes made
* Reasoning / motivation behind the change
* What testing you have carried out to verify the change
-Other notes
-===========
+Furthermore, we advise to:
* Separate your work into multiple pull requests whenever possible. As a rule of thumb, each feature and each bugfix should go into a separate PR, unless they are closely related or dependent upon each other. Small pull requests are easier to review, and are less likely to require further changes before we can merge them. A "mega" pull request with lots of unrelated commits in it is likely to get held up in review for a long time.
* Feel free to submit incomplete pull requests. Even if the work can not be merged yet, pull requests are a great place to collect early feedback. Just make sure to mark it as *[Incomplete]* or *[Do not merge yet]* in the title.
* If you plan on contributing often, please read the [Developer Reference](https://wiki.openmw.org/index.php?title=Developer_Reference) on our wiki, especially the [Policies and Standards](https://wiki.openmw.org/index.php?title=Policies_and_Standards).
+* Make sure each of your changes has a clear objective. Unnecessary changes may lead to merge conflicts, clutter the commit history and slow down review. Code formatting 'fixes' should be avoided, unless you were already changing that particular line anyway.
+
+Guidelines for original engine "fixes"
+=================================
+
+From time to time you may be tempted to "fix" what you think was a "bug" in the original game engine.
+
+Unfortunately, the definition of what is a "bug" is not so clear. Consider that your "bug" is actually a feature unless proven otherwise:
+
+* We have no way of knowing what the original developers really intended (short of asking them, good luck with that).
+* What may seem like an illogical mechanic can actually be part of an attempt to balance the game.
+* Many people will actually like these "bugs" because that is what they remember the game for.
+* Exploits may be part of the fun of an open-world game - they reward knowledge with power. There are too many of them to plug them all, anyway.
+
+OpenMW, in its default configuration, is meant to be a faithful reimplementation of Morrowind, minus things like crash bugs, stability issues and design errors. However, we try to avoid touching anything that affects the core gameplay, the balancing of the game or introduces incompatibilities with existing mod content.
+
+That said, we may sometimes evaluate such issues on an individual basis. Common exceptions to the above would be:
+
+* Issues so glaring that they would severely limit the capabilities of the engine in the future (for example, the scripting engine not being allowed to access objects in remote cells)
+* Bugs where the intent is very obvious, and that have little to no balancing impact (e.g. the bug were being tired made it easier to repair items, instead of harder)
+* Bugs that were fixed in an official patch for Morrowind
+
+Feature additions policy
+=====================
+
+We get it, you have waited so long for feature XYZ to be available in Morrowind and now that OpenMW is here you can not wait to implement your ingenious idea and share it with the world.
+
+Unfortunately, since maintaining features comes at a cost and our resources are limited, we have to be a little selective in what features we allow into the main repository. Generally:
+
+- Features should be as generic and non-redundant as possible.
+- Any feature that is also possible with modding should be done as a mod instead.
+- In the future, OpenMW plans to expand the scope of what is possible with modding, e.g. by moving certain game logic into editable scripts.
+- Currently, modders can edit OpenMW's GUI skins and layout XML files, although there are still a few missing hooks (e.g. scripting support) in order to make this into a powerful way of modding.
+- If a feature introduces new game UI strings, that reduces its chance of being accepted because we do not currently have any way of localizing these to the user's Morrowind installation language.
+
+If you are in doubt of your feature being within our scope, it is probably best to start a forum discussion first. See the [settings documentation](https://openmw.readthedocs.io/en/stable/reference/modding/settings/index.html) and [Features list](https://wiki.openmw.org/index.php?title=Features) for some examples of features that were deemed acceptable.
diff --git a/README.md b/README.md
index d38dfaeb2..aa6ae47b4 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ OpenMW is a recreation of the engine for the popular role-playing game Morrowind
OpenMW also comes with OpenMW-CS, a replacement for Morrowind's TES Construction Set.
-* Version: 0.41.0
+* Version: 0.42.0
* License: GPLv3 (see [docs/license/GPL3.txt](https://github.com/OpenMW/openmw/blob/master/docs/license/GPL3.txt) for more information)
* Website: http://www.openmw.org
* IRC: #openmw on irc.freenode.net
@@ -18,7 +18,7 @@ Font Licenses:
Current Status
--------------
-The main quests in Morrowind, Tribunal and Bloodmoon are all completable. Some issues with side quests are to be expected (but rare). Check the [bug tracker](https://bugs.openmw.org/versions/21) for a list of issues we need to resolve before the "1.0" release. Even before the "1.0" release however, OpenMW boasts some new [features](https://wiki.openmw.org/index.php?title=Features), such as improved graphics and user interfaces.
+The main quests in Morrowind, Tribunal and Bloodmoon are all completable. Some issues with side quests are to be expected (but rare). Check the [bug tracker](https://bugs.openmw.org/) for a list of issues we need to resolve before the "1.0" release. Even before the "1.0" release however, OpenMW boasts some new [features](https://wiki.openmw.org/index.php?title=Features), such as improved graphics and user interfaces.
Pre-existing modifications created for the original Morrowind engine can be hit-and-miss. The OpenMW script compiler performs more thorough error-checking than Morrowind does, meaning that a mod created for Morrowind may not necessarily run in OpenMW. Some mods also rely on quirky behaviour or engine bugs in order to work. We are considering such compatibility issues on a case-by-case basis - in some cases adding a workaround to OpenMW may be feasible, in other cases fixing the mod will be the only option. If you know of any mods that work or don't work, feel free to add them to the [Mod status](https://wiki.openmw.org/index.php?title=Mod_status) wiki page.
diff --git a/apps/bsatool/bsatool.cpp b/apps/bsatool/bsatool.cpp
index 7f305052b..54e946cbc 100644
--- a/apps/bsatool/bsatool.cpp
+++ b/apps/bsatool/bsatool.cpp
@@ -1,7 +1,6 @@
#include
#include
#include
-#include
#include
#include
diff --git a/apps/esmtool/labels.cpp b/apps/esmtool/labels.cpp
index 883a9e728..ea7b50129 100644
--- a/apps/esmtool/labels.cpp
+++ b/apps/esmtool/labels.cpp
@@ -11,7 +11,6 @@
#include
#include
#include
-#include
#include
diff --git a/apps/essimporter/importer.cpp b/apps/essimporter/importer.cpp
index c27e15a3e..d38069d89 100644
--- a/apps/essimporter/importer.cpp
+++ b/apps/essimporter/importer.cpp
@@ -2,7 +2,7 @@
#include
-#include
+#include
#include
#include
@@ -272,37 +272,37 @@ namespace ESSImport
const unsigned int recGAME = ESM::FourCC<'G','A','M','E'>::value;
const unsigned int recJOUR = ESM::FourCC<'J','O','U','R'>::value;
- std::map > converters;
- converters[ESM::REC_GLOB] = boost::shared_ptr(new ConvertGlobal());
- converters[ESM::REC_BOOK] = boost::shared_ptr(new ConvertBook());
- converters[ESM::REC_NPC_] = boost::shared_ptr(new ConvertNPC());
- converters[ESM::REC_CREA] = boost::shared_ptr(new ConvertCREA());
- converters[ESM::REC_NPCC] = boost::shared_ptr(new ConvertNPCC());
- converters[ESM::REC_CREC] = boost::shared_ptr(new ConvertCREC());
- converters[recREFR ] = boost::shared_ptr(new ConvertREFR());
- converters[recPCDT ] = boost::shared_ptr(new ConvertPCDT());
- converters[recFMAP ] = boost::shared_ptr(new ConvertFMAP());
- converters[recKLST ] = boost::shared_ptr(new ConvertKLST());
- converters[recSTLN ] = boost::shared_ptr(new ConvertSTLN());
- converters[recGAME ] = boost::shared_ptr(new ConvertGAME());
- converters[ESM::REC_CELL] = boost::shared_ptr(new ConvertCell());
- converters[ESM::REC_ALCH] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_CLAS] = boost::shared_ptr(new ConvertClass());
- converters[ESM::REC_SPEL] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_ARMO] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_WEAP] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_CLOT] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_ENCH] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_WEAP] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_LEVC] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_LEVI] = boost::shared_ptr(new DefaultConverter());
- converters[ESM::REC_CNTC] = boost::shared_ptr(new ConvertCNTC());
- converters[ESM::REC_FACT] = boost::shared_ptr(new ConvertFACT());
- converters[ESM::REC_INFO] = boost::shared_ptr(new ConvertINFO());
- converters[ESM::REC_DIAL] = boost::shared_ptr(new ConvertDIAL());
- converters[ESM::REC_QUES] = boost::shared_ptr(new ConvertQUES());
- converters[recJOUR ] = boost::shared_ptr(new ConvertJOUR());
- converters[ESM::REC_SCPT] = boost::shared_ptr(new ConvertSCPT());
+ std::map > converters;
+ converters[ESM::REC_GLOB] = std::shared_ptr(new ConvertGlobal());
+ converters[ESM::REC_BOOK] = std::shared_ptr(new ConvertBook());
+ converters[ESM::REC_NPC_] = std::shared_ptr(new ConvertNPC());
+ converters[ESM::REC_CREA] = std::shared_ptr(new ConvertCREA());
+ converters[ESM::REC_NPCC] = std::shared_ptr(new ConvertNPCC());
+ converters[ESM::REC_CREC] = std::shared_ptr(new ConvertCREC());
+ converters[recREFR ] = std::shared_ptr(new ConvertREFR());
+ converters[recPCDT ] = std::shared_ptr(new ConvertPCDT());
+ converters[recFMAP ] = std::shared_ptr(new ConvertFMAP());
+ converters[recKLST ] = std::shared_ptr(new ConvertKLST());
+ converters[recSTLN ] = std::shared_ptr(new ConvertSTLN());
+ converters[recGAME ] = std::shared_ptr(new ConvertGAME());
+ converters[ESM::REC_CELL] = std::shared_ptr(new ConvertCell());
+ converters[ESM::REC_ALCH] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_CLAS] = std::shared_ptr(new ConvertClass());
+ converters[ESM::REC_SPEL] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_ARMO] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_WEAP] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_CLOT] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_ENCH] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_WEAP] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_LEVC] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_LEVI] = std::shared_ptr(new DefaultConverter());
+ converters[ESM::REC_CNTC] = std::shared_ptr(new ConvertCNTC());
+ converters[ESM::REC_FACT] = std::shared_ptr(new ConvertFACT());
+ converters[ESM::REC_INFO] = std::shared_ptr(new ConvertINFO());
+ converters[ESM::REC_DIAL] = std::shared_ptr(new ConvertDIAL());
+ converters[ESM::REC_QUES] = std::shared_ptr(new ConvertQUES());
+ converters[recJOUR ] = std::shared_ptr(new ConvertJOUR());
+ converters[ESM::REC_SCPT] = std::shared_ptr(new ConvertSCPT());
// TODO:
// - REGN (weather in certain regions?)
@@ -312,7 +312,7 @@ namespace ESSImport
std::set unknownRecords;
- for (std::map >::const_iterator it = converters.begin();
+ for (std::map >::const_iterator it = converters.begin();
it != converters.end(); ++it)
{
it->second->setContext(context);
@@ -323,7 +323,7 @@ namespace ESSImport
ESM::NAME n = esm.getRecName();
esm.getRecHeader();
- std::map >::iterator it = converters.find(n.intval);
+ std::map >::iterator it = converters.find(n.intval);
if (it != converters.end())
{
it->second->read(esm);
@@ -386,7 +386,7 @@ namespace ESSImport
// Writing order should be Dynamic Store -> Cells -> Player,
// so that references to dynamic records can be recognized when loading
- for (std::map >::const_iterator it = converters.begin();
+ for (std::map >::const_iterator it = converters.begin();
it != converters.end(); ++it)
{
if (it->second->getStage() != 0)
@@ -399,7 +399,7 @@ namespace ESSImport
context.mPlayerBase.save(writer);
writer.endRecord(ESM::REC_NPC_);
- for (std::map >::const_iterator it = converters.begin();
+ for (std::map >::const_iterator it = converters.begin();
it != converters.end(); ++it)
{
if (it->second->getStage() != 1)
diff --git a/apps/essimporter/main.cpp b/apps/essimporter/main.cpp
index a4ad114ec..d593669c3 100644
--- a/apps/essimporter/main.cpp
+++ b/apps/essimporter/main.cpp
@@ -2,8 +2,6 @@
#include
#include
-#include
-#include
#include
diff --git a/apps/launcher/graphicspage.cpp b/apps/launcher/graphicspage.cpp
index 622db4da4..d3dbfa559 100644
--- a/apps/launcher/graphicspage.cpp
+++ b/apps/launcher/graphicspage.cpp
@@ -1,5 +1,6 @@
#include "graphicspage.hpp"
+#include
#include
#include
#include
@@ -12,14 +13,8 @@
#include
-#include
-
#include
-#include
-
-#include
-
QString getAspect(int x, int y)
{
int gcd = boost::math::gcd (x, y);
diff --git a/apps/launcher/maindialog.cpp b/apps/launcher/maindialog.cpp
index 94e186db8..31da90d2f 100644
--- a/apps/launcher/maindialog.cpp
+++ b/apps/launcher/maindialog.cpp
@@ -172,7 +172,10 @@ Launcher::FirstRunDialogResult Launcher::MainDialog::showFirstRunDialog()
}
}
- return setup() ? FirstRunDialogResultContinue : FirstRunDialogResultFailure;
+ if (!setup() || !setupGameData()) {
+ return FirstRunDialogResultFailure;
+ }
+ return FirstRunDialogResultContinue;
}
void Launcher::MainDialog::setVersionLabel()
@@ -344,6 +347,11 @@ bool Launcher::MainDialog::setupGameSettings()
file.close();
}
+ return true;
+}
+
+bool Launcher::MainDialog::setupGameData()
+{
QStringList dataDirs;
// Check if the paths actually contain data files
diff --git a/apps/launcher/maindialog.hpp b/apps/launcher/maindialog.hpp
index 96b5c0b97..8d0d61b8f 100644
--- a/apps/launcher/maindialog.hpp
+++ b/apps/launcher/maindialog.hpp
@@ -72,6 +72,7 @@ namespace Launcher
bool setupLauncherSettings();
bool setupGameSettings();
bool setupGraphicsSettings();
+ bool setupGameData();
void setVersionLabel();
diff --git a/apps/mwiniimporter/importer.cpp b/apps/mwiniimporter/importer.cpp
index fb3144814..24646b844 100644
--- a/apps/mwiniimporter/importer.cpp
+++ b/apps/mwiniimporter/importer.cpp
@@ -1,17 +1,12 @@
#include "importer.hpp"
-#include
#include
-#include
-#include