diff --git a/.github/screenshots/instances.png b/.github/screenshots/instances.png
index 3db9187..a44df7d 100644
Binary files a/.github/screenshots/instances.png and b/.github/screenshots/instances.png differ
diff --git a/.github/screenshots/main_page.png b/.github/screenshots/main_page.png
index 3c04842..48e9b7d 100644
Binary files a/.github/screenshots/main_page.png and b/.github/screenshots/main_page.png differ
diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index 42c828f..0a04cdd 100644
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -17,7 +17,7 @@
"windowsSdkVersion": "10.0.17763.0",
"compilerPath": "C:/Compillers/C++/MinGW64/bin/g++.exe",
"cStandard": "c11",
- "cppStandard": "c++17",
+ "cppStandard": "c++20",
"intelliSenseMode": "gcc-x64"
}
],
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 37cb942..a02cf55 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -24,7 +24,6 @@
"ignoreFailures": true
}
],
- "preLaunchTask": "build",
"miDebuggerPath": "C:/Compillers/c++/MinGW64/bin/gdb.exe",
"internalConsoleOptions": "neverOpen",
"logging": {
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 12bac14..c1a83bf 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -6,13 +6,13 @@
"type": "shell",
"command": "windres",
"args": [
- "${fileDirname}/resources/resources.rc",
+ "${workspaceFolder}/src/resources/resources.rc",
"-o",
- "${fileDirname}/resources/resources.o"
+ "${workspaceFolder}/src/resources/resources.o"
],
"group": {
"kind": "build",
- "isDefault": false
+ "isDefault": true
},
"problemMatcher": []
},
@@ -21,6 +21,7 @@
"type": "shell",
"command": "g++",
"args": [
+ "-std=c++20",
"-I",
"C:/SFML-2.6.1/include",
"-I",
@@ -33,7 +34,7 @@
"C:/C++Libs/curl-8.9.0/lib",
"-g",
"${file}",
- "${fileDirname}/resources/resources.o",
+ "${workspaceFolder}/src/resources/resources.o",
"-o",
"${workspaceFolder}/SRLauncher.exe",
"-lsfml-graphics",
@@ -48,7 +49,7 @@
},
"problemMatcher": ["$gcc"],
"dependsOn": "compile-resources",
- "detail": "Generated task by Debugger."
+ "detail": "Compile SRLauncher."
}
]
}
diff --git a/README.md b/README.md
index 918e869..3eeeaca 100644
--- a/README.md
+++ b/README.md
@@ -3,13 +3,17 @@ Early release! You are using on your own risk!
# Requirements
- [Visual C++ Redist](https://learn.microsoft.com/en-en/cpp/windows/latest-supported-vc-redist?view=msvc-170)
+
+- Net Runtime 8.0.8
+or
- [SteamCMD](https://developer.valvesoftware.com/wiki/SteamCMD)
+
- Steam account with purchased Slime Rancher
# Requirements to compile the code
- [SFML 2.6.1](https://www.sfml-dev.org/download/sfml/2.6.1)
- [MinGW 13.1.0](https://www.mingw-w64.org/downloads)
-- [SFML-GUI Lib 0.1.2 or later](https://github.com/MinecraftSRDEV/SFML-GUI)
+- [SFML-GUI Lib 0.1.3 or later](https://github.com/MinecraftSRDEV/SFML-GUI)
# About
An open-source launcher designed to make it easier for users to manage various instances of the game Slime Rancher. It allows for the creation of individual game instances so you can separate the VANILLA game from modified versions and play any version of the game without the need to manually swap entire folders.
@@ -38,12 +42,10 @@ For a folder to be recognized as an instance, it must contain an "info.json" fil
When a user selects an instance from the list, its folder is swapped with the one in the Steam game folder. YOU CANNOT HAVE MULTIPLE INSTANCES MOUNTED AT THE SAME TIME! **IF THE FOLDER IS NOT DETECTED AND ALREADY CONTAINS FILES FROM ANOTHER INSTANCE, IT MAY BE OVERWRITTEN!**
-Unmounting an instance restores the instance folder to its original location. If the instance does not contain the downloaded game, a script will run to download it using SteamCMD.
+Unmounting an instance restores the instance folder to its original location. If the instance does not contain the downloaded game, a script will run to download it using Included specially modified [DepotDownloader](https://github.com/MinecraftSRDEV/SRLauncherDepotDownloader) or SteamCMD.
You will need to log in to your Steam account with the game.
-It is recommended to enter your login credentials in the profile settings. However, if you are concerned about your login details, you can enter them later directly in SteamCMD.
-
Your gamesaves, options and achivements are automatically separated for each instance.
Notes:
diff --git a/SRLauncher.exe b/SRLauncher.exe
index 3faa339..55403f1 100644
Binary files a/SRLauncher.exe and b/SRLauncher.exe differ
diff --git a/assets/components/downloader/DepotDownloader.dll b/assets/components/downloader/DepotDownloader.dll
new file mode 100644
index 0000000..0d52122
Binary files /dev/null and b/assets/components/downloader/DepotDownloader.dll differ
diff --git a/assets/components/downloader/DepotDownloader.exe b/assets/components/downloader/DepotDownloader.exe
new file mode 100644
index 0000000..7cf8f20
Binary files /dev/null and b/assets/components/downloader/DepotDownloader.exe differ
diff --git a/assets/components/downloader/DepotDownloader.runtimeconfig.json b/assets/components/downloader/DepotDownloader.runtimeconfig.json
new file mode 100644
index 0000000..824cfe4
--- /dev/null
+++ b/assets/components/downloader/DepotDownloader.runtimeconfig.json
@@ -0,0 +1,13 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "rollForward": "LatestMajor",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/assets/components/downloader/QRCoder.dll b/assets/components/downloader/QRCoder.dll
new file mode 100644
index 0000000..eda5d04
Binary files /dev/null and b/assets/components/downloader/QRCoder.dll differ
diff --git a/assets/components/downloader/SteamKit2.dll b/assets/components/downloader/SteamKit2.dll
new file mode 100644
index 0000000..26a6fae
Binary files /dev/null and b/assets/components/downloader/SteamKit2.dll differ
diff --git a/assets/components/downloader/System.IO.Hashing.dll b/assets/components/downloader/System.IO.Hashing.dll
new file mode 100644
index 0000000..233a5c8
Binary files /dev/null and b/assets/components/downloader/System.IO.Hashing.dll differ
diff --git a/assets/components/downloader/protobuf-net.Core.dll b/assets/components/downloader/protobuf-net.Core.dll
new file mode 100644
index 0000000..845a840
Binary files /dev/null and b/assets/components/downloader/protobuf-net.Core.dll differ
diff --git a/assets/components/downloader/protobuf-net.dll b/assets/components/downloader/protobuf-net.dll
new file mode 100644
index 0000000..e4b6839
Binary files /dev/null and b/assets/components/downloader/protobuf-net.dll differ
diff --git a/assets/components/mods/SRMultimod.dll b/assets/components/mods/SRMultimod.dll
new file mode 100644
index 0000000..59374cc
Binary files /dev/null and b/assets/components/mods/SRMultimod.dll differ
diff --git a/assets/config/versions.json b/assets/config/versions.json
index eb6e1c5..b49ffe3 100644
--- a/assets/config/versions.json
+++ b/assets/config/versions.json
@@ -4,377 +4,599 @@
"type": "pre-release",
"mod_support": false,
"date": "14 January 2016 19:40:18",
- "manifest": "4045174004136343292"
+ "manifest": "4045174004136343292",
+ "iteration": 0
},
"0.2.4a":
{
"type": "pre-release",
"mod_support": true,
"date": "14 January 2016 19:40:18",
- "manifest": "4045174004136343292"
+ "manifest": "4045174004136343292",
+ "iteration": 1
},
"0.2.4b":
{
"type": "pre-release",
"mod_support": true,
"date": "20 January 2016 22:10:47",
- "manifest": "7182296344122123132"
+ "manifest": "7182296344122123132",
+ "iteration": 2
},
"0.2.5":
{
"type": "pre-release",
"mod_support": false,
"date": "24 February 2016 18:50:03",
- "manifest": "6799269289357766840"
+ "manifest": "6799269289357766840",
+ "iteration": 3
},
"0.2.6":
{
"type": "pre-release",
"mod_support": true,
"date": "2 March 2016 21:33:00",
- "manifest": "1033183441576441347"
+ "manifest": "1033183441576441347",
+ "iteration": 4
},
"0.3.0a":
{
"type": "pre-release",
"mod_support": false,
"date": "13 April 2016 18:38:14",
- "manifest": "5739960724280512899"
+ "manifest": "5739960724280512899",
+ "iteration": 5
},
"0.3.0b":
{
"type": "pre-release",
"mod_support": false,
"date": "13 April 2016 20:20:35",
- "manifest": "3772336976531939949"
+ "manifest": "3772336976531939949",
+ "iteration": 6
},
"0.3.0c":
{
"type": "pre-release",
"mod_support": false,
"date": "14 April 2016 21:05:13",
- "manifest": "4623224924342845759"
+ "manifest": "4623224924342845759",
+ "iteration": 7
},
"0.3.0d":
{
"type": "pre-release",
"mod_support": false,
"date": "19 April 2016 18:01:01",
- "manifest": "2972284991921612878"
+ "manifest": "2972284991921612878",
+ "iteration": 8
},
"0.3.1":
{
"type": "pre-release",
"mod_support": false,
"date": "11 May 2016 18:18:27",
- "manifest": "5743640177165165681"
+ "manifest": "5743640177165165681",
+ "iteration": 9
},
"0.3.2":
{
"type": "pre-release",
"mod_support": false,
"date": "25 May 2016 18:03:45",
- "manifest": "2946735614319817428"
+ "manifest": "2946735614319817428",
+ "iteration": 10
},
"0.3.3":
{
"type": "pre-release",
"mod_support": false,
"date": "6 June 2016 17:15:22",
- "manifest": "7738864408631168506"
+ "manifest": "7738864408631168506",
+ "iteration": 11
},
"0.3.4a":
{
"type": "pre-release",
"mod_support": false,
"date": "28 June 2016 18:12:15",
- "manifest": "6758041439170534385"
+ "manifest": "6758041439170534385",
+ "iteration": 12
},
"0.3.4b":
{
"type": "pre-release",
"mod_support": false,
"date": "7 July 2016 18:31:15",
- "manifest": "7445301902417763300"
+ "manifest": "7445301902417763300",
+ "iteration": 13
},
"0.3.5a":
{
"type": "pre-release",
"mod_support": false,
"date": "2 August 2016 18:19:36",
- "manifest": "441665626499515573"
+ "manifest": "441665626499515573",
+ "iteration": 14
},
"0.3.5b":
{
"type": "pre-release",
"mod_support": false,
"date": "3 August 2016 20:22:31",
- "manifest": "4160302346993532058"
+ "manifest": "4160302346993532058",
+ "iteration": 15
},
"0.3.5c":
{
"type": "pre-release",
"mod_support": false,
"date": "4 August 2016 20:45:16",
- "manifest": "7951669086951816288"
+ "manifest": "7951669086951816288",
+ "iteration": 16
},
"0.3.6":
{
"type": "pre-release",
"mod_support": false,
"date": "4 October 2016 18:08:15",
- "manifest": "2275413498306063160"
+ "manifest": "2275413498306063160",
+ "iteration": 17
},
"0.3.7":
{
"type": "pre-release",
"mod_support": false,
"date": "26 October 2016 20:14:52",
- "manifest": "9095519627420606792"
+ "manifest": "9095519627420606792",
+ "iteration": 18
},
"0.4.0a":
{
"type": "pre-release",
"mod_support": false,
"date": "16 November 2016 18:59:07",
- "manifest": "1077313905221894874"
+ "manifest": "1077313905221894874",
+ "iteration": 19
},
"0.4.0b":
{
"type": "pre-release",
"mod_support": false,
"date": "17 November 2016 19:31:43",
- "manifest": "7584701036356484349"
+ "manifest": "7584701036356484349",
+ "iteration": 20
},
"0.4.0c":
{
"type": "pre-release",
"mod_support": false,
"date": "18 November 2016 19:22:05",
- "manifest": "6870286703332284824"
+ "manifest": "6870286703332284824",
+ "iteration": 21
},
"0.4.1":
{
"type": "pre-release",
"mod_support": false,
"date": "13 December 2016 18:30:01",
- "manifest": "8303185920772797051"
+ "manifest": "8303185920772797051",
+ "iteration": 22
},
"0.4.2a":
{
"type": "pre-release",
"mod_support": false,
"date": "18 January 2017 18:37:05",
- "manifest": "1694335367612045422"
+ "manifest": "1694335367612045422",
+ "iteration": 23
},
"0.4.2b":
{
"type": "pre-release",
"mod_support": false,
"date": "18 January 2017 19:50:02",
- "manifest": "5897923490926635963"
+ "manifest": "5897923490926635963",
+ "iteration": 24
},
"0.4.2c":
{
"type": "pre-release",
"mod_support": false,
"date": "19 January 2017 00:10:50",
- "manifest": "4530001700882359796"
+ "manifest": "4530001700882359796",
+ "iteration": 25
},
"0.4.2d":
{
"type": "pre-release",
"mod_support": false,
"date": "19 January 2017 21:20:06",
- "manifest": "4191601468284027157"
+ "manifest": "4191601468284027157",
+ "iteration": 26
},
"0.4.3a":
{
"type": "pre-release",
"mod_support": false,
"date": "8 February 2017 20:52:51",
- "manifest": "7833287157571905798"
+ "manifest": "7833287157571905798",
+ "iteration": 27
},
"0.4.3b":
{
"type": "pre-release",
"mod_support": false,
"date": "10 February 2017 00:19:26",
- "manifest": "283920316031094754"
+ "manifest": "283920316031094754",
+ "iteration": 28
},
"0.4.3c":
{
"type": "pre-release",
"mod_support": false,
"date": "10 February 2017 19:58:13",
- "manifest": "4043740644288891779"
+ "manifest": "4043740644288891779",
+ "iteration": 29
},
"0.5.0a":
{
"type": "pre-release",
"mod_support": false,
"date": "6 March 2017 19:30:38",
- "manifest": "8187804633390722888"
+ "manifest": "8187804633390722888",
+ "iteration": 30
},
"0.5.0b":
{
"type": "pre-release",
"mod_support": false,
"date": "7 March 2017 18:39:58",
- "manifest": "3327198351526229552"
+ "manifest": "3327198351526229552",
+ "iteration": 31
},
"0.5.1a":
{
"type": "pre-release",
"mod_support": false,
"date": "18 April 2017 20:05:05",
- "manifest": "2766321578005003158"
+ "manifest": "2766321578005003158",
+ "iteration": 32
},
"0.5.1b":
{
"type": "pre-release",
"mod_support": false,
"date": "19 April 2017 00:01:09",
- "manifest": "1463473742245212406"
+ "manifest": "1463473742245212406",
+ "iteration": 33
},
"0.5.1c":
{
"type": "pre-release",
"mod_support": false,
"date": "19 April 2017 20:09:44",
- "manifest": "8728768945717888662"
+ "manifest": "8728768945717888662",
+ "iteration": 34
},
"0.6.0a":
{
"type": "pre-release",
"mod_support": false,
"date": "12 June 2017 18:40:15",
- "manifest": "3005166342762747575"
+ "manifest": "3005166342762747575",
+ "iteration": 35
},
"0.6.0b":
{
"type": "pre-release",
"mod_support": false,
"date": "14 June 2017 17:21:55",
- "manifest": "5726208285649647890"
+ "manifest": "5726208285649647890",
+ "iteration": 36
},
"0.6.0c":
{
"type": "pre-release",
"mod_support": false,
"date": "15 June 2017 17:59:11",
- "manifest": "5417110692020453501"
+ "manifest": "5417110692020453501",
+ "iteration": 37
},
"0.6.0d":
{
"type": "pre-release",
"mod_support": false,
"date": "21 June 2017 17:27:50",
- "manifest": "2082346440087920581"
+ "manifest": "2082346440087920581",
+ "iteration": 38
},
"1.0.0":
{
"type": "stable-release",
"mod_support": false,
"date": "1 August 2017 15:53:23",
- "manifest": "5135774656716118593"
+ "manifest": "5135774656716118593",
+ "iteration": 39
},
"1.0.1a":
{
"type": "stable-release",
"mod_support": false,
"date": "7 August 2017 20:39:04",
- "manifest": "4851587196133886854"
+ "manifest": "4851587196133886854",
+ "iteration": 40
},
"1.0.1b":
{
"type": "stable-release",
"mod_support": false,
"date": "7 August 2017 22:54:12",
- "manifest": "4324966178055253335"
+ "manifest": "4324966178055253335",
+ "iteration": 41
},
"1.0.1c":
{
"type": "stable-release",
"mod_support": false,
"date": "9 August 2017 00:46:50",
- "manifest": "422152276091152701"
+ "manifest": "422152276091152701",
+ "iteration": 42
},
"1.0.1d":
{
"type": "stable-release",
"mod_support": false,
"date": "15 August 2017 19:58:41",
- "manifest": "247273116485453688"
+ "manifest": "247273116485453688",
+ "iteration": 43
},
"1.0.1e":
{
"type": "stable-release",
"mod_support": false,
"date": "16 August 2017 20:26:51",
- "manifest": "8423504983419915811"
+ "manifest": "8423504983419915811",
+ "iteration": 44
},
"1.1.0a":
{
"type": "stable-release",
"mod_support": false,
"date": "17 October 2017 20:09:35",
- "manifest": "5897958052374083277"
+ "manifest": "5897958052374083277",
+ "iteration": 45
},
"1.1.0b":
{
"type": "stable-release",
"mod_support": false,
"date": "20 October 2017 20:51:31",
- "manifest": "1919820526115725711"
+ "manifest": "1919820526115725711",
+ "iteration": 46
},
"1.1.0c":
{
"type": "stable-release",
"mod_support": false,
"date": "22 October 2017 22:33:48",
- "manifest": "4845007903748570401"
+ "manifest": "4845007903748570401",
+ "iteration": 47
},
"1.1.0d":
{
"type": "stable-release",
"mod_support": false,
"date": "26 October 2017 20:36:46",
- "manifest": "2079501695052122794"
+ "manifest": "2079501695052122794",
+ "iteration": 48
},
"1.1.0e":
{
"type": "stable-release",
"mod_support": false,
"date": "31 October 2017 18:36:28",
- "manifest": "3036455992843227148"
+ "manifest": "3036455992843227148",
+ "iteration": 49
},
- "1.1.1a":
+ "1.1.1":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "28 November 2017 19:45:22",
+ "manifest": "1637502931535337305",
+ "iteration": 50
+ },
+ "1.1.2":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "11 December 2017 19:45:51",
+ "manifest": "5474736100245866216",
+ "iteration": 51
+ },
+ "1.2.0a":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "13 March 2018 17:39:43",
+ "manifest": "5711025897832057767",
+ "iteration": 52
+ },
+ "1.2.0b":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "14 March 2018 22:27:22",
+ "manifest": "7382698957251043649",
+ "iteration": 53
+ },
+ "1.2.1a":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "3 April 2018 20:18:47",
+ "manifest": "4303510215236835719",
+ "iteration": 54
+ },
+ "1.2.1b":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "3 April 2018 23:19:35",
+ "manifest": "4113156500573990230",
+ "iteration": 55
+ },
+ "1.2.2":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "22 May 2018 20:48:30",
+ "manifest": "6567583593680649790",
+ "iteration": 56
+ },
+ "1.3.0a":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "17 July 2018 18:11:23",
+ "manifest": "2157716521240164266",
+ "iteration": 57
+ },
+ "1.3.0b":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "24 July 2018 17:32:10",
+ "manifest": "1403677244604722355",
+ "iteration": 58
+ },
+ "1.3.1a":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "23 October 2018 17:59:02",
+ "manifest": "7026817123929157660",
+ "iteration": 59
+ },
+ "1.3.1b":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "25 October 2018 17:05:43",
+ "manifest": "8949870417267410650",
+ "iteration": 60
+ },
+ "1.3.1c":
+ {
+ "type": "stable-release",
+ "mod_support": false,
+ "date": "31 October 2018 22:13:39",
+ "manifest": "9139465071697603267",
+ "iteration": 61
+ },
+ "1.3.2a":
{
"type": "stable-release",
"mod_support": false,
"date": "4 December 2018 21:07:52",
- "manifest": "5058231856610850876"
+ "manifest": "5058231856610850876",
+ "iteration": 62
},
- "1.1.1b":
+ "1.3.2b":
{
"type": "stable-release",
"mod_support": false,
"date": "5 December 2018 23:03:54",
- "manifest": "7164530134796481521"
+ "manifest": "7164530134796481521",
+ "iteration": 63
},
"1.3.2c":
{
"type": "stable-release",
"mod_support": false,
"date": "2 April 2019 21:59:29",
- "manifest": "5431269293947431949"
+ "manifest": "5431269293947431949",
+ "iteration": 64
+ },
+ "1.4.0a":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "18 June 2019 18:02:24",
+ "manifest": "7506286600836917564",
+ "iteration": 65
+ },
+ "1.4.0b":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "20 June 2019 01:32:45",
+ "manifest": "6519949657988813973",
+ "iteration": 66
+ },
+ "1.4.0c":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "27 June 2019 21:36:03",
+ "manifest": "8175446157514313384",
+ "iteration": 67
+ },
+ "1.4.0d":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "5 August 2019 20:21:12",
+ "manifest": "5031921718320326634",
+ "iteration": 68
+ },
+ "1.4.1a":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "3 December 2019 17:23:06",
+ "manifest": "7606486939041161388",
+ "iteration": 69
+ },
+ "1.4.1b":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "5 December 2019 19:16:46",
+ "manifest": "5794995706320684390",
+ "iteration": 70
+ },
+ "1.4.1c":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "10 December 2019 22:12:21",
+ "manifest": "3625841615104358190",
+ "iteration": 71
+ },
+ "1.4.2":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "26 May 2020 17:01:02",
+ "manifest": "4980735195179703363",
+ "iteration": 72
+ },
+ "1.4.3":
+ {
+ "type": "stable-release",
+ "mod_support": true,
+ "date": "8 December 2020 17:00:34",
+ "manifest": "5877768838748196408",
+ "iteration": 73
},
"1.4.4":
{
"type": "stable-release",
"mod_support": true,
"date": "1 December 2021 18:01:02",
- "manifest": "4496584778521264766"
+ "manifest": "4496584778521264766",
+ "iteration": 74
}
}
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.2.3b.txt b/assets/resources/pachNotes/0.2.3b.txt
new file mode 100644
index 0000000..5b89d65
--- /dev/null
+++ b/assets/resources/pachNotes/0.2.3b.txt
@@ -0,0 +1,11 @@
+Changes:
+
+ Adjustmented the in-home background image.
+ Increased the time the explore tutorial stays on screen.
+
+Bugfixes:
+
+ Fixed bug where nutrient soil was causing gardens to not grow as many fruit & veggies as they should.
+ Fixed bug where health, energy, and ammo upgrades would sometimes carry into new games.
+ Fixed bug that could sometimes cause lag related to watering.
+ Fixed bug where ponds were too easy to refill.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.2.4.b.txt b/assets/resources/pachNotes/0.2.4.b.txt
new file mode 100644
index 0000000..21f733b
--- /dev/null
+++ b/assets/resources/pachNotes/0.2.4.b.txt
@@ -0,0 +1 @@
+Fixed a bug that was causing plort collectors and auto-feeders to lose their contents on game load.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.2.4a.txt b/assets/resources/pachNotes/0.2.4a.txt
new file mode 100644
index 0000000..d3a79fe
--- /dev/null
+++ b/assets/resources/pachNotes/0.2.4a.txt
@@ -0,0 +1,37 @@
+Version 0.2.4b is now live! This is largely a bugfix patch.
+
+ You can keep your save files for this update*
+
+Changes:
+
+ Adjusted boom slime explosion timing to make it significantly less likely that several of them in an area explode simultaneously.
+ Add an option to completely disable gamepad/joystick input. This may prevent your camera from spinning if other solutions did not.
+ Increased the range of the mouse sensitivity slider.
+ Add a "Safe Mode"/"Low Graphics" mode to force the game to start up with the lowest graphics settings. Right click on the Steam library entry and select 'Safe Mode.'
+ Adjusted the position of the plort market slightly.
+ Splash effect now used when a puddle plort is destroyed on hitting a solid surface.
+ Made the key icon on the slime gate more clear.
+ Added some extra under construction signs in the world for clarity.
+
+Bugfixes:
+
+ Fixed bug allowing Slimes and chickens to disappear in Grotto
+ Fixed bug where corrals and gardens on the ranch could sometimes be seen floating in space from far away.
+ Fixed bug with formatting of the garden crop countdown text.
+ Fixed bug where silos sometimes lost their contents on game load.
+ Fixed bug where special characters were allowed in game names, leading to problems saving the game later.
+ Fixed bug where shooting puddle plorts and slimes with water would cause them to disappear.
+ Fixed bug where the range exchange offers would sometimes carry over into a new game.
+ Fixed bug where footstep audio sometimes played during a jump.
+ Fixed bug where several sounds were ignoring the Sound Effects audio volume setting.
+ Fixed bug where the game time could be stuck in fast-forward mode.
+ Fixed bug where the Emergency Return confirmation was not properly closing on Esc.
+ Fixed bug where Phosphor slimes when on low graphics settings did not have wings.
+ Fixed bug where Boom Rock Largos would eat fruit to transform into Tarr.
+ Fixed some typos in slimepedia descriptions.
+ Reduced game stutter when loading the first Slimepedia popup.
+ Fixed bug where the slimepedia sometimes didn't properly unlock the initial vac and ranch pages.
+ Fixed bug where controlling the view with mouse or gamepad didn't work until a button was pressed.
+ Fixed bug where Tabby slimes and Tabby Largos would get stuck staring at food.
+ Fixed bug where crops in gardens sometimes ripened early on game reload.
+ Fixed bug where objects could end up inside the plort collector's collection box.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.2.5.txt b/assets/resources/pachNotes/0.2.5.txt
new file mode 100644
index 0000000..e347f04
--- /dev/null
+++ b/assets/resources/pachNotes/0.2.5.txt
@@ -0,0 +1,46 @@
+Changes and Balance:
+
+ Improve economy reactions to plorts sold.
+ Update Scareslime model. Springy!
+ Improve vacpack controls handling both shoot and vac being held at once - now consistently does the last mode selected.
+ Improve Air Net ability to hold Phosphor Slimes.
+ Improve handling of game saves to minimize the likelihood of corrupted save files.
+ Switch the default Gif-render keyboard shortcut to 'G' (If you've previously played yours will remain single-quote.)
+ Slightly smaller version number watermark.
+ Add a reset defaults button for key/mouse controls and gamepad.
+ Make it easier to collect water from the fresh water springs.
+ Improve water visuals for Slime Sea, Fresh Water, and water from the vac.
+ Change logic to make the alternate versions of various areas' music play more often.
+ Humble download Windows version now comes as an installer.
+
+Bugfixes:
+
+ Fix audio for boom slime explode warmup ignoring volume settings.
+ Fix some Slimepedia typos.
+ Fix a memory leak involving water shot from the vacpack.
+ Fix bug with Ball Pit & Six Pack achievements awarding too early.
+ Fix bug with Phosphor Slimes not noticing when the solar shield they were in went away.
+ Fix bug with economy sometimes not correctly resetting on a new game.
+ Fix bug where the Auto-Feeder and Plort Collector timing could be incorrect when reloading a game.
+ Fix bug where players could remove items from the silo or plort collector while holding a largo.
+ Fix bug where items could be launched from the vacpack through floors and walls.
+ Fix bug preventing standard chickadoos from being accepted in silos and feeders.
+ Fix bug where Beatrix would jump in response to making a purchase via the controller.
+ Fix bugs affecting the vacpack animations.
+ Fix bug where player could sometimes press Sleep Until Morning repeatedly and enter continual fast-forward mode.
+ Fix bug causing a significant delay on displaying the first Slimepedia popup.
+ Fix bug where multiple slimes could eat the same food item at the same time.
+ Fix bug where the Starmail content did not initially scroll to the correct position.
+ Fix the description of the Hasty Exchange achievement requirements.
+ Fix bug causing Diversification achievement to sometimes not be awarded.
+ Fix bug causing Up All Night achievement to sometimes not be awarded.
+ Fix bug where the vac could sometimes still affect a largo that had been dropped behind Beatrix.
+ Fix bug where the Tarr music would sometimes continue after teleporting away from the Tarr.
+ Fix bug where the vac audio loop sometimes stopped.
+ Fix bug where water shot from the vac showed its type as if it were the last type of object.
+ Fix bug where puddle plorts sometimes played their splash effect on entering the Plort Market.
+ Fix bug where a Gold Slime's own plorts could trigger a Gold Slime to produce more gold plorts.
+ Fix bug where slimes could sometimes disappear from overly crowded ranch expansions.
+ Fix bug where holding a Largo or Crate, it could be placed inside a wall.
+ Fix bug where water shot from the vac floated upwards when in fresh water.
+ Fix bug where water was removed from Ponds even when the vacpack had no space.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.2.6.txt b/assets/resources/pachNotes/0.2.6.txt
new file mode 100644
index 0000000..32c77aa
--- /dev/null
+++ b/assets/resources/pachNotes/0.2.6.txt
@@ -0,0 +1,11 @@
+A small bugfix patch has arrived today. It includes the following changes:
+
+Bugfixes:
+
+ Fix bug resetting custom control settings.
+ Fix bug where some slimes were invisible underwater.
+ Fix bug where time could be put in fast-forward mode using the Emergency Return function.
+
+Changes:
+
+ Increased the potency of Scareslimes. The Scareslimes felt bad that slimes would sometimes just ignore them entirely and we're making this change in order to boost their self-esteem.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.0a.png b/assets/resources/pachNotes/0.3.0a.png
new file mode 100644
index 0000000..8042351
Binary files /dev/null and b/assets/resources/pachNotes/0.3.0a.png differ
diff --git a/assets/resources/pachNotes/0.3.0a.txt b/assets/resources/pachNotes/0.3.0a.txt
new file mode 100644
index 0000000..8d03391
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.0a.txt
@@ -0,0 +1,104 @@
+Save Compatibility
+Though we recommend starting a fresh save for the best possible experience, we have ensured that pre-version 0.3.0 saves would be compatible with version 0.3.0. However, as we’ve stated before, this won’t necessarily be the case in other future updates. There may come a time when significant changes need to be made that would make compatibility impossible.
+
+Please note: it is entirely possible that older saves will load players stuck inside new geometry, such as a mountain. This can be a strange, disorienting experience. Should that be the case, simply use the Emergency Return in the options menu.
+
+Edit: If you continue to experience save game issues on Mac, please consult this post to migrate your save games: http://forums.monomipark.com/viewtopic.php?f=5&t=2466
+
+New Zone: The Indigo Quarry
+A new, explorable zone has been added: the Indigo Quarry. The Indigo Quarry is a winding network of caves and cliffs, striated with deep purple hues from the rare minerals found within it. It was once the site of a mining project but went bust after the discovery that the rare ores it produces quickly break down in atmospheres other than that of the Far, Far Range.
+
+The quarry increases the range’s explorable space by about 50%. Future updates will expand it some and connect it to future areas in order to create a more cohesive world.
+
+New Slime: Rad Slimes
+Rad slimes can be wrangled from the Indigo Quarry. Though rad plorts are quite valuable, ranchers need to be careful to avoid rad sickness when dealing with rad slimes. When a rancher gets inside a rad slime’s rad aura, a rad exposure meter will begin to fill. Once filled, further exposure to rad auras will damage the rancher. Simply being away from rad auras for a short while will remove rad exposure.
+
+New Slime: Lucky Slimes
+A new rare slime has been added, the elusive lucky slime. Lucky slimes are a strange variant of tabby slimes that seem to have a fascination with shiny objects, particularly newbuck coins. A lucky slime gobbles up any coin it can find, giving it a distinct jingling sound as they move about.
+
+If a rancher is fortunate enough to find a lucky slime, they’ll need to be clever enough to figure out how to get at the newbucks inside a lucky slime’s bulging belly. If you’re stumped, just ask BOb.
+
+New Veggie: Oca Oca
+A staple of cooking on the range, the hearty oca oca is a naturally salty, soft spud. As the key ingredient to the always tasty 'rancher's hashbrowns' they have likely been the fuel for a great deal of slime wrangling since their discovery on the range. Look for oca oca in the quarry.
+
+New Game Mode: Five Day Rush
+A new game mode has been added, the 5-Day Rush (the standard experience is now ‘Adventure’) where ranchers try to collect as many newbucks as possible over the course of 5 days. This new game mode can be considered a test of sorts. If the community responds positively to it, other modes will be considered and the 5-Day Rush could even be expanded. We welcome your feedback.
+
+The rules and new features of the 5-Day Rush are as follows:
+
+ The rush begins at 9:00 on Day 1 and ends at 12:00 on Day 6 (5 days and 3 hours)
+ Upon completion, a score window will open allowing you to take a screenshot and share with your friends. Please do!
+ Every day, the Range Exchange’s exchange of the day will always offer 3 gold plorts in return. Don’t miss it!
+ The Plort Market does not fluctuate in 5-Day Rush.
+ You begin the 5-Day Rush with 500 newbucks.
+ Death only advances the clock 1 hour, but also removes 10% of your current newbucks.
+ Entering the ranch house still pauses time, but Starmail cannot be accessed in 5-Day Rush.
+
+New Feature: Water Tank
+A water tank is now purchasable and is the only means of collecting fresh water. This allows you the flexibility of always collecting fresh water when available, as only water can be stored in the water tank. If you had a saved game with water in another vac tank, you will find it removed. Water tanks upgrade alongside your other vac tanks.
+
+Puddle Slime Changes
+Puddle slimes have received a graphical overhaul and are now much more puddle-y. Puddle slimes are naturally very shy and this is now reflected in their behaviors. If a puddle slime is in close proximity to more than 3 other slimes, puddle or otherwise, they will not produce plorts. Puddle slimes also realize that they greatly resemble frisbees when shot from a vacpack. You can do what you will with that information.
+
+Other New Features:
+
+ Added additional Slimepedia entries, including missing entries for some chickens. No disrespect intended to chickens for taking so long on this one.
+ The title menu now offers more information about your save game and also allows you to set a handy icon for a new game. Technically you can choose other icons than a puddle slime, but why would you do that?
+ A Credits screen is now available to showcase the fine folks who made this crazy dream possible.
+ Shooting and vac-ing when near the receivers for a silo, the plort market, auto-feeders, and plort collectors now rapidly increase in speed after a moment.
+ You can now choose your vacpack grip-style when holding on to large objects like crates and largos. ‘Enable Vacpack Toggle Grip-Style’ in the options menu now locks a large object to the vac’s nozzle until you press shoot or vac again. This grip-style is reminiscent of games like Half-Life 2 and Portal and is now enabled by default.
+ Giant, craggy mountains are now all over the Far, Far Range. Not only do they add a pleasant variety to the horizon, they also limit some of the shortcuts or navigation exploits otherwise available. Generally speaking, if you see a mountain blocking something, you’re expected to find another way around, not over.
+ Gordos are now extra gordo and have improved visual effects. They’re now bordering on gordo-iest.
+ Torches now have flickering fire.
+ Distant geometry now loads in multiple stages. It also allows for distant geometry to load from further out.
+ Night-time variants of musical tracks now begin at 18:00. However only the Ranch and Reef support this feature at this time.
+ Steam Cloud Saves have been enabled. Note that on Mac, for various reasons, this meant that we needed to move the game save path. The game files should be automatically migrated.
+ Steam badges and trading cards have been added.
+ The Overgrowth and Grotto now include two-way teleporters to other areas of the range. However, the gordos blocking the other end need to be dealt with first...
+
+Balance Changes:
+
+ Prices for some vacpack upgrades and both ranch expansions have been increased.
+ Jetpack energyconsumption has been changed when mid-air. Repeatedly boosting the jetpack will result in more energy consumed than simply holding a sustained boost. This is intended to remove the exploit of the jetpack covering much greater distances than intended, as well as making it more obvious how far you can travel with a given amount of energy.
+
+Art Polish:
+
+ Added improved transparency to largos and crates when held with the vacpack.
+ Added new icons for ranch upgrades, expansions, and vacpack upgrades.
+ Added fancy new portraits for the other ranchers. I know, I want Ogden merch too.
+ Digital displays on the ranch now have a really cool LED screen effect. whatsecretshiddeninthepixelspsssshwhatareyoueventalkingabout?
+ Garden upgrades now have improved models and animations.
+ Improved ground and cliff textures.
+ Improved tree textures.
+ Improved appearance of barriers blocking Ranch Expansions.
+ Improved slime mouth rendering to show depth. Are you still reading?
+ Improved how light shines on slime body materials to increase highlight quality.
+ Improved grass animation quality.
+ Increased flower prop detail. Still reading, huh? We’re talking about flowers here.
+ Improved the visual effect for Boom Slime explosions.
+ New visual effect for Tarr death explosion. It’s prismatic and full of joy because in death, one must celebrate the tarr’s life.
+ New visual effect for player damage indicator.
+ New visual effect for water splashing on camera when water tank full.
+
+Bugfixes:
+
+ Fix bug where vacuuming items from a silo/collector at close range could leave them on the floor.
+ Fix bug where footsteps sounds weren’t playing when camera bob was disabled.
+ Fix bug where bushes and trees would appear to change size.
+ Fix bug where chicken sounds looped where they were not meant to, which also caused other issues with sounds not playing.
+ Fix bug where sleeping just before 6:00AM would cause the game to be stuck at fast-forward speed.
+ Fix bug where vac effect was not correctly visually aligned with the vac nozzle.
+ Fix bug where cave darkness could remain in place after leaving the cave.
+ Fix bug where the main menu game logo was lower resolution than intended.
+ Fix bug where using the keyboard bindings reset could block Esc from working to bring up the pause menu.
+ Fix bug which was causing gaps in shadows.
+
+
+Edit: A couple of additional bugfixes were added immediately following this release that include:
+
+ Fix bug granting jetpack access when not purchased.
+ Fix bug with elder hen and roostro Slimepedia entries.
+ Fix bug with the load game option menu.
+ Fix bug with Mac users not being able to load previous save games. If this continues to be an issue, please consult this forum post: viewtopic.php?f=5&t=2466
+
+That about wraps it up! We hope you enjoy v0.3.0 and appreciate your sharing this journey with us as we continue to develop Slime Rancher into the best game possible!
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.0b.txt b/assets/resources/pachNotes/0.3.0b.txt
new file mode 100644
index 0000000..d7af38b
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.0b.txt
@@ -0,0 +1,8 @@
+A followup patch has been issued to address a few bugs we discovered shortly after releasing v0.3.0
+
+ Fix bug where rapidly double-clicking ‘Continue’ could delete save files. We apologize if your file was deleted as a result of this bug.
+ Fix issue with puddle slime pathfinding.
+ Fix missing StarMails.
+ Fix area in the reef where players could become trapped.
+ Fix bug where Emergency Return sometimes put the player in a state requiring a second Emergency Return.
+ Adjusted text of the Largo tutorial prompt.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.0c.txt b/assets/resources/pachNotes/0.3.0c.txt
new file mode 100644
index 0000000..8df4133
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.0c.txt
@@ -0,0 +1,4 @@
+ Fix bug allowing attempting to load two games at once from the loading screen, which could delete/corrupt save games.
+ Fix reversed list of most profitable plorts in 5-day-rush.
+ Fix bug where Puddle Slimes on low graphics settings did not have eyes.
+ Increased rad slime spawn rates in the Indigo Quarry.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.1.txt b/assets/resources/pachNotes/0.3.1.txt
new file mode 100644
index 0000000..308fe40
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.1.txt
@@ -0,0 +1,21 @@
+Changes:
+
+ Improved gamepad handling. Please note that this required resetting all custom key/button bindings but should allow more types of gamepads to work with the game as well as eliminate issues with continual input (e.g. continual player spinning).
+ Added gamepad look sensitivity options under Options|Gamepad
+ The sandy area of the dry reef beyond the feral canyon is now open and has been reworked. It includes a happy little beach area where slimes like to relax. You can also access this area from the overgrowth ranch expansion.
+ The ancient slime gates and their keys scattered across the range have received an art pass. A new one can be found leading to the new beach area in the reef.
+ Fruits and veggies and fruit trees have received a lovely makeover and are now more visually distinct. The cuberry tree is now cube-shaped because science.
+ A fancy, new loading screen has been added when loading a save game. It contains secret knowledge.
+ Improved UI scaling at larger resolutions.
+ Improved some UI selection highlights.
+ Feral slimes now sport a grumpier look and have flashy, new effects for when they do their butt(?) stomp.
+ A link to the official forums and support is now available on the main menu. Join the forums and get chatty!
+ Improved chicken spawning logic in the overgrowth ranch expansion. A small number of chickens should now spawn even if you have coops filled with chickens in the overgrowth.
+ The moss blanket now has a dreamy night-time tune.
+ Added the ranch house radar indicator (toggle on with ‘R’ by default) in case you get lost.
+
+Bugfixes:
+
+ Fixed a bug where some slimes’ audio loops would continue to use resources while not audible, resulting in decreased performance for some players.
+ Fixed a bug where the splat particles when a slime hit a surface could appear much darker than intended on some platforms.
+ Fixed a bug where previously feral slimes would continue to chase players. We were convinced it was because they just wanted a hug, but it was just a bug.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.2.txt b/assets/resources/pachNotes/0.3.2.txt
new file mode 100644
index 0000000..6546cd0
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.2.txt
@@ -0,0 +1,25 @@
+Changes:
+
+ The most significant change of this update deals with performance. Many performance optimizations, especially in dealing with physics simulation have been added. This should be most noticeable for those closer to the minimum required specs. It is possible that you may notice a substantial boost in performance.
+ Full Steam Controller support added, including using the Steam binding setup.
+ Added navigation out of text input fields using a gamepad.
+ Hide the cursor on menus while using the gamepad.
+ Improved precision of movement and overall feel using the gamepad.
+ Improved the save game file format.
+ Made selection of checkboxes in the options screen more obvious.
+ Some mountains have been added to the Moss Blanket to make the zone feel more inline with the other zones. This however is not the previously mentioned update to the Moss Blanket.
+ Various environment changes to the range, including sand piles.
+ Added additional Slimepedia entries for Largos, Ferals, and Gordos.
+ Increased shadow rendering distance when on Medium shadow settings.
+ Slightly larger control explanation text on tutorials.
+ The Credits section has been renamed About and now contains additional info aside from listing some pretty cool people.
+ The Indigo Quarry now has night time versions of its musical themes.
+
+Bugfixes:
+
+ Fixed a bug where Largos and crates would sometimes leave a ghost image stuck on the camera when shot away. We apologize for anyone spooked by these ghost images.
+ Fixed a bug where the glowing effect on opening a slime door was sometimes shown reversed.
+ Fixed a bug where various foliage would pop between positions/sizes.
+ Fixed a bug where shadows on various foliage was sometimes drawn in the wrong location.
+ Fixed a bug causing Largos and crates held on the end of the vac to vibrate while moving.
+ Fixed a bug where the “Radar Toggle” and “Record Gif” button/key bindings were stored incorrectly. Note that you will need to reset any custom bindings you were using for these actions.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.3.txt b/assets/resources/pachNotes/0.3.3.txt
new file mode 100644
index 0000000..c741906
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.3.txt
@@ -0,0 +1,16 @@
+Changes:
+
+ The Pulse Wave has received an overhaul: the visuals have been greatly improved and the knockback and its effectiveness has been increased against largos and tarr.
+ Boom slime explosion logic has been improved and has greatly reduced the chances of small items escaping corral barriers when they explode.
+ An FOV slider has been added in the Video Options menu.
+ Slimes that are actively fleeing Tarrs will now attempt to break up their slime stacks, because when things go south, it's every slime for themselves.
+ Adjusted the volume and falloff of a number of sound effects.
+ The music of the Slime Sea now has a new day and night theme.
+ Adjusted a bunch of environmental props.
+ Reordered a few items in the Slimepedia.
+ Removed normal slime voice overs from ferals. It was hard to be intimidating when you sounded that darn cute.
+
+Bugfixes:
+
+ Fixed bug causing fruit and vegetables to shrivel too much when they rot.
+ Fixed bug preventing use of “w” in text fields (game name, bug reports).
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.4a.txt b/assets/resources/pachNotes/0.3.4a.txt
new file mode 100644
index 0000000..b873163
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.4a.txt
@@ -0,0 +1,13 @@
+Changes:
+
+ The Ranch house now has a new background image that changes based on the time of day.
+ The Ranch house's door now has an open/close sound effect, because silent doors are spooky.
+ Puddle slimes now blush when they become too shy to make plorts. If you're trying to picture this, your mental picture is likely not adorable enough.
+
+Bugfixes:
+
+ Fixed an issue where phosphor slimes could sometimes disappear from the Grotto or corrals with solar shields.
+ Fixed an issue where tabbies would fight over a chicken instead of the fastest one simply eating it like nature intended.
+ Fixed an issue where a slime stack would result in slime folding into themselves.
+ Fixed an issue where rad largos would become invisible when held.
+ Fixed an issue where the tutorial would become stuck.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.4b.txt b/assets/resources/pachNotes/0.3.4b.txt
new file mode 100644
index 0000000..543d968
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.4b.txt
@@ -0,0 +1,4 @@
+ Achievements are now awarded in Steam, hurray!
+ Fixed a minor layout bug in the Achievements Screen
+ Fixed some achievement description translations
+ Fixed a bug with resetting your profile
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.5a.png b/assets/resources/pachNotes/0.3.5a.png
new file mode 100644
index 0000000..428b57a
Binary files /dev/null and b/assets/resources/pachNotes/0.3.5a.png differ
diff --git a/assets/resources/pachNotes/0.3.5a.txt b/assets/resources/pachNotes/0.3.5a.txt
new file mode 100644
index 0000000..65a4347
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.5a.txt
@@ -0,0 +1,30 @@
+Changes:
+
+ The Moss Blanket has received a major overhaul! It’s about twice as big as it was previously and has a whole suite of unique art assets to make it the moody, emerald forest it always dreamed it could be.
+ Hunter slimes are now on the prowl and can be discovered within the Moss Blanket! These sly predators can utilize a natural cloaking ability and create feral largos with their plorts.
+ Improved gamepad UI-navigation on purchase/shop screens.
+ Improved gamepad UI-navigation on Load Game screen.
+ Garden depositors now simply display the icon of the food growing instead of the ‘Harvest Time’ countdown. After thorough testing and player feedback we determined the timer was confusing. Though more info may be added to it in the future.
+ Added a “Loading” step when bringing up the Load Game screen while waiting for the game summaries to load. Only really noticeable for very large sets of save files.
+ The world is now prettier and easier to see in at night thanks to a lovely rim light added to all the environmental objects.
+ The radio in Beatrix’s house now plays some catchy tunes that change throughout the day.
+ Reorganized the Gamepad Options panel
+ Water is now more effective against Tarr, though just as before, they are twice as hard to kill at night.
+ Tarrs now visibly flash red when hit. At first we thought it was because the water made them blush but then they exploded...
+ Adjusted the fill color for vac slots of various poultry to be in accordance with the International Association of Chicken in Video Games standards.
+ Added puddle and hunter slimes to the Range Exchange
+ Added ravian flocks to Moss blanket and other parts of the Range (pretty bird-like things way up in the sky)
+ Made Slimepedia Vacpack entries show gamepad-specific defaults when using the gamepad.
+ Added a sprint toggle option
+ Improved New Game panel, especially for use with gamepads.
+ Increased visibility on veggies, fruit, and chickens in the dark.
+ Made a significant optimization pass to art and level assets that should improve overall performance.
+
+Fixes:
+
+ Fixed bug where feral largos could become un-feral after a reload. The fix involves quickly but savagely insulting feral slimes on game load in order to ensure continual anger.
+ Fixed bug where the Slimepedia title was of poor quality on low graphics settings.
+ Fixed bug where New Game / Load Game screens were not responding to the B button.
+ Fixed bug where Range Exchange was not recognizing that players had progressed into new areas and continuing to request the same old stuff.
+ Fixed memory leak related to boom slimes.
+ Fixed bug vac-ing water was not playing the appropriate sound effect.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.5b.txt b/assets/resources/pachNotes/0.3.5b.txt
new file mode 100644
index 0000000..1200124
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.5b.txt
@@ -0,0 +1,2 @@
+ Fixed a bug causing feral slimes and tarr to possibly cause continual damage to the player
+ Slightly increased the spawn rates of hunter slimes in the Moss Blanket.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.5c.txt b/assets/resources/pachNotes/0.3.5c.txt
new file mode 100644
index 0000000..c18d37a
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.5c.txt
@@ -0,0 +1 @@
+"A bug was discovered that could affect the lock state of the Moss Blanket slime gate if you were playing v0.3.5 for the first time with a save file from multiple versions prior. The fix introduced in v0.3.5c will prevent this from occurring, however it will not repair this broken state for those affected by the bug already. If you have already experienced this bug, you will need to create a new save file. We apologize for the inconvenience. (Please note: v0.3.5c is not on GOG as this issue does not affect GOG save files)"
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.6.png b/assets/resources/pachNotes/0.3.6.png
new file mode 100644
index 0000000..f51efa8
Binary files /dev/null and b/assets/resources/pachNotes/0.3.6.png differ
diff --git a/assets/resources/pachNotes/0.3.6.txt b/assets/resources/pachNotes/0.3.6.txt
new file mode 100644
index 0000000..29b5056
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.6.txt
@@ -0,0 +1,18 @@
+Changes:
+
+ The crystal slime has arrived on the Far, Far Range! As dangerous as it is beautiful, the crystal slime can produce fields of searing-hot, crystal hazards if left unattended. Have some water handy!
+ Odd onions can now be found in the Indigo Quarry. A favorite of the crystal slime, these curious veggies can't be reliably grown in gardens, let alone foraged.
+ The Far, Far Range has some new areas to explore, including a distant island wrapped in mysterious, giant rings in the Dry Reef, and a volcanic cave in the Indigo Quarry that's home to the crystal slimes.
+ We've upgraded to a newer version of Unity and many players should see increased game stability and performance improvements.
+ We've also added some additional performance improvements of our own because why the heck not.
+ The tabby gordo on the beach behind the Overgrowth no longer drops a slime key. Instead it provides a teleporter to the ring island. Keys acquired from this gordo previously should now be considered ultimately useless trinkets or priceless collectibles that make you a better person for owning them, depending on your perspective.
+ Previously purchased items from shops now show up as disabled entries at the bottom of the purchase list.
+ The Moss Blanket has received some additional decorative props.
+ Items like plorts and veggies now have soft sound effects when striking surfaces. No, we didn't obtain these sound effects by throwing live chickens at a wall. Who told you that?
+ Added a numeric value to the FOV slider.
+
+Fixes:
+
+ Fixed a bug where loading random tips were hidden at some screen resolutions.
+ Fixed a bug where the purchase interface could cut off some descriptions.
+ Fixed a bug where the Range Exchange could occasionally double-count certain items. The hamster inside the Range Exchange now has a calculator.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.3.7.txt b/assets/resources/pachNotes/0.3.7.txt
new file mode 100644
index 0000000..11a0e5a
--- /dev/null
+++ b/assets/resources/pachNotes/0.3.7.txt
@@ -0,0 +1,16 @@
+Changes:
+
+ Official translations for German, Spanish, French and Russian are now available! You can change the game language on the title screen as well as in-game via Options/Other/Language.
+ A volcanic island is now explorable in the Indigo Quarry. It contains a host of crystal slimes and will be an important part of a future update.
+ Teleporters have received a visual upgrade and now have fancy animations that our fancy artist added. They even have a fancy screen that tells you where it's going.
+ Puddle slimes will now dramatically reduce their plort production when ~8 puddle plorts are nearby. This is because in addition to being very shy, puddle plorts also greatly dislike clutter. Strange slimes, those puddles.
+ A few minor adjustments to the ranch house's lamps were added.
+ Our code wizards have added a great many optimizations to rendering, especially when standing near large walls or when many objects are hidden from view. Additionally a great deal of optimizations were done to particle rendering, especially the crystal slime effects. This should all produce a substantial bump in performance for some players. Thanks, code wizards for using your magic for the good of humanity!
+
+Fixes:
+
+ Fixed bug where some hunter slimes could sometimes appear in an inactive state. We thought they were sleeping because cats tend to do that.
+ Fixed bug where games progressed thousands of days in could become unstable. And hats off to the amazing player that discovered this naturally!
+ Fixed bug where FOV would sometimes reset on game startup.
+ Fixed bug where small items launched from the back would sometimes go through the floor/walls or get stuck in them.
+ Fixed bug where carrots launched from the vacpack were sometimes more bouncy than intended. We've switched to a different produce supplier who grows less rubbery carrots.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.0a.png b/assets/resources/pachNotes/0.4.0a.png
new file mode 100644
index 0000000..8572a3b
Binary files /dev/null and b/assets/resources/pachNotes/0.4.0a.png differ
diff --git a/assets/resources/pachNotes/0.4.0a.txt b/assets/resources/pachNotes/0.4.0a.txt
new file mode 100644
index 0000000..a866e8b
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.0a.txt
@@ -0,0 +1,74 @@
+Slime Science is the biggest update ever to Slime Rancher! It’s an all-new set of features that allow you to craft gadgets and place them all over the world. This release represents a great deal of hard work from the Monomi Park team and we’re really proud of how this content expands the possibilities of Slime Rancher.
+
+But the journey doesn’t end here. You can look forward to Slime Science being expanded in future updates, as well as even more slimes, explorable zones, and more!
+
+SLIME SCIENCE
+Slime Science has a lot more added features than our typical releases, so we're breaking down the patch notes into an overview of all the new parts. Let's get started!
+
+How to Unlock Slime Science
+Slime Science can be accessed after purchasing the new Lab ranch expansion. After purchasing the Lab, a brief tutorial will begin explaining the basics of Slime Science. You can also access more Slime Science info via the new Slime Science tab in the Slimepedia.
+
+The Lab
+The Lab is a new ranch expansion containing an old barn that Hobson once converted into a homemade Slime Science lab.
+
+The Refinery
+Using advanced technology, the Refinery breaks down plorts and other resources to their molecular level, allowing them to be fabricated into various Slime Science gadgets.
+
+The Builder’s Shop
+The Builder’s Shop sells blueprints that allow you to craft gadgets. Building all sorts of gadgets is the best way to unlock new blueprints in the Builder’s Shop.
+
+Blueprints
+Blueprints allow you to craft gadgets at the Fabricator. Once you own a blueprint for a specific gadget, you can craft it as many times as you like, provided you have the necessary resources and are not exceeding the build limit.
+
+The Fabricator
+The Fabricator allows you to craft gadgets from a blueprint using resources you have stored in the Refinery.
+
+Treasure Pods
+Treasure pods are now scattered all over the range (some of them are in super-secret hiding spots!). They contain exclusive blueprints but can only be opened with a treasure cracker. Treasure crackers can be purchased from the Vacpack Upgrade Shop.
+
+Gadget Mode
+Gadget mode is a new vacpack mode that can be toggled after unlocking Slime Science. Once toggled, all the possible gadget build sites will become visible, allowing you to install any gadgets that you own. However, while in gadget mode you cannot vac or shoot.
+
+There are over 45 gadgets to unlock, with more coming in future updates. All gadgets fit into one of 5 categories:
+
+Extractors
+Extractors are a special class of Slime Science gadgets that are essential for building all other types of gadgets. Extractors include drills, pumps, and apiaries.
+
+Once placed on a build site, an extractor will begin working, collecting resources from the environment over time. Once it is full of resources, an extractor can be emptied. The best extractors can repeat this cycle multiple times before they finally break down.
+
+Utilities
+Utilities are a class of Slime Science gadgets that provide useful features to aid you in managing your ranch, as well as exploring the range.
+
+Warp Tech
+Warp tech is a class of Slime Science gadgets that allow you to harness the power of instantaneous travel. It includes teleporters that you can use to create shortcuts, as well as gadgets that allow you to transport items.
+
+Decorations
+Decorations are a class of Slime Science gadgets that allow you to decorate the world with attractive objects or recreations of natural findings from the environment.
+
+Curios
+Curios are a class of Slime Science gadgets that while functional, are not necessarily useful. Curios include toys, games, and other gimmicky gadgets that can be a great time with an equally great imagination.
+
+Changes:
+
+ The Dry Reef and the Moss Blanket have new, explorable areas. The Moss Blanket’s new area, much like previous additions to the Reef and Quarry, will be important in a future update.
+ A Vsync toggle has been added to the display options. Enabling it will prevent screen tearing but can affect framerate.
+ A new gordo has been added to the ring island in the Dry Reef.
+ A host of small improvements and beautifications have been added to various areas that may prove to be an inspiration if you have inclination to optimization.
+ Starmails that notified you of new items in the shop have been removed and replaced with pedia-style pop up notifications. Starmail will now be reserved for only the most important missives, and perhaps an occasional request for newbucks from a galactic prince.
+ Ranch expansion barriers are now more subdued from a distance to be less distracting.
+ Text adjustments have been made to all purchase interfaces, including a warning before demolishing things that have stored items, such as a silo.
+ Purchase screens no longer auto-close on purchase. With ranch tech it will allow you to instantly purchase plot upgrades.
+ The option to disable tutorials has been removed to prevent players from missing Slime Science tutorials and other future tutorials.
+
+Fixes:
+
+ Fixed bug where range exchange wasn’t including the proper items from unlocked Moss Blanket and Indigo Quarry. I think we’ve fixed this like 5 times now, so I’m already thinking about how I’ll phrase this the next time around.
+ Fixed confusing no-longer relevant bit in starmail from Thora.
+ Fixed a memory leak related to the incinerator. It was literally burning up your memory. Crazy.
+ Fixed a bug causing pop-in of large parts of the world from certain viewpoints, especially when viewing through trees. Trees hold many secrets.
+ Fixed a bug where the slime sea could occasionally become invisible on certain settings from certain viewpoints.
+ Fixed bug where tutorial popups could appear on the main menu screen after leaving a game. While we agree one should never stop learning, it was annoying.
+
+...and that about wraps up this update! Slime Science is a big, new feature with a lot of moving parts. Please help us out and report any bugs you may discover to bugs@monomipark.com and feel free to reach out to one of our support agents at support@monomipark.com should you experience any issues.
+
+We would also ask that you provide as much feedback as possible to us on our official forums, reddit, the Steam forums, or wherever Slime Rancher is discussed regarding Slime Science balance, user experience stuff, etc.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.0b.txt b/assets/resources/pachNotes/0.4.0b.txt
new file mode 100644
index 0000000..1c9b104
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.0b.txt
@@ -0,0 +1,6 @@
+A small patch was issued today to address a few issues related to the Slime Science Update:
+
+ Fixed some missing sounds that include the feral largo spawn, and the boom slime's explosion. Because boom slimes really did not need to be silent AND deadly.
+ Fixed some issues with geometry pop-in.
+ Fixed an issue with Slime Sea becoming invisible in certain narrow situations. We realize this is just more fuel for those Slime Sea deniers out there.
+ Fixed already-open treasure pods replaying their effects on reloading a game, because the party must eventually end.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.0c.txt b/assets/resources/pachNotes/0.4.0c.txt
new file mode 100644
index 0000000..011fe62
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.0c.txt
@@ -0,0 +1,7 @@
+Another small patch was issued today to address additional issues related to the Slime Science Update:
+
+ Fixed extractors sometimes resetting their timer on reloading a save file. Our best guess is they were cheating because they didn't want to explode :(
+ Fixed spam of 'blueprint available' notifications on game reload.
+ Fixed text of the "Builder's Shop" title.
+ Fixed layout issue in certain languages and resolutions on About screen.
+ Adjusted the Refinery's depositer area to more easily accept plorts. Let's all have a moment of silence for all those lost puddle plorts...
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.1.txt b/assets/resources/pachNotes/0.4.1.txt
new file mode 100644
index 0000000..07cd159
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.1.txt
@@ -0,0 +1,31 @@
+Changes:
+
+ Added fashion pod gadgets! Fashion pods allow you to shoot costumes on to your slimes. We'll give you a moment to let that sink in.
+ Added the taming bell and refinery link gadgets.
+ Added more slime lamps and gave the amber slime lamp some happy pills.
+ New icons for install/remove gadgets and remove crops.
+ Changed the Fabricate Gadget screen to keep the previously fabricated gadget selected.
+ Added an effect on the purchase screens to make it obvious when you make a purchase.
+ Added animations to the tutorial popups.
+ Added indicator to the tutorial popup when you complete the task requested.
+ Changed tutorials requiring an on-ranch action to hide themselves if you’re away from the ranch for 15 seconds.
+ Changed some tutorial timing and completion checks.
+ Adjusted treasure pod opening effect.
+ Changed the Slimepedia Vacpack tab to Tutorial and changed the entries to better mirror tutorial info.
+ Added some new treasure pods to the world. One of them is amazing.
+ Changed the colors of fill meters for the science resources.
+ Adjusted the volume for some sounds including extractor working sounds.
+ Added sound while the extractor is ready. The machines no longer dance in silence. (Whoa, that sounded way more ominous than intended).
+ Strange diamonds, royal jelly, and lava dust now randomly show up as Range Exchange rewards (rarely) after unlocking Slime Science.
+ Tweaked rare drop rates on extractors to be slightly less rare.
+
+Fixes:
+
+ Fixed bug where slimes and resources could get stuck under the ranch porch.
+ Fixed bug where some purchase buttons could be pressed via a gamepad while otherwise disabled.
+ Fixed an issue where Xbox One controllers on some versions of Windows 10 were not properly recognizing actions on the DPad.
+ Fixed bug where largos could be fired into or carried into walls in some situations.
+ Fixed bug where slime would sometimes vibrate back and forth while trying to look a particular direction. We've switched the slimes to decaf.
+ Fixed bug where the Range Exchange screen sometimes lost information at certain resolutions.
+ Fixed bug where transition between far and near versions of slimes was less smooth than intended.
+ Fixed bug where the red teleporter and warp depot were possible to unlock without acquiring the appropriate treasure pod.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.2a.txt b/assets/resources/pachNotes/0.4.2a.txt
new file mode 100644
index 0000000..72c1f25
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.2a.txt
@@ -0,0 +1,33 @@
+Changes:
+
+ Added 18 new treasure pods, many of which contain rare Slime Science resources.
+ Added 3 new fashion pods: Cute, Dandy, and Royal.
+ Added a fashion remover gadget to remove fashion pod accessories from largos and gordos.
+ Gordos can now receive fashion pod accessories! It is as awesome as it sounds.
+ Added additional nighttime music track for the radio. It's quite romantic.
+ Using new text rendering/layout library to improve clarity of text as well as line-wrapping and sizing in certain situations.
+ Made puddle slimes less likely to hang out in corners of ponds by telling them that the world is a brighter place when you are willing to mingle with others.
+ Changed puddle slime dehydration logic such that they won’t disappear due to touching other slimes while in the water.
+ Improved handling of player pushback while holding a largo, specifically around quickly turning to face a wall.
+ Added some additional decorations near the paths to the Moss Blanket and Indigo Quarry so players won't miss it.
+ Added a manual collection button to the corral’s plort collector upgrade for all those do-it-yourselfers out there.
+ Changed plort collector to always turn on for a minimum time even when no plorts are present.
+ Added a vac sound to the plort collector.
+ Game will now pause when a controller is unplugged.
+ Slightly reduced the number of required food for gordos to burst.
+
+Fixes:
+
+ Fixed bug where cuberries could end up stuck on top of their tree.
+ Fixed bug with Ball Pit achievement awarding incorrectly.
+ Fixed bugs related to the way the player moves along the edge of steep slopes - prevents some cases where the player would get caught and be unable to move forward for a few moments. No, we didn't grease all the sides of every cliff in the game. That's not even a thing.
+ Fixed bug where auto-feeder corral upgrade would sometimes not properly handle returning to the ranch, resulting in corrals with large amounts of food in them. This fix should broadly improve the experience of using an auto-feeder overall.
+ Fixed bug where Emergency Return would sometimes put the player well above or below where it was supposed to, resulting in a whole other kind of emergency, really.
+ Some Russian translation improvements.
+ Adjusted the refinery link's depositer to be more receptive.
+ Fixed bug where the vsync setting was sometimes not getting correctly initialized.
+
+Other:
+
+ Lastly, we are changing the listed minimum memory requirement for Slime Rancher from 2GB to 4GB of RAM. As we've added more and more features and areas to the game the used memory has grown somewhat over time. Additionally, we feel this better reflects the increasing amount of memory that is in use by newer versions of Windows, which use quite a bit of the system memory at all times.
+ In short, if you've been able to run Slime Rancher, nothing will change.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.2b.txt b/assets/resources/pachNotes/0.4.2b.txt
new file mode 100644
index 0000000..e809873
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.2b.txt
@@ -0,0 +1 @@
+We discovered a bug that caused old treasure pods to close again following the release of v0.4.2 and have issued a fix. If you have a save file with the pods re-closed you simply have to open them again if you wish to have all pods opened. This will not cause any other issues with your save file. All blueprints you had previously received will remain available to you.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.2c.txt b/assets/resources/pachNotes/0.4.2c.txt
new file mode 100644
index 0000000..42031b2
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.2c.txt
@@ -0,0 +1 @@
+Another bug related to treasure pods was discovered that required another quick patch. You may experience certain pods are re-closed., but just as before, this should not negatively impact your game in any way.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.2d.txt b/assets/resources/pachNotes/0.4.2d.txt
new file mode 100644
index 0000000..d714d4f
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.2d.txt
@@ -0,0 +1,6 @@
+Another series of issues were discovered that we deemed worth a quick patch. This includes:
+
+ Significantly reduce memory usage by game music (roughly 650 MB savings!). For those of you that just barely met the minimum requirements, you should see a significant performance boost.
+ Fix rad poisoning text not updating
+ Fix warp depot display text/bar not updating
+ Fix flowers in Moss Blanket having turned yellow. Our best guess is that the winds were strong on our local build and blew some seeds over from the Ruins :)
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.3a.txt b/assets/resources/pachNotes/0.4.3a.txt
new file mode 100644
index 0000000..1e725f7
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.3a.txt
@@ -0,0 +1,14 @@
+Changes:
+
+ Resources can now be vac'd out of autofeeders for those indecisive ranchers.
+ The game name for new games now supports any character (including spaces and special characters) and can be up to 24 characters long. (Note: The filename used to store the save now takes the form of {timestamp}_{gamenamelettersandnumbers} )
+ Changed the way the load game screen is populated. It should be slightly faster now when you have a very large number of saves, provided they are saved with the newest format.
+
+Fixes:
+
+ Fixed bug where clicking back/cancel from emergency return warning popup did not allow you to navigate the pause menu with a controller.
+ Fixed bug where med station could sometimes overfill the health bar.
+ Fixed bug where the Invalid Format warning in the Load Game menu would show text exiting the boundaries of the Load Game window and the buttons would be sized inappropriately.
+ Fixed missing level geometry on ledge near honey gordo.
+ Fixed missing level geometry causing a gap in Moss Blanket.
+ Fixed bug sometimes allowing you to interact with the scene after starting emergency return and causing strange time loops (technical term).
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.3b.txt b/assets/resources/pachNotes/0.4.3b.txt
new file mode 100644
index 0000000..e141bfa
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.3b.txt
@@ -0,0 +1 @@
+A small patch has been issued to address issues with save file compatibility by improving the handling of certain types of corrupted saved data files so that they are properly shown as invalid on the load menu.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.4.3c.txt b/assets/resources/pachNotes/0.4.3c.txt
new file mode 100644
index 0000000..3ab6a01
--- /dev/null
+++ b/assets/resources/pachNotes/0.4.3c.txt
@@ -0,0 +1,4 @@
+A fix was issued to address a bug that was potentially corrupting save files. You can read more about it here:
+viewtopic.php?f=3&t=3790
+
+And if you haven't been following Monomi Park's Twitter or blog, here's a sneak peek of the quantum slimes and the mysterious ruins they inhabit coming in v0.5.0!
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.5.0a.png b/assets/resources/pachNotes/0.5.0a.png
new file mode 100644
index 0000000..39ef768
Binary files /dev/null and b/assets/resources/pachNotes/0.5.0a.png differ
diff --git a/assets/resources/pachNotes/0.5.0a.txt b/assets/resources/pachNotes/0.5.0a.txt
new file mode 100644
index 0000000..ba3849e
--- /dev/null
+++ b/assets/resources/pachNotes/0.5.0a.txt
@@ -0,0 +1,29 @@
+Changes:
+
+ The Ancient Ruins is a new zone located between the Moss Blanket and Indigo Quarry. It contains a new slime, resource, and other secrets to discover. This zone will also serve as the key to accessing the Glass Desert in a future update. The Ancient Ruins is very different form other zones in Slime Rancher and ranchers can easily get lost within its twisting passages if they're not careful. Travel safely!
+ The quantum slime is native to the ancient ruins and can emit other possible realities of itself, merging with one of those realities when agitated. Ranchers will need to keep a close eye on these slimes on the ranch, and make sure that eye is actually on the real quantum slime!
+ Phase lemon trees are another strange product of the Ancient Ruins: a fruit tree that echoes across multiple realities, only half present in any one at a time. Though quantum slimes love its fruit, it will need some sort of binding agent in order to harvest those enigmatic lemons into our reality.
+ Echoes are a new collectable item found tucked away in the Ancient Ruins. These little motes of light are often used by ranchers as decorations, though their origins remain a mystery. Echoes can be found daily in the many corners or the Ancient Ruins, or extracted with resource extractors.
+ New achievements have been added
+ 6 new deco gadgets have been added featuring beautiful art from the Ancient Ruins.
+ 12 new treasure pods have been added: get hunting!
+ Renamed Slime Quality to Model Quality and Water Quality to Shader Quality to better reflect those settings' usage in the game.
+ Slime agitation now reduced more by eating, especially eating favorite foods.
+ Hunter largos that get sufficiently agitated will revert to their feral form. Watch out!
+ Adjusted prices of Hunter and Crystal Plorts to be a little more valuable, matching those of quantum plorts. These three slimes now represent the 'fourth tier' of slime difficulty.
+ Improved some CPU efficiency items.
+ Improved efficiency of grass mesh. That's right, here at Monomi Park even our grass is efficient.
+ Updated version of Input library, which is related to gamepad inner workings.
+ Puddle plorts are not longer requested or rewarded in the Range Exchange.
+
+Fixes:
+
+ Fixed bug where music could sometimes be stuck playing for an area you had just entered and then left.
+ Fixed bug where starting to vac fruits and veggies but stopping while they were still vibrating would still cause them to come loose.
+ Fixed bugs relating to vac-ing veggies out of the ground.
+ Fixed bug where it was sometimes possible to vac items through a wall.
+ Fixed bug where Tarrs placed on Slime Stage could quickly escape. Maybe it wasn't a bug though and deep down, tarrs are just really shy.
+ Fixed bug where Honey slimes and plorts were not properly included in Range Exchange.
+ Fixed bug with appearance of slime mouths being off-color.
+
+...and that's it! We hope you really enjoy this new update and we look forward to hearing all about your adventures in the Ancient Ruins!
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.5.0b.txt b/assets/resources/pachNotes/0.5.0b.txt
new file mode 100644
index 0000000..76f3608
--- /dev/null
+++ b/assets/resources/pachNotes/0.5.0b.txt
@@ -0,0 +1,11 @@
+A patch was issued today to fix some bugs following the release of v0.5.0:
+
+ Fixed bug where quantum plort was not shown on the Refinery screen.
+ Fixed bug where quantum slimes could escape the grotto to above the ceiling.
+ Fixed bug where quantum slimes would intentionally escape directly to the Slime Sea. It is unclear if one day they would return as hardened, salt-crusted pirates, but we just weren't going to take that chance.
+ Fixed bug where pink quantum largos would eat quantum plorts but not boom plorts.
+ Fixed bug where quantum crystal largo would appear pink while rolling.
+ Fixed bug where quantum largos were not transparent went[sic] held on the vac.
+ Fixed bug where water was not going in through corral walls.
+ Fixed bug where fashion pods were not going in through corral walls.
+ Fixed bug where echoes were showing as 'Echoes' when targeted instead of the specified type (e.g. 'Red Echo')
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.5.1a.png b/assets/resources/pachNotes/0.5.1a.png
new file mode 100644
index 0000000..31206af
Binary files /dev/null and b/assets/resources/pachNotes/0.5.1a.png differ
diff --git a/assets/resources/pachNotes/0.5.1a.txt b/assets/resources/pachNotes/0.5.1a.txt
new file mode 100644
index 0000000..9d4aa1b
--- /dev/null
+++ b/assets/resources/pachNotes/0.5.1a.txt
@@ -0,0 +1,67 @@
+ The 7Zee Rewards Club
+
+The 7Zee Rewards Club is a new feature that rewards highly successful ranchers with unique rewards. Starting at noon on day 7 you’ll receive a starmail form 7Zee introducing you to the rewards club. You must read the starmail in order to unlock the rewards club. Each tier of the rewards club costs increasingly larger amounts of newbucks to unlock, but comes with a unique reward. These rewards are generally prestigious, signifying your success in the world of slime ranching, including visual upgrades for your ranch, color customization features, slime toys, and more. The highest tier rewards will cost enormous sums of newbucks to acquire.
+
+Please note that while these rewards are intended to be expensive (especially in the final third), we don’t wish to make them completely unobtainable for all but a small group of players. So please visit this thread linked below and provide us with feedback on the costs of the rewards club. The prices could absolutely change in a future patch if the community feels strongly about it.
+
+viewtopic.php?f=3&t=4198
+
+
+ Chroma Packs
+
+Chroma packs are color customization items obtainable through the 7Zee Rewards Club, making up about half of the total rewards available. Once unlocked, a chroma pack station can be found on the side of the ranch house. As each new set of chroma packs are unlocked via the 7Zee Rewards Club, they can be assigned to your ranch house, ranch tech, and vacpack at no charge and as often as you like.
+
+The rarest chroma packs are only obtainable by reaching the end tiers of the 7Zee Rewards Club.
+
+ Slime Toys
+
+Slime toys give your slimes fun toys to play with, soothing their agitation like a music box. A slime toy shop is unlocked via the 7Zee Rewards Club and features a stock of basic slime toys, with more advanced options being unlocked at a later rewards rank.
+
+Slime toys reduce slime agitation when a slime is near them, making it a handy object to drop into a corral. However, each slime has a favorite toy which reduces agitation even further. The calming effect from slime toys stacks with the music box corral upgrade, but does not stack with other slime toys. If multiple toys are near a slime, a slime will always receive the best possible bonus from the toys, so feel free to mix and match.
+
+ Hobson and Letters from Home
+
+New story elements have been added. You will now find journals left behind by Hobson Twilgers, the former owner of Beatrix’s ranch, all over the world. These journals provide a little backstory on Hobson, or offer the occasional helpful tip or observation.
+
+Additionally, you will now receive occasional starmails from Casey, someone important to Beatrix whom she left behind back on Earth. While there is plenty to read in this update, both Casey and Hobson’s story will be completed in a future update.
+
+ The Docks
+
+The Docks is a new ranch expansion accessible behind the Overgrowth. It contains a fresh water pond and waterfall, four empty ranch patches, a beautiful seaside view, and a bunch of fishing nets that you can use to snare wayward slimes. It also contains a secret feature…
+
+ Gordo Snares
+
+Gordo snares are a new series of Slime Science gadgets that you can use to catch your own gordos! Simply place one down and shoot food into the snare as your bait. If you’re lucky (and patient), you might snare the gordo you desire. And while these gordos will offer a few rewards upon bursting, we have the feeling most of you will be using snares to acquire some large buddies to hang out on your ranch.
+
+More advanced snares will be available in future updates.
+
+Additional Features:
+
+ Added a new Echo Net gadget that allows you to collect echoes from the ruins over time. It is hidden inside a treasure pod somewhere in the ruins.
+ The auto-feeder corral upgrade now has 3 speed settings. You can change these setting via a button on the auto-feeder.
+ Tank Booster Ultra is now available deep into the 7Zee Rewards Club. It allows you to store 100 units in each vac tank!
+ Starmail now has an unread mail notification showing you how many unread mails you still need to read. Hopefully it doesn’t cause as much anxiety as the one you stare at in real life, reminding you that you should be replying to those emails instead of reading Slime Rancher patch notes.
+ Coop high walls are now more obviously upgraded, visually.
+ Reduced the slowdown when fabricating several gadgets in quick succession.
+ The plort collector’s manual button now animates. I know right? Way to bury the lead in these patch notes.
+ A few new achievements added from 7Zee Rewards Club stuff.
+ Updated ruins music tracks with higher quality version to remove some audio artifacts. Or alternatively, we procured some artifacts form the ancient ruins. Oooh.
+ The starmail interface has received some visual improvements and readability changes.
+ Extractor rare resource drop rates have been doubled.
+
+Fixes:
+
+ Fixed bug where especially agitated hunter largos responding to the taming bell would immediately turn feral again.
+ Fixed RadTabbyLargo and QuantumTabbyLargo mouths.
+ Fixed RadHunter and QuantumHunter eyes.
+ Fixed bug where some extractor production rates were slightly lower than intended.
+ Fixed texture on pillar on volcano island
+ Fixed a scrolling issue on the fabricate gadget screen.
+ Fixed bug where Quantum Crystal Largo wasn’t going after plorts properly.
+ Fixed bug where it was sometimes possible for the music to switch to the Ranch tracks inexplicably. Not gonna lie, it was a ghost.
+ Fixed some issues with slimes not having eaten while you slept.
+ Fixed bug where bold text was not bold.
+ Fixed Beatrix’s last name spelling on Range Exchange email.
+ Fixed the placement of a few mountains in overgrowth
+ Fixed bug where rock slimes sometimes didn’t damage player if they were stationary.
+ Fixed bug where ferals could sometimes launch items through corral walls.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.5.1b.txt b/assets/resources/pachNotes/0.5.1b.txt
new file mode 100644
index 0000000..1e078c6
--- /dev/null
+++ b/assets/resources/pachNotes/0.5.1b.txt
@@ -0,0 +1,3 @@
+ Fixed bug where Pink Quantum Largos would eat Quantum plorts.
+ Fixed bug where Gordo Snares could sometimes have their bait disappear.
+ Fixed bug where slimes could disappear from the Docks while you slept. Perhaps they had gone out to sea?
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.5.1c.txt b/assets/resources/pachNotes/0.5.1c.txt
new file mode 100644
index 0000000..ec3da91
--- /dev/null
+++ b/assets/resources/pachNotes/0.5.1c.txt
@@ -0,0 +1,6 @@
+ Capped 7Zee Rewards Club level prices at 150k, reducing costs at the very high end of the rewards club.
+ Puddle plorts no longer pop on touching slime toys, such as adorable rubber duckies.
+ Fixed bug where you could pick up Gordo Snares with the gordo on them and reuse the snare.
+ Fixed bug where you could re-add bait to an already baited Gordo Snare.
+ Fixed rendering issue with Hobson journals and water.
+ Fixed a fail to load game bug that could sometimes happen when saving games from very old profiles.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.6.0a.png b/assets/resources/pachNotes/0.6.0a.png
new file mode 100644
index 0000000..035b630
Binary files /dev/null and b/assets/resources/pachNotes/0.6.0a.png differ
diff --git a/assets/resources/pachNotes/0.6.0a.txt b/assets/resources/pachNotes/0.6.0a.txt
new file mode 100644
index 0000000..6466465
--- /dev/null
+++ b/assets/resources/pachNotes/0.6.0a.txt
@@ -0,0 +1,69 @@
+Slime Rancher v0.6.0 has arrived! This is the biggest Slime Rancher update to date, containing multiple new slimes, a huge, new zone, new gadgets, art polish, and much more.
+
+This is the last major Slime Rancher update before v1.0.0, which will mark the end of Early Access on PC and Game Preview on Xbox. Slime Rancher v1.0.0 will be a much smaller update, focusing on fixes, concluding Adventure Mode, and a couple other surprises.
+
+But that’s not the end of your adventures on the Far, Far Range! Following v1.0.0 we’ll be continuing to update Slime Rancher with new, unexpected content.
+
+So without further ado, here’s the major features in Slime Rancher v0.6.0:
+
+The Glass Desert
+The Glass Desert is the biggest and most challenging zone we’ve ever added to Slime Rancher! Featuring new slimes, resources, and unique challenges, the Glass Desert has something for every rancher brave enough to explore its sweeping dunes and secret ruins.
+
+Firestorms
+The monolithic glass structures in the Glass Desert can cause a terrifying phenomenon known as firestorms. Believed to be a sudden disruption of heat from below the surface, firestorms produce massive fire columns and expel flaming crags of debris. If you’re exploring the desert when a firestorm goes off, it’s best you take cover!
+
+Oases
+In order to fully explore the Glass Desert and collect all the slimes and resources within it, you’ll need to bring life back to it in the form of oases. Oases protect you from the harmful effects of firestorms, but you’ll first need to bring them to life before you can harness them. Search the ruins within the desert…
+
+Mosaic Slimes
+The mosaic slime gets its name from the glittering array of glass tiles that cover its body. This glass produces a similar anomaly to those found in the desert itself, making the mosaic slime beautiful, but quite dangerous.
+
+Dervish Slimes
+A dervish slime is a swirling, whirling bundle of energy in slimy form. Dervish slimes are commonly found in the Glass Desert, cruising across its dusty dunes at high speed atop little whirlwinds. Just don’t let them get too agitated, they have a lot of emotions swirling around inside them that might wreak havoc on your ranch.
+
+Tangle Slimes
+Though the tangle slime may look innocent with its wide smile and colorful flower atop its head, it's actually a fearsome predator with a big appetite for tasty meat. The tangle slime earned its name from the twisting vines that it can produce to grab things in the environment. It also can produce a noxious pollen that makes slimes sneeze! It’s adorable but makes them quite agitated.
+
+Fire Slimes
+Fire slimes are a rare breed of slime that lives on ash. Fire slimes will eat just about any food, but not without it being burned into ash first. The only way to feed a fire slime is to use an incinerator with an ash trough upgrade.
+
+New Resources
+The silver parsnip, prickle pear, and painted hen and chicks can now be collected in the Glass Desert, the new favorite foods of the mosaic, dervish, and tangle slimes. Three new Slime Science resources have been added that can be found with extractors in the Glass Desert: Silky Sand, Glass Shard, and Pepper Jam.
+
+Other Changes:
+
+ Starmails from Casey have been overhauled to reduce feelings of clinginess, be less dramatic, and fit more with the tone of the game. However, the conclusion to the story remains unchanged.
+ The Ancient Ruins have been expanded to connect to the Glass Desert via a special mechanism.
+ A beautiful, new skybox has been added that includes dawn and dusk lighting and real time cloud formations. And the moon! Let me tell you, it's the best.
+ Garden crops now have a grow-in animation because they saw how fancy the new skybox is and were like, ‘come on Monomi Park! Gimmie some love here.’
+ Torches have new fire effects.
+ New achievements have been added.
+
+ New Slime Science gadgets have been added, including more teleporters and warp depots, a potted tactus, more gordo snares, Glass Desert deco, and other advanced versions of existing gadgets.
+ New 7Zee Rewards Club rewards have been added to existing ranks, including the handy Market Link, Ultra Dash Boots, and the Golden Sureshot.
+ Two new gordos have been added to the Moss Blanket and Indigo Quarry. One of them is quite mad. There’s also some new ones in the Glass Desert!
+ Gordo eat requirements have been reduced. Or has their food simply become more fattening? No one can say for sure.
+ Vacpack Upgrades obtained via the 7ZRC now show up in the Vacpack Upgrade shop as ‘sold out.’
+ Gold plorts can now be deposited into the Refinery. I wonder why…?
+ Extractor rare item drop rates have been increased across all extractors.
+ Quantum slimes can no longer merge with a ghost in a foreign corral. The purpose of this change is to make quantum slimes a little easier to manage. They can still ghost out of their own corral, but will never ghost into another corral on your ranch.
+ Fabricated teleporters now show their destination like static teleporters.
+ Plort icons on the Plort Market are now de-emphasized if you haven’t discovered their zone of origin yet.
+ Small tweaks to Options UI layout to better accommodate various languages.
+ The incinerator has received a visual overhaul and has a new upgrade, the ash trough, that is used for corralling fire slimes.
+
+Bugfixes:
+
+ Fixed bug where saving before getting Thora’s first Range Exchange offer would immediately give you said offer on game load.
+ Fixed bug where flying phosphor slimes only moved north east. The great phosphor slime migration has finally ended and they are now free to fly wherever they wish.
+ Fixed bug where slimes present on the Ranch would be hungry and agitated despite plentiful food available in their corral. Hallelujah!
+ Fixed bug where dash boots were not nearly as efficient as advertised. Efficiency increased and advertisement reduced to meet in the middle.
+ Fixed bug where honey plorts weren’t always considered extra-tasty by slimes. Tastyness has now been increased by 34.68 tastigrams.
+ Fixed bug where some achievements could re-announce their awarding on game reload.
+ Fixed bug where puddle slimes would sometimes disappear when leaving them alone, especially on the Docks.
+ Fixed issues with puddle slime movement.
+ Fixed bug where sound effects could continue to play while the game was paused or the player was in the house.
+ Fixed bug where the rad camera effect could sometimes be disabled while inside a rad aura.
+ Fixed a bug where vac-ing a non-tabby largo would give them tabby stripes. How did we not catch this sooner???
+
+That wraps up v0.6.0! We hope you enjoy this update and the unique features it offers. Slime Rancher has been quite a journey for us and we’re excited to soon be leaving Early Access and into official release, and then the exciting content that follows!
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.6.0b.txt b/assets/resources/pachNotes/0.6.0b.txt
new file mode 100644
index 0000000..772915b
--- /dev/null
+++ b/assets/resources/pachNotes/0.6.0b.txt
@@ -0,0 +1,15 @@
+June 14, 2017 A small patch was issued today to address some issues related to the Glass Desert Update release:
+
+ Reduce skybox cloud complexity on lower graphics settings to boost performance
+ Replaced a broken treasure pod that awarded nothing with one that awards gold plorts. Since some of you may have already opened this pod, we added another treasure pod in the desert with gold plorts too :)
+ Added some additional resources in the Glass Desert to make the introductory experience a little smoother
+ Adjusted some colliders to prevent clipping issues
+ Adjusted a few decorative objects in the Glass Desert
+ Increased the time between firestorm breakouts in the desert
+ Fixed incorrect favored-by listings for Silver Parsnip and Prickle Pear
+ Fixed missing description for Prickle Pear
+ Fixed bug causing music not actively being used to use much more memory than necessary, which could have lead to performance problems and crashes.
+ Fixed bug where tutorial radar markers could get stuck.
+ Fixed bug where you could re-vac ancient water blobs (and water blobs) shot from the vac.
+ Fixed some bugs with distant geometry (LOD/Proxy bugs)
+ Fixed a bug causing fire slimes to not periodically spawn during firestorms. See, they’re not entirely a bad thing.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.6.0c.txt b/assets/resources/pachNotes/0.6.0c.txt
new file mode 100644
index 0000000..d28ac44
--- /dev/null
+++ b/assets/resources/pachNotes/0.6.0c.txt
@@ -0,0 +1,15 @@
+A small patch was issued today to address some additional issues related to the Glass Desert Update release:
+
+ Changed some desert terrain slightly to improve player movement.
+ Rotated one mosaic plort statue to be more accessible
+ Added a few more decorative objects in desert to help make different areas a little more identifiable.
+ Made firestorm effects and music remain active in more areas of the desert.
+ Made firestorm effects timing more precise.
+ Updated the Main Menu to use the new skybox.
+ Improved chicken efficiency to improve performance. And because an efficient hen hen is a happy hen hen.
+ Added two new places to build Slime Science gadgets within the desert.
+ Fixed bug where some tangle slime statues would reset to being unfilled on game reload.
+ Fixed bug where fruit on garden trees could sometimes appear too low on the tree.
+ Fixed bug where garden patches could sometimes end up with no crop but not allow the next crop to be planted.
+ Fixed bug where small items around the oasis plant would rest just under the visible ground.
+ Fixed typo in one of Ogden's Range Exchange greetings.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/0.6.0d.txt b/assets/resources/pachNotes/0.6.0d.txt
new file mode 100644
index 0000000..85c556f
--- /dev/null
+++ b/assets/resources/pachNotes/0.6.0d.txt
@@ -0,0 +1,11 @@
+A small patch was issued today to address some additional issues related to the Glass Desert Update release:
+
+ Fixed an XBox-specific bug where buttons around scrolling areas on the main menu could sometimes appear garbled.
+ Fixed bug where some slime toys' effect area was smaller than intended.
+ Fixed bug where the Quantum Mosaic Largo's mosaic shell was sometimes entirely hidden within its body.
+ Fixed bug where sound would sometimes cut out after too much time around Dervish Slimes.
+ Fixed bug where returning to Largos in a corral with an auto-feeder and plort-collector would sometimes not produce all of the proper plorts.
+ Fixed bug where Diversification achievement was not properly counting Largos across all parts of the Ranch.
+ Fixed bug where carrots and parsnips would sometimes become stuck against corral posts.
+ Optimized some textures for a minor memory usage improvement.
+ Optimized some object management for a minor CPU usage improvement.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/1.0.0.png b/assets/resources/pachNotes/1.0.0.png
new file mode 100644
index 0000000..656606e
Binary files /dev/null and b/assets/resources/pachNotes/1.0.0.png differ
diff --git a/assets/resources/pachNotes/1.0.0.txt b/assets/resources/pachNotes/1.0.0.txt
new file mode 100644
index 0000000..7f85e9f
--- /dev/null
+++ b/assets/resources/pachNotes/1.0.0.txt
@@ -0,0 +1,38 @@
+Slime Rancher v1.0.0 marks the end of our early access development and shifts into our official launch. For everyone at Monomi Park, it has been an incredible journey building Slime Rancher as you play it, and we are very grateful for the support you have shown us over the last year and a half.
+
+But this is not the end of your adventures on the Far, Far Range! Slime Rancher will continue to receive content updates that you can read more about on our roadmap: viewtopic.php?f=3&t=448
+
+Slime Rancher v1.0.0 is a small patch designed to tie up a few loose ends with the existing game and offer some closure to the current iteration of Adventure mode.
+
+Changes:
+
+ Added the final Hobson journal nodes and Casey starmail to Adventure Mode. Reading both is required for ‘completing’ Adventure Mode.
+ Added a small new area to the end of the Glass Desert where the Hobson journals are located.
+ Added two new achievements.
+ Added a small surprise for players that complete Adventure Mode and view credits sequence.
+ Adjusted garden logic so that gardens will never despawn themselves mid-harvest. They will always wait to mature their crops and leave them on the ground before despawning.
+ Beatrix is now viewable on the title screen and in her house. Hello, Beatrix!
+ Added a button to re-watch the credits on the About screen. You must have completed Adventure Mode in order to access this feature.
+ Added logo and game splash screens at beginning of game load.
+ Optimized the handling of some music and sounds to reduce memory usage.
+ Optimized some textures to reduce memory usage.
+ Optimized some object management to slightly improve CPU usage.
+ Optimized snack layout in Monomi Park pantry to improve kitchen usage.
+ Improved overall balance between music tracks.
+ Improved sound effects for picking a fruit/veggie from tree/ground.
+ Made adjustments to the About page credits to showcase all the wonderful people that have contributed to Slime Rancher even though it still means leaving out people that didn’t work on it directly but made it all possible- oh Elizabeth I love you so much.
+ Adjusted some geometry around the Range to prevent objects getting stuck, reduce pop-in, and prevent other strange interactions.
+ Removed the early access version watermark from the in-game HUD and it was surprisingly cathartic.
+ Adjusted text spacing in the Slimepedia.
+ Added some planks on the pathway to the Lab. Because all great science begins with the path forged from the great science before it.
+
+Fixes:
+
+ Fixed bug sometimes resulting in becoming stuck in the Ranch House when sleeping with Tarr around the Ranch.
+ Fixed bug sometimes resulting in certain fruits and veggies falling through the floor.
+ Fixed bug where Mosaic slimes still produced and managed glints while far away from the player.
+ Fixed some layout issues on the purchase interface in some languages
+ Fixed some layout issues with the Bug Reporting screen.
+ Fixed bug where a spring pad would respond to an echo repeatedly even though it would not launch it.
+ Fixed bug where extractor sounds were sometimes not played.
+ Fixed a gap in the geometry with the Upgraded Lab entrance.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/1.0.1a.png b/assets/resources/pachNotes/1.0.1a.png
new file mode 100644
index 0000000..b090956
Binary files /dev/null and b/assets/resources/pachNotes/1.0.1a.png differ
diff --git a/assets/resources/pachNotes/1.0.1a.txt b/assets/resources/pachNotes/1.0.1a.txt
new file mode 100644
index 0000000..5a63775
--- /dev/null
+++ b/assets/resources/pachNotes/1.0.1a.txt
@@ -0,0 +1,40 @@
+Slime Rancher v1.0.1, The Navigation Update, has arrived! This updates includes the much-requested map feature and a few other goodies, as well a bunch of fixes and optimizations.
+
+Changes:
+
+ Added a map interface that gives you a general sense of where you are on the Far, Far Range. Map zones are unlocked after activating map data nodes in each zone. The map will also tracked any teleporters or extractors you’ve placed, and give you a total count of slime keys and treasure pods collected in each zone.
+ Optimized tracking of distant areas of the world to improve overall performance.
+ Added slime toys for the fire, mosaic, dervish, and tangle slimes.
+ A single gilded ginger now grows once a day in the Glass Desert but can be very difficult to find. Gilded ginger is the only veggie a gold slime will eat, providing extra plorts for those that manage to feed one. And while it can’t be grown in a garden, it can be used to [REDACTED]
+ Added a treasure pod behind the barn in the Lab to give new players a head start in building their first teleporter.
+ Added some new tabby slime sound effects when they steal an item.
+ Added intro text when starting a new save file in Adventure Mode.
+ Adjusted extractor cycle time from 22 hrs to 12 hrs. Please note that the 10 hours we removed did not go to waste and were recycled.
+ Ponds now produce infinite water, much like water sources in the wild.
+ Gardens now produce infinite harvests! In order to plant a new crop, you must select to replant from the garden menu.
+ Added Return teleporters to Hobson vaults after watching a few streams where players met untimely deaths in the vaults and lost their gold plorts and Nick almost cried for them.
+ Added water tutorial message on purchasing the water tank.
+ Adjusted Incinerator trough to prevent fire slimes despawning in the trough. As a note, an empty ash trough will not despawn a fire slime, though it will not feed them either.
+ Odd onion crops on the ranch will now produce a minimum of 4 odd onions, but generally 6-8 of them.
+ Shooting a chickadoo at a gold slime will now knock plorts out of it like other resources. As a note, chickadoos have stated that they are really not cool with this change.
+ Starmail popups now disappear once you’ve read the mail.
+ Reduced time ranch-specific tutorials stay on screen after leaving the ranch.
+ Optimized occlusion culling.
+ Optimized lighting where a near-zero intensity directional light was being unnecessarily processed on the GPU.
+ Optimized some miscellaneous memory usage.
+
+Fixes:
+
+ Fixed bug where some players’ progress at opening slime gates and the plort puzzle door was not being tracked properly and affected their receiving certain Casey mails.
+ Fixed bug where you could vac fruit off a tree from an angle and get them shaking but not ever popping off.
+ Fixed some issues with the French translation.
+ Fixed bug where slimes were not turning into largos properly while sleeping at night.
+ Fixed bug where some new sounds could play when sleeping at night or after being knocked out.
+ Fixed bug where some sounds would play right as the ranch initially loaded in. Fun fact: this quirk has always persisted on the dev side and any time we test the game we hear the crickets chirping sound effect for a moment. Now when I hear crickets in real life I think of our editor.
+ Fixed bug where unripe phase lemons could fall through the world when their tree phased away.
+ Fixed bug where Dervish Gordo’s key could spawn into the ground.
+ Fixed a floating platform in the Glass Desert.
+ Fixed bug where Beatrix was being stretched when viewed at different aspect ratios.
+ Fixed bug where the Humble installer was not fully replacing certain files from an existing installation.
+ Fixed bug where some geometry would allow the player to get too close and see inside the walls. If any player claims they saw enslaved gnomes inside these walls building our levels, they are LYING.
+ Fixed bug where Pause Menu could interfere with other in-game UIs on Xbox.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/1.0.1b.txt b/assets/resources/pachNotes/1.0.1b.txt
new file mode 100644
index 0000000..3de0f0c
--- /dev/null
+++ b/assets/resources/pachNotes/1.0.1b.txt
@@ -0,0 +1,3 @@
+A follow-up patch was issued to address a bug where oases in the Glass Desert were being reset.
+
+If you have a save file where oases were already reset, you will simply need to re-water the oases with ancient water. We apologize for the inconvenience.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/1.0.1c.txt b/assets/resources/pachNotes/1.0.1c.txt
new file mode 100644
index 0000000..bd1560f
--- /dev/null
+++ b/assets/resources/pachNotes/1.0.1c.txt
@@ -0,0 +1,6 @@
+A small patch was issued to address a few lingering bugs form the v1.0.1 update:
+
+ Charcoal bricks are no longer incinerated by incinerator.
+ Fixed bug where painted chicks did not award the 'You Monster' achievement
+ Fixed gadget markers in Glass Desert map displaying upside down.
+ Fixed bug where slimes could occasionally eat plorts through a pen wall while sleeping until morning, resulted in unexpected largos.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/1.0.1d.txt b/assets/resources/pachNotes/1.0.1d.txt
new file mode 100644
index 0000000..14d87e1
--- /dev/null
+++ b/assets/resources/pachNotes/1.0.1d.txt
@@ -0,0 +1,4 @@
+A small patch was issued to address a few lingering bugs form the v1.0.1 update:
+
+ Fixed bug where during sleep or when returning to a ranch, largos sometimes produced only one type of plort.
+ Fixed bug where gadget map icons were not clearing properly from the map when the gadgets were picked up/demolished.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/1.0.1e.txt b/assets/resources/pachNotes/1.0.1e.txt
new file mode 100644
index 0000000..5364c0b
--- /dev/null
+++ b/assets/resources/pachNotes/1.0.1e.txt
@@ -0,0 +1 @@
+Fixed bug where fruits/veggies could sometimes not be vac'd off of trees/out of patches after reloading a game.
\ No newline at end of file
diff --git a/assets/resources/pachNotes/1.1.0a.png b/assets/resources/pachNotes/1.1.0a.png
new file mode 100644
index 0000000..ec90d95
Binary files /dev/null and b/assets/resources/pachNotes/1.1.0a.png differ
diff --git a/assets/resources/pachNotes/1.2.0a.png b/assets/resources/pachNotes/1.2.0a.png
new file mode 100644
index 0000000..cae9dcf
Binary files /dev/null and b/assets/resources/pachNotes/1.2.0a.png differ
diff --git a/assets/resources/pachNotes/1.2.1a.png b/assets/resources/pachNotes/1.2.1a.png
new file mode 100644
index 0000000..386a62e
Binary files /dev/null and b/assets/resources/pachNotes/1.2.1a.png differ
diff --git a/assets/resources/pachNotes/1.2.2.png b/assets/resources/pachNotes/1.2.2.png
new file mode 100644
index 0000000..eb86bb6
Binary files /dev/null and b/assets/resources/pachNotes/1.2.2.png differ
diff --git a/assets/resources/pachNotes/1.3.0a.png b/assets/resources/pachNotes/1.3.0a.png
new file mode 100644
index 0000000..56d4835
Binary files /dev/null and b/assets/resources/pachNotes/1.3.0a.png differ
diff --git a/assets/resources/pachNotes/1.3.1a.png b/assets/resources/pachNotes/1.3.1a.png
new file mode 100644
index 0000000..49af90a
Binary files /dev/null and b/assets/resources/pachNotes/1.3.1a.png differ
diff --git a/assets/resources/pachNotes/1.3.2a.png b/assets/resources/pachNotes/1.3.2a.png
new file mode 100644
index 0000000..783c67e
Binary files /dev/null and b/assets/resources/pachNotes/1.3.2a.png differ
diff --git a/assets/resources/pachNotes/1.4.0a.png b/assets/resources/pachNotes/1.4.0a.png
new file mode 100644
index 0000000..850f297
Binary files /dev/null and b/assets/resources/pachNotes/1.4.0a.png differ
diff --git a/assets/resources/pachNotes/1.4.3.png b/assets/resources/pachNotes/1.4.3.png
new file mode 100644
index 0000000..32d1211
Binary files /dev/null and b/assets/resources/pachNotes/1.4.3.png differ
diff --git a/assets/resources/pachNotes/noImage.png b/assets/resources/pachNotes/noImage.png
new file mode 100644
index 0000000..e113b6e
Binary files /dev/null and b/assets/resources/pachNotes/noImage.png differ
diff --git a/assets/resources/unknown_user.png b/assets/resources/unknown_user.png
new file mode 100644
index 0000000..eff0700
Binary files /dev/null and b/assets/resources/unknown_user.png differ
diff --git a/src/headers/Classes/VDF_parser.hpp b/src/headers/Classes/VDF_parser.hpp
new file mode 100644
index 0000000..f35769b
--- /dev/null
+++ b/src/headers/Classes/VDF_parser.hpp
@@ -0,0 +1,104 @@
+class VDFParser {
+public:
+ struct VDFNode {
+ std::unordered_map attributes;
+ std::unordered_map children;
+ };
+
+ VDFParser(const std::string& filename) {
+ parseFile(filename);
+ }
+
+ const VDFNode& getRoot() const {
+ return root;
+ }
+
+ // Funkcja, która konwertuje węzeł VDF do formatu JSON
+ std::string toJSON(const VDFNode& node, int indent = 0) const {
+ std::string json = "{\n";
+ bool first = true;
+
+ // Konwertowanie atrybutów (pary klucz-wartość)
+ for (const auto& attr : node.attributes) {
+ if (!first) json += ",\n";
+ json += std::string(indent + 1, '\t') + "\"" + attr.first + "\": \"" + attr.second + "\"";
+ first = false;
+ }
+
+ // Konwertowanie zagnieżdżonych dzieci
+ for (const auto& child : node.children) {
+ if (!first) json += ",\n";
+ json += std::string(indent + 1, '\t') + "\"" + child.first + "\": " + toJSON(child.second, indent + 1);
+ first = false;
+ }
+
+ json += "\n" + std::string(indent, '\t') + "}";
+ return json;
+ }
+
+private:
+ VDFNode root;
+
+ void parseFile(const std::string& filename) {
+ std::ifstream file(filename);
+ if (!file.is_open()) {
+ throw std::runtime_error("Cannot open file");
+ }
+
+ std::string line;
+ std::vector keyStack; // Stos do obsługi bieżącej ścieżki kluczy
+ VDFNode* currentNode = &root;
+
+ while (getline(file, line)) {
+ line = trim(line);
+ if (line.empty()) continue;
+
+ if (line == "{") {
+ keyStack.push_back(keyStack.back()); // Dodaj ostatni klucz do stosu (nowy blok)
+ currentNode = ¤tNode->children[keyStack.back()];
+ }
+ else if (line == "}") {
+ keyStack.pop_back(); // Wróć do poprzedniego poziomu
+ if (!keyStack.empty()) {
+ currentNode = &getNodeByKeyStack(root, keyStack);
+ }
+ }
+ else {
+ size_t firstQuote = line.find('"');
+ size_t secondQuote = line.find('"', firstQuote + 1);
+ size_t thirdQuote = line.find('"', secondQuote + 1);
+ size_t fourthQuote = line.find('"', thirdQuote + 1);
+
+ if (thirdQuote == std::string::npos || fourthQuote == std::string::npos) {
+ // Znaleziono tylko klucz (dla nowego bloku)
+ std::string key = line.substr(firstQuote + 1, secondQuote - firstQuote - 1);
+ keyStack.push_back(key);
+ } else {
+ // Znaleziono parę klucz-wartość
+ std::string key = line.substr(firstQuote + 1, secondQuote - firstQuote - 1);
+ std::string value = line.substr(thirdQuote + 1, fourthQuote - thirdQuote - 1);
+ currentNode->attributes[key] = value;
+ }
+ }
+ }
+
+ file.close();
+ }
+
+ // Pomocnicza funkcja do odszukania węzła na podstawie stosu kluczy
+ VDFNode& getNodeByKeyStack(VDFNode& node, const std::vector& keyStack) {
+ VDFNode* currentNode = &node;
+ for (const auto& key : keyStack) {
+ currentNode = ¤tNode->children[key];
+ }
+ return *currentNode;
+ }
+
+ // Funkcja pomocnicza do usuwania białych znaków
+ std::string trim(const std::string& str) {
+ const char* whitespace = " \t\n\r";
+ size_t start = str.find_first_not_of(whitespace);
+ size_t end = str.find_last_not_of(whitespace);
+ return (start == std::string::npos) ? "" : str.substr(start, end - start + 1);
+ }
+};
\ No newline at end of file
diff --git a/src/headers/Classes/formattedText.hpp b/src/headers/Classes/formattedText.hpp
new file mode 100644
index 0000000..fae300e
--- /dev/null
+++ b/src/headers/Classes/formattedText.hpp
@@ -0,0 +1,63 @@
+namespace SRL
+{
+ class
+ {
+ public:
+
+ enum margin {
+ center = 237413298479823749238,
+ left = 1284923840923429384902,
+ right = 1894789234759248279349,
+ top = 128743891247891324238742,
+ down = 12783891234732874637465,
+ null = 7234892374893247239832
+ };
+
+ void create(int margin_x = center, int y = center, int fontsize, int color = ColorPalete::Bright, sf::Font& font, const std::string& str = "")
+ {
+
+ }
+
+ void setTheme(int color)
+ {
+ text.setFillColor(ColorPalete::Palete[color][ColorPalete::font]);
+ }
+
+ void render(sf::RenderWindow& window)
+ {
+ window.draw(text);
+ }
+
+ void setText(const std::string& string)
+ {
+ global_text = string;
+ text.setString(global_text);
+ reposition();
+ }
+
+ void setPadding(int padding)
+ {
+ padding_value = padding;
+ reposition();
+ }
+
+ private:
+
+ void reposition()
+ {
+ text.setPosition(global_x, global_y);
+ }
+
+ void setPos(int marginX, int marginY)
+ {
+
+ }
+
+ int global_x;
+ int global_y;
+ int padding_value;
+ std::string global_text;
+
+ sf::Text text;
+ }
+}
\ No newline at end of file
diff --git a/src/headers/Classes/instance_list.hpp b/src/headers/Classes/instance_list.hpp
index 2c85a95..c7bf4e9 100644
--- a/src/headers/Classes/instance_list.hpp
+++ b/src/headers/Classes/instance_list.hpp
@@ -2,41 +2,42 @@ class instance_list_class {
public:
instance_list_class () {}
-void create(int x, int y, int size_x, int size_y, std::string name, std::string version, sf::Font& font, InstanceModAttributes modsAtrb)
+void create(int x, int y, int size_x, int size_y, std::string name, std::string version, sf::Font& font, InstanceModAttributes modsAtrb, int it_number)
{
version_string = version;
name_string = name;
size_y_global = size_y;
+ number_on_list = it_number;
backgorund.setSize(sf::Vector2f(size_x, size_y));
- backgorund.setFillColor(sf::Color(255, 255, 255, 200));
- backgorund.setOutlineColor(sf::Color::Black);
+ backgorund.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::semitransparrent]);
+ backgorund.setOutlineColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
backgorund.setOutlineThickness(1);
backgorund.setPosition(x, y);
instance_name_text.setString(name);
- instance_name_text.setFillColor(sf::Color::Black);
+ instance_name_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
instance_name_text.setCharacterSize(26);
instance_name_text.setFont(font);
version_text.setString(version);
- version_text.setFillColor(sf::Color::Black);
+ version_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
version_text.setCharacterSize(26);
version_text.setFont(font);
modLoaders_text.setString("Vanilla");
- modLoaders_text.setFillColor(sf::Color::Black);
+ modLoaders_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
modLoaders_text.setCharacterSize(26);
modLoaders_text.setFont(font);
- Play_button.create(0,0, 60, 30, font, "Mount");
- Edit_button.create(0,0, 60, 30, font, "Edit");
- Menage_button.create(0,0, 60, 30, font, "Menage");
- OpenGameFolder_button.create(0,0, 100, 30, font, "Open game folder");
- OpenSavesFolder_button.create(0,0, 100, 30, font, "Open saves folder");
- Remove_button.create(0,0, 70, 30, font, "Remove");
+ Play_button.create(0,0, 60, 30, font, "Mount", false, theme_selected);
+ Edit_button.create(0,0, 60, 30, font, "Edit", false, theme_selected);
+ Menage_button.create(0,0, 60, 30, font, "Menage", false, theme_selected);
+ OpenGameFolder_button.create(0,0, 100, 30, font, "Open game folder", false, theme_selected);
+ OpenSavesFolder_button.create(0,0, 100, 30, font, "Open saves folder", false, theme_selected);
+ Remove_button.create(0,0, 70, 30, font, "Remove", false, theme_selected);
- selected_checkbox.create(40, 40, 0, 0, "Selected", 26, font, false);
+ selected_checkbox.create(40, 40, 0, 0, "Selected", 26, font, false, theme_selected);
mods_attributes = modsAtrb;
@@ -46,7 +47,7 @@ void create(int x, int y, int size_x, int size_y, std::string name, std::string
void render(sf::RenderWindow& window)
{
- if (backgorund.getPosition().y >= 85 and backgorund.getPosition().y <= 700)
+ if (backgorund.getPosition().y >= 85 and backgorund.getPosition().y <= 800)
{
window.draw(backgorund);
window.draw(instance_name_text);
@@ -69,7 +70,7 @@ void render(sf::RenderWindow& window)
}
}
-void update(sf::Vector2f mouse)
+void update(sf::Vector2f& mouse)
{
if (show_selection == false)
{
@@ -101,23 +102,20 @@ bool getInstalledStatus()
return installed;
}
+int getItNumber()
+{
+ return number_on_list;
+}
+
void event(sf::Event& event)
{
- if (event.type == sf::Event::MouseWheelMoved)
- {
- int mouse_scroll = event.mouseWheel.delta;
+
+}
- if (mouse_scroll > 0)
- {
- backgorund.setPosition(backgorund.getPosition().x, backgorund.getPosition().y + size_y_global);
- reposition();
- }
- else
- {
- backgorund.setPosition(backgorund.getPosition().x, backgorund.getPosition().y - size_y_global);
- reposition();
- }
- }
+void changePosition(int x, int y)
+{
+ backgorund.setPosition(x, y);
+ reposition();
}
enum status {
@@ -125,6 +123,11 @@ enum status {
Mounted
};
+sf::Vector2f getPosition()
+{
+ return backgorund.getPosition();
+}
+
std::string getID()
{
return name_string;
@@ -153,6 +156,11 @@ void updateStatus(int status)
}
}
+sf::FloatRect getHitbox()
+{
+ return backgorund.getGlobalBounds();
+}
+
sf::FloatRect getMountButtonHitbox()
{
return Play_button.hitbox();
@@ -264,6 +272,8 @@ void reposition()
std::string version_string;
int size_y_global;
+int number_on_list = 0;
+
bool installed;
bool selected;
bool show_selection = false;
@@ -276,11 +286,11 @@ sf::Text modLoaders_text;
InstanceModAttributes mods_attributes;
-Button Play_button;
-Button Edit_button;
-Button Menage_button;
-Button OpenGameFolder_button;
-Button OpenSavesFolder_button;
-Button Remove_button;
-Checkbox selected_checkbox;
+sfg::Button Play_button;
+sfg::Button Edit_button;
+sfg::Button Menage_button;
+sfg::Button OpenGameFolder_button;
+sfg::Button OpenSavesFolder_button;
+sfg::Button Remove_button;
+sfg::Checkbox selected_checkbox;
};
\ No newline at end of file
diff --git a/src/headers/Classes/md5calculator.hpp b/src/headers/Classes/md5calculator.hpp
new file mode 100644
index 0000000..5b51bab
--- /dev/null
+++ b/src/headers/Classes/md5calculator.hpp
@@ -0,0 +1,156 @@
+class MD5 {
+public:
+ MD5() { init(); }
+
+ // Funkcja przetwarzająca ciąg znaków
+ std::string calculate(const std::string &input) {
+ init();
+ process(reinterpret_cast(input.c_str()), input.size());
+ finalize();
+ return hexdigest();
+ }
+
+ // Funkcja przetwarzająca plik
+ std::string calculateFromFile(const std::string &filename) {
+ init();
+ std::ifstream file(filename, std::ifstream::binary);
+ if (!file.is_open()) {
+ throw std::runtime_error("Cannot open file: " + filename);
+ }
+
+ const size_t bufferSize = 1024;
+ char buffer[bufferSize];
+
+ while (file.good()) {
+ file.read(buffer, bufferSize);
+ process(reinterpret_cast(buffer), file.gcount());
+ }
+
+ file.close();
+ finalize();
+ return hexdigest();
+ }
+
+private:
+ static constexpr size_t blockSize = 64; // 512-bitowe bloki
+ unsigned int state[4]; // Przechowuje A, B, C, D
+ unsigned long long bitCount; // Liczba przetworzonych bitów
+ unsigned char buffer[blockSize]; // Bufor dla 64 bajtów
+ bool finalized;
+
+ // Tabela sinusów używana przez MD5
+ static constexpr unsigned int T[64] = {
+ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
+ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
+ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
+ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
+ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
+ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
+ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
+ };
+
+ void init() {
+ finalized = false;
+ bitCount = 0;
+
+ // Inicjalizacja zmiennych MD5 (A, B, C, D)
+ state[0] = 0x67452301;
+ state[1] = 0xefcdab89;
+ state[2] = 0x98badcfe;
+ state[3] = 0x10325476;
+ }
+
+ void process(const unsigned char *data, size_t length) {
+ size_t i = 0;
+
+ // Przetwarzanie w blokach po 512 bitów (64 bajty)
+ while (length--) {
+ buffer[bitCount / 8 % blockSize] = data[i++];
+ bitCount += 8;
+
+ if (bitCount / 8 % blockSize == 0) {
+ transform(buffer);
+ }
+ }
+ }
+
+ void finalize() {
+ if (finalized) return;
+
+ // Padding
+ unsigned char padding[blockSize] = { 0x80 };
+ size_t paddingLength = (bitCount / 8 % blockSize < 56) ? (56 - bitCount / 8 % blockSize) : (120 - bitCount / 8 % blockSize);
+ process(padding, paddingLength);
+
+ // Dodaj długość wiadomości
+ unsigned long long bitCountTemp = bitCount;
+ for (size_t i = 0; i < 8; ++i) {
+ buffer[56 + i] = (bitCountTemp >> (i * 8)) & 0xff;
+ }
+
+ transform(buffer);
+ finalized = true;
+ }
+
+ void transform(const unsigned char block[blockSize]) {
+ unsigned int a = state[0], b = state[1], c = state[2], d = state[3], f, g;
+
+ unsigned int x[16];
+ for (int i = 0; i < 16; ++i) {
+ x[i] = (block[i * 4 + 0]) |
+ (block[i * 4 + 1] << 8) |
+ (block[i * 4 + 2] << 16) |
+ (block[i * 4 + 3] << 24);
+ }
+
+ for (int i = 0; i < 64; ++i) {
+ if (i < 16) {
+ f = (b & c) | (~b & d);
+ g = i;
+ } else if (i < 32) {
+ f = (d & b) | (~d & c);
+ g = (5 * i + 1) % 16;
+ } else if (i < 48) {
+ f = b ^ c ^ d;
+ g = (3 * i + 5) % 16;
+ } else {
+ f = c ^ (b | ~d);
+ g = (7 * i) % 16;
+ }
+
+ unsigned int temp = d;
+ d = c;
+ c = b;
+ b = b + leftRotate((a + f + T[i] + x[g]), shiftAmounts[i]);
+ a = temp;
+ }
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ }
+
+ // Rotacja bitów w lewo
+ unsigned int leftRotate(unsigned int x, unsigned int n) {
+ return (x << n) | (x >> (32 - n));
+ }
+
+ std::string hexdigest() {
+ std::stringstream ss;
+ for (int i = 0; i < 4; ++i) {
+ for (int j = 0; j < 4; ++j) {
+ ss << std::hex << std::setw(2) << std::setfill('0') << ((state[i] >> (j * 8)) & 0xff);
+ }
+ }
+ return ss.str();
+ }
+
+ static constexpr unsigned int shiftAmounts[64] = {
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21
+ };
+};
\ No newline at end of file
diff --git a/src/headers/Classes/save_menagement/betterbuild_save.hpp b/src/headers/Classes/save_menagement/betterbuild_save.hpp
new file mode 100644
index 0000000..47bed7e
--- /dev/null
+++ b/src/headers/Classes/save_menagement/betterbuild_save.hpp
@@ -0,0 +1,168 @@
+class BetterBuildSave {
+public:
+
+void create(int x, int y, WorldData& inputData, sf::Font& font)
+{
+ data = inputData;
+
+ background.setSize(sf::Vector2f(size_x_global, size_y_global));
+ background.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::semitransparrent]);
+ background.setOutlineColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ background.setOutlineThickness(1);
+ background.setPosition(x, y);
+
+ nameText.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ nameText.setCharacterSize(26);
+ nameText.setFont(font);
+
+ ObjectsCountText.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ ObjectsCountText.setCharacterSize(26);
+ ObjectsCountText.setFont(font);
+
+ SpawnersCountText.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ SpawnersCountText.setCharacterSize(26);
+ SpawnersCountText.setFont(font);
+
+ saveVersionText.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ saveVersionText.setCharacterSize(26);
+ saveVersionText.setFont(font);
+
+ saveLockPasswordText.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ saveLockPasswordText.setCharacterSize(26);
+ saveLockPasswordText.setFont(font);
+
+ remove_lock_button.create(0,0, 80, 30, font, "remove lock", false, theme_selected);
+ remove_button.create(0,0, 80, 30, font, "remove", false, theme_selected);
+ gamesaves_slots_button.create(0,0, 100, 30, font, "gamesaves slots", false, theme_selected);
+ make_backup_button.create(0,0, 80, 30, font, "make backup", false, theme_selected);
+
+ applyData();
+ reposition();
+}
+
+sf::Vector2f getPosition()
+{
+ return background.getPosition();
+}
+
+void updateData(WorldData& input)
+{
+ data = input;
+}
+
+void update(sf::Vector2f& mouse)
+{
+ if (background.getPosition().y >= 5 and background.getPosition().y <= 800)
+ {
+ remove_lock_button.update(mouse);
+ remove_button.update(mouse);
+ gamesaves_slots_button.update(mouse);
+ make_backup_button.update(mouse);
+
+ remove_lock_button.setBlockState(!data.levelLocked);
+ }
+}
+
+void render(sf::RenderWindow& window)
+{
+ if (background.getPosition().y >= -80 and background.getPosition().y <= 800)
+ {
+ window.draw(background);
+ window.draw(nameText);
+ window.draw(ObjectsCountText);
+ window.draw(SpawnersCountText);
+ window.draw(saveVersionText);
+ window.draw(saveLockPasswordText);
+
+ remove_lock_button.render(window);
+ remove_button.render(window);
+ gamesaves_slots_button.render(window);
+ make_backup_button.render(window);
+ }
+}
+
+sf::Vector2f getPOsition()
+{
+ return background.getPosition();
+}
+
+sf::FloatRect getHitbox()
+{
+ return background.getGlobalBounds();
+}
+
+void changePosition(int x, int y)
+{
+ background.setPosition(x, y);
+ reposition();
+}
+
+void event(sf::Event& event)
+{
+
+}
+typedef void (*FunctionType)();
+
+void transportFunction(FunctionType function)
+{
+ cachedFunction = function;
+
+ remove_lock_button.setFunction(cachedFunction); //placeholder
+ remove_button.setFunction(cachedFunction); //placeholder
+ gamesaves_slots_button.setFunction(cachedFunction); //placeholder
+ make_backup_button.setFunction(cachedFunction); //placeholder
+}
+
+private:
+
+void applyData()
+{
+ ObjectsCountText.setString("Placed objects: " + std::to_string(data.objectCount));
+ SpawnersCountText.setString("Spawners count: " + std::to_string(data.spawnerCount));
+ nameText.setString(data.levelname);
+ saveVersionText.setString("Version: " + std::to_string(data.version));
+ if (data.levelLocked == true)
+ {
+ saveLockPasswordText.setString("World locked by password: " + data.levelPassword);
+ saveLockPasswordText.setFillColor(sf::Color(255,0,0));
+ }
+ else
+ {
+ saveLockPasswordText.setString("Unlocked");
+ saveLockPasswordText.setFillColor(sf::Color(0,255,0));
+ }
+}
+
+void reposition()
+{
+ nameText.setPosition(background.getPosition().x + 5, background.getPosition().y + 5);
+ saveVersionText.setPosition(background.getPosition().x + 5, nameText.getPosition().y + (nameText.getLocalBounds().height + 10));
+ saveLockPasswordText.setPosition(background.getPosition().x + 5, saveVersionText.getPosition().y + (saveVersionText.getLocalBounds().height + 10));
+
+ ObjectsCountText.setPosition(background.getPosition().x + (background.getGlobalBounds().width - (ObjectsCountText.getLocalBounds().width + 10)), background.getPosition().y + 15);
+ SpawnersCountText.setPosition(background.getPosition().x + (background.getGlobalBounds().width - (SpawnersCountText.getLocalBounds().width + 10)), ObjectsCountText.getPosition().y + (ObjectsCountText.getLocalBounds().height + 10));
+
+ make_backup_button.changePosition(background.getPosition().x + (background.getGlobalBounds().width - (make_backup_button.hitbox().width + 10)), background.getPosition().y + (background.getGlobalBounds().height - (make_backup_button.hitbox().height + 10)));
+ remove_button.changePosition(make_backup_button.getPosition().x - (remove_button.hitbox().width + 10), make_backup_button.getPosition().y);
+ remove_lock_button.changePosition(remove_button.getPosition().x - (remove_lock_button.hitbox().width + 10), make_backup_button.getPosition().y);
+ gamesaves_slots_button.changePosition(remove_lock_button.getPosition().x - (gamesaves_slots_button.hitbox().width + 10), make_backup_button.getPosition().y);
+}
+WorldData data;
+
+sf::RectangleShape background;
+sf::Text nameText;
+sf::Text ObjectsCountText;
+sf::Text SpawnersCountText;
+sf::Text saveVersionText;
+sf::Text saveLockPasswordText;
+
+int size_x_global = 1140;
+int size_y_global = 120;
+
+sfg::Button remove_lock_button;
+sfg::Button remove_button;
+sfg::Button gamesaves_slots_button;
+sfg::Button make_backup_button;
+
+FunctionType cachedFunction = nullptr;
+};
\ No newline at end of file
diff --git a/src/headers/Classes/save_menagement/game_save_class.hpp b/src/headers/Classes/save_menagement/game_save_class.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/src/headers/Classes/save_menagement/mod_class.hpp b/src/headers/Classes/save_menagement/mod_class.hpp
new file mode 100644
index 0000000..37cb493
--- /dev/null
+++ b/src/headers/Classes/save_menagement/mod_class.hpp
@@ -0,0 +1,114 @@
+class ModClass {
+public:
+
+ModClass () {}
+
+void create(int x, int y, const ModAttribs& modAttribs, sf::Font& font, int color = ColorPalete::Bright)
+{
+ attribs = modAttribs;
+ colorSet = color;
+
+ background.setPosition(x, y);
+ background.setSize(sf::Vector2f(560, 60));
+ background.setOutlineThickness(1);
+
+ setAttributes();
+
+ mod_name.setFont(font);
+ mod_name.setCharacterSize(20);
+ mod_name.setPosition(x + 10, y + 10);
+
+ mod_type.setFont(font);
+ mod_type.setCharacterSize(20);
+ mod_type.setPosition(x + 10, y + 30);
+
+ mod_srversion.setFont(font);
+ mod_srversion.setCharacterSize(20);
+ mod_srversion.setPosition(x + background.getGlobalBounds().width - (mod_srversion.getLocalBounds().width + 10), y + 10);
+
+ compatybile_text.setFont(font);
+ compatybile_text.setCharacterSize(20);
+ compatybile_text.setPosition(x + background.getGlobalBounds().width - (compatybile_text.getLocalBounds().width + 10), y + 30);
+
+ setTheme(color);
+}
+
+void setTheme(int color)
+{
+ background.setFillColor(ColorPalete::Palete[color][ColorPalete::semitransparrent]);
+ background.setOutlineColor(ColorPalete::Palete[color][ColorPalete::outline]);
+ mod_name.setFillColor(ColorPalete::Palete[color][ColorPalete::font]);
+ mod_type.setFillColor(ColorPalete::Palete[color][ColorPalete::font]);
+ mod_srversion.setFillColor(ColorPalete::Palete[color][ColorPalete::font]);
+ compatybile_text.setFillColor(ColorPalete::Palete[color][ColorPalete::font]);
+ move_button.setTheme(color);
+}
+
+void render(sf::RenderWindow& window)
+{
+ window.draw(background);
+ window.draw(mod_name);
+ window.draw(mod_type);
+ window.draw(mod_srversion);
+ window.draw(compatybile_text);
+ move_button.render(window);
+}
+
+void update(sf::Vector2f& mouse)
+{
+ move_button.update(mouse);
+}
+
+private:
+
+void setAttributes()
+{
+ if (!attribs.modName.empty())
+ {
+ mod_name.setString(attribs.modName);
+ }
+ else
+ {
+ mod_name.setString("Unknown name");
+ }
+
+ if (!attribs.modType.empty())
+ {
+ mod_type.setString(attribs.modType);
+ }
+ else
+ {
+ mod_type.setString("Unknown type");
+ }
+
+ if (!attribs.SRmodVersion.empty())
+ {
+ mod_srversion.setString(attribs.SRmodVersion);
+ }
+ else
+ {
+ mod_srversion.setString("Unknown Slime Rancher version");
+ }
+
+ if (attribs.compatybile == true)
+ {
+ compatybile_text.setString("Compatybile");
+ }
+ else
+ {
+ compatybile_text.setString("Incompatybile/unknown");
+ }
+}
+
+int colorSet;
+
+ModAttribs attribs;
+
+sf::RectangleShape background;
+sf::Text mod_name;
+sf::Text mod_type;
+sf::Text mod_srversion;
+sf::Text compatybile_text;
+
+sfg::Button move_button;
+};
\ No newline at end of file
diff --git a/src/headers/Classes/steamGuardAuthClass.hpp b/src/headers/Classes/steamGuardAuthClass.hpp
new file mode 100644
index 0000000..ef97b2c
--- /dev/null
+++ b/src/headers/Classes/steamGuardAuthClass.hpp
@@ -0,0 +1,70 @@
+class SteamGuardAuthClass {
+public:
+
+SteamGuardAuthClass () {}
+
+void create(int x, int y, sf::Font& font, int color = ColorPalete::Bright)
+{
+ colorSet = color;
+
+ background.setSize(sf::Vector2f(500, 340));
+ background.setOutlineThickness(1);
+ background.setPosition(x, y);
+
+ confirm_button.create(x + 100, y + 280, 300, 40, font, "Confirm", true, color);
+ confirm_button.setFunction(confirm_function);
+
+ code_textbox.create(x + 100, y + 100, 300, 60, true, true, font, 56, "", false, "Steam Guard code", color);
+}
+
+void setTheme(int color)
+{
+ background.setFillColor(ColorPalete::Palete[color][ColorPalete::semitransparrent]);
+ background.setOutlineColor(ColorPalete::Palete[color][ColorPalete::outline]);
+ confirm_button.setTheme(color);
+ code_textbox.setTheme(color);
+}
+
+void render(sf::RenderWindow& window)
+{
+ window.draw(background);
+ confirm_button.render(window);
+ code_textbox.render(window);
+}
+
+void update(sf::Vector2f mouse)
+{
+ if (code_textbox.getText().length() > 0 && code_textbox.getText().length() < 6)
+ {
+ confirm_button.setBlockState(false);
+ }
+ else
+ {
+ confirm_button.setBlockState(true);
+ }
+ confirm_button.update(mouse);
+ code_textbox.update(mouse);
+
+ guard_code = code_textbox.getText();
+}
+
+void event(sf::Event& event)
+{
+ code_textbox.handleEvent(event);
+}
+
+static void confirm_function()
+{
+ send_guard_code = true;
+ display_guard_window = false;
+}
+
+private:
+
+int colorSet;
+
+sf::RectangleShape background;
+
+sfg::Button confirm_button;
+sfg::Textbox code_textbox;
+};
\ No newline at end of file
diff --git a/src/headers/Classes/version_class.hpp b/src/headers/Classes/version_class.hpp
new file mode 100644
index 0000000..7a107f7
--- /dev/null
+++ b/src/headers/Classes/version_class.hpp
@@ -0,0 +1,105 @@
+class versionClass
+{
+public:
+
+void create(int x, int y, sf::Font& font, sf::Texture& image, const std::string& version, const std::string& description, int color)
+{
+ setTheme(color);
+ descriptionString = description;
+ versionSet = version;
+ imageTexture = image;
+ versionImage.setTexture(imageTexture);
+
+ version_text.setFont(font);
+ version_text.setCharacterSize(26);
+ version_text.setString(version);
+
+ background.setSize(sf::Vector2f(256, 180));
+ background.setOutlineThickness(2);
+
+ reposition(x,y);
+}
+
+void setTheme(int color)
+{
+ colorSet = color;
+
+ background.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::semitransparrent]);
+ background.setOutlineColor(ColorPalete::Palete[theme_selected][ColorPalete::outline]);
+ version_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+}
+
+void reposition(int x, int y)
+{
+ background.setPosition(x, y);
+ versionImage.setPosition(x, y);
+ version_text.setPosition(x + 5, y + 150);
+}
+
+void repositionScroll()
+{
+ int x = background.getPosition().x;
+ int y = background.getPosition().y;
+ versionImage.setPosition(x, y);
+ version_text.setPosition(x + 5, y + 150);
+}
+
+void render(sf::RenderWindow& window)
+{
+ if (background.getPosition().y > -200 and background.getPosition().y <= 800)
+ {
+ window.draw(background);
+ window.draw(versionImage);
+ window.draw(version_text);
+ }
+}
+
+sf::FloatRect hitbox()
+{
+ return background.getGlobalBounds();
+}
+
+std::string getDescription()
+{
+ return descriptionString;
+}
+
+void event(sf::Event& event)
+{
+
+}
+
+std::string getVersion()
+{
+ return version_text.getString();
+}
+
+void update(sf::Vector2f& mouse)
+{
+ if (background.getGlobalBounds().contains(mouse))
+ {
+ background.setOutlineThickness(2);
+ }
+ else
+ {
+ background.setOutlineThickness(0);
+ }
+}
+
+sf::Vector2f getPosition()
+{
+ return background.getPosition();
+}
+
+private:
+
+sf::RectangleShape background;
+sf::Sprite versionImage;
+sf::Text version_text;
+sf::Texture imageTexture;
+
+int colorSet;
+
+std::string descriptionString;
+std::string versionSet;
+};
\ No newline at end of file
diff --git a/src/headers/Declarations/SFMLObjects/ui/elements.hpp b/src/headers/Declarations/SFMLObjects/ui/elements.hpp
index 568aadf..0426b1c 100644
--- a/src/headers/Declarations/SFMLObjects/ui/elements.hpp
+++ b/src/headers/Declarations/SFMLObjects/ui/elements.hpp
@@ -1,68 +1,157 @@
-Button new_instance_button;
-Button import_instnace_button;
-DropDownList versions_list;
+namespace CategoriesUI
+{
+ sfg::TransparrentBackground categories_bg;
+ sfg::Button MainCategory_button;
+ sfg::Button InstancesCategory_button;
+ sfg::Button SettingsCategory_button;
+ sfg::Button VersionsCategory_button;
+}
+
+namespace MainpageElements
+{
+ sfg::TransparrentBackground last_played_bg;
+ sfg::Button launch_last_instance_button;
+ sf::Text mounted_instance_version;
+ sf::Text Mounted_instance_info_text;
+ sf::Text Launcher_version_text;
+ sf::Text downloading_progress_text;
+ SteamGuardAuthClass GuardBox;
+ sfg::Button console_clear_button;
+}
+
+namespace InstanceslistElements
+{
+ sfg::Button new_instance_button;
+ sfg::Button import_instnace_button;
+ sfg::TransparrentBackground instances_bg;
+}
+
+namespace CreateInstanceUI
+{
+ sfg::Textbox new_instance_name_textbox;
+ sfg::Button create_button;
+ sfg::Button instance_creation_cancel;
+ sfg::Checkbox separate_data_checkbox;
+}
+
+namespace ImportInstanceUI
+{
+ sfg::Textbox import_instance_name_textbox;
+ sfg::Textbox import_instance_path_textbox;
+ sfg::Button import_instance_path_browse_button;
+ sfg::Button import_instance_confirm_button;
+ sfg::Button import_instance_cancel_button;
+ sfg::Checkbox move_imported_instance_files_checkbox;
+}
+
+namespace SettingsElemets
+{
+ sfg::TransparrentBackground settings_bg;
+ sfg::Button RestoreSettings_button;
+ sfg::Button SaveConfig_button;
+}
+
+namespace SettingsSubcatsUI
+{
+ sfg::Button Subcat_settings_main_button;
+ sfg::Button Subcat_settings_progile_button;
+ sfg::Button Subcat_settings_updates_button;
+ sfg::Button Subcat_settings_credits_button;
+ sfg::TransparrentBackground subcat_separator;
+}
+
+namespace MainSettingsUI
+{
+ sfg::Textbox SlimeRancher_steam_path_textbox;
+ sfg::Button SlimeRancher_steam_path_getfolder_button;
+ sfg::Textbox SlimeRancher_instances_path_textbox;
+ sfg::Button SlimeRancher_instances_path_getfolder_button;
+ sfg::Textbox steamcmd_path_textbox;
+ sfg::Button steamcmd_path_getfolder_button;
+ sfg::Checkbox Show_older_instances_checkbox;
+ sfg::Checkbox Show_moded_instances_checkbox;
+ sfg::Checkbox Save_logs_files_checkbox;
+ sfg::Checkbox Colored_logs_checkbox;
+ sfg::Checkbox automatically_run_downloaded_instances_checkbox;
+ sfg::Checkbox do_not_show_warnings_checkbox;
+ sf::Text theme_label_text;
+ sfg::DropDownList theme_list_ddl;
+ sf::Text downloaders_list_text;
+ sfg::DropDownList downloaders_ddl;
+
+}
+
+namespace SteamAccountSettingsUI
+{
+ sfg::Textbox SteamProfile_name_textbox;
+ sfg::Passwordbox SteamProfile_password_textbox;
+ sfg::Button save_profile_button;
+ sf::Text Profile_warning_text;
+ sf::Sprite steam_profile_icon;
+ sf::Texture profile_icon_tx;
+ sf::Texture userAvatar_tx;
+ sf::Text steam_profile_offline_status_text;
+ sf::Text steam_profile_AccountName_text;
+ sf::Text steam_profile_PersonalName_text;
+ sf::Text steam_profile_UID_text;
+}
+
+namespace UpdatesSettingsUI
+{
+ sf::Text update_status_text;
+ sfg::Button check_for_update_button;
+ sfg::Checkbox autocheck_for_update_checkbox;
+}
+
+namespace CreditsUI
+{
+ sf::Text credits_programming_text;
+}
+
+namespace VersionsElements
+{
+ sfg::TransparrentBackground versions_bg;
+ sf::Text version_description_text;
+ sfg::TransparrentBackground ver_desc_bg;
+ sfg::Button version_back_button;
+}
+
+namespace ManageSubcatListUI
+{
+ sfg::Button manage_vanilla_saves_button;
+ sfg::Button manage_mod_saves_button;
+ sfg::Button manage_betterbuild_world_button;
+ sfg::Button manage_backups_button;
+ sfg::Button manage_mods_button;
+ sfg::Button manage_main_back_button;
+ sfg::TransparrentBackground manage_cats_separator;
+}
+
+namespace ManageMainUI
+{
+ sf::Text MNG_Instance_name_text;
+ sf::Text MNG_installed_mods_text;
+ sf::Text MNG_Instance_saves_text;
+ sf::Text MNG_instance_mods_own_text;
+ sf::Text MNG_instance_mods_launcher_text;
+}
+
+namespace ManageModsUI
+{
+ sf::Text list_mods_instance_text;
+ sf::Text list_mods_launcher_text;
+ sfg::TransparrentBackground mods_separator;
+}
+
+namespace ManageOthers
+{
+ sf::Text bbw_tittle_text;
+ sfg::TransparrentBackground manage_bg;
+}
+
+sfg::DropDownList versions_list;
+
+sf::Text dataLoading_text;
-Textbox new_instance_name_textbox;
-Button create_button;
-Button instance_creation_cancel;
-Checkbox separate_data_checkbox;
-Textbox import_instance_name_textbox;
-Textbox import_instance_path_textbox;
-Button import_instance_path_browse_button;
-Button import_instance_confirm_button;
-Button import_instance_cancel_button;
-Checkbox move_imported_instance_files_checkbox;
-
-TransparrentBackground last_played_bg;
-Button launch_last_instance_button;
-
-TransparrentBackground categories_bg;
-Button MainCategory_button;
-Button InstancesCategory_button;
-Button SettingsCategory_button;
-Button SavesToolCategory_button;
-
-TransparrentBackground settings_bg;
-
-Button Subcat_settings_main_button;
-
-Textbox SlimeRancher_steam_path_textbox;
-Button SlimeRancher_steam_path_getfolder_button;
-Textbox SlimeRancher_instances_path_textbox;
-Button SlimeRancher_instances_path_getfolder_button;
-Textbox steamcmd_path_textbox;
-Button steamcmd_path_getfolder_button;
-
-Checkbox Show_older_instances_checkbox;
-Checkbox Show_moded_instances_checkbox;
-
-Button RestoreSettings_button;
-Button SaveConfig_button;
-
-Checkbox Save_logs_files_checkbox;
-Checkbox Colored_logs_checkbox;
-
-Checkbox automatically_run_downloaded_instances_checkbox;
-Checkbox do_not_show_warnings_checkbox;
-
-Button Subcat_settings_progile_button;
-
-Textbox SteamProfile_name_textbox;
-Passwordbox SteamProfile_password_textbox;
-Button save_profile_button;
-Checkbox login_manualy_checkbox;
-sf::Text Profile_warning_text;
-
-sf::Text Mounted_instance_info_text;
-sf::Text Launcher_version_text;
-
-Button Subcat_settings_versions_button;
-
-Button Subcat_settings_credits_button;
-
-TransparrentBackground instances_bg;
-
-
-TransparrentBackground datatools_bg;
\ No newline at end of file
diff --git a/src/headers/Declarations/enums.hpp b/src/headers/Declarations/enums.hpp
index 950c2b4..0d5023c 100644
--- a/src/headers/Declarations/enums.hpp
+++ b/src/headers/Declarations/enums.hpp
@@ -3,17 +3,41 @@ enum UI_PAGES {
InstancesMenu,
NewInstanceMenu,
SettingsMenu,
- DataToolsMenu,
- ImportInstanceMenu
+ VersionsList,
+ ImportInstanceMenu,
+ ManageMenu,
+ VersionDescriptionMenu
};
enum SETTIGNS_CATEGORIES {
MAIN_PAGE,
- PROFILE_PAGE
+ PROFILE_PAGE,
+ CREDITS_PAGE,
+ UPDATES_PAGE
+};
+
+enum MANAGE_CATEGORIES {
+ MNG_MAIN_PAGE,
+ VANILLA_SAVES,
+ BETTERBUILD_SAVES,
+ BETTERBUILD_WORLDS,
+ BACKUPS,
+ MODS_PAGE
};
enum LOG_TYPES {
LOG_INFO,
LOG_WARN,
LOG_ERROR
+};
+
+enum DOWNLOADERS {
+ depotdownloader,
+ steamcmd
+};
+
+enum OfflineModeCheckState {
+ result_online,
+ result_offline,
+ result_fail
};
\ No newline at end of file
diff --git a/src/headers/Declarations/maps.hpp b/src/headers/Declarations/maps.hpp
index 148a2dd..dd80e27 100644
--- a/src/headers/Declarations/maps.hpp
+++ b/src/headers/Declarations/maps.hpp
@@ -1,4 +1,15 @@
std::map versions_map;
class instance_list_class;
-std::map instances_list;
\ No newline at end of file
+class BetterBuildSave;
+class versionClass;
+class ModClass;
+std::map instances_list;
+std::map instances_list_iterations;
+std::map betterbuildworlds_list;
+std::map versions_pachnotes_list;
+std::map LauncherMods_list;
+std::map InstanceMods_list;
+
+std::vector mods_folder_data_list;
+std::vector instance_mods_folder_list;
\ No newline at end of file
diff --git a/src/headers/Declarations/namespaces.hpp b/src/headers/Declarations/namespaces.hpp
new file mode 100644
index 0000000..edb7cf1
--- /dev/null
+++ b/src/headers/Declarations/namespaces.hpp
@@ -0,0 +1,16 @@
+using namespace CategoriesUI;
+using namespace MainpageElements;
+using namespace InstanceslistElements;
+using namespace CreateInstanceUI;
+using namespace ImportInstanceUI;
+using namespace SettingsElemets;
+using namespace SettingsSubcatsUI;
+using namespace MainSettingsUI;
+using namespace SteamAccountSettingsUI;
+using namespace UpdatesSettingsUI;
+using namespace CreditsUI;
+using namespace VersionsElements;
+using namespace ManageSubcatListUI;
+using namespace ManageMainUI;
+using namespace ManageModsUI;
+using namespace ManageOthers;
\ No newline at end of file
diff --git a/src/headers/Declarations/structs.hpp b/src/headers/Declarations/structs.hpp
index f5f5110..56ab4ce 100644
--- a/src/headers/Declarations/structs.hpp
+++ b/src/headers/Declarations/structs.hpp
@@ -11,6 +11,7 @@ struct SRVersion {
std::string release_date;
std::string manifest;
std::string version_type;
+ int itr;
};
struct InstanceModAttributes {
@@ -21,4 +22,27 @@ struct InstanceModAttributes {
std::vector StaysModtool_mods_list;
std::vector SatysModLoader_mods_list;
std::vector UMF_mods_list;
+};
+
+struct WorldData {
+ int16_t version;
+ bool levelLocked;
+ std::string levelPassword;
+ int objectCount;
+ int spawnerCount;
+ std::string levelname;
+};
+
+struct ModAttribs {
+ std::string SRmodVersion;
+ std::string modName;
+ bool compatybile;
+ std::string modType;
+};
+
+struct UserData {
+ std::string uid;
+ std::string accountName;
+ std::string personalName;
+ bool offlinemode;
};
\ No newline at end of file
diff --git a/src/headers/Declarations/varriables.hpp b/src/headers/Declarations/varriables.hpp
index afcbf04..1899aa6 100644
--- a/src/headers/Declarations/varriables.hpp
+++ b/src/headers/Declarations/varriables.hpp
@@ -2,6 +2,7 @@ bool window_actived = true;
int UI_current = 0;
int options_ui = 0;
+int manage_ui = 0;
std::string steam_game_dir;
std::string mounted_instance;
@@ -13,7 +14,6 @@ std::string steam_profile_passwd;
bool save_log_files = true;
bool display_log_colors = true;
-bool loging_manualy = false;
bool show_prerelease_version = true;
bool autolaunch_instances = true;
@@ -26,7 +26,21 @@ bool is_mouse_rels = false;
bool game_downloading = false;
bool game_running = false;
-std::string launcher_version = "inDev 0.7";
+bool check_updates_when_start = true;
+
+bool instanceDataLoading = false;
+bool instancesListLoading = false;
+
+bool display_download_progress = false;
+
+bool send_guard_code = false;
+bool display_guard_window = false;
+
+int user_offline_mode = 2;
+
+std::string guard_code;
+
+std::string launcher_version = "inDev 0.8";
std::string saved_version;
/// Launcher Paths ////
@@ -36,11 +50,25 @@ fs::path defaultDir;
fs::path instances_path;
fs::path backups_path;
fs::path configuration_path;
-fs::path temp_path;
fs::path cmd_path;
+fs::path components_path;
+fs::path downloader_path;
fs::path logs_path;
+fs::path mods_path;
+fs::path steam_default_path;
-///////////////////////
+fs::path UMFmodsFolder_path;
+fs::path SMTFolder_path;
+fs::path SMLFolder_path;
+fs::path SRMLmodsFolder_path;
+
+//////////////////////////
+/// Scrollable iterations
+
+std::string instance_list_b;
+std::string instance_list_l;
+
+//////////////////////////
fs::path autobackup_path;
@@ -57,6 +85,12 @@ int run_H;
int run_M;
int run_S;
+int theme_selected = ColorPalete::Bright;
+
+int downloader_selected = 0;
+
+std::string selected_instance;
+
#define Cyan "\e[1;36m"
#define Yellow "\e[1;33m"
#define Red "\e[1;31m"
diff --git a/src/headers/Events/loop.hpp b/src/headers/Events/loop.hpp
index b91ba43..55bb1a2 100644
--- a/src/headers/Events/loop.hpp
+++ b/src/headers/Events/loop.hpp
@@ -1,5 +1,6 @@
void events_loop()
{
+ sf::Vector2f mouse_pos = window.mapPixelToCoords(sf::Mouse::getPosition(window));
while (window.pollEvent(event))
{
switch(event.type)
@@ -24,11 +25,50 @@ void events_loop()
case sf::Event::MouseWheelMoved:
{
- versions_list.scrollEvent(event);
+ if (UI_current == UI_PAGES::VersionDescriptionMenu)
+ {
+ int mouse_scroll = event.mouseWheel.delta;
+
+ if (mouse_scroll > 0)
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp > 0)
+ {
+ if (version_description_text.getPosition().y < 10)
+ {
+ version_description_text.setPosition(version_description_text.getPosition().x, version_description_text.getPosition().y + 50);
+ }
+ mp--;
+ }
+ }
+ else
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp < 0)
+ {
+ if (version_description_text.getPosition().y + (version_description_text.getGlobalBounds().height - 50) > 700)
+ {
+ version_description_text.setPosition(version_description_text.getPosition().x, version_description_text.getPosition().y - 50);
+ }
+ mp++;
+ }
+ }
+ }
+
break;
}
}
+ if (UI_current == UI_PAGES::NewInstanceMenu)
+ {
+ versions_list.scrollEvent(event);
+ }
+
+ if (UI_current == UI_PAGES::ImportInstanceMenu)
+ {
+ versions_list.scrollEvent(event);
+ }
+
if (versions_list.getState() == false)
{
new_instance_name_textbox.handleEvent(event);
@@ -39,10 +79,111 @@ void events_loop()
if (UI_current == UI_PAGES::InstancesMenu)
{
- for (const auto& pair : instances_list)
+ if (instancesListLoading == false)
{
- instances_list[pair.first].event(event);
- }
+ if (instances_list.size() > 0)
+ {
+ instance_list_b = instances_list_iterations.begin()->second;
+ auto last = std::prev(instances_list_iterations.end());
+ instance_list_l = last->second;
+
+ if (event.type == sf::Event::MouseWheelMoved)
+ {
+ int mouse_scroll = event.mouseWheel.delta;
+
+ if (mouse_scroll > 0)
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp > 0)
+ {
+ if (instances_list[instance_list_b].getPosition().y < 85)
+ {
+ for (const auto& pair : instances_list_iterations)
+ {
+ instances_list[pair.second].changePosition(instances_list[pair.second].getPosition().x, instances_list[pair.second].getPosition().y + 85);
+ }
+ }
+ mp--;
+ }
+ }
+ else
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp < 0)
+ {
+ for (const auto& pair : instances_list_iterations)
+ {
+ if (instances_list[instance_list_l].getPosition().y + instances_list[instance_list_l].getHitbox().height > 800)
+ {
+ instances_list[pair.second].changePosition(instances_list[pair.second].getPosition().x, instances_list[pair.second].getPosition().y - 85);
+ }
+ }
+ mp++;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (UI_current == UI_PAGES::MainMenu)
+ {
+ console.handleEvent(event);
+
+ if (display_guard_window == true)
+ {
+ GuardBox.event(event);
+ }
+ }
+
+ if (UI_current == UI_PAGES::ManageMenu)
+ {
+ switch(manage_ui)
+ {
+ case BETTERBUILD_WORLDS:
+ {
+ if (instanceDataLoading == false)
+ {
+ if (event.type == sf::Event::MouseWheelMoved)
+ {
+ int mouse_scroll = event.mouseWheel.delta;
+
+ if (mouse_scroll > 0)
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp > 0)
+ {
+ if (betterbuildworlds_list.begin()->second.getPOsition().y < 0)
+ {
+ for (const auto& pair : betterbuildworlds_list)
+ {
+ betterbuildworlds_list[pair.first].changePosition(betterbuildworlds_list[pair.first].getPOsition().x, betterbuildworlds_list[pair.first].getPOsition().y + 120);
+ }
+ }
+ mp--;
+ }
+ }
+ else
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp < 0)
+ {
+ auto last = std::prev(betterbuildworlds_list.end());
+ if (last->second.getPOsition().y + last->second.getHitbox().height > 800)
+ {
+ for (const auto& pair : betterbuildworlds_list)
+ {
+ betterbuildworlds_list[pair.first].changePosition(betterbuildworlds_list[pair.first].getPOsition().x, betterbuildworlds_list[pair.first].getPOsition().y - 120);
+ }
+ }
+ mp++;
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
}
if (UI_current == UI_PAGES::SettingsMenu)
@@ -52,11 +193,75 @@ void events_loop()
SlimeRancher_steam_path_textbox.handleEvent(event);
SlimeRancher_instances_path_textbox.handleEvent(event);
steamcmd_path_textbox.handleEvent(event);
+
+ // theme_list_ddl.scrollEvent(event);
}
if (options_ui == SETTIGNS_CATEGORIES::PROFILE_PAGE)
{
SteamProfile_name_textbox.handleEvent(event);
- // SteamProfile_password_textbox.handleEvent(event);
+ SteamProfile_password_textbox.handleEvent(event);
+ }
+ }
+
+ if (UI_current == UI_PAGES::VersionsList)
+ {
+
+ if (mouse_pos.x > 10 && mouse_pos.x < 1270 && mouse_pos.y > 85 && mouse_pos.y < 800)
+ {
+ if (event.type == sf::Event::MouseWheelMoved)
+ {
+
+ int mouse_scroll = event.mouseWheel.delta;
+
+ int first = versions_pachnotes_list.begin()->first;
+ int last = versions_pachnotes_list.size();
+
+ if (Show_older_instances_checkbox.getState() == false)
+ {
+ for (const auto& pair : versions_pachnotes_list)
+ {
+ if (versions_map[versions_pachnotes_list[first].getVersion()].version_type == "pre_release")
+ {
+ first++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+
+ if (mouse_scroll > 0)
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp > 0)
+ {
+ if (versions_pachnotes_list[first].getPosition().y < 45)
+ {
+ for (const auto& pair : versions_pachnotes_list)
+ {
+ versions_pachnotes_list[pair.first].reposition(versions_pachnotes_list[pair.first].getPosition().x, versions_pachnotes_list[pair.first].getPosition().y + 180);
+ }
+ }
+ mp--;
+ }
+ }
+ else
+ {
+ int mp = event.mouseWheel.delta;
+ while (mp < 0)
+ {
+ if (versions_pachnotes_list[last].getPosition().y + versions_pachnotes_list[last].hitbox().height > 640)
+ {
+ for (const auto& pair : versions_pachnotes_list)
+ {
+ versions_pachnotes_list[pair.first].reposition(versions_pachnotes_list[pair.first].getPosition().x, versions_pachnotes_list[pair.first].getPosition().y - 180);
+ }
+ }
+ mp++;
+ }
+ }
+ }
}
}
}
diff --git a/src/headers/Functions/Buttons/Instances/manage.hpp b/src/headers/Functions/Buttons/Instances/manage.hpp
index e9d1c9a..69e2238 100644
--- a/src/headers/Functions/Buttons/Instances/manage.hpp
+++ b/src/headers/Functions/Buttons/Instances/manage.hpp
@@ -1,39 +1,466 @@
-void instance_manage(std::string instance_id)
+template
+void readBinary(std::ifstream &file, T &value) {
+ file.read(reinterpret_cast(&value), sizeof(T));
+}
+
+void noFunction()
{
- if (mounted_instance == instances_list[instance_id].getID())
+ MessageBoxA(NULL, "Function not implemated yet", "info", MB_ICONINFORMATION | MB_OK);
+}
+
+std::string readString(std::ifstream &file, int length) {
+ std::vector buffer(length);
+ file.read(buffer.data(), length);
+ return std::string(buffer.begin(), buffer.end());
+}
+
+WorldData LoadWorld(const std::string& filepath) {
+ WorldData worldData = {};
+
+ std::ifstream file(filepath, std::ios::binary);
+ if (!file.is_open()) {
+ std::cerr << "Nie można otworzyć pliku: " << filepath << std::endl;
+ return worldData;
+ }
+
+ int32_t num;
+
+ // Odczyt wersji mapy (int16)
+ readBinary(file, worldData.version);
+
+ // Odczyt, czy poziom jest zablokowany (bool)
+ readBinary(file, worldData.levelLocked);
+
+ if (worldData.levelLocked) {
+ // Odczyt długości hasła (int32)
+ int32_t passwordLength;
+ readBinary(file, passwordLength);
+
+ // Odczyt hasła (string o długości passwordLength)
+ worldData.levelPassword = readString(file, passwordLength);
+ }
+
+ // Pominięcie wartości RemoveWorld (bool)
+ file.seekg(1, std::ios::cur);
+
+ // Odczyt ilości obiektów (int32)
+ readBinary(file, worldData.objectCount);
+
+ // Pomiń dane dotyczące obiektów
+ for (int i = 0; i < worldData.objectCount; ++i) {
+ int32_t stringLength, num5;
+ readBinary(file, stringLength);
+
+ // Pomiń nazwę obiektu
+ file.seekg(stringLength, std::ios::cur);
+
+ // Pomiń resztę danych o obiekcie
+ file.seekg(4 + 12 + 12 + 12, std::ios::cur);
+ }
+
+ // Odczyt ilości spawnerów (int32)
+ readBinary(file, worldData.spawnerCount);
+
+ // Pomiń dane dotyczące spawnerów
+ for (int i = 0; i < worldData.spawnerCount; ++i) {
+ // Pomiń pozycję spawnera (Vector3)
+ file.seekg(12, std::ios::cur);
+
+ // Pomiń MinSpawns, MaxSpawns, SpawnInterval, SpawnIdCount (int32, float, int32)
+ file.seekg(4 + 4 + 4 + 4, std::ios::cur);
+
+ int32_t spawnIdCount;
+ readBinary(file, spawnIdCount);
+
+ // Pomiń listę SpawnIds
+ file.seekg(4 * spawnIdCount, std::ios::cur);
+ }
+
+ file.close();
+ return worldData;
+}
+
+void setAndPositionMngMainTexts(const std::string& m2, const std::string& m3, const std::string& m4, const std::string& m5)
+{
+ MNG_Instance_name_text.setString("Instance name: " + m2);
+ MNG_Instance_saves_text.setString("Vanilla saves count: " + m3);
+ MNG_instance_mods_own_text.setString("Instance installed mods: " + m4);
+ MNG_instance_mods_launcher_text.setString("Launcher mods: " + m5);
+
+ MNG_Instance_name_text.setPosition(130 + (575 - MNG_Instance_name_text.getLocalBounds().width / 2), 100);
+ MNG_Instance_saves_text.setPosition(130 + (575 - MNG_Instance_saves_text.getLocalBounds().width / 2), 150);
+ MNG_instance_mods_own_text.setPosition(130 + (575 - MNG_instance_mods_own_text.getLocalBounds().width / 2), 200);
+ MNG_instance_mods_launcher_text.setPosition(130 + (575 - MNG_instance_mods_launcher_text.getLocalBounds().width / 2), 250);
+ bbw_tittle_text.setPosition(130 + (575 - bbw_tittle_text.getLocalBounds().width / 2), 300);
+}
+
+void eraseMngMainTexts()
+{
+ MNG_Instance_name_text.setString("");
+ MNG_Instance_saves_text.setString("");
+ MNG_instance_mods_own_text.setString("");
+ MNG_instance_mods_launcher_text.setString("");
+}
+
+int add_mod_to_list(int last_mod_ir_pos, const auto& entry, const fs::path& folderName, int loaderType, const std::string& instanceID)
+{
+ ModAttribs mod;
+ std::string output = entry.path().filename().replace_extension().string();
+ log_message(output, LOG_TYPES::LOG_INFO);
+ mod.modName = output;
+ mod.SRmodVersion = folderName.filename().string();
+
+ switch (loaderType)
{
- MessageBoxA(NULL, "Unmount this instance first!", "Error", MB_ICONERROR | MB_OK);
+ case 0:
+ {
+ mod.modType = "Saty' s mod tool Mod";
+ break;
+ }
+ case 1:
+ {
+ mod.modType = "Saty' s mod loader Mod";
+ break;
+ }
+ case 2:
+ {
+ mod.modType = "SRML Mod";
+ break;
+ }
+ case 3:
+ {
+ mod.modType = "UMF Mod";
+ break;
+ }
+
+ if (mod.SRmodVersion == instances_list[instanceID].getVer())
+ {
+ mod.compatybile = true;
+ }
+ else
+ {
+ mod.compatybile = false;
+ }
}
- else
+
+ InstanceMods_list[output].create(700, last_mod_ir_pos, mod, font, theme_selected);
+
+ instance_mods_folder_list.emplace_back(mod);
+
+ return 60;
+}
+
+void loadLauncherMods(const std::string& selected_instance_id)
+{
+ LauncherMods_list.clear();
+ try
{
- fs::path instance_directory = instances_dir / fs::path("Slime Rancher_" + instances_list[instance_id].getID());
+ int last_mod_ir_pos = 20;
+ for (const auto& entry : fs::directory_iterator(SMTFolder_path))
+ {
+ fs::path folderPath = SMTFolder_path / entry.path();
+ if (fs::is_directory(folderPath))
+ {
+ for (const auto& modEntry : fs::directory_iterator(folderPath))
+ {
+ if (modEntry.is_regular_file() and modEntry.path().filename().extension() == ".dll")
+ {
+ last_mod_ir_pos += add_mod_to_list(last_mod_ir_pos, modEntry, folderPath, 0, selected_instance_id);
+ }
+ }
+
+ }
+ }
+
+ for (const auto& entry : fs::directory_iterator(SMLFolder_path))
+ {
+ fs::path folderPath = SMTFolder_path / entry.path();
+ if (fs::is_directory(folderPath))
+ {
+ for (const auto& modEntry : fs::directory_iterator(folderPath))
+ {
+ if (modEntry.is_regular_file() and modEntry.path().filename().extension() == ".dll")
+ {
+ last_mod_ir_pos += add_mod_to_list(last_mod_ir_pos, modEntry, folderPath, 1, selected_instance_id);
+ }
+ }
+
+ }
+ }
+
+ for (const auto& entry : fs::directory_iterator(SRMLmodsFolder_path))
+ {
+ fs::path folderPath = SMTFolder_path / entry.path();
+ if (fs::is_directory(folderPath))
+ {
+ for (const auto& modEntry : fs::directory_iterator(folderPath))
+ {
+ if (modEntry.is_regular_file() and modEntry.path().filename().extension() == ".dll")
+ {
+ last_mod_ir_pos += add_mod_to_list(last_mod_ir_pos, modEntry, folderPath, 2, selected_instance_id);
+ }
+ }
+
+ }
+ }
+
+ for (const auto& entry : fs::directory_iterator(UMFmodsFolder_path))
+ {
+ fs::path folderPath = SMTFolder_path / entry.path();
+ if (fs::is_directory(folderPath))
+ {
+ for (const auto& modEntry : fs::directory_iterator(folderPath))
+ {
+ if (modEntry.is_regular_file() and modEntry.path().filename().extension() == ".umf")
+ {
+ last_mod_ir_pos += add_mod_to_list(last_mod_ir_pos, modEntry, folderPath, 3, selected_instance_id);
+ }
+ }
+
+ }
+ }
+ }
+ catch (fs::filesystem_error e)
+ {
+
+ }
+}
+
+void loadInstanceData(std::string instance_id, fs::path instance_directory)
+{
+ InstanceModAttributes attribs = instances_list[instance_id].getModAttributes();
- InstanceModAttributes attribs = instances_list[instance_id].getModAttributes();
+ fs::path instance_mods_directory;
- fs::path instance_mods_directory;
+ instance_mods_folder_list.clear();
+ InstanceMods_list.clear();
+ LauncherMods_list.clear();
+ betterbuildworlds_list.clear();
- if (versions_map[instances_list[instance_id].getVer()].mod_support == true)
+ if (versions_map[instances_list[instance_id].getVer()].mod_support == true)
+ {
+ if (versions_map[instances_list[instance_id].getVer()].version_type == "pre-release")
{
- if (versions_map[instances_list[instance_id].getVer()].version_type == "pre-release")
+ instance_mods_directory = instance_directory / "mods";
+ std::map mods_installed;
+ mods_installed.clear();
+
+ InstanceMods_list.clear();
+
+ ModAttribs mod;
+
+ try
{
- instance_mods_directory = instance_directory / "mods";
+ int last_mod_ir_pos = 20;
+ for (const auto& entry : fs::directory_iterator(instance_mods_directory))
+ {
+ if (entry.is_regular_file() and entry.path().filename().extension() == ".dll")
+ {
+ std::string output = entry.path().filename().replace_extension().string();
+ log_message(output, LOG_TYPES::LOG_INFO);
+ mods_installed[output] = output;
+ mod.modName = output;
+ InstanceMods_list[output].create(130, last_mod_ir_pos, mod, font, theme_selected);
+ last_mod_ir_pos += 60;
+ }
+ }
- try
+ if (mods_installed.count("BetterBuildMod") > 0)
{
- for (const auto& entry : fs::directory_iterator(instance_mods_directory))
+ bbw_tittle_text.setString("");
+ log_message("BetterBuildMod installed", LOG_TYPES::LOG_INFO);
+ fs::path instance_betterbuild_directory = instance_mods_directory / "BetterBuild";
+ directory_auto(instance_betterbuild_directory);
+ int last_bbsave_entry_y = 5;
+ int iteration = 0;
+ betterbuildworlds_list.clear();
+
+ for (const auto& entry : fs::directory_iterator(instance_betterbuild_directory))
{
- if (entry.is_regular_file() and entry.path().filename().extension() == ".dll")
+ if (entry.is_regular_file() and entry.path().filename().extension() == ".world")
{
- std::string output = entry.path().filename().replace_extension().string();
+ std::string output = entry.path().string();
log_message(output, LOG_TYPES::LOG_INFO);
+
+ WorldData worldData = LoadWorld(output);
+
+ worldData.levelname = entry.path().filename().replace_extension().string();
+
+ betterbuildworlds_list[iteration].create(130, last_bbsave_entry_y, worldData, font);
+ betterbuildworlds_list[iteration].transportFunction(noFunction);
+ last_bbsave_entry_y += 120;
+ iteration++;
}
- }
+ }
}
- catch (fs::filesystem_error e)
+ else
{
+ bbw_tittle_text.setString("BetterBuildMod isn't installed");
+ bbw_tittle_text.setPosition(window.getSize().x / 2 - (bbw_tittle_text.getLocalBounds().width / 2) + 130, 380);
+ }
+
+ instance_mods_folder_list.emplace_back(mod);
+ }
+ catch (fs::filesystem_error e)
+ {
+
+ }
+
+ loadLauncherMods(instance_id);
+ }
+ else
+ {
+ instance_mods_directory = instance_directory / "Mods";
+ std::map mods_installed;
+ mods_installed.clear();
+ InstanceMods_list.clear();
+
+ ModAttribs mod;
+ int last_mod_ir_pos = 20;
+ try
+ {
+ for (const auto& entry : fs::directory_iterator(instance_mods_directory))
+ {
+ if (entry.is_regular_file() and entry.path().filename().extension() == ".dll")
+ {
+ std::string output = entry.path().filename().replace_extension().string();
+ log_message(output, LOG_TYPES::LOG_INFO);
+ mods_installed[output] = output;
+ mod.modName = output;
+ InstanceMods_list[output].create(130, last_mod_ir_pos, mod, font, theme_selected);
+ last_mod_ir_pos += 60;
+ instance_mods_folder_list.emplace_back(mod);
+ }
+ }
+
+ if (mods_installed.count("BetterBuild") > 0)
+ {
+ bbw_tittle_text.setString("");
+ log_message("BetterBuild installed", LOG_TYPES::LOG_INFO);
+ fs::path instance_betterbuild_directory = instance_directory / "BetterBuild";
+ directory_auto(instance_betterbuild_directory);
+ int last_bbsave_entry_y = 5;
+ int iteration = 0;
+ betterbuildworlds_list.clear();
+
+ for (const auto& entry : fs::directory_iterator(instance_betterbuild_directory))
+ {
+ if (entry.is_regular_file() and entry.path().filename().extension() == ".world")
+ {
+ std::string output = entry.path().string();
+ log_message(output, LOG_TYPES::LOG_INFO);
+
+ WorldData worldData = LoadWorld(output);
+
+ worldData.levelname = entry.path().filename().replace_extension().string();
+
+ betterbuildworlds_list[iteration].create(130, last_bbsave_entry_y, worldData, font);
+ betterbuildworlds_list[iteration].transportFunction(noFunction);
+ last_bbsave_entry_y += 120;
+ iteration++;
+ }
+ }
+ }
+ else
+ {
+ bbw_tittle_text.setString("BetterBuild isn't installed");
+ bbw_tittle_text.setPosition(window.getSize().x / 2 - (bbw_tittle_text.getLocalBounds().width / 2) + 130, 380);
}
- }
+ }
+ catch (fs::filesystem_error e)
+ {
+
+ }
+ try
+ {
+ mod.compatybile = false;
+ mod.modName.erase();
+ mod.modType.erase();
+ mod.SRmodVersion.erase();
+
+ instance_mods_directory = instance_directory / "SRML" / "Mods";
+
+ for (const auto& entry : fs::directory_iterator(instance_mods_directory))
+ {
+ if (entry.is_regular_file() and entry.path().filename().extension() == ".dll")
+ {
+ std::string output = entry.path().filename().replace_extension().string();
+ log_message(output, LOG_TYPES::LOG_INFO);
+ mods_installed[output] = output;
+ mod.modName = output;
+ InstanceMods_list[output].create(130, last_mod_ir_pos, mod, font, theme_selected);
+ last_mod_ir_pos += 60;
+ instance_mods_folder_list.emplace_back(mod);
+ }
+ }
+ }
+ catch (fs::filesystem_error e)
+ {
+
+ }
+ try
+ {
+ mod.compatybile = false;
+ mod.modName.erase();
+ mod.modType.erase();
+ mod.SRmodVersion.erase();
+
+ instance_mods_directory = instance_directory / "uModFramework" / "Mods";
+
+ for (const auto& entry : fs::directory_iterator(instance_mods_directory))
+ {
+ if (entry.is_regular_file() and entry.path().filename().extension() == ".umfmod")
+ {
+ std::string output = entry.path().filename().replace_extension().string();
+ log_message(output, LOG_TYPES::LOG_INFO);
+ mods_installed[output] = output;
+ mod.modName = output;
+ InstanceMods_list[output].create(130, last_mod_ir_pos, mod, font, theme_selected);
+ last_mod_ir_pos += 60;
+ instance_mods_folder_list.emplace_back(mod);
+ }
+ }
+ }
+ catch (fs::filesystem_error e)
+ {
+
+ }
+
+ loadLauncherMods(instance_id);
}
}
+ else
+ {
+ bbw_tittle_text.setString("This instance doesn't support mods");
+ bbw_tittle_text.setPosition(window.getSize().x / 2 - (bbw_tittle_text.getLocalBounds().width / 2) + 130, 380);
+ }
+
+ setAndPositionMngMainTexts(instance_id, "UNKNOWN", std::to_string(InstanceMods_list.size()), std::to_string(LauncherMods_list.size()));
+
+ instanceDataLoading = false;
+}
+
+void instance_manage(std::string instance_id)
+{
+ eraseMngMainTexts();
+ bbw_tittle_text.setString("");
+ selected_instance = instances_list[instance_id].getID();
+ if (mounted_instance == instances_list[instance_id].getID())
+ {
+ MessageBoxA(NULL, "Unmount this instance first!", "Error", MB_ICONERROR | MB_OK);
+ }
+ else
+ {
+ UI_current = ManageMenu;
+ manage_ui = MNG_MAIN_PAGE;
+
+ fs::path instance_directory = instances_dir / fs::path("Slime Rancher_" + instances_list[instance_id].getID());
+
+ dataLoading_text.setString("Loading instance data...");
+ dataLoading_text.setPosition((window.getSize().x / 2) - (credits_programming_text.getLocalBounds().width / 2), 320);
+ instanceDataLoading = true;
+ std::thread loadDataThr(loadInstanceData, instance_id, instance_directory);
+ loadDataThr.detach();
+ }
}
\ No newline at end of file
diff --git a/src/headers/Functions/Buttons/Instances/mount.hpp b/src/headers/Functions/Buttons/Instances/mount.hpp
index 77d7d32..c4faf31 100644
--- a/src/headers/Functions/Buttons/Instances/mount.hpp
+++ b/src/headers/Functions/Buttons/Instances/mount.hpp
@@ -10,6 +10,7 @@ void mount_function(std::string instance_id)
unmount_funtcion();
mounted_instance = instances_list[instance_id].getID();
Mounted_instance_info_text.setString(mounted_instance);
+ mounted_instance_version.setString("v." + instances_list[instance_id].getVer());
steam_game_dir = SlimeRancher_steam_path_textbox.getText();
fs::path steam_dir = steam_game_dir;
diff --git a/src/headers/Functions/Buttons/Instances/refresh_list.hpp b/src/headers/Functions/Buttons/Instances/refresh_list.hpp
index eef9f94..07a8c69 100644
--- a/src/headers/Functions/Buttons/Instances/refresh_list.hpp
+++ b/src/headers/Functions/Buttons/Instances/refresh_list.hpp
@@ -17,7 +17,7 @@ int last_insnace_entry_y = 85;
-void add_instance(fs::path path)
+bool add_instance(fs::path path, int itr)
{
std::string path_str = path.string();
InstanceModAttributes modsAttribs;
@@ -32,7 +32,7 @@ void add_instance(fs::path path)
std::string name = json.getObject().at("name").getString();
std::string version = json.getObject().at("version").getString();
- if (check_file_exists(path_str + "/SlimeRancher.exe") == true)
+ if (fs::exists(path_str + "/SlimeRancher.exe") == true)
{
instance_installed_status_placeholder = true;
if (versions_map[version].mod_support == true)
@@ -63,9 +63,11 @@ void add_instance(fs::path path)
instance_installed_status_placeholder = false;
}
- instances_list[name].create(10, last_insnace_entry_y, 1260, 80, name, version, font, modsAttribs);
+ instances_list[name].create(10, last_insnace_entry_y, 1260, 80, name, version, font, modsAttribs, itr);
last_insnace_entry_y += 85;
instances_list[name].setInstalledStatus(instance_installed_status_placeholder);
+ instances_list_iterations[itr] = name;
+ return true;
}
else
{
@@ -73,22 +75,26 @@ void add_instance(fs::path path)
// MessageBoxA(NULL, "Cannot find \"info.json\" file in game directory!", "Warning", MB_ICONEXCLAMATION);
}
}
+ return false;
}
-void refresh_instances_list()
+void loadInstancesList(fs::path instances_path)
{
- instances_list.clear();
- last_insnace_entry_y = 85;
+ int iteration = 0;
- fs::path instances_path = instances_dir;
-
- add_instance(fs::path(steam_game_dir) / "Slime Rancher");
+ if (add_instance(fs::path(steam_game_dir) / "Slime Rancher", iteration) == true)
+ {
+ iteration++;
+ }
try
{
for (const auto& entry : fs::directory_iterator(instances_path))
{
- add_instance(instances_path / entry.path());
+ if (add_instance(instances_path / entry.path(), iteration) == true)
+ {
+ iteration++;
+ }
}
}
catch (fs::filesystem_error e)
@@ -97,6 +103,30 @@ void refresh_instances_list()
log_message("Instance refresh error: " + errormsg, LOG_TYPES::LOG_ERROR);
}
-
instances_stat_refresh();
+
+ if (mounted_instance != "Unmounted")
+ {
+ mounted_instance_version.setString("v." + instances_list[mounted_instance].getVer());
+ }
+
+ instancesListLoading = false;
+}
+
+void refresh_instances_list()
+{
+ instances_list.clear();
+ instances_list_iterations.clear();
+ instance_list_b.erase();
+ instance_list_l.erase();
+ last_insnace_entry_y = 85;
+
+ fs::path instances_path = instances_dir;
+
+ dataLoading_text.setString("Loading instances...");
+ dataLoading_text.setPosition((window.getSize().x / 2) - (credits_programming_text.getLocalBounds().width / 2), 320);
+ instancesListLoading = true;
+
+ std::thread loadThr(loadInstancesList, instances_path);
+ loadThr.detach();
}
\ No newline at end of file
diff --git a/src/headers/Functions/Buttons/Instances/unmount.hpp b/src/headers/Functions/Buttons/Instances/unmount.hpp
index 43526de..22b5680 100644
--- a/src/headers/Functions/Buttons/Instances/unmount.hpp
+++ b/src/headers/Functions/Buttons/Instances/unmount.hpp
@@ -32,6 +32,7 @@ bool unmount_funtcion()
mounted_instance = "Unmounted";
Mounted_instance_info_text.setString("No instance mounted");
+ mounted_instance_version.setString("");
update_config_file();
log_message("Instance unmounted", LOG_TYPES::LOG_INFO);
return true;
diff --git a/src/headers/Functions/Buttons/Launcher_pages/categories.hpp b/src/headers/Functions/Buttons/Launcher_pages/categories.hpp
index 55262a9..9b4e352 100644
--- a/src/headers/Functions/Buttons/Launcher_pages/categories.hpp
+++ b/src/headers/Functions/Buttons/Launcher_pages/categories.hpp
@@ -17,8 +17,26 @@ void changeCategory_settings()
UI_current = UI_PAGES::SettingsMenu;
}
-void changeCategory_datatools()
+void changeCategory_versions()
{
- UI_current = UI_PAGES::DataToolsMenu;
+ UI_current = UI_PAGES::VersionsList;
+ positionListElements();
// display_version_log();
+}
+
+void exit_manage_function()
+{
+ UI_current = UI_PAGES::InstancesMenu;
+ selected_instance.erase();
+ refresh_instances_list();
+}
+
+void changeCategory_mng_bbworls()
+{
+ manage_ui = BETTERBUILD_WORLDS;
+}
+
+void changeCategory_mng_mods()
+{
+ manage_ui = MODS_PAGE;
}
\ No newline at end of file
diff --git a/src/headers/Functions/Buttons/Settings/subcats.hpp b/src/headers/Functions/Buttons/Settings/subcats.hpp
index c0c3822..8d6c191 100644
--- a/src/headers/Functions/Buttons/Settings/subcats.hpp
+++ b/src/headers/Functions/Buttons/Settings/subcats.hpp
@@ -6,4 +6,16 @@ void settings_main_cat()
void settings_profile_cat()
{
options_ui = SETTIGNS_CATEGORIES::PROFILE_PAGE;
+ getSteamAccountStats();
+}
+
+void settings_updates_cat()
+{
+ options_ui = SETTIGNS_CATEGORIES::UPDATES_PAGE;
+}
+
+void settings_credits_cat()
+{
+ credits_programming_text.setPosition((window.getSize().x / 2) - (credits_programming_text.getLocalBounds().width / 2), 320);
+ options_ui = SETTIGNS_CATEGORIES::CREDITS_PAGE;
}
\ No newline at end of file
diff --git a/src/headers/Functions/Config/update_file.hpp b/src/headers/Functions/Config/update_file.hpp
index 3fb6d16..9b37eef 100644
--- a/src/headers/Functions/Config/update_file.hpp
+++ b/src/headers/Functions/Config/update_file.hpp
@@ -7,14 +7,16 @@ void update_config_file()
config.add("instances_dir", new JSONEncoder::JSONString(instances_dir));
config.add("steamcmd_dir", new JSONEncoder::JSONString(steamcmd_dir));
config.add("spn", new JSONEncoder::JSONString(steam_profile_name));
- // config.add("spp", new JSONEncoder::JSONString(steam_profile_passwd));
+ config.add("spp", new JSONEncoder::JSONString(steam_profile_passwd));
config.add("saved_version", new JSONEncoder::JSONString(saved_version));
- config.add("login_manually", new JSONEncoder::JSONBool(loging_manualy));
config.add("show_prereleases", new JSONEncoder::JSONBool(show_prerelease_version));
config.add("save_logs", new JSONEncoder::JSONBool(save_log_files));
config.add("colored_logs", new JSONEncoder::JSONBool(display_log_colors));
config.add("auto_launch", new JSONEncoder::JSONBool(autolaunch_instances));
config.add("show_warnings", new JSONEncoder::JSONBool(show_warnings));
+ config.add("auto_update_check", new JSONEncoder::JSONBool(check_updates_when_start));
+ config.add("theme", new JSONEncoder::JSONNumber(theme_selected));
+ config.add("downloader", new JSONEncoder::JSONNumber(downloader_selected));
std::string jsonConfig = config.stringify();
std::ofstream configfile;
diff --git a/src/headers/Functions/Data_menagement/move_directory.hpp b/src/headers/Functions/Data_menagement/move_directory.hpp
index f3d90c3..7cbdb37 100644
--- a/src/headers/Functions/Data_menagement/move_directory.hpp
+++ b/src/headers/Functions/Data_menagement/move_directory.hpp
@@ -28,6 +28,48 @@ void move_directory(fs::path source, fs::path destination)
}
fs::remove(source);
+ }
+ catch (const fs::filesystem_error& e)
+ {
+ std::string errormsg = e.what();
+ log_message("Filesystem error: " + errormsg, LOG_TYPES::LOG_ERROR);
+ }
+ catch (const std::exception& e)
+ {
+ std::string errormsg = e.what();
+ log_message(errormsg, LOG_TYPES::LOG_ERROR);
+ }
+}
+
+void copy_directory(fs::path source, fs::path destination)
+{
+ try
+ {
+ if (!fs::exists(source) || !fs::is_directory(source))
+ {
+ throw std::runtime_error("Source directory does not exist or is not a directory.");
+ }
+
+ if (!fs::exists(destination))
+ {
+ fs::create_directories(destination);
+ }
+
+ for (const auto& entry : fs::directory_iterator(source))
+ {
+ auto source_path = entry.path();
+ auto destination_path = destination / source_path.filename();
+
+ if (fs::is_directory(source_path))
+ {
+ fs::copy(source_path, destination_path);
+ }
+ else
+ {
+ fs::copy_file(source_path, destination_path);
+ }
+ }
+
}
catch (const fs::filesystem_error& e)
{
diff --git a/src/headers/Functions/Launch/download_game.hpp b/src/headers/Functions/Launch/download_game.hpp
index fc7aa62..ea04e8d 100644
--- a/src/headers/Functions/Launch/download_game.hpp
+++ b/src/headers/Functions/Launch/download_game.hpp
@@ -1,7 +1,253 @@
void prelaunch_tasks(std::string game_runpath);
void reset_play_button_text();
-void download_game(std::string gamerun_path)
+struct depotProsp
+{
+ std::string appid;
+ std::string depotid;
+ std::string manifestid;
+ std::string username;
+ std::string password;
+ std::string path;
+ std::string runpath;
+};
+
+void runDownloader(const depotProsp& depot)
+{
+ std::string command = downloader_path.string() + "/DepotDownloader.exe -app "
+ + depot.appid + " -depot " + depot.depotid + " -manifest " + depot.manifestid + " -username " + depot.username + " -password " + depot.password + " -dir " + downloader_path.string() + "/output";
+ std::cout << "running : " << command << std::endl;
+ system(command.c_str());
+ game_downloading = false;
+
+
+ // STARTUPINFO si;
+ // PROCESS_INFORMATION pi;
+ // ZeroMemory(&si, sizeof(si));
+ // si.cb = sizeof(si);
+ // ZeroMemory(&pi, sizeof(pi));
+
+ // // Ścieżka do aplikacji, którą chcesz uruchomić
+ // LPCSTR appPath = "C:\\path\\to\\your\\application.exe";
+
+ // // Uruchomienie nowego procesu
+ // if (!CreateProcessA(NULL, const_cast(appPath), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
+ // std::cerr << "Błąd uruchamiania procesu: " << GetLastError() << std::endl;
+ // game_downloading = false;
+ // }
+
+ // std::cout << "Proces uruchomiony!" << std::endl;
+
+
+ // // Wymuszenie zakończenia procesu
+ // if (!TerminateProcess(pi.hProcess, 0)) {
+ // std::cerr << "Błąd zatrzymywania procesu: " << GetLastError() << std::endl;
+ // } else {
+ // std::cout << "Proces zatrzymany!" << std::endl;
+ // }
+
+ // // Zamknięcie uchwytów
+ // CloseHandle(pi.hProcess);
+ // CloseHandle(pi.hThread);
+}
+
+bool comunicate = false;
+
+void recieveMessage(const HANDLE& hPipe, const depotProsp depot)
+{
+ while (true)
+ {
+ if (comunicate == false)
+ {
+ break;
+ }
+
+ char buffer[1024];
+ DWORD bytesRead;
+ ReadFile(hPipe, buffer, sizeof(buffer), &bytesRead, NULL);
+
+ std::string recieved(buffer, bytesRead);
+ if (!recieved.empty())
+ {
+ auto json = JSON::parse(recieved);
+
+ std::string type = json.getObject().at("type").getString();
+ if (type == "LOG")
+ {
+ std::string msg = json.getObject().at("msg").getString();
+ int type = json.getObject().at("logType").getNumber();
+
+ log_message(msg, type);
+
+ if (type == LOG_TYPES::LOG_ERROR)
+ {
+ CloseHandle(hPipe);
+ log_message("Comunication stopped", LOG_TYPES::LOG_INFO);
+ comunicate = false;
+ game_downloading = false;
+ return;
+ }
+
+ recieved.erase();
+ }
+ else if (type == "DownloadProgress")
+ {
+ display_download_progress = true;
+ std::string msg = json.getObject().at("msg").getString();
+ int type = json.getObject().at("logType").getNumber();
+
+ int progress = std::stoi(msg);
+ downloading_progress_text.setString(std::to_string(progress) + " %");
+ downloading_progress_text.setPosition(640 - (downloading_progress_text.getLocalBounds().width / 2), progress_bg.getPosition().y);
+
+ if (progress == 100)
+ {
+ display_download_progress = false;
+ }
+ }
+ else if (type == "SHD")
+ {
+ std::string msg = json.getObject().at("msg").getString();
+ int type = json.getObject().at("logType").getNumber();
+ CloseHandle(hPipe);
+ log_message(msg, type);
+ log_message("Comunication stopped", LOG_TYPES::LOG_INFO);
+ comunicate = false;
+ game_downloading = false;
+ recieved.erase();
+ return;
+ }
+ else if (type == "SUMMARY")
+ {
+ std::string msg = json.getObject().at("msg").getString();
+ int type = json.getObject().at("logType").getNumber();
+ log_message(msg, type);
+ game_downloading = false;
+ recieved.erase();
+
+ steam_game_dir = SlimeRancher_steam_path_textbox.getText();
+ fs::path steam_dir = steam_game_dir;
+ fs::path outputDir = downloader_path / "output";
+ if (fs::exists(outputDir) && fs::is_directory(outputDir))
+ {
+ move_directory(outputDir, steam_dir / "Slime Rancher");
+ log_message("Game download success", LOG_TYPES::LOG_INFO);
+ game_downloading = false;
+ if (autolaunch_instances == true)
+ {
+ prelaunch_tasks(depot.runpath);
+ }
+ }
+
+ reset_play_button_text();
+ }
+ else if (type == "GUARD-appauth-ask")
+ {
+ std::string msg = json.getObject().at("msg").getString();
+ int type = json.getObject().at("logType").getNumber();
+ log_message(msg, type);
+ recieved.erase();
+
+ display_guard_window = true;
+ send_guard_code = false;
+
+ do
+ {
+ if (send_guard_code == true)
+ {
+ DWORD bytesWritten;
+ WriteFile(hPipe, guard_code.c_str(), strlen(guard_code.c_str()) + 1, &bytesWritten, NULL);
+ }
+ }
+ while(send_guard_code != true);
+ }
+ else if (type == "GUARD-mailauth-ask")
+ {
+ std::string msg = json.getObject().at("msg").getString();
+ int type = json.getObject().at("logType").getNumber();
+ log_message(msg, type);
+ recieved.erase();
+
+ display_guard_window = true;
+ send_guard_code = false;
+
+ do
+ {
+ if (send_guard_code == true)
+ {
+ DWORD bytesWritten;
+ WriteFile(hPipe, guard_code.c_str(), strlen(guard_code.c_str()) + 1, &bytesWritten, NULL);
+ }
+ }
+ while(send_guard_code != true);
+ }
+ else if (type == "GUARD-mobileConfirm")
+ {
+ std::string msg = json.getObject().at("msg").getString();
+ int type = json.getObject().at("logType").getNumber();
+ log_message(msg, type);
+ recieved.erase();
+
+ MessageBoxA(NULL, "Mobile authentication is required", "Info", MB_ICONINFORMATION | MB_OK);
+ }
+ else
+ {
+ recieved.erase();
+ }
+
+ }
+ }
+}
+
+void downloaderPipe(depotProsp& depot)
+{
+ game_downloading = true;
+ launch_last_instance_button.setText("Downloading");
+ std::thread animThread(downloading_animation);
+ animThread.detach();
+
+ std::thread dt(runDownloader, depot);
+ dt.detach();
+
+ const char* pipeName = R"(\\.\pipe\DepotDownloaderPipe)";
+ HANDLE hPipe = CreateNamedPipeA(
+ pipeName, // Nazwa potoku
+ PIPE_ACCESS_DUPLEX, // Dostęp dwukierunkowy
+ PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, // Tryb komunikatów
+ 1, // Maksymalna liczba instancji
+ 1024, // Rozmiar bufora wyjściowego
+ 1024, // Rozmiar bufora wejściowego
+ 0, // Timeout
+ NULL // Atrybuty zabezpieczeń
+ );
+
+ if (hPipe == INVALID_HANDLE_VALUE) {
+ std::cerr << "Błąd tworzenia potoku: " << GetLastError() << std::endl;
+ return;
+ }
+
+ std::cout << "Czekam na połączenie z DepotDownloader..." << std::endl;
+ BOOL connected = ConnectNamedPipe(hPipe, NULL);
+ if (!connected) {
+ std::cerr << "Nie udało się połączyć: " << GetLastError() << std::endl;
+ CloseHandle(hPipe);
+ return;
+ }
+
+ std::cout << "Połączono z DepotDownloader!" << std::endl;
+
+ comunicate = true;
+
+ std::thread rcv(recieveMessage, hPipe, depot);
+ rcv.detach();
+
+
+ // const char* args = "arguments";
+ // DWORD bytesWritten;
+ // WriteFile(hPipe, args, strlen(args) + 1, &bytesWritten, NULL);
+}
+
+void download_game2(std::string gamerun_path)
{
if (SteamCMDCheck() == true)
{
@@ -55,4 +301,46 @@ void download_game(std::string gamerun_path)
}
reset_play_button_text();
+}
+
+void download_game(std::string gamerun_path)
+{
+ depotProsp depot;
+
+ fs::path destPath = fs::path(steam_game_dir) / "Slime Rancher";
+ depot.path = destPath.string();
+
+ depot.manifestid = versions_map[instances_list[mounted_instance].getVer()].manifest;
+ depot.username = decryptor(steam_profile_name);
+ depot.password = decryptor(steam_profile_passwd);
+ depot.appid = "433340";
+ depot.depotid = "433342";
+ depot.runpath = gamerun_path;
+
+ if (downloader_selected == depotdownloader)
+ {
+ if (!depot.username.empty())
+ {
+ if (!depot.password.empty())
+ {
+ downloaderPipe(depot);
+ }
+ else
+ {
+ std::string msg = "Cannot download game: No steam password configured!";
+ log_message(msg, LOG_TYPES::LOG_ERROR);
+ MessageBoxA(NULL, msg.c_str(), "Error", MB_ICONERROR | MB_OK);
+ }
+ }
+ else
+ {
+ std::string msg = "Cannot download game: No steam username configured!";
+ log_message(msg, LOG_TYPES::LOG_ERROR);
+ MessageBoxA(NULL, msg.c_str(), "Error", MB_ICONERROR | MB_OK);
+ }
+ }
+ else if (downloader_selected == steamcmd)
+ {
+ download_game2(gamerun_path);
+ }
}
\ No newline at end of file
diff --git a/src/headers/Functions/Launch/run_game.hpp b/src/headers/Functions/Launch/run_game.hpp
index dfa67bc..4fded55 100644
--- a/src/headers/Functions/Launch/run_game.hpp
+++ b/src/headers/Functions/Launch/run_game.hpp
@@ -4,7 +4,9 @@ void run_game(std::string path)
launch_last_instance_button.setText("Running");
ShowWindow(launcherWindow, SW_MINIMIZE);
game_running = true;
+ window.setFramerateLimit(5);
system(formatPathForSystem(path).c_str());
+ window.setFramerateLimit(15);
ShowWindow(launcherWindow, SW_RESTORE);
game_running = false;
reset_play_button_text();
@@ -28,7 +30,7 @@ std::string compile_current_date()
void reset_play_button_text()
{
- launch_last_instance_button.setText("Launch mounted instance");
+ launch_last_instance_button.setText("Launch instance");
}
bool create_achivements_backup()
diff --git a/src/headers/Functions/Logs/log_message.hpp b/src/headers/Functions/Logs/log_message.hpp
index 11f265c..ca4d120 100644
--- a/src/headers/Functions/Logs/log_message.hpp
+++ b/src/headers/Functions/Logs/log_message.hpp
@@ -1,3 +1,5 @@
+sfg::Textfield console;
+
void log_message(std::string message, int type)
{
std::time_t t = std::time(0);
@@ -53,6 +55,8 @@ void log_message(std::string message, int type)
log_output += std::to_string(cur_H) + ":" + std::to_string(cur_M) + ":" + std::to_string(cur_S) + " " + message;
+ console.addText(log_output);
+
std::cout << log_output;
if (display_log_colors == true)
{
diff --git a/src/headers/Functions/Settings/defaults/dafault_paths.hpp b/src/headers/Functions/Settings/defaults/dafault_paths.hpp
index f9a8edd..dd251fe 100644
--- a/src/headers/Functions/Settings/defaults/dafault_paths.hpp
+++ b/src/headers/Functions/Settings/defaults/dafault_paths.hpp
@@ -1,10 +1,6 @@
void setDefault_paths()
{
- steam_game_dir = get_steam_default_path();
- instances_dir = instances_path.string();
- steamcmd_dir = cmd_path.string();
-
- SlimeRancher_steam_path_textbox.setText(steam_game_dir);
- SlimeRancher_instances_path_textbox.setText(instances_dir);
- steamcmd_path_textbox.setText(steamcmd_dir);
+ steam_gamedir_def();
+ instances_dir_def();
+ steamcmd_dir_def();
}
\ No newline at end of file
diff --git a/src/headers/Functions/Settings/defaults/default_checkboxes.hpp b/src/headers/Functions/Settings/defaults/default_checkboxes.hpp
index 9086e7f..5be7dfb 100644
--- a/src/headers/Functions/Settings/defaults/default_checkboxes.hpp
+++ b/src/headers/Functions/Settings/defaults/default_checkboxes.hpp
@@ -1,21 +1,14 @@
void setDefault_checkboxes()
{
- show_prerelease_version = true;
- Show_older_instances_checkbox.setState(show_prerelease_version);
-
- save_log_files = true;
- Save_logs_files_checkbox.setState(save_log_files);
-
- loging_manualy = false;
- login_manualy_checkbox.setState(loging_manualy);
-
- display_log_colors = true;
- Colored_logs_checkbox.setState(display_log_colors);
-
- autolaunch_instances = true;
- automatically_run_downloaded_instances_checkbox.setState(autolaunch_instances);
-
- show_warnings = true;
- do_not_show_warnings_checkbox.setState(show_warnings);
+ show_prerelease_def();
+ save_logs_def();
+ logs_color_def();
+ autolaunch_instances_def();
+ show_warns_def();
+ autocheck_updates_def();
+
unlock_profile_textboxes();
+
+ theme_def();
+ downloader_def();
}
\ No newline at end of file
diff --git a/src/headers/Functions/Settings/lock/lock.hpp b/src/headers/Functions/Settings/lock/lock.hpp
index 7332ac7..5e62ee7 100644
--- a/src/headers/Functions/Settings/lock/lock.hpp
+++ b/src/headers/Functions/Settings/lock/lock.hpp
@@ -1,7 +1,7 @@
void lock_profile_textboxes()
{
SteamProfile_name_textbox.setReadOnlyMode(true);
- // SteamProfile_password_textbox.setReadOnlyMode(true);
+ SteamProfile_password_textbox.setReadOnlyMode(true);
SlimeRancher_instances_path_textbox.setReadOnlyMode(true);
SlimeRancher_steam_path_textbox.setReadOnlyMode(true);
diff --git a/src/headers/Functions/Settings/lock/unlock.hpp b/src/headers/Functions/Settings/lock/unlock.hpp
index a269013..33cfa8a 100644
--- a/src/headers/Functions/Settings/lock/unlock.hpp
+++ b/src/headers/Functions/Settings/lock/unlock.hpp
@@ -1,7 +1,7 @@
void unlock_profile_textboxes()
{
SteamProfile_name_textbox.setReadOnlyMode(false);
- // SteamProfile_password_textbox.setReadOnlyMode(false);
+ SteamProfile_password_textbox.setReadOnlyMode(false);
SlimeRancher_instances_path_textbox.setReadOnlyMode(false);
SlimeRancher_steam_path_textbox.setReadOnlyMode(false);
diff --git a/src/headers/Functions/Userdata/get_steam_default_path.hpp b/src/headers/Functions/Userdata/get_steam_default_path.hpp
index cb792a3..bee15ed 100644
--- a/src/headers/Functions/Userdata/get_steam_default_path.hpp
+++ b/src/headers/Functions/Userdata/get_steam_default_path.hpp
@@ -5,4 +5,13 @@ std::string get_steam_default_path()
std::filesystem::path programFilesX86Path(buffer);
std::filesystem::path steamPath = programFilesX86Path / "Steam" / "steamapps" / "common";
return steamPath.string();
+}
+
+std::string get_steamLocation_default_path()
+{
+ wchar_t buffer[MAX_PATH];
+ DWORD size = GetEnvironmentVariableW(L"ProgramFiles(x86)", buffer, MAX_PATH);
+ std::filesystem::path programFilesX86Path(buffer);
+ std::filesystem::path steamPath = programFilesX86Path / "Steam";
+ return steamPath.string();
}
\ No newline at end of file
diff --git a/src/headers/Functions/Userdata/get_steam_profile.hpp b/src/headers/Functions/Userdata/get_steam_profile.hpp
new file mode 100644
index 0000000..b2b2509
--- /dev/null
+++ b/src/headers/Functions/Userdata/get_steam_profile.hpp
@@ -0,0 +1,137 @@
+UserData parseProfileData()
+{
+ VDFParser vdf(steam_default_path.string() + "/config/loginusers.vdf");
+
+ auto ProfileJson = JSON::parse(vdf.toJSON(vdf.getRoot()));
+
+ UserData data;
+
+ for (const auto& pair : ProfileJson.getObject().at("users").getObject())
+ {
+ data.uid = pair.first;
+ if (data.uid != "users")
+ {
+ if (ProfileJson.getObject().at("users").getObject().at(data.uid).getObject().at("AccountName").getString() == SteamProfile_name_textbox.getText())
+ {
+ break;
+ }
+ else
+ {
+ continue;
+ }
+ }
+ }
+
+ // data.uid = ProfileJson.getObject().at("users").getObject().at(data.uid);
+
+ data.accountName = ProfileJson.getObject().at("users").getObject().at(data.uid).getObject().at("AccountName").getString();
+ data.personalName = ProfileJson.getObject().at("users").getObject().at(data.uid).getObject().at("PersonaName").getString();
+
+ steam_profile_AccountName_text.setString("Account name: " + data.accountName);
+ steam_profile_PersonalName_text.setString("Personal name: " + data.personalName);
+ steam_profile_UID_text.setString("Steam UID: " + data.uid);
+
+ if (fs::exists(steam_default_path.string() + "/config/avatarcache/" + data.uid + ".png") && fs::is_regular_file(steam_default_path.string() + "/config/avatarcache/" + data.uid + ".png"))
+ {
+ userAvatar_tx.loadFromFile(steam_default_path.string() + "/config/avatarcache/" + data.uid + ".png");
+ steam_profile_icon.setTexture(userAvatar_tx);
+ }
+ return data;
+}
+
+int getUserOfflineMode()
+{
+ try
+ {
+ VDFParser vdf(steam_default_path.string() + "/config/loginusers.vdf");
+
+ auto ProfileJson = JSON::parse(vdf.toJSON(vdf.getRoot()));
+ std::string uid;
+
+ for (const auto& pair : ProfileJson.getObject().at("users").getObject())
+ {
+ uid = pair.first;
+ if (uid != "users")
+ {
+ if (ProfileJson.getObject().at("users").getObject().at(uid).getObject().at("AccountName").getString() == SteamProfile_name_textbox.getText())
+ {
+ break;
+ }
+ else
+ {
+ continue;
+ }
+ }
+ }
+
+ if (ProfileJson.getObject().at("users").getObject().at(uid).getObject().at("WantsOfflineMode").getString() == "1")
+ {
+ steam_profile_offline_status_text.setString("OFFLINE mode: enabled");
+ return result_offline;
+ }
+ else
+ {
+ steam_profile_offline_status_text.setString("OFFLINE mode: disabled");
+ return result_online;
+ }
+ }
+ catch (std::runtime_error e)
+ {
+ log_message("Cannot read Steam userdata: " + std::string(e.what()), LOG_TYPES::LOG_ERROR);
+ steam_profile_offline_status_text.setString("OFFLINE mode: unknown");
+ return result_fail;
+ }
+
+ steam_profile_offline_status_text.setString("OFFLINE mode: unknown");
+ return result_fail;
+}
+
+bool getSteamProfile()
+{
+ SteamAccountSettingsUI::steam_profile_AccountName_text.setString("");
+ SteamAccountSettingsUI::steam_profile_UID_text.setString("");
+ SteamAccountSettingsUI::steam_profile_PersonalName_text.setString("");
+ SteamAccountSettingsUI::steam_profile_offline_status_text.setString("");
+ SteamAccountSettingsUI::steam_profile_icon.setTexture(profile_icon_tx);
+ if (fs::exists(steam_default_path) && fs::is_directory(steam_default_path))
+ {
+ try
+ {
+ user_offline_mode = getUserOfflineMode();
+ if (!parseProfileData().uid.empty())
+ {
+ Profile_warning_text.setString("");
+ return true;
+ }
+ else
+ {
+ throw(std::runtime_error("cannot get user data"));
+ }
+ }
+ catch (std::runtime_error e)
+ {
+ log_message("Cannot read Steam userdata: " + std::string(e.what()), LOG_TYPES::LOG_ERROR);
+ Profile_warning_text.setString("Cannot get informations about steam user with given name.\nIf steam is installed and user logged, check steam directory path.");
+ return false;
+ }
+ catch (std::out_of_range e)
+ {
+ log_message("Cannot read Steam userdata: " + std::string(e.what()), LOG_TYPES::LOG_ERROR);
+ Profile_warning_text.setString("Cannot get informations about steam user with given name.\nIf steam is installed and user logged, check steam directory path.");
+ return false;
+ }
+ }
+ else
+ {
+ Profile_warning_text.setString("Cannot get informations about steam user with given name.\nIf steam is installed and user logged, check steam directory path.");
+ return false;
+ }
+
+ Profile_warning_text.setString("Cannot get informations about steam user with given name.\nIf steam is installed and user logged, check steam directory path.");
+ return false;
+}
+
+void getSteamAccountStats()
+{
+ bool result = getSteamProfile();
+}
\ No newline at end of file
diff --git a/src/headers/Functions/Userdata/textbox_data.hpp b/src/headers/Functions/Userdata/textbox_data.hpp
index b45211b..3442a7c 100644
--- a/src/headers/Functions/Userdata/textbox_data.hpp
+++ b/src/headers/Functions/Userdata/textbox_data.hpp
@@ -9,13 +9,20 @@ void get_textbox_settings_values_and_save()
autolaunch_instances = automatically_run_downloaded_instances_checkbox.getState();
show_warnings = do_not_show_warnings_checkbox.getState();
show_prerelease_version = Show_older_instances_checkbox.getState();
+
+ check_updates_when_start = autocheck_for_update_checkbox.getState();
+
+ std::string result = theme_list_ddl.getRResult();
+ theme_selected = std::stoi(result);
+
+ result = downloaders_ddl.getRResult();
+ downloader_selected = std::stoi(result);
update_config_file();
}
void get_profile_textboxes_values_and_save()
{
steam_profile_name = encryptor(SteamProfile_name_textbox.getText());
- // steam_profile_passwd = encryptor(SteamProfile_password_textbox.getText());
- loging_manualy = login_manualy_checkbox.getState();
+ steam_profile_passwd = encryptor(SteamProfile_password_textbox.getText());
update_config_file();
}
\ No newline at end of file
diff --git a/src/headers/Functions/mouse/left.hpp b/src/headers/Functions/mouse/left.hpp
index 7599975..e586428 100644
--- a/src/headers/Functions/mouse/left.hpp
+++ b/src/headers/Functions/mouse/left.hpp
@@ -3,14 +3,14 @@ void executeCategories(sf::Vector2f mouse)
MainCategory_button.update(mouse);
InstancesCategory_button.update(mouse);
SettingsCategory_button.update(mouse);
- SavesToolCategory_button.update(mouse);
+ VersionsCategory_button.update(mouse);
}
void executeSubcategories(sf::Vector2f mouse)
{
Subcat_settings_main_button.update(mouse);
Subcat_settings_progile_button.update(mouse);
- Subcat_settings_versions_button.update(mouse);
+ Subcat_settings_updates_button.update(mouse);
Subcat_settings_credits_button.update(mouse);
}
@@ -23,6 +23,13 @@ void mouse_left()
executeCategories(mouse);
launch_last_instance_button.update(mouse);
+
+ console_clear_button.update(mouse);
+
+ if (display_guard_window == true)
+ {
+ GuardBox.update(mouse);
+ }
}
if (UI_current == UI_PAGES::InstancesMenu)
@@ -124,6 +131,7 @@ void mouse_left()
{
is_mouse_pressed = true;
remove_instnace_function(pair.first);
+ break;
}
}
else
@@ -141,11 +149,11 @@ void mouse_left()
if (options_ui == SETTIGNS_CATEGORIES::MAIN_PAGE)
{
- SlimeRancher_steam_path_textbox.update();
- SlimeRancher_instances_path_textbox.update();
+ SlimeRancher_steam_path_textbox.update(mouse);
+ SlimeRancher_instances_path_textbox.update(mouse);
SlimeRancher_steam_path_getfolder_button.update(mouse);
SlimeRancher_instances_path_getfolder_button.update(mouse);
- steamcmd_path_textbox.update();
+ steamcmd_path_textbox.update(mouse);
steamcmd_path_getfolder_button.update(mouse);
Show_older_instances_checkbox.update(mouse);
@@ -157,19 +165,89 @@ void mouse_left()
RestoreSettings_button.update(mouse);
SaveConfig_button.update(mouse);
+
+ theme_list_ddl.update(mouse);
+ downloaders_ddl.update(mouse);
}
if (options_ui == SETTIGNS_CATEGORIES::PROFILE_PAGE)
{
- SteamProfile_name_textbox.update();
- // SteamProfile_password_textbox.update();
+ SteamProfile_name_textbox.update(mouse);
+ SteamProfile_password_textbox.update(mouse);
save_profile_button.update(mouse);
- login_manualy_checkbox.update(mouse);
+ }
+ if (options_ui == SETTIGNS_CATEGORIES::UPDATES_PAGE)
+ {
+ check_for_update_button.update(mouse);
+ autocheck_for_update_checkbox.update(mouse);
+
+ RestoreSettings_button.update(mouse);
+ SaveConfig_button.update(mouse);
}
}
- if (UI_current == UI_PAGES::DataToolsMenu)
+ if (UI_current == UI_PAGES::ManageMenu)
+ {
+ manage_vanilla_saves_button.update(mouse);
+ manage_mod_saves_button.update(mouse);
+ manage_betterbuild_world_button.update(mouse);
+ manage_backups_button.update(mouse);
+ manage_mods_button.update(mouse);
+ manage_main_back_button.update(mouse);
+
+ switch(manage_ui)
+ {
+ case MNG_MAIN_PAGE:
+ {
+ break;
+ }
+ case VANILLA_SAVES:
+ {
+ break;
+ }
+ case BETTERBUILD_WORLDS:
+ {
+ for (const auto& pair : betterbuildworlds_list)
+ {
+ betterbuildworlds_list[pair.first].update(mouse);
+ }
+ break;
+ }
+ case MODS_PAGE:
+ {
+ for (const auto& pair : InstanceMods_list)
+ {
+ InstanceMods_list[pair.first].update(mouse);
+ }
+ break;
+ }
+ }
+ }
+
+ if (UI_current == UI_PAGES::VersionDescriptionMenu)
+ {
+ version_back_button.update(mouse);
+ }
+
+ if (UI_current == UI_PAGES::VersionsList)
{
executeCategories(mouse);
+
+ for (const auto& pair : versions_pachnotes_list)
+ {
+ if (Show_older_instances_checkbox.getState() == true and versions_map[versions_pachnotes_list[pair.first].getVersion()].version_type != "pre_release")
+ {
+ versions_pachnotes_list[pair.first].update(mouse);
+ if (versions_pachnotes_list[pair.first].getPosition().y > 65)
+ {
+ if (versions_pachnotes_list[pair.first].hitbox().contains(mouse) && sf::Mouse::isButtonPressed(sf::Mouse::Left))
+ {
+ version_description_text.setString(versions_pachnotes_list[pair.first].getDescription());
+ version_description_text.setPosition(10, 10);
+ UI_current = UI_PAGES::VersionDescriptionMenu;
+ }
+ }
+ }
+ }
}
if (UI_current == UI_PAGES::NewInstanceMenu)
@@ -178,7 +256,7 @@ void mouse_left()
if (versions_list.getState() == false)
{
- new_instance_name_textbox.update();
+ new_instance_name_textbox.update(mouse);
create_button.update(mouse);
instance_creation_cancel.update(mouse);
}
@@ -188,8 +266,8 @@ void mouse_left()
{
if (versions_list.getState() == false)
{
- import_instance_name_textbox.update();
- import_instance_path_textbox.update();
+ import_instance_name_textbox.update(mouse);
+ import_instance_path_textbox.update(mouse);
import_instance_path_browse_button.update(mouse);
import_instance_confirm_button.update(mouse);
import_instance_cancel_button.update(mouse);
diff --git a/src/headers/Functions/updates/launcher_update_check.hpp b/src/headers/Functions/updates/launcher_update_check.hpp
new file mode 100644
index 0000000..f2bd0ad
--- /dev/null
+++ b/src/headers/Functions/updates/launcher_update_check.hpp
@@ -0,0 +1,43 @@
+void checkUpdate()
+{
+ std::string HTMLbuffer = fetchHTML("https://raw.githubusercontent.com/MinecraftSRDEV/SRLauncher/refs/heads/main/src/headers/Declarations/varriables.hpp");
+
+ std::string target = "std::string launcher_version =";
+ size_t found = HTMLbuffer.find(target);
+
+ if (found != std::string::npos)
+ {
+ try
+ {
+ size_t start = HTMLbuffer.find('"', found);
+ if (start != std::string::npos)
+ {
+ start++;
+ size_t end = HTMLbuffer.find('"', start);
+ if (end != std::string::npos)
+ {
+ std::string launcherVersion = HTMLbuffer.substr(start, end - start);
+ if (launcher_version != launcherVersion)
+ {
+ std::string text = "New Launcher version is available: " + launcherVersion + "\n\nYou have: " + launcher_version;
+ update_status_text.setString(text);
+ MessageBoxA(NULL, text.c_str(), "Update Available", MB_ICONINFORMATION | MB_OK);
+ }
+ else
+ {
+ update_status_text.setString("You have latest version");
+ }
+ }
+ }
+ }
+ catch (std::out_of_range e)
+ {
+ std::string err = e.what();
+ update_status_text.setString("Cannot check for updates: \n" + err);
+ }
+ }
+ else
+ {
+ update_status_text.setString("Cannot check for updates");
+ }
+}
\ No newline at end of file
diff --git a/src/headers/Functions/window/draw.hpp b/src/headers/Functions/window/draw.hpp
index 0c477d1..fc6f8a8 100644
--- a/src/headers/Functions/window/draw.hpp
+++ b/src/headers/Functions/window/draw.hpp
@@ -4,7 +4,7 @@ void renderCategories()
MainCategory_button.render(window);
InstancesCategory_button.render(window);
SettingsCategory_button.render(window);
- SavesToolCategory_button.render(window);
+ VersionsCategory_button.render(window);
}
void window_draw()
@@ -15,6 +15,9 @@ void window_draw()
{
renderCategories();
+ console.render(window);
+ console_clear_button.render(window);
+
last_played_bg.render(window);
launch_last_instance_button.render(window);
@@ -26,6 +29,20 @@ void window_draw()
window.draw(Mounted_instance_info_text);
window.draw(Launcher_version_text);
+ if (mounted_instance_version.getString() != "")
+ {
+ window.draw(mounted_instance_version);
+ }
+
+ if (display_download_progress == true)
+ {
+ window.draw(downloading_progress_text);
+ }
+
+ if (display_guard_window == true)
+ {
+ GuardBox.render(window);
+ }
}
if (UI_current == UI_PAGES::InstancesMenu)
@@ -36,9 +53,16 @@ void window_draw()
new_instance_button.render(window);
import_instnace_button.render(window);
- for (const auto& pair : instances_list)
+ if (instancesListLoading == false)
+ {
+ for (const auto& pair : instances_list)
+ {
+ instances_list[pair.first].render(window);
+ }
+ }
+ else
{
- instances_list[pair.first].render(window);
+ window.draw(dataLoading_text);
}
}
@@ -70,6 +94,70 @@ void window_draw()
versions_list.render(window);
}
+ if (UI_current == UI_PAGES::ManageMenu)
+ {
+ manage_bg.render(window);
+
+ manage_vanilla_saves_button.render(window);
+ manage_mod_saves_button.render(window);
+ manage_betterbuild_world_button.render(window);
+ manage_backups_button.render(window);
+ manage_mods_button.render(window);
+ manage_main_back_button.render(window);
+
+ manage_cats_separator.render(window);
+
+ if (instanceDataLoading == true)
+ {
+ window.draw(dataLoading_text);
+ }
+
+ switch(manage_ui)
+ {
+ case MNG_MAIN_PAGE:
+ {
+ window.draw(MNG_Instance_name_text);
+ window.draw(MNG_installed_mods_text);
+ window.draw(MNG_Instance_saves_text);
+ window.draw(MNG_instance_mods_own_text);
+ window.draw(MNG_instance_mods_launcher_text);
+ break;
+ }
+ case BETTERBUILD_WORLDS:
+ {
+ for (const auto& pair : betterbuildworlds_list)
+ {
+ betterbuildworlds_list[pair.first].render(window);
+ window.draw(bbw_tittle_text);
+ }
+ break;
+ }
+ case MODS_PAGE:
+ {
+ window.draw(list_mods_instance_text);
+ window.draw(list_mods_launcher_text);
+ mods_separator.render(window);
+
+ for (const auto& pair : InstanceMods_list)
+ {
+ InstanceMods_list[pair.first].render(window);
+ }
+ for (const auto& pair : LauncherMods_list)
+ {
+ LauncherMods_list[pair.first].render(window);
+ }
+ break;
+ }
+ }
+ }
+
+ if (UI_current == UI_PAGES::VersionDescriptionMenu)
+ {
+ ver_desc_bg.render(window);
+ window.draw(version_description_text);
+ version_back_button.render(window);
+ }
+
if (UI_current == UI_PAGES::SettingsMenu)
{
renderCategories();
@@ -77,9 +165,11 @@ void window_draw()
settings_bg.render(window);
Subcat_settings_main_button.render(window);
Subcat_settings_progile_button.render(window);
- Subcat_settings_versions_button.render(window);
+ Subcat_settings_updates_button.render(window);
Subcat_settings_credits_button.render(window);
+ subcat_separator.render(window);
+
if (options_ui == SETTIGNS_CATEGORIES::MAIN_PAGE)
{
SlimeRancher_steam_path_textbox.render(window);
@@ -98,20 +188,52 @@ void window_draw()
RestoreSettings_button.render(window);
SaveConfig_button.render(window);
+
+ window.draw(theme_label_text);
+ theme_list_ddl.render(window);
+ window.draw(downloaders_list_text);
+ downloaders_ddl.render(window);
}
if (options_ui == SETTIGNS_CATEGORIES::PROFILE_PAGE)
{
SteamProfile_name_textbox.render(window);
- // SteamProfile_password_textbox.render(window);
+ SteamProfile_password_textbox.render(window);
save_profile_button.render(window);
- login_manualy_checkbox.render(window);
+ window.draw(steam_profile_icon);
+
+ window.draw(Profile_warning_text);
+
+ window.draw(steam_profile_offline_status_text);
+ window.draw(steam_profile_AccountName_text);
+ window.draw(steam_profile_PersonalName_text);
+ window.draw(steam_profile_UID_text);
+ }
+ if (options_ui == SETTIGNS_CATEGORIES::UPDATES_PAGE)
+ {
+ check_for_update_button.render(window);
+ autocheck_for_update_checkbox.render(window);
+ window.draw(update_status_text);
+
+ RestoreSettings_button.render(window);
+ SaveConfig_button.render(window);
+ }
+ if (options_ui == SETTIGNS_CATEGORIES::CREDITS_PAGE)
+ {
+ window.draw(credits_programming_text);
}
}
- if (UI_current == UI_PAGES::DataToolsMenu)
+ if (UI_current == UI_PAGES::VersionsList)
{
- renderCategories();
+ versions_bg.render(window);
+ for (const auto& pair : versions_pachnotes_list)
+ {
+ if (Show_older_instances_checkbox.getState() == true and versions_map[versions_pachnotes_list[pair.first].getVersion()].version_type != "pre_release")
+ {
+ versions_pachnotes_list[pair.first].render(window);
+ }
+ }
- datatools_bg.render(window);
+ renderCategories();
}
}
\ No newline at end of file
diff --git a/src/headers/ResourceLoad/loadElements.hpp b/src/headers/ResourceLoad/loadElements.hpp
index c8d69aa..15e0756 100644
--- a/src/headers/ResourceLoad/loadElements.hpp
+++ b/src/headers/ResourceLoad/loadElements.hpp
@@ -3,4 +3,5 @@ void loadElements()
font.loadFromFile("./assets/resources/arial.ttf");
bg_texture.loadFromFile("./assets/resources/background.png");
+ profile_icon_tx.loadFromFile("./assets/resources/unknown_user.png");
}
\ No newline at end of file
diff --git a/src/headers/ResourceLoad/loadJsons.hpp b/src/headers/ResourceLoad/loadJsons.hpp
index ecf5613..b2afc55 100644
--- a/src/headers/ResourceLoad/loadJsons.hpp
+++ b/src/headers/ResourceLoad/loadJsons.hpp
@@ -1,3 +1,117 @@
+void positionListElements()
+{
+ int ver_last_x = 100;
+ int ver_last_y = 85;
+ for (const auto& pair : versions_pachnotes_list)
+ {
+ if (Show_older_instances_checkbox.getState() == true and versions_map[versions_pachnotes_list[pair.first].getVersion()].version_type != "pre_release")
+ {
+ versions_pachnotes_list[pair.first].reposition(ver_last_x, ver_last_y);
+ ver_last_x += 266;
+ if (ver_last_x > 940)
+ {
+ ver_last_x = 100;
+ ver_last_y += 190;
+ }
+ }
+ }
+}
+
+void loadVersionPachnotes(const std::string& name, int iteration)
+{
+ std::string path_toNotes = "./assets/resources/pachNotes/" + name + ".txt";
+ std::string path_toImg = "./assets/resources/pachNotes/" + name + ".png";
+ std::ifstream file;
+ file.open(path_toNotes.c_str());
+ if (file)
+ {
+ std::string full;
+ full.erase();
+ std::string line;
+ while(getline(file, line))
+ {
+ std::vector lines;
+ while (line.length() > 100)
+ {
+ std::string output = line.substr(0, 89);
+ lines.emplace_back(output);
+ line = line.substr(89);
+ }
+ lines.emplace_back(line);
+
+ for (auto& it : lines)
+ {
+ full += it;
+ full += "\n";
+ }
+ lines.clear();
+
+ }
+
+ sf::Texture imageTx;
+ if (fs::exists(fs::path(path_toImg)))
+ {
+ imageTx.loadFromFile(path_toImg.c_str());
+ }
+ else
+ {
+ imageTx.loadFromFile("./assets/resources/pachNotes/noImage.png");
+ }
+
+ versions_pachnotes_list[iteration].create(0, 0, font, imageTx, name, full, theme_selected);
+ }
+ file.close();
+ positionListElements();
+}
+
+void create_mods_directories(const SRVersion& prsp)
+{
+ if (prsp.mod_support == true)
+ {
+ if (prsp.version_type == "pre-release")
+ {
+ directory_auto(SMTFolder_path.string() + "/" + prsp.version_name);
+ if (prsp.version_name == "0.2.6")
+ {
+ try
+ {
+ if (!fs::exists(SMTFolder_path / "0.2.6/SRMultimod.dll"))
+ {
+ fs::copy_file(fs::path("./assets/components/mods/SRMultimod.dll"), SMTFolder_path / "0.2.6/SRMultimod.dll");
+ }
+ else
+ {
+ MD5 ModHash;
+ std::string installedMD5 = ModHash.calculateFromFile(fs::path(SMTFolder_path / "0.2.6/SRMultimod.dll").string());
+ std::string includedMD5 = ModHash.calculateFromFile("./assets/components/mods/SRMultimod.dll");
+
+ if (installedMD5 != includedMD5)
+ {
+ fs::remove(SMTFolder_path / "0.2.6/SRMultimod.dll");
+ fs::copy_file(fs::path("./assets/components/mods/SRMultimod.dll"), SMTFolder_path / "0.2.6/SRMultimod.dll");
+ log_message("Included MultiMod MD5 wrong", LOG_TYPES::LOG_WARN);
+ }
+ }
+ }
+ catch (fs::filesystem_error e)
+ {
+ return;
+ }
+ catch (std::runtime_error e)
+ {
+
+ }
+ }
+ }
+ else
+ {
+ directory_auto(UMFmodsFolder_path.string() + "/" + prsp.version_name);
+ directory_auto(SRMLmodsFolder_path.string() + "/" + prsp.version_name);
+ directory_auto(SMLFolder_path.string() + "/" + prsp.version_name);
+ }
+ }
+}
+
bool load_versions_list()
{
try
@@ -16,7 +130,10 @@ bool load_versions_list()
output.mod_support = versionObject.getObject().at("mod_support").getBool();
output.release_date = versionObject.getObject().at("date").getString();
output.manifest = versionObject.getObject().at("manifest").getString();
+ output.itr = versionObject.getObject().at("iteration").getNumber();
+ loadVersionPachnotes(name, output.itr);
+ create_mods_directories(output);
versions_map[output.version_name] = output;
}
}
@@ -34,6 +151,63 @@ bool load_versions_list()
}
return true;
}
+std::string get_steam_default_path();
+
+void steam_gamedir_def()
+{
+ steam_game_dir = get_steam_default_path();
+ SlimeRancher_steam_path_textbox.setText(steam_game_dir);
+}
+void instances_dir_def()
+{
+ instances_dir = instances_path.string();
+ SlimeRancher_instances_path_textbox.setText(instances_dir);
+}
+void steamcmd_dir_def()
+{
+ steamcmd_dir = cmd_path.string();
+ steamcmd_path_textbox.setText(steamcmd_dir);
+}
+void show_prerelease_def()
+{
+ show_prerelease_version = true;
+ Show_older_instances_checkbox.setState(show_prerelease_version);
+}
+void save_logs_def()
+{
+ save_log_files = true;
+ Save_logs_files_checkbox.setState(save_log_files);
+}
+void logs_color_def()
+{
+ display_log_colors = true;
+ Colored_logs_checkbox.setState(display_log_colors);
+}
+void autolaunch_instances_def()
+{
+ autolaunch_instances = true;
+ automatically_run_downloaded_instances_checkbox.setState(autolaunch_instances);
+}
+void show_warns_def()
+{
+ show_warnings = true;
+ do_not_show_warnings_checkbox.setState(show_warnings);
+}
+void autocheck_updates_def()
+{
+ check_updates_when_start = true;
+ autocheck_for_update_checkbox.setState(check_updates_when_start);
+}
+
+void theme_def()
+{
+ theme_selected = ColorPalete::Bright;
+}
+
+void downloader_def()
+{
+ downloader_selected = depotdownloader;
+}
bool load_config_file(std::string path_to_config)
{
@@ -41,41 +215,115 @@ bool load_config_file(std::string path_to_config)
{
JSON json = JSON::parseFromFile(path_to_config);
- steam_game_dir = reduceBackslashes(json.getObject().at("steam_game_dir").getString());
- log_message("Steam game dir: " + steam_game_dir, LOG_TYPES::LOG_INFO);
+ try
+ {
+ steam_game_dir = reduceBackslashes(json.getObject().at("steam_game_dir").getString());
+ log_message("Steam game dir: " + steam_game_dir, LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);steam_gamedir_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);steam_gamedir_def();}
+
+ try
+ {
+ mounted_instance = json.getObject().at("mounted_instance").getString();
+ log_message("Mounted instance: " + mounted_instance, LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);}
+
+ try
+ {
+ instances_dir = reduceBackslashes(json.getObject().at("instances_dir").getString());
+ log_message("Instances dir: " + instances_dir, LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);instances_dir_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);instances_dir_def();}
- mounted_instance = json.getObject().at("mounted_instance").getString();
- log_message("Mounted instance: " + mounted_instance, LOG_TYPES::LOG_INFO);
+ try
+ {
+ steamcmd_dir = reduceBackslashes(json.getObject().at("steamcmd_dir").getString());
+ log_message("SteamCMD dir: " + steamcmd_dir, LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);steamcmd_dir_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);steamcmd_dir_def();}
- instances_dir = reduceBackslashes(json.getObject().at("instances_dir").getString());
- log_message("Instances dir: " + instances_dir, LOG_TYPES::LOG_INFO);
+ try
+ {
+ steam_profile_name = json.getObject().at("spn").getString();
+ steam_profile_passwd = json.getObject().at("spp").getString();
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);}
- steamcmd_dir = reduceBackslashes(json.getObject().at("steamcmd_dir").getString());
- log_message("SteamCMD dir: " + steamcmd_dir, LOG_TYPES::LOG_INFO);
+ try
+ {
+ saved_version = json.getObject().at("saved_version").getString();
+ log_message("Saved version: " + saved_version, LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);}
- steam_profile_name = json.getObject().at("spn").getString();
- // steam_profile_passwd = json.getObject().at("spp").getString();
+ try
+ {
+ save_log_files = json.getObject().at("save_logs").getBool();
+ log_message("Log file autosave: " + std::to_string(save_log_files), LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);save_logs_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);save_logs_def();}
- saved_version = json.getObject().at("saved_version").getString();
- log_message("Saved version: " + saved_version, LOG_TYPES::LOG_INFO);
+ try
+ {
+ display_log_colors = json.getObject().at("colored_logs").getBool();
+ log_message("Colored logs: " + std::to_string(display_log_colors), LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);logs_color_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);logs_color_def();}
- save_log_files = json.getObject().at("save_logs").getBool();
- log_message("Log file autosave: " + std::to_string(save_log_files), LOG_TYPES::LOG_INFO);
+ try
+ {
+ show_prerelease_version = json.getObject().at("show_prereleases").getBool();
+ log_message("Show pre-release game versions: " + std::to_string(show_prerelease_version), LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);show_prerelease_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);show_prerelease_def();}
- display_log_colors = json.getObject().at("colored_logs").getBool();
- log_message("Colored logs: " + std::to_string(display_log_colors), LOG_TYPES::LOG_INFO);
+ try
+ {
+ autolaunch_instances = json.getObject().at("auto_launch").getBool();
+ log_message("autolaunch instances: " + std::to_string(autolaunch_instances), LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);autolaunch_instances_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);autolaunch_instances_def();}
- show_prerelease_version = json.getObject().at("show_prereleases").getBool();
- log_message("Show pre-release game versions: " + std::to_string(show_prerelease_version), LOG_TYPES::LOG_INFO);
+ try
+ {
+ show_warnings = json.getObject().at("show_warnings").getBool();
+ log_message("show_warnings: " + std::to_string(show_warnings), LOG_TYPES::LOG_INFO);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);show_warns_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);show_warns_def();}
- loging_manualy = json.getObject().at("login_manually").getBool();
- log_message("Login manually: " + std::to_string(loging_manualy), LOG_TYPES::LOG_INFO);
+ try
+ {
+ check_updates_when_start = json.getObject().at("auto_update_check").getBool();
+ autocheck_for_update_checkbox.setState(check_updates_when_start);
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);autocheck_updates_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);autocheck_updates_def();}
- autolaunch_instances = json.getObject().at("auto_launch").getBool();
- log_message("autolaunch instances: " + std::to_string(autolaunch_instances), LOG_TYPES::LOG_INFO);
+ try
+ {
+ theme_selected = json.getObject().at("theme").getNumber();
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);theme_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);theme_def();}
- show_warnings = json.getObject().at("show_warnings").getBool();
- log_message("show_warnings: " + std::to_string(show_warnings), LOG_TYPES::LOG_INFO);
+ try
+ {
+ downloader_selected = json.getObject().at("downloader").getNumber();
+ }
+ catch (std::runtime_error re){std::string errmsg = re.what();log_message("Json error: " + errmsg, LOG_TYPES::LOG_ERROR);downloader_def();}
+ catch (std::out_of_range pe){std::string errmsg = pe.what();log_message("Parse error: " + errmsg, LOG_TYPES::LOG_ERROR);downloader_def();}
}
catch (std::runtime_error re)
{
diff --git a/src/headers/SetObjectsParams/buttons/setFunctions.hpp b/src/headers/SetObjectsParams/buttons/setFunctions.hpp
index fe599ab..ce6f227 100644
--- a/src/headers/SetObjectsParams/buttons/setFunctions.hpp
+++ b/src/headers/SetObjectsParams/buttons/setFunctions.hpp
@@ -2,12 +2,18 @@ void hanglefunction();
void get_textbox_settings_values_and_save();
void save_profiles();
+void clearConsole()
+{
+ console.clearText();
+ log_message("Console ready", LOG_TYPES::LOG_INFO);
+}
+
void setFunctions()
{
MainCategory_button.setFunction(changeCategory_main);
InstancesCategory_button.setFunction(changeCategory_instances);
SettingsCategory_button.setFunction(changeCategory_settings);
- SavesToolCategory_button.setFunction(changeCategory_datatools);
+ VersionsCategory_button.setFunction(changeCategory_versions);
new_instance_button.setFunction(new_instance_change);
import_instnace_button.setFunction(import_instance_change);
@@ -20,15 +26,29 @@ void setFunctions()
launch_last_instance_button.setFunction(hanglefunction);
+ check_for_update_button.setFunction(checkUpdate);
+
Subcat_settings_main_button.setFunction(settings_main_cat);
Subcat_settings_progile_button.setFunction(settings_profile_cat);
+ Subcat_settings_updates_button.setFunction(settings_updates_cat);
+ Subcat_settings_credits_button.setFunction(settings_credits_cat);
SlimeRancher_steam_path_getfolder_button.setFunction(getfolder_steamdir);
SlimeRancher_instances_path_getfolder_button.setFunction(getfolder_instancesdir);
steamcmd_path_getfolder_button.setFunction(getfolder_steamcmddir);
+ SteamProfile_name_textbox.setOnChangeFunction(getSteamAccountStats);
+
RestoreSettings_button.setFunction(setSettingsDefault);
SaveConfig_button.setFunction(get_textbox_settings_values_and_save);
save_profile_button.setFunction(get_profile_textboxes_values_and_save);
+
+ manage_main_back_button.setFunction(exit_manage_function);
+ manage_betterbuild_world_button.setFunction(changeCategory_mng_bbworls);
+ manage_mods_button.setFunction(changeCategory_mng_mods);
+
+ version_back_button.setFunction(changeCategory_versions);
+
+ console_clear_button.setFunction(clearConsole);
}
\ No newline at end of file
diff --git a/src/headers/SetObjectsParams/textures/setTextures.hpp b/src/headers/SetObjectsParams/textures/setTextures.hpp
index b2ede19..fb5f174 100644
--- a/src/headers/SetObjectsParams/textures/setTextures.hpp
+++ b/src/headers/SetObjectsParams/textures/setTextures.hpp
@@ -1,4 +1,5 @@
void setTextures()
{
background.setTexture(bg_texture);
+ steam_profile_icon.setTexture(profile_icon_tx);
}
\ No newline at end of file
diff --git a/src/headers/SetObjectsParams/ui/setButtons.hpp b/src/headers/SetObjectsParams/ui/setButtons.hpp
index 836cc8f..ba2252a 100644
--- a/src/headers/SetObjectsParams/ui/setButtons.hpp
+++ b/src/headers/SetObjectsParams/ui/setButtons.hpp
@@ -1,58 +1,86 @@
void setButtons()
{
- launch_last_instance_button.create(465, 710, 350, 80, font, "Launch mounted instance");
- last_played_bg.create(0, 700, 1280, 100, true);
-
- categories_bg.create(0, 0, 1280, 40, true);
- MainCategory_button.create(0, 0, 320, 35, font, "Main");
- InstancesCategory_button.create(320, 0, 320, 35, font, "Instances");
- SettingsCategory_button.create(640, 0, 320, 35, font, "Settings");
- SavesToolCategory_button.create(960, 0, 320, 35, font, "Data tool");
-
- settings_bg.create(0, 40, 1280, 800, true);
-
- Subcat_settings_main_button.create(0, 45, 120, 40, font, "main");
- Subcat_settings_progile_button.create(0, 85, 120, 40, font, "profile");
- Subcat_settings_versions_button.create(0, 720, 120, 40, font, "versions");
- Subcat_settings_credits_button.create(0, 760, 120, 40, font, "credits");
-
- SlimeRancher_steam_path_textbox.create(130, 100, 1000, 40, false, false, font, 26, "", false, "Steam games directory path");
- SlimeRancher_steam_path_getfolder_button.create(1130, 131, 60, 40, font, "Browse");
- SlimeRancher_instances_path_textbox.create(130, 175, 1000, 40, false, false, font, 26, "", false, "Insrances location path");
- SlimeRancher_instances_path_getfolder_button.create(1130, 206, 60, 40, font, "Browse");
- steamcmd_path_textbox.create(130, 250, 1000, 40, false, false, font, 26, "", false, "SteamCMD location path");
- steamcmd_path_getfolder_button.create(1130, 281, 60, 40, font, "Browse");
- Show_older_instances_checkbox.create(30, 30, 130, 340, "Show pre-release game versions", 26, font, true);
- Save_logs_files_checkbox.create(30, 30, 130, 375, "Autosave log files", 26, font, true);
- Colored_logs_checkbox.create(30, 30, 130, 410, "Enable colored logs", 26, font, true);
-
- automatically_run_downloaded_instances_checkbox.create(30, 30, 130, 445, "Run downloaded instances automatically", 26, font, true);
- do_not_show_warnings_checkbox.create(30, 30, 130, 480, "Enable warning messages", 26, font, true);
-
- RestoreSettings_button.create(1000, 750, 120, 40, font, "Restore defaults");
- SaveConfig_button.create(1120, 750, 120, 40, font, "Save config");
-
- SteamProfile_name_textbox.create(130, 100, 1130, 40, false, false, font, 26, "", false, "Steam profile name");
- // SteamProfile_password_textbox.create(130, 175, 1130, 40, false, false, font, 26, "", false, "Steam profile password");
- save_profile_button.create(1000, 750, 120, 40, font, "Save profile");
- login_manualy_checkbox.create(30, 30, 130, 275, "Login to SteamCMD manualy", 26, font, false);
-
- instances_bg.create(0, 40, 1280, 800, true);
-
- new_instance_button.create(90, 45, 550, 35, font, "New instance");
- import_instnace_button.create(641, 45, 550, 35, font, "Import instance");
+ launch_last_instance_button.create(465, 710, 350, 80, font, "Launch instance", false, theme_selected);
+ last_played_bg.create(0, 700, 1280, 100, true, theme_selected);
+
+ categories_bg.create(0, 0, 1280, 40, true, theme_selected);
+ MainCategory_button.create(0, 0, 320, 35, font, "Main", false, theme_selected);
+ InstancesCategory_button.create(320, 0, 320, 35, font, "Instances", false, theme_selected);
+ SettingsCategory_button.create(640, 0, 320, 35, font, "Settings", false, theme_selected);
+ VersionsCategory_button.create(960, 0, 320, 35, font, "Slime Rancher Versions", false, theme_selected);
+
+ settings_bg.create(0, 40, 1280, 800, true, theme_selected);
+
+ Subcat_settings_main_button.create(0, 45, 120, 40, font, "main", false, theme_selected);
+ Subcat_settings_progile_button.create(0, 85, 120, 40, font, "profile", false, theme_selected);
+ Subcat_settings_updates_button.create(0, 125, 120, 40, font, "updates", false, theme_selected);
+ Subcat_settings_credits_button.create(0, 760, 120, 40, font, "credits", false, theme_selected);
+
+ subcat_separator.create(125, 43, 0, 754, true, theme_selected);
+
+ SlimeRancher_steam_path_textbox.create(130, 100, 1085, 40, false, false, font, 26, "", false, "Steam games directory path", theme_selected);
+ SlimeRancher_steam_path_getfolder_button.create(1215, 131, 60, 40, font, "Browse", false, theme_selected);
+ SlimeRancher_instances_path_textbox.create(130, 175, 1085, 40, false, false, font, 26, "", false, "Insrances location path", theme_selected);
+ SlimeRancher_instances_path_getfolder_button.create(1215, 206, 60, 40, font, "Browse", false, theme_selected);
+ steamcmd_path_textbox.create(130, 250, 1085, 40, false, false, font, 26, "", false, "SteamCMD location path", theme_selected);
+ steamcmd_path_getfolder_button.create(1215, 281, 60, 40, font, "Browse", false, theme_selected);
+ Show_older_instances_checkbox.create(30, 30, 130, 340, "Show pre-release game versions", 26, font, true, theme_selected);
+ Save_logs_files_checkbox.create(30, 30, 130, 375, "Autosave log files", 26, font, true, theme_selected);
+ Colored_logs_checkbox.create(30, 30, 130, 410, "Enable colored logs", 26, font, true, theme_selected);
+
+ automatically_run_downloaded_instances_checkbox.create(30, 30, 130, 445, "Run downloaded instances automatically", 26, font, true, theme_selected);
+ do_not_show_warnings_checkbox.create(30, 30, 130, 480, "Enable warning messages", 26, font, true, theme_selected);
+
+ RestoreSettings_button.create(1000, 750, 120, 40, font, "Restore defaults", false, theme_selected);
+ SaveConfig_button.create(1120, 750, 120, 40, font, "Save config", false, theme_selected);
+
+ SteamProfile_name_textbox.create(130, 100, 400, 40, false, false, font, 26, "", false, "Steam profile name", theme_selected);
+ SteamProfile_password_textbox.create(130, 175, 400, 40, false, false, font, 26, "", false, "Steam profile password", theme_selected);
+ save_profile_button.create(1120, 750, 120, 40, font, "Save profile", false, theme_selected);
+
+ instances_bg.create(0, 40, 1280, 800, true, theme_selected);
+
+ new_instance_button.create(90, 45, 550, 35, font, "New instance", false, theme_selected);
+ import_instnace_button.create(641, 45, 550, 35, font, "Import instance", false, theme_selected);
versions_list.create(350, 40, 465, 140, {{"select version","none"}}, "select version", font);
- new_instance_name_textbox.create(465, 70, 350, 30, false, false, font, 26, "New instance", false, "Instance name");
- create_button.create(465, 220, 350, 35, font, "Create");
- instance_creation_cancel.create(465, 260, 350, 35, font, "Cancel");
+ new_instance_name_textbox.create(465, 70, 350, 30, false, false, font, 26, "New instance", false, "Instance name", theme_selected);
+ create_button.create(465, 220, 350, 35, font, "Create", false, theme_selected);
+ instance_creation_cancel.create(465, 260, 350, 35, font, "Cancel", false, theme_selected);
- import_instance_name_textbox.create(465, 70, 350, 30, false, false, font, 26, "Imported instance", false, "Instance name");
- import_instance_path_textbox.create(100, 190, 1100, 30, false, false, font, 26, "", false, "Import source path");
+ import_instance_name_textbox.create(465, 70, 350, 30, false, false, font, 26, "Imported instance", false, "Instance name", theme_selected);
+ import_instance_path_textbox.create(100, 190, 1100, 30, false, false, font, 26, "", false, "Import source path", theme_selected);
import_instance_path_browse_button.create(1150, 221, 60, 30, font, "Browse");
import_instance_confirm_button.create(465, 300, 350, 35, font, "Confirm import");
import_instance_cancel_button.create(465, 340, 350, 35, font, "Cancel");
- datatools_bg.create(0, 40, 1280, 800, true);
+ versions_bg.create(0, 40, 1280, 800, true, theme_selected);
+
+ manage_vanilla_saves_button.create(0, 0, 120, 40, font, "Vanilla saves", false, theme_selected);
+ manage_mod_saves_button.create(0, 40, 120, 40, font, "Mods saves", false, theme_selected);
+ manage_betterbuild_world_button.create(0, 80, 120, 40, font, "BetterBuild worlds", false, theme_selected);
+ manage_backups_button.create(0, 120, 120, 40, font, "Backups manager", false, theme_selected);
+ manage_mods_button.create(0, 160, 120, 40, font, "Mods", false, theme_selected);
+ manage_main_back_button.create(0, 760, 120, 40, font, "Back", false, theme_selected);
+
+ manage_cats_separator.create(125, 3, 0, 794, true, theme_selected);
+
+ mods_separator.create(130 + 560 + 5, 3, 0, 794, true, theme_selected);
+
+ manage_bg.create(0, 0, 1280, 800, true, theme_selected);
+
+ ver_desc_bg.create(0, 0, 1280, 800, true, theme_selected);
+ version_back_button.create(465, 750, 350, 40, font, "Back", false, theme_selected);
+
+ check_for_update_button.create(130, 100, 120, 40, font, "Check for update", false, theme_selected);
+ autocheck_for_update_checkbox.create(30, 30, 130, 150, "Check for update when launcher started", 26, font, true, theme_selected);
+
+ theme_list_ddl.create(120, 40, 130, 560, {{{"Bright"},{std::to_string(ColorPalete::Bright)}},{{"Dark"},{std::to_string(ColorPalete::Dark)}},{{"High contrast"},{std::to_string(ColorPalete::HighContrast)}}}, "Bright", font, false);
+ downloaders_ddl.create(200, 40, 680, 560, {{{"DepotDownloader (recomended)"},{std::to_string(depotdownloader)}},{{"SteamCMD (slower)"},{std::to_string(steamcmd)}}}, "DepotDownloader (recomended)", font, false);
+
+ console_clear_button.create(1160, 651, 100, 30, font, "Clear console", false, theme_selected);
+ console.create(20, 50, 1240, 600, font, theme_selected);
+
+ GuardBox.create(420, 240, font, theme_selected);
}
\ No newline at end of file
diff --git a/src/headers/SetObjectsParams/ui/setTheme.hpp b/src/headers/SetObjectsParams/ui/setTheme.hpp
new file mode 100644
index 0000000..2b5225d
--- /dev/null
+++ b/src/headers/SetObjectsParams/ui/setTheme.hpp
@@ -0,0 +1,97 @@
+void setTheme()
+{
+ new_instance_button.setTheme(theme_selected);
+ import_instnace_button.setTheme(theme_selected);
+ create_button.setTheme(theme_selected);
+ instance_creation_cancel.setTheme(theme_selected);
+ import_instance_path_browse_button.setTheme(theme_selected);
+ import_instance_confirm_button.setTheme(theme_selected);
+ import_instance_cancel_button.setTheme(theme_selected);
+ MainCategory_button.setTheme(theme_selected);
+ InstancesCategory_button.setTheme(theme_selected);
+ SettingsCategory_button.setTheme(theme_selected);
+ VersionsCategory_button.setTheme(theme_selected);
+ Subcat_settings_main_button.setTheme(theme_selected);
+ SlimeRancher_steam_path_getfolder_button.setTheme(theme_selected);
+ SlimeRancher_instances_path_getfolder_button.setTheme(theme_selected);
+ steamcmd_path_getfolder_button.setTheme(theme_selected);
+ RestoreSettings_button.setTheme(theme_selected);
+ SaveConfig_button.setTheme(theme_selected);
+ Subcat_settings_progile_button.setTheme(theme_selected);
+ save_profile_button.setTheme(theme_selected);
+ Subcat_settings_updates_button.setTheme(theme_selected);
+ check_for_update_button.setTheme(theme_selected);
+ manage_vanilla_saves_button.setTheme(theme_selected);
+ manage_mod_saves_button.setTheme(theme_selected);
+ manage_betterbuild_world_button.setTheme(theme_selected);
+ manage_backups_button.setTheme(theme_selected);
+ manage_mods_button.setTheme(theme_selected);
+ manage_main_back_button.setTheme(theme_selected);
+ Subcat_settings_credits_button.setTheme(theme_selected);
+ launch_last_instance_button.setTheme(theme_selected);
+ version_back_button.setTheme(theme_selected);
+
+ new_instance_name_textbox.setTheme(theme_selected);
+ import_instance_name_textbox.setTheme(theme_selected);
+ import_instance_path_textbox.setTheme(theme_selected);
+ SlimeRancher_steam_path_textbox.setTheme(theme_selected);
+ SlimeRancher_instances_path_textbox.setTheme(theme_selected);
+ steamcmd_path_textbox.setTheme(theme_selected);
+ SteamProfile_name_textbox.setTheme(theme_selected);
+
+ SteamProfile_password_textbox.setTheme(theme_selected);
+
+ versions_list.setTheme(theme_selected);
+ theme_list_ddl.setTheme(theme_selected);
+ downloaders_ddl.setTheme(theme_selected);
+
+ separate_data_checkbox.setTheme(theme_selected);
+ move_imported_instance_files_checkbox.setTheme(theme_selected);
+ Show_older_instances_checkbox.setTheme(theme_selected);
+ Show_moded_instances_checkbox.setTheme(theme_selected);
+ autocheck_for_update_checkbox.setTheme(theme_selected);
+ Save_logs_files_checkbox.setTheme(theme_selected);
+ Colored_logs_checkbox.setTheme(theme_selected);
+ automatically_run_downloaded_instances_checkbox.setTheme(theme_selected);
+ do_not_show_warnings_checkbox.setTheme(theme_selected);
+
+ last_played_bg.setTheme(theme_selected);
+ categories_bg.setTheme(theme_selected);
+ settings_bg.setTheme(theme_selected);
+ instances_bg.setTheme(theme_selected);
+ versions_bg.setTheme(theme_selected);
+ manage_bg.setTheme(theme_selected);
+ ver_desc_bg.setTheme(theme_selected);
+
+ subcat_separator.setTheme(theme_selected);
+ manage_cats_separator.setTheme(theme_selected);
+ mods_separator.setTheme(theme_selected);
+
+ Profile_warning_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ Mounted_instance_info_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ mounted_instance_version.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ Launcher_version_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ update_status_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ bbw_tittle_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ theme_label_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ credits_programming_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ dataLoading_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ downloading_progress_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ downloaders_list_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ version_description_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ steam_profile_offline_status_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ steam_profile_AccountName_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ steam_profile_PersonalName_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ steam_profile_UID_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ list_mods_instance_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ list_mods_launcher_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ MNG_Instance_name_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ MNG_installed_mods_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ MNG_Instance_saves_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ MNG_instance_mods_own_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+ MNG_instance_mods_launcher_text.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::font]);
+
+ console.setTheme(theme_selected);
+ console.applyTextColor(theme_selected);
+ console_clear_button.setTheme(theme_selected);
+}
\ No newline at end of file
diff --git a/src/headers/Start/construct_paths.hpp b/src/headers/Start/construct_paths.hpp
index c8dd844..2ce0244 100644
--- a/src/headers/Start/construct_paths.hpp
+++ b/src/headers/Start/construct_paths.hpp
@@ -15,7 +15,15 @@ void construct_paths()
backups_path = defaultDir / "backups";
autobackup_path = backups_path / "PreLauncherInstalled";
configuration_path = defaultDir / "config";
- temp_path = defaultDir / "temp";
- cmd_path = defaultDir / "SteamCMD";
+ components_path = defaultDir / "components";
+ cmd_path = defaultDir / components_path / "SteamCMD";
+ downloader_path = defaultDir / components_path / "depotDownloader";
logs_path = defaultDir / "logs";
+ mods_path = defaultDir/ "mods";
+ steam_default_path = fs::path(get_steamLocation_default_path());
+
+ UMFmodsFolder_path = mods_path / "UMF";
+ SMTFolder_path = mods_path / "SMT";
+ SMLFolder_path = mods_path / "SML";
+ SRMLmodsFolder_path = mods_path / "SRML";
}
\ No newline at end of file
diff --git a/src/headers/Start/objects_attributes.hpp b/src/headers/Start/objects_attributes.hpp
index 5cb3dd1..e186d98 100644
--- a/src/headers/Start/objects_attributes.hpp
+++ b/src/headers/Start/objects_attributes.hpp
@@ -2,23 +2,116 @@ void setRuntimeTexts()
{
Mounted_instance_info_text.setFont(font);
Mounted_instance_info_text.setCharacterSize(36);
- Mounted_instance_info_text.setFillColor(sf::Color::Black);
Mounted_instance_info_text.setPosition(10, 725);
+ mounted_instance_version.setFont(font);
+ mounted_instance_version.setCharacterSize(16);
+ mounted_instance_version.setPosition(10, 765);
+
Launcher_version_text.setFont(font);
Launcher_version_text.setCharacterSize(36);
- Launcher_version_text.setFillColor(sf::Color::Black);
Launcher_version_text.setString(launcher_version);
Launcher_version_text.setPosition((window.getSize().x - 10) - Launcher_version_text.getLocalBounds().width, 725);
+
+ bbw_tittle_text.setFont(font);
+ bbw_tittle_text.setCharacterSize(26);
+
+ update_status_text.setFont(font);
+ update_status_text.setCharacterSize(26);
+ update_status_text.setPosition(130, 380);
+ update_status_text.setString("No update data");
+
+ theme_label_text.setFont(font);
+ theme_label_text.setCharacterSize(26);
+ theme_label_text.setPosition(130, 520);
+ theme_label_text.setString("Launcher theme (experimental)\n\n\nRequire restart");
+
+ credits_programming_text.setFont(font);
+ credits_programming_text.setCharacterSize(32);
+ credits_programming_text.setPosition(130, 380);
+ credits_programming_text.setString("Programming: MCSR");
+
+ dataLoading_text.setFont(font);
+ dataLoading_text.setCharacterSize(32);
+ dataLoading_text.setPosition(130, 380);
+
+ downloading_progress_text.setFont(font);
+ downloading_progress_text.setCharacterSize(20);
+ downloading_progress_text.setPosition(130, 380);
+
+ downloaders_list_text.setFont(font);
+ downloaders_list_text.setCharacterSize(26);
+ downloaders_list_text.setPosition(680, 520);
+ downloaders_list_text.setString("Selected depot downloader");
+
+ version_description_text.setFont(font);
+ version_description_text.setCharacterSize(26);
+ version_description_text.setPosition(10, 10);
+
+ Profile_warning_text.setFont(font);
+ Profile_warning_text.setCharacterSize(26);
+ Profile_warning_text.setPosition(130, 600);
+
+ steam_profile_offline_status_text.setFont(font);
+ steam_profile_offline_status_text.setCharacterSize(26);
+ steam_profile_offline_status_text.setPosition(320, 270);
+
+ steam_profile_AccountName_text.setFont(font);
+ steam_profile_AccountName_text.setCharacterSize(26);
+ steam_profile_AccountName_text.setPosition(320, 300);
+
+ steam_profile_PersonalName_text.setFont(font);
+ steam_profile_PersonalName_text.setCharacterSize(26);
+ steam_profile_PersonalName_text.setPosition(320, 330);
+
+ steam_profile_UID_text.setFont(font);
+ steam_profile_UID_text.setCharacterSize(26);
+ steam_profile_UID_text.setPosition(320, 360);
+
+ list_mods_instance_text.setFont(font);
+ list_mods_instance_text.setCharacterSize(19);
+ list_mods_instance_text.setString("Installed mods");
+ list_mods_instance_text.setPosition(130 + (280 - (list_mods_instance_text.getLocalBounds().width / 2)), 0);
+
+ list_mods_launcher_text.setFont(font);
+ list_mods_launcher_text.setCharacterSize(19);
+ list_mods_launcher_text.setString("Launcher mods");
+ list_mods_launcher_text.setPosition((130 + 560) + ((10 + 280) - (list_mods_launcher_text.getLocalBounds().width / 2)), 0);
+
+ MNG_Instance_name_text.setFont(font);
+ MNG_Instance_name_text.setCharacterSize(26);
+ MNG_Instance_name_text.setPosition(0, 0);
+ MNG_Instance_name_text.setString("Instance name: ");
+
+ bbw_tittle_text.setFont(font);
+ bbw_tittle_text.setCharacterSize(26);
+ bbw_tittle_text.setPosition(0, 0);
+
+ MNG_Instance_saves_text.setFont(font);
+ MNG_Instance_saves_text.setCharacterSize(26);
+ MNG_Instance_saves_text.setPosition(0, 0);
+ MNG_Instance_saves_text.setString("Game saves count");
+
+ MNG_instance_mods_own_text.setFont(font);
+ MNG_instance_mods_own_text.setCharacterSize(26);
+ MNG_instance_mods_own_text.setPosition(0, 0);
+ MNG_instance_mods_own_text.setString("Installed mods: ");
+
+ MNG_instance_mods_launcher_text.setFont(font);
+ MNG_instance_mods_launcher_text.setCharacterSize(26);
+ MNG_instance_mods_launcher_text.setPosition(0, 0);
+ MNG_instance_mods_launcher_text.setString("Launcher mods: ");
}
void setShapesAttributes()
{
+ steam_profile_icon.setPosition(sf::Vector2f(130, 260));
+
progress_bg.setSize(sf::Vector2f(1280, 20));
progress_bg.setPosition(sf::Vector2f(0, 780));
- progress_bg.setFillColor(sf::Color::White);
+ progress_bg.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::inactive]);
progress_moveing.setSize(sf::Vector2f(70, 20));
progress_moveing.setPosition(sf::Vector2f(-70, 780));
- progress_moveing.setFillColor(sf::Color::Blue);
+ progress_moveing.setFillColor(ColorPalete::Palete[theme_selected][ColorPalete::checkbox_inactive]);
}
\ No newline at end of file
diff --git a/src/headers/Start/runtime.hpp b/src/headers/Start/runtime.hpp
index 3ea6ba7..5ce29c6 100644
--- a/src/headers/Start/runtime.hpp
+++ b/src/headers/Start/runtime.hpp
@@ -1,3 +1,5 @@
+void checkUpdate();
+
/**
* This function check if Main Launcher directory exists.
*
@@ -25,9 +27,47 @@ void runtime_check()
directory_auto(backups_path);
directory_auto(autobackup_path);
directory_auto(configuration_path);
- directory_auto(temp_path);
+ directory_auto(components_path);
+ directory_auto(downloader_path);
directory_auto(cmd_path);
directory_auto(logs_path);
+ directory_auto(mods_path);
+
+ directory_auto(UMFmodsFolder_path);
+ directory_auto(SMTFolder_path);
+ directory_auto(SMLFolder_path);
+ directory_auto(SRMLmodsFolder_path);
+
+ if (fs::is_empty(downloader_path))
+ {
+ copy_directory(fs::path("./assets/components/downloader"), downloader_path);
+ log_message("Installed DepotDownloader", LOG_TYPES::LOG_INFO);
+ }
+ else
+ {
+ try
+ {
+ MD5 calculateMd5;
+
+ std::string installedMD5 = calculateMd5.calculateFromFile(downloader_path.string() + "/DepotDownloader.exe");
+ std::string includedMD5 = calculateMd5.calculateFromFile("./assets/components/downloader/DepotDownloader.exe");
+
+ if (installedMD5 != includedMD5)
+ {
+ fs::remove_all(downloader_path);
+ copy_directory(fs::path("./assets/components/downloader"), downloader_path);
+ log_message("Included downloader MD5 wrong", LOG_TYPES::LOG_WARN);
+ }
+ }
+ catch (fs::filesystem_error e)
+ {
+
+ }
+ catch (std::runtime_error e)
+ {
+
+ }
+ }
log_message("Loading config", LOG_TYPES::LOG_INFO);
if (load_config_file(configuration_path.string() + "/config.json") == true)
@@ -38,16 +78,25 @@ void runtime_check()
{
log_message("Launcher config load FAIL", LOG_TYPES::LOG_ERROR);
}
+
+ if (check_updates_when_start == true)
+ {
+ checkUpdate();
+ }
SlimeRancher_steam_path_textbox.setText(reduceBackslashes(steam_game_dir));
SlimeRancher_instances_path_textbox.setText(reduceBackslashes(instances_dir));
steamcmd_path_textbox.setText(reduceBackslashes(steamcmd_dir));
+ if (downloader_selected != steamcmd)
+ {
+ steamcmd_path_textbox.setReadOnlyMode(true);
+ }
+
SteamProfile_name_textbox.setText(decryptor(steam_profile_name));
- // SteamProfile_password_textbox.setText(decryptor(steam_profile_passwd));
+ SteamProfile_password_textbox.setText(decryptor(steam_profile_passwd));
Save_logs_files_checkbox.setState(save_log_files);
- login_manualy_checkbox.setState(loging_manualy);
Show_older_instances_checkbox.setState(show_prerelease_version);
Colored_logs_checkbox.setState(display_log_colors);
automatically_run_downloaded_instances_checkbox.setState(autolaunch_instances);
@@ -68,12 +117,14 @@ void runtime_check()
log_message("No instance mounted", LOG_TYPES::LOG_INFO);
mounted_instance = "Unmounted";
Mounted_instance_info_text.setString("No instance mounted");
+ mounted_instance_version.setString("");
}
else
{
if (mounted_instance == "Unmounted")
{
Mounted_instance_info_text.setString("No instance mounted");
+ mounted_instance_version.setString("");
}
else
{
@@ -84,10 +135,16 @@ void runtime_check()
refresh_instances_list();
- if (SteamCMDCheck() == true)
+ if (downloader_selected == steamcmd)
{
- log_message("SteamCMD is not installed", LOG_TYPES::LOG_WARN);
+ if (SteamCMDCheck() == true)
+ {
+ log_message("SteamCMD is not installed", LOG_TYPES::LOG_WARN);
+ }
}
+
+ theme_list_ddl.setFromResult(std::to_string(theme_selected));
+ downloaders_ddl.setFromResult(std::to_string(downloader_selected));
}
else
{
@@ -112,7 +169,7 @@ void runtime_check()
update_config_file();
SteamProfile_name_textbox.setText(steam_profile_name);
- // SteamProfile_password_textbox.setText(steam_profile_passwd);
+ SteamProfile_password_textbox.setText(steam_profile_passwd);
goto restart_runtime;
}
diff --git a/src/includes.hpp b/src/includes.hpp
index 0deb9df..8fef9a7 100644
--- a/src/includes.hpp
+++ b/src/includes.hpp
@@ -5,15 +5,27 @@
#include "headers/Classes/json_parser.hpp"
#include "headers/Classes/json_encoder.hpp"
+#include "headers/Classes/md5calculator.hpp"
+#include "headers/Classes/VDF_parser.hpp"
#include "headers/Functions/Logs/log_message.hpp"
#include "headers/Classes/popup_message_window.hpp"
#include "headers/Classes/instance_list.hpp"
+#include "headers/Classes/version_class.hpp"
+#include "headers/Classes/save_menagement/betterbuild_save.hpp"
+#include "headers/Classes/save_menagement/mod_class.hpp"
+#include "headers/Classes/save_menagement/game_save_class.hpp"
+
+// #include "headers/Classes/formattedText.hpp"
+
+#include "headers/Classes/steamGuardAuthClass.hpp"
#include "headers/Declarations/SFMLObjects/objects.hpp"
#include "headers/Declarations/SFMLObjects/ui/elements.hpp"
+#include "headers/Declarations/namespaces.hpp"
+
#include "headers/Start/create_versions_list.hpp"
#include "headers/Start/objects_attributes.hpp"
#include "headers/Start/run_date.hpp"
@@ -47,10 +59,13 @@
#include "headers/SetObjectsParams/textures/setTextures.hpp"
#include "headers/SetObjectsParams/ui/setButtons.hpp"
+#include "headers/SetObjectsParams/ui/setTheme.hpp"
#include "headers/Functions/Userdata/get_userdata_path.hpp"
#include "headers/Functions/Userdata/get_steam_default_path.hpp"
+#include "headers/Functions/Userdata/get_steam_profile.hpp"
+
#include "headers/Start/construct_paths.hpp"
#include "headers/Functions/Settings/lock/lock.hpp"
@@ -93,4 +108,6 @@
#include "headers/Functions/window/draw.hpp"
#include "headers/Functions/window/display.hpp"
+#include "headers/Functions/updates/launcher_update_check.hpp"
+
#include "headers/SetObjectsParams/buttons/setFunctions.hpp"
\ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index 7c17fa9..ed2d83d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -13,8 +13,10 @@
#include
#include
#include
+#include
#include
#include
+#include
#include
@@ -69,15 +71,20 @@ void load_sequence()
///// Set SFML-GUI Buttons attributes onetime /////
setButtons();
+ console.unlockQueue();
+ log_message("Console ready", LOG_TYPES::LOG_INFO);
+
///// Set functions to buttons from SFML-GUI onetime /////
setFunctions();
///// Check run functions /////
runtime_check();
+
+ ///// set theme to objects /////
+ setTheme();
///// Create DropDownList from all "versions_map" contents /////
- createDDListFromVersionsMap();
-
+ createDDListFromVersionsMap();
}
int main()