From a54af67673969d372651f48c49e73f7f7a16c4b5 Mon Sep 17 00:00:00 2001 From: vertigomaster Date: Mon, 1 Jun 2026 22:44:09 -0500 Subject: [PATCH 1/5] Initial commit - 0.1.0; game launches, content mods work, known issues with save data and options (need to restructure the VFS) --- games/game_paralives.py | 95 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 games/game_paralives.py diff --git a/games/game_paralives.py b/games/game_paralives.py new file mode 100644 index 0000000..27c8dcb --- /dev/null +++ b/games/game_paralives.py @@ -0,0 +1,95 @@ +from ..basic_features import BasicModDataChecker, GlobPatterns +from ..basic_game import BasicGame + + +class ParalivesGame(BasicGame): + #Plugin name + Name = "Paralives" + Author = "Julian Noel" + Version = "0.1.0" + + #actual game name + GameName = "Paralives" + + # Internal game ID used by MO2 + GameShortName = "paralives" + + # The nexus mods page identifier (if applicable) + GameNexusName = "paralives" + + # The main executable MO2 will look for to verify the folder + GameBinary = "Paralives.exe" + + #TODO + GameDocumentsDirectory = "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives" + GameSavesDirectory = "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/MySavedGames.mod" + + #framework includes special variables like %GAME_DOCUMENTS% to override the + # default relative path semantics; absolute paths will be treated as absolutes + # relatives will be done relative to the actual game directory + GameDataPath = "%GAME_DOCUMENTS%" + + # Steam App ID for auto-detection + GameSteamId = 1119730 + # maybe - it's actually really hard to find this + GameNexusId = 9002 + + + #TODO: save handling (it is in the localappdata folder but should be excluded) + + def __init__(self): + super().__init__() + self._featureMap[mobase.ModDataChecker] = BasicModDataChecker( + #describe what operation, and what matches to perform them on + GlobPatterns( + #valid files findable in a mod + valid=[ + "meta.ini", # Included in installed mod folder. + "BepInEx", + "doorstop_libs", + "unstripped_corlib", + "doorstop_config.ini", + "start_game_bepinex.sh", + "start_server_bepinex.sh", + "winhttp.dll", + # + "InSlimVML", + "Paralives_Data", + "inslimvml.ini", + # + "unstripped_managed", + # + "AdvancedBuilder", + ], + # mod authors will add these but they + # are not needed for deployment and will often + # conflict with each other anyway. + delete=[ + #readmes, helpers, etc + "*.txt", + "*.md", + "README", + "icon.png", + "license", + #package crap + "manifest.json", + #debug crap + "*.dll.mdb", + "*.pdb", + ], + #TODO: check basic_games to see if expanded variables work here + #we need to move these files into the + # bepinex dirs instead of the default location + move={ + # part of BepInEx script mod support + "plugins": "BepInEx/", + "*.dll": "BepInEx/plugins/", + "*.xml": "BepInEx/plugins/", + "config": "BepInEx/", + "*.cfg": "BepInEx/config/", + } + ) + ) + + #TODO: savegame handling (since it lives in the same folder as the content mods but is NOT a content mod) + From 5f71e3aac93c6e16e4ce98384843b97950ccfe19 Mon Sep 17 00:00:00 2001 From: vertigomaster Date: Mon, 1 Jun 2026 23:25:25 -0500 Subject: [PATCH 2/5] commented out early attempt at BepInEx support --- games/game_paralives.py | 104 ++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/games/game_paralives.py b/games/game_paralives.py index 27c8dcb..b870776 100644 --- a/games/game_paralives.py +++ b/games/game_paralives.py @@ -1,4 +1,4 @@ -from ..basic_features import BasicModDataChecker, GlobPatterns +# from ..basic_features import BasicModDataChecker, GlobPatterns from ..basic_game import BasicGame @@ -39,57 +39,57 @@ class ParalivesGame(BasicGame): def __init__(self): super().__init__() - self._featureMap[mobase.ModDataChecker] = BasicModDataChecker( - #describe what operation, and what matches to perform them on - GlobPatterns( - #valid files findable in a mod - valid=[ - "meta.ini", # Included in installed mod folder. - "BepInEx", - "doorstop_libs", - "unstripped_corlib", - "doorstop_config.ini", - "start_game_bepinex.sh", - "start_server_bepinex.sh", - "winhttp.dll", - # - "InSlimVML", - "Paralives_Data", - "inslimvml.ini", - # - "unstripped_managed", - # - "AdvancedBuilder", - ], - # mod authors will add these but they - # are not needed for deployment and will often - # conflict with each other anyway. - delete=[ - #readmes, helpers, etc - "*.txt", - "*.md", - "README", - "icon.png", - "license", - #package crap - "manifest.json", - #debug crap - "*.dll.mdb", - "*.pdb", - ], - #TODO: check basic_games to see if expanded variables work here - #we need to move these files into the - # bepinex dirs instead of the default location - move={ - # part of BepInEx script mod support - "plugins": "BepInEx/", - "*.dll": "BepInEx/plugins/", - "*.xml": "BepInEx/plugins/", - "config": "BepInEx/", - "*.cfg": "BepInEx/config/", - } - ) - ) + # self._featureMap[mobase.ModDataChecker] = BasicModDataChecker( + # #describe what operation, and what matches to perform them on + # GlobPatterns( + # #valid files findable in a mod + # valid=[ + # "meta.ini", # Included in installed mod folder. + # "BepInEx", + # "doorstop_libs", + # "unstripped_corlib", + # "doorstop_config.ini", + # "start_game_bepinex.sh", + # "start_server_bepinex.sh", + # "winhttp.dll", + # # + # "InSlimVML", + # "Paralives_Data", + # "inslimvml.ini", + # # + # "unstripped_managed", + # # + # "AdvancedBuilder", + # ], + # # mod authors will add these but they + # # are not needed for deployment and will often + # # conflict with each other anyway. + # delete=[ + # #readmes, helpers, etc + # "*.txt", + # "*.md", + # "README", + # "icon.png", + # "license", + # #package crap + # "manifest.json", + # #debug crap + # "*.dll.mdb", + # "*.pdb", + # ], + # #TODO: check basic_games to see if expanded variables work here + # #we need to move these files into the + # # bepinex dirs instead of the default location + # move={ + # # part of BepInEx script mod support + # "plugins": "BepInEx/", + # "*.dll": "BepInEx/plugins/", + # "*.xml": "BepInEx/plugins/", + # "config": "BepInEx/", + # "*.cfg": "BepInEx/config/", + # } + # ) + # ) #TODO: savegame handling (since it lives in the same folder as the content mods but is NOT a content mod) From e7a4c115d3eabf3d2d7e88284edaef9d30ce3bff Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 04:43:22 +0000 Subject: [PATCH 3/5] [pre-commit.ci] Auto fixes from pre-commit.com hooks. --- games/game_paralives.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/games/game_paralives.py b/games/game_paralives.py index b870776..c3df8d6 100644 --- a/games/game_paralives.py +++ b/games/game_paralives.py @@ -3,28 +3,30 @@ class ParalivesGame(BasicGame): - #Plugin name + # Plugin name Name = "Paralives" Author = "Julian Noel" Version = "0.1.0" - #actual game name + # actual game name GameName = "Paralives" # Internal game ID used by MO2 GameShortName = "paralives" - + # The nexus mods page identifier (if applicable) GameNexusName = "paralives" - + # The main executable MO2 will look for to verify the folder GameBinary = "Paralives.exe" - #TODO + # TODO GameDocumentsDirectory = "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives" - GameSavesDirectory = "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/MySavedGames.mod" + GameSavesDirectory = ( + "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/MySavedGames.mod" + ) - #framework includes special variables like %GAME_DOCUMENTS% to override the + # framework includes special variables like %GAME_DOCUMENTS% to override the # default relative path semantics; absolute paths will be treated as absolutes # relatives will be done relative to the actual game directory GameDataPath = "%GAME_DOCUMENTS%" @@ -34,8 +36,7 @@ class ParalivesGame(BasicGame): # maybe - it's actually really hard to find this GameNexusId = 9002 - - #TODO: save handling (it is in the localappdata folder but should be excluded) + # TODO: save handling (it is in the localappdata folder but should be excluded) def __init__(self): super().__init__() @@ -61,8 +62,8 @@ def __init__(self): # # # "AdvancedBuilder", # ], - # # mod authors will add these but they - # # are not needed for deployment and will often + # # mod authors will add these but they + # # are not needed for deployment and will often # # conflict with each other anyway. # delete=[ # #readmes, helpers, etc @@ -78,7 +79,7 @@ def __init__(self): # "*.pdb", # ], # #TODO: check basic_games to see if expanded variables work here - # #we need to move these files into the + # #we need to move these files into the # # bepinex dirs instead of the default location # move={ # # part of BepInEx script mod support @@ -91,5 +92,4 @@ def __init__(self): # ) # ) - #TODO: savegame handling (since it lives in the same folder as the content mods but is NOT a content mod) - + # TODO: savegame handling (since it lives in the same folder as the content mods but is NOT a content mod) From a92a26f55a02f760f752f5ae3572ae5a1d8f6d9a Mon Sep 17 00:00:00 2001 From: vertigomaster Date: Tue, 2 Jun 2026 00:31:01 -0500 Subject: [PATCH 4/5] Nested the GameDocumentsDirectory into a subfolder, seemingly resolved issue with non-mod data writing to Overwrites --- games/game_paralives.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/games/game_paralives.py b/games/game_paralives.py index c3df8d6..1fb1d50 100644 --- a/games/game_paralives.py +++ b/games/game_paralives.py @@ -6,7 +6,7 @@ class ParalivesGame(BasicGame): # Plugin name Name = "Paralives" Author = "Julian Noel" - Version = "0.1.0" + Version = "0.1.1" # actual game name GameName = "Paralives" @@ -21,7 +21,7 @@ class ParalivesGame(BasicGame): GameBinary = "Paralives.exe" # TODO - GameDocumentsDirectory = "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives" + GameDocumentsDirectory = "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/ModOrganizer" GameSavesDirectory = ( "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/MySavedGames.mod" ) From 05a7bd68d1fe8f3f873ad77264811588cf853d12 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 05:32:25 +0000 Subject: [PATCH 5/5] [pre-commit.ci] Auto fixes from pre-commit.com hooks. --- games/game_paralives.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/games/game_paralives.py b/games/game_paralives.py index 1fb1d50..d187e99 100644 --- a/games/game_paralives.py +++ b/games/game_paralives.py @@ -21,7 +21,9 @@ class ParalivesGame(BasicGame): GameBinary = "Paralives.exe" # TODO - GameDocumentsDirectory = "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/ModOrganizer" + GameDocumentsDirectory = ( + "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/ModOrganizer" + ) GameSavesDirectory = ( "%USERPROFILE%/AppData/LocalLow/Paralives/Paralives/MySavedGames.mod" )