<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Z Space Blog - Projects</title><link href="https://zlg.space/blog/" rel="alternate"/><link href="https://zlg.space/blog/feeds/c/projects.atom.xml" rel="self"/><id>https://zlg.space/blog/</id><updated>2022-12-12T21:25:00-08:00</updated><entry><title>Box Pusher » Level Data for Solvers</title><link href="https://zlg.space/blog/box-pusher-level-data-for-solvers.html" rel="alternate"/><published>2022-09-12T22:17:00-07:00</published><updated>2022-09-13T21:37:00-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2022-09-12:/blog/box-pusher-level-data-for-solvers.html</id><summary type="html">&lt;p&gt;Back in 2012, I bought this cute little game called &lt;em&gt;Box Pusher&lt;/em&gt; [DSi]. It
features gameplay from a 1982 game called &lt;a href="https://en.wikipedia.org/wiki/Sokoban"&gt;Sokoban&lt;/a&gt;. In Sokoban, you
are a warehouse worker and push boxes around an enclosed area onto target
squares. This is the entirety of its gameplay. Think of ye olden Zelda block
puzzle, on crack, and you get Sokoban. Box Pusher contains 250 levels worth
of this craziness, and features a level editor, in case that's not enough box
pushing for you. It was certainly enough for me. But, you don't have to do the
work needed to get some Box Pusher solutions; I did it for you!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://files.zlg.space/s/jWYwyFSBMtXCaCi"&gt;Box Pusher » Level Data for Solvers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hook it up to a solver, and you're good to go! Putting this together was a
journey.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Back in 2012, I bought this cute little game called &lt;em&gt;Box Pusher&lt;/em&gt; [DSi]. It
features gameplay from a 1982 game called &lt;a href="https://en.wikipedia.org/wiki/Sokoban"&gt;Sokoban&lt;/a&gt;. In Sokoban, you
are a warehouse worker and push boxes around an enclosed area onto target
squares. This is the entirety of its gameplay. Think of ye olden Zelda block
puzzle, on crack, and you get Sokoban. Box Pusher contains 250 levels worth
of this craziness, and features a level editor, in case that's not enough box
pushing for you. It was certainly enough for me. But, you don't have to do the
work needed to get some Box Pusher solutions; I did it for you!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://files.zlg.space/s/jWYwyFSBMtXCaCi"&gt;Box Pusher » Level Data for Solvers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hook it up to a solver, and you're good to go! Putting this together was a
journey.&lt;/p&gt;


&lt;p&gt;About halfway through the puzzles, I realized "I'm an adult and have other shit
I want to do. It'd be cool to beat this game, though." So I decided to make it
a little fun, and use Sokoban solvers. I used a combination of &lt;a href="https://www.sokoban-online.de/"&gt;JSoko&lt;/a&gt;,
&lt;a href="https://computerpuzzle.net/english/sokoban/ver740/index.html"&gt;takaken's Sokoban Solver&lt;/a&gt;, and &lt;a href="https://sourceforge.net/projects/sokobanyasc/"&gt;YASC Solver&lt;/a&gt; to get solutions. I
then used JSoko's optimizer to shorten those solutions. Between these tools and
a few strays that I was able to solve on my own, it only took raw determination
to see it through.&lt;/p&gt;
&lt;h1&gt;Building the Levels&lt;/h1&gt;
&lt;p&gt;The first part of this task was transcription. I started this project in March
of 2022. Due to the game's design of only allowing you to play 5 levels at a
time, I had to rely on the small level previews (and my phone camera's zoom) to
get level layouts ahead of where I was, or solve puzzles as I transcribed. It
was an arduous process, but Vim's &lt;code&gt;virtualedit&lt;/code&gt; setting was a huge time saver.
It allows you to move the cursor anywhere in the buffer, which is key to making
text-based diagram creation approachable.&lt;/p&gt;
&lt;p&gt;To make matters worse, my &lt;a href="http://typematrix.com"&gt;TypeMatrix&lt;/a&gt; Dvorak keyboard got a sticky key and
I was unsuccessful in reassembling it after I cleaned it, damaging the keyboard.
I tried everything I knew to do to keep the silicone/rubber membrane to stay in
place; even glue, but in the end, the key is permanently mushy. Unusable to me,
so I kept it around for parts. Being stuck back on a staggered, QWERTY keyboard
sucks, but I'm glad that the muscle memory is still there.&lt;/p&gt;
&lt;p&gt;Getting back to the game, I enjoyed the variety of skins and music, and the
camera options are cool, too. Ultimately, I feel like the game has way too
much content, and some puzzles are really similar. A better curated set of 100
puzzles would be more palatable, and a more realistic goal for someone to meet.
Perhaps that wasn't the goal in developing Box Pusher, though. If you are a
hardcore Sokoban player, Box Pusher has it in spades! As it turns out, I'm not
super into Sokoban.&lt;/p&gt;
&lt;h1&gt;Sharing the File and Looking Back&lt;/h1&gt;
&lt;p&gt;I appear to be the only person out there who's finished this game. I wasn't able
to find any guides, FAQs, solution lists, blog posts, &lt;em&gt;nothing&lt;/em&gt; to indicate
anyone else had played or beaten it. To remedy that, I'm sharing &lt;a href="https://files.zlg.space/s/jWYwyFSBMtXCaCi"&gt;a text file
containing level layouts for Box Pusher, in machine-readable form&lt;/a&gt;,
ready for use by all the major Sokoban solvers.&lt;/p&gt;
&lt;p&gt;Comments at the top of the file contain advice for usage, and certain levels are
commented where I had issue with the solvers. Level 225 and 232 are particularly
rough for solvers. None of the solvers that I ran against those levels produced
a result, even after 2 hours of running. I ended up following the solution shown
in-game by using a solution credit, recording it with my phone, and playing it
back at 0.25x speed so I could follow it. Publishing solutions would require me
to do 250 puzzles again, and that's just &lt;em&gt;not happening&lt;/em&gt;. I've seen enough
variations of UDLR to make my head spin.&lt;/p&gt;
&lt;p&gt;Despite the slog of completing the puzzles, I did appreciate the different
strategies required to solve the levels, and I got to learn about an entire
hobby group that uses automation not only just to solve levels, but to gain
knowledge of AI techniques and get programming practice. Some levels were solved
lightning fast in one solver, but timeout in another. It appears that Sokoban is
a game that requires an adaptable AI that relies on numerous algorithms to make
its choices, to get best results. Single algorithms can work, too, but it was
the variety in algorithms that helped me clear &lt;em&gt;Box Pusher&lt;/em&gt;'s levels.&lt;/p&gt;
&lt;h1&gt;Final Thoughts&lt;/h1&gt;
&lt;p&gt;I think parallel processing would improve the solvers that are the current
state of the art. The most I could get for a solver were 2 threads! I have a
6-core, 12-thread CPU. How much faster could I have solved these, if I had a few
cores assigned to a few algorithms, so they could all "compete"? Threading is a
hard thing to program correctly, so I understand why someone might want to keep
things simpler. Perhaps next-gen solvers will integrate parallel computing in
some way, to improve performance for modern hardware.&lt;/p&gt;
&lt;p&gt;Please enjoy using this file to solve Box Pusher levels! Big thanks to the 
hackers putting together solvers for the rest of us to use. My file would be 
useless without them.&lt;/p&gt;</content><category term="Projects"/><category term="Video Games"/><category term="Guides"/><category term="Nintendo DSi"/><category term="Sokoban"/></entry><entry><title>CleanSilver - A clean, simple Fluxbox theme</title><link href="https://zlg.space/blog/cleansilver-a-clean-simple-fluxbox-theme.html" rel="alternate"/><published>2013-02-26T12:11:29-08:00</published><updated>2022-06-09T00:46:00-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2013-02-26:/blog/cleansilver-a-clean-simple-fluxbox-theme.html</id><content type="html">&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="https://files.zlg.space/s/nZTKWPxYsZdgMFM"&gt;CleanSilver v0.2 tar.gz&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/p&gt;
&lt;p&gt;&lt;a href="http://fluxbox.org"&gt;Fluxbox&lt;/a&gt; is my favorite stacking window manager. One of its 
best features is its customizability. CleanSilver is the first full theme
I've created for Fluxbox. It even has the LHalf and RHalf buttons that were
released with Fluxbox 1.3.5! Here's a preview:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A preview image of CleanSilver" src="https://zlg.space/blog/images/cleansilver_prev.png" title="The  CleanSilver theme combines blue headings with silver window dressing and simple  icons."&gt;&lt;/p&gt;</content><category term="Projects"/><category term="Fluxbox"/><category term="Themes"/></entry><entry><title>Metroid Zero Mission » Zebes Map</title><link href="https://zlg.space/blog/metroid-zero-mission-zebes-map.html" rel="alternate"/><published>2012-11-14T06:26:41-08:00</published><updated>2022-12-12T21:25:00-08:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2012-11-14:/blog/metroid-zero-mission-zebes-map.html</id><content type="html">&lt;p&gt;I recently got into the speedrunning scene and decided that my first serious
speedrunning game would be &lt;em&gt;Metroid Zero Mission&lt;/em&gt;. One of the most important
aspects of speedrunning Metroid games is planning your route through the game.
Logically, it's important to have an accurate and useful map, often more
informative than the in-game map. Years ago, I made a simple map for &lt;abbr title="Metroid Zero Mission"&gt;MZM&lt;/abbr&gt; that
was designed to be printed and display the expansions, nothing more.&lt;/p&gt;
&lt;p&gt;Revisiting it with a new goal for route planning in mind, I present to you the
map of Zebes for &lt;abbr title="Metroid Zero Mission"&gt;MZM&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://files.zlg.space/s/rozPPcMrnzz4k9k"&gt;Metroid Zero Mission » Zebes Map&lt;/a&gt; (864 × 1216 pixels, 84 KB)&lt;/p&gt;
&lt;p&gt;The entire image was self-made except for the Creative Commons license indicator
in the bottom right. The only information it's lacking are indicators for which
power-ups you need to get past certain areas. To be honest, if I added that
information the resolution would be doubled, easily. I have also omitted boss
icons (for now), since all speedrunners know where the bosses are. :)&lt;/p&gt;
&lt;p&gt;If you want to distribute it, I don't mind as long as the file is unaltered and
I'm informed of where it was posted. It's cool to see where it ends up!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022-12-12 UPDATE:&lt;/strong&gt; The text that I made for this map ended up inspiring the 
styling of the 'ZLG' logo! &lt;a href="https://zlg.space/blog/handcrafted-svg.html"&gt;Check out my post on the 
subject.&lt;/a&gt;&lt;/p&gt;</content><category term="Projects"/><category term="GameBoy Advance"/><category term="Guides"/><category term="Metroid"/><category term="Pixel Art"/><category term="Video Games"/></entry><entry><title>Izuna: Legend of the Unemployed Ninja » Advanced Gameplay Guide</title><link href="https://zlg.space/blog/izuna-legend-of-the-unemployed-ninja-advanced-gameplay-guide.html" rel="alternate"/><published>2012-09-23T18:15:45-07:00</published><updated>2022-07-28T19:36:00-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2012-09-23:/blog/izuna-legend-of-the-unemployed-ninja-advanced-gameplay-guide.html</id><content type="html">&lt;p&gt;&lt;em&gt;Izuna: Legend of the Unemployed Ninja&lt;/em&gt; is a fun roguelike produced by Success 
and published by Atlus. Like most roguelikes, &lt;em&gt;Izuna&lt;/em&gt; is tough and comes with 
its own system of advancement. At first glance, it's not clear how to improve 
one's equipment. A friend and I sat down and tried to locate some more specific 
information on the game, and came up empty-handed. In typical fashion, I 
proposed that we figure it out and make our findings available to others. The 
result is this guide!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://files.zlg.space/s/qoecAi8GQtpFFFG"&gt;Izuna: Legend of the Unemployed Ninja » Advanced Gameplay Guide&lt;/a&gt;, 
version 1.2 — updated 2011-10-15.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022-07-28 UPDATE:&lt;/strong&gt; I'm quite proud of this guide, and fondly remember the 
time I spent with said friend.&lt;/p&gt;</content><category term="Projects"/><category term="Nintendo DS"/><category term="Guides"/><category term="Video Games"/></entry><entry><title>Mario Kart DS » Game Mechanics Guide</title><link href="https://zlg.space/blog/mario-kart-ds-game-mechanics-guide.html" rel="alternate"/><published>2012-09-23T18:11:25-07:00</published><updated>2012-09-23T18:11:25-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2012-09-23:/blog/mario-kart-ds-game-mechanics-guide.html</id><content type="html">&lt;p&gt;When &lt;em&gt;Mario Kart DS&lt;/em&gt; was released in 2005, I was impressed by the amount of 
detail in each kart's stats. As I began playing more seriously and taking part 
in Nintendo's first global online game, it was clear to me that there was more 
than meets the eye and somebody needed to cover it. Thus, the Game Mechanics 
Guide was born. It enjoyed some mild popularity on GameFAQs and Neoseeker while 
I was a part of those communities.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://files.zlg.space/s/Jz8B422rammCyaJ"&gt;Mario Kart DS » Game Mechanics Guide&lt;/a&gt;, version 1.7 — updated 
2011-10-15.&lt;/p&gt;</content><category term="Projects"/><category term="Nintendo DS"/><category term="Guides"/><category term="Mario Kart"/><category term="Video Games"/></entry><entry><title>Sporkblog 2.0 released!</title><link href="https://zlg.space/blog/sporkblog-20-released.html" rel="alternate"/><published>2012-07-03T03:48:51-07:00</published><updated>2012-07-03T03:48:51-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2012-07-03:/blog/sporkblog-20-released.html</id><content type="html">&lt;p&gt;Today marks the second full version of Sporkblog, which I've been aiming for
since &lt;em&gt;October 19th, 2009&lt;/em&gt;! Almost 3 years and 61 commits later, Sporkblog has
come a long way. It's a bit easier to work on, for starters. The source is still
a bit messy, but the implementation is somewhat correct, and it's not hard to
figure out which files are associated with each view. The majority of the time
spent between commits was spent thinking about the best way to implement each
feature (that is, when life wasn't getting in the way).&lt;/p&gt;
&lt;p&gt;So, how far has Sporkblog come in real, "tangible" ways? Well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It has an installer, so you don't have to manually setup the database;&lt;/li&gt;
&lt;li&gt;The Atom feed generator works for all three major views instead of just one;&lt;/li&gt;
&lt;li&gt;Commenting actually works;&lt;/li&gt;
&lt;li&gt;There's a site editor, so settings can be modified as needed;&lt;/li&gt;
&lt;li&gt;The templates are built with HTML 5, so it's future-proof for a while and allows for awesome themes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm happy to have finally reached the 2.0 goal. There are still plenty of small
quirks that need to be worked out, but it's still ready for regular use and
hacking.&lt;/p&gt;</content><category term="Projects"/><category term="Sporkblog"/></entry><entry><title>Etrian Odyssey » Class Skill Trees</title><link href="https://zlg.space/blog/etrian-odyssey-class-skill-trees.html" rel="alternate"/><published>2011-10-15T08:09:53-07:00</published><updated>2011-10-15T08:09:53-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2011-10-15:/blog/etrian-odyssey-class-skill-trees.html</id><content type="html">&lt;p&gt;I've been playing &lt;em&gt;Etrian Odyssey&lt;/em&gt; and was looking around for
skill trees so I could plan a proper party. Nowhere I looked offered what I was
looking for, so I gathered the data and made my own diagrams! After a little
sprucing up, it turned into a FAQ.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://files.zlg.space/s/stPRgitCS6z722q"&gt;Etrian Odyssey » Class Skill Trees&lt;/a&gt;, ver. 1.1 — updated 2012-08-06&lt;/p&gt;
&lt;p&gt;It features fairly easy-to-read diagrams and skill cost highlights so you can
plan your skill spreads accordingly. Enjoy.&lt;/p&gt;</content><category term="Projects"/><category term="Nintendo DS"/><category term="Etrian Odyssey"/><category term="Guides"/><category term="Video Games"/></entry><entry><title>Dupekill - Remove duped content</title><link href="https://zlg.space/blog/dupekill-remove-duped-content.html" rel="alternate"/><published>2009-12-16T14:19:06-08:00</published><updated>2022-06-04T23:31:00-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2009-12-16:/blog/dupekill-remove-duped-content.html</id><content type="html">&lt;p&gt;&lt;a href="https://git.zlg.space/dupekill"&gt;Dupekill Project Page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dupekill started out as a quick-and-dirty Python script to get rid of duplicate 
files in a directory of sounds that a friend and I had ripped from a video game. 
When we were writing it, I realized that I hadn't seen any apps out there that 
did what we were doing, so I asked him if I could take his code and improve upon 
it. He obliged, and over the winter of 2011 I turned the script into Dupekill.&lt;/p&gt;
&lt;p&gt;It is now over 10 times faster than the first incarnation, can recurse into
subdirectories, can be configured to ignore symlinks and shortcuts, and features
a "dry run" to show the user which files would be deleted. I've used it on my
own files and have tested it extensively. It does exactly what we set out to do,
and I hope someone out there finds it useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022-06-04 Update:&lt;/strong&gt; There are improvements planned for future releases, 
including interactive choice per-file of which to keep, and options to choose 
for &lt;em&gt;all&lt;/em&gt; conflicts, via command-line flags. No promises, but there are plans!&lt;/p&gt;</content><category term="Projects"/><category term="Python"/><category term="Command Line"/></entry><entry><title>Sporkblog - Blogging simplified</title><link href="https://zlg.space/blog/sporkblog-blogging-simplified.html" rel="alternate"/><published>2009-09-08T17:32:55-07:00</published><updated>2022-06-04T21:12:00-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2009-09-08:/blog/sporkblog-blogging-simplified.html</id><content type="html">&lt;p&gt;&lt;strong&gt;2022-06-04 UPDATE:&lt;/strong&gt; Sporkblog is effectively dead. I would be interested in
pursuing a more modern version of Sporkblog, cleaning up the core components.
It can occupy the solution space between static site generators and Wordpress.
Please contact me if you are interested in collaborating on this goal.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://git.zlg.space/sporkblog"&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sporkblog started as my first foray into web development. I began work on it in
2008, and quickly learned that the trick to software development is building
something in a way that allows you to &lt;em&gt;understand it&lt;/em&gt; when you come back to
it. Months after finishing Sporkblog's first version, I came back to it and
discovered that I had failed. It was a mess, and I needed to clean it up.&lt;/p&gt;
&lt;p&gt;I began Sporkblog's next iteration, and with it I held onto some principles that 
I believed were most important. I decided that the blog should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Be easy to navigate, without superfluous information;&lt;/li&gt;
&lt;li&gt;Have easy-to-read source, so hacking can be done somewhat easily;&lt;/li&gt;
&lt;li&gt;Have well-designed HTML so themes can be made with little effort;&lt;/li&gt;
&lt;li&gt;Allow visitors to comment without a distorted image CAPTCHA or registering an 
  account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also put Sporkblog under Git revision and started learning better project 
management habits.&lt;/p&gt;
&lt;p&gt;In July 2012, Sporkblog's second version was released. It included all of the 
functionality I considered necessary in a blog, and good enough to run my 
personal website on. There are still some improvements left that I believe need 
to be made, but it's ready to be hacked on.&lt;/p&gt;</content><category term="Projects"/><category term="Sporkblog"/><category term="PHP"/></entry><entry><title>Sporkblog Launches!</title><link href="https://zlg.space/blog/sporkblog-launches.html" rel="alternate"/><published>2009-01-09T23:50:25-08:00</published><updated>2022-06-10T00:00:00-07:00</updated><author><name>zlg</name></author><id>tag:zlg.space,2009-01-09:/blog/sporkblog-launches.html</id><content type="html">&lt;p&gt;After a few months of working on and off on a blog source that follows my
sensibilities, Sporkblog has reached its first release. It isn't a stable 1.0
yet, but it's good enough for me to start dogfooding it.&lt;/p&gt;
&lt;p&gt;Sporkblog is a very simplistic and intuitive blog source that allows a blog
to turn into a more traditional style website, with the added flexibility and
power of the weblog publishing methodology. The navigation of Sporkblog is
easily manipulated; you create tags as you create content. From there, you can
assign certain tags to be displayed in the navigation, and any posts under the
"Navpage" tag will automatically be displayed in the navigation under "Pages".&lt;/p&gt;
&lt;p&gt;This allows your typical Contact, About, and other similar pages to be displayed
in a page all to themselves while maintaining the section-based content
heirarchy. Couple it with the power of tags and you have a website whose
structure can fit anyone's needs.&lt;/p&gt;
&lt;p&gt;In time, I hope to better develop Sporkblog and provide another alternative
for blogging and website publishing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022-06-10 Update:&lt;/strong&gt; This is the oldest post on the blog. I've kept it to
remind me of where the site's purpose came from, and to appreciate how far it's
come since then. Looking over these old posts has given me a fresher perspective
on my own body of work.&lt;/p&gt;</content><category term="Projects"/><category term="Sporkblog"/><category term="PHP"/></entry></feed>