
    8fW                       d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
Z
d dlmZmZmZ d dlmZ ddlmZmZ dd
Z e	d      Z G d dee         Z G d deee            Z G d d      Z G d d	e
j4                        Zy)    )annotationsN)Path)CallableGenericTypeVar)QDir	QFileInfoQStandardPaths)QIcon   )BasicGameSaveGameBasicGameSaveGameInfo	BasicGamec                T   	 | j                  d      dk7  r=| j                  dt        j                  t        j                  j
                              } | j                  d      dk7  r=| j                  dt        j                  t        j                  j                              } | j                  d      dk7  r.| j                  d|j                         j                               } | j                  d      dk7  r.| j                  d|j                         j                               } | S )Nz%DOCUMENTS%z%USERPROFILE%z%GAME_DOCUMENTS%z%GAME_PATH%)
findreplacer
   writableLocationStandardLocationDocumentsLocationHomeLocationdocumentsDirectoryabsolutePathgameDirectory)valuegames     jC:\Program Files (x86)/Steam/steamapps/common/Skyrim Special Edition/MO2/plugins\basic_games\basic_game.pyreplace_variablesr      s    3zz- B&++//AA
 zz/"b(++//<<
 zz$%+ 7 7 9 F F H
 zz- B&mT-?-?-A-N-N-PQL    _Tc                  r    e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   	 	 d	 	 	 	 	 	 	 	 	 ddZddZy)BasicGameMappingz'BasicGame'_gamestr_exposed_name_internal_method_namebool	_requiredzCallable[['BasicGame'], _T]_defaultCallable[[_T | str], _T] | None	_apply_fnNc                P   || _         || _        || _        || _        t	        || j                        r?t        || j                        | j                  	 | j                        fd| _
        y ||| _
        y t        |j                  | j                        t        t        | j                        u r/t        dj                  |j                  | j                              y # t        $ r5}t        dj                  |j                  | j                              |d }~ww xY w)Nz5Basic game plugin from {} has an invalid {} property.c                    S N )r   r   s    r   <lambda>z+BasicGameMapping.__init__.<locals>.<lambda>]   s     r   z1Basic game plugin from {} is missing {} property.)r#   r%   r&   r+   hasattrgetattr	Exception
ValueErrorformat	_fromNamer)   	__class__r   )selfr   exposed_nameinternal_methoddefaultapply_fnerrr   s          @r   __init__zBasicGameMapping.__init__C   s    
)%4"!4++,D$"4"45E~~) NN51E /DM #DMT^^T%?%?@Gt11E
 
 CJJNN&& 
 ! $OVV NN ..
 s   C' '	D%00D  D%c                b   	 | j                  | j                        }t        |t              rt	        || j                        S t        |t
              r-t        t	        |j                         | j                              S t        |t              rt	        t        |      | j                        S |S r.   )r)   r#   
isinstancer$   r   r   pathr   r8   r   s     r   getzBasicGameMapping.getj   s    /djj)eS!$UDJJ77t$)%**,

CDD t$$SZ<<r   NN)
r   r   r9   r$   r:   r$   r;    Callable[[BasicGame], _T] | Noner<   r*   returnr    )__name__
__module____qualname____annotations__r>   rC   r/   r   r   r"   r"   0   sr       O *) /. 5948%% % 	%
 2% 2%Nr   r"   c                  f     e Zd ZU 	 ded<   	 	 d	 	 	 	 	 	 	 	 	 d	 fdZd
dZddZddZddZ xZ	S )BasicGameOptionsMappingint_indexc                J    t         |   |||d |       d| _        || _        y )Nc                    g S r.   r/   gs    r   r0   z2BasicGameOptionsMapping.__init__.<locals>.<lambda>   s     r   r   )superr>   rO   _current_default)r8   r   r9   r:   r;   r<   r7   s         r   r>   z BasicGameOptionsMapping.__init__   s)     	|_lHU 'r   c                    	 || _         y r.   rO   )r8   indexs     r   	set_indexz!BasicGameOptionsMapping.set_index   s    	 r   c                |    	 	 | j                         j                  |      | _        y # t        $ r
 d| _        Y y w xY wNr   )rC   rX   rO   r4   rB   s     r   	set_valuez!BasicGameOptionsMapping.set_value   s:    		((***51DK 	DK	s   $( ;;c                "    	 | j                   dk7  S r[   rW   r8   s    r   	has_valuez!BasicGameOptionsMapping.has_value   s    	 {{b  r   c                   | j                  | j                        }|s| j                  | j                        S | j                  dk(  r|d   }n|| j                     }t	        |t
              rt        || j                        S t	        |t              r-t        t        |j                         | j                              S |S )Nr   r   )	r)   r#   rU   rO   r@   r$   r   r   rA   )r8   valuesr   s      r   currentzBasicGameOptionsMapping.current   s    tzz*((44;;"1IE4;;'EeS!$UDJJ77t$)%**,

CDDr   rD   )
r   r   r9   r$   r:   r$   r;   rE   r<   z+Callable[[list[_T] | str], list[_T]] | None)rX   rN   )r   r    rG   r'   rF   )
rH   rI   rJ   rK   r>   rY   r\   r_   rb   __classcell__r7   s   @r   rM   rM   z   s`    
 K 59@D
(
( 
( 	
(
 2
( >
(!r   rM   c                     e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   ded<   d
ed<   ded<   ded<   ded<   ded<   ded<   d
ed<   ded<   ded<   ded<   ed!d       Zd"dZy )#BasicGameMappingszBasicGameMapping[str]nameauthorz$BasicGameMapping[mobase.VersionInfo]versiondescriptiongameNamegameShortNamegameNexusNamezBasicGameMapping[list[str]]validShortNameszBasicGameMapping[int]nexusGameId
binaryNamelauncherNamedataDirectoryzBasicGameMapping[QDir]r   iniFilessavesDirectorysavegameExtensionzBasicGameOptionsMapping[str]
steamAPPIdgogAPPIdoriginManifestIdsoriginWatcherExecutables	epicAPPIdeaDesktopContentId
supportURLc                   dj                  t        j                  t        j                  j                        | j                               dj                  t        j                  t        j                  j                        | j                               g}|D ]!  }t        |      }|j                         s|c S  t               S )Nz{}/My Games/{}z{}/{})r5   r
   r   r   r   rl   r   exists)r   foldersfolderqdirs       r   _default_documents_directoryz.BasicGameMappings._default_documents_directory   s     ##//"33EE 	 NN//"33EE 	
  	F<D{{}	
 vr   c                   || _         t        |dd      | _        t        |dd      | _        t        |ddd       | _        t        |d	d
d       | _        t        |dd      | _        t        |dd      | _        t        |ddd       | _        t        |ddd d       | _	        t        |ddd t              | _        t        |dd      | _        t        |ddd        | _        t        |d!d"      | _        t        |d#d$d% t        j                   &      | _        t        |d'd(d) d*       | _        t        |d+d,d- d. &      | _        t        |d/d0d1       | _        dId2}t+        |d3d4d5 |      | _        t+        |d6d7d8 |      | _        t+        |d9d:d; |      | _        t        |d<d=d> d? &      | _        t+        |d@dAdB |      | _        t+        |dCdDdE |      | _        t        |dFdGdH       | _        y )JNNamerh   Authorri   Versionrj   c                P    t        | t              rt        j                  |       S | S r.   )r@   r$   mobaseVersionInfoss    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>   s    
1c8Jv11!4 PQ r   )r<   Descriptionrk   c                @    dj                  | j                               S )NzAdds basic support for game {}.)r5   rl   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>   s    7>>qzz|L r   GameNamerl   GameShortNamerm   GameNexusNamern   c                "    | j                         S r.   )rm   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>  s    aoo/ r   )r;   GameValidShortNamesro   c                    g S r.   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>      b r   c                    t        | t              r-| j                  d      D cg c]  }|j                          c}S | S c c}w N,r@   r$   splitstripr   cs     r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>  =    eS) %*KK$45q5   5   A )r;   r<   GameNexusIdnexusGameIDc                     yNr   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>      r   
GameBinaryrq   GameLaunchergetLauncherNamec                     yN r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>  r   r   GameDataPathrs   GameDocumentsDirectoryr   c                <    t        | t              rt        |       S | S r.   r@   r$   r   r   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>$      *Q*<tAw ! r   )r<   r;   GameIniFilesrt   c                    g S r.   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>+  s    b r   c                    t        | t              r-| j                  d      D cg c]  }|j                          c}S | S c c}w r   r   r   s     r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>,  r   r   GameSavesDirectoryru   c                <    t        | t              rt        |       S | S r.   r   r   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>6  r   r   c                "    | j                         S r.   )r   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>7  s    a224 r   GameSaveExtensionrv   c                     y)Nsaver/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>:  r   r   c                    	 t        | t        t        f      rt        |       g} | D cg c]  }t        |       c}S c c}w r.   )r@   rN   r$   )vxs     r   	ids_applyz-BasicGameMappings.__init__.<locals>.ids_apply>  s:    
 !c3Z(VH$%&qCF&&&s   =GameSteamIdrw   c                     yr   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>I  r   r   	GameGogIdrx   c                     yr   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>L  r   r   GameOriginManifestIdsry   c                     yr   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>R  r   r   GameOriginWatcherExecutablesrz   c                ,    t        | t              r| gS | S r.   )r@   r$   r   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>Y  s    jC&8s a r   c                    g S r.   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>Z  r   r   
GameEpicIdr{   c                     yr   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>]  r   r   GameEaDesktopIdr|   c                     yr   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>c  r   r   GameSupportURLr}   c                     yr   r/   rR   s    r   r0   z,BasicGameMappings.__init__.<locals>.<lambda>g  r   r   )r   z!list[int] | list[str] | int | strrG   	list[str])r#   r"   rh   ri   rj   rk   rl   rm   rn   ro   rN   rp   rq   rr   rs   rg   r   r   rt   ru   rv   rM   rw   rx   ry   rz   r{   r|   r}   )r8   r   r   s      r   r>   zBasicGameMappings.__init__   sL   
$T66:	&tXx@'Q	
 ,L	
 )z:F-dO_U-/	
  0! 
 
 ,-c
 +4|L, 	
 .dNOT"2$ C%BB#
 )

 / C4
 "2%':DT"

	' 2-|i
 0+z<)
 "9# "
 )9*&? )
% 1,\I
 #:  #
 +"L,
r   N)r   zmobase.IPluginGame)r   r   )rH   rI   rJ   rK   staticmethodr   r>   r/   r   r   rg   rg      s    
!!11&&##((((00&&%%''((..))**,,,,**3399++44%% .w
r   rg   c                      e Zd ZU 	 ded<   ded<   ded<   ded<   ded<   ed        Zded	<   d
ed<   ded<    fdZd8dZd9dZd9dZ	d9dZ
d9dZd9dZd:dZd;dZd;dZd;dZd<dZd9dZd=dZd Zd;dZd;dZd>dZd?dZd;d Zd@d!Zd@d"Zd;d#Zd;d$Zd;d%Zd;d&Zd;d'Z d;d(Z!d;d)Z"d?d*Z#dAd+Z$dBd,Z%dCd-Z&	 	 	 	 	 	 dDd.Z'dEd/Z(d;d0Z)dFd1Z*d9d2Z+dGd3Z,dGd4Z-dHd5Z.dGd6Z/dGd7Z0 xZ1S )Ir   zdict[str, Path]steam_games	gog_gamesorigin_games
epic_gameseadesktop_gamesc                     ddl m}  ddlm} ddlm} ddlm} ddlm}  |       t        _         |       t        _         |       t        _	         |       t        _
         |        t        _        y )Nr   )
find_games)eadesktop_utilsr   
epic_utils	gog_utilsorigin_utilssteam_utilsr   r   r   r   r   r   )find_eadesktop_gamesfind_epic_gamesfind_gog_gamesfind_origin_gamesfind_steam_gamess        r   setupzBasicGame.setupw  sH    G=;A? 0 2	,.	!2!4	.0	$8$:	!r   r$   r6   mobase.IOrganizer
_organizer	_gamePathc                    t         t        |           t        | d      s| j                  j
                  | _        d| _        t        |       | _	        y )Nr6   r   )
rT   r   r>   r1   r7   rH   r6   r   rg   	_mappings)r8   r7   s    r   r>   zBasicGame.__init__  s>    i')t[)!^^44DN,=d,Cr   c                Z    | j                   j                         j                  | |dd      S )Nr   T)r   gameFeaturesregisterFeature)r8   features     r   _register_featurezBasicGame._register_feature  s'    ++-==dGQPTUUr   c                J    | j                   j                  j                         S r.   )r   rw   r_   r^   s    r   is_steamzBasicGame.is_steam  s    ~~((2244r   c                J    | j                   j                  j                         S r.   )r   rx   r_   r^   s    r   is_gogzBasicGame.is_gog  s    ~~&&0022r   c                J    | j                   j                  j                         S r.   )r   ry   r_   r^   s    r   	is_originzBasicGame.is_origin  s    ~~//99;;r   c                J    | j                   j                  j                         S r.   )r   r{   r_   r^   s    r   is_epiczBasicGame.is_epic  s    ~~''1133r   c                J    | j                   j                  j                         S r.   )r   r|   r_   r^   s    r   is_eadesktopzBasicGame.is_eadesktop  s    ~~00::<<r   c                    | _          j                  t                       j                  j                  j                         rddlm}  | j                  j                  j                                _         j                   j                   fd      st        dt        j                         y j                   j                   fd      st        dt        j                         yy	)
Nr   )OriginWatcherc                8    j                   j                         S r.   )origin_watcherspawn_origin_watcher)appNamer8   s    r   r0   z BasicGame.init.<locals>.<lambda>  s     3 3 H H J r   z)Failed to register onAboutToRun callback!)fileFc                8    j                   j                         S r.   )r   stop_origin_watcher)r   resultr8   s     r   r0   z BasicGame.init.<locals>.<lambda>  s    (;(;(O(O(Q r   z*Failed to register onFinishedRun callback!T)r   r   r   r   rz   rC   r   r   r   onAboutToRunprintsysstderronFinishedRun)r8   	organizerr   s   `  r   initzBasicGame.init  s    #467>>226683"/77;;=#D ??//J A

S??00Q BTr   c                J    | j                   j                  j                         S r.   )r   rh   rC   r^   s    r   rh   zBasicGame.name  s    ~~""&&((r   c                J    | j                   j                  j                         S r.   )r   ri   rC   r^   s    r   ri   zBasicGame.author  s    ~~$$((**r   c                J    | j                   j                  j                         S r.   )r   rk   rC   r^   s    r   rk   zBasicGame.description      ~~))--//r   c                J    | j                   j                  j                         S r.   )r   rj   rC   r^   s    r   rj   zBasicGame.version  s    ~~%%))++r   c                    | j                   j                         sy| j                         | j                   j                         j                         k(  S )NF)r   managedGamerh   r^   s    r   isActivezBasicGame.isActive  s>    **, yy{doo99;@@BBBr   c                    g S r.   r/   r^   s    r   settingszBasicGame.settings      	r   c                   | j                   j                  j                         D ]8  }|t        j                  v s| j                  t        j                  |           y  | j                   j                  j                         D ]8  }|t        j                  v s| j                  t        j                  |           y  | j                   j                  j                         D ]8  }|t        j                  v s| j                  t        j                  |           y  | j                   j                  j                         D ]8  }|t        j                  v s| j                  t        j                  |           y  | j                   j                  j                         D ]8  }|t        j                  v s| j                  t        j                  |           y  y r.   )r   rw   rC   r   r   setGamePathrx   r   ry   r   r{   r   r|   r   )r8   steam_idgog_idorigin_manifest_idepic_ideadesktop_content_ids         r   
detectGamezBasicGame.detectGame  s   11557 	H9000  !6!6x!@A	
 nn--113 	F,,,  !4!4V!<=	
 #'.."B"B"F"F"H 	!Y%;%;;  !7!78J!KL	
 ~~//335 	G)...  !5!5g!>?	
 %)NN$E$E$I$I$K 	 #y'@'@@  !:!:;O!PQ	r   c                J    | j                   j                  j                         S r.   )r   rl   rC   r^   s    r   rl   zBasicGame.gameName      ~~&&**,,r   c                J    | j                   j                  j                         S r.   )r   rm   rC   r^   s    r   rm   zBasicGame.gameShortName      ~~++//11r   c                    t        j                  | j                         j                  | j	                                     S r.   )r   getIconForExecutabler   absoluteFilePathrq   r^   s    r   gameIconzBasicGame.gameIcon  s3    ** 11$//2CD
 	
r   c                J    | j                   j                  j                         S r.   )r   ro   rC   r^   s    r   ro   zBasicGame.validShortNames  s    ~~--1133r   c                J    | j                   j                  j                         S r.   )r   rn   rC   r^   s    r   rn   zBasicGame.gameNexusName  r  r   c                     yr   r/   r^   s    r   nexusModOrganizerIDzBasicGame.nexusModOrganizerID  s    r   c                J    | j                   j                  j                         S r.   )r   rp   rC   r^   s    r   r   zBasicGame.nexusGameID
  r	  r   c                J    | j                   j                  j                         S r.   )r   rw   rb   r^   s    r   rw   zBasicGame.steamAPPId  s    ~~((0022r   c                J    | j                   j                  j                         S r.   )r   rx   rb   r^   s    r   rx   zBasicGame.gogAPPId  s    ~~&&..00r   c                J    | j                   j                  j                         S r.   )r   r{   rb   r^   s    r   r{   zBasicGame.epicAPPId  s    ~~''//11r   c                J    | j                   j                  j                         S r.   )r   r|   rb   r^   s    r   r|   zBasicGame.eaDesktopContentId  s    ~~0088::r   c                J    | j                   j                  j                         S r.   )r   rq   rC   r^   s    r   rq   zBasicGame.binaryName      ~~((,,..r   c                J    | j                   j                  j                         S r.   )r   rr   rC   r^   s    r   r   zBasicGame.getLauncherName  s    ~~**..00r   c                J    | j                   j                  j                         S r.   )r   r}   rC   r^   s    r   getSupportURLzBasicGame.getSupportURL  r+  r   c                J    | j                   j                  j                         S r.   )r   rt   rC   r^   s    r   rt   zBasicGame.iniFiles"  r  r   c                   g }| j                         rg|j                  t        j                  | j	                         t        | j                         j                  | j                                                  |j                  t        j                  | j	                         t        | j                         j                  | j                                                  |S r.   )	r   appendr   ExecutableInforl   r	   r   r  rq   )r8   execss     r   executableszBasicGame.executables%  s    -/!LL%%MMO**,==d>R>R>TU 	!!$,,.??@QRS	
 r   c                    g S r.   r/   r^   s    r   executableForcedLoadszBasicGame.executableForcedLoads8  r  r   c                    | j                   j                  j                         }t        |j	                               j                  d|       D cg c]  }t        |       c}S c c}w )Nz**/*.)r   rv   rC   r   r   globr   )r8   r   extrA   s       r   	listSaveszBasicGame.listSaves;  s`    nn..224 V0023885G
 d#
 	
 
s   A'c           	        |t         j                  j                  z  rp| j                         D ]\  }	 t	        j
                  | j                         j                  |      |j                  t        |      j                                      ^ y y # t        $ rB t        |j                  t        |      j                                     j                          Y w xY wr.   )r   ProfileSettingCONFIGURATIONrt   shutilcopyfiler   r  r	   fileNameFileNotFoundErrorr   touch)r8   	directoryr  iniFiles       r   initializeProfilezBasicGame.initializeProfileB  s     f++999==? 	OO//1BB7K!229W3E3N3N3PQ	 : ) !229W3E3N3N3PQegs   ABACCc                     y r.   r/   )r8   variants     r   setGameVariantzBasicGame.setGameVariantQ  s    r   c                    t        j                  | j                         j                  | j	                                     S r.   )r   getFileVersionr   r  rq   r^   s    r   gameVersionzBasicGame.gameVersionT  s3    $$ 11$//2CD
 	
r   c                @    |j                  | j                               S r.   )r   rq   )r8   rC  s     r   
looksValidzBasicGame.looksValidY  s     122r   c                ,    t        | j                        S r.   )r'   r   r^   s    r   isInstalledzBasicGame.isInstalled\  s    DNN##r   c                .    	 t        | j                        S r.   )r   r   r^   s    r   r   zBasicGame.gameDirectory_  s    	 DNN##r   c                    t        | j                         j                  | j                  j                  j                                     S r.   )r   r   r  r   rs   rC   r^   s    r   rs   zBasicGame.dataDirectorye  s9     11$..2N2N2R2R2TU
 	
r   c                d   t        |      | _        t        |      }t        j                  j                         D ]0  \  }}||k(  s| j                  j                  j                  |       2 t        j                  j                         D ]0  \  }}||k(  s| j                  j                  j                  |       2 t        j                  j                         D ]0  \  }}||k(  s| j                  j                  j                  |       2 t        j                  j                         D ]0  \  }}	|	|k(  s| j                  j                  j                  |       2 t        j                  j                         D ]0  \  }
}||k(  s| j                  j                  j                  |
       2 y r.   )r$   r   r   r   r   itemsr   rw   r\   r   r   ry   r   r{   r   r|   )r8   rA   steamid	steampathgogidgogpathoriginid
originpathepicidepicpatheadesktopideadesktoppaths               r   r  zBasicGame.setGamePathj  sq   TDz #,"7"7"="="? 	=GYD ))33G<	= (11779 	;NE7$))33E:	; %.$:$:$@$@$B 	E HjT!00::8D	E !* 4 4 : : < 	;FH4((226:	; +4*C*C*I*I*K 	I&K$11;;KH	Ir   c                J    | j                   j                  j                         S r.   )r   r   rC   r^   s    r   r   zBasicGame.documentsDirectory  s    ~~004466r   c                J    | j                   j                  j                         S r.   )r   ru   rC   r^   s    r   ru   zBasicGame.savesDirectory  s    ~~,,0022r   )r   zmobase.GameFeaturerG   r'   rc   )r  r   rG   r'   )rG   r$   )rG   zmobase.VersionInfo)rG   zlist[mobase.PluginSetting])rG   r   )rG   r   )rG   rN   )rG   zlist[mobase.ExecutableInfo])rG   z(list[mobase.ExecutableForcedLoadSetting])r   r   rG   zlist[mobase.ISaveGame])rC  r   r  zmobase.ProfileSettingrG   None)rG  r$   rG   r`  )rC  r   )rG   r   )rA   z
Path | strrG   r`  )2rH   rI   rJ   rK   r   r   r>   r   r   r   r   r   r   r  rh   ri   rk   rj   r  r  r  rl   rm   r   ro   rn   r$  r   rw   rx   r{   r|   rq   r   r.  rt   r4  r6  r:  rE  rH  rK  rM  rO  r   rs   r  r   ru   rd   re   s   @r   r   r   k  sC   .
 ! !!$$; ; N "! NDV53<4=
.)+0,C
4-2

420312;/1/-&
)>	

3$$

I.73r   )r   r$   r   r   rG   r$   )
__future__r   r>  r  pathlibr   typingr   r   r   r   PyQt6.QtCorer   r	   r
   PyQt6.QtGuir   #basic_features.basic_save_game_infor   r   r   r    r"   listrM   rg   IPluginGamer   r/   r   r   <module>ri     s    "  
  - -  8 8 6 T]Gwr{ GTC.tBx8 CLh
 h
VZ3"" Z3r   