Explorar el Código

Merge pull request #2305 from dydzio0614/unlimited-autosave

Ability to change autosave limit + set autosave prefix
Ivan Savenko hace 2 años
padre
commit
07a8c75bec

+ 0 - 9
client/CMT.cpp

@@ -137,7 +137,6 @@ int main(int argc, char * argv[])
 		("nointro,i", "skips intro movies")
 		("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")
-		("saveprefix", po::value<std::string>(), "prefix for auto save files")
 		("savefrequency", po::value<si64>(), "limit auto save creation to each N days")
 		("lobby", "parameters address, port, uuid to connect ro remote lobby session")
 		("lobby-address", po::value<std::string>(), "address to remote lobby")
@@ -222,13 +221,6 @@ int main(int argc, char * argv[])
 		else if(s->isNull())
 			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");
 	if(vm.count("headless"))
@@ -256,7 +248,6 @@ int main(int argc, char * argv[])
 
 	// Init special testing settings
 	setSettingInteger("session/serverport", "serverport", 0);
-	setSettingString("session/saveprefix", "saveprefix", "");
 	setSettingInteger("general/saveFrequency", "savefrequency", 1);
 
 	// Initialize logging based on settings

+ 32 - 15
client/CPlayerInterface.cpp

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

+ 2 - 4
client/CPlayerInterface.h

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

+ 6 - 0
client/adventureMap/AdventureMapInterface.cpp

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

+ 1 - 1
client/adventureMap/AdventureMapShortcuts.cpp

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

+ 1 - 1
client/adventureMap/AdventureOptions.cpp

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

+ 21 - 1
config/schemas/settings.json

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

+ 29 - 0
launcher/settingsView/csettingsview_moc.cpp

@@ -102,6 +102,13 @@ void CSettingsView::loadSettings()
 
 	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);
 
 	std::string cursorType = settings["video"]["cursor"].String();
@@ -500,3 +507,25 @@ void CSettingsView::on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &
 	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();
+}
+

+ 6 - 0
launcher/settingsView/csettingsview_moc.h

@@ -66,6 +66,12 @@ private slots:
 
 	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:
 	Ui::CSettingsView * ui;
 

+ 275 - 249
launcher/settingsView/csettingsview_moc.ui

@@ -42,7 +42,6 @@
      </property>
      <property name="font">
       <font>
-       <weight>75</weight>
        <bold>true</bold>
       </font>
      </property>
@@ -107,26 +106,25 @@
       <property name="geometry">
        <rect>
         <x>0</x>
-        <y>-331</y>
+        <y>0</y>
         <width>610</width>
-        <height>679</height>
+        <height>790</height>
        </rect>
       </property>
       <layout class="QGridLayout" name="gridLayout" columnstretch="2,0,1,1,1">
-       <item row="8" column="0">
-        <widget class="QLabel" name="labelVideo">
+       <item row="18" column="0">
+        <widget class="QLabel" name="labelArtificialIntelligence">
          <property name="font">
           <font>
-           <weight>75</weight>
            <bold>true</bold>
           </font>
          </property>
          <property name="text">
-          <string>Video</string>
+          <string>Artificial Intelligence</string>
          </property>
         </widget>
        </item>
-       <item row="24" column="2" colspan="3">
+       <item row="26" column="2" colspan="3">
         <widget class="QLineEdit" name="lineEditRepositoryDefault">
          <property name="text">
           <string notr="true"/>
@@ -136,124 +134,108 @@
          </property>
         </widget>
        </item>
-       <item row="25" column="2" colspan="3">
-        <widget class="QLineEdit" name="lineEditRepositoryExtra">
+       <item row="26" column="1">
+        <widget class="QCheckBox" name="checkBoxRepositoryDefault">
+         <property name="enabled">
+          <bool>true</bool>
+         </property>
          <property name="text">
-          <string notr="true"/>
+          <string/>
          </property>
-        </widget>
-       </item>
-       <item row="19" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxNeutralAI">
-         <property name="currentText">
-          <string notr="true">BattleAI</string>
+         <property name="checked">
+          <bool>true</bool>
          </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">
+       <item row="27" column="1">
+        <widget class="QCheckBox" name="checkBoxRepositoryExtra">
          <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>
+          <string/>
          </property>
-         <property name="text">
-          <string>Mod Repositories</string>
+         <property name="checked">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
-       <item row="7" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxAutoSave">
+       <item row="12" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxFullScreen">
+         <property name="toolTip">
+          <string>Select display mode for game
+
+Windowed - game will run inside a window that covers part of your screen
+
+Borderless Windowed Mode - game will run in a window that covers entirely of your screen, using same resolution as your screen.
+
+Fullscreen Exclusive Mode - game will cover entirety of your screen and will use selected resolution.</string>
+         </property>
          <property name="currentIndex">
-          <number>1</number>
+          <number>0</number>
          </property>
          <item>
           <property name="text">
-           <string>Off</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>On</string>
+           <string>Windowed</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>
+           <string>Borderless fullscreen</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string notr="true">Nullkiller</string>
+           <string>Exclusive fullscreen</string>
           </property>
          </item>
         </widget>
        </item>
-       <item row="5" column="0">
-        <widget class="QLabel" name="labelTranslation">
+       <item row="11" column="0">
+        <widget class="QLabel" name="labelResolution">
          <property name="text">
-          <string>Heroes III Translation</string>
+          <string>Resolution</string>
          </property>
         </widget>
        </item>
-       <item row="24" column="0">
-        <widget class="QLabel" name="labelRepositoryDefault">
+       <item row="20" column="0">
+        <widget class="QLabel" name="labelAlliedPlayerAI">
          <property name="text">
-          <string>Default repository</string>
+          <string>Adventure Map Allies</string>
          </property>
         </widget>
        </item>
-       <item row="23" column="1" colspan="2">
-        <widget class="QComboBox" name="comboBoxAutoCheck">
-         <property name="currentIndex">
-          <number>1</number>
+       <item row="23" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxEnemyAI">
+         <property name="editable">
+          <bool>false</bool>
+         </property>
+         <property name="currentText">
+          <string notr="true">BattleAI</string>
          </property>
          <item>
           <property name="text">
-           <string>Off</string>
+           <string notr="true">BattleAI</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string>On</string>
+           <string notr="true">StupidAI</string>
           </property>
          </item>
         </widget>
        </item>
-       <item row="13" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxShowIntro">
+       <item row="24" column="0">
+        <widget class="QLabel" name="labelRepositories">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Mod Repositories</string>
+         </property>
+        </widget>
+       </item>
+       <item row="25" column="1" colspan="2">
+        <widget class="QComboBox" name="comboBoxAutoCheck">
          <property name="currentIndex">
           <number>1</number>
          </property>
@@ -269,110 +251,86 @@
          </item>
         </widget>
        </item>
-       <item row="5" column="4">
-        <widget class="QPushButton" name="pushButtonTranslation">
+       <item row="5" column="1" colspan="3">
+        <widget class="QLabel" name="labelTranslationStatus">
          <property name="text">
           <string/>
          </property>
         </widget>
        </item>
-       <item row="14" column="0">
-        <widget class="QLabel" name="labelDisplayIndex">
+       <item row="26" column="0">
+        <widget class="QLabel" name="labelRepositoryDefault">
          <property name="text">
-          <string>Display index</string>
+          <string>Default repository</string>
          </property>
         </widget>
        </item>
-       <item row="15" 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="10" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxFullScreen">
-         <property name="toolTip">
-          <string>Select display mode for game
-
-Windowed - game will run inside a window that covers part of your screen
-
-Borderless Windowed Mode - game will run in a window that covers entirely of your screen, using same resolution as your screen.
-
-Fullscreen Exclusive Mode - game will cover entirety of your screen and will use selected resolution.</string>
-         </property>
-         <property name="currentIndex">
-          <number>0</number>
+       <item row="27" column="0">
+        <widget class="QLabel" name="labelRepositoryExtra">
+         <property name="text">
+          <string>Additional repository</string>
          </property>
-         <item>
-          <property name="text">
-           <string>Windowed</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Borderless fullscreen</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Exclusive fullscreen</string>
-          </property>
-         </item>
         </widget>
        </item>
-       <item row="25" column="1">
-        <widget class="QCheckBox" name="checkBoxRepositoryExtra">
+       <item row="21" column="0">
+        <widget class="QLabel" name="labelNeutralAI">
          <property name="text">
-          <string/>
-         </property>
-         <property name="checked">
-          <bool>true</bool>
+          <string>Neutral AI in battles</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="0">
-        <widget class="QLabel" name="labelLanguage">
+       <item row="5" column="4">
+        <widget class="QPushButton" name="pushButtonTranslation">
          <property name="text">
-          <string>VCMI Language</string>
+          <string/>
          </property>
         </widget>
        </item>
-       <item row="6" column="1" colspan="4">
-        <widget class="QSpinBox" name="spinBoxNetworkPort">
+       <item row="13" column="1" colspan="4">
+        <widget class="QSpinBox" name="spinBoxInterfaceScaling">
          <property name="minimum">
-          <number>1024</number>
+          <number>50</number>
          </property>
          <property name="maximum">
-          <number>65535</number>
+          <number>400</number>
          </property>
-         <property name="value">
-          <number>3030</number>
+         <property name="singleStep">
+          <number>10</number>
          </property>
         </widget>
        </item>
        <item row="13" column="0">
-        <widget class="QLabel" name="labelShowIntro">
+        <widget class="QLabel" name="labelInterfaceScaling">
          <property name="text">
-          <string>Show intro</string>
+          <string>Interface Scaling</string>
          </property>
         </widget>
        </item>
-       <item row="5" column="1" colspan="3">
-        <widget class="QLabel" name="labelTranslationStatus">
+       <item row="4" column="0">
+        <widget class="QLabel" name="labelLanguageBase">
          <property name="text">
-          <string/>
+          <string>Heroes III Data Language</string>
          </property>
         </widget>
        </item>
-       <item row="20" column="1" colspan="4">
+       <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>
@@ -392,158 +350,199 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
          </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">
+       <item row="11" 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>
+       <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>General</string>
+          <string>Display index</string>
          </property>
         </widget>
        </item>
-       <item row="9" column="0">
-        <widget class="QLabel" name="labelResolution">
+       <item row="19" column="0">
+        <widget class="QLabel" name="labelEnemyPlayerAI">
          <property name="text">
-          <string>Resolution</string>
+          <string>Adventure Map Enemies</string>
          </property>
         </widget>
        </item>
-       <item row="24" column="1">
-        <widget class="QCheckBox" name="checkBoxRepositoryDefault">
-         <property name="enabled">
-          <bool>true</bool>
+       <item row="14" column="1" colspan="4">
+        <widget class="QSpinBox" name="spinBoxFramerateLimit">
+         <property name="minimum">
+          <number>20</number>
          </property>
-         <property name="text">
-          <string/>
+         <property name="maximum">
+          <number>1000</number>
          </property>
-         <property name="checked">
-          <bool>true</bool>
+         <property name="singleStep">
+          <number>10</number>
          </property>
         </widget>
        </item>
-       <item row="17" column="0">
-        <widget class="QLabel" name="labelEnemyPlayerAI">
+       <item row="15" column="0">
+        <widget class="QLabel" name="labelShowIntro">
          <property name="text">
-          <string>Adventure Map Enemies</string>
+          <string>Show intro</string>
          </property>
         </widget>
        </item>
-       <item row="11" column="0">
-        <widget class="QLabel" name="labelInterfaceScaling">
+       <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>Interface Scaling</string>
+          <string>Fullscreen</string>
          </property>
         </widget>
        </item>
-       <item row="15" column="0">
+       <item row="17" 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>
+       <item row="27" column="2" colspan="3">
+        <widget class="QLineEdit" name="lineEditRepositoryExtra">
+         <property name="text">
+          <string notr="true"/>
          </property>
-         <property name="singleStep">
-          <number>10</number>
+        </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="4" column="0">
-        <widget class="QLabel" name="labelLanguageBase">
+       <item row="25" column="0">
+        <widget class="QLabel" name="labelAutoCheck">
          <property name="text">
-          <string>Heroes III Data Language</string>
+          <string>Check on startup</string>
          </property>
         </widget>
        </item>
-       <item row="18" column="0">
-        <widget class="QLabel" name="labelAlliedPlayerAI">
+       <item row="0" column="0">
+        <widget class="QLabel" name="labelGeneral">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
          <property name="text">
-          <string>Adventure Map Allies</string>
+          <string>General</string>
          </property>
         </widget>
        </item>
-       <item row="17" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxEnemyPlayerAI">
+       <item row="21" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxNeutralAI">
          <property name="currentText">
-          <string notr="true">VCAI</string>
+          <string notr="true">BattleAI</string>
          </property>
          <item>
           <property name="text">
-           <string notr="true">VCAI</string>
+           <string notr="true">BattleAI</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string notr="true">Nullkiller</string>
+           <string notr="true">StupidAI</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">
+       <item row="25" column="3" colspan="2">
+        <widget class="QPushButton" name="refreshRepositoriesButton">
          <property name="text">
-          <string>Additional repository</string>
+          <string>Refresh now</string>
          </property>
         </widget>
        </item>
-       <item row="23" column="0">
-        <widget class="QLabel" name="labelAutoCheck">
-         <property name="text">
-          <string>Check on startup</string>
+       <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="23" column="3" colspan="2">
-        <widget class="QPushButton" name="refreshRepositoriesButton">
+       <item row="6" column="0">
+        <widget class="QLabel" name="labelNetworkPort">
          <property name="text">
-          <string>Refresh now</string>
+          <string>Network port</string>
          </property>
         </widget>
        </item>
-       <item row="20" column="0">
-        <widget class="QLabel" name="labelFriendlyAI">
+       <item row="5" column="0">
+        <widget class="QLabel" name="labelTranslation">
          <property name="text">
-          <string>Friendly AI in battles</string>
+          <string>Heroes III Translation</string>
          </property>
         </widget>
        </item>
-       <item row="10" column="0">
-        <widget class="QLabel" name="labelFullScreen">
+       <item row="1" column="0">
+        <widget class="QLabel" name="labelLanguage">
          <property name="text">
-          <string>Fullscreen</string>
+          <string>VCMI Language</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">
@@ -551,56 +550,83 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
          </property>
         </widget>
        </item>
-       <item row="16" column="0">
-        <widget class="QLabel" name="labelArtificialIntelligence">
+       <item row="10" column="0">
+        <widget class="QLabel" name="labelVideo">
          <property name="font">
           <font>
-           <weight>75</weight>
            <bold>true</bold>
           </font>
          </property>
          <property name="text">
-          <string>Artificial Intelligence</string>
+          <string>Video</string>
          </property>
         </widget>
        </item>
-       <item row="21" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxEnemyAI">
-         <property name="editable">
-          <bool>false</bool>
-         </property>
+       <item row="19" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxEnemyPlayerAI">
          <property name="currentText">
-          <string notr="true">BattleAI</string>
+          <string notr="true">VCAI</string>
          </property>
          <item>
           <property name="text">
-           <string notr="true">BattleAI</string>
+           <string notr="true">VCAI</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string notr="true">StupidAI</string>
+           <string notr="true">Nullkiller</string>
           </property>
          </item>
         </widget>
        </item>
-       <item row="12" column="0">
+       <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="12" column="1" colspan="4">
-        <widget class="QSpinBox" name="spinBoxFramerateLimit">
-         <property name="minimum">
-          <number>20</number>
+       <item row="15" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxShowIntro">
+         <property name="currentIndex">
+          <number>1</number>
          </property>
-         <property name="maximum">
-          <number>1000</number>
+         <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>
-         <property name="singleStep">
-          <number>10</number>
+        </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>