<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="http://www.w3.org/2005/Atom" >
  <generator uri="https://jekyllrb.com/" version="3.9.2">Jekyll</generator>
  <link href="https://trigger-segfault.github.io/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://trigger-segfault.github.io/" rel="alternate" type="text/html" />
  <updated>2022-06-29T01:19:04+00:00</updated>
  <id>https://trigger-segfault.github.io/feed.xml</id>

  
  
  

  
    <title type="html">Trigger’s Tools &amp;amp; Games (but mostly tools) | </title>
  

  
    <subtitle>A personal blog and source of information for trigger_segfault's tools and other projects that don't already have dedicated pages. I'm a developer that's fluent with C#, C/C++, Java, and ActionScript, and a bit of Python, although I spend most of my time working in C#.</subtitle>
  

  
    <author>
        <name>Robert Jordan</name>
      
      
    </author>
  

  
  
  
    <entry>
      <title type="html">Working with Wiimotes</title>
      <link href="https://trigger-segfault.github.io/blog/2019/05/20/working-with-wiimotes/" rel="alternate" type="text/html" title="Working with Wiimotes" />
      <published>2019-05-20T23:10:00+00:00</published>
      <updated>2019-05-20T23:10:00+00:00</updated>
      <id>https://trigger-segfault.github.io/blog/2019/05/20/working-with-wiimotes</id>
      <content type="html" xml:base="https://trigger-segfault.github.io/blog/2019/05/20/working-with-wiimotes/">&lt;p&gt;This post is a more in-depth coverage of the Wiimote Experimentation in the &lt;a href=&quot;/blog/2019/05/05/end-of-year-wrapup-2018-part-2/&quot;&gt;2018: End of Year Wrap-Up (Part 2)&lt;/a&gt;. The unorganized source code can be &lt;a href=&quot;https://github.com/trigger-segfault/WiimoteLib.Net&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wiimote-fade.png&quot; alt=&quot;Wiimote Controller Overlay&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I started fiddling around with Wiimote control to enable playing games from a couch with an easier-to-use controller. It began with looking at existing libraries and how they communicated with the Wiimote. The current system for Wiimote Bluetooth pairing in Windows 7 was a huge hassle of removing and re-adding the device every time it was needed. Wiimotes that have been turned off &lt;em&gt;must&lt;/em&gt; be removed from the device list and then re-added in order to be detected, it’s a big chore to manually do this every time so there needed to be an automatic method. This was one of the goals of this project: To create a better system for easily pairing the Wiimote.&lt;/p&gt;

&lt;p&gt;Getting Windows 7’s Bluetooth to cooperate with Wiimote connection and disconnection was a huge headache and ended up as a bit of a hack. In the end I succeeded in creating a system to handle this for the user. No more manually removing and re-adding your Wiimote device! The system revolved around asynchronously checking for available Wiimotes every so often and comparing them with the list of registered Wiimotes. During this phase, we also check to see if any registered Wiimotes are no longer detectable. For new Wiimotes, and no-longer-detectable Wiimotes, we manually remove them from the system’s device list. This ensures that we can quickly add them again when we want to connect, or are about to connect.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The bindings display overlay for the Wiimote controller program I created to replace the Xbox 360 controller using this project.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wiimote-controller-2.png&quot; alt=&quot;Wiimote Controller Overlay&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So this task was accomplished, but the hard part wasn’t removing and re-adding the device, the hard part was determining the &lt;em&gt;correct&lt;/em&gt; way to remove re-add the device. When searching for answers, there were many different implementations for connecting the Wiimote to Bluetooth automatically, but they were inconsistent and unreliable, some just not working at all. Some did this through the Windows API, while others recommended installing different Bluetooth drivers just for the sake of your Wiimotes. The Toshiba Bluetooth stack wasn’t that great to work with and I decided that it was not the best approach to solving the problem. I only managed to create a stable system after mashing together different Windows Bluetooth API commands over the course of a week or more.&lt;/p&gt;

&lt;p&gt;The answer was to:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Remove the device. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BluetoothRemoveDevice&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Ask Windows for all services usable by the device. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BluetoothEnumerateInstalledServices&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Set the device’s service state to &lt;em&gt;enabled&lt;/em&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BluetoothSetServiceState&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Then for some reason, list the device’s services again. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BluetoothEnumerateInstalledServices&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BluetoothAuthenticateDevice&lt;/code&gt; was often a method present in Wiimote connection examples, but it turned out this method was not only unneeded, but actually made things worse. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WSA&lt;/code&gt; functions are also necessary to determine if the device is discoverable, and unfortunately as of writing this, it seems this method does &lt;em&gt;not&lt;/em&gt; work for Windows 10. Although I primarily connect the Wiimote via the &lt;a href=&quot;https://dolphin-emu.org/blog/2014/08/23/dolphinbar-review/&quot;&gt;DolphinBar&lt;/a&gt; for best connectivity, I should look into finding out why it doesn’t work and what has changed. It’s likely a difference in the Windows 10 Bluetooth stack. This just goes to show how big of a headache the Bluetooth programming is in Windows.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The only world this poor test laptop knew of.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/bsod-10.png&quot; alt=&quot;BSOD: Windows 10th Edition&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One interesting thing I attempted during the lifetime of the project was to modify the existing &lt;a href=&quot;https://github.com/jloehr/HID-Wiimote&quot;&gt;HID-Wiimote&lt;/a&gt; drivers to help support better pairing and passthrough so that the original controls could be retained without registering it as a different controller. It was interesting to learn how difficult it is to develop drivers, but it was also pretty fun. The two main goals of using custom drivers would be potentially better audio playback, and properly handling connecting and disconnecting of the Wiimote without the extra steps.&lt;/p&gt;

&lt;p&gt;I took an old unused laptop and managed to hook it up to my main system with a debugger. Then I proceeded to-&lt;em&gt;Your PC ran into a problem and needs to restart&lt;/em&gt;, to-&lt;em&gt;Your PC ran into a problem and needs to restart&lt;/em&gt;… I crashed the laptop quite a lot. Although in the end I did learn a bit about HID descriptors and how USB devices work. I never made any usable progress with the drivers.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;A report inspector used to read logs of Wiimote reports saved from Dolphin, and translate them into something &lt;em&gt;semi-human-readable&lt;/em&gt;.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wiimote-report-inspector.png&quot; alt=&quot;Wiimote Report Inspector&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The most interesting part of working with the Wiimote was how communications were handled and how the Wiimote talked to the system over HID reports. The HID reports were pretty much already fully handled in the existing libraries, so I spent more time focusing on the contents of the reports sent by the Wiimote. Wiimote reports are either sent to or from the Wiimote with a report type, and a fixed buffer of data for that report type.&lt;/p&gt;

&lt;p&gt;Not all of the Wiimote’s report types were documented, so I had to do a bit of looking and experimenting. The biggest challenges were figuring out certain data types’ units of measurement, and Wiimote extensions. Specifically the WiimotionPlus.&lt;/p&gt;

&lt;p&gt;Wiimotion plus has very different behavior from the average Wiimote extension, like the Nunchuk or Classic Controller, because the WiimotionPlus extension could also have another extension attached to it. In order for the Wiimote to receive input from both the MotionPlus and other extension, something called a passthrough is used. In this mode, every other report is the WiimotionPlus data, and every &lt;em&gt;other&lt;/em&gt; other report is the connected extension data.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The audio player used to demo the Wiimote’s speakers. Input sounds and music are downsampled and then can be played via real speakers or via the connected Wiimote.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wiimote-audio-player.png&quot; alt=&quot;Wiimote Audio Player&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After getting the library up and running, I wanted to start looking into Wiimote Speaker playback, which for a long time has been relatively impossible to do well. The first part was that I had to purchase the latest Wiimote type which actually had better audio support. I never got the original Wiimote to play anything identifiable. Because PCM playback never sounded right, the main task was getting the ADPCM format down. I eventually found what seems to be the right version of it, but even then, the audio sometimes fades out and in in the Wiimote, and conversion to lower sample rates in general is pretty destructive.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;A video demoing the demo for Wiimote speaker support. Showing the world that it is possible for the Wiimote to play user-input audio (under certain specific conditions).&lt;/p&gt;

&lt;div class=&quot;video-inline-container&quot;&gt;
    &lt;div class=&quot;video-container inline center&quot;&gt;
      &lt;iframe src=&quot;https://www.youtube.com/embed/vNItdVw6ONs&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;p&gt;I’ve been using the Wiimote controller application that resulted from this project ever since its inception. This paired with the &lt;a href=&quot;https://dolphin-emu.org/blog/2014/08/23/dolphinbar-review/&quot;&gt;DolphinBar&lt;/a&gt; has made the Wiimote Controller my personally most-used application to date.&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Robert Jordan</name>
        
          <email>triggerstools@gmail.com</email>
        
        
      </author>

      
        <category term="[&quot;dev&quot;, &quot;gaming&quot;]" />
      

      
        <category term="wiimote" />
      
        <category term="wii remote" />
      
        <category term="wii" />
      
        <category term="nintendo" />
      
        <category term="controller" />
      
        <category term="hid" />
      
        <category term="bluetooth" />
      

      
        <summary type="html">I started fiddling around with Wiimote control to enable playing games from a couch with an easier-to-use controller. It began with looking at existing libraries and how they communicated with the Wiimote.</summary>
      

      
      
        
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://trigger-segfault.github.io/blog/assets/img/wiimote-article.png" />
      
    </entry>
  
    <entry>
      <title type="html">trigger_death is now trigger_segfault</title>
      <link href="https://trigger-segfault.github.io/blog/2019/05/14/trigger-death-is-now-trigger-segfault/" rel="alternate" type="text/html" title="trigger_death is now trigger_segfault" />
      <published>2019-05-14T15:10:00+00:00</published>
      <updated>2019-05-14T15:10:00+00:00</updated>
      <id>https://trigger-segfault.github.io/blog/2019/05/14/trigger-death-is-now-trigger-segfault</id>
      <content type="html" xml:base="https://trigger-segfault.github.io/blog/2019/05/14/trigger-death-is-now-trigger-segfault/">&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/trigger_segfault-avatar.png&quot; alt=&quot;trigger Avatar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve been thinking about it over the last few months and decided it was time to rebrand myself from &lt;em&gt;trigger_death&lt;/em&gt; to a new online username. I’ve been using &lt;em&gt;trigger_death&lt;/em&gt; for about 10 years now but I was starting to get recommendations to change things now that I’m looking to work in a professional environment. A &lt;em&gt;gamer tag&lt;/em&gt; name from 10 years ago doesn’t fare well in these times especially with the news lately.&lt;/p&gt;

&lt;h2 id=&quot;the-decision&quot;&gt;The Decision&lt;/h2&gt;

&lt;p&gt;It was already decided that I would keep the prefix &lt;em&gt;trigger_&lt;/em&gt;, this has been an ongoing theme in my name and I’ve already played around with changing the postfix on Discord servers. Some posibilities were &lt;em&gt;trigger_segfault&lt;/em&gt;, &lt;em&gt;trigger_source&lt;/em&gt;, &lt;em&gt;trigger_dotnet&lt;/em&gt;, and &lt;em&gt;trigger_desu&lt;/em&gt;. Some of these names I ruled out due to conflicting search results. Others I ruled out due to the possibility of the name ever being taken, and one I ruled out because the name &lt;em&gt;was&lt;/em&gt; already in use.&lt;/p&gt;

&lt;p&gt;I ended up deciding on &lt;em&gt;trigger_segfault&lt;/em&gt;, I was already leaning this way for awhile and decided that it hosted the most benefits and was easy enough to remember. The old name was straight forwards with what the Source SDK trigger_brush did, but the new name should have a story to it:&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;strong&gt;trigger_segfault&lt;/strong&gt;&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;em&gt;You walk into a room, there’s a mysterious corner with a health resupply kit.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;You walk over to it and then T̄̈̎h̥͛̄e̗̖͝ ̂ͣ͛g̿ͪͨå̪ͣm̊̋ͫe̹̥̦,̷̣̯ ̗̼͚tͩ͒͋h̓̀͌e͍̐͘ ͨ́̓u͒ͮ̃n̏ͮ͛҉͇̙͓i͈͍͂v̐ͤͫê͒́r͂ͪ̋s̍̽͑e̋̃͌,ͧ͋ͩ ͭͤ̈́aͪ̐̉n̹̭͗d͆ͨ̔ ̾̒̐ē̓ͣvͯͤͫě̏̌r̐̉̽y͆̾̅ṫ̎̓hͥ́ͨiͨ̆ͩnͥ̉ͪg̒͌̃ ̋ͨ̒i͋͐̔nͫ̔̽ ̀͆̒î̒ͮt͒͆̑ ̈́̄́҉̖́͞č͆̓rͮ͆ͮȧͬshes.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Then your computer crashes.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Then your electricity shuts off.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Then Elon Musk tweets about genetically engineered catgirls.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Then the whole internet infrastructure collapses and the world is sent into turmoil.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Short:&lt;/strong&gt; All the trigger_brush really does is cause a memory access violation. &lt;em&gt;It’s a feature!&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-process&quot;&gt;The Process&lt;/h2&gt;

&lt;p&gt;I had to heavily weigh the pros and cons of performing this change. I’ve built up 5 years worth of search results for &lt;em&gt;trigger_death&lt;/em&gt; and have already filled out the entire first page. This change would brutally kill my Search Engine Optimization score. The biggest hurdles were first making sure the change in GitHub username would not negatively impact the change of this GitHub Pages site’s URL. I ended up creating a &lt;a href=&quot;https://github.com/trigger-death&quot;&gt;GitHub organization for my old username&lt;/a&gt; and setup a GitHub Pages site purely to redirect to the new GitHub pages URL. Sadly GitHub Pages does not support 301 redirects but there’s nothing that can be done about that. It seems to work well so far, and I’ve read Google can handle redirects done the other way too, so I’m not terribly worried anymore.&lt;/p&gt;

&lt;p&gt;For every site I can think of off the top of my head, I’ve gone and changed the username (if it supported it), or outright created a new account. This was a pain especially when I learned one site had a 15 character limit leaving me as &lt;em&gt;Triggersegfault&lt;/em&gt; with no dash and enforced first letter capitalization. Some forums made things very easy, just a simple help request, and the username was changed, &lt;em&gt;and&lt;/em&gt; all old URLs still worked because it relied on an ID at the end.&lt;/p&gt;

&lt;h2 id=&quot;the-results&quot;&gt;The Results&lt;/h2&gt;

&lt;p&gt;The result is that many sites now 404 on my old username, many lead to a now-dead account (only some of which allow me to write out information to redirect people), and others are smart enough to support both names in URLs. Aside from GitHub pages, GitHub itself does an excellent job at redirecting old URLs and will automatically do this indefinitely unless the new &lt;em&gt;trigger_death&lt;/em&gt; organization already has an existing repository for the same URL. What’s amazing is even the API supports username changes, all &lt;a href=&quot;https://shields.io/&quot;&gt;shields.io&lt;/a&gt; badges are still functional and working properly!&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;Hits are already being indexed for &lt;em&gt;trigger_segfault&lt;/em&gt; by Google, just 24 hours into the change.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/rebrand-search-results.png&quot; alt=&quot;Rebranding search results showing up&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The name change is definitely devastating, but at the same time it was becoming necissary. I have done this once now, and shall hopefully never have to do it again. Better late than never.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Final Note:&lt;/strong&gt; You will likely need to update your RSS feeds to be directed to the new &lt;a href=&quot;/&quot;&gt;trigger_segfault.github.io&lt;/a&gt; domain. There isn’t really a proper way to fix this.&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Robert Jordan</name>
        
          <email>triggerstools@gmail.com</email>
        
        
      </author>

      
        <category term="[&quot;dev&quot;, &quot;meta&quot;, &quot;personal&quot;]" />
      

      
        <category term="trigger_death" />
      
        <category term="trigger_segfault" />
      
        <category term="username" />
      
        <category term="handle" />
      
        <category term="change" />
      
        <category term="rename" />
      
        <category term="rebrand" />
      

      
        <summary type="html">I've been thinking about it over the last few months and decided it was time to rebrand myself from trigger_death to a new online username.</summary>
      

      
      
        
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://trigger-segfault.github.io/blog/assets/img/trigger_segfault-avatar.png" />
      
    </entry>
  
    <entry>
      <title type="html">Deciphering a Password Save System</title>
      <link href="https://trigger-segfault.github.io/blog/2019/05/11/deciphering-a-password-save-system/" rel="alternate" type="text/html" title="Deciphering a Password Save System" />
      <published>2019-05-11T20:00:00+00:00</published>
      <updated>2019-05-11T20:00:00+00:00</updated>
      <id>https://trigger-segfault.github.io/blog/2019/05/11/deciphering-a-password-save-system</id>
      <content type="html" xml:base="https://trigger-segfault.github.io/blog/2019/05/11/deciphering-a-password-save-system/">&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglasspass.png&quot; alt=&quot;Example Password&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve worked on reverse engineering binary file formats before, and it can be quite difficult at times. That said, I’ve never tried to decipher a text-based format, even if it was as small as an 8-letter password. The full documentation explained in this post can be found on the &lt;a href=&quot;https://github.com/trigger-segfault/HourglassPassword/wiki&quot;&gt;Hourglass of Summer: Documentation Wiki&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Special thanks go to &lt;a href=&quot;https://gamefaqs.gamespot.com/dvd/924699-hourglass-of-summer/faqs/35923&quot;&gt;Porcupine’s Detailed Walkthrough&lt;/a&gt; as it was essential in speeding up my work, thanks to it’s extensive listing of passwords and scene Title-Chapters.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;An example fully uncovered password in-game. (Normally you can only view one letter at a time due to technical limitations)&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglass-password-full.png&quot; alt=&quot;Example Password&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I started &lt;a href=&quot;https://vndb.org/v32&quot;&gt;Hourglass of Summer&lt;/a&gt; on DVD by request of a friend, and I was surprisingly hooked even though the lack of certain key features present in most VNs made things frustrating and slow at times. As a game built to run on a DVD player, there are no save slots, and you are forced to write down an 8-letter password that represents the current point in the game you’re at combined with the relevant choices you have made up until now. By day two, I wanted to tackle the password system and see if I could learn how it works so I could remove a lot of the hassle from the game. I went in expecting to futz around for a bit and get absolutely nowhere. I came out having learned the entirety of the system, the ID for every scene in the game, every game flag operation, and even a handful of glitches surrounding the password input system.&lt;/p&gt;

&lt;h1 id=&quot;discovery&quot;&gt;Discovery&lt;/h1&gt;

&lt;p&gt;The first thing I tried to do was determine how the password stored its data. Did each letter act as a base-26 digit, or was each letter independent from each other? After whipping up a program to calculate password values based on the base-26 theory, I quickly ruled out that this was unlikely, especially because there were often letters that did not change in the password, even after key decisions in the game. If this were base-26, then, changes to one bit in the password would likely change up all letters in the password up to this bit, this being due to the fact that base-26 has no relation to binary base-2. Just like changing a single bit in a number can change numerous digits in a decimal number.&lt;/p&gt;

&lt;h3 id=&quot;writing-down-passwords&quot;&gt;Writing Down Passwords&lt;/h3&gt;

&lt;p&gt;The first task to help with deciphering was to write down the password for every scene I encountered in the game as I progressed. This slowed down the game progression a bit, but a large pool of data is important to see how the password varies over time, and it certainly did vary over time more than I was expecting. It became apparent that a few letters were changing every scene, and by accident at one point, I looked at half the password and had to go back into the menu to read it again, only to discover that the password had changed without leaving the pause menu.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;Notes that were taken for Scene passwords as they were encountered during regular gameplay.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglass-password-notes.png&quot; alt=&quot;Password Notes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To see how much the password could vary without any changes in game data, I kept closing and opening the password menu to see what changed each time, and what it changed to. It boiled down to 10 letters in the same spots that would freely change between one another whenever I opened the menu. There was one other spot in the password that had different letter randomization, but I only looked into that later. This led to the first discovery of the what I called &lt;strong&gt;&lt;a href=&quot;https://github.com/trigger-segfault/HourglassPassword/wiki/Password-Structure#garbage-letters&quot;&gt;Garbage Letters&lt;/a&gt;&lt;/strong&gt;, which are letters that represent unused or uninitialized data. Because I doubt any real RNG existed in the game, I expected that this password randomization was based on the timestamp in the pause menu when opening the password menu.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;These are the letters determined to be Garbage Letters.&lt;/p&gt;

&lt;table align=&quot;center&quot; class=&quot;bold-table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;B&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;D&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;F&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;I&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;K&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;M&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Q&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;S&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Y&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;This first discovery was very helpful, as it simplified writing down, and even inputting passwords. Once memorized, you could easily use a single letter to denote any garabge letter in a password without having to make the password more complex. I often used this to my advantage when inputting large amounts of passwords a day by inputting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;---OZYYYY&lt;/code&gt; (where the first 3 letters are irrelevant).&lt;/p&gt;

&lt;h3 id=&quot;whats-what-in-the-password&quot;&gt;What’s What in the Password&lt;/h3&gt;

&lt;p&gt;With the knowledge of garbage letters, it was now possible to &lt;em&gt;properly&lt;/em&gt; track what parts of the password changed every scene. The first obvious change was that every scene, the first letter in the password changed, so that was obviously responsible for directing the game to the correct scene. Because there has to be more than 16 or even 26 scenes in the game, it must mean that &lt;em&gt;at least&lt;/em&gt; a second letter would be needed to track the scene. The assumption was that the second letter in the password was likely the &lt;em&gt;second letter&lt;/em&gt; in the scene variable. This left the password at 2-3 letters for scene info, and 6-5 letters for flag data.&lt;/p&gt;

&lt;h3 id=&quot;letter-values&quot;&gt;Letter Values&lt;/h3&gt;

&lt;p&gt;Once I discovered that 10/26 letters had no meaning, it became very likely that the password Letters were a cipher for hexadecimal, with each non-garbage letter representing a value between 0 and 15. After isolating parts of the password by usage, my first method for determining the value for each letter was by seeing what &lt;em&gt;non-garbage letters&lt;/em&gt; changed during KEY choices in the story, then changing the password and going back to the scene to see how the letters changed again. This is where the trouble started, because I failed to record the correct initial values of the flag letters before changing, this led to the issue where estimating the values of each letters based on flag operations always returned inconsistent results that didn’t match up with any operation.&lt;/p&gt;

&lt;p&gt;I gave up on the flags for a bit and tried to look more into the scene variable again. I recorded each scene’s password from the beginning of the game as I encountered it while also taking into account choices leading to different scenes. It was still unclear if the Title, Chapter format of DVD sections were used internally in the password, or mapped by the game outside of the password, but after following the progression of the first letter of the password, it seemed like the scene was incrementing the value by one every time, this meant the Scene was stored as an ID instead of Title-Chapter, unlike what I had hoped, but it also gave away the value of every &lt;em&gt;non-garbage letter&lt;/em&gt; in the password. Not only did this pattern continue onto the second letter, but that second letter helped enforce the possible values of the letters.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;This is the uncovered pattern to the order of the early-game Scene IDs, which uncovers each letter’s numeric order.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;A-U? -G-W? -H-N? -T-O?       -CA-GA-*-WA-JA-LA?      -XA-ZU...
| |-E   |-J   |-P   |-X--ZA?        |       |-HA           
| +-C   +-L   +-R   +-AA |          |       +-NA-PA?       
|                        |-UA    Anime OP        |-RA      
Start of Game            +-EA                    |-TA      
                                                 +-OA      
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;password-input-glitch&quot;&gt;Password Input Glitch&lt;/h3&gt;

&lt;p&gt;While I was trying to work with the early-game scene IDs I discovered and dreaded the fact that early-game passwords were not accepted by the Password Input Menu. I followed the Scene IDs until it did work (which was at scene &lt;strong&gt;ZA&lt;/strong&gt;) and tried replacing the pattern &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-G-X----&lt;/code&gt; &lt;sup&gt;(where &lt;strong&gt;G&lt;/strong&gt; is a garbage letter)&lt;/sup&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Z-O----&lt;/code&gt; based on the assumption that &lt;strong&gt;Z&lt;/strong&gt; was the letter for zero. I got the &lt;strong&gt;O&lt;/strong&gt; based on what was used in later scene IDs. I didn’t fully understand why this worked, or why the glitch occurred until the final days working on the documentation, the only thing I really understood was that the fourth letter of &lt;strong&gt;X&lt;/strong&gt; did not make the Password Input Menu a happy camper. My original assumption was also that garbage letters were presented as such, but were not actually a valid second Scene ID letter, although that was changed when I later learned that later IDs did not like &lt;strong&gt;Z&lt;/strong&gt; for some reason.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;You reach this screen and are presented with &lt;em&gt;flawless English&lt;/em&gt; when the password you have entered in is considered invalid.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglass-invalid-password.png&quot; alt=&quot;Invalid Password Screen&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;determined-letter-values&quot;&gt;Determined Letter Values&lt;/h3&gt;

&lt;p&gt;The following &lt;strong&gt;&lt;a href=&quot;https://github.com/trigger-segfault/HourglassPassword/wiki/Password-Structure#valid-letters&quot;&gt;Valid Letters&lt;/a&gt;&lt;/strong&gt; were then tested and confirmed to represent these values. I was correct in the assumption that &lt;strong&gt;Z&lt;/strong&gt; stood for zero although most of my other guesses were proven wrong.&lt;/p&gt;

&lt;table align=&quot;center&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;#&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Bin&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Hex&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Dec&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Z&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0000&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0001&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;U&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0010&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;E&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0011&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0100&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;G&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0101&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;W&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0110&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;6&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;6&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;J&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0111&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;L&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1000&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;H&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1001&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;9&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;9&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;N&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1010&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;P&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1011&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;11&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;R&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1100&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;12&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;T&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1101&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;13&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;O&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1110&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;E&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;14&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1111&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;F&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;15&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h1 id=&quot;comprehension&quot;&gt;Comprehension&lt;/h1&gt;

&lt;p&gt;At this point I was regularly updating the password Wiki to keep all knowledge up to date, and easy to access anywhere when I had an idea. The next few days were spent writing a framework for the Password structure and also collecting in-game flag operations and in-game Scene IDs for each Title-Chapter. With the letter values known, it was quickly determined that only bitwise OR and bitwise AND were used to modify flags which made uncovering the flags a bit &lt;sup&gt;(heh)&lt;/sup&gt; easier.&lt;/p&gt;

&lt;h3 id=&quot;3rd-scene-id-letter&quot;&gt;3rd Scene ID Letter&lt;/h3&gt;

&lt;p&gt;After looking over my later written down passwords, I noticed that the normal 4 random letters that could be in place for the 3rd letter in the password changed. I looked into the values and noticed that each of these new 4 random letters were one higher than each of the previous 4. This finally explained the &lt;em&gt;other&lt;/em&gt; mystery randomized letter in the password. I concluded that the first 2 bits in this letter determined the highest part of the Scene ID, while the last 2 bits were always randomized and could be safely ignored. This assumption turned out to be true right off the bat from testing. The Scene ID was now guessed to be the first 3 letters of the password, and the Flag Data was assumed to be the last 5.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;Below are the real letter values, and what other letters can represent them. &lt;strong&gt;E&lt;/strong&gt; and friends are crossed out because there are not enough Scene IDs in the game to reach these high values, &lt;em&gt;and&lt;/em&gt; they are not accepted by the Password Input Menu.&lt;/p&gt;

&lt;table align=&quot;center&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Z&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;A&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;U&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;del&gt;   E   &lt;/del&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Z C L R&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;A G H T&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;U W N O&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;del&gt;E J P X&lt;/del&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;password-library&quot;&gt;Password Library&lt;/h3&gt;

&lt;p&gt;I had been updating the password library along with the discoveries I made and now I was finally able to analyze a password and output a coherent explanation of what was input. Garbage and Valid letters were automatically replaced with the proper type of letter, so even normally-invalid passwords could be converted to valid ones, this was more helpful for me as it saved time during input.&lt;/p&gt;

&lt;!--{:align=&quot;center&quot; .figure-text}
The password testing console program.

{:align=&quot;center&quot;}
![Password Analyzer](/blog/assets/img/hourglass-analyzer.png)--&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The in-progress graphical user interface program password.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglass-gui-analyzer.png&quot; alt=&quot;Password Analyzer&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;making-use-of-the-knowledge&quot;&gt;Making use of the Knowledge&lt;/h3&gt;

&lt;p&gt;The first time I tried to make use of everything I had learned, and the flags I had written down, was when trying to jump to the next character route to play. I had already seen all scenes that lead up to this route, so there was no reason I should need to play them again to get there. By combining 5 documented flag operations related to Tomomi, and knowing the Scene ID just before her route was initiated, I came up with the password &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OEZLWLEB&lt;/code&gt;. This worked correctly and put me right at the beginning of the route like I intended.&lt;/p&gt;

&lt;h3 id=&quot;garbage-checksum-and-first-flag-letter&quot;&gt;Garbage Checksum and First Flag Letter&lt;/h3&gt;

&lt;p&gt;For now I had always assumed that the first flag letter (and 4th letter in the password) &lt;strong&gt;F&lt;sup&gt;4&lt;/sup&gt;&lt;/strong&gt; was a special letter where the operations of OR and AND are reversed. This letter started out as &lt;strong&gt;X&lt;/strong&gt; (all bits set) and slowly lowered in value over time. Messing around with it also proved that it would trigger the Password Input Menu to reject the password. At this point I had no idea how complex the input validator was, but I wanted to fully understand how it worked. I tried seeing if it could function as some sort of checksum based on the rest of the letters in the password. After looking at its change in value through all of the recorded flag operations and scene passwords, I started noticing that it was often changed just during flag operations, but not always. Trying to figure out why it changed, I noticed that one letter was always being changed to or from a garbage letter during every change to the fourth letter.&lt;/p&gt;

&lt;p&gt;After furthur investigation, I confirmed that this checksum letter had everything to do with the garbage letters. The next step was figuring out how it was generated and how to take it apart. After looking at the changes in the letter’s bits, only one bit changed every time the checksum changed, this lead to the conclusion that each bit corresponded to a single potential garbage letter in the password. This was quickly confirmed by messing around with the Password Input Menu and generating valid passwords through changing the checksum and potential garbage letters. This is when the term &lt;strong&gt;&lt;a href=&quot;https://github.com/trigger-segfault/HourglassPassword/wiki/Password-Structure#garbage-checksum&quot;&gt;Garbage Checksum&lt;/a&gt;&lt;/strong&gt; was coined to describe the letter’s behavior. Each &lt;em&gt;nth&lt;/em&gt; bit in the letter is set, when the &lt;em&gt;nth&lt;/em&gt; potential garbage letter in the password is a garbage letter.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;Each bit in the Garbage Checksum is set when the specified letter is a garbage letter.&lt;/p&gt;

&lt;table align=&quot;center&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Bit&lt;/th&gt;
      &lt;th&gt;3&lt;/th&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;th&gt;0&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;Letter&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;F&lt;sup&gt;8&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;F&lt;sup&gt;7&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;F&lt;sup&gt;6&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;S&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Although this didn’t directly explain &lt;em&gt;how&lt;/em&gt; the Password Input Glitch occurred, it did shed light on &lt;em&gt;why&lt;/em&gt; the solution worked. &lt;strong&gt;O&lt;/strong&gt; worked because the first potential garbage letter was &lt;strong&gt;Z&lt;/strong&gt; instead of an actual garbage letter, this validated the garbage checksum without requiring the use of &lt;strong&gt;X&lt;/strong&gt;. This brought on the final big discovery about the password structure…&lt;/p&gt;

&lt;h3 id=&quot;the-end-of-garbage-letters&quot;&gt;The End of Garbage Letters&lt;/h3&gt;

&lt;p&gt;Once I had discovered that &lt;strong&gt;Z&lt;/strong&gt; was a valid replacement for the first potential garbage letter, and changing the garbage checksum actually produced a valid result, I tested if other letters could be &lt;strong&gt;Z&lt;/strong&gt; instead of garbage letters. &lt;strong&gt;Z&lt;/strong&gt; could replace &lt;em&gt;any&lt;/em&gt; potential garbage letter! This meant that password input could be simplified &lt;strong&gt;even more&lt;/strong&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AZZZZZZZ&lt;/code&gt; was a completely valid password that would take you to the very beginning of the game! It complied with all of the rules, and even supplied the correct flags for that point in time. This was a game changer, as it opened up a whole new way to easily and lazily input passwords.&lt;/p&gt;

&lt;p&gt;Once this point was reached, the documentation for the &lt;strong&gt;&lt;a href=&quot;https://github.com/trigger-segfault/HourglassPassword/wiki/Password-Structure#structure-of-a-password&quot;&gt;Password Structure&lt;/a&gt;&lt;/strong&gt; was completed and corrected.&lt;/p&gt;

&lt;h3 id=&quot;branching-scene-ids&quot;&gt;Branching Scene IDs&lt;/h3&gt;

&lt;p&gt;While recording later Scene IDs, I soon discovered that certain IDs were skipped altogether with no real explanation for why that was necessary. After inputting these Scene IDs into the Password Input Menu, it took me to the next Scene ID. What I soon noticed was that the Scene ID I was taken to was a conditional scene. This scene was only hit if you had made certain decisions in the past that set the appropriate flags. By testing different flag combinations, it became clear that the sole purpose of these Scene IDs were to send the game to a different Scene based on a condition. Knowledge of these Scene IDs had very little benefit, but it was simply more information that explained the inner workings of the game.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;An example of how a Scene branches based on condition.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglass-branch-chart.png&quot; alt=&quot;Branch F/\ jumps to the first choice if `flags &amp;amp; &amp;quot;ZZCZ&amp;quot;`, `else` the second choice.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I later encountered a few branches in the story that did not make use of a locatable Scene ID which was strange. As the game strictly clamps the range of Scene IDs inputtable in the Password Input Menu, this is one mystery that will never be solved. If they do have Scene IDs, they are not accessible. If they do not have Scene IDs, then the previous scene is likely able to perform the same branching operations. It is also very possible that these are developer Scene IDs, but with no way to confirm this, it will be left as speculation.&lt;/p&gt;

&lt;h3 id=&quot;misunderstanding&quot;&gt;Misunderstanding&lt;/h3&gt;

&lt;p&gt;While testing the conditions for branching scenes, I noticed that conditions weren’t being properly honored while entering in &lt;strong&gt;X&lt;/strong&gt;. This occurred whenever I entered &lt;strong&gt;X&lt;/strong&gt; into the last letter slot. For whatever reason, &lt;strong&gt;X&lt;/strong&gt; in the last slot of the password would always direct you to the first result in a branching scene. The tests so far always brought the game to the positive outcome of a scene and this was incorrectly guessed to be a cheat or developer command to help skip through the story. It only become clear what was really going on near the very end of things.&lt;/p&gt;

&lt;h1 id=&quot;mastery&quot;&gt;Mastery&lt;/h1&gt;

&lt;p&gt;The final stretch of documentation involved finishing the entirety of the game, recording every possible Scene ID’s Title-Chapter, and logging every existing flag operation. This information needed to be done soon, as once the trial for the only software to play Hourglass of Summer was up, there would be no going back to running the game without forking over subscription money for a product that only has one specific use to me.&lt;/p&gt;

&lt;h3 id=&quot;password-input-glitch-clarity&quot;&gt;Password Input Glitch Clarity&lt;/h3&gt;

&lt;p&gt;The final &lt;em&gt;AHAH&lt;/em&gt; moment was when I discovered the truth of the many strange behaviors of the Password Input Menu. &lt;strong&gt;X&lt;/strong&gt; had been known to cause problems or special behavior for a Input Menu in certain places and it was just assumed to be how things were. All of this actually stemmed from one single and annoying glitch with the Password Input Menu: Inputting &lt;strong&gt;X&lt;/strong&gt; at letter &lt;strong&gt;C&lt;sup&gt;4&lt;/sup&gt;&lt;/strong&gt; or &lt;strong&gt;F&lt;sup&gt;8&lt;/sup&gt;&lt;/strong&gt; would retroactively overwrite the 3 previous letters the moment it was entered. This was actually discovered by chance while trying to document a known crash in the game by navigating a previously input password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;X&lt;/strong&gt; &lt;em&gt;is and can&lt;/em&gt; be used as a valid letter at &lt;strong&gt;C&lt;sup&gt;4&lt;/sup&gt;&lt;/strong&gt; or &lt;strong&gt;F&lt;sup&gt;8&lt;/sup&gt;&lt;/strong&gt;, but it turns out that the only way to do it right, is by entering it in &lt;em&gt;before&lt;/em&gt; entering in the previous 3 letters. If the password input navigation arrows didn’t exist, this would make the bug much more troublesome and impossible to fix in certain situations.&lt;/p&gt;

&lt;p&gt;After encountering this, I learned how to trigger the crash. Apparently Garbage letters behave differently when overwritten by the &lt;em&gt;now labeled&lt;/em&gt; &lt;strong&gt;&lt;a href=&quot;https://github.com/trigger-segfault/HourglassPassword/wiki/Password-Input-Glitches#propagating-x-input-invalid-x&quot;&gt;Propagating X Input&lt;/a&gt;&lt;/strong&gt; glitch. This special behavior also helps because it keeps the garbage letters as such and allows the garbage checksum to stay valid. The problem with these garbage letters, is if you navigate to them in the Password Input Menu &lt;em&gt;after&lt;/em&gt; Propagating X Input overwrites it, the game will crash (at least on the player I used).&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;What the input looks like before Propagating X.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglass-propagating-x-before-sm.png&quot; alt=&quot;Before Propogating X, the first 3 letters as previously input&quot; /&gt;&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;What the input looks like after Propagating X.&lt;br /&gt;Navigating to &lt;strong&gt;S&lt;sup&gt;2&lt;/sup&gt;&lt;/strong&gt; will crash the game as it was previously input as a garbage letter.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/hourglass-propagating-x-after-sm.png&quot; alt=&quot;After Propogating X, the first 3 letters are all X&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;everything-is-here&quot;&gt;Everything is Here&lt;/h3&gt;

&lt;p&gt;On April 30th, 13 days after starting the game, I had finished writing down every Scene ID Title-Chapter combination, every Branching Scene, every Scene of Interest, and every flag operation that took place in the game. It turned out some Scene IDs were observable, yet outside of the accepted range of the Password Input Menu.  The range is from &lt;strong&gt;ZZZ&lt;/strong&gt; to &lt;strong&gt;OAU&lt;/strong&gt;, leaving room for 542 valid Scene IDs. The game recycles flags a lot due to the limited number of available bits in the flag data (16). Often right before a choice, or before a major choice tree, a few or numerous flag bits are cleared or &lt;em&gt;freed&lt;/em&gt; so that they can be set by a later choice. These clear operations are always hit to ensure that the flags are never misinterpreted by the game.&lt;/p&gt;

&lt;h2 id=&quot;future-plans&quot;&gt;Future Plans&lt;/h2&gt;

&lt;p&gt;Although the documentation is basically complete for Hourglass of Summer, there are a few areas that could use some extra oomph. A flowchart that visually represents the Scene tree in the game would make navigating more straight forwards, although it would be a big endeavor to undertake. Another goal is to take all of this documented information and shove it into a password generator/reader. An application or web app that will give you the password based on supplied conditions, or take apart a password and tell you what all of it means. If either of these are eventually finished, then they will be linked below.&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Robert Jordan</name>
        
          <email>triggerstools@gmail.com</email>
        
        
      </author>

      
        <category term="[&quot;dev&quot;, &quot;anime&quot;, &quot;gaming&quot;]" />
      

      
        <category term="password" />
      
        <category term="save" />
      
        <category term="decipher" />
      
        <category term="reverse engineering" />
      
        <category term="visual novel" />
      
        <category term="hourglass of summer" />
      

      
        <summary type="html">I've worked on reverse engineering binary file formats before, and it can be quite difficult at times. That said, I've never tried to decipher a text-based format, even if it was as small as an 8-letter password.</summary>
      

      
      
        
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://trigger-segfault.github.io/blog/assets/img/hourglasspass.png" />
      
    </entry>
  
    <entry>
      <title type="html">2018: End of Year Wrap-Up (Part 2)</title>
      <link href="https://trigger-segfault.github.io/blog/2019/05/05/end-of-year-wrapup-2018-part-2/" rel="alternate" type="text/html" title="2018: End of Year Wrap-Up (Part 2)" />
      <published>2019-05-05T20:00:00+00:00</published>
      <updated>2019-05-05T20:00:00+00:00</updated>
      <id>https://trigger-segfault.github.io/blog/2019/05/05/end-of-year-wrapup-2018-part-2</id>
      <content type="html" xml:base="https://trigger-segfault.github.io/blog/2019/05/05/end-of-year-wrapup-2018-part-2/">&lt;h2 id=&quot;2018-coverage&quot;&gt;2018 Coverage&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/end-of-year-wrapup-2018.png&quot; alt=&quot;Preview of 2018&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now that I have a blog and feel obligated to post things. Let’s follow in &lt;a href=&quot;https://blog.huguesross.net/2018/12/2018-end-of-year-wrap-up.html&quot;&gt;my friend’s footsteps&lt;/a&gt; and create a wrap-up of this years development (and a little bit of last year’s since a lot went on then too).&lt;/p&gt;

&lt;p&gt;Part two is long overdue, so here it so.&lt;/p&gt;

&lt;h1 id=&quot;2018&quot;&gt;2018&lt;/h1&gt;

&lt;h2 id=&quot;zelda-oracle-engine-nov---apr&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/ZeldaOracle&quot;&gt;Zelda Oracle Engine (Nov - Apr)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/zelda-oracle.png&quot; alt=&quot;Zelda Oracle Engine logo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Zelda Oracle Engine is a pet project me and my &lt;a href=&quot;https://github.com/cubeman99&quot;&gt;brother, cube_man&lt;/a&gt; have had for a long time, crossing over many languages. In 2015, we gave it a good start in C# XNA and restarted then revived it in late November of 2017. During the revival we made many changes including transitioning to a WPF editor, &lt;em&gt;as that’s what I specialize in&lt;/em&gt;, it created a few headaches in some areas, but overall we got a few nice improvements out of it, including a pretty nice script editor using AvalonEdit.&lt;/p&gt;

&lt;h3 id=&quot;major-improvements-everything&quot;&gt;Major Improvements: Everything&lt;/h3&gt;

&lt;p&gt;We have now surpassed any previous generations of this project (Java, and before that GameMaker). We transitioned to a paletted sprite system for maximum authenticity. We created an editor to feed and build &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.conscript&lt;/code&gt;’s in to get maximum representation of errors while compiling resources and checking that tiles were setup correctly. The new paletting system is a little overwhelming at first glance, although I did end up writing some tutorial conscripts.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/zelda-oracle-conscript-designer.png&quot; alt=&quot;Conscript Designer Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The world editor saw some big improvements with an undo feature, which was pretty difficult to nail down. We also got a selection tool with different levels of layer support. My brother finally got the script API implemented, we decided to write the scripts in straight C#, with an API library for access to the game. The script editor uses Roslyn for much more advanced intellisense which is much nicer to work with than just an error message at the bottom of the window.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/zelda-oracle-world-editor.png&quot; alt=&quot;World Editor Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The physics engine got an overhaul along with monster API. Pretty much every weapon got its implementation down. We also finally got side-scrolling view in, which is quite fun to play around in.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;An example of a palette zone transition and making use of the game engine for memes.&lt;/p&gt;

&lt;div class=&quot;video-inline-container&quot;&gt;
  &lt;div class=&quot;video-container inline left&quot;&gt;
    &lt;iframe src=&quot;https://gfycat.com/ifr/PartialMeaslyHoneyeater&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
  &lt;div class=&quot;video-container inline spacing&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;video-container inline right&quot;&gt;
      &lt;iframe src=&quot;https://gfycat.com/ifr/LimpJovialHusky&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;We encountered a few &lt;em&gt;interesting&lt;/em&gt; bugs along the way.&lt;/p&gt;

&lt;div class=&quot;video-inline-container&quot;&gt;
  &lt;div class=&quot;video-container inline left&quot;&gt;
    &lt;iframe src=&quot;https://gfycat.com/ifr/MisguidedHealthyBaboon&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
  &lt;div class=&quot;video-container inline spacing&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;video-container inline right&quot;&gt;
      &lt;iframe src=&quot;https://gfycat.com/ifr/PaltryPartialHound&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;It was great to get to work on this project again and great to work with my brother, who really knows what he’s doing when he goes to implement something. The game wouldn’t be even 1/10th as good as it is now without his help. cube_man worked mostly on the actual engine, while I worked more in the area of the editor and resource management. Most of my time went to gathering and compiling the &lt;a href=&quot;/blog/assets/img/zelda-oracle-tile-list.png&quot;&gt;tile list we see here&lt;/a&gt;. The project went on hiatus in April after slowly losing interest, but I have no doubt we’ll pick it up again in the future, assuming we have the time.&lt;/p&gt;

&lt;h2 id=&quot;discord-bot-trigger_chan-v1-apr---oct&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/TriggerChan&quot;&gt;Discord Bot: trigger_chan v1 (Apr - Oct)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The old avatar for Triggy before upgrading to my Bot Framework v2 with a new image.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/trigger-chan-avatar-old.png&quot; alt=&quot;trigger_chan Old Avatar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On April 20th, a Discord server for an anime app I used opened up. Me and the developer knew each other from another server so he gave me the go-ahead to setup a bot for the server to manage basic stuff such as MyAnimeList profile embeds and roles. With this, I made my first trek into writing a Discord Bot, which ended up being a ton of fun. It was pretty basic at first, and the help embeds were &lt;em&gt;not very helpful&lt;/em&gt;, but it got the job done.&lt;/p&gt;

&lt;p&gt;I decided on the name &lt;em&gt;trigger_chan&lt;/em&gt; to play off my own username of &lt;em&gt;trigger_segfault&lt;/em&gt; as well as her being the mascot for Studio Trigger.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/postgresql-db.png&quot; alt=&quot;PostgreSQL Database View&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Working on trigger_chan was also my first delve into really working with relational databases as well as Entity Framework Core. I &lt;em&gt;did&lt;/em&gt; work with SQLite databases for Trigger’s PC back in 2016, but these were static and edited by hand, it’s very different to work with ones that require changes being made. It was pretty difficult to get used to, especially while trying to get the hang of code-first implementation.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The MAL embed is still relatively the same as when it first came out.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/triggy-mal-old.png&quot; alt=&quot;trigger_chan Old MAL Embed&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With v1 of the bot framework, each command was stored in it’s own entry identified by name, so every subcommand of a command got its own entry. It was terrible and awful.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The help list goes on and on and on.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/triggy-help-old.png&quot; alt=&quot;trigger_chan Old Help Embed&quot; /&gt;&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The command help embed was at least a bit more helpful, although it lacked examples.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/triggy-help-command-old.png&quot; alt=&quot;trigger_chan Old Help Command Embed&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, in the beginning and even now, Triggy was still hosted locally on my Computer. I didn’t move her to AWS until after the 2019 started, and I still haven’t nailed down what to do once the free year is up.&lt;/p&gt;

&lt;h2 id=&quot;discord-bot-trigger_chan-v2-oct---present&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/TriggerChan&quot;&gt;Discord Bot: trigger_chan v2 (Oct - present)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The new image for Triggy after upgrading to my Bot Framework v2. &lt;a href=&quot;https://www.deviantart.com/zwimmy/art/Trigger-chan-711192608&quot;&gt;The avatar is by Zwimmy&lt;/a&gt;.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/trigger-chan-avatar-new.png&quot; alt=&quot;trigger_chan New Avatar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Starting in October I began writing version two of my Discord.NET bot framework implementation. My goal was to fix a lot of the general flaws with the previous framework such as how commands are categorized, and how bad the help commands were. I also wanted to get Triggy up to standards to be Discord TOS compliant, which requires that end user data in databases be encrypted.&lt;/p&gt;

&lt;p&gt;During the upgrade, I switched from SQLite to PostgreSQL to allow more advanced database migrations.&lt;/p&gt;

&lt;p&gt;One of the other big changes to Triggy was migrating the audio player to using Lavalink, which does most of the hard work for you when it comes to playing audio. It supports YouTube and SoundCloud searches, as well as BandCamp, Twitch, and Vimeo urls.&lt;/p&gt;

&lt;p&gt;More in depth view on the current state of trigger_chan &lt;a href=&quot;/tools/trigger-chan/&quot;&gt;can be found here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;grisaia-extract-may---jun&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/GrisaiaExtractor&quot;&gt;Grisaia Extract (May - Jun)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/grisaia-extract.png&quot; alt=&quot;Grisaia Extract Console&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’d consider the Grisaia trilogy one of my favorite visual novel series of all time. I’d worked with extracting graphics from visual novels before, and &lt;a href=&quot;http://asmodean.reverse.net/pages/exkifint.html&quot;&gt;there were already existing tools to do it for CatSystem2 games like Grisaia&lt;/a&gt;, but I wanted to make the experience &lt;em&gt;better&lt;/em&gt; for Grisaia. This process evolved over time from simply wrapping existing programs, to rewriting the existing codebase to be incorporated into C# as a native library. I got started using the helpful existing info on categorization from the &lt;a href=&quot;https://www.reddit.com/r/grisaia/wiki/ripping&quot;&gt;/r/Grisaia ripping wiki page&lt;/a&gt;. And after that I spent a lot of time sifting through images to figure out the pattern to their name, and where to move each of them programmatically. The tool was pretty much done in May, but I decided to actually make it presentable for release in June, because I didn’t know how long it would take before I made a proper UI. Post-release many hotfixes have come to update categorization.&lt;/p&gt;

&lt;h2 id=&quot;triggerstoolssteinsgatedivergence-jun&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/TriggersTools.SteinsGate&quot;&gt;TriggersTools.&lt;wbr /&gt;SteinsGate.&lt;wbr /&gt;Divergence (Jun)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/triggerstools-steinsgate-divergence.png&quot; alt=&quot;Divergence Meter Examples&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I created a library to draw the iconic &lt;a href=&quot;https://steins-gate.fandom.com/wiki/Divergence_Meter&quot;&gt;Divergence Meters&lt;/a&gt; from the popular visual novel and anime Steins;Gate. The purpose was to make drawing Divergence meters for memes or art quick and easy. I spent the first many days of this project just isolating the nixie tubes from the images that would allow them to be easily combined with one another. After the actual drawing code was done, I wrote a small program to generate the font for other characters using Oslo II. It took awhile to nail down a decent look, and it certainly doesn’t look perfect, but I’m pretty happy with how it turned out.&lt;/p&gt;

&lt;h2 id=&quot;discovery-of-shieldsio-badges-jun&quot;&gt;&lt;a href=&quot;https://shields.io/&quot;&gt;Discovery of Shields.io Badges (Jun)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/shield-io-badges.png&quot; alt=&quot;Example of Project with Shield.io Badges&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’d seen these badges used a lot in other repos, but never went out of my way to find out more about them, once I finally learned what they were called in June, I proceeded to absolutely plaster them on pretty much every repository that was maintained or of use to some degree.&lt;/p&gt;

&lt;h2 id=&quot;wiimote-experimentation-jun---sep&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/WiimoteLib.Net&quot;&gt;Wiimote Experimentation (Jun - Sep)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wiimote-controller.png&quot; alt=&quot;Wiimote Controller Overlay&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I started fiddling around with Wiimote control to enable playing games from a couch with an easier-to-use controller. It began with looking at existing libraries and how they communicated with the Wiimote. The current system for Wiimote Bluetooth pairing in Windows 7 was a huge hassle of removing and re-adding the device every time it was needed. One of the goals of this work was to create a better system for easily pairing the Wiimote automatically.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/bsod-10.png&quot; alt=&quot;BSOD: Windows 10th Edition&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One interesting thing I attempted was to modify the existing &lt;a href=&quot;https://github.com/jloehr/HID-Wiimote&quot;&gt;HID-Wiimote&lt;/a&gt; drivers to help support better pairing and passthrough so that the original controls could be retained without registering it as a different controller. It was interesting to learn how difficult it is to develop drivers, but it was also pretty fun. I took an old unused laptop and managed to hook it up to my main system with a debugger. Then I proceeded to-&lt;em&gt;Your PC ran into a problem and needs to restart&lt;/em&gt;, to-&lt;em&gt;Your PC ran into a problem and needs to restart&lt;/em&gt;… I crashed the laptop quite a lot. Although in the end I did learn a bit about HID descriptors and how USB devices work. I never made any usable progress with the drivers.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wiimote-audio-player.png&quot; alt=&quot;Wiimote Audio Player&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After getting the library up and running, I wanted to start looking into Wiimote Speaker playback, which for a long time has been relatively impossible to do well. The first part was that I had to purchase the latest Wiimote type which actually had better audio support. I never got the original Wiimote to play anything identifiable. Because PCM playback never sounded right, the main task was getting the ADPCM format down. I eventually found what seems to be the right version of it, but even then, the audio sometimes fades out and in in the Wiimote, and conversion to lower sample rates in general is pretty destructive.&lt;/p&gt;

&lt;div class=&quot;video-inline-container&quot;&gt;
    &lt;div class=&quot;video-container inline center&quot;&gt;
      &lt;iframe src=&quot;https://www.youtube.com/embed/vNItdVw6ONs&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;p&gt;I’ve been using the Wiimote controller application that resulted from this project ever since its inception. This paired with the DolphinBar has made the Wiimote Controller my personally most-used application to date.&lt;/p&gt;

&lt;h2 id=&quot;finally-upgrading-to-windows-10-jul&quot;&gt;Finally Upgrading to Windows 10 (Jul)&lt;/h2&gt;

&lt;p&gt;On July 7th I finally caved and upgraded to Windows 10. The reason being: Everytime I tried to install .NET 4.7 in Visual Studio 2017, it would brick the entire IDE. Not even a reinstall could fix it, and I was sick of having to restore from backups everytime I learned this hasn’t been fixed. The initial transition was frustrating at first. I immediately got Winaero Tweaker just to fix a few huge annoyances, messed around with the registry to fix more annoyances, and changed the system window AND taskbar color. I generally like Windows 10 now but there are still some very annoying issues that leave regrets…&lt;/p&gt;

&lt;p&gt;My biggest problems with Windows 10 that still persist today are major graphical issues like white flashing when scrolling in certain UIs, the Start Menu just not showing the lower half for a split second when opening, and in-game movies flat out giving me a black screen with audio. I’ve messed around with the NVidia drivers quite a bit and nothing has resolved any of these issues. The other major issue I’m having is that system restores cannot be performed outside of safe mode, which adds an additional layer to the headache of having to perform a system restore in the first place. Once I get a new hard drive to shove my current install on, I plan to do a fresh install of Windows 10 to see if I can fix the issues, if this doesn’t help then my graphics card is likely causing the problems, which is a pain because it worked absolutely fine in Windows 7.&lt;/p&gt;

&lt;p&gt;I’m just one of those &lt;em&gt;unlucky few people who have bad luck with Windows 10 on their build.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;triggerstoolsbuild-jul&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/TriggersTools.Build&quot;&gt;TriggersTools.&lt;wbr /&gt;Build (Jul)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/triggerstools-build.png&quot; alt=&quot;TriggersTools.Build NuGet Icons&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I started futzing around with MSBuild Task NuGet packages to create a proper system for auto-updating the copyright year and keeping a build timestamp without having to manually set these up for every project. These build tasks have been really handy with the other projects I’ve worked on and allowed for additional laziness.&lt;/p&gt;

&lt;h2 id=&quot;windirstatnet-aug&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/WinDirStat.Net&quot;&gt;WinDirStat.Net (Aug)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/windirstat-net.png&quot; alt=&quot;WinDirStat.Net&quot; /&gt;&lt;/p&gt;

&lt;p&gt;WinDirStat is tried and true, but their UI is quite outdated at this point, and often quite laggy at times. The scanning can also be slower than it needs to be as pointed out in &lt;a href=&quot;https://github.com/ariccio/altWinDirStat/issues/19&quot;&gt;altWinDirStat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I started work on creating a WPF implementation of WinDirStat and managed to get pretty far. This ended up being my first delve into MVVM, which was recommended by a friend. This also required &lt;em&gt;a lot&lt;/em&gt; of code optimization and memory optimization. A lot of time was put into improving the UI responsiveness while still scanning, and generally improving the treeview render. The program came out quite nicely, but there are still some bugs to iron out and features to implement.&lt;/p&gt;

&lt;h2 id=&quot;triggerstoolsfilefind-sep&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/TriggersTools.FileFind&quot;&gt;TriggersTools.&lt;wbr /&gt;FileFind (Sep)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/triggerstools-filefind.png&quot; alt=&quot;TriggersTools.FileFind NuGet&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I had to recreate file enumeration in WinDirStat because of a large number of flaws with the .NET implementation, including enumeration exceptions and slow speed due to waste of resources. This library allows traversing a Windows file tree in many different orders while avoiding security exceptions and wasting time on checks that don’t need to be made. This also has the option of returning the actual file information acquired during the file enumeration so that it doesn’t go to waste.&lt;/p&gt;

&lt;h2 id=&quot;triggerstoolsdirectorycasesensitivity-sep&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/TriggersTools.DirectoryCaseSensitivity&quot;&gt;TriggersTools.&lt;wbr /&gt;DirectoryCaseSensitivity (Sep)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/triggerstools-dircase.png&quot; alt=&quot;TriggersTools.DirectoryCaseSensitivity NuGet&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’d started fiddling with Windows Subsystem for Linux and wanted to look into API support for Windows 10’s new directory case-sensitivity functionality. Turns out there is no API for this in C#, or even in the Windows C API, we have to call low level &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Nt&lt;/code&gt; functions to get the proper info. I was able to whip up a C# API for getting this info, as well as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DirectoryInfo&lt;/code&gt; extension methods. You can check, change, and create directories with case sentivity of either type without having to go through native calls yourself.&lt;/p&gt;

&lt;h2 id=&quot;webscriptdisplay-sep&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/WebScriptDisplay&quot;&gt;WebScriptDisplay (Sep)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/webscriptdisplay.png&quot; alt=&quot;WebScriptDisplay Page&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I got a request from my Dad to write a small page to display the results of cgi scripts on an &lt;a href=&quot;https://en.wikipedia.org/wiki/OpenVMS&quot;&gt;OpenVMS&lt;/a&gt; server for his work. I took the specifications and created a basic HTML page with Javascript that is easily modified to extend or add support for more scripts. The CSS style came later, but it was definitely an improvement over that of no CSS style. Apparently it’s still on the server and in use today by other people, which is nice to hear.&lt;/p&gt;

&lt;h2 id=&quot;visual-novel-list-for-a-stats-freak-oct---present&quot;&gt;&lt;a href=&quot;/anime/visualnovellist/&quot;&gt;Visual Novel List for a Stats Freak (Oct - present)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/vnlist.png&quot; alt=&quot;Visual Novel List Page&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By this point in time, I had played a decent number of visual novels, and keeping a blog post in MAL with all the data up to date was getting to be a hastle. I disassembled the MAL list page and recreated it for visual novel display. All visual novel data is now stored in a json file that keeps stores all information needed to display the VN entry. This list made things so much easier to view, enter in, and compare.&lt;/p&gt;

&lt;p&gt;You can follow updates to this list by subscribing to the endless &lt;em&gt;Update vnlist.jsonc, Update vnlist.jsonc, Update vnlist.jsonc&lt;/em&gt; commits, that are absolutely flooding the commit history and burrying out anything meaningful.&lt;/p&gt;

&lt;h2 id=&quot;grisaia-sprite-viewer-nov---present&quot;&gt;&lt;a href=&quot;https://github.com/trigger-segfault/GrisaiaSpriteViewer&quot;&gt;Grisaia Sprite Viewer (Nov - present)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The first public post displaying the progress of the sprite viewer in alpha. A heaping mess that &lt;em&gt;just works&lt;/em&gt;.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/grisaia-sprite-viewer-alpha.png&quot; alt=&quot;Grisaia Sprite Viewer Alpha&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Grisaia Sprite Viewer is an ongoing project to create a program to view and manipulate in-game Grisaia sprites by taking all image parts and combining them into a single image. CatSystem2 games like Grisaia store their image parts in thounsands of different images that only get more and more specific as you go down the list of lighting, distance, pose, and blush level. Added with the fact that many characters use sprite parts differently, an entire data file was needed to keep track of how image parts are used and what they’re called. The Sprite Viewer didn’t make its first release until 2019, so more coverge of that will be shown in next year’s blog post.&lt;/p&gt;

&lt;h2 id=&quot;this-website-upgrade-nov---present&quot;&gt;&lt;a href=&quot;/&quot;&gt;This Website Upgrade (Nov - present)&lt;/a&gt;&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/site-header-small-2018.png&quot; alt=&quot;Site Header&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Before now, my personal GitHub Pages site was terribly underutilized and outright ignored most of the time. &lt;em&gt;It still is now,&lt;/em&gt; but at least it gets some updates besides &lt;em&gt;Update vnlist.jsonc&lt;/em&gt;. The previous iteration made use of my ancient Julia set Fractal Viewer program for the header so I decided to keep with this tradition, but go for a more minimal effect. The entire website’s theme is pretty much a copy of the Jekyll’s default Minima theme, but with some improvements and changes. There are also a few pages from the old site that stayed almost identical as they already had their own unique theme, such as the &lt;a href=&quot;/tools/rct2-tools/&quot;&gt;RCT2 Tools&lt;/a&gt; and the &lt;a href=&quot;/mods/trigger-cookies/&quot;&gt;TriggerCookies (dead) mod&lt;/a&gt;.&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Robert Jordan</name>
        
          <email>triggerstools@gmail.com</email>
        
        
      </author>

      
        <category term="[&quot;meta&quot;, &quot;dev&quot;, &quot;anime&quot;, &quot;gaming&quot;]" />
      

      
        <category term="wrap-up" />
      
        <category term="pic" />
      

      
        <summary type="html">Part 2 of my 2018 End of Year Wrap-Up, covering all of 2018.</summary>
      

      
      
        
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://trigger-segfault.github.io/blog/assets/img/end-of-year-wrapup-2018.png" />
      
    </entry>
  
    <entry>
      <title type="html">2018: End of Year Wrap-Up (Part 1)</title>
      <link href="https://trigger-segfault.github.io/blog/2019/01/03/end-of-year-wrapup-2018-part-1/" rel="alternate" type="text/html" title="2018: End of Year Wrap-Up (Part 1)" />
      <published>2019-01-03T18:50:00+00:00</published>
      <updated>2019-01-03T18:50:00+00:00</updated>
      <id>https://trigger-segfault.github.io/blog/2019/01/03/end-of-year-wrapup-2018-part-1</id>
      <content type="html" xml:base="https://trigger-segfault.github.io/blog/2019/01/03/end-of-year-wrapup-2018-part-1/">&lt;h2 id=&quot;with-special-guest-second-half-of-2017&quot;&gt;&lt;em&gt;With special guest:&lt;/em&gt; Second half of 2017&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/end-of-year-wrapup-2018.png&quot; alt=&quot;Preview of 2018&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now that I have a blog and feel obligated to post things. Let’s follow in &lt;a href=&quot;https://blog.huguesross.net/2018/12/2018-end-of-year-wrap-up.html&quot;&gt;my friend’s footsteps&lt;/a&gt; and create a wrap-up of this years development (and a little bit of last year’s since a lot went on then too).&lt;/p&gt;

&lt;h1 id=&quot;2017&quot;&gt;2017&lt;/h1&gt;

&lt;h2 id=&quot;terraria-tools-aug---september&quot;&gt;Terraria Tools (Aug - September)&lt;/h2&gt;

&lt;p&gt;In late 2017, I pumped out 7 different Terraira tools with different functionality. Although they were built in released in quick succession, I don’t feel that any of them were really rushed.&lt;/p&gt;

&lt;h3 id=&quot;terraria-midi-player-aug-9th&quot;&gt;&lt;a href=&quot;https://forums.terraria.org/index.php?threads/terraria-midi-player-play-songs-through-terrarian-instruments.61257/&quot;&gt;Terraria Midi Player (Aug 9th)&lt;/a&gt;&lt;/h3&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/terraria-midi-player.png&quot; alt=&quot;Terraria Midi Player Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Starting in July of 2017, I got the idea of playing midi’s through Terraria’s instruments. These instruments function by playing a note based on the distance of the mouse click from the player, which a range of 2 octaves and a high C. I originally looked into doing it through TSA tools but realized programming my own solution would be a lot easier. Through the development of the tool I made 3 videos presenting the potential of the tool, including multiple-musician performances.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;Below are the tools in their early stages before they were anywhere close to complete.&lt;/p&gt;

&lt;div class=&quot;video-inline-container&quot;&gt;
  &lt;div class=&quot;video-container inline left&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/NsOI2k8nKbQ&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
  &lt;div class=&quot;video-container inline spacing&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;video-container inline right&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/BAXK9uwE_BI&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;The culmination of the tool was creating a performance of one of my favorite retro songs, Tal Tal Heights.&lt;/p&gt;

&lt;div class=&quot;video-inline-container&quot;&gt;
    &lt;div class=&quot;video-container inline center&quot;&gt;
      &lt;iframe src=&quot;https://www.youtube.com/embed/rP4O6BsBEh0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;h3 id=&quot;terraria-item-modifier-aug-23rd&quot;&gt;&lt;a href=&quot;https://forums.terraria.org/index.php?threads/terraria-item-modifier-a-patch-for-advanced-item-customization.61419/&quot;&gt;Terraria Item Modifier (Aug 23rd)&lt;/a&gt;&lt;/h3&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/terraria-item-modifier.png&quot; alt=&quot;Terraria Item Modifier Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In accordance with playing faster notes with Terraria Midi Player, I created a patcher for the purpose of decreasing instrument use-time. I based my code off of &lt;a href=&quot;https://forums.terraria.org/index.php?threads/1-3-terrariapatcher-plugins-and-more-works-with-tmodloader-now.24615/&quot;&gt;TerrariaPatcher&lt;/a&gt; and continued from there. Aside from the terrible choice in name due to &lt;a href=&quot;https://terraria.gamepedia.com/Modifiers&quot;&gt;Item Modifiers&lt;/a&gt; being a thing in-game. This tool does its job well.&lt;/p&gt;

&lt;h3 id=&quot;tconvert-aug-30th&quot;&gt;&lt;a href=&quot;https://forums.terraria.org/index.php?threads/tconvert-extract-content-files-and-convert-them-back.61706/&quot;&gt;TConvert (Aug 30th)&lt;/a&gt;&lt;/h3&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/tconvert.png&quot; alt=&quot;TConvert Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;TConvert was my attempt to take the existing tool, TExtract, and add an extra layer of being able to convert images and assets back to the original &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.xnb&lt;/code&gt; format. TExtract had been experiencing bugs for awhile with no contact from the author, so eventually TConvert was replaced in the Tools &amp;amp; Modifications pinned posts section.&lt;/p&gt;

&lt;p align=&quot;center&quot; class=&quot;figure-text&quot;&gt;Using TConvert and Terraria Item Modifier (for placing pots), I created the assets to make this video.&lt;/p&gt;

&lt;div class=&quot;video-inline-container&quot;&gt;
    &lt;div class=&quot;video-container inline center&quot;&gt;
      &lt;iframe src=&quot;https://www.youtube.com/embed/n8VMKrh0Bsc&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;h3 id=&quot;quick-wave-bank-sep-7th&quot;&gt;&lt;a href=&quot;https://forums.terraria.org/index.php?threads/quick-wave-bank-an-easy-no-hassle-wave-bank-creator.61813/&quot;&gt;Quick Wave Bank (Sep 7th)&lt;/a&gt;&lt;/h3&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/quick-wave-bank.png&quot; alt=&quot;Quick Wave Bank Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the past, creating Wave Banks for Terraria was a long and tiresome project. There were tons of prerequisites to install and even then, adding and ordering songs was tough. This tool simplified the process by taking the underlying tool &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XactBld3.exe&lt;/code&gt; and running it through the program after generating a project file automatically.&lt;/p&gt;

&lt;p&gt;I’m currently unhappy with the UI layout for how to add songs to the list. They can be reorganized, but songs can’t be put at, say, index 30 if you only have 20 tracks added.&lt;/p&gt;

&lt;h3 id=&quot;terraria-rupee-replacer-sep-10th&quot;&gt;&lt;a href=&quot;https://forums.terraria.org/index.php?threads/rupee-replacer-change-coins-into-rupees-vanilla-tmodloader.61916/&quot;&gt;Terraria Rupee Replacer (Sep 10th)&lt;/a&gt;&lt;/h3&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/terraria-rupee-replacer.png&quot; alt=&quot;Terraria Rupee Replacer Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By far my favorite Terraria Tool created: Terraria Rupee Replacer does what it says on the tin, it replaces all instances of coins with Rupees. You have the ability to choose your own color set and optionally modify other assets that mention coins. Any mention of coins in the language packs has been replaced. This was a much more difficult patcher to implement than Terraria Item Modifier. There were many more functions that required hooking into, and getting the coin glow was especially tough.&lt;/p&gt;

&lt;p style=&quot;display: flex; justify-content: center; flex-wrap: wrap;&quot;&gt;&lt;img src=&quot;/blog/assets/img/rupee-pickup.gif&quot; alt=&quot;Rupee Pickup&quot; /&gt; &lt;img src=&quot;/blog/assets/img/rupee-coin-portal.gif&quot; alt=&quot;Rupee Coin Portal&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;terraria-localization-packer-sep-13th&quot;&gt;&lt;a href=&quot;https://forums.terraria.org/index.php?threads/localization-packer-unpack-and-repack-terraria-translation-files.61972/&quot;&gt;Terraria Localization Packer (Sep 13th)&lt;/a&gt;&lt;/h3&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/terraria-localization-packer.png&quot; alt=&quot;Terraria Localization Packer Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This was a small little tool I decided to create after Terraria Rupee Replacer thanks to my experience in delving into the localization files for replacing all mentions of coins with Rupees.&lt;/p&gt;

&lt;h3 id=&quot;terra-launcher-sep-24th&quot;&gt;&lt;a href=&quot;https://forums.terraria.org/index.php?threads/terra-launcher-a-hub-terraria-games-servers-tools-with-save-folder-modification.62315/&quot;&gt;Terra Launcher (Sep 24th)&lt;/a&gt;&lt;/h3&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/terra-launcher.png&quot; alt=&quot;Terra Launcher Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Because of my patcher programs that relied on modifying the game and associated saves, I wanted a way to access &lt;em&gt;different Terrarias&lt;/em&gt; without having to shift around my save folders all the time. The solution was a launcher where you just enter in the versions of Terraria you have and enter the save directory (which gets set through command line arguments). I also added the option for storing different server configurations as well as tools for the game. With the tool feature even having the ability to open up a project file for that tool if you have that path entered in.&lt;/p&gt;

&lt;h2 id=&quot;rollercoaster-tycoon-2-work&quot;&gt;RollerCoaster Tycoon 2 Work&lt;/h2&gt;

&lt;p&gt;I got back into RollerCoaster Tycoon 2 again by tackling the upgrading of my existing RCT2 Tools with WPF variants. This later lead me back to my second round of OpenRCT2 contributions.&lt;/p&gt;

&lt;h3 id=&quot;rct2-tools-wpf-edition-oct---nov&quot;&gt;RCT2 Tools: WPF Edition (Oct - Nov)&lt;/h3&gt;

&lt;p&gt;I created a whole new library for WPF controls that looked like RCT2 controls. It works terribly in the designer, but well during runtime. These tools were never finished, or released, but I may as well upload what &lt;em&gt;has&lt;/em&gt; been done to GitHub. I tried to rebuild them today and found out that the Pixel Shader BuildTask extension for Visual Studio was gone from CodePlex. Thankfully I managed to extract it from the archive, thanks to the help of &lt;a href=&quot;https://github.com/galatrash/CodePlexArchiveExtractor&quot;&gt;CodePlexArchiveExtractor&lt;/a&gt;. Seriously this tool is a life saver.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wpf-maze-generator.png&quot; alt=&quot;WPF Maze Generator Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The maze generator was by far the most difficult tool to build because WPF refuses to perform pixel graphics operations efficiently with a passion. I included a ton of new features, my favorite being the maze and entrance textures.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wpf-water-creator.png&quot; alt=&quot;WPF Water Creator Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The water creator went through an overhaul of its own with Paint.NET like color sliders and color shifting to help quickly bang out new water colors without much trouble.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/blog/assets/img/wpf-steam-stub.png&quot; alt=&quot;WPF Steam Stub Window&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Steam stub added support for all RollerCoaster Tycoon games, including classic. Along with the ability to customize the launcher setup.&lt;/p&gt;

&lt;h3 id=&quot;openrct2-contributions-part-2-oct---nov&quot;&gt;&lt;a href=&quot;/games/openrct2#contributions-2017&quot;&gt;OpenRCT2 Contributions: part 2 (Oct - Nov)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;For the second time, I ended up adding my own contributions to OpenRCT2 and fixing a few bugs (most notably viewport scrolling). I spent a heavy amount of time on the Title Sequence Editor since I had left it a mess previously.&lt;/p&gt;

&lt;p&gt;Because this information is already well documented, &lt;a href=&quot;/games/openrct2/#contributions-2017&quot;&gt;all contributions in 2017 can be found here.&lt;/a&gt;&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;/games/openrct2/assets/img/park-entrance-path.gif&quot; alt=&quot;OpenRCT2 Place Path over Entrances&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;2018&quot;&gt;2018&lt;/h1&gt;

&lt;p&gt;2018’s coverage is continued in the &lt;em&gt;long overdue&lt;/em&gt; &lt;a href=&quot;/blog/2019/05/05/end-of-year-wrapup-2018-part-2/&quot;&gt;2018: End of Year Wrap-Up (Part 2)&lt;/a&gt;.&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Robert Jordan</name>
        
          <email>triggerstools@gmail.com</email>
        
        
      </author>

      
        <category term="[&quot;meta&quot;, &quot;dev&quot;, &quot;gaming&quot;]" />
      

      
        <category term="wrap-up" />
      
        <category term="pic" />
      

      
        <summary type="html">Following in my friend's footsteps, I'm creating my own end of the year wrap-up, covering what I've done over what feels like an extremely long time period. This covers the second half a 2017 where a lot went on.</summary>
      

      
      
        
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://trigger-segfault.github.io/blog/assets/img/end-of-year-wrapup-2018.png" />
      
    </entry>
  
    <entry>
      <title type="html">First Post!</title>
      <link href="https://trigger-segfault.github.io/blog/2018/11/14/first-post/" rel="alternate" type="text/html" title="First Post!" />
      <published>2018-11-14T17:50:00+00:00</published>
      <updated>2018-11-14T17:50:00+00:00</updated>
      <id>https://trigger-segfault.github.io/blog/2018/11/14/first-post</id>
      <content type="html" xml:base="https://trigger-segfault.github.io/blog/2018/11/14/first-post/">&lt;p&gt;Now that I’m running my GitHub Pages site through Jekyll, I may as well take advantage of the blog feature and update this thing every so often. So, have a blog post about my first post. :)&lt;/p&gt;

&lt;p&gt;Editing out the text “Pic” in this CG took quite some time. But I’m happy with the result, even if you can clearly see it’s modified near the “o” in “Post”. Source is &lt;a href=&quot;https://vndb.org/v7723&quot;&gt;Grisaia no Meikyuu&lt;/a&gt;.&lt;/p&gt;

&lt;p align=&quot;center&quot; width=&quot;512&quot;&gt;&lt;img src=&quot;/blog/assets/img/first-post-michiru-yuuji.png&quot; alt=&quot;First Post Hype CG&quot; /&gt;&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Robert Jordan</name>
        
          <email>triggerstools@gmail.com</email>
        
        
      </author>

      
        <category term="[&quot;meta&quot;, &quot;anime&quot;]" />
      

      
        <category term="first-post" />
      
        <category term="pic" />
      

      
        <summary type="html">Now that I'm running my GitHub Pages site through Jekyll, I may as well take advantage of the blog feature...</summary>
      

      
      
        
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://trigger-segfault.github.io/blog/assets/img/first-post-michiru-yuuji.png" />
      
    </entry>
  
</feed>