<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://blog.znra.fyi/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.znra.fyi/" rel="alternate" type="text/html" /><updated>2026-10-06T22:25:32+08:00</updated><id>https://blog.znra.fyi/feed.xml</id><title type="html">Znra’s Blog</title><subtitle>Personal projects, experiments, ramblings, and so on.</subtitle><author><name>Znra</name></author><entry><title type="html">Another life update v2</title><link href="https://blog.znra.fyi/2026/10/07/another-life-update-v2/" rel="alternate" type="text/html" title="Another life update v2" /><published>2026-10-07T06:11:00+08:00</published><updated>2026-10-07T06:11:00+08:00</updated><id>https://blog.znra.fyi/2026/10/07/another-life-update-v2</id><content type="html" xml:base="https://blog.znra.fyi/2026/10/07/another-life-update-v2/"><![CDATA[<p>Windows has ruined my computer after one round of forced Windows Update. Thankfully, Powershell is still working enough to let me robocopy everything so that I can safely reinstall an OS.</p>

<p>Right now, my dilemma stands on the following:</p>

<ul>
  <li>Do I just bite the bullet and move straight to CachyOS?</li>
  <li>Or just install Windows IoT?</li>
</ul>

<p>For background, I’m using CachyOS for my daily driver and Windows for work-related things. While I’m familiar with both, I’ve since struggled so hard with making my daily work tools such as CapCut and Premiere Pro function with CachyOS.</p>

<p>Additionally, it also affects the reverse engineering work as it seems that Unity 5.6.5p1 can only be ran on Wine, and that the windowing for it is so broken that it cuts the title bar whenever the mouse gets out of focus. I know that native Linux support for Unity does exist for newer versions, but as you can see, the refactoring work will take a while with the old versions until we get to the natively-supported version.</p>

<p>Unfortunately, I’ve decided to just go try out Windows IoT instead in hopes of making this laptop faster with a smaller OS footprint as well. I might move the development to my other CachyOS laptop (which is my personal use one) once I refactored up to the natively supported version.</p>

<p>I guess it won’t hurt having a Windows machine to test the desktop client for the RE’d game.</p>

<p>Again, apologies. I’ll make time soon to give an update re: the reverse engineering progress.</p>]]></content><author><name>Znra</name></author><category term="windows" /><category term="linux" /><summary type="html"><![CDATA[I hate Micro$lop with a passion.]]></summary></entry><entry><title type="html">A few life updates</title><link href="https://blog.znra.fyi/2026/09/27/a-few-life-updates/" rel="alternate" type="text/html" title="A few life updates" /><published>2026-09-27T00:43:00+08:00</published><updated>2026-09-27T00:43:00+08:00</updated><id>https://blog.znra.fyi/2026/09/27/a-few-life-updates</id><content type="html" xml:base="https://blog.znra.fyi/2026/09/27/a-few-life-updates/"><![CDATA[<p><img src="/assets/images/uploads/20260926-170033.png" alt="" /></p>

<p>Lately I’ve been in a slump since starting the reverse engineering project. Sickness, financial stress, and multiple factors had gotten in the way of doing work with it. I didn’t like how it turned out to be an “only good in the first act” thing for me, when I clearly wanted to invest more time on it than doing other things aside work, but enough excuses for today. Here’s what I’m currently up to.</p>

<ol>
  <li>I’ve been dabbling on AI due to <strong>mandatory work requirements</strong>, and I’ve been doing editing work for a living for a few years now. I’ve been tasked to automate the reel production using AI and that’s what’s taking most of my time lately. As for the details, as much as I’d like to share the method, NDA is getting in the way of it. Eventually, I might find another way to make a writeup of my findings in a way that won’t violate it.</li>
  <li><strong>Chiikawa happened.</strong> I found myself only being able to watch Chiikawa due to little time that I have for other things. It’s just 3-ish minutes to watch per episode and I’ve already started playing Chiikawa Pocket as that’s an idle game that I can leave out on its own. I’d like to talk about this but this is a whole rabbit hole to dig into, so this deserves a post of its own.</li>
  <li>Research and production on the side of my <strong>mellyexe</strong> Youtube page. I’ve since been researching for material to cover for it and I’ve yet to start actual video production for it. The script and the audio were already recorded and re-synthesized, but I’m yet to find time to edit it.</li>
  <li>Helping out with <strong>storyboard work</strong> for a colleague.</li>
  <li>Fixing some stuff in my life that I’d like to remain private. This is one of the hugest chunks of responsibilities that I’ve been carrying as of late and this has since been taking much of my time with little to no space to do other things.</li>
</ol>

<p>Even if I ditch Chiikawa on this <strong><em>(and there’s no way in hell that I will)</em></strong>, I doubt that it’ll allow much room to actually continue working on the reverse engineering project that I started. Either that automation for work does its job in order to free a lot of time for me to work on a lot of things, or life’s lemons start sorting itself out on its own.</p>

<p>Either way, the project ain’t dead, but is just about to go really slow for the time being. Until then, I’ll send sporadic updates from time to time whenever I can.</p>]]></content><author><name>Znra</name></author><category term="devlog" /><category term="updates" /><category term="status" /><summary type="html"><![CDATA[I've been inactive for a few days due to a lot of things, and I'd like to share what took most of my time as of late.]]></summary></entry><entry><title type="html">GK Unplugged - Starting Over, Smarter</title><link href="https://blog.znra.fyi/2026/09/14/gk-unplugged-day-5-starting-over-smarter/" rel="alternate" type="text/html" title="GK Unplugged - Starting Over, Smarter" /><published>2026-09-14T01:24:00+08:00</published><updated>2026-09-14T01:24:00+08:00</updated><id>https://blog.znra.fyi/2026/09/14/gk-unplugged-day-5-starting-over-smarter</id><content type="html" xml:base="https://blog.znra.fyi/2026/09/14/gk-unplugged-day-5-starting-over-smarter/"><![CDATA[<p>Today was a restart day. A while back, a broad, automated GUID-relinking pass (meant to fix a couple of stray “missing script” errors) went wrong and corrupted the project — likely from its filename-fallback matching mismatching generic-named assets across folders. Rather than fight the corruption, I restored from backup and rebuilt from a fresh AssetRipper export, this time with the lessons from that mistake already in hand.</p>

<p><strong>The good news:</strong> since every fix from the first pass was documented, re-deriving them was fast. Here’s what today’s progress covered, roughly in the order it came up.</p>

<h2 id="compile-time-cleanup">Compile-time cleanup</h2>

<p>A few small but blocking issues on the way to a clean build:</p>

<ul>
  <li><strong>Duplicate <code class="language-plaintext highlighter-rouge">AssemblyInfo.cs</code></strong> — two copies existed (one under <code class="language-plaintext highlighter-rouge">Assembly-CSharp</code>, one under legacy <code class="language-plaintext highlighter-rouge">Assembly-UnityScript</code> boilerplate), which C# doesn’t allow. Deleted the redundant one.</li>
  <li><strong>Decompiler false alarms</strong> — ILSpy occasionally reconstructs valid logic in a shape the C# compiler’s definite-assignment checker can’t quite follow, throwing <code class="language-plaintext highlighter-rouge">CS0165: Use of unassigned local variable</code> even though the code always assigns the variable before it’s read. Hit this twice — once in a low-level <code class="language-plaintext highlighter-rouge">ByteReader.cs</code> line-parsing loop, once in a <code class="language-plaintext highlighter-rouge">DialoguerEditor</code> theme-naming utility with a gnarly <code class="language-plaintext highlighter-rouge">(array2 = array)[num = i] = ...</code> compound-assignment pattern. Fix in both cases: just give the variable a default value at declaration (<code class="language-plaintext highlighter-rouge">= 0</code>, <code class="language-plaintext highlighter-rouge">= null</code>). Doesn’t change behavior, just satisfies the compiler.</li>
</ul>

<h2 id="runtime-the-android-only-landmines-again">Runtime: the Android-only landmines, again</h2>

<p>Getting Play mode working meant re-clearing the same category of issue as the first pass: code that assumes it’s running on an actual Android device.</p>

<ul>
  <li><strong>The permission-check plugin</strong> (<code class="language-plaintext highlighter-rouge">net.sanukin.OverrideUnityActivity</code>, wired through <code class="language-plaintext highlighter-rouge">M00_Init.cs</code>) crashes hard on Windows since there’s no native Android JNI bridge underneath it. Guarded both <code class="language-plaintext highlighter-rouge">Setup()</code> and <code class="language-plaintext highlighter-rouge">CheckPermissionProcess()</code> (the latter gets called from <em>two</em> different places — the boot sequence and <code class="language-plaintext highlighter-rouge">OnApplicationPause</code> — so the guard has to live inside the method itself, not at each call site) with <code class="language-plaintext highlighter-rouge">Application.platform == RuntimePlatform.Android</code> checks.</li>
  <li><strong>The Adjust SDK</strong> (mobile analytics, whose servers don’t exist to report to anyway) was the bigger project today. Instead of guarding each of its ~20 public methods one at a time as they surfaced as separate crashes — which is how it went last time — I went through the whole file and guarded every method in one pass. Then, since every guarded method’s <em>entire remaining body</em> is now permanently unreachable dead code, I went a step further and rebuilt the file as a minimal stub: same public API surface, zero actual native-call logic. <strong>550 lines became 61.</strong> Nothing else in the codebase needed to change, since every method signature stayed identical — it just does nothing now, correctly, instead of doing nothing after crashing first.</li>
</ul>

<h2 id="the-uiroot-race-condition">The UIRoot race condition</h2>

<p>Hit a <code class="language-plaintext highlighter-rouge">List&lt;UIRoot&gt;</code> index-out-of-range error the moment the WorldMap scene loads — <code class="language-plaintext highlighter-rouge">UIManager</code>’s <code class="language-plaintext highlighter-rouge">World</code> class was reading <code class="language-plaintext highlighter-rouge">UIRoot.list[0]</code> in a field initializer, which runs the instant the object gets constructed, with no guarantee <code class="language-plaintext highlighter-rouge">UIRoot</code> had registered itself into that static list yet. Converted it to a lazy property instead, deferring the lookup until something actually needs it. By that point in the game’s lifecycle, <code class="language-plaintext highlighter-rouge">UIRoot</code> is definitely there.</p>

<h2 id="shaders-again">Shaders, again</h2>

<p>The recurring theme of this whole project: <strong>AssetRipper doesn’t reliably extract shader assets from a compiled build.</strong> Every fresh export needs the same fix — pull NGUI’s <code class="language-plaintext highlighter-rouge">Shaders</code> folder from the actual GitHub source and drop it into <code class="language-plaintext highlighter-rouge">Assets/Resources/Shaders</code>. Skip this step and you get both broken-looking UI <em>and</em> invisible text, since NGUI’s rendering and text drawing both depend on it. Did it again today; both symptoms cleared in one move, same as last time.</p>

<p>One shader-related <code class="language-plaintext highlighter-rouge">NullReferenceException</code> turned out to be a red herring — it only fires from the Editor’s <strong>Scene view</strong> trying to render NGUI’s <code class="language-plaintext highlighter-rouge">[ExecuteInEditMode]</code> panels, not from the actual Game window. Confirmed gameplay itself is unaffected and parked it rather than chasing an editor-only cosmetic quirk.</p>

<h2 id="where-things-stand">Where things stand</h2>

<p>Play mode is clean again — booting, UI rendering, no crashes — at roughly the same point the first attempt reached before the GUID mishap. The difference this time: every fix is captured, the mistake that caused the corruption is documented and avoided, and the whole restart took a fraction of the time the original debugging did, since there was a real playbook to follow instead of discovering everything from scratch.</p>

<p>Next up: getting back to an actual Windows Build, and — this time — being much more careful about how any future GUID relinking gets done.</p>]]></content><author><name>Znra</name></author><category term="gk-unplugged" /><category term="unity" /><category term="json" /><category term="csharp" /><summary type="html"><![CDATA[Just had the time to get back to this. Documenting what I've done so far.]]></summary></entry><entry><title type="html">GK Unplugged - Redoing everything</title><link href="https://blog.znra.fyi/2026/09/08/gk-unplugged-day-4/" rel="alternate" type="text/html" title="GK Unplugged - Redoing everything" /><published>2026-09-08T01:43:00+08:00</published><updated>2026-09-08T01:43:00+08:00</updated><id>https://blog.znra.fyi/2026/09/08/gk-unplugged-day-4</id><content type="html" xml:base="https://blog.znra.fyi/2026/09/08/gk-unplugged-day-4/"><![CDATA[<p>Okay. Back to square one, I guess…</p>

<p>Did the re-exporting using AssetRipper and did an Assembly-CSharp.dll export using ilspycmd –lv CSharp4 once more.</p>

<p>This time, I’ll be more careful doing the meta re-link. It’ll take a while until a new update drops.</p>

<p>For now I just made a private git repository to prevent what happened last time when an asset re-linking attempt caused irreversible damage to any progress that I’ve made so far. That way, when a similar issue happens, I can just pull the repository anytime and continue working on the last best saved checkpoint. Treat this as some sort of a saved game checkpoint.</p>]]></content><author><name>Znra</name></author><category term="unity" /><category term="csharp" /><category term="json" /><summary type="html"><![CDATA[Starting over again and creating a private git to prevent these issues.]]></summary></entry><entry><title type="html">GK Unplugged - Bad news</title><link href="https://blog.znra.fyi/2026/09/04/gk-unplugged-day-3/" rel="alternate" type="text/html" title="GK Unplugged - Bad news" /><published>2026-09-04T14:24:00+08:00</published><updated>2026-09-04T14:24:00+08:00</updated><id>https://blog.znra.fyi/2026/09/04/gk-unplugged-day-3</id><content type="html" xml:base="https://blog.znra.fyi/2026/09/04/gk-unplugged-day-3/"><![CDATA[<p>I messed up.</p>

<p>I had to re-link all meta files from a fresh export to my current project as all script references are missing, and now the whole project won’t even run nor show visual elements.</p>

<p>Weird enough, even if I run my backup that I did before I did the re-link, it’s just broken. It’s as if Unity is refusing to read it. Now that’s weird…</p>

<p>Those 2 days of code and asset correction were botched so I’m pretty much back at square one. I’ll have to backtrack and start over with triangulating all steps to recreate the effort that I did.</p>

<p>I’m genuinely wondering what could’ve caused the missing scripts that I encountered before the relink when it wasn’t the case before…</p>]]></content><author><name>Znra</name></author><category term="gk-unplugged" /><category term="meta" /><category term="claude" /><summary type="html"><![CDATA[Bad news]]></summary></entry><entry><title type="html">GK Unplugged - Debugging the project</title><link href="https://blog.znra.fyi/2026/09/03/gk-unplugged-day-2/" rel="alternate" type="text/html" title="GK Unplugged - Debugging the project" /><published>2026-09-03T02:17:00+08:00</published><updated>2026-09-03T02:17:00+08:00</updated><id>https://blog.znra.fyi/2026/09/03/gk-unplugged-day-2</id><content type="html" xml:base="https://blog.znra.fyi/2026/09/03/gk-unplugged-day-2/"><![CDATA[<p>Update as of today, 9/2/26</p>

<ul>
  <li>project is running and compiling, but the script references are missing. most likely due to the decompiling process or overwriting the Assembly-CSharp folder with the one extracted from ilspycmd -lv CSharp4</li>
  <li>made another AssetRipper export from the original apk/obb to cross-reference and update the .meta files to fix the issue</li>
  <li>updated NGUI shaders from Assets/Resources/Shaders to fix missing/glitchy rendered graphics when playing the game within Unity</li>
  <li>Updated some NGUI files along the way to resolve some build/asset loading issues.</li>
</ul>

<p>Will try further fixes tomorrow as I’ve been encountering a lot of UIDrawCall errors. Will park for now.</p>]]></content><author><name>Znra</name></author><category term="gk-unplugged" /><category term="unity" /><category term="csharp" /><category term="json" /><category term="vscode" /><summary type="html"><![CDATA[Day 2 update logs for the gacha revival project. Also giving it a name: GK-Unplugged.]]></summary></entry><entry><title type="html">GK Unplugged - Project Start</title><link href="https://blog.znra.fyi/2026/09/02/gk-unplugged-day-1/" rel="alternate" type="text/html" title="GK Unplugged - Project Start" /><published>2026-09-02T19:40:00+08:00</published><updated>2026-09-02T19:40:00+08:00</updated><id>https://blog.znra.fyi/2026/09/02/gk-unplugged-day-1</id><content type="html" xml:base="https://blog.znra.fyi/2026/09/02/gk-unplugged-day-1/"><![CDATA[<p><strong>Special thanks to insomnyawolf and realZenith for the CommanderCS project. If it wasn’t for their efforts, this experiment wouldn’t even have its starting ground.</strong></p>

<p>I’ll be documenting my initial journey on this and my personal thoughts and motivations behind this, as well as giving a short background about the gacha game that I’ve since been longing to go back to before they even killed the game a few days from a server failure last 2021.</p>

<p>Here’s how the first day went:</p>

<p><code class="language-plaintext highlighter-rouge">9/1/26</code></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">decompiled the apk and obb as a Unity project (5.6.5p1) using AssetRipper</code></li>
  <li><code class="language-plaintext highlighter-rouge">decompiled Assembly-CSharp.dll using ilspycmd and -lv CSharp4</code></li>
  <li><code class="language-plaintext highlighter-rouge">corrected most decompiled codes that are throwing errors</code></li>
  <li><code class="language-plaintext highlighter-rouge">removed Newtonsoft.Json folders in Assets/Script</code></li>
  <li><code class="language-plaintext highlighter-rouge">added Newtonsoft.Json.dll in Assets/Plugins as a replacement for badly decompiled Newtonsoft.Json cs files in Assets/Script</code></li>
</ul>

<p><code class="language-plaintext highlighter-rouge">Most work done so far were just addressing any bad codes and thrown errors. Primary issues were from Newtonsoft.Json. Will run a test tomorrow if it even runs or compiles and I’ll send another update re: what happens from that point.</code></p>

<p>Right now, at the time of this writing, I’m checking whether or not the game will be able to compile or be even interactive enough to play up to the intro/login screen. Should it work, here’s going to be the next roadmap:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Hooking the game to the CommanderCS server.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Publish the project as a Windows app for further testing.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Look at the launcher angle similar to Revival:Side so that the user account management and server setup can be accessed and configured in one place.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Research for a way to integrate the CommanderCS server as a part of the game itself instead of a separate entity.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Upgrading the Unity project up to the latest version.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Upgrading any backend dependencies that might break alongside the version upgrade. The codebase is expected to break in the process.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Restoring and upscaling any image assets if possible.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Optimizing any image assets (pngs, jpgs, or svgs) to a better compression.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Recompile the whole project with the remastered assets.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Do a final test.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Integrate the app, CommanderCS and their dependencies in a centralized launcher package.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Run a user test in Discord to gather as much game logic issues and bugs to fix and address.</code></li>
  <li><code class="language-plaintext highlighter-rouge">Create a repository for the Launcher.</code></li>
</ul>

<p>I’ll be periodically updating this whole process from time to time. Hopefully this works to a degree that satisfies my needs.</p>]]></content><author><name>Znra</name></author><category term="gk-unplugged" /><category term="unity" /><category term="csharp" /><category term="json" /><category term="vscode" /><summary type="html"><![CDATA[Detailed background of a certain dead gacha game revival, the whys, and how's it so far for Day 1.]]></summary></entry></feed>