From f3ec29ea46d1ecb3da44ce177e2027b75ce2c11d Mon Sep 17 00:00:00 2001
From: EliteMasterEric <ericmyllyoja@gmail.com>
Date: Thu, 2 May 2024 12:46:51 -0400
Subject: [PATCH] Polymod now properly accesses ZIP mods.

---
 source/funkin/modding/PolymodHandler.hx | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/source/funkin/modding/PolymodHandler.hx b/source/funkin/modding/PolymodHandler.hx
index 4255593f7..ae754b780 100644
--- a/source/funkin/modding/PolymodHandler.hx
+++ b/source/funkin/modding/PolymodHandler.hx
@@ -1,5 +1,6 @@
 package funkin.modding;
 
+import polymod.fs.ZipFileSystem;
 import funkin.data.dialogue.conversation.ConversationRegistry;
 import funkin.data.dialogue.dialoguebox.DialogueBoxRegistry;
 import funkin.data.dialogue.speaker.SpeakerRegistry;
@@ -54,6 +55,9 @@ class PolymodHandler
 
   public static var loadedModIds:Array<String> = [];
 
+  // Use SysZipFileSystem on desktop and MemoryZipFilesystem on web.
+  static var modFileSystem:Null<ZipFileSystem> = null;
+
   /**
    * If the mods folder doesn't exist, create it.
    */
@@ -115,6 +119,8 @@ class PolymodHandler
 
     buildImports();
 
+    if (modFileSystem == null) modFileSystem = buildFileSystem();
+
     var loadedModList:Array<ModMetadata> = polymod.Polymod.init(
       {
         // Root directory for all mods.
@@ -132,6 +138,8 @@ class PolymodHandler
         // A map telling Polymod what the asset type is for unfamiliar file extensions.
         // extensionMap: [],
 
+        customFilesystem: modFileSystem,
+
         frameworkParams: buildFrameworkParams(),
 
         // List of filenames to ignore in mods. Use the default list to ignore the metadata file, etc.
@@ -206,6 +214,16 @@ class PolymodHandler
     #end
   }
 
+  static function buildFileSystem():polymod.fs.ZipFileSystem
+  {
+    polymod.Polymod.onError = PolymodErrorHandler.onPolymodError;
+    return new ZipFileSystem(
+      {
+        modRoot: MOD_FOLDER,
+        autoScan: true
+      });
+  }
+
   static function buildImports():Void
   {
     // Add default imports for common classes.
@@ -284,10 +302,14 @@ class PolymodHandler
   public static function getAllMods():Array<ModMetadata>
   {
     trace('Scanning the mods folder...');
+
+    if (modFileSystem == null) modFileSystem = buildFileSystem();
+
     var modMetadata:Array<ModMetadata> = Polymod.scan(
       {
         modRoot: MOD_FOLDER,
         apiVersionRule: API_VERSION,
+        fileSystem: modFileSystem,
         errorCallback: PolymodErrorHandler.onPolymodError
       });
     trace('Found ${modMetadata.length} mods when scanning.');