1
0
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:
AlexVinS 2016-09-04 11:27:15 +03:00
commit 948a339463
28 changed files with 259 additions and 106 deletions

View File

@ -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;

View File

@ -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;
} }

View File

@ -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);

View File

@ -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();

View File

@ -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();

View File

@ -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:

View File

@ -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
} }
} }
}, },

View File

@ -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

View File

@ -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();

View File

@ -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)));

View File

@ -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:

View File

@ -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>

View File

@ -74,6 +74,10 @@ CModListView::CModListView(QWidget *parent) :
{ {
loadRepositories(); loadRepositories();
} }
else
{
manager->resetRepositories();
}
} }
void CModListView::loadRepositories() void CModListView::loadRepositories()

View 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;
}

View File

@ -0,0 +1,5 @@
#pragma once
#include <QStringList>
QStringList getDisplays();

View File

@ -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"];

View File

@ -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;
}; };

View File

@ -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/>

View File

@ -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();

View File

@ -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)
{ {

View File

@ -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();

View File

@ -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;
};
}*/

View File

@ -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));

View File

@ -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;

View File

@ -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;

View File

@ -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;
} }

View File

@ -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)
{ {

View File

@ -32,6 +32,7 @@ public:
CMapInfo(); CMapInfo();
CMapInfo(CMapInfo && tmp); CMapInfo(CMapInfo && tmp);
virtual ~CMapInfo();
CMapInfo &operator=(CMapInfo &&other); CMapInfo &operator=(CMapInfo &&other);