Vostok-Save-Manager 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- VSM/__init__.py +0 -0
- VSM/backup.py +29 -0
- VSM/load.py +38 -0
- VSM/main.py +26 -0
- VSM/save.py +88 -0
- VSM/setup.py +93 -0
- VSM/util.py +78 -0
- vostok_save_manager-2.0.0.dist-info/METADATA +83 -0
- vostok_save_manager-2.0.0.dist-info/RECORD +12 -0
- vostok_save_manager-2.0.0.dist-info/WHEEL +5 -0
- vostok_save_manager-2.0.0.dist-info/entry_points.txt +2 -0
- vostok_save_manager-2.0.0.dist-info/top_level.txt +1 -0
VSM/__init__.py
ADDED
|
File without changes
|
VSM/backup.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from shutil import copy
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from VSM.util import json_read as jr
|
|
4
|
+
import os
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
def backup():
|
|
9
|
+
|
|
10
|
+
line = "1"
|
|
11
|
+
|
|
12
|
+
backup_path = jr()['backup_path']
|
|
13
|
+
game_data_path = jr()['game_data_path']
|
|
14
|
+
|
|
15
|
+
backup_time = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
16
|
+
|
|
17
|
+
backup_path = os.path.join(backup_path, backup_time)
|
|
18
|
+
|
|
19
|
+
os.makedirs(backup_path, exist_ok=True)
|
|
20
|
+
|
|
21
|
+
#Defines the ".tres" suffix. I shouldn't need to do this but its the only way this shit will work.
|
|
22
|
+
suffix = ".tres"
|
|
23
|
+
|
|
24
|
+
#I think this is converting game_data_dir to a path instead of a string. IDK becuase when I removed it, everything fucking broke
|
|
25
|
+
work_dir = Path(game_data_path)
|
|
26
|
+
|
|
27
|
+
for file_name in work_dir.rglob(f"*{suffix}"):
|
|
28
|
+
copy(file_name, backup_path)
|
|
29
|
+
print('Backup successful!')
|
VSM/load.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from VSM.backup import backup
|
|
2
|
+
from VSM.util import json_read as jr
|
|
3
|
+
from shutil import move
|
|
4
|
+
from shutil import copy
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
import json
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
import os
|
|
9
|
+
|
|
10
|
+
def load():
|
|
11
|
+
|
|
12
|
+
while True:
|
|
13
|
+
save_to_load = input("What save would you like to load?: ")
|
|
14
|
+
|
|
15
|
+
print("Backing up current save...")
|
|
16
|
+
|
|
17
|
+
backup()
|
|
18
|
+
|
|
19
|
+
save_path = jr()['save_path']
|
|
20
|
+
game_data_path = jr()['game_data_path']
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
save_name_path = os.path.join(save_path, save_to_load)
|
|
24
|
+
save_dir_check = Path(save_name_path)
|
|
25
|
+
|
|
26
|
+
if save_dir_check.exists():
|
|
27
|
+
|
|
28
|
+
suffix = ".tres"
|
|
29
|
+
|
|
30
|
+
work_dir = Path(save_name_path)
|
|
31
|
+
|
|
32
|
+
for file_name in work_dir.rglob(f"*{suffix}"):
|
|
33
|
+
copy(file_name, game_data_path)
|
|
34
|
+
|
|
35
|
+
break
|
|
36
|
+
print("Please input a valid save file.")
|
|
37
|
+
|
|
38
|
+
print('Load successful! Returning to main menu...')
|
VSM/main.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from VSM.load import load
|
|
2
|
+
from VSM.save import save
|
|
3
|
+
from VSM.setup import setup
|
|
4
|
+
|
|
5
|
+
def launch():
|
|
6
|
+
while True:
|
|
7
|
+
|
|
8
|
+
mode = input("What you like to do?: Load, Save, Setup, Exit: ")
|
|
9
|
+
|
|
10
|
+
if mode.lower() == "setup":
|
|
11
|
+
print("Loading setup module...")
|
|
12
|
+
setup()
|
|
13
|
+
|
|
14
|
+
elif mode.lower() == "save":
|
|
15
|
+
print ("loading save module...")
|
|
16
|
+
save()
|
|
17
|
+
|
|
18
|
+
elif mode.lower() == "load":
|
|
19
|
+
print("loading load module...")
|
|
20
|
+
load()
|
|
21
|
+
|
|
22
|
+
elif mode.lower() == "exit":
|
|
23
|
+
print("exiting...")
|
|
24
|
+
exit()
|
|
25
|
+
else:
|
|
26
|
+
print("Please input a proper option")
|
VSM/save.py
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#This takes a snapshot of the save files and saves them.
|
|
2
|
+
from shutil import copy
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from VSM.util import jsonl_read as jlr, check_paths, json_read as jr
|
|
5
|
+
import os
|
|
6
|
+
import json
|
|
7
|
+
import time
|
|
8
|
+
import datetime
|
|
9
|
+
import math
|
|
10
|
+
from platformdirs import user_config_path
|
|
11
|
+
|
|
12
|
+
jsonl_path = user_config_path('Vostok Save Manager', 'Manhattan Cafe') / 'Time.jsonl'
|
|
13
|
+
|
|
14
|
+
def check_time():
|
|
15
|
+
|
|
16
|
+
scum_time_value = float(jr()['scum_time'])
|
|
17
|
+
last_load_time = jlr()
|
|
18
|
+
till_next_load = float(last_load_time) + scum_time_value
|
|
19
|
+
|
|
20
|
+
time_now = time.time()
|
|
21
|
+
|
|
22
|
+
if time_now >= till_next_load:
|
|
23
|
+
can_move = 'yes'
|
|
24
|
+
|
|
25
|
+
else:
|
|
26
|
+
can_move = 'no'
|
|
27
|
+
return can_move
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def save():
|
|
32
|
+
|
|
33
|
+
save_path = jr()['save_path']
|
|
34
|
+
game_data_path = jr()['game_data_path']
|
|
35
|
+
scume_time_value = jr()['scum_time']
|
|
36
|
+
|
|
37
|
+
print('Checking last save time...')
|
|
38
|
+
|
|
39
|
+
if check_time() == 'no':
|
|
40
|
+
|
|
41
|
+
time_of_save = jlr()
|
|
42
|
+
|
|
43
|
+
save_time_add = time_of_save + float(scume_time_value)
|
|
44
|
+
|
|
45
|
+
time_now = time.time()
|
|
46
|
+
|
|
47
|
+
till_next_load = math.ceil(save_time_add - time_now)
|
|
48
|
+
|
|
49
|
+
readable_time = datetime.timedelta(seconds=till_next_load)
|
|
50
|
+
|
|
51
|
+
print('You have', readable_time, "left. Please wait until saving again" )
|
|
52
|
+
return()
|
|
53
|
+
|
|
54
|
+
elif check_time() == 'yes':
|
|
55
|
+
|
|
56
|
+
print('You can save!')
|
|
57
|
+
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
else:
|
|
61
|
+
print("ERROR: can_move not defined")
|
|
62
|
+
return()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
save_name = input("Please input a name: ")
|
|
66
|
+
|
|
67
|
+
print('Saving...')
|
|
68
|
+
|
|
69
|
+
save_name_path = os.path.join(save_path, save_name)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
os.makedirs(save_name_path, exist_ok=True)
|
|
73
|
+
|
|
74
|
+
#Defines the ".tres" suffix. I shouldn't need to do this but its the only way this shit will work.
|
|
75
|
+
suffix = ".tres"
|
|
76
|
+
|
|
77
|
+
#I think this is converting game_data_dir to a path instead of a string. IDK becuase when I removed it, everything fucking broke
|
|
78
|
+
work_dir = Path(game_data_path)
|
|
79
|
+
|
|
80
|
+
for tres_file in work_dir.rglob(f"*{suffix}"):
|
|
81
|
+
copy(tres_file, save_name_path)
|
|
82
|
+
|
|
83
|
+
time_of_save = time.time()
|
|
84
|
+
|
|
85
|
+
with open(jsonl_path, "w") as file:
|
|
86
|
+
json.dump(time_of_save, file)
|
|
87
|
+
|
|
88
|
+
print('Succesfully saved!')
|
VSM/setup.py
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from VSM.util import check_paths, json_read as jr
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from platformdirs import user_config_path
|
|
5
|
+
|
|
6
|
+
def setup():
|
|
7
|
+
|
|
8
|
+
json_path = user_config_path('Vostok Save Manager', 'Manhattan Cafe') / 'Data.json'
|
|
9
|
+
def write():
|
|
10
|
+
print('Writing to config...')
|
|
11
|
+
|
|
12
|
+
data_to_write = {"game_data_path": game_data_path,
|
|
13
|
+
"save_path": save_path,
|
|
14
|
+
"backup_path": backup_path,
|
|
15
|
+
"scum_time": scum_time}
|
|
16
|
+
with open(json_path, 'w') as file:
|
|
17
|
+
json.dump(data_to_write, file, indent=2)
|
|
18
|
+
print("Write successful! Returning to main menu...")
|
|
19
|
+
check_paths()
|
|
20
|
+
|
|
21
|
+
backup_path_json = jr()['backup_path']
|
|
22
|
+
save_path_json = jr()['save_path']
|
|
23
|
+
game_data_path_json = jr()['game_data_path']
|
|
24
|
+
scum_time_json = jr()['scum_time']
|
|
25
|
+
|
|
26
|
+
while True:
|
|
27
|
+
|
|
28
|
+
game_data_path = input("Input the directory your save files are in. If you already did this type 'No': ")
|
|
29
|
+
game_data_path_check = Path(game_data_path)
|
|
30
|
+
|
|
31
|
+
if game_data_path.lower() == "no":
|
|
32
|
+
|
|
33
|
+
game_data_path = game_data_path_json
|
|
34
|
+
|
|
35
|
+
break
|
|
36
|
+
|
|
37
|
+
if game_data_path_check.exists():
|
|
38
|
+
|
|
39
|
+
break
|
|
40
|
+
|
|
41
|
+
print("Please input a proper path or option. Ensure your path does not have any qoutes or special characters")
|
|
42
|
+
|
|
43
|
+
while True:
|
|
44
|
+
|
|
45
|
+
save_path = input("Input the directory you want the files to be saved in: Default (recomended): ")
|
|
46
|
+
save_path_check = Path(save_path)
|
|
47
|
+
|
|
48
|
+
if save_path.lower() == "default":
|
|
49
|
+
|
|
50
|
+
save_path = save_path_json
|
|
51
|
+
|
|
52
|
+
break
|
|
53
|
+
|
|
54
|
+
if save_path_check.exists():
|
|
55
|
+
|
|
56
|
+
break
|
|
57
|
+
print("Please input a proper path or option. Ensure your path does not have any qoutes or special characters")
|
|
58
|
+
|
|
59
|
+
while True:
|
|
60
|
+
|
|
61
|
+
backup_path = input("Input the backup directory. This is used to backup your current save files before loading: Default (recomended): ")
|
|
62
|
+
backup_path_check = Path(backup_path)
|
|
63
|
+
|
|
64
|
+
if backup_path.lower() == "default":
|
|
65
|
+
|
|
66
|
+
backup_path = backup_path_json
|
|
67
|
+
|
|
68
|
+
break
|
|
69
|
+
|
|
70
|
+
if backup_path_check.exists():
|
|
71
|
+
|
|
72
|
+
break
|
|
73
|
+
print("Please input a proper path or option. Ensure your path does not have any qoutes or special characters")
|
|
74
|
+
|
|
75
|
+
while True:
|
|
76
|
+
scum_time = input("The application uses an anti-save-scum feature prevents abusing the save feature. Please input a the ammount of time you want between saves in secconds: Default: 5400 (1.5 hours): ")
|
|
77
|
+
|
|
78
|
+
if scum_time.lower() == "default":
|
|
79
|
+
|
|
80
|
+
scum_time = scum_time_json
|
|
81
|
+
|
|
82
|
+
break
|
|
83
|
+
else:
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
is_valid = float(scum_time)
|
|
87
|
+
break
|
|
88
|
+
|
|
89
|
+
except ValueError:
|
|
90
|
+
print("Input must be an integer, float (number with or without decimal) or 'default'")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
write()
|
VSM/util.py
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from platformdirs import user_data_path, user_config_path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
author_name = 'Manhattan Cafe'
|
|
7
|
+
project_name = 'Vostok Save Manager'
|
|
8
|
+
json_name = 'Data.json'
|
|
9
|
+
jsonl_name = 'Time.jsonl'
|
|
10
|
+
save_path_name = 'Saves'
|
|
11
|
+
backup_path_name = 'Backups'
|
|
12
|
+
|
|
13
|
+
def check_paths():
|
|
14
|
+
data_path = user_data_path(project_name, author_name)
|
|
15
|
+
config_path = user_config_path(project_name, author_name)
|
|
16
|
+
saves_path = data_path / Path(save_path_name)
|
|
17
|
+
backup_path = data_path / Path(backup_path_name)
|
|
18
|
+
json_path = config_path / Path(json_name)
|
|
19
|
+
jsonl_path = config_path / Path(jsonl_name)
|
|
20
|
+
|
|
21
|
+
print("Checking default path directories...")
|
|
22
|
+
if not saves_path.exists() and not backup_path.exists():
|
|
23
|
+
print('Directoris do not exist. Creating...')
|
|
24
|
+
|
|
25
|
+
saves_path.mkdir(parents=True, exist_ok=True)
|
|
26
|
+
backup_path.mkdir(parents=True, exist_ok=True)
|
|
27
|
+
print("Directories created successfully!")
|
|
28
|
+
else:
|
|
29
|
+
print('Directories already exist, nothing to do')
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
print('Checking if config exists...')
|
|
33
|
+
if json_path.exists():
|
|
34
|
+
print('Config already exists, nothing to do')
|
|
35
|
+
pass
|
|
36
|
+
else:
|
|
37
|
+
print('Config does not exist. Creating with defaults...')
|
|
38
|
+
|
|
39
|
+
config_path.mkdir(parents=True, exist_ok=True)
|
|
40
|
+
|
|
41
|
+
default_json = {"game_data_path": "null",
|
|
42
|
+
"save_path": str(saves_path),
|
|
43
|
+
"backup_path": str(backup_path),
|
|
44
|
+
"scum_time": "5400"}
|
|
45
|
+
with open(json_path, "w") as file:
|
|
46
|
+
json.dump(default_json, file, indent=2)
|
|
47
|
+
print('Config created succesfully!')
|
|
48
|
+
|
|
49
|
+
print('Checking if time file exists...')
|
|
50
|
+
if jsonl_path.exists():
|
|
51
|
+
print('File exists, nothing to do')
|
|
52
|
+
exit
|
|
53
|
+
else:
|
|
54
|
+
print('File does not exist, Creating with defaults...')
|
|
55
|
+
config_path.mkdir(parents=True, exist_ok=True)
|
|
56
|
+
|
|
57
|
+
default_jsonl = "0"
|
|
58
|
+
with open(jsonl_path, "w") as file:
|
|
59
|
+
json.dump(default_jsonl, file)
|
|
60
|
+
print('File created succesfully!')
|
|
61
|
+
print("Check finished succesfully")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def json_read():
|
|
65
|
+
|
|
66
|
+
json_path = user_config_path(project_name, author_name) / json_name
|
|
67
|
+
|
|
68
|
+
with open(json_path, "r") as file:
|
|
69
|
+
json_data = json.load(file)
|
|
70
|
+
return json_data
|
|
71
|
+
|
|
72
|
+
def jsonl_read():
|
|
73
|
+
|
|
74
|
+
jsonl_path = user_config_path(project_name, author_name) / jsonl_name
|
|
75
|
+
|
|
76
|
+
with open(jsonl_path, "r") as file:
|
|
77
|
+
jsonl_data = json.load(file)
|
|
78
|
+
return jsonl_data
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: Vostok-Save-Manager
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Requires-Python: >=3.10
|
|
5
|
+
Description-Content-Type: text/markdown
|
|
6
|
+
Requires-Dist: platformdirs>=1.0.0
|
|
7
|
+
|
|
8
|
+
# VSM: An open source, dead simple save manager for Road to Vostok
|
|
9
|
+
|
|
10
|
+
## WARNINGS. Read before you use
|
|
11
|
+
- I am not responsible for any lost progress and saves, I encourage you to back up your files first
|
|
12
|
+
- I encourage you not to abuse this. The game is supposed to be hardcore, so only use this when you genuinely need it.
|
|
13
|
+
- DO NOT TRY TO USE THIS WHILE THE GAME IS RUNNING. I have not tested what will happen, but my assumption is nothing good.
|
|
14
|
+
|
|
15
|
+
## Note on macOS
|
|
16
|
+
This application is a python project, is installed from pypi and automatically detects the operating system. There is no reason this should not work on mac, but I do not own a mac so I can not confirm it.
|
|
17
|
+
|
|
18
|
+
# Installation
|
|
19
|
+
|
|
20
|
+
## Dependencies
|
|
21
|
+
Requires python 3.10 (havn't verified if it works on older versions) or newer
|
|
22
|
+
Requires pipx. For windows users, you can _technically_ use standard pip since windows allows you to install packages directly to global, but pipx is better and is a requirment on linux.
|
|
23
|
+
|
|
24
|
+
## Linux
|
|
25
|
+
|
|
26
|
+
1. Use pipx to install the package
|
|
27
|
+
```shell
|
|
28
|
+
pipx install vostok-save-manager
|
|
29
|
+
```
|
|
30
|
+
2. You should automatically get access to the command ```VSM```. This is the command to launch the "main menu"
|
|
31
|
+
3. After you type ```VSM``` you should see in your terminal ```What you like to do?: Load, Save, Setup, Exit: ```. Type ```setup``` to continue the setup
|
|
32
|
+
4. You will be asked where the game data is located. This is not the game installation folder as Road to Vostok puts its game data in a different location than its installation
|
|
33
|
+
5. You will be asked where you want your saved files to be stored. The recomended is ```default``` since it automatically creates a default directory.
|
|
34
|
+
6. You will be asked where you want your backuped up save files to be stored. The recomended is ```default``` since it automatically creates a default directory.
|
|
35
|
+
7. You will be asked how much time you want before you can save again. The default time is 5400 secconds, which is 1 hour and 30 minutes. You can change this to whatever you want, but it must be input as secconds and as an interger (whole number) or float (number with decimal).
|
|
36
|
+
8. The setup is now done.
|
|
37
|
+
|
|
38
|
+
## Windows
|
|
39
|
+
|
|
40
|
+
1. Use pipx to install the package
|
|
41
|
+
```shell
|
|
42
|
+
pipx install vostok-save-manager
|
|
43
|
+
```
|
|
44
|
+
Or since windows doesn't strictly require packages be in a virtual environment
|
|
45
|
+
```shell
|
|
46
|
+
pip install vostok-save-manager
|
|
47
|
+
```
|
|
48
|
+
But pipx is recomended
|
|
49
|
+
|
|
50
|
+
2. You should automatically get access to the command ```VSM```. This is the command to launch the "main menu". If you get an error along the lines of "VSM is not recognized as command" run
|
|
51
|
+
```shell
|
|
52
|
+
pipx ensurepath
|
|
53
|
+
```
|
|
54
|
+
and try again.
|
|
55
|
+
|
|
56
|
+
3. After you type ```VSM``` you should see in your terminal ```What you like to do?: Load, Save, Setup, Exit: ```. Type ```setup``` to continue the setup
|
|
57
|
+
4. You will be asked where the game data is located. This is not the game installation folder as Road to Vostok puts its game data in a different location than its installation
|
|
58
|
+
5. You will be asked where you want your saved files to be stored. The recomended is ```default``` since it automatically creates a default directory.
|
|
59
|
+
6. You will be asked where you want your backuped up save files to be stored. The recomended is ```default``` since it automatically creates a default directory.
|
|
60
|
+
7. You will be asked how much time you want before you can save again. The default time is 5400 secconds, which is 1 hour and 30 minutes. You can change this to whatever you want, but it must be input as secconds and as an interger (whole number) or float (number with decimal).
|
|
61
|
+
8. The setup is now done.
|
|
62
|
+
|
|
63
|
+
# How to use
|
|
64
|
+
|
|
65
|
+
## How to save
|
|
66
|
+
1. On the main menu type "Save."
|
|
67
|
+
2. You will be prompted to name the save. This can be anything.
|
|
68
|
+
3. After you input your save, the game will automatically copy and store the current save files in your game directory. No backup is needed since it is not moving or replacing anything.
|
|
69
|
+
4. If you input the name of an already existing save it WILL overwrite it.
|
|
70
|
+
5. You have now saved your game.
|
|
71
|
+
|
|
72
|
+
## How to load
|
|
73
|
+
1. On the main menu type "Load."
|
|
74
|
+
2. You will be prompted to give the name of a save. This has to be EXACT and is case sensitive.
|
|
75
|
+
3. The application automatically backs up the save files currently in your game data directory.
|
|
76
|
+
4. You have now loaded a save.
|
|
77
|
+
|
|
78
|
+
# Things to add
|
|
79
|
+
- A GUI
|
|
80
|
+
|
|
81
|
+
# Credits
|
|
82
|
+
|
|
83
|
+
Purchase Road to Vostok on [Steam.](https://store.steampowered.com/app/1963610/Road_to_Vostok/)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
VSM/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
VSM/backup.py,sha256=9G4ti_eLWwql7nB4zZqdHSSRHx1gR-cKKnTJBSoiRGU,855
|
|
3
|
+
VSM/load.py,sha256=wGbFus7cb9cgdZnThG3TBAXtWgnEfrxzQ6xvDMH6hBw,953
|
|
4
|
+
VSM/main.py,sha256=8quk0qd_IiqeBXZcA_X6V6GXhKuPWQ2Xb9j0NUHk_p8,668
|
|
5
|
+
VSM/save.py,sha256=CQp7Kc4kFMJMzeVrur2o3rqxJVFZHvMGulTWE2Xk-QM,2214
|
|
6
|
+
VSM/setup.py,sha256=1qo9Ak972I4eKVMZbihI4-nwzJTpxmzau85IU0vGrek,2907
|
|
7
|
+
VSM/util.py,sha256=nHgC48mhWddUsLl08cDFOf3uBM32Fst7pqKfvpyfsuE,2577
|
|
8
|
+
vostok_save_manager-2.0.0.dist-info/METADATA,sha256=Ym4pS6eO3JF3wG4QAKIypw_IIReRq4s-WZW6WqhvbBA,4621
|
|
9
|
+
vostok_save_manager-2.0.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
10
|
+
vostok_save_manager-2.0.0.dist-info/entry_points.txt,sha256=tiQgMySHEuMcOclVt3UbJylAxsdKmRWsvImWLSsscnw,40
|
|
11
|
+
vostok_save_manager-2.0.0.dist-info/top_level.txt,sha256=vsWYOH8-pi6GT39L9kAJqlTUj4CIobkGaDhafpTKx-Q,4
|
|
12
|
+
vostok_save_manager-2.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VSM
|