1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-24 08:41:37 +00:00

Merge branch 'master' into dialoguefix

This commit is contained in:
Bret Curtis 2019-03-29 15:07:45 +01:00 committed by GitHub
commit 2c57abc245
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
430 changed files with 10244 additions and 3451 deletions

View file

@ -9,6 +9,10 @@ env:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key # 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=" - secure: "jybGzAdUbqt9vWR/GEnRd96BgAi/7Zd1+2HK68j/i/8+/1YH2XxLOy4Jv/DUBhBlJIkxs/Xv8dRcUlFOclZDHX1d/9Qnsqd3oUVkD7k1y7cTOWy9TBQaE/v/kZo3LpzA3xPwwthrb0BvqIbOfIELi5fS5s8ba85WFRg3AX70wWE="
cache:
ccache: true
directories:
- ${HOME}/.ccache
addons: addons:
apt: apt:
sources: sources:
@ -17,7 +21,7 @@ addons:
- llvm-toolchain-xenial-7 - llvm-toolchain-xenial-7
packages: [ packages: [
# Dev # Dev
cmake, clang-7, clang-tools-7, gcc-8, g++-8, cmake, clang-7, clang-tools-7, gcc-8, g++-8, ccache,
# Boost # Boost
libboost-filesystem-dev, libboost-iostreams-dev, libboost-program-options-dev, libboost-system-dev, libboost-filesystem-dev, libboost-iostreams-dev, libboost-program-options-dev, libboost-system-dev,
# FFmpeg # FFmpeg

View file

@ -26,17 +26,21 @@ Programmers
Allofich Allofich
Andrei Kortunov (akortunov) Andrei Kortunov (akortunov)
AnyOldName3 AnyOldName3
Aussiemon Ardekantur
Austin Salgat (Salgat) Armin Preiml
Artem Kotsynyak (greye) Artem Kotsynyak (greye)
artemutin artemutin
Arthur Moore (EmperorArthur) Arthur Moore (EmperorArthur)
Assumeru Assumeru
athile athile
Aussiemon
Austin Salgat (Salgat)
Ben Shealy (bentsherman) Ben Shealy (bentsherman)
Berulacks
Bret Curtis (psi29a) Bret Curtis (psi29a)
Britt Mathis (galdor557) Britt Mathis (galdor557)
Capostrophic Capostrophic
Carl Maxwell
cc9cii cc9cii
Cédric Mocquillon Cédric Mocquillon
Chris Boyce (slothlife) Chris Boyce (slothlife)
@ -47,6 +51,7 @@ Programmers
DanielVukelich DanielVukelich
darkf darkf
David Cernat (davidcernat) David Cernat (davidcernat)
Declan Millar (declan-millar)
devnexen devnexen
Dieho Dieho
Dmitry Shkurskiy (endorph) Dmitry Shkurskiy (endorph)
@ -54,10 +59,11 @@ Programmers
Douglas Mencken (dougmencken) Douglas Mencken (dougmencken)
dreamer-dead dreamer-dead
David Teviotdale (dteviot) David Teviotdale (dteviot)
Diggory Hardy
Dmitry Marakasov (AMDmi3)
Edmondo Tommasina (edmondo) Edmondo Tommasina (edmondo)
Eduard Cot (trombonecot) Eduard Cot (trombonecot)
Eli2 Eli2
elsid
Emanuel Guével (potatoesmaster) Emanuel Guével (potatoesmaster)
eroen eroen
escondida escondida
@ -67,13 +73,19 @@ Programmers
Finbar Crago(finbar-crago) Finbar Crago(finbar-crago)
Florian Weber (Florianjw) Florian Weber (Florianjw)
Gašper Sedej Gašper Sedej
Gohan1989
gugus/gus gugus/gus
guidoj
Hallfaer Tuilinn Hallfaer Tuilinn
Haoda Wang (h313) Haoda Wang (h313)
hristoast hristoast
Internecine Internecine
Jacob Essex (Yacoby) Jackerty
Jacob Essex (Yacoby)
Jake Westrip (16bitint) Jake Westrip (16bitint)
James Carty (MrTopCat)
Jan-Peter Nilsson (peppe)
Jan Borsodi (am0s)
Jason Hooks (jhooks) Jason Hooks (jhooks)
jeaye jeaye
Jeffrey Haines (Jyby) Jeffrey Haines (Jyby)
@ -84,6 +96,7 @@ Programmers
John Blomberg (fstp) John Blomberg (fstp)
Jordan Ayers Jordan Ayers
Jordan Milne Jordan Milne
Josua Grawitter
Jules Blok (Armada651) Jules Blok (Armada651)
julianko julianko
Julien Voisin (jvoisin/ap0) Julien Voisin (jvoisin/ap0)
@ -95,9 +108,10 @@ Programmers
lazydev lazydev
Leon Krieg (lkrieg) Leon Krieg (lkrieg)
Leon Saunders (emoose) Leon Saunders (emoose)
Łukasz Gołębiewski (lukago)
logzero logzero
lohikaarme lohikaarme
Lordrea
Łukasz Gołębiewski (lukago)
Lukasz Gromanowski (lgro) Lukasz Gromanowski (lgro)
Manuel Edelmann (vorenon) Manuel Edelmann (vorenon)
Marc Bouvier (CramitDeFrog) Marc Bouvier (CramitDeFrog)
@ -112,6 +126,7 @@ Programmers
Michael Hogan (Xethik) Michael Hogan (Xethik)
Michael Mc Donnell Michael Mc Donnell
Michael Papageorgiou (werdanith) Michael Papageorgiou (werdanith)
Michał Ściubidło (mike-sc)
Michał Bień (Glorf) Michał Bień (Glorf)
Michał Moroz (dragonee) Michał Moroz (dragonee)
Miloslav Číž (drummyfish) Miloslav Číž (drummyfish)
@ -123,15 +138,20 @@ Programmers
Nathan Jeffords (blunted2night) Nathan Jeffords (blunted2night)
NeveHanter NeveHanter
Nialsy Nialsy
Nicolay Korslund
Nikolay Kasyanov (corristo) Nikolay Kasyanov (corristo)
nobrakal nobrakal
Nolan Poe (nopoe) Nolan Poe (nopoe)
Oleg Chkan (mrcheko) Oleg Chkan (mrcheko)
Paul Cercueil (pcercuei) Paul Cercueil (pcercuei)
Paul McElroy (Greendogo) Paul McElroy (Greendogo)
pchan3
Perry Hugh
Phillip Andrews (PhillipAnd)
Pi03k Pi03k
Pieter van der Kloet (pvdk) Pieter van der Kloet (pvdk)
pkubik pkubik
PLkolek
PlutonicOverkill PlutonicOverkill
Radu-Marius Popovici (rpopovici) Radu-Marius Popovici (rpopovici)
Rafael Moura (dhustkoder) Rafael Moura (dhustkoder)
@ -145,11 +165,12 @@ Programmers
Roman Proskuryakov (kpp) Roman Proskuryakov (kpp)
Roman Siromakha (elsid) Roman Siromakha (elsid)
Sandy Carter (bwrsandman) Sandy Carter (bwrsandman)
Scott Howard Scott Howard (maqifrnswa)
scrawl scrawl
Sebastian Wick (swick) Sebastian Wick (swick)
Sergey Fukanchik Sergey Fukanchik
Sergey Shambir Sergey Shambir (sergey-shambir)
sergoz
ShadowRadiance ShadowRadiance
Siimacore Siimacore
sir_herrbatka sir_herrbatka
@ -158,24 +179,33 @@ Programmers
spycrab spycrab
Stefan Galowicz (bogglez) Stefan Galowicz (bogglez)
Stanislav Bobrov (Jiub) Stanislav Bobrov (Jiub)
Stanislaw Halik (sthalik)
Star-Demon
stil-t stil-t
Stomy
svaante svaante
Sylvain Thesnieres (Garvek) Sylvain Thesnieres (Garvek)
t6 t6
terrorfisch terrorfisch
thegriglat thegriglat
Thomas Luppi (Digmaster) Thomas Luppi (Digmaster)
tlmullis
tri4ng1e tri4ng1e
unelsson Thoronador
Will Herrmann (Thunderforge)
Tom Mason (wheybags) Tom Mason (wheybags)
Torben Leif Carrington (TorbenC) Torben Leif Carrington (TorbenC)
unelsson
uramer
viadanna viadanna
Vincent Heuken Vincent Heuken
Vladimir Panteleev (CyberShadow)
Wang Ryu (bzzt)
Will Herrmann (Thunderforge)
vocollapse vocollapse
xyzz
Yohaulticetl Yohaulticetl
Yuri Krupenin
zelurker zelurker
James Carty (MrTopCat)
Documentation Documentation
------------- -------------
@ -184,11 +214,12 @@ Documentation
Alejandro Sanchez (HiPhish) Alejandro Sanchez (HiPhish)
Bodillium Bodillium
Bret Curtis (psi29a) Bret Curtis (psi29a)
David Walley (Loriel)
Cramal Cramal
David Walley (Loriel)
Diego Crespo
Joakim Berg (lysol90)
Ryan Tucker (Ravenwing) Ryan Tucker (Ravenwing)
sir_herrbatka sir_herrbatka
Diego Crespo
Packagers Packagers
--------- ---------
@ -207,13 +238,19 @@ Public Relations and Translations
Artem Kotsynyak (greye) - Russian News Writer Artem Kotsynyak (greye) - Russian News Writer
Dawid Lakomy (Vedyimyn) - Polish News Writer Dawid Lakomy (Vedyimyn) - Polish News Writer
ElderTroll - Release Manager
Jim Clauwaert (Zedd) - Public Outreach Jim Clauwaert (Zedd) - Public Outreach
juanmnzsk8 - Spanish News Writer
Julien Voisin (jvoisin/ap0) - French News Writer Julien Voisin (jvoisin/ap0) - French News Writer
Kingpix - Italian News Writer
Lukasz Gromanowski (lgro) - English News Writer Lukasz Gromanowski (lgro) - English News Writer
Martin Otto (Atahualpa) - Podcaster, Public Outreach, German Translator Martin Otto (Atahualpa) - Podcaster, Public Outreach, German Translator
Mickey Lyle (raevol) - Release Manager Mickey Lyle (raevol) - Release Manager
Nekochan - English News Writer
penguinroad - Indonesian News Writer
Pithorn - Chinese News Writer Pithorn - Chinese News Writer
sir_herrbatka - Polish News Writer sir_herrbatka - Polish News Writer
spyboot - German Translator
Tom Koenderink (Okulo) - English News Writer Tom Koenderink (Okulo) - English News Writer
Website Website
@ -243,34 +280,6 @@ Artwork
Mickey Lyle (raevol) - Wordpress Theme Mickey Lyle (raevol) - Wordpress Theme
Tom Koenderink (Okulo), SirHerrbatka, crysthala, Shnatsel, Lamoot - OpenMW Editor Icons Tom Koenderink (Okulo), SirHerrbatka, crysthala, Shnatsel, Lamoot - OpenMW Editor Icons
Inactive Contributors
---------------------
Ardekantur
Armin Preiml
Berulacks
Carl Maxwell
Diggory Hardy
Dmitry Marakasov (AMDmi3)
ElderTroll
guidoj
Jan-Peter Nilsson (peppe)
Jan Borsodi
Josua Grawitter
juanmnzsk8
Kingpix
Lordrea
Michal Sciubidlo
Nicolay Korslund
Nekochan
pchan3
penguinroad
sergoz
spyboot
Star-Demon
Thoronador
Yuri Krupenin
Additional Credits Additional Credits
------------------ ------------------
In this section we would like to thank people not part of OpenMW for their work. In this section we would like to thank people not part of OpenMW for their work.

View file

@ -1,11 +1,17 @@
0.46.0 0.46.0
------ ------
Bug #2969: Scripted items can stack
Bug #2987: Editor: some chance and AI data fields can overflow Bug #2987: Editor: some chance and AI data fields can overflow
Bug #3006: 'else if' operator breaks script compilation
Bug #3282: Unintended behaviour when assigning F3 and Windows keys
Bug #3623: Fix HiDPI on Windows Bug #3623: Fix HiDPI on Windows
Bug #3733: Normal maps are inverted on mirrored UVs Bug #3733: Normal maps are inverted on mirrored UVs
Bug #3765: DisableTeleporting makes Mark/Recall/Intervention effects undetectable
Bug #3778: [Mod] Improved Thrown Weapon Projectiles - weapons have wrong transformation during throw animation
Bug #4329: Removed birthsign abilities are restored after reloading the save Bug #4329: Removed birthsign abilities are restored after reloading the save
Bug #4383: Bow model obscures crosshair when arrow is drawn Bug #4383: Bow model obscures crosshair when arrow is drawn
Bug #4384: Resist Normal Weapons only checks ammunition for ranged weapons
Bug #4411: Reloading a saved game while falling prevents damage in some cases Bug #4411: Reloading a saved game while falling prevents damage in some cases
Bug #4540: Rain delay when exiting water Bug #4540: Rain delay when exiting water
Bug #4701: PrisonMarker record is not hardcoded like other markers Bug #4701: PrisonMarker record is not hardcoded like other markers
@ -14,28 +20,51 @@
Bug #4720: Inventory avatar has shield with two-handed weapon during [un]equipping animation Bug #4720: Inventory avatar has shield with two-handed weapon during [un]equipping animation
Bug #4723: ResetActors command works incorrectly Bug #4723: ResetActors command works incorrectly
Bug #4745: Editor: Interior cell lighting field values are not displayed as colors Bug #4745: Editor: Interior cell lighting field values are not displayed as colors
Bug #4736: LandTexture records overrides do not work
Bug #4746: Non-solid player can't run or sneak Bug #4746: Non-solid player can't run or sneak
Bug #4747: Bones are not read from X.NIF file for NPC animation
Bug #4750: Sneaking doesn't work in first person view if the player is in attack ready state Bug #4750: Sneaking doesn't work in first person view if the player is in attack ready state
Bug #4768: Fallback numerical value recovery chokes on invalid arguments Bug #4768: Fallback numerical value recovery chokes on invalid arguments
Bug #4775: Slowfall effect resets player jumping flag Bug #4775: Slowfall effect resets player jumping flag
Bug #4778: Interiors of Illusion puzzle in Sotha Sil Expanded mod is broken Bug #4778: Interiors of Illusion puzzle in Sotha Sil Expanded mod is broken
Bug #4797: Player sneaking and running stances are not accounted for when in air
Bug #4800: Standing collisions are not updated immediately when an object is teleported without a cell change Bug #4800: Standing collisions are not updated immediately when an object is teleported without a cell change
Bug #4803: Stray special characters before begin statement break script compilation Bug #4803: Stray special characters before begin statement break script compilation
Bug #4804: Particle system with the "Has Sizes = false" causes an exception Bug #4804: Particle system with the "Has Sizes = false" causes an exception
Bug #4810: Raki creature broken in OpenMW
Bug #4813: Creatures with known file but no "Sound Gen Creature" assigned use default sounds Bug #4813: Creatures with known file but no "Sound Gen Creature" assigned use default sounds
Bug #4815: "Finished" journal entry with lower index doesn't close journal, SetJournalIndex closes journal
Bug #4820: Spell absorption is broken Bug #4820: Spell absorption is broken
Bug #4823: Jail progress bar works incorrectly
Bug #4827: NiUVController is handled incorrectly Bug #4827: NiUVController is handled incorrectly
Bug #4828: Potion looping effects VFX are not shown for NPCs Bug #4828: Potion looping effects VFX are not shown for NPCs
Bug #4841: Russian localization ignores implicit keywords Bug #4837: CTD when a mesh with NiLODNode root node with particles is loaded
Bug #4841: Russian localization ignores implicit keywords
Bug #4860: Actors outside of processing range visible for one frame after spawning
Bug #4867: Arbitrary text after local variable declarations breaks script compilation
Bug #4876: AI ratings handling inconsistencies
Bug #4877: Startup script executes only on a new game start
Bug #4888: Global variable stray explicit reference calls break script compilation
Bug #4896: Title screen music doesn't loop
Bug #4911: Editor: QOpenGLContext::swapBuffers() warning with Qt5
Bug #4916: Specular power (shininess) material parameter is ignored when shaders are used.
Bug #4922: Werewolves can not attack if the transformation happens during attack
Feature #2229: Improve pathfinding AI Feature #2229: Improve pathfinding AI
Feature #3442: Default values for fallbacks from ini file Feature #3442: Default values for fallbacks from ini file
Feature #3610: Option to invert X axis Feature #3610: Option to invert X axis
Feature #3893: Implicit target for "set" function in console
Feature #3980: In-game option to disable controller
Feature #4209: Editor: Faction rank sub-table Feature #4209: Editor: Faction rank sub-table
Feature #4673: Weapon sheathing Feature #4673: Weapon sheathing
Feature #4675: Support for NiRollController
Feature #4730: Native animated containers support Feature #4730: Native animated containers support
Feature #4812: Support NiSwitchNode Feature #4812: Support NiSwitchNode
Feature #4836: Daytime node switch Feature #4836: Daytime node switch
Feature #4859: Make water reflections more configurable
Feature #4887: Add openmw command option to set initial random seed
Feature #4890: Make Distant Terrain configurable
Task #4686: Upgrade media decoder to a more current FFmpeg API Task #4686: Upgrade media decoder to a more current FFmpeg API
Task #4695: Optimize Distant Terrain memory consumption
0.45.0 0.45.0
------ ------

View file

@ -14,6 +14,10 @@ if [[ -z "${BUILD_OPENMW}" ]]; then export BUILD_OPENMW=ON; fi
if [[ -z "${BUILD_OPENMW_CS}" ]]; then export BUILD_OPENMW_CS=ON; fi if [[ -z "${BUILD_OPENMW_CS}" ]]; then export BUILD_OPENMW_CS=ON; fi
${ANALYZE} cmake \ ${ANALYZE} cmake \
-DCMAKE_C_COMPILER="${CC}" \
-DCMAKE_CXX_COMPILER="${CXX}" \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DBUILD_OPENMW=${BUILD_OPENMW} \ -DBUILD_OPENMW=${BUILD_OPENMW} \
-DBUILD_OPENCS=${BUILD_OPENMW_CS} \ -DBUILD_OPENCS=${BUILD_OPENMW_CS} \
-DBUILD_LAUNCHER=${BUILD_OPENMW_CS} \ -DBUILD_LAUNCHER=${BUILD_OPENMW_CS} \

View file

@ -82,7 +82,7 @@ while [ $# -gt 0 ]; do
t ) t )
TEST_FRAMEWORK=true ;; TEST_FRAMEWORK=true ;;
h ) h )
cat <<EOF cat <<EOF
Usage: $0 [-cdehkpuvV] Usage: $0 [-cdehkpuvV]
@ -99,8 +99,8 @@ Options:
Keep the old build directory, default is to delete it. Keep the old build directory, default is to delete it.
-p <Win32/Win64> -p <Win32/Win64>
Set the build platform, can also be set with environment variable PLATFORM. Set the build platform, can also be set with environment variable PLATFORM.
-t -t
Build unit tests / Google test Build unit tests / Google test
-u -u
Configure for unity builds. Configure for unity builds.
-v <2013/2015/2017> -v <2013/2015/2017>
@ -402,7 +402,7 @@ if [ -z $SKIP_DOWNLOAD ]; then
download "SDL 2.0.7" \ download "SDL 2.0.7" \
"https://www.libsdl.org/release/SDL2-devel-2.0.7-VC.zip" \ "https://www.libsdl.org/release/SDL2-devel-2.0.7-VC.zip" \
"SDL2-2.0.7.zip" "SDL2-2.0.7.zip"
# Google test and mock # Google test and mock
if [ ! -z $TEST_FRAMEWORK ]; then if [ ! -z $TEST_FRAMEWORK ]; then
echo "Google test 1.8.1..." echo "Google test 1.8.1..."
@ -446,7 +446,7 @@ echo
if [ -z $APPVEYOR ]; then if [ -z $APPVEYOR ]; then
printf "Boost 1.67.0... " printf "Boost 1.67.0... "
else else
if [ $MSVC_VER -eq 12.0 ]; then if [ "${MSVC_VER}" -eq 12.0 ]; then
printf "Boost 1.58.0 AppVeyor... " printf "Boost 1.58.0 AppVeyor... "
else else
printf "Boost 1.67.0 AppVeyor... " printf "Boost 1.67.0 AppVeyor... "
@ -608,9 +608,9 @@ printf "OSG 3.4.1-scrawl... "
SUFFIX="" SUFFIX=""
fi fi
add_runtime_dlls "$(pwd)/OSG/bin/"{OpenThreads,zlib,libpng*}${SUFFIX}.dll \ add_runtime_dlls "$(pwd)/OSG/bin/"{OpenThreads,zlib,libpng*}${SUFFIX}.dll \
"$(pwd)/OSG/bin/osg"{,Animation,DB,FX,GA,Particle,Text,Util,Viewer}${SUFFIX}.dll "$(pwd)/OSG/bin/osg"{,Animation,DB,FX,GA,Particle,Text,Util,Viewer,Shadow}${SUFFIX}.dll
add_osg_dlls "$(pwd)/OSG/bin/osgPlugins-3.4.1/osgdb_"{bmp,dds,jpeg,osg,png,tga}${SUFFIX}.dll add_osg_dlls "$(pwd)/OSG/bin/osgPlugins-3.4.1/osgdb_"{bmp,dds,freetype,jpeg,osg,png,tga}${SUFFIX}.dll
add_osg_dlls "$(pwd)/OSG/bin/osgPlugins-3.4.1/osgdb_serializers_osg"{,animation,fx,ga,particle,text,util,viewer}${SUFFIX}.dll add_osg_dlls "$(pwd)/OSG/bin/osgPlugins-3.4.1/osgdb_serializers_osg"{,animation,fx,ga,particle,text,util,viewer,shadow}${SUFFIX}.dll
echo Done. echo Done.
} }
cd $DEPS cd $DEPS
@ -692,33 +692,33 @@ echo
# Google Test and Google Mock # Google Test and Google Mock
if [ ! -z $TEST_FRAMEWORK ]; then if [ ! -z $TEST_FRAMEWORK ]; then
printf "Google test 1.8.1 ..." printf "Google test 1.8.1 ..."
cd googletest cd googletest
if [ ! -d build ]; then if [ ! -d build ]; then
mkdir build mkdir build
fi fi
cd build cd build
GOOGLE_INSTALL_ROOT="${DEPS_INSTALL}/GoogleTest" GOOGLE_INSTALL_ROOT="${DEPS_INSTALL}/GoogleTest"
if [ $CONFIGURATION == "Debug" ]; then if [ $CONFIGURATION == "Debug" ]; then
DEBUG_SUFFIX="d" DEBUG_SUFFIX="d"
else else
DEBUG_SUFFIX="" DEBUG_SUFFIX=""
fi fi
if [ ! -d $GOOGLE_INSTALL_ROOT ]; then if [ ! -d $GOOGLE_INSTALL_ROOT ]; then
cmake .. -DCMAKE_BUILD_TYPE="${CONFIGURATION}" -DCMAKE_INSTALL_PREFIX="${GOOGLE_INSTALL_ROOT}" -DCMAKE_USE_WIN32_THREADS_INIT=1 -G "${GENERATOR}" -DBUILD_SHARED_LIBS=1 cmake .. -DCMAKE_BUILD_TYPE="${CONFIGURATION}" -DCMAKE_INSTALL_PREFIX="${GOOGLE_INSTALL_ROOT}" -DCMAKE_USE_WIN32_THREADS_INIT=1 -G "${GENERATOR}" -DBUILD_SHARED_LIBS=1
cmake --build . --config "${CONFIGURATION}" cmake --build . --config "${CONFIGURATION}"
cmake --build . --target install --config "${CONFIGURATION}" cmake --build . --target install --config "${CONFIGURATION}"
add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gtest_main${DEBUG_SUFFIX}.dll" add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gtest_main${DEBUG_SUFFIX}.dll"
add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gtest${DEBUG_SUFFIX}.dll" add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gtest${DEBUG_SUFFIX}.dll"
add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gmock_main${DEBUG_SUFFIX}.dll" add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gmock_main${DEBUG_SUFFIX}.dll"
add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gmock${DEBUG_SUFFIX}.dll" add_runtime_dlls "${GOOGLE_INSTALL_ROOT}\bin\gmock${DEBUG_SUFFIX}.dll"
fi fi
add_cmake_opts -DBUILD_UNITTESTS=yes add_cmake_opts -DBUILD_UNITTESTS=yes
# FindGTest and FindGMock do not work perfectly on Windows # FindGTest and FindGMock do not work perfectly on Windows
# but we can help them by telling them everything we know about installation # but we can help them by telling them everything we know about installation
@ -730,7 +730,7 @@ if [ ! -z $TEST_FRAMEWORK ]; then
add_cmake_opts -DGMOCK_MAIN_LIBRARY="$GOOGLE_INSTALL_ROOT/lib/gmock_main${DEBUG_SUFFIX}.lib" add_cmake_opts -DGMOCK_MAIN_LIBRARY="$GOOGLE_INSTALL_ROOT/lib/gmock_main${DEBUG_SUFFIX}.lib"
add_cmake_opts -DGTEST_LINKED_AS_SHARED_LIBRARY=True add_cmake_opts -DGTEST_LINKED_AS_SHARED_LIBRARY=True
echo Done. echo Done.
fi fi
echo echo

View file

@ -256,12 +256,13 @@ if(NOT HAVE_STDINT_H)
endif() endif()
find_package(OpenSceneGraph 3.3.4 REQUIRED osgDB osgViewer osgText osgGA osgParticle osgUtil osgFX) find_package(OpenSceneGraph 3.3.4 REQUIRED osgDB osgViewer osgText osgGA osgParticle osgUtil osgFX osgShadow)
include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}) include_directories(SYSTEM ${OPENSCENEGRAPH_INCLUDE_DIRS})
set(USED_OSG_PLUGINS set(USED_OSG_PLUGINS
osgdb_bmp osgdb_bmp
osgdb_dds osgdb_dds
osgdb_freetype
osgdb_jpeg osgdb_jpeg
osgdb_osg osgdb_osg
osgdb_png osgdb_png
@ -795,8 +796,8 @@ endif()
# Apple bundling # Apple bundling
if (OPENMW_OSX_DEPLOYMENT AND APPLE AND DESIRED_QT_VERSION MATCHES 5) if (OPENMW_OSX_DEPLOYMENT AND APPLE AND DESIRED_QT_VERSION MATCHES 5)
if (${CMAKE_MAJOR_VERSION} STREQUAL "3" AND ${CMAKE_MINOR_VERSION} STREQUAL "13") if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.13 AND CMAKE_VERSION VERSION_LESS 3.13.4)
message(FATAL_ERROR "macOS packaging is broken in CMake 3.13.*, see https://gitlab.com/OpenMW/openmw/issues/4767. Please use an older version like 3.12.4") message(FATAL_ERROR "macOS packaging is broken in early CMake 3.13 releases, see https://gitlab.com/OpenMW/openmw/issues/4767. Please use at least 3.13.4 or an older version like 3.12.4")
endif () endif ()
get_property(QT_COCOA_PLUGIN_PATH TARGET Qt5::QCocoaIntegrationPlugin PROPERTY LOCATION_RELEASE) get_property(QT_COCOA_PLUGIN_PATH TARGET Qt5::QCocoaIntegrationPlugin PROPERTY LOCATION_RELEASE)

View file

@ -105,3 +105,4 @@ Command line options
--export-fonts [=arg(=1)] (=0) Export Morrowind .fnt fonts to PNG --export-fonts [=arg(=1)] (=0) Export Morrowind .fnt fonts to PNG
image and XML file in current directory image and XML file in current directory
--activate-dist arg (=-1) activation distance override --activate-dist arg (=-1) activation distance override
--random-seed arg (=<impl defined>) seed value for random number generator

View file

@ -660,7 +660,7 @@ void Record<ESM::Creature>::print()
printTransport(mData.getTransport()); printTransport(mData.getTransport());
std::cout << " Artifical Intelligence: " << mData.mHasAI << std::endl; std::cout << " Artificial Intelligence: " << std::endl;
std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl; std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl;
std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl; std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl;
std::cout << " AI Flee:" << (int)mData.mAiData.mFlee << std::endl; std::cout << " AI Flee:" << (int)mData.mAiData.mFlee << std::endl;
@ -668,7 +668,6 @@ void Record<ESM::Creature>::print()
std::cout << " AI U1:" << (int)mData.mAiData.mU1 << std::endl; std::cout << " AI U1:" << (int)mData.mAiData.mU1 << std::endl;
std::cout << " AI U2:" << (int)mData.mAiData.mU2 << std::endl; std::cout << " AI U2:" << (int)mData.mAiData.mU2 << std::endl;
std::cout << " AI U3:" << (int)mData.mAiData.mU3 << std::endl; std::cout << " AI U3:" << (int)mData.mAiData.mU3 << std::endl;
std::cout << " AI U4:" << (int)mData.mAiData.mU4 << std::endl;
std::cout << " AI Services:" << boost::format("0x%08X") % mData.mAiData.mServices << std::endl; std::cout << " AI Services:" << boost::format("0x%08X") % mData.mAiData.mServices << std::endl;
for (const ESM::AIPackage &package : mData.mAiPackage.mList) for (const ESM::AIPackage &package : mData.mAiPackage.mList)
@ -740,7 +739,7 @@ void Record<ESM::Faction>::print()
std::cout << " Faction Reaction: " std::cout << " Faction Reaction: "
<< mData.mData.mRankData[i].mFactReaction << std::endl; << mData.mData.mRankData[i].mFactReaction << std::endl;
} }
for (const std::pair<std::string, int> &reaction : mData.mReactions) for (const auto &reaction : mData.mReactions)
std::cout << " Reaction: " << reaction.second << " = " << reaction.first << std::endl; std::cout << " Reaction: " << reaction.second << " = " << reaction.first << std::endl;
std::cout << " Deleted: " << mIsDeleted << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl;
} }
@ -1079,7 +1078,7 @@ void Record<ESM::NPC>::print()
printTransport(mData.getTransport()); printTransport(mData.getTransport());
std::cout << " Artifical Intelligence: " << mData.mHasAI << std::endl; std::cout << " Artificial Intelligence: " << std::endl;
std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl; std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl;
std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl; std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl;
std::cout << " AI Flee:" << (int)mData.mAiData.mFlee << std::endl; std::cout << " AI Flee:" << (int)mData.mAiData.mFlee << std::endl;
@ -1087,7 +1086,6 @@ void Record<ESM::NPC>::print()
std::cout << " AI U1:" << (int)mData.mAiData.mU1 << std::endl; std::cout << " AI U1:" << (int)mData.mAiData.mU1 << std::endl;
std::cout << " AI U2:" << (int)mData.mAiData.mU2 << std::endl; std::cout << " AI U2:" << (int)mData.mAiData.mU2 << std::endl;
std::cout << " AI U3:" << (int)mData.mAiData.mU3 << std::endl; std::cout << " AI U3:" << (int)mData.mAiData.mU3 << std::endl;
std::cout << " AI U4:" << (int)mData.mAiData.mU4 << std::endl;
std::cout << " AI Services:" << boost::format("0x%08X") % mData.mAiData.mServices << std::endl; std::cout << " AI Services:" << boost::format("0x%08X") % mData.mAiData.mServices << std::endl;
for (const ESM::AIPackage &package : mData.mAiPackage.mList) for (const ESM::AIPackage &package : mData.mAiPackage.mList)

View file

@ -84,6 +84,8 @@ namespace ESSImport
mGlobalMapState.mBounds.mMaxX = 0; mGlobalMapState.mBounds.mMaxX = 0;
mGlobalMapState.mBounds.mMinY = 0; mGlobalMapState.mBounds.mMinY = 0;
mGlobalMapState.mBounds.mMaxY = 0; mGlobalMapState.mBounds.mMaxY = 0;
mPlayerBase.blank();
} }
int generateActorId() int generateActorId()

View file

@ -80,6 +80,7 @@ bool Launcher::AdvancedPage::loadSettings()
int unarmedFactorsStrengthIndex = mEngineSettings.getInt("strength influences hand to hand", "Game"); int unarmedFactorsStrengthIndex = mEngineSettings.getInt("strength influences hand to hand", "Game");
if (unarmedFactorsStrengthIndex >= 0 && unarmedFactorsStrengthIndex <= 2) if (unarmedFactorsStrengthIndex >= 0 && unarmedFactorsStrengthIndex <= 2)
unarmedFactorsStrengthComboBox->setCurrentIndex(unarmedFactorsStrengthIndex); unarmedFactorsStrengthComboBox->setCurrentIndex(unarmedFactorsStrengthIndex);
loadSettingBool(requireAppropriateAmmunitionCheckBox, "only appropriate ammunition bypasses resistance", "Game");
// Input Settings // Input Settings
loadSettingBool(allowThirdPersonZoomCheckBox, "allow third person zoom", "Input"); loadSettingBool(allowThirdPersonZoomCheckBox, "allow third person zoom", "Input");
@ -139,6 +140,7 @@ void Launcher::AdvancedPage::saveSettings()
int unarmedFactorsStrengthIndex = unarmedFactorsStrengthComboBox->currentIndex(); int unarmedFactorsStrengthIndex = unarmedFactorsStrengthComboBox->currentIndex();
if (unarmedFactorsStrengthIndex != mEngineSettings.getInt("strength influences hand to hand", "Game")) if (unarmedFactorsStrengthIndex != mEngineSettings.getInt("strength influences hand to hand", "Game"))
mEngineSettings.setInt("strength influences hand to hand", "Game", unarmedFactorsStrengthIndex); mEngineSettings.setInt("strength influences hand to hand", "Game", unarmedFactorsStrengthIndex);
saveSettingBool(requireAppropriateAmmunitionCheckBox, "only appropriate ammunition bypasses resistance", "Game");
// Input Settings // Input Settings
saveSettingBool(allowThirdPersonZoomCheckBox, "allow third person zoom", "Input"); saveSettingBool(allowThirdPersonZoomCheckBox, "allow third person zoom", "Input");

View file

@ -1,6 +1,5 @@
#include "graphicspage.hpp" #include "graphicspage.hpp"
#include <boost/math/common_factor.hpp>
#include <csignal> #include <csignal>
#include <QDesktopWidget> #include <QDesktopWidget>
#include <QMessageBox> #include <QMessageBox>
@ -15,10 +14,11 @@
#include <SDL_video.h> #include <SDL_video.h>
#include <components/files/configurationmanager.hpp> #include <components/files/configurationmanager.hpp>
#include <components/misc/gcd.hpp>
QString getAspect(int x, int y) QString getAspect(int x, int y)
{ {
int gcd = boost::math::gcd (x, y); int gcd = Misc::gcd (x, y);
int xaspect = x / gcd; int xaspect = x / gcd;
int yaspect = y / gcd; int yaspect = y / gcd;
// special case: 8 : 5 is usually referred to as 16:10 // special case: 8 : 5 is usually referred to as 16:10

View file

@ -102,6 +102,17 @@ bool parseOptions (int argc, char** argv, std::vector<std::string>& files)
bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv). bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv).
options(desc).positional(p).run(); options(desc).positional(p).run();
bpo::store(valid_opts, variables); bpo::store(valid_opts, variables);
bpo::notify(variables);
if (variables.count ("help"))
{
std::cout << desc << std::endl;
return false;
}
if (variables.count("input-file"))
{
files = variables["input-file"].as< std::vector<std::string> >();
return true;
}
} }
catch(std::exception &e) catch(std::exception &e)
{ {
@ -110,18 +121,6 @@ bool parseOptions (int argc, char** argv, std::vector<std::string>& files)
return false; return false;
} }
bpo::notify(variables);
if (variables.count ("help"))
{
std::cout << desc << std::endl;
return false;
}
if (variables.count("input-file"))
{
files = variables["input-file"].as< std::vector<std::string> >();
return true;
}
std::cout << "No input files or directories specified!" << std::endl; std::cout << "No input files or directories specified!" << std::endl;
std::cout << desc << std::endl; std::cout << desc << std::endl;
return false; return false;

View file

@ -364,6 +364,11 @@ int CSMDoc::Document::getState() const
return state; return state;
} }
const boost::filesystem::path& CSMDoc::Document::getResourceDir() const
{
return mResDir;
}
const boost::filesystem::path& CSMDoc::Document::getSavePath() const const boost::filesystem::path& CSMDoc::Document::getSavePath() const
{ {
return mSavePath; return mSavePath;

View file

@ -115,6 +115,8 @@ namespace CSMDoc
int getState() const; int getState() const;
const boost::filesystem::path& getResourceDir() const;
const boost::filesystem::path& getSavePath() const; const boost::filesystem::path& getSavePath() const;
const boost::filesystem::path& getProjectPath() const; const boost::filesystem::path& getProjectPath() const;

View file

@ -195,7 +195,7 @@ namespace CSMPrefs
// Only activate the best match; in exact conflicts, this will favor the first shortcut added. // Only activate the best match; in exact conflicts, this will favor the first shortcut added.
if (!potentials.empty()) if (!potentials.empty())
{ {
std::sort(potentials.begin(), potentials.end(), ShortcutEventHandler::sort); std::stable_sort(potentials.begin(), potentials.end(), ShortcutEventHandler::sort);
Shortcut* shortcut = potentials.front().second; Shortcut* shortcut = potentials.front().second;
if (shortcut->getModifierStatus() && shortcut->getSecondaryMode() == Shortcut::SM_Replace) if (shortcut->getModifierStatus() && shortcut->getSecondaryMode() == Shortcut::SM_Replace)
@ -325,7 +325,7 @@ namespace CSMPrefs
if (left.first == Matches_WithMod && right.first == Matches_NoMod) if (left.first == Matches_WithMod && right.first == Matches_NoMod)
return true; return true;
else else
return left.second->getPosition() >= right.second->getPosition(); return left.second->getPosition() > right.second->getPosition();
} }
void ShortcutEventHandler::widgetDestroyed() void ShortcutEventHandler::widgetDestroyed()

View file

@ -30,11 +30,11 @@ void CSMTools::ScriptCheckStage::report (const std::string& message, const Compi
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId); CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
stream << "line " << loc.mLine << ", column " << loc.mColumn << ": " << message << " (" << loc.mLiteral << ")"; stream << message << " (" << loc.mLiteral << ")" << " @ line " << loc.mLine+1 << ", column " << loc.mColumn;
std::ostringstream hintStream; std::ostringstream hintStream;
hintStream << "l:" << loc.mLine << " " << loc.mColumn; hintStream << "l:" << loc.mLine+1 << " " << loc.mColumn;
mMessages->add (id, stream.str(), hintStream.str(), getSeverity (type)); mMessages->add (id, stream.str(), hintStream.str(), getSeverity (type));
} }

View file

@ -87,6 +87,7 @@ namespace CSMWorld
//CONCRETE TYPES ENDS HERE //CONCRETE TYPES ENDS HERE
Display_UnsignedInteger8, Display_UnsignedInteger8,
Display_UnsignedInteger16,
Display_Integer, Display_Integer,
Display_Float, Display_Float,
Display_Double, Display_Double,

View file

@ -1006,7 +1006,7 @@ void CSMWorld::Data::loadFallbackEntries()
std::make_pair("PrisonMarker", "marker_prison.nif") std::make_pair("PrisonMarker", "marker_prison.nif")
}; };
for (const std::pair<std::string, std::string> &marker : staticMarkers) for (const auto &marker : staticMarkers)
{ {
if (mReferenceables.searchId (marker.first)==-1) if (mReferenceables.searchId (marker.first)==-1)
{ {
@ -1020,7 +1020,7 @@ void CSMWorld::Data::loadFallbackEntries()
} }
} }
for (const std::pair<std::string, std::string> &marker : doorMarkers) for (const auto &marker : doorMarkers)
{ {
if (mReferenceables.searchId (marker.first)==-1) if (mReferenceables.searchId (marker.first)==-1)
{ {

View file

@ -627,12 +627,12 @@ namespace CSMWorld
RecordT record2 = record.get(); RecordT record2 = record.get();
if (column==mActors.mHello) if (column==mActors.mHello)
record2.mAiData.mHello = value.toInt(); record2.mAiData.mHello = value.toInt();
else if (column==mActors.mFlee) else if (column==mActors.mFlee) // Flee, Fight and Alarm ratings are probabilities.
record2.mAiData.mFlee = value.toInt(); record2.mAiData.mFlee = std::min(100, value.toInt());
else if (column==mActors.mFight) else if (column==mActors.mFight)
record2.mAiData.mFight = value.toInt(); record2.mAiData.mFight = std::min(100, value.toInt());
else if (column==mActors.mAlarm) else if (column==mActors.mAlarm)
record2.mAiData.mAlarm = value.toInt(); record2.mAiData.mAlarm = std::min(100, value.toInt());
else else
{ {
typename std::map<const RefIdColumn *, unsigned int>::const_iterator iter = typename std::map<const RefIdColumn *, unsigned int>::const_iterator iter =

View file

@ -128,7 +128,7 @@ CSMWorld::RefIdCollection::RefIdCollection()
ActorColumns actorsColumns (nameColumns); ActorColumns actorsColumns (nameColumns);
mColumns.push_back (RefIdColumn (Columns::ColumnId_AiHello, ColumnBase::Display_UnsignedInteger8)); mColumns.push_back (RefIdColumn (Columns::ColumnId_AiHello, ColumnBase::Display_UnsignedInteger16));
actorsColumns.mHello = &mColumns.back(); actorsColumns.mHello = &mColumns.back();
mColumns.push_back (RefIdColumn (Columns::ColumnId_AiFlee, ColumnBase::Display_UnsignedInteger8)); mColumns.push_back (RefIdColumn (Columns::ColumnId_AiFlee, ColumnBase::Display_UnsignedInteger8));
actorsColumns.mFlee = &mColumns.back(); actorsColumns.mFlee = &mColumns.back();

View file

@ -1,7 +1,8 @@
#include "adjusterwidget.hpp" #include "adjusterwidget.hpp"
#include <components/misc/stringops.hpp>
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <boost/algorithm/string/case_conv.hpp>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
@ -70,8 +71,7 @@ void CSVDoc::AdjusterWidget::setName (const QString& name, bool addon)
{ {
boost::filesystem::path path (name.toUtf8().data()); boost::filesystem::path path (name.toUtf8().data());
std::string extension = path.extension().string(); std::string extension = Misc::StringUtils::lowerCase(path.extension().string());
boost::algorithm::to_lower(extension);
bool isLegacyPath = (extension == ".esm" || bool isLegacyPath = (extension == ".esm" ||
extension == ".esp"); extension == ".esp");

View file

@ -5,6 +5,7 @@
#include <QCloseEvent> #include <QCloseEvent>
#include <QMenuBar> #include <QMenuBar>
#include <QMessageBox>
#include <QMdiArea> #include <QMdiArea>
#include <QDockWidget> #include <QDockWidget>
#include <QApplication> #include <QApplication>
@ -25,6 +26,8 @@
#include "../tools/subviews.hpp" #include "../tools/subviews.hpp"
#include <components/version/version.hpp>
#include "viewmanager.hpp" #include "viewmanager.hpp"
#include "operations.hpp" #include "operations.hpp"
#include "subview.hpp" #include "subview.hpp"
@ -303,6 +306,17 @@ void CSVDoc::View::setupDebugMenu()
connect (runLog, SIGNAL (triggered()), this, SLOT (addRunLogSubView())); connect (runLog, SIGNAL (triggered()), this, SLOT (addRunLogSubView()));
} }
void CSVDoc::View::setupHelpMenu()
{
QMenu *help = menuBar()->addMenu (tr ("Help"));
QAction* about = createMenuEntry("About OpenMW-CS", ":./info.png", help, "document-help-about");
connect (about, SIGNAL (triggered()), this, SLOT (infoAbout()));
QAction* aboutQt = createMenuEntry("About Qt", ":./qt.png", help, "document-help-qt");
connect (aboutQt, SIGNAL (triggered()), this, SLOT (infoAboutQt()));
}
QAction* CSVDoc::View::createMenuEntry(CSMWorld::UniversalId::Type type, QMenu* menu, const char* shortcutName) QAction* CSVDoc::View::createMenuEntry(CSMWorld::UniversalId::Type type, QMenu* menu, const char* shortcutName)
{ {
const std::string title = CSMWorld::UniversalId (type).getTypeName(); const std::string title = CSMWorld::UniversalId (type).getTypeName();
@ -339,6 +353,7 @@ void CSVDoc::View::setupUi()
setupCharacterMenu(); setupCharacterMenu();
setupAssetsMenu(); setupAssetsMenu();
setupDebugMenu(); setupDebugMenu();
setupHelpMenu();
} }
void CSVDoc::View::setupShortcut(const char* name, QAction* action) void CSVDoc::View::setupShortcut(const char* name, QAction* action)
@ -674,6 +689,52 @@ void CSVDoc::View::save()
mDocument->save(); mDocument->save();
} }
void CSVDoc::View::infoAbout()
{
// Get current OpenMW version
QString versionInfo = (Version::getOpenmwVersionDescription(mDocument->getResourceDir().string())+
#if defined(__x86_64__) || defined(_M_X64)
" (64-bit)").c_str();
#else
" (32-bit)").c_str();
#endif
// Get current year
time_t now = time(NULL);
struct tm tstruct;
char copyrightInfo[40];
tstruct = *localtime(&now);
strftime(copyrightInfo, sizeof(copyrightInfo), "Copyright © 2008-%Y OpenMW Team", &tstruct);
QString aboutText = QString(
"<p style=\"white-space: pre-wrap;\">"
"<b><h2>OpenMW Construction Set</h2></b>"
"%1\n\n"
"%2\n\n"
"%3\n\n"
"<table>"
"<tr><td>%4</td><td><a href=\"https://openmw.org\">https://openmw.org</a></td></tr>"
"<tr><td>%5</td><td><a href=\"https://forum.openmw.org\">https://forum.openmw.org</a></td></tr>"
"<tr><td>%6</td><td><a href=\"https://gitlab.com/OpenMW/openmw/issues\">https://gitlab.com/OpenMW/openmw/issues</a></td></tr>"
"<tr><td>%7</td><td><a href=\"https://webchat.freenode.net/?channels=openmw&uio=OT10cnVlde\">irc://irc.freenode.net/#openmw</a></td></tr>"
"</table>"
"</p>")
.arg(versionInfo
, tr("OpenMW-CS is a content file editor for OpenMW, a modern, free and open source game engine.")
, tr(copyrightInfo)
, tr("Home Page:")
, tr("Forum:")
, tr("Bug Tracker:")
, tr("IRC:"));
QMessageBox::about(this, "About OpenMW-CS", aboutText);
}
void CSVDoc::View::infoAboutQt()
{
QMessageBox::aboutQt(this);
}
void CSVDoc::View::verify() void CSVDoc::View::verify()
{ {
addSubView (mDocument->verify()); addSubView (mDocument->verify());

View file

@ -85,6 +85,8 @@ namespace CSVDoc
void setupDebugMenu(); void setupDebugMenu();
void setupHelpMenu();
void setupUi(); void setupUi();
void setupShortcut(const char* name, QAction* action); void setupShortcut(const char* name, QAction* action);
@ -165,6 +167,10 @@ namespace CSVDoc
void exit(); void exit();
void infoAbout();
void infoAboutQt();
void verify(); void verify();
void addGlobalsSubView(); void addGlobalsSubView();

View file

@ -2,6 +2,7 @@
#include <memory> #include <memory>
#include <sstream> #include <sstream>
#include <string>
#include <QMouseEvent> #include <QMouseEvent>
#include <QApplication> #include <QApplication>
@ -615,7 +616,39 @@ void CSVRender::PagedWorldspaceWidget::useViewHint (const std::string& hint)
} }
else if (hint[0]=='r') else if (hint[0]=='r')
{ {
/// \todo implement 'r' type hints // syntax r:ref#number (e.g. r:ref#100)
char ignore;
std::istringstream stream (hint.c_str());
if (stream >> ignore) // ignore r
{
char ignore1; // : or ;
std::string refCode; // ref#number (e.g. ref#100)
while (stream >> ignore1 >> refCode) {}
//Find out cell coordinate
CSMWorld::IdTable& references = dynamic_cast<CSMWorld::IdTable&> (
*mDocument.getData().getTableModel (CSMWorld::UniversalId::Type_References));
int cellColumn = references.findColumnIndex(CSMWorld::Columns::ColumnId_Cell);
QVariant cell = references.data(references.getModelIndex(refCode, cellColumn)).value<QVariant>();
QString cellqs = cell.toString();
std::istringstream streamCellCoord (cellqs.toStdString().c_str());
if (streamCellCoord >> ignore) //ignore #
{
// Current coordinate
int x, y;
// Loop through all the coordinates to add them to selection
while (streamCellCoord >> x >> y)
selection.add (CSMWorld::CellCoordinates (x, y));
// Mark that camera needs setup
mCamPositionSet=false;
}
}
} }
setCellSelection (selection); setCellSelection (selection);

View file

@ -18,10 +18,10 @@ namespace CSVRender
private: private:
const CSMWorld::Data& mData; const CSMWorld::Data& mData;
virtual osg::ref_ptr<const ESMTerrain::LandObject> getLand (int cellX, int cellY); virtual osg::ref_ptr<const ESMTerrain::LandObject> getLand (int cellX, int cellY) override;
virtual const ESM::LandTexture* getLandTexture(int index, short plugin); virtual const ESM::LandTexture* getLandTexture(int index, short plugin) override;
virtual void getBounds(float& minX, float& maxX, float& minY, float& maxY); virtual void getBounds(float& minX, float& maxX, float& minY, float& maxY) override;
}; };
} }

View file

@ -141,13 +141,16 @@ void CSVWorld::Table::contextMenuEvent (QContextMenuEvent *event)
if (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Preview) if (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Preview)
{ {
const CSMWorld::UniversalId id = getUniversalId(currentRow);
const CSMWorld::UniversalId::Type type = id.getType();
QModelIndex index = mModel->index (row, QModelIndex index = mModel->index (row,
mModel->findColumnIndex (CSMWorld::Columns::ColumnId_Modification)); mModel->findColumnIndex (CSMWorld::Columns::ColumnId_Modification));
CSMWorld::RecordBase::State state = static_cast<CSMWorld::RecordBase::State> ( CSMWorld::RecordBase::State state = static_cast<CSMWorld::RecordBase::State> (
mModel->data (index).toInt()); mModel->data (index).toInt());
if (state!=CSMWorld::RecordBase::State_Deleted) if (state!=CSMWorld::RecordBase::State_Deleted && type != CSMWorld::UniversalId::Type_ItemLevelledList)
menu.addAction (mPreviewAction); menu.addAction (mPreviewAction);
} }
} }

View file

@ -219,6 +219,13 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
return sb; return sb;
} }
case CSMWorld::ColumnBase::Display_UnsignedInteger16:
{
DialogueSpinBox *sb = new DialogueSpinBox(parent);
sb->setRange(0, std::numeric_limits<unsigned short>::max());
return sb;
}
case CSMWorld::ColumnBase::Display_Var: case CSMWorld::ColumnBase::Display_Var:
return new QLineEdit(parent); return new QLineEdit(parent);

View file

@ -126,6 +126,7 @@ target_link_libraries(openmw
${OSGDB_LIBRARIES} ${OSGDB_LIBRARIES}
${OSGVIEWER_LIBRARIES} ${OSGVIEWER_LIBRARIES}
${OSGGA_LIBRARIES} ${OSGGA_LIBRARIES}
${OSGSHADOW_LIBRARIES}
${Boost_SYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY}
${Boost_THREAD_LIBRARY} ${Boost_THREAD_LIBRARY}
${Boost_FILESYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}

View file

@ -32,12 +32,13 @@
#include <components/version/version.hpp> #include <components/version/version.hpp>
#include <components/detournavigator/navigator.hpp>
#include "mwinput/inputmanagerimp.hpp" #include "mwinput/inputmanagerimp.hpp"
#include "mwgui/windowmanagerimp.hpp" #include "mwgui/windowmanagerimp.hpp"
#include "mwscript/scriptmanagerimp.hpp" #include "mwscript/scriptmanagerimp.hpp"
#include "mwscript/extensions.hpp"
#include "mwscript/interpretercontext.hpp" #include "mwscript/interpretercontext.hpp"
#include "mwsound/soundmanagerimp.hpp" #include "mwsound/soundmanagerimp.hpp"
@ -199,6 +200,8 @@ bool OMW::Engine::frame(float frametime)
stats->setAttribute(frameNumber, "WorkQueue", mWorkQueue->getNumItems()); stats->setAttribute(frameNumber, "WorkQueue", mWorkQueue->getNumItems());
stats->setAttribute(frameNumber, "WorkThread", mWorkQueue->getNumActiveThreads()); stats->setAttribute(frameNumber, "WorkThread", mWorkQueue->getNumActiveThreads());
mEnvironment.getWorld()->getNavigator()->reportStats(frameNumber, *stats);
} }
} }
@ -223,13 +226,13 @@ OMW::Engine::Engine(Files::ConfigurationManager& configurationManager)
, mActivationDistanceOverride(-1) , mActivationDistanceOverride(-1)
, mGrab(true) , mGrab(true)
, mExportFonts(false) , mExportFonts(false)
, mRandomSeed(0)
, mScriptContext (0) , mScriptContext (0)
, mFSStrict (false) , mFSStrict (false)
, mScriptBlacklistUse (true) , mScriptBlacklistUse (true)
, mNewGame (false) , mNewGame (false)
, mCfgMgr(configurationManager) , mCfgMgr(configurationManager)
{ {
Misc::Rng::init();
MWClass::registerClasses(); MWClass::registerClasses();
Uint32 flags = SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE|SDL_INIT_GAMECONTROLLER|SDL_INIT_JOYSTICK; Uint32 flags = SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE|SDL_INIT_GAMECONTROLLER|SDL_INIT_JOYSTICK;
@ -258,6 +261,9 @@ OMW::Engine::~Engine()
mViewer = nullptr; mViewer = nullptr;
delete mEncoder;
mEncoder = nullptr;
if (mWindow) if (mWindow)
{ {
SDL_DestroyWindow(mWindow); SDL_DestroyWindow(mWindow);
@ -545,7 +551,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
// Create the world // Create the world
mEnvironment.setWorld( new MWWorld::World (mViewer, rootNode, mResourceSystem.get(), mWorkQueue.get(), mEnvironment.setWorld( new MWWorld::World (mViewer, rootNode, mResourceSystem.get(), mWorkQueue.get(),
mFileCollections, mContentFiles, mEncoder, mFallbackMap, mFileCollections, mContentFiles, mEncoder, mFallbackMap,
mActivationDistanceOverride, mCellName, mStartupScript, mResDir.string(), mCfgMgr.getUserDataPath().string())); mActivationDistanceOverride, mCellName, mResDir.string(), mCfgMgr.getUserDataPath().string()));
mEnvironment.getWorld()->setupPlayer(); mEnvironment.getWorld()->setupPlayer();
input->setPlayer(&mEnvironment.getWorld()->getPlayer()); input->setPlayer(&mEnvironment.getWorld()->getPlayer());
@ -650,6 +656,11 @@ void OMW::Engine::go()
assert (!mContentFiles.empty()); assert (!mContentFiles.empty());
Log(Debug::Info) << "OSG version: " << osgGetVersion(); Log(Debug::Info) << "OSG version: " << osgGetVersion();
SDL_version sdlVersion;
SDL_GetVersion(&sdlVersion);
Log(Debug::Info) << "SDL version: " << (int)sdlVersion.major << "." << (int)sdlVersion.minor << "." << (int)sdlVersion.patch;
Misc::Rng::init(mRandomSeed);
// Load settings // Load settings
Settings::Manager settings; Settings::Manager settings;
@ -657,8 +668,7 @@ void OMW::Engine::go()
settingspath = loadSettings (settings); settingspath = loadSettings (settings);
// Create encoder // Create encoder
ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = new ToUTF8::Utf8Encoder(mEncoding);
mEncoder = &encoder;
// Setup viewer // Setup viewer
mViewer = new osgViewer::Viewer; mViewer = new osgViewer::Viewer;
@ -701,22 +711,21 @@ void OMW::Engine::go()
{ {
// start in main menu // start in main menu
mEnvironment.getWindowManager()->pushGuiMode (MWGui::GM_MainMenu); mEnvironment.getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
try mEnvironment.getSoundManager()->playTitleMusic();
{ std::string logo = mFallbackMap["Movies_Morrowind_Logo"];
// Is there an ini setting for this filename or something? if (!logo.empty())
mEnvironment.getSoundManager()->streamMusic("Special/morrowind title.mp3"); mEnvironment.getWindowManager()->playVideo(logo, true);
std::string logo = mFallbackMap["Movies_Morrowind_Logo"];
if (!logo.empty())
mEnvironment.getWindowManager()->playVideo(logo, true);
}
catch (...) {}
} }
else else
{ {
mEnvironment.getStateManager()->newGame (!mNewGame); mEnvironment.getStateManager()->newGame (!mNewGame);
} }
if (!mStartupScript.empty() && mEnvironment.getStateManager()->getState() == MWState::StateManager::State_Running)
{
mEnvironment.getWindowManager()->executeInConsole(mStartupScript);
}
// Start the main rendering loop // Start the main rendering loop
osg::Timer frameTimer; osg::Timer frameTimer;
double simulationTime = 0.0; double simulationTime = 0.0;
@ -820,3 +829,8 @@ void OMW::Engine::setSaveGameFile(const std::string &savegame)
{ {
mSaveGameFile = savegame; mSaveGameFile = savegame;
} }
void OMW::Engine::setRandomSeed(unsigned int seed)
{
mRandomSeed = seed;
}

View file

@ -100,6 +100,7 @@ namespace OMW
bool mGrab; bool mGrab;
bool mExportFonts; bool mExportFonts;
unsigned int mRandomSeed;
Compiler::Extensions mExtensions; Compiler::Extensions mExtensions;
Compiler::Context *mScriptContext; Compiler::Context *mScriptContext;
@ -203,6 +204,8 @@ namespace OMW
/// Set the save game file to load after initialising the engine. /// Set the save game file to load after initialising the engine.
void setSaveGameFile(const std::string& savegame); void setSaveGameFile(const std::string& savegame);
void setRandomSeed(unsigned int seed);
private: private:
Files::ConfigurationManager& mCfgMgr; Files::ConfigurationManager& mCfgMgr;
}; };

View file

@ -3,6 +3,7 @@
#include <components/files/escape.hpp> #include <components/files/escape.hpp>
#include <components/fallback/validate.hpp> #include <components/fallback/validate.hpp>
#include <components/debug/debugging.hpp> #include <components/debug/debugging.hpp>
#include <components/misc/rng.hpp>
#include "engine.hpp" #include "engine.hpp"
@ -131,7 +132,12 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
("export-fonts", bpo::value<bool>()->implicit_value(true) ("export-fonts", bpo::value<bool>()->implicit_value(true)
->default_value(false), "Export Morrowind .fnt fonts to PNG image and XML file in current directory") ->default_value(false), "Export Morrowind .fnt fonts to PNG image and XML file in current directory")
("activate-dist", bpo::value <int> ()->default_value (-1), "activation distance override"); ("activate-dist", bpo::value <int> ()->default_value (-1), "activation distance override")
("random-seed", bpo::value <unsigned int> ()
->default_value(Misc::Rng::generateDefaultSeed()),
"seed value for random number generator")
;
bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv) bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv)
.options(desc).allow_unregistered().run(); .options(desc).allow_unregistered().run();
@ -231,6 +237,7 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
engine.setFallbackValues(variables["fallback"].as<FallbackMap>().mMap); engine.setFallbackValues(variables["fallback"].as<FallbackMap>().mMap);
engine.setActivationDistanceOverride (variables["activate-dist"].as<int>()); engine.setActivationDistanceOverride (variables["activate-dist"].as<int>());
engine.enableFontExport(variables["export-fonts"].as<bool>()); engine.enableFontExport(variables["export-fonts"].as<bool>());
engine.setRandomSeed(variables["random-seed"].as<unsigned int>());
return true; return true;
} }

View file

@ -90,9 +90,9 @@ namespace MWBase
virtual void setPlayerClass (const ESM::Class& class_) = 0; virtual void setPlayerClass (const ESM::Class& class_) = 0;
///< Set player class to custom class. ///< Set player class to custom class.
virtual void restoreDynamicStats(MWWorld::Ptr actor, bool sleep) = 0; virtual void restoreDynamicStats(MWWorld::Ptr actor, double hours, bool sleep) = 0;
virtual void rest(bool sleep) = 0; virtual void rest(double hours, bool sleep) = 0;
///< If the player is sleeping or waiting, this should be called every hour. ///< If the player is sleeping or waiting, this should be called every hour.
/// @param sleep is the player sleeping or waiting? /// @param sleep is the player sleeping or waiting?

View file

@ -89,6 +89,9 @@ namespace MWBase
///< Start playing music from the selected folder ///< Start playing music from the selected folder
/// \param name of the folder that contains the playlist /// \param name of the folder that contains the playlist
virtual void playTitleMusic() = 0;
///< Start playing title music
virtual void say(const MWWorld::ConstPtr &reference, const std::string& filename) = 0; virtual void say(const MWWorld::ConstPtr &reference, const std::string& filename) = 0;
///< Make an actor say some text. ///< Make an actor say some text.
/// \param filename name of a sound file in "Sound/" in the data directory. /// \param filename name of a sound file in "Sound/" in the data directory.

View file

@ -57,7 +57,7 @@ namespace MWMechanics
namespace DetourNavigator namespace DetourNavigator
{ {
class Navigator; struct Navigator;
} }
namespace MWWorld namespace MWWorld
@ -134,6 +134,7 @@ namespace MWBase
virtual MWWorld::Player& getPlayer() = 0; virtual MWWorld::Player& getPlayer() = 0;
virtual MWWorld::Ptr getPlayerPtr() = 0; virtual MWWorld::Ptr getPlayerPtr() = 0;
virtual MWWorld::ConstPtr getPlayerConstPtr() const = 0;
virtual const MWWorld::ESMStore& getStore() const = 0; virtual const MWWorld::ESMStore& getStore() const = 0;
@ -587,7 +588,7 @@ namespace MWBase
virtual bool isPlayerInJail() const = 0; virtual bool isPlayerInJail() const = 0;
virtual void rest() = 0; virtual void rest(double hours) = 0;
virtual void setPlayerTraveling(bool traveling) = 0; virtual void setPlayerTraveling(bool traveling) = 0;
virtual bool isPlayerTraveling() const = 0; virtual bool isPlayerTraveling() const = 0;
@ -615,6 +616,9 @@ namespace MWBase
virtual void removeActorPath(const MWWorld::ConstPtr& actor) const = 0; virtual void removeActorPath(const MWWorld::ConstPtr& actor) const = 0;
virtual void setNavMeshNumberToRender(const std::size_t value) = 0; virtual void setNavMeshNumberToRender(const std::size_t value) = 0;
/// Return physical half extents of the given actor to be used in pathfinding
virtual osg::Vec3f getPathfindingHalfExtents(const MWWorld::ConstPtr& actor) const = 0;
}; };
} }

View file

@ -2,10 +2,10 @@
#include <components/esm/loadacti.hpp> #include <components/esm/loadacti.hpp>
#include <components/misc/rng.hpp> #include <components/misc/rng.hpp>
#include <components/sceneutil/positionattitudetransform.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/mechanicsmanager.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
@ -19,6 +19,7 @@
#include "../mwrender/objects.hpp" #include "../mwrender/objects.hpp"
#include "../mwrender/renderinginterface.hpp" #include "../mwrender/renderinginterface.hpp"
#include "../mwrender/vismask.hpp"
#include "../mwgui/tooltips.hpp" #include "../mwgui/tooltips.hpp"
@ -30,8 +31,10 @@ namespace MWClass
void Activator::insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const void Activator::insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const
{ {
if (!model.empty()) { if (!model.empty())
{
renderingInterface.getObjects().insertModel(ptr, model, true); renderingInterface.getObjects().insertModel(ptr, model, true);
ptr.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Static);
} }
} }

View file

@ -4,7 +4,6 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/mechanicsmanager.hpp"
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwmechanics/creaturestats.hpp" #include "../mwmechanics/creaturestats.hpp"

View file

@ -3,11 +3,9 @@
#include <components/esm/loadappa.hpp> #include <components/esm/loadappa.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionalchemy.hpp" #include "../mwworld/actionalchemy.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"

View file

@ -9,7 +9,6 @@
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionequip.hpp" #include "../mwworld/actionequip.hpp"
#include "../mwworld/inventorystore.hpp" #include "../mwworld/inventorystore.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"

View file

@ -7,7 +7,6 @@
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionequip.hpp" #include "../mwworld/actionequip.hpp"
#include "../mwworld/inventorystore.hpp" #include "../mwworld/inventorystore.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"

View file

@ -6,7 +6,6 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/mechanicsmanager.hpp"
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
@ -241,8 +240,8 @@ namespace MWClass
std::string text; std::string text;
int lockLevel = ptr.getCellRef().getLockLevel(); int lockLevel = ptr.getCellRef().getLockLevel();
if (lockLevel > 0 && lockLevel != ESM::UnbreakableLock) if (lockLevel > 0 && lockLevel != ESM::UnbreakableLock)
text += "\n#{sLockLevel}: " + MWGui::ToolTips::toString(ptr.getCellRef().getLockLevel()); text += "\n#{sLockLevel}: " + MWGui::ToolTips::toString(lockLevel);
else if (ptr.getCellRef().getLockLevel() < 0) else if (lockLevel < 0)
text += "\n#{sUnlocked}"; text += "\n#{sUnlocked}";
if (ptr.getCellRef().getTrap() != "") if (ptr.getCellRef().getTrap() != "")
text += "\n#{sTrapped}"; text += "\n#{sTrapped}";

View file

@ -308,6 +308,7 @@ namespace MWClass
{ {
damage = attack[0] + ((attack[1]-attack[0])*attackStrength); damage = attack[0] + ((attack[1]-attack[0])*attackStrength);
MWMechanics::adjustWeaponDamage(damage, weapon, ptr); MWMechanics::adjustWeaponDamage(damage, weapon, ptr);
MWMechanics::resistNormalWeapon(victim, ptr, weapon, damage);
MWMechanics::reduceWeaponCondition(damage, true, weapon, ptr); MWMechanics::reduceWeaponCondition(damage, true, weapon, ptr);
} }
@ -382,9 +383,6 @@ namespace MWClass
if (!object.isEmpty()) if (!object.isEmpty())
stats.setLastHitObject(object.getCellRef().getRefId()); stats.setLastHitObject(object.getCellRef().getRefId());
if (damage > 0.0f && !object.isEmpty())
MWMechanics::resistNormalWeapon(ptr, attacker, object, damage);
if (damage < 0.001f) if (damage < 0.001f)
damage = 0; damage = 0;
@ -610,11 +608,7 @@ namespace MWClass
int Creature::getServices(const MWWorld::ConstPtr &actor) const int Creature::getServices(const MWWorld::ConstPtr &actor) const
{ {
const MWWorld::LiveCellRef<ESM::Creature>* ref = actor.get<ESM::Creature>(); return actor.get<ESM::Creature>()->mBase->mAiData.mServices;
if (ref->mBase->mHasAI)
return ref->mBase->mAiData.mServices;
else
return 0;
} }
bool Creature::isPersistent(const MWWorld::ConstPtr &actor) const bool Creature::isPersistent(const MWWorld::ConstPtr &actor) const

View file

@ -2,15 +2,14 @@
#include <components/esm/loaddoor.hpp> #include <components/esm/loaddoor.hpp>
#include <components/esm/doorstate.hpp> #include <components/esm/doorstate.hpp>
#include <components/sceneutil/positionattitudetransform.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwbase/mechanicsmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/nullaction.hpp"
#include "../mwworld/failedaction.hpp" #include "../mwworld/failedaction.hpp"
#include "../mwworld/actionteleport.hpp" #include "../mwworld/actionteleport.hpp"
#include "../mwworld/actiondoor.hpp" #include "../mwworld/actiondoor.hpp"
@ -26,6 +25,7 @@
#include "../mwrender/objects.hpp" #include "../mwrender/objects.hpp"
#include "../mwrender/renderinginterface.hpp" #include "../mwrender/renderinginterface.hpp"
#include "../mwrender/animation.hpp" #include "../mwrender/animation.hpp"
#include "../mwrender/vismask.hpp"
#include "../mwmechanics/actorutil.hpp" #include "../mwmechanics/actorutil.hpp"
@ -55,8 +55,10 @@ namespace MWClass
void Door::insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const void Door::insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const
{ {
if (!model.empty()) { if (!model.empty())
{
renderingInterface.getObjects().insertModel(ptr, model, true); renderingInterface.getObjects().insertModel(ptr, model, true);
ptr.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Static);
} }
} }

View file

@ -7,7 +7,6 @@
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "../mwworld/esmstore.hpp" #include "../mwworld/esmstore.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"

View file

@ -5,20 +5,16 @@
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/mechanicsmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionequip.hpp" #include "../mwworld/actionequip.hpp"
#include "../mwworld/nullaction.hpp" #include "../mwworld/nullaction.hpp"
#include "../mwworld/failedaction.hpp" #include "../mwworld/failedaction.hpp"
#include "../mwworld/inventorystore.hpp" #include "../mwworld/inventorystore.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"
#include "../mwworld/customdata.hpp"
#include "../mwgui/tooltips.hpp" #include "../mwgui/tooltips.hpp"

View file

@ -4,11 +4,9 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/mechanicsmanager.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionequip.hpp" #include "../mwworld/actionequip.hpp"
#include "../mwworld/inventorystore.hpp" #include "../mwworld/inventorystore.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"

View file

@ -7,7 +7,6 @@
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "../mwworld/esmstore.hpp" #include "../mwworld/esmstore.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"

View file

@ -619,6 +619,8 @@ namespace MWClass
damage = attack[0] + ((attack[1]-attack[0])*attackStrength); damage = attack[0] + ((attack[1]-attack[0])*attackStrength);
} }
MWMechanics::adjustWeaponDamage(damage, weapon, ptr); MWMechanics::adjustWeaponDamage(damage, weapon, ptr);
MWMechanics::resistNormalWeapon(victim, ptr, weapon, damage);
MWMechanics::applyWerewolfDamageMult(victim, weapon, damage);
MWMechanics::reduceWeaponCondition(damage, true, weapon, ptr); MWMechanics::reduceWeaponCondition(damage, true, weapon, ptr);
healthdmg = true; healthdmg = true;
} }
@ -780,7 +782,7 @@ namespace MWClass
MWWorld::Ptr armor = ((armorslot != inv.end()) ? *armorslot : MWWorld::Ptr()); MWWorld::Ptr armor = ((armorslot != inv.end()) ? *armorslot : MWWorld::Ptr());
if(!armor.isEmpty() && armor.getTypeName() == typeid(ESM::Armor).name()) if(!armor.isEmpty() && armor.getTypeName() == typeid(ESM::Armor).name())
{ {
if (attacker.isEmpty() || (!attacker.isEmpty() && !(object.isEmpty() && !attacker.getClass().isNpc()))) // Unarmed creature attacks don't affect armor condition if (!object.isEmpty() || attacker.isEmpty() || attacker.getClass().isNpc()) // Unarmed creature attacks don't affect armor condition
{ {
int armorhealth = armor.getClass().getItemHealth(armor); int armorhealth = armor.getClass().getItemHealth(armor);
armorhealth -= std::min(damageDiff, armorhealth); armorhealth -= std::min(damageDiff, armorhealth);
@ -935,8 +937,12 @@ namespace MWClass
const float normalizedEncumbrance = getNormalizedEncumbrance(ptr); const float normalizedEncumbrance = getNormalizedEncumbrance(ptr);
bool sneaking = MWBase::Environment::get().getMechanicsManager()->isSneaking(ptr) && stats.getStance(MWMechanics::CreatureStats::Stance_Sneak); bool swimming = world->isSwimming(ptr);
bool running = MWBase::Environment::get().getMechanicsManager()->isRunning(ptr) && stats.getStance(MWMechanics::CreatureStats::Stance_Run); bool inair = !world->isOnGround(ptr) && !swimming && !world->isFlying(ptr);
bool sneaking = stats.getStance(MWMechanics::CreatureStats::Stance_Sneak);
sneaking = sneaking && (inair || MWBase::Environment::get().getMechanicsManager()->isSneaking(ptr));
bool running = stats.getStance(MWMechanics::CreatureStats::Stance_Run);
running = running && (inair || MWBase::Environment::get().getMechanicsManager()->isRunning(ptr));
float walkSpeed = gmst.fMinWalkSpeed->mValue.getFloat() + 0.01f*npcdata->mNpcStats.getAttribute(ESM::Attribute::Speed).getModified()* float walkSpeed = gmst.fMinWalkSpeed->mValue.getFloat() + 0.01f*npcdata->mNpcStats.getAttribute(ESM::Attribute::Speed).getModified()*
(gmst.fMaxWalkSpeed->mValue.getFloat() - gmst.fMinWalkSpeed->mValue.getFloat()); (gmst.fMaxWalkSpeed->mValue.getFloat() - gmst.fMinWalkSpeed->mValue.getFloat());
@ -961,7 +967,7 @@ namespace MWClass
flySpeed = std::max(0.0f, flySpeed); flySpeed = std::max(0.0f, flySpeed);
moveSpeed = flySpeed; moveSpeed = flySpeed;
} }
else if (world->isSwimming(ptr)) else if (swimming)
{ {
float swimSpeed = walkSpeed; float swimSpeed = walkSpeed;
if(running) if(running)
@ -971,7 +977,7 @@ namespace MWClass
gmst.fSwimRunAthleticsMult->mValue.getFloat(); gmst.fSwimRunAthleticsMult->mValue.getFloat();
moveSpeed = swimSpeed; moveSpeed = swimSpeed;
} }
else if (running) else if (running && !sneaking)
moveSpeed = runSpeed; moveSpeed = runSpeed;
else else
moveSpeed = walkSpeed; moveSpeed = walkSpeed;
@ -1199,11 +1205,7 @@ namespace MWClass
int Npc::getServices(const MWWorld::ConstPtr &actor) const int Npc::getServices(const MWWorld::ConstPtr &actor) const
{ {
const MWWorld::LiveCellRef<ESM::NPC>* ref = actor.get<ESM::NPC>(); return actor.get<ESM::NPC>()->mBase->mAiData.mServices;
if (ref->mBase->mHasAI)
return ref->mBase->mAiData.mServices;
else
return 0;
} }

View file

@ -7,11 +7,9 @@
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionapply.hpp" #include "../mwworld/actionapply.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "../mwworld/esmstore.hpp" #include "../mwworld/esmstore.hpp"
#include "../mwworld/containerstore.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"
#include "../mwworld/nullaction.hpp" #include "../mwworld/nullaction.hpp"

View file

@ -4,11 +4,9 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/mechanicsmanager.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionequip.hpp" #include "../mwworld/actionequip.hpp"
#include "../mwworld/inventorystore.hpp" #include "../mwworld/inventorystore.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"

View file

@ -3,14 +3,11 @@
#include <components/esm/loadrepa.hpp> #include <components/esm/loadrepa.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"
#include "../mwworld/nullaction.hpp"
#include "../mwworld/actionrepair.hpp" #include "../mwworld/actionrepair.hpp"
#include "../mwgui/tooltips.hpp" #include "../mwgui/tooltips.hpp"

View file

@ -1,6 +1,7 @@
#include "static.hpp" #include "static.hpp"
#include <components/esm/loadstat.hpp> #include <components/esm/loadstat.hpp>
#include <components/sceneutil/positionattitudetransform.hpp>
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"
@ -8,14 +9,17 @@
#include "../mwrender/objects.hpp" #include "../mwrender/objects.hpp"
#include "../mwrender/renderinginterface.hpp" #include "../mwrender/renderinginterface.hpp"
#include "../mwrender/vismask.hpp"
namespace MWClass namespace MWClass
{ {
void Static::insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const void Static::insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const
{ {
if (!model.empty()) { if (!model.empty())
{
renderingInterface.getObjects().insertModel(ptr, model); renderingInterface.getObjects().insertModel(ptr, model);
ptr.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Static);
} }
} }

View file

@ -10,7 +10,6 @@
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/actiontake.hpp"
#include "../mwworld/actionequip.hpp" #include "../mwworld/actionequip.hpp"
#include "../mwworld/inventorystore.hpp" #include "../mwworld/inventorystore.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"

View file

@ -1,9 +1,6 @@
#include "dialoguemanagerimp.hpp" #include "dialoguemanagerimp.hpp"
#include <cctype>
#include <cstdlib>
#include <algorithm> #include <algorithm>
#include <iterator>
#include <list> #include <list>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>

View file

@ -41,19 +41,6 @@ namespace MWDialogue
void Quest::setIndex (int index) void Quest::setIndex (int index)
{ {
const ESM::Dialogue *dialogue =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>().find (mTopic);
for (ESM::Dialogue::InfoContainer::const_iterator iter (dialogue->mInfo.begin());
iter!=dialogue->mInfo.end(); ++iter)
if (iter->mData.mDisposition==index && iter->mQuestStatus!=ESM::DialInfo::QS_Name)
{
if (iter->mQuestStatus==ESM::DialInfo::QS_Finished)
mFinished = true;
else if (iter->mQuestStatus==ESM::DialInfo::QS_Restart)
mFinished = false;
}
// The index must be set even if no related journal entry was found // The index must be set even if no related journal entry was found
mIndex = index; mIndex = index;
} }
@ -81,8 +68,18 @@ namespace MWDialogue
if (index==-1) if (index==-1)
throw std::runtime_error ("unknown journal entry for topic " + mTopic); throw std::runtime_error ("unknown journal entry for topic " + mTopic);
for (auto &info : dialogue->mInfo)
{
if (info.mData.mJournalIndex == index
&& (info.mQuestStatus == ESM::DialInfo::QS_Finished || info.mQuestStatus == ESM::DialInfo::QS_Restart))
{
mFinished = (info.mQuestStatus == ESM::DialInfo::QS_Finished);
break;
}
}
if (index > mIndex) if (index > mIndex)
setIndex (index); mIndex = index;
for (TEntryIter iter (mEntries.begin()); iter!=mEntries.end(); ++iter) for (TEntryIter iter (mEntries.begin()); iter!=mEntries.end(); ++iter)
if (iter->mInfoId==entry.mInfoId) if (iter->mInfoId==entry.mInfoId)

View file

@ -15,7 +15,6 @@
#include <components/compiler/streamerrorhandler.hpp> #include <components/compiler/streamerrorhandler.hpp>
#include <components/compiler/scanner.hpp> #include <components/compiler/scanner.hpp>
#include <components/compiler/locals.hpp> #include <components/compiler/locals.hpp>
#include <components/compiler/output.hpp>
#include <components/compiler/scriptparser.hpp> #include <components/compiler/scriptparser.hpp>
#include "filter.hpp" #include "filter.hpp"

View file

@ -1,9 +1,6 @@
#include "selectwrapper.hpp" #include "selectwrapper.hpp"
#include <cctype>
#include <stdexcept> #include <stdexcept>
#include <algorithm>
#include <sstream> #include <sstream>
#include <iterator> #include <iterator>

View file

@ -3,6 +3,7 @@
#include <MyGUI_Gui.h> #include <MyGUI_Gui.h>
#include <MyGUI_Button.h> #include <MyGUI_Button.h>
#include <MyGUI_EditBox.h> #include <MyGUI_EditBox.h>
#include <MyGUI_ControllerManager.h>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
@ -237,15 +238,15 @@ namespace MWGui
std::set<MWMechanics::EffectKey> effectIds = mAlchemy->listEffects(); std::set<MWMechanics::EffectKey> effectIds = mAlchemy->listEffects();
Widgets::SpellEffectList list; Widgets::SpellEffectList list;
unsigned int effectIndex=0; unsigned int effectIndex=0;
for (std::set<MWMechanics::EffectKey>::iterator it2 = effectIds.begin(); it2 != effectIds.end(); ++it2) for (const MWMechanics::EffectKey& effectKey : effectIds)
{ {
Widgets::SpellEffectParams params; Widgets::SpellEffectParams params;
params.mEffectID = it2->mId; params.mEffectID = effectKey.mId;
const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get<ESM::MagicEffect>().find(it2->mId); const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get<ESM::MagicEffect>().find(effectKey.mId);
if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetSkill) if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetSkill)
params.mSkill = it2->mArg; params.mSkill = effectKey.mArg;
else if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetAttribute) else if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetAttribute)
params.mAttribute = it2->mArg; params.mAttribute = effectKey.mArg;
params.mIsConstant = true; params.mIsConstant = true;
params.mNoTarget = true; params.mNoTarget = true;

View file

@ -1,12 +1,9 @@
#ifndef MWGUI_ALCHEMY_H #ifndef MWGUI_ALCHEMY_H
#define MWGUI_ALCHEMY_H #define MWGUI_ALCHEMY_H
#include <memory>
#include <vector> #include <vector>
#include <MyGUI_ControllerManager.h>
#include "../mwmechanics/alchemy.hpp"
#include <components/widgets/numericeditbox.hpp> #include <components/widgets/numericeditbox.hpp>
#include "controllers.hpp" #include "controllers.hpp"

View file

@ -145,35 +145,35 @@ namespace MWGui
// sort by name // sort by name
std::vector < std::pair<std::string, const ESM::BirthSign*> > birthSigns; std::vector < std::pair<std::string, const ESM::BirthSign*> > birthSigns;
MWWorld::Store<ESM::BirthSign>::iterator it = signs.begin(); for (const ESM::BirthSign& sign : signs)
for (; it != signs.end(); ++it)
{ {
birthSigns.push_back(std::make_pair(it->mId, &(*it))); birthSigns.push_back(std::make_pair(sign.mId, &sign));
} }
std::sort(birthSigns.begin(), birthSigns.end(), sortBirthSigns); std::sort(birthSigns.begin(), birthSigns.end(), sortBirthSigns);
int index = 0; int index = 0;
for (std::vector<std::pair<std::string, const ESM::BirthSign*> >::const_iterator it2 = birthSigns.begin(); for (auto& birthsignPair : birthSigns)
it2 != birthSigns.end(); ++it2, ++index)
{ {
mBirthList->addItem(it2->second->mName, it2->first); mBirthList->addItem(birthsignPair.second->mName, birthsignPair.first);
if (mCurrentBirthId.empty()) if (mCurrentBirthId.empty())
{ {
mBirthList->setIndexSelected(index); mBirthList->setIndexSelected(index);
mCurrentBirthId = it2->first; mCurrentBirthId = birthsignPair.first;
} }
else if (Misc::StringUtils::ciEqual(it2->first, mCurrentBirthId)) else if (Misc::StringUtils::ciEqual(birthsignPair.first, mCurrentBirthId))
{ {
mBirthList->setIndexSelected(index); mBirthList->setIndexSelected(index);
} }
index++;
} }
} }
void BirthDialog::updateSpells() void BirthDialog::updateSpells()
{ {
for (std::vector<MyGUI::Widget*>::iterator it = mSpellItems.begin(); it != mSpellItems.end(); ++it) for (MyGUI::Widget* widget : mSpellItems)
{ {
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(widget);
} }
mSpellItems.clear(); mSpellItems.clear();

View file

@ -6,6 +6,7 @@
#include "MyGUI_FontManager.h" #include "MyGUI_FontManager.h"
#include <functional> #include <functional>
#include <memory>
#include <stdint.h> #include <stdint.h>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>

View file

@ -257,19 +257,17 @@ namespace MWGui
{ {
std::map<int, MWMechanics::AttributeValue > attributes = MWBase::Environment::get().getWindowManager()->getPlayerAttributeValues(); std::map<int, MWMechanics::AttributeValue > attributes = MWBase::Environment::get().getWindowManager()->getPlayerAttributeValues();
for (std::map<int, MWMechanics::AttributeValue >::iterator it = attributes.begin(); for (auto& attributePair : attributes)
it != attributes.end(); ++it)
{ {
mReviewDialog->setAttribute(static_cast<ESM::Attribute::AttributeID> (it->first), it->second); mReviewDialog->setAttribute(static_cast<ESM::Attribute::AttributeID> (attributePair.first), attributePair.second);
} }
} }
{ {
std::map<int, MWMechanics::SkillValue > skills = MWBase::Environment::get().getWindowManager()->getPlayerSkillValues(); std::map<int, MWMechanics::SkillValue > skills = MWBase::Environment::get().getWindowManager()->getPlayerSkillValues();
for (std::map<int, MWMechanics::SkillValue >::iterator it = skills.begin(); for (auto& skillPair : skills)
it != skills.end(); ++it)
{ {
mReviewDialog->setSkillValue(static_cast<ESM::Skill::SkillEnum> (it->first), it->second); mReviewDialog->setSkillValue(static_cast<ESM::Skill::SkillEnum> (skillPair.first), skillPair.second);
} }
mReviewDialog->configureSkills(MWBase::Environment::get().getWindowManager()->getPlayerMajorSkills(), MWBase::Environment::get().getWindowManager()->getPlayerMinorSkills()); mReviewDialog->configureSkills(MWBase::Environment::get().getWindowManager()->getPlayerMajorSkills(), MWBase::Environment::get().getWindowManager()->getPlayerMinorSkills());
} }
@ -554,7 +552,7 @@ namespace MWGui
{ {
if (mGenerateClassStep == 10) if (mGenerateClassStep == 10)
{ {
static boost::array<ClassPoint, 23> classes = { { static std::array<ClassPoint, 23> classes = { {
{"Acrobat", {6, 2, 2}}, {"Acrobat", {6, 2, 2}},
{"Agent", {6, 1, 3}}, {"Agent", {6, 1, 3}},
{"Archer", {3, 5, 2}}, {"Archer", {3, 5, 2}},

View file

@ -207,25 +207,25 @@ namespace MWGui
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
std::vector<std::pair<std::string, std::string> > items; // class id, class name std::vector<std::pair<std::string, std::string> > items; // class id, class name
for (MWWorld::Store<ESM::Class>::iterator it = store.get<ESM::Class>().begin(); it != store.get<ESM::Class>().end(); ++it) for (const ESM::Class& classInfo : store.get<ESM::Class>())
{ {
bool playable = (it->mData.mIsPlayable != 0); bool playable = (classInfo.mData.mIsPlayable != 0);
if (!playable) // Only display playable classes if (!playable) // Only display playable classes
continue; continue;
if (store.get<ESM::Class>().isDynamic(it->mId)) if (store.get<ESM::Class>().isDynamic(classInfo.mId))
continue; // custom-made class not relevant for this dialog continue; // custom-made class not relevant for this dialog
items.push_back(std::make_pair(it->mId, it->mName)); items.push_back(std::make_pair(classInfo.mId, classInfo.mName));
} }
std::sort(items.begin(), items.end(), sortClasses); std::sort(items.begin(), items.end(), sortClasses);
int index = 0; int index = 0;
for (std::vector<std::pair<std::string, std::string> >::const_iterator it = items.begin(); it != items.end(); ++it) for (auto& itemPair : items)
{ {
const std::string &id = it->first; const std::string &id = itemPair.first;
mClassList->addItem(it->second, id); mClassList->addItem(itemPair.second, id);
if (mCurrentClassId.empty()) if (mCurrentClassId.empty())
{ {
mCurrentClassId = id; mCurrentClassId = id;
@ -332,19 +332,17 @@ namespace MWGui
void InfoBoxDialog::setButtons(ButtonList &buttons) void InfoBoxDialog::setButtons(ButtonList &buttons)
{ {
for (std::vector<MyGUI::Button*>::iterator it = this->mButtons.begin(); it != this->mButtons.end(); ++it) for (MyGUI::Button* button : this->mButtons)
{ {
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(button);
} }
this->mButtons.clear(); this->mButtons.clear();
// TODO: The buttons should be generated from a template in the layout file, ie. cloning an existing widget // TODO: The buttons should be generated from a template in the layout file, ie. cloning an existing widget
MyGUI::Button* button; MyGUI::Button* button;
MyGUI::IntCoord coord = MyGUI::IntCoord(0, 0, mButtonBar->getWidth(), 10); MyGUI::IntCoord coord = MyGUI::IntCoord(0, 0, mButtonBar->getWidth(), 10);
ButtonList::const_iterator end = buttons.end(); for (const std::string &text : buttons)
for (ButtonList::const_iterator it = buttons.begin(); it != end; ++it)
{ {
const std::string &text = *it;
button = mButtonBar->createWidget<MyGUI::Button>("MW_Button", coord, MyGUI::Align::Top | MyGUI::Align::HCenter, ""); button = mButtonBar->createWidget<MyGUI::Button>("MW_Button", coord, MyGUI::Align::Top | MyGUI::Align::HCenter, "");
button->getSubWidgetText()->setWordWrap(true); button->getSubWidgetText()->setWordWrap(true);
button->setCaption(text); button->setCaption(text);
@ -368,11 +366,10 @@ namespace MWGui
void InfoBoxDialog::onButtonClicked(MyGUI::Widget* _sender) void InfoBoxDialog::onButtonClicked(MyGUI::Widget* _sender)
{ {
std::vector<MyGUI::Button*>::const_iterator end = mButtons.end();
int i = 0; int i = 0;
for (std::vector<MyGUI::Button*>::const_iterator it = mButtons.begin(); it != end; ++it) for (MyGUI::Button* button : mButtons)
{ {
if (*it == _sender) if (button == _sender)
{ {
eventButtonSelected(i); eventButtonSelected(i);
return; return;
@ -430,10 +427,9 @@ namespace MWGui
mSkills.push_back(mMinorSkill[i]); mSkills.push_back(mMinorSkill[i]);
} }
std::vector<Widgets::MWSkillPtr>::const_iterator end = mSkills.end(); for (Widgets::MWSkillPtr& skill : mSkills)
for (std::vector<Widgets::MWSkillPtr>::const_iterator it = mSkills.begin(); it != end; ++it)
{ {
(*it)->eventClicked += MyGUI::newDelegate(this, &CreateClassDialog::onSkillClicked); skill->eventClicked += MyGUI::newDelegate(this, &CreateClassDialog::onSkillClicked);
} }
setText("LabelT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sName", "")); setText("LabelT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sName", ""));
@ -642,14 +638,13 @@ namespace MWGui
ESM::Skill::SkillEnum id = mSkillDialog->getSkillId(); ESM::Skill::SkillEnum id = mSkillDialog->getSkillId();
// Avoid duplicate skills by swapping any skill field that matches the selected one // Avoid duplicate skills by swapping any skill field that matches the selected one
std::vector<Widgets::MWSkillPtr>::const_iterator end = mSkills.end(); for (Widgets::MWSkillPtr& skill : mSkills)
for (std::vector<Widgets::MWSkillPtr>::const_iterator it = mSkills.begin(); it != end; ++it)
{ {
if (*it == mAffectedSkill) if (skill == mAffectedSkill)
continue; continue;
if ((*it)->getSkillId() == id) if (skill->getSkillId() == id)
{ {
(*it)->setSkillId(mAffectedSkill->getSkillId()); skill->setSkillId(mAffectedSkill->getSkillId());
break; break;
} }
} }

View file

@ -11,10 +11,12 @@
#include "../mwscript/extensions.hpp" #include "../mwscript/extensions.hpp"
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/scriptmanager.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwworld/esmstore.hpp" #include "../mwworld/esmstore.hpp"
#include "../mwworld/class.hpp"
namespace MWGui namespace MWGui
{ {
@ -173,6 +175,12 @@ namespace MWGui
print("> " + command + "\n"); print("> " + command + "\n");
Compiler::Locals locals; Compiler::Locals locals;
if (!mPtr.isEmpty())
{
std::string script = mPtr.getClass().getScript(mPtr);
if (!script.empty())
locals = MWBase::Environment::get().getScriptManager()->getLocals(script);
}
Compiler::Output output (locals); Compiler::Output output (locals);
if (compile (command + "\n", output)) if (compile (command + "\n", output))
@ -231,11 +239,13 @@ namespace MWGui
{ {
int i = 0; int i = 0;
printOK(""); printOK("");
for(std::vector<std::string>::iterator it=matches.begin(); it < matches.end(); ++it,++i ) for(std::string& match : matches)
{ {
printOK( *it ); if(i == 50)
if( i == 50 )
break; break;
printOK(match);
i++;
} }
} }
} }
@ -352,15 +362,16 @@ namespace MWGui
} }
/* Iterate through the vector. */ /* Iterate through the vector. */
for(std::vector<std::string>::iterator it=mNames.begin(); it < mNames.end();++it) { for(std::string& name : mNames)
{
bool string_different=false; bool string_different=false;
/* Is the string shorter than the input string? If yes skip it. */ /* Is the string shorter than the input string? If yes skip it. */
if( (*it).length() < tmp.length() ) if(name.length() < tmp.length())
continue; continue;
/* Is the beginning of the string different from the input string? If yes skip it. */ /* Is the beginning of the string different from the input string? If yes skip it. */
for( std::string::iterator iter=tmp.begin(), iter2=(*it).begin(); iter < tmp.end();++iter, ++iter2) { for( std::string::iterator iter=tmp.begin(), iter2=name.begin(); iter < tmp.end();++iter, ++iter2) {
if( Misc::StringUtils::toLower(*iter) != Misc::StringUtils::toLower(*iter2) ) { if( Misc::StringUtils::toLower(*iter) != Misc::StringUtils::toLower(*iter2) ) {
string_different=true; string_different=true;
break; break;
@ -371,7 +382,7 @@ namespace MWGui
continue; continue;
/* The beginning of the string matches the input string, save it for the next test. */ /* The beginning of the string matches the input string, save it for the next test. */
matches.push_back(*it); matches.push_back(name);
} }
/* There are no matches. Return the unchanged input. */ /* There are no matches. Return the unchanged input. */
@ -399,11 +410,14 @@ namespace MWGui
/* Check if all matching strings match further than input. If yes complete to this match. */ /* Check if all matching strings match further than input. If yes complete to this match. */
int i = tmp.length(); int i = tmp.length();
for(std::string::iterator iter=matches.front().begin()+tmp.length(); iter < matches.front().end(); ++iter, ++i) { for(std::string::iterator iter=matches.front().begin()+tmp.length(); iter < matches.front().end(); ++iter, ++i)
for(std::vector<std::string>::iterator it=matches.begin(); it < matches.end();++it) { {
if( Misc::StringUtils::toLower((*it)[i]) != Misc::StringUtils::toLower(*iter) ) { for(std::string& match : matches)
{
if(Misc::StringUtils::toLower(match[i]) != Misc::StringUtils::toLower(*iter))
{
/* Append the longest match to the end of the output string*/ /* Append the longest match to the end of the output string*/
output.append(matches.front().substr( 0, i)); output.append(matches.front().substr(0, i));
return output; return output;
} }
} }

View file

@ -6,7 +6,6 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/dialoguemanager.hpp"
#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/mechanicsmanager.hpp"
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
@ -18,7 +17,6 @@
#include "inventorywindow.hpp" #include "inventorywindow.hpp"
#include "itemview.hpp" #include "itemview.hpp"
#include "itemwidget.hpp"
#include "inventoryitemmodel.hpp" #include "inventoryitemmodel.hpp"
#include "containeritemmodel.hpp" #include "containeritemmodel.hpp"
#include "sortfilteritemmodel.hpp" #include "sortfilteritemmodel.hpp"

View file

@ -13,8 +13,6 @@
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwmechanics/actorutil.hpp"
namespace namespace
{ {
@ -84,9 +82,9 @@ size_t ContainerItemModel::getItemCount()
ItemModel::ModelIndex ContainerItemModel::getIndex (ItemStack item) ItemModel::ModelIndex ContainerItemModel::getIndex (ItemStack item)
{ {
size_t i = 0; size_t i = 0;
for (std::vector<ItemStack>::iterator it = mItems.begin(); it != mItems.end(); ++it) for (ItemStack& itemStack : mItems)
{ {
if (*it == item) if (itemStack == item)
return i; return i;
++i; ++i;
} }
@ -105,29 +103,29 @@ void ContainerItemModel::removeItem (const ItemStack& item, size_t count)
{ {
int toRemove = count; int toRemove = count;
for (std::vector<MWWorld::Ptr>::iterator source = mItemSources.begin(); source != mItemSources.end(); ++source) for (MWWorld::Ptr& source : mItemSources)
{ {
MWWorld::ContainerStore& store = source->getClass().getContainerStore(*source); MWWorld::ContainerStore& store = source.getClass().getContainerStore(source);
for (MWWorld::ContainerStoreIterator it = store.begin(); it != store.end(); ++it) for (MWWorld::ContainerStoreIterator it = store.begin(); it != store.end(); ++it)
{ {
if (stacks(*it, item.mBase)) if (stacks(*it, item.mBase))
{ {
toRemove -= store.remove(*it, toRemove, *source); toRemove -= store.remove(*it, toRemove, source);
if (toRemove <= 0) if (toRemove <= 0)
return; return;
} }
} }
} }
for (std::vector<MWWorld::Ptr>::iterator source = mWorldItems.begin(); source != mWorldItems.end(); ++source) for (MWWorld::Ptr& source : mWorldItems)
{ {
if (stacks(*source, item.mBase)) if (stacks(source, item.mBase))
{ {
int refCount = source->getRefData().getCount(); int refCount = source.getRefData().getCount();
if (refCount - toRemove <= 0) if (refCount - toRemove <= 0)
MWBase::Environment::get().getWorld()->deleteObject(*source); MWBase::Environment::get().getWorld()->deleteObject(source);
else else
source->getRefData().setCount(std::max(0, refCount - toRemove)); source.getRefData().setCount(std::max(0, refCount - toRemove));
toRemove -= refCount; toRemove -= refCount;
if (toRemove <= 0) if (toRemove <= 0)
return; return;
@ -140,27 +138,28 @@ void ContainerItemModel::removeItem (const ItemStack& item, size_t count)
void ContainerItemModel::update() void ContainerItemModel::update()
{ {
mItems.clear(); mItems.clear();
for (std::vector<MWWorld::Ptr>::iterator source = mItemSources.begin(); source != mItemSources.end(); ++source) for (MWWorld::Ptr& source : mItemSources)
{ {
MWWorld::ContainerStore& store = source->getClass().getContainerStore(*source); MWWorld::ContainerStore& store = source.getClass().getContainerStore(source);
for (MWWorld::ContainerStoreIterator it = store.begin(); it != store.end(); ++it) for (MWWorld::ContainerStoreIterator it = store.begin(); it != store.end(); ++it)
{ {
if (!(*it).getClass().showsInInventory(*it)) if (!(*it).getClass().showsInInventory(*it))
continue; continue;
std::vector<ItemStack>::iterator itemStack = mItems.begin(); bool found = false;
for (; itemStack != mItems.end(); ++itemStack) for (ItemStack& itemStack : mItems)
{ {
if (stacks(*it, itemStack->mBase)) if (stacks(*it, itemStack.mBase))
{ {
// we already have an item stack of this kind, add to it // we already have an item stack of this kind, add to it
itemStack->mCount += it->getRefData().getCount(); itemStack.mCount += it->getRefData().getCount();
found = true;
break; break;
} }
} }
if (itemStack == mItems.end()) if (!found)
{ {
// no stack yet, create one // no stack yet, create one
ItemStack newItem (*it, this, it->getRefData().getCount()); ItemStack newItem (*it, this, it->getRefData().getCount());
@ -168,23 +167,24 @@ void ContainerItemModel::update()
} }
} }
} }
for (std::vector<MWWorld::Ptr>::iterator source = mWorldItems.begin(); source != mWorldItems.end(); ++source) for (MWWorld::Ptr& source : mWorldItems)
{ {
std::vector<ItemStack>::iterator itemStack = mItems.begin(); bool found = false;
for (; itemStack != mItems.end(); ++itemStack) for (ItemStack& itemStack : mItems)
{ {
if (stacks(*source, itemStack->mBase)) if (stacks(source, itemStack.mBase))
{ {
// we already have an item stack of this kind, add to it // we already have an item stack of this kind, add to it
itemStack->mCount += source->getRefData().getCount(); itemStack.mCount += source.getRefData().getCount();
found = true;
break; break;
} }
} }
if (itemStack == mItems.end()) if (!found)
{ {
// no stack yet, create one // no stack yet, create one
ItemStack newItem (*source, this, source->getRefData().getCount()); ItemStack newItem (source, this, source.getRefData().getCount());
mItems.push_back(newItem); mItems.push_back(newItem);
} }
} }

View file

@ -184,16 +184,16 @@ namespace MWGui
BookTypesetter::Style* style = typesetter->createStyle("", textColours.normal, false); BookTypesetter::Style* style = typesetter->createStyle("", textColours.normal, false);
size_t formatted = 0; // points to the first character that is not laid out yet size_t formatted = 0; // points to the first character that is not laid out yet
for (std::map<Range, intptr_t>::iterator it = hyperLinks.begin(); it != hyperLinks.end(); ++it) for (auto& hyperLink : hyperLinks)
{ {
intptr_t topicId = it->second; intptr_t topicId = hyperLink.second;
BookTypesetter::Style* hotStyle = typesetter->createHotStyle (style, textColours.link, BookTypesetter::Style* hotStyle = typesetter->createHotStyle (style, textColours.link,
textColours.linkOver, textColours.linkPressed, textColours.linkOver, textColours.linkPressed,
topicId); topicId);
if (formatted < it->first.first) if (formatted < hyperLink.first.first)
typesetter->write(style, formatted, it->first.first); typesetter->write(style, formatted, hyperLink.first.first);
typesetter->write(hotStyle, it->first.first, it->first.second); typesetter->write(hotStyle, hyperLink.first.first, hyperLink.first.second);
formatted = it->first.second; formatted = hyperLink.first.second;
} }
if (formatted < text.size()) if (formatted < text.size())
typesetter->write(style, formatted, text.size()); typesetter->write(style, formatted, text.size());
@ -204,9 +204,8 @@ namespace MWGui
keywordSearch->highlightKeywords(text.begin(), text.end(), matches); keywordSearch->highlightKeywords(text.begin(), text.end(), matches);
std::string::const_iterator i = text.begin (); std::string::const_iterator i = text.begin ();
for (std::vector<KeywordSearchT::Match>::iterator it = matches.begin(); it != matches.end(); ++it) for (KeywordSearchT::Match& match : matches)
{ {
KeywordSearchT::Match match = *it;
if (i != match.mBeg) if (i != match.mBeg)
addTopicLink (typesetter, 0, i - text.begin (), match.mBeg - text.begin ()); addTopicLink (typesetter, 0, i - text.begin (), match.mBeg - text.begin ());
@ -419,13 +418,13 @@ namespace MWGui
bool sameActor = (mPtr == actor); bool sameActor = (mPtr == actor);
if (!sameActor) if (!sameActor)
{ {
for (std::vector<DialogueText*>::iterator it = mHistoryContents.begin(); it != mHistoryContents.end(); ++it) for (DialogueText* text : mHistoryContents)
delete (*it); delete text;
mHistoryContents.clear(); mHistoryContents.clear();
mKeywords.clear(); mKeywords.clear();
mTopicsList->clear(); mTopicsList->clear();
for (std::vector<Link*>::iterator it = mLinks.begin(); it != mLinks.end(); ++it) for (Link* link : mLinks)
mDeleteLater.push_back(*it); // Links are not deleted right away to prevent issues with event handlers mDeleteLater.push_back(link); // Links are not deleted right away to prevent issues with event handlers
mLinks.clear(); mLinks.clear();
} }
@ -489,8 +488,8 @@ namespace MWGui
void DialogueWindow::updateTopicsPane() void DialogueWindow::updateTopicsPane()
{ {
mTopicsList->clear(); mTopicsList->clear();
for (std::map<std::string, Link*>::iterator it = mTopicLinks.begin(); it != mTopicLinks.end(); ++it) for (auto& linkPair : mTopicLinks)
mDeleteLater.push_back(it->second); mDeleteLater.push_back(linkPair.second);
mTopicLinks.clear(); mTopicLinks.clear();
mKeywordSearch.clear(); mKeywordSearch.clear();
@ -533,15 +532,15 @@ namespace MWGui
mTopicsList->addSeparator(); mTopicsList->addSeparator();
for(std::list<std::string>::iterator it = mKeywords.begin(); it != mKeywords.end(); ++it) for(std::string& keyword : mKeywords)
{ {
mTopicsList->addItem(*it); mTopicsList->addItem(keyword);
Topic* t = new Topic(*it); Topic* t = new Topic(keyword);
t->eventTopicActivated += MyGUI::newDelegate(this, &DialogueWindow::onTopicActivated); t->eventTopicActivated += MyGUI::newDelegate(this, &DialogueWindow::onTopicActivated);
mTopicLinks[Misc::StringUtils::lowerCase(*it)] = t; mTopicLinks[Misc::StringUtils::lowerCase(keyword)] = t;
mKeywordSearch.seed(Misc::StringUtils::lowerCase(*it), intptr_t(t)); mKeywordSearch.seed(Misc::StringUtils::lowerCase(keyword), intptr_t(t));
} }
mTopicsList->adjustSize(); mTopicsList->adjustSize();
@ -563,9 +562,8 @@ namespace MWGui
BookTypesetter::Ptr typesetter = BookTypesetter::create (mHistory->getWidth(), std::numeric_limits<int>::max()); BookTypesetter::Ptr typesetter = BookTypesetter::create (mHistory->getWidth(), std::numeric_limits<int>::max());
for (std::vector<DialogueText*>::iterator it = mHistoryContents.begin(); it != mHistoryContents.end(); ++it) for (DialogueText* text : mHistoryContents)
(*it)->write(typesetter, &mKeywordSearch, mTopicLinks); text->write(typesetter, &mKeywordSearch, mTopicLinks);
BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::White, false); BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::White, false);
@ -573,9 +571,9 @@ namespace MWGui
// choices // choices
const TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours(); const TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours();
mChoices = MWBase::Environment::get().getDialogueManager()->getChoices(); mChoices = MWBase::Environment::get().getDialogueManager()->getChoices();
for (std::vector<std::pair<std::string, int> >::const_iterator it = mChoices.begin(); it != mChoices.end(); ++it) for (std::pair<std::string, int>& choice : mChoices)
{ {
Choice* link = new Choice(it->second); Choice* link = new Choice(choice.second);
link->eventChoiceActivated += MyGUI::newDelegate(this, &DialogueWindow::onChoiceActivated); link->eventChoiceActivated += MyGUI::newDelegate(this, &DialogueWindow::onChoiceActivated);
mLinks.push_back(link); mLinks.push_back(link);
@ -583,7 +581,7 @@ namespace MWGui
BookTypesetter::Style* questionStyle = typesetter->createHotStyle(body, textColours.answer, textColours.answerOver, BookTypesetter::Style* questionStyle = typesetter->createHotStyle(body, textColours.answer, textColours.answerOver,
textColours.answerPressed, textColours.answerPressed,
TypesetBook::InteractiveId(link)); TypesetBook::InteractiveId(link));
typesetter->write(questionStyle, to_utf8_span(it->first.c_str())); typesetter->write(questionStyle, to_utf8_span(choice.first.c_str()));
} }
mGoodbye = MWBase::Environment::get().getDialogueManager()->isGoodbye(); mGoodbye = MWBase::Environment::get().getDialogueManager()->isGoodbye();

View file

@ -9,7 +9,10 @@
#include <components/widgets/list.hpp> #include <components/widgets/list.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
#include "../mwbase/environment.hpp"
#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/mechanicsmanager.hpp"
#include "../mwbase/world.hpp"
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
#include "../mwworld/containerstore.hpp" #include "../mwworld/containerstore.hpp"
#include "../mwworld/esmstore.hpp" #include "../mwworld/esmstore.hpp"
@ -345,8 +348,7 @@ namespace MWGui
if (MWBase::Environment::get().getMechanicsManager()->isItemStolenFrom(item.getCellRef().getRefId(), mPtr)) if (MWBase::Environment::get().getMechanicsManager()->isItemStolenFrom(item.getCellRef().getRefId(), mPtr))
{ {
std::string msg = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("sNotifyMessage49")->mValue.getString(); std::string msg = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("sNotifyMessage49")->mValue.getString();
if (msg.find("%s") != std::string::npos) Misc::StringUtils::replace(msg, "%s", item.getClass().getName(item).c_str(), 2);
msg.replace(msg.find("%s"), 2, item.getClass().getName(item));
MWBase::Environment::get().getWindowManager()->messageBox(msg); MWBase::Environment::get().getWindowManager()->messageBox(msg);
MWBase::Environment::get().getMechanicsManager()->confiscateStolenItemToOwner(player, item, mPtr, 1); MWBase::Environment::get().getMechanicsManager()->confiscateStolenItemToOwner(player, item, mPtr, 1);

View file

@ -4,15 +4,11 @@
#include <MyGUI_Gui.h> #include <MyGUI_Gui.h>
#include <MyGUI_EditBox.h> #include <MyGUI_EditBox.h>
#include <MyGUI_ImageBox.h> #include <MyGUI_ImageBox.h>
#include <MyGUI_FontManager.h>
// correctBookartPath // correctBookartPath
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/interpreter/defines.hpp> #include <components/interpreter/defines.hpp>
#include <components/misc/stringops.hpp> #include <components/misc/stringops.hpp>
@ -30,7 +26,7 @@ namespace MWGui
MWScript::InterpreterContext interpreterContext(nullptr, MWWorld::Ptr()); // empty arguments, because there is no locals or actor MWScript::InterpreterContext interpreterContext(nullptr, MWWorld::Ptr()); // empty arguments, because there is no locals or actor
mText = Interpreter::fixDefinesBook(mText, interpreterContext); mText = Interpreter::fixDefinesBook(mText, interpreterContext);
boost::algorithm::replace_all(mText, "\r", ""); Misc::StringUtils::replaceAll(mText, "\r", "");
// vanilla game does not show any text after the last EOL tag. // vanilla game does not show any text after the last EOL tag.
const std::string lowerText = Misc::StringUtils::lowerCase(mText); const std::string lowerText = Misc::StringUtils::lowerCase(mText);

View file

@ -25,7 +25,6 @@
#include "itemmodel.hpp" #include "itemmodel.hpp"
#include "draganddrop.hpp" #include "draganddrop.hpp"
#include "itemmodel.hpp"
#include "itemwidget.hpp" #include "itemwidget.hpp"
namespace MWGui namespace MWGui
@ -262,7 +261,7 @@ namespace MWGui
if (mode == GM_Console) if (mode == GM_Console)
MWBase::Environment::get().getWindowManager()->setConsoleSelectedObject(object); MWBase::Environment::get().getWindowManager()->setConsoleSelectedObject(object);
else if ((mode == GM_Container) || (mode == GM_Inventory)) else //if ((mode == GM_Container) || (mode == GM_Inventory))
{ {
// pick up object // pick up object
if (!object.isEmpty()) if (!object.isEmpty())

View file

@ -37,9 +37,9 @@ size_t InventoryItemModel::getItemCount()
ItemModel::ModelIndex InventoryItemModel::getIndex (ItemStack item) ItemModel::ModelIndex InventoryItemModel::getIndex (ItemStack item)
{ {
size_t i = 0; size_t i = 0;
for (std::vector<ItemStack>::iterator it = mItems.begin(); it != mItems.end(); ++it) for (ItemStack& itemStack : mItems)
{ {
if (*it == item) if (itemStack == item)
return i; return i;
++i; ++i;
} }

View file

@ -130,13 +130,13 @@ namespace MWGui
{ {
int currentY = 0; int currentY = 0;
for (Lines::const_iterator iter = mLines.begin(); iter != mLines.end(); ++iter) for (Line& line : mLines)
{ {
iter->mText->setCoord(8, currentY, mScrollView->getWidth()-8, 18); line.mText->setCoord(8, currentY, mScrollView->getWidth()-8, 18);
currentY += 19; currentY += 19;
iter->mIcon->setCoord(16, currentY, 32, 32); line.mIcon->setCoord(16, currentY, 32, 32);
iter->mCharge->setCoord(72, currentY+2, std::max(199, mScrollView->getWidth()-72-38), 20); line.mCharge->setCoord(72, currentY+2, std::max(199, mScrollView->getWidth()-72-38), 20);
currentY += 32 + 4; currentY += 32 + 4;
} }

View file

@ -1,13 +1,9 @@
#include "itemmodel.hpp" #include "itemmodel.hpp"
#include <set>
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
#include "../mwworld/containerstore.hpp" #include "../mwworld/containerstore.hpp"
#include "../mwworld/store.hpp"
#include "../mwworld/esmstore.hpp" #include "../mwworld/esmstore.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/mechanicsmanager.hpp"

View file

@ -156,12 +156,19 @@ namespace MWGui
void SpellWidget::setSpellIcon(const std::string& icon) void SpellWidget::setSpellIcon(const std::string& icon)
{ {
if (mFrame) if (mFrame && !mCurrentFrame.empty())
{
mCurrentFrame.clear();
mFrame->setImageTexture(""); mFrame->setImageTexture("");
if (mItemShadow) }
mItemShadow->setImageTexture(icon); if (mCurrentIcon != icon)
if (mItem) {
mItem->setImageTexture(icon); mCurrentIcon = icon;
if (mItemShadow)
mItemShadow->setImageTexture(icon);
if (mItem)
mItem->setImageTexture(icon);
}
} }
} }

View file

@ -78,8 +78,7 @@ namespace MWGui
MWWorld::Ptr player = MWMechanics::getPlayer(); MWWorld::Ptr player = MWMechanics::getPlayer();
for (int i=0; i<mDays*24; ++i) MWBase::Environment::get().getMechanicsManager()->rest(mDays * 24, true);
MWBase::Environment::get().getMechanicsManager()->rest(true);
MWBase::Environment::get().getWorld()->advanceTime(mDays * 24); MWBase::Environment::get().getWorld()->advanceTime(mDays * 24);
std::set<int> skills; std::set<int> skills;
@ -103,24 +102,18 @@ namespace MWGui
else else
message = gmst.find("sNotifyMessage43")->mValue.getString(); message = gmst.find("sNotifyMessage43")->mValue.getString();
std::stringstream dayStr; Misc::StringUtils::replace(message, "%d", std::to_string(mDays).c_str(), 2);
dayStr << mDays;
if (message.find("%d") != std::string::npos)
message.replace(message.find("%d"), 2, dayStr.str());
for (std::set<int>::iterator it = skills.begin(); it != skills.end(); ++it) for (const int& skill : skills)
{ {
std::string skillName = gmst.find(ESM::Skill::sSkillNameIds[*it])->mValue.getString(); std::string skillName = gmst.find(ESM::Skill::sSkillNameIds[skill])->mValue.getString();
std::stringstream skillValue; int skillValue = player.getClass().getNpcStats(player).getSkill(skill).getBase();
skillValue << player.getClass().getNpcStats(player).getSkill(*it).getBase();
std::string skillMsg = gmst.find("sNotifyMessage44")->mValue.getString(); std::string skillMsg = gmst.find("sNotifyMessage44")->mValue.getString();
if (*it == ESM::Skill::Sneak || *it == ESM::Skill::Security) if (skill == ESM::Skill::Sneak || skill == ESM::Skill::Security)
skillMsg = gmst.find("sNotifyMessage39")->mValue.getString(); skillMsg = gmst.find("sNotifyMessage39")->mValue.getString();
if (skillMsg.find("%s") != std::string::npos) Misc::StringUtils::replace(skillMsg, "%s", skillName.c_str(), 2);
skillMsg.replace(skillMsg.find("%s"), 2, skillName); Misc::StringUtils::replace(skillMsg, "%d", std::to_string(skillValue).c_str(), 2);
if (skillMsg.find("%d") != std::string::npos)
skillMsg.replace(skillMsg.find("%d"), 2, skillValue.str());
message += "\n" + skillMsg; message += "\n" + skillMsg;
} }

View file

@ -1,7 +1,5 @@
#include "journalbooks.hpp" #include "journalbooks.hpp"
#include <MyGUI_LanguageManager.h>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"

View file

@ -1,6 +1,5 @@
#include "journalwindow.hpp" #include "journalwindow.hpp"
#include <sstream>
#include <set> #include <set>
#include <stack> #include <stack>
#include <string> #include <string>
@ -554,7 +553,7 @@ namespace
mQuestMode = true; mQuestMode = true;
setVisible (LeftTopicIndex, false); setVisible (LeftTopicIndex, false);
setVisible (CenterTopicIndex, true); setVisible (CenterTopicIndex, false);
setVisible (RightTopicIndex, false); setVisible (RightTopicIndex, false);
setVisible (TopicsList, false); setVisible (TopicsList, false);
setVisible (QuestsList, true); setVisible (QuestsList, true);
@ -631,7 +630,7 @@ namespace
if (page+2 < book->pageCount()) if (page+2 < book->pageCount())
{ {
MWBase::Environment::get().getWindowManager()->playSound("book page", true); MWBase::Environment::get().getWindowManager()->playSound("book page");
page += 2; page += 2;
updateShowingPages (); updateShowingPages ();
@ -649,7 +648,7 @@ namespace
if(page >= 2) if(page >= 2)
{ {
MWBase::Environment::get().getWindowManager()->playSound("book page", true); MWBase::Environment::get().getWindowManager()->playSound("book page");
page -= 2; page -= 2;
updateShowingPages (); updateShowingPages ();

View file

@ -21,11 +21,11 @@ namespace MWGui
mListWindowRoot = MyGUI::LayoutManager::getInstance().loadLayout(mLayoutName, mPrefix, _parent); mListWindowRoot = MyGUI::LayoutManager::getInstance().loadLayout(mLayoutName, mPrefix, _parent);
const std::string main_name = mPrefix + MAIN_WINDOW; const std::string main_name = mPrefix + MAIN_WINDOW;
for (MyGUI::VectorWidgetPtr::iterator iter=mListWindowRoot.begin(); iter!=mListWindowRoot.end(); ++iter) for (MyGUI::Widget* widget : mListWindowRoot)
{ {
if ((*iter)->getName() == main_name) if (widget->getName() == main_name)
{ {
mMainWidget = (*iter); mMainWidget = widget;
break; break;
} }
} }
@ -66,10 +66,9 @@ namespace MWGui
MyGUI::Widget* Layout::getWidget(const std::string &_name) MyGUI::Widget* Layout::getWidget(const std::string &_name)
{ {
for (MyGUI::VectorWidgetPtr::iterator iter=mListWindowRoot.begin(); for (MyGUI::Widget* widget : mListWindowRoot)
iter!=mListWindowRoot.end(); ++iter)
{ {
MyGUI::Widget* find = (*iter)->findWidget(mPrefix + _name); MyGUI::Widget* find = widget->findWidget(mPrefix + _name);
if (nullptr != find) if (nullptr != find)
{ {
return find; return find;

View file

@ -12,7 +12,6 @@
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
#include "../mwworld/esmstore.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "../mwmechanics/creaturestats.hpp" #include "../mwmechanics/creaturestats.hpp"

View file

@ -1,6 +1,8 @@
#ifndef MWGUI_LOADINGSCREEN_H #ifndef MWGUI_LOADINGSCREEN_H
#define MWGUI_LOADINGSCREEN_H #define MWGUI_LOADINGSCREEN_H
#include <memory>
#include <osg/Timer> #include <osg/Timer>
#include <osg/ref_ptr> #include <osg/ref_ptr>

View file

@ -253,45 +253,44 @@ namespace MWGui
// Create new buttons if needed // Create new buttons if needed
std::vector<std::string> allButtons { "return", "newgame", "savegame", "loadgame", "options", "credits", "exitgame"}; std::vector<std::string> allButtons { "return", "newgame", "savegame", "loadgame", "options", "credits", "exitgame"};
for (std::vector<std::string>::iterator it = allButtons.begin(); it != allButtons.end(); ++it) for (std::string& buttonId : allButtons)
{ {
if (mButtons.find(*it) == mButtons.end()) if (mButtons.find(buttonId) == mButtons.end())
{ {
Gui::ImageButton* button = mButtonBox->createWidget<Gui::ImageButton> Gui::ImageButton* button = mButtonBox->createWidget<Gui::ImageButton>
("ImageBox", MyGUI::IntCoord(0, curH, 0, 0), MyGUI::Align::Default); ("ImageBox", MyGUI::IntCoord(0, curH, 0, 0), MyGUI::Align::Default);
button->setProperty("ImageHighlighted", "textures\\menu_" + *it + "_over.dds"); button->setProperty("ImageHighlighted", "textures\\menu_" + buttonId + "_over.dds");
button->setProperty("ImageNormal", "textures\\menu_" + *it + ".dds"); button->setProperty("ImageNormal", "textures\\menu_" + buttonId + ".dds");
button->setProperty("ImagePushed", "textures\\menu_" + *it + "_pressed.dds"); button->setProperty("ImagePushed", "textures\\menu_" + buttonId + "_pressed.dds");
button->eventMouseButtonClick += MyGUI::newDelegate(this, &MainMenu::onButtonClicked); button->eventMouseButtonClick += MyGUI::newDelegate(this, &MainMenu::onButtonClicked);
button->setUserData(std::string(*it)); button->setUserData(std::string(buttonId));
mButtons[*it] = button; mButtons[buttonId] = button;
} }
} }
// Start by hiding all buttons // Start by hiding all buttons
int maxwidth = 0; int maxwidth = 0;
for (std::map<std::string, Gui::ImageButton*>::iterator it = mButtons.begin(); it != mButtons.end(); ++it) for (auto& buttonPair : mButtons)
{ {
it->second->setVisible(false); buttonPair.second->setVisible(false);
MyGUI::IntSize requested = it->second->getRequestedSize(); MyGUI::IntSize requested = buttonPair.second->getRequestedSize();
if (requested.width > maxwidth) if (requested.width > maxwidth)
maxwidth = requested.width; maxwidth = requested.width;
} }
// Now show and position the ones we want // Now show and position the ones we want
for (std::vector<std::string>::iterator it = buttons.begin(); it != buttons.end(); ++it) for (std::string& buttonId : buttons)
{ {
assert(mButtons.find(*it) != mButtons.end()); assert(mButtons.find(buttonId) != mButtons.end());
Gui::ImageButton* button = mButtons[*it]; Gui::ImageButton* button = mButtons[buttonId];
button->setVisible(true); button->setVisible(true);
MyGUI::IntSize requested = button->getRequestedSize(); MyGUI::IntSize requested = button->getRequestedSize();
button->setImageCoord(MyGUI::IntCoord(0, 0, requested.width, requested.height));
// Trim off some of the excessive padding // Trim off some of the excessive padding
// TODO: perhaps do this within ImageButton? // TODO: perhaps do this within ImageButton?
int trim = 8; int height = requested.height-16;
button->setImageCoord(MyGUI::IntCoord(0, trim, requested.width, requested.height-trim));
int height = requested.height-trim*2;
button->setImageTile(MyGUI::IntSize(requested.width, height)); button->setImageTile(MyGUI::IntSize(requested.width, height));
button->setCoord((maxwidth-requested.width) / 2, curH, requested.width, height); button->setCoord((maxwidth-requested.width) / 2, curH, requested.width, height);
curH += height; curH += height;

View file

@ -213,8 +213,7 @@ namespace MWGui
map->setNeedMouseFocus(false); map->setNeedMouseFocus(false);
fog->setNeedMouseFocus(false); fog->setNeedMouseFocus(false);
mMapWidgets.push_back(map); mMaps.emplace_back(map, fog);
mFogWidgets.push_back(fog);
} }
} }
} }
@ -234,36 +233,37 @@ namespace MWGui
void LocalMapBase::applyFogOfWar() void LocalMapBase::applyFogOfWar()
{ {
TextureVector fogTextures;
for (int mx=0; mx<mNumCells; ++mx) for (int mx=0; mx<mNumCells; ++mx)
{ {
for (int my=0; my<mNumCells; ++my) for (int my=0; my<mNumCells; ++my)
{ {
int x = mCurX + (mx - mCellDistance); int x = mCurX + (mx - mCellDistance);
int y = mCurY + (-1*(my - mCellDistance)); int y = mCurY + (-1*(my - mCellDistance));
MyGUI::ImageBox* fog = mFogWidgets[my + mNumCells*mx];
MapEntry& entry = mMaps[my + mNumCells*mx];
MyGUI::ImageBox* fog = entry.mFogWidget;
if (!mFogOfWarToggled || !mFogOfWarEnabled) if (!mFogOfWarToggled || !mFogOfWarEnabled)
{ {
fog->setImageTexture(""); fog->setImageTexture("");
entry.mFogTexture.reset();
continue; continue;
} }
osg::ref_ptr<osg::Texture2D> tex = mLocalMapRender->getFogOfWarTexture(x, y); osg::ref_ptr<osg::Texture2D> tex = mLocalMapRender->getFogOfWarTexture(x, y);
if (tex) if (tex)
{ {
std::shared_ptr<MyGUI::ITexture> myguitex (new osgMyGUI::OSGTexture(tex)); entry.mFogTexture.reset(new osgMyGUI::OSGTexture(tex));
fog->setRenderItemTexture(myguitex.get()); fog->setRenderItemTexture(entry.mFogTexture.get());
fog->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 1.f, 1.f, 0.f)); fog->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 1.f, 1.f, 0.f));
fogTextures.push_back(myguitex);
} }
else else
{
fog->setImageTexture("black"); fog->setImageTexture("black");
entry.mFogTexture.reset();
}
} }
} }
// Move the textures we just set into mFogTextures, and move the previous textures into fogTextures, for deletion when this function ends.
// Note, above we need to ensure that all widgets are getting a new texture set, lest we delete textures that are still in use.
mFogTextures.swap(fogTextures);
redraw(); redraw();
} }
@ -312,8 +312,8 @@ namespace MWGui
void LocalMapBase::updateCustomMarkers() void LocalMapBase::updateCustomMarkers()
{ {
for (std::vector<MyGUI::Widget*>::iterator it = mCustomMarkerWidgets.begin(); it != mCustomMarkerWidgets.end(); ++it) for (MyGUI::Widget* widget : mCustomMarkerWidgets)
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(widget);
mCustomMarkerWidgets.clear(); mCustomMarkerWidgets.clear();
for (int dX = -mCellDistance; dX <= mCellDistance; ++dX) for (int dX = -mCellDistance; dX <= mCellDistance; ++dX)
@ -369,7 +369,6 @@ namespace MWGui
applyFogOfWar(); applyFogOfWar();
// Update the map textures // Update the map textures
TextureVector textures;
for (int mx=0; mx<mNumCells; ++mx) for (int mx=0; mx<mNumCells; ++mx)
{ {
for (int my=0; my<mNumCells; ++my) for (int my=0; my<mNumCells; ++my)
@ -377,21 +376,23 @@ namespace MWGui
int mapX = x + (mx - mCellDistance); int mapX = x + (mx - mCellDistance);
int mapY = y + (-1*(my - mCellDistance)); int mapY = y + (-1*(my - mCellDistance));
MyGUI::ImageBox* box = mMapWidgets[my + mNumCells*mx]; MapEntry& entry = mMaps[my + mNumCells*mx];
MyGUI::ImageBox* box = entry.mMapWidget;
osg::ref_ptr<osg::Texture2D> texture = mLocalMapRender->getMapTexture(mapX, mapY); osg::ref_ptr<osg::Texture2D> texture = mLocalMapRender->getMapTexture(mapX, mapY);
if (texture) if (texture)
{ {
std::shared_ptr<MyGUI::ITexture> guiTex (new osgMyGUI::OSGTexture(texture)); entry.mMapTexture.reset(new osgMyGUI::OSGTexture(texture));
textures.push_back(guiTex); box->setRenderItemTexture(entry.mMapTexture.get());
box->setRenderItemTexture(guiTex.get());
box->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 0.f, 1.f, 1.f)); box->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 0.f, 1.f, 1.f));
} }
else else
{
box->setRenderItemTexture(nullptr); box->setRenderItemTexture(nullptr);
entry.mMapTexture.reset();
}
} }
} }
mMapTextures.swap(textures);
// Delay the door markers update until scripts have been given a chance to run. // Delay the door markers update until scripts have been given a chance to run.
// If we don't do this, door markers that should be disabled will still appear on the map. // If we don't do this, door markers that should be disabled will still appear on the map.
@ -487,9 +488,9 @@ namespace MWGui
} }
int counter = 0; int counter = 0;
for (std::vector<MWWorld::Ptr>::iterator it = markers.begin(); it != markers.end(); ++it) for (const MWWorld::Ptr& ptr : markers)
{ {
const ESM::Position& worldPos = it->getRefData().getPosition(); const ESM::Position& worldPos = ptr.getRefData().getPosition();
MarkerUserData markerPos (mLocalMapRender); MarkerUserData markerPos (mLocalMapRender);
MyGUI::IntPoint widgetPos = getMarkerPosition(worldPos.pos[0], worldPos.pos[1], markerPos); MyGUI::IntPoint widgetPos = getMarkerPosition(worldPos.pos[0], worldPos.pos[1], markerPos);
MyGUI::IntCoord widgetCoord(widgetPos.left - 4, MyGUI::IntCoord widgetCoord(widgetPos.left - 4,
@ -526,8 +527,8 @@ namespace MWGui
void LocalMapBase::updateDoorMarkers() void LocalMapBase::updateDoorMarkers()
{ {
// clear all previous door markers // clear all previous door markers
for (std::vector<MyGUI::Widget*>::iterator it = mDoorMarkerWidgets.begin(); it != mDoorMarkerWidgets.end(); ++it) for (MyGUI::Widget* widget : mDoorMarkerWidgets)
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(widget);
mDoorMarkerWidgets.clear(); mDoorMarkerWidgets.clear();
MWBase::World* world = MWBase::Environment::get().getWorld(); MWBase::World* world = MWBase::Environment::get().getWorld();
@ -553,10 +554,8 @@ namespace MWGui
// Create a widget for each marker // Create a widget for each marker
int counter = 0; int counter = 0;
for (std::vector<MWBase::World::DoorMarker>::iterator it = doors.begin(); it != doors.end(); ++it) for (MWBase::World::DoorMarker& marker : doors)
{ {
MWBase::World::DoorMarker marker = *it;
std::vector<std::string> destNotes; std::vector<std::string> destNotes;
CustomMarkerCollection::RangeType markers = mCustomMarkers.getMarkers(marker.dest); CustomMarkerCollection::RangeType markers = mCustomMarkers.getMarkers(marker.dest);
for (CustomMarkerCollection::ContainerType::const_iterator iter = markers.first; iter != markers.second; ++iter) for (CustomMarkerCollection::ContainerType::const_iterator iter = markers.first; iter != markers.second; ++iter)
@ -589,8 +588,8 @@ namespace MWGui
void LocalMapBase::updateMagicMarkers() void LocalMapBase::updateMagicMarkers()
{ {
// clear all previous markers // clear all previous markers
for (std::vector<MyGUI::Widget*>::iterator it = mMagicMarkerWidgets.begin(); it != mMagicMarkerWidgets.end(); ++it) for (MyGUI::Widget* widget : mMagicMarkerWidgets)
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(widget);
mMagicMarkerWidgets.clear(); mMagicMarkerWidgets.clear();
addDetectionMarkers(MWBase::World::Detect_Creature); addDetectionMarkers(MWBase::World::Detect_Creature);
@ -839,22 +838,13 @@ namespace MWGui
void MapWindow::cellExplored(int x, int y) void MapWindow::cellExplored(int x, int y)
{ {
mQueuedToExplore.push_back(std::make_pair(x,y)); mGlobalMapRender->cleanupCameras();
mGlobalMapRender->exploreCell(x, y, mLocalMapRender->getMapTexture(x, y));
} }
void MapWindow::onFrame(float dt) void MapWindow::onFrame(float dt)
{ {
LocalMapBase::onFrame(dt); LocalMapBase::onFrame(dt);
mGlobalMapRender->cleanupCameras();
for (std::vector<CellId>::iterator it = mQueuedToExplore.begin(); it != mQueuedToExplore.end(); ++it)
{
mGlobalMapRender->exploreCell(it->first, it->second, mLocalMapRender->getMapTexture(it->first, it->second));
}
mQueuedToExplore.clear();
NoDrop::onFrame(dt); NoDrop::onFrame(dt);
} }
@ -888,11 +878,11 @@ namespace MWGui
{ {
LocalMapBase::updateCustomMarkers(); LocalMapBase::updateCustomMarkers();
for (std::map<std::pair<int, int>, MyGUI::Widget*>::iterator widgetIt = mGlobalMapMarkers.begin(); widgetIt != mGlobalMapMarkers.end(); ++widgetIt) for (auto& widgetPair : mGlobalMapMarkers)
{ {
int x = widgetIt->first.first; int x = widgetPair.first.first;
int y = widgetIt->first.second; int y = widgetPair.first.second;
MyGUI::Widget* markerWidget = widgetIt->second; MyGUI::Widget* markerWidget = widgetPair.second;
setGlobalMapMarkerTooltip(markerWidget, x, y); setGlobalMapMarkerTooltip(markerWidget, x, y);
} }
} }
@ -1017,8 +1007,8 @@ namespace MWGui
mGlobalMapRender->clear(); mGlobalMapRender->clear();
mChanged = true; mChanged = true;
for (std::map<std::pair<int, int>, MyGUI::Widget*>::iterator it = mGlobalMapMarkers.begin(); it != mGlobalMapMarkers.end(); ++it) for (auto& widgetPair : mGlobalMapMarkers)
MyGUI::Gui::getInstance().destroyWidget(it->second); MyGUI::Gui::getInstance().destroyWidget(widgetPair.second);
mGlobalMapMarkers.clear(); mGlobalMapMarkers.clear();
} }
@ -1043,11 +1033,11 @@ namespace MWGui
mGlobalMapRender->read(map); mGlobalMapRender->read(map);
for (std::set<ESM::GlobalMap::CellId>::iterator it = map.mMarkers.begin(); it != map.mMarkers.end(); ++it) for (const ESM::GlobalMap::CellId& cellId : map.mMarkers)
{ {
const ESM::Cell* cell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>().search(it->first, it->second); const ESM::Cell* cell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>().search(cellId.first, cellId.second);
if (cell && !cell->mName.empty()) if (cell && !cell->mName.empty())
addVisitedLocation(cell->mName, it->first, it->second); addVisitedLocation(cell->mName, cellId.first, cellId.second);
} }
} }
} }
@ -1057,8 +1047,8 @@ namespace MWGui
NoDrop::setAlpha(alpha); NoDrop::setAlpha(alpha);
// can't allow showing map with partial transparency, as the fog of war will also go transparent // can't allow showing map with partial transparency, as the fog of war will also go transparent
// and reveal parts of the map you shouldn't be able to see // and reveal parts of the map you shouldn't be able to see
for (std::vector<MyGUI::ImageBox*>::iterator it = mMapWidgets.begin(); it != mMapWidgets.end(); ++it) for (MapEntry& entry : mMaps)
(*it)->setVisible(alpha == 1); entry.mMapWidget->setVisible(alpha == 1);
} }
void MapWindow::customMarkerCreated(MyGUI::Widget *marker) void MapWindow::customMarkerCreated(MyGUI::Widget *marker)

View file

@ -2,6 +2,7 @@
#define MWGUI_MAPWINDOW_H #define MWGUI_MAPWINDOW_H
#include <stdint.h> #include <stdint.h>
#include <memory>
#include "windowpinnablebase.hpp" #include "windowpinnablebase.hpp"
@ -125,12 +126,17 @@ namespace MWGui
// Stores markers that were placed by a player. May be shared between multiple map views. // Stores markers that were placed by a player. May be shared between multiple map views.
CustomMarkerCollection& mCustomMarkers; CustomMarkerCollection& mCustomMarkers;
std::vector<MyGUI::ImageBox*> mMapWidgets; struct MapEntry
std::vector<MyGUI::ImageBox*> mFogWidgets; {
MapEntry(MyGUI::ImageBox* mapWidget, MyGUI::ImageBox* fogWidget)
: mMapWidget(mapWidget), mFogWidget(fogWidget) {}
typedef std::vector<std::shared_ptr<MyGUI::ITexture> > TextureVector; MyGUI::ImageBox* mMapWidget;
TextureVector mMapTextures; MyGUI::ImageBox* mFogWidget;
TextureVector mFogTextures; std::shared_ptr<MyGUI::ITexture> mMapTexture;
std::shared_ptr<MyGUI::ITexture> mFogTexture;
};
std::vector<MapEntry> mMaps;
// Keep track of created marker widgets, just to easily remove them later. // Keep track of created marker widgets, just to easily remove them later.
std::vector<MyGUI::Widget*> mDoorMarkerWidgets; std::vector<MyGUI::Widget*> mDoorMarkerWidgets;
@ -260,10 +266,6 @@ namespace MWGui
typedef std::pair<int, int> CellId; typedef std::pair<int, int> CellId;
std::set<CellId> mMarkers; std::set<CellId> mMarkers;
// Cells that should be explored in the next frame (i.e. their map revealed on the global map)
// We can't do this immediately, because the map update is not immediate either (see mNeedMapUpdate in scene.cpp)
std::vector<CellId> mQueuedToExplore;
MyGUI::Button* mEventBoxGlobal; MyGUI::Button* mEventBoxGlobal;
MyGUI::Button* mEventBoxLocal; MyGUI::Button* mEventBoxLocal;

View file

@ -28,10 +28,9 @@ namespace MWGui
MessageBoxManager::~MessageBoxManager () MessageBoxManager::~MessageBoxManager ()
{ {
std::vector<MessageBox*>::iterator it(mMessageBoxes.begin()); for (MessageBox* messageBox : mMessageBoxes)
for (; it != mMessageBoxes.end(); ++it)
{ {
delete *it; delete messageBox;
} }
} }
@ -50,12 +49,11 @@ namespace MWGui
mInterMessageBoxe = nullptr; mInterMessageBoxe = nullptr;
} }
std::vector<MessageBox*>::iterator it(mMessageBoxes.begin()); for (MessageBox* messageBox : mMessageBoxes)
for (; it != mMessageBoxes.end(); ++it)
{ {
if (*it == mStaticMessageBox) if (messageBox == mStaticMessageBox)
mStaticMessageBox = nullptr; mStaticMessageBox = nullptr;
delete *it; delete messageBox;
} }
mMessageBoxes.clear(); mMessageBoxes.clear();
@ -81,9 +79,9 @@ namespace MWGui
it = mMessageBoxes.begin(); it = mMessageBoxes.begin();
while(it != mMessageBoxes.end()) while(it != mMessageBoxes.end())
{ {
(*it)->update(static_cast<int>(height)); (*it)->update(static_cast<int>(height));
height += (*it)->getHeight(); height += (*it)->getHeight();
++it; ++it;
} }
if(mInterMessageBoxe != nullptr && mInterMessageBoxe->mMarkedToDelete) { if(mInterMessageBoxe != nullptr && mInterMessageBoxe->mMarkedToDelete) {
@ -114,10 +112,10 @@ namespace MWGui
} }
int height = 0; int height = 0;
for(std::vector<MessageBox*>::iterator it = mMessageBoxes.begin(); it != mMessageBoxes.end(); ++it) for (MessageBox* messageBox : mMessageBoxes)
{ {
(*it)->update(height); messageBox->update(height);
height += (*it)->getHeight(); height += messageBox->getHeight();
} }
} }
@ -240,14 +238,14 @@ namespace MWGui
int buttonHeight = 0; int buttonHeight = 0;
MyGUI::IntCoord dummyCoord(0, 0, 0, 0); MyGUI::IntCoord dummyCoord(0, 0, 0, 0);
for(std::vector<std::string>::const_iterator it = buttons.begin(); it != buttons.end(); ++it) for(const std::string& buttonId : buttons)
{ {
MyGUI::Button* button = mButtonsWidget->createWidget<MyGUI::Button>( MyGUI::Button* button = mButtonsWidget->createWidget<MyGUI::Button>(
MyGUI::WidgetStyle::Child, MyGUI::WidgetStyle::Child,
std::string("MW_Button"), std::string("MW_Button"),
dummyCoord, dummyCoord,
MyGUI::Align::Default); MyGUI::Align::Default);
button->setCaptionWithReplacing(*it); button->setCaptionWithReplacing(buttonId);
button->eventMouseButtonClick += MyGUI::newDelegate(this, &InteractiveMessageBox::mousePressed); button->eventMouseButtonClick += MyGUI::newDelegate(this, &InteractiveMessageBox::mousePressed);
@ -300,16 +298,16 @@ namespace MWGui
MyGUI::IntSize buttonSize(0, buttonHeight); MyGUI::IntSize buttonSize(0, buttonHeight);
int left = (mainWidgetSize.width - buttonsWidth)/2; int left = (mainWidgetSize.width - buttonsWidth)/2;
for(std::vector<MyGUI::Button*>::const_iterator button = mButtons.begin(); button != mButtons.end(); ++button) for(MyGUI::Button* button : mButtons)
{ {
buttonCord.left = left; buttonCord.left = left;
buttonCord.top = messageWidgetCoord.top + textSize.height + textButtonPadding; buttonCord.top = messageWidgetCoord.top + textSize.height + textButtonPadding;
buttonSize.width = (*button)->getTextSize().width + 2*buttonLabelLeftPadding; buttonSize.width = button->getTextSize().width + 2*buttonLabelLeftPadding;
buttonSize.height = (*button)->getTextSize().height + 2*buttonLabelTopPadding; buttonSize.height = button->getTextSize().height + 2*buttonLabelTopPadding;
(*button)->setCoord(buttonCord); button->setCoord(buttonCord);
(*button)->setSize(buttonSize); button->setSize(buttonSize);
left += buttonSize.width + buttonLeftPadding; left += buttonSize.width + buttonLeftPadding;
} }
@ -329,16 +327,16 @@ namespace MWGui
int top = textPadding + textSize.height + textButtonPadding; int top = textPadding + textSize.height + textButtonPadding;
for(std::vector<MyGUI::Button*>::const_iterator button = mButtons.begin(); button != mButtons.end(); ++button) for(MyGUI::Button* button : mButtons)
{ {
buttonSize.width = (*button)->getTextSize().width + buttonLabelLeftPadding*2; buttonSize.width = button->getTextSize().width + buttonLabelLeftPadding*2;
buttonSize.height = (*button)->getTextSize().height + buttonLabelTopPadding*2; buttonSize.height = button->getTextSize().height + buttonLabelTopPadding*2;
buttonCord.top = top; buttonCord.top = top;
buttonCord.left = (mainWidgetSize.width - buttonSize.width)/2; buttonCord.left = (mainWidgetSize.width - buttonSize.width)/2;
(*button)->setCoord(buttonCord); button->setCoord(buttonCord);
(*button)->setSize(buttonSize); button->setSize(buttonSize);
top += buttonSize.height + buttonTopPadding; top += buttonSize.height + buttonTopPadding;
} }
@ -368,13 +366,13 @@ namespace MWGui
MyGUI::Widget* InteractiveMessageBox::getDefaultKeyFocus() MyGUI::Widget* InteractiveMessageBox::getDefaultKeyFocus()
{ {
std::vector<std::string> keywords { "sOk", "sYes" }; std::vector<std::string> keywords { "sOk", "sYes" };
for(std::vector<MyGUI::Button*>::const_iterator button = mButtons.begin(); button != mButtons.end(); ++button) for(MyGUI::Button* button : mButtons)
{ {
for (const std::string& keyword : keywords) for (const std::string& keyword : keywords)
{ {
if(Misc::StringUtils::ciEqual(MyGUI::LanguageManager::getInstance().replaceTags("#{" + keyword + "}"), (*button)->getCaption())) if(Misc::StringUtils::ciEqual(MyGUI::LanguageManager::getInstance().replaceTags("#{" + keyword + "}"), button->getCaption()))
{ {
return *button; return button;
} }
} }
} }
@ -390,10 +388,9 @@ namespace MWGui
{ {
mMarkedToDelete = true; mMarkedToDelete = true;
int index = 0; int index = 0;
std::vector<MyGUI::Button*>::const_iterator button; for(const MyGUI::Button* button : mButtons)
for(button = mButtons.begin(); button != mButtons.end(); ++button)
{ {
if(*button == pressed) if(button == pressed)
{ {
mButtonPressed = index; mButtonPressed = index;
mMessageBoxManager.onButtonPressed(mButtonPressed); mMessageBoxManager.onButtonPressed(mButtonPressed);

View file

@ -540,32 +540,32 @@ namespace MWGui
MWWorld::InventoryStore& store = player.getClass().getInventoryStore(player); MWWorld::InventoryStore& store = player.getClass().getInventoryStore(player);
int i=0; int i=0;
for (std::vector<ESM::QuickKeys::QuickKey>::const_iterator it = keys.mKeys.begin(); it != keys.mKeys.end(); ++it) for (ESM::QuickKeys::QuickKey& quickKey : keys.mKeys)
{ {
if (i >= 10) if (i >= 10)
return; return;
mSelected = &mKey[i]; mSelected = &mKey[i];
switch (it->mType) switch (quickKey.mType)
{ {
case Type_Magic: case Type_Magic:
if (MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().search(it->mId)) if (MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().search(quickKey.mId))
onAssignMagic(it->mId); onAssignMagic(quickKey.mId);
break; break;
case Type_Item: case Type_Item:
case Type_MagicItem: case Type_MagicItem:
{ {
// Find the item by id // Find the item by id
MWWorld::Ptr item = store.findReplacement(it->mId); MWWorld::Ptr item = store.findReplacement(quickKey.mId);
if (item.isEmpty()) if (item.isEmpty())
unassign(mSelected); unassign(mSelected);
else else
{ {
if (it->mType == Type_Item) if (quickKey.mType == Type_Item)
onAssignItem(item); onAssignItem(item);
else // if (it->mType == Type_MagicItem) else // if (quickKey.mType == Type_MagicItem)
onAssignMagicItem(item); onAssignMagicItem(item);
} }

View file

@ -290,9 +290,8 @@ namespace MWGui
const MWWorld::Store<ESM::BodyPart> &store = const MWWorld::Store<ESM::BodyPart> &store =
MWBase::Environment::get().getWorld()->getStore().get<ESM::BodyPart>(); MWBase::Environment::get().getWorld()->getStore().get<ESM::BodyPart>();
for (MWWorld::Store<ESM::BodyPart>::iterator it = store.begin(); it != store.end(); ++it) for (const ESM::BodyPart& bodypart : store)
{ {
const ESM::BodyPart& bodypart = *it;
if (bodypart.mData.mFlags & ESM::BodyPart::BPF_NotPlayable) if (bodypart.mData.mFlags & ESM::BodyPart::BPF_NotPlayable)
continue; continue;
if (bodypart.mData.mType != ESM::BodyPart::MT_Skin) if (bodypart.mData.mType != ESM::BodyPart::MT_Skin)
@ -353,22 +352,21 @@ namespace MWGui
MWBase::Environment::get().getWorld()->getStore().get<ESM::Race>(); MWBase::Environment::get().getWorld()->getStore().get<ESM::Race>();
std::vector<std::pair<std::string, std::string> > items; // ID, name std::vector<std::pair<std::string, std::string> > items; // ID, name
MWWorld::Store<ESM::Race>::iterator it = races.begin(); for (const ESM::Race& race : races)
for (; it != races.end(); ++it)
{ {
bool playable = it->mData.mFlags & ESM::Race::Playable; bool playable = race.mData.mFlags & ESM::Race::Playable;
if (!playable) // Only display playable races if (!playable) // Only display playable races
continue; continue;
items.push_back(std::make_pair(it->mId, it->mName)); items.push_back(std::make_pair(race.mId, race.mName));
} }
std::sort(items.begin(), items.end(), sortRaces); std::sort(items.begin(), items.end(), sortRaces);
int index = 0; int index = 0;
for (std::vector<std::pair<std::string, std::string> >::const_iterator iter = items.begin(); iter != items.end(); ++iter) for (auto& item : items)
{ {
mRaceList->addItem(iter->second, iter->first); mRaceList->addItem(item.second, item.first);
if (Misc::StringUtils::ciEqual(iter->first, mCurrentRaceId)) if (Misc::StringUtils::ciEqual(item.first, mCurrentRaceId))
mRaceList->setIndexSelected(index); mRaceList->setIndexSelected(index);
++index; ++index;
} }
@ -376,9 +374,9 @@ namespace MWGui
void RaceDialog::updateSkills() void RaceDialog::updateSkills()
{ {
for (std::vector<MyGUI::Widget*>::iterator it = mSkillItems.begin(); it != mSkillItems.end(); ++it) for (MyGUI::Widget* widget : mSkillItems)
{ {
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(widget);
} }
mSkillItems.clear(); mSkillItems.clear();
@ -413,9 +411,9 @@ namespace MWGui
void RaceDialog::updateSpellPowers() void RaceDialog::updateSpellPowers()
{ {
for (std::vector<MyGUI::Widget*>::iterator it = mSpellPowerItems.begin(); it != mSpellPowerItems.end(); ++it) for (MyGUI::Widget* widget : mSpellPowerItems)
{ {
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(widget);
} }
mSpellPowerItems.clear(); mSpellPowerItems.clear();
@ -428,11 +426,9 @@ namespace MWGui
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
const ESM::Race *race = store.get<ESM::Race>().find(mCurrentRaceId); const ESM::Race *race = store.get<ESM::Race>().find(mCurrentRaceId);
std::vector<std::string>::const_iterator it = race->mPowers.mList.begin(); int i = 0;
std::vector<std::string>::const_iterator end = race->mPowers.mList.end(); for (const std::string& spellpower : race->mPowers.mList)
for (int i = 0; it != end; ++it)
{ {
const std::string &spellpower = *it;
Widgets::MWSpellPtr spellPowerWidget = mSpellPowerList->createWidget<Widgets::MWSpell>("MW_StatName", coord, MyGUI::Align::Default, std::string("SpellPower") + MyGUI::utility::toString(i)); Widgets::MWSpellPtr spellPowerWidget = mSpellPowerList->createWidget<Widgets::MWSpell>("MW_StatName", coord, MyGUI::Align::Default, std::string("SpellPower") + MyGUI::utility::toString(i));
spellPowerWidget->setSpellId(spellpower); spellPowerWidget->setSpellId(spellpower);
spellPowerWidget->setUserString("ToolTipType", "Spell"); spellPowerWidget->setUserString("ToolTipType", "Spell");

View file

@ -1,6 +1,8 @@
#ifndef MWGUI_RACE_H #ifndef MWGUI_RACE_H
#define MWGUI_RACE_H #define MWGUI_RACE_H
#include <memory>
#include "windowbase.hpp" #include "windowbase.hpp"
#include <MyGUI_RenderManager.h> #include <MyGUI_RenderManager.h>

View file

@ -1,7 +1,5 @@
#include "recharge.hpp" #include "recharge.hpp"
#include <boost/format.hpp>
#include <MyGUI_ScrollView.h> #include <MyGUI_ScrollView.h>
#include <MyGUI_Gui.h> #include <MyGUI_Gui.h>
@ -179,7 +177,8 @@ void Recharge::onItemClicked(MyGUI::Widget *sender, const MWWorld::Ptr& item)
if (gem.getRefData().getCount() == 0) if (gem.getRefData().getCount() == 0)
{ {
std::string message = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("sNotifyMessage51")->mValue.getString(); std::string message = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("sNotifyMessage51")->mValue.getString();
message = boost::str(boost::format(message) % gem.getClass().getName(gem)); Misc::StringUtils::replace(message, "%s", gem.getClass().getName(gem).c_str(), 2);
MWBase::Environment::get().getWindowManager()->messageBox(message); MWBase::Environment::get().getWindowManager()->messageBox(message);
// special case: readd Azura's Star // special case: readd Azura's Star

View file

@ -228,11 +228,9 @@ namespace MWGui
std::set<int> skillSet; std::set<int> skillSet;
std::copy(major.begin(), major.end(), std::inserter(skillSet, skillSet.begin())); std::copy(major.begin(), major.end(), std::inserter(skillSet, skillSet.begin()));
std::copy(minor.begin(), minor.end(), std::inserter(skillSet, skillSet.begin())); std::copy(minor.begin(), minor.end(), std::inserter(skillSet, skillSet.begin()));
boost::array<ESM::Skill::SkillEnum, ESM::Skill::Length>::const_iterator end = ESM::Skill::sSkillIds.end();
mMiscSkills.clear(); mMiscSkills.clear();
for (boost::array<ESM::Skill::SkillEnum, ESM::Skill::Length>::const_iterator it = ESM::Skill::sSkillIds.begin(); it != end; ++it) for (const int skill : ESM::Skill::sSkillIds)
{ {
int skill = *it;
if (skillSet.find(skill) == skillSet.end()) if (skillSet.find(skill) == skillSet.end())
mMiscSkills.push_back(skill); mMiscSkills.push_back(skill);
} }
@ -327,11 +325,9 @@ namespace MWGui
addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString(titleId, titleDefault), coord1, coord2); addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString(titleId, titleDefault), coord1, coord2);
SkillList::const_iterator end = skills.end(); for (const int& skillId : skills)
for (SkillList::const_iterator it = skills.begin(); it != end; ++it)
{ {
int skillId = *it; if (skillId < 0 || skillId >= ESM::Skill::Length) // Skip unknown skill indexes
if (skillId < 0 || skillId > ESM::Skill::Length) // Skip unknown skill indexes
continue; continue;
assert(skillId >= 0 && skillId < ESM::Skill::Length); assert(skillId >= 0 && skillId < ESM::Skill::Length);
const std::string &skillNameId = ESM::Skill::sSkillNameIds[skillId]; const std::string &skillNameId = ESM::Skill::sSkillNameIds[skillId];
@ -357,9 +353,9 @@ namespace MWGui
void ReviewDialog::updateSkillArea() void ReviewDialog::updateSkillArea()
{ {
for (std::vector<MyGUI::Widget*>::iterator it = mSkillWidgets.begin(); it != mSkillWidgets.end(); ++it) for (MyGUI::Widget* skillWidget : mSkillWidgets)
{ {
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(skillWidget);
} }
mSkillWidgets.clear(); mSkillWidgets.clear();
@ -392,19 +388,18 @@ namespace MWGui
attributes[i] = mAttributeWidgets[i]->getAttributeValue().getBase(); attributes[i] = mAttributeWidgets[i]->getAttributeValue().getBase();
std::vector<std::string> selectedSpells = MWMechanics::autoCalcPlayerSpells(skills, attributes, race); std::vector<std::string> selectedSpells = MWMechanics::autoCalcPlayerSpells(skills, attributes, race);
for (std::vector<std::string>::iterator iter = selectedSpells.begin(); iter != selectedSpells.end(); ++iter) for (std::string& spellId : selectedSpells)
{ {
std::string lower = Misc::StringUtils::lowerCase(*iter); std::string lower = Misc::StringUtils::lowerCase(spellId);
if (std::find(spells.begin(), spells.end(), lower) == spells.end()) if (std::find(spells.begin(), spells.end(), lower) == spells.end())
spells.push_back(lower); spells.push_back(lower);
} }
if (race) if (race)
{ {
for (std::vector<std::string>::const_iterator iter = race->mPowers.mList.begin(); for (const std::string& spellId : race->mPowers.mList)
iter != race->mPowers.mList.end(); ++iter)
{ {
std::string lower = Misc::StringUtils::lowerCase(*iter); std::string lower = Misc::StringUtils::lowerCase(spellId);
if (std::find(spells.begin(), spells.end(), lower) == spells.end()) if (std::find(spells.begin(), spells.end(), lower) == spells.end())
spells.push_back(lower); spells.push_back(lower);
} }
@ -413,10 +408,9 @@ namespace MWGui
if (!mBirthSignId.empty()) if (!mBirthSignId.empty())
{ {
const ESM::BirthSign* sign = MWBase::Environment::get().getWorld()->getStore().get<ESM::BirthSign>().find(mBirthSignId); const ESM::BirthSign* sign = MWBase::Environment::get().getWorld()->getStore().get<ESM::BirthSign>().find(mBirthSignId);
for (std::vector<std::string>::const_iterator iter = sign->mPowers.mList.begin(); for (const std::string& spellId : sign->mPowers.mList)
iter != sign->mPowers.mList.end(); ++iter)
{ {
std::string lower = Misc::StringUtils::lowerCase(*iter); std::string lower = Misc::StringUtils::lowerCase(spellId);
if (std::find(spells.begin(), spells.end(), lower) == spells.end()) if (std::find(spells.begin(), spells.end(), lower) == spells.end())
spells.push_back(lower); spells.push_back(lower);
} }
@ -425,27 +419,27 @@ namespace MWGui
if (!mSkillWidgets.empty()) if (!mSkillWidgets.empty())
addSeparator(coord1, coord2); addSeparator(coord1, coord2);
addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString("sTypeAbility", "Abilities"), coord1, coord2); addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString("sTypeAbility", "Abilities"), coord1, coord2);
for (std::vector<std::string>::const_iterator iter = spells.begin(); iter != spells.end(); ++iter) for (std::string& spellId : spells)
{ {
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(*iter); const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(spellId);
if (spell->mData.mType == ESM::Spell::ST_Ability) if (spell->mData.mType == ESM::Spell::ST_Ability)
addItem(spell, coord1, coord2); addItem(spell, coord1, coord2);
} }
addSeparator(coord1, coord2); addSeparator(coord1, coord2);
addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString("sTypePower", "Powers"), coord1, coord2); addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString("sTypePower", "Powers"), coord1, coord2);
for (std::vector<std::string>::const_iterator iter = spells.begin(); iter != spells.end(); ++iter) for (std::string& spellId : spells)
{ {
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(*iter); const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(spellId);
if (spell->mData.mType == ESM::Spell::ST_Power) if (spell->mData.mType == ESM::Spell::ST_Power)
addItem(spell, coord1, coord2); addItem(spell, coord1, coord2);
} }
addSeparator(coord1, coord2); addSeparator(coord1, coord2);
addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString("sTypeSpell", "Spells"), coord1, coord2); addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString("sTypeSpell", "Spells"), coord1, coord2);
for (std::vector<std::string>::const_iterator iter = spells.begin(); iter != spells.end(); ++iter) for (std::string& spellId : spells)
{ {
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(*iter); const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(spellId);
if (spell->mData.mType == ESM::Spell::ST_Spell) if (spell->mData.mType == ESM::Spell::ST_Spell)
addItem(spell, coord1, coord2); addItem(spell, coord1, coord2);
} }

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_MWGUI_SAVEGAMEDIALOG_H #ifndef OPENMW_MWGUI_SAVEGAMEDIALOG_H
#define OPENMW_MWGUI_SAVEGAMEDIALOG_H #define OPENMW_MWGUI_SAVEGAMEDIALOG_H
#include <memory>
#include "windowbase.hpp" #include "windowbase.hpp"
namespace MWState namespace MWState

View file

@ -2,6 +2,7 @@
#define OPENMW_MWGUI_SCREENFADER_H #define OPENMW_MWGUI_SCREENFADER_H
#include <deque> #include <deque>
#include <memory>
#include "windowbase.hpp" #include "windowbase.hpp"

View file

@ -8,11 +8,12 @@
#include <MyGUI_TabControl.h> #include <MyGUI_TabControl.h>
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <boost/math/common_factor.hpp>
#include <SDL_video.h> #include <SDL_video.h>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/misc/stringops.hpp>
#include <components/misc/gcd.hpp>
#include <components/widgets/sharedstatebutton.hpp> #include <components/widgets/sharedstatebutton.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
@ -58,7 +59,7 @@ namespace
std::string getAspect (int x, int y) std::string getAspect (int x, int y)
{ {
int gcd = boost::math::gcd (x, y); int gcd = Misc::gcd (x, y);
int xaspect = x / gcd; int xaspect = x / gcd;
int yaspect = y / gcd; int yaspect = y / gcd;
// special case: 8 : 5 is usually referred to as 16:10 // special case: 8 : 5 is usually referred to as 16:10
@ -125,7 +126,8 @@ namespace MWGui
{ {
MyGUI::ScrollBar* scroll = current->castType<MyGUI::ScrollBar>(); MyGUI::ScrollBar* scroll = current->castType<MyGUI::ScrollBar>();
std::string valueStr; std::string valueStr;
if (getSettingValueType(current) == "Float") std::string valueType = getSettingValueType(current);
if (valueType == "Float" || valueType == "Integer")
{ {
// TODO: ScrollBar isn't meant for this. should probably use a dedicated FloatSlider widget // TODO: ScrollBar isn't meant for this. should probably use a dedicated FloatSlider widget
float min,max; float min,max;
@ -159,7 +161,7 @@ namespace MWGui
MyGUI::TextBox* textBox; MyGUI::TextBox* textBox;
getWidget(textBox, labelWidgetName); getWidget(textBox, labelWidgetName);
std::string labelCaption = scroller->getUserString("SettingLabelCaption"); std::string labelCaption = scroller->getUserString("SettingLabelCaption");
boost::algorithm::replace_all(labelCaption, "%s", value); Misc::StringUtils::replaceAll(labelCaption, "%s", value.c_str(), 2);
textBox->setCaptionWithReplacing(labelCaption); textBox->setCaptionWithReplacing(labelCaption);
} }
} }
@ -184,6 +186,7 @@ namespace MWGui
getWidget(mKeyboardSwitch, "KeyboardButton"); getWidget(mKeyboardSwitch, "KeyboardButton");
getWidget(mControllerSwitch, "ControllerButton"); getWidget(mControllerSwitch, "ControllerButton");
getWidget(mWaterTextureSize, "WaterTextureSize"); getWidget(mWaterTextureSize, "WaterTextureSize");
getWidget(mWaterReflectionDetail, "WaterReflectionDetail");
#ifndef WIN32 #ifndef WIN32
// hide gamma controls since it currently does not work under Linux // hide gamma controls since it currently does not work under Linux
@ -207,6 +210,7 @@ namespace MWGui
mResolutionList->eventListChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onResolutionSelected); mResolutionList->eventListChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onResolutionSelected);
mWaterTextureSize->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onWaterTextureSizeChanged); mWaterTextureSize->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onWaterTextureSizeChanged);
mWaterReflectionDetail->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onWaterReflectionDetailChanged);
mKeyboardSwitch->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onKeyboardSwitchClicked); mKeyboardSwitch->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onKeyboardSwitchClicked);
mControllerSwitch->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onControllerSwitchClicked); mControllerSwitch->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onControllerSwitchClicked);
@ -226,11 +230,10 @@ namespace MWGui
resolutions.push_back(std::make_pair(mode.w, mode.h)); resolutions.push_back(std::make_pair(mode.w, mode.h));
} }
std::sort(resolutions.begin(), resolutions.end(), sortResolutions); std::sort(resolutions.begin(), resolutions.end(), sortResolutions);
for (std::vector < std::pair<int, int> >::const_iterator it=resolutions.begin(); for (std::pair<int, int>& resolution : resolutions)
it!=resolutions.end(); ++it)
{ {
std::string str = MyGUI::utility::toString(it->first) + " x " + MyGUI::utility::toString(it->second) std::string str = MyGUI::utility::toString(resolution.first) + " x " + MyGUI::utility::toString(resolution.second)
+ " (" + getAspect(it->first,it->second) + ")"; + " (" + getAspect(resolution.first, resolution.second) + ")";
if (mResolutionList->findItemIndexWith(str) == MyGUI::ITEM_NONE) if (mResolutionList->findItemIndexWith(str) == MyGUI::ITEM_NONE)
mResolutionList->addItem(str); mResolutionList->addItem(str);
@ -240,7 +243,7 @@ namespace MWGui
std::string tmip = Settings::Manager::getString("texture mipmap", "General"); std::string tmip = Settings::Manager::getString("texture mipmap", "General");
mTextureFilteringButton->setCaption(textureMipmappingToStr(tmip)); mTextureFilteringButton->setCaption(textureMipmappingToStr(tmip));
int waterTextureSize = Settings::Manager::getInt ("rtt size", "Water"); int waterTextureSize = Settings::Manager::getInt("rtt size", "Water");
if (waterTextureSize >= 512) if (waterTextureSize >= 512)
mWaterTextureSize->setIndexSelected(0); mWaterTextureSize->setIndexSelected(0);
if (waterTextureSize >= 1024) if (waterTextureSize >= 1024)
@ -248,6 +251,10 @@ namespace MWGui
if (waterTextureSize >= 2048) if (waterTextureSize >= 2048)
mWaterTextureSize->setIndexSelected(2); mWaterTextureSize->setIndexSelected(2);
int waterReflectionDetail = Settings::Manager::getInt("reflection detail", "Water");
waterReflectionDetail = std::min(4, std::max(0, waterReflectionDetail));
mWaterReflectionDetail->setIndexSelected(waterReflectionDetail);
mWindowBorderButton->setEnabled(!Settings::Manager::getBool("fullscreen", "Video")); mWindowBorderButton->setEnabled(!Settings::Manager::getBool("fullscreen", "Video"));
mKeyboardSwitch->setStateSelected(true); mKeyboardSwitch->setStateSelected(true);
@ -327,6 +334,13 @@ namespace MWGui
apply(); apply();
} }
void SettingsWindow::onWaterReflectionDetailChanged(MyGUI::ComboBox* _sender, size_t pos)
{
unsigned int level = std::min((unsigned int)4, (unsigned int)pos);
Settings::Manager::setInt("reflection detail", "Water", level);
apply();
}
void SettingsWindow::onButtonToggled(MyGUI::Widget* _sender) void SettingsWindow::onButtonToggled(MyGUI::Widget* _sender)
{ {
std::string on = MWBase::Environment::get().getWindowManager()->getGameSettingString("sOn", "On"); std::string on = MWBase::Environment::get().getWindowManager()->getGameSettingString("sOn", "On");
@ -410,14 +424,18 @@ namespace MWGui
if (getSettingType(scroller) == "Slider") if (getSettingType(scroller) == "Slider")
{ {
std::string valueStr; std::string valueStr;
if (getSettingValueType(scroller) == "Float") std::string valueType = getSettingValueType(scroller);
if (valueType == "Float" || valueType == "Integer")
{ {
float value = pos / float(scroller->getScrollRange()-1); float value = pos / float(scroller->getScrollRange()-1);
float min,max; float min,max;
getSettingMinMax(scroller, min, max); getSettingMinMax(scroller, min, max);
value = min + (max-min) * value; value = min + (max-min) * value;
Settings::Manager::setFloat(getSettingName(scroller), getSettingCategory(scroller), value); if (valueType == "Float")
Settings::Manager::setFloat(getSettingName(scroller), getSettingCategory(scroller), value);
else
Settings::Manager::setInt(getSettingName(scroller), getSettingCategory(scroller), (int)value);
valueStr = MyGUI::utility::toString(int(value)); valueStr = MyGUI::utility::toString(int(value));
} }
else else
@ -475,17 +493,17 @@ namespace MWGui
else else
actions = MWBase::Environment::get().getInputManager()->getActionControllerSorting(); actions = MWBase::Environment::get().getInputManager()->getActionControllerSorting();
for (std::vector<int>::const_iterator it = actions.begin(); it != actions.end(); ++it) for (const int& action : actions)
{ {
std::string desc = MWBase::Environment::get().getInputManager()->getActionDescription (*it); std::string desc = MWBase::Environment::get().getInputManager()->getActionDescription (action);
if (desc == "") if (desc == "")
continue; continue;
std::string binding; std::string binding;
if(mKeyboardMode) if(mKeyboardMode)
binding = MWBase::Environment::get().getInputManager()->getActionKeyBindingName(*it); binding = MWBase::Environment::get().getInputManager()->getActionKeyBindingName(action);
else else
binding = MWBase::Environment::get().getInputManager()->getActionControllerBindingName(*it); binding = MWBase::Environment::get().getInputManager()->getActionControllerBindingName(action);
Gui::SharedStateButton* leftText = mControlsBox->createWidget<Gui::SharedStateButton>("SandTextButton", MyGUI::IntCoord(), MyGUI::Align::Default); Gui::SharedStateButton* leftText = mControlsBox->createWidget<Gui::SharedStateButton>("SandTextButton", MyGUI::IntCoord(), MyGUI::Align::Default);
leftText->setCaptionWithReplacing(desc); leftText->setCaptionWithReplacing(desc);
@ -493,7 +511,7 @@ namespace MWGui
Gui::SharedStateButton* rightText = mControlsBox->createWidget<Gui::SharedStateButton>("SandTextButton", MyGUI::IntCoord(), MyGUI::Align::Default); Gui::SharedStateButton* rightText = mControlsBox->createWidget<Gui::SharedStateButton>("SandTextButton", MyGUI::IntCoord(), MyGUI::Align::Default);
rightText->setCaptionWithReplacing(binding); rightText->setCaptionWithReplacing(binding);
rightText->setTextAlign (MyGUI::Align::Right); rightText->setTextAlign (MyGUI::Align::Right);
rightText->setUserData(*it); // save the action id for callbacks rightText->setUserData(action); // save the action id for callbacks
rightText->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onRebindAction); rightText->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onRebindAction);
rightText->eventMouseWheel += MyGUI::newDelegate(this, &SettingsWindow::onInputTabMouseWheel); rightText->eventMouseWheel += MyGUI::newDelegate(this, &SettingsWindow::onInputTabMouseWheel);

View file

@ -33,6 +33,7 @@ namespace MWGui
MyGUI::Widget* mAnisotropyBox; MyGUI::Widget* mAnisotropyBox;
MyGUI::ComboBox* mWaterTextureSize; MyGUI::ComboBox* mWaterTextureSize;
MyGUI::ComboBox* mWaterReflectionDetail;
// controls // controls
MyGUI::ScrollView* mControlsBox; MyGUI::ScrollView* mControlsBox;
@ -52,6 +53,7 @@ namespace MWGui
void highlightCurrentResolution(); void highlightCurrentResolution();
void onWaterTextureSizeChanged(MyGUI::ComboBox* _sender, size_t pos); void onWaterTextureSizeChanged(MyGUI::ComboBox* _sender, size_t pos);
void onWaterReflectionDetailChanged(MyGUI::ComboBox* _sender, size_t pos);
void onRebindAction(MyGUI::Widget* _sender); void onRebindAction(MyGUI::Widget* _sender);
void onInputTabMouseWheel(MyGUI::Widget* _sender, int _rel); void onInputTabMouseWheel(MyGUI::Widget* _sender, int _rel);

View file

@ -122,9 +122,9 @@ namespace MWGui
std::stable_sort(spellsToSort.begin(), spellsToSort.end(), sortSpells); std::stable_sort(spellsToSort.begin(), spellsToSort.end(), sortSpells);
for (std::vector<const ESM::Spell*>::iterator it = spellsToSort.begin() ; it != spellsToSort.end(); ++it) for (const ESM::Spell* spell : spellsToSort)
{ {
addSpell(**it); addSpell(*spell);
} }
spellsToSort.clear(); spellsToSort.clear();

View file

@ -4,7 +4,10 @@
#include "windowbase.hpp" #include "windowbase.hpp"
#include "referenceinterface.hpp" #include "referenceinterface.hpp"
#include "../mwworld/esmstore.hpp" namespace ESM
{
struct Spell;
}
namespace MyGUI namespace MyGUI
{ {
@ -17,7 +20,6 @@ namespace MWGui
class WindowManager; class WindowManager;
} }
namespace MWGui namespace MWGui
{ {
class SpellBuyingWindow : public ReferenceInterface, public WindowBase class SpellBuyingWindow : public ReferenceInterface, public WindowBase

View file

@ -455,10 +455,8 @@ namespace MWGui
const MWWorld::ESMStore &store = const MWWorld::ESMStore &store =
MWBase::Environment::get().getWorld()->getStore(); MWBase::Environment::get().getWorld()->getStore();
for (std::vector<ESM::ENAMstruct>::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it) for (const ESM::ENAMstruct& effect : mEffects)
{ {
const ESM::ENAMstruct& effect = *it;
y += std::max(1.f, MWMechanics::calcEffectCost(effect)); y += std::max(1.f, MWMechanics::calcEffectCost(effect));
if (effect.mRange == ESM::RT_Target) if (effect.mRange == ESM::RT_Target)
@ -530,18 +528,17 @@ namespace MWGui
if (spell->mData.mType != ESM::Spell::ST_Spell) if (spell->mData.mType != ESM::Spell::ST_Spell)
continue; continue;
const std::vector<ESM::ENAMstruct>& list = spell->mEffects.mList; for (const ESM::ENAMstruct& effectInfo : spell->mEffects.mList)
for (std::vector<ESM::ENAMstruct>::const_iterator it2 = list.begin(); it2 != list.end(); ++it2)
{ {
const ESM::MagicEffect * effect = MWBase::Environment::get().getWorld()->getStore().get<ESM::MagicEffect>().find(it2->mEffectID); const ESM::MagicEffect * effect = MWBase::Environment::get().getWorld()->getStore().get<ESM::MagicEffect>().find(effectInfo.mEffectID);
// skip effects that do not allow spellmaking/enchanting // skip effects that do not allow spellmaking/enchanting
int requiredFlags = (mType == Spellmaking) ? ESM::MagicEffect::AllowSpellmaking : ESM::MagicEffect::AllowEnchanting; int requiredFlags = (mType == Spellmaking) ? ESM::MagicEffect::AllowSpellmaking : ESM::MagicEffect::AllowEnchanting;
if (!(effect->mData.mFlags & requiredFlags)) if (!(effect->mData.mFlags & requiredFlags))
continue; continue;
if (std::find(knownEffects.begin(), knownEffects.end(), it2->mEffectID) == knownEffects.end()) if (std::find(knownEffects.begin(), knownEffects.end(), effectInfo.mEffectID) == knownEffects.end())
knownEffects.push_back(it2->mEffectID); knownEffects.push_back(effectInfo.mEffectID);
} }
} }
@ -550,23 +547,23 @@ namespace MWGui
mAvailableEffectsList->clear (); mAvailableEffectsList->clear ();
int i=0; int i=0;
for (std::vector<short>::const_iterator it = knownEffects.begin(); it != knownEffects.end(); ++it) for (const short effectId : knownEffects)
{ {
mAvailableEffectsList->addItem(MWBase::Environment::get().getWorld ()->getStore ().get<ESM::GameSetting>().find( mAvailableEffectsList->addItem(MWBase::Environment::get().getWorld ()->getStore ().get<ESM::GameSetting>().find(
ESM::MagicEffect::effectIdToString (*it))->mValue.getString()); ESM::MagicEffect::effectIdToString(effectId))->mValue.getString());
mButtonMapping[i] = *it; mButtonMapping[i] = effectId;
++i; ++i;
} }
mAvailableEffectsList->adjustSize (); mAvailableEffectsList->adjustSize ();
mAvailableEffectsList->scrollToTop(); mAvailableEffectsList->scrollToTop();
for (std::vector<short>::const_iterator it = knownEffects.begin(); it != knownEffects.end(); ++it) for (const short effectId : knownEffects)
{ {
std::string name = MWBase::Environment::get().getWorld ()->getStore ().get<ESM::GameSetting>().find( std::string name = MWBase::Environment::get().getWorld ()->getStore ().get<ESM::GameSetting>().find(
ESM::MagicEffect::effectIdToString (*it))->mValue.getString(); ESM::MagicEffect::effectIdToString(effectId))->mValue.getString();
MyGUI::Widget* w = mAvailableEffectsList->getItemWidget(name); MyGUI::Widget* w = mAvailableEffectsList->getItemWidget(name);
ToolTips::createMagicEffectToolTip (w, *it); ToolTips::createMagicEffectToolTip (w, effectId);
} }
mEffects.clear(); mEffects.clear();
@ -646,9 +643,9 @@ namespace MWGui
} }
else else
{ {
for (std::vector<ESM::ENAMstruct>::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it) for (const ESM::ENAMstruct& effectInfo : mEffects)
{ {
if (it->mEffectID == mSelectedKnownEffectId) if (effectInfo.mEffectID == mSelectedKnownEffectId)
{ {
MWBase::Environment::get().getWindowManager()->messageBox ("#{sOnetypeEffectMessage}"); MWBase::Environment::get().getWindowManager()->messageBox ("#{sOnetypeEffectMessage}");
return; return;
@ -680,17 +677,17 @@ namespace MWGui
MyGUI::IntSize size(0,0); MyGUI::IntSize size(0,0);
int i = 0; int i = 0;
for (std::vector<ESM::ENAMstruct>::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it) for (const ESM::ENAMstruct& effectInfo : mEffects)
{ {
Widgets::SpellEffectParams params; Widgets::SpellEffectParams params;
params.mEffectID = it->mEffectID; params.mEffectID = effectInfo.mEffectID;
params.mSkill = it->mSkill; params.mSkill = effectInfo.mSkill;
params.mAttribute = it->mAttribute; params.mAttribute = effectInfo.mAttribute;
params.mDuration = it->mDuration; params.mDuration = effectInfo.mDuration;
params.mMagnMin = it->mMagnMin; params.mMagnMin = effectInfo.mMagnMin;
params.mMagnMax = it->mMagnMax; params.mMagnMax = effectInfo.mMagnMax;
params.mRange = it->mRange; params.mRange = effectInfo.mRange;
params.mArea = it->mArea; params.mArea = effectInfo.mArea;
params.mIsConstant = mConstantEffect; params.mIsConstant = mConstantEffect;
MyGUI::Button* button = mUsedEffectsView->createWidget<MyGUI::Button>("", MyGUI::IntCoord(0, size.height, 0, 24), MyGUI::Align::Default); MyGUI::Button* button = mUsedEffectsView->createWidget<MyGUI::Button>("", MyGUI::IntCoord(0, size.height, 0, 24), MyGUI::Align::Default);

View file

@ -65,10 +65,11 @@ namespace MWGui
int w=2; int w=2;
for (std::map <int, std::vector<MagicEffectInfo> >::const_iterator it = effects.begin(); it != effects.end(); ++it) for (auto& effectInfoPair : effects)
{ {
const int effectId = effectInfoPair.first;
const ESM::MagicEffect* effect = const ESM::MagicEffect* effect =
MWBase::Environment::get().getWorld ()->getStore ().get<ESM::MagicEffect>().find(it->first); MWBase::Environment::get().getWorld ()->getStore ().get<ESM::MagicEffect>().find(effectId);
float remainingDuration = 0; float remainingDuration = 0;
float totalDuration = 0; float totalDuration = 0;
@ -77,46 +78,47 @@ namespace MWGui
static const float fadeTime = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fMagicStartIconBlink")->mValue.getFloat(); static const float fadeTime = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fMagicStartIconBlink")->mValue.getFloat();
for (std::vector<MagicEffectInfo>::const_iterator effectIt = it->second.begin(); std::vector<MagicEffectInfo>& effectInfos = effectInfoPair.second;
effectIt != it->second.end(); ++effectIt) bool addNewLine = false;
for (const MagicEffectInfo& effectInfo : effectInfos)
{ {
if (effectIt != it->second.begin()) if (addNewLine)
sourcesDescription += "\n"; sourcesDescription += "\n";
// if at least one of the effect sources is permanent, the effect will never wear off // if at least one of the effect sources is permanent, the effect will never wear off
if (effectIt->mPermanent) if (effectInfo.mPermanent)
{ {
remainingDuration = fadeTime; remainingDuration = fadeTime;
totalDuration = fadeTime; totalDuration = fadeTime;
} }
else else
{ {
remainingDuration = std::max(remainingDuration, effectIt->mRemainingTime); remainingDuration = std::max(remainingDuration, effectInfo.mRemainingTime);
totalDuration = std::max(totalDuration, effectIt->mTotalTime); totalDuration = std::max(totalDuration, effectInfo.mTotalTime);
} }
sourcesDescription += effectIt->mSource; sourcesDescription += effectInfo.mSource;
if (effect->mData.mFlags & ESM::MagicEffect::TargetSkill) if (effect->mData.mFlags & ESM::MagicEffect::TargetSkill)
sourcesDescription += " (" + sourcesDescription += " (" +
MWBase::Environment::get().getWindowManager()->getGameSettingString( MWBase::Environment::get().getWindowManager()->getGameSettingString(
ESM::Skill::sSkillNameIds[effectIt->mKey.mArg], "") + ")"; ESM::Skill::sSkillNameIds[effectInfo.mKey.mArg], "") + ")";
if (effect->mData.mFlags & ESM::MagicEffect::TargetAttribute) if (effect->mData.mFlags & ESM::MagicEffect::TargetAttribute)
sourcesDescription += " (" + sourcesDescription += " (" +
MWBase::Environment::get().getWindowManager()->getGameSettingString( MWBase::Environment::get().getWindowManager()->getGameSettingString(
ESM::Attribute::sGmstAttributeIds[effectIt->mKey.mArg], "") + ")"; ESM::Attribute::sGmstAttributeIds[effectInfo.mKey.mArg], "") + ")";
ESM::MagicEffect::MagnitudeDisplayType displayType = effect->getMagnitudeDisplayType(); ESM::MagicEffect::MagnitudeDisplayType displayType = effect->getMagnitudeDisplayType();
if (displayType == ESM::MagicEffect::MDT_TimesInt) if (displayType == ESM::MagicEffect::MDT_TimesInt)
{ {
std::string timesInt = MWBase::Environment::get().getWindowManager()->getGameSettingString("sXTimesINT", ""); std::string timesInt = MWBase::Environment::get().getWindowManager()->getGameSettingString("sXTimesINT", "");
std::stringstream formatter; std::stringstream formatter;
formatter << std::fixed << std::setprecision(1) << " " << (effectIt->mMagnitude / 10.0f) << timesInt; formatter << std::fixed << std::setprecision(1) << " " << (effectInfo.mMagnitude / 10.0f) << timesInt;
sourcesDescription += formatter.str(); sourcesDescription += formatter.str();
} }
else if ( displayType != ESM::MagicEffect::MDT_None ) else if ( displayType != ESM::MagicEffect::MDT_None )
{ {
sourcesDescription += ": " + MyGUI::utility::toString(effectIt->mMagnitude); sourcesDescription += ": " + MyGUI::utility::toString(effectInfo.mMagnitude);
if ( displayType == ESM::MagicEffect::MDT_Percentage ) if ( displayType == ESM::MagicEffect::MDT_Percentage )
sourcesDescription += MWBase::Environment::get().getWindowManager()->getGameSettingString("spercent", ""); sourcesDescription += MWBase::Environment::get().getWindowManager()->getGameSettingString("spercent", "");
@ -124,49 +126,54 @@ namespace MWGui
sourcesDescription += " " + MWBase::Environment::get().getWindowManager()->getGameSettingString("sfeet", ""); sourcesDescription += " " + MWBase::Environment::get().getWindowManager()->getGameSettingString("sfeet", "");
else if ( displayType == ESM::MagicEffect::MDT_Level ) else if ( displayType == ESM::MagicEffect::MDT_Level )
{ {
sourcesDescription += " " + ((effectIt->mMagnitude > 1) ? sourcesDescription += " " + ((effectInfo.mMagnitude > 1) ?
MWBase::Environment::get().getWindowManager()->getGameSettingString("sLevels", "") : MWBase::Environment::get().getWindowManager()->getGameSettingString("sLevels", "") :
MWBase::Environment::get().getWindowManager()->getGameSettingString("sLevel", "") ); MWBase::Environment::get().getWindowManager()->getGameSettingString("sLevel", "") );
} }
else // ESM::MagicEffect::MDT_Points else // ESM::MagicEffect::MDT_Points
{ {
sourcesDescription += " " + ((effectIt->mMagnitude > 1) ? sourcesDescription += " " + ((effectInfo.mMagnitude > 1) ?
MWBase::Environment::get().getWindowManager()->getGameSettingString("spoints", "") : MWBase::Environment::get().getWindowManager()->getGameSettingString("spoints", "") :
MWBase::Environment::get().getWindowManager()->getGameSettingString("spoint", "") ); MWBase::Environment::get().getWindowManager()->getGameSettingString("spoint", "") );
} }
} }
if (effectIt->mRemainingTime > -1 && if (effectInfo.mRemainingTime > -1 &&
Settings::Manager::getBool("show effect duration","Game")) { Settings::Manager::getBool("show effect duration","Game")) {
sourcesDescription += " #{sDuration}: "; sourcesDescription += " #{sDuration}: ";
float duration = effectIt->mRemainingTime; float duration = effectInfo.mRemainingTime;
if (duration > 3600) { if (duration > 3600)
{
int hour = duration / 3600; int hour = duration / 3600;
duration -= hour*3600; duration -= hour*3600;
sourcesDescription += MWGui::ToolTips::toString(hour) + "h"; sourcesDescription += MWGui::ToolTips::toString(hour) + "h";
} }
if (duration > 60) { if (duration > 60)
{
int minute = duration / 60; int minute = duration / 60;
duration -= minute*60; duration -= minute*60;
sourcesDescription += MWGui::ToolTips::toString(minute) + "m"; sourcesDescription += MWGui::ToolTips::toString(minute) + "m";
} }
if (duration > 0.1) { if (duration > 0.1)
{
sourcesDescription += MWGui::ToolTips::toString(duration) + "s"; sourcesDescription += MWGui::ToolTips::toString(duration) + "s";
} }
} }
addNewLine = true;
} }
if (remainingDuration > 0.f) if (remainingDuration > 0.f)
{ {
MyGUI::ImageBox* image; MyGUI::ImageBox* image;
if (mWidgetMap.find(it->first) == mWidgetMap.end()) if (mWidgetMap.find(effectId) == mWidgetMap.end())
{ {
image = parent->createWidget<MyGUI::ImageBox> image = parent->createWidget<MyGUI::ImageBox>
("ImageBox", MyGUI::IntCoord(w,2,16,16), MyGUI::Align::Default); ("ImageBox", MyGUI::IntCoord(w,2,16,16), MyGUI::Align::Default);
mWidgetMap[it->first] = image; mWidgetMap[effectId] = image;
image->setImageTexture(MWBase::Environment::get().getWindowManager()->correctIconPath(effect->mIcon)); image->setImageTexture(MWBase::Environment::get().getWindowManager()->correctIconPath(effect->mIcon));
std::string name = ESM::MagicEffect::effectIdToString (it->first); std::string name = ESM::MagicEffect::effectIdToString (effectId);
ToolTipInfo tooltipInfo; ToolTipInfo tooltipInfo;
tooltipInfo.caption = "#{" + name + "}"; tooltipInfo.caption = "#{" + name + "}";
@ -178,7 +185,7 @@ namespace MWGui
image->setUserString("ToolTipType", "ToolTipInfo"); image->setUserString("ToolTipType", "ToolTipInfo");
} }
else else
image = mWidgetMap[it->first]; image = mWidgetMap[effectId];
image->setPosition(w,2); image->setPosition(w,2);
image->setVisible(true); image->setVisible(true);
@ -191,9 +198,9 @@ namespace MWGui
if (totalDuration >= fadeTime && fadeTime > 0.f) if (totalDuration >= fadeTime && fadeTime > 0.f)
image->setAlpha(std::min(remainingDuration/fadeTime, 1.f)); image->setAlpha(std::min(remainingDuration/fadeTime, 1.f));
} }
else if (mWidgetMap.find(it->first) != mWidgetMap.end()) else if (mWidgetMap.find(effectId) != mWidgetMap.end())
{ {
mWidgetMap[it->first]->setVisible(false); mWidgetMap[effectId]->setVisible(false);
} }
} }
@ -208,10 +215,10 @@ namespace MWGui
} }
// hide inactive effects // hide inactive effects
for (std::map<int, MyGUI::ImageBox*>::iterator it = mWidgetMap.begin(); it != mWidgetMap.end(); ++it) for (auto& widgetPair : mWidgetMap)
{ {
if (effects.find(it->first) == effects.end()) if (effects.find(widgetPair.first) == effects.end())
it->second->setVisible(false); widgetPair.second->setVisible(false);
} }
} }

View file

@ -149,13 +149,13 @@ namespace MWGui
mModel->update(); mModel->update();
bool fullUpdateRequired = false; bool fullUpdateRequired = false;
SpellModel::ModelIndex maxSpellIndexFound = -1; SpellModel::ModelIndex maxSpellIndexFound = -1;
for (std::vector< LineInfo >::iterator it = mLines.begin(); it != mLines.end(); ++it) for (LineInfo& line : mLines)
{ {
// only update the lines that are "updateable" // only update the lines that are "updateable"
SpellModel::ModelIndex spellIndex(it->mSpellIndex); SpellModel::ModelIndex spellIndex(line.mSpellIndex);
if (spellIndex != NoSpellIndex) if (spellIndex != NoSpellIndex)
{ {
Gui::SharedStateButton* nameButton = reinterpret_cast<Gui::SharedStateButton*>(it->mLeftWidget); Gui::SharedStateButton* nameButton = reinterpret_cast<Gui::SharedStateButton*>(line.mLeftWidget);
// match model against line // match model against line
// if don't match, then major change has happened, so do a full update // if don't match, then major change has happened, so do a full update
@ -176,7 +176,7 @@ namespace MWGui
else else
{ {
maxSpellIndexFound = spellIndex; maxSpellIndexFound = spellIndex;
Gui::SharedStateButton* costButton = reinterpret_cast<Gui::SharedStateButton*>(it->mRightWidget); Gui::SharedStateButton* costButton = reinterpret_cast<Gui::SharedStateButton*>(line.mRightWidget);
if ((costButton != nullptr) && (costButton->getCaption() != spell.mCostColumn)) if ((costButton != nullptr) && (costButton->getCaption() != spell.mCostColumn))
{ {
costButton->setCaption(spell.mCostColumn); costButton->setCaption(spell.mCostColumn);
@ -198,27 +198,25 @@ namespace MWGui
void SpellView::layoutWidgets() void SpellView::layoutWidgets()
{ {
int height = 0; int height = 0;
for (std::vector< LineInfo >::iterator it = mLines.begin(); for (LineInfo& line : mLines)
it != mLines.end(); ++it)
{ {
height += (it->mLeftWidget)->getHeight(); height += line.mLeftWidget->getHeight();
} }
bool scrollVisible = height > mScrollView->getHeight(); bool scrollVisible = height > mScrollView->getHeight();
int width = mScrollView->getWidth() - (scrollVisible ? 18 : 0); int width = mScrollView->getWidth() - (scrollVisible ? 18 : 0);
height = 0; height = 0;
for (std::vector< LineInfo >::iterator it = mLines.begin(); for (LineInfo& line : mLines)
it != mLines.end(); ++it)
{ {
int lineHeight = (it->mLeftWidget)->getHeight(); int lineHeight = line.mLeftWidget->getHeight();
(it->mLeftWidget)->setCoord(4, height, width - 8, lineHeight); line.mLeftWidget->setCoord(4, height, width - 8, lineHeight);
if (it->mRightWidget) if (line.mRightWidget)
{ {
(it->mRightWidget)->setCoord(4, height, width - 8, lineHeight); line.mRightWidget->setCoord(4, height, width - 8, lineHeight);
MyGUI::TextBox* second = (it->mRightWidget)->castType<MyGUI::TextBox>(false); MyGUI::TextBox* second = line.mRightWidget->castType<MyGUI::TextBox>(false);
if (second) if (second)
(it->mLeftWidget)->setSize(width - 8 - second->getTextSize().width, lineHeight); line.mLeftWidget->setSize(width - 8 - second->getTextSize().width, lineHeight);
} }
height += lineHeight; height += lineHeight;

View file

@ -1,6 +1,7 @@
#ifndef OPENMW_GUI_SPELLVIEW_H #ifndef OPENMW_GUI_SPELLVIEW_H
#define OPENMW_GUI_SPELLVIEW_H #define OPENMW_GUI_SPELLVIEW_H
#include <memory>
#include <tuple> #include <tuple>
#include <MyGUI_Widget.h> #include <MyGUI_Widget.h>

View file

@ -1,10 +1,9 @@
#include "spellwindow.hpp" #include "spellwindow.hpp"
#include <boost/format.hpp>
#include <MyGUI_EditBox.h> #include <MyGUI_EditBox.h>
#include <MyGUI_InputManager.h> #include <MyGUI_InputManager.h>
#include <components/misc/stringops.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
@ -157,7 +156,7 @@ namespace MWGui
mSpellToDelete = spellId; mSpellToDelete = spellId;
ConfirmationDialog* dialog = MWBase::Environment::get().getWindowManager()->getConfirmationDialog(); ConfirmationDialog* dialog = MWBase::Environment::get().getWindowManager()->getConfirmationDialog();
std::string question = MWBase::Environment::get().getWindowManager()->getGameSettingString("sQuestionDeleteSpell", "Delete %s?"); std::string question = MWBase::Environment::get().getWindowManager()->getGameSettingString("sQuestionDeleteSpell", "Delete %s?");
question = boost::str(boost::format(question) % spell->mName); Misc::StringUtils::replace(question, "%s", spell->mName.c_str(), 2);
dialog->askForConfirmation(question); dialog->askForConfirmation(question);
dialog->eventOkClicked.clear(); dialog->eventOkClicked.clear();
dialog->eventOkClicked += MyGUI::newDelegate(this, &SpellWindow::onDeleteSpellAccept); dialog->eventOkClicked += MyGUI::newDelegate(this, &SpellWindow::onDeleteSpellAccept);

View file

@ -278,11 +278,9 @@ namespace MWGui
std::set<int> skillSet; std::set<int> skillSet;
std::copy(major.begin(), major.end(), std::inserter(skillSet, skillSet.begin())); std::copy(major.begin(), major.end(), std::inserter(skillSet, skillSet.begin()));
std::copy(minor.begin(), minor.end(), std::inserter(skillSet, skillSet.begin())); std::copy(minor.begin(), minor.end(), std::inserter(skillSet, skillSet.begin()));
boost::array<ESM::Skill::SkillEnum, ESM::Skill::Length>::const_iterator end = ESM::Skill::sSkillIds.end();
mMiscSkills.clear(); mMiscSkills.clear();
for (boost::array<ESM::Skill::SkillEnum, ESM::Skill::Length>::const_iterator it = ESM::Skill::sSkillIds.begin(); it != end; ++it) for (const int skill : ESM::Skill::sSkillIds)
{ {
int skill = *it;
if (skillSet.find(skill) == skillSet.end()) if (skillSet.find(skill) == skillSet.end())
mMiscSkills.push_back(skill); mMiscSkills.push_back(skill);
} }
@ -435,16 +433,11 @@ namespace MWGui
addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString(titleId, titleDefault), coord1, coord2); addGroup(MWBase::Environment::get().getWindowManager()->getGameSettingString(titleId, titleDefault), coord1, coord2);
SkillList::const_iterator end = skills.end(); for (const int skillId : skills)
for (SkillList::const_iterator it = skills.begin(); it != end; ++it)
{ {
int skillId = *it;
if (skillId < 0 || skillId >= ESM::Skill::Length) // Skip unknown skill indexes if (skillId < 0 || skillId >= ESM::Skill::Length) // Skip unknown skill indexes
continue; continue;
const std::string &skillNameId = ESM::Skill::sSkillNameIds[skillId]; const std::string &skillNameId = ESM::Skill::sSkillNameIds[skillId];
const MWMechanics::SkillValue &stat = mSkillValues.find(skillId)->second;
int base = stat.getBase();
int modified = stat.getModified();
const MWWorld::ESMStore &esmStore = const MWWorld::ESMStore &esmStore =
MWBase::Environment::get().getWorld()->getStore(); MWBase::Environment::get().getWorld()->getStore();
@ -456,13 +449,9 @@ namespace MWGui
const ESM::Attribute* attr = const ESM::Attribute* attr =
esmStore.get<ESM::Attribute>().find(skill->mData.mAttribute); esmStore.get<ESM::Attribute>().find(skill->mData.mAttribute);
std::string state = "normal";
if (modified > base)
state = "increased";
else if (modified < base)
state = "decreased";
std::pair<MyGUI::TextBox*, MyGUI::TextBox*> widgets = addValueItem(MWBase::Environment::get().getWindowManager()->getGameSettingString(skillNameId, skillNameId), std::pair<MyGUI::TextBox*, MyGUI::TextBox*> widgets = addValueItem(MWBase::Environment::get().getWindowManager()->getGameSettingString(skillNameId, skillNameId),
MyGUI::utility::toString(static_cast<int>(modified)), state, coord1, coord2); "", "normal", coord1, coord2);
mSkillWidgetMap[skillId] = widgets;
for (int i=0; i<2; ++i) for (int i=0; i<2; ++i)
{ {
@ -473,27 +462,9 @@ namespace MWGui
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Caption_SkillAttribute", "#{sGoverningAttribute}: #{" + attr->mName + "}"); mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Caption_SkillAttribute", "#{sGoverningAttribute}: #{" + attr->mName + "}");
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("ImageTexture_SkillImage", icon); mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("ImageTexture_SkillImage", icon);
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Range_SkillProgress", "100"); mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Range_SkillProgress", "100");
if (base < 100)
{
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Visible_SkillMaxed", "false");
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("UserData^Hidden_SkillMaxed", "true");
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Visible_SkillProgressVBox", "true");
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("UserData^Hidden_SkillProgressVBox", "false");
setSkillProgress(mSkillWidgets[mSkillWidgets.size()-1-i], stat.getProgress(), skillId);
}
else
{
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Visible_SkillMaxed", "true");
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("UserData^Hidden_SkillMaxed", "false");
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("Visible_SkillProgressVBox", "false");
mSkillWidgets[mSkillWidgets.size()-1-i]->setUserString("UserData^Hidden_SkillProgressVBox", "true");
}
} }
mSkillWidgetMap[skillId] = widgets; setValue(static_cast<ESM::Skill::SkillEnum>(skillId), mSkillValues.find(skillId)->second);
} }
} }
@ -501,9 +472,9 @@ namespace MWGui
{ {
mChanged = false; mChanged = false;
for (std::vector<MyGUI::Widget*>::iterator it = mSkillWidgets.begin(); it != mSkillWidgets.end(); ++it) for (MyGUI::Widget* widget : mSkillWidgets)
{ {
MyGUI::Gui::getInstance().destroyWidget(*it); MyGUI::Gui::getInstance().destroyWidget(widget);
} }
mSkillWidgets.clear(); mSkillWidgets.clear();
@ -552,11 +523,11 @@ namespace MWGui
const std::set<std::string> &expelled = PCstats.getExpelled(); const std::set<std::string> &expelled = PCstats.getExpelled();
bool firstFaction=true; bool firstFaction=true;
FactionList::const_iterator end = mFactions.end(); for (auto& factionPair : mFactions)
for (FactionList::const_iterator it = mFactions.begin(); it != end; ++it)
{ {
const std::string& factionId = factionPair.first;
const ESM::Faction *faction = const ESM::Faction *faction =
store.get<ESM::Faction>().find(it->first); store.get<ESM::Faction>().find(factionId);
if (faction->mData.mIsHidden == 1) if (faction->mData.mIsHidden == 1)
continue; continue;
@ -577,11 +548,11 @@ namespace MWGui
text += std::string("#{fontcolourhtml=header}") + faction->mName; text += std::string("#{fontcolourhtml=header}") + faction->mName;
if (expelled.find(it->first) != expelled.end()) if (expelled.find(factionId) != expelled.end())
text += "\n#{fontcolourhtml=normal}#{sExpelled}"; text += "\n#{fontcolourhtml=normal}#{sExpelled}";
else else
{ {
int rank = it->second; int rank = factionPair.second;
rank = std::max(0, std::min(9, rank)); rank = std::max(0, std::min(9, rank));
text += std::string("\n#{fontcolourhtml=normal}") + faction->mRanks[rank]; text += std::string("\n#{fontcolourhtml=normal}") + faction->mRanks[rank];

Some files were not shown because too many files have changed in this diff Show more