mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-16 08:42:23 +00:00
Merge branch 'master' of https://github.com/zinnschlag/openmw
This commit is contained in:
commit
b700f72a66
@ -183,7 +183,7 @@ endif()
|
|||||||
# find boost without components so we can use Boost_VERSION
|
# find boost without components so we can use Boost_VERSION
|
||||||
find_package(Boost REQUIRED)
|
find_package(Boost REQUIRED)
|
||||||
|
|
||||||
set(BOOST_COMPONENTS system filesystem program_options thread)
|
set(BOOST_COMPONENTS system filesystem program_options thread date_time)
|
||||||
|
|
||||||
if (Boost_VERSION LESS 104900)
|
if (Boost_VERSION LESS 104900)
|
||||||
set(SHINY_USE_WAVE_SYSTEM_INSTALL "TRUE")
|
set(SHINY_USE_WAVE_SYSTEM_INSTALL "TRUE")
|
||||||
|
@ -17,19 +17,6 @@
|
|||||||
|
|
||||||
#include "utils/textinputdialog.hpp"
|
#include "utils/textinputdialog.hpp"
|
||||||
|
|
||||||
|
|
||||||
//sort QModelIndexList ascending
|
|
||||||
bool rowGreaterThan(const QModelIndex &index1, const QModelIndex &index2)
|
|
||||||
{
|
|
||||||
return index1.row() >= index2.row();
|
|
||||||
}
|
|
||||||
|
|
||||||
//sort QModelIndexList descending
|
|
||||||
bool rowSmallerThan(const QModelIndex &index1, const QModelIndex &index2)
|
|
||||||
{
|
|
||||||
return index1.row() <= index2.row();
|
|
||||||
}
|
|
||||||
|
|
||||||
DataFilesPage::DataFilesPage(Files::ConfigurationManager &cfg, GameSettings &gameSettings, LauncherSettings &launcherSettings, QWidget *parent)
|
DataFilesPage::DataFilesPage(Files::ConfigurationManager &cfg, GameSettings &gameSettings, LauncherSettings &launcherSettings, QWidget *parent)
|
||||||
: mCfgMgr(cfg)
|
: mCfgMgr(cfg)
|
||||||
, mGameSettings(gameSettings)
|
, mGameSettings(gameSettings)
|
||||||
@ -121,35 +108,15 @@ DataFilesPage::DataFilesPage(Files::ConfigurationManager &cfg, GameSettings &gam
|
|||||||
|
|
||||||
void DataFilesPage::createActions()
|
void DataFilesPage::createActions()
|
||||||
{
|
{
|
||||||
// Refresh the plugins
|
|
||||||
QAction *refreshAction = new QAction(tr("Refresh"), this);
|
|
||||||
refreshAction->setShortcut(QKeySequence(tr("F5")));
|
|
||||||
connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh()));
|
|
||||||
|
|
||||||
// We can't create actions inside the .ui file
|
// Add the actions to the toolbuttons
|
||||||
mNewProfileAction = new QAction(QIcon::fromTheme("document-new"), tr("&New Profile"), this);
|
newProfileButton->setDefaultAction(newProfileAction);
|
||||||
mNewProfileAction->setToolTip(tr("New Profile"));
|
deleteProfileButton->setDefaultAction(deleteProfileAction);
|
||||||
mNewProfileAction->setShortcut(QKeySequence(tr("Ctrl+N")));
|
|
||||||
connect(mNewProfileAction, SIGNAL(triggered()), this, SLOT(newProfile()));
|
|
||||||
|
|
||||||
mDeleteProfileAction = new QAction(QIcon::fromTheme("edit-delete"), tr("Delete Profile"), this);
|
|
||||||
mDeleteProfileAction->setToolTip(tr("Delete Profile"));
|
|
||||||
connect(mDeleteProfileAction, SIGNAL(triggered()), this, SLOT(deleteProfile()));
|
|
||||||
|
|
||||||
// Add the newly created actions to the toolbuttons
|
|
||||||
newProfileButton->setDefaultAction(mNewProfileAction);
|
|
||||||
deleteProfileButton->setDefaultAction(mDeleteProfileAction);
|
|
||||||
|
|
||||||
// Context menu actions
|
// Context menu actions
|
||||||
mCheckAction = new QAction(tr("Check Selection"), this);
|
|
||||||
connect(mCheckAction, SIGNAL(triggered()), this, SLOT(check()));
|
|
||||||
|
|
||||||
mUncheckAction = new QAction(tr("Uncheck Selection"), this);
|
|
||||||
connect(mUncheckAction, SIGNAL(triggered()), this, SLOT(uncheck()));
|
|
||||||
|
|
||||||
mContextMenu = new QMenu(this);
|
mContextMenu = new QMenu(this);
|
||||||
mContextMenu->addAction(mCheckAction);
|
mContextMenu->addAction(checkAction);
|
||||||
mContextMenu->addAction(mUncheckAction);
|
mContextMenu->addAction(uncheckAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFilesPage::setupDataFiles()
|
void DataFilesPage::setupDataFiles()
|
||||||
@ -184,6 +151,8 @@ void DataFilesPage::setupDataFiles()
|
|||||||
profilesComboBox->addItem(QString("Default"));
|
profilesComboBox->addItem(QString("Default"));
|
||||||
|
|
||||||
if (profile.isEmpty() || profile == QLatin1String("Default")) {
|
if (profile.isEmpty() || profile == QLatin1String("Default")) {
|
||||||
|
deleteProfileAction->setEnabled(false);
|
||||||
|
profilesComboBox->setEditEnabled(false);
|
||||||
profilesComboBox->setCurrentIndex(profilesComboBox->findText(QString("Default")));
|
profilesComboBox->setCurrentIndex(profilesComboBox->findText(QString("Default")));
|
||||||
} else {
|
} else {
|
||||||
profilesComboBox->setEditEnabled(true);
|
profilesComboBox->setEditEnabled(true);
|
||||||
@ -257,15 +226,6 @@ void DataFilesPage::saveSettings()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFilesPage::newProfile()
|
|
||||||
{
|
|
||||||
if (mNewProfileDialog->exec() == QDialog::Accepted) {
|
|
||||||
QString profile = mNewProfileDialog->lineEdit()->text();
|
|
||||||
profilesComboBox->addItem(profile);
|
|
||||||
profilesComboBox->setCurrentIndex(profilesComboBox->findText(profile));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DataFilesPage::updateOkButton(const QString &text)
|
void DataFilesPage::updateOkButton(const QString &text)
|
||||||
{
|
{
|
||||||
// We do this here because we need the profiles combobox text
|
// We do this here because we need the profiles combobox text
|
||||||
@ -331,7 +291,16 @@ int DataFilesPage::profilesComboBoxIndex()
|
|||||||
return profilesComboBox->currentIndex();
|
return profilesComboBox->currentIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFilesPage::deleteProfile()
|
void DataFilesPage::on_newProfileAction_triggered()
|
||||||
|
{
|
||||||
|
if (mNewProfileDialog->exec() == QDialog::Accepted) {
|
||||||
|
QString profile = mNewProfileDialog->lineEdit()->text();
|
||||||
|
profilesComboBox->addItem(profile);
|
||||||
|
profilesComboBox->setCurrentIndex(profilesComboBox->findText(profile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataFilesPage::on_deleteProfileAction_triggered()
|
||||||
{
|
{
|
||||||
QString profile = profilesComboBox->currentText();
|
QString profile = profilesComboBox->currentText();
|
||||||
|
|
||||||
@ -358,7 +327,7 @@ void DataFilesPage::deleteProfile()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFilesPage::check()
|
void DataFilesPage::on_checkAction_triggered()
|
||||||
{
|
{
|
||||||
if (pluginsTable->hasFocus())
|
if (pluginsTable->hasFocus())
|
||||||
setPluginsCheckstates(Qt::Checked);
|
setPluginsCheckstates(Qt::Checked);
|
||||||
@ -368,7 +337,7 @@ void DataFilesPage::check()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFilesPage::uncheck()
|
void DataFilesPage::on_uncheckAction_triggered()
|
||||||
{
|
{
|
||||||
if (pluginsTable->hasFocus())
|
if (pluginsTable->hasFocus())
|
||||||
setPluginsCheckstates(Qt::Unchecked);
|
setPluginsCheckstates(Qt::Unchecked);
|
||||||
@ -377,14 +346,6 @@ void DataFilesPage::uncheck()
|
|||||||
setMastersCheckstates(Qt::Unchecked);
|
setMastersCheckstates(Qt::Unchecked);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFilesPage::refresh()
|
|
||||||
{
|
|
||||||
// mDataFilesModel->sort(0);
|
|
||||||
|
|
||||||
// Refresh the plugins table
|
|
||||||
pluginsTable->scrollToTop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DataFilesPage::setMastersCheckstates(Qt::CheckState state)
|
void DataFilesPage::setMastersCheckstates(Qt::CheckState state)
|
||||||
{
|
{
|
||||||
if (!mastersTable->selectionModel()->hasSelection()) {
|
if (!mastersTable->selectionModel()->hasSelection()) {
|
||||||
@ -476,10 +437,10 @@ void DataFilesPage::profileChanged(const QString &previous, const QString &curre
|
|||||||
{
|
{
|
||||||
// Prevent the deletion of the default profile
|
// Prevent the deletion of the default profile
|
||||||
if (current == QLatin1String("Default")) {
|
if (current == QLatin1String("Default")) {
|
||||||
mDeleteProfileAction->setEnabled(false);
|
deleteProfileAction->setEnabled(false);
|
||||||
profilesComboBox->setEditEnabled(false);
|
profilesComboBox->setEditEnabled(false);
|
||||||
} else {
|
} else {
|
||||||
mDeleteProfileAction->setEnabled(true);
|
deleteProfileAction->setEnabled(true);
|
||||||
profilesComboBox->setEditEnabled(true);
|
profilesComboBox->setEditEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,8 +494,8 @@ void DataFilesPage::showContextMenu(const QPoint &point)
|
|||||||
QModelIndexList indexes = pluginsTable->selectionModel()->selectedIndexes();
|
QModelIndexList indexes = pluginsTable->selectionModel()->selectedIndexes();
|
||||||
|
|
||||||
// Show the check/uncheck actions depending on the state of the selected items
|
// Show the check/uncheck actions depending on the state of the selected items
|
||||||
mUncheckAction->setEnabled(false);
|
uncheckAction->setEnabled(false);
|
||||||
mCheckAction->setEnabled(false);
|
checkAction->setEnabled(false);
|
||||||
|
|
||||||
foreach (const QModelIndex &index, indexes)
|
foreach (const QModelIndex &index, indexes)
|
||||||
{
|
{
|
||||||
@ -548,8 +509,8 @@ void DataFilesPage::showContextMenu(const QPoint &point)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
(mDataFilesModel->checkState(sourceIndex) == Qt::Checked)
|
(mDataFilesModel->checkState(sourceIndex) == Qt::Checked)
|
||||||
? mUncheckAction->setEnabled(true)
|
? uncheckAction->setEnabled(true)
|
||||||
: mCheckAction->setEnabled(true);
|
: checkAction->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show menu
|
// Show menu
|
||||||
@ -564,8 +525,8 @@ void DataFilesPage::showContextMenu(const QPoint &point)
|
|||||||
QModelIndexList indexes = mastersTable->selectionModel()->selectedIndexes();
|
QModelIndexList indexes = mastersTable->selectionModel()->selectedIndexes();
|
||||||
|
|
||||||
// Show the check/uncheck actions depending on the state of the selected items
|
// Show the check/uncheck actions depending on the state of the selected items
|
||||||
mUncheckAction->setEnabled(false);
|
uncheckAction->setEnabled(false);
|
||||||
mCheckAction->setEnabled(false);
|
checkAction->setEnabled(false);
|
||||||
|
|
||||||
foreach (const QModelIndex &index, indexes)
|
foreach (const QModelIndex &index, indexes)
|
||||||
{
|
{
|
||||||
@ -578,8 +539,8 @@ void DataFilesPage::showContextMenu(const QPoint &point)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
(mDataFilesModel->checkState(sourceIndex) == Qt::Checked)
|
(mDataFilesModel->checkState(sourceIndex) == Qt::Checked)
|
||||||
? mUncheckAction->setEnabled(true)
|
? uncheckAction->setEnabled(true)
|
||||||
: mCheckAction->setEnabled(true);
|
: checkAction->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
mContextMenu->exec(globalPos);
|
mContextMenu->exec(globalPos);
|
||||||
|
@ -48,11 +48,10 @@ public slots:
|
|||||||
void updateViews();
|
void updateViews();
|
||||||
|
|
||||||
// Action slots
|
// Action slots
|
||||||
void newProfile();
|
void on_newProfileAction_triggered();
|
||||||
void deleteProfile();
|
void on_deleteProfileAction_triggered();
|
||||||
void check();
|
void on_checkAction_triggered();
|
||||||
void uncheck();
|
void on_uncheckAction_triggered();
|
||||||
void refresh();
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotCurrentIndexChanged(int index);
|
void slotCurrentIndexChanged(int index);
|
||||||
@ -65,23 +64,7 @@ private:
|
|||||||
|
|
||||||
QSortFilterProxyModel *mFilterProxyModel;
|
QSortFilterProxyModel *mFilterProxyModel;
|
||||||
|
|
||||||
// QTableView *mMastersTable;
|
|
||||||
// QTableView *mPluginsTable;
|
|
||||||
|
|
||||||
|
|
||||||
// QToolBar *mProfileToolBar;
|
|
||||||
QMenu *mContextMenu;
|
QMenu *mContextMenu;
|
||||||
// QSplitter *mSplitter;
|
|
||||||
|
|
||||||
QAction *mNewProfileAction;
|
|
||||||
QAction *mDeleteProfileAction;
|
|
||||||
QAction *mCheckAction;
|
|
||||||
QAction *mUncheckAction;
|
|
||||||
|
|
||||||
// QAction *mMoveUpAction;
|
|
||||||
// QAction *mMoveDownAction;
|
|
||||||
// QAction *mMoveTopAction;
|
|
||||||
// QAction *mMoveBottomAction;
|
|
||||||
|
|
||||||
Files::ConfigurationManager &mCfgMgr;
|
Files::ConfigurationManager &mCfgMgr;
|
||||||
|
|
||||||
|
@ -213,8 +213,6 @@ bool MainDialog::showFirstRunDialog()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Re-read the game settings
|
// Re-read the game settings
|
||||||
mGameSettings.clear();
|
|
||||||
|
|
||||||
if (!setupGameSettings())
|
if (!setupGameSettings())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -389,7 +387,7 @@ bool MainDialog::setupGameSettings()
|
|||||||
QFileInfo info(selectedFile);
|
QFileInfo info(selectedFile);
|
||||||
|
|
||||||
// Add the new dir to the settings file and to the data dir container
|
// Add the new dir to the settings file and to the data dir container
|
||||||
mGameSettings.setValue(QString("data"), info.absolutePath());
|
mGameSettings.setMultiValue(QString("data"), info.absolutePath());
|
||||||
mGameSettings.addDataDir(info.absolutePath());
|
mGameSettings.addDataDir(info.absolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -478,7 +476,7 @@ void MainDialog::saveSettings()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainDialog::writeSettings()
|
bool MainDialog::writeSettings()
|
||||||
{
|
{
|
||||||
// Now write all config files
|
// Now write all config files
|
||||||
saveSettings();
|
saveSettings();
|
||||||
@ -498,7 +496,7 @@ void MainDialog::writeSettings()
|
|||||||
Please make sure you have the right permissions \
|
Please make sure you have the right permissions \
|
||||||
and try again.<br>").arg(userPath));
|
and try again.<br>").arg(userPath));
|
||||||
msgBox.exec();
|
msgBox.exec();
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,7 +513,7 @@ void MainDialog::writeSettings()
|
|||||||
Please make sure you have the right permissions \
|
Please make sure you have the right permissions \
|
||||||
and try again.<br>").arg(file.fileName()));
|
and try again.<br>").arg(file.fileName()));
|
||||||
msgBox.exec();
|
msgBox.exec();
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextStream stream(&file);
|
QTextStream stream(&file);
|
||||||
@ -537,7 +535,7 @@ void MainDialog::writeSettings()
|
|||||||
Please make sure you have the right permissions \
|
Please make sure you have the right permissions \
|
||||||
and try again.<br>").arg(file.fileName()));
|
and try again.<br>").arg(file.fileName()));
|
||||||
msgBox.exec();
|
msgBox.exec();
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
stream.setDevice(&file);
|
stream.setDevice(&file);
|
||||||
@ -559,7 +557,7 @@ void MainDialog::writeSettings()
|
|||||||
Please make sure you have the right permissions \
|
Please make sure you have the right permissions \
|
||||||
and try again.<br>").arg(file.fileName()));
|
and try again.<br>").arg(file.fileName()));
|
||||||
msgBox.exec();
|
msgBox.exec();
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
stream.setDevice(&file);
|
stream.setDevice(&file);
|
||||||
@ -567,19 +565,20 @@ void MainDialog::writeSettings()
|
|||||||
|
|
||||||
mLauncherSettings.writeFile(stream);
|
mLauncherSettings.writeFile(stream);
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainDialog::closeEvent(QCloseEvent *event)
|
void MainDialog::closeEvent(QCloseEvent *event)
|
||||||
{
|
{
|
||||||
saveSettings();
|
|
||||||
writeSettings();
|
writeSettings();
|
||||||
event->accept();
|
event->accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainDialog::play()
|
void MainDialog::play()
|
||||||
{
|
{
|
||||||
saveSettings();
|
if (!writeSettings())
|
||||||
writeSettings();
|
qApp->quit();
|
||||||
|
|
||||||
// Launch the game detached
|
// Launch the game detached
|
||||||
startProgram(QString("openmw"), true);
|
startProgram(QString("openmw"), true);
|
||||||
|
@ -45,7 +45,7 @@ private:
|
|||||||
|
|
||||||
void loadSettings();
|
void loadSettings();
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
void writeSettings();
|
bool writeSettings();
|
||||||
|
|
||||||
inline bool startProgram(const QString &name, bool detached = false) { return startProgram(name, QStringList(), detached); }
|
inline bool startProgram(const QString &name, bool detached = false) { return startProgram(name, QStringList(), detached); }
|
||||||
bool startProgram(const QString &name, const QStringList &arguments, bool detached = false);
|
bool startProgram(const QString &name, const QStringList &arguments, bool detached = false);
|
||||||
|
@ -6,13 +6,12 @@ PlayPage::PlayPage(QWidget *parent) : QWidget(parent)
|
|||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
|
|
||||||
// Hacks to get the stylesheet look properly on different platforms
|
// Hacks to get the stylesheet look properly
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
QPlastiqueStyle *style = new QPlastiqueStyle;
|
QPlastiqueStyle *style = new QPlastiqueStyle;
|
||||||
QFont font = QApplication::font();
|
|
||||||
font.setPointSize(12); // Fixes problem with overlapping items
|
|
||||||
|
|
||||||
profilesComboBox->setStyle(style);
|
profilesComboBox->setStyle(style);
|
||||||
profilesComboBox->setFont(font);
|
#endif
|
||||||
|
profilesComboBox->setView(new QListView());
|
||||||
|
|
||||||
connect(profilesComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotCurrentIndexChanged(int)));
|
connect(profilesComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotCurrentIndexChanged(int)));
|
||||||
connect(playButton, SIGNAL(clicked()), this, SLOT(slotPlayClicked()));
|
connect(playButton, SIGNAL(clicked()), this, SLOT(slotPlayClicked()));
|
||||||
|
@ -40,11 +40,6 @@ public:
|
|||||||
mSettings.remove(key);
|
mSettings.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void clear()
|
|
||||||
{
|
|
||||||
mSettings.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline QStringList getDataDirs() { return mDataDirs; }
|
inline QStringList getDataDirs() { return mDataDirs; }
|
||||||
inline void addDataDir(const QString &dir) { if(!dir.isEmpty()) mDataDirs.append(dir); }
|
inline void addDataDir(const QString &dir) { if(!dir.isEmpty()) mDataDirs.append(dir); }
|
||||||
inline QString getDataLocal() {return mDataLocal; }
|
inline QString getDataLocal() {return mDataLocal; }
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
|
#include "textinputdialog.hpp"
|
||||||
|
|
||||||
#include <QDialogButtonBox>
|
#include <QDialogButtonBox>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QLabel>
|
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QValidator>
|
#include <QValidator>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
#include <components/fileorderlist/utils/lineedit.hpp>
|
#include <components/fileorderlist/utils/lineedit.hpp>
|
||||||
|
|
||||||
#include "textinputdialog.hpp"
|
|
||||||
|
|
||||||
TextInputDialog::TextInputDialog(const QString& title, const QString &text, QWidget *parent) :
|
TextInputDialog::TextInputDialog(const QString& title, const QString &text, QWidget *parent) :
|
||||||
QDialog(parent)
|
QDialog(parent)
|
||||||
{
|
{
|
||||||
@ -38,7 +38,6 @@ TextInputDialog::TextInputDialog(const QString& title, const QString &text, QWid
|
|||||||
Q_UNUSED(title);
|
Q_UNUSED(title);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setMaximumHeight(height());
|
|
||||||
setOkButtonEnabled(false);
|
setOkButtonEnabled(false);
|
||||||
setModal(true);
|
setModal(true);
|
||||||
|
|
||||||
|
@ -149,16 +149,22 @@ OMW::Engine::~Engine()
|
|||||||
delete mOgre;
|
delete mOgre;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load all BSA files in data directory.
|
// Load BSA files
|
||||||
|
|
||||||
void OMW::Engine::loadBSA()
|
void OMW::Engine::loadBSA()
|
||||||
{
|
{
|
||||||
const Files::MultiDirCollection& bsa = mFileCollections.getCollection (".bsa");
|
for (std::vector<std::string>::const_iterator archive = mArchives.begin(); archive != mArchives.end(); ++archive)
|
||||||
|
|
||||||
for (Files::MultiDirCollection::TIter iter(bsa.begin()); iter!=bsa.end(); ++iter)
|
|
||||||
{
|
{
|
||||||
std::cout << "Adding " << iter->second.string() << std::endl;
|
if (mFileCollections.doesExist(*archive))
|
||||||
Bsa::addBSA(iter->second.string());
|
{
|
||||||
|
const std::string archivePath = mFileCollections.getPath(*archive).string();
|
||||||
|
std::cout << "Adding BSA archive " << archivePath << std::endl;
|
||||||
|
Bsa::addBSA(archivePath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Archive " << *archive << " not found" << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Files::PathContainer& dataDirs = mFileCollections.getPaths();
|
const Files::PathContainer& dataDirs = mFileCollections.getPaths();
|
||||||
@ -199,6 +205,11 @@ void OMW::Engine::setDataDirs (const Files::PathContainer& dataDirs)
|
|||||||
mFileCollections = Files::Collections (dataDirs, !mFSStrict);
|
mFileCollections = Files::Collections (dataDirs, !mFSStrict);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add BSA archive
|
||||||
|
void OMW::Engine::addArchive (const std::string& archive) {
|
||||||
|
mArchives.push_back(archive);
|
||||||
|
}
|
||||||
|
|
||||||
// Set resource dir
|
// Set resource dir
|
||||||
void OMW::Engine::setResourceDir (const boost::filesystem::path& parResDir)
|
void OMW::Engine::setResourceDir (const boost::filesystem::path& parResDir)
|
||||||
{
|
{
|
||||||
|
@ -64,6 +64,7 @@ namespace OMW
|
|||||||
ToUTF8::FromType mEncoding;
|
ToUTF8::FromType mEncoding;
|
||||||
ToUTF8::Utf8Encoder* mEncoder;
|
ToUTF8::Utf8Encoder* mEncoder;
|
||||||
Files::PathContainer mDataDirs;
|
Files::PathContainer mDataDirs;
|
||||||
|
std::vector<std::string> mArchives;
|
||||||
boost::filesystem::path mResDir;
|
boost::filesystem::path mResDir;
|
||||||
OEngine::Render::OgreRenderer *mOgre;
|
OEngine::Render::OgreRenderer *mOgre;
|
||||||
std::string mCellName;
|
std::string mCellName;
|
||||||
@ -99,7 +100,7 @@ namespace OMW
|
|||||||
/// add a .zip resource
|
/// add a .zip resource
|
||||||
void addZipResource (const boost::filesystem::path& path);
|
void addZipResource (const boost::filesystem::path& path);
|
||||||
|
|
||||||
/// Load all BSA files in data directory.
|
/// Load BSA files
|
||||||
void loadBSA();
|
void loadBSA();
|
||||||
|
|
||||||
void executeLocalScripts();
|
void executeLocalScripts();
|
||||||
@ -126,6 +127,9 @@ namespace OMW
|
|||||||
/// Set data dirs
|
/// Set data dirs
|
||||||
void setDataDirs(const Files::PathContainer& dataDirs);
|
void setDataDirs(const Files::PathContainer& dataDirs);
|
||||||
|
|
||||||
|
/// Add BSA archive
|
||||||
|
void addArchive(const std::string& archive);
|
||||||
|
|
||||||
/// Set resource dir
|
/// Set resource dir
|
||||||
void setResourceDir(const boost::filesystem::path& parResDir);
|
void setResourceDir(const boost::filesystem::path& parResDir);
|
||||||
|
|
||||||
|
@ -100,6 +100,9 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
|
|||||||
("data-local", bpo::value<std::string>()->default_value(""),
|
("data-local", bpo::value<std::string>()->default_value(""),
|
||||||
"set local data directory (highest priority)")
|
"set local data directory (highest priority)")
|
||||||
|
|
||||||
|
("fallback-archive", bpo::value<StringsVector>()->default_value(StringsVector(), "fallback-archive")
|
||||||
|
->multitoken(), "set fallback BSA archives (later archives have higher priority)")
|
||||||
|
|
||||||
("resources", bpo::value<std::string>()->default_value("resources"),
|
("resources", bpo::value<std::string>()->default_value("resources"),
|
||||||
"set resources directory")
|
"set resources directory")
|
||||||
|
|
||||||
@ -201,6 +204,13 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
|
|||||||
|
|
||||||
engine.setDataDirs(dataDirs);
|
engine.setDataDirs(dataDirs);
|
||||||
|
|
||||||
|
// fallback archives
|
||||||
|
StringsVector archives = variables["fallback-archive"].as<StringsVector>();
|
||||||
|
for (StringsVector::const_iterator it = archives.begin(); it != archives.end(); it++)
|
||||||
|
{
|
||||||
|
engine.addArchive(*it);
|
||||||
|
}
|
||||||
|
|
||||||
engine.setResourceDir(variables["resources"].as<std::string>());
|
engine.setResourceDir(variables["resources"].as<std::string>());
|
||||||
|
|
||||||
// master and plugin
|
// master and plugin
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "dialogue.hpp"
|
#include "dialogue.hpp"
|
||||||
#include "mode.hpp"
|
#include "mode.hpp"
|
||||||
#include "inventorywindow.hpp"
|
#include "inventorywindow.hpp"
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/soundmanager.hpp"
|
#include "../mwbase/soundmanager.hpp"
|
||||||
#include "../mwbase/mechanicsmanager.hpp"
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
@ -17,94 +17,24 @@ namespace
|
|||||||
{
|
{
|
||||||
struct Step
|
struct Step
|
||||||
{
|
{
|
||||||
const char* mText;
|
const std::string mText;
|
||||||
const char* mButtons[3];
|
const std::string mButtons[3];
|
||||||
const char* mSound;
|
const std::string mSound;
|
||||||
ESM::Class::Specialization mSpecializations[3]; // The specialization for each answer
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static boost::array<Step, 10> sGenerateClassSteps = { {
|
const ESM::Class::Specialization mSpecializations[3]={ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}; // The specialization for each answer
|
||||||
// Question 1
|
|
||||||
{"On a clear day you chance upon a strange animal, its legs trapped in a hunter's clawsnare. Judging from the bleeding, it will not survive long.",
|
Step sGenerateClassSteps(int number) {
|
||||||
{"Draw your dagger, mercifully endings its life with a single thrust.",
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
"Use herbs from your pack to put it to sleep.",
|
number++;
|
||||||
"Do not interfere in the natural evolution of events, but rather take the opportunity to learn more about a strange animal that you have never seen before."},
|
Step step = {world->getFallback("Question_"+boost::lexical_cast<std::string>(number)+"_Question"),
|
||||||
"vo\\misc\\chargen qa1.wav",
|
{world->getFallback("Question_"+boost::lexical_cast<std::string>(number)+"_AnswerOne"),
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
world->getFallback("Question_"+boost::lexical_cast<std::string>(number)+"_AnswerTwo"),
|
||||||
},
|
world->getFallback("Question_"+boost::lexical_cast<std::string>(number)+"_AnswerThree")},
|
||||||
// Question 2
|
"vo\\misc\\chargen qa"+boost::lexical_cast<std::string>(number)+".wav"
|
||||||
{"One Summer afternoon your father gives you a choice of chores.",
|
};
|
||||||
{"Work in the forge with him casting iron for a new plow.",
|
return step;
|
||||||
"Gather herbs for your mother who is preparing dinner.",
|
}
|
||||||
"Go catch fish at the stream using a net and line."},
|
|
||||||
"vo\\misc\\chargen qa2.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 3
|
|
||||||
{"Your cousin has given you a very embarrassing nickname and, even worse, likes to call you it in front of your friends. You asked him to stop, but he finds it very amusing to watch you blush.",
|
|
||||||
{"Beat up your cousin, then tell him that if he ever calls you that nickname again, you will bloody him worse than this time.",
|
|
||||||
"Make up a story that makes your nickname a badge of honor instead of something humiliating.",
|
|
||||||
"Make up an even more embarrassing nickname for him and use it constantly until he learns his lesson."},
|
|
||||||
"vo\\misc\\chargen qa3.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 4
|
|
||||||
{"There is a lot of heated discussion at the local tavern over a grouped of people called 'Telepaths'. They have been hired by certain City-State kings. Rumor has it these Telepaths read a person's mind and tell their lord whether a follower is telling the truth or not.",
|
|
||||||
{"This is a terrible practice. A person's thoughts are his own and no one, not even a king, has the right to make such an invasion into another human's mind.",
|
|
||||||
"Loyal followers to the king have nothing to fear from a Telepath. It is important to have a method of finding assassins and spies before it is too late.",
|
|
||||||
"In these times, it is a necessary evil. Although you do not necessarily like the idea, a Telepath could have certain advantages during a time of war or in finding someone innocent of a crime."},
|
|
||||||
"vo\\misc\\chargen qa4.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 5
|
|
||||||
{"Your mother sends you to the market with a list of goods to buy. After you finish you find that by mistake a shopkeeper has given you too much money back in exchange for one of the items.",
|
|
||||||
{"Return to the store and give the shopkeeper his hard-earned money, explaining to him the mistake?",
|
|
||||||
"Decide to put the extra money to good use and purchase items that would help your family?",
|
|
||||||
"Pocket the extra money, knowing that shopkeepers in general tend to overcharge customers anyway?"},
|
|
||||||
"vo\\misc\\chargen qa5.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 6
|
|
||||||
{"While in the market place you witness a thief cut a purse from a noble. Even as he does so, the noble notices and calls for the city guards. In his haste to get away, the thief drops the purse near you. Surprisingly no one seems to notice the bag of coins at your feet.",
|
|
||||||
{"Pick up the bag and signal to the guard, knowing that the only honorable thing to do is return the money to its rightful owner.",
|
|
||||||
"Leave the bag there, knowing that it is better not to get involved.",
|
|
||||||
"Pick up the bag and pocket it, knowing that the extra windfall will help your family in times of trouble."},
|
|
||||||
"vo\\misc\\chargen qa6.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 7
|
|
||||||
{"Your father sends you on a task which you loathe, cleaning the stables. On the way there, pitchfork in hand, you run into your friend from the homestead near your own. He offers to do it for you, in return for a future favor of his choosing.",
|
|
||||||
{"Decline his offer, knowing that your father expects you to do the work, and it is better not to be in debt.",
|
|
||||||
"Ask him to help you, knowing that two people can do the job faster than one, and agree to help him with one task of his choosing in the future.",
|
|
||||||
"Accept his offer, reasoning that as long as the stables are cleaned, it matters not who does the cleaning."},
|
|
||||||
"vo\\misc\\chargen qa7.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 8
|
|
||||||
{"Your mother asks you to help fix the stove. While you are working, a very hot pipe slips its mooring and falls towards her.",
|
|
||||||
{"Position yourself between the pipe and your mother.",
|
|
||||||
"Grab the hot pipe and try to push it away.",
|
|
||||||
"Push your mother out of the way."},
|
|
||||||
"vo\\misc\\chargen qa8.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 9
|
|
||||||
{"While in town the baker gives you a sweetroll. Delighted, you take it into an alley to enjoy only to be intercepted by a gang of three other kids your age. The leader demands the sweetroll, or else he and his friends will beat you and take it.",
|
|
||||||
{"Drop the sweetroll and step on it, then get ready for the fight.",
|
|
||||||
"Give him the sweetroll now without argument, knowing that later this afternoon you will have all your friends with you and can come and take whatever he owes you.",
|
|
||||||
"Act like you're going to give him the sweetroll, but at the last minute throw it in the air, hoping that they'll pay attention to it long enough for you to get a shot in on the leader."},
|
|
||||||
"vo\\misc\\chargen qa9.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
},
|
|
||||||
// Question 10
|
|
||||||
{"Entering town you find that you are witness to a very well-dressed man running from a crowd. He screams to you for help. The crowd behind him seem very angry.",
|
|
||||||
{"Rush to the town's aid immediately, despite your lack of knowledge of the circumstances.",
|
|
||||||
"Stand aside and allow the man and the mob to pass, realizing it is probably best not to get involved.",
|
|
||||||
"Rush to the man's aid immediately, despite your lack of knowledge of the circumstances."},
|
|
||||||
"vo\\misc\\chargen qa10.wav",
|
|
||||||
{ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth}
|
|
||||||
}
|
|
||||||
} };
|
|
||||||
|
|
||||||
struct ClassPoint
|
struct ClassPoint
|
||||||
{
|
{
|
||||||
@ -638,7 +568,7 @@ void CharacterCreation::onClassQuestionChosen(int _index)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ESM::Class::Specialization specialization = sGenerateClassSteps[mGenerateClassStep].mSpecializations[_index];
|
ESM::Class::Specialization specialization = mSpecializations[_index];
|
||||||
if (specialization == ESM::Class::Stealth)
|
if (specialization == ESM::Class::Stealth)
|
||||||
++mGenerateClassSpecializations[0];
|
++mGenerateClassSpecializations[0];
|
||||||
else if (specialization == ESM::Class::Combat)
|
else if (specialization == ESM::Class::Combat)
|
||||||
@ -651,7 +581,7 @@ void CharacterCreation::onClassQuestionChosen(int _index)
|
|||||||
|
|
||||||
void CharacterCreation::showClassQuestionDialog()
|
void CharacterCreation::showClassQuestionDialog()
|
||||||
{
|
{
|
||||||
if (mGenerateClassStep == sGenerateClassSteps.size())
|
if (mGenerateClassStep == 10)
|
||||||
{
|
{
|
||||||
static boost::array<ClassPoint, 23> classes = { {
|
static boost::array<ClassPoint, 23> classes = { {
|
||||||
{"Acrobat", {6, 2, 2}},
|
{"Acrobat", {6, 2, 2}},
|
||||||
@ -718,7 +648,7 @@ void CharacterCreation::showClassQuestionDialog()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mGenerateClassStep > sGenerateClassSteps.size())
|
if (mGenerateClassStep > 10)
|
||||||
{
|
{
|
||||||
mWM->popGuiMode();
|
mWM->popGuiMode();
|
||||||
mWM->pushGuiMode(GM_Class);
|
mWM->pushGuiMode(GM_Class);
|
||||||
@ -731,15 +661,15 @@ void CharacterCreation::showClassQuestionDialog()
|
|||||||
mGenerateClassQuestionDialog = new InfoBoxDialog(*mWM);
|
mGenerateClassQuestionDialog = new InfoBoxDialog(*mWM);
|
||||||
|
|
||||||
InfoBoxDialog::ButtonList buttons;
|
InfoBoxDialog::ButtonList buttons;
|
||||||
mGenerateClassQuestionDialog->setText(sGenerateClassSteps[mGenerateClassStep].mText);
|
mGenerateClassQuestionDialog->setText(sGenerateClassSteps(mGenerateClassStep).mText);
|
||||||
buttons.push_back(sGenerateClassSteps[mGenerateClassStep].mButtons[0]);
|
buttons.push_back(sGenerateClassSteps(mGenerateClassStep).mButtons[0]);
|
||||||
buttons.push_back(sGenerateClassSteps[mGenerateClassStep].mButtons[1]);
|
buttons.push_back(sGenerateClassSteps(mGenerateClassStep).mButtons[1]);
|
||||||
buttons.push_back(sGenerateClassSteps[mGenerateClassStep].mButtons[2]);
|
buttons.push_back(sGenerateClassSteps(mGenerateClassStep).mButtons[2]);
|
||||||
mGenerateClassQuestionDialog->setButtons(buttons);
|
mGenerateClassQuestionDialog->setButtons(buttons);
|
||||||
mGenerateClassQuestionDialog->eventButtonSelected += MyGUI::newDelegate(this, &CharacterCreation::onClassQuestionChosen);
|
mGenerateClassQuestionDialog->eventButtonSelected += MyGUI::newDelegate(this, &CharacterCreation::onClassQuestionChosen);
|
||||||
mGenerateClassQuestionDialog->setVisible(true);
|
mGenerateClassQuestionDialog->setVisible(true);
|
||||||
|
|
||||||
MWBase::Environment::get().getSoundManager()->say(sGenerateClassSteps[mGenerateClassStep].mSound);
|
MWBase::Environment::get().getSoundManager()->say(sGenerateClassSteps(mGenerateClassStep).mSound);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CharacterCreation::onGenerateClassBack()
|
void CharacterCreation::onGenerateClassBack()
|
||||||
|
@ -162,7 +162,8 @@ void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell,
|
|||||||
mBounds.merge(Vector3(c4.x, c4.y, 0));
|
mBounds.merge(Vector3(c4.x, c4.y, 0));
|
||||||
|
|
||||||
// apply a little padding
|
// apply a little padding
|
||||||
mBounds.scale ((mBounds.getSize ()+Ogre::Vector3(1000,1000,0)) / mBounds.getSize ());
|
mBounds.setMinimum (mBounds.getMinimum() - Vector3(500,500,0));
|
||||||
|
mBounds.setMaximum (mBounds.getMaximum() + Vector3(500,500,0));
|
||||||
|
|
||||||
Vector2 center(mBounds.getCenter().x, mBounds.getCenter().y);
|
Vector2 center(mBounds.getCenter().x, mBounds.getCenter().y);
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ namespace
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void insertCellRefList(MWRender::RenderingManager& rendering,
|
void insertCellRefList(MWRender::RenderingManager& rendering,
|
||||||
T& cellRefList, MWWorld::CellStore &cell, MWWorld::PhysicsSystem& physics)
|
T& cellRefList, MWWorld::CellStore &cell, MWWorld::PhysicsSystem& physics, bool rescale)
|
||||||
{
|
{
|
||||||
if (!cellRefList.mList.empty())
|
if (!cellRefList.mList.empty())
|
||||||
{
|
{
|
||||||
@ -31,6 +31,14 @@ namespace
|
|||||||
for (typename T::List::iterator it = cellRefList.mList.begin();
|
for (typename T::List::iterator it = cellRefList.mList.begin();
|
||||||
it != cellRefList.mList.end(); it++)
|
it != cellRefList.mList.end(); it++)
|
||||||
{
|
{
|
||||||
|
if (rescale)
|
||||||
|
{
|
||||||
|
if (it->mRef.mScale<0.5)
|
||||||
|
it->mRef.mScale = 0.5;
|
||||||
|
else if (it->mRef.mScale>2)
|
||||||
|
it->mRef.mScale = 2;
|
||||||
|
}
|
||||||
|
|
||||||
++current;
|
++current;
|
||||||
|
|
||||||
if (it->mData.getCount() || it->mData.isEnabled())
|
if (it->mData.getCount() || it->mData.isEnabled())
|
||||||
@ -68,7 +76,7 @@ namespace MWWorld
|
|||||||
{
|
{
|
||||||
std::cout << "Unloading cell\n";
|
std::cout << "Unloading cell\n";
|
||||||
ListHandles functor;
|
ListHandles functor;
|
||||||
|
|
||||||
(*iter)->forEach<ListHandles>(functor);
|
(*iter)->forEach<ListHandles>(functor);
|
||||||
{
|
{
|
||||||
// silence annoying g++ warning
|
// silence annoying g++ warning
|
||||||
@ -107,7 +115,9 @@ namespace MWWorld
|
|||||||
|
|
||||||
if(result.second)
|
if(result.second)
|
||||||
{
|
{
|
||||||
insertCell(*cell);
|
/// \todo rescale depending on the state of a new GMST
|
||||||
|
insertCell (*cell, true);
|
||||||
|
|
||||||
mRendering.cellAdded (cell);
|
mRendering.cellAdded (cell);
|
||||||
|
|
||||||
float verts = ESM::Land::LAND_SIZE;
|
float verts = ESM::Land::LAND_SIZE;
|
||||||
@ -335,7 +345,7 @@ namespace MWWorld
|
|||||||
bool loadcell = (mCurrentCell == NULL);
|
bool loadcell = (mCurrentCell == NULL);
|
||||||
if(!loadcell)
|
if(!loadcell)
|
||||||
loadcell = *mCurrentCell != *cell;
|
loadcell = *mCurrentCell != *cell;
|
||||||
|
|
||||||
if(!loadcell)
|
if(!loadcell)
|
||||||
{
|
{
|
||||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
@ -347,7 +357,7 @@ namespace MWWorld
|
|||||||
world->rotateObject(world->getPlayer().getPlayer(), x, y, z);
|
world->rotateObject(world->getPlayer().getPlayer(), x, y, z);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Changing to interior\n";
|
std::cout << "Changing to interior\n";
|
||||||
|
|
||||||
// remove active
|
// remove active
|
||||||
@ -383,7 +393,7 @@ namespace MWWorld
|
|||||||
// adjust fog
|
// adjust fog
|
||||||
mRendering.switchToInterior();
|
mRendering.switchToInterior();
|
||||||
mRendering.configureFog(*mCurrentCell);
|
mRendering.configureFog(*mCurrentCell);
|
||||||
|
|
||||||
// adjust player
|
// adjust player
|
||||||
playerCellChange (mCurrentCell, position);
|
playerCellChange (mCurrentCell, position);
|
||||||
|
|
||||||
@ -415,29 +425,29 @@ namespace MWWorld
|
|||||||
mCellChanged = false;
|
mCellChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::insertCell (Ptr::CellStore &cell)
|
void Scene::insertCell (Ptr::CellStore &cell, bool rescale)
|
||||||
{
|
{
|
||||||
// Loop through all references in the cell
|
// Loop through all references in the cell
|
||||||
insertCellRefList(mRendering, cell.mActivators, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mActivators, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mPotions, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mPotions, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mAppas, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mAppas, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mArmors, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mArmors, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mBooks, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mBooks, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mClothes, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mClothes, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mContainers, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mContainers, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mCreatures, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mCreatures, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mDoors, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mDoors, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mIngreds, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mIngreds, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mCreatureLists, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mCreatureLists, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mItemLists, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mItemLists, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mLights, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mLights, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mLockpicks, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mLockpicks, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mMiscItems, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mMiscItems, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mNpcs, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mNpcs, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mProbes, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mProbes, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mRepairs, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mRepairs, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mStatics, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mStatics, cell, *mPhysics, rescale);
|
||||||
insertCellRefList(mRendering, cell.mWeapons, cell, *mPhysics);
|
insertCellRefList(mRendering, cell.mWeapons, cell, *mPhysics, rescale);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::addObjectToScene (const Ptr& ptr)
|
void Scene::addObjectToScene (const Ptr& ptr)
|
||||||
|
@ -56,6 +56,7 @@ namespace MWWorld
|
|||||||
void playerCellChange (CellStore *cell, const ESM::Position& position,
|
void playerCellChange (CellStore *cell, const ESM::Position& position,
|
||||||
bool adjustPlayerPos = true);
|
bool adjustPlayerPos = true);
|
||||||
|
|
||||||
|
void insertCell (Ptr::CellStore &cell, bool rescale);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -86,8 +87,6 @@ namespace MWWorld
|
|||||||
|
|
||||||
void markCellAsUnchanged();
|
void markCellAsUnchanged();
|
||||||
|
|
||||||
void insertCell (Ptr::CellStore &cell);
|
|
||||||
|
|
||||||
void update (float duration, bool paused);
|
void update (float duration, bool paused);
|
||||||
|
|
||||||
void addObjectToScene (const Ptr& ptr);
|
void addObjectToScene (const Ptr& ptr);
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/soundmanager.hpp"
|
#include "../mwbase/soundmanager.hpp"
|
||||||
@ -19,262 +19,125 @@ using namespace MWWorld;
|
|||||||
using namespace MWSound;
|
using namespace MWSound;
|
||||||
|
|
||||||
#define lerp(x, y) (x * (1-factor) + y * factor)
|
#define lerp(x, y) (x * (1-factor) + y * factor)
|
||||||
|
std::string WeatherManager::getFallback (const std::string& key) const
|
||||||
|
{
|
||||||
|
std::map<std::string,std::string>::const_iterator it;
|
||||||
|
if((it = mFallback.find(key)) == mFallback.end())
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
std::string WeatherManager::getFallbackString(const std::string& fall) const
|
||||||
|
{
|
||||||
|
return getFallback(fall);
|
||||||
|
}
|
||||||
|
|
||||||
const std::string WeatherGlobals::mThunderSoundID0 = "Thunder0";
|
float WeatherManager::getFallbackFloat(const std::string& fall) const
|
||||||
const std::string WeatherGlobals::mThunderSoundID1 = "Thunder1";
|
{
|
||||||
const std::string WeatherGlobals::mThunderSoundID2 = "Thunder2";
|
std::string fallback=getFallbackString(fall);
|
||||||
const std::string WeatherGlobals::mThunderSoundID3 = "Thunder3";
|
return boost::lexical_cast<float>(fallback);
|
||||||
const float WeatherGlobals::mSunriseTime = 8;
|
}
|
||||||
const float WeatherGlobals::mSunsetTime = 18;
|
|
||||||
const float WeatherGlobals::mSunriseDuration = 2;
|
|
||||||
const float WeatherGlobals::mSunsetDuration = 2;
|
|
||||||
const float WeatherGlobals::mWeatherUpdateTime = 20.f;
|
|
||||||
|
|
||||||
|
ColourValue WeatherManager::getFallbackColour(const std::string& fall) const
|
||||||
|
{
|
||||||
|
std::string sum;
|
||||||
|
std::string ret[3];
|
||||||
|
sum=getFallback(fall);
|
||||||
|
unsigned int j=0;
|
||||||
|
for(unsigned int i=0;i<sum.length();i++){
|
||||||
|
if(sum[i]==',') j++;
|
||||||
|
else ret[j]+=sum[i];
|
||||||
|
}
|
||||||
|
return ColourValue(boost::lexical_cast<int>(ret[0])/255.f,boost::lexical_cast<int>(ret[1])/255.f,boost::lexical_cast<int>(ret[2])/255.f);
|
||||||
|
}
|
||||||
|
void WeatherManager::setFallbackWeather(Weather& weather,const std::string& name)
|
||||||
|
{
|
||||||
|
std::string upper=name;
|
||||||
|
upper[0]=toupper(name[0]);
|
||||||
|
weather.mCloudsMaximumPercent = getFallbackFloat("Weather_"+upper+"_Clouds_Maximum_Percent");
|
||||||
|
weather.mTransitionDelta = getFallbackFloat("Weather_"+upper+"_Transition_Delta");
|
||||||
|
weather.mSkySunriseColor=getFallbackColour("Weather_"+upper+"_Sky_Sunrise_Color");
|
||||||
|
weather.mSkyDayColor = getFallbackColour("Weather_"+upper+"_Sky_Day_Color");
|
||||||
|
weather.mSkySunsetColor = getFallbackColour("Weather_"+upper+"_Sky_Sunset_Color");
|
||||||
|
weather.mSkyNightColor = getFallbackColour("Weather_"+upper+"_Sky_Night_Color");
|
||||||
|
weather.mFogSunriseColor = getFallbackColour("Weather_"+upper+"_Fog_Sunrise_Color");
|
||||||
|
weather.mFogDayColor = getFallbackColour("Weather_"+upper+"_Fog_Day_Color");
|
||||||
|
weather.mFogSunsetColor = getFallbackColour("Weather_"+upper+"_Fog_Sunset_Color");
|
||||||
|
weather.mFogNightColor = getFallbackColour("Weather_"+upper+"_Fog_Night_Color");
|
||||||
|
weather.mAmbientSunriseColor = getFallbackColour("Weather_"+upper+"_Ambient_Sunrise_Color");
|
||||||
|
weather.mAmbientDayColor = getFallbackColour("Weather_"+upper+"_Ambient_Day_Color");
|
||||||
|
weather.mAmbientSunsetColor = getFallbackColour("Weather_"+upper+"_Ambient_Sunset_Color");
|
||||||
|
weather.mAmbientNightColor = getFallbackColour("Weather_"+upper+"_Ambient_Night_Color");
|
||||||
|
weather.mSunSunriseColor = getFallbackColour("Weather_"+upper+"_Sun_Sunrise_Color");
|
||||||
|
weather.mSunDayColor = getFallbackColour("Weather_"+upper+"_Sun_Day_Color");
|
||||||
|
weather.mSunSunsetColor = getFallbackColour("Weather_"+upper+"_Sun_Sunset_Color");
|
||||||
|
weather.mSunNightColor = getFallbackColour("Weather_"+upper+"_Sun_Night_Color");
|
||||||
|
weather.mSunDiscSunsetColor = getFallbackColour("Weather_"+upper+"_Sun_Disc_Sunset_Color");
|
||||||
|
weather.mLandFogDayDepth = getFallbackFloat("Weather_"+upper+"_Land_Fog_Day_Depth");
|
||||||
|
weather.mLandFogNightDepth = getFallbackFloat("Weather_"+upper+"_Land_Fog_Night_Depth");
|
||||||
|
weather.mWindSpeed = getFallbackFloat("Weather_"+upper+"_Wind_Speed");
|
||||||
|
weather.mCloudSpeed = getFallbackFloat("Weather_"+upper+"_Cloud_Speed");
|
||||||
|
weather.mGlareView = getFallbackFloat("Weather_"+upper+"_Glare_View");
|
||||||
|
mWeatherSettings[name] = weather;
|
||||||
|
}
|
||||||
|
|
||||||
// morrowind sets these per-weather, but since they are only used by 'thunderstorm'
|
WeatherManager::WeatherManager(MWRender::RenderingManager* rendering,const std::map<std::string,std::string>& fallbackMap) :
|
||||||
// weather setting anyway, we can just as well set them globally
|
|
||||||
const float WeatherGlobals::mThunderFrequency = .4;
|
|
||||||
const float WeatherGlobals::mThunderThreshold = 0.6;
|
|
||||||
const float WeatherGlobals::mThunderSoundDelay = 0.25;
|
|
||||||
|
|
||||||
WeatherManager::WeatherManager(MWRender::RenderingManager* rendering) :
|
|
||||||
mHour(14), mCurrentWeather("clear"), mFirstUpdate(true), mWeatherUpdateTime(0),
|
mHour(14), mCurrentWeather("clear"), mFirstUpdate(true), mWeatherUpdateTime(0),
|
||||||
mThunderFlash(0), mThunderChance(0), mThunderChanceNeeded(50), mThunderSoundDelay(0),
|
mThunderFlash(0), mThunderChance(0), mThunderChanceNeeded(50), mThunderSoundDelay(0),
|
||||||
mRemainingTransitionTime(0), mMonth(0), mDay(0),
|
mRemainingTransitionTime(0), mMonth(0), mDay(0),
|
||||||
mTimePassed(0)
|
mTimePassed(0), mFallback(fallbackMap)
|
||||||
{
|
{
|
||||||
mRendering = rendering;
|
mRendering = rendering;
|
||||||
|
//Globals
|
||||||
#define clr(r,g,b) ColourValue(r/255.f, g/255.f, b/255.f)
|
mThunderSoundID0 = getFallbackString("Weather_Thunderstorm_Thunder_Sound_ID_0");
|
||||||
|
mThunderSoundID1 = getFallbackString("Weather_Thunderstorm_Thunder_Sound_ID_1");
|
||||||
/// \todo read these from Morrowind.ini
|
mThunderSoundID2 = getFallbackString("Weather_Thunderstorm_Thunder_Sound_ID_2");
|
||||||
|
mThunderSoundID3 = getFallbackString("Weather_Thunderstorm_Thunder_Sound_ID_3");
|
||||||
|
mSunriseTime = getFallbackFloat("Weather_Sunrise_Time");
|
||||||
|
mSunsetTime = getFallbackFloat("Weather_Sunset_Time");
|
||||||
|
mSunriseDuration = getFallbackFloat("Weather_Sunrise_Duration");
|
||||||
|
mSunsetDuration = getFallbackFloat("Weather_Sunset_Duration");
|
||||||
|
mWeatherUpdateTime = getFallbackFloat("Weather_Hours_Between_Weather_Changes");
|
||||||
|
mThunderFrequency = getFallbackFloat("Weather_Thunderstorm_Thunder_Frequency");
|
||||||
|
mThunderThreshold = getFallbackFloat("Weather_Thunderstorm_Thunder_Threshold");
|
||||||
|
mThunderSoundDelay = 0.25;
|
||||||
|
//Weather
|
||||||
Weather clear;
|
Weather clear;
|
||||||
clear.mCloudTexture = "tx_sky_clear.dds";
|
clear.mCloudTexture = "tx_sky_clear.dds";
|
||||||
clear.mCloudsMaximumPercent = 1.0;
|
setFallbackWeather(clear,"clear");
|
||||||
clear.mTransitionDelta = 0.015;
|
|
||||||
clear.mSkySunriseColor = clr(118, 141, 164);
|
|
||||||
clear.mSkyDayColor = clr(95, 135, 203);
|
|
||||||
clear.mSkySunsetColor = clr(56, 89, 129);
|
|
||||||
clear.mSkyNightColor = clr(9, 10, 11);
|
|
||||||
clear.mFogSunriseColor = clr(255, 189, 157);
|
|
||||||
clear.mFogDayColor = clr(206, 227, 255);
|
|
||||||
clear.mFogSunsetColor = clr(255, 189, 157);
|
|
||||||
clear.mFogNightColor = clr(9, 10, 11);
|
|
||||||
clear.mAmbientSunriseColor = clr(47, 66, 96);
|
|
||||||
clear.mAmbientDayColor = clr(137, 140, 160);
|
|
||||||
clear.mAmbientSunsetColor = clr(68, 75, 96);
|
|
||||||
clear.mAmbientNightColor = clr(32, 35, 42);
|
|
||||||
clear.mSunSunriseColor = clr(242, 159, 99);
|
|
||||||
clear.mSunDayColor = clr(255, 252, 238);
|
|
||||||
clear.mSunSunsetColor = clr(255, 115, 79);
|
|
||||||
clear.mSunNightColor = clr(59, 97, 176);
|
|
||||||
clear.mSunDiscSunsetColor = clr(255, 189, 157);
|
|
||||||
clear.mLandFogDayDepth = 0.69;
|
|
||||||
clear.mLandFogNightDepth = 0.69;
|
|
||||||
clear.mWindSpeed = 0.1;
|
|
||||||
clear.mCloudSpeed = 1.25;
|
|
||||||
clear.mGlareView = 1.0;
|
|
||||||
mWeatherSettings["clear"] = clear;
|
|
||||||
|
|
||||||
Weather cloudy;
|
Weather cloudy;
|
||||||
cloudy.mCloudTexture = "tx_sky_cloudy.dds";
|
cloudy.mCloudTexture = "tx_sky_cloudy.dds";
|
||||||
cloudy.mCloudsMaximumPercent = 1.0;
|
setFallbackWeather(cloudy,"cloudy");
|
||||||
cloudy.mTransitionDelta = 0.015;
|
|
||||||
cloudy.mSkySunriseColor = clr(126, 158, 173);
|
|
||||||
cloudy.mSkyDayColor = clr(117, 160, 215);
|
|
||||||
cloudy.mSkySunsetColor = clr(111, 114, 159);
|
|
||||||
cloudy.mSkyNightColor = clr(9, 10, 11);
|
|
||||||
cloudy.mFogSunriseColor = clr(255, 207, 149);
|
|
||||||
cloudy.mFogDayColor = clr(245, 235, 224);
|
|
||||||
cloudy.mFogSunsetColor = clr(255, 155, 106);
|
|
||||||
cloudy.mFogNightColor = clr(9, 10, 11);
|
|
||||||
cloudy.mAmbientSunriseColor = clr(66, 74, 87);
|
|
||||||
cloudy.mAmbientDayColor = clr(137, 145, 160);
|
|
||||||
cloudy.mAmbientSunsetColor = clr(71, 80, 92);
|
|
||||||
cloudy.mAmbientNightColor = clr(32, 39, 54);
|
|
||||||
cloudy.mSunSunriseColor = clr(241, 177, 99);
|
|
||||||
cloudy.mSunDayColor = clr(255, 236, 221);
|
|
||||||
cloudy.mSunSunsetColor = clr(255, 89, 00);
|
|
||||||
cloudy.mSunNightColor = clr(77, 91, 124);
|
|
||||||
cloudy.mSunDiscSunsetColor = clr(255, 202, 179);
|
|
||||||
cloudy.mLandFogDayDepth = 0.72;
|
|
||||||
cloudy.mLandFogNightDepth = 0.72;
|
|
||||||
cloudy.mWindSpeed = 0.2;
|
|
||||||
cloudy.mCloudSpeed = 2;
|
|
||||||
cloudy.mGlareView = 1.0;
|
|
||||||
mWeatherSettings["cloudy"] = cloudy;
|
|
||||||
|
|
||||||
Weather foggy;
|
Weather foggy;
|
||||||
foggy.mCloudTexture = "tx_sky_foggy.dds";
|
foggy.mCloudTexture = "tx_sky_foggy.dds";
|
||||||
foggy.mCloudsMaximumPercent = 1.0;
|
setFallbackWeather(foggy,"foggy");
|
||||||
foggy.mTransitionDelta = 0.015;
|
|
||||||
foggy.mSkySunriseColor = clr(197, 190, 180);
|
|
||||||
foggy.mSkyDayColor = clr(184, 211, 228);
|
|
||||||
foggy.mSkySunsetColor = clr(142, 159, 176);
|
|
||||||
foggy.mSkyNightColor = clr(18, 23, 28);
|
|
||||||
foggy.mFogSunriseColor = clr(173, 164, 148);
|
|
||||||
foggy.mFogDayColor = clr(150, 187, 209);
|
|
||||||
foggy.mFogSunsetColor = clr(113, 135, 157);
|
|
||||||
foggy.mFogNightColor = clr(19, 24, 29);
|
|
||||||
foggy.mAmbientSunriseColor = clr(48, 43, 37);
|
|
||||||
foggy.mAmbientDayColor = clr(92, 109, 120);
|
|
||||||
foggy.mAmbientSunsetColor = clr(28, 33, 39);
|
|
||||||
foggy.mAmbientNightColor = clr(28, 33, 39);
|
|
||||||
foggy.mSunSunriseColor = clr(177, 162, 137);
|
|
||||||
foggy.mSunDayColor = clr(111, 131, 151);
|
|
||||||
foggy.mSunSunsetColor = clr(125, 157, 189);
|
|
||||||
foggy.mSunNightColor = clr(81, 100, 119);
|
|
||||||
foggy.mSunDiscSunsetColor = clr(223, 223, 223);
|
|
||||||
foggy.mLandFogDayDepth = 1.0;
|
|
||||||
foggy.mLandFogNightDepth = 1.9;
|
|
||||||
foggy.mWindSpeed = 0;
|
|
||||||
foggy.mCloudSpeed = 1.25;
|
|
||||||
foggy.mGlareView = 0.25;
|
|
||||||
mWeatherSettings["foggy"] = foggy;
|
|
||||||
|
|
||||||
Weather thunderstorm;
|
Weather thunderstorm;
|
||||||
thunderstorm.mCloudTexture = "tx_sky_thunder.dds";
|
thunderstorm.mCloudTexture = "tx_sky_thunder.dds";
|
||||||
thunderstorm.mCloudsMaximumPercent = 0.66;
|
|
||||||
thunderstorm.mTransitionDelta = 0.03;
|
|
||||||
thunderstorm.mSkySunriseColor = clr(35, 36, 39);
|
|
||||||
thunderstorm.mSkyDayColor = clr(97, 104, 115);
|
|
||||||
thunderstorm.mSkySunsetColor = clr(35, 36, 39);
|
|
||||||
thunderstorm.mSkyNightColor = clr(19, 20, 22);
|
|
||||||
thunderstorm.mFogSunriseColor = clr(70, 74, 85);
|
|
||||||
thunderstorm.mFogDayColor = clr(97, 104, 115);
|
|
||||||
thunderstorm.mFogSunsetColor = clr(70, 74, 85);
|
|
||||||
thunderstorm.mFogNightColor = clr(19, 20, 22);
|
|
||||||
thunderstorm.mAmbientSunriseColor = clr(54, 54, 54);
|
|
||||||
thunderstorm.mAmbientDayColor = clr(90, 90, 90);
|
|
||||||
thunderstorm.mAmbientSunsetColor = clr(54, 54, 54);
|
|
||||||
thunderstorm.mAmbientNightColor = clr(49, 51, 54);
|
|
||||||
thunderstorm.mSunSunriseColor = clr(91, 99, 122);
|
|
||||||
thunderstorm.mSunDayColor = clr(138, 144, 155);
|
|
||||||
thunderstorm.mSunSunsetColor = clr(96, 101, 117);
|
|
||||||
thunderstorm.mSunNightColor = clr(55, 76, 110);
|
|
||||||
thunderstorm.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
thunderstorm.mLandFogDayDepth = 1;
|
|
||||||
thunderstorm.mLandFogNightDepth = 1.15;
|
|
||||||
thunderstorm.mWindSpeed = 0.5;
|
|
||||||
thunderstorm.mCloudSpeed = 3;
|
|
||||||
thunderstorm.mGlareView = 0;
|
|
||||||
thunderstorm.mRainLoopSoundID = "rain heavy";
|
thunderstorm.mRainLoopSoundID = "rain heavy";
|
||||||
mWeatherSettings["thunderstorm"] = thunderstorm;
|
setFallbackWeather(thunderstorm,"thunderstorm");
|
||||||
|
|
||||||
Weather rain;
|
Weather rain;
|
||||||
rain.mCloudTexture = "tx_sky_rainy.dds";
|
rain.mCloudTexture = "tx_sky_rainy.dds";
|
||||||
rain.mCloudsMaximumPercent = 0.66;
|
|
||||||
rain.mTransitionDelta = 0.015;
|
|
||||||
rain.mSkySunriseColor = clr(71, 74, 75);
|
|
||||||
rain.mSkyDayColor = clr(116, 120, 122);
|
|
||||||
rain.mSkySunsetColor = clr(73, 73, 73);
|
|
||||||
rain.mSkyNightColor = clr(24, 25, 26);
|
|
||||||
rain.mFogSunriseColor = clr(71, 74, 75);
|
|
||||||
rain.mFogDayColor = clr(116, 120, 122);
|
|
||||||
rain.mFogSunsetColor = clr(73, 73, 73);
|
|
||||||
rain.mFogNightColor = clr(24, 25, 26);
|
|
||||||
rain.mAmbientSunriseColor = clr(97, 90, 88);
|
|
||||||
rain.mAmbientDayColor = clr(105, 110, 113);
|
|
||||||
rain.mAmbientSunsetColor = clr(88, 97, 97);
|
|
||||||
rain.mAmbientNightColor = clr(50, 55, 67);
|
|
||||||
rain.mSunSunriseColor = clr(131, 122, 120);
|
|
||||||
rain.mSunDayColor = clr(149, 157, 170);
|
|
||||||
rain.mSunSunsetColor = clr(120, 126, 131);
|
|
||||||
rain.mSunNightColor = clr(50, 62, 101);
|
|
||||||
rain.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
rain.mLandFogDayDepth = 0.8;
|
|
||||||
rain.mLandFogNightDepth = 0.8;
|
|
||||||
rain.mWindSpeed = 0.3;
|
|
||||||
rain.mCloudSpeed = 2;
|
|
||||||
rain.mGlareView = 0;
|
|
||||||
rain.mRainLoopSoundID = "rain";
|
rain.mRainLoopSoundID = "rain";
|
||||||
mWeatherSettings["rain"] = rain;
|
setFallbackWeather(rain,"rain");
|
||||||
|
|
||||||
Weather overcast;
|
Weather overcast;
|
||||||
overcast.mCloudTexture = "tx_sky_overcast.dds";
|
overcast.mCloudTexture = "tx_sky_overcast.dds";
|
||||||
overcast.mCloudsMaximumPercent = 1.0;
|
setFallbackWeather(overcast,"overcast");
|
||||||
overcast.mTransitionDelta = 0.015;
|
|
||||||
overcast.mSkySunriseColor = clr(91, 99, 106);
|
|
||||||
overcast.mSkyDayColor = clr(143, 146, 149);
|
|
||||||
overcast.mSkySunsetColor = clr(108, 115, 121);
|
|
||||||
overcast.mSkyNightColor = clr(19, 22, 25);
|
|
||||||
overcast.mFogSunriseColor = clr(91, 99, 106);
|
|
||||||
overcast.mFogDayColor = clr(143, 146, 149);
|
|
||||||
overcast.mFogSunsetColor = clr(108, 115, 121);
|
|
||||||
overcast.mFogNightColor = clr(19, 22, 25);
|
|
||||||
overcast.mAmbientSunriseColor = clr(84, 88, 92);
|
|
||||||
overcast.mAmbientDayColor = clr(93, 96, 105);
|
|
||||||
overcast.mAmbientSunsetColor = clr(83, 77, 75);
|
|
||||||
overcast.mAmbientNightColor = clr(57, 60, 66);
|
|
||||||
overcast.mSunSunriseColor = clr(87, 125, 163);
|
|
||||||
overcast.mSunDayColor = clr(163, 169, 183);
|
|
||||||
overcast.mSunSunsetColor = clr(85, 103, 157);
|
|
||||||
overcast.mSunNightColor = clr(32, 54, 100);
|
|
||||||
overcast.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
overcast.mLandFogDayDepth = 0.7;
|
|
||||||
overcast.mLandFogNightDepth = 0.7;
|
|
||||||
overcast.mWindSpeed = 0.2;
|
|
||||||
overcast.mCloudSpeed = 1.5;
|
|
||||||
overcast.mGlareView = 0;
|
|
||||||
mWeatherSettings["overcast"] = overcast;
|
|
||||||
|
|
||||||
Weather ashstorm;
|
Weather ashstorm;
|
||||||
ashstorm.mCloudTexture = "tx_sky_ashstorm.dds";
|
ashstorm.mCloudTexture = "tx_sky_ashstorm.dds";
|
||||||
ashstorm.mCloudsMaximumPercent = 1.0;
|
|
||||||
ashstorm.mTransitionDelta = 0.035;
|
|
||||||
ashstorm.mSkySunriseColor = clr(91, 56, 51);
|
|
||||||
ashstorm.mSkyDayColor = clr(124, 73, 58);
|
|
||||||
ashstorm.mSkySunsetColor = clr(106, 55, 40);
|
|
||||||
ashstorm.mSkyNightColor = clr(20, 21, 22);
|
|
||||||
ashstorm.mFogSunriseColor = clr(91, 56, 51);
|
|
||||||
ashstorm.mFogDayColor = clr(124, 73, 58);
|
|
||||||
ashstorm.mFogSunsetColor = clr(106, 55, 40);
|
|
||||||
ashstorm.mFogNightColor = clr(20, 21, 22);
|
|
||||||
ashstorm.mAmbientSunriseColor = clr(52, 42, 37);
|
|
||||||
ashstorm.mAmbientDayColor = clr(75, 49, 41);
|
|
||||||
ashstorm.mAmbientSunsetColor = clr(48, 39, 35);
|
|
||||||
ashstorm.mAmbientNightColor = clr(36, 42, 49);
|
|
||||||
ashstorm.mSunSunriseColor = clr(184, 91, 71);
|
|
||||||
ashstorm.mSunDayColor = clr(228, 139, 114);
|
|
||||||
ashstorm.mSunSunsetColor = clr(185, 86, 57);
|
|
||||||
ashstorm.mSunNightColor = clr(54, 66, 74);
|
|
||||||
ashstorm.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
ashstorm.mLandFogDayDepth = 1.1;
|
|
||||||
ashstorm.mLandFogNightDepth = 1.2;
|
|
||||||
ashstorm.mWindSpeed = 0.8;
|
|
||||||
ashstorm.mCloudSpeed = 7;
|
|
||||||
ashstorm.mGlareView = 0;
|
|
||||||
ashstorm.mAmbientLoopSoundID = "ashstorm";
|
ashstorm.mAmbientLoopSoundID = "ashstorm";
|
||||||
mWeatherSettings["ashstorm"] = ashstorm;
|
setFallbackWeather(ashstorm,"ashstorm");
|
||||||
|
|
||||||
Weather blight;
|
Weather blight;
|
||||||
blight.mCloudTexture = "tx_sky_blight.dds";
|
blight.mCloudTexture = "tx_sky_blight.dds";
|
||||||
blight.mCloudsMaximumPercent = 1.0;
|
|
||||||
blight.mTransitionDelta = 0.04;
|
|
||||||
blight.mSkySunriseColor = clr(90, 35, 35);
|
|
||||||
blight.mSkyDayColor = clr(90, 35, 35);
|
|
||||||
blight.mSkySunsetColor = clr(92, 33, 33);
|
|
||||||
blight.mSkyNightColor = clr(44, 14, 14);
|
|
||||||
blight.mFogSunriseColor = clr(90, 35, 35);
|
|
||||||
blight.mFogDayColor = clr(128, 19, 19);
|
|
||||||
blight.mFogSunsetColor = clr(92, 33, 33);
|
|
||||||
blight.mFogNightColor = clr(44, 14, 14);
|
|
||||||
blight.mAmbientSunriseColor = clr(61, 40, 40);
|
|
||||||
blight.mAmbientDayColor = clr(79, 54, 54);
|
|
||||||
blight.mAmbientSunsetColor = clr(61, 40, 40);
|
|
||||||
blight.mAmbientNightColor = clr(56, 58, 62);
|
|
||||||
blight.mSunSunriseColor = clr(180, 78, 78);
|
|
||||||
blight.mSunDayColor = clr(224, 84, 84);
|
|
||||||
blight.mSunSunsetColor = clr(180, 78, 78);
|
|
||||||
blight.mSunNightColor = clr(61, 91, 143);
|
|
||||||
blight.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
blight.mLandFogDayDepth = 1.1;
|
|
||||||
blight.mLandFogNightDepth = 1.2;
|
|
||||||
blight.mWindSpeed = 0.9;
|
|
||||||
blight.mCloudSpeed = 9;
|
|
||||||
blight.mGlareView = 0;
|
|
||||||
blight.mAmbientLoopSoundID = "blight";
|
blight.mAmbientLoopSoundID = "blight";
|
||||||
mWeatherSettings["blight"] = blight;
|
setFallbackWeather(blight,"blight");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Weather snow;
|
Weather snow;
|
||||||
@ -502,7 +365,7 @@ void WeatherManager::update(float duration)
|
|||||||
if (mWeatherUpdateTime <= 0 || regionstr != mCurrentRegion)
|
if (mWeatherUpdateTime <= 0 || regionstr != mCurrentRegion)
|
||||||
{
|
{
|
||||||
mCurrentRegion = regionstr;
|
mCurrentRegion = regionstr;
|
||||||
mWeatherUpdateTime = WeatherGlobals::mWeatherUpdateTime*3600;
|
mWeatherUpdateTime = mWeatherUpdateTime*3600;
|
||||||
|
|
||||||
std::string weather = "clear";
|
std::string weather = "clear";
|
||||||
|
|
||||||
@ -681,17 +544,17 @@ void WeatherManager::update(float duration)
|
|||||||
// pick a random sound
|
// pick a random sound
|
||||||
int sound = rand() % 4;
|
int sound = rand() % 4;
|
||||||
std::string soundname;
|
std::string soundname;
|
||||||
if (sound == 0) soundname = WeatherGlobals::mThunderSoundID0;
|
if (sound == 0) soundname = mThunderSoundID0;
|
||||||
else if (sound == 1) soundname = WeatherGlobals::mThunderSoundID1;
|
else if (sound == 1) soundname = mThunderSoundID1;
|
||||||
else if (sound == 2) soundname = WeatherGlobals::mThunderSoundID2;
|
else if (sound == 2) soundname = mThunderSoundID2;
|
||||||
else if (sound == 3) soundname = WeatherGlobals::mThunderSoundID3;
|
else if (sound == 3) soundname = mThunderSoundID3;
|
||||||
MWBase::Environment::get().getSoundManager()->playSound(soundname, 1.0, 1.0);
|
MWBase::Environment::get().getSoundManager()->playSound(soundname, 1.0, 1.0);
|
||||||
mThunderSoundDelay = 1000;
|
mThunderSoundDelay = 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
mThunderFlash -= duration;
|
mThunderFlash -= duration;
|
||||||
if (mThunderFlash > 0)
|
if (mThunderFlash > 0)
|
||||||
mRendering->getSkyManager()->setLightningStrength( mThunderFlash / WeatherGlobals::mThunderThreshold );
|
mRendering->getSkyManager()->setLightningStrength( mThunderFlash / mThunderThreshold );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
@ -706,11 +569,11 @@ void WeatherManager::update(float duration)
|
|||||||
mThunderChance += duration*4; // chance increases by 4 percent every second
|
mThunderChance += duration*4; // chance increases by 4 percent every second
|
||||||
if (mThunderChance >= mThunderChanceNeeded)
|
if (mThunderChance >= mThunderChanceNeeded)
|
||||||
{
|
{
|
||||||
mThunderFlash = WeatherGlobals::mThunderThreshold;
|
mThunderFlash = mThunderThreshold;
|
||||||
|
|
||||||
mRendering->getSkyManager()->setLightningStrength( mThunderFlash / WeatherGlobals::mThunderThreshold );
|
mRendering->getSkyManager()->setLightningStrength( mThunderFlash / mThunderThreshold );
|
||||||
|
|
||||||
mThunderSoundDelay = WeatherGlobals::mThunderSoundDelay;
|
mThunderSoundDelay = 0.25;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,106 +11,6 @@ namespace MWRender
|
|||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
/// Global weather manager properties (according to INI)
|
|
||||||
struct WeatherGlobals
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
[Weather]
|
|
||||||
EnvReduceColor=255,255,255,255
|
|
||||||
LerpCloseColor=037,046,048,255
|
|
||||||
BumpFadeColor=230,239,255,255
|
|
||||||
AlphaReduce=0.35
|
|
||||||
Minimum Time Between Environmental Sounds=1.0
|
|
||||||
Maximum Time Between Environmental Sounds=5.0
|
|
||||||
Sun Glare Fader Max=0.5
|
|
||||||
Sun Glare Fader Angle Max=30.0
|
|
||||||
Sun Glare Fader Color=222,095,039
|
|
||||||
Timescale Clouds=0
|
|
||||||
Precip Gravity=575
|
|
||||||
Hours Between Weather Changes=20
|
|
||||||
Rain Ripples=1
|
|
||||||
Rain Ripple Radius=1024
|
|
||||||
Rain Ripples Per Drop=1
|
|
||||||
Rain Ripple Scale=0.3
|
|
||||||
Rain Ripple Speed=1.0
|
|
||||||
Fog Depth Change Speed=3
|
|
||||||
Sunrise Time=6
|
|
||||||
Sunset Time=18
|
|
||||||
Sunrise Duration=2
|
|
||||||
Sunset Duration=2
|
|
||||||
Sky Pre-Sunrise Time=.5
|
|
||||||
Sky Post-Sunrise Time=1
|
|
||||||
Sky Pre-Sunset Time=1.5
|
|
||||||
Sky Post-Sunset Time=.5
|
|
||||||
Ambient Pre-Sunrise Time=.5
|
|
||||||
Ambient Post-Sunrise Time=2
|
|
||||||
Ambient Pre-Sunset Time=1
|
|
||||||
Ambient Post-Sunset Time=1.25
|
|
||||||
Fog Pre-Sunrise Time=.5
|
|
||||||
Fog Post-Sunrise Time=1
|
|
||||||
Fog Pre-Sunset Time=2
|
|
||||||
Fog Post-Sunset Time=1
|
|
||||||
Sun Pre-Sunrise Time=0
|
|
||||||
Sun Post-Sunrise Time=0
|
|
||||||
Sun Pre-Sunset Time=1
|
|
||||||
Sun Post-Sunset Time=1.25
|
|
||||||
Stars Post-Sunset Start=1
|
|
||||||
Stars Pre-Sunrise Finish=2
|
|
||||||
Stars Fading Duration=2
|
|
||||||
Snow Ripples=0
|
|
||||||
Snow Ripple Radius=1024
|
|
||||||
Snow Ripples Per Flake=1
|
|
||||||
Snow Ripple Scale=0.3
|
|
||||||
Snow Ripple Speed=1.0
|
|
||||||
Snow Gravity Scale=0.1
|
|
||||||
Snow High Kill=700
|
|
||||||
Snow Low Kill=150
|
|
||||||
|
|
||||||
|
|
||||||
[Moons]
|
|
||||||
Masser Size=94
|
|
||||||
Masser Fade In Start=14
|
|
||||||
Masser Fade In Finish=15
|
|
||||||
Masser Fade Out Start=7
|
|
||||||
Masser Fade Out Finish=10
|
|
||||||
Masser Axis Offset=35
|
|
||||||
Masser Speed=.5
|
|
||||||
Masser Daily Increment=1
|
|
||||||
Masser Fade Start Angle=50
|
|
||||||
Masser Fade End Angle=40
|
|
||||||
Masser Moon Shadow Early Fade Angle=0.5
|
|
||||||
Secunda Size=40
|
|
||||||
Secunda Fade In Start=14
|
|
||||||
Secunda Fade In Finish=15
|
|
||||||
Secunda Fade Out Start=7
|
|
||||||
Secunda Fade Out Finish=10
|
|
||||||
Secunda Axis Offset=50
|
|
||||||
Secunda Speed=.6
|
|
||||||
Secunda Daily Increment=1.2
|
|
||||||
Secunda Fade Start Angle=50
|
|
||||||
Secunda Fade End Angle=30
|
|
||||||
Secunda Moon Shadow Early Fade Angle=0.5
|
|
||||||
Script Color=255,20,20
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const float mSunriseTime;
|
|
||||||
static const float mSunsetTime;
|
|
||||||
static const float mSunriseDuration;
|
|
||||||
static const float mSunsetDuration;
|
|
||||||
|
|
||||||
static const float mWeatherUpdateTime;
|
|
||||||
|
|
||||||
// morrowind sets these per-weather, but since they are only used by 'thunderstorm'
|
|
||||||
// weather setting anyway, we can just as well set them globally
|
|
||||||
static const float mThunderFrequency;
|
|
||||||
static const float mThunderThreshold;
|
|
||||||
static const float mThunderSoundDelay;
|
|
||||||
static const std::string mThunderSoundID0;
|
|
||||||
static const std::string mThunderSoundID1;
|
|
||||||
static const std::string mThunderSoundID2;
|
|
||||||
static const std::string mThunderSoundID3;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Defines the actual weather that results from weather setting (see below), time of day and weather transition
|
/// Defines the actual weather that results from weather setting (see below), time of day and weather transition
|
||||||
struct WeatherResult
|
struct WeatherResult
|
||||||
{
|
{
|
||||||
@ -212,7 +112,7 @@ namespace MWWorld
|
|||||||
class WeatherManager
|
class WeatherManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WeatherManager(MWRender::RenderingManager*);
|
WeatherManager(MWRender::RenderingManager*,const std::map<std::string,std::string>& fallbackMap);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the weather in the specified region
|
* Change the weather in the specified region
|
||||||
@ -241,7 +141,12 @@ namespace MWWorld
|
|||||||
private:
|
private:
|
||||||
float mHour;
|
float mHour;
|
||||||
int mDay, mMonth;
|
int mDay, mMonth;
|
||||||
|
std::map<std::string,std::string> mFallback;
|
||||||
|
std::string getFallback (const std::string& key) const;
|
||||||
|
std::string getFallbackString(const std::string& fall) const;
|
||||||
|
float getFallbackFloat(const std::string& fall) const;
|
||||||
|
Ogre::ColourValue getFallbackColour(const std::string& fall) const;
|
||||||
|
void setFallbackWeather(Weather& weather,const std::string& name);
|
||||||
MWRender::RenderingManager* mRendering;
|
MWRender::RenderingManager* mRendering;
|
||||||
|
|
||||||
std::map<Ogre::String, Weather> mWeatherSettings;
|
std::map<Ogre::String, Weather> mWeatherSettings;
|
||||||
@ -257,14 +162,11 @@ namespace MWWorld
|
|||||||
|
|
||||||
bool mFirstUpdate;
|
bool mFirstUpdate;
|
||||||
|
|
||||||
float mWeatherUpdateTime;
|
|
||||||
|
|
||||||
float mRemainingTransitionTime;
|
float mRemainingTransitionTime;
|
||||||
|
|
||||||
float mThunderFlash;
|
float mThunderFlash;
|
||||||
float mThunderChance;
|
float mThunderChance;
|
||||||
float mThunderChanceNeeded;
|
float mThunderChanceNeeded;
|
||||||
float mThunderSoundDelay;
|
|
||||||
|
|
||||||
double mTimePassed; // time passed since last update
|
double mTimePassed; // time passed since last update
|
||||||
|
|
||||||
@ -272,6 +174,18 @@ namespace MWWorld
|
|||||||
WeatherResult getResult(const Ogre::String& weather);
|
WeatherResult getResult(const Ogre::String& weather);
|
||||||
|
|
||||||
void setWeather(const Ogre::String& weather, bool instant=false);
|
void setWeather(const Ogre::String& weather, bool instant=false);
|
||||||
|
float mSunriseTime;
|
||||||
|
float mSunsetTime;
|
||||||
|
float mSunriseDuration;
|
||||||
|
float mSunsetDuration;
|
||||||
|
float mWeatherUpdateTime;
|
||||||
|
float mThunderFrequency;
|
||||||
|
float mThunderThreshold;
|
||||||
|
float mThunderSoundDelay;
|
||||||
|
std::string mThunderSoundID0;
|
||||||
|
std::string mThunderSoundID1;
|
||||||
|
std::string mThunderSoundID2;
|
||||||
|
std::string mThunderSoundID3;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ namespace MWWorld
|
|||||||
|
|
||||||
mPhysEngine->setSceneManager(renderer.getScene());
|
mPhysEngine->setSceneManager(renderer.getScene());
|
||||||
|
|
||||||
mWeatherManager = new MWWorld::WeatherManager(mRendering);
|
mWeatherManager = new MWWorld::WeatherManager(mRendering,fallbackMap);
|
||||||
|
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
// NOTE: We might need to reserve one more for the running game / save.
|
// NOTE: We might need to reserve one more for the running game / save.
|
||||||
|
@ -31,6 +31,32 @@ namespace Files
|
|||||||
return iter->second;
|
return iter->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::filesystem::path Collections::getPath(const std::string& file) const
|
||||||
|
{
|
||||||
|
for (Files::PathContainer::const_iterator iter = mDirectories.begin();
|
||||||
|
iter != mDirectories.end(); ++iter)
|
||||||
|
{
|
||||||
|
const boost::filesystem::path path = *iter / file;
|
||||||
|
if (boost::filesystem::exists(path))
|
||||||
|
return path.string();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw std::runtime_error ("file " + file + " not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Collections::doesExist(const std::string& file) const
|
||||||
|
{
|
||||||
|
for (Files::PathContainer::const_iterator iter = mDirectories.begin();
|
||||||
|
iter != mDirectories.end(); ++iter)
|
||||||
|
{
|
||||||
|
const boost::filesystem::path path = *iter / file;
|
||||||
|
if (boost::filesystem::exists(path))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const Files::PathContainer& Collections::getPaths() const
|
const Files::PathContainer& Collections::getPaths() const
|
||||||
{
|
{
|
||||||
return mDirectories;
|
return mDirectories;
|
||||||
|
@ -19,6 +19,16 @@ namespace Files
|
|||||||
/// leading dot and must be all lower-case.
|
/// leading dot and must be all lower-case.
|
||||||
const MultiDirCollection& getCollection(const std::string& extension) const;
|
const MultiDirCollection& getCollection(const std::string& extension) const;
|
||||||
|
|
||||||
|
boost::filesystem::path getPath(const std::string& file) const;
|
||||||
|
///< Return full path (including filename) of \a file.
|
||||||
|
///
|
||||||
|
/// If the file does not exist in any of the collection's
|
||||||
|
/// directories, an exception is thrown. \a file must include the
|
||||||
|
/// extension.
|
||||||
|
|
||||||
|
bool doesExist(const std::string& file) const;
|
||||||
|
///< \return Does a file with the given name exist?
|
||||||
|
|
||||||
const Files::PathContainer& getPaths() const;
|
const Files::PathContainer& getPaths() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -43,6 +43,7 @@ Mark Siewert (mark76)
|
|||||||
Manuel Edelmann (vorenon)
|
Manuel Edelmann (vorenon)
|
||||||
Michael Mc Donnell
|
Michael Mc Donnell
|
||||||
Michael Papageorgiou (werdanith)
|
Michael Papageorgiou (werdanith)
|
||||||
|
Michał Bień (Glorf)
|
||||||
Nathan Jeffords (blunted2night)
|
Nathan Jeffords (blunted2night)
|
||||||
Nikolay Kasyanov (corristo)
|
Nikolay Kasyanov (corristo)
|
||||||
Nolan Poe (nopoe)
|
Nolan Poe (nopoe)
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 644 B After Width: | Height: | Size: 590 B |
@ -67,6 +67,9 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="ProfilesComboBox" name="profilesComboBox">
|
<widget class="ProfilesComboBox" name="profilesComboBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@ -107,6 +110,41 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
<action name="newProfileAction">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset theme="document-new"/>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>New Profile</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>New Profile</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Ctrl+N</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="deleteProfileAction">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset theme="edit-delete"/>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Delete Profile</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Delete Profile</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="checkAction">
|
||||||
|
<property name="text">
|
||||||
|
<string>Check Selection</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="uncheckAction">
|
||||||
|
<property name="text">
|
||||||
|
<string>Uncheck Selection</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
@ -2,25 +2,17 @@
|
|||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>MainWindow</class>
|
<class>MainWindow</class>
|
||||||
<widget class="QMainWindow" name="MainWindow">
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>575</width>
|
|
||||||
<height>575</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>575</width>
|
<width>575</width>
|
||||||
<height>575</height>
|
<height>525</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>OpenMW Launcher</string>
|
<string>OpenMW Launcher</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowIcon">
|
<property name="windowIcon">
|
||||||
<iconset resource="../resources.qrc">
|
<iconset resource="../launcher/launcher.qrc">
|
||||||
<normaloff>:/images/openmw.png</normaloff>:/images/openmw.png</iconset>
|
<normaloff>:/images/openmw.png</normaloff>:/images/openmw.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralwidget">
|
<widget class="QWidget" name="centralwidget">
|
||||||
@ -42,7 +34,7 @@
|
|||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">#iconWidget {
|
<string notr="true">#iconWidget {
|
||||||
background-image: url(":/images/openmw-header.png");
|
background-image: url(":/images/openmw-header.png");
|
||||||
background-color: white;
|
background-color: palette(base);
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-attachment: scroll;
|
background-attachment: scroll;
|
||||||
background-position: right;
|
background-position: right;
|
||||||
@ -74,7 +66,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../resources.qrc"/>
|
<include location="../launcher/launcher.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
|
|
||||||
font-size: 12pt;
|
font-size: 12pt;
|
||||||
font-family: "EB Garamond", "EB Garamond 08";
|
font-family: "EB Garamond", "EB Garamond 08";
|
||||||
|
color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
#profilesComboBox::drop-down {
|
#profilesComboBox::drop-down {
|
||||||
@ -81,11 +82,10 @@
|
|||||||
left: 1px;
|
left: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#profilesComboBox QAbstractItemView {
|
#profilesComboBox QAbstractItemView {
|
||||||
border: 2px solid lightgray;
|
border: 0px;
|
||||||
border-radius: 5px;
|
}</string>
|
||||||
}
|
|
||||||
</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -95,6 +95,7 @@
|
|||||||
<string notr="true">#profileLabel {
|
<string notr="true">#profileLabel {
|
||||||
font-size: 18pt;
|
font-size: 18pt;
|
||||||
font-family: "EB Garamond", "EB Garamond 08";
|
font-family: "EB Garamond", "EB Garamond 08";
|
||||||
|
color: black;
|
||||||
}
|
}
|
||||||
</string>
|
</string>
|
||||||
</property>
|
</property>
|
||||||
@ -185,8 +186,6 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources/>
|
||||||
<include location="../resources.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user