From 157261171b05afdf5f685fdbd4826c5626072e8b Mon Sep 17 00:00:00 2001
From: altalk23 <45172705+altalk23@users.noreply.github.com>
Date: Sat, 30 Dec 2023 21:34:04 +0300
Subject: [PATCH] temporary dependency bandaid

---
 loader/src/loader/LoaderImpl.cpp         | 24 +++++++++++++++++++-----
 loader/src/loader/ModMetadataImpl.cpp    |  2 +-
 loader/src/platform/android/ModImpl.cpp  |  1 +
 loader/src/platform/android/crashlog.cpp |  2 ++
 loader/test/members/Android32.cpp        |  4 ++++
 5 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/loader/src/loader/LoaderImpl.cpp b/loader/src/loader/LoaderImpl.cpp
index eb8896a9..aa454789 100644
--- a/loader/src/loader/LoaderImpl.cpp
+++ b/loader/src/loader/LoaderImpl.cpp
@@ -353,25 +353,39 @@ void Loader::Impl::buildModGraph() {
 }
 
 void Loader::Impl::loadModGraph(Mod* node, bool early) {
+    if (node->isEnabled()) {
+        return;
+    }
     if (early && !node->needsEarlyLoad()) {
         m_modsToLoad.push_back(node);
         return;
     }
 
-    if (node->hasUnresolvedDependencies())
+    if (node->hasUnresolvedDependencies()) {
+        log::debug("{} {} has unresolved dependencies", node->getID(), node->getVersion());
         return;
-    if (node->hasUnresolvedIncompatibilities())
+    }
+    if (node->hasUnresolvedIncompatibilities()) {
+        log::debug("{} {} has unresolved incompatibilities", node->getID(), node->getVersion());
         return;
+    }
 
     log::debug("{} {}", node->getID(), node->getVersion());
     log::pushNest();
 
-    if (node->isEnabled()) {
+    if (node->shouldLoad()) {
+        bool hasUnresolvedDependencies = false;
         for (auto const& dep : node->m_impl->m_dependants) {
+            if (dep->isEnabled())
+                continue;
             m_modsToLoad.push_front(dep);
+            hasUnresolvedDependencies = true;
+        }
+        if (hasUnresolvedDependencies) {
+            log::debug("Has unresolved dependencies, loading later");
+            log::popNest();
+            return;
         }
-        log::popNest();
-        return;
     }
 
     m_currentlyLoadingMod = node;
diff --git a/loader/src/loader/ModMetadataImpl.cpp b/loader/src/loader/ModMetadataImpl.cpp
index 2603b9ea..57f261e0 100644
--- a/loader/src/loader/ModMetadataImpl.cpp
+++ b/loader/src/loader/ModMetadataImpl.cpp
@@ -17,7 +17,7 @@ ModMetadata::Impl& ModMetadataImpl::getImpl(ModMetadata& info)  {
 
 bool ModMetadata::Dependency::isResolved() const {
     return this->importance != Importance::Required ||
-        this->mod && this->mod->isEnabled() && this->version.compare(this->mod->getVersion());
+        this->mod && this->mod->shouldLoad() && this->version.compare(this->mod->getVersion());
 }
 
 bool ModMetadata::Incompatibility::isResolved() const {
diff --git a/loader/src/platform/android/ModImpl.cpp b/loader/src/platform/android/ModImpl.cpp
index 998ed8d8..042e63a5 100644
--- a/loader/src/platform/android/ModImpl.cpp
+++ b/loader/src/platform/android/ModImpl.cpp
@@ -19,6 +19,7 @@ Result<> Mod::Impl::loadPlatformBinary() {
         return Ok();
     }
     std::string err = dlerror();
+    log::error("Unable to load the SO: dlerror returned ({})", err);
     return Err("Unable to load the SO: dlerror returned (" + err + ")");
 }
 
diff --git a/loader/src/platform/android/crashlog.cpp b/loader/src/platform/android/crashlog.cpp
index 754c1b58..d9d15455 100644
--- a/loader/src/platform/android/crashlog.cpp
+++ b/loader/src/platform/android/crashlog.cpp
@@ -243,6 +243,8 @@ void printModsAndroid(std::stringstream& stream) {
 
 static std::string s_result;
 bool crashlog::setupPlatformHandler() {
+    (void)utils::file::createDirectoryAll(crashlog::getCrashLogDirectory());
+    
     JniMethodInfo t;
     
     if (JniHelper::getStaticMethodInfo(t, "com/geode/launcher/utils/GeodeUtils", "getLogcatCrashBuffer", "()Ljava/lang/String;")) {
diff --git a/loader/test/members/Android32.cpp b/loader/test/members/Android32.cpp
index 9fd26bfa..2ba389c5 100644
--- a/loader/test/members/Android32.cpp
+++ b/loader/test/members/Android32.cpp
@@ -59,6 +59,10 @@ GEODE_SIZE_CHECK(StartPosObject, 0x668);
 GEODE_SIZE_CHECK(LabelGameObject, 0x690);
 // GEODE_SIZE_CHECK(EventLinkTrigger, 0x688);
 
+GEODE_SIZE_CHECK(GJBaseGameLayer, 0x2d40);
+GEODE_MEMBER_CHECK(GJBaseGameLayer, m_level, 0x5f0);
+GEODE_MEMBER_CHECK(GameManager, m_gameLayer, 0x174);
+
 // GEODE_MEMBER_CHECK(CCNode, m_pUserObject, 0xcc);
 
 // needed classes are ones in the ids folder and some generic ones (i think they are already done though so only ids)