From 70861d3e35d7a6e3964f7b18dc5336d2e520b5de Mon Sep 17 00:00:00 2001
From: Nikola Petrov <nikola@petrovv.com>
Date: Sat, 4 Jan 2025 16:18:35 +0100
Subject: [PATCH] add save

---
 inc/sys.hpp               |  8 ++++++
 inc/values/Dna.hpp        |  2 --
 src/App.cpp               |  2 --
 src/sys.cpp               | 57 +++++++++++++++++++++++++++++++++++++++
 src/values/DnaManager.cpp | 28 ++++++++++++-------
 5 files changed, 84 insertions(+), 13 deletions(-)
 create mode 100644 inc/sys.hpp
 create mode 100644 src/sys.cpp

diff --git a/inc/sys.hpp b/inc/sys.hpp
new file mode 100644
index 0000000..3a6db59
--- /dev/null
+++ b/inc/sys.hpp
@@ -0,0 +1,8 @@
+
+
+namespace sys
+{
+  size_t saveDataToFile(const char *filename, const char *data, size_t size);
+  size_t loadDataFromFile(const char *filename, char *data, size_t size);
+  bool fileExists(const char *filename);
+}
\ No newline at end of file
diff --git a/inc/values/Dna.hpp b/inc/values/Dna.hpp
index 4f38e86..af2ee4d 100644
--- a/inc/values/Dna.hpp
+++ b/inc/values/Dna.hpp
@@ -4,8 +4,6 @@
 #include <cinttypes>
 #include <array>
 
-#include <raylib.h>
-
 #define MAX_DEPTH 8
 #define MAX_POSIBLE_DEPTH 11
 static_assert(MAX_DEPTH <= MAX_POSIBLE_DEPTH);
diff --git a/src/App.cpp b/src/App.cpp
index 4cbc492..0c8296f 100644
--- a/src/App.cpp
+++ b/src/App.cpp
@@ -14,8 +14,6 @@ void App::init(int screenWidth, int screenHeight)
   this->screenHeight = screenHeight;
   this->canvas.init(screenWidth);
 
-  mrand::setSeed(1);
-
   canvasTexure = LoadRenderTexture(screenWidth, screenWidth);
   manager.init();
   unit = manager.next();
diff --git a/src/sys.cpp b/src/sys.cpp
new file mode 100644
index 0000000..aeadf35
--- /dev/null
+++ b/src/sys.cpp
@@ -0,0 +1,57 @@
+#include <stdio.h>
+#include <unistd.h>
+#include "sys.hpp"
+#include <raylib.h>
+
+namespace sys
+{
+
+  const char *transformFilePath(const char *filename)
+  {
+#if defined(PLATFORM_ANDROID)
+    return TextFormat(
+        "%s/%s", GetAndroidApp()->activity->internalDataPath, filename);
+#else
+    return filename;
+#endif
+  }
+
+  size_t saveDataToFile(const char *filename, const char *data, size_t size)
+  {
+    const char *saveFilePath = transformFilePath(filename);
+
+    FILE *file = fopen(saveFilePath, "wb");
+    if (file == NULL)
+      return false;
+
+    size_t ret = fwrite(data, 1, size, file);
+    fclose(file);
+
+    return ret;
+  }
+
+  size_t loadDataFromFile(const char *filename, char *data, size_t size)
+  {
+    const char *saveFilePath = transformFilePath(filename);
+
+    FILE *file = fopen(saveFilePath, "rb");
+    if (file == NULL)
+      return false;
+
+    size_t ret = fread(data, 1, size, file);
+    fclose(file);
+
+    return ret;
+  }
+
+  bool fileExists(const char *filename)
+  {
+    const char *saveFilePath = transformFilePath(filename);
+
+    bool result = false;
+    if (access(saveFilePath, F_OK) != -1)
+      result = true;
+    return result;
+  }
+
+}
\ No newline at end of file
diff --git a/src/values/DnaManager.cpp b/src/values/DnaManager.cpp
index e3cf150..efe4bd2 100644
--- a/src/values/DnaManager.cpp
+++ b/src/values/DnaManager.cpp
@@ -1,12 +1,27 @@
+#include <ctime>
+
 #include "values/DnaManager.hpp"
 #include "values/mrand.hpp"
+#include "sys.hpp"
+
+#include <raylib.h>
 
 void DnaManager::init()
 {
-  randSeed.a = mrand::getInt();
-  randSeed.b = mrand::getInt();
-  randSeed.c = mrand::getInt();
-  randSeed.d = mrand::getInt();
+  mrand::setSeed(time(nullptr));
+
+  if (sys::fileExists("id"))
+  {
+    sys::loadDataFromFile("id", (char *)&randSeed, sizeof(uint128));
+  }
+  else
+  {
+    randSeed.a = mrand::getInt();
+    randSeed.b = mrand::getInt();
+    randSeed.c = mrand::getInt();
+    randSeed.d = mrand::getInt();
+    sys::saveDataToFile("id", (const char *)&randSeed, sizeof(uint128));
+  }
 
   vector.resize(NUM_PER_GEN);
   for (std::size_t i = 0; i < NUM_PER_GEN; i++)
@@ -22,11 +37,6 @@ void DnaManager::deinit()
 
 Unit DnaManager::next()
 {
-  if (queued.empty())
-  {
-    return {nullptr, Liked::tbd};
-  }
-
   Dna *ret = queued.front();
   queued.pop_front();
   showed.push_back(ret);