From c822b1fa35d0289ad188b8bdd2bb9dc1417ca8f2 Mon Sep 17 00:00:00 2001
From: HiPhish
Date: Mon, 8 Feb 2016 09:56:51 +0100
Subject: [PATCH 001/321] Write chapters about tables and record types.
The "Tables", "Record Types" and "Record Filters" chapters have been
adapted from the already existing manual.
---
docs/cs-manual/source/record-filters.rst | 293 +++++++++++++++++++++++
docs/cs-manual/source/record-types.rst | 62 +++++
docs/cs-manual/source/tables.rst | 168 +++++++++++++
docs/source/openmw-cs/index.rst | 3 +
4 files changed, 526 insertions(+)
create mode 100644 docs/cs-manual/source/record-filters.rst
create mode 100644 docs/cs-manual/source/record-types.rst
create mode 100644 docs/cs-manual/source/tables.rst
diff --git a/docs/cs-manual/source/record-filters.rst b/docs/cs-manual/source/record-filters.rst
new file mode 100644
index 000000000..3379f557f
--- /dev/null
+++ b/docs/cs-manual/source/record-filters.rst
@@ -0,0 +1,293 @@
+Record Filters
+##############
+
+Filters are a key element of the OpenMW CS user interface, they allow rapid and
+easy access to records presented in all tables. In order to use this
+application effectively you need to familiarise yourself with all the concepts
+and instructions explained in this chapter. The filter system is somewhat
+unusual at first glance, but once you understand the basics it will be fairly
+intuitive and easy to use
+
+Filters are a key element to using the OpenMW CS efficiently by allowing you to
+narrow down the table entries very quickly and find what you are looking for.
+The filter system might appear unusual at first, you don't just type in a word
+and get all instances where it occurs, instead filters are first-class objects
+in the CS with their own table. This allows you to define very specific filters
+for your project and store them on disc to use in the next session. The CS
+allows you fine-grained control, you can choose whether to make a filter
+persistent between session, only for one session or use a one-off filter by
+typing it directly into the filter field.
+
+
+
+Terms used
+**********
+
+Filter
+ A Filter is generally speaking a tool able to filter the elements of a
+ table, that is select some elements while discarding others, according to
+ some criteria. These criteria are written using their own syntax.
+
+Criterion
+ A criterion describes some condition a record needs to satisfy in order to
+ be selected. They are written using a special syntax which is explained
+ below. We can logically combine multiple criteria in a filter for finer
+ control.
+
+Expression
+ Expressions are how we perform filtering. They look like functions in a
+ programming language: they have a name and accept a number of arguments.
+ The expression evaluates to either ``true`` or ``false`` for every record in
+ the table. The arguments are expressions themselves.
+
+Arity
+ The arity of an expression tells us how many arguments it takes. Expressions
+ taking no arguments are called *nullary*, those taking one argument are
+ known as *unary* expressions and those taking two arguments are called
+ *binary*.
+
+
+
+Interface
+*********
+
+Above each table there is a text field which is used to enter a filter: either
+one predefined by the OpenMW CS developers or one made by you. Another
+important element is the filter table found under *View* → *Filters*. You
+should see the default filters made by the OpenMW team in the table. The table
+has the columns *Filter*, *Description* and *Modified*.
+
+ID
+ A unique name used to refer to this filter. Note that every ID has a
+ scope prefix, we will explain these soon.
+
+Modified
+ This is the same as for all the other records, it tells us whether the
+ filter is *added* or *removed*. Filters are specific to a project instead of
+ a content file, they have no effect on the game itself.
+
+Filter
+ The actual contents of the filter are given here using the filter syntax.
+ Change the expressions to modify what the filter returns.
+
+Description
+ A textual description of what the filter does.
+
+
+
+Using predefined filters
+************************
+
+To use a filter you have to type its ID into the filter field above a table.
+
+For instance, try to opening the objects table (under the world menu) and type
+into the filters field ``project::weapons``. As soon as you complete the text
+the table will show only the weapons. The string ``project::weapons`` is the ID
+of one of the predefined filters. This means that in order to use the filter
+inside the table you type its name inside the filter field.
+
+Filter IDs follow these general conventions:
+
+- IDs of filters for a specific record type contain usually the name of a
+ specific group. For instance the ``project::weapons`` filter contains the
+ term ``weapons``. Plural form is always used.
+
+- When filtering a specific subgroup the ID is prefixed with the name of the
+ more general filter. For instance ``project::weaponssilver`` will filter only
+ silver weapons and ``project::weaponsmagical`` will filter only magical
+ weapons.
+
+- There are few exceptions from the above rule. For instance there are
+ ``project::added``, ``project::removed``, ``project::modified`` and
+ ``project::base``. You might except something more like
+ ``project::statusadded`` but in this case requiring these extra characters
+ would not improve readability.
+
+We strongly recommend you take a look at the filters table right now to see
+what you can filter with the defaults. Try using the default filters first
+before writing you own.
+
+
+
+Writing your own filters
+************************
+
+As mentioned before, filters are just another type of record in the OpenMW CS.
+To create a new filter you will have to add a new record to the *Filters* table
+and set its properties to your liking. Filters are created by combining
+existing filters into more complex ones.
+
+
+Scopes
+======
+
+Every default filter has the prefix ``project``. This is a *scpoe*, a mechanism
+that determines the lifetime of the filter. These are the supported scopes:
+
+``project::``
+ Indicates that the filter is to be used throughout the project in multiple
+ sessions. You can restart the CS and the filter will still be there.
+
+``session::``
+ Indicates that the filter is not stored between multiple sessions and once
+ you quit the OpenMW CS application the filter will be gone. Until then it
+ can be found inside the filters table.
+
+Project-filters are stored in an internal project file, not final content file
+meant for the player. Keep in mind when collaborating with other modders that
+you need to share the same project file.
+
+
+
+Writing expressions
+===================
+
+The syntax for expressions is as follows:
+
+.. code-block::
+
+
+ ()
+ (, , ..., )
+
+Where ```` is the name of the expression, such as ``string`` and the
+```` are expressions themselves. A nullary expression consists only of its
+name. A unary expression contains its argument within a pair of parentheses
+following the name. If there is more than one argument they are separated by
+commas inside the parentheses.
+
+An example of a binary expression is ``string("Record Type", weapon)``; the
+name is ``string``, and it takes two arguments which are strings of string
+type. The meaning of arguments depends on the expression itself. In this case
+the first argument is the name of a record column and the second field is the
+values we want to test it against.
+
+Strings are sequences of characters and are case-insensitive. If a string
+contains spaces it must be quoted, otherwise the quotes are optional and
+ignored.
+
+
+Constant Expressions
+--------------------
+
+These expressions take no arguments and always return the same result.
+
+``true``
+ Always evaluates to ``true``.
+
+``false``
+ Always evaluates to ``false``.
+
+
+Comparison Expressions
+----------------------
+
+``string(, )``
+ The ```` is a regular expression pattern. The expressions evaluates
+ to ``true`` when the value of a record in ```` matches the pattern.
+ Since the majority of the columns contain string values, ``string`` is among
+ the most often used expressions. Examples:
+
+ ``string("Record Type", "Weapon")``
+ Will evaluate to ``true`` for all records containing ``Weapon`` in the
+ *Record Type* column cell.
+
+ ``string("Portable", "true")``
+ Will evaluate to ``true`` [#]_ for all records containing word ``true`` inside
+ *Portable* column cell.
+
+.. [#] There is no Boolean (``true`` or ``false``) value in the OpenMW CS. You
+ should use a string for those.
+
+
+``value(, (, ))``
+ Match a value type, such as a number, with a range of possible values. The
+ argument ```` is the string name of the value we want to compare, the
+ second argument is a pair of lower and upper bounds for the range interval.
+
+ One can use either parentheses ``()`` or brackets ``[]`` to surround the
+ pair. Brackets are inclusive and parentheses are exclusive. We can also mix
+ both styles:
+
+ .. code::
+
+ value("Weight", [20, 50))
+
+ This will match any objects with a weight greater or equal to 20 and
+ strictly less than 50.
+
+
+Logical Expressions
+-------------------
+
+``not ``
+ Logically negates the result of an expression. If ```` evaluates
+ to ``true`` the negation is ``false``, and if ```` evaluates to
+ ``false`` the negation is ``true``. Note that there are no parentheses
+ around the argument.
+
+``or(, , ..., )``
+ Logical disjunction, evaluates to ``true`` if at least one argument
+ evaluates to ``true`` as well, otherwise the expression evaluates to
+ ``false``.
+
+ As an example assume we want to filter for both NPCs and creatures; the
+ expression for that use-case is
+
+ .. code::
+
+ or(string("record type", "npc"), string("record type", "creature"))
+
+ In this particular case only one argument can evaluate to ``true``, but one
+ can write expressions where multiple arguments can be ``true`` at a time.
+
+``or(, , ..., )``
+ Logical conjunction, evaluates to ``true`` if and only if all arguments
+ evaluate to ``true`` as well, otherwise the expression evaluates to
+ ``false``.
+
+ As an example assume we want to filter for weapons weighting less than a hundred
+ units The expression for that use-case is
+
+ .. code::
+
+ and(string("record type", "weapon"), value("weight", (0, 100)))
+
+
+Anonymous filters
+=================
+
+Creating a whole new filter when you only intend to use it once can be
+cumbersome. For that reason the OpenMW CS supports *anonymous* filters which
+can be typed directly into the filters field of a table. They are not stored
+anywhere, when you clear the field the filter is gone forever.
+
+In order to define an anonymous filter you type an exclamation mark as the
+first character into the field followed by the filter definition (e.g.
+``!string("Record Type", weapon)`` to filter only for weapons).
+
+
+
+Creating and saving filters
+***************************
+
+Filters are managed the same way as other records: go to the filters table,
+right click and select the option *Add Record* from the context menu. You are
+given a choice between project- or session scope. Choose the scope from the
+dropdown and type in your desired ID for the filter. A newly created filter
+does nothing since it still lacks expressions. In order to add your queries you
+have to edit the filter record.
+
+
+Replacing the default filters set
+=================================
+
+OpenMW CS allows you to substitute the default filter set for the entire
+application. This will affect the default filters for all content files that
+have not been edited on this computer and user account.
+
+Create a new content file, add the desired filters, remove the undesired ones
+and save. Now rename the *project* file to ``defaultfilters`` and make sure the
+``.omwaddon.project`` file extension is removed. This file will act as a
+template for all new files from now on. If you wish to go back to the
+old default set rename or remove this custom file.
diff --git a/docs/cs-manual/source/record-types.rst b/docs/cs-manual/source/record-types.rst
new file mode 100644
index 000000000..3742cc9e8
--- /dev/null
+++ b/docs/cs-manual/source/record-types.rst
@@ -0,0 +1,62 @@
+Record Types
+############
+
+A game world contains many items, such as chests, weapons and monsters. All
+these items are merely instances of templates we call *Objects*. The OpenMW CS
+*Objects* table contains information about each of these template objects, such
+as its value and weight in the case of items, or an aggression level in the
+case of NPCs.
+
+The following is a list of all Record Types and what you can tell OpenMW CS
+about each of them.
+
+Activator
+ Activators can have a script attached to them. As long as the cell this
+ object is in is active the script will be run once per frame.
+
+Potion
+ This is a potion which is not self-made. It has an Icon for your inventory,
+ weight, coin value, and an attribute called *Auto Calc* set to ``False``.
+ This means that the effects of this potion are pre-configured. This does not
+ happen when the player makes their own potion.
+
+Apparatus
+ This is a tool to make potions. Again there’s an icon for your inventory as
+ well as a weight and a coin value. It also has a *Quality* value attached to
+ it: the higher the number, the better the effect on your potions will be.
+ The *Apparatus Type* describes if the item is a *Calcinator*, *Retort*,
+ *Alembic* or *Mortar & Pestle*.
+
+Armor
+ This type of item adds *Enchantment Points* to the mix. Every piece of
+ clothing or armor has a "pool" of potential *Magicka* that gets unlocked
+ when the player enchants it. Strong enchantments consume more magicka from
+ this pool: the stronger the enchantment, the more *Enchantment Points* each
+ cast will take up. *Health* means the amount of hit points this piece of
+ armor has. If it sustains enough damage, the armor will be destroyed.
+ Finally, *Armor Value* tells the game how much points to add to the player
+ character’s *Armor Rating*.
+
+Book
+ This includes scrolls and notes. For the game to make the distinction
+ between books and scrolls, an extra property, *Scroll*, has been added.
+ Under the *Skill* column a scroll or book can have an in-game skill listed.
+ Reading this item will raise the player’s level in that specific skill.
+
+Clothing
+ These items work just like armors, but confer no protective properties.
+ Rather than *Armor Type*, these items have a *Clothing Type*.
+
+Container
+ This is all the stuff that stores items, from chests to sacks to plants. Its
+ *Capacity* shows how much stuff you can put in the container. You can
+ compare it to the maximum allowed load a player character can carry. A
+ container, however, will just refuse to take the item in question when it
+ gets "over-encumbered". Organic Containers are containers such as plants.
+ Containers that respawn are not safe to store stuff in. After a certain
+ amount of time they will reset to their default contents, meaning that
+ everything in them is gone forever.
+
+Creature
+ These can be monsters, animals and the like.
+
diff --git a/docs/cs-manual/source/tables.rst b/docs/cs-manual/source/tables.rst
new file mode 100644
index 000000000..43da03f07
--- /dev/null
+++ b/docs/cs-manual/source/tables.rst
@@ -0,0 +1,168 @@
+Tables
+######
+
+If you have launched OpenMW CS already and played around with it for a bit, you
+will have noticed that the interface is made entirely of tables. This does not
+mean it works just like a spreadsheet application though, it would be more
+accurate to think of databases instead. Due to the vast amounts of information
+involved with Morrowind tables made the most sense. You have to be able to spot
+information quickly and be able to change them on the fly.
+
+
+Used Terms
+**********
+
+Record
+ An entry in OpenMW CS representing an item, location, sound, NPC or anything
+ else.
+
+Instance, Object
+ When an item is placed in the world, it does not create a whole new record
+ each time, but an *instance* of the *object*.
+
+ For example, the game world might contain a lot of exquisite belts on
+ different NPCs and in many crates, but they all refer to one specific
+ instance: the Exquisite Belt record. In this case, all those belts in crates
+ and on NPCs are instances. The central Exquisite Belt instance is called an
+ *object*. This allows modders to make changes to all items of the same type
+ in one place.
+
+ If you wanted all exquisite belts to have 4000 enchantment points rather
+ than 400, you would only need to change the object Exquisite Belt rather
+ than all exquisite belt instances individually.
+
+Some columns are recurring throughout OpenMW CS, they show up in (nearly) every
+table.
+
+ID
+ Each item, location, sound, etc. gets the same unique identifier in both
+ OpenMW CS and Morrowind. This is usually a very self-explanatory name. For
+ example, the ID for the (unique) black pants of Caius Cosades is
+ ``Caius_pants``. This allows players to manipulate the game in many ways.
+ For example, they could add these pants to their inventory by opening the
+ console and entering: ``player- >addItem Caius_pants``. In both Morrowind
+ and OpenMW CS the ID is the primary way to identify all these different
+ parts of the game.
+
+Modified
+ This column shows what has happened (if anything) to this record. There are
+ four possible states in which it can exist:
+
+ Base
+ The record is unmodified and from a content file other than the one
+ currently being edited.
+
+ Added
+ This record has been added in the currently content file.
+
+ Modified
+ Similar to *base*, but has been changed in some way.
+
+ Deleted
+ Similar to *base*, but has been removed as an entry. This does not mean,
+ however, that the occurrences in the game itself have been removed! For
+ example, if you were to remove the ``CharGen_Bed`` entry from
+ ``morrowind.esm``, it does not mean the bedroll in the basement of the
+ Census and Excise Office in Seyda Neen will be gone. You will have to
+ delete that instance yourself or make sure that that object is replaced
+ by something that still exists otherwise the player will get crashes in
+ the worst case scenario.
+
+
+
+World Screens
+*************
+
+The contents of the game world can be changed by choosing one of the options in
+the appropriate menu at the top of the screen.
+
+
+Regions
+=======
+
+This describes the general areas of Vvardenfell. Each of these areas has
+different rules about things such as encounters and weather.
+
+Name
+ This is how the game will show the player's location in-game.
+
+MapColour
+ This is a six-digit hexadecimal representation of the colour used to
+ identify the region on the map available in *World* → *Region Map*.
+
+Sleep Encounter
+ These are the rules for what kinds of enemies the player might encounter
+ when sleeping outside in the wilderness.
+
+
+Cells
+=====
+
+Expansive worlds such as Vvardenfell, with all its items, NPCs, etc. have a lot
+going on simultaneously. But if the player is in Balmora, why would the
+computer need to keep track the exact locations of NPCs walking through the
+corridors in a Vivec canton? All that work would be quite useless and bring
+the player's system down to its knees! So the world has been divided up into
+squares we call *cells*. Once your character enters a cell, the game will load
+everything that is going on in that cell so the player can interact with it.
+
+In the original Morrowind this could be seen when a small loading bar would
+appear near the bottom of the screen while travelling; the player had just
+entered a new cell and the game had to load all the items and NPCs. The *Cells*
+screen in OpenMW CS provides you with a list of cells in the game, both the
+interior cells (houses, dungeons, mines, etc.) and the exterior cells (the
+outside world).
+
+Sleep Forbidden
+ Can the player sleep on the floor? In most cities it is forbidden to sleep
+ outside. Sleeping in the wilderness carries its own risks of attack, though,
+ and this entry lets you decide if a player should be allowed to sleep on the
+ floor in this cell or not.
+
+Interior Water
+ Should water be rendered in this interior cell? The game world consists of
+ an endless ocean at height 0, then the landscape is added. If part of the
+ landscape goes below height 0, the player will see water.
+
+ Setting the cell’s Interior Water to true tells the game that this cell that
+ there needs to be water at height 0. This is useful for dungeons or mines
+ that have water in them.
+
+ Setting the cell’s Interior Water to ``false`` tells the game that the water
+ at height 0 should not be used. This flag is useless for outside cells.
+
+Interior Sky
+ Should this interior cell have a sky? This is a rather unique case. The
+ Tribunal expansion took place in a city on the mainland. Normally this would
+ require the city to be composed of exterior cells so it has a sky, weather
+ and the like. But if the player is in an exterior cell and were to look at
+ their in-game map, they would see Vvardenfell with an overview of all
+ exterior cells. The player would have to see the city’s very own map, as if
+ they were walking around in an interior cell.
+
+ So the developers decided to create a workaround and take a bit of both: The
+ whole city would technically work exactly like an interior cell, but it
+ would need a sky as if it was an exterior cell. That is what this is. This
+ is why the vast majority of the cells you will find in this screen will have
+ this option set to false: It is only meant for these "fake exteriors".
+
+Region
+ To which Region does this cell belong? This has an impact on the way the
+ game handles weather and encounters in this area. It is also possible for a
+ cell not to belong to any region.
+
+
+Objects
+=======
+
+This is a library of all the items, triggers, containers, NPCs, etc. in the
+game. There are several kinds of Record Types. Depending on which type a record
+is, it will need specific information to function. For example, an NPC needs a
+value attached to its aggression level. A chest, of course, does not. All
+Record Types contain at least a 3D model or else the player would not see them.
+Usually they also have a *Name*, which is what the players sees when they hover
+their reticle over the object during the game.
+
+Please refer to the Record Types chapter for an overview of what each type of
+object does and what you can tell OpenMW CS about these objects.
+
diff --git a/docs/source/openmw-cs/index.rst b/docs/source/openmw-cs/index.rst
index dcd28081a..b9c03980b 100644
--- a/docs/source/openmw-cs/index.rst
+++ b/docs/source/openmw-cs/index.rst
@@ -22,4 +22,7 @@ few chapters to familiarise yourself with the new interface.
tour
files-and-directories
starting-dialog
+ tables
+ record-types
+ record-filters
From 97924d97c785fda67f690ad49d9b624996526fc8 Mon Sep 17 00:00:00 2001
From: Daniel Vukelich
Date: Fri, 12 Jan 2018 20:02:43 -0500
Subject: [PATCH 002/321] Add the option for multiple quicksave slots
With more than 1 quicksave slot, slots will be created each time you
quicksave until the maximum number (configured in settings) of
quicksaves has been reached. After that, the oldest quicksave slot will
be replaced each time you quicksave. Saves are numbered sequentially,
unless the maximum number of slots is 1, in which case it is not numbered.
---
apps/openmw/CMakeLists.txt | 3 +-
apps/openmw/mwstate/quicksavemanager.cpp | 73 +++++++++++++++++++
apps/openmw/mwstate/quicksavemanager.hpp | 42 +++++++++++
apps/openmw/mwstate/statemanagerimp.cpp | 17 +++--
.../reference/modding/settings/saves.rst | 13 +++-
files/settings-default.cfg | 8 +-
6 files changed, 146 insertions(+), 10 deletions(-)
create mode 100644 apps/openmw/mwstate/quicksavemanager.cpp
create mode 100644 apps/openmw/mwstate/quicksavemanager.hpp
diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt
index 491394324..6e97df297 100644
--- a/apps/openmw/CMakeLists.txt
+++ b/apps/openmw/CMakeLists.txt
@@ -89,7 +89,7 @@ add_openmw_dir (mwmechanics
)
add_openmw_dir (mwstate
- statemanagerimp charactermanager character
+ statemanagerimp charactermanager character quicksavemanager
)
add_openmw_dir (mwbase
@@ -223,4 +223,3 @@ endif (MSVC)
if (WIN32)
INSTALL(TARGETS openmw RUNTIME DESTINATION ".")
endif (WIN32)
-
diff --git a/apps/openmw/mwstate/quicksavemanager.cpp b/apps/openmw/mwstate/quicksavemanager.cpp
new file mode 100644
index 000000000..3ead7165a
--- /dev/null
+++ b/apps/openmw/mwstate/quicksavemanager.cpp
@@ -0,0 +1,73 @@
+#include "quicksavemanager.hpp"
+
+#include
+
+MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, int maxSaves){
+ this->saveName = saveName;
+ this->maxSaves = maxSaves;
+ this->oldestSlotVisited = NULL;
+ this->oldestSlotId = 0;
+ this->slotsVisited = 0;
+}
+
+void MWState::QuickSaveManager::visitSave(const Slot *saveSlot){
+ int slotId;
+ if(tryExtractSlotId(saveSlot->mProfile.mDescription, slotId)){
+ ++slotsVisited;
+ if(isOldestSave(saveSlot)){
+ oldestSlotVisited = saveSlot;
+ oldestSlotId = slotId;
+ }
+ }
+}
+
+bool MWState::QuickSaveManager::isOldestSave(const Slot *compare){
+ if(oldestSlotVisited == NULL)
+ return true;
+ return (compare->mTimeStamp < oldestSlotVisited->mTimeStamp);
+}
+
+bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, int &extractedId){
+ std::istringstream formattedExtractor = std::istringstream(slotName);
+
+ std::string nameToTest;
+ formattedExtractor >> nameToTest;
+ if(nameToTest == saveName){
+ //Only try to extract the id if maxSaves > 1
+ //With maxSaves == 1, we don't append the slotId to the name
+ if(formattedExtractor >> extractedId)
+ return (isSlotIdValid(extractedId));
+ else if(maxSaves == 1)
+ return formattedExtractor.eof();
+ }
+ return false;
+}
+
+bool MWState::QuickSaveManager::isSlotIdValid(int slotId){
+ return (slotId > 0 && slotId <= maxSaves);
+}
+
+bool MWState::QuickSaveManager::shouldCreateNewSlot(){
+ return (slotsVisited < maxSaves);
+}
+
+const MWState::Slot *MWState::QuickSaveManager::getNextQuickSaveSlot(){
+ if(shouldCreateNewSlot())
+ return NULL;
+ return oldestSlotVisited;
+}
+
+std::string MWState::QuickSaveManager::getNextQuickSaveName(){
+ std::ostringstream nameFormatter;
+ nameFormatter << saveName;
+ //Only print the number if there will be more than 1
+ if(maxSaves > 1)
+ nameFormatter << " " << calcNextSlotId();
+ return nameFormatter.str();
+}
+
+int MWState::QuickSaveManager::calcNextSlotId(){
+ if(shouldCreateNewSlot())
+ return (slotsVisited + 1);
+ return oldestSlotId;
+}
diff --git a/apps/openmw/mwstate/quicksavemanager.hpp b/apps/openmw/mwstate/quicksavemanager.hpp
new file mode 100644
index 000000000..04341897f
--- /dev/null
+++ b/apps/openmw/mwstate/quicksavemanager.hpp
@@ -0,0 +1,42 @@
+#ifndef GAME_STATE_QUICKSAVEMANAGER_H
+#define GAME_STATE_QUICKSAVEMANAGER_H
+
+#include "character.hpp"
+#include "../mwbase/statemanager.hpp"
+
+#include
+
+namespace MWState{
+ class QuickSaveManager{
+ std::string saveName;
+ int maxSaves;
+ int slotsVisited;
+ int oldestSlotId;
+ const Slot *oldestSlotVisited;
+ private:
+ bool tryExtractSlotId(const std::string &slotName, int &extractedIdll);
+ bool isSlotIdValid(int slotId);
+ bool shouldCreateNewSlot();
+ bool isOldestSave(const Slot *compare);
+ int calcNextSlotId();
+ public:
+ QuickSaveManager(std::string &saveName, int maxSaves);
+ ///< A utility class to manage multiple quicksave slots
+ ///
+ /// \param saveName The name of the save ("QuickSave", "AutoSave", etc)
+ /// \param maxSaves The maximum number of save slots to use before recycling old ones
+
+ void visitSave(const Slot *saveSlot);
+ ///< Visits the given \a slot \a
+
+ const Slot *getNextQuickSaveSlot();
+ ///< Get the slot that the next quicksave should use.
+ ///
+ ///\return Either the oldest quicksave slot visited, or NULL if a new slot can be made
+
+ std::string getNextQuickSaveName();
+ ///< Get the name that the next quicksave should use ("QuickSave 1", "AutoSave 10", etc)
+ };
+}
+
+#endif
diff --git a/apps/openmw/mwstate/statemanagerimp.cpp b/apps/openmw/mwstate/statemanagerimp.cpp
index 14ee5adee..5b126cbb5 100644
--- a/apps/openmw/mwstate/statemanagerimp.cpp
+++ b/apps/openmw/mwstate/statemanagerimp.cpp
@@ -37,6 +37,8 @@
#include "../mwscript/globalscripts.hpp"
+#include "quicksavemanager.hpp"
+
void MWState::StateManager::cleanup (bool force)
{
if (mState!=State_NoGame || force)
@@ -324,20 +326,25 @@ void MWState::StateManager::quickSave (std::string name)
return;
}
- const Slot* slot = NULL;
+ int maxSaves = Settings::Manager::getInt("max quicksaves", "Saves");
+ if(maxSaves < 1)
+ maxSaves = 1;
+
Character* currentCharacter = getCurrentCharacter(); //Get current character
+ QuickSaveManager saveFinder = QuickSaveManager(name, maxSaves);
- //Find quicksave slot
if (currentCharacter)
{
for (Character::SlotIterator it = currentCharacter->begin(); it != currentCharacter->end(); ++it)
{
- if (it->mProfile.mDescription == name)
- slot = &*it;
+ //Visiting slots allows the quicksave finder to find the oldest quicksave
+ saveFinder.visitSave(&*it);
}
}
- saveGame(name, slot);
+ //Once all the saves have been visited, the save finder can tell us which
+ //one to replace (or create)
+ saveGame(saveFinder.getNextQuickSaveName(), saveFinder.getNextQuickSaveSlot());
}
void MWState::StateManager::loadGame(const std::string& filepath)
diff --git a/docs/source/reference/modding/settings/saves.rst b/docs/source/reference/modding/settings/saves.rst
index 90bd56ca5..f5fd553a9 100644
--- a/docs/source/reference/modding/settings/saves.rst
+++ b/docs/source/reference/modding/settings/saves.rst
@@ -5,7 +5,7 @@ character
---------
:Type: string
-:Range:
+:Range:
:Default: ""
This setting contains the default character name for loading saved games.
@@ -35,3 +35,14 @@ This setting determines whether the amount of the time the player has spent play
for each saved game in the Load menu.
This setting can only be configured by editing the settings configuration file.
+
+max quicksaves
+----------
+
+:Type: integer
+:Range: >0
+:Default: 5
+
+This setting determines how many quicksave and autosave slots you can have at a time. If greater than 1, quicksaves will be sequentially created each time you quicksave. Once the maximum number of quicksaves has been reached, the oldest quicksave will be recycled the next time you perform a quicksave.
+
+This setting can only be configured by editing the settings configuration file.
diff --git a/files/settings-default.cfg b/files/settings-default.cfg
index c694d4db2..3da88b01a 100644
--- a/files/settings-default.cfg
+++ b/files/settings-default.cfg
@@ -7,7 +7,7 @@
# significance of each setting, interaction with other settings, hard
# limits on value ranges and more information in general, please read
# the detailed documentation at:
-#
+#
# http://openmw.readthedocs.io/en/master/reference/modding/settings/index.html
#
@@ -288,6 +288,10 @@ autosave = true
# Display the time played on each save file in the load menu.
timeplayed = false
+# The maximum number of quick (or auto) save slots to have.
+# If all slots are used, the oldest save is reused
+max quicksaves = 5
+
[Sound]
# Name of audio device file. Blank means use the default device.
@@ -376,7 +380,7 @@ reflect actors = false
# Overrides the value in '[Camera] small feature culling pixel size' specifically for water reflection/refraction textures.
small feature culling pixel size = 20.0
-# By what factor water downscales objects. Only works with water shader and refractions on.
+# By what factor water downscales objects. Only works with water shader and refractions on.
refraction scale = 1.0
[Windows]
From f09fd6795c4519523e7ea927106a17e573019d17 Mon Sep 17 00:00:00 2001
From: Daniel Vukelich
Date: Fri, 12 Jan 2018 20:02:43 -0500
Subject: [PATCH 003/321] Follow openmw style guide
---
apps/openmw/mwstate/quicksavemanager.cpp | 74 ++++++++++++++----------
apps/openmw/mwstate/quicksavemanager.hpp | 14 ++---
2 files changed, 50 insertions(+), 38 deletions(-)
diff --git a/apps/openmw/mwstate/quicksavemanager.cpp b/apps/openmw/mwstate/quicksavemanager.cpp
index 3ead7165a..1457f7075 100644
--- a/apps/openmw/mwstate/quicksavemanager.cpp
+++ b/apps/openmw/mwstate/quicksavemanager.cpp
@@ -2,72 +2,84 @@
#include
-MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, int maxSaves){
- this->saveName = saveName;
- this->maxSaves = maxSaves;
- this->oldestSlotVisited = NULL;
- this->oldestSlotId = 0;
- this->slotsVisited = 0;
+MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, int maxSaves)
+{
+ this->mSaveName = saveName;
+ this->mMaxSaves = maxSaves;
+ this->mOldestSlotVisited = NULL;
+ this->mOldestSlotId = 0;
+ this->mSlotsVisited = 0;
}
-void MWState::QuickSaveManager::visitSave(const Slot *saveSlot){
+void MWState::QuickSaveManager::visitSave(const Slot *saveSlot)
+{
int slotId;
- if(tryExtractSlotId(saveSlot->mProfile.mDescription, slotId)){
- ++slotsVisited;
- if(isOldestSave(saveSlot)){
- oldestSlotVisited = saveSlot;
- oldestSlotId = slotId;
+ if(tryExtractSlotId(saveSlot->mProfile.mDescription, slotId))
+ {
+ ++mSlotsVisited;
+ if(isOldestSave(saveSlot))
+ {
+ mOldestSlotVisited = saveSlot;
+ mOldestSlotId = slotId;
}
}
}
-bool MWState::QuickSaveManager::isOldestSave(const Slot *compare){
- if(oldestSlotVisited == NULL)
+bool MWState::QuickSaveManager::isOldestSave(const Slot *compare)
+{
+ if(mOldestSlotVisited == NULL)
return true;
- return (compare->mTimeStamp < oldestSlotVisited->mTimeStamp);
+ return (compare->mTimeStamp <= mOldestSlotVisited->mTimeStamp);
}
-bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, int &extractedId){
- std::istringstream formattedExtractor = std::istringstream(slotName);
+bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, int &extractedId)
+{
+ std::istringstream formattedExtractor(slotName);
std::string nameToTest;
formattedExtractor >> nameToTest;
- if(nameToTest == saveName){
+ if(nameToTest == mSaveName)
+ {
//Only try to extract the id if maxSaves > 1
//With maxSaves == 1, we don't append the slotId to the name
if(formattedExtractor >> extractedId)
return (isSlotIdValid(extractedId));
- else if(maxSaves == 1)
+ else if(mMaxSaves == 1)
return formattedExtractor.eof();
}
return false;
}
-bool MWState::QuickSaveManager::isSlotIdValid(int slotId){
- return (slotId > 0 && slotId <= maxSaves);
+bool MWState::QuickSaveManager::isSlotIdValid(int slotId)
+{
+ return (slotId > 0 && slotId <= mMaxSaves);
}
-bool MWState::QuickSaveManager::shouldCreateNewSlot(){
- return (slotsVisited < maxSaves);
+bool MWState::QuickSaveManager::shouldCreateNewSlot()
+{
+ return (mSlotsVisited < mMaxSaves);
}
-const MWState::Slot *MWState::QuickSaveManager::getNextQuickSaveSlot(){
+const MWState::Slot *MWState::QuickSaveManager::getNextQuickSaveSlot()
+{
if(shouldCreateNewSlot())
return NULL;
- return oldestSlotVisited;
+ return mOldestSlotVisited;
}
-std::string MWState::QuickSaveManager::getNextQuickSaveName(){
+std::string MWState::QuickSaveManager::getNextQuickSaveName()
+{
std::ostringstream nameFormatter;
- nameFormatter << saveName;
+ nameFormatter << mSaveName;
//Only print the number if there will be more than 1
- if(maxSaves > 1)
+ if(mMaxSaves > 1)
nameFormatter << " " << calcNextSlotId();
return nameFormatter.str();
}
-int MWState::QuickSaveManager::calcNextSlotId(){
+int MWState::QuickSaveManager::calcNextSlotId()
+{
if(shouldCreateNewSlot())
- return (slotsVisited + 1);
- return oldestSlotId;
+ return (mSlotsVisited + 1);
+ return mOldestSlotId;
}
diff --git a/apps/openmw/mwstate/quicksavemanager.hpp b/apps/openmw/mwstate/quicksavemanager.hpp
index 04341897f..6a06171d9 100644
--- a/apps/openmw/mwstate/quicksavemanager.hpp
+++ b/apps/openmw/mwstate/quicksavemanager.hpp
@@ -1,18 +1,18 @@
#ifndef GAME_STATE_QUICKSAVEMANAGER_H
#define GAME_STATE_QUICKSAVEMANAGER_H
+#include
+
#include "character.hpp"
#include "../mwbase/statemanager.hpp"
-#include
-
namespace MWState{
class QuickSaveManager{
- std::string saveName;
- int maxSaves;
- int slotsVisited;
- int oldestSlotId;
- const Slot *oldestSlotVisited;
+ std::string mSaveName;
+ int mMaxSaves;
+ int mSlotsVisited;
+ int mOldestSlotId;
+ const Slot *mOldestSlotVisited;
private:
bool tryExtractSlotId(const std::string &slotName, int &extractedIdll);
bool isSlotIdValid(int slotId);
From 3af8f63895c94e1a0268720be0680af83130954b Mon Sep 17 00:00:00 2001
From: Daniel Vukelich
Date: Wed, 17 Jan 2018 21:43:30 -0500
Subject: [PATCH 004/321] Use unsigned integer types for QuickSave indices
---
apps/openmw/mwstate/quicksavemanager.cpp | 8 ++++----
apps/openmw/mwstate/quicksavemanager.hpp | 12 ++++++------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/apps/openmw/mwstate/quicksavemanager.cpp b/apps/openmw/mwstate/quicksavemanager.cpp
index 1457f7075..e49f376d6 100644
--- a/apps/openmw/mwstate/quicksavemanager.cpp
+++ b/apps/openmw/mwstate/quicksavemanager.cpp
@@ -2,7 +2,7 @@
#include
-MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, int maxSaves)
+MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, unsigned int maxSaves)
{
this->mSaveName = saveName;
this->mMaxSaves = maxSaves;
@@ -13,7 +13,7 @@ MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, int maxSaves)
void MWState::QuickSaveManager::visitSave(const Slot *saveSlot)
{
- int slotId;
+ unsigned int slotId;
if(tryExtractSlotId(saveSlot->mProfile.mDescription, slotId))
{
++mSlotsVisited;
@@ -32,7 +32,7 @@ bool MWState::QuickSaveManager::isOldestSave(const Slot *compare)
return (compare->mTimeStamp <= mOldestSlotVisited->mTimeStamp);
}
-bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, int &extractedId)
+bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, unsigned int &extractedId)
{
std::istringstream formattedExtractor(slotName);
@@ -50,7 +50,7 @@ bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, in
return false;
}
-bool MWState::QuickSaveManager::isSlotIdValid(int slotId)
+bool MWState::QuickSaveManager::isSlotIdValid(unsigned int slotId)
{
return (slotId > 0 && slotId <= mMaxSaves);
}
diff --git a/apps/openmw/mwstate/quicksavemanager.hpp b/apps/openmw/mwstate/quicksavemanager.hpp
index 6a06171d9..abe7ef426 100644
--- a/apps/openmw/mwstate/quicksavemanager.hpp
+++ b/apps/openmw/mwstate/quicksavemanager.hpp
@@ -9,18 +9,18 @@
namespace MWState{
class QuickSaveManager{
std::string mSaveName;
- int mMaxSaves;
- int mSlotsVisited;
- int mOldestSlotId;
+ unsigned int mMaxSaves;
+ unsigned int mSlotsVisited;
+ unsigned int mOldestSlotId;
const Slot *mOldestSlotVisited;
private:
- bool tryExtractSlotId(const std::string &slotName, int &extractedIdll);
- bool isSlotIdValid(int slotId);
+ bool tryExtractSlotId(const std::string &slotName, unsigned int &extractedIdll);
+ bool isSlotIdValid(unsigned int slotId);
bool shouldCreateNewSlot();
bool isOldestSave(const Slot *compare);
int calcNextSlotId();
public:
- QuickSaveManager(std::string &saveName, int maxSaves);
+ QuickSaveManager(std::string &saveName, unsigned int maxSaves);
///< A utility class to manage multiple quicksave slots
///
/// \param saveName The name of the save ("QuickSave", "AutoSave", etc)
From 3bdd989a509fd5d1b56c86ed7db3604583407ace Mon Sep 17 00:00:00 2001
From: Daniel Vukelich
Date: Tue, 13 Feb 2018 21:01:15 -0500
Subject: [PATCH 005/321] Remove numeric quicksave slot IDs
When multiple quicksaves occurred in quick succession, the numeric order
of the saves could not be guaranteed. To prevent players from getting
confused as to why their saves appear out of order, don't number them.
---
apps/openmw/mwstate/quicksavemanager.cpp | 49 +-----------------------
apps/openmw/mwstate/quicksavemanager.hpp | 9 +----
apps/openmw/mwstate/statemanagerimp.cpp | 2 +-
3 files changed, 3 insertions(+), 57 deletions(-)
diff --git a/apps/openmw/mwstate/quicksavemanager.cpp b/apps/openmw/mwstate/quicksavemanager.cpp
index e49f376d6..4bae9e674 100644
--- a/apps/openmw/mwstate/quicksavemanager.cpp
+++ b/apps/openmw/mwstate/quicksavemanager.cpp
@@ -1,27 +1,20 @@
#include "quicksavemanager.hpp"
-#include
-
MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, unsigned int maxSaves)
{
this->mSaveName = saveName;
this->mMaxSaves = maxSaves;
this->mOldestSlotVisited = NULL;
- this->mOldestSlotId = 0;
this->mSlotsVisited = 0;
}
void MWState::QuickSaveManager::visitSave(const Slot *saveSlot)
{
- unsigned int slotId;
- if(tryExtractSlotId(saveSlot->mProfile.mDescription, slotId))
+ if(mSaveName == saveSlot->mProfile.mDescription)
{
++mSlotsVisited;
if(isOldestSave(saveSlot))
- {
mOldestSlotVisited = saveSlot;
- mOldestSlotId = slotId;
- }
}
}
@@ -32,29 +25,6 @@ bool MWState::QuickSaveManager::isOldestSave(const Slot *compare)
return (compare->mTimeStamp <= mOldestSlotVisited->mTimeStamp);
}
-bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, unsigned int &extractedId)
-{
- std::istringstream formattedExtractor(slotName);
-
- std::string nameToTest;
- formattedExtractor >> nameToTest;
- if(nameToTest == mSaveName)
- {
- //Only try to extract the id if maxSaves > 1
- //With maxSaves == 1, we don't append the slotId to the name
- if(formattedExtractor >> extractedId)
- return (isSlotIdValid(extractedId));
- else if(mMaxSaves == 1)
- return formattedExtractor.eof();
- }
- return false;
-}
-
-bool MWState::QuickSaveManager::isSlotIdValid(unsigned int slotId)
-{
- return (slotId > 0 && slotId <= mMaxSaves);
-}
-
bool MWState::QuickSaveManager::shouldCreateNewSlot()
{
return (mSlotsVisited < mMaxSaves);
@@ -66,20 +36,3 @@ const MWState::Slot *MWState::QuickSaveManager::getNextQuickSaveSlot()
return NULL;
return mOldestSlotVisited;
}
-
-std::string MWState::QuickSaveManager::getNextQuickSaveName()
-{
- std::ostringstream nameFormatter;
- nameFormatter << mSaveName;
- //Only print the number if there will be more than 1
- if(mMaxSaves > 1)
- nameFormatter << " " << calcNextSlotId();
- return nameFormatter.str();
-}
-
-int MWState::QuickSaveManager::calcNextSlotId()
-{
- if(shouldCreateNewSlot())
- return (mSlotsVisited + 1);
- return mOldestSlotId;
-}
diff --git a/apps/openmw/mwstate/quicksavemanager.hpp b/apps/openmw/mwstate/quicksavemanager.hpp
index abe7ef426..e52cd609f 100644
--- a/apps/openmw/mwstate/quicksavemanager.hpp
+++ b/apps/openmw/mwstate/quicksavemanager.hpp
@@ -11,20 +11,16 @@ namespace MWState{
std::string mSaveName;
unsigned int mMaxSaves;
unsigned int mSlotsVisited;
- unsigned int mOldestSlotId;
const Slot *mOldestSlotVisited;
private:
- bool tryExtractSlotId(const std::string &slotName, unsigned int &extractedIdll);
- bool isSlotIdValid(unsigned int slotId);
bool shouldCreateNewSlot();
bool isOldestSave(const Slot *compare);
- int calcNextSlotId();
public:
QuickSaveManager(std::string &saveName, unsigned int maxSaves);
///< A utility class to manage multiple quicksave slots
///
/// \param saveName The name of the save ("QuickSave", "AutoSave", etc)
- /// \param maxSaves The maximum number of save slots to use before recycling old ones
+ /// \param maxSaves The maximum number of save slots to create before recycling old ones
void visitSave(const Slot *saveSlot);
///< Visits the given \a slot \a
@@ -33,9 +29,6 @@ namespace MWState{
///< Get the slot that the next quicksave should use.
///
///\return Either the oldest quicksave slot visited, or NULL if a new slot can be made
-
- std::string getNextQuickSaveName();
- ///< Get the name that the next quicksave should use ("QuickSave 1", "AutoSave 10", etc)
};
}
diff --git a/apps/openmw/mwstate/statemanagerimp.cpp b/apps/openmw/mwstate/statemanagerimp.cpp
index 5b126cbb5..c1bb589e8 100644
--- a/apps/openmw/mwstate/statemanagerimp.cpp
+++ b/apps/openmw/mwstate/statemanagerimp.cpp
@@ -344,7 +344,7 @@ void MWState::StateManager::quickSave (std::string name)
//Once all the saves have been visited, the save finder can tell us which
//one to replace (or create)
- saveGame(saveFinder.getNextQuickSaveName(), saveFinder.getNextQuickSaveSlot());
+ saveGame(name, saveFinder.getNextQuickSaveSlot());
}
void MWState::StateManager::loadGame(const std::string& filepath)
From 104495a9a432acfbb34f2eb7c9d38766573564d8 Mon Sep 17 00:00:00 2001
From: Daniel Vukelich
Date: Tue, 13 Feb 2018 21:05:24 -0500
Subject: [PATCH 006/321] Set default number of quicksaves to 1
---
docs/source/reference/modding/settings/saves.rst | 2 +-
files/settings-default.cfg | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/source/reference/modding/settings/saves.rst b/docs/source/reference/modding/settings/saves.rst
index f5fd553a9..a3cf5b4e0 100644
--- a/docs/source/reference/modding/settings/saves.rst
+++ b/docs/source/reference/modding/settings/saves.rst
@@ -41,7 +41,7 @@ max quicksaves
:Type: integer
:Range: >0
-:Default: 5
+:Default: 1
This setting determines how many quicksave and autosave slots you can have at a time. If greater than 1, quicksaves will be sequentially created each time you quicksave. Once the maximum number of quicksaves has been reached, the oldest quicksave will be recycled the next time you perform a quicksave.
diff --git a/files/settings-default.cfg b/files/settings-default.cfg
index 3da88b01a..e2a0bdf54 100644
--- a/files/settings-default.cfg
+++ b/files/settings-default.cfg
@@ -290,7 +290,7 @@ timeplayed = false
# The maximum number of quick (or auto) save slots to have.
# If all slots are used, the oldest save is reused
-max quicksaves = 5
+max quicksaves = 1
[Sound]
From 929fc68160a031e17d419af74ed6354bef895dd9 Mon Sep 17 00:00:00 2001
From: Capostrophic
Date: Mon, 26 Feb 2018 23:21:51 +0300
Subject: [PATCH 007/321] Consider items with dead owner not stolen (fixes bug
#4328)
---
apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
index bd5fa1b11..cd3cd1f80 100644
--- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
+++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
@@ -1118,8 +1118,11 @@ namespace MWMechanics
Misc::StringUtils::lowerCaseInPlace(owner.first);
if (!Misc::StringUtils::ciEqual(item.getCellRef().getRefId(), MWWorld::ContainerStore::sGoldId))
- mStolenItems[Misc::StringUtils::lowerCase(item.getCellRef().getRefId())][owner] += count;
-
+ {
+ const MWWorld::Ptr victimRef = MWBase::Environment::get().getWorld()->searchPtr(item.getCellRef().getOwner(), true);
+ if (!victimRef.getClass().getCreatureStats(victimRef).isDead())
+ mStolenItems[Misc::StringUtils::lowerCase(item.getCellRef().getRefId())][owner] += count;
+ }
if (alarm)
commitCrime(ptr, victim, OT_Theft, item.getClass().getValue(item) * count);
}
From 3393ad623fde05ce8957d556ae5430b436c6100a Mon Sep 17 00:00:00 2001
From: bret curtis
Date: Tue, 27 Feb 2018 16:15:43 +0100
Subject: [PATCH 008/321] fix rtd
---
docs/source/conf.py | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/docs/source/conf.py b/docs/source/conf.py
index b18b40c50..e3fe58bc7 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -60,13 +60,29 @@ copyright = u'2017, OpenMW Team'
# The short X.Y version.
# The full version, including alpha/beta/rc tags.
+def get_openmw_version(haystack):
+ needle = 'OPENMW_VERSION_MAJOR'
+ line_counter = 0
+ for hay in haystack:
+ if needle in str(hay):
+ break
+ line_counter += 1
+
+ if line_counter == 0:
+ raise ImportError('Unable to find OpenMW Version')
+
+ version = '.'.join([haystack[line_counter][1][1].contents,
+ haystack[line_counter+1][1][1].contents,
+ haystack[line_counter+2][1][1].contents])
+ return version
+
+
try:
from parse_cmake import parsing
cmake_raw = open(project_root+'/CMakeLists.txt', 'r').read()
cmake_data = parsing.parse(cmake_raw)
- release = version = '.'.join([cmake_data[24][1][1].contents,
- cmake_data[25][1][1].contents,
- cmake_data[26][1][1].contents])
+ release = version = get_openmw_version(cmake_data)
+
except ImportError:
release = "UNRELEASED"
print("WARNING: Unable to import parse_cmake, version will be set to: {0}.".format(release))
From 81d90d7fb725007783a419eeaaf30dcac8a3c6fa Mon Sep 17 00:00:00 2001
From: bret curtis
Date: Tue, 27 Feb 2018 18:57:37 +0100
Subject: [PATCH 009/321] break for all errors that would raise when checking
for version, make them UNRELEASED
---
docs/source/conf.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/docs/source/conf.py b/docs/source/conf.py
index e3fe58bc7..0ba8567c0 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -60,6 +60,9 @@ copyright = u'2017, OpenMW Team'
# The short X.Y version.
# The full version, including alpha/beta/rc tags.
+release = version = "UNRELEASED"
+
+
def get_openmw_version(haystack):
needle = 'OPENMW_VERSION_MAJOR'
line_counter = 0
@@ -68,9 +71,6 @@ def get_openmw_version(haystack):
break
line_counter += 1
- if line_counter == 0:
- raise ImportError('Unable to find OpenMW Version')
-
version = '.'.join([haystack[line_counter][1][1].contents,
haystack[line_counter+1][1][1].contents,
haystack[line_counter+2][1][1].contents])
@@ -83,9 +83,9 @@ try:
cmake_data = parsing.parse(cmake_raw)
release = version = get_openmw_version(cmake_data)
-except ImportError:
- release = "UNRELEASED"
- print("WARNING: Unable to import parse_cmake, version will be set to: {0}.".format(release))
+except Exception as ex:
+ print("WARNING: Version will be set to '{0}' because: '{1}'.".format(release, str(ex)))
+ import traceback; traceback.print_exc()
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
From 4a2e9f2e3d8c9a5bad6fe795d24fb286549f4540 Mon Sep 17 00:00:00 2001
From: scrawl <720642+scrawl@users.noreply.github.com>
Date: Tue, 27 Feb 2018 23:52:12 +0000
Subject: [PATCH 010/321] Update AUTHORS.md
---
AUTHORS.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/AUTHORS.md b/AUTHORS.md
index 155d017f3..f6cc51181 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -41,6 +41,7 @@ Programmers
Cory F. Cohen (cfcohen)
Cris Mihalache (Mirceam)
crussell187
+ DanielVukelich
darkf
devnexen
Dieho
From 4292351993c2d10ef72a26d4925e27684f4312f4 Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Tue, 27 Feb 2018 20:17:21 -0600
Subject: [PATCH 011/321] Adding Max Quicksaves setting to Launcher
---
apps/launcher/advancedpage.cpp | 9 +++--
files/ui/advancedpage.ui | 66 +++++++++++++++++++++++++++++-----
2 files changed, 65 insertions(+), 10 deletions(-)
diff --git a/apps/launcher/advancedpage.cpp b/apps/launcher/advancedpage.cpp
index 3ba378599..27f3cc39d 100644
--- a/apps/launcher/advancedpage.cpp
+++ b/apps/launcher/advancedpage.cpp
@@ -35,8 +35,11 @@ bool Launcher::AdvancedPage::loadSettings()
loadSettingBool(grabCursorCheckBox, "grab cursor", "Input");
loadSettingBool(toggleSneakCheckBox, "toggle sneak", "Input");
- // Other Settings
+ // Saves Settings
loadSettingBool(timePlayedCheckbox, "timeplayed", "Saves");
+ maximumQuicksavesComboBox->setValue(mEngineSettings.getInt("max quicksaves", "Saves"));
+
+ // Other Settings
QString screenshotFormatString = QString::fromStdString(mEngineSettings.getString("screenshot format", "General")).toUpper();
if (screenshotFormatComboBox->findText(screenshotFormatString) == -1)
@@ -69,9 +72,11 @@ void Launcher::AdvancedPage::saveSettings()
saveSettingBool(grabCursorCheckBox, "grab cursor", "Input");
saveSettingBool(toggleSneakCheckBox, "toggle sneak", "Input");
- // Other Settings
+ // Saves Settings
saveSettingBool(timePlayedCheckbox, "timeplayed", "Saves");
+ mEngineSettings.setInt("max quicksaves", "Saves", maximumQuicksavesComboBox->value());
+ // Other Settings
std::string screenshotFormatString = screenshotFormatComboBox->currentText().toLower().toStdString();
if (screenshotFormatString != mEngineSettings.getString("screenshot format", "General"))
mEngineSettings.setString("screenshot format", "General", screenshotFormatString);
diff --git a/files/ui/advancedpage.ui b/files/ui/advancedpage.ui
index 8a0795d34..6832b86df 100644
--- a/files/ui/advancedpage.ui
+++ b/files/ui/advancedpage.ui
@@ -6,7 +6,7 @@
00
- 434
+ 671373
@@ -27,9 +27,9 @@
0
- 0
- 393
- 437
+ -187
+ 630
+ 510
@@ -139,6 +139,9 @@
+
+ 1
+ Off
@@ -207,11 +210,11 @@
-
+
- Other
+ Saves
-
+
@@ -222,12 +225,59 @@
+
+
+
+ <html><head/><body><p>This setting determines how many quicksave and autosave slots you can have at a time. If greater than 1, quicksaves will be sequentially created each time you quicksave. Once the maximum number of quicksaves has been reached, the oldest quicksave will be recycled the next time you perform a quicksave.</p></body></html>
+
+
+
+ -1
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+ Maximum Quicksaves
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ Other
+
+ <html><head/><body><p>Specify the format for screen shots taken by pressing the screen shot key (bound to F12 by default). This setting should be the file extension commonly associated with the desired format. The formats supported will be determined at compilation, but “jpg”, “png”, and “tga” should be allowed.</p></body></html>
-
+ -1
From b6d9b6f544ee1e761be5dc8ffa82b9b665eec59f Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Tue, 27 Feb 2018 20:17:43 -0600
Subject: [PATCH 012/321] Formatting improvement for advanced page
---
apps/launcher/advancedpage.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/apps/launcher/advancedpage.cpp b/apps/launcher/advancedpage.cpp
index 27f3cc39d..0abefcc8f 100644
--- a/apps/launcher/advancedpage.cpp
+++ b/apps/launcher/advancedpage.cpp
@@ -40,7 +40,6 @@ bool Launcher::AdvancedPage::loadSettings()
maximumQuicksavesComboBox->setValue(mEngineSettings.getInt("max quicksaves", "Saves"));
// Other Settings
-
QString screenshotFormatString = QString::fromStdString(mEngineSettings.getString("screenshot format", "General")).toUpper();
if (screenshotFormatComboBox->findText(screenshotFormatString) == -1)
screenshotFormatComboBox->addItem(screenshotFormatString);
From 10fe3342477816e99e7d9cd12e726cd09146f98d Mon Sep 17 00:00:00 2001
From: Florian Weber
Date: Fri, 2 Mar 2018 15:05:00 +0100
Subject: [PATCH 013/321] add more precise float-spinbox and use it for
rotations
---
apps/opencs/model/world/columnbase.hpp | 1 +
apps/opencs/model/world/columnimp.hpp | 2 +-
apps/opencs/model/world/refidcollection.cpp | 6 +++---
apps/opencs/view/world/util.cpp | 9 +++++++++
4 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp
index d609a6253..df37afe60 100644
--- a/apps/opencs/model/world/columnbase.hpp
+++ b/apps/opencs/model/world/columnbase.hpp
@@ -88,6 +88,7 @@ namespace CSMWorld
Display_UnsignedInteger8,
Display_Integer,
Display_Float,
+ Display_Double,
Display_Var,
Display_GmstVarType,
Display_GlobalVarType,
diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp
index f1025acb9..4ad447b0a 100644
--- a/apps/opencs/model/world/columnimp.hpp
+++ b/apps/opencs/model/world/columnimp.hpp
@@ -1371,7 +1371,7 @@ namespace CSMWorld
RotColumn (ESM::Position ESXRecordT::* position, int index, bool door)
: Column (
(door ? Columns::ColumnId_DoorPositionXRot : Columns::ColumnId_PositionXRot)+index,
- ColumnBase::Display_Float), mPosition (position), mIndex (index) {}
+ ColumnBase::Display_Double), mPosition (position), mIndex (index) {}
virtual QVariant get (const Record& record) const
{
diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp
index 44a6ce07d..daebc2dcb 100644
--- a/apps/opencs/model/world/refidcollection.cpp
+++ b/apps/opencs/model/world/refidcollection.cpp
@@ -184,11 +184,11 @@ CSMWorld::RefIdCollection::RefIdCollection()
mColumns.back().addColumn(
new RefIdColumn (Columns::ColumnId_PosZ, CSMWorld::ColumnBase::Display_Float));
mColumns.back().addColumn(
- new RefIdColumn (Columns::ColumnId_RotX, CSMWorld::ColumnBase::Display_Float));
+ new RefIdColumn (Columns::ColumnId_RotX, CSMWorld::ColumnBase::Display_Double));
mColumns.back().addColumn(
- new RefIdColumn (Columns::ColumnId_RotY, CSMWorld::ColumnBase::Display_Float));
+ new RefIdColumn (Columns::ColumnId_RotY, CSMWorld::ColumnBase::Display_Double));
mColumns.back().addColumn(
- new RefIdColumn (Columns::ColumnId_RotZ, CSMWorld::ColumnBase::Display_Float));
+ new RefIdColumn (Columns::ColumnId_RotZ, CSMWorld::ColumnBase::Display_Double));
// Nested table
mColumns.push_back(RefIdColumn (Columns::ColumnId_AiPackageList,
diff --git a/apps/opencs/view/world/util.cpp b/apps/opencs/view/world/util.cpp
index efba1ea82..eab37e1bf 100644
--- a/apps/opencs/view/world/util.cpp
+++ b/apps/opencs/view/world/util.cpp
@@ -233,6 +233,15 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
return dsb;
}
+ case CSMWorld::ColumnBase::Display_Double:
+ {
+ DialogueDoubleSpinBox *dsb = new DialogueDoubleSpinBox(parent);
+ dsb->setRange(-FLT_MAX, FLT_MAX);
+ dsb->setSingleStep(0.01f);
+ dsb->setDecimals(6);
+ return dsb;
+ }
+
case CSMWorld::ColumnBase::Display_LongString:
{
QPlainTextEdit *edit = new QPlainTextEdit(parent);
From 839196e4faaa4782c2cc339413e964e4ed698b78 Mon Sep 17 00:00:00 2001
From: scrawl <720642+scrawl@users.noreply.github.com>
Date: Sat, 3 Mar 2018 00:15:57 +0000
Subject: [PATCH 014/321] Force normal polygon mode for the map camera (Fixes
#4235)
---
apps/openmw/mwrender/localmap.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp
index b78c4dcd2..0b65a6b13 100644
--- a/apps/openmw/mwrender/localmap.cpp
+++ b/apps/openmw/mwrender/localmap.cpp
@@ -8,6 +8,7 @@
#include
#include
#include
+#include
#include
@@ -174,6 +175,7 @@ osg::ref_ptr LocalMap::createOrthographicCamera(float x, float y, f
camera->setNodeMask(Mask_RenderToTexture);
osg::ref_ptr stateset = new osg::StateSet;
+ stateset->setAttribute(new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::FILL), osg::StateAttribute::OVERRIDE);
// assign large value to effectively turn off fog
// shaders don't respect glDisable(GL_FOG)
From cc0c6ddaa6aed5c93f83597a58d12fbacba34d46 Mon Sep 17 00:00:00 2001
From: Capostrophic
Date: Wed, 28 Feb 2018 14:04:56 +0300
Subject: [PATCH 015/321] Account for empty victimRef (Bug #4328)
---
apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
index cd3cd1f80..be5125a2b 100644
--- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
+++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
@@ -1120,7 +1120,7 @@ namespace MWMechanics
if (!Misc::StringUtils::ciEqual(item.getCellRef().getRefId(), MWWorld::ContainerStore::sGoldId))
{
const MWWorld::Ptr victimRef = MWBase::Environment::get().getWorld()->searchPtr(item.getCellRef().getOwner(), true);
- if (!victimRef.getClass().getCreatureStats(victimRef).isDead())
+ if (victimRef.isEmpty() || !victimRef.getClass().getCreatureStats(victimRef).isDead())
mStolenItems[Misc::StringUtils::lowerCase(item.getCellRef().getRefId())][owner] += count;
}
if (alarm)
From d371bebb333c419c0c5589bfca090410eb25a1be Mon Sep 17 00:00:00 2001
From: Capostrophic
Date: Fri, 2 Mar 2018 21:10:05 +0300
Subject: [PATCH 016/321] Prevent items in a container owned by a dead actor
from being counted as stolen (Bug #4328)
---
apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
index be5125a2b..225427829 100644
--- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
+++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
@@ -1119,7 +1119,7 @@ namespace MWMechanics
if (!Misc::StringUtils::ciEqual(item.getCellRef().getRefId(), MWWorld::ContainerStore::sGoldId))
{
- const MWWorld::Ptr victimRef = MWBase::Environment::get().getWorld()->searchPtr(item.getCellRef().getOwner(), true);
+ const MWWorld::Ptr victimRef = MWBase::Environment::get().getWorld()->searchPtr(ownerCellRef->getOwner(), true);
if (victimRef.isEmpty() || !victimRef.getClass().getCreatureStats(victimRef).isDead())
mStolenItems[Misc::StringUtils::lowerCase(item.getCellRef().getRefId())][owner] += count;
}
From 6d557fec8e08dc65683454fde47d1d01a87faa9b Mon Sep 17 00:00:00 2001
From: Chris Robinson
Date: Wed, 20 Sep 2017 11:42:15 -0700
Subject: [PATCH 017/321] Increase the far clip plane when distant terrain is
enabled
---
apps/openmw/mwrender/renderingmanager.cpp | 20 ++++++++++++--------
apps/openmw/mwrender/renderingmanager.hpp | 4 +++-
2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp
index 3281a787b..b880943a4 100644
--- a/apps/openmw/mwrender/renderingmanager.cpp
+++ b/apps/openmw/mwrender/renderingmanager.cpp
@@ -179,8 +179,9 @@ namespace MWRender
, mUnderwaterFog(0.f)
, mUnderwaterIndoorFog(fallback->getFallbackFloat("Water_UnderwaterIndoorFog"))
, mNightEyeFactor(0.f)
- , mFieldOfViewOverride(0.f)
+ , mDistantTerrain(false)
, mFieldOfViewOverridden(false)
+ , mFieldOfViewOverride(0.f)
{
resourceSystem->getSceneManager()->setParticleSystemMask(MWRender::Mask_ParticleSystem);
resourceSystem->getSceneManager()->setShaderPath(resourcePath + "/shaders");
@@ -216,12 +217,12 @@ namespace MWRender
mWater.reset(new Water(mRootNode, sceneRoot, mResourceSystem, mViewer->getIncrementalCompileOperation(), fallback, resourcePath));
- const bool distantTerrain = Settings::Manager::getBool("distant terrain", "Terrain");
+ mDistantTerrain = Settings::Manager::getBool("distant terrain", "Terrain");
mTerrainStorage = new TerrainStorage(mResourceSystem, Settings::Manager::getString("normal map pattern", "Shaders"), Settings::Manager::getString("normal height map pattern", "Shaders"),
- Settings::Manager::getBool("auto use terrain normal maps", "Shaders"), Settings::Manager::getString("terrain specular map pattern", "Shaders"),
+ Settings::Manager::getBool("auto use terrain normal maps", "Shaders"), Settings::Manager::getString("terrain specular map pattern", "Shaders"),
Settings::Manager::getBool("auto use terrain specular maps", "Shaders"));
- if (distantTerrain)
+ if (mDistantTerrain)
mTerrain.reset(new Terrain::QuadTreeWorld(sceneRoot, mRootNode, mResourceSystem, mTerrainStorage, Mask_Terrain, Mask_PreCompile));
else
mTerrain.reset(new Terrain::TerrainGrid(sceneRoot, mRootNode, mResourceSystem, mTerrainStorage, Mask_Terrain, Mask_PreCompile));
@@ -288,8 +289,10 @@ namespace MWRender
mFirstPersonFieldOfView = Settings::Manager::getFloat("first person field of view", "Camera");
mStateUpdater->setFogEnd(mViewDistance);
+ mFarClip = mDistantTerrain ? 8192.0f*5.0f : mViewDistance;
+
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("near", mNearClip));
- mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mViewDistance));
+ mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mFarClip));
mUniformNear = mRootNode->getOrCreateStateSet()->getUniform("near");
mUniformFar = mRootNode->getOrCreateStateSet()->getUniform("far");
@@ -632,7 +635,7 @@ namespace MWRender
rttCamera->setRenderOrder(osg::Camera::PRE_RENDER);
rttCamera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
rttCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT, osg::Camera::PIXEL_BUFFER_RTT);
- rttCamera->setProjectionMatrixAsPerspective(mFieldOfView, w/float(h), mNearClip, mViewDistance);
+ rttCamera->setProjectionMatrixAsPerspective(mFieldOfView, w/float(h), mNearClip, mFarClip);
rttCamera->setViewMatrix(mViewer->getCamera()->getViewMatrix());
rttCamera->setViewport(0, 0, w, h);
@@ -897,10 +900,10 @@ namespace MWRender
float fov = mFieldOfView;
if (mFieldOfViewOverridden)
fov = mFieldOfViewOverride;
- mViewer->getCamera()->setProjectionMatrixAsPerspective(fov, aspect, mNearClip, mViewDistance);
+ mViewer->getCamera()->setProjectionMatrixAsPerspective(fov, aspect, mNearClip, mFarClip);
mUniformNear->set(mNearClip);
- mUniformFar->set(mViewDistance);
+ mUniformFar->set(mFarClip);
}
void RenderingManager::updateTextureFiltering()
@@ -960,6 +963,7 @@ namespace MWRender
else if (it->first == "Camera" && it->second == "viewing distance")
{
mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera");
+ mFarClip = mDistantTerrain ? 8192.0f*5.0f : mViewDistance;
mStateUpdater->setFogEnd(mViewDistance);
updateProjectionMatrix();
}
diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp
index f0087e43d..16854aaea 100644
--- a/apps/openmw/mwrender/renderingmanager.hpp
+++ b/apps/openmw/mwrender/renderingmanager.hpp
@@ -252,9 +252,11 @@ namespace MWRender
float mNightEyeFactor;
float mNearClip;
+ float mFarClip;
float mViewDistance;
+ bool mDistantTerrain : 1;
+ bool mFieldOfViewOverridden : 1;
float mFieldOfViewOverride;
- bool mFieldOfViewOverridden;
float mFieldOfView;
float mFirstPersonFieldOfView;
From 154cc8c6592cfe775f0953078ad1ceeb13afd398 Mon Sep 17 00:00:00 2001
From: Chris Robinson
Date: Thu, 21 Sep 2017 03:08:45 -0700
Subject: [PATCH 018/321] Use alternate fog parameters when distant land is
enabled
This allows the distant land to actually be seen when the user enables it. The
values used are replicated from MGE XE's default settings and should probably
be exposed somewhere.
---
apps/openmw/mwrender/renderingmanager.cpp | 85 +++++++++++++++++------
apps/openmw/mwrender/renderingmanager.hpp | 8 ++-
apps/openmw/mwrender/sky.hpp | 3 +
apps/openmw/mwworld/weather.cpp | 35 ++++++----
apps/openmw/mwworld/weather.hpp | 9 +++
5 files changed, 103 insertions(+), 37 deletions(-)
diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp
index b880943a4..ea0fef197 100644
--- a/apps/openmw/mwrender/renderingmanager.cpp
+++ b/apps/openmw/mwrender/renderingmanager.cpp
@@ -51,6 +51,20 @@
#include "terrainstorage.hpp"
#include "util.hpp"
+namespace
+{
+ // These values are what MGE XE uses by default when distant land is enabled, and are specified
+ // in cells (8192 units each). Should make them settings somewhere? Or wait to expose them
+ // "properly"?
+ const float DLRenderDistance = 5.0f;
+ const float DLLandFogStart = 2.0f;
+ const float DLLandFogEnd = 5.0f;
+ const float DLUnderwaterFogStart = -0.5f;
+ const float DLUnderwaterFogEnd = 0.3f;
+ const float DLInteriorFogStart = 0.0f;
+ const float DLInteriorFogEnd = 2.0f;
+}
+
namespace MWRender
{
@@ -173,10 +187,12 @@ namespace MWRender
, mResourceSystem(resourceSystem)
, mWorkQueue(workQueue)
, mUnrefQueue(new SceneUtil::UnrefQueue)
- , mFogDepth(0.f)
+ , mLandFogStart(0.f)
+ , mLandFogEnd(std::numeric_limits::max())
+ , mUnderwaterFogStart(0.f)
+ , mUnderwaterFogEnd(std::numeric_limits::max())
, mUnderwaterColor(fallback->getFallbackColour("Water_UnderwaterColor"))
, mUnderwaterWeight(fallback->getFallbackFloat("Water_UnderwaterColorWeight"))
- , mUnderwaterFog(0.f)
, mUnderwaterIndoorFog(fallback->getFallbackFloat("Water_UnderwaterIndoorFog"))
, mNightEyeFactor(0.f)
, mDistantTerrain(false)
@@ -289,7 +305,7 @@ namespace MWRender
mFirstPersonFieldOfView = Settings::Manager::getFloat("first person field of view", "Camera");
mStateUpdater->setFogEnd(mViewDistance);
- mFarClip = mDistantTerrain ? 8192.0f*5.0f : mViewDistance;
+ mFarClip = mDistantTerrain ? DLRenderDistance*8192.0f : mViewDistance;
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("near", mNearClip));
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mFarClip));
@@ -482,14 +498,44 @@ namespace MWRender
{
osg::Vec4f color = SceneUtil::colourFromRGB(cell->mAmbi.mFog);
- configureFog (cell->mAmbi.mFogDensity, mUnderwaterIndoorFog, color);
+ if(mDistantTerrain)
+ {
+ float density = std::max(0.2f, cell->mAmbi.mFogDensity);
+ mLandFogStart = (DLInteriorFogEnd*(1.0f-density) + DLInteriorFogStart*density) * 8192.0f;
+ mLandFogEnd = DLInteriorFogEnd * 8192.0f;
+ mUnderwaterFogStart = DLUnderwaterFogStart * 8192.0f;
+ mUnderwaterFogEnd = DLUnderwaterFogEnd * 8192.0f;
+ mFogColor = color;
+ }
+ else
+ configureFog(cell->mAmbi.mFogDensity, mUnderwaterIndoorFog, 1.0f, 0.0f, color);
}
- void RenderingManager::configureFog(float fogDepth, float underwaterFog, const osg::Vec4f &color)
+ void RenderingManager::configureFog(float fogDepth, float underwaterFog, float dlFactor, float dlOffset, const osg::Vec4f &color)
{
- mFogDepth = fogDepth;
+ if(mDistantTerrain)
+ {
+ mLandFogStart = dlFactor * (DLLandFogStart - dlOffset*DLLandFogEnd) * 8192.0f;
+ mLandFogEnd = dlFactor * (1.0f-dlOffset) * DLLandFogEnd * 8192.0f;
+ mUnderwaterFogStart = DLUnderwaterFogStart * 8192.0f;
+ mUnderwaterFogEnd = DLUnderwaterFogEnd * 8192.0f;
+ }
+ else
+ {
+ if(fogDepth == 0.0)
+ {
+ mLandFogStart = 0.0f;
+ mLandFogEnd = std::numeric_limits::max();
+ }
+ else
+ {
+ mLandFogStart = mViewDistance * (1 - fogDepth);
+ mLandFogEnd = mViewDistance;
+ }
+ mUnderwaterFogStart = mViewDistance * (1 - underwaterFog);
+ mUnderwaterFogEnd = mViewDistance;
+ }
mFogColor = color;
- mUnderwaterFog = underwaterFog;
}
SkyManager* RenderingManager::getSkyManager()
@@ -520,23 +566,15 @@ namespace MWRender
float viewDistance = mViewDistance;
viewDistance = std::min(viewDistance, 6666.f);
setFogColor(mUnderwaterColor * mUnderwaterWeight + mFogColor * (1.f-mUnderwaterWeight));
- mStateUpdater->setFogStart(viewDistance * (1 - mUnderwaterFog));
- mStateUpdater->setFogEnd(viewDistance);
+ mStateUpdater->setFogStart(mUnderwaterFogStart);
+ mStateUpdater->setFogEnd(mUnderwaterFogEnd);
}
else
{
setFogColor(mFogColor);
- if (mFogDepth == 0.f)
- {
- mStateUpdater->setFogStart(0.f);
- mStateUpdater->setFogEnd(std::numeric_limits::max());
- }
- else
- {
- mStateUpdater->setFogStart(mViewDistance * (1 - mFogDepth));
- mStateUpdater->setFogEnd(mViewDistance);
- }
+ mStateUpdater->setFogStart(mLandFogStart);
+ mStateUpdater->setFogEnd(mLandFogEnd);
}
}
@@ -963,9 +1001,12 @@ namespace MWRender
else if (it->first == "Camera" && it->second == "viewing distance")
{
mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera");
- mFarClip = mDistantTerrain ? 8192.0f*5.0f : mViewDistance;
- mStateUpdater->setFogEnd(mViewDistance);
- updateProjectionMatrix();
+ if(!mDistantTerrain)
+ {
+ mFarClip = mViewDistance;
+ mStateUpdater->setFogEnd(mViewDistance);
+ updateProjectionMatrix();
+ }
}
else if (it->first == "General" && (it->second == "texture filter" ||
it->second == "texture mipmap" ||
diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp
index 16854aaea..d44266e97 100644
--- a/apps/openmw/mwrender/renderingmanager.hpp
+++ b/apps/openmw/mwrender/renderingmanager.hpp
@@ -106,7 +106,7 @@ namespace MWRender
void configureAmbient(const ESM::Cell* cell);
void configureFog(const ESM::Cell* cell);
- void configureFog(float fogDepth, float underwaterFog, const osg::Vec4f& colour);
+ void configureFog(float fogDepth, float underwaterFog, float dlFactor, float dlOffset, const osg::Vec4f& colour);
void addCell(const MWWorld::CellStore* store);
void removeCell(const MWWorld::CellStore* store);
@@ -241,10 +241,12 @@ namespace MWRender
osg::ref_ptr mStateUpdater;
- float mFogDepth;
+ float mLandFogStart;
+ float mLandFogEnd;
+ float mUnderwaterFogStart;
+ float mUnderwaterFogEnd;
osg::Vec4f mUnderwaterColor;
float mUnderwaterWeight;
- float mUnderwaterFog;
float mUnderwaterIndoorFog;
osg::Vec4f mFogColor;
diff --git a/apps/openmw/mwrender/sky.hpp b/apps/openmw/mwrender/sky.hpp
index 4357d468c..a9345cdb4 100644
--- a/apps/openmw/mwrender/sky.hpp
+++ b/apps/openmw/mwrender/sky.hpp
@@ -65,6 +65,9 @@ namespace MWRender
float mFogDepth;
+ float mDLFogFactor;
+ float mDLFogOffset;
+
float mWindSpeed;
float mCloudSpeed;
diff --git a/apps/openmw/mwworld/weather.cpp b/apps/openmw/mwworld/weather.cpp
index 2f0a2f8cf..bde4c4c22 100644
--- a/apps/openmw/mwworld/weather.cpp
+++ b/apps/openmw/mwworld/weather.cpp
@@ -103,6 +103,8 @@ Weather::Weather(const std::string& name,
const Fallback::Map& fallback,
float stormWindSpeed,
float rainSpeed,
+ float dlFactor,
+ float dlOffset,
const std::string& particleEffect)
: mCloudTexture(fallback.getFallbackString("Weather_" + name + "_Cloud_Texture"))
, mSkyColor(fallback.getFallbackColour("Weather_" + name +"_Sky_Sunrise_Color"),
@@ -129,6 +131,7 @@ Weather::Weather(const std::string& name,
, mWindSpeed(fallback.getFallbackFloat("Weather_" + name + "_Wind_Speed"))
, mCloudSpeed(fallback.getFallbackFloat("Weather_" + name + "_Cloud_Speed"))
, mGlareView(fallback.getFallbackFloat("Weather_" + name + "_Glare_View"))
+ , mDL{dlFactor, dlOffset}
, mIsStorm(mWindSpeed > stormWindSpeed)
, mRainSpeed(rainSpeed)
, mRainFrequency(fallback.getFallbackFloat("Weather_" + name + "_Rain_Entrance_Speed"))
@@ -541,16 +544,18 @@ WeatherManager::WeatherManager(MWRender::RenderingManager& rendering, const Fall
mTimeSettings.mSunriseTime = mSunriseTime;
mWeatherSettings.reserve(10);
- addWeather("Clear", fallback); // 0
- addWeather("Cloudy", fallback); // 1
- addWeather("Foggy", fallback); // 2
- addWeather("Overcast", fallback); // 3
- addWeather("Rain", fallback); // 4
- addWeather("Thunderstorm", fallback); // 5
- addWeather("Ashstorm", fallback, "meshes\\ashcloud.nif"); // 6
- addWeather("Blight", fallback, "meshes\\blightcloud.nif"); // 7
- addWeather("Snow", fallback, "meshes\\snow.nif"); // 8
- addWeather("Blizzard", fallback, "meshes\\blizzard.nif"); // 9
+ // These distant land fog factor and offset values are the defaults MGE XE provides. Should be
+ // provided by settings somewhere?
+ addWeather("Clear", fallback, 1.0f, 0.0f); // 0
+ addWeather("Cloudy", fallback, 0.9f, 0.0f); // 1
+ addWeather("Foggy", fallback, 0.2f, 30.0f); // 2
+ addWeather("Overcast", fallback, 0.7f, 0.0f); // 3
+ addWeather("Rain", fallback, 0.5f, 10.0f); // 4
+ addWeather("Thunderstorm", fallback, 0.5f, 20.0f); // 5
+ addWeather("Ashstorm", fallback, 0.2f, 50.0f, "meshes\\ashcloud.nif"); // 6
+ addWeather("Blight", fallback, 0.2f, 60.0f, "meshes\\blightcloud.nif"); // 7
+ addWeather("Snow", fallback, 0.5f, 40.0f, "meshes\\snow.nif"); // 8
+ addWeather("Blizzard", fallback, 0.16f, 70.0f, "meshes\\blizzard.nif"); // 9
Store::iterator it = store.get().begin();
for(; it != store.get().end(); ++it)
@@ -720,7 +725,8 @@ void WeatherManager::update(float duration, bool paused)
mRendering.getSkyManager()->setMasserState(mMasser.calculateState(time));
mRendering.getSkyManager()->setSecundaState(mSecunda.calculateState(time));
- mRendering.configureFog(mResult.mFogDepth, underwaterFog, mResult.mFogColor);
+ mRendering.configureFog(mResult.mFogDepth, underwaterFog, mResult.mDLFogFactor,
+ mResult.mDLFogOffset/100.0f, mResult.mFogColor);
mRendering.setAmbientColour(mResult.mAmbientColor);
mRendering.setSunColour(mResult.mSunColor, mResult.mSunColor * mResult.mGlareView);
@@ -866,11 +872,12 @@ void WeatherManager::clear()
inline void WeatherManager::addWeather(const std::string& name,
const Fallback::Map& fallback,
+ float dlFactor, float dlOffset,
const std::string& particleEffect)
{
static const float fStromWindSpeed = mStore.get().find("fStromWindSpeed")->getFloat();
- Weather weather(name, fallback, fStromWindSpeed, mRainSpeed, particleEffect);
+ Weather weather(name, fallback, fStromWindSpeed, mRainSpeed, dlFactor, dlOffset, particleEffect);
mWeatherSettings.push_back(weather);
}
@@ -1058,6 +1065,8 @@ inline void WeatherManager::calculateResult(const int weatherID, const float gam
mResult.mNight = (gameHour < mSunriseTime || gameHour > mTimeSettings.mNightStart - 1);
mResult.mFogDepth = current.mLandFogDepth.getValue(gameHour, mTimeSettings);
+ mResult.mDLFogFactor = current.mDL.FogFactor;
+ mResult.mDLFogOffset = current.mDL.FogOffset;
mResult.mFogColor = current.mFogColor.getValue(gameHour, mTimeSettings);
mResult.mAmbientColor = current.mAmbientColor.getValue(gameHour, mTimeSettings);
mResult.mSunColor = current.mSunColor.getValue(gameHour, mTimeSettings);
@@ -1113,6 +1122,8 @@ inline void WeatherManager::calculateTransitionResult(const float factor, const
mResult.mAmbientColor = lerp(current.mAmbientColor, other.mAmbientColor, factor);
mResult.mSunDiscColor = lerp(current.mSunDiscColor, other.mSunDiscColor, factor);
mResult.mFogDepth = lerp(current.mFogDepth, other.mFogDepth, factor);
+ mResult.mDLFogFactor = lerp(current.mDLFogFactor, other.mDLFogFactor, factor);
+ mResult.mDLFogOffset = lerp(current.mDLFogOffset, other.mDLFogOffset, factor);
mResult.mWindSpeed = lerp(current.mWindSpeed, other.mWindSpeed, factor);
mResult.mCloudSpeed = lerp(current.mCloudSpeed, other.mCloudSpeed, factor);
mResult.mGlareView = lerp(current.mGlareView, other.mGlareView, factor);
diff --git a/apps/openmw/mwworld/weather.hpp b/apps/openmw/mwworld/weather.hpp
index 84a6c5105..4555a9d2a 100644
--- a/apps/openmw/mwworld/weather.hpp
+++ b/apps/openmw/mwworld/weather.hpp
@@ -73,6 +73,8 @@ namespace MWWorld
const Fallback::Map& fallback,
float stormWindSpeed,
float rainSpeed,
+ float dlFactor,
+ float dlOffset,
const std::string& particleEffect);
std::string mCloudTexture;
@@ -102,6 +104,12 @@ namespace MWWorld
// Also appears to modify how visible the sun, moons, and stars are for various weather effects.
float mGlareView;
+ // Fog factor and offset used with distant land rendering.
+ struct {
+ float FogFactor;
+ float FogOffset;
+ } mDL;
+
// Sound effect
// This is used for Blight, Ashstorm and Blizzard (Bloodmoon)
std::string mAmbientLoopSoundID;
@@ -293,6 +301,7 @@ namespace MWWorld
void addWeather(const std::string& name,
const Fallback::Map& fallback,
+ float dlFactor, float dlOffset,
const std::string& particleEffect = "");
void importRegions();
From 4caa7c9674339e23d48ab076a425e272d7427c71 Mon Sep 17 00:00:00 2001
From: Chris Robinson
Date: Thu, 28 Sep 2017 16:35:36 -0700
Subject: [PATCH 019/321] Workaround older MSVC quirk
---
apps/openmw/mwworld/weather.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/apps/openmw/mwworld/weather.cpp b/apps/openmw/mwworld/weather.cpp
index bde4c4c22..601379f08 100644
--- a/apps/openmw/mwworld/weather.cpp
+++ b/apps/openmw/mwworld/weather.cpp
@@ -131,7 +131,6 @@ Weather::Weather(const std::string& name,
, mWindSpeed(fallback.getFallbackFloat("Weather_" + name + "_Wind_Speed"))
, mCloudSpeed(fallback.getFallbackFloat("Weather_" + name + "_Cloud_Speed"))
, mGlareView(fallback.getFallbackFloat("Weather_" + name + "_Glare_View"))
- , mDL{dlFactor, dlOffset}
, mIsStorm(mWindSpeed > stormWindSpeed)
, mRainSpeed(rainSpeed)
, mRainFrequency(fallback.getFallbackFloat("Weather_" + name + "_Rain_Entrance_Speed"))
@@ -145,6 +144,8 @@ Weather::Weather(const std::string& name,
, mFlashDecrement(fallback.getFallbackFloat("Weather_" + name + "_Flash_Decrement"))
, mFlashBrightness(0.0f)
{
+ mDL.FogFactor = dlFactor;
+ mDL.FogOffset = dlOffset;
mThunderSoundID[0] = fallback.getFallbackString("Weather_" + name + "_Thunder_Sound_ID_0");
mThunderSoundID[1] = fallback.getFallbackString("Weather_" + name + "_Thunder_Sound_ID_1");
mThunderSoundID[2] = fallback.getFallbackString("Weather_" + name + "_Thunder_Sound_ID_2");
From 41669467aee26fb0f1e99d10b9120a0831bfcc2d Mon Sep 17 00:00:00 2001
From: Chris Robinson
Date: Thu, 28 Sep 2017 17:34:44 -0700
Subject: [PATCH 020/321] Make settings for distant fog parameters
---
apps/openmw/mwrender/renderingmanager.cpp | 54 +++++++++++++----------
apps/openmw/mwrender/renderingmanager.hpp | 1 +
files/settings-default.cfg | 22 +++++++++
3 files changed, 53 insertions(+), 24 deletions(-)
diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp
index ea0fef197..b3fee20b5 100644
--- a/apps/openmw/mwrender/renderingmanager.cpp
+++ b/apps/openmw/mwrender/renderingmanager.cpp
@@ -53,16 +53,13 @@
namespace
{
- // These values are what MGE XE uses by default when distant land is enabled, and are specified
- // in cells (8192 units each). Should make them settings somewhere? Or wait to expose them
- // "properly"?
- const float DLRenderDistance = 5.0f;
- const float DLLandFogStart = 2.0f;
- const float DLLandFogEnd = 5.0f;
- const float DLUnderwaterFogStart = -0.5f;
- const float DLUnderwaterFogEnd = 0.3f;
- const float DLInteriorFogStart = 0.0f;
- const float DLInteriorFogEnd = 2.0f;
+ float DLRenderDistance;
+ float DLLandFogStart;
+ float DLLandFogEnd;
+ float DLUnderwaterFogStart;
+ float DLUnderwaterFogEnd;
+ float DLInteriorFogStart;
+ float DLInteriorFogEnd;
}
namespace MWRender
@@ -195,6 +192,7 @@ namespace MWRender
, mUnderwaterWeight(fallback->getFallbackFloat("Water_UnderwaterColorWeight"))
, mUnderwaterIndoorFog(fallback->getFallbackFloat("Water_UnderwaterIndoorFog"))
, mNightEyeFactor(0.f)
+ , mDistantFog(false)
, mDistantTerrain(false)
, mFieldOfViewOverridden(false)
, mFieldOfViewOverride(0.f)
@@ -233,6 +231,15 @@ namespace MWRender
mWater.reset(new Water(mRootNode, sceneRoot, mResourceSystem, mViewer->getIncrementalCompileOperation(), fallback, resourcePath));
+ DLRenderDistance = Settings::Manager::getFloat("distant viewing distance", "Camera");
+ DLLandFogStart = Settings::Manager::getFloat("distant land fog start", "Fog");
+ DLLandFogEnd = Settings::Manager::getFloat("distant land fog end", "Fog");
+ DLUnderwaterFogStart = Settings::Manager::getFloat("distant underwater fog start", "Fog");
+ DLUnderwaterFogEnd = Settings::Manager::getFloat("distant underwater fog end", "Fog");
+ DLInteriorFogStart = Settings::Manager::getFloat("distant interior fog start", "Fog");
+ DLInteriorFogEnd = Settings::Manager::getFloat("distant interior fog end", "Fog");
+
+ mDistantFog = Settings::Manager::getBool("use distant fog", "Fog");
mDistantTerrain = Settings::Manager::getBool("distant terrain", "Terrain");
mTerrainStorage = new TerrainStorage(mResourceSystem, Settings::Manager::getString("normal map pattern", "Shaders"), Settings::Manager::getString("normal height map pattern", "Shaders"),
Settings::Manager::getBool("auto use terrain normal maps", "Shaders"), Settings::Manager::getString("terrain specular map pattern", "Shaders"),
@@ -305,7 +312,7 @@ namespace MWRender
mFirstPersonFieldOfView = Settings::Manager::getFloat("first person field of view", "Camera");
mStateUpdater->setFogEnd(mViewDistance);
- mFarClip = mDistantTerrain ? DLRenderDistance*8192.0f : mViewDistance;
+ mFarClip = mDistantTerrain ? DLRenderDistance : mViewDistance;
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("near", mNearClip));
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mFarClip));
@@ -498,13 +505,13 @@ namespace MWRender
{
osg::Vec4f color = SceneUtil::colourFromRGB(cell->mAmbi.mFog);
- if(mDistantTerrain)
+ if(mDistantFog)
{
float density = std::max(0.2f, cell->mAmbi.mFogDensity);
- mLandFogStart = (DLInteriorFogEnd*(1.0f-density) + DLInteriorFogStart*density) * 8192.0f;
- mLandFogEnd = DLInteriorFogEnd * 8192.0f;
- mUnderwaterFogStart = DLUnderwaterFogStart * 8192.0f;
- mUnderwaterFogEnd = DLUnderwaterFogEnd * 8192.0f;
+ mLandFogStart = (DLInteriorFogEnd*(1.0f-density) + DLInteriorFogStart*density);
+ mLandFogEnd = DLInteriorFogEnd;
+ mUnderwaterFogStart = DLUnderwaterFogStart;
+ mUnderwaterFogEnd = DLUnderwaterFogEnd;
mFogColor = color;
}
else
@@ -513,12 +520,12 @@ namespace MWRender
void RenderingManager::configureFog(float fogDepth, float underwaterFog, float dlFactor, float dlOffset, const osg::Vec4f &color)
{
- if(mDistantTerrain)
+ if(mDistantFog)
{
- mLandFogStart = dlFactor * (DLLandFogStart - dlOffset*DLLandFogEnd) * 8192.0f;
- mLandFogEnd = dlFactor * (1.0f-dlOffset) * DLLandFogEnd * 8192.0f;
- mUnderwaterFogStart = DLUnderwaterFogStart * 8192.0f;
- mUnderwaterFogEnd = DLUnderwaterFogEnd * 8192.0f;
+ mLandFogStart = dlFactor * (DLLandFogStart - dlOffset*DLLandFogEnd);
+ mLandFogEnd = dlFactor * (1.0f-dlOffset) * DLLandFogEnd;
+ mUnderwaterFogStart = DLUnderwaterFogStart;
+ mUnderwaterFogEnd = DLUnderwaterFogEnd;
}
else
{
@@ -1002,11 +1009,10 @@ namespace MWRender
{
mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera");
if(!mDistantTerrain)
- {
mFarClip = mViewDistance;
+ if(!mDistantFog)
mStateUpdater->setFogEnd(mViewDistance);
- updateProjectionMatrix();
- }
+ updateProjectionMatrix();
}
else if (it->first == "General" && (it->second == "texture filter" ||
it->second == "texture mipmap" ||
diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp
index d44266e97..da79fba98 100644
--- a/apps/openmw/mwrender/renderingmanager.hpp
+++ b/apps/openmw/mwrender/renderingmanager.hpp
@@ -256,6 +256,7 @@ namespace MWRender
float mNearClip;
float mFarClip;
float mViewDistance;
+ bool mDistantFog : 1;
bool mDistantTerrain : 1;
bool mFieldOfViewOverridden : 1;
float mFieldOfViewOverride;
diff --git a/files/settings-default.cfg b/files/settings-default.cfg
index 63afa4438..c1d269e6f 100644
--- a/files/settings-default.cfg
+++ b/files/settings-default.cfg
@@ -25,6 +25,10 @@ small feature culling pixel size = 2.0
# can dramatically affect performance, see documentation for details.
viewing distance = 6666.0
+# Maximum visible distance for distant terrain. Caution: setting this too high
+# can increase the chance for Z-fighting (flickering artifacts).
+distant viewing distance = 40960
+
# Camera field of view in degrees (e.g. 30.0 to 110.0).
# Does not affect the player's hands in the first person camera.
field of view = 55.0
@@ -90,6 +94,24 @@ pointers cache size = 40
# If true, use paging and LOD algorithms to display the entire terrain. If false, only display terrain of the loaded cells
distant terrain = false
+[Fog]
+
+# If true, use extended fog parameters for distant terrain not controlled by
+# viewing distance. If false, use the standard fog calculations.
+use distant fog = false
+
+distant land fog start = 16384
+
+distant land fog end = 40960
+
+distant underwater fog start = -4096
+
+distant underwater fog end = 2457.6
+
+distant interior fog start = 0
+
+distant interior fog end = 16384
+
[Map]
# Size of each exterior cell in pixels in the world map. (e.g. 12 to 24).
From 01dbac7b1589e0c2458d5160c27bad1b212d1d31 Mon Sep 17 00:00:00 2001
From: Chris Robinson
Date: Sun, 4 Mar 2018 11:37:11 -0800
Subject: [PATCH 021/321] Don't use a different setting for distant viewing
distance
---
apps/openmw/mwrender/renderingmanager.cpp | 14 ++++----------
apps/openmw/mwrender/renderingmanager.hpp | 1 -
files/settings-default.cfg | 4 ----
3 files changed, 4 insertions(+), 15 deletions(-)
diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp
index b3fee20b5..6f0ddba3a 100644
--- a/apps/openmw/mwrender/renderingmanager.cpp
+++ b/apps/openmw/mwrender/renderingmanager.cpp
@@ -53,7 +53,6 @@
namespace
{
- float DLRenderDistance;
float DLLandFogStart;
float DLLandFogEnd;
float DLUnderwaterFogStart;
@@ -231,7 +230,6 @@ namespace MWRender
mWater.reset(new Water(mRootNode, sceneRoot, mResourceSystem, mViewer->getIncrementalCompileOperation(), fallback, resourcePath));
- DLRenderDistance = Settings::Manager::getFloat("distant viewing distance", "Camera");
DLLandFogStart = Settings::Manager::getFloat("distant land fog start", "Fog");
DLLandFogEnd = Settings::Manager::getFloat("distant land fog end", "Fog");
DLUnderwaterFogStart = Settings::Manager::getFloat("distant underwater fog start", "Fog");
@@ -312,10 +310,8 @@ namespace MWRender
mFirstPersonFieldOfView = Settings::Manager::getFloat("first person field of view", "Camera");
mStateUpdater->setFogEnd(mViewDistance);
- mFarClip = mDistantTerrain ? DLRenderDistance : mViewDistance;
-
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("near", mNearClip));
- mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mFarClip));
+ mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mViewDistance));
mUniformNear = mRootNode->getOrCreateStateSet()->getUniform("near");
mUniformFar = mRootNode->getOrCreateStateSet()->getUniform("far");
@@ -680,7 +676,7 @@ namespace MWRender
rttCamera->setRenderOrder(osg::Camera::PRE_RENDER);
rttCamera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
rttCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT, osg::Camera::PIXEL_BUFFER_RTT);
- rttCamera->setProjectionMatrixAsPerspective(mFieldOfView, w/float(h), mNearClip, mFarClip);
+ rttCamera->setProjectionMatrixAsPerspective(mFieldOfView, w/float(h), mNearClip, mViewDistance);
rttCamera->setViewMatrix(mViewer->getCamera()->getViewMatrix());
rttCamera->setViewport(0, 0, w, h);
@@ -945,10 +941,10 @@ namespace MWRender
float fov = mFieldOfView;
if (mFieldOfViewOverridden)
fov = mFieldOfViewOverride;
- mViewer->getCamera()->setProjectionMatrixAsPerspective(fov, aspect, mNearClip, mFarClip);
+ mViewer->getCamera()->setProjectionMatrixAsPerspective(fov, aspect, mNearClip, mViewDistance);
mUniformNear->set(mNearClip);
- mUniformFar->set(mFarClip);
+ mUniformFar->set(mViewDistance);
}
void RenderingManager::updateTextureFiltering()
@@ -1008,8 +1004,6 @@ namespace MWRender
else if (it->first == "Camera" && it->second == "viewing distance")
{
mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera");
- if(!mDistantTerrain)
- mFarClip = mViewDistance;
if(!mDistantFog)
mStateUpdater->setFogEnd(mViewDistance);
updateProjectionMatrix();
diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp
index da79fba98..1c689d29f 100644
--- a/apps/openmw/mwrender/renderingmanager.hpp
+++ b/apps/openmw/mwrender/renderingmanager.hpp
@@ -254,7 +254,6 @@ namespace MWRender
float mNightEyeFactor;
float mNearClip;
- float mFarClip;
float mViewDistance;
bool mDistantFog : 1;
bool mDistantTerrain : 1;
diff --git a/files/settings-default.cfg b/files/settings-default.cfg
index c1d269e6f..dc770425f 100644
--- a/files/settings-default.cfg
+++ b/files/settings-default.cfg
@@ -25,10 +25,6 @@ small feature culling pixel size = 2.0
# can dramatically affect performance, see documentation for details.
viewing distance = 6666.0
-# Maximum visible distance for distant terrain. Caution: setting this too high
-# can increase the chance for Z-fighting (flickering artifacts).
-distant viewing distance = 40960
-
# Camera field of view in degrees (e.g. 30.0 to 110.0).
# Does not affect the player's hands in the first person camera.
field of view = 55.0
From 6c3ac834c43600ae3e3829e6d1f3c6080982de7d Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Mon, 5 Mar 2018 19:57:19 -0600
Subject: [PATCH 022/321] Preventing max quicksaves from being saved to
settings.cfg if it is unchanged.
---
apps/launcher/advancedpage.cpp | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/apps/launcher/advancedpage.cpp b/apps/launcher/advancedpage.cpp
index 0abefcc8f..9b6e5fa8c 100644
--- a/apps/launcher/advancedpage.cpp
+++ b/apps/launcher/advancedpage.cpp
@@ -73,7 +73,10 @@ void Launcher::AdvancedPage::saveSettings()
// Saves Settings
saveSettingBool(timePlayedCheckbox, "timeplayed", "Saves");
- mEngineSettings.setInt("max quicksaves", "Saves", maximumQuicksavesComboBox->value());
+ int maximumQuicksaves = maximumQuicksavesComboBox->value();
+ if (maximumQuicksaves != mEngineSettings.getInt("max quicksaves", "Saves")) {
+ mEngineSettings.setInt("max quicksaves", "Saves", maximumQuicksaves);
+ }
// Other Settings
std::string screenshotFormatString = screenshotFormatComboBox->currentText().toLower().toStdString();
From da74ca5ce0242cfd107a98d7934835aba178024f Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Mon, 5 Mar 2018 21:26:59 -0600
Subject: [PATCH 023/321] Add testing options to the Settings page
---
apps/launcher/settingspage.cpp | 42 ++++
apps/launcher/settingspage.hpp | 1 +
files/ui/settingspage.ui | 367 ++++++++++++++++++++-------------
3 files changed, 265 insertions(+), 145 deletions(-)
diff --git a/apps/launcher/settingspage.cpp b/apps/launcher/settingspage.cpp
index 843b51391..906459c23 100644
--- a/apps/launcher/settingspage.cpp
+++ b/apps/launcher/settingspage.cpp
@@ -177,6 +177,28 @@ void Launcher::SettingsPage::on_browseButton_clicked()
}
}
+void Launcher::SettingsPage::on_runScriptAfterStartupBrowseButton_clicked()
+{
+ QString scriptFile = QFileDialog::getOpenFileName(
+ this,
+ QObject::tr("Select script file"),
+ QDir::currentPath(),
+ QString(tr("Text file (*.txt)")));
+
+
+ if (scriptFile.isEmpty())
+ return;
+
+ QFileInfo info(scriptFile);
+
+ if (!info.exists() || !info.isReadable())
+ return;
+
+ const QString path(QDir::toNativeSeparators(info.absoluteFilePath()));
+
+ runScriptAfterStartupField->setText(path);
+}
+
void Launcher::SettingsPage::wizardStarted()
{
mMain->hide(); // Hide the launcher
@@ -260,6 +282,19 @@ void Launcher::SettingsPage::saveSettings()
} else {
mGameSettings.setValue(QLatin1String("encoding"), QLatin1String("win1252"));
}
+
+ // Testing
+ int skipMenu = skipMenuCheckBox->checkState() == Qt::Checked;
+ if (skipMenu != mGameSettings.value("skip-menu").toInt())
+ mGameSettings.setValue("skip-menu", QString::number(skipMenu));
+
+ QString startCell = startDefaultCharacterAtField->text();
+ if (startCell != mGameSettings.value("start")) {
+ mGameSettings.setValue("start", startCell);
+ }
+ QString scriptRun = runScriptAfterStartupField->text();
+ if (scriptRun != mGameSettings.value("script-run"))
+ mGameSettings.setValue("script-run", scriptRun);
}
bool Launcher::SettingsPage::loadSettings()
@@ -271,5 +306,12 @@ bool Launcher::SettingsPage::loadSettings()
if (index != -1)
languageComboBox->setCurrentIndex(index);
+ // Testing
+ if (mGameSettings.value("skip-menu").toInt() == 1)
+ skipMenuCheckBox->setCheckState(Qt::Checked);
+
+ startDefaultCharacterAtField->setText(mGameSettings.value("start"));
+ runScriptAfterStartupField->setText(mGameSettings.value("script-run"));
+
return true;
}
diff --git a/apps/launcher/settingspage.hpp b/apps/launcher/settingspage.hpp
index ccc2061dd..12539a0fc 100644
--- a/apps/launcher/settingspage.hpp
+++ b/apps/launcher/settingspage.hpp
@@ -38,6 +38,7 @@ namespace Launcher
void on_wizardButton_clicked();
void on_importerButton_clicked();
void on_browseButton_clicked();
+ void on_runScriptAfterStartupBrowseButton_clicked();
void wizardStarted();
void wizardFinished(int exitCode, QProcess::ExitStatus exitStatus);
diff --git a/files/ui/settingspage.ui b/files/ui/settingspage.ui
index f4f41f839..eed723adb 100644
--- a/files/ui/settingspage.ui
+++ b/files/ui/settingspage.ui
@@ -7,7 +7,7 @@
00514
- 397
+ 532
@@ -15,153 +15,230 @@
-
-
- Morrowind Content Language
+
+
+ true
-
-
-
-
-
- 250
- 0
-
-
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
+
+
+
+ 0
+ 0
+ 473
+ 510
+
+
+
+
+
+
+ Morrowind Content Language
+
+
+
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
+
+ 250
+ 0
+
+
+
+
+
+
+
+
+
+
+ Morrowind Installation Wizard
+
+
+
+
+
+ Run &Installation Wizard
+
+
+
+
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
+
+
+
+ Morrowind Settings Importer
+
+
+
+
+
+
+
+ File to import settings from:
+
+
+
+
+
+
+
+
+
+ Browse...
+
+
+
+
+
+
+
+
+ Import add-on and plugin selection (creates a new Content List)
+
+
+ true
+
+
+
+
+
+
+
+
+ Run &Settings Importer
+
+
+
+
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
+
+
+ 4
+
+
+ false
+
+
+
+
+
+
+
+
+
+ Testing
+
+
+
+
+
+ Skip menu and generate default character
+
+
+
+
+
+
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 20
+ 20
+
+
+
+
+
+
+
+ Start default character at
+
+
+
+
+
+
+ default cell
+
+
+
+
+
+
+
+
+ Run script after startup:
+
+
+
+
+
+
+
+
+
+
+
+ Browse…
+
+
+
+
+
+
+
+
+
+
-
-
-
- Morrowind Installation Wizard
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
-
- Run &Installation Wizard
-
-
-
-
-
-
-
-
-
- Morrowind Settings Importer
-
-
-
-
-
-
-
- File to import settings from:
-
-
-
-
-
-
-
-
-
- Browse...
-
-
-
-
-
-
-
-
- Import add-on and plugin selection (creates a new Content List)
-
-
- true
-
-
-
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
-
- Run &Settings Importer
-
-
-
-
-
-
-
-
- 4
-
-
- false
-
-
-
-
-
-
-
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
From 082e166faefd2daa149d3af49657c98bbb67db5f Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Mon, 5 Mar 2018 21:41:29 -0600
Subject: [PATCH 024/321] Making "start default character at" field enabled or
disabled by the previous checkbox
---
apps/launcher/settingspage.cpp | 55 ++++++++++++++++++++--------------
apps/launcher/settingspage.hpp | 4 ++-
2 files changed, 35 insertions(+), 24 deletions(-)
diff --git a/apps/launcher/settingspage.cpp b/apps/launcher/settingspage.cpp
index 906459c23..ec784c9d3 100644
--- a/apps/launcher/settingspage.cpp
+++ b/apps/launcher/settingspage.cpp
@@ -177,28 +177,6 @@ void Launcher::SettingsPage::on_browseButton_clicked()
}
}
-void Launcher::SettingsPage::on_runScriptAfterStartupBrowseButton_clicked()
-{
- QString scriptFile = QFileDialog::getOpenFileName(
- this,
- QObject::tr("Select script file"),
- QDir::currentPath(),
- QString(tr("Text file (*.txt)")));
-
-
- if (scriptFile.isEmpty())
- return;
-
- QFileInfo info(scriptFile);
-
- if (!info.exists() || !info.isReadable())
- return;
-
- const QString path(QDir::toNativeSeparators(info.absoluteFilePath()));
-
- runScriptAfterStartupField->setText(path);
-}
-
void Launcher::SettingsPage::wizardStarted()
{
mMain->hide(); // Hide the launcher
@@ -269,6 +247,33 @@ void Launcher::SettingsPage::updateOkButton(const QString &text)
: mProfileDialog->setOkButtonEnabled(true);
}
+void Launcher::SettingsPage::on_skipMenuCheckBox_stateChanged(int state) {
+ startDefaultCharacterAtLabel->setEnabled(state == Qt::Checked);
+ startDefaultCharacterAtField->setEnabled(state == Qt::Checked);
+}
+
+void Launcher::SettingsPage::on_runScriptAfterStartupBrowseButton_clicked()
+{
+ QString scriptFile = QFileDialog::getOpenFileName(
+ this,
+ QObject::tr("Select script file"),
+ QDir::currentPath(),
+ QString(tr("Text file (*.txt)")));
+
+
+ if (scriptFile.isEmpty())
+ return;
+
+ QFileInfo info(scriptFile);
+
+ if (!info.exists() || !info.isReadable())
+ return;
+
+ const QString path(QDir::toNativeSeparators(info.absoluteFilePath()));
+
+ runScriptAfterStartupField->setText(path);
+}
+
void Launcher::SettingsPage::saveSettings()
{
QString language(languageComboBox->currentText());
@@ -307,8 +312,12 @@ bool Launcher::SettingsPage::loadSettings()
languageComboBox->setCurrentIndex(index);
// Testing
- if (mGameSettings.value("skip-menu").toInt() == 1)
+ bool skipMenu = mGameSettings.value("skip-menu").toInt() == Qt::Checked;
+ if (skipMenu) {
skipMenuCheckBox->setCheckState(Qt::Checked);
+ }
+ startDefaultCharacterAtLabel->setEnabled(skipMenu);
+ startDefaultCharacterAtField->setEnabled(skipMenu);
startDefaultCharacterAtField->setText(mGameSettings.value("start"));
runScriptAfterStartupField->setText(mGameSettings.value("script-run"));
diff --git a/apps/launcher/settingspage.hpp b/apps/launcher/settingspage.hpp
index 12539a0fc..a9de974ff 100644
--- a/apps/launcher/settingspage.hpp
+++ b/apps/launcher/settingspage.hpp
@@ -38,7 +38,6 @@ namespace Launcher
void on_wizardButton_clicked();
void on_importerButton_clicked();
void on_browseButton_clicked();
- void on_runScriptAfterStartupBrowseButton_clicked();
void wizardStarted();
void wizardFinished(int exitCode, QProcess::ExitStatus exitStatus);
@@ -48,6 +47,9 @@ namespace Launcher
void updateOkButton(const QString &text);
+ void on_skipMenuCheckBox_stateChanged(int state);
+ void on_runScriptAfterStartupBrowseButton_clicked();
+
private:
Process::ProcessInvoker *mWizardInvoker;
From dcc262ed911fa4c0ba3db4e7f47e0d3cb22d80dd Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Mon, 5 Mar 2018 23:10:08 -0600
Subject: [PATCH 025/321] Fixing Skip Menu checkbox not working correctly
---
apps/launcher/settingspage.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/launcher/settingspage.cpp b/apps/launcher/settingspage.cpp
index ec784c9d3..986aee048 100644
--- a/apps/launcher/settingspage.cpp
+++ b/apps/launcher/settingspage.cpp
@@ -312,7 +312,7 @@ bool Launcher::SettingsPage::loadSettings()
languageComboBox->setCurrentIndex(index);
// Testing
- bool skipMenu = mGameSettings.value("skip-menu").toInt() == Qt::Checked;
+ bool skipMenu = mGameSettings.value("skip-menu").toInt() == 1;
if (skipMenu) {
skipMenuCheckBox->setCheckState(Qt::Checked);
}
From 60a663ef58dfed6f84d613942266b397d61cb420 Mon Sep 17 00:00:00 2001
From: Capostrophic
Date: Tue, 6 Mar 2018 16:14:29 +0300
Subject: [PATCH 026/321] Account for all possible count values in
getCountString (Bug #4346)
---
apps/openmw/mwgui/itemwidget.cpp | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/apps/openmw/mwgui/itemwidget.cpp b/apps/openmw/mwgui/itemwidget.cpp
index a31eb9c76..e793dbf58 100644
--- a/apps/openmw/mwgui/itemwidget.cpp
+++ b/apps/openmw/mwgui/itemwidget.cpp
@@ -16,7 +16,12 @@ namespace
{
if (count == 1)
return "";
- if (count > 9999)
+
+ if (count > 999999999)
+ return MyGUI::utility::toString(int(count/1000000000.f)) + "b";
+ else if (count > 999999)
+ return MyGUI::utility::toString(int(count/1000000.f)) + "m";
+ else if (count > 9999)
return MyGUI::utility::toString(int(count/1000.f)) + "k";
else
return MyGUI::utility::toString(count);
From 3b922d810a01401d8a8d9b138375c5dbaed63beb Mon Sep 17 00:00:00 2001
From: Capostrophic
Date: Wed, 7 Mar 2018 14:10:58 +0300
Subject: [PATCH 027/321] Don't use floating point arithmetics for formatted
count (Bug #4346)
---
apps/openmw/mwgui/itemwidget.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/apps/openmw/mwgui/itemwidget.cpp b/apps/openmw/mwgui/itemwidget.cpp
index e793dbf58..6b5be0314 100644
--- a/apps/openmw/mwgui/itemwidget.cpp
+++ b/apps/openmw/mwgui/itemwidget.cpp
@@ -18,11 +18,11 @@ namespace
return "";
if (count > 999999999)
- return MyGUI::utility::toString(int(count/1000000000.f)) + "b";
+ return MyGUI::utility::toString(count/1000000000) + "b";
else if (count > 999999)
- return MyGUI::utility::toString(int(count/1000000.f)) + "m";
+ return MyGUI::utility::toString(count/1000000) + "m";
else if (count > 9999)
- return MyGUI::utility::toString(int(count/1000.f)) + "k";
+ return MyGUI::utility::toString(count/1000) + "k";
else
return MyGUI::utility::toString(count);
}
From 6931f6cadc14128df681c66ee269cee739aba31c Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Wed, 7 Mar 2018 18:37:43 -0600
Subject: [PATCH 028/321] Adding message indicating the purpose of the
"Testing" block
---
files/ui/settingspage.ui | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/files/ui/settingspage.ui b/files/ui/settingspage.ui
index eed723adb..f1b833c60 100644
--- a/files/ui/settingspage.ui
+++ b/files/ui/settingspage.ui
@@ -23,9 +23,9 @@
0
- 0
+ -44473
- 510
+ 567
@@ -170,6 +170,23 @@
Testing
+
+
+
+ These settings are intended for testing mods and may cause issues if used for normal gameplay.
+
+
+ true
+
+
+
+
+
+
+ Qt::Horizontal
+
+
+
From dfcd243150243af5f1f0e049309ba1dc6f6acbd1 Mon Sep 17 00:00:00 2001
From: Thunderforge
Date: Wed, 7 Mar 2018 19:57:54 -0600
Subject: [PATCH 029/321] Remove the word "interior" from cell not found
message
---
apps/openmw/mwworld/store.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/openmw/mwworld/store.cpp b/apps/openmw/mwworld/store.cpp
index 9279e3fe7..158d3f771 100644
--- a/apps/openmw/mwworld/store.cpp
+++ b/apps/openmw/mwworld/store.cpp
@@ -592,7 +592,7 @@ namespace MWWorld
const ESM::Cell *ptr = search(id);
if (ptr == 0) {
std::ostringstream msg;
- msg << "Interior cell '" << id << "' not found";
+ msg << "Cell '" << id << "' not found";
throw std::runtime_error(msg.str());
}
return ptr;
From d3b623b5d32e8eba6c135ba62acfe049840040a4 Mon Sep 17 00:00:00 2001
From: Harald H
Date: Thu, 8 Mar 2018 21:23:24 +0100
Subject: [PATCH 030/321] http to https for supported urls (#1625)
* http to https for supported urls
* http to https
* http to https
* http to https
* http to https
* http to https
* http to https
* http to https
* http tp https
* http to https
* http to https
* http to https
* http to https
* http to https
* http to https
* http to https
* http to https
* some url fixes
* http to https
---
CI/before_script.msvc.sh | 16 +-
CMakeLists.txt | 4 +-
CONTRIBUTING.md | 2 +-
LICENSE | 8 +-
README.md | 6 +-
apps/openmw/mwclass/npc.cpp | 2 +-
apps/openmw/mwmechanics/character.cpp | 2 +-
apps/openmw/mwmechanics/pathgrid.cpp | 2 +-
apps/openmw/mwsound/alext.h | 2 +-
apps/openmw/mwsound/ffmpeg_decoder.hpp | 2 +-
cmake/FindFreetype.cmake | 2 +-
cmake/FindLIBUNSHIELD.cmake | 2 +-
cmake/FindOpenGLES.cmake | 2 +-
components/bsa/bsa_file.cpp | 4 +-
components/bsa/bsa_file.hpp | 4 +-
components/nif/controlled.hpp | 4 +-
components/nif/controller.hpp | 4 +-
components/nif/data.hpp | 4 +-
components/nif/effect.hpp | 4 +-
components/nif/extra.hpp | 4 +-
components/nif/niftypes.hpp | 4 +-
components/nif/property.hpp | 4 +-
components/nif/record.hpp | 4 +-
components/settings/settings.cpp | 2 +-
docs/Doxyfile.cmake | 53 +++---
docs/DoxyfilePages.cmake | 16 +-
.../openmw-cs/files-and-directories.rst | 6 +-
docs/source/manuals/openmw-cs/tour.rst | 32 ++--
.../modding/convert_bump_mapped_mods.rst | 24 +--
docs/source/reference/modding/font.rst | 4 +-
extern/oics/tinyxmlparser.cpp | 153 +++++++++---------
files/mac/openmw-Info.plist.in | 2 +-
files/mac/openmw-cs-Info.plist.in | 2 +-
files/openmw.appdata.xml | 6 +-
files/settings-default.cfg | 2 +-
files/shaders/water_fragment.glsl | 20 +--
36 files changed, 205 insertions(+), 209 deletions(-)
diff --git a/CI/before_script.msvc.sh b/CI/before_script.msvc.sh
index ee48c1f68..2a052912a 100644
--- a/CI/before_script.msvc.sh
+++ b/CI/before_script.msvc.sh
@@ -303,25 +303,25 @@ if [ -z $SKIP_DOWNLOAD ]; then
# Boost
if [ -z $APPVEYOR ]; then
download "Boost 1.61.0" \
- "http://sourceforge.net/projects/boost/files/boost-binaries/1.61.0/boost_1_61_0-msvc-${MSVC_VER}.0-${BITS}.exe" \
+ "https://sourceforge.net/projects/boost/files/boost-binaries/1.61.0/boost_1_61_0-msvc-${MSVC_VER}.0-${BITS}.exe" \
"boost-1.61.0-msvc${MSVC_YEAR}-win${BITS}.exe"
fi
# Bullet
download "Bullet 2.86" \
- "http://www.lysator.liu.se/~ace/OpenMW/deps/Bullet-2.86-msvc${MSVC_YEAR}-win${BITS}.7z" \
+ "https://www.lysator.liu.se/~ace/OpenMW/deps/Bullet-2.86-msvc${MSVC_YEAR}-win${BITS}.7z" \
"Bullet-2.86-msvc${MSVC_YEAR}-win${BITS}.7z"
# FFmpeg
download "FFmpeg 3.2.4" \
- "http://ffmpeg.zeranoe.com/builds/win${BITS}/shared/ffmpeg-3.2.4-win${BITS}-shared.zip" \
+ "https://ffmpeg.zeranoe.com/builds/win${BITS}/shared/ffmpeg-3.2.4-win${BITS}-shared.zip" \
"ffmpeg-3.2.4-win${BITS}.zip" \
- "http://ffmpeg.zeranoe.com/builds/win${BITS}/dev/ffmpeg-3.2.4-win${BITS}-dev.zip" \
+ "https://ffmpeg.zeranoe.com/builds/win${BITS}/dev/ffmpeg-3.2.4-win${BITS}-dev.zip" \
"ffmpeg-3.2.4-dev-win${BITS}.zip"
# MyGUI
download "MyGUI 3.2.2" \
- "http://www.lysator.liu.se/~ace/OpenMW/deps/MyGUI-3.2.2-msvc${MSVC_YEAR}-win${BITS}.7z" \
+ "https://www.lysator.liu.se/~ace/OpenMW/deps/MyGUI-3.2.2-msvc${MSVC_YEAR}-win${BITS}.7z" \
"MyGUI-3.2.2-msvc${MSVC_YEAR}-win${BITS}.7z"
# OpenAL
@@ -331,7 +331,7 @@ if [ -z $SKIP_DOWNLOAD ]; then
# OSG
download "OpenSceneGraph 3.4.1-scrawl" \
- "http://www.lysator.liu.se/~ace/OpenMW/deps/OSG-3.4.1-scrawl-msvc${MSVC_YEAR}-win${BITS}.7z" \
+ "https://www.lysator.liu.se/~ace/OpenMW/deps/OSG-3.4.1-scrawl-msvc${MSVC_YEAR}-win${BITS}.7z" \
"OSG-3.4.1-scrawl-msvc${MSVC_YEAR}-win${BITS}.7z"
# Qt
@@ -343,9 +343,9 @@ if [ -z $SKIP_DOWNLOAD ]; then
fi
download "Qt 5.7.2" \
- "http://download.qt.io/official_releases/qt/5.7/5.7.0/qt-opensource-windows-x86-msvc${MSVC_YEAR}${QT_SUFFIX}-5.7.0.exe" \
+ "https://download.qt.io/official_releases/qt/5.7/5.7.0/qt-opensource-windows-x86-msvc${MSVC_YEAR}${QT_SUFFIX}-5.7.0.exe" \
"qt-5.7.0-msvc${MSVC_YEAR}-win${BITS}.exe" \
- "http://www.lysator.liu.se/~ace/OpenMW/deps/qt-5-install.qs" \
+ "https://www.lysator.liu.se/~ace/OpenMW/deps/qt-5-install.qs" \
"qt-5-install.qs"
fi
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2923612fb..7c1f961f5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -505,8 +505,8 @@ if(WIN32)
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${OpenMW_SOURCE_DIR}/README.md")
SET(CPACK_NSIS_EXECUTABLES_DIRECTORY ".")
SET(CPACK_NSIS_DISPLAY_NAME "OpenMW ${OPENMW_VERSION}")
- SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.openmw.org")
- SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.openmw.org")
+ SET(CPACK_NSIS_HELP_LINK "https:\\\\\\\\www.openmw.org")
+ SET(CPACK_NSIS_URL_INFO_ABOUT "https:\\\\\\\\www.openmw.org")
SET(CPACK_NSIS_INSTALLED_ICON_NAME "openmw-launcher.exe")
SET(CPACK_NSIS_MUI_FINISHPAGE_RUN "openmw-launcher.exe")
SET(CPACK_NSIS_MUI_ICON "${OpenMW_SOURCE_DIR}/files/windows/openmw.ico")
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6c82d1dfd..b5543d11e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -3,7 +3,7 @@ How to contribute to OpenMW
Not sure what to do with all your free time? Pick out a task from here:
-http://bugs.openmw.org/
+https://bugs.openmw.org/
Currently, we are focused on completing the MW game experience and general polishing. Features out of this scope may be approved in some cases, but you should probably start a discussion first.
diff --git a/LICENSE b/LICENSE
index 9cecc1d46..9d742475f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,7 +1,7 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program. If not, see .
+ along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
@@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
-.
+.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
-.
+.
diff --git a/README.md b/README.md
index 0b5f63f93..368609332 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ OpenMW also comes with OpenMW-CS, a replacement for Morrowind's TES Construction
* Version: 0.43.0
* License: GPLv3 (see [LICENSE](https://github.com/OpenMW/openmw/blob/master/LICENSE) for more information)
-* Website: http://www.openmw.org
+* Website: https://www.openmw.org
* IRC: #openmw on irc.freenode.net
Font Licenses:
@@ -30,8 +30,8 @@ Getting Started
* [Build from source](https://wiki.openmw.org/index.php?title=Development_Environment_Setup)
* [Testing the game](https://wiki.openmw.org/index.php?title=Testing)
* [How to contribute](https://wiki.openmw.org/index.php?title=Contribution_Wanted)
-* [Report a bug](http://bugs.openmw.org/projects/openmw) - read the [guidelines](https://wiki.openmw.org/index.php?title=Bug_Reporting_Guidelines) before submitting your first bug!
-* [Known issues](http://bugs.openmw.org/projects/openmw/issues?utf8=%E2%9C%93&set_filter=1&f%5B%5D=status_id&op%5Bstatus_id%5D=%3D&v%5Bstatus_id%5D%5B%5D=7&f%5B%5D=tracker_id&op%5Btracker_id%5D=%3D&v%5Btracker_id%5D%5B%5D=1&f%5B%5D=&c%5B%5D=project&c%5B%5D=tracker&c%5B%5D=status&c%5B%5D=priority&c%5B%5D=subject&c%5B%5D=assigned_to&c%5B%5D=updated_on&group_by=tracker)
+* [Report a bug](https://bugs.openmw.org/projects/openmw) - read the [guidelines](https://wiki.openmw.org/index.php?title=Bug_Reporting_Guidelines) before submitting your first bug!
+* [Known issues](https://bugs.openmw.org/projects/openmw/issues?utf8=%E2%9C%93&set_filter=1&f%5B%5D=status_id&op%5Bstatus_id%5D=%3D&v%5Bstatus_id%5D%5B%5D=7&f%5B%5D=tracker_id&op%5Btracker_id%5D=%3D&v%5Btracker_id%5D%5B%5D=1&f%5B%5D=&c%5B%5D=project&c%5B%5D=tracker&c%5B%5D=status&c%5B%5D=priority&c%5B%5D=subject&c%5B%5D=assigned_to&c%5B%5D=updated_on&group_by=tracker)
The data path
-------------
diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp
index 134bbf943..974a08c11 100644
--- a/apps/openmw/mwclass/npc.cpp
+++ b/apps/openmw/mwclass/npc.cpp
@@ -406,7 +406,7 @@ namespace MWClass
// store
ptr.getRefData().setCustomData (data.release());
- getInventoryStore(ptr).autoEquip(ptr);
+ getInventoryStore(ptr).autoEquip(ptr);
}
}
diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp
index 676f01922..f88b20a10 100644
--- a/apps/openmw/mwmechanics/character.cpp
+++ b/apps/openmw/mwmechanics/character.cpp
@@ -14,7 +14,7 @@
*
* You should have received a copy of the GNU General Public License
* version 3 along with this program. If not, see
- * http://www.gnu.org/licenses/ .
+ * https://www.gnu.org/licenses/ .
*/
#include "character.hpp"
diff --git a/apps/openmw/mwmechanics/pathgrid.cpp b/apps/openmw/mwmechanics/pathgrid.cpp
index c0122a861..ea4c973b7 100644
--- a/apps/openmw/mwmechanics/pathgrid.cpp
+++ b/apps/openmw/mwmechanics/pathgrid.cpp
@@ -8,7 +8,7 @@
namespace
{
- // See http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
+ // See https://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
//
// One of the smallest cost in Seyda Neen is between points 77 & 78:
// pt x y
diff --git a/apps/openmw/mwsound/alext.h b/apps/openmw/mwsound/alext.h
index 4b9a15537..7162fa955 100644
--- a/apps/openmw/mwsound/alext.h
+++ b/apps/openmw/mwsound/alext.h
@@ -15,7 +15,7 @@
* License along with this library; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
+ * Or go to https://www.gnu.org/copyleft/lgpl.html
*/
#ifndef AL_ALEXT_H
diff --git a/apps/openmw/mwsound/ffmpeg_decoder.hpp b/apps/openmw/mwsound/ffmpeg_decoder.hpp
index e06a68d64..2b76e0d7d 100644
--- a/apps/openmw/mwsound/ffmpeg_decoder.hpp
+++ b/apps/openmw/mwsound/ffmpeg_decoder.hpp
@@ -21,7 +21,7 @@ extern "C"
// From version 54.56 binkaudio encoding format changed from S16 to FLTP. See:
// https://gitorious.org/ffmpeg/ffmpeg/commit/7bfd1766d1c18f07b0a2dd042418a874d49ea60d
-// http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=15&t=872
+// https://ffmpeg.zeranoe.com/forum/viewtopic.php?f=15&t=872
#include
}
diff --git a/cmake/FindFreetype.cmake b/cmake/FindFreetype.cmake
index 3d28613ae..3b7586835 100644
--- a/cmake/FindFreetype.cmake
+++ b/cmake/FindFreetype.cmake
@@ -1,7 +1,7 @@
#-------------------------------------------------------------------
# This file is part of the CMake build system for OGRE
# (Object-oriented Graphics Rendering Engine)
-# For the latest info, see http://www.ogre3d.org/
+# For the latest info, see https://www.ogre3d.org/
#
# The contents of this file are placed in the public domain. Feel
# free to make use of it in any way you like.
diff --git a/cmake/FindLIBUNSHIELD.cmake b/cmake/FindLIBUNSHIELD.cmake
index 285740b63..ee6414646 100644
--- a/cmake/FindLIBUNSHIELD.cmake
+++ b/cmake/FindLIBUNSHIELD.cmake
@@ -4,7 +4,7 @@
# LIBUNSHIELD_FOUND, if false, do not try to link to LibUnshield
# LIBUNSHIELD_INCLUDE_DIRS, where to find the headers
#
-# Created by Tom Mason (wheybags) for OpenMW (http://openmw.org), based on FindMPG123.cmake
+# Created by Tom Mason (wheybags) for OpenMW (https://openmw.org), based on FindMPG123.cmake
#
# Ripped off from other sources. In fact, this file is so generic (I
# just did a search and replace on another file) that I wonder why the
diff --git a/cmake/FindOpenGLES.cmake b/cmake/FindOpenGLES.cmake
index 7ee2c07f1..6a0466409 100644
--- a/cmake/FindOpenGLES.cmake
+++ b/cmake/FindOpenGLES.cmake
@@ -1,7 +1,7 @@
#-------------------------------------------------------------------
# This file is part of the CMake build system for OGRE
# (Object-oriented Graphics Rendering Engine)
-# For the latest info, see http://www.ogre3d.org/
+# For the latest info, see https://www.ogre3d.org/
#
# The contents of this file are placed in the public domain. Feel
# free to make use of it in any way you like.
diff --git a/components/bsa/bsa_file.cpp b/components/bsa/bsa_file.cpp
index c4be428b3..8905a86a1 100644
--- a/components/bsa/bsa_file.cpp
+++ b/components/bsa/bsa_file.cpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (bsa_file.cpp) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/bsa/bsa_file.hpp b/components/bsa/bsa_file.hpp
index 5ff86ef65..196dc30fb 100644
--- a/components/bsa/bsa_file.hpp
+++ b/components/bsa/bsa_file.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (bsa_file.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/controlled.hpp b/components/nif/controlled.hpp
index 5601474ac..be48e912e 100644
--- a/components/nif/controlled.hpp
+++ b/components/nif/controlled.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (controlled.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/controller.hpp b/components/nif/controller.hpp
index 0861dfa6b..527bb74af 100644
--- a/components/nif/controller.hpp
+++ b/components/nif/controller.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (controller.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/data.hpp b/components/nif/data.hpp
index 9b4a3a67c..6b7aa579b 100644
--- a/components/nif/data.hpp
+++ b/components/nif/data.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (data.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/effect.hpp b/components/nif/effect.hpp
index 015809a68..453e4b04c 100644
--- a/components/nif/effect.hpp
+++ b/components/nif/effect.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (effect.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/extra.hpp b/components/nif/extra.hpp
index 1e5a8616d..d935add55 100644
--- a/components/nif/extra.hpp
+++ b/components/nif/extra.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (extra.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/niftypes.hpp b/components/nif/niftypes.hpp
index 5827448fd..778625717 100644
--- a/components/nif/niftypes.hpp
+++ b/components/nif/niftypes.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (nif_types.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/property.hpp b/components/nif/property.hpp
index 96156c6d8..f46f8ef27 100644
--- a/components/nif/property.hpp
+++ b/components/nif/property.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (property.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/nif/record.hpp b/components/nif/record.hpp
index 605c4d76e..b8597f7d1 100644
--- a/components/nif/record.hpp
+++ b/components/nif/record.hpp
@@ -2,7 +2,7 @@
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2010 Nicolay Korslund
Email: < korslund@gmail.com >
- WWW: http://openmw.sourceforge.net/
+ WWW: https://openmw.org/
This file (record.h) is part of the OpenMW package.
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
- http://www.gnu.org/licenses/ .
+ https://www.gnu.org/licenses/ .
*/
diff --git a/components/settings/settings.cpp b/components/settings/settings.cpp
index 2e7b5a8ae..15a222d31 100644
--- a/components/settings/settings.cpp
+++ b/components/settings/settings.cpp
@@ -292,7 +292,7 @@ public:
ostream << "# to its default, simply remove it from this file. For available" << std::endl;
ostream << "# settings, see the file 'settings-default.cfg' or the documentation at:" << std::endl;
ostream << "#" << std::endl;
- ostream << "# http://openmw.readthedocs.io/en/master/reference/modding/settings/index.html" << std::endl;
+ ostream << "# https://openmw.readthedocs.io/en/master/reference/modding/settings/index.html" << std::endl;
}
// We still have one more thing to do before we're completely done writing the file.
diff --git a/docs/Doxyfile.cmake b/docs/Doxyfile.cmake
index 38ad84165..71ce32069 100644
--- a/docs/Doxyfile.cmake
+++ b/docs/Doxyfile.cmake
@@ -20,7 +20,7 @@
# This tag specifies the encoding used for all characters in the config file
# that follow. The default is UTF-8 which is also the encoding used for all text
# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# built into libc) for the transcoding. See https://www.gnu.org/software/libiconv
# for the list of possible encodings.
# The default value is: UTF-8.
@@ -295,7 +295,7 @@ EXTENSION_MAPPING =
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
# The output of markdown processing is further processed by doxygen, so you can
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
@@ -328,7 +328,7 @@ BUILTIN_STL_SUPPORT = YES
CPP_CLI_SUPPORT = NO
# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# https://riverbankcomputing.com/software/sip/intro) sources only. Doxygen
# will parse them like normal C++ but will assume all classes use public instead
# of private inheritance when no explicit protection keyword is present.
# The default value is: NO.
@@ -687,7 +687,7 @@ LAYOUT_FILE =
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
# For LaTeX the style of the bibliography can be controlled using
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. Do not use file names with spaces, bibtex cannot handle them. See
@@ -772,7 +772,7 @@ INPUT = @OpenMW_SOURCE_DIR@/apps \
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# documentation (see: https://www.gnu.org/software/libiconv) for the list of
# possible encodings.
# The default value is: UTF-8.
@@ -993,7 +993,7 @@ SOURCE_TOOLTIPS = YES
# If the USE_HTAGS tag is set to YES then the references to source code will
# point to the HTML generated by the htags(1) tool instead of doxygen built-in
# source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
+# (see https://www.gnu.org/software/global/global.html). You will need version
# 4.8.6 or higher.
#
# To use it do the following:
@@ -1136,7 +1136,7 @@ HTML_EXTRA_FILES =
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the stylesheet and background images according to
# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
# Minimum value: 0, maximum value: 359, default value: 220.
@@ -1194,7 +1194,7 @@ HTML_INDEX_NUM_ENTRIES = 100
# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# environment (see: https://developer.apple.com/xcode/), introduced with
# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
# Makefile in the HTML output directory. Running make will produce the docset in
# that directory and running make install will install the docset in
@@ -1239,7 +1239,7 @@ DOCSET_PUBLISHER_NAME = OpenMW
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
# Windows.
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
@@ -1315,7 +1315,7 @@ QCH_FILE =
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1323,8 +1323,7 @@ QHP_NAMESPACE = org.openmw
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1332,23 +1331,21 @@ QHP_VIRTUAL_FOLDER = doc
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_ATTRS =
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_SECT_FILTER_ATTRS =
@@ -1453,7 +1450,7 @@ FORMULA_FONTSIZE = 10
FORMULA_TRANSPARENT = YES
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
+# https://www.mathjax.org) which uses client side Javascript for the rendering
# instead of using prerendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path
@@ -1465,7 +1462,7 @@ USE_MATHJAX = YES
# When MathJax is enabled you can set the default output format to be used for
# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# https://docs.mathjax.org/en/latest/output.html) for more details.
# Possible values are: HTML-CSS (which is slower, but has the best
# compatibility), NativeMML (i.e. MathML) and SVG.
# The default value is: HTML-CSS.
@@ -1480,11 +1477,11 @@ MATHJAX_FORMAT = HTML-CSS
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
# Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdn.mathjax.org/mathjax/latest.
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_RELPATH = https://cdn.mathjax.org/mathjax/latest
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
@@ -1495,7 +1492,7 @@ MATHJAX_EXTENSIONS =
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# (see: https://docs.mathjax.org/en/latest/output.html) for more details. For an
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.
@@ -1542,7 +1539,7 @@ SERVER_BASED_SEARCH = NO
#
# Doxygen ships with an example indexer ( doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
+# Xapian (see: https://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
@@ -1555,7 +1552,7 @@ EXTERNAL_SEARCH = NO
#
# Doxygen ships with an example indexer ( doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
# Searching" for details.
# This tag requires that the tag SEARCHENGINE is set to YES.
@@ -1726,7 +1723,7 @@ LATEX_SOURCE_CODE = NO
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
# The default value is: plain.
# This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1882,7 +1879,7 @@ DOCBOOK_OUTPUT = docbook
#---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
-# Definitions (see http://autogen.sf.net) file that captures the structure of
+# Definitions (see http://autogen.sourceforge.net) file that captures the structure of
# the code including all documentation. Note that this feature is still
# experimental and incomplete at the moment.
# The default value is: NO.
@@ -2093,7 +2090,7 @@ HIDE_UNDOC_RELATIONS = NO
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is
# set to NO
# The default value is: YES.
diff --git a/docs/DoxyfilePages.cmake b/docs/DoxyfilePages.cmake
index d50a043d6..f3454c9d0 100644
--- a/docs/DoxyfilePages.cmake
+++ b/docs/DoxyfilePages.cmake
@@ -18,7 +18,7 @@
# that follow. The default is UTF-8 which is also the encoding used for all
# text before the first occurrence of this tag. Doxygen uses libiconv (or the
# iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
+# https://www.gnu.org/software/libiconv for the list of possible encodings.
DOXYFILE_ENCODING = UTF-8
@@ -581,7 +581,7 @@ INPUT = @OpenMW_SOURCE_DIR@/apps \
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# into libc) for the transcoding. See https://www.gnu.org/software/libiconv for
# the list of possible encodings.
INPUT_ENCODING = UTF-8
@@ -753,7 +753,7 @@ REFERENCES_LINK_SOURCE = YES
# If the USE_HTAGS tag is set to YES then the references to source code
# will point to the HTML generated by the htags(1) tool instead of doxygen
# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
+# tagging system (see https://www.gnu.org/software/global/global.html). You
# will need version 4.8.6 or higher.
USE_HTAGS = NO
@@ -928,30 +928,30 @@ QCH_FILE =
# The QHP_NAMESPACE tag specifies the namespace to use when generating
# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#namespace
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace
QHP_NAMESPACE =
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders
QHP_VIRTUAL_FOLDER = doc
# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
# For more information please see
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters
QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
-# Qt Help Project / Custom Filters.
+# Qt Help Project / Custom Filters.
QHP_CUST_FILTER_ATTRS =
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
# filter section matches.
-# Qt Help Project / Filter Attributes.
+# Qt Help Project / Filter Attributes.
QHP_SECT_FILTER_ATTRS =
diff --git a/docs/source/manuals/openmw-cs/files-and-directories.rst b/docs/source/manuals/openmw-cs/files-and-directories.rst
index 77593dece..ae39082d7 100644
--- a/docs/source/manuals/openmw-cs/files-and-directories.rst
+++ b/docs/source/manuals/openmw-cs/files-and-directories.rst
@@ -145,7 +145,7 @@ and a place where OpenMW CS looks for already existing files.
Resource files
==============
-.. TODO This paragraph sounds weird
+.. TODO This paragraph sounds weird
Unless we are talking about a fully text based game, like Zork or Rogue, one
would expect that a video game is using some media files: 3D models with
@@ -219,6 +219,6 @@ files for textures.
.. Hyperlink targets for the entire document
-.. _FFmpeg: http://ffmpeg.org
+.. _FFmpeg: https://ffmpeg.org
.. _Vorbis: http://www.vorbis.com
-.. _Theora: http://www.theora.org
+.. _Theora: https://www.theora.org
diff --git a/docs/source/manuals/openmw-cs/tour.rst b/docs/source/manuals/openmw-cs/tour.rst
index 645c18453..83b7aae27 100644
--- a/docs/source/manuals/openmw-cs/tour.rst
+++ b/docs/source/manuals/openmw-cs/tour.rst
@@ -3,7 +3,7 @@ A Tour through OpenMW CS: making a magic ring
In this first chapter we will create a mod that adds a new ring with a simple
enchantment to the game. The ring will give its wearer a permanent Night Vision
-effect while being worn. You do not need previous Morrowind modding experience,
+effect while being worn. You do not need previous Morrowind modding experience,
but you should be familiar with the game itself. There will be no
scripting necessary, we can achieve everything using just what the base game
offers out of the box. Before continuing make sure that OpenMW is properly
@@ -133,7 +133,7 @@ the filter directly into the filter field rather than the name of an existing
filter. To signify that we are using an instant filter the have to use `!` as
the first character. Type the following into the field:
-.. code::
+.. code::
!string("id", ".*ring.*")
@@ -217,20 +217,20 @@ actually modify the contents of the game.
Adding to an NPC
================
-The simplest way is probably to add it to the inventory of a shopkeeper.
+The simplest way is probably to add it to the inventory of a shopkeeper.
An obvious candidate is Arrille in Seyda Neen - he's quick to find in a new game
and he's easy to find in the CS as his name comes early alphabetically.
.. figure:: _static/images/chapter-1/Ring_to_Arrille.png
:alt: Putting the ring into Arrille's inventory
-
-Open the CS and open the *Objects* table (*World* → *Objects*).
+
+Open the CS and open the *Objects* table (*World* → *Objects*).
Scroll down to Arrille, or use a filter like !string("ID","arrille").
-Open another pane to edit him - either right click and select edit or use the
+Open another pane to edit him - either right click and select edit or use the
shortcut (default is shift double-click). Scroll down to the inventory section
-and right click to add a new row. Type in the id of the ring (or find it in the
-object pane, and drag and drop). Set the number of rings for him to stock - with
+and right click to add a new row. Type in the id of the ring (or find it in the
+object pane, and drag and drop). Set the number of rings for him to stock - with
a negative number indicating that he will restock again to maintain that level.
However, it's an attractive item, so he will probably wear it rather than sell it.
@@ -241,7 +241,7 @@ Fargoth to give it to the player in exchange for his healing ring.
.. figure:: _static/images/chapter-1/Ring_to_Fargoth_1.png
:alt: Editing Fargoth to give ring to player
-
+
Open the *Topicinfo* Table (*Characters* → *Topic Infos*). Use a filter !string(Topic,ring)
and select the row with a response starting with "You found it!". Edit the record,
firstly by adding a bit more to the response, then by adding a line to the script
@@ -297,7 +297,7 @@ Placing in plain sight
=====================
Let's hide the Ring of Night vision in the cabin of the [Ancient Shipwreck]
-(http://en.uesp.net/wiki/Morrowind:Ancient_Shipwreck), a derelict vessel
+(https://en.uesp.net/wiki/Morrowind:Ancient_Shipwreck), a derelict vessel
southeast of Dagon Fel. Open the list of Cells (*World* → *Cells*) and find
"Ancient Shipwreck, Cabin".
@@ -333,8 +333,8 @@ This is probably a suitable place to start talking about how navigation differs
in vanilla Morrowind.
There is advice in Scripting for Dummies, the definitive manual for Morrowind Scripting:
-"If you give your scripts a common tag, that will make it easier to jump between the
-different scripts of your project, e.g. start every script name with AA_Scriptname
+"If you give your scripts a common tag, that will make it easier to jump between the
+different scripts of your project, e.g. start every script name with AA_Scriptname
this will put them right at the beginning of the list and keep them neatly together."
This is valid for the rather poorer navigation facilities there, but it's not sensible for
@@ -359,12 +359,12 @@ the base game.
"Modified" status will cover items from the base game which have been modified in this addon.
-Click on the top of the column to toggle between ascending and descending order - thus between "Added"
-and "Modified" at the top. Or put your desired modified status into a filter then sort alpabetically
+Click on the top of the column to toggle between ascending and descending order - thus between "Added"
+and "Modified" at the top. Or put your desired modified status into a filter then sort alpabetically
on a different column.
-
+
Checking your new addon
=======================
@@ -372,4 +372,4 @@ Launch OpenMW and in the launcher under *Data Files* check your addon, if it's n
already checked. Load a game and make your way to Seyda Neen - or start a new game.
Check whether Arrille has one (or more) for sale, and whether Fargoth give you one
-when you return his healing ring.
\ No newline at end of file
+when you return his healing ring.
diff --git a/docs/source/reference/modding/convert_bump_mapped_mods.rst b/docs/source/reference/modding/convert_bump_mapped_mods.rst
index 71ac29468..1891b5c4d 100644
--- a/docs/source/reference/modding/convert_bump_mapped_mods.rst
+++ b/docs/source/reference/modding/convert_bump_mapped_mods.rst
@@ -20,7 +20,7 @@ General introduction to normal map conversion
:Authors: Joakim (Lysol) Berg
:Updated: 2016-11-11
-This page has general information and tutorials on how normal mapping works in OpenMW and how you can make mods using the old fake normal mapping technique (such as `Netch Bump mapped`_ and `Hlaalu Bump mapped`_, and maybe the most (in)famous one to give shiny rocks in OpenMW, the mod `On the Rocks`_!, featured in MGSO and Morrowind Rebirth) work in OpenMW.
+This page has general information and tutorials on how normal mapping works in OpenMW and how you can make mods using the old fake normal mapping technique (such as `Netch Bump mapped`_ and `Hlaalu Bump mapped`_, and maybe the most (in)famous one to give shiny rocks in OpenMW, the mod `On the Rocks`_!, featured in MGSO and Morrowind Rebirth) work in OpenMW.
*Note:* The conversion made in the `Converting Apel's Various Things - Sacks`_-part of this tutorial require the use of the application NifSkope. There are binaries available for Windows, but not for Mac or Linux. Reports say that NifSkope versions 1.X will compile on Linux as long as you have Qt packages installed, while the later 2.X versions will not compile.
@@ -179,24 +179,24 @@ The sacks included in Apel's `Various Things - Sacks`_ come in two versions –
#. Remove all these tags by selecting them one at a time and press right click>Block>Remove Branch. (Ctrl-Del)
#. Repeat this on all the affected models.
#. If you launch OpenMW now, you'll `no longer have shiny models`_. But one thing is missing. Can you see it? It's actually hard to spot on still pictures, but we have no normal maps here.
-#. Now, go back to the root of where you installed the mod. Now go to ``./Textures/`` and you'll find the texture files in question.
+#. Now, go back to the root of where you installed the mod. Now go to ``./Textures/`` and you'll find the texture files in question.
#. OpenMW detects normal maps if they have the same name as the base diffuse texture, but with a *_n.dds* suffix. In this mod, the normal maps has a suffix of *_nm.dds*. Change all the files that ends with *_nm.dds* to instead end with *_n.dds*.
#. Finally, `we are done`_!
Since these models have one or two textures applied to them, the fix was not that time-consuming. It gets worse when you have to fix a model that uses loads of textures. The principle is the same, it just requires more manual work which is annoying and takes time.
-.. _`Netch Bump mapped`: http://www.nexusmods.com/morrowind/mods/42851/?
-.. _`Hlaalu Bump mapped`: http://www.nexusmods.com/morrowind/mods/42396/?
+.. _`Netch Bump mapped`: https://www.nexusmods.com/morrowind/mods/42851/?
+.. _`Hlaalu Bump mapped`: https://www.nexusmods.com/morrowind/mods/42396/?
.. _`On the Rocks`: http://mw.modhistory.com/download-44-14107
.. _`texture modding`: https://wiki.openmw.org/index.php?title=TextureModding
-.. _`MGE XE`: http://www.nexusmods.com/morrowind/mods/26348/?
-.. _PeterBitt: http://www.nexusmods.com/morrowind/users/4381248/?
-.. _`PBR Scamp Replacer`: http://www.nexusmods.com/morrowind/mods/44314/?
+.. _`MGE XE`: https://www.nexusmods.com/morrowind/mods/26348/?
+.. _PeterBitt: https://www.nexusmods.com/morrowind/users/4381248/?
+.. _`PBR Scamp Replacer`: https://www.nexusmods.com/morrowind/mods/44314/?
.. _settings.cfg: https://wiki.openmw.org/index.php?title=Settings
.. _`Multiple data folders`: https://wiki.openmw.org/index.php?title=Mod_installation
-.. _`Various Things - Sacks`: http://www.nexusmods.com/morrowind/mods/42558/?
-.. _Lead: http://imgur.com/bwpcYlc
+.. _`Various Things - Sacks`: https://www.nexusmods.com/morrowind/mods/42558/?
+.. _Lead: https://imgur.com/bwpcYlc
.. _NifSkope: http://niftools.sourceforge.net/wiki/NifSkope
-.. _Blocks: http://imgur.com/VmQC0WG
-.. _`no longer have shiny models`: http://imgur.com/vu1k7n1
-.. _`we are done`: http://imgur.com/yyZxlTw
+.. _Blocks: https://imgur.com/VmQC0WG
+.. _`no longer have shiny models`: https://imgur.com/vu1k7n1
+.. _`we are done`: https://imgur.com/yyZxlTw
diff --git a/docs/source/reference/modding/font.rst b/docs/source/reference/modding/font.rst
index 5f01b12d9..80d01c27f 100644
--- a/docs/source/reference/modding/font.rst
+++ b/docs/source/reference/modding/font.rst
@@ -15,7 +15,7 @@ Unlike vanilla Morrowind, OpenMW directly supports TrueType (``.ttf``) fonts. Th
- To replace the primary "Magic Cards" font:
- #. Download `Pelagiad `_ by Isak Larborn (aka Isaskar).
+ #. Download `Pelagiad `_ by Isak Larborn (aka Isaskar).
#. Install the ``openmw_font.xml`` file into ``resources/mygui/openmw_font.xml`` in your OpenMW installation.
#. Copy ``Pelagiad.ttf`` into ``resources/mygui/`` as well.
#. If desired, you can now delete the original ``Magic_Cards.*`` files from your Data Files/Fonts directory.
@@ -74,4 +74,4 @@ Unlike vanilla Morrowind, OpenMW directly supports TrueType (``.ttf``) fonts. Th
Bitmap fonts
------------
-Morrowind ``.fnt`` files are essentially a bitmap font, but using them is discouraged because of no Unicode support. MyGUI has its own format for bitmap fonts. An example can be seen by using the --export-fonts command line option (see above), which converts Morrowind ``.fnt`` to a MyGUI bitmap font. This is the recommended format to use if you wish to edit Morrowind's bitmap font or create a new bitmap font.
\ No newline at end of file
+Morrowind ``.fnt`` files are essentially a bitmap font, but using them is discouraged because of no Unicode support. MyGUI has its own format for bitmap fonts. An example can be seen by using the --export-fonts command line option (see above), which converts Morrowind ``.fnt`` to a MyGUI bitmap font. This is the recommended format to use if you wish to edit Morrowind's bitmap font or create a new bitmap font.
diff --git a/extern/oics/tinyxmlparser.cpp b/extern/oics/tinyxmlparser.cpp
index 253cd93ff..d5bda8fee 100644
--- a/extern/oics/tinyxmlparser.cpp
+++ b/extern/oics/tinyxmlparser.cpp
@@ -2,23 +2,23 @@
www.sourceforge.net/projects/tinyxml
Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
-This software is provided 'as-is', without any express or implied
-warranty. In no event will the authors be held liable for any
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
-Permission is granted to anyone to use this software for any
-purpose, including commercial applications, and to alter it and
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
-1. The origin of this software must not be misrepresented; you must
+1. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product documentation
would be appreciated but is not required.
-2. Altered source versions must be plainly marked as such, and
+2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
-3. This notice may not be removed or altered from any source
+3. This notice may not be removed or altered from any source
distribution.
*/
@@ -39,8 +39,8 @@ distribution.
// Note tha "PutString" hardcodes the same list. This
// is less flexible than it appears. Changing the entries
-// or order will break putstring.
-TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] =
+// or order will break putstring.
+TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] =
{
{ "&", 5, '&' },
{ "<", 4, '<' },
@@ -50,20 +50,20 @@ TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] =
};
// Bunch of unicode info at:
-// http://www.unicode.org/faq/utf_bom.html
+// https://www.unicode.org/faq/utf_bom.html
// Including the basic of this table, which determines the #bytes in the
// sequence from the lead byte. 1 placed for invalid sequences --
// although the result will be junk, pass it through as much as possible.
-// Beware of the non-characters in UTF-8:
+// Beware of the non-characters in UTF-8:
// ef bb bf (Microsoft "lead bytes")
// ef bf be
-// ef bf bf
+// ef bf bf
const unsigned char TIXML_UTF_LEAD_0 = 0xefU;
const unsigned char TIXML_UTF_LEAD_1 = 0xbbU;
const unsigned char TIXML_UTF_LEAD_2 = 0xbfU;
-const int TiXmlBase::utf8ByteTable[256] =
+const int TiXmlBase::utf8ByteTable[256] =
{
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00
@@ -75,9 +75,9 @@ const int TiXmlBase::utf8ByteTable[256] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte
@@ -91,7 +91,7 @@ void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* leng
const unsigned long BYTE_MARK = 0x80;
const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
- if (input < 0x80)
+ if (input < 0x80)
*length = 1;
else if ( input < 0x800 )
*length = 2;
@@ -105,22 +105,22 @@ void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* leng
output += *length;
// Scary scary fall throughs.
- switch (*length)
+ switch (*length)
{
case 4:
- --output;
- *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+ --output;
+ *output = (char)((input | BYTE_MARK) & BYTE_MASK);
input >>= 6;
case 3:
- --output;
- *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+ --output;
+ *output = (char)((input | BYTE_MARK) & BYTE_MASK);
input >>= 6;
case 2:
- --output;
- *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+ --output;
+ *output = (char)((input | BYTE_MARK) & BYTE_MASK);
input >>= 6;
case 1:
- --output;
+ --output;
*output = (char)(input | FIRST_BYTE_MARK[*length]);
}
}
@@ -130,7 +130,7 @@ void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* leng
{
// This will only work for low-ascii, everything else is assumed to be a valid
// letter. I'm not sure this is the best approach, but it is quite tricky trying
- // to figure out alhabetical vs. not across encoding. So take a very
+ // to figure out alhabetical vs. not across encoding. So take a very
// conservative approach.
// if ( encoding == TIXML_ENCODING_UTF8 )
@@ -151,7 +151,7 @@ void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* leng
{
// This will only work for low-ascii, everything else is assumed to be a valid
// letter. I'm not sure this is the best approach, but it is quite tricky trying
- // to figure out alhabetical vs. not across encoding. So take a very
+ // to figure out alhabetical vs. not across encoding. So take a very
// conservative approach.
// if ( encoding == TIXML_ENCODING_UTF8 )
@@ -224,7 +224,7 @@ void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding )
case '\r':
// bump down to the next line
++row;
- col = 0;
+ col = 0;
// Eat the character
++p;
@@ -266,11 +266,11 @@ void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding )
// In these cases, don't advance the column. These are
// 0-width spaces.
if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 )
- p += 3;
+ p += 3;
else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU )
- p += 3;
+ p += 3;
else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU )
- p += 3;
+ p += 3;
else
{ p +=3; ++col; } // A normal character.
}
@@ -322,10 +322,10 @@ const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding )
while ( *p )
{
const unsigned char* pU = (const unsigned char*)p;
-
+
// Skip the stupid Microsoft UTF-8 Byte order marks
if ( *(pU+0)==TIXML_UTF_LEAD_0
- && *(pU+1)==TIXML_UTF_LEAD_1
+ && *(pU+1)==TIXML_UTF_LEAD_1
&& *(pU+2)==TIXML_UTF_LEAD_2 )
{
p += 3;
@@ -413,12 +413,12 @@ const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncodi
// After that, they can be letters, underscores, numbers,
// hyphens, or colons. (Colons are valid ony for namespaces,
// but tinyxml can't tell namespaces from names.)
- if ( p && *p
+ if ( p && *p
&& ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) )
{
const char* start = p;
while( p && *p
- && ( IsAlphaNum( (unsigned char ) *p, encoding )
+ && ( IsAlphaNum( (unsigned char ) *p, encoding )
|| *p == '_'
|| *p == '-'
|| *p == '.'
@@ -469,7 +469,7 @@ const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXml
ucs += mult * (*q - 'a' + 10);
else if ( *q >= 'A' && *q <= 'F' )
ucs += mult * (*q - 'A' + 10 );
- else
+ else
return 0;
mult *= 16;
--q;
@@ -492,7 +492,7 @@ const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXml
{
if ( *q >= '0' && *q <= '9' )
ucs += mult * (*q - '0');
- else
+ else
return 0;
mult *= 10;
--q;
@@ -571,10 +571,10 @@ bool TiXmlBase::StringEqual( const char* p,
return false;
}
-const char* TiXmlBase::ReadText( const char* p,
- TIXML_STRING * text,
- bool trimWhiteSpace,
- const char* endTag,
+const char* TiXmlBase::ReadText( const char* p,
+ TIXML_STRING * text,
+ bool trimWhiteSpace,
+ const char* endTag,
bool caseInsensitive,
TiXmlEncoding encoding )
{
@@ -631,7 +631,7 @@ const char* TiXmlBase::ReadText( const char* p,
}
}
}
- if ( p )
+ if ( p )
p += strlen( endTag );
return p;
}
@@ -647,7 +647,7 @@ void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag )
// This "pre-streaming" will never read the closing ">" so the
// sub-tag can orient itself.
- if ( !StreamTo( in, '<', tag ) )
+ if ( !StreamTo( in, '<', tag ) )
{
SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
return;
@@ -669,7 +669,7 @@ void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag )
if ( in->good() )
{
- // We now have something we presume to be a node of
+ // We now have something we presume to be a node of
// some sort. Identify it, and call the node to
// continue streaming.
TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING );
@@ -778,7 +778,7 @@ const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiX
encoding = TIXML_ENCODING_UTF8;
else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) )
encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice
- else
+ else
encoding = TIXML_ENCODING_LEGACY;
}
@@ -796,7 +796,7 @@ const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiX
}
void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding )
-{
+{
// The first error in a chain is more accurate - don't set again!
if ( error )
return;
@@ -833,7 +833,7 @@ TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding )
return 0;
}
- // What is this thing?
+ // What is this thing?
// - Elements start with a letter or underscore, but xml is reserved.
// - Comments:
-
+org.openmw.desktopCC0-1.0
- GPL-3.0 and MIT
+ GPL-3.0 and MITOpenMWUnofficial open source engine re-implementation of the game Morrowind
@@ -20,7 +20,6 @@ Copyright 2017 Bret Curtis
You will still need the original game data to play OpenMW.