mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
@@ -25,6 +25,7 @@ set (BOSS_GUI_SRC ${BOSS_SRC}
|
||||
"${CMAKE_SOURCE_DIR}/src/gui/settings.cpp"
|
||||
"${CMAKE_SOURCE_DIR}/src/gui/editor.cpp"
|
||||
"${CMAKE_SOURCE_DIR}/src/gui/viewer.cpp"
|
||||
"${CMAKE_SOURCE_DIR}/src/gui/misc.cpp"
|
||||
"${CMAKE_SOURCE_DIR}/src/resource.rc")
|
||||
|
||||
set (BOSS_API_SRC ${BOSS_SRC}
|
||||
@@ -100,6 +101,9 @@ IF (MINGW)
|
||||
wxzlib-3.0-${COMPILER_PREFIX}
|
||||
comctl32)
|
||||
ELSEIF (MSVC)
|
||||
#IF (MSVC_VERSION EQUAL 1800)
|
||||
# set (CMAKE_GENERATOR_TOOLSET "v120_xp" CACHE STRING "Platform Toolset" FORCE)
|
||||
#ENDIF ()
|
||||
include_directories("${PROJECT_LIBS_DIR}/wxWidgets/lib/vc_lib/mswu")
|
||||
link_directories("${PROJECT_LIBS_DIR}/wxWidgets/lib/vc_lib")
|
||||
set (CMAKE_CXX_FLAGS "/EHsc")
|
||||
|
||||
@@ -40,119 +40,8 @@ BOSS requires the following libraries (version numbers used in latest developmen
|
||||
|
||||
BOSS expects all libraries' folders to be present alongside the BOSS repository folder that contains this readme, or otherwise installed such that the compiler and linker used can find them without suppling additional paths. All paths below are relative to the folder(s) containing the libraries and BOSS.
|
||||
|
||||
Alphanum, Libespm and PugiXML do not require any additional setup. The rest of the libraries must be built separately. Instructions for building them and BOSS itself on Windows and Linux are given below. They assume that Visual C++ 2013 is being used on Windows, and mingw-w64 is being used on Linux, though they should be similar for other compilers.
|
||||
Alphanum, Libespm and PugiXML do not require any additional setup. The rest of the libraries must be built separately. Instructions for building them and BOSS itself using MSVC or MinGW are given in `docs/BUILD.MSVC.md` and `docs/BUILD.MinGW.md` respectively.
|
||||
|
||||
### Windows
|
||||
|
||||
#### Boost
|
||||
|
||||
```
|
||||
bootstrap.bat
|
||||
b2 toolset=msvc-12.0 threadapi=win32 link=static variant=release address-model=32 --with-log --with-date_time --with-thread --with-filesystem --with-locale --with-regex --with-system --with-iostreams --stagedir=stage-32
|
||||
```
|
||||
|
||||
#### wxWidgets
|
||||
|
||||
Just build the solution provided by wxWidgets.
|
||||
|
||||
#### zlib
|
||||
|
||||
1. Add `/safeseh` to both lines in `contrib\masmx86\bld_ml32.bat`.
|
||||
2. Build the solution in `contrib\vstudio`.
|
||||
3. Copy `build\zconf.h` to `.\zconf.h`.
|
||||
|
||||
#### yaml-cpp
|
||||
|
||||
1. Set CMake up so that it builds the binaries in the `build` subdirectory of the yaml-cpp folder.
|
||||
2. Define `BOOST_ROOT` to point to where the Boost folder is.
|
||||
3. Configure CMake, then generate a build system for Visual Studio 12.
|
||||
4. Open the generated solution file, and build it.
|
||||
|
||||
#### Libloadorder
|
||||
|
||||
Follow the instructions in libloadorder's README.md to build it as a static library.
|
||||
|
||||
#### Libgit2
|
||||
|
||||
1. Set CMake up so that it builds the binaries in the `build` subdirectory of the libgit2 folder.
|
||||
2. Configure CMake.
|
||||
3. Undefine `BUILD_SHARED_LIBS`.
|
||||
4. Generate a build system for Visual Studio 12.
|
||||
5. Open the generated solution file, and build it.
|
||||
|
||||
You may need to make sure that the configuration properties for the Visual Studio project are set to use the multithreaded DLL runtime library (C/C++->Code Generation).
|
||||
|
||||
#### BOSS
|
||||
|
||||
1. Set CMake up so that it builds the binaries in the `build` subdirectory of the BOSS folder.
|
||||
2. Define `PROJECT_ARCH=32` or `PROJECT_ARCH=64` to build 32 or 64 bit executables respectively.
|
||||
3. Define `PROJECT_LINK=STATIC` to build a static API, or `PROJECT_LINK=SHARED` to build a DLL API.
|
||||
4. Define `PROEJCT_LIBS_DIR` to point to the folder holding all the required libraries' folders.
|
||||
5. Configure CMake, then generate a build system for Visual Studio 12.
|
||||
6. Open the generated solution file, and build it.
|
||||
|
||||
If building on MSVC 2012 or 2013, Windows XP is not supported unless Configuration Properties->Platform Toolset is set to `v120_xp`.
|
||||
|
||||
### Linux
|
||||
|
||||
#### Boost
|
||||
|
||||
```
|
||||
./bootstrap.sh
|
||||
echo "using gcc : 4.6.3 : i686-w64-mingw32-g++ : <rc>i686-w64-mingw32-windres <archiver>i686-w64-mingw32-ar <ranlib>i686-w64-mingw32-ranlib ;" > tools/build/v2/user-config.jam
|
||||
./b2 toolset=gcc-4.6.3 target-os=windows threadapi=win32 link=static runtime-link=static variant=release address-model=32 cxxflags=-fPIC --with-log --with-date_time --with-thread --with-filesystem --with-locale --with-regex --with-system --with-iostreams --stagedir=stage-32
|
||||
```
|
||||
|
||||
#### wxWidgets
|
||||
|
||||
```
|
||||
./configure --host=i686-w64-mingw32 --disable-shared --enable-stl
|
||||
make
|
||||
```
|
||||
|
||||
#### zlib
|
||||
|
||||
```
|
||||
mkdir build && cd build
|
||||
cmake .. -DCMAKE_C_FLAGS=-m32 -DPROJECT_ARCH=32 -DCMAKE_TOOLCHAIN_FILE=../BOSSv3/mingw-toolchain.cmake
|
||||
make
|
||||
cp zconf.h ../zconf.h
|
||||
```
|
||||
|
||||
#### yaml-cpp
|
||||
|
||||
```
|
||||
cmake . -DCMAKE_C_FLAGS=-m32 -DPROJECT_ARCH=32 -DCMAKE_TOOLCHAIN_FILE=../BOSSv3/mingw-toolchain.cmake -DBOOST_ROOT=../boost
|
||||
make
|
||||
```
|
||||
|
||||
#### Libloadorder
|
||||
|
||||
Follow the instructions in libloadorder's README.md to build it as a static library.
|
||||
|
||||
#### OpenSSL
|
||||
|
||||
```
|
||||
./Configure --cross-compile-prefix=i686-w64-mingw32- mingw
|
||||
make
|
||||
```
|
||||
|
||||
#### Libgit2
|
||||
|
||||
```
|
||||
mkdir build && cd build
|
||||
cmake .. -DBUILD_SHARED_LIBS=OFF -DOPENSSL_ROOT_DIR=../openssl -DCMAKE_C_FLAGS=-m32 -DPROJECT_ARCH=32 -DCMAKE_TOOLCHAIN_FILE=../BOSSv3/mingw-toolchain.cmake
|
||||
make
|
||||
```
|
||||
If building with SSL support using OpenSSL, also pass ``.
|
||||
|
||||
#### BOSS
|
||||
|
||||
```
|
||||
mkdir build && cd build
|
||||
cmake .. -DPROJECT_LIBS_DIR=".." -DPROJECT_ARCH=32 -DPROJECT_LINK=STATIC -DCMAKE_TOOLCHAIN_FILE="mingw-toolchain.cmake"
|
||||
make
|
||||
```
|
||||
|
||||
## Using The Masterlist Converter
|
||||
|
||||
@@ -172,9 +61,9 @@ On encountering an error, it will print an error message to the console, and wil
|
||||
|
||||
The converter does not perform a lossless conversion. The following do not get transferred into the new masterlist:
|
||||
|
||||
* Silent comments. (Search regex: `^IF(NOT)?.+MOD:`.)
|
||||
* Plugin conditions. (Search regex: `REQ:.+(\.esp|\.esm).`)
|
||||
* Requirement messages containing plugin filenames. (Search regex: `^(/\*|//)`.)
|
||||
* Silent comments. (Search regex: `^(/\*|//)`)
|
||||
* Plugin conditions. (Search regex: `^IF(NOT)?.+MOD:`)
|
||||
* Requirement messages containing plugin filenames. (Search regex: `REQ:.+(\.esp|\.esm)`)
|
||||
* Dirty message content. The ITM, UDR and Navmesh counts, along with CRCs and the dirty utility referenced are transferred, but any additional content, such as links to additional instructions, are lost. (Search regex: `DIRTY:`.)
|
||||
|
||||
In addition, while other data is retained, it needs some manual adjustment, eg. translated messages need are converted as separate messages and should be placed into message content objects.
|
||||
@@ -182,3 +71,16 @@ In addition, while other data is retained, it needs some manual adjustment, eg.
|
||||
## Packaging Releases
|
||||
|
||||
Installer and zip archive releases for the main BOSS application can be handled by running the scripts `installer.nsi` and `archive.py` in the `src` folder respectively. The installer script requires [NSIS 3](http://nsis.sourceforge.net/Main_Page) to be installed, while the archive script requires [Python](http://www.python.org/) to be installed.
|
||||
|
||||
The installer and Python script both require the built BOSS.exe to be at `build\BOSS.exe`, and the installer also requires the MSVC 2013 Redistributable (x86) to be at `build\vcredist_x86.exe`.
|
||||
|
||||
## Adding Translations To BOSS
|
||||
|
||||
If a translation for a new language is provided, here's what needs changing in the code to make BOSS use that translation.
|
||||
|
||||
* Add constants for the language in `api.h` and `globals.h`.
|
||||
* In `helpers.cpp`, update `Language::Language(const std::string& nameOrISOCode)` and `Language::Construct(const unsigned int code).
|
||||
* In `helpers.h`, update `Language::Names()`.
|
||||
* In `main.cpp`, update `BossGUI::OnInit` to set the correct `wxLANGUAGE_`.
|
||||
* In `archive.py`, add the language folder to the inline list on line 68.
|
||||
* In `installer.nsi`, add entries for the language folder to the install and uninstall sections. If there's an installer translation, also add its string definitions beside all the other language string definitions, and insert its macro beside all the other language macros.
|
||||
+42
-49
@@ -126,9 +126,9 @@ h3{
|
||||
|
||||
<blockquote class="warning">Version 3 is incompatible with earlier versions, which should be removed. Any existing user rules must be manually recreated in BOSS's user interface. Some plugins sorted correctly in v2 may be sorted incorrectly by v3 until their metadata has been recorded. Please <a href="#contrib">notify the team</a> if you observe any load order issues.</blockquote>
|
||||
|
||||
<p>BOSS requires the <a href="http://www.microsoft.com/en-gb/download/details.aspx?id=40784">
|
||||
Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be installed either using its automated installer or manually. To install BOSS manually:
|
||||
<p>BOSS requires Windows Vista, 7 or 8. BOSS can be installed either using its automated installer or manually. To install BOSS manually:
|
||||
<ol>
|
||||
<li>Install the <a href="http://www.microsoft.com/en-gb/download/details.aspx?id=40784">Visual C++ Redistributable for Visual Studio 2013 (x86)</a>.
|
||||
<li>Extract the downloaded archive to a location of your choice.
|
||||
</ol>
|
||||
<p>If BOSS was installed using the installer, then use the uninstaller linked to in the Start Menu to uninstall BOSS. If BOSS was installed manually:
|
||||
@@ -146,25 +146,28 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install
|
||||
</figure>
|
||||
<p>Clicking the <q>Edit Metadata</q> button will open BOSS's <a href="#usage-custom">metadata editor</a>, where you can make changes to the metadata BOSS uses to sort plugins, the messages that get displayed for plugins, and any Bash Tag suggestions BOSS makes.
|
||||
<p>Clicking the <q>Sort Plugins</q> button will begin the <a href="#usage-sort">plugin sorting process</a>. This will sort your plugins, allow you to make any changes to the load order it produces, then display a report that details the results of BOSS's activity.
|
||||
<p>Clicking the <q>View Last Report</q> button will display the <a href="#usage-log">report</a> generated the last time BOSS sorted your plugins.
|
||||
<p>Clicking the <q>View Last Report</q> button will display the <a href="#usage-log">report</a> generated the last time BOSS sorted your plugins for the current game.
|
||||
<p>The <q>File</q> menu provides menu items for sorting plugins, viewing the debug log and the last report BOSS generated, and quitting BOSS. The menu's <q>Redate Plugins</q> option is provided so that Skyrim modders may set the load order for the Creation Kit. It is only enabled for Skyrim, and changes the timestamps of the plugins in its Data folder to match their current load order. A side effect of changing the timestamps is that any Steam Workshop mods installed will be re-downloaded.
|
||||
<p>The <q>Edit</q> menu provides menu items for accessing BOSS's metadata editor and the <a href="#usage-settings">settings window</a>.
|
||||
<p>The <q>Game</q> menu allows you to change which game BOSS is running for. Games that BOSS cannot find are greyed out, and the the one BOSS is running for is marked with a dot to its left. To change the active game, simply select another game in the list.
|
||||
<p>The <q>Game</q> menu allows you to change which game BOSS is running for. Games that BOSS cannot find are greyed out, and the the one BOSS is running for is marked with a bullet point. To change the active game, simply select another game in the list.
|
||||
<p>The <q>Help</q> menu provides a link to this readme and an about page that contains the version of BOSS being run, some legal information and a link to the <a href="http://boss-developers.github.io">project homepage</a>.
|
||||
|
||||
<h3 id="usage-sort">Sorting Plugins</h3>
|
||||
<figure>
|
||||
<img src="images/confirm.png">
|
||||
<figcaption>Editing BOSS's calculated load order.</figcaption>
|
||||
<figure class="slideshow">
|
||||
<img alt="BOSS confirmation dialog" src="images/confirm-1.png">
|
||||
<img alt="BOSS confirmation dialog with editing panel visible" src="images/confirm-2.png">
|
||||
<figcaption style="padding-top:510px;">Viewing & editing BOSS's calculated load order.</figcaption>
|
||||
</figure>
|
||||
<p>Clicking the <q>Sort Plugins</q> button in the main window will begin the sorting process.
|
||||
|
||||
<p>Provided that masterlist updating <a href="#settingsUpdateMasterlist">is enabled</a> and that a masterlist repository URL <a href="#settingsMasterlistURL">is set</a>, BOSS checks for updates to its masterlist and downloads any that are available. If there are any syntax errors in the latest masterlist (due to human error by its maintainers), the updater rolls back one version at a time until it finds a version that works. If any other errors are encountered, updating is cancelled.
|
||||
|
||||
<p>During the sorting process, BOSS extracts information from each of the plugins installed in the game's Data folder and combines this information with any relevant metadata provided by the masterlist and userlist. It then uses the combined data to build a directed graph of all the interactions between all the installed plugins. A topological sort is then carried out on the graph to produce a list of plugins in their optimal load order, according to BOSS's criteria. If a cycle is detected (eg. A depends on B depends on A), then sorting is cancelled as it becomes impossible to generate a load order that satisfies all conditions.
|
||||
<p>If successful, the calculated load order is then displayed in the dialog shown above, which allows the user to edit the load order before it is applied. Multiple plugins may be selected and moved at once. Plugins which are empty (ie. only contain a header record) are displayed in <span style="color: #7A7A7A;">grey text</span>, and plugins that are not empty and load BSAs are displayed in <span style="color: #008EDB;">blue text</span>. If <q>OK</q> button is clicked, it is then applied, and any edits made are recorded in the userlist for re-application when BOSS next sorts the game's plugins. If the <q>Cancel</q> button is clicked, then the load order and any edits made are discarded.
|
||||
<p>If successful, the calculated load order is then displayed in the dialog shown above. Plugins which are empty (ie. only contain a header record) are displayed in <span style="color: #7A7A7A;">grey text</span>, and plugins that are not empty and load BSAs are displayed in <span style="color: #008EDB;">blue text</span>.
|
||||
Clicking on a plugin in the list will display the editing panel, where its load order related metadata can be edited. The <q>Show only conflicting plugins</q> checkbox filters the plugin list so that only plugins which can be validly added to the <q>Load After</q> list and either contain conflicting records or (if the selected plugin loads a BSA) load BSAs that <i>may</i> contain conflicting resources. The checkbox must be ticked before plugins can be added to the <q>Load After</q> list, which is done by drag 'n' dropping them from the plugin list, and it must be unticked to select another plugin for editing. The priority value is explained <a href="#editingPriority">below</a>.
|
||||
<p>If the <q>Apply</q> button is clicked, BOSS does one of two things: if no edits were made, then it immediately applies the load order, but if edits were made, then it repeats the sorting process with the new edits applied. If the <q>Cancel</q> button is clicked, then the load order and any edits made are discarded.
|
||||
<p>BOSS then generates a report and displays it either in a new window or in your default browser, according to the value of the <a href="#settingsViewReports">relevant setting</a>. Any errors encountered during the sorting process will be displayed in this report, including those due to graph cycles, missing dependencies or installed incompatible plugins. See the next section for more information on the report.
|
||||
<p>BOSS is able to sort plugins ghosted by <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr>, and can extract Bash Tags and version numbers from plugin descriptions. Provided that they have the <code>Filter</code> Bash Tag present in their description, BOSS can recognise filter patches and so avoid displaying unnecessary error messages for any of their masters that may be missing.
|
||||
<p>BOSS is able to sort plugins ghosted by Wrye Bash, and can extract Bash Tags and version numbers from plugin descriptions. Provided that they have the <code>Filter</code> Bash Tag present in their description, BOSS can recognise filter patches and so avoid displaying unnecessary error messages for any of their masters that may be missing.
|
||||
<p>While reading very large plugins, such as the game's main master file, BOSS may appear to stop responding: this is not an issue. The time it takes for BOSS to sort your load order depends primarily on the size of the masterlist being used, the total size of the files in your load order, and the number of plugins in your load order. The first run is likely to be longer than subsequent runs as BOSS needs to download the full masterlist, rather than just the changes made by updates. In testing, it was found that sorting ~90 plugins with a total size of ~350 MB and a 5 MB masterlist takes around 15 seconds, though performance will vary with computer hardware.
|
||||
|
||||
|
||||
@@ -176,7 +179,7 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install
|
||||
</figure>
|
||||
|
||||
<p>BOSS's results report can be displayed either in BOSS's own report viewer, or in your default web browser, according to the value of the <a href="#settingsViewReports">relevant setting</a>.
|
||||
<p>The report is comprised of three main sections:
|
||||
<p>The report is comprised of two sections:
|
||||
<ul>
|
||||
<li>The <q>Summary</q> tab gives information on the versions of BOSS and the masterlist used, whether masterlist updating is enabled, and breaks down the numbers of each message type in the Summary and Details tabs. It also notifies you if there have been no changes in the <q>Details</q> tab since you last ran BOSS for the same game. Finally, the <q>Summary</q> tab is also where any global messages supplied in the masterlist and any errors encountered during sorting are displayed.
|
||||
<li>The <q>Details</q> tab lists the plugins BOSS sorted in their new load order, along with any messages BOSS has provided for them. BOSS will also display the plugin's <abbr title="Cyclic Redundancy Check">CRC</abbr> value and extract its version if found in the plugin's description field. If BOSS suggests any Bash Tags to be added, they will be displayed in <span style="color:green;">green text</span>, while any Bash Tags to be removed will be displayed in <span style="color:red;">red text</span>.
|
||||
@@ -210,7 +213,7 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install
|
||||
<tr><th>Field<th>Description
|
||||
<tbody>
|
||||
<tr><td>Enable User Changes<td>If this is checked, BOSS will use the metadata you supplied when sorting the current plugin. Otherwise, your metadata will be ignored.
|
||||
<tr><td>Priority<td>This is a very rough control for determining how far up or down the load order a plugin should go. Plugins with equal priority will be compared as normal by the sorting algorithm, but plugins with a larger priority value will load later in the load order than plugins with a smaller priority value, unless the former depends on the latter or the latter is explicity told to load after the former. Plugins have a default priority of <code>0</code>.
|
||||
<tr><td id="editingPriority">Priority<td>This is a very rough control for determining how far up or down the load order a plugin should go. Plugins with equal priority will be compared as normal by the sorting algorithm, but plugins with a larger priority value will load later in the load order than plugins with a smaller priority value, unless the former depends on the latter or the latter is explicity told to load after the former. Plugins have a default priority of <code>0</code>.
|
||||
<tr><td>Requirements<td>This is a list of files that are required by the current plugin for it to function correctly. BOSS will display an error message if any of the listed files are missing.
|
||||
<p>Any file, not just plugins, can be listed here, and each file has three sub-fields:
|
||||
<ul>
|
||||
@@ -231,7 +234,7 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install
|
||||
<li>The <var>language</var> is the language BOSS runs in that the message will be displayed for. For example, if the message language is set to <q>English</q> and BOSS is running in German, then the message will not be displayed. If left unspecified, the message will be shown no matter what language BOSS is running in.
|
||||
</ul>
|
||||
<p>If a message's condition determines that it should not be displayed, then it will not be displayed, no matter the language. However, if a message's condition determines that it should be displayed, but the language is specified and doesn't match the language BOSS is running in, the message will not be displayed.
|
||||
<tr><td>Bash Tags<td>A list of Bash Tags. These are used by the <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr> utilities when generating a Bashed Patch. BOSS's metadata includes Bash Tag addition and removal suggestions, and any Bash Tags that came with the plugin are also displayed.
|
||||
<tr><td>Bash Tags<td>A list of Bash Tags. These are used by Wrye Bash when generating a Bashed Patch. BOSS's metadata includes Bash Tag addition and removal suggestions, and any Bash Tags that came with the plugin are also displayed.
|
||||
<p>As BOSS can suggest Bash Tags be added or removed, it is possible for the same Tag to appear twice, being suggested for addition and removal. In such cases, removal overrides addition.
|
||||
<p>Each Bash Tag has three sub-fields:
|
||||
<ul>
|
||||
@@ -312,13 +315,7 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install
|
||||
|
||||
<p>General discussion and the submission of questions, suggestions and metadata takes place in BOSS's official threads for <a href="http://forums.bethsoft.com/topic/1434397-rel-boss-for-oblivion/">Oblivion</a>, <a href="http://forums.bethsoft.com/topic/1485022-relz-boss-for-skyrim/">Skyrim</a>, <a href="http://forums.bethsoft.com/topic/1282711-relz-boss-for-fo3-thread-4/">Fallout 3</a> and <a href="http://forums.bethsoft.com/topic/1483857-rel-boss-for-fallout-new-vegas/">Fallout: New Vegas</a>.
|
||||
|
||||
<p>Information on dirty plugins is very welcome, but for such information to be useful we require:
|
||||
<ul>
|
||||
<li>The plugin filename.
|
||||
<li>The number of records removed (the ITM count) as shown by TES4Edit/TES5Edit/FO3Edit/FNVEdit or <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr> (not the number of records processed).
|
||||
<li>The number of records undeleted (the UDR count) as shown by TES4Edit/TES5Edit/FO3Edit/FNVEdit or <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr> (not the number of records processed).
|
||||
<li>The CRC of the dirty plugin. Make sure that the CRC is of the dirty file, not the file after cleaning. The CRC may be calculated using <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr> or 7-zip, with other sources being unverified as correct. In the case of 7-zip, the <q><em>CRC checksum for data</em></q> is the one required.
|
||||
</ul>
|
||||
<p>Information on dirty plugins is very welcome, but for such information to be useful we require at least the filename and the CRC of the dirty plugin. The CRC may be calculated using Wrye Bash or 7-zip, with other sources being unverified as correct. In the case of 7-zip, the <q><em>CRC checksum for data</em></q> is the one required. In addition to the CRC, the number of records removed (the ITM count) and/or undeleted (the UDR count) are also welcome.
|
||||
|
||||
|
||||
<h2 id="translate">Translating BOSS</h2>
|
||||
@@ -346,6 +343,7 @@ To translate the BOSS application:
|
||||
<li><a href="https://github.com/boss-developers/boss-code/blob/master/resources/l10n/es/LC_MESSAGES/boss.po">Spanish</a>
|
||||
<li><a href="https://github.com/boss-developers/boss-code/blob/master/resources/l10n/zh/LC_MESSAGES/boss.po">Simplified Chinese</a>
|
||||
<li><a href="https://github.com/boss-developers/boss-code/blob/master/resources/l10n/fr/LC_MESSAGES/boss.po">French</a>
|
||||
<li><a href="https://github.com/boss-developers/boss-code/blob/master/resources/l10n/pl/LC_MESSAGES/boss.po">Polish</a>
|
||||
</ul>
|
||||
<li>Open Poedit and select <q>File->Preferences</q>, then in the <q>Editor</q> tab ensure that the checkbox for the <q>Automatically compile .mo file on save</q> setting is checked. Click <q>OK</q> to close the preferences window.
|
||||
<li>If you are starting a new translation, select <q>File->New catalogue from POT file...</q> and choose the template file you downloaded. In the <q>Catalog properties</q> dialog, just click <q>OK</q> without changing anything.
|
||||
@@ -369,12 +367,14 @@ To translate the BOSS application:
|
||||
<p>In addition to the above data-related support, the following are credited with application-related support:
|
||||
<ul>
|
||||
<li><a href="http://www.darkcreations.org">Dark Creations</a>: For hosting BOSS's Bugzilla bug tracker that was used by v2 to collect anonymous unrecognised plugin reports. Particular thanks to its administrators Andalaybay and Xae for offering to host the tracker and helping to work around Firefox and Bugzilla bugs encountered.
|
||||
<li>Surazal: For extensive testing of v1.6–2.1 prior to release and for providing the inspiration for many features through his BOSS Masterlist Manager macro for Microsoft Word.
|
||||
<li>myk002: For extensive testing and code contributions during development of v1.6–2.1.
|
||||
<li>Hickory: For extensive testing and for providing the icon used by the executables.
|
||||
<li>Scharesoft: For the installer/uninstaller German translation.
|
||||
<li>Ysne58: For testing and keeping the thread links on BOSS's Nexus site pages up to date.
|
||||
<li>For testing and feedback prior to releases: The Beta Testing & Analysis Guild at <a href="http://tesalliance.org/forums/">TES Alliance</a>, AndalayBay, dAb, dj2005, Dubiousness, hyno111, Invader, matter2003, NightStar, olminator, saebel, Telyn, wiz0floyd, wormheart, Zanderat and zone22.
|
||||
<li>Surazal: For providing the inspiration for many features through his BOSS Masterlist Manager macro for Microsoft Word.
|
||||
<li>myk002: For code contributions during development of v1.6–2.1.
|
||||
<li>Hickory: For providing the icon BOSS uses.
|
||||
<li>Ysne58: For keeping the thread links on BOSS's Nexus site pages up to date.
|
||||
<li>Łukasz Niemczyk: For the Polish translation of v3.
|
||||
<li>bluesky404: For the Chinese translation of v3.
|
||||
<li>Kaos: For the French translation of v3.
|
||||
<li>For beta testing: Surazal, myk002, Hickory, Ysne58, the <a href="http://tesalliance.org/forums/">Beta Testing & Analysis Guild at TES Alliance</a>, AndalayBay, dAb, dj2005, Dubiousness, hyno111, Invader, matter2003, NightStar, olminator, saebel, Telyn, wiz0floyd, wormheart, Zanderat, zone22 and many more.
|
||||
</ul>
|
||||
<p>BOSS is written in C++ and makes use of the <a href="http://www.davekoelle.com/alphanum.html">Alphanum</a>, <a href="http://www.boost.org/">Boost</a>, <a href="http://github.com/WrinklyNinja/libespm">libespm</a>, <a href="http://github.com/libgit2/libgit2">libgit2</a>, <a href="http://github.com/WrinklyNinja/libloadorder">libloadorder</a>, <a href="http://code.google.com/p/pugixml/">PugiXML</a>, <a href="http://www.wxwidgets.org/">wxWidgets</a> and <a href="http://code.google.com/p/yaml-cpp/">yaml-cpp</a> libraries. BOSS's reports are written in HTML5/CSS3/Javascript and make use of <a href="http://github.com/inexorabletash/polyfill">Polyfill.js</a> to provide Internet Explorer 8 compatibility. Copyright license information for all these may be found <a href="licenses/Licenses.txt">here</a>.
|
||||
|
||||
@@ -454,43 +454,35 @@ A copy of the license is included in the file named "GNU FDL v1.3.txt".</blockqu
|
||||
<h2 id="appendix">Appendices</h2>
|
||||
<h3 id="appendix-intro">Introduction To Load Orders</h3>
|
||||
<p>This appendix provides a general overview of load ordering in the games BOSS supports for those who are unfamiliar with the concept. For simplicity, <q>the game</q> will be used when the text refers to any of the games that BOSS supports.
|
||||
<p>Mod plugins for the game are files that end in <code>.esp</code> or <code>.esm</code>. These files are created by the game's official editing tools, or by third party modders' tools. They contain various data entries, which can either be brand new additions or changes to the entries added by another plugin, including the game's main master file (Oblivion.esm, Skyrim.esm, Fallout3.esm or FalloutNV.esm depending on the game). These entries cover almost all aspects of what is in the game, eg. NPCs, items, races, interiors, worlds, quests, etc.
|
||||
<p>When the game is run, it loads each of the plugins you have installed one by one. The order in which it loads them is, unsurprisingly, what is referred to as the load order. The load order is important for two reasons:
|
||||
<p>Mod plugins for the game are files that end in <code>.esp</code> or <code>.esm</code>. These files are created by the game's official editing tools, or by third-party modders' tools. They contain various data <em>records</em>, which cover almost all aspects of what is in the game – NPCs, items, races, interiors, worlds, quests, etc. – and can either be new or changes to the records added by another plugin.
|
||||
<p>When the game is run, it loads each installed plugin one by one in a certain <em>load order</em>. The load order is important for two reasons:
|
||||
<ul>
|
||||
<li>Dependency resolution.
|
||||
<li>Conflict resolution.
|
||||
<li>If one plugin changes a record added by another plugin, the former must load after the latter. If it doesn't, the game will crash on launch.
|
||||
<li>The game can only apply one version of a record, so if multiple plugins contain the same record, the last-loaded plugin's version overrides all others. This is known as the <em>rule of one</em>, and it holds true for almost all record types. Some overrides can cause problems in-game, and a good load order is one that arranges plugins to avoid such problems.
|
||||
</ul>
|
||||
<p>A plugin which changes the entries added by other plugins is dependent on those other plugins, and the game requires all of the latter plugins to be loaded before the former. If they aren't, the game will crash on launch.
|
||||
<p>The game can only apply one version of any one entry (this is known as the <q>rule of one</q>). Therefore, when more than one plugin changes the same entry, the load order is used to decide which plugin's changes are applied. Put simply, the last loaded plugin's changes are applied. The one exception to the <q>rule of one</q> is that the contents of cells (the physical space in which your character moves) can be changed by any number of plugins, so different plugins can add objects to cells, move them around or remove them and all will see their changes applied by the game.
|
||||
<p>By changing the load order, you can change which plugins override and which are overridden, and so reduce detrimental conflicts. You cannot actually reduce how much is overridden through load order alone, but it is often the case that some overrides are acceptable while others cause problems in game. Setting a good load order is the process by which you seek to maximise the former instead of the latter.
|
||||
<p>Further compatibility between mods is then possible through the use of patches, which are made to address incompatibilities between specific mods, and through the use of Wrye Bash, which can create a <q>Bashed Patch</q> that allows you to select between types of changes for different mods. For example, two mods change a piece of armour, but one changes how it looks and the other changes its effectiveness: through load order alone you could only ever get one change, but using Wrye Bash you can get both, because they change different things in the same armour entry.
|
||||
<p>There are a few hardcoded rules that trump load order in many cases:
|
||||
<p>There are a few hardcoded rules related to load order:
|
||||
<ul>
|
||||
<li>Master plugins always load before non-master plugins.
|
||||
<li>Master plugins always load before non-master plugins. The difference between the two plugin types isn't really relevant, except that a plugin's type is decided by a setting inside it, and not by its file extension (even though <code>.esm</code> stands for Elder Scrolls Master).
|
||||
<li>There is a limit of 255 active plugins that can be loaded by the game. This isn't strictly a load <em>order</em> thing, but is worth mentioning.
|
||||
<li>In Skyrim, <code>Skyrim.esm</code> always loads before all other plugins.
|
||||
<li>In Skyrim, if <code>Update.esm</code> is present, it is always loaded. If it has no load order position set, it loads after all other master plugins. That might sound a bit odd, but thanks to Skyrim's load order mechanism, it is possible for it to have no set load order position, even though it is always loaded.
|
||||
<li>In Skyrim, if <code>Update.esm</code> is present, it is always loaded. It loads after all other master plugins, unless it has another position explicitly set.
|
||||
</ul>
|
||||
<p>A plugin's position in the load order is often displayed by mod managers as a hexadecimal number, from 00 to FE (0 to 255 in decimal). The plugin with position 00 loads first, and the plugin with position FE is loaded last. Hexadecimal numbers are used to display the load order positions of plugins because these numbers form the first two digits of the code that the game uses to reference the entries that the plugin adds, so knowing the numbers allows modders and mod users to determine from which plugin an entry is from.
|
||||
<p>That's all that you as a mod user <em>need</em> to know about load orders. If you want to find out more about the actual mechanism by which the game decides the load order, read on.
|
||||
<p>Oblivion, Fallout 3 and Fallout: New Vegas all share the same mechanism for deciding load order. Skyrim, since the 1.4.26 patch, uses a different mechanism.
|
||||
<p>Load order for Oblivion, Fallout 3 and Fallout: New Vegas is decided by the modification date timestamps of the mod plugins. The active plugin with the earliest date loads first, with plugins being listed in descending date order (earliest to latest). It's a bad idea for a plugin that isn't the game's main master file to load first.
|
||||
<p>Skyrim's mechanism uses the order that plugins are listed within its <code>plugins.txt</code> file as its load order (from top to bottom). This file is the one in which the list of active plugins is stored, so only active plugins can be strictly said to have a load order.
|
||||
<p>A plugin's position in the load order is often displayed by mod managers as a hexadecimal number, from 00 to FE (0 to 255 in decimal). The plugin with position 00 loads first, and the plugin with position FE is loaded last. Hexadecimal numbers are used to display the load order positions of plugins because these numbers form the first two digits of the code that the game uses to reference the records that the plugin adds, so knowing the numbers allows modders and mod users to determine from which plugin a record is from.
|
||||
|
||||
<h3 id="appendix-dirty">Dirty Edits, Mod Cleaning & CRCs</h3>
|
||||
<p>Dirty edits are often a side-effect of mod creation, and are often due to bugs in the utilities Bethesda has provided to create mods, rather than bad practice by mod authors. Dirty edits can cause a wide range of issues, including incorrect game settings, missing content, broken quests and crashing to desktop. The more dirty edits there are in a mod, and the more mods with dirty edits you use, the more likely you are to experience issues.
|
||||
<p>Thankfully there is a way to remove dirty edits from mods relatively easily, a process known as <i>mod cleaning</i>, using TES4Edit (for Oblivion), FO3Edit (for Fallout 3), FNVEdit (for Fallout: New Vegas) or TES5Edit (for Skyrim). A detailed set of instructions and information on mod cleaning can be found on the CS Wiki's <a href="http://cs.elderscrolls.com/constwiki/index.php/TES4Edit_Cleaning_Guide">TES4Edit Cleaning Guide</a> (the page also largely applies to Fallout 3, Fallout: New Vegas and Skyrim). <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr> can also scan plugins for dirty edits and return their ITM and UDR counts, though at the time of writing it cannot clean plugins itself.
|
||||
<p>Thankfully there is a way to remove dirty edits from mods relatively easily, a process known as <i>mod cleaning</i>, using TES4Edit, FO3Edit, FNVEdit or TES5Edit (for Oblivion, Fallout 3, Fallout: New Vegas and Skyrim respectively). Detailed instructions and information on mod cleaning are available for <a href="http://cs.elderscrolls.com/constwiki/index.php/TES4Edit_Cleaning_Guide">Oblivion</a> and <a href="http://www.creationkit.com/TES5Edit_Cleaning_Guide_-_TES5Edit">Skyrim</a>, with the process being largely the same for the others.
|
||||
<p>The problem of dirty edits is largely a problem of ignorance on the part of mod authors and users alike of the problems dirty mods can cause. As such, there are community efforts to raise awareness of dirty edits and cleaning. BOSS plays a key role in these efforts, as it holds the complete list of all known dirty mods, and it uses this information to provide notification messages to users for any dirty mods they have installed.
|
||||
There are three key pieces of information that are used to accurately describe and identify an unclean mod. They are:
|
||||
<p>BOSS identifies and describes unclean plugins using four key pieces of information. They are:
|
||||
<ul>
|
||||
<li><i><abbr title="Identical To Master">ITM</abbr> Count</i>: ITM records are a type of dirty edit where a mod has overwritten something in the game without actually changing anything. If another mod lower in the load order makes an intentional change to that thing, it will have its effect cancelled out by the ITM record, which can cause problems. The ITM count is the number of ITM records found and corrected in the mod plugin.
|
||||
<li><i><abbr title="Cyclic Redundancy Check">CRC</abbr> value</i>: CRC values are a highly accurate way of identifying files based on their contents, as if the contents change, so does the CRC value. BOSS identifies an unclean plugin by comparing the installed plugin's CRC value against the CRC values for known unclean versions of that plugin. This identification method has the limitation that it can't detect unclean plugins that aren't already known as such, and won't detect unclean but edited plugins, but it's a lot faster than actually checking for dirty edits in the plugin.
|
||||
<li><i><abbr title="Identical To Master">ITM</abbr> Count</i>: ITM records are a type of dirty edit where a mod has overwritten something in the game without actually changing anything. If another mod higher up in the load order makes an intentional change to that thing, it will have its effect cancelled out by the ITM record, which can cause problems. The ITM count is the number of ITM records found and corrected in the mod plugin.
|
||||
<li><i><abbr title="Undeleted and Disabled Reference">UDR</abbr> Count</i>: Deleting records is a significant cause of crashes and game bugs. UDRs are records that the mod deleted from the game or from another mod that have been corrected safely by undeleting them and disabling them instead, which has the same intended effect without causing issues. The UDR count is the number of deleted reference records found and corrected in the mod plugin.
|
||||
<li><i>CRC</i> or <i>Checksum</i>: A file's CRC is a highly accurate way of identifying it, and is a number calculated from the file's contents. If the contents of a file changes, so will its CRC. BOSS uses CRCs to check if a user's mods are dirty by checking their CRCs against pre-determined CRCs of known dirty mods. This lets BOSS give precise notification messages for any dirty mods it detects. BOSS can calculate the CRCs of all your installed plugins if run from the GUI with the <q>Display File CRCs</q> option enabled.
|
||||
<li><i>Deleted Navmesh Count</i>: Like deleting records, deleting navmeshes can cause crashes. However, these cannot be automatically corrected, and require manual cleaning. Navmeshes don't exist in Oblivion, so this information doesn't apply.
|
||||
</ul>
|
||||
<p>However, not all unclean mods have all or any of these pieces of information. For unclean mods whose ITM and UDR counts have not been reported, BOSS cannot give them. For unclean mods whose CRCs have not been reported, BOSS cannot give precise notification and so prints a message whether or not the user has cleaned their mod.
|
||||
<p>BOSS and the modding communities rely on user contribution of this information to progress. For information on how to contribute, see the <a href="#contrib">Contributing To BOSS</a> section below. If you find that a mod is dirty, you should also report this to the mod's author so that they can fix it.
|
||||
<p><b>Note:</b> TES4Edit et al. will include a variety of <em>junk records</em> in the ITM count for a plugin, such as new empty cells that are automatically generated by the Construction Set and are almost impossible to remove. These junk records are non-harmful, and BOSS will inform users when a mod contains these to avoid confusion. This is also the source of any discrepancies between the counts produced by TES4Edit and those produced by <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr>. The latter's counts are more technically accurate, but both are acceptable for use.
|
||||
<p>There is also another type of unnecessary edit, known as a wild edit, that can also cause problems. These edits are neither Identical To Master edits nor deleted records, so cannot be automatically cleaned. Cleaning must be manually done in TES4Edit/FO3Edit/FNVEdit. BOSS can still check for plugins with these edits if the CRCs of the plugins with wild edits are known, and it can provide notification of these edits and some information on fixing them if they are reported in an official BOSS thread.
|
||||
<p>In addition to the above, there is another type of dirty edit known as a <em>wild edit</em>. These are any edit that is unrelated to the purpose of the mod, and so provide unnecessary opportunity for conflicts with other mods that do need to change the same thing. It can be difficult to tell if an edit is a wild edit, and so they cannot be automatically cleaned. BOSS can still notify users of wild edits and link to information on fixing them if the CRCs of plugins with wild edits are reported, along with details on what needs cleaning.
|
||||
<p>BOSS and the modding communities rely on user contribution of this information to progress. For information on how to contribute, see <a href="#contrib">Contributing To BOSS</a>. If you find that a mod contains dirty edits, you should also report this to the mod's author so that they can fix it.
|
||||
<p><b>Note:</b> TES4Edit et al. will include a variety of <em>junk records</em> in the ITM count for a plugin, such as new empty cells that are automatically generated and are almost impossible to remove. These junk records are non-harmful, and BOSS may inform users when a mod contains these and no true ITMs to avoid confusion.
|
||||
|
||||
<h3 id="appendix-permissions">File Permissions</h3>
|
||||
<p>If you are running Windows Vista or a later version of Windows, BOSS (and other modding programs) may be prevented from working correctly by the UAC security feature. There are four common workarounds to this problem:
|
||||
@@ -559,6 +551,7 @@ There are three key pieces of information that are used to accurately describe a
|
||||
<tr><td>BOSS Log plugin submission<td>BOSS allows users to submit unrecognised plugins from the HTML BOSS Log.<td>As there is no longer any such thing as an unrecognised plugin, the submission system has been removed.
|
||||
<tr><td>BOSS Log display customisation<td>BOSS allows users to customise the colour scheme used by the BOSS Log.<td>BOSS does not allow customisation of the colour scheme used by the BOSS report. However, the styling is now provided by a static stylesheet instead of being dynamically generated within the report every time BOSS is run, so this static stylesheet can be edited to achieve the same effect.
|
||||
<tr><td>Command line interface<td>BOSS provides a command line interface.<td>BOSS does not provide a command line interface, as the greater need for user interaction makes it unwieldy.
|
||||
<tr><td>Windows XP support<td>Supports Windows XP.<td>Does not support Windows XP.
|
||||
</table>
|
||||
|
||||
<h2 id="history">Version History</h2>
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# Build Instructions using Microsoft Visual C++
|
||||
|
||||
These instructions were used to build BOSS using Microsoft Visual Studio Express 2013 for Desktop, though they should also apply to other versions of MSVC. BOSS's CMake configuration builds an executable that can be run on Windows XP, but this support has only been implemented for MSVC 2013 - other versions may require editing of BOSS's `CMakeLists.txt` file.
|
||||
|
||||
#### Boost
|
||||
|
||||
```
|
||||
bootstrap.bat
|
||||
b2 toolset=msvc-12.0 threadapi=win32 link=static variant=release address-model=32 --with-log --with-date_time --with-thread --with-filesystem --with-locale --with-regex --with-system --with-iostreams --stagedir=stage-32
|
||||
```
|
||||
|
||||
#### wxWidgets
|
||||
|
||||
Just build the solution provided by wxWidgets.
|
||||
|
||||
#### zlib
|
||||
|
||||
1. Add `/safeseh` to both lines in `contrib\masmx86\bld_ml32.bat`.
|
||||
2. Build the solution in `contrib\vstudio`.
|
||||
3. Copy `build\zconf.h` to `.\zconf.h`.
|
||||
|
||||
#### yaml-cpp
|
||||
|
||||
1. Set CMake up so that it builds the binaries in the `build` subdirectory of the yaml-cpp folder.
|
||||
2. Define `BOOST_ROOT` to point to where the Boost folder is.
|
||||
3. Configure CMake, then generate a build system for Visual Studio 12.
|
||||
4. Open the generated solution file, and build it.
|
||||
|
||||
#### Libloadorder
|
||||
|
||||
Follow the instructions in libloadorder's README.md to build it as a static library.
|
||||
|
||||
#### Libgit2
|
||||
|
||||
1. Set CMake up so that it builds the binaries in the `build` subdirectory of the libgit2 folder.
|
||||
2. Configure CMake.
|
||||
3. Undefine `BUILD_SHARED_LIBS`.
|
||||
4. Generate a build system for Visual Studio 12.
|
||||
5. Open the generated solution file, and build it.
|
||||
|
||||
You may need to make sure that the configuration properties for the Visual Studio project are set to use the multithreaded DLL runtime library (C/C++->Code Generation).
|
||||
|
||||
#### BOSS
|
||||
|
||||
1. Set CMake up so that it builds the binaries in the `build` subdirectory of the BOSS folder.
|
||||
2. Define `PROJECT_ARCH=32` or `PROJECT_ARCH=64` to build 32 or 64 bit executables respectively.
|
||||
3. Define `PROJECT_LINK=STATIC` to build a static API, or `PROJECT_LINK=SHARED` to build a DLL API.
|
||||
4. Define `PROEJCT_LIBS_DIR` to point to the folder holding all the required libraries' folders.
|
||||
5. Configure CMake, then generate a build system for Visual Studio 12.
|
||||
6. Open the generated solution file, and build it.
|
||||
@@ -0,0 +1,62 @@
|
||||
# Build Instructions using MinGW
|
||||
|
||||
These instructions were used to build BOSS using mingw-w64 on Ubuntu and Debian linux, though they should also apply to other similar environments.
|
||||
|
||||
#### Boost
|
||||
|
||||
```
|
||||
./bootstrap.sh
|
||||
echo "using gcc : 4.6.3 : i686-w64-mingw32-g++ : <rc>i686-w64-mingw32-windres <archiver>i686-w64-mingw32-ar <ranlib>i686-w64-mingw32-ranlib ;" > tools/build/v2/user-config.jam
|
||||
./b2 toolset=gcc-4.6.3 target-os=windows threadapi=win32 link=static runtime-link=static variant=release address-model=32 cxxflags=-fPIC --with-log --with-date_time --with-thread --with-filesystem --with-locale --with-regex --with-system --with-iostreams --stagedir=stage-32
|
||||
```
|
||||
|
||||
#### wxWidgets
|
||||
|
||||
```
|
||||
./configure --host=i686-w64-mingw32 --disable-shared --enable-stl
|
||||
make
|
||||
```
|
||||
|
||||
#### zlib
|
||||
|
||||
```
|
||||
mkdir build && cd build
|
||||
cmake .. -DCMAKE_C_FLAGS=-m32 -DPROJECT_ARCH=32 -DCMAKE_TOOLCHAIN_FILE=../BOSSv3/mingw-toolchain.cmake
|
||||
make
|
||||
cp zconf.h ../zconf.h
|
||||
```
|
||||
|
||||
#### yaml-cpp
|
||||
|
||||
```
|
||||
cmake . -DCMAKE_C_FLAGS=-m32 -DPROJECT_ARCH=32 -DCMAKE_TOOLCHAIN_FILE=../BOSSv3/mingw-toolchain.cmake -DBOOST_ROOT=../boost
|
||||
make
|
||||
```
|
||||
|
||||
#### Libloadorder
|
||||
|
||||
Follow the instructions in libloadorder's README.md to build it as a static library.
|
||||
|
||||
#### OpenSSL
|
||||
|
||||
```
|
||||
./Configure --cross-compile-prefix=i686-w64-mingw32- mingw
|
||||
make
|
||||
```
|
||||
|
||||
#### Libgit2
|
||||
|
||||
```
|
||||
mkdir build && cd build
|
||||
cmake .. -DBUILD_SHARED_LIBS=OFF -DOPENSSL_ROOT_DIR=../openssl -DCMAKE_C_FLAGS=-m32 -DPROJECT_ARCH=32 -DCMAKE_TOOLCHAIN_FILE=../BOSSv3/mingw-toolchain.cmake
|
||||
make
|
||||
```
|
||||
If building with SSL support using OpenSSL, also pass ``.
|
||||
|
||||
#### BOSS
|
||||
|
||||
```
|
||||
mkdir build && cd build
|
||||
cmake .. -DPROJECT_LIBS_DIR=".." -DPROJECT_ARCH=32 -DPROJECT_LINK=STATIC -DCMAKE_TOOLCHAIN_FILE="mingw-toolchain.cmake"
|
||||
make
|
||||
```
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
@@ -3,7 +3,7 @@ msgstr ""
|
||||
"Project-Id-Version: BOSS v3.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-10-26 11:41-0000\n"
|
||||
"PO-Revision-Date: 2014-02-02 19:20+0100\n"
|
||||
"PO-Revision-Date: 2014-02-10 14:48+0100\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: French\n"
|
||||
@@ -15,33 +15,33 @@ msgstr ""
|
||||
|
||||
#: backend/game.cpp:96
|
||||
msgid "Invalid game ID supplied."
|
||||
msgstr "ID du jeu fourni incorrect"
|
||||
msgstr "ID du jeu fournie incorrecte."
|
||||
|
||||
#: backend/game.cpp:147
|
||||
msgid "Game path could not be detected."
|
||||
msgstr "Le chemin du jeu n'a pas pu être trouvée. "
|
||||
msgstr "Le chemin du jeu n'a pas pu être trouvé. "
|
||||
|
||||
#: backend/game.cpp:248 backend/game.cpp:308 backend/game.cpp:363
|
||||
msgid "libloadorder failed to create a game handle. Details:"
|
||||
msgstr "libloadorder n'est pas parveni à créer une poignée du jeu. Détails : "
|
||||
msgstr "libloadorder n'est pas parvenu à créer une poignée du jeu. Détails :"
|
||||
|
||||
#: backend/game.cpp:260 backend/game.cpp:320 backend/game.cpp:374
|
||||
msgid "libloadorder failed to initialise game master file support. Details:"
|
||||
msgstr ""
|
||||
"libloadorder a échoué dans l'initialisation du support de fichier maître du "
|
||||
"jeu. Détails ; "
|
||||
"jeu. Détails :"
|
||||
|
||||
#: backend/game.cpp:270
|
||||
msgid "libloadorder failed to get the active plugins list. Details:"
|
||||
msgstr "libloadorer n'a pas pu obtenir la liste des plugins actifs. Détails : "
|
||||
msgstr "libloadorer n'a pas pu obtenir la liste des plugins actifs. Détails :"
|
||||
|
||||
#: backend/game.cpp:330 backend/game.cpp:396
|
||||
msgid "libloadorder failed to set the load order. Details:"
|
||||
msgstr "libloadorder n'a pu définir l'ordre de chargement. Détails : "
|
||||
msgstr "libloadorder n'a pas pu définir l'ordre de chargement. Détails :"
|
||||
|
||||
#: backend/game.cpp:415
|
||||
msgid "Could not create BOSS folder for game. Details:"
|
||||
msgstr "Impossible de créer le dossier de BOSS pour ce jeu. Détails : "
|
||||
msgstr "Impossible de créer le dossier de BOSS pour ce jeu. Détails :"
|
||||
|
||||
#: backend/graph.cpp:46
|
||||
msgid "Cyclic interaction detected between plugins \"%1%\" and \"%2%\"."
|
||||
@@ -81,7 +81,7 @@ msgstr "L'opération d'obtention a échoué. Erreur : %1%"
|
||||
|
||||
#: backend/network.cpp:338
|
||||
msgid "Masterlist revision"
|
||||
msgstr "Révision de la Masterlist"
|
||||
msgstr "Révision de la masterlist"
|
||||
|
||||
#: gui/editor.cpp:37
|
||||
msgid "Note"
|
||||
@@ -130,7 +130,7 @@ msgstr "Ajouter un fichier"
|
||||
|
||||
#: gui/editor.cpp:128 gui/editor.cpp:376
|
||||
msgid "Edit File"
|
||||
msgstr "Éditer un fichier ="
|
||||
msgstr "Éditer un fichier"
|
||||
|
||||
#: gui/editor.cpp:129 gui/editor.cpp:377
|
||||
msgid "Remove File"
|
||||
@@ -138,7 +138,7 @@ msgstr "Retirer un fichier"
|
||||
|
||||
#: gui/editor.cpp:130
|
||||
msgid "Save Changes"
|
||||
msgstr "Sauvegarder les changements"
|
||||
msgstr "Sauvegarder les modifications"
|
||||
|
||||
#: gui/editor.cpp:131
|
||||
msgid "Cancel"
|
||||
@@ -170,7 +170,7 @@ msgstr "Étiquettes du bash"
|
||||
|
||||
#: gui/editor.cpp:148
|
||||
msgid "Dirty Info"
|
||||
msgstr "Infos sur les saletés. "
|
||||
msgstr "Infos sur les entrées sales"
|
||||
|
||||
#: gui/editor.cpp:151
|
||||
msgid "Plugins"
|
||||
@@ -214,7 +214,7 @@ msgstr "Utilitaire de nettoyage"
|
||||
|
||||
#: gui/editor.cpp:217
|
||||
msgid "Priority: "
|
||||
msgstr "Priorité : "
|
||||
msgstr "Priorité :"
|
||||
|
||||
#: gui/editor.cpp:379
|
||||
msgid "Add Plugin"
|
||||
@@ -226,7 +226,7 @@ msgstr "Éditer un plugin"
|
||||
|
||||
#: gui/editor.cpp:381
|
||||
msgid "Remove Plugin"
|
||||
msgstr "Retirer plugin"
|
||||
msgstr "Retirer un plugin"
|
||||
|
||||
#: gui/editor.cpp:383
|
||||
msgid "Add Message"
|
||||
@@ -242,7 +242,7 @@ msgstr "Retirer un message"
|
||||
|
||||
#: gui/editor.cpp:387
|
||||
msgid "Add Bash Tag"
|
||||
msgstr "AJouter une étiquette"
|
||||
msgstr "Ajouter une étiquette"
|
||||
|
||||
#: gui/editor.cpp:388
|
||||
msgid "Edit Bash Tag"
|
||||
@@ -254,7 +254,7 @@ msgstr "Retirer l'étiquette"
|
||||
|
||||
#: gui/editor.cpp:391
|
||||
msgid "Add Dirty Info"
|
||||
msgstr "Ajouter une information à propos d'une entrée sale"
|
||||
msgstr "Ajouter une information sur les entrée sales"
|
||||
|
||||
#: gui/editor.cpp:392
|
||||
msgid "Edit Dirty Info"
|
||||
@@ -262,11 +262,11 @@ msgstr "Éditer les informations sur les entrées sales"
|
||||
|
||||
#: gui/editor.cpp:393
|
||||
msgid "Remove Dirty Info"
|
||||
msgstr "Rerirer l'information concernant la saleté. "
|
||||
msgstr "Retirer l'information sur les entrées sales "
|
||||
|
||||
#: gui/editor.cpp:411
|
||||
msgid "BOSS: Add File/Plugin"
|
||||
msgstr "BOSS : Ajouter un fichier / Plugin-in"
|
||||
msgstr "BOSS : Ajouter un fichier / plugin"
|
||||
|
||||
#: gui/editor.cpp:433
|
||||
msgid "BOSS: Add Message"
|
||||
@@ -293,11 +293,11 @@ msgstr "BOSS : Ajouter une étiquette"
|
||||
|
||||
#: gui/editor.cpp:468
|
||||
msgid "BOSS: Add Dirty Info"
|
||||
msgstr "BOSS : Ajouter des informations sur la saleté"
|
||||
msgstr "BOSS : Ajouter des informations sur les entrées sales"
|
||||
|
||||
#: gui/editor.cpp:487
|
||||
msgid "BOSS: Edit File/Plugin"
|
||||
msgstr "BOSS : Éditer le fichir / Plugin-in"
|
||||
msgstr "BOSS : Éditer le fichier / plugin"
|
||||
|
||||
#: gui/editor.cpp:511
|
||||
msgid "BOSS: Edit Message"
|
||||
@@ -313,15 +313,15 @@ msgstr "BOSS : Édition des étiquettes"
|
||||
|
||||
#: gui/editor.cpp:557
|
||||
msgid "BOSS: Edit Dirty Info"
|
||||
msgstr "BOSS : Édition des informations sur la saleté. "
|
||||
msgstr "BOSS : Édition des informations sur la saleté"
|
||||
|
||||
#: gui/editor.cpp:932
|
||||
msgid "Filename (required):"
|
||||
msgstr "Nom du fichier (requis) : "
|
||||
msgstr "Nom du fichier (requis) :"
|
||||
|
||||
#: gui/editor.cpp:935
|
||||
msgid "Displayed Name:"
|
||||
msgstr "Nom affiché : "
|
||||
msgstr "Nom affiché :"
|
||||
|
||||
#: gui/editor.cpp:938 gui/editor.cpp:1016 gui/editor.cpp:1172
|
||||
msgid "Condition:"
|
||||
@@ -345,15 +345,15 @@ msgstr "String"
|
||||
|
||||
#: gui/editor.cpp:1013 gui/settings.cpp:425
|
||||
msgid "Type:"
|
||||
msgstr "Type : "
|
||||
msgstr "Type :"
|
||||
|
||||
#: gui/editor.cpp:1028 gui/settings.cpp:101
|
||||
msgid "Language:"
|
||||
msgstr "Langue : "
|
||||
msgstr "Langue :"
|
||||
|
||||
#: gui/editor.cpp:1031
|
||||
msgid "Content:"
|
||||
msgstr "Contenu : "
|
||||
msgstr "Contenu :"
|
||||
|
||||
#: gui/editor.cpp:1121 gui/editor.cpp:1136
|
||||
msgid "Error: No content row selected."
|
||||
@@ -361,31 +361,31 @@ msgstr "Erreur : Aucun contenu sélectionné. "
|
||||
|
||||
#: gui/editor.cpp:1166
|
||||
msgid "Add/Remove:"
|
||||
msgstr "Ajouter/Retirer"
|
||||
msgstr "Ajouter/Retirer :"
|
||||
|
||||
#: gui/editor.cpp:1169 gui/settings.cpp:422
|
||||
msgid "Name (required):"
|
||||
msgstr "Nom (Requis) : "
|
||||
msgstr "Nom (requis) :"
|
||||
|
||||
#: gui/editor.cpp:1234
|
||||
msgid "CRC (required):"
|
||||
msgstr "CRC (requis):"
|
||||
msgstr "CRC (requis) :"
|
||||
|
||||
#: gui/editor.cpp:1237
|
||||
msgid "ITM Count:"
|
||||
msgstr "Énumération des ITM : "
|
||||
msgstr "Énumération des ITM :"
|
||||
|
||||
#: gui/editor.cpp:1240
|
||||
msgid "UDR Count:"
|
||||
msgstr "Énumération des UDR : "
|
||||
msgstr "Énumération des UDR :"
|
||||
|
||||
#: gui/editor.cpp:1243
|
||||
msgid "Deleted Navmesh Count:"
|
||||
msgstr "Énumération des Navmesh supprimés : "
|
||||
msgstr "Énumération des Navmesh supprimés :"
|
||||
|
||||
#: gui/editor.cpp:1246
|
||||
msgid "Cleaning Utility (required):"
|
||||
msgstr "Utilitaire de nettoyage (requis) : "
|
||||
msgstr "Utilitaire de nettoyage (requis) :"
|
||||
|
||||
#: gui/ids.cpp:31
|
||||
msgid "None Specified"
|
||||
@@ -397,7 +397,7 @@ msgstr "Le fichier masterlist n'a pas pu être actualisé. Détails: %1%"
|
||||
|
||||
#: gui/main.cpp:134
|
||||
msgid "Masterlist parsing failed. Details: %1%"
|
||||
msgstr "L'analyse de la masterlist a échouée. Détails : %1%"
|
||||
msgstr "L'analyse de la masterlist a échoué. Détails : %1%"
|
||||
|
||||
#: gui/main.cpp:142
|
||||
msgid "Unknown"
|
||||
@@ -414,11 +414,11 @@ msgstr "Erreur : BOSS est déjà lancé. Cette version va maintenant s'arrêter.
|
||||
|
||||
#: gui/main.cpp:180
|
||||
msgid "Error: Could not create local app data BOSS folder."
|
||||
msgstr "Erreur : Impossible de créer le dossier local BOSS app data. "
|
||||
msgstr "Erreur : Impossible de créer le dossier local app data BOSS."
|
||||
|
||||
#: gui/main.cpp:193
|
||||
msgid "Error: Settings parsing failed. %1%"
|
||||
msgstr "Erreur : Les paramètres d'analyse ont échoués. %1%"
|
||||
msgstr "Erreur : Les paramètres d'analyse ont échoué. %1%"
|
||||
|
||||
#: gui/main.cpp:272
|
||||
msgid "Error: Could not apply translation."
|
||||
@@ -436,11 +436,11 @@ msgstr ""
|
||||
|
||||
#: gui/main.cpp:303
|
||||
msgid "Error: Games' settings parsing failed. %1%"
|
||||
msgstr "Erreur : Les paramètres d'analyse du jeu ont échoués. %1%"
|
||||
msgstr "Erreur : Les paramètres d'analyse du jeu ont échoué. %1%"
|
||||
|
||||
#: gui/main.cpp:334
|
||||
msgid "Error: None of the supported games were detected."
|
||||
msgstr "Erreur : Aucun des jeux pris en chargé n'a été détecté. "
|
||||
msgstr "Erreur : Aucun des jeux pris en charge n'a été détecté. "
|
||||
|
||||
#: gui/main.cpp:379
|
||||
msgid "Edit Metadata"
|
||||
@@ -448,7 +448,7 @@ msgstr "Éditer les métadonnées"
|
||||
|
||||
#: gui/main.cpp:380
|
||||
msgid "Sort Plugins"
|
||||
msgstr "Trier les plug-ins"
|
||||
msgstr "Trier les plugins"
|
||||
|
||||
#: gui/main.cpp:381
|
||||
msgid "View Last Report"
|
||||
@@ -464,11 +464,11 @@ msgstr "Voir le &journal débogage"
|
||||
|
||||
#: gui/main.cpp:387
|
||||
msgid "&Sort Plugins"
|
||||
msgstr "&Trier les plug-ins"
|
||||
msgstr "&Trier les plugins"
|
||||
|
||||
#: gui/main.cpp:388
|
||||
msgid "&Redate Plugins"
|
||||
msgstr "&Redater le plugin"
|
||||
msgstr "&Redater les plugins"
|
||||
|
||||
#: gui/main.cpp:391
|
||||
msgid "&File"
|
||||
@@ -480,7 +480,7 @@ msgstr "&Métadonnées"
|
||||
|
||||
#: gui/main.cpp:394
|
||||
msgid "&Settings..."
|
||||
msgstr "&Règlages"
|
||||
msgstr "&Paramètres"
|
||||
|
||||
#: gui/main.cpp:395
|
||||
msgid "&Edit"
|
||||
@@ -488,7 +488,7 @@ msgstr "&Éditer"
|
||||
|
||||
#: gui/main.cpp:407
|
||||
msgid "&Game"
|
||||
msgstr "&Jeux"
|
||||
msgstr "&Jeu"
|
||||
|
||||
#: gui/main.cpp:412
|
||||
msgid "&Help"
|
||||
@@ -496,11 +496,11 @@ msgstr "&Aide"
|
||||
|
||||
#: gui/main.cpp:496 gui/main.cpp:851
|
||||
msgid "BOSS: Working..."
|
||||
msgstr "BOSS : En train de travailler "
|
||||
msgstr "BOSS : En cours"
|
||||
|
||||
#: gui/main.cpp:496 gui/main.cpp:851
|
||||
msgid "BOSS working..."
|
||||
msgstr "BOSS travail..."
|
||||
msgstr "BOSS en cours..."
|
||||
|
||||
#: gui/main.cpp:547
|
||||
msgid "Userlist parsing failed. Details: %1%"
|
||||
@@ -511,13 +511,13 @@ msgid ""
|
||||
"A global message contains a condition that could not be evaluated. Details: "
|
||||
"%1%"
|
||||
msgstr ""
|
||||
"Un message global contient une condition qui n'a pas pu être évalué. "
|
||||
"Un message global contient une condition qui n'a pas pu être évaluée. "
|
||||
"Détails : %1%"
|
||||
|
||||
#: gui/main.cpp:615
|
||||
msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%"
|
||||
msgstr ""
|
||||
"\"%1%\" contient une condition qui n'a pas pu être évalué. Détails : %2%"
|
||||
"\"%1%\" contient une condition qui n'a pas pu être évaluée. Détails : %2%"
|
||||
|
||||
#: gui/main.cpp:627
|
||||
msgid "\"%1%\" is incompatible with \"%2%\" and is present."
|
||||
@@ -533,7 +533,7 @@ msgstr "Impossible de générer l'image graphique. Détails : %1%"
|
||||
|
||||
#: gui/main.cpp:687
|
||||
msgid "BOSS: Calculated Load Order"
|
||||
msgstr "BOSS : En train de définir l'ordre de chargement. "
|
||||
msgstr "BOSS : Ordre de chargement défini"
|
||||
|
||||
#: gui/main.cpp:765
|
||||
msgid "Failed to set the load order. Details: %1%"
|
||||
@@ -579,8 +579,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Cette fonction est prévue pour que les moddeurs qui utilisent le Creation "
|
||||
"Kit puissent définir l'ordre de chargement qu'ils utilisent. L'effet "
|
||||
"secondaire est que les mods souscrits sur le Steam Workshop seront "
|
||||
"retéléchargés pat Steam. Voulez-vous continuer ? "
|
||||
"secondaire est que les mods choisis sur le Steam Workshop seront "
|
||||
"retéléchargés par Steam. Voulez-vous continuer ? "
|
||||
|
||||
#: gui/main.cpp:961
|
||||
msgid "BOSS: Warning"
|
||||
@@ -604,11 +604,11 @@ msgstr "BOSS : Redater le plug-in"
|
||||
|
||||
#: gui/main.cpp:1024
|
||||
msgid "BOSS: Settings"
|
||||
msgstr "BOSS: Configuration"
|
||||
msgstr "BOSS : Configuration"
|
||||
|
||||
#: gui/main.cpp:1059 gui/main.cpp:1074
|
||||
msgid "Error: \"%1%\" cannot be found."
|
||||
msgstr "Erreur: \"%1%\" n'a pas être trouvé"
|
||||
msgstr "Erreur: \"%1%\" n'a pas être trouvé."
|
||||
|
||||
#: gui/main.cpp:1086
|
||||
msgid ""
|
||||
@@ -616,7 +616,7 @@ msgid ""
|
||||
"Master system."
|
||||
msgstr ""
|
||||
"Un outil d'optimisation de l'ordre de chargement pour les jeux qui utilisent "
|
||||
"le système des Elder Scrols Plugin/Master"
|
||||
"le système des Elder Scrols plugin/master."
|
||||
|
||||
#: gui/main.cpp:1110
|
||||
msgid "Up"
|
||||
@@ -635,14 +635,14 @@ msgid ""
|
||||
"Please submit any alterations made for reasons other than user preference \n"
|
||||
"to the BOSS team so that they may include the changes in the masterlist."
|
||||
msgstr ""
|
||||
"S'il vous plaît, soumettez les modifications apportées pour des raisons "
|
||||
"autres que la préfèrence de l'utilisateur \n"
|
||||
" à l'équipe de BOSS afin qu'elle puisse l'inclure les changements dans la "
|
||||
"Veuillez soumettre les modifications apportées pour des raisons autres que "
|
||||
"la préfèrence de l'utilisateur \n"
|
||||
" à l'équipe de BOSS afin qu'elle puisse inclure les changements dans la "
|
||||
"masterlist. "
|
||||
|
||||
#: gui/main.cpp:1181 gui/main.cpp:1226
|
||||
msgid "Error: Cannot load \"%1%\" before \"%2%\"."
|
||||
msgstr "Erreur : Impossible de charger %1% avant %2%"
|
||||
msgstr "Erreur : Impossible de charger \"%1%\" avant \"%2%\"."
|
||||
|
||||
#: gui/settings.cpp:40
|
||||
msgid "None"
|
||||
@@ -694,7 +694,7 @@ msgstr "Nom"
|
||||
|
||||
#: gui/settings.cpp:69
|
||||
msgid "Base Game Type"
|
||||
msgstr "Type du jeu de base. "
|
||||
msgstr "Type du jeu de base"
|
||||
|
||||
#: gui/settings.cpp:70
|
||||
msgid "BOSS Folder Name"
|
||||
@@ -718,11 +718,11 @@ msgstr "Clé du registre du chemin d'installation. "
|
||||
|
||||
#: gui/settings.cpp:98
|
||||
msgid "Default Game:"
|
||||
msgstr "Jeu par défaut : "
|
||||
msgstr "Jeu par défaut :"
|
||||
|
||||
#: gui/settings.cpp:104
|
||||
msgid "Debug Verbosity:"
|
||||
msgstr "Niveau de détails de la sortie du débogage : "
|
||||
msgstr "Niveau de détails de la sortie du débogage :"
|
||||
|
||||
#: gui/settings.cpp:126
|
||||
msgid "Language and game changes will be applied after BOSS is restarted."
|
||||
@@ -732,7 +732,7 @@ msgstr ""
|
||||
|
||||
#: gui/settings.cpp:139
|
||||
msgid "The output is logged to the BOSSDebugLog.txt file."
|
||||
msgstr "Les informations sont enregistrées dans le fichier BOSSDEbugLog.txt..."
|
||||
msgstr "Les informations sont enregistrées dans le fichier BOSSDEbugLog.txt."
|
||||
|
||||
#: gui/settings.cpp:279
|
||||
msgid "BOSS: Add Game"
|
||||
@@ -798,7 +798,7 @@ msgstr "Suggestion(s) d'étiquette : "
|
||||
|
||||
#: backend/generators.h:84
|
||||
msgid "Warning:"
|
||||
msgstr "Averissement : "
|
||||
msgstr "Avertissement : "
|
||||
|
||||
#: backend/generators.h:86
|
||||
msgid "Error:"
|
||||
@@ -866,22 +866,22 @@ msgstr "Nombre d'erreurs"
|
||||
|
||||
#: backend/generators.h:385
|
||||
msgid "Version:"
|
||||
msgstr "Version:"
|
||||
msgstr "Version :"
|
||||
|
||||
#: backend/generators.h:405
|
||||
msgid "Add:"
|
||||
msgstr "Ajouter : "
|
||||
msgstr "Ajouter :"
|
||||
|
||||
#: backend/generators.h:411
|
||||
msgid "Remove:"
|
||||
msgstr ""
|
||||
msgstr "Retirer :"
|
||||
|
||||
#: backend/generators.h:419
|
||||
msgid ""
|
||||
"Contains %1% ITM records, %2% UDR records and %3% deleted navmeshes. Clean "
|
||||
"with %4%."
|
||||
msgstr ""
|
||||
"Contient %1% enregistrement d'ITM, %2% enregistrements d'UDR et %3% "
|
||||
"Contient %1% enregistrements d'ITM, %2% enregistrements d'UDR et %3% "
|
||||
"navmeshes supprimés. Nettoyez-les avec %4%. "
|
||||
|
||||
#: backend/generators.h:421
|
||||
@@ -905,18 +905,18 @@ msgstr "Contient %1% enregistrements d'UDR. Nettoyez-les avec %2%. "
|
||||
#: backend/generators.h:432
|
||||
msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%."
|
||||
msgstr ""
|
||||
"Contient %1% enregistrement d'ITM, %2% navmeshes supprimés. Nettoyez-les "
|
||||
"Contient %1% enregistrements d'ITM, %2% navmeshes supprimés. Nettoyez-les "
|
||||
"avec %3%. "
|
||||
|
||||
#: backend/generators.h:434
|
||||
msgid "Contains %1% ITM records. Clean with %2%."
|
||||
msgstr "Contient %1% enregistrement d'ITM. Nettoyez-les avec %2%. "
|
||||
msgstr "Contient %1% enregistrements d'ITM. Nettoyez-les avec %2%. "
|
||||
|
||||
#: backend/generators.h:437
|
||||
msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%."
|
||||
msgstr ""
|
||||
"Contient %1% enregistrement d'ITM et %2% enregistrements d'UDR. Nettoyez-les "
|
||||
"avec %3%. "
|
||||
"Contient %1% enregistrements d'ITM et %2% enregistrements d'UDR. Nettoyez-"
|
||||
"les avec %3%. "
|
||||
|
||||
#: backend/generators.h:474
|
||||
msgid "The BOSS Report requires Javascript to be enabled in order to function."
|
||||
@@ -941,7 +941,7 @@ msgstr "Cacher les notes"
|
||||
|
||||
#: backend/generators.h:555
|
||||
msgid "Hide 'Do Not Clean' Messages"
|
||||
msgstr "Cacher les messages \"Ne pas nettoyer\""
|
||||
msgstr "Cacher les messages 'Ne pas nettoyer'"
|
||||
|
||||
#: backend/generators.h:563
|
||||
msgid "Hide All Plugin Messages"
|
||||
@@ -953,11 +953,11 @@ msgstr "Cacher tous les plugins sans message"
|
||||
|
||||
#: backend/generators.h:581
|
||||
msgid "%1% of %2% plugins hidden."
|
||||
msgstr "%1% de %2% plugins cachés"
|
||||
msgstr "%1% sur %2% plugins cachés."
|
||||
|
||||
#: backend/generators.h:589
|
||||
msgid "%1% of %2% messages hidden."
|
||||
msgstr "%1% de %2% messages cachés"
|
||||
msgstr "%1% sur %2% messages cachés."
|
||||
|
||||
#: backend/generators.h:631
|
||||
msgid "Could not write BOSS report."
|
||||
@@ -965,15 +965,15 @@ msgstr "Impossible d'écrire le rapport de BOSS. "
|
||||
|
||||
#: backend/parsers.h:466 backend/parsers.h:549
|
||||
msgid "Invalid file path:"
|
||||
msgstr "Chemin du fichier invalide : "
|
||||
msgstr "Chemin du fichier invalide :"
|
||||
|
||||
#: backend/parsers.h:514
|
||||
msgid "Invalid folder path:"
|
||||
msgstr "Chemin du dossier invalide : "
|
||||
msgstr "Chemin du dossier invalide :"
|
||||
|
||||
#: backend/parsers.h:531
|
||||
msgid "Invalid regex string:"
|
||||
msgstr "Regex string invalide : "
|
||||
msgstr "Regex string invalide :"
|
||||
|
||||
#: backend/parsers.h:626
|
||||
msgid "Expected \"%1%\" at \"%2%\"."
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+478
-448
File diff suppressed because it is too large
Load Diff
@@ -91,8 +91,6 @@ namespace boss {
|
||||
a.append_attribute("href").set_value(url.c_str());
|
||||
a.text().set(label.c_str());
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "FOO";
|
||||
|
||||
//Set string to end of matched section.
|
||||
start = results.suffix().first;
|
||||
}
|
||||
@@ -261,7 +259,7 @@ namespace boss {
|
||||
note.append_attribute("id").set_value("noChanges");
|
||||
note.text().set(boost::locale::translate("No change in details since last run.").str().c_str());
|
||||
*/
|
||||
messages.push_front(boss::Message(boss::g_message_say, "There have been no changes in the Details tab since BOSS was last run for this game."));
|
||||
messages.push_front(boss::Message(boss::g_message_say, boost::locale::translate("There have been no changes in the Details tab since BOSS was last run for this game.").str()));
|
||||
}
|
||||
|
||||
if (!messages.empty()) {
|
||||
|
||||
+29
-14
@@ -110,10 +110,12 @@ namespace boss {
|
||||
|
||||
boss::vertex_it vit2 = vit;
|
||||
++vit2;
|
||||
for (vit2,vitend; vit2 != vitend; ++vit2) {
|
||||
while (vit2 != vitend) {
|
||||
|
||||
if (graph[*vit].IsMaster() == graph[*vit2].IsMaster())
|
||||
if (graph[*vit].IsMaster() == graph[*vit2].IsMaster()) {
|
||||
++vit2;
|
||||
continue;
|
||||
}
|
||||
|
||||
vertex_t vertex, parentVertex;
|
||||
if (graph[*vit2].IsMaster()) {
|
||||
@@ -130,6 +132,7 @@ namespace boss {
|
||||
|
||||
boost::add_edge(parentVertex, vertex, graph);
|
||||
}
|
||||
++vit2;
|
||||
}
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Adding in-edges for masters.";
|
||||
@@ -180,10 +183,12 @@ namespace boss {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Adding priority difference edges to vertex for \"" << graph[*vit].Name() << "\".";
|
||||
boss::vertex_it vit2 = vit;
|
||||
++vit2;
|
||||
for (vit2,vitend; vit2 != vitend; ++vit2) {
|
||||
while (vit2 != vitend) {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Checking for priority difference between \"" << graph[*vit].Name() << "\" and \"" << graph[*vit2].Name() << "\".";
|
||||
if (graph[*vit].Priority() == graph[*vit2].Priority())
|
||||
if (graph[*vit].Priority() == graph[*vit2].Priority()) {
|
||||
++vit2;
|
||||
continue;
|
||||
}
|
||||
|
||||
vertex_t vertex, parentVertex;
|
||||
if (graph[*vit].Priority() < graph[*vit2].Priority()) {
|
||||
@@ -201,6 +206,7 @@ namespace boss {
|
||||
|
||||
boost::add_edge(parentVertex, vertex, graph);
|
||||
}
|
||||
++vit2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -209,25 +215,33 @@ namespace boss {
|
||||
boss::vertex_it vit, vitend;
|
||||
|
||||
for (boost::tie(vit, vitend) = boost::vertices(graph); vit != vitend; ++vit) {
|
||||
vertex_t parentVertex;
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Adding overlap edges to vertex for \"" << graph[*vit].Name() << "\".";
|
||||
|
||||
if (graph[*vit].NumOverrideFormIDs() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
boss::vertex_it vit2 = vit;
|
||||
++vit2;
|
||||
for (vit2,vitend; vit2 != vitend; ++vit2) {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Checking for FormID overlap between \"" << graph[*vit].Name() << "\" and \"" << graph[*vit2].Name() << "\".";
|
||||
|
||||
if (graph[*vit].DoFormIDsOverlap(graph[*vit2])) {
|
||||
|
||||
if (graph[*vit].MustLoadAfter(graph[*vit2]) || graph[*vit2].MustLoadAfter(graph[*vit]) || graph[*vit].Priority() != graph[*vit2].Priority())
|
||||
continue;
|
||||
while (vit2 != vitend) {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Checking edge validity between \"" << graph[*vit].Name() << "\" and \"" << graph[*vit2].Name() << "\".";
|
||||
|
||||
if (graph[*vit].Priority() == graph[*vit2].Priority() && !graph[*vit].MustLoadAfter(graph[*vit2]) && !graph[*vit2].MustLoadAfter(graph[*vit]) && graph[*vit].DoFormIDsOverlap(graph[*vit2])) {
|
||||
vertex_t vertex, parentVertex;
|
||||
if (graph[*vit].NumOverrideFormIDs() >= graph[*vit2].NumOverrideFormIDs()) {
|
||||
if (graph[*vit].NumOverrideFormIDs() > graph[*vit2].NumOverrideFormIDs()) {
|
||||
parentVertex = *vit;
|
||||
vertex = *vit2;
|
||||
} else {
|
||||
}
|
||||
else if (graph[*vit].NumOverrideFormIDs() < graph[*vit2].NumOverrideFormIDs()) {
|
||||
parentVertex = *vit2;
|
||||
vertex = *vit;
|
||||
}
|
||||
else if (graph[*vit].Name() < graph[*vit2].Name()) { //There needs to be an edge between the two, but direction cannot be decided using overlap size. Just use names.
|
||||
parentVertex = *vit;
|
||||
vertex = *vit2;
|
||||
}
|
||||
else {
|
||||
parentVertex = *vit2;
|
||||
vertex = *vit;
|
||||
}
|
||||
@@ -240,6 +254,7 @@ namespace boss {
|
||||
boost::add_edge(parentVertex, vertex, graph);
|
||||
}
|
||||
}
|
||||
++vit2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+30
-20
@@ -306,7 +306,7 @@ namespace boss {
|
||||
: name(n), enabled(true), priority(0) {
|
||||
|
||||
// Get data from file contents using libespm. Assumes libespm has already been initialised.
|
||||
BOOST_LOG_TRIVIAL(trace) << "Opening plugin with libespm...";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Opening with libespm...";
|
||||
boost::filesystem::path filepath = game.DataPath() / name;
|
||||
|
||||
//In case the plugin is ghosted, but the extension already got trimmed.
|
||||
@@ -325,22 +325,22 @@ namespace boss {
|
||||
|
||||
//If the name passed ends in '.ghost', that should be trimmed.
|
||||
if (boost::iends_with(name, ".ghost")) {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Trimming '.ghost' extension.";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Trimming '.ghost' extension.";
|
||||
name = name.substr(0, name.length() - 6);
|
||||
}
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Checking to see if plugin is a master or not.";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Checking master flag.";
|
||||
isMaster = file->isMaster(game.espm_settings);
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Getting the plugin's masters.";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Getting masters.";
|
||||
masters = file->getMasters();
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Number of masters: " << masters.size();
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Number of masters: " << masters.size();
|
||||
|
||||
crc = file->crc;
|
||||
game.crcCache.insert(pair<string, uint32_t>(n, crc));
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Getting the plugin's FormIDs.";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Getting the FormIDs.";
|
||||
vector<uint32_t> records = file->getFormIDs();
|
||||
vector<string> plugins = masters;
|
||||
plugins.push_back(name);
|
||||
@@ -352,7 +352,7 @@ namespace boss {
|
||||
}
|
||||
|
||||
//Also read Bash Tags applied and version string in description.
|
||||
BOOST_LOG_TRIVIAL(trace) << "Reading the plugin description.";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Reading the description.";
|
||||
string text = file->getDescription();
|
||||
|
||||
delete file;
|
||||
@@ -361,7 +361,7 @@ namespace boss {
|
||||
begin = text.begin();
|
||||
end = text.end();
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Attempting to read the plugin version from its description.";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Attempting to read the version from the description.";
|
||||
for(int j = 0; j < 7 && version.empty(); j++) {
|
||||
boost::smatch what;
|
||||
while (boost::regex_search(begin, end, what, version_checks[j])) {
|
||||
@@ -377,7 +377,7 @@ namespace boss {
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_LOG_TRIVIAL(trace) << "Attempting to extract Bash Tags from the description.";
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Attempting to extract Bash Tags from the description.";
|
||||
size_t pos1 = text.find("{{BASH:");
|
||||
if (pos1 == string::npos || pos1 + 7 == text.length())
|
||||
return;
|
||||
@@ -395,7 +395,7 @@ namespace boss {
|
||||
|
||||
for (int i=0,max=bashTags.size(); i<max; ++i) {
|
||||
boost::trim(bashTags[i]);
|
||||
BOOST_LOG_TRIVIAL(trace) << "Extracted Bash Tag: " << bashTags[i];
|
||||
BOOST_LOG_TRIVIAL(trace) << name << ": " << "Extracted Bash Tag: " << bashTags[i];
|
||||
tags.insert(Tag(bashTags[i]));
|
||||
}
|
||||
}
|
||||
@@ -699,23 +699,33 @@ namespace boss {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::map<string,bool> Plugin::CheckInstallValidity(const Game& game) const {
|
||||
map<string,bool> issues;
|
||||
std::vector<std::string> Plugin::CheckInstallValidity(const Game& game) const {
|
||||
std::vector<std::string> errorMessages;
|
||||
if (tags.find(Tag("Filter")) == tags.end()) {
|
||||
for (vector<string>::const_iterator it=masters.begin(), endIt=masters.end(); it != endIt; ++it) {
|
||||
if (!boost::filesystem::exists(game.DataPath() / *it) && !boost::filesystem::exists(game.DataPath() / (*it + ".ghost")))
|
||||
issues.insert(pair<string,bool>(*it,false));
|
||||
if (!boost::filesystem::exists(game.DataPath() / *it) && !boost::filesystem::exists(game.DataPath() / (*it + ".ghost"))) {
|
||||
BOOST_LOG_TRIVIAL(error) << "\"" << name << "\" requires \"" << *it << "\", but it is missing.";
|
||||
errorMessages.push_back((boost::format(boost::locale::translate("This plugin requires \"%1%\" to be installed, but it is missing.")) % *it).str());
|
||||
}
|
||||
else if (!game.IsActive(*it)) {
|
||||
BOOST_LOG_TRIVIAL(error) << "\"" << name << "\" requires \"" << *it << "\", but it is inactive.";
|
||||
errorMessages.push_back((boost::format(boost::locale::translate("This plugin requires \"%1%\" to be active, but it is inactive.")) % *it).str());
|
||||
}
|
||||
}
|
||||
}
|
||||
for (set<File>::const_iterator it=requirements.begin(), endIt=requirements.end(); it != endIt; ++it) {
|
||||
if (!boost::filesystem::exists(game.DataPath() / it->Name()) && !(IsPlugin(it->Name()) && boost::filesystem::exists(game.DataPath() / (it->Name() + ".ghost"))))
|
||||
issues.insert(pair<string,bool>(it->DisplayName(),false));
|
||||
if (!boost::filesystem::exists(game.DataPath() / it->Name()) && !(IsPlugin(it->Name()) && boost::filesystem::exists(game.DataPath() / (it->Name() + ".ghost")))) {
|
||||
BOOST_LOG_TRIVIAL(error) << "\"" << name << "\" requires \"" << it->Name() << "\", but it is missing.";
|
||||
errorMessages.push_back((boost::format(boost::locale::translate("This plugin requires \"%1%\" to be installed, but it is missing.")) % it->Name()).str());
|
||||
}
|
||||
}
|
||||
for (set<File>::const_iterator it=incompatibilities.begin(), endIt=incompatibilities.end(); it != endIt; ++it) {
|
||||
if (boost::filesystem::exists(game.DataPath() / it->Name()) || (IsPlugin(it->Name()) && boost::filesystem::exists(game.DataPath() / (it->Name() + ".ghost"))))
|
||||
issues.insert(pair<string,bool>(it->DisplayName(),true));
|
||||
if (boost::filesystem::exists(game.DataPath() / it->Name()) || (IsPlugin(it->Name()) && boost::filesystem::exists(game.DataPath() / (it->Name() + ".ghost")))) {
|
||||
BOOST_LOG_TRIVIAL(error) << "\"" << name << "\" is incompatible with \"" << it->Name() << "\", but both are present.";
|
||||
errorMessages.push_back((boost::format(boost::locale::translate("This plugin is incompatible with \"%1%\", but both are present.")) % it->Name()).str());
|
||||
}
|
||||
}
|
||||
return issues;
|
||||
return errorMessages;
|
||||
}
|
||||
|
||||
bool Plugin::LoadsBSA(const Game& game) const {
|
||||
@@ -741,7 +751,7 @@ namespace boss {
|
||||
}
|
||||
|
||||
bool alpha_sort(const Plugin& lhs, const Plugin& rhs) {
|
||||
return boost::ilexicographical_compare(lhs.Name(), rhs.Name());
|
||||
return boost::ilexicographical_compare(rhs.Name(), lhs.Name());
|
||||
}
|
||||
|
||||
bool master_sort(const Plugin& lhs, const Plugin& rhs) {
|
||||
|
||||
@@ -210,7 +210,7 @@ namespace boss {
|
||||
bool MustLoadAfter(const Plugin& plugin) const; //Checks masters, reqs and loadAfter.
|
||||
|
||||
//Validity checks.
|
||||
std::map<std::string,bool> CheckInstallValidity(const Game& game) const; //Checks that reqs and masters are all present, and that no incs are present. Returns a map of filenames and whether they are missing (if bool is true, then filename is a req or master, otherwise it's an inc).
|
||||
std::vector<std::string> CheckInstallValidity(const Game& game) const; //Checks that reqs and masters are all present, and that no incs are present. Returns a map of filenames and whether they are missing (if bool is true, then filename is a req or master, otherwise it's an inc).
|
||||
private:
|
||||
std::string name;
|
||||
bool enabled; //Default to true.
|
||||
|
||||
+448
-538
File diff suppressed because it is too large
Load Diff
+73
-104
@@ -24,54 +24,104 @@
|
||||
#define __BOSS_GUI_EDITOR__
|
||||
|
||||
#include "ids.h"
|
||||
#include "misc.h"
|
||||
#include "../backend/metadata.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <wx/spinctrl.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/tglbtn.h>
|
||||
#include <wx/dnd.h>
|
||||
|
||||
class MessageList : public wxListView {
|
||||
/* Have two versions of the editor: one mini editor that only contains
|
||||
controls for editing the load order related metadata, and a full editor
|
||||
that contains controls for editing all the metadata.
|
||||
|
||||
Both editors need to convert between metadata and control data, and to
|
||||
keep track of what edits have been made.
|
||||
|
||||
Have a immutable plugin list to keep track of non-user-edit metadata,
|
||||
and a mutable plugin list to keep track of user-edit metadata. When
|
||||
recording edits, diff the metadata obtained from the control values with
|
||||
the metadata in the immutable plugin entry to get the new user-edit metadata.
|
||||
|
||||
If a metadata type's corresponding control is not present (ie. in the mini
|
||||
editor), then use the immutable plugin entry's metadata for that type.
|
||||
*/
|
||||
|
||||
class TextDropTarget : public wxTextDropTarget { //Class to override virtual functions.
|
||||
public:
|
||||
MessageList(wxWindow * parent, wxWindowID id, const unsigned int language);
|
||||
|
||||
void SetItems(const std::vector<boss::Message>& messages);
|
||||
std::vector<boss::Message> GetItems() const;
|
||||
|
||||
boss::Message GetItem(long item) const;
|
||||
void SetItem(long item, const boss::Message& message);
|
||||
void AppendItem(const boss::Message& message);
|
||||
|
||||
void OnDeleteItem(wxListEvent& event);
|
||||
protected:
|
||||
wxString OnGetItemText(long item, long column) const;
|
||||
|
||||
TextDropTarget(wxListView * owner, wxStaticText * name);
|
||||
virtual bool OnDropText(wxCoord x, wxCoord y, const wxString &data);
|
||||
private:
|
||||
std::vector<boss::Message> _messages;
|
||||
const unsigned int _language;
|
||||
wxListView * targetOwner;
|
||||
wxStaticText * targetName;
|
||||
};
|
||||
|
||||
class Editor : public wxFrame {
|
||||
class CommonEditor {
|
||||
public:
|
||||
Editor(wxWindow *parent, const wxString& title, const std::string userlistPath, const std::vector<boss::Plugin>& basePlugins, std::vector<boss::Plugin>& editedPlugins, const unsigned int language, const boss::Game& game);
|
||||
CommonEditor(const std::list<boss::Plugin>& plugins, const boss::Game& game);
|
||||
CommonEditor(const std::list<boss::Plugin>& plugins, const boss::Game& game, std::list<boss::Plugin>& editedPlugins);
|
||||
protected:
|
||||
const boss::Game& _game;
|
||||
const std::list<boss::Plugin> _basePlugins;
|
||||
std::list<boss::Plugin> _editedPlugins;
|
||||
|
||||
boss::Plugin GetMasterData(const wxString& plugin) const;
|
||||
boss::Plugin GetUserData(const wxString& plugin) const;
|
||||
virtual boss::Plugin GetNewData(const wxString& plugin) const = 0;
|
||||
|
||||
void ApplyEdits(const wxString& plugin, wxListView * list);
|
||||
|
||||
boss::File RowToFile(wxListView * list, long row) const;
|
||||
boss::Tag RowToTag(wxListView * list, long row) const;
|
||||
boss::PluginDirtyInfo RowToPluginDirtyInfo(wxListView * list, long row) const;
|
||||
};
|
||||
|
||||
class MiniEditor : public wxDialog, public CommonEditor {
|
||||
public:
|
||||
MiniEditor(wxWindow *parent, const wxString& title, const std::list<boss::Plugin>& plugins, const boss::Game& game);
|
||||
|
||||
void OnPluginSelect(wxListEvent& event);
|
||||
void OnRowSelect(wxListEvent& event);
|
||||
void OnRemoveRow(wxCommandEvent& event);
|
||||
void OnFilterToggle(wxCommandEvent& event);
|
||||
void OnDragStart(wxListEvent& event);
|
||||
void OnApply(wxCommandEvent& event);
|
||||
void OnResize(wxSizeEvent& event);
|
||||
|
||||
const std::list<boss::Plugin>& GetEditedPlugins() const;
|
||||
private:
|
||||
wxListView * pluginList;
|
||||
wxPanel * editingPanel;
|
||||
wxButton * removeBtn;
|
||||
wxListView * loadAfterList;
|
||||
wxCheckBox * filterCheckbox;
|
||||
wxSpinCtrl * prioritySpin;
|
||||
wxStaticText * pluginText;
|
||||
wxStaticText * descText;
|
||||
|
||||
boss::Plugin GetNewData(const wxString& plugin) const;
|
||||
};
|
||||
|
||||
class Editor : public wxFrame, public CommonEditor {
|
||||
public:
|
||||
Editor(wxWindow *parent, const wxString& title, const std::string userlistPath, const std::list<boss::Plugin>& basePlugins, std::list<boss::Plugin>& editedPlugins, const unsigned int language, const boss::Game& game);
|
||||
|
||||
void OnPluginSelect(wxListEvent& event);
|
||||
void OnPluginListRightClick(wxListEvent& event);
|
||||
void OnPluginCopyName(wxCommandEvent& event);
|
||||
void OnPluginCopyMetadata(wxCommandEvent& event);
|
||||
void OnPluginClearMetadata(wxCommandEvent& event);
|
||||
void OnEnabledToggle(wxCommandEvent& event);
|
||||
void OnPriorityChange(wxSpinEvent& event);
|
||||
void OnListBookChange(wxBookCtrlEvent& event);
|
||||
void OnAddRow(wxCommandEvent& event);
|
||||
void OnEditRow(wxCommandEvent& event);
|
||||
void OnRemoveRow(wxCommandEvent& event);
|
||||
void OnRecalc(wxCommandEvent& event);
|
||||
void OnRowSelect(wxListEvent& event);
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
private:
|
||||
|
||||
wxMenu * pluginMenu;
|
||||
wxButton * addBtn;
|
||||
wxButton * editBtn;
|
||||
@@ -91,88 +141,7 @@ private:
|
||||
wxStaticText * pluginText;
|
||||
|
||||
const std::string _userlistPath;
|
||||
const std::vector<boss::Plugin> _basePlugins;
|
||||
const boss::Game& _game;
|
||||
std::vector<boss::Plugin> _editedPlugins;
|
||||
std::vector<boss::Message> currentMessages;
|
||||
|
||||
void ApplyEdits(const wxString& plugin);
|
||||
|
||||
boss::Plugin GetMasterData(const wxString& plugin) const;
|
||||
boss::Plugin GetUserData(const wxString& plugin) const;
|
||||
boss::Plugin GetNewData(const wxString& plugin) const;
|
||||
|
||||
boss::File RowToFile(wxListView * list, long row) const;
|
||||
boss::Tag RowToTag(wxListView * list, long row) const;
|
||||
boss::PluginDirtyInfo RowToPluginDirtyInfo(wxListView * list, long row) const;
|
||||
};
|
||||
|
||||
class FileEditDialog : public wxDialog {
|
||||
public:
|
||||
FileEditDialog(wxWindow *parent, const wxString& title);
|
||||
|
||||
void SetValues(const wxString& name, const wxString& display, const wxString& condition);
|
||||
wxString GetName() const;
|
||||
wxString GetDisplayName() const;
|
||||
wxString GetCondition() const;
|
||||
private:
|
||||
wxTextCtrl * _name;
|
||||
wxTextCtrl * _display;
|
||||
wxTextCtrl * _condition;
|
||||
};
|
||||
|
||||
class MessageEditDialog : public wxDialog {
|
||||
public:
|
||||
MessageEditDialog(wxWindow *parent, const wxString& title);
|
||||
|
||||
void SetMessage(const boss::Message& message);
|
||||
boss::Message GetMessage() const;
|
||||
|
||||
void OnSelect(wxListEvent& event);
|
||||
void OnAdd(wxCommandEvent& event);
|
||||
void OnEdit(wxCommandEvent& event);
|
||||
void OnRemove(wxCommandEvent& event);
|
||||
private:
|
||||
wxButton * addBtn;
|
||||
wxButton * editBtn;
|
||||
wxButton * removeBtn;
|
||||
wxChoice * _type;
|
||||
wxChoice * _language;
|
||||
wxListView * _content;
|
||||
wxTextCtrl * _condition;
|
||||
wxTextCtrl * _str;
|
||||
};
|
||||
|
||||
class TagEditDialog : public wxDialog {
|
||||
public:
|
||||
TagEditDialog(wxWindow *parent, const wxString& title);
|
||||
|
||||
void SetValues(int state, const wxString& name, const wxString& condition);
|
||||
wxString GetState() const;
|
||||
wxString GetName() const;
|
||||
wxString GetCondition() const;
|
||||
private:
|
||||
wxChoice * _state;
|
||||
wxTextCtrl * _name;
|
||||
wxTextCtrl * _condition;
|
||||
};
|
||||
|
||||
class DirtInfoEditDialog : public wxDialog {
|
||||
public:
|
||||
DirtInfoEditDialog(wxWindow * parent, const wxString& title);
|
||||
|
||||
void SetValues(const wxString& crc, unsigned int itm, unsigned int udr, unsigned int nav, const wxString& utility);
|
||||
wxString GetCRC() const;
|
||||
wxString GetUtility() const;
|
||||
unsigned int GetITMs() const;
|
||||
unsigned int GetUDRs() const;
|
||||
unsigned int GetDeletedNavmeshes() const;
|
||||
private:
|
||||
wxTextCtrl * _crc;
|
||||
wxSpinCtrl * _itm;
|
||||
wxSpinCtrl * _udr;
|
||||
wxSpinCtrl * _nav;
|
||||
wxTextCtrl * _utility;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+207
-378
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user