mirror of
https://github.com/OpenMW/openmw.git
synced 2025-06-24 17:11:33 +00:00
Merge branch 'master' into dialoguefix
This commit is contained in:
commit
2c57abc245
430 changed files with 10244 additions and 3451 deletions
|
@ -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
|
||||||
|
|
87
AUTHORS.md
87
AUTHORS.md
|
@ -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
|
||||||
|
Jackerty
|
||||||
Jacob Essex (Yacoby)
|
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.
|
||||||
|
|
29
CHANGELOG.md
29
CHANGELOG.md
|
@ -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 #4837: CTD when a mesh with NiLODNode root node with particles is loaded
|
||||||
Bug #4841: Russian localization ignores implicit keywords
|
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
|
||||||
------
|
------
|
||||||
|
|
|
@ -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} \
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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?
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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}";
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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}},
|
||||||
|
|
|
@ -208,24 +208,24 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
Loading…
Reference in a new issue