1- from ..basic_game import BasicGame
2- import mobase
3- from ..basic_features import BasicModDataChecker , GlobPatterns
4- from typing import Tuple
5-
6- class SilentHill2RemakeModDataChecker (BasicModDataChecker ):
7- def __init__ (self ):
8- super ().__init__ (
9- GlobPatterns (
10- delete = [
11- "*.txt" ,
12- "*.md" ,
13- "manifest.json" ,
14- "icon.png" ,
15- ],
16- )
17- )
18- self .mod_path = ["SHProto" , "Content" , "Paks" , "~mod" ]
19- self .mod_path_lower = [name .lower () for name in self .mod_path ]
20-
21- def _find_tree (self , filetree : mobase .IFileTree ) -> Tuple [str | None , mobase .IFileTree | None ]:
22- """
23- Search the given filetree for a directory name that matches any component
24- of self.mod_path (case-insensitive).
25-
26- Returns:
27- (prefix, entry)
28- prefix: The missing part before the match (e.g. 'SHProto/Content/')
29- entry: The IFileTree entry that matched (e.g. the 'Paks' directory)
30- (None, None) if nothing matches.
31- """
32- for entry in filetree :
33- if not entry .isDir ():
34- continue
35-
36- name_lower = entry .name ().lower ()
37- for i , component in enumerate (self .mod_path_lower ):
38- if name_lower == component :
39- # Build the prefix string for everything *before* this match
40- prefix_parts = self .mod_path [:i ]
41- prefix = "/" .join (prefix_parts ) + ("/" if prefix_parts else "" )
42- return (prefix , entry )
43-
44- # No matches found
45- return (None , None )
46-
47-
48- def dataLooksValid (self , filetree : mobase .IFileTree ) -> mobase .ModDataChecker .CheckReturn :
49- # Check for fully valid layout
50- has_entry ,_ = self ._find_tree (filetree )
51- if has_entry is None :
52- for entry in filetree :
53- if entry .name ().lower ().endswith (".pak" ) and entry .isFile ():
54- return mobase .ModDataChecker .FIXABLE
55- elif has_entry is "" :
56- return mobase .ModDataChecker .VALID
57- else :
58- return mobase .ModDataChecker .FIXABLE
59-
60- # Otherwise, not recognizable
61- return mobase .ModDataChecker .INVALID
62-
63- def fix (self , filetree : mobase .IFileTree ) -> mobase .IFileTree :
64- filetree = super ().fix (filetree )
65- prefix , item = self ._find_tree (filetree )
66- if prefix is None :
67- foundAPak = False
68- # Move all top-level items to BepInEx/plugins/
69- items_to_move = list (filetree )
70- for item in items_to_move :
71- if item .name ().lower ().endswith (".pak" ):
72- foundAPak = True
73- filetree .move (item , f"SHProto/Content/Paks/~mod/{ item .name ()} " )
74- return filetree if foundAPak else None
75- elif prefix is "" :
76- return filetree
77- else :
78- filetree .move (item , f"{ prefix } { item .name ()} " )
79- return filetree
80-
81- class SilentHill2RemakeGame (BasicGame ):
82- def init (self , organizer : mobase .IOrganizer ) -> bool :
83- super ().init (organizer )
84- self ._register_feature (SilentHill2RemakeModDataChecker ())
85- return True
86-
87- Name = "Silent Hill 2 Remake Support Plugin"
88- Author = "HomerSimpleton Returns"
89- Version = "1.0"
90-
91- GameName = "Silent Hill 2 Remake"
92- GameShortName = "silenthill2"
93- GameNexusName = "silenthill2"
94-
95- GameBinary = "SHProto/Binaries/Win64/SHProto-Win64-Shipping.exe"
96- GameLauncher = "SHProto.exe"
97- GameDataPath = "%GAME_PATH%"
98- GameSupportURL = "https://github.com/ModOrganizer2/modorganizer-basic_games/wiki/Game:-Silent-Hill-2-Remake"
99-
100- GameGogId = [1225972913 , 2051029707 ]
1+ from typing import Tuple
2+
3+ import mobase
4+
5+ from ..basic_features import BasicModDataChecker , GlobPatterns
6+ from ..basic_game import BasicGame
7+
8+
9+ class SilentHill2RemakeModDataChecker (BasicModDataChecker ):
10+ def __init__ (self ):
11+ super ().__init__ (
12+ GlobPatterns (
13+ delete = [
14+ "*.txt" ,
15+ "*.md" ,
16+ "manifest.json" ,
17+ "icon.png" ,
18+ ],
19+ )
20+ )
21+ self .mod_path = ["SHProto" , "Content" , "Paks" , "~mod" ]
22+ self .mod_path_lower = [name .lower () for name in self .mod_path ]
23+
24+ def _find_tree (
25+ self , filetree : mobase .IFileTree
26+ ) -> Tuple [str | None , mobase .IFileTree | None ]:
27+ """
28+ Search the given filetree for a directory name that matches any component
29+ of self.mod_path (case-insensitive).
30+
31+ Returns:
32+ (prefix, entry)
33+ prefix: The missing part before the match (e.g. 'SHProto/Content/')
34+ entry: The IFileTree entry that matched (e.g. the 'Paks' directory)
35+ (None, None) if nothing matches.
36+ """
37+ for entry in filetree :
38+ if not entry .isDir ():
39+ continue
40+
41+ name_lower = entry .name ().lower ()
42+ for i , component in enumerate (self .mod_path_lower ):
43+ if name_lower == component :
44+ # Build the prefix string for everything *before* this match
45+ prefix_parts = self .mod_path [:i ]
46+ prefix = "/" .join (prefix_parts ) + ("/" if prefix_parts else "" )
47+ return (prefix , entry )
48+
49+ # No matches found
50+ return (None , None )
51+
52+ def dataLooksValid (
53+ self , filetree : mobase .IFileTree
54+ ) -> mobase .ModDataChecker .CheckReturn :
55+ # Check for fully valid layout
56+ has_entry , _ = self ._find_tree (filetree )
57+ if has_entry is None :
58+ for entry in filetree :
59+ if entry .name ().lower ().endswith (".pak" ) and entry .isFile ():
60+ return mobase .ModDataChecker .FIXABLE
61+ elif has_entry == "" :
62+ return mobase .ModDataChecker .VALID
63+ else :
64+ return mobase .ModDataChecker .FIXABLE
65+
66+ # Otherwise, not recognizable
67+ return mobase .ModDataChecker .INVALID
68+
69+ def fix (self , filetree : mobase .IFileTree ) -> mobase .IFileTree :
70+ filetree = super ().fix (filetree )
71+ prefix , item = self ._find_tree (filetree )
72+ if prefix is None :
73+ foundAPak = False
74+ # Move all top-level items to BepInEx/plugins/
75+ items_to_move = list (filetree )
76+ for item in items_to_move :
77+ if item .name ().lower ().endswith (".pak" ):
78+ foundAPak = True
79+ filetree .move (item , f"SHProto/Content/Paks/~mod/{ item .name ()} " )
80+ return filetree if foundAPak else None
81+ elif prefix == "" :
82+ return filetree
83+ else :
84+ filetree .move (item , f"{ prefix } { item .name ()} " )
85+ return filetree
86+
87+
88+ class SilentHill2RemakeGame (BasicGame ):
89+ def init (self , organizer : mobase .IOrganizer ) -> bool :
90+ super ().init (organizer )
91+ self ._register_feature (SilentHill2RemakeModDataChecker ())
92+ return True
93+
94+ Name = "Silent Hill 2 Remake Support Plugin"
95+ Author = "HomerSimpleton Returns"
96+ Version = "1.0"
97+
98+ GameName = "Silent Hill 2 Remake"
99+ GameShortName = "silenthill2"
100+ GameNexusName = "silenthill2"
101+
102+ GameBinary = "SHProto/Binaries/Win64/SHProto-Win64-Shipping.exe"
103+ GameLauncher = "SHProto.exe"
104+ GameDataPath = "%GAME_PATH%"
105+ GameSupportURL = "https://github.com/ModOrganizer2/modorganizer-basic_games/wiki/Game:-Silent-Hill-2-Remake"
106+
107+ GameGogId = [1225972913 , 2051029707 ]
0 commit comments