
    Paf                    4   % S SK Jr  S SKrS SKrS SKrS SKJr  S SKJrJ	r	J
r
Jr  SSKJrJrJr  SSKJrJrJrJrJrJrJr  SrS	\S
'   SrS\S'   \" \5      R8                  S-  r\R=                  SS9  SrS\S'   \	\ \
\ \!S4   4   r"\	\!\"4   r# " S S5      r$g)    )annotationsN)Path)ClassVarDictUnioncast   )deletedumpload)DefDataTupleexpand_item_definition_dataexpand_weapon_definition_datapack_item_definition_datapack_weapon_definition_dataunpack_item_definition_dataunpack_weapon_definition_data   intSAVE_VERSIONsave_versionstrSAVE_VERSION_KEYSavesT)exist_okStash
STASH_NAMEc                      \ rS rSr% SrS\S'   S\S'   SrS\S'   SSS	 jjrSS
 jrSS jr	SS jr
SS jrSS jrSS jr        SS jrSS jrSS jr\SS j5       rSrg)SaveManager   a  
Class that deals with our custom item saving. By default sets up an empty save, call `load()`
first to load from file (if it exists).

All items have a `UniqueId` field, which we use to uniquely identify them. In the rare case
there's a conflict, we can just change the id. There's an issue in gibbed's editor which means
this isn't quite a 1/2^32 we can ignore:
https://github.com/gibbed/Gibbed.Borderlands2/issues/154
r   	file_pathItemDataDictitemszClassVar[str]	ITEMS_KEYc                    [        U5      R                  U(       a  SOS-   S-   n[        [        U5      -  U l        0 U l        g )N_Bank z.json)r   stem
_SAVES_DIRr!   r#   )self	save_nameis_bank	file_names       cZ:\mnt\Skyabridged\SteamLibrary\steamapps\common\Borderlands 2\sdk_mods\SanitySaver\save_manager.py__init__SaveManager.__init__*   s6    O((wGBG'Q	#d9o5
    c                &    [        U R                  5      nUR                  U R                  0 5      R	                  5        VVs0 s H  u  p#[        U5      U_M     snnU l        gs  snnf ! [        [        R                  4 a
    0 U l         gf = f)ze
Loads all save data from disk, or loads empty save data if the file does not exist or is
malformed.
N)	r   r!   getr$   r#   r   OSErrorjsonJSONDecodeError)r*   data	unique_idvals       r.   r   SaveManager.load0   s    
	'D ;?((4>>SU:V:\:\:^:^	I#:^DJ  --. 	DJ	s$   AA, A&	A, &A, ,!BBc                    [        U R                  5      S:X  a  [        U R                  5        g[	        [
        [        U R                  U R                  0U R                  5        g)zUWrites all save data to disk, overwriting existing files. May delete files if empty. r   N)lenr#   r
   r!   r   r   r   r$   r*   s    r.   writeSaveManager.write?   sF    tzz?a4>>" ,

 ~~r1   c                8    U R                   R                  5         g)zClears all save data. N)r#   clearr=   s    r.   rA   SaveManager.clearI   s    

r1   c                   UR                   U R                  ;   a8  [        R                  " SS5      Ul         UR                   U R                  ;   a  M8  U R	                  X5      SS.nU(       a  UR                  [        U5      5        OUR                  [        U5      5        [        [        UR                  S5      5      nX0R                  U'   g )Ni   l        T)_description_initalUniqueId)rF   r#   random	randrange_get_descriptionupdater   r   r   r   pop)r*   def_data	is_weaponpackedr8   s        r.   _add_new_item_from_def"SaveManager._add_new_item_from_defM   s    4::- & 0 0j IH 4::- !11(F
 MM5h?@MM3H=>fjj45	 &

9r1   c                j    U R                  UR                  UR                  R                  S:H  5        g)zB
Adds a new item to the save, rerolling it's unique id if needed.
WillowWeaponN)rO   DefinitionDataClassNamer*   items     r.   add_new_itemSaveManager.add_new_item]   s'     	##D$7$7N9Z[r1   c                    UR                   R                  nUR                  R                  US5      nUb  X0R                  ;   a  U R	                  U5        gX@R                  U'   g)z}
Adds an item to the save, using existing save data if we've seen it before.

Intended to be used after loading into a save.
N)rS   rF   r#   r3   rX   )r*   rW   existing_saver8   known_partss        r.   add_existing_itemSaveManager.add_existing_itemc   sX     ''00	#))--i> )zz"9d#$/JJy!r1   c                H   UR                   nUR                  R                  US5      nUb  X@R                  ;   a  U R                  X5        gSU;  a  XPR                  U'   gSUS   0n[        R
                  " 5       nUR                  5        H  u  pUS   S:X  a  M  [        U	[        5      (       a  U	R                  S5      (       a  M=  [        X5      n
[        U
[        R                  5      (       a  UR                  U
5      n
X:w  d  M  XU'   M     X`R                  U'   g)z
Adds an item to the save, and if we've seen it before updates our representation of it to
use minimal replacements.

Intended to be used after loading into a save.
NrE   rD   r   _	Transient)rF   r#   r3   rO   	unrealsdk	GetEngine
isinstancer   
startswithgetattrUObjectPathName)r*   rL   rM   r[   r8   r\   replacementsobjfieldr9   
actual_vals              r.   update_itemSaveManager.update_items   s    %%	#))--i>)zz"9''<k)$/JJy! N ;&L %%'C)//1
8s? c3''CNN;,G,G$X5
j)*;*;<<!$j!9J$*-' 2 %1JJy!r1   c                v   UR                   U R                  ;  a  U(       a  [        U5      $ [        U5      $ U(       a>  [	        U5      nUR                  U R                  UR                      5        [        U5      $ [        U5      nUR                  U R                  UR                      5        [        U5      $ )zV
Looks up an item in the save, and returns what it's definition data tuple should be.
)	rF   r#   r   r   r   rJ   r   r   r   )r*   rL   rM   partss       r.   fix_definition_dataSaveManager.fix_definition_data   s     DJJ.4X>>28<</9ELLH$5$567077-h7ELLH$5$567.u55r1   c                h     U R                   UR                  R                  	 g! [         a     gf = f)z>
Removes an item from the save, if we're currently saving it.
N)r#   rS   rF   KeyErrorrV   s     r.   remove_itemSaveManager.remove_item   s1    	

4..778 		s   !$ 
11c                X   U(       a  SOSu  p#pE[        X5      nUc  S OUR                  n[        X5      nUc  S OUR                  n	SU R                   3n
U(       a  U
SU-   -  n
U	(       a  U
SU	-   -  n
U(       d/  U	(       d(  [        X5      nUb  [        X5      nU(       a  U
SU-   -  n
U
$ )N)PrefixPartDefinitionTitlePartDefinitionWeaponTypeDefinitionTypename)PrefixItemNamePartDefinitionTitleItemNamePartDefinitionItemDefinitionItemNamezLevel  )rf   PartNameManufacturerGradeIndex)rL   rM   prefix_fieldtitle_field	def_fielddef_name_fieldprefix_partprefix
title_parttitledescription
definitiondef_names                r.   rI   SaveManager._get_description   s      `i 	=9 h5$,+2F2FX3
"*
0C0Cx>>?@3<'K3;&Ke 5J%":>3>1Kr1   )r!   r#   N)F)r+   r   r,   boolreturnNone)r   r   )rL   unrealsdk.FStructrM   r   r   r   )rW   unrealsdk.UObjectr   r   )rW   r   r[   r   r   r   )rL   r   rM   r   r[   r   r   r   )rL   r   rM   r   r   r   )rL   r   rM   r   r   r   )__name__
__module____qualname____firstlineno____doc____annotations__r$   r/   r   r>   rA   rO   rX   r]   rm   rq   ru   staticmethodrI   __static_attributes__ r1   r.   r   r      s     O&I}&' \0 )1#)1 )1 #	)1
 
)1V6&  r1   r   )%
__future__r   rb   r5   rG   pathlibr   typingr   r   r   r   compression_handlerr
   r   r   helpersr   r   r   r   r   r   r   r   r   r   __file__parentr)   mkdirr   r   r   ItemDatar"   r   r   r1   r.   <module>r      s    "     . . 3 3R R R c & # &(^""W,
 
  $  
C  U3T>**+CM"{ {r1   