mirror of
https://github.com/vcmi/vcmi.git
synced 2025-04-13 11:40:38 +02:00
Merge branch 'develop' into SpellsRefactoring8
This commit is contained in:
commit
948a339463
@ -92,7 +92,7 @@ static po::variables_map vm;
|
|||||||
|
|
||||||
static bool ermInteractiveMode = false; //structurize when time is right
|
static bool ermInteractiveMode = false; //structurize when time is right
|
||||||
void processCommand(const std::string &message);
|
void processCommand(const std::string &message);
|
||||||
static void setScreenRes(int w, int h, int bpp, bool fullscreen, bool resetVideo=true);
|
static void setScreenRes(int w, int h, int bpp, bool fullscreen, int displayIndex, bool resetVideo=true);
|
||||||
void dispose();
|
void dispose();
|
||||||
void playIntro();
|
void playIntro();
|
||||||
static void mainLoop();
|
static void mainLoop();
|
||||||
@ -407,7 +407,7 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setScreenRes(res["width"].Float(), res["height"].Float(), video["bitsPerPixel"].Float(), video["fullscreen"].Bool());
|
setScreenRes(res["width"].Float(), res["height"].Float(), video["bitsPerPixel"].Float(), video["displayIndex"].Float(), video["fullscreen"].Bool());
|
||||||
logGlobal->infoStream() <<"\tInitializing screen: "<<pomtime.getDiff();
|
logGlobal->infoStream() <<"\tInitializing screen: "<<pomtime.getDiff();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -984,7 +984,7 @@ static void cleanupRenderer()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool recreateWindow(int w, int h, int bpp, bool fullscreen)
|
static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIndex)
|
||||||
{
|
{
|
||||||
// VCMI will only work with 2 or 4 bytes per pixel
|
// VCMI will only work with 2 or 4 bytes per pixel
|
||||||
vstd::amax(bpp, 16);
|
vstd::amax(bpp, 16);
|
||||||
@ -992,7 +992,14 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen)
|
|||||||
if(bpp>16)
|
if(bpp>16)
|
||||||
bpp = 32;
|
bpp = 32;
|
||||||
|
|
||||||
if(!checkVideoMode(0,w,h))
|
if(displayIndex < 0)
|
||||||
|
{
|
||||||
|
if (mainWindow != nullptr)
|
||||||
|
displayIndex = SDL_GetWindowDisplayIndex(mainWindow);
|
||||||
|
if (displayIndex < 0)
|
||||||
|
displayIndex = 0;
|
||||||
|
}
|
||||||
|
if(!checkVideoMode(displayIndex, w, h))
|
||||||
{
|
{
|
||||||
logGlobal->errorStream() << "Error: SDL says that " << w << "x" << h << " resolution is not available!";
|
logGlobal->errorStream() << "Error: SDL says that " << w << "x" << h << " resolution is not available!";
|
||||||
return false;
|
return false;
|
||||||
@ -1005,12 +1012,12 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen)
|
|||||||
if(fullscreen)
|
if(fullscreen)
|
||||||
{
|
{
|
||||||
//in full-screen mode always use desktop resolution
|
//in full-screen mode always use desktop resolution
|
||||||
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP);
|
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex),SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP);
|
||||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
|
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED, w, h, 0);
|
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex),SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), w, h, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nullptr == mainWindow)
|
if(nullptr == mainWindow)
|
||||||
@ -1091,9 +1098,9 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//used only once during initialization
|
//used only once during initialization
|
||||||
static void setScreenRes(int w, int h, int bpp, bool fullscreen, bool resetVideo)
|
static void setScreenRes(int w, int h, int bpp, bool fullscreen, int displayIndex, bool resetVideo)
|
||||||
{
|
{
|
||||||
if(!recreateWindow(w,h,bpp,fullscreen))
|
if(!recreateWindow(w, h, bpp, fullscreen, displayIndex))
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Requested screen resolution is not available\n");
|
throw std::runtime_error("Requested screen resolution is not available\n");
|
||||||
}
|
}
|
||||||
@ -1111,7 +1118,7 @@ static void fullScreenChanged()
|
|||||||
auto w = screen->w;
|
auto w = screen->w;
|
||||||
auto h = screen->h;
|
auto h = screen->h;
|
||||||
|
|
||||||
if(!recreateWindow(w,h,bitsPerPixel,toFullscreen))
|
if(!recreateWindow(w, h, bitsPerPixel, toFullscreen, -1))
|
||||||
{
|
{
|
||||||
//will return false and report error if video mode is not supported
|
//will return false and report error if video mode is not supported
|
||||||
return;
|
return;
|
||||||
|
@ -128,8 +128,8 @@ void CSoundHandler::release()
|
|||||||
|
|
||||||
for (auto &chunk : soundChunks)
|
for (auto &chunk : soundChunks)
|
||||||
{
|
{
|
||||||
if (chunk.second)
|
if (chunk.second.first)
|
||||||
Mix_FreeChunk(chunk.second);
|
Mix_FreeChunk(chunk.second.first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,14 +142,14 @@ Mix_Chunk *CSoundHandler::GetSoundChunk(std::string &sound, bool cache)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (cache && soundChunks.find(sound) != soundChunks.end())
|
if (cache && soundChunks.find(sound) != soundChunks.end())
|
||||||
return soundChunks[sound];
|
return soundChunks[sound].first;
|
||||||
|
|
||||||
auto data = CResourceHandler::get()->load(ResourceID(std::string("SOUNDS/") + sound, EResType::SOUND))->readAll();
|
auto data = CResourceHandler::get()->load(ResourceID(std::string("SOUNDS/") + sound, EResType::SOUND))->readAll();
|
||||||
SDL_RWops *ops = SDL_RWFromMem(data.first.release(), data.second);
|
SDL_RWops *ops = SDL_RWFromMem(data.first.get(), data.second);
|
||||||
Mix_Chunk *chunk = Mix_LoadWAV_RW(ops, 1); // will free ops
|
Mix_Chunk *chunk = Mix_LoadWAV_RW(ops, 1); // will free ops
|
||||||
|
|
||||||
if (cache)
|
if (cache)
|
||||||
soundChunks.insert(std::pair<std::string, Mix_Chunk *>(sound, chunk));
|
soundChunks.insert(std::pair<std::string, CachedChunk>(sound, std::make_pair (chunk, std::move (data.first))));
|
||||||
|
|
||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,8 @@ private:
|
|||||||
SettingsListener listener;
|
SettingsListener listener;
|
||||||
void onVolumeChange(const JsonNode &volumeNode);
|
void onVolumeChange(const JsonNode &volumeNode);
|
||||||
|
|
||||||
std::map<std::string, Mix_Chunk *> soundChunks;
|
using CachedChunk = std::pair<Mix_Chunk *, std::unique_ptr<ui8[]>>;
|
||||||
|
std::map<std::string, CachedChunk> soundChunks;
|
||||||
|
|
||||||
Mix_Chunk *GetSoundChunk(std::string &sound, bool cache);
|
Mix_Chunk *GetSoundChunk(std::string &sound, bool cache);
|
||||||
|
|
||||||
|
@ -2294,8 +2294,10 @@ void CPlayerInterface::acceptTurn()
|
|||||||
{
|
{
|
||||||
adventureInt->select(heroToSelect, centerView);
|
adventureInt->select(heroToSelect, centerView);
|
||||||
}
|
}
|
||||||
else
|
else if(towns.size())
|
||||||
adventureInt->select(towns.front(), centerView);
|
adventureInt->select(towns.front(), centerView);
|
||||||
|
else
|
||||||
|
adventureInt->select(wanderingHeroes.front());
|
||||||
|
|
||||||
//show new day animation and sound on infobar
|
//show new day animation and sound on infobar
|
||||||
adventureInt->infoBar.showDate();
|
adventureInt->infoBar.showDate();
|
||||||
|
@ -1146,7 +1146,7 @@ void SelectionTab::parseGames(const std::unordered_set<ResourceID> &files, bool
|
|||||||
// Create the map info object
|
// Create the map info object
|
||||||
CMapInfo mapInfo;
|
CMapInfo mapInfo;
|
||||||
mapInfo.mapHeader = make_unique<CMapHeader>();
|
mapInfo.mapHeader = make_unique<CMapHeader>();
|
||||||
mapInfo.scenarioOpts = new StartInfo;
|
mapInfo.scenarioOpts = nullptr;//to be created by serialiser
|
||||||
lf >> *(mapInfo.mapHeader.get()) >> mapInfo.scenarioOpts;
|
lf >> *(mapInfo.mapHeader.get()) >> mapInfo.scenarioOpts;
|
||||||
mapInfo.fileURI = file.getName();
|
mapInfo.fileURI = file.getName();
|
||||||
mapInfo.countPlayers();
|
mapInfo.countPlayers();
|
||||||
|
@ -1378,7 +1378,7 @@ std::string CBuildWindow::getTextForState(int state)
|
|||||||
};
|
};
|
||||||
|
|
||||||
ret = CGI->generaltexth->allTexts[52];
|
ret = CGI->generaltexth->allTexts[52];
|
||||||
ret += "\n" + town->genBuildingRequirements(building->bid, false).toString(toStr);
|
ret += "\n" + town->genBuildingRequirements(building->bid).toString(toStr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EBuildingState::MISSING_BASE:
|
case EBuildingState::MISSING_BASE:
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
"type" : "object",
|
"type" : "object",
|
||||||
"additionalProperties" : false,
|
"additionalProperties" : false,
|
||||||
"default": {},
|
"default": {},
|
||||||
"required" : [ "screenRes", "bitsPerPixel", "fullscreen", "spellbookAnimation","driver", "showIntro" ],
|
"required" : [ "screenRes", "bitsPerPixel", "fullscreen", "spellbookAnimation","driver", "showIntro", "displayIndex" ],
|
||||||
"properties" : {
|
"properties" : {
|
||||||
"screenRes" : {
|
"screenRes" : {
|
||||||
"type" : "object",
|
"type" : "object",
|
||||||
@ -77,6 +77,10 @@
|
|||||||
"type" : "string",
|
"type" : "string",
|
||||||
"default" : "opengl",
|
"default" : "opengl",
|
||||||
"description" : "preferred graphics backend driver name for SDL2"
|
"description" : "preferred graphics backend driver name for SDL2"
|
||||||
|
},
|
||||||
|
"displayIndex" : {
|
||||||
|
"type" : "number",
|
||||||
|
"default" : 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 2.8.7)
|
|||||||
|
|
||||||
include_directories(${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/include ${CMAKE_CURRENT_SOURCE_DIR})
|
include_directories(${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/include ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
include_directories(${ZLIB_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS})
|
include_directories(${ZLIB_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS})
|
||||||
|
include_directories(${SDL_INCLUDE_DIR})
|
||||||
|
|
||||||
set(launcher_modmanager_SRCS
|
set(launcher_modmanager_SRCS
|
||||||
modManager/cdownloadmanager_moc.cpp
|
modManager/cdownloadmanager_moc.cpp
|
||||||
@ -25,6 +26,7 @@ set(launcher_SRCS
|
|||||||
mainwindow_moc.cpp
|
mainwindow_moc.cpp
|
||||||
launcherdirs.cpp
|
launcherdirs.cpp
|
||||||
jsonutils.cpp
|
jsonutils.cpp
|
||||||
|
sdldisplayquery.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(launcher_FORMS
|
set(launcher_FORMS
|
||||||
@ -60,10 +62,10 @@ endif()
|
|||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
# Fix _WinMain@16 linking error
|
# Fix _WinMain@16 linking error
|
||||||
target_link_libraries(vcmilauncher vcmi ${Qt5Core_QTMAIN_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES})
|
target_link_libraries(vcmilauncher vcmi ${Qt5Core_QTMAIN_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES} ${SDL_LIBRARY})
|
||||||
else()
|
else()
|
||||||
# The Qt5Widgets_LIBRARIES variable also includes QtGui and QtCore
|
# The Qt5Widgets_LIBRARIES variable also includes QtGui and QtCore
|
||||||
target_link_libraries(vcmilauncher vcmi ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES})
|
target_link_libraries(vcmilauncher vcmi ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES} ${SDL_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# temporary(?) disabled - generation of PCH takes too much time since cotire is trying to collect all Qt headers
|
# temporary(?) disabled - generation of PCH takes too much time since cotire is trying to collect all Qt headers
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "mainwindow_moc.h"
|
#include "mainwindow_moc.h"
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
#include "sdldisplayquery.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
auto displayList = getDisplays();
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
MainWindow w;
|
MainWindow w(displayList);
|
||||||
w.show();
|
w.show();
|
||||||
|
|
||||||
return a.exec();
|
return a.exec();
|
||||||
|
@ -26,7 +26,7 @@ void MainWindow::load()
|
|||||||
settings.init();
|
settings.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent) :
|
MainWindow::MainWindow(const QStringList& displayList, QWidget *parent) :
|
||||||
QMainWindow(parent),
|
QMainWindow(parent),
|
||||||
ui(new Ui::MainWindow)
|
ui(new Ui::MainWindow)
|
||||||
{
|
{
|
||||||
@ -34,6 +34,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->tabListWidget->setCurrentIndex(0);
|
ui->tabListWidget->setCurrentIndex(0);
|
||||||
|
ui->settingsView->setDisplayList(displayList);
|
||||||
|
|
||||||
connect(ui->tabSelectList, SIGNAL(currentRowChanged(int)),
|
connect(ui->tabSelectList, SIGNAL(currentRowChanged(int)),
|
||||||
ui->tabListWidget, SLOT(setCurrentIndex(int)));
|
ui->tabListWidget, SLOT(setCurrentIndex(int)));
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class MainWindow;
|
class MainWindow;
|
||||||
@ -14,7 +15,7 @@ class MainWindow : public QMainWindow
|
|||||||
void load();
|
void load();
|
||||||
void startExecutable(QString name);
|
void startExecutable(QString name);
|
||||||
public:
|
public:
|
||||||
explicit MainWindow(QWidget *parent = 0);
|
explicit MainWindow(const QStringList& displayList, QWidget *parent = 0);
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
@ -176,7 +176,7 @@
|
|||||||
<number>1</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="CModListView" name="stackedWidgetPage2"/>
|
<widget class="CModListView" name="stackedWidgetPage2"/>
|
||||||
<widget class="CSettingsView" name="stackedWidgetPage3"/>
|
<widget class="CSettingsView" name="settingsView"/>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
@ -74,6 +74,10 @@ CModListView::CModListView(QWidget *parent) :
|
|||||||
{
|
{
|
||||||
loadRepositories();
|
loadRepositories();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
manager->resetRepositories();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModListView::loadRepositories()
|
void CModListView::loadRepositories()
|
||||||
|
32
launcher/sdldisplayquery.cpp
Normal file
32
launcher/sdldisplayquery.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "sdldisplayquery.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <SDL_video.h>
|
||||||
|
|
||||||
|
QStringList getDisplays()
|
||||||
|
{
|
||||||
|
if(SDL_Init(SDL_INIT_VIDEO))
|
||||||
|
return QStringList("default display");
|
||||||
|
|
||||||
|
const int displays = SDL_GetNumVideoDisplays();
|
||||||
|
QStringList list;
|
||||||
|
|
||||||
|
for (int display = 0; display < displays; ++display)
|
||||||
|
{
|
||||||
|
SDL_Rect rect;
|
||||||
|
|
||||||
|
if (SDL_GetDisplayBounds (display, &rect))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QString string;
|
||||||
|
QTextStream(&string) << display << " - " << rect.w << "x" << rect.h << " (at " << rect.x << ", " << rect.y << ")";
|
||||||
|
|
||||||
|
list << string;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Quit();
|
||||||
|
return list;
|
||||||
|
}
|
5
launcher/sdldisplayquery.h
Normal file
5
launcher/sdldisplayquery.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
QStringList getDisplays();
|
@ -20,11 +20,25 @@ static const std::string knownEncodingsList[] = //TODO: remove hardcode
|
|||||||
"GB2312" // basic set for Simplified Chinese. Separate from GBK to allow proper detection of H3 fonts
|
"GB2312" // basic set for Simplified Chinese. Separate from GBK to allow proper detection of H3 fonts
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void CSettingsView::setDisplayList(const QStringList& displayList)
|
||||||
|
{
|
||||||
|
if (displayList.count() < 2)
|
||||||
|
{
|
||||||
|
ui->comboBoxDisplayIndex->hide ();
|
||||||
|
ui->labelDisplayIndex->hide ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->comboBoxDisplayIndex->clear();
|
||||||
|
ui->comboBoxDisplayIndex->addItems(displayList);
|
||||||
|
ui->comboBoxDisplayIndex->setCurrentIndex(settings["video"]["displayIndex"].Float());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CSettingsView::loadSettings()
|
void CSettingsView::loadSettings()
|
||||||
{
|
{
|
||||||
int resX = settings["video"]["screenRes"]["width"].Float();
|
int resX = settings["video"]["screenRes"]["width"].Float();
|
||||||
int resY = settings["video"]["screenRes"]["height"].Float();
|
int resY = settings["video"]["screenRes"]["height"].Float();
|
||||||
|
|
||||||
int resIndex = ui->comboBoxResolution->findText(QString("%1x%2").arg(resX).arg(resY));
|
int resIndex = ui->comboBoxResolution->findText(QString("%1x%2").arg(resX).arg(resY));
|
||||||
|
|
||||||
ui->comboBoxResolution->setCurrentIndex(resIndex);
|
ui->comboBoxResolution->setCurrentIndex(resIndex);
|
||||||
@ -92,6 +106,12 @@ void CSettingsView::on_comboBoxAutoCheck_currentIndexChanged(int index)
|
|||||||
node->Bool() = index;
|
node->Bool() = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSettingsView::on_comboBoxDisplayIndex_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
Settings node = settings.write["video"];
|
||||||
|
node["displayIndex"].Float() = index;
|
||||||
|
}
|
||||||
|
|
||||||
void CSettingsView::on_comboBoxPlayerAI_currentIndexChanged(const QString &arg1)
|
void CSettingsView::on_comboBoxPlayerAI_currentIndexChanged(const QString &arg1)
|
||||||
{
|
{
|
||||||
Settings node = settings.write["server"]["playerAI"];
|
Settings node = settings.write["server"]["playerAI"];
|
||||||
|
@ -15,6 +15,7 @@ public:
|
|||||||
~CSettingsView();
|
~CSettingsView();
|
||||||
|
|
||||||
void loadSettings();
|
void loadSettings();
|
||||||
|
void setDisplayList(const QStringList& displayList);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_comboBoxResolution_currentIndexChanged(const QString &arg1);
|
void on_comboBoxResolution_currentIndexChanged(const QString &arg1);
|
||||||
@ -43,6 +44,8 @@ private slots:
|
|||||||
|
|
||||||
void on_comboBoxAutoCheck_currentIndexChanged(int index);
|
void on_comboBoxAutoCheck_currentIndexChanged(int index);
|
||||||
|
|
||||||
|
void on_comboBoxDisplayIndex_currentIndexChanged(int index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::CSettingsView *ui;
|
Ui::CSettingsView *ui;
|
||||||
};
|
};
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>700</width>
|
<width>714</width>
|
||||||
<height>420</height>
|
<height>429</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -26,7 +26,7 @@
|
|||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="9" column="1" colspan="4">
|
<item row="10" column="1" colspan="4">
|
||||||
<widget class="QLabel" name="LauncherSettings">
|
<widget class="QLabel" name="LauncherSettings">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
@ -39,7 +39,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="6" colspan="4">
|
<item row="6" column="6" colspan="4">
|
||||||
<widget class="QLabel" name="labelGeneral">
|
<widget class="QLabel" name="labelGeneral">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
@ -59,7 +59,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="7" colspan="3">
|
<item row="7" column="7" colspan="3">
|
||||||
<widget class="QSpinBox" name="spinBoxNetworkPort">
|
<widget class="QSpinBox" name="spinBoxNetworkPort">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1024</number>
|
<number>1024</number>
|
||||||
@ -99,7 +99,7 @@
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1" colspan="4">
|
<item row="6" column="1" colspan="4">
|
||||||
<widget class="QLabel" name="labelAISettings">
|
<widget class="QLabel" name="labelAISettings">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
@ -192,7 +192,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="1" colspan="9">
|
<item row="14" column="1" colspan="9">
|
||||||
<widget class="QPlainTextEdit" name="plainTextEditRepos">
|
<widget class="QPlainTextEdit" name="plainTextEditRepos">
|
||||||
<property name="lineWrapMode">
|
<property name="lineWrapMode">
|
||||||
<enum>QPlainTextEdit::NoWrap</enum>
|
<enum>QPlainTextEdit::NoWrap</enum>
|
||||||
@ -222,7 +222,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="4">
|
<item row="8" column="4">
|
||||||
<widget class="QComboBox" name="comboBoxNeutralAI">
|
<widget class="QComboBox" name="comboBoxNeutralAI">
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -250,21 +250,21 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLabel" name="labelNeutralAI">
|
<widget class="QLabel" name="labelNeutralAI">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Neutral AI</string>
|
<string>Neutral AI</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="6">
|
<item row="8" column="6">
|
||||||
<widget class="QLabel" name="labelEncoding">
|
<widget class="QLabel" name="labelEncoding">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Heroes III character set</string>
|
<string>Heroes III character set</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="4">
|
<item row="7" column="4">
|
||||||
<widget class="QComboBox" name="comboBoxPlayerAI">
|
<widget class="QComboBox" name="comboBoxPlayerAI">
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -273,14 +273,14 @@
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="7" column="1">
|
||||||
<widget class="QLabel" name="labelPlayerAI">
|
<widget class="QLabel" name="labelPlayerAI">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Player AI</string>
|
<string>Player AI</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="7" colspan="3">
|
<item row="8" column="7" colspan="3">
|
||||||
<widget class="QComboBox" name="comboBoxEncoding">
|
<widget class="QComboBox" name="comboBoxEncoding">
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -309,7 +309,7 @@
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="6">
|
<item row="7" column="6">
|
||||||
<widget class="QLabel" name="labelNetworkPort">
|
<widget class="QLabel" name="labelNetworkPort">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Network port</string>
|
<string>Network port</string>
|
||||||
@ -329,7 +329,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="1" colspan="4">
|
<item row="12" column="1" colspan="4">
|
||||||
<widget class="QLabel" name="labelRepositories">
|
<widget class="QLabel" name="labelRepositories">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
@ -411,7 +411,7 @@
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1" colspan="4">
|
<item row="5" column="1" colspan="4">
|
||||||
<spacer name="spacerSections">
|
<spacer name="spacerSections">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -427,7 +427,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1" colspan="4">
|
<item row="9" column="1" colspan="4">
|
||||||
<spacer name="spacerRepos">
|
<spacer name="spacerRepos">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -472,7 +472,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="6">
|
<item row="11" column="6">
|
||||||
<widget class="QComboBox" name="comboBoxAutoCheck">
|
<widget class="QComboBox" name="comboBoxAutoCheck">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@ -489,13 +489,29 @@
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1" colspan="4">
|
<item row="11" column="1" colspan="4">
|
||||||
<widget class="QLabel" name="labelAutoCheck">
|
<widget class="QLabel" name="labelAutoCheck">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Check repositories on startup</string>
|
<string>Check repositories on startup</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QLabel" name="labelDisplayIndex">
|
||||||
|
<property name="text">
|
||||||
|
<string>Display index</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="4">
|
||||||
|
<widget class="QComboBox" name="comboBoxDisplayIndex">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>0</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
@ -1080,13 +1080,14 @@ void CGameState::initPlayerStates()
|
|||||||
logGlobal->debug("\tCreating player entries in gs");
|
logGlobal->debug("\tCreating player entries in gs");
|
||||||
for(auto & elem : scenarioOps->playerInfos)
|
for(auto & elem : scenarioOps->playerInfos)
|
||||||
{
|
{
|
||||||
std::pair<PlayerColor, PlayerState> ins(elem.first,PlayerState());
|
PlayerState & p = players[elem.first];
|
||||||
ins.second.color=ins.first;
|
//std::pair<PlayerColor, PlayerState> ins(elem.first,PlayerState());
|
||||||
ins.second.human = elem.second.playerID;
|
p.color=elem.first;
|
||||||
ins.second.team = map->players[ins.first.getNum()].team;
|
p.human = elem.second.playerID;
|
||||||
teams[ins.second.team].id = ins.second.team;//init team
|
p.team = map->players[elem.first.getNum()].team;
|
||||||
teams[ins.second.team].players.insert(ins.first);//add player to team
|
teams[p.team].id = p.team;//init team
|
||||||
players.insert(ins);
|
teams[p.team].players.insert(elem.first);//add player to team
|
||||||
|
//players.insert(ins);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2936,6 +2937,25 @@ PlayerState::PlayerState()
|
|||||||
setNodeType(PLAYER);
|
setNodeType(PLAYER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PlayerState::PlayerState(PlayerState && other):
|
||||||
|
CBonusSystemNode(std::move(other)),
|
||||||
|
color(other.color),
|
||||||
|
human(other.human),
|
||||||
|
team(other.team),
|
||||||
|
resources(other.resources),
|
||||||
|
enteredWinningCheatCode(other.enteredWinningCheatCode),
|
||||||
|
enteredLosingCheatCode(other.enteredLosingCheatCode),
|
||||||
|
status(other.status),
|
||||||
|
daysWithoutCastle(other.daysWithoutCastle)
|
||||||
|
{
|
||||||
|
std::swap(visitedObjects, other.visitedObjects);
|
||||||
|
std::swap(heroes, other.heroes);
|
||||||
|
std::swap(towns, other.towns);
|
||||||
|
std::swap(availableHeroes, other.availableHeroes);
|
||||||
|
std::swap(dwellings, other.dwellings);
|
||||||
|
std::swap(quests, other.quests);
|
||||||
|
}
|
||||||
|
|
||||||
std::string PlayerState::nodeName() const
|
std::string PlayerState::nodeName() const
|
||||||
{
|
{
|
||||||
return "Player " + (color.getNum() < VLC->generaltexth->capColors.size() ? VLC->generaltexth->capColors[color.getNum()] : boost::lexical_cast<std::string>(color));
|
return "Player " + (color.getNum() < VLC->generaltexth->capColors.size() ? VLC->generaltexth->capColors[color.getNum()] : boost::lexical_cast<std::string>(color));
|
||||||
@ -3235,6 +3255,15 @@ TeamState::TeamState()
|
|||||||
setNodeType(TEAM);
|
setNodeType(TEAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TeamState::TeamState(TeamState && other):
|
||||||
|
CBonusSystemNode(std::move(other)),
|
||||||
|
id(other.id)
|
||||||
|
{
|
||||||
|
std::swap(players, other.players);
|
||||||
|
std::swap(fogOfWarMap, other.fogOfWarMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CRandomGenerator & CGameState::getRandomGenerator()
|
CRandomGenerator & CGameState::getRandomGenerator()
|
||||||
{
|
{
|
||||||
//logGlobal->traceStream() << "Fetching CGameState::rand with seed " << rand.nextInt();
|
//logGlobal->traceStream() << "Fetching CGameState::rand with seed " << rand.nextInt();
|
||||||
|
@ -35,6 +35,8 @@ public:
|
|||||||
boost::optional<ui8> daysWithoutCastle;
|
boost::optional<ui8> daysWithoutCastle;
|
||||||
|
|
||||||
PlayerState();
|
PlayerState();
|
||||||
|
PlayerState(PlayerState && other);
|
||||||
|
|
||||||
std::string nodeName() const override;
|
std::string nodeName() const override;
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
@ -56,6 +58,7 @@ public:
|
|||||||
std::vector<std::vector<std::vector<ui8> > > fogOfWarMap; //true - visible, false - hidden
|
std::vector<std::vector<std::vector<ui8> > > fogOfWarMap; //true - visible, false - hidden
|
||||||
|
|
||||||
TeamState();
|
TeamState();
|
||||||
|
TeamState(TeamState && other);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
|
@ -96,6 +96,13 @@ BonusList::BonusList(const BonusList &bonusList)
|
|||||||
belongsToTree = false;
|
belongsToTree = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BonusList::BonusList(BonusList&& other):
|
||||||
|
belongsToTree(false)
|
||||||
|
{
|
||||||
|
std::swap(belongsToTree, other.belongsToTree);
|
||||||
|
std::swap(bonuses, other.bonuses);
|
||||||
|
}
|
||||||
|
|
||||||
BonusList& BonusList::operator=(const BonusList &bonusList)
|
BonusList& BonusList::operator=(const BonusList &bonusList)
|
||||||
{
|
{
|
||||||
bonuses.resize(bonusList.size());
|
bonuses.resize(bonusList.size());
|
||||||
@ -104,6 +111,12 @@ BonusList& BonusList::operator=(const BonusList &bonusList)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BonusList::changed()
|
||||||
|
{
|
||||||
|
if(belongsToTree)
|
||||||
|
CBonusSystemNode::treeHasChanged();
|
||||||
|
}
|
||||||
|
|
||||||
int BonusList::totalValue() const
|
int BonusList::totalValue() const
|
||||||
{
|
{
|
||||||
int base = 0;
|
int base = 0;
|
||||||
@ -257,24 +270,19 @@ void BonusList::eliminateDuplicates()
|
|||||||
void BonusList::push_back(Bonus* const &x)
|
void BonusList::push_back(Bonus* const &x)
|
||||||
{
|
{
|
||||||
bonuses.push_back(x);
|
bonuses.push_back(x);
|
||||||
|
changed();
|
||||||
if (belongsToTree)
|
|
||||||
CBonusSystemNode::treeHasChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Bonus*>::iterator BonusList::erase(const int position)
|
std::vector<Bonus*>::iterator BonusList::erase(const int position)
|
||||||
{
|
{
|
||||||
if (belongsToTree)
|
changed();
|
||||||
CBonusSystemNode::treeHasChanged();
|
|
||||||
return bonuses.erase(bonuses.begin() + position);
|
return bonuses.erase(bonuses.begin() + position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BonusList::clear()
|
void BonusList::clear()
|
||||||
{
|
{
|
||||||
bonuses.clear();
|
bonuses.clear();
|
||||||
|
changed();
|
||||||
if (belongsToTree)
|
|
||||||
CBonusSystemNode::treeHasChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<BonusList*>::size_type BonusList::operator-=(Bonus* const &i)
|
std::vector<BonusList*>::size_type BonusList::operator-=(Bonus* const &i)
|
||||||
@ -283,26 +291,20 @@ std::vector<BonusList*>::size_type BonusList::operator-=(Bonus* const &i)
|
|||||||
if(itr == bonuses.end())
|
if(itr == bonuses.end())
|
||||||
return false;
|
return false;
|
||||||
bonuses.erase(itr);
|
bonuses.erase(itr);
|
||||||
|
changed();
|
||||||
if (belongsToTree)
|
|
||||||
CBonusSystemNode::treeHasChanged();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BonusList::resize(std::vector<Bonus*>::size_type sz, Bonus* c )
|
void BonusList::resize(std::vector<Bonus*>::size_type sz, Bonus* c )
|
||||||
{
|
{
|
||||||
bonuses.resize(sz, c);
|
bonuses.resize(sz, c);
|
||||||
|
changed();
|
||||||
if (belongsToTree)
|
|
||||||
CBonusSystemNode::treeHasChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BonusList::insert(std::vector<Bonus*>::iterator position, std::vector<Bonus*>::size_type n, Bonus* const &x)
|
void BonusList::insert(std::vector<Bonus*>::iterator position, std::vector<Bonus*>::size_type n, Bonus* const &x)
|
||||||
{
|
{
|
||||||
bonuses.insert(position, n, x);
|
bonuses.insert(position, n, x);
|
||||||
|
changed();
|
||||||
if (belongsToTree)
|
|
||||||
CBonusSystemNode::treeHasChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int IBonusBearer::valOfBonuses(Bonus::BonusType type, const CSelector &selector) const
|
int IBonusBearer::valOfBonuses(Bonus::BonusType type, const CSelector &selector) const
|
||||||
@ -708,6 +710,36 @@ CBonusSystemNode::CBonusSystemNode() : bonuses(true), exportedBonuses(true), nod
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CBonusSystemNode::CBonusSystemNode(CBonusSystemNode && other):
|
||||||
|
bonuses(std::move(other.bonuses)),
|
||||||
|
exportedBonuses(std::move(other.exportedBonuses)),
|
||||||
|
nodeType(other.nodeType),
|
||||||
|
description(other.description),
|
||||||
|
cachedLast(0)
|
||||||
|
{
|
||||||
|
std::swap(parents, other.parents);
|
||||||
|
std::swap(children, other.children);
|
||||||
|
|
||||||
|
//fixing bonus tree without recalculation
|
||||||
|
|
||||||
|
for(CBonusSystemNode * n : parents)
|
||||||
|
{
|
||||||
|
n->children -= &other;
|
||||||
|
n->children.push_back(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(CBonusSystemNode * n : children)
|
||||||
|
{
|
||||||
|
n->parents -= &other;
|
||||||
|
n->parents.push_back(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//cache ignored
|
||||||
|
|
||||||
|
//cachedBonuses
|
||||||
|
//cachedRequests
|
||||||
|
}
|
||||||
|
|
||||||
CBonusSystemNode::~CBonusSystemNode()
|
CBonusSystemNode::~CBonusSystemNode()
|
||||||
{
|
{
|
||||||
detachFromAll();
|
detachFromAll();
|
||||||
|
@ -412,7 +412,7 @@ private:
|
|||||||
|
|
||||||
TInternalContainer bonuses;
|
TInternalContainer bonuses;
|
||||||
bool belongsToTree;
|
bool belongsToTree;
|
||||||
|
void changed();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef TInternalContainer::const_reference const_reference;
|
typedef TInternalContainer::const_reference const_reference;
|
||||||
@ -423,6 +423,7 @@ public:
|
|||||||
|
|
||||||
BonusList(bool BelongsToTree = false);
|
BonusList(bool BelongsToTree = false);
|
||||||
BonusList(const BonusList &bonusList);
|
BonusList(const BonusList &bonusList);
|
||||||
|
BonusList(BonusList && other);
|
||||||
BonusList& operator=(const BonusList &bonusList);
|
BonusList& operator=(const BonusList &bonusList);
|
||||||
|
|
||||||
// wrapper functions of the STL vector container
|
// wrapper functions of the STL vector container
|
||||||
@ -494,12 +495,8 @@ public:
|
|||||||
{
|
{
|
||||||
return bonuses.end();
|
return bonuses.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
//friend inline std::vector<Bonus*>::iterator range_begin(BonusList & x);
|
|
||||||
//friend inline std::vector<Bonus*>::iterator range_end(BonusList & x);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Extensions for BOOST_FOREACH to enable iterating of BonusList objects
|
// Extensions for BOOST_FOREACH to enable iterating of BonusList objects
|
||||||
// Don't touch/call this functions
|
// Don't touch/call this functions
|
||||||
inline BonusList::iterator range_begin(BonusList & x)
|
inline BonusList::iterator range_begin(BonusList & x)
|
||||||
@ -614,7 +611,7 @@ public:
|
|||||||
const TBonusListPtr getSpellBonuses() const;
|
const TBonusListPtr getSpellBonuses() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CBonusSystemNode : public IBonusBearer
|
class DLL_LINKAGE CBonusSystemNode : public IBonusBearer, public boost::noncopyable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum ENodeTypes
|
enum ENodeTypes
|
||||||
@ -647,8 +644,8 @@ private:
|
|||||||
const TBonusListPtr getAllBonusesWithoutCaching(const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root = nullptr) const;
|
const TBonusListPtr getAllBonusesWithoutCaching(const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root = nullptr) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit CBonusSystemNode();
|
explicit CBonusSystemNode();
|
||||||
|
CBonusSystemNode(CBonusSystemNode && other);
|
||||||
virtual ~CBonusSystemNode();
|
virtual ~CBonusSystemNode();
|
||||||
|
|
||||||
void limitBonuses(const BonusList &allBonuses, BonusList &out) const; //out will bo populed with bonuses that are not limited here
|
void limitBonuses(const BonusList &allBonuses, BonusList &out) const; //out will bo populed with bonuses that are not limited here
|
||||||
@ -1010,23 +1007,5 @@ template <class InputIterator>
|
|||||||
void BonusList::insert(const int position, InputIterator first, InputIterator last)
|
void BonusList::insert(const int position, InputIterator first, InputIterator last)
|
||||||
{
|
{
|
||||||
bonuses.insert(bonuses.begin() + position, first, last);
|
bonuses.insert(bonuses.begin() + position, first, last);
|
||||||
|
changed();
|
||||||
if (belongsToTree)
|
|
||||||
CBonusSystemNode::treeHasChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extensions for BOOST_FOREACH to enable iterating of BonusList objects
|
|
||||||
/*namespace boost
|
|
||||||
{
|
|
||||||
template<>
|
|
||||||
struct range_mutable_iterator<BonusList>
|
|
||||||
{
|
|
||||||
typedef std::vector<Bonus*>::iterator type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct range_const_iterator<BonusList>
|
|
||||||
{
|
|
||||||
typedef std::vector<Bonus*>::const_iterator type;
|
|
||||||
};
|
|
||||||
}*/
|
|
||||||
|
@ -1126,7 +1126,7 @@ bool CGTownInstance::hasBuilt(BuildingID buildingID) const
|
|||||||
return vstd::contains(builtBuildings, buildingID);
|
return vstd::contains(builtBuildings, buildingID);
|
||||||
}
|
}
|
||||||
|
|
||||||
CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID, bool includeUpgrade) const
|
CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID) const
|
||||||
{
|
{
|
||||||
const CBuilding * building = town->buildings.at(buildID);
|
const CBuilding * building = town->buildings.at(buildID);
|
||||||
|
|
||||||
@ -1138,10 +1138,14 @@ CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID,
|
|||||||
if (!hasBuilt(id))
|
if (!hasBuilt(id))
|
||||||
return id;
|
return id;
|
||||||
|
|
||||||
if (build->upgrade != BuildingID::NONE && !hasBuilt(build->upgrade))
|
CBuilding::TRequired::OperatorAll requirements;
|
||||||
return build->upgrade;
|
|
||||||
|
|
||||||
return build->requirements.morph(dependTest);
|
if (build->upgrade != BuildingID::NONE)
|
||||||
|
requirements.expressions.push_back(dependTest(build->upgrade));
|
||||||
|
|
||||||
|
requirements.expressions.push_back(build->requirements.morph(dependTest));
|
||||||
|
|
||||||
|
return requirements;
|
||||||
};
|
};
|
||||||
|
|
||||||
CBuilding::TRequired::OperatorAll requirements;
|
CBuilding::TRequired::OperatorAll requirements;
|
||||||
@ -1149,9 +1153,7 @@ CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID,
|
|||||||
{
|
{
|
||||||
const CBuilding * upgr = town->buildings.at(building->upgrade);
|
const CBuilding * upgr = town->buildings.at(building->upgrade);
|
||||||
|
|
||||||
if (includeUpgrade)
|
requirements.expressions.push_back(dependTest(upgr->bid));
|
||||||
requirements.expressions.push_back(upgr->bid);
|
|
||||||
requirements.expressions.push_back(upgr->requirements.morph(dependTest));
|
|
||||||
}
|
}
|
||||||
requirements.expressions.push_back(building->requirements.morph(dependTest));
|
requirements.expressions.push_back(building->requirements.morph(dependTest));
|
||||||
|
|
||||||
|
@ -238,7 +238,7 @@ public:
|
|||||||
bool armedGarrison() const; //true if town has creatures in garrison or garrisoned hero
|
bool armedGarrison() const; //true if town has creatures in garrison or garrisoned hero
|
||||||
int getTownLevel() const;
|
int getTownLevel() const;
|
||||||
|
|
||||||
CBuilding::TRequired genBuildingRequirements(BuildingID build, bool includeUpgrade=true) const;
|
CBuilding::TRequired genBuildingRequirements(BuildingID build) const;
|
||||||
|
|
||||||
void mergeGarrisonOnSiege() const; // merge garrison into army of visiting hero
|
void mergeGarrisonOnSiege() const; // merge garrison into army of visiting hero
|
||||||
void removeCapitols (PlayerColor owner) const;
|
void removeCapitols (PlayerColor owner) const;
|
||||||
|
@ -857,6 +857,7 @@ void CGOnceVisitable::initObj()
|
|||||||
info[0].reward.bonuses.push_back(bonus);
|
info[0].reward.bonuses.push_back(bonus);
|
||||||
info[1].reward.bonuses.push_back(bonus);
|
info[1].reward.bonuses.push_back(bonus);
|
||||||
info[0].message.addTxt(MetaString::ADVOB_TXT, 162);
|
info[0].message.addTxt(MetaString::ADVOB_TXT, 162);
|
||||||
|
info[0].message.addReplacement(VLC->arth->artifacts[info[0].reward.artifacts.back()]->Name());
|
||||||
info[1].message.addTxt(MetaString::ADVOB_TXT, 163);
|
info[1].message.addTxt(MetaString::ADVOB_TXT, 163);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1659,7 +1659,7 @@ std::string CGShrine::getHoverText(PlayerColor player) const
|
|||||||
std::string CGShrine::getHoverText(const CGHeroInstance * hero) const
|
std::string CGShrine::getHoverText(const CGHeroInstance * hero) const
|
||||||
{
|
{
|
||||||
std::string hoverName = getHoverText(hero->tempOwner);
|
std::string hoverName = getHoverText(hero->tempOwner);
|
||||||
if(vstd::contains(hero->spells, spell)) //hero knows that spell
|
if(wasVisited(hero->tempOwner) && vstd::contains(hero->spells, spell)) //know what spell there is and hero knows that spell
|
||||||
hoverName += "\n\n" + VLC->generaltexth->allTexts[354]; // (Already learned)
|
hoverName += "\n\n" + VLC->generaltexth->allTexts[354]; // (Already learned)
|
||||||
return hoverName;
|
return hoverName;
|
||||||
}
|
}
|
||||||
|
@ -35,11 +35,13 @@ CMapInfo::CMapInfo() : scenarioOpts(nullptr), playerAmnt(0), humanPlayers(0),
|
|||||||
|
|
||||||
#define STEAL(x) x = std::move(tmp.x)
|
#define STEAL(x) x = std::move(tmp.x)
|
||||||
|
|
||||||
CMapInfo::CMapInfo(CMapInfo && tmp)
|
CMapInfo::CMapInfo(CMapInfo && tmp):
|
||||||
|
scenarioOpts(nullptr), playerAmnt(0), humanPlayers(0),
|
||||||
|
actualHumanPlayers(0), isRandomMap(false)
|
||||||
{
|
{
|
||||||
|
std::swap(scenarioOpts, tmp.scenarioOpts);
|
||||||
STEAL(mapHeader);
|
STEAL(mapHeader);
|
||||||
STEAL(campaignHeader);
|
STEAL(campaignHeader);
|
||||||
STEAL(scenarioOpts);
|
|
||||||
STEAL(fileURI);
|
STEAL(fileURI);
|
||||||
STEAL(date);
|
STEAL(date);
|
||||||
STEAL(playerAmnt);
|
STEAL(playerAmnt);
|
||||||
@ -48,6 +50,10 @@ CMapInfo::CMapInfo(CMapInfo && tmp)
|
|||||||
STEAL(isRandomMap);
|
STEAL(isRandomMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CMapInfo::~CMapInfo()
|
||||||
|
{
|
||||||
|
vstd::clear_pointer(scenarioOpts);
|
||||||
|
}
|
||||||
|
|
||||||
void CMapInfo::mapInit(const std::string & fname)
|
void CMapInfo::mapInit(const std::string & fname)
|
||||||
{
|
{
|
||||||
|
@ -32,6 +32,7 @@ public:
|
|||||||
|
|
||||||
CMapInfo();
|
CMapInfo();
|
||||||
CMapInfo(CMapInfo && tmp);
|
CMapInfo(CMapInfo && tmp);
|
||||||
|
virtual ~CMapInfo();
|
||||||
|
|
||||||
CMapInfo &operator=(CMapInfo &&other);
|
CMapInfo &operator=(CMapInfo &&other);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user