1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-25 12:14:46 +02:00

Merge pull request #2305 from dydzio0614/unlimited-autosave

Ability to change autosave limit + set autosave prefix
This commit is contained in:
Ivan Savenko 2023-07-19 14:45:51 +03:00 committed by GitHub
commit 07a8c75bec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 514 additions and 421 deletions

View File

@ -137,7 +137,6 @@ int main(int argc, char * argv[])
("nointro,i", "skips intro movies") ("nointro,i", "skips intro movies")
("donotstartserver,d","do not attempt to start server and just connect to it instead server") ("donotstartserver,d","do not attempt to start server and just connect to it instead server")
("serverport", po::value<si64>(), "override port specified in config file") ("serverport", po::value<si64>(), "override port specified in config file")
("saveprefix", po::value<std::string>(), "prefix for auto save files")
("savefrequency", po::value<si64>(), "limit auto save creation to each N days") ("savefrequency", po::value<si64>(), "limit auto save creation to each N days")
("lobby", "parameters address, port, uuid to connect ro remote lobby session") ("lobby", "parameters address, port, uuid to connect ro remote lobby session")
("lobby-address", po::value<std::string>(), "address to remote lobby") ("lobby-address", po::value<std::string>(), "address to remote lobby")
@ -222,13 +221,6 @@ int main(int argc, char * argv[])
else if(s->isNull()) else if(s->isNull())
s->Integer() = defaultValue; s->Integer() = defaultValue;
}; };
auto setSettingString = [](std::string key, std::string arg, std::string defaultValue) {
Settings s = settings.write(vstd::split(key, "/"));
if(::vm.count(arg))
s->String() = ::vm[arg].as<std::string>();
else if(s->isNull())
s->String() = defaultValue;
};
setSettingBool("session/onlyai", "onlyAI"); setSettingBool("session/onlyai", "onlyAI");
if(vm.count("headless")) if(vm.count("headless"))
@ -256,7 +248,6 @@ int main(int argc, char * argv[])
// Init special testing settings // Init special testing settings
setSettingInteger("session/serverport", "serverport", 0); setSettingInteger("session/serverport", "serverport", 0);
setSettingString("session/saveprefix", "saveprefix", "");
setSettingInteger("general/saveFrequency", "savefrequency", 1); setSettingInteger("general/saveFrequency", "savefrequency", 1);
// Initialize logging based on settings // Initialize logging based on settings

View File

@ -56,6 +56,7 @@
#include "../lib/mapObjects/CGTownInstance.h" #include "../lib/mapObjects/CGTownInstance.h"
#include "../lib/mapObjects/MiscObjects.h" #include "../lib/mapObjects/MiscObjects.h"
#include "../lib/mapObjects/ObjectTemplate.h" #include "../lib/mapObjects/ObjectTemplate.h"
#include "../lib/mapping/CMapHeader.h"
#include "../lib/pathfinder/CGPathNode.h" #include "../lib/pathfinder/CGPathNode.h"
#include "../lib/CStack.h" #include "../lib/CStack.h"
#include "../lib/JsonNode.h" #include "../lib/JsonNode.h"
@ -192,24 +193,37 @@ void CPlayerInterface::playerStartsTurn(PlayerColor player)
void CPlayerInterface::performAutosave() void CPlayerInterface::performAutosave()
{ {
std::string prefix = settings["session"]["saveprefix"].String();
int frequency = static_cast<int>(settings["general"]["saveFrequency"].Integer()); int frequency = static_cast<int>(settings["general"]["saveFrequency"].Integer());
if(firstCall) if(frequency > 0 && cb->getDate() % frequency == 0)
{ {
autosaveCount = getLastIndex(prefix + "Autosave_"); bool usePrefix = settings["general"]["useSavePrefix"].Bool();
std::string prefix = std::string();
if(firstCall > 0) //new game, not loaded if(usePrefix)
{ {
int index = getLastIndex(prefix + "Newgame_"); prefix = settings["general"]["savePrefix"].String();
index %= SAVES_COUNT; if(prefix.empty())
cb->save("Saves/" + prefix + "Newgame_Autosave_" + std::to_string(index + 1));
}
firstCall = 0;
}
else if(frequency > 0 && cb->getDate() % frequency == 0)
{ {
cb->save("Saves/" + prefix + "Autosave_" + std::to_string(autosaveCount++ + 1)); prefix = cb->getMapHeader()->name.substr(0, 5) + "_";
autosaveCount %= 5; }
}
autosaveCount++;
int autosaveCountLimit = settings["general"]["autosaveCountLimit"].Integer();
if(autosaveCountLimit > 0)
{
cb->save("Saves/" + prefix + "Autosave_" + std::to_string(autosaveCount));
autosaveCount %= autosaveCountLimit;
}
else
{
std::string stringifiedDate = std::to_string(cb->getDate(Date::MONTH))
+ std::to_string(cb->getDate(Date::WEEK))
+ std::to_string(cb->getDate(Date::DAY_OF_WEEK));
cb->save("Saves/" + prefix + "Autosave_" + stringifiedDate);
}
} }
} }
@ -221,7 +235,10 @@ void CPlayerInterface::yourTurn()
GH.curInt = this; GH.curInt = this;
NotificationHandler::notify("Your turn"); NotificationHandler::notify("Your turn");
if(settings["general"]["startTurnAutosave"].Bool())
{
performAutosave(); performAutosave();
}
if (CSH->howManyPlayerInterfaces() > 1) //hot seat message if (CSH->howManyPlayerInterfaces() > 1) //hot seat message
{ {
@ -1676,7 +1693,7 @@ void CPlayerInterface::advmapSpellCast(const CGHeroInstance * caster, int spellI
CCS->soundh->playSound(castSoundPath); CCS->soundh->playSound(castSoundPath);
} }
void CPlayerInterface::tryDiggging(const CGHeroInstance * h) void CPlayerInterface::tryDigging(const CGHeroInstance * h)
{ {
int msgToShow = -1; int msgToShow = -1;

View File

@ -64,7 +64,6 @@ class CPlayerInterface : public CGameInterface, public IUpdateable
// -1 - just loaded game; 1 - just started game; 0 otherwise // -1 - just loaded game; 1 - just started game; 0 otherwise
int firstCall; int firstCall;
int autosaveCount; int autosaveCount;
static const int SAVES_COUNT = 5;
std::pair<const CCreatureSet *, const CCreatureSet *> lastBattleArmies; std::pair<const CCreatureSet *, const CCreatureSet *> lastBattleArmies;
bool allowBattleReplay = false; bool allowBattleReplay = false;
@ -203,9 +202,10 @@ public: // public interface for use by client via LOCPLINT access
void stopMovement(); void stopMovement();
void moveHero(const CGHeroInstance *h, const CGPath& path); void moveHero(const CGHeroInstance *h, const CGPath& path);
void tryDiggging(const CGHeroInstance *h); void tryDigging(const CGHeroInstance *h);
void showShipyardDialogOrProblemPopup(const IShipyard *obj); //obj may be town or shipyard; void showShipyardDialogOrProblemPopup(const IShipyard *obj); //obj may be town or shipyard;
void proposeLoadingGame(); void proposeLoadingGame();
void performAutosave();
///returns true if all events are processed internally ///returns true if all events are processed internally
bool capturedAllEvents(); bool capturedAllEvents();
@ -237,8 +237,6 @@ private:
void doMoveHero(const CGHeroInstance *h, CGPath path); void doMoveHero(const CGHeroInstance *h, CGPath path);
void setMovementStatus(bool value); void setMovementStatus(bool value);
/// Performs autosave, if needed according to settings
void performAutosave();
}; };
/// Provides global access to instance of interface of currently active player /// Provides global access to instance of interface of currently active player

View File

@ -419,6 +419,12 @@ void AdventureMapInterface::hotkeyEndingTurn()
LOCPLINT->makingTurn = false; LOCPLINT->makingTurn = false;
LOCPLINT->cb->endTurn(); LOCPLINT->cb->endTurn();
if(!settings["general"]["startTurnAutosave"].Bool())
{
LOCPLINT->performAutosave();
}
mapAudio->onPlayerTurnEnded(); mapAudio->onPlayerTurnEnded();
} }

View File

@ -284,7 +284,7 @@ void AdventureMapShortcuts::digGrail()
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero(); const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
if(h && LOCPLINT->makingTurn) if(h && LOCPLINT->makingTurn)
LOCPLINT->tryDiggging(h); LOCPLINT->tryDigging(h);
} }
void AdventureMapShortcuts::viewPuzzleMap() void AdventureMapShortcuts::viewPuzzleMap()

View File

@ -42,7 +42,7 @@ AdventureOptions::AdventureOptions()
dig = std::make_shared<CButton>(Point(24, 139), "ADVDIG.DEF", CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_DIG_GRAIL); dig = std::make_shared<CButton>(Point(24, 139), "ADVDIG.DEF", CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_DIG_GRAIL);
if(const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero()) if(const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero())
dig->addCallback(std::bind(&CPlayerInterface::tryDiggging, LOCPLINT, h)); dig->addCallback(std::bind(&CPlayerInterface::tryDigging, LOCPLINT, h));
else else
dig->block(true); dig->block(true);
} }

View File

@ -33,8 +33,12 @@
"extraDump", "extraDump",
"userRelativePointer", "userRelativePointer",
"relativePointerSpeedMultiplier", "relativePointerSpeedMultiplier",
"hapticFeedback",
"longTouchTimeMilliseconds", "longTouchTimeMilliseconds",
"hapticFeedback" "autosaveCountLimit",
"useSavePrefix",
"savePrefix",
"startTurnAutosave"
], ],
"properties" : { "properties" : {
"playerName" : { "playerName" : {
@ -106,6 +110,22 @@
"hapticFeedback" : { "hapticFeedback" : {
"type" : "boolean", "type" : "boolean",
"default" : false "default" : false
},
"autosaveCountLimit" : {
"type" : "number",
"default": 5
},
"useSavePrefix" : {
"type": "boolean",
"default": false
},
"savePrefix" : {
"type": "string",
"default": ""
},
"startTurnAutosave" : {
"type": "boolean",
"default": false
} }
} }
}, },

View File

@ -102,6 +102,13 @@ void CSettingsView::loadSettings()
ui->comboBoxAutoSave->setCurrentIndex(settings["general"]["saveFrequency"].Integer() > 0 ? 1 : 0); ui->comboBoxAutoSave->setCurrentIndex(settings["general"]["saveFrequency"].Integer() > 0 ? 1 : 0);
ui->spinBoxAutoSaveLimit->setValue(settings["general"]["autosaveCountLimit"].Integer());
ui->checkBoxAutoSavePrefix->setChecked(settings["general"]["useSavePrefix"].Bool());
ui->lineEditAutoSavePrefix->setText(QString::fromStdString(settings["general"]["savePrefix"].String()));
ui->lineEditAutoSavePrefix->setEnabled(settings["general"]["useSavePrefix"].Bool());
Languages::fillLanguages(ui->comboBoxLanguage, false); Languages::fillLanguages(ui->comboBoxLanguage, false);
std::string cursorType = settings["video"]["cursor"].String(); std::string cursorType = settings["video"]["cursor"].String();
@ -500,3 +507,25 @@ void CSettingsView::on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &
node->String() = arg1.toUtf8().data(); node->String() = arg1.toUtf8().data();
} }
void CSettingsView::on_checkBoxAutoSavePrefix_stateChanged(int arg1)
{
Settings node = settings.write["general"]["useSavePrefix"];
node->Bool() = arg1;
ui->lineEditAutoSavePrefix->setEnabled(arg1);
}
void CSettingsView::on_spinBoxAutoSaveLimit_valueChanged(int arg1)
{
Settings node = settings.write["general"]["autosaveCountLimit"];
node->Float() = arg1;
}
void CSettingsView::on_lineEditAutoSavePrefix_textEdited(const QString &arg1)
{
Settings node = settings.write["general"]["savePrefix"];
node->String() = arg1.toStdString();
}

View File

@ -66,6 +66,12 @@ private slots:
void on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &arg1); void on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &arg1);
void on_checkBoxAutoSavePrefix_stateChanged(int arg1);
void on_spinBoxAutoSaveLimit_valueChanged(int arg1);
void on_lineEditAutoSavePrefix_textEdited(const QString &arg1);
private: private:
Ui::CSettingsView * ui; Ui::CSettingsView * ui;

View File

@ -42,7 +42,6 @@
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -107,26 +106,25 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>-331</y> <y>0</y>
<width>610</width> <width>610</width>
<height>679</height> <height>790</height>
</rect> </rect>
</property> </property>
<layout class="QGridLayout" name="gridLayout" columnstretch="2,0,1,1,1"> <layout class="QGridLayout" name="gridLayout" columnstretch="2,0,1,1,1">
<item row="8" column="0"> <item row="18" column="0">
<widget class="QLabel" name="labelVideo"> <widget class="QLabel" name="labelArtificialIntelligence">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Video</string> <string>Artificial Intelligence</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="24" column="2" colspan="3"> <item row="26" column="2" colspan="3">
<widget class="QLineEdit" name="lineEditRepositoryDefault"> <widget class="QLineEdit" name="lineEditRepositoryDefault">
<property name="text"> <property name="text">
<string notr="true"/> <string notr="true"/>
@ -136,168 +134,30 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="25" column="2" colspan="3"> <item row="26" column="1">
<widget class="QLineEdit" name="lineEditRepositoryExtra"> <widget class="QCheckBox" name="checkBoxRepositoryDefault">
<property name="text"> <property name="enabled">
<string notr="true"/> <bool>true</bool>
</property> </property>
</widget>
</item>
<item row="19" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxNeutralAI">
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="labelNetworkPort">
<property name="text">
<string>Network port</string>
</property>
</widget>
</item>
<item row="22" column="0">
<widget class="QLabel" name="labelRepositories">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Mod Repositories</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxAutoSave">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="21" column="0">
<widget class="QLabel" name="labelEnemyAI">
<property name="text">
<string>Enemy AI in battles</string>
</property>
</widget>
</item>
<item row="18" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxAlliedPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</property>
<item>
<property name="text">
<string notr="true">VCAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Nullkiller</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelTranslation">
<property name="text">
<string>Heroes III Translation</string>
</property>
</widget>
</item>
<item row="24" column="0">
<widget class="QLabel" name="labelRepositoryDefault">
<property name="text">
<string>Default repository</string>
</property>
</widget>
</item>
<item row="23" column="1" colspan="2">
<widget class="QComboBox" name="comboBoxAutoCheck">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="13" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxShowIntro">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="pushButtonTranslation">
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
</widget> <property name="checked">
</item> <bool>true</bool>
<item row="14" column="0">
<widget class="QLabel" name="labelDisplayIndex">
<property name="text">
<string>Display index</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="15" column="1" colspan="4"> <item row="27" column="1">
<widget class="QComboBox" name="comboBoxCursorType"> <widget class="QCheckBox" name="checkBoxRepositoryExtra">
<item>
<property name="text"> <property name="text">
<string>Hardware</string> <string/>
</property> </property>
</item> <property name="checked">
<item> <bool>true</bool>
<property name="text">
<string>Software</string>
</property> </property>
</item>
</widget> </widget>
</item> </item>
<item row="10" column="1" colspan="4"> <item row="12" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxFullScreen"> <widget class="QComboBox" name="comboBoxFullScreen">
<property name="toolTip"> <property name="toolTip">
<string>Select display mode for game <string>Select display mode for game
@ -328,243 +188,21 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
</item> </item>
</widget> </widget>
</item> </item>
<item row="25" column="1"> <item row="11" column="0">
<widget class="QCheckBox" name="checkBoxRepositoryExtra">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelLanguage">
<property name="text">
<string>VCMI Language</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxNetworkPort">
<property name="minimum">
<number>1024</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>3030</number>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="labelShowIntro">
<property name="text">
<string>Show intro</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="3">
<widget class="QLabel" name="labelTranslationStatus">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="20" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxFriendlyAI">
<property name="editable">
<bool>false</bool>
</property>
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="labelNeutralAI">
<property name="text">
<string>Neutral AI in battles</string>
</property>
</widget>
</item>
<item row="9" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxResolution"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labelGeneral">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>General</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="labelResolution"> <widget class="QLabel" name="labelResolution">
<property name="text"> <property name="text">
<string>Resolution</string> <string>Resolution</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="24" column="1"> <item row="20" column="0">
<widget class="QCheckBox" name="checkBoxRepositoryDefault">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="labelEnemyPlayerAI">
<property name="text">
<string>Adventure Map Enemies</string>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="labelInterfaceScaling">
<property name="text">
<string>Interface Scaling</string>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="labelCursorType">
<property name="text">
<string>Cursor</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxInterfaceScaling">
<property name="minimum">
<number>50</number>
</property>
<property name="maximum">
<number>400</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelLanguageBase">
<property name="text">
<string>Heroes III Data Language</string>
</property>
</widget>
</item>
<item row="18" column="0">
<widget class="QLabel" name="labelAlliedPlayerAI"> <widget class="QLabel" name="labelAlliedPlayerAI">
<property name="text"> <property name="text">
<string>Adventure Map Allies</string> <string>Adventure Map Allies</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="17" column="1" colspan="4"> <item row="23" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxEnemyPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</property>
<item>
<property name="text">
<string notr="true">VCAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Nullkiller</string>
</property>
</item>
</widget>
</item>
<item row="4" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxLanguageBase"/>
</item>
<item row="25" column="0">
<widget class="QLabel" name="labelRepositoryExtra">
<property name="text">
<string>Additional repository</string>
</property>
</widget>
</item>
<item row="23" column="0">
<widget class="QLabel" name="labelAutoCheck">
<property name="text">
<string>Check on startup</string>
</property>
</widget>
</item>
<item row="23" column="3" colspan="2">
<widget class="QPushButton" name="refreshRepositoriesButton">
<property name="text">
<string>Refresh now</string>
</property>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel" name="labelFriendlyAI">
<property name="text">
<string>Friendly AI in battles</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="labelFullScreen">
<property name="text">
<string>Fullscreen</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxLanguage"/>
</item>
<item row="14" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxDisplayIndex"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelAutoSave">
<property name="text">
<string>Autosave</string>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="labelArtificialIntelligence">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Artificial Intelligence</string>
</property>
</widget>
</item>
<item row="21" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxEnemyAI"> <widget class="QComboBox" name="comboBoxEnemyAI">
<property name="editable"> <property name="editable">
<bool>false</bool> <bool>false</bool>
@ -584,14 +222,169 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
</item> </item>
</widget> </widget>
</item> </item>
<item row="12" column="0"> <item row="24" column="0">
<widget class="QLabel" name="labelFramerateLimit"> <widget class="QLabel" name="labelRepositories">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text"> <property name="text">
<string>Framerate Limit</string> <string>Mod Repositories</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="12" column="1" colspan="4"> <item row="25" column="1" colspan="2">
<widget class="QComboBox" name="comboBoxAutoCheck">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="5" column="1" colspan="3">
<widget class="QLabel" name="labelTranslationStatus">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="26" column="0">
<widget class="QLabel" name="labelRepositoryDefault">
<property name="text">
<string>Default repository</string>
</property>
</widget>
</item>
<item row="27" column="0">
<widget class="QLabel" name="labelRepositoryExtra">
<property name="text">
<string>Additional repository</string>
</property>
</widget>
</item>
<item row="21" column="0">
<widget class="QLabel" name="labelNeutralAI">
<property name="text">
<string>Neutral AI in battles</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="pushButtonTranslation">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="13" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxInterfaceScaling">
<property name="minimum">
<number>50</number>
</property>
<property name="maximum">
<number>400</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="labelInterfaceScaling">
<property name="text">
<string>Interface Scaling</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelLanguageBase">
<property name="text">
<string>Heroes III Data Language</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="labelAutoSaveLimit">
<property name="text">
<string>Autosave limit (0 = off)</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxLanguageBase"/>
</item>
<item row="22" column="0">
<widget class="QLabel" name="labelFriendlyAI">
<property name="text">
<string>Friendly AI in battles</string>
</property>
</widget>
</item>
<item row="22" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxFriendlyAI">
<property name="editable">
<bool>false</bool>
</property>
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="11" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxResolution"/>
</item>
<item row="20" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxAlliedPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</property>
<item>
<property name="text">
<string notr="true">VCAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Nullkiller</string>
</property>
</item>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="labelDisplayIndex">
<property name="text">
<string>Display index</string>
</property>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="labelEnemyPlayerAI">
<property name="text">
<string>Adventure Map Enemies</string>
</property>
</widget>
</item>
<item row="14" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxFramerateLimit"> <widget class="QSpinBox" name="spinBoxFramerateLimit">
<property name="minimum"> <property name="minimum">
<number>20</number> <number>20</number>
@ -604,6 +397,239 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
</property> </property>
</widget> </widget>
</item> </item>
<item row="15" column="0">
<widget class="QLabel" name="labelShowIntro">
<property name="text">
<string>Show intro</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxAutoSave">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="1" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxLanguage"/>
</item>
<item row="17" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxCursorType">
<item>
<property name="text">
<string>Hardware</string>
</property>
</item>
<item>
<property name="text">
<string>Software</string>
</property>
</item>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="labelFullScreen">
<property name="text">
<string>Fullscreen</string>
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="labelCursorType">
<property name="text">
<string>Cursor</string>
</property>
</widget>
</item>
<item row="27" column="2" colspan="3">
<widget class="QLineEdit" name="lineEditRepositoryExtra">
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
<item row="23" column="0">
<widget class="QLabel" name="labelEnemyAI">
<property name="text">
<string>Enemy AI in battles</string>
</property>
</widget>
</item>
<item row="25" column="0">
<widget class="QLabel" name="labelAutoCheck">
<property name="text">
<string>Check on startup</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labelGeneral">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>General</string>
</property>
</widget>
</item>
<item row="21" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxNeutralAI">
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="25" column="3" colspan="2">
<widget class="QPushButton" name="refreshRepositoriesButton">
<property name="text">
<string>Refresh now</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxNetworkPort">
<property name="minimum">
<number>1024</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>3030</number>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="labelNetworkPort">
<property name="text">
<string>Network port</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelTranslation">
<property name="text">
<string>Heroes III Translation</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelLanguage">
<property name="text">
<string>VCMI Language</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelAutoSave">
<property name="text">
<string>Autosave</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="labelVideo">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Video</string>
</property>
</widget>
</item>
<item row="19" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxEnemyPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</property>
<item>
<property name="text">
<string notr="true">VCAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Nullkiller</string>
</property>
</item>
</widget>
</item>
<item row="16" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxDisplayIndex"/>
</item>
<item row="14" column="0">
<widget class="QLabel" name="labelFramerateLimit">
<property name="text">
<string>Framerate Limit</string>
</property>
</widget>
</item>
<item row="15" column="1" colspan="4">
<widget class="QComboBox" name="comboBoxShowIntro">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="labelAutoSavePrefix">
<property name="text">
<string>Autosave prefix</string>
</property>
</widget>
</item>
<item row="8" column="1" colspan="4">
<widget class="QSpinBox" name="spinBoxAutoSaveLimit"/>
</item>
<item row="9" column="1">
<widget class="QCheckBox" name="checkBoxAutoSavePrefix">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="9" column="2" colspan="3">
<widget class="QLineEdit" name="lineEditAutoSavePrefix">
<property name="placeholderText">
<string>empty = map name prefix</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>