@@ -297,7 +297,7 @@ typedef SetNotifyPacket =
297297typedef ProcessedItemsResult =
298298{
299299 tickets : Int ,
300- nonSongs : Map < String , Int >,
300+ nonSongs : haxe. DynamicAccess < Int >,
301301 nonSongsNames : Array <String >,
302302 unlockedSongs : Array <{song : String , mod : String }>,
303303 itemsToTrigger : Array <String >,
@@ -326,7 +326,7 @@ class APGameState
326326 // Sanity-related variables
327327 public var unlockedSanityItems : Map <String , SanityItemData > = new Map <String , SanityItemData >();
328328 public var sanitySettings : SanitySettings = {enable_sanity_locations : false , sanity_completion_type : " on_getting" , sanity_types : []};
329- public var sanityLocationIds : Map < String , Int > = new Map < String , Int >();
329+ public var sanityLocationIds : haxe. DynamicAccess < Int > = new haxe. DynamicAccess < Int >();
330330
331331 public function locationData (songName : String , modName : String ): Array <Int >
332332 {
@@ -532,8 +532,6 @@ class APGameState
532532 {
533533 var locations : Array <Int > = [];
534534
535- trace (' is setting on: ${sanitySettings .enable_sanity_locations }' );
536-
537535 if (! sanitySettings .enable_sanity_locations )
538536 return locations ;
539537
@@ -586,7 +584,7 @@ class APGameState
586584 // First try slot data lookup
587585 if (_slotData != null && Reflect .hasField (_slotData , " sanityLocationData" ))
588586 {
589- var sanityLocationData : Map < String , SanityLocationData > = Reflect .field (_slotData , " sanityLocationData" );
587+ var sanityLocationData : haxe. DynamicAccess < SanityLocationData > = Reflect .field (_slotData , " sanityLocationData" );
590588 if (sanityLocationData != null )
591589 {
592590 var locationName = " Use " + itemType + " : " + itemName ;
@@ -820,19 +818,19 @@ class APGameState
820818 // Initialize sanity location IDs from slot data
821819 if (_slotData != null && Reflect .hasField (_slotData , " sanityLocationData" ))
822820 {
823- var sanityLocationData : Map < String , SanityLocationData > = Reflect .field (_slotData , " sanityLocationData" );
821+ var sanityLocationData : haxe. DynamicAccess < SanityLocationData > = Reflect .field (_slotData , " sanityLocationData" );
824822 if (sanityLocationData != null )
825823 {
826824 for (locationName => locationData in sanityLocationData )
827825 {
828826 sanityLocationIds .set (locationName , locationData .id );
829827 }
830- trace (" Loaded " + Lambda . count ( sanityLocationIds ) + " sanity location IDs" );
828+ trace (" Loaded " + [ for ( key in sanityLocationIds . keys ()) key ]. length + " sanity location IDs" );
831829 }
832830 }
833831
834832 // Initialize unlocked sanity items (empty at start - will be populated as items are received)
835- unlockedSanityItems . clear ();
833+ unlockedSanityItems = new Map < String , SanityItemData > ();
836834 trace (" Sanity system initialized" );
837835 }
838836
@@ -1097,7 +1095,7 @@ class APGameState
10971095 {
10981096 unlockedSanityItems .set (item .name , item .data );
10991097 }
1100- trace (" Loaded " + Lambda . count ( unlockedSanityItems ) + " unlocked sanity items from save" );
1098+ trace (" Loaded " + [ for ( key in unlockedSanityItems . keys ()) key ]. length + " unlocked sanity items from save" );
11011099 }
11021100
11031101 _saveData .save ();
@@ -1201,7 +1199,7 @@ class APGameState
12011199 if (reg .match (trapName ))
12021200 {
12031201 var modifier = reg .matched (1 );
1204- archipelago. APItem . APChartModifier .restoreFromSave (modifier ).fromTrapLink = true ;
1202+ archipelago. APItem . APChartModifier .restoreFromSave (modifier , true ).fromTrapLink = true ;
12051203 }
12061204 else
12071205 {
@@ -1552,7 +1550,7 @@ class APGameState
15521550 specialItems .set (itemName , currentPackages [" Friday Night Funkin" ].item_name_to_id .get (item ));
15531551 }
15541552 }
1555- // trace("Special Items: " + specialItems);
1553+ trace (" Special Items: " + specialItems );
15561554
15571555 return specialItems ;
15581556 }
@@ -1615,7 +1613,7 @@ class APGameState
16151613 function processItemsSync (songs : Array <NetworkItem >): ProcessedItemsResult
16161614 {
16171615 var tickets = 0 ;
1618- var nonSongs : Map < String , Int > = [] ;
1616+ var nonSongs : haxe. DynamicAccess < Int > = new haxe. DynamicAccess < Int >() ;
16191617 var nonSongsNames : Array <String > = [];
16201618 var unlockedSongs : Array <{song : String , mod : String }> = [];
16211619 var itemsToTrigger : Array <String > = [];
@@ -1637,8 +1635,25 @@ class APGameState
16371635 // Use the realName function to convert special keywords back to actual brackets
16381636 itemName = APInfo .realName (itemName );
16391637
1640- // Check if this is a sanity item
1641- if (itemName .indexOf (" Stage: " ) == 0 || itemName .indexOf (" Character: " ) == 0 )
1638+ // Check if this is a sanity item by ID instead of name
1639+ var isSanityItem = false ;
1640+ if (_slotData != null && _slotData .sanityData != null )
1641+ {
1642+ // Check if the item ID exists in the sanity data
1643+ for (sanityItemName in _slotData .sanityData .keys ())
1644+ {
1645+ var sanityItemData = _slotData .sanityData .get (sanityItemName );
1646+ if (sanityItemData != null && sanityItemData .id == songName .item )
1647+ {
1648+ isSanityItem = true ;
1649+ // Use the sanity item name from slot data for consistency
1650+ itemName = sanityItemName ;
1651+ break ;
1652+ }
1653+ }
1654+ }
1655+
1656+ if (isSanityItem )
16421657 {
16431658 // This is a sanity item - add to sanity tracking
16441659 sanityItems .push (itemName );
@@ -1727,7 +1742,6 @@ class APGameState
17271742 // Handle sanity items
17281743 for (sanityItemName in result .sanityItems )
17291744 {
1730- trace (' Sanity Item: $sanityItemName ' );
17311745 handleSanityItemReceived (sanityItemName );
17321746 }
17331747
@@ -1767,8 +1781,7 @@ class APGameState
17671781 // Get sanity item data from slot data
17681782 if (_slotData != null && Reflect .hasField (_slotData , " sanityData" ))
17691783 {
1770- var sanityData : DynamicAccess <SanityItemData > = Reflect .field (_slotData , " sanityData" );
1771- trace (' SlotData: $_slotData \n SanityData: $sanityData ' );
1784+ var sanityData : haxe. DynamicAccess <SanityItemData > = Reflect .field (_slotData , " sanityData" );
17721785 if (sanityData != null && sanityData .exists (itemName ))
17731786 {
17741787 var sanityItemData = sanityData .get (itemName );
@@ -1881,14 +1894,24 @@ class APGameState
18811894
18821895 public function isSanityItemUnlocked (itemType : String , itemName : String ): Bool
18831896 {
1897+ // If no sanity system exists at all, everything is unlocked
1898+ var unlockedSanityCount = [for (key in unlockedSanityItems .keys ()) key ].length ;
1899+ var sanityLocationCount = [for (key in sanityLocationIds .keys ()) key ].length ;
1900+ if (unlockedSanityCount == 0 && sanityLocationCount == 0 ) return true ;
1901+
1902+
1903+
18841904 var key = itemType + " : " + itemName ;
18851905 return unlockedSanityItems .exists (key );
18861906 }
18871907
18881908 public function checkSongCharactersAndStageUnlocked (song : backend. Song . SwagSong ): Array <String >
18891909 {
1890- trace (' Unlocked Sanity Items: $unlockedSanityItems \n Sanity Location ID \' s: $sanityLocationIds ' );
18911910 // Check if sanity system exists at all (regardless of location settings)
1911+ var unlockedSanityCount = [for (key in unlockedSanityItems .keys ()) key ].length ;
1912+ var sanityLocationCount = [for (key in sanityLocationIds .keys ()) key ].length ;
1913+ if (unlockedSanityCount == 0 && sanityLocationCount == 0 ) return [];
1914+
18921915 var missingItems : Array <String > = [];
18931916
18941917 // Check what types of sanity items we should look for
0 commit comments