<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>fuzzy notepad - release</title><link href="https://eev.ee/" rel="alternate"></link><link href="https://eev.ee/feeds/release.atom.xml" rel="self"></link><id>https://eev.ee/</id><updated>2020-11-30T16:44:00-08:00</updated><entry><title>Cherry Kisses, on Steam</title><link href="https://eev.ee/release/2020/11/30/cherry-kisses-on-steam/" rel="alternate"></link><published>2020-11-30T16:44:00-08:00</published><updated>2020-11-30T16:44:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2020-11-30:/release/2020/11/30/cherry-kisses-on-steam/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Cherry Kisses title screen, showing Cerise at a counter" src="https://eev.ee/media/release/cherry-kisses.png"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://store.steampowered.com/app/1259530/"&gt;&lt;strong&gt;Steam release&lt;/strong&gt;&lt;/a&gt;&lt;br/&gt;
🔗 &lt;a href="https://eevee.itch.io/cherry-kisses"&gt;&lt;strong&gt;itch release&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Whoops!  I meant to write about this when it originally came out, &lt;em&gt;in April&lt;/em&gt;, but never quite got around to collecting my thoughts.  Here is a very rushed subset of them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The game is extremely &lt;span class="caps"&gt;NSFW&lt;/span&gt;&lt;/strong&gt;, but the commentary below is not.&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/cherry-kisses.png" alt="Cherry Kisses title screen, showing Cerise at a counter"&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://store.steampowered.com/app/1259530/"&gt;&lt;strong&gt;Steam release&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
🔗 &lt;a href="https://eevee.itch.io/cherry-kisses"&gt;&lt;strong&gt;itch&amp;nbsp;release&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Whoops!  I meant to write about this when it originally came out, &lt;em&gt;in April&lt;/em&gt;, but never quite got around to collecting my thoughts.  Here is a very rushed subset of&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The game is extremely &lt;span class="caps"&gt;NSFW&lt;/span&gt;&lt;/strong&gt;, but the commentary below is&amp;nbsp;not.&lt;/p&gt;


&lt;hr /&gt;
&lt;h2 id="the-game-itself"&gt;&lt;a class="toclink" href="#the-game-itself"&gt;The game&amp;nbsp;itself&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I like the game.  It&amp;#8217;s essentially a visual novel, but &lt;em&gt;disguised&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve played a decent number of visual novels, and I&amp;#8217;ve thought a lot about them and their role as kind-of-games, and I&amp;#8217;ve noticed the thorny bits that I don&amp;#8217;t like.  And my thoughts have circled around the notion of &lt;em&gt;player agency&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Agency is what makes a game feel like a game.  You have &lt;em&gt;input&lt;/em&gt;, in a broad sense.  You can do something to the game, and it will react appropriately (fingers&amp;nbsp;crossed).&lt;/p&gt;
&lt;p&gt;This theory explains the awkward position of visual novels.  The bulk of the experience is reading a passage, pressing spacebar, and &lt;span class="caps"&gt;GOTO&lt;/span&gt; 10.  You don&amp;#8217;t have meaningful input; pressing spacebar isn&amp;#8217;t a decision, it&amp;#8217;s&amp;nbsp;scrolling.&lt;/p&gt;
&lt;p&gt;When you &lt;em&gt;do&lt;/em&gt; have input, it generally comes in the form of a menu.  But this doesn&amp;#8217;t feel like you&amp;#8217;re &lt;em&gt;making&lt;/em&gt; a choice; it feels like one is being &lt;em&gt;extracted&lt;/em&gt; from you in the middle of an otherwise passive reading experience.  The base form of the game is reading, and that has been interrupted at a predetermined point to demand something of you.  You often don&amp;#8217;t have enough information to make a &lt;em&gt;meaningful&lt;/em&gt; choice, either, so this becomes a game of saving at each branch and performing an exhaustive depth-first search of the story.  As time goes on, you end up skipping through more and more of the early parts, and may hit a point where you go down a decision branch not even remembering what form the story took before you got&amp;nbsp;there.&lt;/p&gt;
&lt;p&gt;This is a weird&amp;nbsp;experience.&lt;/p&gt;
&lt;p&gt;I wanted to try to improve the feeling of a &lt;span class="caps"&gt;VN&lt;/span&gt; without altering the substance, so this one is disguised as an &lt;span class="caps"&gt;RPG&lt;/span&gt;.  I mean, not really an &lt;span class="caps"&gt;RPG&lt;/span&gt;, but that brand of top-down &amp;#8220;walk around and interact with stuff&amp;#8221;&amp;nbsp;framing.&lt;/p&gt;
&lt;p&gt;You play as Cerise, and the entire game takes place in her shop.  At any given time, zero or more customers are present, and you can either twiddle your thumbs at the counter or talk to one of them.  Whatever you do will generally advance time by an hour, which may change the set of customers; some folks left or arrived while you were busy doing something else.  And different folks have different reactions to being ignored, so the whole game becomes one large meta scheduling&amp;nbsp;puzzle.&lt;/p&gt;
&lt;p&gt;The thing is, this could&amp;#8217;ve been done just as well with a menu at the start of each hour, asking who you want to talk to.  The gameplay would&amp;#8217;ve been functionally identical.  But this scheme feels completely different (at least to me) for several&amp;nbsp;reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Instead of choices being &amp;#8220;on top of&amp;#8221; the prose, the prose is on top of the choices.  It feels like the choices you make &lt;em&gt;cause&lt;/em&gt; the prose to happen, rather than being forks in the middle of a river you can&amp;#8217;t escape.  You can wander around the shop as long as you like, taking breathers, and time will not pass until &lt;em&gt;you&lt;/em&gt;, the human at the controls, cause something to happen.  (You could say the same about a menu in a &lt;span class="caps"&gt;VN&lt;/span&gt;, but there you can&amp;#8217;t do anything &lt;em&gt;else&lt;/em&gt; either; the entire game is frozen until you interact with this modal&amp;nbsp;dialog.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can do other things.  Not &lt;em&gt;many&lt;/em&gt;, granted, but you can examine every single object in the shop, and they all have different descriptions (even if they look identical).  A typical visual novel doesn&amp;#8217;t give you the opportunity to go on frivolous tangents, but I think a big part of games is being able to forget about the progression for a minute and fuck around with something that looks interesting.  Stop and smell the roses, in this case&amp;nbsp;literally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A menu spells out all possible options with equal priority.  They&amp;#8217;re just items in a list, after all.  A physical world, on the other hand, can add subtle differences — choices may be more or less obvious, more or less compelling, or be presented in some way that adds to the narrative.  For example, while customers tend to show up at arbitrary spots throughout the shop, your girlfriend Lexy will wait for you right behind the counter, suggesting a more personal relationship even if you don&amp;#8217;t yet know who she is.  Or consider the ubiquitous option of ignoring &lt;em&gt;everyone&lt;/em&gt; in the shop and passing time at the counter instead.  That would usually be pointless, so it would be obnoxious to list in every single menu, but having it as an option in-world makes it less obvious&amp;#8230;  which is perfect puzzle fodder.  Just&amp;nbsp;saying.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As an added bonus, every character in the game has a &amp;#8220;happiness&amp;#8221; rating from -3 to 3.  If you can help them with their problems, their happiness will increase.  The numbers are largely arbitrary, but you do get a final score tally at the end, and that gives some sense of measured accomplishment that&amp;#8217;s more nuanced than a mere good/bad ending.  You can ignore it altogether and be happy with the story you got, &lt;em&gt;or&lt;/em&gt; you can go down the rabbit hole and try to find the unique path through the game that will make everyone happy and get you a perfect&amp;nbsp;score.&lt;/p&gt;
&lt;p&gt;These feel like really subtle design decisions that have an equally subtle impact on the experience.  I don&amp;#8217;t know what impact it had on anyone else, but &lt;em&gt;I&lt;/em&gt; really liked the results.  I didn&amp;#8217;t mind playing through the game a gazillion times while I was developing it, because it&amp;#8217;s just nice to play.  The story isn&amp;#8217;t especially deep, but it has a lot of little lighthearted interactions with a variety of characters, and sometimes different threads impact each other in really subtle ways.  Sometimes I ran across an interaction I&amp;#8217;d forgotten I&amp;#8217;d written!  It feels like the kind of story game that you &lt;em&gt;can&amp;#8217;t&lt;/em&gt; merely grind every ending out of, one that always has a chance to surprise you a&amp;nbsp;little.&lt;/p&gt;
&lt;p&gt;I still have other ideas for making narrative games that feel more player-controlled, so fingers crossed that I can pull them&amp;nbsp;off.&lt;/p&gt;
&lt;h2 id="steam-numbers-business"&gt;&lt;a class="toclink" href="#steam-numbers-business"&gt;Steam, numbers,&amp;nbsp;business&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the first game I&amp;#8217;ve put on Steam, a platform I&amp;#8217;ve long had mixed feelings about.  On the one hand, it&amp;#8217;s cool that video games have something like a package repository.  On the other hand, that package repository is owned and controlled by a single company that sits back and rakes in billions (30% off of every sale!) from a glorified &lt;span class="caps"&gt;FTP&lt;/span&gt; server, something that Linux distributions do for free.  And it&amp;#8217;s normalized casual &lt;span class="caps"&gt;DRM&lt;/span&gt;, which I do not enjoy.  (If I did it right, then manually running Cherry Kisses while Steam is closed should simply &lt;em&gt;run the game&lt;/em&gt; without interacting with Steam at&amp;nbsp;all.)&lt;/p&gt;
&lt;p&gt;On the other hand, I can&amp;#8217;t deny the impact.  The Steam release earned more in its first two weeks than the itch release did in more than a&amp;nbsp;year.&lt;/p&gt;
&lt;p&gt;&amp;#8230;okay, that isn&amp;#8217;t an entirely fair comparison.  The itch release also had a free &amp;#8220;demo&amp;#8221; version that was exactly like the &amp;#8220;real&amp;#8221; version, only with lower-resolution artwork.  &lt;em&gt;Loads&lt;/em&gt; of people played that (almost 20k downloads as of now), and in retrospect we may have shot ourselves in the foot a bit by offering a free version.  But I do &lt;em&gt;like&lt;/em&gt; when people can play my games, and releasing anything only in a paid form feels like extorting people out of their&amp;nbsp;money.&lt;/p&gt;
&lt;p&gt;I am not good at business.  It mostly feels&amp;nbsp;bad.&lt;/p&gt;
&lt;p&gt;Despite that, the game has somehow grossed a bit over $10k in the last eight months (which shrinks to $6k net after the Steam tax, &lt;span class="caps"&gt;VAT&lt;/span&gt;, and refunds).  That&amp;#8217;s not a &lt;em&gt;windfall&lt;/em&gt;, but it&amp;#8217;s far more than I ever expected to earn on the back of a month-long jam game, and it all went to paying our 2019 taxes so it&amp;#8217;s like nothing ever happened.  It certainly makes me optimistic about selling something&amp;nbsp;meatier.&lt;/p&gt;
&lt;h2 id="creating-the-steam-release"&gt;&lt;a class="toclink" href="#creating-the-steam-release"&gt;Creating the Steam&amp;nbsp;release&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We did update the game somewhat for Steam, a process that ended up consuming almost &lt;em&gt;a month&lt;/em&gt; somehow and still didn&amp;#8217;t cover everything we wanted.  The most obvious in-game things were the addition of character profiles, an image gallery, and an options menu — which is to say, all &lt;span class="caps"&gt;UI&lt;/span&gt; things, which I had to build in LÖVE, by hand, which was an incredible pain in the ass.  But it works,&amp;nbsp;somehow.&lt;/p&gt;
&lt;p&gt;Of course I also added a bunch of Steam achievements, which were kinda fun to decide upon.  It&amp;#8217;s a story game, so they&amp;#8217;re mostly of the form “encounter this bit of the story”, but that&amp;#8217;s&amp;nbsp;fine?&lt;/p&gt;
&lt;p&gt;But oh boy, the thing that really took the longest time was linking to Steam at all.  You get a &lt;span class="caps"&gt;DLL&lt;/span&gt;/&lt;span class="caps"&gt;SO&lt;/span&gt;, some header files, and some hit-or-miss &lt;a href="https://partner.steamgames.com/doc/sdk"&gt;documentation&lt;/a&gt;, and the rest is up to&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;The library is, of course, designed for&amp;nbsp;C++.&lt;/p&gt;
&lt;p&gt;I am not using C++.  I am using &lt;em&gt;Lua&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This posed something of a&amp;nbsp;problem.&lt;/p&gt;
&lt;p&gt;I prefer not to touch C++ with a ten-foot pole, so writing some glue on the C++ side did not sound appetizing.  (That would&amp;#8217;ve also left me with the difficult problem of &lt;em&gt;compiling&lt;/em&gt; that code for platforms I do not own or develop on.)  That left me with binding to the Steam &lt;span class="caps"&gt;API&lt;/span&gt; from the Lua&amp;nbsp;side.&lt;/p&gt;
&lt;p&gt;After several days of Googling, finding years-old projects that promised to do this, and completely failing to get anywhere at all with them, I resigned myself to writing something from scratch.  LÖVE uses LuaJIT, which comes with the excellent &lt;span class="caps"&gt;FFI&lt;/span&gt; library, meaning I could bind to C with nothing more than a header&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;The Steam &lt;span class="caps"&gt;API&lt;/span&gt; &lt;em&gt;does&lt;/em&gt; have a C compatibility layer, but it is basically not documented, so I had to do some guesswork to get from the documentation to the parts I actually needed.  Also, the core of the Steam &lt;span class="caps"&gt;API&lt;/span&gt; is this hokey async messaging system built out of macros and C++ metaprogramming, so I had to do a clumsier polling thing using disparate parts of the C &lt;span class="caps"&gt;API&lt;/span&gt; instead.  I finally discovered that there&amp;#8217;s example code in a big honking comment in the headers themselves, except &lt;strong&gt;&lt;em&gt;the example code is wrong&lt;/em&gt;&lt;/strong&gt;, so I had to fix that as well.  Plus all the obtuse bugs like with padding on different platforms which for some reason is baked into the messages that Steam sends because C programmers don&amp;#8217;t know how to actually fucking serialize anything.  It was an&amp;nbsp;adventure!!&lt;/p&gt;
&lt;p&gt;But after all that, I managed to get achievements working, and also leaderboards.  Neat, cool,&amp;nbsp;etc.&lt;/p&gt;
&lt;p&gt;The game &lt;em&gt;does&lt;/em&gt; leak coroutines indefinitely if it&amp;#8217;s run through Steam but can&amp;#8217;t connect, though.&amp;nbsp;Sorry.&lt;/p&gt;
&lt;p&gt;Man.  The Steam website has so many features, and the documentation explains them all in one succinct list, but fuck me if I can actually &lt;em&gt;find&lt;/em&gt; any of them.  So many things are not linked from obvious places; there have been many times I knew a particular page existed but &lt;em&gt;could not&lt;/em&gt; figure out how to get there, and ultimately I started relying on address bar history instead of trying to navigate this&amp;nbsp;website.&lt;/p&gt;
&lt;p&gt;And so many features are awkwardly built on top of older features that are actually something completely different.  Like we have a &lt;a href="https://store.steampowered.com/developer/floraverse"&gt;&amp;#8220;developer&amp;#8221; page on Steam&lt;/a&gt;, but the only part of it we can really control is a single line of plain text at the top.  If you go to the &amp;#8220;about&amp;#8221; tab, it just shows you that line again!  That&amp;#8217;s all we can put there!  You have to click &amp;#8220;visit group page&amp;#8221; (why would you do that??) in the sidebar of &lt;em&gt;that&lt;/em&gt; page to actually get to something we can&amp;nbsp;control.&lt;/p&gt;
&lt;p&gt;In stark contrast to itch, Steam &lt;em&gt;really&lt;/em&gt; wants your store page to look like a Steam store page and not like a your-game store page.  Your artwork (and there is so much artwork) has to be manually approved by a human, and along the way I discovered some extremely unintuitive rules, like that the library header has to be &lt;span class="caps"&gt;SFW&lt;/span&gt; even though it&amp;#8217;s only visible to people who already own the game.  Store pages also have a &amp;#8220;legal&amp;#8221; section, but I couldn&amp;#8217;t list open source libraries I used (and their licenses) in that section, because I&amp;#8217;m not allowed to have links.  Like, at all.  They &lt;em&gt;really&lt;/em&gt; don&amp;#8217;t want you to have links.  Games exist independently of the humans that made them in the world of Steam; they are isolated jewels floating in a vast space that is linked directly to gaben&amp;#8217;s bank&amp;nbsp;account.&lt;/p&gt;
&lt;p&gt;I cannot comprehend how weirdly low-key hostile the whole experience felt.  All so they could take a third of my&amp;nbsp;money.&lt;/p&gt;
&lt;p&gt;Oh, and there&amp;#8217;s no Mac release, because I do not have a Mac on which to sign Mac software and do not wish to pay Apple for the privilege, and Mac software does not run any more if it&amp;#8217;s not signed.  Sorry.  Yes, I fucking know about fucking right-click open, please stop fucking telling me about that, that is not useful for software that is run from &lt;em&gt;someone else&amp;#8217;s launcher&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="reception"&gt;&lt;a class="toclink" href="#reception"&gt;Reception&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;People seem to like it??  I mean, I&amp;#8217;ve had a dozen or so people tell me to my face that they had an &lt;em&gt;especially&lt;/em&gt; good experience with it, that it was cozy and upbeat and just &lt;em&gt;nice&lt;/em&gt;.  For a few of them, it apparently helped ease some aversion they&amp;#8217;d had to sex, simply by showing it playing out&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s funny that I thought so hard about the general design and how agency worked and all that, but 99% of the feedback has been about the feeling of the prose itself — something that just kinda fell out of my fingers.  I guess I&amp;#8217;m not &lt;em&gt;surprised&lt;/em&gt; — after all, if these players thought as hard about game design as I do, they&amp;#8217;d probably be designing&amp;nbsp;games.&lt;/p&gt;
&lt;p&gt;As of this writing, there have been 19.5k downloads on itch and 1750 sales on Steam.  Of the Steam sales, a hair under 80% of the people who own the game have actually played it, so if I extrapolate wildly, maybe 17,000 people have played&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;But I don&amp;#8217;t see anyone &lt;em&gt;talk&lt;/em&gt; about it outside of my immediate circles, which feels a bit weird.  Maybe?  I&amp;#8217;m not sure what the &amp;#8220;normal&amp;#8221; amount of conversation about an admittedly niche game is.  I don&amp;#8217;t know how things really spread by word of mouth, and I thought this might be an opportunity to gleam some insight about that, but it has not visibly materialized even though the game is being bought by people I don&amp;#8217;t personally&amp;nbsp;know.&lt;/p&gt;
&lt;p&gt;On the one hand, it&amp;#8217;s a sex game, so many folks are less likely to talk about it.  (A couple people even specifically asked if Steam has a way to hide what game you&amp;#8217;re playing from your friends — and, alas, it does not.)  On the other hand, it&amp;#8217;s a &lt;em&gt;furry&lt;/em&gt; sex game, and furries are traditionally not so&amp;nbsp;tight-lipped.&lt;/p&gt;
&lt;p&gt;Maybe there&amp;#8217;s not that much to say; the impact it&amp;#8217;s had on people I know has been fairly personal, and if it didn&amp;#8217;t have that kind of impact then it&amp;#8217;s just a cute little story&amp;nbsp;game.&lt;/p&gt;
&lt;h2 id="lessons-learned"&gt;&lt;a class="toclink" href="#lessons-learned"&gt;Lessons&amp;nbsp;learned&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have no idea.  There are so many confounding factors here that I don&amp;#8217;t know how to conclude&amp;nbsp;anything.&lt;/p&gt;
&lt;p&gt;I guess I&amp;#8217;m pleasantly surprised by how many people bought a fairly short game for $7.  As it turns out, people will give you money for a thing if you ask for it?  That&amp;#8217;s nice to&amp;nbsp;know.&lt;/p&gt;
&lt;p&gt;Releasing on Steam is such a huge pain in the ass&amp;nbsp;lol.&lt;/p&gt;
&lt;p&gt;Sales spiked right at the beginning and then flattened fairly quickly, but it still sells a few copies a week, so it looks like it&amp;#8217;ll be a little trickle of income for a while.  It&amp;#8217;d be cool to get a few medium-sized games on Steam as an extra source of income.  I suspect porn games have a bit more staying power,&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;Writing &lt;span class="caps"&gt;UI&lt;/span&gt; by hand sucks ass.  I gotta switch to Godot&amp;nbsp;asap.&lt;/p&gt;</content><category term="release"></category><category term="tech"></category></entry><entry><title>Lexy’s Labyrinth</title><link href="https://eev.ee/release/2020/09/26/lexys-labyrinth/" rel="alternate"></link><published>2020-09-26T19:28:00-07:00</published><updated>2020-09-26T19:28:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2020-09-26:/release/2020/09/26/lexys-labyrinth/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Screenshot of a small tile-based puzzle with a number of different elements, taken from CCLP1" src="https://eev.ee/media/release/lexys-labyrinth/lexys-labyrinth.png"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://c.eev.ee/lexys-labyrinth/"&gt;&lt;strong&gt;Lexy’s Labyrinth&lt;/strong&gt;&lt;/a&gt;&lt;br/&gt;
🔗 &lt;a href="https://github.com/eevee/lexys-labyrinth"&gt;&lt;strong&gt;Source code on GitHub&lt;/strong&gt;&lt;/a&gt;&lt;br/&gt;
🔗 itch.io later&lt;/p&gt;
&lt;p&gt;Here is Lexy’s Labyrinth, a web-based Chip’s Challenge emulator.&lt;/p&gt;
&lt;p&gt;It’s easy to get into and mostly speaks for itself, so here is a story.&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/lexys-labyrinth/lexys-labyrinth.png" alt="Screenshot of a small tile-based puzzle with a number of different elements, taken from CCLP1"&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://c.eev.ee/lexys-labyrinth/"&gt;&lt;strong&gt;Lexy&amp;#8217;s Labyrinth&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
🔗 &lt;a href="https://github.com/eevee/lexys-labyrinth"&gt;&lt;strong&gt;Source code on GitHub&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
🔗 itch.io&amp;nbsp;later&lt;/p&gt;
&lt;p&gt;Here is Lexy&amp;#8217;s Labyrinth, a web-based Chip&amp;#8217;s Challenge&amp;nbsp;emulator.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s easy to get into and mostly speaks for itself, so here is a&amp;nbsp;story.&lt;/p&gt;


&lt;hr /&gt;
&lt;p&gt;Once upon a time, there was a puzzle game called &lt;a href="https://en.wikipedia.org/wiki/Chip%27s_Challenge"&gt;Chip&amp;#8217;s Challenge&lt;/a&gt;.  It was created in 1989 for the Atari Lynx, an early handheld that is probably best known for&amp;#8230;  uh&amp;#8230;  Chip&amp;#8217;s Challenge.  It stood out as a curious blend of Sokoban head-scratching with real-time action, and it was one of the first computer puzzle games that had a whole pile of different mechanics and relied on exploiting the interesting interactions between them&lt;sup&gt;[citation needed]&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The game found wider recognition with its inclusion in &lt;a href="https://en.wikipedia.org/wiki/Microsoft_Entertainment_Pack"&gt;Microsoft Entertainment Pack 4&lt;/a&gt;, and later the Best of Windows Entertainment Pack (charmingly abbreviated &amp;#8220;&lt;span class="caps"&gt;BOWEP&lt;/span&gt;&amp;#8221;).&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;That in itself is a curious story — numerous features of the Atari Lynx version were lost in translation, most notably that the Lynx version has the player and monsters slide smoothly between grid cells, whereas the Microsoft port has everything instantly snap from one cell to the next.  Also conspicuous is the presence of several typos in level passwords, which are exactly consistent with &lt;a href="https://wiki.bitbusters.club/Jaime_Villacorte%27s_notes"&gt;a set of notes a player took about the Lynx game&lt;/a&gt;, but which would be impossible in a straight port — the Lynx level passwords weren&amp;#8217;t manually set, but were generated on the fly by a &lt;span class="caps"&gt;PRNG&lt;/span&gt;.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/lexys-labyrinth/mschips.png" alt="Screenshot of the Microsoft edition of Chip's Challenge, showing the first level, courtesy of the BBC wiki"&gt;
&lt;/div&gt;

&lt;p&gt;The most obvious explanation is that the developer responsible for the Microsoft port didn&amp;#8217;t have access to the Lynx source code, and in fact, &lt;em&gt;had never played the original game at all&lt;/em&gt;.  That would explain nearly every major gameplay difference between the Lynx and Microsoft versions, which are all things you&amp;#8217;d never notice if you only had static screenshots and maps to work from.  Given that restriction, hey, not a bad&amp;nbsp;job.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I played the &lt;span class="caps"&gt;BOWEP&lt;/span&gt; edition of Chip&amp;#8217;s Challenge as a kid and was completely enamoured.  I suppose what got me the most was the same thing that I found so compelling about Doom: the ability to modify your environment, whether by using blocks to clear water or toggling green blocks or generating new monsters from a clone machine.  Being able to affect my environment in (more or less) free-form ways felt curiously&amp;nbsp;powerful.&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;Well, let&amp;#8217;s not think about that too hard.  I&amp;#8217;ll save it for my&amp;nbsp;therapist.&lt;/p&gt;
&lt;p&gt;Some years later I discovered an incredible tool called &lt;em&gt;The Internet&lt;/em&gt;, and with it I learned of the impending &lt;a href="https://wiki.bitbusters.club/Chip%27s_Challenge_2"&gt;Chip&amp;#8217;s Challenge 2&lt;/a&gt;, a sequel with &lt;em&gt;way&lt;/em&gt; more tiles and possibilities!&amp;nbsp;Fantastic!&lt;/p&gt;
&lt;p&gt;Unfortunately, there was a complication.  Epyx, the original publisher of Chip&amp;#8217;s Challenge, had gone bankrupt (somehow!) and had sold most of its assets, including the Chip&amp;#8217;s Challenge rights, to a company called Bridgestone Media (now Alpha Omega Productions), a Christian propaganda&amp;nbsp;distributor.&lt;/p&gt;
&lt;p&gt;You read that&amp;nbsp;correctly.&lt;/p&gt;
&lt;p&gt;Bridgestone, a company that generally dealt in movies, had some very peculiar ideas about the video game industry.  Apparently they expected the assets they&amp;#8217;d acquired to magically make them filthy rich — you know, just like Jesus would want — despite having acquired them &lt;em&gt;from&lt;/em&gt; a company that had just evaporated.  As such, they told the original developer, Chuck Somerville, that he could only release Chip&amp;#8217;s Challenge 2 if he paid them &lt;a href="https://forum.bitbusters.club/thread-2127.html"&gt;one million dollars upfront&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;He did not have one million dollars, and so Chip&amp;#8217;s Challenge 2 languished&amp;nbsp;forever.&lt;/p&gt;
&lt;p&gt;(At this point, in hindsight, I wonder why Chuck didn&amp;#8217;t simply change the story and tileset and release the game under a different name.  Apparently he did start on something like this some years later, in the form of an open clone &lt;em&gt;from scratch&lt;/em&gt; called &lt;a href="https://wiki.bitbusters.club/Puzzle_Studio"&gt;Puzzle Studio&lt;/a&gt;, but it was eventually abandoned in favor of &lt;a href="https://wiki.bitbusters.club/Chuck's_Challenge_3D"&gt;Chuck&amp;#8217;s Challenge 3D&lt;/a&gt;.  But I still wonder: why start a brand new thing, rather than rebrand and release the existing&amp;nbsp;thing?)&lt;/p&gt;
&lt;p&gt;We did have some descriptions of new Chip&amp;#8217;s Challenge 2 mechanics, and so at the ripe old age of 15, with no idea what I was doing, I decided I would simply write my own version of Chip&amp;#8217;s Challenge&amp;nbsp;2.&lt;/p&gt;
&lt;p&gt;In&amp;nbsp;QBasic.&lt;/p&gt;
&lt;p&gt;Also I didn&amp;#8217;t really understand how to handle the passage of time, so the game was turn-based and had no&amp;nbsp;monsters.&lt;/p&gt;
&lt;p&gt;But, given all that, it wasn&amp;#8217;t &lt;em&gt;that&lt;/em&gt; bad.  I found the source code a few years ago and &lt;a href="https://gist.github.com/eevee/1b371c4b2470dd82cbcf"&gt;put it on GitHub&lt;/a&gt; along with a sample level and a description of all the tiles you can use in the plaintext level format.  I&amp;#8217;ve got a &lt;a href="https://c.eev.ee/CHIPS.EXE"&gt;prebuilt binary for &lt;span class="caps"&gt;DOS&lt;/span&gt;&lt;/a&gt; (usable in DosBox) too, if you like — just have a &lt;code&gt;levels.txt&lt;/code&gt; in the same directory, and be sure it uses &lt;span class="caps"&gt;DOS&lt;/span&gt; line endings.  I used to have one or two actual levels, but they have tragically been lost to the sands of&amp;nbsp;time.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/lexys-labyrinth/qbchips.png" alt="Screenshot of my QBasic implementation of Chip's Challenge, using all character-based graphics"&gt;
&lt;/div&gt;

&lt;p&gt;That would&amp;#8217;ve been&amp;nbsp;2002.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Thirteen years later, in April 2015, a miracle occurred and defeated the Christians.  Chip&amp;#8217;s Challenge 2 was released &lt;a href="https://store.steampowered.com/app/348300/Chips_Challenge_2/"&gt;on Steam&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was fine.  I don&amp;#8217;t know.  Over a decade of anticipation gets your hopes up, maybe.  It&amp;#8217;s a perfectly good puzzle game, and I don&amp;#8217;t want to dunk on it, but sometimes I interact with it and I feel all life drain from my&amp;nbsp;body.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/lexys-labyrinth/cc2female1.png" alt="Screenshot of CC2, with an overlaid hint saying: &amp;quot;This is Melinda.  Being female, she does some things differently than Chip.&amp;quot;"&gt;
&lt;img src="https://eev.ee/media/release/lexys-labyrinth/cc2female2.png" alt="Screenshot of CC2, with an overlaid hint saying: &amp;quot;She doesn't slide when she steps on ice.  But she needs hiking boots to walk on dirt or gravel.&amp;quot;"&gt;
&lt;/div&gt;

&lt;p&gt;I don&amp;#8217;t even know whether to talk about this completely unreadable way of showing hints or the utterly baffling justification of &amp;#8220;being female&amp;#8221; for these&amp;nbsp;properties.&lt;/p&gt;
&lt;p&gt;But it&amp;#8217;s fine.  The game was Windows-only, but it was &lt;em&gt;old&lt;/em&gt; Windows-only, so Wine handled it perfectly well.  I played through a few dozen levels.  Passwords were gone, so you were free to skip over levels you just didn&amp;#8217;t feel like&amp;nbsp;playing.&lt;/p&gt;
&lt;p&gt;And then they patched a level editor into the game, and it completely broke under Wine.  &lt;em&gt;Completely&lt;/em&gt;.  Like, would not even run.  It&amp;#8217;s only in recent years that it even &lt;em&gt;tries&lt;/em&gt; to run, and now it can&amp;#8217;t draw the window and crashes if you attempt to do&amp;nbsp;anything.&lt;/p&gt;
&lt;p&gt;The funny thing is, apparently it doesn&amp;#8217;t draw for some people on Windows, either.  It doesn&amp;#8217;t for &lt;em&gt;me&lt;/em&gt; in a Windows &lt;span class="caps"&gt;VM&lt;/span&gt;.  The official sanctioned solution is to&amp;#8230;  install&amp;#8230;  wined3d, a Windows port of the Wine implementation of&amp;nbsp;Direct3D.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know.  I don&amp;#8217;t know!  I don&amp;#8217;t know what the hell anything.  This situation is utterly baffling.  What even are&amp;nbsp;computers.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I gave up on the game until recently, when something reminded me of it and I tried it again in Wine.  No luck, obviously.  I spent half a day squabbling with bleeding-edge versions and Proton patches and all manner of other crap, then resorted to the &lt;a href="https://bitbusters.club/"&gt;Bit Busters Club&lt;/a&gt; &lt;a href="https://discord.gg/Xd4dUY9"&gt;Discord&lt;/a&gt;, but they couldn&amp;#8217;t help me&amp;nbsp;either.&lt;/p&gt;
&lt;p&gt;And then something stirred, deep inside of me.  This game wasn&amp;#8217;t &lt;em&gt;that&lt;/em&gt; complicated, right?  I actually know how to make video games now.  I even know how to make art, sort of.  And sound.  And music.&amp;nbsp;And&amp;#8230;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;And here I am, a month later, having replicated Chip&amp;#8217;s Challenge in a web browser, fueled entirely by some new emotion I&amp;#8217;ve discovered that lies halfway between spite and exhaustion.  My real goal was to clone Chip&amp;#8217;s Challenge 2 &lt;em&gt;so I can actually fucking play this game I bought&lt;/em&gt;, but it is of course a more complex game.  Still, &lt;span class="caps"&gt;CC2&lt;/span&gt; support is something like 60% done; most of what remains is wiring, tracks, and ghost/rover&amp;nbsp;behavior.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;CC1&lt;/span&gt; support is more interesting, anyway — there are far more custom &lt;span class="caps"&gt;CC1&lt;/span&gt; levels around, and Lexy&amp;#8217;s Labyrinth exposes almost 600 of them a mere click away.  Given that the original Microsoft port was 16-bit and is now difficult to run (and impossible to buy), and the official (free!) &lt;a href="https://store.steampowered.com/app/346850/Chips_Challenge_1/"&gt;Steam release&lt;/a&gt; is fairly awkward and unmaintained (the dev mostly makes vague statements about &amp;#8220;old code&amp;#8221;), and even the favored emulator &lt;a href="https://wiki.bitbusters.club/Tile_World"&gt;Tile World&lt;/a&gt; has the aesthetics and usability of a 1991 Unix application, I&amp;#8217;m hoping this will make the Chip&amp;#8217;s Challenge experience a little more accessible.  It has a partially working level editor, too, which lets you share levels you make by simply passing around a &lt;span class="caps"&gt;URL&lt;/span&gt;, and I think that is fucking&amp;nbsp;fantastic.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;LL&lt;/span&gt; cannot currently load level &lt;em&gt;packs&lt;/em&gt; from the Steam release, but it&amp;#8217;s a high priority.  In the meantime, if you really want to play the original levels (even though &lt;span class="caps"&gt;CCLP1&lt;/span&gt; is far better in my experience), it&amp;#8217;ll load &lt;code&gt;CHIPS.DAT&lt;/code&gt; if you&amp;#8217;ve got it lying around.  Also, it works on&amp;nbsp;phones!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Probably the most time-consuming parts of this project were the assets.  I had to draw a whole tileset from scratch, &lt;em&gt;including&lt;/em&gt; all of the &lt;span class="caps"&gt;CC2&lt;/span&gt; tiles which you don&amp;#8217;t even get to see yet (and a few of which aren&amp;#8217;t actually done).  That probably took a week, spread out over the course of the entire last month.  Sound effects took several days, though they got much easier once I decided to give up on doing them by wiring LFOs together in SunVox and just use a bunch of &lt;a href="https://www.beepbox.co/"&gt;BeepBox&lt;/a&gt; presets.  I spent a couple days on my own music track, and half a dozen other kind souls chipped in their own music — thank you so much,&amp;nbsp;everyone!&lt;/p&gt;
&lt;p&gt;And thank you to the Bit Busters Club, whose incredibly detailed knowledge made it possible to match the behavior of a lot of obscure-but-important interactions.  The Steam version of &lt;span class="caps"&gt;CC1&lt;/span&gt; comes with solution replays, and &lt;span class="caps"&gt;LL&lt;/span&gt; can even play a significant number of them back without ever&amp;nbsp;desyncing.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been ignoring pretty much everything else for a month to get this in a usable state, so I&amp;#8217;d like to take a break from it for now, but I&amp;#8217;d really like to get all of &lt;span class="caps"&gt;CC2&lt;/span&gt; working when I can, and of course make the level editor fully functional.  I love accessible modding tools, you don&amp;#8217;t see many of them in games any more, and with any luck maybe it&amp;#8217;ll inspire some other kid to get into game development&amp;nbsp;later.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;#8230;okay, I haven&amp;#8217;t been ignoring &lt;em&gt;everything&lt;/em&gt; else.  I also reused the tiles I drew for a fox flux minigame in a similar style, except that you place a limited set of tiles in empty spaces and then let the game run &lt;em&gt;by itself&lt;/em&gt;.  Kind of like&amp;#8230;  Chip&amp;#8217;s Challenge meets The Incredible&amp;nbsp;Machine.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/lexys-labyrinth/fox-flux-minigame-demo.gif" alt="Recording of a minigame, showing a drone character interacting with moving floors and following instructions on the ground"&gt;
&lt;/div&gt;

&lt;p&gt;(That arrow tile has since been updated to be more clear, but it means &amp;#8220;when you hit something, turn around instead of stopping and ending the&amp;nbsp;game.&amp;#8221;)&lt;/p&gt;
&lt;p&gt;I guess two little puzzle game engines isn&amp;#8217;t too bad for not quite a month of&amp;nbsp;work!&lt;/p&gt;</content><category term="release"></category><category term="gamedev"></category></entry><entry><title>Star Anise Chronicles: Oh No Wheres Twig??</title><link href="https://eev.ee/release/2020/05/10/star-anise-chronicles-oh-no-wheres-twig/" rel="alternate"></link><published>2020-05-10T21:54:00-07:00</published><updated>2020-05-10T21:54:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2020-05-10:/release/2020/05/10/star-anise-chronicles-oh-no-wheres-twig/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Title and logo for the game" src="https://eev.ee/media/release/anise-wheres-twig.png"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://eevee.itch.io/anise-wheres-twig"&gt;&lt;strong&gt;Play it&lt;/strong&gt; on itch.io&lt;/a&gt;&lt;br/&gt;
🔗 &lt;a href="https://www.lexaloffle.com/bbs/?pid=76397"&gt;&lt;strong&gt;Play it&lt;/strong&gt; on the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 &lt;span class="caps"&gt;BBS&lt;/span&gt;&lt;/a&gt; (where you can also download the cart and view the source code)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(I originally drafted this just after publishing the game, but then decided to start a &lt;a href="https://eev.ee/blog/2020/11/30/gamedev-from-scratch-0-groundwork/"&gt;whole series about its development&lt;/a&gt; and wasn’t sure what to do with this!  But it’s solid and serves a different purpose, so here it is.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s been a while, but I made another &lt;a href="https://www.lexaloffle.com/pico-8.php"&gt;&lt;span class="caps"&gt;PICO&lt;/span&gt;-8&lt;/a&gt; game!  It’s a little platformer with light puzzling, where you help Star Anise find his best friend Branch Commander Twig.  It’s only half an hour long at worst, and it’s even playable on a phone!&lt;/p&gt;
&lt;p&gt;This is the one-and-a-halfth entry in the Star Anise Chronicles series, which after several false starts, finally kicked off over Christmas with a…  uh…  &lt;a href="https://eevee.itch.io/anise-escape-despair"&gt;interactive fiction game&lt;/a&gt;.  Expect the series to continue with even more whiplash-inducing theme shifts.&lt;/p&gt;
&lt;p&gt;More technical considerations will go in the “gamedev from scratch” series, but read on for some overall thoughts on the design.  Both contain &lt;strong&gt;spoilers&lt;/strong&gt;, of course, so I do urge you to play the game first.&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/anise-wheres-twig.png" alt="Title and logo for the game"&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://eevee.itch.io/anise-wheres-twig"&gt;&lt;strong&gt;Play it&lt;/strong&gt; on itch.io&lt;/a&gt;&lt;br /&gt;
🔗 &lt;a href="https://www.lexaloffle.com/bbs/?pid=76397"&gt;&lt;strong&gt;Play it&lt;/strong&gt; on the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 &lt;span class="caps"&gt;BBS&lt;/span&gt;&lt;/a&gt; (where you can also download the cart and view the source&amp;nbsp;code)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(I originally drafted this just after publishing the game, but then decided to start a &lt;a href="https://eev.ee/blog/2020/11/30/gamedev-from-scratch-0-groundwork/"&gt;whole series about its development&lt;/a&gt; and wasn&amp;#8217;t sure what to do with this!  But it&amp;#8217;s solid and serves a different purpose, so here it&amp;nbsp;is.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been a while, but I made another &lt;a href="https://www.lexaloffle.com/pico-8.php"&gt;&lt;span class="caps"&gt;PICO&lt;/span&gt;-8&lt;/a&gt; game!  It&amp;#8217;s a little platformer with light puzzling, where you help Star Anise find his best friend Branch Commander Twig.  It&amp;#8217;s only half an hour long at worst, and it&amp;#8217;s even playable on a&amp;nbsp;phone!&lt;/p&gt;
&lt;p&gt;This is the one-and-a-halfth entry in the Star Anise Chronicles series, which after several false starts, finally kicked off over Christmas with a&amp;#8230;  uh&amp;#8230;  &lt;a href="https://eevee.itch.io/anise-escape-despair"&gt;interactive fiction game&lt;/a&gt;.  Expect the series to continue with even more whiplash-inducing theme&amp;nbsp;shifts.&lt;/p&gt;
&lt;p&gt;More technical considerations will go in the &amp;#8220;gamedev from scratch&amp;#8221; series, but read on for some overall thoughts on the design.  Both contain &lt;strong&gt;spoilers&lt;/strong&gt;, of course, so I do urge you to play the game&amp;nbsp;first.&lt;/p&gt;


&lt;hr /&gt;
&lt;p&gt;The first attempt at a Star Anise game was two years ago, in early 2018.  The idea was to make a Metroidvania where Star Anise had a bunch of guns that shot cat-themed projectiles, obtained a couple other cat-themed powers, and made a total mess of a serious plot happening in the background while he ran around collecting&amp;nbsp;garbage.&lt;/p&gt;
&lt;p&gt;After finishing up the Steam release of Cherry Kisses last month, we decided that our next game should be that one, which would now be Star Anise 2 (since i&amp;#8217;d already released a Star Anise 1 some months ago).  We have, uh, already altered these plans, but that&amp;#8217;s the&amp;nbsp;background.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t really know why I started on this game.  I guess there&amp;#8217;s some element of stress to working on a project &lt;em&gt;with&lt;/em&gt; someone, even if that someone is Ash (my spouse), and especially if I&amp;#8217;m supposed to be driving it forward.  I have to tell someone what to do, and then if I don&amp;#8217;t like the result I have to ask them to fix it, and a lot of tiny design questions are out of my control anyway, and all of this is happening on someone else&amp;#8217;s schedule, and I have to convey all the project state that&amp;#8217;s in my head in a complicated non-verbal form, and&amp;#8230;  all of those things are a constant low-level source of&amp;nbsp;stress.&lt;/p&gt;
&lt;p&gt;So I guess we&amp;#8217;d just finished a game that I&amp;#8217;d designed, and it was looking like we were about to start a sizable project where I was the design lead &lt;em&gt;again&lt;/em&gt;, and I wanted to make something I could finish by myself as an&amp;nbsp;interlude.&lt;/p&gt;
&lt;p&gt;And so I sat down with a teeny tiny tool to make a teeny tiny version of what I expected would be our next&amp;nbsp;game.&lt;/p&gt;
&lt;h2 id="design"&gt;&lt;a class="toclink" href="#design"&gt;Design&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The basics were obvious: run, jump, land.  I gave Star Anise little landing particles early on — they&amp;#8217;re in the bigger prototype, I love landing puffs in general, and having them be stars adds &lt;em&gt;so much&lt;/em&gt; silly&amp;nbsp;personality.&lt;/p&gt;
&lt;p&gt;I knew I wanted to have multiple abilities you collect, since that&amp;#8217;s the heart of Metroidventures.  I briefly considered giving Star Anise a gun, as in the prototype, but gave up on that pretty early.  I would&amp;#8217;ve had to sprite a gun, a projectile, a projectile explosion, enemies, enemy attacks, enemy death&amp;nbsp;frames&amp;#8230;&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t get me wrong; I have no problem with drawing all of that.  The concern was that &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 has a &lt;em&gt;very&lt;/em&gt; limited amount of space for sprites — in the configuration I was using, 128 sprites of 8×8 pixels each.  Star Anise himself takes up 9, even with some clever reuse for his walking animation.  The star puff takes 4.  The common world tile, plus versions for edges and corners, takes up 9.  That&amp;#8217;s 22 sprites already, more than 17% of the space I have, for &lt;em&gt;absolutely nothing&lt;/em&gt; besides jumping around on solid ground.  I would have to keep it&amp;nbsp;simple.&lt;/p&gt;
&lt;p&gt;That led me to the first two powers, both borrowed from the&amp;nbsp;prototype:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class="caps"&gt;AOWR&lt;/span&gt; starts conversation with NPCs and opens doors.  I can&amp;#8217;t really take any creative credit here, since these are both things Anise attempts to do with aowrs in real&amp;nbsp;life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Papping activates levers and knocks over glasses of liquid.  Anise only does one of those in real life.  (In the prototype, this is a &lt;em&gt;gun&lt;/em&gt; — which shoots pawprint-shaped projectiles — but I&amp;#8217;d already been thinking about making it a &amp;#8220;melee&amp;#8221; ability&amp;nbsp;first.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I &lt;em&gt;adore&lt;/em&gt; both of these abilities.  I think they both turn some common &lt;span class="caps"&gt;UI&lt;/span&gt; tropes on their heads.  NPCs, doors, and levers are all things you usually interact with by pressing some generic &amp;#8220;interact&amp;#8221; button, but &lt;em&gt;hitting&lt;/em&gt; a lever (and meowing at a door) adds some physicality to the action — you&amp;#8217;re actually &lt;em&gt;doing&lt;/em&gt; something, not just making it&amp;nbsp;go.&lt;/p&gt;
&lt;p&gt;And pressing A to talk to an &lt;span class="caps"&gt;NPC&lt;/span&gt; doesn&amp;#8217;t really make &lt;em&gt;any sense at all&lt;/em&gt;!  Consider: almost universally, even in games where the player character speaks, pressing A to start a conversation leads off with &lt;em&gt;the &lt;span class="caps"&gt;NPC&lt;/span&gt;&lt;/em&gt; talking.  So what the hell did you actually do?  What does pressing A represent actually &lt;em&gt;doing&lt;/em&gt; that results in someone else casually starting a conversation with you, seemingly unprompted?  I have no idea!  It&amp;#8217;s nonsense!  But Anise meows at me all the time and I always respond to him, which is perfectly&amp;nbsp;sensible.&lt;/p&gt;
&lt;p&gt;The third power, telepawt, is a little newer.  We&amp;#8217;d conceived a cat teleporting power pretty recently, but it was more involved and required some big environmental props.  I realized pretty quickly that I couldn&amp;#8217;t possibly do much of interest on the tiny &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 screen (16 × 16 tiles), but I do like teleporting abilities!  I briefly considered ripping off Axiom Verge, but I&amp;#8217;ve already done that in fox flux, and the physics are a little involved&amp;#8230;  and then, lo, inspiration!  Combine the two ideas: teleport great distances, but in a controlled and predictable way, by teleporting to the point on the opposite side of the screen.  It felt like a very 8-bit kind of power, and I could already imagine a few ways to hide stuff with it, so off I&amp;nbsp;went.&lt;/p&gt;
&lt;p&gt;And that seemed like a reasonable progression.  A way to talk (and progress through doors), a way to interact with objects, and a way to move around.  I decided about halfway through development to make jumping a faux powerup as well; it stretches out the progression a bit more by making you walk past potential jumps and then come back to them later, which is important when I don&amp;#8217;t have much map space to work&amp;nbsp;with.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d originally planned for items to be separate from abilities, but ran into a couple problems, the worst of which was that I really didn&amp;#8217;t have much screen space for sprinkling more items around.  I ended up turning items into abilities in their own right, which I think was an improvement overall; now you can crinkle the plastic bag wherever you want, for&amp;nbsp;example.&lt;/p&gt;
&lt;p&gt;The game deliberately doesn&amp;#8217;t try to explain itself; &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 only has six buttons, and four of them are a d-pad, so I figured button-mashing (as in ye olde &lt;span class="caps"&gt;NES&lt;/span&gt; days) would get everyone through.  Still, several players were confused about how to jump (and possibly gave up before even acquiring jump?), and one didn&amp;#8217;t realize you could switch abilities, despite the up/down arrowheads on the ability box.  Not sure what to learn from&amp;nbsp;this.&lt;/p&gt;
&lt;h2 id="the-map"&gt;&lt;a class="toclink" href="#the-map"&gt;The&amp;nbsp;map&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I struggled a bit with the map.  &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 has a built-in map editor with enough space for 32 screen-sized rooms (arranged in an 8 × 4 grid), which it turns out is &lt;em&gt;not very many&lt;/em&gt;.  I also very much did not want the game space to be confined to exactly that size of rectangle, so I knew I&amp;#8217;d have to do some funky stuff with room connections.  (Armed with that power, I ended up making loops and other kinds of non-Euclidean geometry, but hey that&amp;#8217;s plenty appropriate for an imaginary&amp;nbsp;moon.)&lt;/p&gt;
&lt;p&gt;The bigger problem was designing the rooms &lt;em&gt;outside&lt;/em&gt; of the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 map editor.  I tried sketching in Krita, and then on paper, but kept running into the same two problems: it was tedious to rearrange rooms, and I didn&amp;#8217;t have a good sense of how much space was available per&amp;nbsp;room.&lt;/p&gt;
&lt;p&gt;I found a novel solution: I wrote a Python script to export the map to a &lt;span class="caps"&gt;PNG&lt;/span&gt;, opened it in Aseprite, and edited it there — with each pixel representing a tile and the grid size set to 16.  Now I knew exactly how much space I had, and rearranging rooms was easy: double-clicking a cell selects it, and holding Alt while dragging a selection snaps it to the grid.  Here&amp;#8217;s the beginning part of the game, screenshotted directly from Aseprite at 400%&amp;nbsp;zoom:&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/anise-wheres-twig-mapdesign.png" alt="A very pixellated map, with bright pink lines to indicate odd connections"&gt;
&lt;/div&gt;

&lt;p&gt;When it came time to pack it all back into a rectangle, I copied the whole map, rearranged the rooms, and numbered them all so I could keep track of connections.  Surprisingly, it wasn&amp;#8217;t &lt;em&gt;that&lt;/em&gt; bad a&amp;nbsp;workflow.&lt;/p&gt;
&lt;p&gt;The non-Euclidean map connections came in handy for packing secrets in more efficiently; most of the secret stars are off-screen, making them harder to find, but I couldn&amp;#8217;t really afford to have a dedicated treasure room for every single one.  So I crammed two treasures into the same room a few times, even though the two routes you&amp;#8217;d take to get there are generally nowhere near each&amp;nbsp;other.  &lt;/p&gt;
&lt;p&gt;Doors helped stretch the map out, too.  It&amp;#8217;s probably obvious if you think about it in the slightest, but doors don&amp;#8217;t lead to different rooms; they reuse the &lt;em&gt;same&lt;/em&gt; room.  But some tiles only appear in the overworld, some tiles only appear in cave world, and actors (besides doors) don&amp;#8217;t spawn in caves.  That seemingly small difference was enough to make rooms vastly different in the two worlds; the most extreme case is a &amp;#8220;crossroads&amp;#8221; room, which you traverse vertically in the overworld but horizontally in cave world.  (Honestly, I wish I&amp;#8217;d done a bit more of this, but it works best in rooms that only have two overworld exits, and there ended up not being too many of those.  Also, caves are restricted to basically just platforming, so there&amp;#8217;s only so much variety I can squeeze out of&amp;nbsp;them.)&lt;/p&gt;
&lt;p&gt;Designing caves was a little trickier than you might think, since the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 map has no layers!  If something needed to occupy a tile in the overworld, then I &lt;em&gt;could not&lt;/em&gt; put something in the same place in cave world.  Along with the design nightmare that is telepawt, this gave me a couple&amp;nbsp;headaches.&lt;/p&gt;
&lt;p&gt;I do like the cave concept a lot, though.  I love parallel versions of places in games, and I have an unfinished &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 game that&amp;#8217;s centered around that idea taken to extremes.  It&amp;#8217;s also kind of a nod to my LÖVE games, all the way back to Neon Phase, where going indoors didn&amp;#8217;t load another map — rooms were just another&amp;nbsp;layer.&lt;/p&gt;
&lt;h2 id="aesthetics"&gt;&lt;a class="toclink" href="#aesthetics"&gt;Aesthetics&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Originally, &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 had a fixed palette of 16 colors.  You could do palette swaps of various sorts, but you can&amp;#8217;t actually change any of the&amp;nbsp;colors.&lt;/p&gt;
&lt;p&gt;But since I last used it, &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 gained a &amp;#8220;secret palette&amp;#8221; — an &lt;em&gt;extra&lt;/em&gt; 16 colors that you can request.  You can&amp;#8217;t have more than 16 colors on the screen at a time, but you &lt;em&gt;can&lt;/em&gt; replace one of the existing colors with a &amp;#8220;secret&amp;#8221; color.  There&amp;#8217;s also an obscure way to tell &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 to preserve the screen palette when the game finishes, which means I could effectively change the palette &lt;em&gt;in the sprite editor&lt;/em&gt;.&amp;nbsp;Hooray!&lt;/p&gt;
&lt;p&gt;I didn&amp;#8217;t want to completely change the palette, so I tried to keep the alterations minor.  For the most part, I gave up reds and pinks for a better spread of greens, purples, and yellows.  Here&amp;#8217;s the core &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 palette, the secret &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 palette, and the game&amp;#8217;s palette,&amp;nbsp;respectively:&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/anise-wheres-twig-palette.png" alt="A very bright palette, a softer and warmer version of the same colors, and a mix of them"&gt;
&lt;/div&gt;

&lt;p&gt;I think I did a decent job of preserving the overall color aesthetic while softening the harsh contrasts of the original palette, and the cool colors really helped the&amp;nbsp;mood.&lt;/p&gt;
&lt;p&gt;Note that I changed the background color (color 0 isn&amp;#8217;t drawn when it appears in a sprite) to &lt;em&gt;navy&lt;/em&gt; and promoted black to a foreground color, which helped black stand out more when used as an outline or whatever.  Probably the best example of this is in the logo, traced from the vector logo I made for the first Star Anise&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;Hmm, what else.  The tiles themselves felt almost forced, if that makes sense?  Like I could only draw them one way.  &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 tiles are a rinky-dink 8 pixels, and boy that is not much to work with.  If I had a lot of sprite space, I could make bigger metatiles, but&amp;#8230;  I don&amp;#8217;t, so I couldn&amp;#8217;t.  I tried a lot of variations of tiles, and what I ended up with were pretty much the only things that&amp;nbsp;worked.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;love&lt;/em&gt; how the emoting came out.  I knew I didn&amp;#8217;t have nearly enough room for facial expressions for everyone, but I wanted to give them &lt;em&gt;some&lt;/em&gt; kind of visual way to express mood, and the tiny overlays kinda fell naturally out of that.  I think they add a ton of personality, especially in how everyone uses them&amp;nbsp;differently.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m pretty happy with the sound design, as well.  I&amp;#8217;m an extremely amateur composer, and I wrote 90% of the music in a few hours on the start of the last day, but I actually like how it came out and I like going back to listen to it.  The sound effects are, with some mild exceptions, pretty much excellent — the aowr is incredible, it has fooled other folks in the house more than once, and I knew I had it right when I had a blast just running around mashing the meow&amp;nbsp;button.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also happy with the dialogue, and hope it conveys the lunekos&amp;#8217; personalities in just these few&amp;nbsp;interactions.&lt;/p&gt;
&lt;p&gt;While writing the ending, I had to stop in mid-draft to go cry.  Then I cried again when I finished it a few days later.  I&amp;#8217;ll miss you forever, &lt;a href="https://eev.ee/blog/2019/10/26/goodbye-twigs/"&gt;Branch Commander Twig&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you did, thanks for&amp;nbsp;playing.&lt;/p&gt;</content><category term="release"></category><category term="gamedev"></category></entry><entry><title>Advent calendar 2019</title><link href="https://eev.ee/release/2019/12/01/advent-calendar-2019/" rel="alternate"></link><published>2019-12-01T19:48:00-08:00</published><updated>2019-12-01T19:48:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2019-12-01:/release/2019/12/01/advent-calendar-2019/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Calendar of things I made during December, with little screenshots" src="https://eev.ee/media/release/advent2019.png"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://c.eev.ee/advent-2019/"&gt;&lt;strong&gt;Advent calendar&lt;/strong&gt;, with links to individual projects&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Happy new year!&lt;/p&gt;
&lt;p&gt;For December, I had the absolutely ludicrous idea to do an advent calendar, whereupon I would make and release a thing &lt;em&gt;every day&lt;/em&gt; until Christmas.&lt;/p&gt;
&lt;p&gt;It didn’t go quite as planned!  But some pretty good stuff still came out of it.&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/advent2019.png" alt="Calendar of things I made during December, with little screenshots"&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://c.eev.ee/advent-2019/"&gt;&lt;strong&gt;Advent calendar&lt;/strong&gt;, with links to individual&amp;nbsp;projects&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Happy new&amp;nbsp;year!&lt;/p&gt;
&lt;p&gt;For December, I had the absolutely ludicrous idea to do an advent calendar, whereupon I would make and release a thing &lt;em&gt;every day&lt;/em&gt; until&amp;nbsp;Christmas.&lt;/p&gt;
&lt;p&gt;It didn&amp;#8217;t go quite as planned!  But some pretty good stuff still came out of&amp;nbsp;it.&lt;/p&gt;


&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Day 1&lt;/strong&gt;: I started out well enough with the &lt;a href="https://c.eev.ee/doom-text-generator/"&gt;Doom text generator&lt;/a&gt; (and &lt;a href="https://eev.ee/release/2019/12/01/doom-text-generator/"&gt;accompanying release post&lt;/a&gt;), which does something simple that I&amp;#8217;ve wanted for a long time but never seen anywhere: generate text using the Doom font.  Most of the effort here was just in hunting down the fonts and figuring out how they worked; the rest was gluing them together with the canvas &lt;span class="caps"&gt;API&lt;/span&gt;.  It could be improved further, but it&amp;#8217;s pretty solid and useful&amp;nbsp;as-is!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 2&lt;/strong&gt;: I tried another thing I&amp;#8217;d always wanted: making a &lt;a href="https://c.eev.ee/puzzles/the-nuclear-age.html"&gt;crossword&lt;/a&gt;!  (Solve interactively on &lt;a href="https://squares.io/info/3szq4vjmtk3e65j55uxp/info"&gt;squares.io&lt;/a&gt;!)  I didn&amp;#8217;t expect it to take &lt;em&gt;all day&lt;/em&gt;, but it did, and &lt;em&gt;even then&lt;/em&gt; I found a typo that I didn&amp;#8217;t have time to fix, and I had to rush with the clues.  All in all, an entertaining but way too difficult first attempt.  I&amp;#8217;d love to try doing this more,&amp;nbsp;though.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 3&lt;/strong&gt;: I&amp;#8217;ve made a couple &lt;span class="caps"&gt;SVG&lt;/span&gt; visualizations before — most notably in my post on &lt;a href="https://eev.ee/blog/2016/05/29/perlin-noise/"&gt;Perlin noise&lt;/a&gt; — and decided to take another crack at it.  The result was a &lt;a href="https://c.eev.ee/viz/trig-functions.html"&gt;visualization of all six modern trig functions&lt;/a&gt;, showing the relationships between them in two different ways.  I&amp;#8217;m pretty happy with how this turned out, and delighted that I learned some relationships I didn&amp;#8217;t know about before, either!  I do wish I&amp;#8217;d drawn some of the similar triangles to make the relationships more explicit, but I ran out of time — just orienting the text correctly took &lt;em&gt;ages&lt;/em&gt;, especially since a lot of it needed different placement in all four quadrants.  I vaguely intended to get around to doing a couple more of these, but it didn&amp;#8217;t end up&amp;nbsp;happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Days 4 and 7&lt;/strong&gt;: I love the &lt;a href="https://www.lexaloffle.com/pico-8.php"&gt;&lt;span class="caps"&gt;PICO&lt;/span&gt;-8&lt;/a&gt;&amp;#8216;s built-in tracker, which makes way more sense to me than any &amp;#8220;real&amp;#8221; tracker, and set out to replicate it for the web.  The result is &lt;a href="https://c.eev.ee/picotracker/"&gt;PICOtracker&lt;/a&gt;!  Unfortunately, this one didn&amp;#8217;t get fully finished (yet) — it can play back sounds and music from the hardcoded &lt;a href="https://eevee.itch.io/under-construction"&gt;Under Construction&lt;/a&gt; cart, but doesn&amp;#8217;t support editing yet.  Most of my time went to figuring out the Web Audio &lt;span class="caps"&gt;API&lt;/span&gt;, figuring out what the knobs in the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 tracker actually &lt;em&gt;do&lt;/em&gt; (and shoutout to &lt;a href="https://github.com/picolove/picolove/"&gt;picolove&lt;/a&gt; for acting as source code reference), and figuring out how to weld the two together.  I definitely want to revisit this in the near&amp;nbsp;future!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 5&lt;/strong&gt;: I&amp;#8217;d been recently streaming &lt;a href="https://doomwiki.org/wiki/Eternal_Doom"&gt;Eternal Doom &lt;span class="caps"&gt;III&lt;/span&gt;&lt;/a&gt; and was &lt;em&gt;almost&lt;/em&gt; done, and I keep being really lazy about putting Doom streams on YouTube, so I finished up the game (which took far, far longer than I expected) and &lt;a href="https://www.youtube.com/watch?v=9Y35ga7-ndw&amp;amp;list=PLe3hrqBmMcMI6M_Qqem9KflrSgR6An3jS"&gt;posted the whole thing as a playlist&lt;/a&gt;.  It spans like 24 hours.  Good if you, uh, just want some Doom noise to listen to in the&amp;nbsp;background.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 6&lt;/strong&gt;: I&amp;#8217;d expected Eternal Doom to be a quick day so I could have a break, and it was not.  So I took an explicit day&amp;nbsp;off.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Days 8 and 13&lt;/strong&gt;: I made &lt;a href="https://c.eev.ee/flathack/"&gt;flathack&lt;/a&gt;, a web roguelike with only one floor!  The idea came from having played NetHack a great many times, and having seen the first floor much more than any other part of the dungeon — so why not make that the whole game?  It needs a lot more work, but I&amp;#8217;m happy to have finally published a roguelike, and I think it already serves its intended purpose at least a little bit: it&amp;#8217;s a cute little timewaster that doesn&amp;#8217;t keep killing&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Days 9–12&lt;/strong&gt;: I got food poisoning.  It sucked.  A&amp;nbsp;lot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Days 14–20&lt;/strong&gt;: Fresh off of making flathack in only two days, I got a bit too big for my britches and decided to try writing an interactive fiction game.  In one day.  Spoilers: it took more than one day.  But I think the result is pretty charming: &lt;a href="https://c.eev.ee/anise-escape-despair/"&gt;Star Anise Chronicles: Escape from the Chamber of Despair&lt;/a&gt;, a game about being a cat and causing wanton destruction, and also the first Star Anise Chronicles game to actually be published.  A good chunk of the time was spent just drawing illustrations for it, which weren&amp;#8217;t strictly necessary, but they add a lot to the game and they &lt;em&gt;did&lt;/em&gt; get me back in an art&amp;nbsp;mood.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 21&lt;/strong&gt;: I feel like I&amp;#8217;ve been scared of color for a long time, and that&amp;#8217;s no good, so I &lt;a href="https://twitter.com/eevee/status/1208657658716143616"&gt;drew and colored something&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 22&lt;/strong&gt;: I drew some weird porn, and colored it too!  Porn is just a blast to draw, and it&amp;#8217;d been a while.  I&amp;#8217;ll let you find the link on the calendar if you really want&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 23&lt;/strong&gt;: Did not exist, due to becoming&amp;nbsp;nocturnal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 24–28&lt;/strong&gt;: I started a big reference of a bunch of my Flora characters way back in November 2018, but I tried to &lt;em&gt;paint&lt;/em&gt; it when I didn&amp;#8217;t know what I wanted in a painting style, and eventually I gave up.  Flat colors are better for references anyway, so I tried again, and this time I finished!  I&amp;#8217;m really happy with how it came out — I feel like I&amp;#8217;m finally starting to get the hang of art, maybe, just as I hit five years of trying.  Again, it&amp;#8217;s wildly &lt;span class="caps"&gt;NSFW&lt;/span&gt;, but the link is on the&amp;nbsp;calendar.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;All told, I didn&amp;#8217;t &lt;em&gt;quite&lt;/em&gt; end up with 25 distinct things, but I did make some interesting stuff — some of which I&amp;#8217;d been thinking about for a long time — and I&amp;#8217;ll call that a&amp;nbsp;success.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d love to get flathack to the point that it&amp;#8217;s worth playing repeatedly, make more crosswords, and finish PICOtracker — but those will have to wait, since my &lt;a href="https://itch.io/jam/games-made-quick-four"&gt;&lt;span class="caps"&gt;GAMES&lt;/span&gt; &lt;span class="caps"&gt;MADE&lt;/span&gt; &lt;span class="caps"&gt;QUICK&lt;/span&gt;??? &lt;span class="caps"&gt;FOUR&lt;/span&gt;&lt;/a&gt; jam is coming up in a few&amp;nbsp;days!&lt;/p&gt;
&lt;p&gt;And speaking of which, I need to put a bunch of this stuff on &lt;a href="https://itch.io/jam/games-made-quick-four"&gt;Itch&lt;/a&gt;!&lt;/p&gt;</content><category term="release"></category><category term="tech"></category></entry><entry><title>Doom text generator</title><link href="https://eev.ee/release/2019/12/01/doom-text-generator/" rel="alternate"></link><published>2019-12-01T19:48:00-08:00</published><updated>2019-12-01T19:48:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2019-12-01:/release/2019/12/01/doom-text-generator/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Screenshot of a generator with controls for the font, color, scale, and alignment" src="https://eev.ee/media/release/doom-text-generator.png"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://c.eev.ee/doom-text-generator/"&gt;&lt;strong&gt;Doom text generator&lt;/strong&gt;, locally hosted&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’ve been mad my &lt;em&gt;entire life&lt;/em&gt; that one of these didn’t seem to exist.  ZDoom can print arbitrary text, of course, but only if you fuck around writing and compiling an &lt;span class="caps"&gt;ACS&lt;/span&gt; script or whatever!  There’s no console command for it! Outrageous!!!&lt;/p&gt;
&lt;p&gt;So I finally made this.  It took like ten hours, which I have to say, is fucking incredible.&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/doom-text-generator.png" alt="Screenshot of a generator with controls for the font, color, scale, and alignment"&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://c.eev.ee/doom-text-generator/"&gt;&lt;strong&gt;Doom text generator&lt;/strong&gt;, locally&amp;nbsp;hosted&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been mad my &lt;em&gt;entire life&lt;/em&gt; that one of these didn&amp;#8217;t seem to exist.  ZDoom can print arbitrary text, of course, but only if you fuck around writing and compiling an &lt;span class="caps"&gt;ACS&lt;/span&gt; script or whatever!  There&amp;#8217;s no console command for it!&amp;nbsp;Outrageous!!!&lt;/p&gt;
&lt;p&gt;So I finally made this.  It took like ten hours, which I have to say, is fucking&amp;nbsp;incredible.&lt;/p&gt;


&lt;p&gt;I don&amp;#8217;t want to make a whole blog post out of this (I mean it was only ten hours) but a few points of&amp;nbsp;interest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Probably &lt;em&gt;most&lt;/em&gt; of the work was in getting stuff out of Doom and into a usable format.  The end result is a thorny combination of three different file format parsers (half of which I threw away), manual extraction from game files via &lt;span class="caps"&gt;SLADE&lt;/span&gt;, both PyPNG and ImageMagick for some reason, and way too much &lt;span class="caps"&gt;JSON&lt;/span&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know that the small Doom font&amp;#8217;s &lt;code&gt;|&lt;/code&gt; (pipe) character is inexplicably assigned to lowercase &lt;code&gt;y&lt;/code&gt;?  Neither did I!  It&amp;#8217;s the only lowercase letter in the font — it only supports&amp;nbsp;uppercase.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I fucking love &lt;span class="caps"&gt;CSS&lt;/span&gt;&amp;nbsp;grid.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The colors are done using ZDoom&amp;#8217;s font color translation.  I always thought those were palette remappings — which is what &amp;#8220;translation&amp;#8221; means elsewhere in ZDoom — but no!  They actually use the perceptual brightness of the font, stretched to the full range, and then mapped to a color gradient.  It&amp;#8217;s not at all what I expected (which led me to some dead ends early on), but it&amp;#8217;s kind of&amp;nbsp;cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implementing undocumented &lt;span class="caps"&gt;RLE&lt;/span&gt; is fun because if you&amp;#8217;re off by even a byte somewhere you suddenly have either ten times more or ten times less data than you expected and it&amp;#8217;s all complete&amp;nbsp;garbage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I haven&amp;#8217;t put the source code up yet but will eventually.  I want to put it on itch, too, but I have to put together a whole &lt;em&gt;page&lt;/em&gt; and &lt;em&gt;stuff&lt;/em&gt; and I&amp;#8217;m very tired&amp;nbsp;now.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway now you can make your own cool &lt;a href="https://twitter.com/eevee/status/1200830161211363328"&gt;in-game textures&lt;/a&gt; and other shenanigans,&amp;nbsp;enjoy!&lt;/p&gt;</content><category term="release"></category><category term="doom"></category></entry><entry><title>Particle wipe generator</title><link href="https://eev.ee/release/2019/04/20/particle-wipe-generator/" rel="alternate"></link><published>2019-04-20T09:08:00-07:00</published><updated>2019-04-20T09:08:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2019-04-20:/release/2019/04/20/particle-wipe-generator/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Animation of solid orange transitioning to green via a swirl of little fox face shapes" src="https://eev.ee/media/release/particle-wipe-generator.gif"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://eevee.itch.io/particle-wipe-generator"&gt;&lt;strong&gt;Particle wipe generator on itch&lt;/strong&gt;&lt;/a&gt; or &lt;a href="https://c.eev.ee/particle-wipe-generator/"&gt;hosted locally&lt;/a&gt;&lt;br/&gt;
🔗 &lt;a href="https://github.com/eevee/particle-wipe-generator"&gt;&lt;strong&gt;Source code&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a tool for making &lt;em&gt;particle wipes&lt;/em&gt;, a type of transition whose name I made up because I don’t think they have a well-known name!  They can be used in Ren’Py, &lt;span class="caps"&gt;RPG&lt;/span&gt; Maker, or anything that lets you write a shader.&lt;/p&gt;
&lt;p&gt;Most of my games have done screen transitions with simple fades, and I wanted to try something different here, but I couldn’t find a tool to make the effect I wanted.  So I wrote my own.  If you’re interested, here’s how it works:&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator.gif" alt="Animation of solid orange transitioning to green via a swirl of little fox face shapes"&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://eevee.itch.io/particle-wipe-generator"&gt;&lt;strong&gt;Particle wipe generator on itch&lt;/strong&gt;&lt;/a&gt; or &lt;a href="https://c.eev.ee/particle-wipe-generator/"&gt;hosted locally&lt;/a&gt;&lt;br /&gt;
🔗 &lt;a href="https://github.com/eevee/particle-wipe-generator"&gt;&lt;strong&gt;Source&amp;nbsp;code&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a tool for making &lt;em&gt;particle wipes&lt;/em&gt;, a type of transition whose name I made up because I don&amp;#8217;t think they have a well-known name!  They can be used in Ren&amp;#8217;Py, &lt;span class="caps"&gt;RPG&lt;/span&gt; Maker, or anything that lets you write a&amp;nbsp;shader.&lt;/p&gt;
&lt;p&gt;Most of my games have done screen transitions with simple fades, and I wanted to try something different here, but I couldn&amp;#8217;t find a tool to make the effect I wanted.  So I wrote my own.  If you&amp;#8217;re interested, here&amp;#8217;s how it&amp;nbsp;works:&lt;/p&gt;


&lt;h2 id="the-idea"&gt;&lt;a class="toclink" href="#the-idea"&gt;The&amp;nbsp;idea&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I was inspired by two things.  One is Cave Story&amp;#8217;s&amp;nbsp;transitions.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/cave-story-transition.gif" alt="The end of Cave Story's intro cutscene, which transitions to gameplay with an animated pattern of diamonds"&gt;
&lt;/div&gt;

&lt;p&gt;That looks rad, right?  I think it does, anyway.  I wanted to do something similar&amp;nbsp;myself.&lt;/p&gt;
&lt;p&gt;At a glance, this effect looks pretty simple.  The screen is sliced into a grid.  A diamond shape starts expanding from the center of each cell until the cell is filled.  By staggering when each cell &lt;em&gt;starts&lt;/em&gt;, you can make an animation that seems to wipe from the bottom upwards, or from the edges inwards, or who knows what&amp;nbsp;else.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a frame from the above capture, showing the grid.  You can see from the blocks near the middle that it&amp;#8217;s the same as the tile&amp;nbsp;grid.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/cave-story-grid.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;Notice that Cave Story transitions either from a scene to a solid color, or vice versa.  Offhand, I don&amp;#8217;t think the game ever transitions directly between two&amp;nbsp;scenes.&lt;/p&gt;
&lt;p&gt;My &lt;em&gt;guess&lt;/em&gt; is that it&amp;#8217;s manually drawing solid color on top of the tilemap until the entire screen is obscured, switching maps in the background, then reversing the progress.  The various sizes of diamond might even be physical sprites on a foreground&amp;nbsp;layer!&lt;/p&gt;
&lt;p&gt;That poses a slight problem for me, because I want to be able to transition directly between scenes as well.  Enter inspiration number two:&amp;nbsp;Ren&amp;#8217;Py.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.renpy.org/"&gt;Ren&amp;#8217;Py&lt;/a&gt; is a visual novel engine, and it supports a &lt;em&gt;ton&lt;/em&gt; of screen transitions.  That makes sense, since visual novels generally don&amp;#8217;t have much animated &lt;em&gt;art&lt;/em&gt;, so most of the animation happens in transitions and sprite&amp;nbsp;effects.&lt;/p&gt;
&lt;p&gt;One such transition is a generic one called &lt;a href="https://www.renpy.org/doc/html/transitions.html#ImageDissolve"&gt;&lt;code&gt;ImageDissolve&lt;/code&gt;&lt;/a&gt;, which can do a &lt;em&gt;mask transition&lt;/em&gt; (another term I made up).  It takes a grayscale &lt;em&gt;mask&lt;/em&gt;, which tells it the order to reveal pixels.  Where the mask is black, the corresponding pixels of the &amp;#8220;after&amp;#8221; scene are shown almost immediately; where the mask is white, those &amp;#8220;after&amp;#8221; pixels are the last to&amp;nbsp;appear.&lt;/p&gt;
&lt;p&gt;(I suddenly realize that Ren&amp;#8217;Py does that backwards, with white pixels being &lt;em&gt;first&lt;/em&gt;, but that doesn&amp;#8217;t make sense to be since black pixels are&amp;nbsp;zero.)&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s a bit of a mouthful to describe with text, so here&amp;#8217;s a basic example.  A linear gradient from black to white will play out as a straight wipe in the same&amp;nbsp;direction.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/mask-example.gif" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;This approach can capture any kind of transition where pixels are revealed in a given order, and if I implement it with a shader (which is very easy), I can emulate the Cave Story style without being limited to a solid color!&amp;nbsp;Neat!&lt;/p&gt;
&lt;h2 id="the-problem"&gt;&lt;a class="toclink" href="#the-problem"&gt;The&amp;nbsp;problem&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The problem is&amp;#8230;  how do I generate the mask image?  I searched around a bit and found folks who&amp;#8217;d &lt;em&gt;made&lt;/em&gt; transitions for use with Ren&amp;#8217;Py, but no explanation of how they did&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Let me think about emulating Cave Story&amp;#8217;s effect using the mask approach, one step at a&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;Forget about the wipe effect for now and concentrate on a single cell.  When the diamond is just starting to appear, it should be black.  When it completely fills the cell — i.e., when it&amp;#8217;s big enough that its edges just barely touch the cell corners — it should be white.  In the middle somewhere, it should be medium gray.  Imagining (or drawing) a few cases suggests a simple diamond gradient, which seems&amp;nbsp;correct.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/diamond-cell.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;Now for the wipe effect.  All it really does is stagger &lt;em&gt;when the animation starts&lt;/em&gt;.  The upwards wipe, for example, starts animating all the cells on the bottom row, waits some short amount of time, then starts animating all the cells on the next row up, and so on.  An &lt;span class="caps"&gt;ASCII&lt;/span&gt; diagram of this process (for a simplified, smaller screen) might look&amp;nbsp;like:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;   00 |                     XXXXXXXX
   01 |                  XXXXXXXX
R  02 |               XXXXXXXX
o  03 |            XXXXXXXX
w  04 |         XXXXXXXX
   05 |      XXXXXXXX
   06 |   XXXXXXXX
   07 |XXXXXXXX
      +-----------------------------
                  Time
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;My example cell above spans the full range from black to white, but if I want to stagger the cells like this, I need to squash that into a smaller range.  What range, though?  To get that scaling right, I need to know the &lt;em&gt;total time&lt;/em&gt; the entire animation&amp;nbsp;takes.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s kind of a weird question, because nothing I&amp;#8217;m working with actually measures time!  I only have numbers from 0 to 1; the amount of time is really a matter of how fast you play back the&amp;nbsp;animation.&lt;/p&gt;
&lt;p&gt;So let me approach this the other way around.  The total &amp;#8220;time&amp;#8221; is 1, the full range of values I&amp;#8217;m working with.  My example has 8 rows.  Each row starts playing after the row beneath it is ⅜ of the way through its animation; call this fraction the &amp;#8220;delay&amp;#8221;.  There are 7 such delays, one fewer than the number of rows, because the first row doesn&amp;#8217;t have a&amp;nbsp;delay.&lt;/p&gt;
&lt;p&gt;If the length of a single cell&amp;#8217;s animation is &lt;span class="math"&gt;\(t\)&lt;/span&gt; (which is actually a fraction of the length of the whole animation), then the last row starts after a total delay of &lt;span class="math"&gt;\(t \times (8 - 1) \times \frac38\)&lt;/span&gt;.  Its own length is &lt;span class="math"&gt;\(t\)&lt;/span&gt;, and that should bring us to the end of the animation,&amp;nbsp;so:&lt;/p&gt;
&lt;div class="math"&gt;$$
\begin{align*}
1 &amp;amp;= t \times (8 - 1) \times \frac38 + t \\
&amp;amp;= t \times (7 \times \frac38 + 1) \\
&amp;amp;= t \times \frac{29}{8} \\
\Rightarrow t &amp;amp;= \frac{8}{29} \approx 0.276 \\
\end{align*}
$$&lt;/div&gt;
&lt;p&gt;And indeed, if you count characters in the diagram, each bar is 8 long out of a total width of 29.  Neat!  All I have to do is make the bottom cells range from 0 to 0.276, the next row up range from 0.103 to 0.379 (the same size range, but moved up by &lt;span class="math"&gt;\(\frac{8}{29} \times \frac38 = \frac{3}{29}\)&lt;/span&gt;), and so&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;Easy.  Blog post&amp;nbsp;done.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Except&amp;#8230;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I wanted to use &lt;em&gt;hearts&lt;/em&gt;.  And hearts create two new&amp;nbsp;issues.&lt;/p&gt;
&lt;p&gt;The first is that I don&amp;#8217;t know how big a heart would have to grow to cover the entire cell.  For diamonds, that was easy: they&amp;#8217;re symmetrical in the same way as squares, so it&amp;#8217;s obvious that they just need to be big enough to touch the corners.  But how big does a heart have to be to fit a square entirely inside it?  Do I gauge it by hand in an image editor, or&amp;nbsp;what?&lt;/p&gt;
&lt;p&gt;The real problem there is that a heart is, presumably, a &lt;em&gt;bitmap&lt;/em&gt; rather than a simple shape with properties I can examine mathematically.  And even if it were a shape, the math would get pretty ugly pretty&amp;nbsp;quickly.&lt;/p&gt;
&lt;p&gt;But the second problem is worse.  Hearts aren&amp;#8217;t vertically symmetrical, which means a &lt;em&gt;neighboring&lt;/em&gt; heart might poke into a cell and start covering pixels that the native heart hasn&amp;#8217;t covered&amp;nbsp;yet.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/heart-cell-problem.png" alt="A 3×3 grid of hearts expanding out of their cells, showing that the top of a heart can grow into the cell above."&gt;
&lt;/div&gt;

&lt;p&gt;This complicates things considerably.  If I took the naïve approach of gluing together a bunch of independent cells, then the top of each heart would reach the top of its cell and flatten out into a hard border!  Sounds ugly, especially since the grid isn&amp;#8217;t really supposed to be visible in the animation.  (Technically this could happen with diamonds too, if the delay were high enough, but their symmetry makes it much harder to&amp;nbsp;notice.)&lt;/p&gt;
&lt;p&gt;Now, I &lt;em&gt;could&lt;/em&gt; fudge my way through both of these problems with sufficient abuse of an imaging library.  Draw a very tiny black heart, then draw a slightly bigger almost-black heart, and keep expanding until every pixel has a color, then either scale the colors or go back and do it again knowing the correct&amp;nbsp;range.&lt;/p&gt;
&lt;p&gt;But that&amp;#8217;s not a very satisfying solution, and it&amp;#8217;s not very precise — which is important when I only have 256 values to work with.  I can do&amp;nbsp;better!&lt;/p&gt;
&lt;h2 id="doing-better"&gt;&lt;a class="toclink" href="#doing-better"&gt;Doing&amp;nbsp;better&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The approach I used for diamonds above is fairly promising.  It&amp;#8217;s most of the way to a blueprint for figuring out exactly what shade each pixel of the mask should be, independently of any other pixel.  The position within a cell tells me how far along in the &lt;em&gt;cell&amp;#8217;s&lt;/em&gt; animation the pixel is (center black, corners white, everything else somewhere in the middle), and the delay tells me how to scale that to fit correctly in the full&amp;nbsp;animation.&lt;/p&gt;
&lt;p&gt;Those seem like reasonable steps.  All I have to do is fix them to work with an arbitrary &amp;#8220;particle&amp;#8221; shape.&amp;nbsp;Somehow.&lt;/p&gt;
&lt;h3 id="step-1-the-stamp"&gt;&lt;a class="toclink" href="#step-1-the-stamp"&gt;Step 1: the&amp;nbsp;stamp&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Forgetting about the overall animation worked before, so I&amp;#8217;ll do it again and concentrate on a single prototype cell.  That cell will be repeated (with some adjustment) all over the final mask, so I call it a &lt;em&gt;stamp&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I already know in advance that a single cell doesn&amp;#8217;t need to scale from 0 to 1, since I&amp;#8217;ll be adjusting it later anyway, so that frees me up to use any arbitrary quantity — as long as it&amp;#8217;s scaled by some consistent factor I can eliminate later.  A little thinking suggests that what I &lt;em&gt;really&lt;/em&gt; want to know is: given a pixel &lt;span class="math"&gt;\((x, y)\)&lt;/span&gt; within a cell, &lt;em&gt;how big&lt;/em&gt; does the heart particle have to grow to hit that pixel?  I can express that as a &lt;em&gt;fraction&lt;/em&gt; of the particle&amp;#8217;s original size (since it should grow proportionally), and then worry about scaling it down&amp;nbsp;later.&lt;/p&gt;
&lt;p&gt;The first thing I want to do is change my coordinate system.  Consider: for a 10×10 cell, the center is at the point (5, 5), which neighbors pixels (4, 4) and (5, 5).  But that would mean the heart would touch the pixel at (5, 5) &lt;em&gt;immediately&lt;/em&gt;, whereas it would need to cross a whole pixel to reach (4, 4), even though both pixels touch the&amp;nbsp;center!&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/coord-problem.png" alt="Close zoom of the problem described above, with the top-left corners of pixels in red, and their centers in blue"&gt;
&lt;/div&gt;

&lt;p&gt;Pixel coordinates refer to the &lt;em&gt;top left corners&lt;/em&gt; of the pixels, indicated in red above.  The center is a point, not a pixel, and it&amp;#8217;s clearly much closer to one pixel coordinate than the other.  The fix is to use the &lt;em&gt;centers&lt;/em&gt; of pixels, indicated in blue, which are the same distance from where the heart starts.&amp;nbsp;Phew!&lt;/p&gt;
&lt;p&gt;(If you don&amp;#8217;t do this, you&amp;#8217;ll get a very noticeable diagonal gash where the particle touched lower-right pixels earlier than upper-left ones.  Guess how I found that&amp;nbsp;out!)&lt;/p&gt;
&lt;p&gt;While I&amp;#8217;m at it, pixel coordinates are relative to the upper-left corner of the cell, but the most interesting point here is the &lt;em&gt;center&lt;/em&gt;.  So let&amp;#8217;s make them relative to that, too.  That means (4, 4) and (5, 5) should really be (-½, -½) and (½, ½), or more generally: given a center at &lt;span class="math"&gt;\((c_x, c_y)\)&lt;/span&gt;, the point I&amp;#8217;m actually interested in is &lt;span class="math"&gt;\((x + \frac{1}{2} - c_x, y + \frac{1}{2} - c_y)\)&lt;/span&gt;.  Call this, I dunno, &lt;span class="math"&gt;\((d_x, d_y)\)&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Back to the actual problem, which is: how big does the particle need to grow to hit this&amp;nbsp;point?&lt;/p&gt;
&lt;p&gt;Like I said before, I could try scaling the particle up bit by bit (maybe binary search?) until it touches the point, but that still feels goofy and&amp;nbsp;imprecise.&lt;/p&gt;
&lt;p&gt;You know, it sucks that the particle is a two-dimensional shape.  It would be swell if I could eliminate a dimension here, or&amp;nbsp;something.&lt;/p&gt;
&lt;p&gt;And here I borrow a couple techniques from collision detection.  Scaling the particle &lt;em&gt;up&lt;/em&gt; is equivalent to scaling the entire cell &lt;em&gt;down&lt;/em&gt;.  If I scaled the cell down towards the origin, the point would trace a straight&amp;nbsp;line.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/inverse-scaling.gif" alt="Animation of a grid scaling down towards the origin, showing that a point traces a straight line"&gt;
&lt;/div&gt;

&lt;p&gt;This is &lt;em&gt;very&lt;/em&gt; helpful.  It means I can solve this problem with a raycast: fire a straight ray into the particle, towards its center, and check each pixel it hits until I find an opaque one.  That&amp;#8217;ll give me a &lt;em&gt;perfect&lt;/em&gt;&amp;nbsp;answer!&lt;/p&gt;
&lt;p&gt;But where does the ray start?  I have a point in the grid, but not a point on the particle.  So the first question is: if the particle scaled up just enough that the &lt;em&gt;edge of the particle image&lt;/em&gt; touched the point, where &lt;em&gt;on the particle&lt;/em&gt; would that contact&amp;nbsp;be?&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/particle-touch.png" alt="The same point as before, but with the particle grown to barely touch it"&gt;
&lt;/div&gt;

&lt;p&gt;Call the particle dimensions &lt;span class="math"&gt;\(p_w\)&lt;/span&gt; by &lt;span class="math"&gt;\(p_h\)&lt;/span&gt;.  (My heart is contained within a square, but that isn&amp;#8217;t strictly necessary.)  In order to reach x-coordinate &lt;span class="math"&gt;\(d_x\)&lt;/span&gt;, the particle would have to be twice as wide as the distance from the y-axis to that point — because it&amp;#8217;s centered! — which is &lt;span class="math"&gt;\(\left|2 d_x\right|\)&lt;/span&gt; pixels wide.  Its scale, relative to its original size, would thus be &lt;span class="math"&gt;\(\frac{\left|2 d_x\right|}{p_w}\)&lt;/span&gt;.  The scale for touching the y-coordinate would be computed the same way.  To actually touch the &lt;em&gt;point&lt;/em&gt;, the particle has to reach whichever coordinate is further away, so its scale must&amp;nbsp;be:&lt;/p&gt;
&lt;div class="math"&gt;$$
s = \max\left(\frac{\left|2 d_x\right|}{p_w}, \frac{\left|2 d_y\right|}{p_h}\right)
$$&lt;/div&gt;
&lt;p&gt;A special case crops up here: for a cell with an odd width and height, the center pixel is exactly aligned with the origin, and the scale computes to &lt;em&gt;zero&lt;/em&gt;.  I&amp;#8217;m doing some division in a moment, so that&amp;#8217;s very bad — but the center pixel is effectively touched immediately, so I can say the final answer for this pixel is 0 and skip the rest of this&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;Now for the fun part!  When the expanding particle hits the point of interest, it makes contact at some point &lt;em&gt;on the original particle&lt;/em&gt; image.  If the necessary scale is &lt;span class="math"&gt;\(s\)&lt;/span&gt;, the contact point is the center of the particle, offset by &lt;span class="math"&gt;\(\left(\frac{d_x}{s}, \frac{d_y}{s}\right)\)&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;And now I raycast from that point to the center of the particle and check every pixel that ray crosses, using a &lt;a href="http://www.idav.ucdavis.edu/education/GraphicsNotes/Bresenhams-Algorithm/Bresenhams-Algorithm.html"&gt;modified Bresenham&amp;#8217;s algorithm&lt;/a&gt; — originally intended for drawing pixel-perfect lines, but perfectly suited for casting a ray through a grid as well.  (Conveniently, I&amp;#8217;d already implemented this sort of raycast for collision detection for this very same game!  Then I ended up not using it,&amp;nbsp;hm.)&lt;/p&gt;
&lt;p&gt;When I find an opaque-ish pixel (alpha of 0.5 or greater), I compute its distance from the center, divide by the distance from the contact point to the center — that tells me how much bigger the particle has to grow for the opaque-ish pixel I found to actually touch the&amp;nbsp;point.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/particle-final-scale.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;Multiply that ratio by the &lt;span class="math"&gt;\(s\)&lt;/span&gt; I found earlier, and the result is exactly what I was looking for: the scale of the particle when it touches the&amp;nbsp;point!&lt;/p&gt;
&lt;p&gt;Now, raycasting for every pixel in the stamp — a thousand times even for a dinky cell size of 32×32 — is not exactly &lt;em&gt;speedy&lt;/em&gt;.  But it&amp;#8217;s not unbearably slow, either.  And this is something that&amp;#8217;s generated &lt;em&gt;once&lt;/em&gt; and played back a bunch of times, so why not spend a little &lt;span class="caps"&gt;CPU&lt;/span&gt; time upfront making it as high-quality as I can&amp;nbsp;manage?&lt;/p&gt;
&lt;p&gt;Anyway, that&amp;#8217;s the hard part done!  Now I can put the mask&amp;nbsp;together.&lt;/p&gt;
&lt;h3 id="phase-2-the-mask"&gt;&lt;a class="toclink" href="#phase-2-the-mask"&gt;Phase 2: the&amp;nbsp;mask&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With the stamp generated, I also know how big the particle has to grow for the entire cell to be covered: it&amp;#8217;s just the highest scale in the stamp.  For a simple full-screen effect, all I&amp;#8217;d have to do at this point is scale the stamp values into the range [0, 1] and copy them to every cell in the&amp;nbsp;grid.&lt;/p&gt;
&lt;p&gt;But that&amp;#8217;s boring; I wanted a &lt;em&gt;wipe&lt;/em&gt;, which requires a couple more&amp;nbsp;twiddles.&lt;/p&gt;
&lt;p&gt;The wipe is essentially a second animation that controls when each cell&amp;#8217;s individual animation starts.  Above I considered a row-by-row wipe; for Cherry Kisses I ended up with a column-by-column wipe; Cave Story also has an &amp;#8220;inwards&amp;#8221; wipe.  All of these can be generalized as numbered steps in a&amp;nbsp;grid:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;
&lt;span class="normal"&gt;9&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;By row      By column   Inwards
77777777    76543210    01233210
66666666    76543210    12344321
55555555    76543210    23455432
44444444    76543210    34566543
33333333    76543210    34566543
22222222    76543210    23455432
11111111    76543210    12344321
00000000    76543210    01233210
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The math is basically already done; I did it above.  Given the number of steps &lt;span class="math"&gt;\(n\)&lt;/span&gt; and the delay &lt;span class="math"&gt;\(d\)&lt;/span&gt; (a fraction of the cell animation time), I can find the length of a cell animation &lt;span class="math"&gt;\(t\)&lt;/span&gt; as&amp;nbsp;follows:&lt;/p&gt;
&lt;div class="math"&gt;$$
\begin{align*}
1 &amp;amp;= t \times (n - 1) \times d + t \\
&amp;amp;= t \times ((n - 1) \times d + 1) \\
\Rightarrow t &amp;amp;= \frac{1}{n d - d + 1}
\end{align*}
$$&lt;/div&gt;
&lt;p&gt;The process for generating the whole mask is&amp;nbsp;thus:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Iterate over each pixel of the&amp;nbsp;mask.&lt;/li&gt;
&lt;li&gt;Figure out what cell it&amp;#8217;s in, and the step for that&amp;nbsp;cell.&lt;/li&gt;
&lt;li&gt;Find the corresponding value in the stamp, scale it to the size of a cell animation, and add in the&amp;nbsp;delay.&lt;/li&gt;
&lt;li&gt;Write that to the&amp;nbsp;mask.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once every pixel is done, the mask is&amp;nbsp;complete!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Except&amp;#8230;&lt;/em&gt;  this didn&amp;#8217;t handle the overlap issue.  No problem, though; that&amp;#8217;s surprisingly simple to&amp;nbsp;fix.&lt;/p&gt;
&lt;p&gt;First, expand the stamp to the size of a 3×3 block of cells.  The maximum scale for a stamp should only be taken from the &lt;em&gt;central&lt;/em&gt; cell; the others are for the following&amp;nbsp;process.&lt;/p&gt;
&lt;p&gt;Then, when reading a pixel&amp;#8217;s stamp in step 3 above, read it from the central cell — &lt;em&gt;and also&lt;/em&gt; from the neighboring cells.  In those neighbors, I read from the stamp cell on the opposite side, in order to know how long it would take for the heart to grow &lt;em&gt;out&lt;/em&gt; of that cell and into this&amp;nbsp;one.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/overlap-problem.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;(Diagonal neighbors aren&amp;#8217;t shown here, but you get the&amp;nbsp;idea.)&lt;/p&gt;
&lt;p&gt;Since different cells may have different start times, I may need to add/subtract some extra delay from the neighbors&amp;#8217; values.  Then I take the &lt;em&gt;smallest&lt;/em&gt; of all these samples to figure out the &lt;em&gt;earliest&lt;/em&gt; time that any heart — either in this cell, or one of its neighbors — hits the&amp;nbsp;pixel.&lt;/p&gt;
&lt;p&gt;And hey, presto, we&amp;#8217;re done!  Here&amp;#8217;s a (somewhat laggy) recording I took of the very first time I got this working for Cherry&amp;nbsp;Kisses:&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/cherry-kisses-initial.gif" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;It ended up a little nicer-looking than that, of course.  (Feel free to play the game to see it in action?)  And if you&amp;#8217;re curious, here&amp;#8217;s the mask from the final&amp;nbsp;game:&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/particle-wipe-generator/cherry-kisses-mask.png" alt=""&gt;
&lt;/div&gt;

&lt;h3 id="caveats"&gt;&lt;a class="toclink" href="#caveats"&gt;Caveats&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There&amp;#8217;s one teeny tiny problem still lingering in this approach.  I assume that the whole animation ends when the last cell animation ends, but because of cell overlap, it might actually end &lt;em&gt;earlier&lt;/em&gt;.  And indeed, when I went back to check the Cherry Kisses mask, I found that it ends early — the brightest color in it is #e2e2e2.  Oops.  So much for that ludicrous&amp;nbsp;accuracy!&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s still fixable by taking overlap into account when finding the maximum value in the stamp, but I haven&amp;#8217;t done it yet, and it&amp;#8217;s a bit more complicated if the grid pattern has adjacent cells that are more than 1 step apart.  (Those cases can also lead to particles mashing against the cell edge too early, which could be fixed by using a 5×5 or larger&amp;nbsp;stamp&amp;#8230;)&lt;/p&gt;
&lt;h2 id="thats-it"&gt;&lt;a class="toclink" href="#thats-it"&gt;That's&amp;nbsp;it&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yep.  The particle generator is just this logic with some knobs bolted on.  It has a couple extra features, like a &amp;#8220;halo&amp;#8221; that highlights the transition point, and using all three color channels for extra precision, but it&amp;#8217;s all built on the same basic&amp;nbsp;idea.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a lot of room for experimentation and variety here, and I&amp;#8217;ve probably only scratched the surface.  This is only a tiny subset of what can be done with a transition mask, too — it needn&amp;#8217;t rely on a grid at all!  See what you can come up&amp;nbsp;with.&lt;/p&gt;
&lt;p&gt;Oh, and here&amp;#8217;s the exact shader I used in Cherry Kisses.  It&amp;#8217;s for LÖVE, so it has a couple non-standard &lt;code&gt;#define&lt;/code&gt;s and globals, but you get the idea.  The &amp;#8220;ramp&amp;#8221; is just a tolerance that adds a soft edge around the&amp;nbsp;transition.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;extern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="kr"&gt;extern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="kr"&gt;extern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ramp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="kt"&gt;vec4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;vec4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;texture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tex_coords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;screen_coords&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;vec4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Texel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tex_coords&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;discriminator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Texel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;screen_coords&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;love_ScreenSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;discriminator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ramp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Happy&amp;nbsp;transitioning!&lt;/p&gt;
&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="release"></category></entry><entry><title>Alice’s Day Off demo</title><link href="https://eev.ee/release/2018/03/02/alices-day-off-demo/" rel="alternate"></link><published>2018-03-02T16:00:00-08:00</published><updated>2018-03-02T16:00:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2018-03-02:/release/2018/03/02/alices-day-off-demo/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="" src="https://eev.ee/media/release/alices-day-off-demo.png"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://floraverse.itch.io/alices-day-off-demo"&gt;&lt;strong&gt;Alice’s Day Off demo on itch&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🚨🔞 &lt;strong&gt;&lt;span class="caps"&gt;HEADS&lt;/span&gt; &lt;span class="caps"&gt;UP&lt;/span&gt;&lt;/strong&gt;: This game is &lt;em&gt;super duper&lt;/em&gt; &lt;strong&gt;&lt;span class="caps"&gt;NSFW&lt;/span&gt;&lt;/strong&gt;.  It contains explicit cartoon porn.  You have been warned! 🔞🚨&lt;/p&gt;
&lt;p&gt;This is the game glip and I (and a co-writer) made for my horny game jam, &lt;a href="https://itch.io/jam/strawberry-jam-2"&gt;Strawberry Jam 2&lt;/a&gt;.  It’s a goofy visual novel about, well…  sex, mostly.  A few folks with no interest in the subject matter have played it and still enjoyed it, which seems like a great sign.&lt;/p&gt;
&lt;p&gt;(Oh, right, and the jam is over, and has &lt;em&gt;63 entries&lt;/em&gt;!  Like last year, they run the gamut from “highly abstract and thoughtful” to “let’s put porn in a game”.)&lt;/p&gt;
&lt;p&gt;Some lingering thoughts about the process itself:&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/alices-day-off-demo.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://floraverse.itch.io/alices-day-off-demo"&gt;&lt;strong&gt;Alice&amp;#8217;s Day Off demo on&amp;nbsp;itch&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🚨🔞 &lt;strong&gt;&lt;span class="caps"&gt;HEADS&lt;/span&gt; &lt;span class="caps"&gt;UP&lt;/span&gt;&lt;/strong&gt;: This game is &lt;em&gt;super duper&lt;/em&gt; &lt;strong&gt;&lt;span class="caps"&gt;NSFW&lt;/span&gt;&lt;/strong&gt;.  It contains explicit cartoon porn.  You have been warned!&amp;nbsp;🔞🚨&lt;/p&gt;
&lt;p&gt;This is the game glip and I (and a co-writer) made for my horny game jam, &lt;a href="https://itch.io/jam/strawberry-jam-2"&gt;Strawberry Jam 2&lt;/a&gt;.  It&amp;#8217;s a goofy visual novel about, well…  sex, mostly.  A few folks with no interest in the subject matter have played it and still enjoyed it, which seems like a great&amp;nbsp;sign.&lt;/p&gt;
&lt;p&gt;(Oh, right, and the jam is over, and has &lt;em&gt;63 entries&lt;/em&gt;!  Like last year, they run the gamut from &amp;#8220;highly abstract and thoughtful&amp;#8221; to &amp;#8220;let&amp;#8217;s put porn in a&amp;nbsp;game&amp;#8221;.)&lt;/p&gt;
&lt;p&gt;Some lingering thoughts about the process&amp;nbsp;itself:&lt;/p&gt;


&lt;hr /&gt;
&lt;p&gt;Visual novels combine narrative prose with the interaction of games, but the two forces are somewhat at odds: the more interaction you add, the more prose you have to write, with the worst case being a combinatoric explosion (which won&amp;#8217;t even be appreciated by players who run through only once).  And there&amp;#8217;s a subtle tension between the design of those decisions and replay value, which&amp;#8230;  I maybe ought to go on about some other&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;Anyway, this is all really a distilled form of the problem of offering narrative choice in games in general, which I find &lt;em&gt;fascinating&lt;/em&gt;, so I &lt;em&gt;really&lt;/em&gt; wanted to play around with it.  I have a few ideas for experimenting with what player choice even &lt;em&gt;looks like&lt;/em&gt; in a visual novel, and we have thoughts about narrative variety at all levels so there&amp;#8217;s something to appreciate no matter how much or little you replay the&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;Alas!  We had to drastically cut down what we wanted to do due to time constraints, hence calling this a &amp;#8220;demo&amp;#8221;; it&amp;#8217;s a sample of ten (mostly linear) routes.  It&amp;#8217;s good stuff, I&amp;#8217;m happy with how it came out, and there&amp;#8217;s a pretty decent chunk of it — I think a straight read in one sitting takes about an hour — but I naturally compare it to everything I know &lt;em&gt;isn&amp;#8217;t&lt;/em&gt;&amp;nbsp;there.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This was my first time using Ren&amp;#8217;Py, and it defied my assumptions so utterly that I have to go write a separate post about it now.  I think it came out &lt;em&gt;pretty well&lt;/em&gt;, considering I&amp;#8217;d never touched the engine before three weeks&amp;nbsp;ago.&lt;/p&gt;
&lt;p&gt;The touch I like the most is the custom title screen, seen above.  I think it&amp;#8217;s fairly important to hide obvious traces of the engine you&amp;#8217;re using, when feasible; otherwise the end result is covered in someone else&amp;#8217;s (generic) fingerprints, not &lt;em&gt;yours&lt;/em&gt;.  So we added a splash, added a title screen, and completely changed the in-game interface.  (The in-game menu is basically the same, but it&amp;#8217;s general-purpose enough that I&amp;#8217;m not sure it&amp;#8217;s really worth changing.&amp;nbsp;Maybe?)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Part of the point of this exercise was to force me to actually sit down and &lt;em&gt;write a story&lt;/em&gt;, an activity I often attempt to do and then awkwardly shy away from.  It feels like pushing against a river of molasses: it takes me &lt;em&gt;so long&lt;/em&gt; just to get started at &lt;em&gt;all&lt;/em&gt;, and if I stumble even slightly, I lose my momentum completely and have to start all over.  It&amp;#8217;s my &lt;span class="caps"&gt;ADD&lt;/span&gt; final&amp;nbsp;boss.&lt;/p&gt;
&lt;p&gt;Suffice to say, I spent a good chunk of the month mostly &lt;em&gt;not-writing&lt;/em&gt;, which was frustrating and didn&amp;#8217;t get us very far.  It wasn&amp;#8217;t until the final week that I felt like I really hit my stride and started churning out big chunks of prose at a time.  I don&amp;#8217;t have any inspirational tale about how this happened; I just kept trying to do it and failing to do it until I finally did it.  Hopefully it&amp;#8217;ll be easier to get into from now&amp;nbsp;on!&lt;/p&gt;
&lt;p&gt;I did half the writing, and it&amp;#8217;s endlessly hilarious to me that my co-writer and I &lt;em&gt;both&lt;/em&gt; looked at each other&amp;#8217;s prose and came away thinking &amp;#8220;damn, I need to do it more like &lt;em&gt;that&lt;/em&gt;!&amp;#8221;  Probably a good&amp;nbsp;sign.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s all I&amp;#8217;ve got; back to&amp;nbsp;work!&lt;/p&gt;</content><category term="release"></category><category term="nsfw"></category></entry><entry><title>Strawberry Jam 2 🍓</title><link href="https://eev.ee/release/2018/01/24/strawberry-jam-2/" rel="alternate"></link><published>2018-01-24T00:30:00-08:00</published><updated>2018-01-24T00:30:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2018-01-24:/release/2018/01/24/strawberry-jam-2/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="" src="https://eev.ee/media/release/strawberryjam2.png"/&gt;
&lt;/div&gt;
&lt;p&gt;🔗 &lt;a href="https://itch.io/jam/strawberry-jam-2"&gt;&lt;strong&gt;Strawberry Jam 2 on itch&lt;/strong&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;I’m running a game jam, and &lt;em&gt;this&lt;/em&gt; announcement is &lt;em&gt;before&lt;/em&gt; the jam starts!  What a concept!&lt;/p&gt;
&lt;p&gt;The idea is simple: you have all of February to make a &lt;em&gt;horny game&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;(This jam is, as you may have guessed, &lt;strong&gt;&lt;span class="caps"&gt;NSFW&lt;/span&gt;&lt;/strong&gt;. 🔞)&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/strawberryjam2.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://itch.io/jam/strawberry-jam-2"&gt;&lt;strong&gt;Strawberry Jam 2 on&amp;nbsp;itch&lt;/strong&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;I&amp;#8217;m running a game jam, and &lt;em&gt;this&lt;/em&gt; announcement is &lt;em&gt;before&lt;/em&gt; the jam starts!  What a&amp;nbsp;concept!&lt;/p&gt;
&lt;p&gt;The idea is simple: you have all of February to make a &lt;em&gt;horny game&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;(This jam is, as you may have guessed, &lt;strong&gt;&lt;span class="caps"&gt;NSFW&lt;/span&gt;&lt;/strong&gt;.&amp;nbsp;🔞)&lt;/p&gt;


&lt;hr /&gt;
&lt;p&gt;I think there&amp;#8217;s a lot of interesting potential at the intersection of sex and games, but we see very little exploration of it — in large part because mega-platforms like Steam (and its predecessor, Walmart) have historically been really squeamish about anything sexual.  Unless it&amp;#8217;s scantily-clad women draped over everything, that&amp;#8217;s fine.  But &lt;em&gt;un&lt;/em&gt;-clad women are right out.  Also gratuitous high-definition gore is cool.  But no&amp;nbsp;nipples!!&lt;/p&gt;
&lt;p&gt;The result is a paltry cultural volume of games &lt;em&gt;about sex&lt;/em&gt;, but as boundaries continue to be pushed without really being broken, we get more and more blockbuster games with sex &lt;em&gt;awkwardly tacked on top&lt;/em&gt; as lazy titillation.  &amp;#8220;Ah, it&amp;#8217;s a story-driven role-playing shooter, but in this one part you can have sex, which will affect nothing and never come up again, but you can see a &lt;em&gt;butt&lt;/em&gt;!&amp;#8221;  Truly&amp;nbsp;revolutionary.&lt;/p&gt;
&lt;p&gt;The opposite end of the spectrum also exists, in the form of porn games where the &lt;em&gt;game&lt;/em&gt; part is tacked on to make something interactive — you know, click really fast to make clothes fall off or whatever.  It&amp;#8217;s not &lt;em&gt;especially&lt;/em&gt; engaging, but it&amp;#8217;s more compelling than staring at a &lt;span class="caps"&gt;JPEG&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;So my secret motive here is to encourage people to explore the vast gulf in the middle — to make games that are interesting as games &lt;em&gt;and&lt;/em&gt; that feature sexuality as a &lt;em&gt;fundamental part of the game&lt;/em&gt;.  Something where both parts could stand alone, yet are so intertwined as to be&amp;nbsp;inseparable.&lt;/p&gt;
&lt;p&gt;The one genre that &lt;em&gt;is&lt;/em&gt; seeing a lot of experimentation is the raunchy visual novel, which is a great example: they tend to tell stories where sexuality plays a heavy part, but they&amp;#8217;re still compelling interactive stories and hold up on those grounds just as well.  What, I wonder, would this same sort of harmony look like for other genres, other kinds of interaction?  What does a horny racing game look like, or a horny inventory-horror game, or a horny brawler?  Hell, why are there no horny co-op games to speak of?  That seems obvious,&amp;nbsp;right?&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t said all this on the jam page because it would add half a dozen paragraphs to what is already a lengthy document.  I also suspect that I&amp;#8217;ll sound like I&amp;#8217;m suggesting &amp;#8220;a racing game but all the cars are dicks,&amp;#8221; which isn&amp;#8217;t &lt;em&gt;quite&lt;/em&gt; right, and I&amp;#8217;d need to blather even more to clarify.  Anyway, it seems vaguely improper as the jam organizer to be telling people what kind of games &lt;em&gt;not&lt;/em&gt; to make; last year I just tried to lead by example by making &lt;a href="https://eevee.itch.io/fox-flux"&gt;fox flux&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;If exploring this design space seems interesting to you, please do join in!  If you&amp;#8217;ve never made a game before, this might be a great opportunity to give it a try — everything is going to be embarrassing and personal regardless.  Maybe hop on &lt;a href="http://discord.gg/uussQdz"&gt;Discord&lt;/a&gt; if you need help or want a teammate.  Feel free to flip through &lt;a href="https://itch.io/jam/strawberry-jam/entries"&gt;last year&amp;#8217;s entries&lt;/a&gt;, too, or my (&lt;strong&gt;super nsfw&lt;/strong&gt;) &lt;a href="https://twitter.com/squishfox/status/838196998826139649"&gt;thread where I played some and talked about them&lt;/a&gt;.  &lt;em&gt;Some&lt;/em&gt; of them are even open source, cough,&amp;nbsp;cough.&lt;/p&gt;
&lt;p&gt;Previously:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://itch.io/jam/strawberry-jam"&gt;Strawberry Jam&lt;/a&gt;&amp;nbsp;(2017)&lt;/li&gt;
&lt;/ul&gt;</content><category term="release"></category><category term="nsfw"></category></entry><entry><title>GDQ schedule dimmer</title><link href="https://eev.ee/release/2018/01/23/gdq-schedule-dimmer/" rel="alternate"></link><published>2018-01-23T23:35:00-08:00</published><updated>2018-01-23T23:35:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2018-01-23:/release/2018/01/23/gdq-schedule-dimmer/</id><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/gdq-schedule-dimmer.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/eevee/userscripts/blob/master/gdq-schedule-dimmer.user.js"&gt;&lt;strong&gt;Source code on GitHub&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
🔗 &lt;a href="https://c.eev.ee/userscripts/gdq-schedule-dimmer.user.js"&gt;&lt;strong&gt;Install,&amp;nbsp;maybe&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Does &lt;em&gt;this&lt;/em&gt; ever happen to &lt;em&gt;you&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;[&lt;span class="caps"&gt;TODO&lt;/span&gt;: insert black and white gif of someone struggling to read the &lt;span class="caps"&gt;GDQ&lt;/span&gt; schedule because it&amp;#8217;s a single long table and it&amp;#8217;s hard to even keep track of what day you&amp;#8217;re looking at, let alone find out what&amp;#8217;s going on right&amp;nbsp;now]&lt;/p&gt;
&lt;p&gt;Well, no more!  Thanks to the power of IavaScript, now it&amp;#8217;s like the picture above, which I guess gave it away&amp;nbsp;huh.&lt;/p&gt;
&lt;p&gt;Not very useful &lt;em&gt;now&lt;/em&gt;, since I forgot to even post about it here before &lt;span class="caps"&gt;AGDQ&lt;/span&gt; ended, but presumably useful in &lt;span class="caps"&gt;SGDQ&lt;/span&gt; since they never seem to change this page at&amp;nbsp;all.&lt;/p&gt;
&lt;p&gt;Wait!  Before you click on the &amp;#8220;install&amp;#8221; link above.  Firefox users will need &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/"&gt;Greasemonkey&lt;/a&gt;.  Chrome used to support user scripts natively, and legends say it still does, but there are so many walls around extensions now that I couldn&amp;#8217;t figure out how to make it work, so just get &lt;a href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=en"&gt;Tampermonkey&lt;/a&gt;, which is also available for &lt;a href="https://tampermonkey.net/"&gt;most other browsers&lt;/a&gt;.&lt;/p&gt;</content><category term="release"></category></entry><entry><title>GAMES MADE QUICK??? 2.0</title><link href="https://eev.ee/release/2018/01/23/games-made-quick-2-0/" rel="alternate"></link><published>2018-01-23T23:25:00-08:00</published><updated>2018-01-23T23:25:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2018-01-23:/release/2018/01/23/games-made-quick-2-0/</id><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/release/gamesmadequick2.png" alt=""&gt;
&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://itch.io/jam/games-made-quick-2"&gt;&lt;strong&gt;&lt;span class="caps"&gt;GAMES&lt;/span&gt; &lt;span class="caps"&gt;MADE&lt;/span&gt; &lt;span class="caps"&gt;QUICK&lt;/span&gt;??? 2.0 on&amp;nbsp;itch&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I realize, with all the cognitive speed and grace of a cat falling out of a chair, that I have my own website where I can announce things that I am&amp;nbsp;doing.&lt;/p&gt;
&lt;p&gt;Here is a thing that I am having done: it&amp;#8217;s &lt;span class="caps"&gt;GAMES&lt;/span&gt; &lt;span class="caps"&gt;MADE&lt;/span&gt; &lt;span class="caps"&gt;QUICK&lt;/span&gt;??? 2.0, a game jam that runs concurrently with &lt;a href="https://gamesdonequick.com/"&gt;Games Done Quick&lt;/a&gt;.  The inspiration was that I once spent the &lt;em&gt;entire week&lt;/em&gt; of &lt;span class="caps"&gt;AGDQ&lt;/span&gt; doing nothing but watching the stream, which completely ruined my momentum and cost me the &lt;em&gt;following&lt;/em&gt; week as well while I struggled to get back up to speed.  What a&amp;nbsp;catastrophe!&lt;/p&gt;
&lt;p&gt;So my solution was to spend the week making a game instead, which prompted someone to suggest that I make a jam out of it, and so I did.  The results were &lt;a href="https://eevee.itch.io/neon-phase"&gt;&lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt;&lt;/a&gt; and also the original &lt;a href="https://itch.io/jam/games-made-quick"&gt;&lt;span class="caps"&gt;GAMES&lt;/span&gt; &lt;span class="caps"&gt;MADE&lt;/span&gt; &lt;span class="caps"&gt;QUICK&lt;/span&gt;???&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a bit late to join now, but look forward to the jam during &lt;span class="caps"&gt;SGDQ&lt;/span&gt;, which runs the last week of June!  In the meantime, perhaps &lt;a href="https://itch.io/jam/games-made-quick-2/entries"&gt;peruse the fruits of this season&amp;#8217;s labor&lt;/a&gt;, or at least glance over &lt;a href="https://eev.ee/blog/2018/01/23/super-game-night-3-games-made-quick-2-0/"&gt;my thoughts on some of them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Previously:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://itch.io/jam/games-made-quick-one-and-a-half"&gt;&lt;span class="caps"&gt;GAMES&lt;/span&gt; &lt;span class="caps"&gt;MADE&lt;/span&gt; &lt;span class="caps"&gt;QUICK&lt;/span&gt;??? 1½&lt;/a&gt; (&lt;span class="caps"&gt;SGDQ&lt;/span&gt;&amp;nbsp;2017)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itch.io/jam/games-made-quick"&gt;&lt;span class="caps"&gt;GAMES&lt;/span&gt; &lt;span class="caps"&gt;MADE&lt;/span&gt; &lt;span class="caps"&gt;QUICK&lt;/span&gt;???&lt;/a&gt; (&lt;span class="caps"&gt;AGDQ&lt;/span&gt;&amp;nbsp;2017)&lt;/li&gt;
&lt;/ul&gt;</content><category term="release"></category><category term="gamedev"></category></entry><entry><title>Roguelike Simulator</title><link href="https://eev.ee/release/2017/12/09/roguelike-simulator/" rel="alternate"></link><published>2017-12-09T22:59:00-08:00</published><updated>2017-12-09T22:59:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2017-12-09:/release/2017/12/09/roguelike-simulator/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Screenshot of a monochromatic pixel-art game designed to look mostly like ASCII text" src="https://eev.ee/media/2017-12-09-roguelike-simulator/roguelike-simulator.png"/&gt;
&lt;/div&gt;
&lt;p&gt;On a recent &lt;a href="https://eev.ee/blog/2017/12/05/game-night-1-lisa-lisa-moop/"&gt;game night&lt;/a&gt;, glip and I stumbled upon &lt;a href="https://ledoux.itch.io/bitsy"&gt;bitsy&lt;/a&gt; — a tiny game maker for “games where you can walk around and talk to people and be somewhere.”  It’s enough of a genre to have become a &lt;a href="https://itch.io/games/tag-bitsy"&gt;top tag&lt;/a&gt; on itch, so we flicked through a couple games.&lt;/p&gt;
&lt;p&gt;What we found were tiny windows into numerous little worlds, ill-defined yet crisply rendered in chunky two-colored pixels.  Indeed, &lt;em&gt;all&lt;/em&gt; you can do is walk around and talk to people and be somewhere, but the &lt;em&gt;somewheres&lt;/em&gt; are strangely captivating.  My favorite was &lt;a href="https://candle.itch.io/castle"&gt;the last days of our castle&lt;/a&gt;, with &lt;a href="https://seansleblanc.itch.io/a-day-on-the-town"&gt;a day on the town&lt;/a&gt; in a close second (though it cheated and extended the engine a bit), but there are several hundred of these tiny windows available.  Just single, short, minimal, interactive glimpses of an idea.&lt;/p&gt;
&lt;p&gt;I’ve been wanting to do more of that, so I gave it a shot today.  The result is &lt;a href="https://eevee.itch.io/roguelike-simulator"&gt;&lt;strong&gt;Roguelike Simulator&lt;/strong&gt;&lt;/a&gt;, a game that condenses the NetHack experience into about ninety seconds.&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2017-12-09-roguelike-simulator/roguelike-simulator.png" alt="Screenshot of a monochromatic pixel-art game designed to look mostly like ASCII text"&gt;
&lt;/div&gt;

&lt;p&gt;On a recent &lt;a href="https://eev.ee/blog/2017/12/05/game-night-1-lisa-lisa-moop/"&gt;game night&lt;/a&gt;, glip and I stumbled upon &lt;a href="https://ledoux.itch.io/bitsy"&gt;bitsy&lt;/a&gt; — a tiny game maker for &amp;#8220;games where you can walk around and talk to people and be somewhere.&amp;#8221;  It&amp;#8217;s enough of a genre to have become a &lt;a href="https://itch.io/games/tag-bitsy"&gt;top tag&lt;/a&gt; on itch, so we flicked through a couple&amp;nbsp;games.&lt;/p&gt;
&lt;p&gt;What we found were tiny windows into numerous little worlds, ill-defined yet crisply rendered in chunky two-colored pixels.  Indeed, &lt;em&gt;all&lt;/em&gt; you can do is walk around and talk to people and be somewhere, but the &lt;em&gt;somewheres&lt;/em&gt; are strangely captivating.  My favorite was &lt;a href="https://candle.itch.io/castle"&gt;the last days of our castle&lt;/a&gt;, with &lt;a href="https://seansleblanc.itch.io/a-day-on-the-town"&gt;a day on the town&lt;/a&gt; in a close second (though it cheated and extended the engine a bit), but there are several hundred of these tiny windows available.  Just single, short, minimal, interactive glimpses of an&amp;nbsp;idea.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been wanting to do more of that, so I gave it a shot today.  The result is &lt;a href="https://eevee.itch.io/roguelike-simulator"&gt;&lt;strong&gt;Roguelike Simulator&lt;/strong&gt;&lt;/a&gt;, a game that condenses the NetHack experience into about ninety&amp;nbsp;seconds.&lt;/p&gt;


&lt;hr /&gt;
&lt;p&gt;Constraints breed creativity, and bitsy is practically &lt;em&gt;made of&lt;/em&gt; constraints — the only place you can even make any decisions at all is within dialogue trees.  There are only three ways to alter the world: the player can step on an &lt;em&gt;ending&lt;/em&gt; tile to end the game, step on an &lt;em&gt;exit&lt;/em&gt; tile to instantly teleport to a tile on another map (or not), or pick up an item.  That&amp;#8217;s it.  You can&amp;#8217;t even implement keys; the best you can do is make an annoying maze of identical rooms, then have an &lt;span class="caps"&gt;NPC&lt;/span&gt; tell you the&amp;nbsp;solution.&lt;/p&gt;
&lt;p&gt;In retrospect, a roguelike — a genre practically defined by its randomness — &lt;em&gt;may&lt;/em&gt; have been a poor&amp;nbsp;choice.&lt;/p&gt;
&lt;p&gt;I had a lot of fun faking it, though, and it worked well enough to fool at least one person for a few minutes!  Some choice hacks follow.  Probably play the game a couple times before reading&amp;nbsp;them?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Each floor reveals itself, of course, by teleporting you between maps with different chunks of the floor visible.  I originally intended for this to be much more elaborate, but it turns out to be a huge pain to juggle multiple copies of the same floor&amp;nbsp;layout.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Endings can&amp;#8217;t be changed or randomized; even the text is static.  I still managed to implement multiple variants on the &amp;#8220;ascend&amp;#8221; ending!  See if you can guess how.  (It&amp;#8217;s not that&amp;nbsp;hard.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are no Boolean operators, but there &lt;em&gt;are&lt;/em&gt; arithmetic operators, so in one place I check whether you have both of two items by multiplying together how many of each you&amp;nbsp;have.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Monsters you &amp;#8220;defeat&amp;#8221; are actually just items you pick up.  They&amp;#8217;re both drawn in the same color, and you can&amp;#8217;t see your inventory, so you can&amp;#8217;t tell the&amp;nbsp;difference.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably the best part was writing the text, which is all completely ridiculous.  I really enjoy writing a lot of quips — which I guess is why I like Twitter — and I&amp;#8217;m happy to see they&amp;#8217;ve made people&amp;nbsp;laugh!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I think this has been a success!  It&amp;#8217;s definitely made me more confident about making smaller things — and about taking the first idea I have and just running with it.  I&amp;#8217;m going to keep an eye out for other micro game engines to play with,&amp;nbsp;too.&lt;/p&gt;</content><category term="release"></category><category term="making things"></category></entry><entry><title>Eevee mugshot set for Doom</title><link href="https://eev.ee/release/2017/11/23/eevee-mugshot-set-for-doom/" rel="alternate"></link><published>2017-11-23T01:46:00-08:00</published><updated>2017-11-23T01:46:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2017-11-23:/release/2017/11/23/eevee-mugshot-set-for-doom/</id><summary type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img alt="Screenshot of Industrial Zone from Doom II, with an Eevee face replacing the usual Doom marine in the status bar" src="https://eev.ee/media/2017-11-23-eeveemug/ingame-screenshot.png"/&gt;
&lt;/div&gt;
&lt;p&gt;A full replacement of Doomguy’s vast array of 42 expressions.&lt;/p&gt;
&lt;p&gt;You can &lt;a href="https://c.eev.ee/_doom/eeveemug.wad"&gt;get it yourself&lt;/a&gt; if you want to play Doom as me, for some reason?  It does nothing but replace a few sprites, so it works with any Doom flavor (including vanilla) on 1, 2, or Final.  Just run Doom with &lt;code&gt;-file eeveemug.wad&lt;/code&gt;.  With GZDoom, you can &lt;a href="https://zdoom.org/wiki/How_to_autoload_files"&gt;load it automatically&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2017-11-23-eeveemug/ingame-screenshot.png" alt="Screenshot of Industrial Zone from Doom II, with an Eevee face replacing the usual Doom marine in the status bar"&gt;
&lt;/div&gt;

&lt;p&gt;A full replacement of Doomguy&amp;#8217;s vast array of 42&amp;nbsp;expressions.&lt;/p&gt;
&lt;p&gt;You can &lt;a href="https://c.eev.ee/_doom/eeveemug.wad"&gt;get it yourself&lt;/a&gt; if you want to play Doom as me, for some reason?  It does nothing but replace a few sprites, so it works with any Doom flavor (including vanilla) on 1, 2, or Final.  Just run Doom with &lt;code&gt;-file eeveemug.wad&lt;/code&gt;.  With GZDoom, you can &lt;a href="https://zdoom.org/wiki/How_to_autoload_files"&gt;load it automatically&lt;/a&gt;.&lt;/p&gt;


&lt;hr /&gt;
&lt;p&gt;I don&amp;#8217;t &lt;em&gt;entirely&lt;/em&gt; know why I did this.  I drew the &lt;a href="https://twitter.com/eevee/status/927551685806788609"&gt;first one&lt;/a&gt; on a whim, then realized there was nothing really stopping me from making a full set, so I spent a day doing&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;The funny thing is that I usually play Doom with ZDoom&amp;#8217;s &amp;#8220;alternate&amp;#8221; &lt;span class="caps"&gt;HUD&lt;/span&gt;.  It&amp;#8217;s a full-screen overlay rather than a huge bar, and — crucially — it &lt;em&gt;does not show&lt;/em&gt; the mugshot.  It can&amp;#8217;t even be configured to show the mugshot.  As far as I&amp;#8217;m aware, it can&amp;#8217;t even be &lt;em&gt;modded&lt;/em&gt; to show the mugshot.  So I have to play with the &lt;span class="caps"&gt;OG&lt;/span&gt; status bar if I want to actually use the thing I&amp;nbsp;made.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2017-11-23-eeveemug/montage.png" alt="Preview of the Eevee mugshot sprites arranged in a grid, where the Eevee becomes more beaten up in each subsequent column"&gt;
&lt;/div&gt;

&lt;p&gt;I&amp;#8217;m pretty happy with the results overall!  I think I did a decent job emulating the Doom &amp;#8220;surreal grit&amp;#8221; style.  I did the shading with &lt;a href="https://www.aseprite.org/"&gt;Aseprite&lt;/a&gt;&amp;#8216;s &lt;a href="https://twitter.com/SoloSalsero/status/804084882074980360"&gt;shading mode&lt;/a&gt; — instead of laying down a solid color, it shifts pixels along a ramp of colors you select every time you draw over them.  Doom&amp;#8217;s palette has a &lt;em&gt;lot&lt;/em&gt; of browns, so I made a ramp out of all of them and kept going over furry areas, nudging pixels into being lighter or darker, until I liked the texture.  It was a lot like making a texture in a sketch with a lot of scratchy pencil&amp;nbsp;strokes.&lt;/p&gt;
&lt;p&gt;I also gleaned some interesting things about smoothness and how the eye interprets contours?  I tried to explain this on Twitter and had a hell of a time putting it into words, but the short version is that it&amp;#8217;s amazing to see the difference a single misplaced pixel can make, especially as you slide that pixel between dark and&amp;nbsp;light.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2017-11-23-eeveemug/doom-palette.png" alt="Doom's palette of 256 colors, many of which are very long gradients of reds and browns"&gt;
&lt;/div&gt;

&lt;p&gt;Speaking of which, Doom&amp;#8217;s palette is &lt;em&gt;incredibly&lt;/em&gt; weird to work with.  Thank goodness Eevees are brown!  The game does have to draw arbitrary levels of darkness all with the same palette, which partly explains the number of dark colors and gradients — but I believe a number of the colors are exact duplicates, so close they might as well be duplicates, or completely unused in stock Doom assets.  I guess they had no reason to optimize for people trying to add arbitrary art to the game 25 years later, though.  (And nowadays, &lt;a href="https://zdoom.org/index"&gt;GZDoom&lt;/a&gt; includes a truecolor software renderer, so the palette is becoming less and less&amp;nbsp;important.)&lt;/p&gt;
&lt;p&gt;I originally wanted the god mode sprite to be a Sylveon, but Sylveon is made of pink and azure and blurple, and I don&amp;#8217;t think I could&amp;#8217;ve pulled it off with this set of colors.  I even struggled with the color of the mane a bit — I usually color it with pretty pale colors, but Doom only has a couple of those, and they&amp;#8217;re &lt;em&gt;very&lt;/em&gt; saturated.  I ended up using a lot more dark yellows than I would normally, and thankfully it worked out pretty&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;The most significant change I made between the original sprite and the final set was the eye&amp;nbsp;color:&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2017-11-23-eeveemug/STFST20-comparison.png" alt="A comparison between an original Doom mugshot sprite, the first sprite I drew, and how it ended up"&gt;
&lt;/div&gt;

&lt;p&gt;(This is &lt;code&gt;STFST20&lt;/code&gt;, a frame from the default three-frame &amp;#8220;glacing around&amp;#8221; animation that plays when the player has between 40 and 59 health.  Doom Wiki has &lt;a href="https://doomwiki.org/wiki/Status_bar_face"&gt;a whole article on the mugshot&lt;/a&gt; if you&amp;#8217;re&amp;nbsp;interested.)&lt;/p&gt;
&lt;p&gt;The blue eyes in my original just do not work at all.  The Doom palette doesn&amp;#8217;t have a lot of &lt;em&gt;subtle&lt;/em&gt; colors, and its blues in particular are incredibly bad.  In the end, I made the eyes basically black, though with a couple pixels of very dark blue in&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;After I decided to make the full set, I started by making a neutral and completely healthy front pose, then derived the others from that (with a very complicated system of layers).  You can see some of the side effects of that here: the face doesn&amp;#8217;t actually turn when glancing around, because hoo boy that would&amp;#8217;ve been a lot of work, and so the cheek fluff is visible on both&amp;nbsp;sides.&lt;/p&gt;
&lt;p&gt;I also notice that there are two columns of identical pixels in each eye!  I fixed that in the glance to the right, but must&amp;#8217;ve forgotten about it here.  Oh, well; I didn&amp;#8217;t even notice until I zoomed in just&amp;nbsp;now.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2017-11-23-eeveemug/general-comparison.png" alt="A general comparison between the Doom mugshots and my Eevee ones, showing each pose in its healthy state plus the neutral pose in every state of deterioration"&gt;
&lt;/div&gt;

&lt;p&gt;The original sprites might not be &lt;em&gt;quite&lt;/em&gt; aligned correctly in the above image.  The available space in the status bar is 35×31, of which a couple pixels go to an inset border, leaving 33×30.  I drew all of my sprites at that size, but the originals are all cropped and have varying offsets (part of the Doom sprite format).  I extremely can&amp;#8217;t be assed to check all of those offsets for over a dozen sprites, so I just told ImageMagick to center them.  (I only notice &lt;em&gt;right now&lt;/em&gt; that some of the original sprites are even a full 31 pixels tall and draw over the top border that I was so careful to stay out&amp;nbsp;of!)&lt;/p&gt;
&lt;p&gt;Anyway, this is a representative sample of the Doom mugshot&amp;nbsp;poses.&lt;/p&gt;
&lt;p&gt;The top row shows all eight frames at full health.  The first three are the &amp;#8220;idle&amp;#8221; state, drawn when nothing else is going on; the sprite usually faces forwards, but glances around every so often at random.  The forward-facing sprite is the one I finalized&amp;nbsp;first.&lt;/p&gt;
&lt;p&gt;I tried to take a lot of cues from the original sprite, seeing as I wanted to match the style.  I&amp;#8217;d never tried drawing a sprite with a large palette and a small resolution before, and the first thing that struck me was Doomguy&amp;#8217;s lips — the upper lip, lips themselves, and shadow under the lower lip are all created with only one row of pixels each.  I thought that was &lt;em&gt;amazing&lt;/em&gt;.  Now I even kinda wish I&amp;#8217;d exaggerated that effect a bit more, but I was wary of going &lt;em&gt;too&lt;/em&gt; dark when there&amp;#8217;s a shadow only a couple pixels away.  I suppose Doomguy has the advantage of having, ah, a&amp;nbsp;chin.&lt;/p&gt;
&lt;p&gt;I did much the same for the eyebrows, which was especially necessary because Doomguy has more of a forehead than my Eevee does.  I probably could&amp;#8217;ve exaggerated those a bit more, as well!  Still, I love how they came out — especially in the simple looking-around frames, where even a two-pixel eyebrow raise is almost comically&amp;nbsp;smug.&lt;/p&gt;
&lt;p&gt;The fourth frame is a wild-ass grin (even named &lt;code&gt;STFEVL0&lt;/code&gt;), which shows for a short time after picking up a new weapon.  Come to think of it, that&amp;#8217;s a pretty rare occurrence when playing straight through one of the Doom games; you keep your weapons between&amp;nbsp;levels.&lt;/p&gt;
&lt;p&gt;The fifth through seventh are also a set.  If the player takes damage, the status bar will briefly show one of these frames to indicate where the damage is coming from.  You may notice that where Doomguy bravely faces the source of the pain, I drew myself wincing and recoiling away from&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;The middle frame of that set &lt;em&gt;also&lt;/em&gt; appears while the player is firing continuously (regardless of damage), so I couldn&amp;#8217;t really make it match the left and right ones.  I like the result anyway.  It was also great fun figuring out the expressions with the mouth — that&amp;#8217;s another place where individual pixels make a huge&amp;nbsp;difference.&lt;/p&gt;
&lt;p&gt;Finally, the eighth column is the legendary &lt;a href="https://doomwiki.org/wiki/Ouch_face"&gt;&amp;#8220;ouch&amp;#8221; face&lt;/a&gt;, which appears when the player takes more than 20 damage at once.  It may look completely alien to you, because vanilla Doom has a bug that only shows this face when the player &lt;em&gt;gains&lt;/em&gt; 20 or more health &lt;em&gt;while taking damage&lt;/em&gt;.  This is vanishingly rare (though possible!), so the frame virtually never appears in vanilla Doom.  Lots of source ports have fixed this bug, making the ouch face it a bit better known, but I usually play without the mugshot visible so it still looks super weird to me.  I think my own spin on it is a bit less, ah, body&amp;nbsp;horror?&lt;/p&gt;
&lt;p&gt;The second row shows deterioration.  It is &lt;em&gt;pretty weird&lt;/em&gt; drawing yourself getting beaten&amp;nbsp;up.&lt;/p&gt;
&lt;p&gt;A lot of Doomguy&amp;#8217;s deterioration is in the form of blood dripping from under his hair, which I didn&amp;#8217;t think would translate terribly well to a character without hair.  Instead, I went a little cartoony with it, adding bandages here and there.  I had a little bit of a hard time with the bloodshot eyes at this resolution, which I realize as I type it is a very poor excuse when I had eyes three times bigger than Doomguy&amp;#8217;s.  I do &lt;em&gt;love&lt;/em&gt; the drooping ears, with the possible exception of the fifth state, which I&amp;#8217;m not sure is how that would actually look…?  Oh well.  I also like the bow becoming gradually unravelled, eventually falling off entirely when you&amp;nbsp;die.&lt;/p&gt;
&lt;p&gt;Oh, yes, the sixth frame there (before the gap) is actually for a &lt;em&gt;dead&lt;/em&gt; player.  Doomguy&amp;#8217;s bleeding becomes markedly more extreme here, but again that didn&amp;#8217;t really work for me, so I went a little sillier with it.  A little.  It&amp;#8217;s still &lt;em&gt;pretty weird&lt;/em&gt; drawing yourself&amp;nbsp;dead.&lt;/p&gt;
&lt;p&gt;That leaves only god mode, which is incredible.  I love that glow.  I love the faux whisker shapes it makes.  I love how it fades into the background.  I love that 100% pure &amp;#8220;oh this is pretty good&amp;#8221; smile.  It all makes me want to just play Doom in god mode&amp;nbsp;forever.&lt;/p&gt;
&lt;p&gt;Now that I&amp;#8217;ve looked closely at these sprites again, I spy a good half dozen little inconsistencies and nitpicks, which I&amp;#8217;m going to refrain from spelling out.  I &lt;em&gt;did&lt;/em&gt; do this in only a day, and I think it came out pretty dang well&amp;nbsp;considering.&lt;/p&gt;
&lt;p&gt;Maybe I&amp;#8217;ll try something else like this in the future.  Not quite sure what, though; there aren&amp;#8217;t many small and self-contained sets of sprites like this in Doom.  Monsters are several times bigger and have a zillion different angles.  Maybe some pickups, which only have one&amp;nbsp;frame?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Hmm.  Parting thought: I&amp;#8217;m not quite sure where I should host this sort of one-off thing.  It arguably belongs on Itch, but seems really out of place alongside entire released games.  It also arguably belongs on the idgames archive, but I&amp;#8217;m hesitant to put it there because it&amp;#8217;s such an obscure thing of little interest to a general audience.  At the moment it&amp;#8217;s just a file I&amp;#8217;ve uploaded to wherever on my own space, but I now have &lt;em&gt;three&lt;/em&gt; little Doom experiments with no real permanent&amp;nbsp;home.&lt;/p&gt;</content><category term="release"></category><category term="making things"></category><category term="doom"></category></entry><entry><title>NEON PHASE</title><link href="https://eev.ee/release/2017/01/21/neon-phase/" rel="alternate"></link><published>2017-01-21T20:02:00-08:00</published><updated>2017-01-21T20:02:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2017-01-21:/release/2017/01/21/neon-phase/</id><summary type="html">&lt;p&gt;It all started after last year’s &lt;a href="https://gamesdonequick.com/"&gt;&lt;span class="caps"&gt;AGDQ&lt;/span&gt;&lt;/a&gt;, when I lamented having spent the entire week just watching speedruns instead of doing anything, and thus having lost my rhythm for days afterwards.&lt;/p&gt;
&lt;p&gt;This year, several friends reminded me of this simultaneously, so I begrudgingly went looking for something to focus on during &lt;span class="caps"&gt;AGDQ&lt;/span&gt;.  I’d already been working on Isaac’s Descent &lt;span class="caps"&gt;HD&lt;/span&gt;, so why not keep it up?  Work on a video game while watching video games.&lt;/p&gt;
&lt;p&gt;Working on a game for a week sounded an awful lot like a game jam, so I jokingly tweeted about a game jam whose express purpose was to not &lt;em&gt;completely&lt;/em&gt; waste the week staring at a Twitch stream.  Then someone suggested I make it an actual jam on itch.io.  Then Mel asked to do a game with me.&lt;/p&gt;
&lt;p&gt;And so, thanks to an almost comical sequence of events, we made &lt;a href="https://eevee.itch.io/neon-phase"&gt;&lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt;&lt;/a&gt; — a half-hour explorey platformer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It all started after last year&amp;#8217;s &lt;a href="https://gamesdonequick.com/"&gt;&lt;span class="caps"&gt;AGDQ&lt;/span&gt;&lt;/a&gt;, when I lamented having spent the entire week just watching speedruns instead of doing anything, and thus having lost my rhythm for days&amp;nbsp;afterwards.&lt;/p&gt;
&lt;p&gt;This year, several friends reminded me of this simultaneously, so I begrudgingly went looking for something to focus on during &lt;span class="caps"&gt;AGDQ&lt;/span&gt;.  I&amp;#8217;d already been working on Isaac&amp;#8217;s Descent &lt;span class="caps"&gt;HD&lt;/span&gt;, so why not keep it up?  Work on a video game while watching video&amp;nbsp;games.&lt;/p&gt;
&lt;p&gt;Working on a game for a week sounded an awful lot like a game jam, so I jokingly tweeted about a game jam whose express purpose was to not &lt;em&gt;completely&lt;/em&gt; waste the week staring at a Twitch stream.  Then someone suggested I make it an actual jam on itch.io.  Then Mel asked to do a game with&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;And so, thanks to an almost comical sequence of events, we made &lt;a href="https://eevee.itch.io/neon-phase"&gt;&lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt;&lt;/a&gt; — a half-hour explorey&amp;nbsp;platformer.&lt;/p&gt;


&lt;h2 id="the-game"&gt;&lt;a class="toclink" href="#the-game"&gt;The&amp;nbsp;game&lt;/a&gt;&lt;/h2&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;a href="https://eevee.itch.io/neon-phase"&gt;&lt;img src="/media/2017-01-neon-phase/neon-phase.png"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The game is set in the &lt;a href="http://floraverse.com/"&gt;Flora&lt;/a&gt; universe, as is everything Mel gets their hands on.  (I say this with all the love in the world.  ♥  Anyway, my games are &lt;em&gt;also&lt;/em&gt; set in the Flora universe, so who am I to&amp;nbsp;talk.)&lt;/p&gt;
&lt;p&gt;I started out by literally copy-pasting the source code for Isaac&amp;#8217;s Descent &lt;span class="caps"&gt;HD&lt;/span&gt;, the game I&amp;#8217;ve been making with &lt;a href="http://floraverse.com/"&gt;LÖVE&lt;/a&gt; as an extension of an &lt;a href="https://eevee.itch.io/isaacs-descent"&gt;earlier &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 game I made&lt;/a&gt;.  It&amp;#8217;s not terribly far yet, but it&amp;#8217;s &lt;em&gt;almost&lt;/em&gt; to the point of replicating the original game, which meant I had a passable platformer engine that could load Tiled maps and had some notion of an &amp;#8220;actor&amp;#8221;.  We both like platformers, anyway, so a platformer it would&amp;nbsp;be.&lt;/p&gt;
&lt;p&gt;We probably didn&amp;#8217;t make the &lt;em&gt;best&lt;/em&gt; use of the week.  I think it took us a couple days to figure out how to collaborate, now that we didn&amp;#8217;t have the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8&amp;#8217;s limitations and tools influencing our direction.  Isaac is tile-based, so I&amp;#8217;d taken for granted that this game would also be tile-based, whereas Mel, being an illustrator, prefers to draw&amp;#8230;  illustrations.  I, an idiot, decided the best way to handle this would be to start cutting the illustrations into tiles and then piecing them back together.  It took several days before I realized that oh, hey, Mel could just draw &lt;em&gt;the entire map&lt;/em&gt; as a single image, and I could make the player run around on&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;So I did that.  Previously, collision had been associated only with tiles, but it wasn&amp;#8217;t too hard to just draw polygons right on the map and use those for collision.  (&lt;em&gt;Bless&lt;/em&gt; &lt;a href="http://www.mapeditor.org/"&gt;Tiled&lt;/a&gt;, by the way.  It has some frustrating rough edges due to being a very general-purpose editor, but I can&amp;#8217;t imagine how much time it would take me to write my own map editor that can do as&amp;nbsp;much.)&lt;/p&gt;
&lt;p&gt;And speaking of collision, while I did have to dig into a few thorny bugs, I&amp;#8217;m &lt;em&gt;thrilled&lt;/em&gt; with how well the physics came out!  The collision detection I&amp;#8217;d written for Isaac&amp;#8217;s Descent &lt;span class="caps"&gt;HD&lt;/span&gt; was designed to support arbitrary polygons, even though so far I&amp;#8217;ve only had square tiles.  I knew the whole time I was making my life a lot harder, but I &lt;em&gt;really&lt;/em&gt; didn&amp;#8217;t want to restrict myself to rectangles right out of the gate.  It paid off in &lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt; — the world is full of sloping, hilly terrain, and you can run across it fairly&amp;nbsp;naturally!&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d also thought at first that the game would be a kind of actiony platformer, which is why the very first thing you get greatly resembles a weapon, but you don&amp;#8217;t end up actually fighting anything.  It turns out enemy behavior takes a bit of careful design and effort, and I ended up busy enough just implementing Mel&amp;#8217;s story.  Also, dropping fighting meant I didn&amp;#8217;t have to worry about death, which meant I didn&amp;#8217;t have to worry about saving and loading map state, which was &lt;em&gt;great news&lt;/em&gt; because I still haven&amp;#8217;t done any of that&amp;nbsp;yet.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s kind of interesting how time constraints can influence game design.  The game has little buildings you can enter, but because I didn&amp;#8217;t have saving/loading implemented, I didn&amp;#8217;t want to &lt;em&gt;actually&lt;/em&gt; switch maps.  Instead, I made the insides of buildings a separate layer in Tiled.  And since I had both layers on hand, I just drew the indoor layer right on top of the outdoor layer, which made kind of a cool&amp;nbsp;effect.&lt;/p&gt;
&lt;p&gt;A side effect of this approach was that you could see the inside of all buildings (well, within the viewport) while you were inside one, since they all exist in the same space.  We ended up adding a puzzle and a couple minor flavor things that took advantage of&amp;nbsp;this.&lt;/p&gt;
&lt;p&gt;If I &lt;em&gt;had&lt;/em&gt; had saving/loading of maps ready to go, I might have opted instead for a more traditional &lt;span class="caps"&gt;RPG&lt;/span&gt;-like approach, where the inside of each building is on its own map (or appears to be) and floats in a black&amp;nbsp;void.&lt;/p&gt;
&lt;p&gt;Another thing I really liked was the glitch effect, which I wrote on a whim early on because I&amp;#8217;ve had shaders on the brain lately.  We were both a little unsure about it, but in the end Mel wrote it into the plot and I used it more heavily throughout, including as a transition effect between&amp;nbsp;indoors/outdoors.&lt;/p&gt;
&lt;p&gt;Mel was responsible for art &lt;em&gt;and&lt;/em&gt; music &lt;em&gt;and&lt;/em&gt; story, so the plot unfortunately wasn&amp;#8217;t finalized until the last day of the jam.  It ended up being 30 pages of dialogue.  Sprinkled throughout were special effects that sound like standard things you&amp;#8217;d find in any &lt;span class="caps"&gt;RPG&lt;/span&gt; dialogue system — menus, branches, screen fades, and the like — but that I just hadn&amp;#8217;t written&amp;nbsp;yet.&lt;/p&gt;
&lt;p&gt;The dialogue system was downright primitive when we started; I&amp;#8217;d only written it as a brief proof of concept for Isaac, and it had only gotten as far as showing lines of wrapped text.  It didn&amp;#8217;t even know how to deal with text that was too long for the box.  Hell, it didn&amp;#8217;t even know how to &lt;em&gt;exit&lt;/em&gt; the dialogue and return to the&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;So when I got the final script, I went into a sort of mad panic, doing my best to tack on features in ways I wouldn&amp;#8217;t regret later and could maybe reuse.  I got pretty far, but when it became clear that we couldn&amp;#8217;t possibly have a finished product in time, I invoked my powers as jam coordinator and pushed the deadline back by 24 hours.  48 hours.  54⅓ hours.  Oh,&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://eevee.itch.io/neon-phase"&gt;final product&lt;/a&gt; came out pretty well, modulo a couple release bugs, ahem.  I&amp;#8217;ve been really impressed with itch.io, too — it has a &lt;em&gt;thousand&lt;/em&gt; twiddles, which makes me very happy, plus graphs of how many people have been playing our game and how they found it!  Super&amp;nbsp;cool.&lt;/p&gt;
&lt;h2 id="lessons-learned"&gt;&lt;a class="toclink" href="#lessons-learned"&gt;Lessons&amp;nbsp;learned&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ah, yes.  Here&amp;#8217;s that sweet postmortem content you computer people&amp;nbsp;crave.&lt;/p&gt;
&lt;h3 id="dont-leave-debug-code-in"&gt;&lt;a class="toclink" href="#dont-leave-debug-code-in"&gt;Don't leave debug code&amp;nbsp;in&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There&amp;#8217;s a fairly long optional quest in the game that takes a good few minutes to complete, even if you teleport everywhere instantly.  (Ahem.)  Finishing the quest kicks off a unique cutscene that involves a decent bit of crappy code I wrote at the last minute.  I needed to test it a lot.  So, naturally, I added a dummy rule to the beginning of the relevant &lt;span class="caps"&gt;NPC&lt;/span&gt;&amp;#8217;s dialogue that just skips right to the&amp;nbsp;end.&lt;/p&gt;
&lt;p&gt;I forgot to delete that rule before we&amp;nbsp;released.&lt;/p&gt;
&lt;p&gt;Whoops!&lt;/p&gt;
&lt;p&gt;The game even &lt;em&gt;has&lt;/em&gt; a debug mode, so I could&amp;#8217;ve easily made the rule only work then.  I didn&amp;#8217;t, and it possibly spoiled the whole sidequest for a couple dozen people.  My&amp;nbsp;bad.&lt;/p&gt;
&lt;h3 id="try-your-game-at-other-framerates"&gt;&lt;a class="toclink" href="#try-your-game-at-other-framerates"&gt;Try your game at other&amp;nbsp;framerates&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The other game-breaking bug we had in the beginning was that some people couldn&amp;#8217;t make jumps.  For some, it was only when indoors; for others, it was all the time.  The common thread was&amp;#8230;  low&amp;nbsp;framerates.&lt;/p&gt;
&lt;p&gt;Why does this matter?  Well!  When you jump, your upwards velocity is changed to a specific value, calculated to make your jump height slightly more than two tiles.  The problem is, gravity is applied &lt;em&gt;after&lt;/em&gt; you get jump velocity but &lt;em&gt;before&lt;/em&gt; you actually move.  It looks like&amp;nbsp;this:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;velocity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;velocity&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gravity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Reasonable, right?  Gravity is acceleration, so you multiply it by the amount of time that&amp;#8217;s passed to get the change to&amp;nbsp;velocity.&lt;/p&gt;
&lt;p&gt;Ah&amp;#8230;  but if your framerate is low, then &lt;code&gt;dt&lt;/code&gt; will be relatively large, and gravity will eat away a relatively large chunk of your upwards velocity.  On the frame you jump, this effectively reduces your initial jump speed.  If your framerate is low &lt;em&gt;enough&lt;/em&gt;, you&amp;#8217;ll never be able to jump as high as&amp;nbsp;intended.&lt;/p&gt;
&lt;p&gt;One obvious fix would be to rearrange the order things happen, so gravity doesn&amp;#8217;t come between jumping and movement.  I was wary of doing this as an emergency fix, though, because it would&amp;#8217;ve taken a bit of rearchitecturing and I wasn&amp;#8217;t sure about the side effects.  So instead, I made a fix that&amp;#8217;s worth having anyway: when the framerate is too long, I slice up &lt;code&gt;dt&lt;/code&gt; and do multiple rounds of updating.  Now even if the game &lt;em&gt;draws&lt;/em&gt; slowly, it plays at the right&amp;nbsp;speed.&lt;/p&gt;
&lt;p&gt;This was really easy to discover once I knew to look; all I had to do was add a &lt;code&gt;sleep()&lt;/code&gt; in the update or draw loops to artificially lower the framerate.  I even found a second bug, which was that you &lt;em&gt;move&lt;/em&gt; slowly at low framerates — much like with jumping, your walk speed is capped at a maximum, then friction lowers it, then you actually&amp;nbsp;move.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;also&lt;/em&gt; had problems with framerates that were too &lt;em&gt;high&lt;/em&gt;, which took me completely by surprise.  Your little companion flips out and jitters all over the place or even gets stuck, and jumping just plain doesn&amp;#8217;t work most of the time.  The problems here were much simpler.  I was needlessly rounding Chip&amp;#8217;s position to the nearest pixel, so if &lt;code&gt;dt&lt;/code&gt; was very small, Chip would only try to move a fraction of a pixel per frame and never get anywhere; I fixed that by simply not&amp;nbsp;rounding.&lt;/p&gt;
&lt;p&gt;The issue with jumping needs a little backstory.  One of the problems with sloped terrain is that when you walk up a slope and reach the &lt;em&gt;top&lt;/em&gt;, your momentum is still carrying you along the path of the slope, i.e. upwards.  I had a lot of problems with launching right off the top of even a fairly shallow hill; it looked goofy and amateurish.  My terrible solution was: if you started out on the ground, then after moving, &lt;em&gt;try&lt;/em&gt; to move a short distance straight down.  If you &lt;em&gt;can&amp;#8217;t&lt;/em&gt;, because something (presumably the ground) is in the way, then you probably just went over a short bump; move as far as you can downwards so you stick to the ground.  If you &lt;em&gt;can&lt;/em&gt; move downwards, you just went over a ledge, so &lt;em&gt;abort&lt;/em&gt; the movement and let gravity take its course next&amp;nbsp;frame.&lt;/p&gt;
&lt;p&gt;The problem was that I used a fixed (arbitrary) distance for this ground test.  For very short &lt;code&gt;dt&lt;/code&gt;, the distance you moved upwards when jumping was &lt;em&gt;less than&lt;/em&gt; the distance I then tried dragging you back down to see if you should stay on the ground.  The easy fix was to scale the test distance with &lt;code&gt;dt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Of course, if you&amp;#8217;re jumping, obviously you don&amp;#8217;t &lt;em&gt;want&lt;/em&gt; to stay on the ground, so I shouldn&amp;#8217;t do this test at all.  But jumping is an active thing, and staying grounded is currently a passive thing (but shouldn&amp;#8217;t be, since it emulates &lt;em&gt;walking&lt;/em&gt; rather than &lt;em&gt;sliding&lt;/em&gt;), and again I didn&amp;#8217;t want to start messing with physics guts &lt;em&gt;after&lt;/em&gt; release.  I&amp;#8217;ll be cleaning a few things up for the next game, I&amp;#8217;m&amp;nbsp;sure.&lt;/p&gt;
&lt;p&gt;This &lt;em&gt;also&lt;/em&gt; turned out to be easy to see once I knew to look — I just turned off vsync, and my framerate shot up to&amp;nbsp;200+.&lt;/p&gt;
&lt;h3 id="quadratic-behavior-is-bad"&gt;&lt;a class="toclink" href="#quadratic-behavior-is-bad"&gt;Quadratic behavior is&amp;nbsp;bad&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The low framerate issue wouldn&amp;#8217;t have been &lt;em&gt;quite&lt;/em&gt; so bad, except for a teeny tiny problem with indoors.  I&amp;#8217;d accidentally left a loop in when refactoring, so instead of merely drawing every indoor actor each frame, I was drawing every indoor actor &lt;em&gt;for every indoor actor&lt;/em&gt; each frame.  I think that worked out to 7225 draws instead of 85.  (I don&amp;#8217;t skip drawing for offscreen actors yet.)  &lt;em&gt;Our&lt;/em&gt; computers are pretty beefy, so I never noticed.  Our one playtester did comment at the eleventh hour that the framerate dipped very slightly while indoors, but I assumed this was just because indoors requires more drawing than outdoors (since it&amp;#8217;s drawn right on top of outdoors) and didn&amp;#8217;t&amp;nbsp;investiage.&lt;/p&gt;
&lt;p&gt;Of course, if you play on a less powerful machine, the difference will be rather more noticeable.&amp;nbsp;Oops.&lt;/p&gt;
&lt;h3 id="just-do-it"&gt;&lt;a class="toclink" href="#just-do-it"&gt;Just Do&amp;nbsp;It&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;My collision detection relies on the &lt;a href="https://en.wikipedia.org/wiki/Hyperplane_separation_theorem"&gt;separating axis theorem&lt;/a&gt;, which only works for convex polygons.  (Convex polygons are ones that have no &amp;#8220;dents&amp;#8221; in them — you could wrap a rubber band around one and it would lie snug along each face.)  The map Mel drew has rolling terrain and caverns with ceilings, which naturally lead to a lot of concave polygons.  (Concave polygons are not convex.  They have&amp;nbsp;caves!)&lt;/p&gt;
&lt;p&gt;I must&amp;#8217;ve spent a good few hours drawing collision polygons on top of the map, manually eyeballing the terrain and cutting it up into only convex&amp;nbsp;polygons.&lt;/p&gt;
&lt;p&gt;Eventually I got so tired of this that I threw up my hands and added support for concave&amp;nbsp;polygons.&lt;/p&gt;
&lt;p&gt;It took me, like, two minutes.  Not only does LÖVE have a built-in function for cutting a polygon into triangles (which are always convex), it also has a function for detecting whether a polygon is convex.  I already had support for objects consisting of multiple shapes, so all I had to do was plug these things into each&amp;nbsp;other.&lt;/p&gt;
&lt;p&gt;Collision probably would&amp;#8217;ve taken much less time if I&amp;#8217;d just done that in the first&amp;nbsp;place.&lt;/p&gt;
&lt;h3 id="delete-that-old-code-or-maybe-not"&gt;&lt;a class="toclink" href="#delete-that-old-code-or-maybe-not"&gt;Delete that old code, or maybe&amp;nbsp;not&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of the very first players reported that they&amp;#8217;d managed to crash the game right off the bat.  It didn&amp;#8217;t take long to realize it was because they&amp;#8217;d pressed &lt;code&gt;Q&lt;/code&gt;, which isn&amp;#8217;t actually used in &lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt;.  It &lt;em&gt;is&lt;/em&gt; used in Isaac&amp;#8217;s Descent &lt;span class="caps"&gt;HD&lt;/span&gt;, to scroll through the inventory&amp;#8230;  but &lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt; doesn&amp;#8217;t &lt;em&gt;use&lt;/em&gt; that inventory, and I&amp;#8217;d left in the code for handling the keypress, so the game simply&amp;nbsp;crashed.&lt;/p&gt;
&lt;p&gt;(This is Lua, so when I say &amp;#8220;crash&amp;#8221;, I mean &amp;#8220;showed a stack trace and refused to play any more&amp;#8221;.  Slightly better, but only so&amp;nbsp;much.)&lt;/p&gt;
&lt;p&gt;So, maybe delete that old&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;Or, wait, maybe don&amp;#8217;t.  When I removed the debugging sequence break just after release, I also deleted the code for the &lt;code&gt;Q&lt;/code&gt; key&amp;#8230;  and, in a rush, &lt;em&gt;also&lt;/em&gt; deleted the code for handling the &lt;code&gt;E&lt;/code&gt; key, which &lt;em&gt;is&lt;/em&gt; used in &lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt;.  Rather heavily.  Like, for everything.&amp;nbsp;Dammit.&lt;/p&gt;
&lt;p&gt;Maybe just play the game before issuing emergency releases?&amp;nbsp;Nah.&lt;/p&gt;
&lt;h3 id="melding-styles-is-easier-than-youd-think"&gt;&lt;a class="toclink" href="#melding-styles-is-easier-than-youd-think"&gt;Melding styles is easier than you'd&amp;nbsp;think&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When I look at the whole map overall, it&amp;#8217;s hilarious to me how much the part I designed sticks out.  It&amp;#8217;s built out of tiles and consists of one large puzzle, whereas the rest of the game is as untiled as you can get and mostly revolves around talking to&amp;nbsp;people.&lt;/p&gt;
&lt;p&gt;And yet I don&amp;#8217;t think anyone has noticed.  It&amp;#8217;s just one part of the game with a thing you do.  The rest of the game may not have a bunch of wiring puzzles, but enough loose wires are lying around to make them seem fitting.  The tiles Mel gave me are good and varied enough that they don&amp;#8217;t &lt;em&gt;look&lt;/em&gt; like tiles; they just look like they were deliberately made more square for aesthetic or story&amp;nbsp;reasons.&lt;/p&gt;
&lt;p&gt;I drew a few of the tiles and edited a few others.  Most of the dialogue was written by Mel, but a couple lines that people really like were my own, completely impromptu, invention.  No one seems to have noticed.  It&amp;#8217;s all one game.  We didn&amp;#8217;t sit down and have a meeting about the style or how to keep it cohesive; I just did stuff when I felt like it, and I naturally took inspiration from what was already&amp;nbsp;there.&lt;/p&gt;
&lt;h3 id="people-will-pay-for-things-if-you-ask-them-to"&gt;&lt;a class="toclink" href="#people-will-pay-for-things-if-you-ask-them-to"&gt;People will pay for things if you ask them&amp;nbsp;to&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;itch.io does something really&amp;nbsp;interesting.&lt;/p&gt;
&lt;p&gt;Anything you download is presented as a &lt;em&gt;purchase&lt;/em&gt;.  You are absolutely welcome to sell things for free, but rather than being an instant download, itch.io treats this as a case of &lt;em&gt;buying for zero dollars&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Why do that?  Well, because you are always free to pay &lt;em&gt;more&lt;/em&gt; for something you buy on itch, and &lt;a href="https://itch.io/docs/creators/how-buying-works#the-purchase-dialog"&gt;the purchase dialog&lt;/a&gt; has handy buttons for adding a&amp;nbsp;tip.&lt;/p&gt;
&lt;p&gt;It turns out that, when presented with a dialog that offers a way to pay money for a free thing, an awful lot of people&amp;#8230;  paid money!  Over a hundred people chipped in a few bucks for our &lt;em&gt;free game&lt;/em&gt;, just because itch offered them a button to do so.  The vast majority of them paid one of itch&amp;#8217;s preset amounts.  I&amp;#8217;m totally blown away; I knew abstractly that this was &lt;em&gt;possible&lt;/em&gt;, but I didn&amp;#8217;t really expect it to happen.  I&amp;#8217;ve never actually sold anything before, either.  This is&amp;nbsp;amazing.&lt;/p&gt;
&lt;p&gt;Now, granted, we &lt;em&gt;do&lt;/em&gt; offer bonuses (concept art and the &lt;span class="caps"&gt;OST&lt;/span&gt;) if you pay $2 or more, at Mel&amp;#8217;s request.  But consider that I also put my two &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 games on itch, and those have an interesting difference: they&amp;#8217;re played in-browser and load automatically right in the page.  Instead of a payment dialog, there&amp;#8217;s a &amp;#8220;support this game&amp;#8221; button below the game.  They&amp;#8217;re older games that most of my audience has probably played already, but they still got a few hundred views between them.  And the number of&amp;nbsp;purchases?&lt;/p&gt;
&lt;p&gt;Zero.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not trying to criticize or guilt anyone here!  I release stuff for free because I want it to be free.  I&amp;#8217;m just genuinely amazed by how effective itch&amp;#8217;s download workflow seems to be.  The buttons for chipping in are a natural part of the process of &lt;em&gt;something you&amp;#8217;re already doing&lt;/em&gt;, so &amp;#8220;I might as well&amp;#8221; kicks in.  I&amp;#8217;ve done this myself — I paid for the free &lt;a href="https://managore.itch.io/m5x7"&gt;m5x7&lt;/a&gt; font I used in &lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt;.  But something played in-browser is already there, and it takes a much stronger impulse to go out of your way to &lt;em&gt;initiate&lt;/em&gt; the process of supporting the&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;Anyway, this is definitely encouraging me to make more things.  I&amp;#8217;ll probably put my book on itch when I finish it,&amp;nbsp;too.&lt;/p&gt;
&lt;h2 id="also-my-book"&gt;&lt;a class="toclink" href="#also-my-book"&gt;Also, my&amp;nbsp;book&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Speaking&amp;nbsp;of!&lt;/p&gt;
&lt;p&gt;If you remember, I&amp;#8217;ve been writing a book about game development.  Literally, a book &lt;em&gt;about&lt;/em&gt; game development — the concept was that I build some games on various free platforms, then write about what I did and how I did it.  Game development as a story, rather than a&amp;nbsp;lecture.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve hit a bit of a problem with it, and that problem is with my &amp;#8220;real&amp;#8221; games — i.e., the ones I didn&amp;#8217;t make for the sake of the book.  Writing about Isaac&amp;#8217;s Descent requires first explaining how the engine came about, which requires reconstructing how I wrote Under Construction, and now we&amp;#8217;re at two games&amp;#8217; worth of stuff even before you consider the whole &lt;em&gt;writing a collision engine&lt;/em&gt;&amp;nbsp;thing.&lt;/p&gt;
&lt;p&gt;Isaac&amp;#8217;s Descent &lt;span class="caps"&gt;HD&lt;/span&gt; is posed to have exactly the same problem: it takes a detour through the development of &lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt;, so I should talk about that too in some&amp;nbsp;detail.&lt;/p&gt;
&lt;p&gt;Both of these games are huge and complex tales already, far too long for a single &amp;#8220;chapter&amp;#8221;, and I&amp;#8217;d already been worrying that the book would be too&amp;nbsp;long.&lt;/p&gt;
&lt;p&gt;So!  I&amp;#8217;m adjusting the idea slightly.  Instead of writing about making a bunch of &amp;#8220;artificial&amp;#8221; games that I make solely for the sake of writing about the experience&amp;#8230;  I&amp;#8217;m cutting it down to just Isaac&amp;#8217;s Descent, &lt;span class="caps"&gt;HD&lt;/span&gt;, and the other games in their lineage.  That&amp;#8217;s already half a dozen games across two platforms, and I think they offer more than enough opportunity to say everything I&amp;nbsp;want.&lt;/p&gt;
&lt;p&gt;The overall idea of &amp;#8220;talk about making something&amp;#8221; is ultimately the same, but I like this refocusing a lot more.  It feels a little more genuine,&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;Guess I&amp;#8217;ve got a bit of editing to&amp;nbsp;do!&lt;/p&gt;
&lt;h2 id="and-finally"&gt;&lt;a class="toclink" href="#and-finally"&gt;And,&amp;nbsp;finally&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You should try out &lt;a href="https://itch.io/jam/games-made-quick/entries"&gt;the other games&lt;/a&gt; people made for my jam!  I can&amp;#8217;t believe a Twitter joke somehow caused &lt;em&gt;more than forty&lt;/em&gt; games to come into existence that otherwise would not have.  I&amp;#8217;ve been busy with &lt;span class="caps"&gt;NEON&lt;/span&gt; &lt;span class="caps"&gt;PHASE&lt;/span&gt; followup stuff (like writing this post) and have only barely scratched the surface so far, but I do intend to play every game that was&amp;nbsp;submitted!&lt;/p&gt;</content><category term="release"></category><category term="gamedev"></category><category term="making things"></category></entry><entry><title>Mario Maker: The Wreck</title><link href="https://eev.ee/release/2016/11/01/mario-maker-the-wreck/" rel="alternate"></link><published>2016-11-01T14:52:00-07:00</published><updated>2016-11-01T14:52:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2016-11-01:/release/2016/11/01/mario-maker-the-wreck/</id><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="/dev/media/mario-maker/the-wreck.jpg"&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://supermariomakerbookmark.nintendo.net/courses/33E8-0000-02B2-76DF"&gt;&lt;code&gt;33E8-0000-02B2-76DF&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Difficulty&lt;/strong&gt;: very easy&lt;br /&gt;
&lt;strong&gt;Quality&lt;/strong&gt;: ★★★★☆&lt;br /&gt;
&lt;strong&gt;Secrets&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;I was rolling a &lt;a href="http://www.jmickle.com/genrerator/maptheme.html"&gt;Doom random level theme generator&lt;/a&gt; for speedmapping purposes, and one of the prompts it gave was &amp;#8220;The Wreckage&amp;#8221;.  I didn&amp;#8217;t really know how to make that in Doom in only an hour, but I &lt;em&gt;did&lt;/em&gt; know how to make it in Mario, so I&amp;nbsp;did.&lt;/p&gt;
&lt;p&gt;The additional rules were &amp;#8220;no monsters&amp;#8221; and &amp;#8220;no stairs&amp;#8221;, so neither of those things appear in this level.  It&amp;#8217;s quick and entirely atmospheric.  I like it.  Though it&amp;#8217;d be slightly better if I&amp;#8217;d correctly named it &amp;#8220;The Wreckage&amp;#8221;.  Oh&amp;nbsp;well.&lt;/p&gt;</content><category term="release"></category><category term="mario maker"></category></entry><entry><title>Inktober</title><link href="https://eev.ee/release/2016/10/23/inktober/" rel="alternate"></link><published>2016-10-23T23:37:00-07:00</published><updated>2016-10-23T23:37:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2016-10-23:/release/2016/10/23/inktober/</id><summary type="html">&lt;p&gt;Inktober is an ancient and hallowed art tradition, dating all the way back to sometime, when it was started by someone.  The idea is simple: draw something in ink every day.  Real ink.  You know.  On paper.&lt;/p&gt;
&lt;p&gt;I tried this last year.  I quit after four days.  Probably because I tried to do it without pencil sketches, and I’m really not very good at drawing things correctly the first time.  I’d hoped that forcing myself to do it would spark some improvement, but all it really produced was half a week of frustration and bad artwork.&lt;/p&gt;
&lt;p&gt;This year, I was convinced to try again without unnecessarily handicapping myself, so I did that.  Three weeks and more than forty ink drawings later, here are some thoughts.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Inktober is an ancient and hallowed art tradition, dating all the way back to sometime, when it was started by someone.  The idea is simple: draw something in ink every day.  Real ink.  You know.  On&amp;nbsp;paper.&lt;/p&gt;
&lt;p&gt;I tried this last year.  I quit after four days.  Probably because I tried to do it without pencil sketches, and I&amp;#8217;m really not very good at drawing things correctly the first time.  I&amp;#8217;d hoped that forcing myself to do it would spark some improvement, but all it really produced was half a week of frustration and bad&amp;nbsp;artwork.&lt;/p&gt;
&lt;p&gt;This year, I was convinced to try again without unnecessarily handicapping myself, so I did that.  Three weeks and more than forty ink drawings later, here are some&amp;nbsp;thoughts.&lt;/p&gt;


&lt;h2 id="some-background"&gt;&lt;a class="toclink" href="#some-background"&gt;Some&amp;nbsp;background&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve been &lt;a href="https://eev.ee/blog/2016/05/06/learning-to-draw-learning-to-learn/"&gt;drawing seriously since the beginning of 2015&lt;/a&gt;.  I spent the first few months working primarily in pencil, until I was gifted a hand-me-down tablet in March; almost everything has been digital since&amp;nbsp;then.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been fairly lax about learning to use color effectively — I have enough trouble just producing a sketch I like, so I&amp;#8217;ve mostly been trying to improve there.  Doesn&amp;#8217;t feel worth the effort to color a sketch I&amp;#8217;m not really happy with, and by the time I&amp;#8217;m really happy with it, I&amp;#8217;m itching to draw something else.  Whoops.  Until I get quicker or find some mental workaround, monochrome ink is a good direction to&amp;nbsp;try.&lt;/p&gt;
&lt;p&gt;I have an ongoing &lt;a href="https://lexyeevee.tumblr.com/tagged/daily-pok%C3%A9mon"&gt;&amp;#8220;daily&amp;#8221; pokémon series&lt;/a&gt;, so I&amp;#8217;ve been continuing that in ink.  (Everyone else seems to be using some list of single-word prompts, but I didn&amp;#8217;t even know about that until after I&amp;#8217;d started, so,&amp;nbsp;whoops.)&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve got a few things I want to get better&amp;nbsp;at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Detailing, whatever that means.  Part of the problem is that I&amp;#8217;m not sure what it means.  My art is fairly simple and cartoony, and I know it&amp;#8217;s possible to be more detailed without doing realistic shading, but I don&amp;#8217;t have a grasp of how to think about&amp;nbsp;that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better edges, which mostly means line weight.  I mentally categorize this as a form of &lt;em&gt;scale&lt;/em&gt;, which also includes tips like &amp;#8220;don&amp;#8217;t let parallel lines get too close together&amp;#8221; and &amp;#8220;don&amp;#8217;t draw one or two very small&amp;nbsp;details&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better backgrounds and environments.  Or, let&amp;#8217;s be honest, &lt;em&gt;any&lt;/em&gt; backgrounds and environments — I draw an awful lot of single characters floating in an empty white void.  My fixed-size canvas presents an obvious and simple challenge: fill the&amp;nbsp;page!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More interesting poses, and relatedly, getting a better hang of anatomy.  I started drawing the pokémon series partly for this reason: a great many pokémon have really unusual shapes I&amp;#8217;ve tried drawing before.  Dealing with weird anatomy and trying to map it to my existing understanding should hopefully flex some visualization&amp;nbsp;muscles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lighting, probably?  I&amp;#8217;m aware that things not facing a light source are in shadow, but my understanding doesn&amp;#8217;t extend very far beyond that.  How does light affect a large outdoor area?  How can you represent the complexity of light and shadow with only a single pen?  Art, especially cartoony art, has an entire vocabulary of subtle indicators of shadow and volume that I don&amp;#8217;t know much&amp;nbsp;about.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#8217;s see what exactly I&amp;#8217;ve&amp;nbsp;learned.&lt;/p&gt;
&lt;h2 id="analog-materials-are-very-different"&gt;&lt;a class="toclink" href="#analog-materials-are-very-different"&gt;Analog materials are very&amp;nbsp;different&lt;/a&gt;&lt;/h2&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2016-10-23-inktober/20161014-064-bergmite.jpg" alt="" title="Oct 14, 2016: Bergmite"&gt;
&lt;/div&gt;

&lt;p&gt;I&amp;#8217;ve drawn plenty of pencil sketches on paper, and I&amp;#8217;ve done a few watercolors, but I&amp;#8217;ve never done this volume of &amp;#8220;serious&amp;#8221; art on paper&amp;nbsp;before.&lt;/p&gt;
&lt;p&gt;All my inks so far are in a 3.5” × 5” sketchbook.  I&amp;#8217;ll run out of pages in a few days, at which point I&amp;#8217;ll finish up the month in a bigger sketchbook.  It&amp;#8217;s been a mixed blessing: I have less page to fill, but details are smaller and more fiddly, so mistakes are more obvious.  I also don&amp;#8217;t have much room for error with the&amp;nbsp;composition.&lt;/p&gt;
&lt;p&gt;I started out drawing with a small black Faber–Castell &amp;#8220;&lt;span class="caps"&gt;PITT&lt;/span&gt; artist pen&amp;#8221;.  Around day five, I borrowed C3 and C7 (light and dark cool greys) Copic sketch markers from Mel; later I got a C5 as well.  A few days ago I bought a Lamy Safari fountain pen with Noodler&amp;#8217;s Heart of Darkness&amp;nbsp;ink.&lt;/p&gt;
&lt;p&gt;Both the &lt;span class="caps"&gt;FC&lt;/span&gt; pen and the fountain pen are ultimately still pens, but they have some interesting differences in edge cases.  Used very lightly at an extreme angle, the &lt;span class="caps"&gt;FC&lt;/span&gt; pen produces very scratchy-looking lines&amp;#8230;  sometimes.  Sometimes it does nothing instead, and you must precariously tilt the pen until you find the magical angle, hoping you don&amp;#8217;t suddenly get a solid line where you didn&amp;#8217;t want it.  The Lamy has been much more consistent: it&amp;#8217;s a little more willing to draw thinner lines than it&amp;#8217;s intended for, and it hasn&amp;#8217;t created any unpleasant surprises.  The Lamy feels much smoother overall, like it &lt;em&gt;flows&lt;/em&gt;, which is appropriate since that&amp;#8217;s how fountain pens&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;Markers are interesting.  The last &amp;#8220;serious&amp;#8221; art I did on paper was watercolor, which is pretty fun — I can water a color down however much I want, and if I&amp;#8217;m lucky and fast, I can push color around on the paper a bit before it dries.  Markers, ah, not so much.  Copics are supposed to be blendable, but I&amp;#8217;ve yet to figure out how to make that happen.  It might be that my sketchbook&amp;#8217;s paper is too thin, but the ink seems to dry within seconds, too fast for me to switch markers and do much of anything.  For the same reason, I &lt;em&gt;have&lt;/em&gt; to color an area by&amp;#8230; &amp;#8220;flood-filling&amp;#8221;?  I can&amp;#8217;t let the edge of the colored area dry, or when I go back to extend that edge, I&amp;#8217;ll be putting down a second layer of ink and create an obvious dark band.  I&amp;#8217;ve learned to keep the edge wet as much as&amp;nbsp;possible.&lt;/p&gt;
&lt;p&gt;On the plus side, going over dry ink in the same color will darken it, and I&amp;#8217;ve squeezed several different shades of gray out of just the light marker.  The brush tip can be angled in several different ways to make different shapes; I&amp;#8217;ve managed a grassy background and a fur texture just by holding the marker differently.  Marker ink does bleed very slightly, but it tends to stop at pen ink, a feature I&amp;#8217;ve wanted in digital art for at least a century.  I can also &lt;em&gt;kinda&lt;/em&gt; make strokes that fade out by moving the marker quickly and lifting it off the paper as I go; surely there are more clever things to be done here, but I&amp;#8217;ve yet to figure them&amp;nbsp;out.&lt;/p&gt;
&lt;p&gt;The drawing of bergmite above was done as the light marker started to run dry, which is not a problem I was expecting.  The marker still worked, but not very well.  The strokes on the cave wall in the background aren&amp;#8217;t a deliberate effect; those are the strokes the marker was making, and I tried to use them as best I could.  I didn&amp;#8217;t have the medium marker yet, and the dark marker is &lt;em&gt;very&lt;/em&gt; dark — almost black.  I&amp;#8217;d already started laying down marker, so I couldn&amp;#8217;t very well finish the picture with just the pen, and I had to&amp;nbsp;improvise.&lt;/p&gt;
&lt;h2 id="ink-is-permanent"&gt;&lt;a class="toclink" href="#ink-is-permanent"&gt;Ink is&amp;nbsp;permanent&lt;/a&gt;&lt;/h2&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2016-10-23-inktober/20161005-045-floatzel.jpg" alt="" title="Oct 5, 2016: Floatzel"&gt;
&lt;/div&gt;

&lt;p&gt;Well.&amp;nbsp;Obviously.&lt;/p&gt;
&lt;p&gt;I have to be pretty careful about what I draw, which creates a bit of a conflict.  If I make smooth, confident strokes, I&amp;#8217;m likely to fuck them up, and I can&amp;#8217;t undo and try again.  If I make a lot of short strokes, I get those tell-tale amateurish scratchy lines.  If I trace my sketch very carefully and my hand isn&amp;#8217;t perfectly steady, the resulting line will be visibly&amp;nbsp;shaky.&lt;/p&gt;
&lt;p&gt;I probably exacerbated the shaky lines with my choice of relatively small paper; there&amp;#8217;s no buffer between those tiny wobbles and the smallest level of detail in the drawing itself.  I can&amp;#8217;t always even see where my tiny sketch is going, because my big fat fingers are in the&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve also had the problem that my sketch is such a mess that I can&amp;#8217;t tell where a line is &lt;em&gt;supposed&lt;/em&gt; to be going&amp;#8230;  until I&amp;#8217;ve drawn it and it&amp;#8217;s obviously wrong.  Again, small paper exacerbates this by compressing&amp;nbsp;sketches.&lt;/p&gt;
&lt;p&gt;Since I can&amp;#8217;t fix mistakes, I&amp;#8217;ve had to be a little creative about papering over&amp;nbsp;them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I did one ink with very stark contrast: shadows were completely filled with ink, highlights were bare paper.  No shading, hatching, or other middle ground.  I&amp;#8217;d been meaning to try the approach anyway, but I finally did it after making three or four glaring mistakes.  In the final work, they&amp;#8217;re all hidden in shadow, so you can&amp;#8217;t really tell anything ever went&amp;nbsp;wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;#8217;ve managed to disguise several mistakes of the &amp;#8220;curved this line too early&amp;#8221; variety just by adding some more parallel strokes and pretending I intended to hatch it all&amp;nbsp;along.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of the things I&amp;#8217;ve been trying to figure out is varying line weight, and one way to vary it is to make edges thicker when in shadows.  A clever hack has emerged&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;You see, it&amp;#8217;s much easier for me to draw an upwards arc than a downwards arc.  (I think this is fairly universal?)  I can of course just rotate the paper, but if I&amp;#8217;m drawing a cylinder, it&amp;#8217;s pretty obvious when the top was drawn with a slight bias in one direction and the bottom was drawn with a slight bias in the other&amp;nbsp;direction.&lt;/p&gt;
&lt;p&gt;My lifehack is to draw the top and bottom with the paper oriented the same way, then gradually thicken the bottom, &amp;#8220;carving&amp;#8221; it into the right shape as I go.  I can make a lot of small adjustments and still end up with a single smooth line that looks more or less&amp;nbsp;deliberate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a last resort&amp;#8230;  leave it and hope no one notices.  That&amp;#8217;s what I did for the floatzel above, who has a big fat extra stroke across their lower stomach.  It&amp;#8217;s in one of the least interesting parts of the picture, though, so it doesn&amp;#8217;t really stand out, even though it&amp;#8217;s on one of the lightest&amp;nbsp;surfaces.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ink-takes-a-while"&gt;&lt;a class="toclink" href="#ink-takes-a-while"&gt;Ink takes a&amp;nbsp;while&lt;/a&gt;&lt;/h2&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2016-10-23-inktober/20161002-040-gardevoir.jpg" alt="" title="Oct 2, 2016: Gardevoir"&gt;
&lt;/div&gt;

&lt;p&gt;Ink drawings feel like they&amp;#8217;ve consumed my entire &lt;em&gt;month&lt;/em&gt;.  Sketching and then lining means drawing everything twice.  Using physical ink means I have to &lt;em&gt;nail&lt;/em&gt; the sketch — but I&amp;#8217;m used to digital, where I can sketch sloppily and then fixing up lines as I go.  I also can&amp;#8217;t rearrange the sketch, move it around on the paper if I started in the wrong place, or even erase precisely, so I&amp;#8217;ve had to be much more careful and thoughtful even with pencil.  That&amp;#8217;s a &lt;em&gt;good&lt;/em&gt; thing — I don&amp;#8217;t put nearly enough conscious thought into what I&amp;#8217;m drawing — but it definitely takes longer.  In a few thorny cases I&amp;#8217;ve even resorted to doing a very loose digital sketch, then drawing the pencil sketch based off of&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;All told, each one takes maybe two hours, and I&amp;#8217;ve been doing two at a time&amp;#8230;  but wait, that&amp;#8217;s still only four hours, right?  How are they taking most of a&amp;nbsp;day?&lt;/p&gt;
&lt;p&gt;I suspect a bunch of factors are costing me more time than expected.  If I can&amp;#8217;t think of a scene idea, I&amp;#8217;ll dawdle on Twitter for a while.  Two &amp;#8220;serious&amp;#8221; attempts in a medium I&amp;#8217;m not used to can be a little draining and require a refractory period.  Fragments of time between or around two larger tasks are, of course, lost forever.  And I guess there&amp;#8217;s that whole thing where I spent half the month waking up in the middle of the night for no reason and then being exhausted by late&amp;nbsp;evening.&lt;/p&gt;
&lt;p&gt;Occasionally I&amp;#8217;ve experimented with some approach that turns out to be incredibly tedious and time-consuming, like the early Gardevoir above.  You would not &lt;em&gt;believe&lt;/em&gt; how long that damn grass took.  Or maybe you would, if you&amp;#8217;d ever tried similar.  Even the much lazier tree-covered mountain in the background seemed to take a while.  And this is on a fairly small&amp;nbsp;canvas!&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m feeling a bit exhausted with ink work at this point, which is not the best place to be after buying a bunch of ink supplies.  I definitely want to do more of it in the future, but maybe not &lt;em&gt;daily&lt;/em&gt;.  I also miss being able to undo.  Sweet, sweet&amp;nbsp;undo.&lt;/p&gt;
&lt;h2 id="precision-is-difficult-and-i-am-bad-at-planning"&gt;&lt;a class="toclink" href="#precision-is-difficult-and-i-am-bad-at-planning"&gt;Precision is difficult, and I am bad at&amp;nbsp;planning&lt;/a&gt;&lt;/h2&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2016-10-23-inktober/20161004-043-phantump.jpg" alt="" title="Oct 4, 2016: Phantump"&gt;
&lt;/div&gt;

&lt;p&gt;These turn out to be largely the same&amp;nbsp;problem.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not a particularly patient person, so I like to jump from the sketch into the inking as soon as possible.  Sometimes this means I overlook some details.  Here&amp;#8217;s that whole &amp;#8220;not consciously thinking enough&amp;#8221; thing again.  Consider, in the above&amp;nbsp;image,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The two buildings at the top right are next to each other, yet the angles of their roofs suggest they&amp;#8217;re facing in slightly different directions, which doesn&amp;#8217;t make a lot of sense for artificial&amp;nbsp;structures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The path leading from the dock doesn&amp;#8217;t quite make sense, and the general scale of the start of the dock versus the shrubs and trees is nonsense.  The trees themselves are pretty cool, but it looks like I plopped them down individually without really having a full coherent plan going in.  Which is exactly what&amp;nbsp;happened.&lt;/p&gt;
&lt;p&gt;Imagining spaces in enough detail to draw them is &lt;em&gt;tough&lt;/em&gt;, and not something I&amp;#8217;ve really had to do much before.  It&amp;#8217;s ultimately the same problem I have with game level design, though, so hopefully a breakthrough in one will help me with the&amp;nbsp;other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Phantump&amp;#8217;s left eye has a clear white edge showing the depth of the hole in the trunk, but the right eye&amp;#8217;s edge was mostly lost to some errant strokes and subsequent attempts to fix them.  Also, even the left margin is nowhere near as thick as the trunk&amp;#8217;s &lt;em&gt;bottom&lt;/em&gt;&amp;nbsp;edge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The crosshatched top of phantump&amp;#8217;s head blends into the noisy grassy background.  The fix for this is to leave a thin white edge around the top of the head.  I think I &lt;em&gt;intended&lt;/em&gt; to do this, then completely forgot about it as I was drawing the grass.  I suppose I&amp;#8217;m not used to reasoning about negative space; I can&amp;#8217;t mark or indicate it in any way, nor erase the ink if I later realize I laid down too&amp;nbsp;much.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The pupils don&amp;#8217;t &lt;em&gt;quite&lt;/em&gt; match, but I&amp;#8217;d already carved them down a good bit.  Negative space problem again.  Highlights on dark areas have been a recurring problem all month, especially with&amp;nbsp;markers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have no idea how people make beautifully precise inkwork.  At the same time, I&amp;#8217;ve long had the suspicion that I worry too &lt;em&gt;much&lt;/em&gt; about precision and should be a lot looser.  I&amp;#8217;m missing something here, and I don&amp;#8217;t know what it&amp;nbsp;is.&lt;/p&gt;
&lt;h2 id="what-even-is-pokemon-anatomy"&gt;&lt;a class="toclink" href="#what-even-is-pokemon-anatomy"&gt;What even is pokémon&amp;nbsp;anatomy&lt;/a&gt;&lt;/h2&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2016-10-23-inktober/20161008-051-wigglytuff.jpg" alt="" title="Oct 8, 2016: Wigglytuff"&gt;
&lt;/div&gt;

&lt;p&gt;This is a wigglytuff.  Wigglytuffs are tall blobs with&amp;nbsp;ears.&lt;/p&gt;
&lt;p&gt;I had &lt;em&gt;such a hard time&lt;/em&gt; sketching this.  (Probably why I rushed the&amp;nbsp;background.)&lt;/p&gt;
&lt;p&gt;It turns out that if you draw a wigglytuff even slightly off, the result is &lt;em&gt;a tall blob with ears&lt;/em&gt; rather than a wigglytuff.  That makes no sense, especially given that wigglytuffs are &lt;em&gt;balloons&lt;/em&gt;.  Surely, the shape shouldn&amp;#8217;t be such a strong part of the wigglytuff identity, and yet it&amp;nbsp;is.&lt;/p&gt;
&lt;p&gt;Maybe half of the pokémon I&amp;#8217;ve drawn have had some anatomical surprise, even ones I thought I was familiar with.  Aerodactyl and huntail have a really pronounced lower jaw.  Palpitoad has no arms at all.  Pelipper is 70% mouth.  Zangoose seems like a straightforward mammal at first glance, but the legs and body and head are all kind of a single blob.  Numerous pokémon have no distinct neck, or no distinct shoulders, or a very round abdomen with legs kind of arbitrarily attached&amp;nbsp;somewhere.&lt;/p&gt;
&lt;h2 id="progress-maybe"&gt;&lt;a class="toclink" href="#progress-maybe"&gt;Progress,&amp;nbsp;maybe&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I don&amp;#8217;t know what precisely I&amp;#8217;ve gotten out of this experience.  I can&amp;#8217;t measure artistic progress from one day to the next.  I do feel like I&amp;#8217;ve gleaned some things, but they seem to be very abstract things.  I&amp;#8217;m out of the total beginner weeds and solidly into the intermediate hell of just picking up hundreds of little things no one really talks about.  All I can do is cross my fingers and push&amp;nbsp;forwards.&lt;/p&gt;
&lt;p&gt;The crowd favorite so far is this mega rayquaza, which is kinda funny to me because I don&amp;#8217;t feel like I did anything special here.  I just copied a bunch of fiddly details.  It looks cool, but it felt more like rote work than a struggle to do a new&amp;nbsp;thing.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2016-10-23-inktober/20161011-057-mega-rayquaza.jpg" alt="" title="Oct 11, 2016: Mega Rayquaza"&gt;
&lt;/div&gt;

&lt;p&gt;My own favorite is this much simpler qwilfish.  It&amp;#8217;s the culmination of several attempts to draw water that I liked, and it came out the best by far.  The highlight is also definitely the best I&amp;#8217;ve drawn this month.  Interesting how that works&amp;nbsp;out.&lt;/p&gt;
&lt;div class="prose-full-illustration"&gt;
&lt;img src="https://eev.ee/media/2016-10-23-inktober/20161013-062-qwilfish.jpg" alt="" title="Oct 13, 2016: Qwilfish"&gt;
&lt;/div&gt;

&lt;p&gt;The rest are on &lt;a href="https://lexyeevee.tumblr.com/tagged/daily-pok%C3%A9mon"&gt;on Tumblr&lt;/a&gt;, or in &lt;a href="https://twitter.com/eevee/status/790367777362026496"&gt;this single Twitter thread&lt;/a&gt;.&lt;/p&gt;</content><category term="release"></category><category term="making things"></category></entry><entry><title>I entered Ludum Dare 36</title><link href="https://eev.ee/release/2016/08/29/i-entered-ludum-dare-36/" rel="alternate"></link><published>2016-08-29T18:01:00-07:00</published><updated>2016-08-29T18:01:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2016-08-29:/release/2016/08/29/i-entered-ludum-dare-36/</id><summary type="html">&lt;p&gt;Short story: I made a video game again!  This time it was for &lt;a href="http://ludumdare.com/compo/about-ludum-dare/"&gt;Ludum Dare&lt;/a&gt;, a game jam with some tight &lt;a href="http://ludumdare.com/compo/rules/"&gt;rules&lt;/a&gt;: solo only, 48 hours to make the game and all its (non-code) assets.&lt;/p&gt;
&lt;p&gt;(This is called the “Compo”; there’s also a 72-hour “Jam” which is much more chill, but I did &lt;em&gt;hard mode&lt;/em&gt;.  Usually there’s a ratings round, but not this time, for reasons.)&lt;/p&gt;
&lt;p&gt;I used the &lt;a href="http://www.lexaloffle.com/pico-8.php"&gt;&lt;span class="caps"&gt;PICO&lt;/span&gt;-8&lt;/a&gt; again, so you can &lt;a href="https://c.eev.ee/isaacs-descent/"&gt;play it on the web&lt;/a&gt; as long as you have a keyboard.  It’s also on &lt;a href="http://ludumdare.com/compo/ludum-dare-36/?action=preview&amp;amp;uid=111773"&gt;Ludum Dare&lt;/a&gt;, and in &lt;a href="http://www.lexaloffle.com/bbs/?tid=27559"&gt;splore&lt;/a&gt;, and here’s the cartridge too.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://c.eev.ee/isaacs-descent/"&gt;&lt;img alt="Isaac's Descent" src="https://c.eev.ee/isaacs-descent/isaac.p8.png"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But wait!  Read on a bit first.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Short story: I made a video game again!  This time it was for &lt;a href="http://ludumdare.com/compo/about-ludum-dare/"&gt;Ludum Dare&lt;/a&gt;, a game jam with some tight &lt;a href="http://ludumdare.com/compo/rules/"&gt;rules&lt;/a&gt;: solo only, 48 hours to make the game and all its (non-code)&amp;nbsp;assets.&lt;/p&gt;
&lt;p&gt;(This is called the &amp;#8220;Compo&amp;#8221;; there&amp;#8217;s also a 72-hour &amp;#8220;Jam&amp;#8221; which is much more chill, but I did &lt;em&gt;hard mode&lt;/em&gt;.  Usually there&amp;#8217;s a ratings round, but not this time, for&amp;nbsp;reasons.)&lt;/p&gt;
&lt;p&gt;I used the &lt;a href="http://www.lexaloffle.com/pico-8.php"&gt;&lt;span class="caps"&gt;PICO&lt;/span&gt;-8&lt;/a&gt; again, so you can &lt;a href="https://c.eev.ee/isaacs-descent/"&gt;play it on the web&lt;/a&gt; as long as you have a keyboard.  It&amp;#8217;s also on &lt;a href="http://ludumdare.com/compo/ludum-dare-36/?action=preview&amp;amp;uid=111773"&gt;Ludum Dare&lt;/a&gt;, and in &lt;a href="http://www.lexaloffle.com/bbs/?tid=27559"&gt;splore&lt;/a&gt;, and here&amp;#8217;s the cartridge&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://c.eev.ee/isaacs-descent/"&gt;&lt;img alt="Isaac's Descent" src="https://c.eev.ee/isaacs-descent/isaac.p8.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But wait!  Read on a bit&amp;nbsp;first.&lt;/p&gt;


&lt;h2 id="foreword"&gt;&lt;a class="toclink" href="#foreword"&gt;Foreword&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve never entered a game jam before, and I slightly regretted that I missed a &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 jam that was happening while I was making &lt;a href="https://eev.ee/release/2016/05/25/under-construction-our-pico-8-game/"&gt;Under Construction&lt;/a&gt;.  I&amp;#8217;ve &lt;em&gt;certainly&lt;/em&gt; never made a game in 48 hours, so that seemed&amp;nbsp;exciting.&lt;/p&gt;
&lt;p&gt;More specifically, I have some trouble with shaking ideas loose.  I don&amp;#8217;t know a more specific word than &amp;#8220;idea&amp;#8221; for this, but I mean creative, narrative ideas: worldbuilding, characters, events, gameplay mechanics, and the like.  They have a different texture from &amp;#8220;how could I solve this technical problem&amp;#8221; ideas or &amp;#8220;what should I work on today&amp;#8221;&amp;nbsp;ideas.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll often have an idea or two, maybe a theme I want to move towards, and then hit a wall.  I can&amp;#8217;t think of any more concepts; I can&amp;#8217;t find any way to connect the handful I have.  I end up shelving the idea, sometimes indefinitely.  This has been particularly haunting with my interactive fiction game in progress, Runed Awakening, which by its very nature is nothing &lt;em&gt;but&lt;/em&gt; narrative&amp;nbsp;ideas.&lt;/p&gt;
&lt;p&gt;My true goal for entering Ludum Dare was to jiggle the idea faucet and maybe loosen it a bit.  Nothing&amp;#8217;s quite as motivating as an extreme time limit.  I went in without anything in mind; I didn&amp;#8217;t even know it was coming up until two days beforehand.  (The start time is softly enforced by the announcement of a theme, anyway.)  I knew it would probably resemble a platformer, since I already had the code available to make that work, but that was about&amp;nbsp;it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I already wrote about the approach to making our last game, so I can&amp;#8217;t very well just do that again.  Instead, here&amp;#8217;s something a little different: I took regular notes on the state of the game (and myself), all weekend.  You can see exactly how it came together, almost hour by hour.  Is that interesting?  &lt;em&gt;I&lt;/em&gt; think it&amp;#8217;s&amp;nbsp;interesting.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know if this is a better read if you play the game first or last.  Maybe&amp;nbsp;both?&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s also a surprise at the very end, as a reward for reading through it all!  No, wait, stop, you can&amp;#8217;t just scroll down, that&amp;#8217;s&amp;nbsp;cheating—&lt;/p&gt;
&lt;h2 id="timeline"&gt;&lt;a class="toclink" href="#timeline"&gt;Timeline&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="thursday"&gt;&lt;a class="toclink" href="#thursday"&gt;Thursday&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;09:00&lt;/strong&gt; — Already nervous.  Registered for the site yesterday; voted on the themes today; jam actually starts tomorrow.  I have no idea if I can do this.  What a great&amp;nbsp;start.&lt;/p&gt;
&lt;h3 id="friday"&gt;&lt;a class="toclink" href="#friday"&gt;Friday&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;09:00&lt;/strong&gt; — Even more nervous.  Last night I started getting drowsy around 5pm, I guess because my sleep is still a bit weird.  So not only do I only have 48 hours, but by the looks of things, I&amp;#8217;ll be spending half that time&amp;nbsp;asleep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;17:00&lt;/strong&gt; — I can&amp;#8217;t even sit still and do anything for the next hour; I&amp;#8217;m too antsy about getting&amp;nbsp;started.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;START&lt;/span&gt;!! 18:00&lt;/strong&gt; — Theme revealed: &amp;#8220;Ancient Technology&amp;#8221;.  I have &lt;em&gt;no&lt;/em&gt;&amp;nbsp;ideas.&lt;/p&gt;
&lt;p&gt;Well, no, hang on.  Shortly before the theme was announced, I had a brief Twitter conversation that shook something loose.  I&amp;#8217;d mentioned that I rarely seem to have enough ideas to fill a game.  Someone accidentally teased out of me that it&amp;#8217;s more specific than that: I have trouble coming up with ideas that &lt;em&gt;appeal&lt;/em&gt; to me, that satisfy me in the way I really like in games and stories.  In retrospect, I probably have a bad habit of rejecting ideas by reflex before I even have a chance to think about them and turn them into something more&amp;nbsp;inspiring.&lt;/p&gt;
&lt;p&gt;The same person also asked how I want games to &lt;em&gt;feel&lt;/em&gt;, and of course, that&amp;#8217;s what I should be keeping front and center, before even worrying about genre or mechanics or anything.  How does this feel, and how does it make &lt;em&gt;me&lt;/em&gt; feel?  I &lt;em&gt;know&lt;/em&gt; that&amp;#8217;s important, but I&amp;#8217;m not in the habit of thinking about&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;With that in mind, how does &amp;#8220;ancient technology&amp;#8221; make me&amp;nbsp;feel?&lt;/p&gt;
&lt;p&gt;It reminds me immediately of two things: Indiana Jones-esque temples, full of centuries-old mechanisms and unseen triggers that somehow still work perfectly; and also Stargate, where a race literally called &amp;#8220;Ancients&amp;#8221; made preposterously advanced devices with such a sleek and minimalist design that they might as well have been&amp;nbsp;magic.&lt;/p&gt;
&lt;p&gt;The common thread is a sense of, hm, &amp;#8220;soft wonder&amp;#8221;?  You&amp;#8217;re never quite sure what&amp;#8217;s around the next corner, but it won&amp;#8217;t be a huge surprise, just a new curiosity.  There&amp;#8217;s the impression of a coherent set of rules somewhere behind the scenes, but you never get to see it, and it doesn&amp;#8217;t matter that much anyway.  You catch a glimpse of what&amp;#8217;s left behind, and half your astonishment is that it&amp;#8217;s still here at&amp;nbsp;all.&lt;/p&gt;
&lt;p&gt;Also, I bet I can make a puzzle-platformer out of&amp;nbsp;this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:20&lt;/strong&gt; — Okay, well!  I have a character Isaac (stolen from Glip, ahem) who exists in Runed Awakening but otherwise has never seen any real use.  I might as well use them now, which means this game is also set somewhere in&amp;nbsp;Flora.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve drawn a two-frame walking animation and saved it as &lt;code&gt;isaac.p8&lt;/code&gt; for now.  It&amp;#8217;s enough to get started.  I&amp;#8217;m gonna copy/paste all the engine gunk from my unfinished game, rainblob — it&amp;#8217;s based on what was in Under Construction, with some minor cleanups and&amp;nbsp;enhancements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19:00&lt;/strong&gt; — I&amp;#8217;m struggling a little bit here, because Isaac is two tiles tall, and I never got around to writing real support for actors that are bigger than a single tile.  Most of the sprite drawing is now wrapped in a little &lt;code&gt;sprite&lt;/code&gt; type, so I don&amp;#8217;t think this will be &lt;em&gt;too&lt;/em&gt; bad — I almost have it working, except that it doesn&amp;#8217;t run&amp;nbsp;yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19:07&lt;/strong&gt; — Success!  Apparently I was closer than I thought.  The solution is a bit of a hack: instead of a list of tiles (as animation frames), Isaac has a list &lt;em&gt;of lists&lt;/em&gt; of tiles, where each outer list is the animation for one grid space.  It required some type-checking to keep the common case working (boo), and it blindly assumes any multi-tile actor is a 1×n rectangle.  It&amp;#8217;s fine.  Whatever.  I&amp;#8217;ll fix it if I really need&amp;nbsp;to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19:16&lt;/strong&gt; — I drew and placed some cave floor tiles.  Isaac can no longer walk left or jump.  I am not sure why.  I really, really hope it&amp;#8217;s not another collision bug.  The collision function has been such a nightmare.  Is it choking on a moving object that&amp;#8217;s more than a tile&amp;nbsp;tall?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19:20&lt;/strong&gt; — I have been asked to put a new bag in the trash can.  This is wildly unjust.  I do not have time for such trivialities.  But I have to pee anyway, so it&amp;#8217;s okay — I&amp;#8217;ll batch these two standing-up activities together to save time.  Speed&amp;nbsp;strats.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19:28&lt;/strong&gt; — The left/jump thing seems to be a bug with the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8; the button presses don&amp;#8217;t register at all.  Restarting the &amp;#8220;console&amp;#8221; fixed it.  This is ominous; I hope a mysterious heisenbug doesn&amp;#8217;t plague me for the next 46½&amp;nbsp;hours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19:51&lt;/strong&gt; — Isaac is a wizard.  Surely, they should be able to cast spells or whatever.  Teeny problem: the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 only has two buttons, and I need one of them for jumping.  (Under Construction uses up for jump, but I&amp;#8217;ve seen several impassioned pleas against doing that because it makes using a real d-pad very awkward, and after using the pocketCHIP I&amp;#8217;m inclined to&amp;nbsp;agree.)&lt;/p&gt;
&lt;p&gt;New plan, then: you have an inventory.  Up and down scroll through it, and the spare button means &amp;#8220;use the selected item&amp;#8221;.  Accordingly, I&amp;#8217;ve put a little &amp;#8220;selected item&amp;#8221; indicator in the top left of the&amp;nbsp;screen.&lt;/p&gt;
&lt;p&gt;Isaac hasn&amp;#8217;t seen too much real character development; it&amp;#8217;s hard to develop a character without actually putting them &lt;em&gt;in&lt;/em&gt; something.  Their backstory thusfar isn&amp;#8217;t really important for this game, but I did have the idea that they travel with a staff that can create a reflective bubble.  That&amp;#8217;s interesting, because it suggests that Isaac prefers to operate defensively.  I made a staff sprite and put it in the starting inventory, but I&amp;#8217;m not quite sure what to do with it yet; I don&amp;#8217;t know how the bubble idea would work in a tiny&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20:01&lt;/strong&gt; — As a proof of concept, I made the staff shoot out particles when you use it.  The particle system is from rainblob, and is pretty neat — they&amp;#8217;re just dumb actors that draw themselves as a single&amp;nbsp;pixel.&lt;/p&gt;
&lt;p&gt;I bound the X button to &amp;#8220;use&amp;#8221;.  Should jumping be X or O?  I&amp;#8217;m not sure, hm.  My Nintendo instincts tell me the right button is for jumping, but on a keyboard, the &amp;#8220;d-pad&amp;#8221; and buttons are&amp;nbsp;reversed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20:04&lt;/strong&gt; — I realize I added a sound effect for jumping, then accientally overwrote the code that plays it.  Oops; fixing that.  Good thing I didn&amp;#8217;t overwrite the sound!  This is what I get for trying to edit the assets in the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 and the code in vim, when it&amp;#8217;s all stored in a single&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20:37&lt;/strong&gt; — I have a &lt;code&gt;printat&lt;/code&gt; function (from Under Construction) which prints text to the screen with a given horizontal and vertical alignment.  It needs to know the width of text to do this, which is easy enough: the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 font is fixed-width.  Alas!  The latest &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 release added characters to represent the controller buttons, and I&amp;#8217;d really like to use them, but they&amp;#8217;re double-wide.  Hacking around this is proving a bit awkward, especially since there&amp;#8217;s no &lt;code&gt;ord()&lt;/code&gt; function available oh my&amp;nbsp;god.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20:50&lt;/strong&gt; — Okay, done.  The point of that was: I rigged a little hint that tells you what button to press to jump.  When you approach the first ledge, Isaac sprouts a tiny thought bubble with the O button symbol in it.  &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 games tend not to explain themselves (something that has frustrated me more than once), so I think that&amp;#8217;s nice.  It&amp;#8217;s the kind of tiny detail I love including in my&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;21:04&lt;/strong&gt; — I wrote a tiny fragment of music, but I really don&amp;#8217;t know what I&amp;#8217;m doing here, so&amp;#8230;  I don&amp;#8217;t&amp;nbsp;know.&lt;/p&gt;
&lt;p&gt;I had the idea that there&amp;#8217;d be runes carved in the back wall of this cave, so I made a sprite for that, though it&amp;#8217;s basically unrecognizable at this size.  I don&amp;#8217;t know what reading them will do,&amp;nbsp;yet.&lt;/p&gt;
&lt;p&gt;I also made the staff draw a bubble (in the form of a circle around you) while you&amp;#8217;re holding the &amp;#8220;use&amp;#8221; button down, via a cheap hack.  Kinda just throwing stuff at the wall in the hopes that something will&amp;nbsp;stick.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;21:07&lt;/strong&gt; — I&amp;#8217;ve decided to eat these chips while I ponder where to go from&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;21:22&lt;/strong&gt; — So, argh.  Isaac&amp;#8217;s staff is supposed to create a bubble that reflects magical attacks.  The immediate problem there is that my collision assumes everything is a rectangle.  I &lt;em&gt;really&lt;/em&gt; don&amp;#8217;t want to be rewriting collision with only a weekend to spend on this.  I could make the bubble rectangular, but who&amp;#8217;s ever heard of a rectangular magic&amp;nbsp;bubble?&lt;/p&gt;
&lt;p&gt;Maybe I could make this work, but it raises more questions: &lt;em&gt;what&lt;/em&gt; magical attacks?  What attacks you?  Are there monsters?  Do I have to write monster &lt;span class="caps"&gt;AI&lt;/span&gt;?  Can Isaac die?  I need to translate these scraps of thematics into game mechanics,&amp;nbsp;somehow.&lt;/p&gt;
&lt;p&gt;I try to remember to think about the &lt;em&gt;feel&lt;/em&gt;.  I want you to feel like you&amp;#8217;re exploring an old cavern/temple/something, laden with traps meant to keep you out.  I think that means death, and death means save points, and save points mean saving the game state, which I don&amp;#8217;t have extant code for.&amp;nbsp;Oof.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;22:00&lt;/strong&gt; — Not much has changed; I started doodling sprites as a distraction.  Still getting this thing where left and up stop working, what the&amp;nbsp;hell.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;22:05&lt;/strong&gt; — Actually, I&amp;#8217;m getting tired; I should deal with the cat litter before it gets too late.  Please&amp;nbsp;hold.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;22:59&lt;/strong&gt; — I wrote some saving, which doesn&amp;#8217;t work yet.  Almost, maybe.  I do have a pretty cool death animation, though it looks a bit wonky in-game, because animations are on a global timer.  Whoops!  All of them have been really simple so far, so it hasn&amp;#8217;t mattered, but this is something that really needs to start at the beginning and play through exactly&amp;nbsp;once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;23:15&lt;/strong&gt; — Okay!  I have a save, and I have death, and I even have some sound effects for them.  The animation is still off, alas (and loops forever), and there&amp;#8217;s no way to &lt;em&gt;load&lt;/em&gt; after you die, but the basic cycle of this kind of game is coming together.  If I can get a little more engine stuff working tomorrow, I should be able to build a little game.  Goodnight for&amp;nbsp;now.&lt;/p&gt;
&lt;h2 id="saturday"&gt;&lt;a class="toclink" href="#saturday"&gt;Saturday&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;07:48&lt;/strong&gt; — I&amp;#8217;m.  I&amp;#8217;m&amp;nbsp;up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;08:28&lt;/strong&gt; — Made the animation start when the player dies and stop after it&amp;#8217;s played once.  Also made the music stop immediately on death and touched up the sprites a bit.  Still no loading, so death pretty much ends the game forever; that&amp;#8217;s up next and should be easy enough.  First,&amp;nbsp;breakfast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;09:09&lt;/strong&gt; — The world is now restored after you die, and I fixed a few bugs as well.  Cool&amp;nbsp;beans.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;09:14&lt;/strong&gt; — So, ah.  That&amp;#8217;s a decent start mechanically, but I need a little more &lt;em&gt;concept&lt;/em&gt;, especially as it relates to the theme.  I don&amp;#8217;t expect this game to be particularly deep, what with its non-plot of &amp;#8220;explore these caverns&amp;#8221;, but I do want to explore the theme a bit.  I want something that&amp;#8217;s interesting to play, too, even if for only five&amp;nbsp;minutes.&lt;/p&gt;
&lt;p&gt;Isaac is a clever wizard.  Canonically, he might be the cleverest wizard.  What does his staff&amp;nbsp;do?&lt;/p&gt;
&lt;p&gt;What kind of traps would be in a place like this?  Spikes, falling floors, puzzles?  Monsters?  Pressure&amp;nbsp;plates?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What does Isaac&amp;#8217;s staff&amp;nbsp;do?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hang on, let me approach this a much more sensible way: if &lt;em&gt;I&lt;/em&gt; were going to explore a cavern like this, what would I &lt;em&gt;want&lt;/em&gt; my staff to&amp;nbsp;do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;09:59&lt;/strong&gt; — I&amp;#8217;m still struggling with this question.  I thought perhaps the cavern would only be the introductory part, and then you&amp;#8217;d find a cool teleporter to a dusty sleek place that looked a lot more techy.  I tried drawing some sleek bricks, but I can&amp;#8217;t figure out how to get the aesthetic I want with the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8&amp;#8217;s palette.  So I distracted myself by drawing some foreground tiles again.&amp;nbsp;Whoops?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:01&lt;/strong&gt; — I&amp;#8217;d tweeted two GIFs of Isaac&amp;#8217;s death while working on it, complete with joking melodramatic captions like &amp;#8220;death has no power here&amp;#8221;.  I also lamented that I didn&amp;#8217;t know yet what the game was &lt;em&gt;about&lt;/em&gt;, to which someone jokingly replied that so far it seemed to be &amp;#8220;about&amp;nbsp;death&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Aha.  Maybe the power of Isaac&amp;#8217;s staff is to &lt;em&gt;create&lt;/em&gt; savepoints, and maybe some puzzles or items or whatever transcend death, sticking around after you respawn.  I&amp;#8217;ll work with that for a bit and see what falls out of&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:12&lt;/strong&gt; — Wow, I&amp;#8217;ve been busy!  The staff now creates savepoints, complete with a post-death menu, a sound effect, a flash (bless you, &lt;span class="caps"&gt;UC&lt;/span&gt;&amp;#8217;s &lt;code&gt;scenefader&lt;/code&gt;), a thought-bubble hint, and everything.  It&amp;#8217;s pretty great?  And it fits perfectly: if you&amp;#8217;re exploring a trap-laden cavern then you&amp;#8217;d want some flavor of safety equipment with you, right?  What&amp;#8217;s safer than outright&amp;nbsp;resurrection?&lt;/p&gt;
&lt;p&gt;I can see some interesting puzzles coming out of this: you have to pick your savepoint carefully to interact with mechanisms in the right way, or you have to make sure you can kill yourself if you need to, since that&amp;#8217;s the only way to hop back to a savepoint.  And it&amp;#8217;s a purely defensive ability, just as I wanted.  And something impossibly cool and powerful but &lt;em&gt;hilariously&lt;/em&gt; impractical seems extremely up Isaac&amp;#8217;s alley, from what I know about them so&amp;nbsp;far.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:59&lt;/strong&gt; — Still busy, which is a good sign!  I&amp;#8217;ve been working on making some objects for Isaac to interact with in the world; so far I&amp;#8217;ve focused on the runes on the wall, though I&amp;#8217;m not quite sold on them yet.  The entire game so far is that you have to make a save point, jump down a pit to use a thing that extends a bridge over the pit, then kill yourself to get back to the save point and cross the bridge.  It&amp;#8217;s very rough, but it&amp;#8217;s finally &lt;em&gt;looking&lt;/em&gt; like a game, which is really great to&amp;nbsp;see.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12:28&lt;/strong&gt; — I finally got sick enough of left/up breaking that I sat down and tried every distinct action I could think of, one at a time, to figure out the cause.  Turns out it was my &lt;em&gt;drawing tablet&lt;/em&gt;, which I&amp;#8217;d used a couple times to draw sprites?  If the pen is close enough to even register as a pointer, left and up break.  I know I&amp;#8217;ve seen the tablet listed as a &amp;#8220;joypad&amp;#8221; in other &lt;span class="caps"&gt;SDL&lt;/span&gt; applications, so my best guess is that it&amp;#8217;s somehow acting as an axis and confusing &lt;span class="caps"&gt;PICO&lt;/span&gt;-8?  I can&amp;#8217;t imagine why or how.  Super, super weird, but at least now I know what the problem&amp;nbsp;is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;14:28&lt;/strong&gt; — Uh, whoops.  Somehow I spent two hours yelling on Twitter.  I don&amp;#8217;t know how that&amp;nbsp;happened.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16:42&lt;/strong&gt; — Hey, what&amp;#8217;s up.  I&amp;#8217;ve been working on music (with very mixed results) and fixing bugs.  I&amp;#8217;m still missing a lot of minor functionality — for example, resetting the room doesn&amp;#8217;t actually clear the platforms, because resetting the map only asks actors to reset themselves, and the platforms are &lt;em&gt;new&lt;/em&gt; actors who don&amp;#8217;t know they should vanish.&amp;nbsp;Oops.&lt;/p&gt;
&lt;p&gt;Oh, I also have them appearing on a timer, which is cool.  I want their appearance to be animated, too, but that&amp;#8217;s tricky with the current approach of just drawing tiles directly on the map.  I guess I could turn them into real actors that are always present but can appear and vanish, which would also fix the reset&amp;nbsp;thing.&lt;/p&gt;
&lt;p&gt;For now, it&amp;#8217;s time to eat and swim, so I&amp;#8217;ll get back to this&amp;nbsp;later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:22&lt;/strong&gt; — I&amp;#8217;m so fucked.  Everything is a mess.  The room still doesn&amp;#8217;t reset correctly.  The time is half up and I have &lt;em&gt;almost&lt;/em&gt; one room so&amp;nbsp;far.&lt;/p&gt;
&lt;p&gt;I need to shift gears here: fix the bugs as quickly as I can, then focus on&amp;nbsp;rooms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20:05&lt;/strong&gt; — I fixed a bunch of reset bugs, but I&amp;#8217;m getting increasingly agitated by how half-assed this engine is.  It&amp;#8217;s alright for what it is, I guess, but it clearly wasn&amp;#8217;t designed for anything in particular, and I feel like I have to bolt features on haphazardly as I need&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;Anyway, I made progression work, kinda: when you touch the right side of the room, you move on to the next one.  When you touch the right side of the final room, you win, and the game celebrates by&amp;nbsp;crashing.&lt;/p&gt;
&lt;p&gt;I made a little moving laser eye thing that kills you on contact, creating a cute puzzle where you just resurrect yourself as soon as it&amp;#8217;s gone past you.  Changed death so time keeps passing while the prompt is up, of&amp;nbsp;course.&lt;/p&gt;
&lt;p&gt;Now I have a whopping, what, &lt;em&gt;three&lt;/em&gt; world objects?  And one item you can use, the one you start with?  And I&amp;#8217;m not sure how to put these together into any more&amp;nbsp;puzzles.&lt;/p&gt;
&lt;p&gt;I made Isaac&amp;#8217;s cloak flutter a bit while they walk.&amp;nbsp;Cool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20:31&lt;/strong&gt; — For lack of any better ideas, I added something I&amp;#8217;d wanted since the beginning: Isaac&amp;#8217;s color scheme is now chosen randomly at startup.  They &lt;em&gt;are&lt;/em&gt; a newt, you&amp;nbsp;see.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;21:07&lt;/strong&gt; — Did some cleanup and minor polishing, but still feeling blocked.  Going to brainstorm with myself a&amp;nbsp;bit.&lt;/p&gt;
&lt;p&gt;What are some &amp;#8220;ancient&amp;#8221; mechanisms?  Pressure plates; blowdarts; secret doors; hidden buttons;&amp;nbsp;&amp;#8230;?&lt;/p&gt;
&lt;p&gt;Does Isaac get an improved resurrection ability later?  Resurrect where you died?  I don&amp;#8217;t know how that would be especially useful unless you died on a moving platform, and I don&amp;#8217;t have anything like&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;Other magical objects you&amp;nbsp;find&amp;#8230;?&lt;/p&gt;
&lt;p&gt;Puzzle ideas?  Set up a way to kill yourself so you can use it later?  Currently there&amp;#8217;s no way to interact with the world other than to add those platforms, so I don&amp;#8217;t see how this would work.  I also like &amp;#8220;conflict&amp;#8221; puzzles where two goals seem to depend on each other, but offhand I can&amp;#8217;t think of anything along those lines besides the first&amp;nbsp;room.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;21:55&lt;/strong&gt; — I&amp;#8217;ve built a &lt;em&gt;third puzzle&lt;/em&gt;, which is just some slightly aggravating platforming, made a little less so by the ability to save your&amp;nbsp;progress.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;22:19&lt;/strong&gt; — I started on a large room marking the end of the cave sequence and the entrance to the sleek brick area.  I made a few tiles and a sound effect for it, but I&amp;#8217;m not quite sure how the puzzle will work.  I want a bigger and more elaborate setup with some slight backtracking, and I want to give the player a new toy to play with, but I&amp;#8217;m not sure&amp;nbsp;what.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll have to figure it out&amp;nbsp;tomorrow.&lt;/p&gt;
&lt;h2 id="sunday"&gt;&lt;a class="toclink" href="#sunday"&gt;Sunday&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;08:49&lt;/strong&gt; — Uggh, I&amp;#8217;m awake.  Barely.  I keep sleeping for only six hours or so, which&amp;nbsp;sucks.&lt;/p&gt;
&lt;p&gt;I think I want to start out by making a title screen and some sort of ending.  Even if I only have three puzzles, a front and back cover will make it look much more like an actual&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;09:57&lt;/strong&gt; — I made a little title screen and wrote a simple ditty for it, which I might even almost&amp;nbsp;like?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:09&lt;/strong&gt; — Made a credits screen as well, which implies that there&amp;#8217;s an actual ending.  And there is!  You get the Flurry, an enchanted rapier I thought of a little while ago.  It&amp;#8217;s not described in the game or even mentioned outside of the &amp;#8220;credits&amp;#8221;, in true 8-bit&amp;nbsp;fashion.&lt;/p&gt;
&lt;p&gt;Now I have a complete game no matter what, so I can focus on hammering out some levels without worrying too much about&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;I also fixed up the ingame music; it used to have some high notes come in on a separate track, in my clumsy attempts at corralling multiple instruments, but I think they destroyed the mood.  Now it&amp;#8217;s mostly those low notes and some light &amp;#8220;bass&amp;#8221;.  It works as a loop now, too.  Much better in every&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;The awkward-platforming room had a particularly tricky jump that turned out to be trickier than I thought — I suddenly couldn&amp;#8217;t do it at all when trying to demo the game for Mel.  At their suggestion, I made it a bit less terrible, though hopefully still tricky enough that it might need a second&amp;nbsp;try.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13:05&lt;/strong&gt; — Hi!  Wow!  I&amp;#8217;ve been super busy!  I came up with a new puzzle involving leaving a save point in midair while dropping down a pit.  Then I finally added a new item, mostly inspired by how easy it was to implement: a spellbook that makes you float but doesn&amp;#8217;t let you jump, so you can only move back and forth horizontally until you turn it off.  I also added a thought bubble for how to cycle through the inventory, some really cute sound effects for when you use the book, and an introductory puzzle for it.  It&amp;#8217;s coming along pretty&amp;nbsp;nicely!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;14:13&lt;/strong&gt; — Trying to design a good puzzle for the next area.  I made a stone door object which can open and close, though the way it does so is pretty gross, and a wooden wheel that opens it.  I really like the wheel; my first thought was to use a different color lever, but I wanted the doors to be reusable whereas the platform lever isn&amp;#8217;t, and using the same type of mechanism seemed&amp;nbsp;misleading.&lt;/p&gt;
&lt;p&gt;I might be trying to cram too much into the same room at the moment?  It introduces the spellbook &lt;em&gt;and&lt;/em&gt; the doors/wheel, then makes you solve a puzzle using both.  I might split this up and try to introduce both ideas&amp;nbsp;separately.&lt;/p&gt;
&lt;p&gt;I think around 16:00, I&amp;#8217;m gonna stop making puzzle rooms (unless I still have an amazing idea) and focus on cleaning stuff up, fixing weird bugs, and maybe un-hacking some of these&amp;nbsp;hacks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;15:19&lt;/strong&gt; — Someone asked if I streamed my dev process, and I realized that this would&amp;#8217;ve been a perfect opportunity to do that, since everything happens within a single small box.  Oops.  I guess I&amp;#8217;ll stream the last few hours, though now no one can watch without getting all he puzzle&amp;nbsp;spoiled.&lt;/p&gt;
&lt;p&gt;I made a separate room for getting the spellbook, plus another for introducing the stone doors.  The pacing is much &lt;em&gt;much&lt;/em&gt; better, and now there are more puzzles overall, which is&amp;nbsp;nice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;15:54&lt;/strong&gt; — My puzzles seem to be pretty solid, and I&amp;#8217;ve only got space for one more on the map, so I&amp;#8217;m thinking about what I&amp;#8217;d like it to&amp;nbsp;be.&lt;/p&gt;
&lt;p&gt;I want something else that combines mechanics, like, using the platforms to block a door from closing all the way.  But a door and a platform can&amp;#8217;t coexist on the same tile, so the door has to start out partially open.  And&amp;#8230;  what happens if you summon the platform after closing the door all the way?  Hm.  I wish my physics were more thorough, but right now none of these objects interact with each other terribly well; the stone door in particular just kinda ignores anything in its way until it hits solid&amp;nbsp;wall.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16:04&lt;/strong&gt; — Instead of all that, I fixed the animation on the wheel (it wasn&amp;#8217;t playing at all?), gave it a sound effect that I &lt;em&gt;love&lt;/em&gt;, and finally added an explicit way to control draw order.  The savepoint rune had been drawing &lt;em&gt;over&lt;/em&gt; the player since the very beginning, which had been bugging me all weekend.  Now the player is always on top.  Very glad I had &lt;code&gt;sort&lt;/code&gt; lying&amp;nbsp;around.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16::57&lt;/strong&gt; — I guess I&amp;#8217;m done?  I filled that last puzzle room with an interesting timing thing that uses the lever, wheel, runes, &lt;em&gt;and&lt;/em&gt; floating, but there are a couple different ways to go about it, and one way is 1-cycle.  It bugs me a &lt;em&gt;little&lt;/em&gt; that the original setup I wanted (repeat the platforming, then discover it won&amp;#8217;t get you all the way to the exit and have to rethink it) doesn&amp;#8217;t work, but, there&amp;#8217;s no reason you&amp;#8217;d &lt;em&gt;think&lt;/em&gt; to do it the fastest way the first time, and I think being able to notice that adds an extra &amp;#8220;aha&amp;#8221;.  Gotta resist the urge to&amp;nbsp;railroad!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Editor&amp;#8217;s note: I later fixed a bug that removed the 1-cycle&amp;nbsp;solution.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll call this done and let people playtest it, once I make it fit within the compressed size&amp;nbsp;limit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;17:08&lt;/strong&gt; — God, fuck the compressed size limit.  I started at 20538; I deleted all the debug and unused stuff inherited from rainblob and &lt;span class="caps"&gt;UC&lt;/span&gt;, and now I&amp;#8217;m at 18491.  The limit is 15360.  God dammit.  I don&amp;#8217;t want to have to strip all the comments&amp;nbsp;again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;17:39&lt;/strong&gt; — I ended up deleting all the comments again.  Oh, well.  I ran through it from start to finish once, and all seems good!  The game is done and online, and all that&amp;#8217;s left is figuring out how to put it on the &lt;span class="caps"&gt;LD&lt;/span&gt;&amp;nbsp;website.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:46&lt;/strong&gt; — Time is up, but this is &amp;#8220;submission hour&amp;#8221; and the rules allow fixing minor bugs, so I fixed a few things people have pointed&amp;nbsp;out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Two obvious places you could get stuck now have spikes.  You can reset the room from the menu, but I&amp;#8217;m pretty sure nobody noticed the &amp;#8220;enter = menu&amp;#8221; on the title screen, and a few people have thought they had to reset the entire&amp;nbsp;game.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The last spike pit in the spellbook room required you to walk through spikes, which wasn&amp;#8217;t what I intended and &lt;em&gt;looks&lt;/em&gt; fatal, even though it&amp;#8217;s not.  The intention was for it to be an exact replica of the previous pit, except that you have to float across it from a tile higher; this solution now&amp;nbsp;works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of those half-rock-brick tiles somehow ended up in the first room?  Not sure how.  It&amp;#8217;s gone&amp;nbsp;now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mel expressed annoyance at having to align a float across the wide penultimate room with no kind of hint, so I added a half-rock-brick tile to the place where you need to stand to use the high-up&amp;nbsp;wheel.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="parting-thoughts"&gt;&lt;a class="toclink" href="#parting-thoughts"&gt;Parting&amp;nbsp;thoughts&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I enjoyed making this!  It definitely accomplished its ultimate goal of giving me more experience shaking ideas loose.  Looking back over those notes, the progression is fascinating: I didn&amp;#8217;t even know the core mechanic of resurrecting until 16 hours in (a third of the time), and it was inspired by a joke reply on Twitter.  At the 41-hour mark, I still only had three and a half puzzle rooms; the final game has ten.  The spellbook seriously only exists because &amp;#8220;don&amp;#8217;t apply gravity&amp;#8221; was so trivial to implement, and the floating effect is something I&amp;#8217;d already added for making the Flurry dramatically float above its platform.  &lt;em&gt;Half the game&lt;/em&gt; only exists because I decided a puzzle was too complicated and tried to split it&amp;nbsp;up.&lt;/p&gt;
&lt;p&gt;I almost can&amp;#8217;t believe I actually churned all this out in 48 hours.  I&amp;#8217;ve pretty much never made music before, but I ended up really liking the main theme, and I &lt;em&gt;adore&lt;/em&gt; the sound effects.  The sprites are great, considering the limitations.  I&amp;#8217;d never drawn a serious sprite animation before, either, but I love Isaac&amp;#8217;s death sequence.  The cave texture is &lt;em&gt;great&lt;/em&gt;, and a last-minute improvement over my original sprite, which looked more like scratched-up wood.  I also drew a scroll sprite that I adored, but I never found an excuse to use it in the game,&amp;nbsp;alas.&lt;/p&gt;
&lt;p&gt;Almost everyone who&amp;#8217;s played it has made it all the way through without too much trouble, but also seemed to enjoy the puzzles.  I take that to mean the game has a good learning curve, which I&amp;#8217;m really happy&amp;nbsp;about.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m glad I already had a little engine, or I would&amp;#8217;ve gotten &lt;em&gt;nowhere&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I have some more ideas that I discarded as impractical due to time or size constraints, so I may port the game to LÖVE and try to expand on it.  When I say &amp;#8220;may&amp;#8221;, I mean I started working on this about two hours after finishing the&amp;nbsp;game.&lt;/p&gt;
&lt;h2 id="oh-and-im-writing-a-book"&gt;&lt;a class="toclink" href="#oh-and-im-writing-a-book"&gt;Oh, and I'm writing a&amp;nbsp;book&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Right, yes, about that.  I&amp;#8217;ve been mumbling about this for ages, but I didn&amp;#8217;t want to go on about the idea so much that actually &lt;em&gt;doing it&lt;/em&gt; lost its appeal.  I think I&amp;#8217;ve made enough of a dent now that I&amp;#8217;m likely to stick with&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m writing a book about game development — the literal act of game development.  I made a list of about a dozen free (well, except &lt;span class="caps"&gt;PICO&lt;/span&gt;-8) and cross-platform game engines spanning a wide range of ease-of-use, creative freedom, and age.  I&amp;#8217;m going to make a little game in each of them and explain what I&amp;#8217;m doing as I do it, give background on totally new things, preserve poor choices and show how I recovered from them, say what inspired an idea or how I got past a creative roadblock, etc.  The goal is to write something that someone with no experience in programming or art or storytelling can follow from beginning to end, getting at least an impression of what it looks like to create a game from&amp;nbsp;scratch.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s kind of a response to the web&amp;#8217;s mountains of tutorials and beginner docs that take you from &amp;#8220;here&amp;#8217;s what a variable is&amp;#8221; all the way to &amp;#8220;here&amp;#8217;s what a function is&amp;#8221;, then abandon you.  I hate trying to get into a new thing and only finding slow, dull introductions that don&amp;#8217;t tell me how to do anything &lt;em&gt;interesting&lt;/em&gt;, or even show what kinds of things are possible.  I hope that for anyone who learns the way I do, &amp;#8220;here&amp;#8217;s how I made a whole game&amp;#8221; will be more than enough to hit the ground&amp;nbsp;running.&lt;/p&gt;
&lt;p&gt;I have part of an early chapter on MegaZeux written; I wanted to finish it by the end of August, but that&amp;#8217;s clearly not happening, oops.  I also started on a Godot chapter, which will be a little different since it&amp;#8217;s for a game that will hopefully have multiple people working on&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Isaac&amp;#8217;s Descent will be the subject of a &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 chapter — that&amp;#8217;s why I took the notes!  It&amp;#8217;ll expand &lt;em&gt;considerably&lt;/em&gt; on what I wrote above, starting with going through all the code I inherited from Under Construction (and recreating how I wrote it in the first place).  I also have about 20 snapshots of the game as it developed, which I&amp;#8217;m holding onto myself for&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;I want to put rough drafts of each chapter on the $4 &lt;a href="https://www.patreon.com/eevee"&gt;Patreon&lt;/a&gt; tier as I finish them, so keep an eye out for that, though I don&amp;#8217;t have any &lt;span class="caps"&gt;ETA&lt;/span&gt; just yet.  I imagine MegaZeux or &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 will be ready within the next couple&amp;nbsp;months.&lt;/p&gt;</content><category term="release"></category><category term="tech"></category><category term="gamedev"></category><category term="making things"></category></entry><entry><title>Under Construction, our PICO-8 game</title><link href="https://eev.ee/release/2016/05/25/under-construction-our-pico-8-game/" rel="alternate"></link><published>2016-05-25T00:00:00-07:00</published><updated>2016-05-25T00:00:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2016-05-25:/release/2016/05/25/under-construction-our-pico-8-game/</id><summary type="html">&lt;p&gt;&lt;a href="http://glitchedpuppet.com/"&gt;Mel&lt;/a&gt; and I made a game!&lt;/p&gt;
&lt;p&gt;We’d wanted to a small game together for a while.  &lt;a href="https://eev.ee/blog/2016/04/30/embedding-lua-vs-python/"&gt;Last month’s post about embedding Lua&lt;/a&gt; reminded me of the existence of the &lt;a href="http://www.lexaloffle.com/pico-8.php"&gt;&lt;span class="caps"&gt;PICO&lt;/span&gt;-8&lt;/a&gt;, a “fantasy console” with 8-bit-ish limitations and built-in editing tools.  Both of us have a bad habit of letting ambitions spiral way out of control, so “built-in limitations” sounded pretty good to me.  I bought the console ($15, or free with the $20 &lt;a href="http://www.lexaloffle.com/voxatron.php"&gt;Voxatron alpha&lt;/a&gt;) on a whim and started tinkering with it.&lt;/p&gt;
&lt;p&gt;The result: &lt;a href="https://c.eev.ee/under-construction/"&gt;Under Construction&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://c.eev.ee/under-construction/"&gt;&lt;img alt="pico-8 cartridge" src="https://c.eev.ee/under-construction/under-construction.p8.png"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can play in your very own web browser, assuming you have a keyboard.  Also, that image is the &lt;em&gt;actual cartridge&lt;/em&gt;, which you can save and play directly if you happen to have &lt;span class="caps"&gt;PICO&lt;/span&gt;-8.  It’s also &lt;a href="http://www.lexaloffle.com/bbs/?tid=3448"&gt;in the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 &lt;span class="caps"&gt;BBS&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(A couple people using Chrome on &lt;span class="caps"&gt;OS&lt;/span&gt; X have reported a very early crash, which seems to be a bug outside of my control.  Safari works, and merely restarting Chrome has fixed it for at least one person.)&lt;/p&gt;
&lt;p&gt;I don’t have too much to say about the game itself; hopefully, it speaks for itself.  If not, &lt;a href="http://floraverse.com/comic/games/465-under-construction/"&gt;there’s a little more on its Floraverse post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;do&lt;/em&gt; have some things to say about making it.  Also I am really, really tired, so apologies if this is even more meandering than usual.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;a href="http://glitchedpuppet.com/"&gt;Mel&lt;/a&gt; and I made a&amp;nbsp;game!&lt;/p&gt;
&lt;p&gt;We&amp;#8217;d wanted to a small game together for a while.  &lt;a href="https://eev.ee/blog/2016/04/30/embedding-lua-vs-python/"&gt;Last month&amp;#8217;s post about embedding Lua&lt;/a&gt; reminded me of the existence of the &lt;a href="http://www.lexaloffle.com/pico-8.php"&gt;&lt;span class="caps"&gt;PICO&lt;/span&gt;-8&lt;/a&gt;, a &amp;#8220;fantasy console&amp;#8221; with 8-bit-ish limitations and built-in editing tools.  Both of us have a bad habit of letting ambitions spiral way out of control, so &amp;#8220;built-in limitations&amp;#8221; sounded pretty good to me.  I bought the console ($15, or free with the $20 &lt;a href="http://www.lexaloffle.com/voxatron.php"&gt;Voxatron alpha&lt;/a&gt;) on a whim and started tinkering with&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;The result: &lt;a href="https://c.eev.ee/under-construction/"&gt;Under Construction&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://c.eev.ee/under-construction/"&gt;&lt;img alt="pico-8 cartridge" src="https://c.eev.ee/under-construction/under-construction.p8.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can play in your very own web browser, assuming you have a keyboard.  Also, that image is the &lt;em&gt;actual cartridge&lt;/em&gt;, which you can save and play directly if you happen to have &lt;span class="caps"&gt;PICO&lt;/span&gt;-8.  It&amp;#8217;s also &lt;a href="http://www.lexaloffle.com/bbs/?tid=3448"&gt;in the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 &lt;span class="caps"&gt;BBS&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(A couple people using Chrome on &lt;span class="caps"&gt;OS&lt;/span&gt; X have reported a very early crash, which seems to be a bug outside of my control.  Safari works, and merely restarting Chrome has fixed it for at least one&amp;nbsp;person.)&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t have too much to say about the game itself; hopefully, it speaks for itself.  If not, &lt;a href="http://floraverse.com/comic/games/465-under-construction/"&gt;there&amp;#8217;s a little more on its Floraverse post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;do&lt;/em&gt; have some things to say about making it.  Also I am really, really tired, so apologies if this is even more meandering than&amp;nbsp;usual.&lt;/p&gt;


&lt;h2 id="the-pico-8"&gt;&lt;a class="toclink" href="#the-pico-8"&gt;The&amp;nbsp;PICO-8&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can get a quick idea of what the console is all about from &lt;a href="http://www.lexaloffle.com/pico-8.php"&gt;the homepage&lt;/a&gt;.  I say &amp;#8220;console&amp;#8221;, but of course, there&amp;#8217;s no physical hardware — the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 is a game engine with some severe artificial restrictions.  It&amp;#8217;s kind of like an emulator for a console that never&amp;nbsp;existed.&lt;/p&gt;
&lt;p&gt;Feel free to pore over &lt;a href="http://www.lexaloffle.com/pico-8.php?page=manual"&gt;the manual&lt;/a&gt;, but the most obvious limitations&amp;nbsp;are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Screen resolution of 128×128, usually displayed scaled up, since that&amp;#8217;s microscopic on modern&amp;nbsp;monitors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;16-color fixed palette.  The colors you see in the screenshots are the only colors you can use,&amp;nbsp;period.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A spritesheet with enough room for 256 8×8 sprites.  (You can make and use larger sprites, or use the space for something else entirely if you want, but the built-in tools assume you generally want that sprite&amp;nbsp;size.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A 128×64 map, as measured in tiles.  The screen is 16×16 tiles, so that&amp;#8217;s enough space for 32&amp;nbsp;screenfuls.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alas!  Half of the sprite space and half of the map space are shared, so you can&amp;#8217;t actually have both 256 sprites and 32 map screens.  You can have 256 sprites and 16 map screens, or 128 sprites and 32 map screens (which is what we did), or split the shared space some other&amp;nbsp;way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;64 chiptuney sound effects, complete with a tiny tracker for creating&amp;nbsp;them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;64 music tracks, built out of loops of up to four sound effects.  There are only four sound channels total, so having four-channel background music means you can&amp;#8217;t play any sound effects on top of&amp;nbsp;it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The programming language is a modified Lua, which comes with its own restrictions, but I&amp;#8217;ll get to those&amp;nbsp;later.&lt;/p&gt;
&lt;p&gt;The restrictions are &amp;#8220;carefully chosen to be fun to work with, [and] encourage small but expressive designs&amp;#8221;.  For the most part, they&amp;nbsp;succeeded.&lt;/p&gt;
&lt;h2 id="our-process"&gt;&lt;a class="toclink" href="#our-process"&gt;Our&amp;nbsp;process&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I bought &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 at the beginning of the month.  I spent a few hours a day over the next several days messing around, gradually producing a tiny non-game I called &lt;a href="https://twitter.com/eevee/status/726675505110380544"&gt;&amp;#8220;eeveequest&amp;#8221;&lt;/a&gt; and tweeting out successive iterations.  I added the basics as they came to mind, without any real goal: movement, collision, jumping, music, sound effects, scrolling, camera&amp;nbsp;movement.&lt;/p&gt;
&lt;p&gt;The &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 did let me create something with all the usual parts of a game in a matter of hours, and that&amp;#8217;s pretty cool.  I&amp;#8217;ve never made music before, save for an hour or two trying to get audio working with &lt;span class="caps"&gt;LMMS&lt;/span&gt;, but I managed even a simple tune and some chimes&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;Meanwhile, Mel was independently trying it out, drawing sprites and populating a map.  I copied my movement code over to their cartridge so we could walk around in this little&amp;nbsp;world.&lt;/p&gt;
&lt;p&gt;Then, uh, they gave me an avalanche of text describing what they wanted, and I vanished from the mortal realm for ten days while I set about making it&amp;nbsp;happen.&lt;/p&gt;
&lt;p&gt;Look, I didn&amp;#8217;t say this was a &lt;em&gt;good&lt;/em&gt; process.  Our next endeavor should be a little more balanced, since we won&amp;#8217;t be eight hours apart, and a good chunk of engine code is already&amp;nbsp;written.&lt;/p&gt;
&lt;p&gt;One particularly nice thing: &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 cartridges are very simple text files with the code at the top.  I eventually migrated to writing code in vim rather than the (extremely simple) built-in code editor, and if Mel had been working on the map at the same time, I could just copy-paste everything except the code into my own cart.  It would play decently well with source control, but for a two-person project where I&amp;#8217;m the only one editing the code, I couldn&amp;#8217;t really justify inflicting git on a non-programmer.  We did have one minor incident where a few map changes were lost, but for the most part, it worked surprisingly well for collaborating between a programmer and an&amp;nbsp;artist.&lt;/p&gt;
&lt;p&gt;There was a lot more back-and-forth towards the end, once the bulk of the code was written (and Mel was no longer busy selling at three conventions), when the remaining work was subtler design issues.  That was probably the most fun I&amp;nbsp;had.&lt;/p&gt;
&lt;h2 id="programming-the-pico-8"&gt;&lt;a class="toclink" href="#programming-the-pico-8"&gt;Programming the&amp;nbsp;PICO-8&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I picked on Lua a bit in that post last month.  Having now worked with it for two solid weeks, I regret what I said.  Because now I really want to say it all again, more forcefully.  Silently ignoring errors (including division by zero!) and having no easy way to print values for debugging are my top two least favorite programming language&amp;nbsp;&amp;#8220;features&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Plenty of Lua is just plain weird, but forgiveable.  Those two things make it pretty aggravating.  It&amp;#8217;s not even for any good reason — Lua clearly &lt;em&gt;has&lt;/em&gt; an error-reporting mechanism, so it&amp;#8217;s entirely capable of having division by zero be an error.  And half the point of a dynamic runtime is that you can easily examine values at runtime, yet Lua makes doing that as difficult as possible.&amp;nbsp;Argh.&lt;/p&gt;
&lt;h3 id="pico-8s-lua"&gt;&lt;a class="toclink" href="#pico-8s-lua"&gt;PICO-8's&amp;nbsp;Lua&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 uses a slightly modified Lua 5.2.  The documentation isn&amp;#8217;t precise about what parts of Lua are still available, so I had some minor misadventures, like thinking varargs weren&amp;#8217;t supported because the &lt;code&gt;arg&lt;/code&gt; global was missing.  (Turns out varargs work fine, but Lua 5.2 changed the syntax and got rid of the clumsy&amp;nbsp;global.)&lt;/p&gt;
&lt;p&gt;If it weren&amp;#8217;t yet obvious, I&amp;#8217;m no Lua expert.  The most obvious differences to &lt;em&gt;me&lt;/em&gt;&amp;nbsp;are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Numbers are signed 16.16 fixed-point, rather than Lua&amp;#8217;s double-precision floats.  (This has the curious side effect that dividing by zero produces 32768.)  I have a soft spot for fixed-point!  It&amp;#8217;s nice sometimes to have a Planck length that doesn&amp;#8217;t depend on where you are in the game&amp;nbsp;world.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most of the standard library is missing.  There&amp;#8217;s no &lt;code&gt;collectgarbage&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;, &lt;code&gt;ipairs&lt;/code&gt;, &lt;code&gt;pcall&lt;/code&gt;, &lt;code&gt;tostring&lt;/code&gt;, &lt;code&gt;unpack&lt;/code&gt;, or other more obscure stuff.  The &lt;code&gt;bit32&lt;/code&gt;, &lt;code&gt;debug&lt;/code&gt;, &lt;code&gt;math&lt;/code&gt;, &lt;code&gt;os&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, and &lt;code&gt;table&lt;/code&gt; libraries are gone.  The &lt;code&gt;_G&lt;/code&gt; superglobal is&amp;nbsp;gone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Several built-ins have been changed or replaced with alternatives: &lt;code&gt;all&lt;/code&gt; iterates over a sequence-like table; &lt;code&gt;pairs&lt;/code&gt; iterates over all keys and values in a table; &lt;code&gt;print&lt;/code&gt; now prints to a particular screen coordinate.  A handful of substitute math and string functions are built in.  There are functions for bit operations, which I guess were in the &lt;code&gt;bit32&lt;/code&gt; library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are some mutating assignment operators: &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;-=&lt;/code&gt;, &lt;code&gt;*=&lt;/code&gt;, &lt;code&gt;/=&lt;/code&gt;, &lt;code&gt;%=&lt;/code&gt;.  Lua doesn&amp;#8217;t have&amp;nbsp;these.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 &lt;em&gt;does&lt;/em&gt; still have metatables and coroutines.  Metatables were a blessing.  Coroutines are nice, but I never came up with a good excuse to use&amp;nbsp;them.&lt;/p&gt;
&lt;h3 id="writing-the-actual-game-stuff"&gt;&lt;a class="toclink" href="#writing-the-actual-game-stuff"&gt;Writing the actual game&amp;nbsp;stuff&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Each of the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8&amp;#8217;s sprites has a byte&amp;#8217;s worth of flags — eight color-coded toggles that can be turned on or off.  They don&amp;#8217;t mean anything to the console, and you&amp;#8217;re free to use them however you want in your&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;I decided early on, even for EeveeQuest™, to use one of the flags to indicate a block was solid.  It&amp;#8217;s the most obvious approach, and it turned out to have the happy side effect that Mel could change the physics of the game world without touching the code at all.  I ended up using five more flags to indicate which acts a tile should appear&amp;nbsp;in.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;love&lt;/em&gt; rigging game engines so that people can modify as much stuff as possible without touching code.  I already prefer writing code in a more declarative style, and this is even better: the declarations are out of code entirely and in a graphical tool&amp;nbsp;instead.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Game code is &lt;a href="/blog/2016/04/21/elegance/#inform-7"&gt;generally awful&lt;/a&gt;, so I did my best to keep things tidy.  First, some brief&amp;nbsp;background.&lt;/p&gt;
&lt;p&gt;A game has two major concerns: it has to simulate the world, and it has to draw that world to the screen.  The easiest and most obvious approach, then, is to alternate those steps: do a single update pass (where everyone takes one step, say), then draw, then do another update, and so on.  One round of updating and drawing is a frame, and the length of time it takes is a tic.  If you want your game to run at 60 fps, then a tic is 1/60 seconds, and you have to be sure you can both update once and draw once in that amount of&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;You get into trouble when drawing to the screen starts to take long.  Say it takes two tics.  Now not only is the display laggy, but the &lt;em&gt;actual game world&lt;/em&gt; is running at half speed, because you only run an update pass every two tics instead of every&amp;nbsp;one.&lt;/p&gt;
&lt;p&gt;The &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 is not the kind of platform you might expect to have this problem, but nonetheless it offers a very simple solution.  It asks your code to update, then it asks your code to draw, &lt;em&gt;separately&lt;/em&gt;.  If the console detects that the game is running too slowly to hit its usual 30 fps, it&amp;#8217;ll automatically slow down its framerate to 15fps, but it&amp;#8217;ll ask you to update &lt;em&gt;twice&lt;/em&gt; between draws.  (Put differently, it skips every other&amp;nbsp;draw.)&lt;/p&gt;
&lt;p&gt;This turned out to be handy in act 4, where the fog effect is sometimes a little too intensive.  The framerate drops, but the world still moves along at the right speed, so it just looks like the animation isn&amp;#8217;t quite as&amp;nbsp;smooth.&lt;/p&gt;
&lt;p&gt;I copied this approach all the way down.  I have a simple object called a &amp;#8220;scene&amp;#8221;, which is what you might also call a &amp;#8220;screen&amp;#8221;: the title screen, playable area, text between acts, and ending credits are all different scenes.  The playable scene has a handful of layers, each of which updates and then draws like a&amp;nbsp;stack.&lt;/p&gt;
&lt;p&gt;The map is kind of interesting.  The &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 has a function for drawing an entire block of the map to the screen, which works pretty well for static stuff like background tiles and solid walls.  There&amp;#8217;s no built-in support for animation, though, and certainly nothing for handling player movement or tiles that only sometimes&amp;nbsp;exist.&lt;/p&gt;
&lt;p&gt;So I made an &amp;#8220;actor&amp;#8221; type, which can be anything that wants to participate in the usual update/draw cycle.  There are three major kinds of&amp;nbsp;actor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Decor&lt;/em&gt; shouldn&amp;#8217;t move and doesn&amp;#8217;t draw itself; instead, it edits its own position on the map.  This is used for all the animated sprites, as well as a few static objects like&amp;nbsp;radios.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Mobs&lt;/em&gt; aren&amp;#8217;t on the map at all and can move around freely, possibly colliding with parts of the map and each other.  Only the player and the rocks are mobs; each additional one makes collision detection significantly more expensive.  (I never got around to adding a&amp;nbsp;blockmap.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Transient&lt;/em&gt; actors don&amp;#8217;t actually update or draw, and in fact they don&amp;#8217;t permanently exist at all.  They&amp;#8217;re only created temporarily, when the player or another mob bumps into a map tile.  When you walk into a wall, for example, the game creates a temporary wall actor at that position that checks its sprite&amp;#8217;s flags to see if it blocks you.  This is how the spikes work, too; they don&amp;#8217;t need to update every tic, because they don&amp;#8217;t actually do anything on their own, but they can still have custom behavior when you bump into them.  They also have a custom collision&amp;nbsp;box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can declare that a specific sprite on the map will always be turned into a particular kind of actor, and give it its own behavior.  Virtually everything works this way, even the player, which means you can move the mole sprite anywhere on the map and it&amp;#8217;ll automatically become the player&amp;#8217;s start&amp;nbsp;point.&lt;/p&gt;
&lt;p&gt;You can also define an animation, and it&amp;#8217;ll automatically be turned into a type of decor that doesn&amp;#8217;t do anything except edit the map every few frames to animate&amp;nbsp;itself.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;By far, the worst thing to deal with was collision.  I must&amp;#8217;ve rewritten it four or five&amp;nbsp;times.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve written collision code before, but apparently I&amp;#8217;d never done it from complete scratch for a world with free movement &lt;em&gt;and&lt;/em&gt; polished it to a mirror&amp;nbsp;sheen.&lt;/p&gt;
&lt;p&gt;Maybe I&amp;#8217;m missing something here, but the usual simple approach to collision is terrible.  It tends to go like&amp;nbsp;this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Move the player some amount in the direction they&amp;#8217;re&amp;nbsp;moving.&lt;/li&gt;
&lt;li&gt;See if they&amp;#8217;re now overlapping&amp;nbsp;anything.&lt;/li&gt;
&lt;li&gt;If they are, move them back to where they&amp;nbsp;started.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;#8217;s some hot garbage.  What if you&amp;#8217;re falling, and you&amp;#8217;re a pixel above the ground, but you&amp;#8217;re moving at two pixels per tic?  The game will continually try to move you two pixels, see you&amp;#8217;re stuck in the ground, and then put you back where you started.  You&amp;#8217;ll hover a pixel above the ground&amp;nbsp;forever.&lt;/p&gt;
&lt;p&gt;I tried doing some research, by which I mean I googled for three minutes and got sick of finding &amp;#8220;tutorials&amp;#8221; that didn&amp;#8217;t go any further than this useless algorithm, so I just beat on it until I got what I wanted.  My&amp;nbsp;approach:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get the player&amp;#8217;s bounding box.  Extend that box in the direction they&amp;#8217;re moving, so it covers both their old and new&amp;nbsp;position.&lt;/li&gt;
&lt;li&gt;Get a list of all the actors that overlap that box, including transient actors for every tile.  (This is the main place they&amp;#8217;re used, so I can handle them the same way as any other&amp;nbsp;actor.)&lt;/li&gt;
&lt;li&gt;Sort all those actors in the order the player will hit them, starting with the&amp;nbsp;closest.&lt;/li&gt;
&lt;li&gt;Look at the first actor.  Move the player towards it until they touch it, then stop.  If the actor has any collision behavior, activate it&amp;nbsp;now.&lt;/li&gt;
&lt;li&gt;If the actor is solid, you&amp;#8217;re done, at least in this direction; drop the actor&amp;#8217;s velocity to zero.  Otherwise, repeat with the next&amp;nbsp;actor.&lt;/li&gt;
&lt;li&gt;If there&amp;#8217;s any movement left at the end, tack that on too, since nothing else can be in the&amp;nbsp;way.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I had some fun bugs along the way, like the one where the collision detection was &lt;em&gt;almost&lt;/em&gt; perfect, unless you hit a solid block exactly on its corner, in which case you would pass right through it.  Or the multiple times you couldn&amp;#8217;t walk along the ground because you were colliding with the corner of the next tile of&amp;nbsp;ground.&lt;/p&gt;
&lt;p&gt;This seems to be pretty rock solid now, though it&amp;#8217;s a bit slow when there are more than half a dozen or so mobs wandering around.  It works well enough for this&amp;nbsp;game.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The runner-up for awkward things to deal with: &lt;em&gt;time&lt;/em&gt;.  Even a simple animation is mildly annoying.  It&amp;#8217;s not that the math is difficult; it&amp;#8217;s more that you can&amp;#8217;t look at the math and immediately understand what it&amp;#8217;s&amp;nbsp;doing.&lt;/p&gt;
&lt;p&gt;I wished numerous times that I had a more straightforward way to say &amp;#8220;fade this in, wait 10 tics, then fade it back out&amp;#8221;, but I never had the time to sit down and come up with something nice.  I considered using coroutines for this, since they&amp;#8217;re naturally sleep-able, but I don&amp;#8217;t think they&amp;#8217;d work so well for anything beyond the most trivial operations.  cocos2d has a concept of &amp;#8220;actions&amp;#8221;, where you can animate a change over time and even schedule several changes to happen in sequence; maybe I&amp;#8217;ll give something like that a try next&amp;nbsp;time.&lt;/p&gt;
&lt;h2 id="the-pico-8s-limits"&gt;&lt;a class="toclink" href="#the-pico-8s-limits"&gt;The PICO-8's&amp;nbsp;limits&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Working within limitations has a unique way of inspiring creative solutions.  It can even help you get started in a medium you&amp;#8217;ve never tried before.  I know.  It&amp;#8217;s the whole point of the console.  I only got around to making some music because I was handed a very limited&amp;nbsp;tracker.&lt;/p&gt;
&lt;p&gt;Sixteen colors?  Well, that&amp;#8217;s okay; now I don&amp;#8217;t have to worry about picking my own colors, which is something I&amp;#8217;m not terribly good&amp;nbsp;at.&lt;/p&gt;
&lt;p&gt;Small screen and sprite size?  That puts a cap on how good the art can possibly be expected to look anyway, so I can make simple sprites fairly easily and have a decent-looking&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;Limited map space?  Well&amp;#8230;  now we&amp;#8217;re getting into fuzzier territory.  A limit on map space is less of a creative constraint and more of a hard cap on how much &lt;em&gt;game&lt;/em&gt; you can fit in your game.  At least you can make up for it in a few ways with some creative&amp;nbsp;programming.&lt;/p&gt;
&lt;p&gt;Hmm.  About&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;There are &lt;em&gt;three&lt;/em&gt; limits on the amount of code you can&amp;nbsp;have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No more than 8192 &lt;em&gt;tokens&lt;/em&gt;.  A token is a single identifier, string, number, or operator.  A pair of brackets counts as one token.  Commas, periods, colons, and the &lt;code&gt;local&lt;/code&gt; and &lt;code&gt;end&lt;/code&gt; keywords are&amp;nbsp;free.&lt;/li&gt;
&lt;li&gt;No more than 65536 &lt;em&gt;bytes&lt;/em&gt;.  That&amp;#8217;s a pretty high limit, and I think it really only exists to prevent you from cramming ludicrous amounts of data into a cartridge via&amp;nbsp;strings.&lt;/li&gt;
&lt;li&gt;No more than 15360 bytes, &lt;em&gt;after compression&lt;/em&gt;.  More on that in a&amp;nbsp;moment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I thought 8192 sounded like plenty.  Then I went and wrote a game.  Our final tally, for my 2779 lines of&amp;nbsp;Lua:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8183/8192&amp;nbsp;tokens&lt;/li&gt;
&lt;li&gt;56668/65536&amp;nbsp;bytes&lt;/li&gt;
&lt;li&gt;22574/15360 compressed&amp;nbsp;bytes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;#8217;s not a typo; I was well over the compressed limit.  I only even found out about the compressed limit a few days ago — the documentation never actually mentions it, and the built-in editor only tracks code size and token count!  It came as a horrible surprise.  For the released version of the game, I had to delete &lt;em&gt;every single comment&lt;/em&gt;, remove every trace of debugging code, and rename several local variables.  I was resorting to deleting extra blank lines before I finally got it to&amp;nbsp;fit.&lt;/p&gt;
&lt;p&gt;Trying to squeeze code into a compressed limit is &lt;em&gt;maddening&lt;/em&gt;.  Most of the obvious ways to significantly shorten code involve removing duplication, but duplication is exactly what compression algorithms are good at dealing with!  Several times I tried an approach that made the code shorter in both absolute size and token count, only to find that the compressed size had grown slightly&amp;nbsp;larger.&lt;/p&gt;
&lt;p&gt;As for tokens, wow.  I&amp;#8217;ve never even had to think in tokens before.  Here are some token costs from the finished&amp;nbsp;game.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;65 — updating the camera to follow the&amp;nbsp;player&lt;/li&gt;
&lt;li&gt;95 — sort&amp;nbsp;function&lt;/li&gt;
&lt;li&gt;148 — simple vector&amp;nbsp;type&lt;/li&gt;
&lt;li&gt;198 — function to print text on the screen aligned to a&amp;nbsp;point&lt;/li&gt;
&lt;li&gt;201 — debugging function that prints values to&amp;nbsp;stdout&lt;/li&gt;
&lt;li&gt;256 — perlin noise&amp;nbsp;implementation&lt;/li&gt;
&lt;li&gt;261 — screen&amp;nbsp;fade&lt;/li&gt;
&lt;li&gt;280 — fog effect from act&amp;nbsp;4&lt;/li&gt;
&lt;li&gt;370 — title&amp;nbsp;screen&lt;/li&gt;
&lt;li&gt;690 — credits in their&amp;nbsp;entirety&lt;/li&gt;
&lt;li&gt;703 — physics and collision&amp;nbsp;detection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It adds up pretty quickly.  We essentially sliced off two entire endings, because I just didn&amp;#8217;t have any space&amp;nbsp;left.&lt;/p&gt;
&lt;p&gt;Incredibly, the token limitation used to be &lt;em&gt;worse&lt;/em&gt;.  I went searching for people talking about this, and I mostly found posts from several releases ago, when the byte limit was 32K and there weren&amp;#8217;t any freebies in the token count — parentheses counted as two, dots counted as&amp;nbsp;one.&lt;/p&gt;
&lt;p&gt;This kind of sucks, for several&amp;nbsp;reasons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The most obvious way to compensate for the graphical limitations is with code: procedural generation, effects, and the like.  Both of those eat up tokens &lt;em&gt;fast&lt;/em&gt;.  I spent a total of 536 tokens, 6.5% of my total space, &lt;em&gt;just&lt;/em&gt; on adding a fog&amp;nbsp;overlay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;#8217;m effectively punished for organizing code.  Some 13% of my token count goes towards dotted names, i.e., &lt;code&gt;foo.bar&lt;/code&gt; instead of &lt;code&gt;foo_bar&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;#8217;s just not the kind of limitation that really inspires creativity.  If you limit the number of sprites I have, okay, I can at least visually see I only have so much space and adjust accordingly.  I don&amp;#8217;t have any sense for how many tokens I&amp;#8217;d need to write some code.  If I hit the limit and the game isn&amp;#8217;t done, that&amp;#8217;s just a wall.  I don&amp;#8217;t have a whole lot of creative options here: I can waste time playing code golf (which here is more of an annoying puzzle than a source of inspiration), or I can delete a chunk of the&amp;nbsp;game.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I looked at the &lt;a href="http://www.lexaloffle.com/bbs/?cat=7&amp;amp;sub=2&amp;amp;orderby=rating"&gt;most popular cartridges&lt;/a&gt;, and a couple depressing themes emerged.  Several games are merely demos of interesting ideas that &lt;em&gt;could&lt;/em&gt; be expanded into a game, except that the ideas alone already take half of the available tokens.  Quite a few have resorted to a strong arcade vibe, with little distinction between &amp;#8220;levels&amp;#8221; except that there are more or different enemies.  There&amp;#8217;s a little survival crafting game which seems like it could be interesting, but it only has four objects you can build and it&amp;#8217;s already out of tokens.  Very few games have any sort of instructions (which would eat precious tokens!), and several of them have left me frustrated from the outset, until I read through the forum thread in search of someone explaining what I&amp;#8217;m supposed to be&amp;nbsp;doing.&lt;/p&gt;
&lt;p&gt;And keep in mind, you&amp;#8217;re starting pretty much from scratch.  The most convenience the &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 affords is copying a whole block of the map to the screen at once.  Everything else is your problem, and it all has to fit under the&amp;nbsp;cap.&lt;/p&gt;
&lt;p&gt;The &lt;span class="caps"&gt;PICO&lt;/span&gt;-8 is really appealing overall: it has little built-in tools for creating all the resources, it&amp;#8217;s pretty easy to do stuff with, its plaintext cartridge format makes collaboration simple, its &lt;em&gt;resource&lt;/em&gt; limits are inspiring, it can compile to a ready-to-go browser page with no effort at all, it can even spit out short gameplay GIFs with the press of a button.  And yet I&amp;#8217;m a little apprehensive about trying anything very ambitious, now that I know how little code I&amp;#8217;m allowed to have.  The relatively small map is a bit of a shame, but the code limit is really&amp;nbsp;killer.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll certainly be making a few more things with this.  At the same time, I can&amp;#8217;t help but feel that some of the potential has been squeezed out of&amp;nbsp;it.&lt;/p&gt;</content><category term="release"></category><category term="tech"></category><category term="gamedev"></category><category term="making things"></category></entry><entry><title>I made a Doom level</title><link href="https://eev.ee/release/2016/03/31/i-made-a-doom-level/" rel="alternate"></link><published>2016-03-31T02:23:00-07:00</published><updated>2016-03-31T02:23:00-07:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2016-03-31:/release/2016/03/31/i-made-a-doom-level/</id><summary type="html">&lt;p&gt;Yes, dear readers, I have a confession to make.  Despite spending 29,000 words explaining why and how &lt;a href="/blog/2015/12/19/you-should-make-a-doom-level-part-1/"&gt;you should make a Doom level&lt;/a&gt;, I’ve yet to actually publish one myself.&lt;/p&gt;
&lt;p&gt;I’ve been…  orbiting? the ZDoom community for over a decade, but only really contributed in the form of minor wiki edits and occasional advice.  I started a good few maps when I was a teenager, but I tended to get bogged down in making some complicated contraption work, and then get bored with the whole idea and lose interest.&lt;/p&gt;
&lt;p&gt;More recently I’ve actually made a few maps that got as far as &lt;em&gt;having an exit&lt;/em&gt; (!), but I never really finished them, and I haven’t published them anywhere.&lt;/p&gt;
&lt;p&gt;So when the &lt;a href="http://forum.zdoom.org/viewtopic.php?f=19&amp;amp;t=51072"&gt;Doom Upstart Mapping Project 2&lt;/a&gt; was announced, with the goal of just &lt;em&gt;getting something done&lt;/em&gt; with the short time limit of a week, I figured I should give it a shot.  And I did.  I spent &lt;strong&gt;six straight days&lt;/strong&gt; doing virtually nothing but working on this Doom map.&lt;/p&gt;
&lt;p&gt;Results: pretty good!  I’m pretty happy with it, and a few people have played it and enjoyed it.  I put a lot of thought into it — or tried, anyway — and have a lot to say about it, so this is my developer commentary.&lt;/p&gt;
&lt;p&gt;I’ve described the course through the map as I go, and I’ve tried to include some context for people whose knowledge of Doom is only “you shoot monsters”, so I hope it’s at least a little accessible.  It’s really long, though.  Again.  Sorry.  Not actually sorry.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Yes, dear readers, I have a confession to make.  Despite spending 29,000 words explaining why and how &lt;a href="/blog/2015/12/19/you-should-make-a-doom-level-part-1/"&gt;you should make a Doom level&lt;/a&gt;, I&amp;#8217;ve yet to actually publish one&amp;nbsp;myself.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been&amp;#8230;  orbiting? the ZDoom community for over a decade, but only really contributed in the form of minor wiki edits and occasional advice.  I started a good few maps when I was a teenager, but I tended to get bogged down in making some complicated contraption work, and then get bored with the whole idea and lose&amp;nbsp;interest.&lt;/p&gt;
&lt;p&gt;More recently I&amp;#8217;ve actually made a few maps that got as far as &lt;em&gt;having an exit&lt;/em&gt; (!), but I never really finished them, and I haven&amp;#8217;t published them&amp;nbsp;anywhere.&lt;/p&gt;
&lt;p&gt;So when the &lt;a href="http://forum.zdoom.org/viewtopic.php?f=19&amp;amp;t=51072"&gt;Doom Upstart Mapping Project 2&lt;/a&gt; was announced, with the goal of just &lt;em&gt;getting something done&lt;/em&gt; with the short time limit of a week, I figured I should give it a shot.  And I did.  I spent &lt;strong&gt;six straight days&lt;/strong&gt; doing virtually nothing but working on this Doom&amp;nbsp;map.&lt;/p&gt;
&lt;p&gt;Results: pretty good!  I&amp;#8217;m pretty happy with it, and a few people have played it and enjoyed it.  I put a lot of thought into it — or tried, anyway — and have a lot to say about it, so this is my developer&amp;nbsp;commentary.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve described the course through the map as I go, and I&amp;#8217;ve tried to include some context for people whose knowledge of Doom is only &amp;#8220;you shoot monsters&amp;#8221;, so I hope it&amp;#8217;s at least a little accessible.  It&amp;#8217;s really long, though.  Again.  Sorry.  Not actually&amp;nbsp;sorry.&lt;/p&gt;


&lt;h2 id="play-it-first"&gt;&lt;a class="toclink" href="#play-it-first"&gt;Play it&amp;nbsp;first&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you have &lt;em&gt;any&lt;/em&gt; intention of ever playing my map, you should do that before reading further.  I&amp;#8217;m going to spoil the progression &lt;strong&gt;as well as most of the secrets&lt;/strong&gt;, and some of this may not make any sense if you haven&amp;#8217;t seen it.  It does support difficulty levels, and in the style of Doom &lt;span class="caps"&gt;II&lt;/span&gt;, the map is practically barren on easy.  Or if you don&amp;#8217;t care about combat and just want to tour the map, you can play with no monsters, or do &lt;code&gt;kill monsters&lt;/code&gt; in the console, or use &lt;code&gt;freeze&lt;/code&gt; to freeze them all, or &lt;code&gt;notarget&lt;/code&gt; to make them ignore you (unless you shoot them).  Or&amp;nbsp;whatever.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re not sold, here are some rave&amp;nbsp;reviews:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;not today,&amp;nbsp;satan&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- --&gt;
&lt;blockquote&gt;
&lt;p&gt;uhh&amp;#8230;it&amp;nbsp;works?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- --&gt;
&lt;blockquote&gt;
&lt;p&gt;how the fuck did u make this map in a week [&amp;#8230;] &lt;span class="caps"&gt;DID&lt;/span&gt; U &lt;span class="caps"&gt;JUST&lt;/span&gt; &lt;span class="caps"&gt;LIKE&lt;/span&gt; &lt;span class="caps"&gt;NOT&lt;/span&gt; &lt;span class="caps"&gt;SLEEP&lt;/span&gt; &lt;span class="caps"&gt;ALL&lt;/span&gt; &lt;span class="caps"&gt;WEEK&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anyway, you will need ZDoom and Doom &lt;span class="caps"&gt;II&lt;/span&gt;.  I covered getting those in the &lt;a href="/blog/2015/12/19/you-should-make-a-doom-level-part-1/#you-will-need"&gt;first Doom mapping post&lt;/a&gt;, and it still applies.  Recent ZDooms will even automatically find Doom &lt;span class="caps"&gt;II&lt;/span&gt;, on any platform, if it was installed by Steam or &lt;span class="caps"&gt;GOG&lt;/span&gt;.&amp;nbsp;Slick.&lt;/p&gt;
&lt;p&gt;Per the project requirements, anything based on ZDoom 2.5+ should work, including Zandronum 2.1.2, if that&amp;#8217;s of interest to you.  If you don&amp;#8217;t know what that is, don&amp;#8217;t worry, just grab the latest&amp;nbsp;ZDoom.&lt;/p&gt;
&lt;p&gt;Also you will need &lt;a href="https://eev.ee/media/2016-03-31-throughfare/throughfare-v4.pk3"&gt;my map&lt;/a&gt;, of course.  You can just drag it onto ZDoom to play it.  Feel free to poke at it in &lt;span class="caps"&gt;SLADE&lt;/span&gt;,&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;You can also play the &lt;a href="http://forum.zdoom.org/viewtopic.php?f=19&amp;amp;t=51072"&gt;full mapping project&lt;/a&gt;, which was finally released on April 22, 2016.  My map is &lt;span class="caps"&gt;MAP32&lt;/span&gt;, Throughfare, which you are welcome to try finding in the overworld hub map.  (It&amp;#8217;s in an alcove all by&amp;nbsp;itself.)&lt;/p&gt;
&lt;h2 id="the-city"&gt;&lt;a class="toclink" href="#the-city"&gt;The&amp;nbsp;city&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m structuring this as though it were real developer commentary: I ran through the map in normal progression and took screenshots of interesting things as I went.  Most of these were taken with &lt;code&gt;notarget&lt;/code&gt; (which makes monsters ignore you) or &lt;code&gt;freeze&lt;/code&gt; (which pauses all object &lt;span class="caps"&gt;AI&lt;/span&gt;).  I tried playing normally, but I kept getting wrapped up in shooting things and forgetting to actually take screenshots.&amp;nbsp;Oops.&lt;/p&gt;
&lt;p&gt;I also know that I said rather a lot of this before, in &lt;a href="/blog/2015/12/30/you-should-make-a-doom-level-part-2/"&gt;the design part of the Doom series&lt;/a&gt;, but oh well I&amp;#8217;m saying it&amp;nbsp;again.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare01-opening.jpg" class="photo" title="Opening shot"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare01-opening_m.jpg" alt="Opening shot" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One thing John Romero said in his &lt;a href="https://www.youtube.com/watch?v=YUU7_BthBWM"&gt;&lt;span class="caps"&gt;IGN&lt;/span&gt; interview/playthrough&lt;/a&gt; really stuck out to me: he always tries to design the opening shot so that the player has something interesting to look&amp;nbsp;at.&lt;/p&gt;
&lt;p&gt;I realized, over the course of building this map, that that&amp;#8217;s not enough.  The &amp;#8220;opening shot&amp;#8221; of every part of the map should give the player something interesting to look at.  I&amp;#8217;ve compared level design to composition in visual arts &lt;a href="/blog/2015/12/30/you-should-make-a-doom-level-part-2/#its-art-dummy"&gt;before&lt;/a&gt;, and that&amp;#8217;s a large part of (my limited understanding of) composition: arranging your work to guide the viewer&amp;#8217;s eye through the important&amp;nbsp;parts.&lt;/p&gt;
&lt;p&gt;You could argue that I failed spectacularly with this opening shot, and you might be right.  I took inspiration from Sandy Petersen here, rather than Romero.  Sandy designed more than half of Doom &lt;span class="caps"&gt;II&lt;/span&gt;, and his maps are generally chaotic and sloppy and gimmicky.  They&amp;#8217;re also my&amp;nbsp;favorites.&lt;/p&gt;
&lt;p&gt;This, then, is something of a tribute to the Doom &lt;span class="caps"&gt;II&lt;/span&gt; map that&amp;#8217;s most memorable to me: &lt;span class="caps"&gt;MAP13&lt;/span&gt;, Downtown.  It&amp;#8217;s still nowhere near as good an opening shot as Downtown had; instead it serves as a reminder of that&amp;nbsp;map.&lt;/p&gt;
&lt;p&gt;The very first thing I did was look for background music, in the hopes that it would conjure some inspiration.  Alas, that didn&amp;#8217;t work.  I did eventually find music I liked, though: &lt;a href="http://modarchive.org/index.php?request=view_by_moduleid&amp;amp;query=66188"&gt;&amp;#8220;Back in 1982&amp;#8221; by warlord&lt;/a&gt;, if you want to give it an independent&amp;nbsp;listen.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare02-empty-city.jpg" class="photo" title="An empty city"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare02-empty-city_m.jpg" alt="An empty city" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not really a city map, though.  I get the impression that a lot of the Doom community doesn&amp;#8217;t much like city (or &amp;#8220;sandbox&amp;#8221;) maps, and whether that&amp;#8217;s correct or not, this is my response to&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;Doom is fundamentally a creepy game.  It&amp;#8217;s still creepy to me now.  It&amp;#8217;s not merely that there are monsters; it&amp;#8217;s that those monsters might be around the corner at any time, waiting for you.  Doom&amp;#8217;s atmosphere is &lt;em&gt;unnerving&lt;/em&gt; more than anything else.  That&amp;#8217;s the point of all the key traps and monster closets, I think; not to surprise the player by popping monsters out, but to train the player to never think anywhere is&amp;nbsp;safe.&lt;/p&gt;
&lt;p&gt;I distinctly remember having that feeling as a kid trying to play Doom &lt;span class="caps"&gt;II&lt;/span&gt;.  The further you go into these &lt;em&gt;dozens&lt;/em&gt; of levels, the fewer safe places there are.  You can clear out a level, sure, but then there&amp;#8217;s nothing to do except go press the exit switch.  There will be no reprieve, only another wave of &lt;em&gt;things&lt;/em&gt; coming to &lt;em&gt;get you&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d love to pass that unnerving feeling on, so here I tried to do it in a different way.  The city is completely empty.  None of the buildings even have doors.  If you have the monster count on, you can see that there are plenty, so where are they?  When will they come after&amp;nbsp;you?&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare03-outside-alley.jpg" class="photo" title="Outside an alley"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare03-outside-alley_m.jpg" alt="Outside an alley" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Something definitely went down&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;I had to improve this alley twice.  The first time, it was using the same texture as the outside of the building, but the way the engine handled the light made it almost invisible.  After I fixed that, someone &lt;em&gt;still&lt;/em&gt; missed it, so I threw the burning barrel in there just in case the trail of corpses wasn&amp;#8217;t obvious enough.  I like it there thematically,&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare04-inside-alley.jpg" class="photo" title="Inside the same alley"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare04-inside-alley_m.jpg" alt="Inside the same alley" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I love dead players with items scattered around them.  It&amp;#8217;s common to give the player a shotgun very early on, since the pistol is worthless, so here it&amp;nbsp;is.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare05-demon-arriving.jpg" class="photo" title="Surprise demon!"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare05-demon-arriving_m.jpg" alt="Surprise demon!" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you turn to leave, surprise!  A strange swirling portal opens up, and a single demon emerges just before it closes.  You have plenty of space to take it out before it reaches the end of the alley, and then it&amp;#8217;s over, and you&amp;#8217;re still left alone in an empty&amp;nbsp;city.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare06-another-portal.jpg" class="photo" title="Another portal opens"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare06-another-portal_m.jpg" alt="Another portal opens" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oops, no you&amp;#8217;re not.  You can even hear all these guys pop out of their portal — I made the portal sound carry for quite a&amp;nbsp;ways.&lt;/p&gt;
&lt;p&gt;Yes, the portal makes a sound as you walk through it.  It&amp;#8217;s actually part of the Arch-Vile&amp;#8217;s attack sound, though on its own it doesn&amp;#8217;t sound familiar to me at all.  It&amp;#8217;s a quick, short noise that sounds, well, like something emerging from a&amp;nbsp;portal.&lt;/p&gt;
&lt;p&gt;ZDoom is pretty heavily scriptable, and it&amp;#8217;s possible to spawn any object anywhere in the level at any time.  I feel pretty strongly that spawning monsters this way is bad form, because it makes that initial monster count inaccurate.  Instead, I have a small army actually standing on the other side of this portal, and they walk through it.  It makes for a better effect overall, I think, because they behave randomly in a way that would be very fiddly to duplicate on my own.  You might kill them all and walk up to the portal just in time for one last imp to come waltzing through, or one of them might get confused and not come through at all, so they&amp;#8217;ll be waiting for you on the other&amp;nbsp;side.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s even a &amp;#8220;bug&amp;#8221; here that worked out in my favor.  ZDoom has invisible &amp;#8220;patrol point&amp;#8221; objects, which you can use to make monsters follow a path.  All I did was stick one behind the portal, and tell the entire army to walk towards it.  The bug is that they keep trying to walk directly towards it even &lt;em&gt;after&lt;/em&gt; they&amp;#8217;re through the portal, because their very simple &lt;span class="caps"&gt;AI&lt;/span&gt; doesn&amp;#8217;t know they can&amp;#8217;t possibly reach it that way.  By sheer coincidence, the direction they walk is &lt;em&gt;towards the alley&lt;/em&gt;, so it seems as though they&amp;#8217;re creeping towards the&amp;nbsp;player.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare07-lone-portal.jpg" class="photo" title="Lone portal"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare07-lone-portal_m.jpg" alt="Lone portal" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The portal is now the only interesting thing in the&amp;nbsp;city.&lt;/p&gt;
&lt;p&gt;This is the heart of my response to those hypothetical people who don&amp;#8217;t like city maps.  Fine, have it your way; this isn&amp;#8217;t&amp;nbsp;one.&lt;/p&gt;
&lt;p&gt;I love everything about the portals.  The texture is &lt;code&gt;FIREBLU1&lt;/code&gt;, one of a pair of notoriously gaudy stock textures.  I think it works &lt;em&gt;fantastically well&lt;/em&gt; here, and the swirling pattern (done with ZDoom&amp;#8217;s Quake-like texture warping, usually used for liquids) helps distract from the fact that it&amp;#8217;s just a&amp;nbsp;rectangle.&lt;/p&gt;
&lt;p&gt;I put a lot of effort into the portals upfront, figuring that they&amp;#8217;d play a major role in the map.  They open from the middle, which took a little finagling to make look right, since textures generally paint relative to the top.  Walking through one makes a quick &amp;#8220;fwuh&amp;#8221; sound, and your screen abruptly gains a blue tint that fades away fairly quickly.  You also lurch out of the portal slightly faster than you stepped into&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Each portal requires a front line with &lt;code&gt;FIREBLU&lt;/code&gt; as its lower textures, a thin triangle drawn behind that line, a control sector whose floor and ceiling are the same height as the middle of the portal, and a teleport destination object positioned in the exact center of the portal both horizontally and vertically.  All of these things need to be tagged in very particular ways, so the portal script can orchestrate everything correctly.  And you need all of that again for the portal on the other side, if you expect it to work.  Like I said, a lot of&amp;nbsp;effort.&lt;/p&gt;
&lt;p&gt;I had a lot of bugs, too, including several different ones that trapped me in a teleport loop if I moved just the right way.  I think my favorite involved a portal that was oriented diagonally on the map; I tried to walk through it, and the sound and blue flash played, but I came right out the back side of it.  The ultimate cause?  I&amp;#8217;d drawn the line &lt;em&gt;slightly&lt;/em&gt; misaligned with the grid, so its center didn&amp;#8217;t quite pass through the teleporter object.  If I walked through the portal very slowly, I would teleport once, arrive just in front of the other portal, and instantly teleport again to the back of the first one.  That was maddening to figure&amp;nbsp;out.&lt;/p&gt;
&lt;h2 id="hell"&gt;&lt;a class="toclink" href="#hell"&gt;Hell&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare08-hell.jpg" class="photo" title="Welcome to Hell"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare08-hell_m.jpg" alt="Welcome to Hell" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So this is actually a Hell map, I guess.  My initial idea was to have Hell be &lt;em&gt;underneath&lt;/em&gt; the city — not physically, but with some silent teleportation to create the illusion.  I realized right away that the player would just be falling down holes and riding back up very long elevators, which is not very dramatic or exciting.  Hence, portals.  Maybe I took inspiration from the work being done on genuine portals in the ZDoom engine lately, or from the &lt;code&gt;FIREBLU&lt;/code&gt; teleportation &amp;#8220;bars&amp;#8221; in &lt;span class="caps"&gt;TNT&lt;/span&gt;: Evilution&amp;#8217;s &lt;span class="caps"&gt;MAP04&lt;/span&gt;, Wormhole.  But mostly I just love&amp;nbsp;portals.&lt;/p&gt;
&lt;p&gt;Oh, there was one other allure of portals.  Something that frustrates me occasionally about Doom&amp;#8217;s 2D design is that you always know the area &lt;em&gt;behind&lt;/em&gt; you is safe.  Doom addresses this in various ways: monster closets, teleporters, teleporting monsters &lt;em&gt;in&lt;/em&gt;, locking doors behind you, etc.  (Sandy once replied to me on Twitter to explain that Doom &lt;span class="caps"&gt;II&lt;/span&gt;&amp;#8217;s &lt;span class="caps"&gt;MAP04&lt;/span&gt;, The Focus, is so named because you&amp;#8217;re constantly surrounded by critters.)  Portals seemed like an interesting way to approach this problem, since you could be surrounded but still have a (very small) escape route.  That said, I completely neglected to do it here, because I wanted to make you arrive on this cool&amp;nbsp;altar.&lt;/p&gt;
&lt;p&gt;The map is actually named &amp;#8220;Throughfare&amp;#8221;, out of the vague idea that you&amp;#8217;re just passing through this city, but also passing &lt;em&gt;through&lt;/em&gt; to somewhere else entirely.  Then I looked it up and learned that it&amp;#8217;s actually spelled &amp;#8220;thoroughfare&amp;#8221;, which clearly makes no sense at all.  I was reminded of Doom &lt;span class="caps"&gt;II&lt;/span&gt;&amp;#8217;s &lt;span class="caps"&gt;MAP03&lt;/span&gt;, The Gantlet, so I kept the misspelling as a nod to Sandy, who named all the levels.  Granted, &amp;#8220;gantlet&amp;#8221; is an actual archaic spelling, but &amp;#8220;throughfare&amp;#8221; is apparently common enough to deserve a Wiktionary&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;The portal instantly closes behind you, which gives you a clear and immediate goal: get the Hell out of Hell.  This is one of several reasons the map doesn&amp;#8217;t support co-op, though I can imagine a couple ways it could be made to&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;I love this skull platform.  I think it turned out to be surprisingly similar to the end of &lt;span class="caps"&gt;E1M8&lt;/span&gt;, which is nice even if&amp;nbsp;unintentional.&lt;/p&gt;
&lt;p&gt;I also love that door.  I don&amp;#8217;t know if I&amp;#8217;ve seen it done elsewhere, but I just felt like making a door that doesn&amp;#8217;t touch its own walls.  Once I started adding monsters, I discovered that a couple of the imps outside would see you arrive and open the door to come bother you, which is&amp;nbsp;great.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare09-chasm-left.jpg" class="photo" title="The chasm outside, to the left"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare09-chasm-left_m.jpg" alt="The chasm outside, to the left" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Outside is a whole lot of stuff going on.  On the left is a switch behind some very small alternating flesh bars.  The bars are pretty small to prevent the player from &amp;#8220;gliding&amp;#8221; — wedging the 32-unit-square player into a 32-unit-wide gap.  Large chunks of several Doom &lt;span class="caps"&gt;II&lt;/span&gt; maps can be skipped because the mapper made some locked bars exactly 32 units&amp;nbsp;apart.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare10-chasm-right.jpg" class="photo" title="The chasm outside, to the right"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare10-chasm-right_m.jpg" alt="The chasm outside, to the right" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To the right are two other outcroppings.  The middle one has some door and switch stuff going on, and the far one mostly has some imps tossing fireballs at&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;Please take a moment to appreciate that the sky here is different from the sky in the city.  It&amp;#8217;s not particularly difficult to do, but I think it&amp;#8217;s an important&amp;nbsp;touch.&lt;/p&gt;
&lt;p&gt;The lava, oh ho ho.  The lava gave me a bit of a headache.  If you&amp;#8217;ll recall &lt;a href="/blog/2015/12/31/you-should-make-a-doom-level-part-3/"&gt;part 3 of the Doom series&lt;/a&gt;, I turned a flat lava-textured surface into deep lava.  I don&amp;#8217;t know how obvious it was in the article, but I very abruptly realized I didn&amp;#8217;t know how to make the &lt;em&gt;top surface&lt;/em&gt; of the lava brighter than the rest of the room.  I think I ended up cheating and darkening the ceiling and walls,&amp;nbsp;instead.&lt;/p&gt;
&lt;p&gt;Here, I did it right.  The lava is a deep swimmable liquid using &lt;a href="http://zdoom.org/wiki/Sector_Set3dFloor"&gt;&lt;code&gt;Sector_Set3dFloor&lt;/code&gt;&lt;/a&gt; (the ZDoom feature that lets you stack multiple horizontal surfaces on top of each other), and it&amp;#8217;s lit by two layers of &lt;a href="http://zdoom.org/wiki/ExtraFloor_LightOnly"&gt;&lt;code&gt;ExtraFloor_LightOnly&lt;/code&gt;&lt;/a&gt; that extends slightly above it.  You can see the banding of light on the walls; those are the &lt;code&gt;EF_LO&lt;/code&gt;s.  They&amp;#8217;re like 3D floors, but instead of drawing an actual floor, they just change the light level for a particular horizontal slice of an area.  (In vanilla Doom, an area can only have one light level, which applies to the floor, ceiling, walls, and&amp;nbsp;objects.)&lt;/p&gt;
&lt;p&gt;The headache was that the lava is set to inflict 20% damage, but I found that if you held the jump key so you sort of skidded along its surface, you&amp;#8217;d never take any damage!  For the longest time I thought this was a bug with the way damage inside a 3D floor works.  Only in the second-to-last day of mapping did I realize: &lt;code&gt;EF_LO&lt;/code&gt; really does act like a 3D floor.  And while the dummy sector that controls the lava&amp;#8217;s height is set to inflict 20% damage, the sector that controls the &lt;em&gt;light&lt;/em&gt;&amp;#8216;s height is &lt;em&gt;not&lt;/em&gt;.  I changed the light to also inflict damage, and lo and behold!  Fixed.  I think the engine was looking through 3D floors from the top down, discovered that I was &amp;#8220;inside&amp;#8221; the light, saw it had no damage, and stopped looking there.&amp;nbsp;Whoops.&lt;/p&gt;
&lt;p&gt;It all works now, though.  The lava is very pretty, it glows beautifully, it&amp;#8217;s a rosy orange if you fall into it, and it will absolutely kill you very fast.  There is no way out if you fall in, because it&amp;#8217;s a gigantic chasm full of lava, and I can&amp;#8217;t think of a better way to say &amp;#8220;don&amp;#8217;t fall in this pit&amp;#8221; than to fill it with&amp;nbsp;lava.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare11-altar-from-front.jpg" class="photo" title="Two sides of the altar"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare11-altar-from-front_m.jpg" alt="Two sides of the altar" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can&amp;#8217;t do anything outside except be shot at, so your only choice is to come back in.  You have two options from here: up to the left, or down to the right.  I always go down to the right first, largely because that&amp;#8217;s the side I designed&amp;nbsp;first.&lt;/p&gt;
&lt;p&gt;That dead player and associated loot used to be on the steps, until someone told me they&amp;#8217;d walked right over it several times without seeing it.  Doom isn&amp;#8217;t really designed for looking at stuff right below you, and the steps are fairly steep.&amp;nbsp;Oops.&lt;/p&gt;
&lt;h2 id="lava-cave"&gt;&lt;a class="toclink" href="#lava-cave"&gt;Lava&amp;nbsp;cave&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare12-volcano.jpg" class="photo" title="Volcanic entrance"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare12-volcano_m.jpg" alt="Volcanic entrance" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is where I first really got stuck.  It was&amp;nbsp;awful.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d mostly finished the altar room.  I&amp;#8217;d drawn some stairs down here, and made a big box, and put a lava pit in it.  The idea was that you&amp;#8217;d drain the lava to be able to reach a switch in it.  And then&amp;#8230;  nothing.  That was all I&amp;nbsp;had.&lt;/p&gt;
&lt;p&gt;I only had a week, and this was day one or two, so I was pretty anxious about possibly being out of ideas already.  A few people told me I should try looking at real places to get some inspiration.  I don&amp;#8217;t think that&amp;#8217;s quite right; nothing in Doom is &lt;em&gt;really&lt;/em&gt; a real place.  Besides, real places are designed to be easily accessible, whereas Doom is about impeding your&amp;nbsp;progress.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s something I&amp;#8217;ve struggled to keep in mind.  My instinct is to build things that are simple, straightforward, clean.  And that makes really boring maps!  The entire point of Doom — of games at all — is the &lt;em&gt;experience&lt;/em&gt; of getting from start to finish, not just hitting the finish line.  Games are the scenic route.  That&amp;#8217;s what I fundamentally love about Doom: exploring a slightly twisted environment, mashing buttons and having things&amp;nbsp;happen.&lt;/p&gt;
&lt;p&gt;It took me a while, but I finally made this a somewhat interesting area.  It even follows Romero&amp;#8217;s rule of being interesting to look at.  There&amp;#8217;s all kinds of stuff happening here: a huge pool of lava to your left, cliff with a glowing wall to the right, a very fancy switch in the distance.  And a dude on a glowing platform shooting your&amp;nbsp;face.&lt;/p&gt;
&lt;p&gt;I really want to capture how I got from an empty room to this, but it&amp;#8217;s hard to put into words.  I just tried to remember all the design advice I&amp;#8217;d heard and apply it a bit at a time.  The lava pool was originally front and center, for example, which meant your whole initial view was just a big pit of lava that you then had to circle around.  Not very exciting, so I moved it to one side.  Now there was a lot of empty space left on the right.  The room was pretty flat, so I made a cliff.  The cliff was pretty long and monotonous, so I cut a large chunk out of it to hide the back&amp;nbsp;part.&lt;/p&gt;
&lt;p&gt;I went on about contrast in the design post, but having built this map, and in particular this area, I think &amp;#8220;add contrast&amp;#8221; is backwards.  What I did here was &lt;em&gt;remove monotony&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If some sizable chunk of the space all had the same property, I tried to break it up.  Is the floor totally flat?  Break it up.  Is the light level the same?  Break it up.  Are there no switches?  Hell, break that up&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Add contrast&amp;#8221; and &amp;#8220;remove monotony&amp;#8221; sound equivalent; the difference is in the point of view.  If you&amp;#8217;re having trouble coming up with new ideas, it&amp;#8217;s much easier to think about &lt;em&gt;removing&lt;/em&gt; something than &lt;em&gt;adding&lt;/em&gt; something.  I had a big empty cave, and I spent hours drawing a total blank on what to add to it.  Then I tried breaking up the very flat and boring floor, and suddenly I had a cliff, and I started to think about what I could do with a cliff.  Just having a starting point was extremely&amp;nbsp;helpful.&lt;/p&gt;
&lt;p&gt;This is all relative — the size and importance of the area make a lot of difference!  This area is huge and important, so the lava pool and cliff are similarly huge.  But that glowing platform right in front of you is fairly small, so it only needs very small chunks varied.  And in some cases, monotony &lt;em&gt;is itself&lt;/em&gt; a form of contrast!  If your whole map has decent contrast going on, then a sprawling monotonous area like that lava pool will stand&amp;nbsp;out.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare13-chainsaw-entrance.jpg" class="photo" title="Entrance to the chainsaw room"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare13-chainsaw-entrance_m.jpg" alt="Entrance to the chainsaw room" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare14-chainsaw.jpg" class="photo" title="Chainsaw room"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare14-chainsaw_m.jpg" alt="Chainsaw room" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The rim of the lava pool doesn&amp;#8217;t seem very interesting at first glance.  If you look very closely, just above my crosshair, you can see the texture on the wall is a little off.  That&amp;#8217;s because there&amp;#8217;s a little side cave there, and inside, the map&amp;#8217;s chainsaw!  A fine reward for anyone with an eye for detail, anyone who explores the rim, or even just anyone who bothers to look at the&amp;nbsp;automap.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve realized lately how much I &lt;em&gt;love&lt;/em&gt; narrative touches in games.  I guess it&amp;#8217;s what you call &amp;#8220;environmental storytelling&amp;#8221;, but I think that sounds too much like there&amp;#8217;s a single coherent story.  There doesn&amp;#8217;t have to be.  I just want details that leave me feeling like the world exists independently of me, that someone else has been through here, that it&amp;#8217;s not just a simulated world designed solely for my amusement.  Which is hard, because that&amp;#8217;s literally what it&amp;nbsp;is.&lt;/p&gt;
&lt;p&gt;Here, then, are some dead demons, like this is a shrine to a holy relic.  I particularly love this because it seems to tell a story, but the story it tells doesn&amp;#8217;t make any sense!  Who would come to Hell, kill these demons, and then carefully leave their weapon on a glowing platform like this?  It&amp;#8217;s ridiculous, but it feels great&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;Teeny tiny easter egg: on easier difficulties, there are fewer demon corpses&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare15-spiral-entrance.jpg" class="photo" title="Outside a spiral staircase"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare15-spiral-entrance_m.jpg" alt="Outside a spiral staircase" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare16-spiral-inside.jpg" class="photo" title="Bottom of the spiral staircase"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare16-spiral-inside_m.jpg" alt="Bottom of the spiral staircase" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare17-spiral-top.jpg" class="photo" title="Top of the spiral staircase"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare17-spiral-top_m.jpg" alt="Top of the spiral staircase" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rooms that you can&amp;#8217;t see all at once give the player something to&amp;nbsp;explore.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s really hard to internalize.  It feels so &lt;em&gt;inefficient&lt;/em&gt;.  Yet I&amp;#8217;m hard-pressed to name many memorable rooms in Doom that are entirely visible from a single vantage&amp;nbsp;point.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s so important, too.  Players need direction, something to &lt;em&gt;do&lt;/em&gt;, so they don&amp;#8217;t feel like they&amp;#8217;re just meandering from room to room.  Games are interactive; leave space for the player to offer their own&amp;nbsp;input.&lt;/p&gt;
&lt;p&gt;After I drew the cliff and cut this hole in it, I needed a way for the player to get up to the cliff.  Hiding a simple lift behind this rocky wall seemed too simple, so I tucked a spiral staircase in the void, and it kinda grew into its own little area.  The metal texturing acts as a reprieve from the rock texture&amp;nbsp;outside.&lt;/p&gt;
&lt;p&gt;That rock texture, by the way, was fairly deliberate.  A playtester even commented on it and suggested I use a different floor/ceiling, but I decided to keep it this way.  It &lt;em&gt;should&lt;/em&gt; be samey, because that&amp;#8217;s what this place is: a jagged hole cut out of solid&amp;nbsp;rock.&lt;/p&gt;
&lt;p&gt;I realized, from this room, what didn&amp;#8217;t feel right about taking inspiration from real places.  In a medium where gameplay concerns heavily affect the design of the world, and especially in a game as abstract as Doom, it&amp;#8217;s more important to &lt;em&gt;evoke the feeling&lt;/em&gt; of a place.  Not necessarily a &amp;#8220;real&amp;#8221; place, either.  Lay enough groundwork that the place seems cohesive, and the rest will happen inside the player&amp;#8217;s head.  If you try too hard to model a real place, you might hit the uncanny valley and just look like a crappy replica of&amp;nbsp;reality.&lt;/p&gt;
&lt;p&gt;I didn&amp;#8217;t really understand how to do that until I did it.  I thought I needed to have the fully-realized place in mind, and pare down the details until I was just hinting at it.  Nope.  The details we fill in ourselves are hazy and different for everyone, so it doesn&amp;#8217;t matter what they are.  Just stick to a general theme until you start to get a sense of place in your &lt;em&gt;own&lt;/em&gt; head, and then lean into&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;You know that early underground level in Super Mario Bros?  Really?  Why did you know exactly what I meant?  Have you ever seen an underground place like that, with easily-smashed bricks floating in the void and pipes three times the size of a person jutting out of the ground?  Me neither.  It doesn&amp;#8217;t matter, because it&amp;#8217;s close enough to obviously be underground.  It&amp;#8217;s what underground looks like within the vocabulary of the game.  The music is lower, the level is a shadowed blue color, and of course you get there by taking a pipe down through the&amp;nbsp;ground.&lt;/p&gt;
&lt;p&gt;This, then, is the lava cave.  It&amp;#8217;s rocky enough to pass for a cave, and it has lava.  There&amp;#8217;s a maintenance shaft in the middle, which doesn&amp;#8217;t seem out of place at all, because why would&amp;nbsp;it?&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare18-side-room.jpg" class="photo" title="A small side room"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare18-side-room_m.jpg" alt="A small side room" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This tiny side room is a great example of all of this stuff.  It doesn&amp;#8217;t need to exist; I could just have well not drawn this wall, and had a single larger room with these items in it.  I added the room because the style of this maintenance area has been small and cramped, and even that little combined room felt too big.  Splitting out a side room preserves the theme, gives the outer room an interesting shape, and gives the player one more place to go.  Plus it hides the secret on the back&amp;nbsp;wall.&lt;/p&gt;
&lt;p&gt;This whole area, by the way, reflects something else I really enjoy in Doom maps: folding a deceptively large amount of stuff into a very small space.  From the outside, this is just a moderately-sized rocky wall; inside, somehow, there&amp;#8217;s a tunnel and a spiral staircase and two rooms and a small cave outside with imps on it!  You go through several areas and come out mere feet from where you started.  It&amp;#8217;s a really neat&amp;nbsp;effect.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare19-firewall-switch.jpg" class="photo" title="Firewall switch"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare19-firewall-switch_m.jpg" alt="Firewall switch" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare20-revenants.jpg" class="photo" title="Some revenants"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare20-revenants_m.jpg" alt="Some revenants" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All of that led to this switch, which lowers the red&amp;nbsp;wall.&lt;/p&gt;
&lt;p&gt;The original plan was that you&amp;#8217;d think the &lt;em&gt;inner&lt;/em&gt; red wall was just the back side of the &lt;em&gt;outer&lt;/em&gt; red wall, and when you pressed the switch to lower them, surprise!  There&amp;#8217;s a bunch of revenants in the middle.  There are seven of them, and there&amp;#8217;s not much space between them and the cave wall, so I was worried that they&amp;#8217;d instantly swarm you and block your&amp;nbsp;escape.&lt;/p&gt;
&lt;p&gt;Luckily, I&amp;#8217;m a doofus and forgot to flag them as &amp;#8216;ambush&amp;#8217; — which would&amp;#8217;ve made them wait silently until they actually saw me before yelling and giving chase.  Instead, they hear your first shot in the cave and bunch up on one end of their little channel, so they&amp;#8217;re easy to run away from.  Even better, they&amp;#8217;re yelling at you the &lt;em&gt;entire time&lt;/em&gt; you&amp;#8217;re making your way up to the cliffside.  I thought that effect was much better than my first idea, so I left it how it&amp;nbsp;was.&lt;/p&gt;
&lt;p&gt;The switch that lowers them has a little stockpile in front, as a quiet hint that something&amp;#8217;s about to go down.  Also, if you&amp;#8217;re clever, you can preserve the two barrels on the cliff and use them to inflict some splash damage, since you don&amp;#8217;t have the rocket launcher&amp;nbsp;yet.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare21-lava-pump-switch.jpg" class="photo" title="Lava pump switch"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare21-lava-pump-switch_m.jpg" alt="Lava pump switch" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare22-lava-lowering.jpg" class="photo" title="Lava pool in the process of draining"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare22-lava-lowering_m.jpg" alt="Lava pool in the process of draining" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And the point of lowering the red wall was to hit this switch that&amp;#8217;s been tantalizing you since the beginning, which drains the lava&amp;nbsp;pool.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d intended to have a physical pump mechanism that this switch activated; it&amp;#8217;d explain &lt;em&gt;why&lt;/em&gt; this switch drains the lava, and flavor the whole cave as a geothermal generator or something.  I just never got around to&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare23-cacodemons.jpg" class="photo" title=" "&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare23-cacodemons_m.jpg" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lowering the lava also wakes up these three cacodemons, who rise out of some remaining pools in the floor.  They&amp;#8217;ve been there the whole time, but&amp;nbsp;dormant.&lt;/p&gt;
&lt;p&gt;The switch there raises a lift and grants access to the cool skull switch that&amp;#8217;s been teasing you since you first arrived in this&amp;nbsp;room.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a blue armor behind it, which counts as a secret.  If you hadn&amp;#8217;t caught on yet, I &lt;em&gt;love&lt;/em&gt; secrets.  I love finding them, so I love providing them for other people to find.  They&amp;#8217;re little rewards for poking around, going off the beaten path.  This one isn&amp;#8217;t particularly hard to find, but then, neither is the&amp;nbsp;chainsaw.&lt;/p&gt;
&lt;p&gt;The switch still works even if the lava hasn&amp;#8217;t been drained.  If you know it&amp;#8217;s there and are feeling incredibly gutsy, you could dive in, mash the switch, leap out, and skip the entire right half of the room.  I haven&amp;#8217;t actually tried this, but I think it&amp;#8217;s just barely possible.  What a shame that the only armor you can reach yet is also in the lava, on the other side of the&amp;nbsp;switch.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare24-skull-switch-pink.jpg" class="photo" title=" "&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare24-skull-switch-pink_m.jpg" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I really, &lt;em&gt;really&lt;/em&gt; like switches that visually indicate what they&amp;#8217;re doing.  You can get on with the game without running around for 20 minutes trying to guess what just changed, and the switch itself feels more interactive besides.  It worked out particularly well here: this is the most grandiose switch in the room, by&amp;nbsp;far.&lt;/p&gt;
&lt;p&gt;You can&amp;#8217;t tell from a screenshot, but the pink fleshy texture rotates while the pillars open, so it looks like tendrils are twisting into the&amp;nbsp;rock.&lt;/p&gt;
&lt;p&gt;That concludes the lava cave!  Next is the, uh, other&amp;nbsp;one.&lt;/p&gt;
&lt;h2 id="green-cave"&gt;&lt;a class="toclink" href="#green-cave"&gt;Green&amp;nbsp;cave&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare25-green-cave.jpg" class="photo" title="Opening shot of the green cave"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare25-green-cave_m.jpg" alt="Opening shot of the green cave" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This area is a bit more abstract, but still holds together.  The stairs up to it and this platform here have a mossy growth on them; the walls are unusually green for a cave; the ceiling reminds me of knotted roots.  There are a couple dead trees here, in contrast to the fairly barren lava cave.  And then there are the weird glowing flesh tendrils, framing the very Doom &lt;span class="caps"&gt;II&lt;/span&gt; scrolling face texture, which I adore.  I don&amp;#8217;t know what this &lt;em&gt;is&lt;/em&gt;, but it feels alive, and seeing it in Hell with these grotesque parts stabbed through its core is a little&amp;nbsp;unsettling.&lt;/p&gt;
&lt;p&gt;Another one of Romero&amp;#8217;s comments that stuck with me is that he hates symmetry.  A symmetrical map is only half a map.  The player has to do the same thing twice, and all the designer did is copy and paste the&amp;nbsp;rest.&lt;/p&gt;
&lt;p&gt;I kept that in mind and ended up with a very different second cave.  The lava cave was big but fairly easy; the only ambush was the revenant army, which you could hear coming the entire time.  This room is more straightforward, but also more compact and a little more&amp;nbsp;tricky.&lt;/p&gt;
&lt;p&gt;I love that sole arachnotron up there.  I love how big and obnoxious arachnotrons are in general — all of their sound effects are just as annoying as the player&amp;#8217;s own plasma gun, and their loud as hell death cry is suitably satisfying.  I think they stand out to me because of the way Sandy sprinkled them all over the outside of &lt;span class="caps"&gt;MAP12&lt;/span&gt;, The Factory.  Here&amp;#8217;s a whole bunch of wide open space, so let&amp;#8217;s dump these huge clunky monstrosities everywhere.&amp;nbsp;Perfect.&lt;/p&gt;
&lt;p&gt;Pressing that red brick switch converts that wall into a set of stairs, so you can walk up to the face platform.  I tend to replay Doom design commentary that I like while mapping, and I listened to an entire &lt;a href="https://www.youtube.com/playlist?list=PLGrCiTVJvPsGGTwtJRmq6JjwpO1vq-UhQ"&gt;Let&amp;#8217;s Play of Doom &lt;span class="caps"&gt;II&lt;/span&gt; The Way id Did&lt;/a&gt;; somewhere in there was the offhand remark that stair-building effects aren&amp;#8217;t used much in modern maps.  That stuck with me, so I made some stairs out of this huge prominent wall.  Creating the stairs somewhat reduces the amount of cover available, which is interesting now that I think about&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare26-ssg-door.jpg" class="photo" title="SSG door"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare26-ssg-door_m.jpg" alt="SSG door" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare27-ssg-platform.jpg" class="photo" title="SSG on a platform"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare27-ssg-platform_m.jpg" alt="SSG on a platform" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare28-ssg-lowering.jpg" class="photo" title="Lowering the SSG"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare28-ssg-lowering_m.jpg" alt="Lowering the SSG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I always do the other room first, just because I made it first.  It&amp;#8217;s also nice to get the blue armor as soon as possible, and you get the plasma gun (but not much ammo).  This room deserved a reason to be done first, too, and so I put the super shotgun here.  I feel like I watch a lot of expert Doom players get through maps almost exclusively using the super shotgun, so here, you have to earn&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;One of the videos I replayed mentioned that an ambush when picking up a key is boring and expected.  I can understand that.  It doesn&amp;#8217;t make a lot of sense, anyway; why not attack &lt;em&gt;before&lt;/em&gt; you get the key, to stop you from getting it?  Most of the traps in this map, then, force the player to actively spring&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;In this case, the super shotgun is on a raised platform.  Pressing the platform will lower it, but also lower the adjacent wall, behind which are two hell knights.  If you fire or try to run, you&amp;#8217;ll also wake up two revenants further&amp;nbsp;along.&lt;/p&gt;
&lt;p&gt;And the door&amp;#8230;  oh, the door.  I love this door so much.  It&amp;#8217;s a &amp;#8220;blazing&amp;#8221; door, opening almost instantly and with a special sound effect.  Coming in, that is.  When you open it to &lt;em&gt;leave&lt;/em&gt;, it opens veeeery slowly.  I think the technical term for this is a &amp;#8220;fuck-you&amp;#8221;, and I think Doom is deserving of having a couple of&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare29-archvile.jpg" class="photo" title="Revealed arch-vile"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare29-archvile_m.jpg" alt="Revealed arch-vile" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The rest of the room is fairly simple.  Kill the things, take some stairs up to the smaller caves, press a switch.  That raises the gate around the cool skull switch.  (Raising a solid gate texture is a ZDoom thing that I&amp;nbsp;dig.)&lt;/p&gt;
&lt;p&gt;I know I just said that I like to make the player spring traps on themselves, but I broke that rule here.  As you &lt;em&gt;approach&lt;/em&gt; the switch, a wall opens behind you, and an arch-vile comes out.  Arch-viles are monsters that &amp;#8220;cast&amp;#8221; a fire on you from a distance; you have about two seconds to break line of sight with him, or you will be in a world of hurt.  This room has plenty of places to hide, making him more of a surprise than a serious&amp;nbsp;threat.&lt;/p&gt;
&lt;p&gt;Both of the skull switches automatically quicksave.  If you rush directly for this switch and press it — and why wouldn&amp;#8217;t you? — it&amp;#8217;s possible that you&amp;#8217;ll get a quicksave right as he&amp;#8217;s starting to attack you.  Oops.  There isn&amp;#8217;t a more appropriate place to save, though.  Oh&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t mentioned difficulty levels at all yet, and this room is where they&amp;#8217;re most obviously different.  Doom &lt;span class="caps"&gt;II&lt;/span&gt; has five skill levels, but the two easiest and two hardest use the same monster arrangements and just tweak some numbers.  That leaves three skill levels to &lt;em&gt;map&lt;/em&gt; for: easy, medium, hard.  (You can set all five independently with ZDoom, but I don&amp;#8217;t see why you would do that.)  I designed the map for hard difficulty, balanced ammo and health, and then adjusted difficulty&amp;nbsp;last.&lt;/p&gt;
&lt;p&gt;To do that, I took a look at a few Doom &lt;span class="caps"&gt;II&lt;/span&gt; maps on doomwiki, which has a convenient table of how many of each type of object appear on each difficulty.  I was somewhat surprised to find that ammo, health, armor, powerups, etc. are almost always unchanged between difficulties, meaning that you have plenty to spare if you play on easy.  I was even more surprised to find that the monster count was roughly proportioned 1:2:3.  The game is basically &lt;em&gt;barren&lt;/em&gt; on&amp;nbsp;easy.&lt;/p&gt;
&lt;p&gt;As an extreme example: &lt;span class="caps"&gt;MAP16&lt;/span&gt;, &lt;a href="http://doomwiki.org/wiki/MAP16:_Suburbs_%28Doom_II%29"&gt;Suburbs&lt;/a&gt;, is a very open map with a prominently-placed key.  When you pick up the key, tons of enemies start teleporting in &lt;em&gt;all over&lt;/em&gt; the map.  It&amp;#8217;s terrible.  Aside from a handful of oddballs, the monster counts are as&amp;nbsp;follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hard: 97 imps, 25 cacodemons, 14 revenants, 15&amp;nbsp;mancubi&lt;/li&gt;
&lt;li&gt;Easy: 49 imps, 0 cacodemons, 1 revenant, 0&amp;nbsp;mancubi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you play on easy, the horde from my nightmares is reduced to a few dozen imps.&amp;nbsp;Amazing.&lt;/p&gt;
&lt;p&gt;Enlightened, I went through the map and made a third of the monsters not appear on medium, and those plus another third not appear on easy.  I was a bit torn on what to do in places where I had only one tough monster, though, like this arch-vile trap.  I decided to &lt;em&gt;replace&lt;/em&gt; the arch-vile with a revenant on easy, and likewise replace the arachnotron with a less threatening hell knight.  I took difficulty into account a couple other ways, too, which I&amp;#8217;ll get to&amp;nbsp;later.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re curious, the final monster tally is 307 on hard, 227 on medium, 155 on&amp;nbsp;easy.&lt;/p&gt;
&lt;h2 id="chasm"&gt;&lt;a class="toclink" href="#chasm"&gt;Chasm&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare30-chasm-chaos.jpg" class="photo" title="Chaos in the chasm"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare30-chasm-chaos_m.jpg" alt="Chaos in the chasm" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With both of those cool skull switches pressed, the eye switch in the chasm is now accessible.  A whole lotta stuff has been released,&amp;nbsp;though.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m really, really happy that this part of the map turned out to be truly non-linear.  I say &amp;#8220;truly&amp;#8221; to distinguish from &amp;#8220;faux&amp;#8221; non-linear, which is usually what people mean.  Maps like Downtown look linear at first blush, because there are a lot of places you can go&amp;#8230;  but most of them are optional and won&amp;#8217;t help you progress.  To complete the level, you always need to go through the same sequence of critical events in the same order: blue key, blue door, red key, red door, yellow key, yellow door, exit.  Contrast with &lt;span class="caps"&gt;MAP19&lt;/span&gt;, &lt;a href="http://doomwiki.org/wiki/MAP19:_The_Citadel_%28Doom_II%29"&gt;The Citadel&lt;/a&gt;, where you always need the red key but can get &lt;em&gt;either&lt;/em&gt; the blue or yellow key, and order doesn&amp;#8217;t matter.  Likewise, you do have to press both switches in my map, but the map doesn&amp;#8217;t care which one you tackle&amp;nbsp;first.&lt;/p&gt;
&lt;p&gt;I didn&amp;#8217;t use any scripting to do this, either.  I feel very strongly that scripting should be kept as minimal as possible, to keep the game feeling as Doom-like as possible.  I could&amp;#8217;ve kept track of how many switches you&amp;#8217;d pressed, and only released the monsters when you&amp;#8217;d pressed both.  Or I could&amp;#8217;ve done the straightforward thing: stuff the monsters behind &lt;em&gt;two&lt;/em&gt; doors, and have each switch open one door.  Then the monsters can only come out when both doors are open.  It&amp;#8217;s the same reasoning as &lt;a href="/blog/2016/03/06/maybe-we-could-tone-down-the-javascript/"&gt;using native &lt;span class="caps"&gt;HTML&lt;/span&gt; instead of reinventing with JavaScript&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare31-floating-bridge.jpg" class="photo" title="Floating rock bridge"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare31-floating-bridge_m.jpg" alt="Floating rock bridge" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The eye switch makes this floating bridge rise slowly from the lava.  The individual chunks bob slowly in the air.  It&amp;#8217;s not a very complicated effect, but it looks really&amp;nbsp;cool.&lt;/p&gt;
&lt;p&gt;This grants you access to the middle outcropping.  If you&amp;#8217;re playing on hard, you might be feeling pressed for ammo right about here.  Good!  A little ammo pressure is great.  Like I said, I get the impression a lot of expert Doom players blaze through everything with just the super shotgun.  I deliberately avoided leaving enough shells around to get away with that.  Doom has a bunch of weapons, and you ought to use a few of&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;Placing the ammo was trickier than I thought.  I realized pretty early on that it was hard to balance the pickups when they vary so wildly in value.  I said in my Doom series that I measure damage roughly in terms of super shotgun (or rocket) blasts, so in terms of damage only, 20 bullets ≈ 2 shells ≈ 1 rocket ≈ 10 cells.  Based on that, here are all the ammo pickups, how much of your maximum ammo they refill (assuming no backpack), and how many super-shotgun-equivalent blasts you get from&amp;nbsp;them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clip (10 bullets): ½ blast, 5% max&amp;nbsp;ammo&lt;/li&gt;
&lt;li&gt;bullet box (50 bullets): 2½ blasts, 25% max&amp;nbsp;ammo&lt;/li&gt;
&lt;li&gt;4 shells: 2 blasts, 8% max&amp;nbsp;ammo&lt;/li&gt;
&lt;li&gt;shell box (20 shells): 10 blasts, 40% max&amp;nbsp;ammo&lt;/li&gt;
&lt;li&gt;1 rocket: 1 blast, 2% max&amp;nbsp;ammo&lt;/li&gt;
&lt;li&gt;rocket box (5 rockets): 5 blasts, 10% max&amp;nbsp;ammo&lt;/li&gt;
&lt;li&gt;small cell (20 cells): 2 blasts, 7% max&amp;nbsp;ammo&lt;/li&gt;
&lt;li&gt;bulk cell (100 cells): 10 blasts, 33% max&amp;nbsp;ammo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What a ridiculous spread.  You&amp;#8217;re full up with only three bulk cells, but you need &lt;em&gt;ten&lt;/em&gt; boxes of rockets.  A small shell pickup is worth four small bullet pickups.  Full rockets do five times more damage than full bullets.  How on Earth do you handle&amp;nbsp;this?&lt;/p&gt;
&lt;p&gt;I didn&amp;#8217;t do a &lt;em&gt;great&lt;/em&gt; job early on — I threw ammo around and immediately fed the map to my playtester before going to bed.  It turned out that I&amp;#8217;d front-loaded the ammo.  Those boxes of shells add up &lt;em&gt;real fast&lt;/em&gt;, and I had more than a few lying around.  For my second try, I replaced most of the boxes of shells with a few individual shells sprinkled around, and used a couple more relatively-small rocket pickups.  That seemed to work pretty&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;Someone has made a small resource mod that adds medium-sized pickups for all four types of ammo.  I would&amp;#8217;ve liked to have those available here, I&amp;nbsp;think.&lt;/p&gt;
&lt;h2 id="two-brief-detours"&gt;&lt;a class="toclink" href="#two-brief-detours"&gt;Two brief&amp;nbsp;detours&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before making any further progress, I want to show the two most obtuse secrets in the entire map.  If you don&amp;#8217;t want them spoiled, you should skip this whole&amp;nbsp;section.&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;Okay&amp;nbsp;then.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare32-far-chasm.jpg" class="photo" title="Far side of the chasm"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare32-far-chasm_m.jpg" alt="Far side of the chasm" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Originally, the portal in the alleyway stayed open, and you walked through it.  This little altar is where you came out.  I hadn&amp;#8217;t built anything else in the chasm&amp;nbsp;yet.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a secret in the alleyway that dates back to this original design: if you go behind where the portal opens, there&amp;#8217;s an inset door that opens to reveal a berserk pack.  (Berserk is the powerup that instantly refills you to 100% health, and also makes your punch 10× more powerful until the end of the level.)  With the initial design, you could either grab it before you got the shotgun (which is a bit of a waste, since you have full health), &lt;span class="caps"&gt;OR&lt;/span&gt; you could re-enter the portal &lt;em&gt;from the back&lt;/em&gt; and pop out behind it in the alley.  Now that the portal closes right away, you can get it fairly easily whenever you want, which is probably a good thing since it&amp;#8217;s the only berserk pack in the&amp;nbsp;map.&lt;/p&gt;
&lt;p&gt;Anyway, I realized that having only a single demon emerge from the depths of Hell was kind of weird and anticlimactic, so I started to build the altar and the little swarm of cannon fodder that comes after you.  I realized that a fancy marble room with you as the focal point was a &lt;em&gt;way&lt;/em&gt; cooler introduction than just popping out on a red cliff, and that&amp;#8217;s when I made the alley portal close right&amp;nbsp;away.&lt;/p&gt;
&lt;p&gt;But.  There&amp;#8217;s a slight delay before the demon acts.  If you know the portal will be there, you can charge straight for it and just barely get through before the demon does.  You&amp;#8217;ll end up here, and telefrag the&amp;nbsp;demon.&lt;/p&gt;
&lt;p&gt;Why would you do this?  Because at the start of the level, there&amp;#8217;s an alcove with three backpacks in it.  The only backpacks in the map.  And it closes as soon as you take the portal to the altar — not that it matters, since you can&amp;#8217;t get back over there&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;The bridge used to extend all the way across the chasm, so you could press the switch to reopen the alley portal, and emerge back into the city, and&amp;#8230;  nothing would be different.  It was confusing and pointless, so I cut off that end of the&amp;nbsp;bridge.&lt;/p&gt;
&lt;p&gt;The result is very deliberate and tricky and I &lt;em&gt;love&lt;/em&gt; it.  I had this whole chunk of unused map, and I turned it into a really cool secret.  It&amp;#8217;s right in front of you, rife with hints that you should be able to get there somehow.  There&amp;#8217;s an altar!  There&amp;#8217;s a big switch!  (It just re-opens the alley portal so you can get back, of course.)  And I didn&amp;#8217;t mark the alcove as having a secret wall, so you can see something is hidden there if you look at the&amp;nbsp;automap!&lt;/p&gt;
&lt;p&gt;Someone commented that it&amp;#8217;s kind of mean to have the only backpacks in an obtuse secret.  Damn right it is.  Having a backpack &lt;em&gt;doubles&lt;/em&gt; your ammo capacity, which changes the ammo balance severely.  If I give it to you late in the map, what&amp;#8217;s the point, when you&amp;#8217;re probably maxed out and near the end anyway?  If I give it to you early in the map, what was the point of having it as a powerup at all when you&amp;#8217;re never burdened by the default ammo capacity?  The only satisfying answer I had was to make you &lt;em&gt;earn it&lt;/em&gt; by being&amp;nbsp;clever.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare33-red-wall.jpg" class="photo" title="Red wall leading to the super-secret"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare33-red-wall_m.jpg" alt="Red wall leading to the super-secret" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare17-spiral-top.jpg" class="photo" title="Secret switch in the lava cave"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare17-spiral-top_m.jpg" alt="Secret switch in the lava cave" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare34-green-secret-switch.jpg" class="photo" title="Secret switch in the green cave"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare34-green-secret-switch_m.jpg" alt="Secret switch in the green cave" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The other obtuse secret has a bright red hint in both caves.  No, really, there&amp;#8217;s a huge red slab of&amp;nbsp;wall.&lt;/p&gt;
&lt;p&gt;You might spot an out-of-the-way switch in one cave.  The only visible effect is to make that huge red slab of wall a different texture.  Until you find &lt;em&gt;both&lt;/em&gt; switches, which fully opens the doors, in much the same way as the double-layered monster closets in the&amp;nbsp;chasm.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare35-secret-passage.jpg" class="photo" title="Entrance to the secret passage"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare35-secret-passage_m.jpg" alt="Entrance to the secret passage" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare36-secret-passage-end.jpg" class="photo" title="Secret passage looking out into the lava cave"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare36-secret-passage-end_m.jpg" alt="Secret passage looking out into the lava cave" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare37-tomb.jpg" class="photo" title="Tomb, maybe"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare37-tomb_m.jpg" alt="Tomb, maybe" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This reveals a little marble passageway, connecting the two caves.  In the middle is a lift, which takes you down to&amp;#8230;  a little tomb, maybe?  It has some rockets for you, and two points of&amp;nbsp;interest.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare38-blood-tank.jpg" class="photo" title="Tank full of blood and corpses"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare38-blood-tank_m.jpg" alt="Tank full of blood and corpses" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This tank is entirely flavor.  I don&amp;#8217;t know how well it conveys what I was thinking.  If you look at the automap here, you&amp;#8217;ll see that you&amp;#8217;re right behind the altar where you first arrived.  The idea was that the portal is being powered by blood, or something.  (The corpses constantly spew little red particles that drift upwards and fade&amp;nbsp;away.)&lt;/p&gt;
&lt;p&gt;Fun fact: I originally had the map powerup down here.  Then I came to my senses and realized that the item used for finding missed secrets really does not belong in the most obscure&amp;nbsp;secret.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare39-secret-portal.jpg" class="photo" title="Secret portal"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare39-secret-portal_m.jpg" alt="Secret portal" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare40-beach.jpg" class="photo" title="Deserted Hell island"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare40-beach_m.jpg" alt="Deserted Hell island" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The other thing here is this portal, which takes you to a hellish beach floating somewhere out in the void.  Guarded by two barons (minibosses who can take a beating) is the only &lt;span class="caps"&gt;BFG&lt;/span&gt; in the&amp;nbsp;map.&lt;/p&gt;
&lt;p&gt;The texture is a stock texture, but with its colors shifted from dark grays to light browns.  I didn&amp;#8217;t edit it; ZDoom has a feature for describing that kind of color shift with a single line in a text&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;Originally this was an actual beach in the ocean, but I felt obligated to give it sloping edges, which is a &lt;em&gt;huge pain in the ass&lt;/em&gt;.  None of the stock Doom &lt;span class="caps"&gt;II&lt;/span&gt; skies really belong above an endless ocean,&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare41-megasphere.jpg" class="photo" title=" "&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare41-megasphere_m.jpg" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you leave the island through the &lt;em&gt;back&lt;/em&gt; of the portal, you come out behind it in the tomb, which lets you get to the only megasphere in the map!  Secrets inside more secrets are the best kind of&amp;nbsp;secrets.&lt;/p&gt;
&lt;p&gt;The only hint to this is a misaligned section of brick.  It used to be less misaligned, but I watched someone live on stream go behind the portal and &lt;em&gt;still miss the door twice&lt;/em&gt;,&amp;nbsp;so.&lt;/p&gt;
&lt;p&gt;Now that we&amp;#8217;re pretty beefed up, let&amp;#8217;s get back to the game&amp;nbsp;progression.&lt;/p&gt;
&lt;h2 id="middle-outcropping"&gt;&lt;a class="toclink" href="#middle-outcropping"&gt;Middle&amp;nbsp;outcropping&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare42-chasm-middle.jpg" class="photo" title="Middle part of the chasm"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare42-chasm-middle_m.jpg" alt="Middle part of the chasm" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s that &amp;#8220;cool establishing shot&amp;#8221; thing again.  You&amp;#8217;ve got some doors, a switch up on that cliff, and some little pillars awkwardly hanging out&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;This area is a calmer come-down from all the stuff you just fought in the chasm.  I don&amp;#8217;t have a lot to say about it.  The left door leads to a dozen minor enemies, and the right door leads to a couple tougher ones.  Both of them lead to the same revenant room behind the cliff with a lift on it.  You can go whichever way you want.  It&amp;#8217;s probably worth doing both, since they have some ammo that you&amp;#8217;re starting to hurt&amp;nbsp;for.&lt;/p&gt;
&lt;p&gt;Is it bad that I don&amp;#8217;t feel too strongly about these areas?  Or does it make sense that a somewhat quieter area would be less distinct?  They&amp;#8217;re not bland; they just don&amp;#8217;t evoke anything in&amp;nbsp;particular.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare43-lost-souls.jpg" class="photo" title="Lost souls trapped in a cage"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare43-lost-souls_m.jpg" alt="Lost souls trapped in a cage" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oh, I do like this, though.  A cage full of lost souls on the right side.  They can only attack by charging, so they&amp;#8217;re basically harmless in there and bumble around colliding with each&amp;nbsp;other.&lt;/p&gt;
&lt;p&gt;This is our lost soul cage, where we keep our lost&amp;nbsp;souls.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare44-archvile-cage.jpg" class="photo" title="An arch-vile also trapped in a cage"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare44-archvile-cage_m.jpg" alt="An arch-vile also trapped in a cage" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s another archvile, this time rendered fairly harmless.  You can just peek around the corner of his cage and take potshots at him, or ignore him entirely and charge up the&amp;nbsp;stairs.&lt;/p&gt;
&lt;p&gt;I originally forgot to flag the bars as impassable, so he would see you and just charge &lt;em&gt;straight through the bars&lt;/em&gt; to set you on fire.  Two people played through this without mentioning&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare45-cacodemon-lift.jpg" class="photo" title="Cacodemons descending on a lift"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare45-cacodemon-lift_m.jpg" alt="Cacodemons descending on a lift" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This used to be a single arch-vile, a great surprise to find on a lift.  Then I added the arch-vile in the green cave, and the arch-vile in the cave, and that was too many&amp;nbsp;arch-viles.&lt;/p&gt;
&lt;p&gt;A playtester had been doing a Tyson run (punching only) for kicks, and he&amp;#8217;d had to run past the cacodemon ambush in the chasm, since it&amp;#8217;s hard to punch things that are floating over lava.  While he&amp;#8217;d made his way through the side rooms to get here, the cacodemons had been trying to move towards him and had clustered together at the top of this&amp;nbsp;lift.&lt;/p&gt;
&lt;p&gt;When he pulled the lift down, the &lt;em&gt;floating&lt;/em&gt; cacodemons moved down with it.  He thought that was absolutely hilarious.  So now there are cacodemons&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare46-hell-button.jpg" class="photo" title="Raised switch"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare46-hell-button_m.jpg" alt="Raised switch" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare47-hell-exit.jpg" class="photo" title="Portal out of Hell"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare47-hell-exit_m.jpg" alt="Portal out of Hell" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pressing the switch on the cliff raises a switch below the cliff.  Why?  So you can watch what that switch&amp;nbsp;does.&lt;/p&gt;
&lt;p&gt;Pressing the second switch will lower it into the ground, then raise an altar right in front of you, underneath where those pillars are.  Right between them, a portal opens.  Finally!  You&amp;#8217;re free from&amp;nbsp;Hell.&lt;/p&gt;
&lt;h2 id="homecoming"&gt;&lt;a class="toclink" href="#homecoming"&gt;Homecoming&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare48-apartment.jpg" class="photo" title="Return to the city"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare48-apartment_m.jpg" alt="Return to the city" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare49-apartment2.jpg" class="photo" title="Another angle of the same room"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare49-apartment2_m.jpg" alt="Another angle of the same room" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You arrive home in this weirdly nondescript room.  What &lt;em&gt;is&lt;/em&gt; this room?  I don&amp;#8217;t know.  It&amp;#8217;s textured like an apartment, but there&amp;#8217;s not a lot of things in&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;I think that&amp;#8217;s okay.  I mean, the &lt;em&gt;point&lt;/em&gt; of this room is for a lot of zombie men to shoot you with guns, so it&amp;#8217;s not like it needs too many frills.  If I had a potted plant object to work with, I might&amp;#8217;ve stuck one in the corner, but I don&amp;#8217;t, so I&amp;nbsp;didn&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;I love that revenant in the corner.  Naturally, the flesh walls scroll around him.  It&amp;#8217;s great.  Like Hell tried to force itself into our dimension, but it didn&amp;#8217;t do a very good job, so now this one skeleton is just stuck in the&amp;nbsp;wall.&lt;/p&gt;
&lt;p&gt;The lift doesn&amp;#8217;t go down, but once you leave this building, you can use it to return here (and back to Hell, if you wish).  I added it in an embarrassed panic towards the end, after realizing that at one point you drop out of a shaft in the ceiling, meaning you had no way to ever go back and collect missed secrets.  I&amp;#8217;m pretty solidly in the camp that nothing in a level should become permanently inaccessible unless you have a really good reason.  Like, say, if it&amp;#8217;s an obtuse&amp;nbsp;secret.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare50-bathtub.jpg" class="photo" title="A very nice bathtub"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare50-bathtub_m.jpg" alt="A very nice bathtub" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This room is so ridiculous.  I &lt;em&gt;love&lt;/em&gt;&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;At this point you&amp;#8217;re inside one of the city buildings, so I had a finite amount of space to work inside.  I carved it into rooms and then had to put something in each room.  For this one, I stuck some pipes (a &lt;em&gt;bundle&lt;/em&gt; of pipes?) in the corner.  That reminded me of those huge room-filling bathtubs, so I made one.  And put a single demon in it.  With some dudes hanging&amp;nbsp;around.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know what&amp;#8217;s going on here, but it&amp;#8217;s&amp;nbsp;fascinating.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare51-elevator.jpg" class="photo" title="Elevator in motion"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare51-elevator_m.jpg" alt="Elevator in motion" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This elevator is true 3D.  It&amp;#8217;s one of the very few overt uses of room-over-room in the whole map.  It seemed&amp;nbsp;fitting.&lt;/p&gt;
&lt;p&gt;I wanted to have sliding elevator doors, but for a variety of gritty technical reasons, it never worked out.  Instead you get this very Doom-style open&amp;nbsp;lift.&lt;/p&gt;
&lt;p&gt;I said that I value preserving that Doom-like feel, and it&amp;#8217;s true here too.  If I&amp;#8217;d done the Doom thing and used a traditional lift, the two floors would&amp;#8217;ve had to be on different sides of the lift.  I happen to think that &lt;em&gt;draws attention&lt;/em&gt; to the fact that you can&amp;#8217;t do room-over-room in Doom.  What I built looks and feels like an analog for an actual elevator, but departs from vanilla Doom capabilities in fairly minor ways.  The way the rooms are packed together feels like there could be two entirely separate floors here, but the only true overlap is the space immediately in front of the elevator.  The switch has to use a script because it does a different thing every time you press it, but it still feels like an extension of pressing the elevator itself to summon&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m hanging out with this frozen revenant.  Usually you call the elevator down, he appears and yells at you, and you shoot him in the face a lot.  Because sound can&amp;#8217;t be blocked &lt;em&gt;vertically&lt;/em&gt;, the dudes upstairs hear this and wake up.  They can only hear you if you&amp;#8217;re in the overlap area directly in front of the elevator, which makes sense if you don&amp;#8217;t think about it too hard, so I didn&amp;#8217;t bother fixing&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare52-hallway.jpg" class="photo" title="Hallway atop the elevator"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare52-hallway_m.jpg" alt="Hallway atop the elevator" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare53-left-room.jpg" class="photo" title="Left dead-end room with a crate"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare53-left-room_m.jpg" alt="Left dead-end room with a crate" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare54-right-room.jpg" class="photo" title="Right dead-end room"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare54-right-room_m.jpg" alt="Right dead-end room" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Two options, as usual.  The left is a dead end, but has a box of bullets in an open crate, which I like.  There&amp;#8217;s also a banister and some kind of pit?  What&amp;#8217;s going on there?  I&amp;#8217;m not&amp;nbsp;sure.&lt;/p&gt;
&lt;p&gt;The other room is kind of an empty square, but it has this really fancy light fixture in the center.  It&amp;#8217;s neat enough that it monopolizes the whole room and seems like a reason for the room to exist all on its own.  I&amp;#8217;m surprised how well it&amp;nbsp;works.&lt;/p&gt;
&lt;p&gt;It wouldn&amp;#8217;t be a modern Doom map without some bricks cut out of the floor, so here&amp;#8217;s that.  It&amp;#8217;s a silly trope, but I like it&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare55-library-hallway.jpg" class="photo" title="Library hallway"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare55-library-hallway_m.jpg" alt="Library hallway" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare56-library-lift.jpg" class="photo" title="Library lifts lowering"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare56-library-lift_m.jpg" alt="Library lifts lowering" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is just a hallway, but for some reason it&amp;#8217;s lined with&amp;nbsp;books.&lt;/p&gt;
&lt;p&gt;The books are really another fuck-you.  Everyone thinks the bookcase texture is a secret switch.  Everyone presses the bookcase texture.  So here you go: have a bunch of&amp;nbsp;imps.&lt;/p&gt;
&lt;p&gt;The first time someone else playtested this part was &lt;em&gt;right&lt;/em&gt; after I&amp;#8217;d added this hallway.  It had eight imps and no reward.  The result was unpleasant.  Now, it has the map.  A micro-library seemed a fitting place for&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;In order to make both bookcase lifts count as the same secret, they&amp;#8217;re actually part of the same discontinuous&amp;nbsp;sector.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare57-lamp-room.jpg" class="photo" title="Lamp room"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare57-lamp-room_m.jpg" alt="Lamp room" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare58-vent-entrance.jpg" class="photo" title="Vent entrance"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare58-vent-entrance_m.jpg" alt="Vent entrance" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This&lt;/em&gt; room is &lt;em&gt;great&lt;/em&gt;.  Yeah, yeah, the switch makes stairs come up — here&amp;#8217;s my second contribution to stair-building.  But look at that lighting!  It&amp;#8217;s&amp;nbsp;glorious.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare59-stucco1.jpg" class="photo" title="Stucco room 1"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare59-stucco1_m.jpg" alt="Stucco room 1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You follow the vents a bit, and you come out here.  In the vents are a secret soul sphere behind that electric panel texture, which is my favorite place to have secrets, to the point that I don&amp;#8217;t know why you would ever use that texture and not have a secret behind it.  You don&amp;#8217;t notice at the time, but the vents also cross over an alleyway, putting you in a different building here.  That&amp;#8217;s the second use of room-over-room, and you can see the third and final one in this screenshot: I made a tiny shelf for some&amp;nbsp;shells.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare60-stucco2.jpg" class="photo" title="Stucco room 2"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare60-stucco2_m.jpg" alt="Stucco room 2" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have slightly mixed feelings about these rooms.  I do like the very open and interconnected design; you have to move around a bit to get the full picture of what&amp;#8217;s going on.  I like the wooden stage at the back.  I like the stucco texture,&amp;nbsp;even.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m just not sure I know what this &lt;em&gt;is&lt;/em&gt;.  It&amp;#8217;s definitely something, which is good, but what that thing is eludes me.  I don&amp;#8217;t really feel like these rooms are missing anything — scattering pointless detailing around wouldn&amp;#8217;t improve them — they&amp;#8217;re just a bit&amp;nbsp;odd.&lt;/p&gt;
&lt;p&gt;I feel this way about both buildings, really.  I did rush them a bit, but also, they&amp;#8217;re vaguely-defined human structures; what else would go here besides what&amp;#8217;s already here?  They&amp;#8217;re a transitional area, full of right angles to distinguish them from the (un)natural shapes of Hell, yet otherwise indistinct.  You pass through them fairly quickly, with no real reason to linger.  If they&amp;#8217;re meant to evoke anything at all, it&amp;#8217;s exactly that sense of banality, as a stark contrast to where you&amp;#8217;ve just come&amp;nbsp;from.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve worried a bit that this whole building overstays its welcome, but it&amp;#8217;s all fairly small and straightforward.  The few side rooms are obvious dead ends, not major red herrings.  I don&amp;#8217;t know!  I&amp;#8217;m trying to reassure myself that I didn&amp;#8217;t jam a boring bit in the middle&amp;nbsp;here.&lt;/p&gt;
&lt;h2 id="hell-on-earth"&gt;&lt;a class="toclink" href="#hell-on-earth"&gt;Hell on&amp;nbsp;Earth&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare61-peek-outside.jpg" class="photo" title="Peek outside"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare61-peek-outside_m.jpg" alt="Peek outside" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finally you find some stairs that let you out to the ground floor, and you&amp;#8217;re greeted with this.  A portal with some dudes coming out of it.  Well, no matter, you&amp;#8217;ve seen this happen&amp;nbsp;before.&lt;/p&gt;
&lt;p&gt;Then you turn the&amp;nbsp;corner.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare62-hell-cathedral.jpg" class="photo" title="Hell Cathedral"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare62-hell-cathedral_m.jpg" alt="Hell Cathedral" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wasn&amp;#8217;t originally sure what would happen when you got back to the city.  There would have to be some monsters, of course, and&amp;#8230;  and what?  Now you go in some buildings?  Why couldn&amp;#8217;t you&amp;nbsp;before?&lt;/p&gt;
&lt;p&gt;Then my playtester commented that when you come back to the city, &lt;em&gt;Hell should come with you&lt;/em&gt;.  Of course!  The entire plot of Doom &lt;span class="caps"&gt;II&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;So I set about filling these &amp;#8220;buildings&amp;#8221; with tiny Hellscapes that would be revealed when you returned.  Yes, this is exactly the same city.  All of this stuff is here when you start the map.  It&amp;#8217;s just sealed behind a few walls textured to look like buildings, all of which drop away when the altar is&amp;nbsp;revealed.&lt;/p&gt;
&lt;p&gt;I really like that Hell Cathedral; it came out surprisingly well considering I had to cram it into a fairly small space and only had a few relevant textures at my disposal.  The towers are some of the only use of slopes in the&amp;nbsp;map.&lt;/p&gt;
&lt;p&gt;Those marble pillars out front could permanently trap you if you happened to fall between them and the steps.  Oops!  Thank goodness for&amp;nbsp;playtesters.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare63-baron-spire.jpg" class="photo" title="Baron spire"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare63-baron-spire_m.jpg" alt="Baron spire" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The exposed city acts more like a traditional city map.  There&amp;#8217;s somewhere you need to go to progress, but it&amp;#8217;s not immediately obvious, and there are a number of distractions in the&amp;nbsp;meantime.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s one of them.  You may be running a little low on ammo by now, so if you intend to kill all the critters now filling the streets, you&amp;#8217;ll need to find a bit more.  You can run up this spire for a pretty nice reward, but you&amp;#8217;ll have to deal with the baron &lt;em&gt;and&lt;/em&gt; the harmful floor &lt;em&gt;and&lt;/em&gt; the various things rushing towards you.  I like this kind of&amp;nbsp;risk/reward.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare64-burnt-chunk.jpg" class="photo" title="Chunk of a building burnt away"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare64-burnt-chunk_m.jpg" alt="Chunk of a building burnt away" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another use of slopes.  What exactly happened here?  I&amp;#8217;m not sure, but it looks interesting; it&amp;#8217;s vaguely reminiscent of the Terminator time bubbles that cut spheres out of nearby&amp;nbsp;objects.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a little ammo cache here, too, as a reward for exploring this furthest corner and braving some&amp;nbsp;revenants.&lt;/p&gt;
&lt;p&gt;The monsters don&amp;#8217;t actually walk through the portals this time — I wanted them fairly spread out, and choreographing them to walk to dozens of specific points would&amp;#8217;ve been incredibly tedious and completely invisible to the player.  Instead, they&amp;#8217;re arranged in a few off-screen alcoves roughly shaped like chunks of the pavement.  ZDoom has a &lt;code&gt;TeleportGroup&lt;/code&gt; special that can teleport a group of objects relative to a particular point, and this is a very straightforward use of it.  Each alcove has a teleporter thing inside it in the same relative spot as a portal, and when the altar is revealed, each group of monsters is teleported to around a portal in the same&amp;nbsp;configuration.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare65-lost-soul-spires.jpg" class="photo" title="Lost souls floating around some flesh spires"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare65-lost-soul-spires_m.jpg" alt="Lost souls floating around some flesh spires" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I love this shot.  It&amp;#8217;s kind of a shame that most players will never see it; as soon as the lost souls spot you, they&amp;#8217;ll start charging your&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;The only thing of interest in the flesh spires (which are harmless) is a switch in the back, which lowers the invulnerability sphere that&amp;#8217;s been visible since the beginning, if you cared to look back&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;I had a couple interesting bugs with that invulnerability pillar.  Originally, I had a green particle fountain on top of it to make the invulnerability sphere look all the fancier.  Unfortunately, particle fountains aren&amp;#8217;t affected by gravity, so when the pillar lowered, the particles stayed suspended in midair.&amp;nbsp;Whoops.&lt;/p&gt;
&lt;p&gt;The pillar sector was originally flagged as secret, but I found out that a player running over it at top speed might actually miss getting credit for the secret.  I &lt;em&gt;assume&lt;/em&gt; this is because the player&amp;#8217;s center was never actually within the sector.  Movement in games is usually done in discrete chunks: every given fraction of a second, the game multiplies your speed by that fraction of a second and moves you that far.  It&amp;#8217;s thus possible to be standing on one side of a small area and have such a high speed that you move onto the other side of the area without ever actually being inside it.  You still get the invulnerability sphere as long as your entire radius touches the radius of the sphere, which makes for a large margin of error, but I guess secret tracking only looks at the single point marking your&amp;nbsp;position.&lt;/p&gt;
&lt;p&gt;The easiest fix was to change this so the sphere itself is the secret, which is a ZDoom-specific feature.  It&amp;#8217;s even a new enough feature that Zandronum, the ZDoom fork given as the compatibility base for &lt;span class="caps"&gt;DUMP&lt;/span&gt; 2, doesn&amp;#8217;t support it.  Zandronum will just think there&amp;#8217;s one less total secret and not count the invulnerability sphere as being one.  This is the only Zandronum compatibility issue, as far as I&amp;#8217;m&amp;nbsp;aware.&lt;/p&gt;
&lt;p&gt;Oh, the hell knights had a curious bug.  I&amp;#8217;d been messing with another area that required a lot of careful vertical placement of objects, and then I came back to the city to add the hell knights.  Due to &lt;span class="caps"&gt;SLADE&lt;/span&gt;&amp;#8217;s somewhat obtuse handling of thing creation, the hell knights (and several other monsters) ended up inheriting a z height of 1536.  I discovered this when a playtester showed me a screenshot of a hell knight standing on the &lt;em&gt;wall&lt;/em&gt; around the city, which I can only imagine happened because a hell knight appeared in midair and then fell onto the wall&amp;#8230;&amp;nbsp;somehow.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare66-arachnotrons.jpg" class="photo" title="Arachnotrons lurking"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare66-arachnotrons_m.jpg" alt="Arachnotrons lurking" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wanted this section to &lt;em&gt;feel&lt;/em&gt; intense without actually being preposterously&amp;nbsp;difficult.&lt;/p&gt;
&lt;p&gt;Modders often like to make hard things.  Really hard things.  Mario Maker is a great testament to this.  It makes sense — modders are generally people who are already very familiar with the base gameplay, so they&amp;#8217;ll generally want more of a challenge and be capable of dealing with it.  On the other hand, too much of this can alienate potential new blood, who try to get into the community and smack face-first into a difficulty&amp;nbsp;wall.&lt;/p&gt;
&lt;p&gt;But also&amp;#8230;  making hard things is easy.  At the extreme end, it&amp;#8217;s trivial to make an impossible level in any game: just surround the player with walls.  Surround them with boss monsters to be only &lt;em&gt;mostly&lt;/em&gt; impossible.  Require someone to play exactly like you, or play extremely precisely, or not make any mistakes, and you have a level that&amp;#8217;s just frustrating&amp;nbsp;instead.&lt;/p&gt;
&lt;p&gt;Creating a challenge that has consistent moderate difficulty is actually pretty difficult!  You can tone down the enemies and give the player plenty of resources, but the really difficult part is finding all the accidental gotchas.  Maybe it&amp;#8217;s easy to take a rocket to the face here if you don&amp;#8217;t know it&amp;#8217;s coming; maybe you can fall into this inescapable pit; maybe a new player will struggle through the whole map because they didn&amp;#8217;t know where the good weapons are.  A few rounds of Mario Maker has humbled me considerably — every single level I&amp;#8217;ve made, even the ones that were explicitly intended to be pretty easy, has had some kind of clumsy oversight.  Just because other people don&amp;#8217;t play the same way I&amp;nbsp;do.&lt;/p&gt;
&lt;p&gt;I took yet another crack at that here.  Quite a few monsters spawn in the city, but there&amp;#8217;s plenty of room for dodging, several places to hide, and a lot of infighting potential.  Even these arachnotrons, a common sight in wide open spaces, spawn in this jagged street that hampers their offensive ability.  There&amp;#8217;s the invulnerability sphere, too, and it&amp;#8217;s surrounded only by low-level&amp;nbsp;zombies.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not sure yet how well this worked out, but so far the handful of people who&amp;#8217;ve played seem to have enjoyed&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare67-crate-room.jpg" class="photo" title="Revenant waiting in a crate room"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare67-crate-room_m.jpg" alt="Revenant waiting in a crate room" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is inside the black building seen on the right side in the previous screenshot.  The entrance is blocked off until Hell emerges — another detail that makes sense as long as you don&amp;#8217;t think about it too&amp;nbsp;hard.&lt;/p&gt;
&lt;p&gt;You come up a lift to see this revenant, with no obvious escape route; the lift doesn&amp;#8217;t go back down.  The crates are arranged to make navigation a little&amp;nbsp;awkward.&lt;/p&gt;
&lt;p&gt;This might be a bit mean.  It used to be meaner, though completely by accident.  I&amp;#8217;m still unsure about it, but I do &lt;em&gt;want&lt;/em&gt; it to be a little mean, just because there&amp;#8217;s so much stuff up here: a decent chunk of health, a fresh blue armor, and quite a bit of ammo.  Navigating a few surprise enemies in close and clumsy terrain is how you earn all&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare68-tiny-crates.jpg" class="photo" title="Tiny scattered crates"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare68-tiny-crates_m.jpg" alt="Tiny scattered crates" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I love this little pile of crates that fell over.  It also works as a staircase onto the large crate where those chaingunners are&amp;nbsp;standing.&lt;/p&gt;
&lt;p&gt;Not sure what happened to that front-most one; it seems to have lost its side textures somehow.  The clip is also a little clumsy; you have to carefully drop between the small crates to actually pick it&amp;nbsp;up.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare69-secret-switch.jpg" class="photo" title="Secret crate switch"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare69-secret-switch_m.jpg" alt="Secret crate switch" /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare70-crate-secret.jpg" class="photo" title="Secret behind the crates"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare70-crate-secret_m.jpg" alt="Secret behind the crates" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Behind the crate from which the others were knocked is this glaringly incongruous switch, which lowers a glaringly misaligned wall on the other side of the room.  If you charge through this room and immediately drop through the window the chaingunners are looking through, you&amp;#8217;ll probably miss the switch.  If you take just a moment to glance around, it&amp;#8217;s a bit hard to miss the bright blue texture in the middle of a sea of browns and&amp;nbsp;grays.&lt;/p&gt;
&lt;p&gt;This secret is a combination of a few factors.  I wanted to have a more clearly-telegraphed secret, after watching a playtester miss the megasphere &lt;em&gt;twice&lt;/em&gt;, even after going behind the portal and pressing on the (wrong) wall.  I wanted to have a significant reward for exploring this building, which is completely optional.  I wanted to have a low-pressure &amp;#8220;timed&amp;#8221; secret, where you had to find and enter an area in a short amount of time — though the window here is fairly generous, and it&amp;#8217;s easy enough to go press the switch again if you don&amp;#8217;t make it.  And finally, I just needed some way for the player to get out of the gap between those crates and the&amp;nbsp;wall.&lt;/p&gt;
&lt;p&gt;Only the middle sector is actually flagged as secret, so if you don&amp;#8217;t pick up the bulk cell, you might not get credit for this secret.  I originally had the outermost dark ring as the secret one, but then I watched someone run into the room at top speed, and they moved so quickly over the skinny ring that they didn&amp;#8217;t get credit (again)!  I figure pretty much everyone will grab that bulk&amp;nbsp;cell.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare71-city-cacodemons.jpg" class="photo" title="Cacodemons floating in the city"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare71-city-cacodemons_m.jpg" alt="Cacodemons floating in the city" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our old alleyway sure looks different&amp;nbsp;now!&lt;/p&gt;
&lt;p&gt;This is the only mid-air portal in the map, which honestly feels like a missed opportunity, but oh well.  You have to come running out of the &lt;em&gt;back&lt;/em&gt; of the portal to reach that alcove, which looks barren — but on the other side of the street (&lt;em&gt;through&lt;/em&gt; the portal) is a shootable switch that leads to another secret&amp;nbsp;stockpile.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare72-inside-cathedral.jpg" class="photo" title="Inside the cathedral"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare72-inside-cathedral_m.jpg" alt="Inside the cathedral" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I like everything about this shot.  The inverted cross, the altars, the bloodfalls, the &amp;#8220;congregation&amp;#8221; of imps.  I used the red skull &amp;#8220;lock&amp;#8221; texture as the door track on a whim; it seemed like the kind of bizarre thing Sandy might&amp;nbsp;do.&lt;/p&gt;
&lt;p&gt;The interior of the cathedral is one of the last areas I created.  I was originally going to make it another optional area, but it didn&amp;#8217;t sit right with me that if you knew exactly what you were doing, you could come out of the apartment buildings and skip the &lt;em&gt;entire city&lt;/em&gt; in about one second.  (You&amp;#8217;ll see how in a&amp;nbsp;moment.)&lt;/p&gt;
&lt;p&gt;I get the impression that modders also love railroading.  You might start to notice it if you play enough Mario Maker; you&amp;#8217;ll think you have a clever idea for getting around a small area, only to find that the author made a jump just barely too high or wide to&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t like that.  I especially don&amp;#8217;t like when it happens multiple times in the same level, or even the same area.  I like &lt;em&gt;exploring&lt;/em&gt; in games, and I value that delicate middle ground where I feel like I&amp;#8217;ve been clever but the designer rewards me for it anyway.  If it&amp;#8217;s glaringly obvious that the designer has slapped on multiple bandaids to force me to do this One Thing They Think Is Really Important, the illusion that I&amp;#8217;m exploring an incidental world is&amp;nbsp;ruined.&lt;/p&gt;
&lt;p&gt;On the other hand, if you can walk right past this &lt;em&gt;entire huge massive outdoor arena&lt;/em&gt; in about five steps, why did I bother building it in the first place?  I decided to compromise a bit and introduce the only key in the map.  You need it to progress, so you have to interact with the city a &lt;em&gt;little&lt;/em&gt;, but you ultimately don&amp;#8217;t have to go much further.  Those barons in the back are meant to encourage you to run around gathering resources before tackling this&amp;nbsp;room.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d originally intended not to use keys.  Now that I was going back on that, I wanted something a little grandiose for the key, but this cathedral is rather small.  Ah, good thing I have&amp;nbsp;portals.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare73-arch-priest.jpg" class="photo" title="Arch-vile priest arriving"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare73-arch-priest_m.jpg" alt="Arch-vile priest arriving" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When you walk forwards, a portal opens and this &amp;#8220;priest&amp;#8221; comes through.  There&amp;#8217;s not really any cover in this room, so if you&amp;#8217;re already hurting, you might be in for more&amp;nbsp;hurting.&lt;/p&gt;
&lt;p&gt;The cathedral door opens and closes pretty slowly, too&amp;#8230;  at least, on hard.  It opens much more quickly on easy, giving you more time to heel-turn and bolt out of the room.  I considered removing the arch-vile on easy, but decided against it because it serves a narrative purpose&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not a complete jerk, though.  There&amp;#8217;s one very quick, very conspicuous way to get out of the arch-vile&amp;#8217;s line of sight, a way I&amp;#8217;ve been trying to teach the player this entire time: just run through the&amp;nbsp;portal.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare74-pentagram.jpg" class="photo" title="Pentagram in a sea of lava"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare74-pentagram_m.jpg" alt="Pentagram in a sea of lava" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s my grandiose key grab.  It&amp;#8217;s ultimately pretty simple: haul ass over the lava and up the spiral stairs to get the&amp;nbsp;key.&lt;/p&gt;
&lt;p&gt;There are four revenants in all, and the only real cover is the spiral stairs themselves.  It happened to work out so that if you just run for it, you can get behind the stairs just before any of the rockets hit you, and then you can grab the key and run back without taking any damage.  Of course, if you&amp;#8217;re after 100% kills, this room might be a little difficult.  But again, you have the portal at your&amp;nbsp;disposal.&lt;/p&gt;
&lt;p&gt;If you look at the automap, you might notice that the four revenant towers and the key are arranged at the five points of a&amp;nbsp;pentagram.&lt;/p&gt;
&lt;p&gt;On medium difficulty, there are only two revenants.  On easy difficulty, there are four &lt;em&gt;imps&lt;/em&gt;&amp;nbsp;instead.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare75-portal-nexus.jpg" class="photo" title="Portal nexus"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare75-portal-nexus_m.jpg" alt="Portal nexus" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All of the portals in the city streets lead here.  I love this room.  I think of it as the focal point of the map.  It&amp;#8217;s almost a shame that it comes so&amp;nbsp;late.&lt;/p&gt;
&lt;p&gt;Again, this doesn&amp;#8217;t make too much sense if you think about it.  How did all those enemies fit in here?  The arachnotrons alone would fill the space.  I don&amp;#8217;t think of this room as a literal shape of the space, or even a space that could literally exist — it&amp;#8217;s a small slice of nowhere, floating in the void, that only exists because all of these portals happen to intersect&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;There are eight portals, eight pillars, and four different light sources to help you orient yourself.  I put a lot of effort into the textures and the lighting on the pillars, too.  At first I tried having the room literally float in the void — or at least, in an endless sea of lava beneath a hellish sky — but the impact of the portals is much more powerful with darkness behind&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;Seven of the portals lead back into the city.  They&amp;#8217;re arranged in &lt;em&gt;roughly&lt;/em&gt; the same order in this nexus as in the city, mostly because I placed the city portals clockwise around the perimeter.  One portal, to the left of that white tech lamp, leads somewhere new.  That&amp;#8217;s why I felt the need to add the red key: if you knew the map, all you had to do after leaving the apartment building was charge directly into the nearby portal to get to the nexus, then take the only portal that doesn&amp;#8217;t lead back to the&amp;nbsp;city.&lt;/p&gt;
&lt;h2 id="techbase"&gt;&lt;a class="toclink" href="#techbase"&gt;Techbase&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare76-blast-door.jpg" class="photo" title="Blast door through one of the portals"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare76-blast-door_m.jpg" alt="Blast door through one of the portals" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is the home stretch.  You need the red key to open that blast&amp;nbsp;door.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s another secret behind the portal you arrive through, the third or fourth such secret.  Unfortunately, the hallway bulges around the portal, and you can walk right around it.  I added the bulge after someone managed to get themselves stuck in the wall after walking through the very edge of the portal, but I guess I overdid it!  I&amp;#8217;ll fix that before the final &lt;span class="caps"&gt;DUMP&lt;/span&gt;&amp;nbsp;release.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare77-techbase.jpg" class="photo" title="Techbase "&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare77-techbase_m.jpg" alt="Techbase " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This area, and in particular this shot, is the weakest of the map by far.  It&amp;#8217;s pretty gray and barren and indistinct.  I might spruce it up a bit in the next couple&amp;nbsp;days.&lt;/p&gt;
&lt;p&gt;More important is what this does to the story.  You&amp;#8217;ve been passing through portals that connect Hell to a (now corrupted) city.  The portals have always been opened from the Hell side, suggesting an invasion on their&amp;nbsp;part.&lt;/p&gt;
&lt;p&gt;But now, what&amp;#8217;s this?  One of them connects to this distant &lt;span class="caps"&gt;UAC&lt;/span&gt; base.  Does this mean that the &lt;span class="caps"&gt;UAC&lt;/span&gt; is the original source of the portals, or that Hell is invading the base at the same time?  I guess that&amp;#8217;s up to&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;One of the Doom Mixtape videos mentions that almost every Doom megawad follows the same progression as Doom &lt;span class="caps"&gt;II&lt;/span&gt; — techbase, city, Hell — and that &lt;em&gt;reversing&lt;/em&gt; that progression is much more interesting.  I&amp;#8217;ve basically done that here.  You do start in the city, but it&amp;#8217;s only a brief jaunt until you reach Hell.  Alas, the reason the reverse progression is interesting is that it means the Hell levels are smaller and simpler whereas the techbase levels are large and sprawling, and I haven&amp;#8217;t done that at all!  This techbase area is fairly short and&amp;nbsp;straightforward.&lt;/p&gt;
&lt;p&gt;You may notice another use of 3D floors to make a hallway that passes under a platform.  I watched some Let&amp;#8217;s Plays of the original Quake some time ago, keeping an eye out specifically for where true 3D made the level design more interesting, and this kind of small opening beneath a larger platform was one of the biggest things that stood out to&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare78-right-techbase.jpg" class="photo" title="Right back side of the techbase"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare78-right-techbase_m.jpg" alt="Right back side of the techbase" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is down the hallway and to the right.  I put a little last-minute effort into decorating this area.  It looks okay, but it&amp;#8217;s a shame that most of the detail isn&amp;#8217;t actually visible from the hallway that leads here.&amp;nbsp;Oops.&lt;/p&gt;
&lt;p&gt;Decorating tech areas is surprisingly difficult.  Stock Doom only has a handful of computer textures, and there are only so many times you can stick a recessed screen in the wall before it gets old.  I slapped both some computers and some recessed screens here, and then I ran out of&amp;nbsp;ideas.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare79-base-lift.jpg" class="photo" title="Lift to the top of the techbase"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare79-base-lift_m.jpg" alt="Lift to the top of the techbase" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I like lifts with sides that aren&amp;#8217;t solid textures, suggesting the presence of an actual mechanism that raises or lowers the lift.  I think I later changed these support struts to something more&amp;nbsp;technical.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare80-base-switch.jpg" class="photo" title="Switch in the upper part of the techbase"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare80-base-switch_m.jpg" alt="Switch in the upper part of the techbase" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This switch reveals a teleporter alcove on the other side of the room.  I added the lowering struts after someone reported being confused about what the switch &lt;em&gt;did&lt;/em&gt;.  Not only do the lowering struts mirror the way the teleporter alcove opens, but you can actually see the teleporter from&amp;nbsp;here.&lt;/p&gt;
&lt;h2 id="endgame"&gt;&lt;a class="toclink" href="#endgame"&gt;Endgame&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare81-penultimate-area.jpg" class="photo" title="Penultimate area"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare81-penultimate-area_m.jpg" alt="Penultimate area" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s where the teleporter leads.  This room might actually be more interesting than the previous one — it&amp;#8217;s simple, but it also serves a very simple purpose, so it doesn&amp;#8217;t need to be too&amp;nbsp;fancy.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare82-portal-platform.jpg" class="photo" title="Portal platform"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare82-portal-platform_m.jpg" alt="Portal platform" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On the other side of those computers are two switches and an extremely fancy glowing platform.  You can press the switches in either order — ooh, nonlinearity!  The first causes a small quake and extends some struts from the floor; the second causes a much larger quake and opens a penultimate&amp;nbsp;portal.&lt;/p&gt;
&lt;p&gt;I originally wanted the first switch to also activate the fancy light effect, but I couldn&amp;#8217;t make that work.  I might be missing something, but it seems as though you can&amp;#8217;t change a sector to start using one of the built-in lighting effects during runtime.  The only alternative is to recreate the lighting effect entirely with scripting, which I didn&amp;#8217;t really want to&amp;nbsp;do.&lt;/p&gt;
&lt;p&gt;I even more originally wanted the finale to more conclusively blame the &lt;span class="caps"&gt;UAC&lt;/span&gt; for the portals and ask the player to shut down a portal generator.  I didn&amp;#8217;t even begin to build it before I realized a number of problems: pressing a switch isn&amp;#8217;t very dramatic, telegraphing what the player had actually done would be tricky, and I would have to either make the switch the exit (which obscures its narrative function) or have the exit be something else you do afterwards (which is clumsy).  This approach is a lot more satisfying, both in its adherence to the portal theme and its adherence to&amp;nbsp;Doom.&lt;/p&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare83-invasion1.jpg" class="photo" title="Invasion "&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare83-invasion1_m.jpg" alt="Invasion " /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare84-invasion2.jpg" class="photo" title="Invasion! "&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare84-invasion2_m.jpg" alt="Invasion! " /&gt;&lt;/a&gt;
&lt;a href="/media/2016-03-31-throughfare/throughfare85-invasion3.jpg" class="photo" title="Invasion!!! "&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare85-invasion3_m.jpg" alt="Invasion!!! " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The&amp;nbsp;finale!&lt;/p&gt;
&lt;p&gt;My first crack at this just had a cyberdemon come through the portal.  It felt a little anticlimactic to me, building this huge room only for a single enemy to emerge, but I didn&amp;#8217;t have any better&amp;nbsp;ideas.&lt;/p&gt;
&lt;p&gt;Then someone played through the map and actually &lt;em&gt;complained&lt;/em&gt; that they&amp;#8217;d found so many secrets and accumulated so much ammo that &amp;#8220;only&amp;#8221; fighting one cyberdemon at the end was a bit of a letdown.  I&amp;#8217;m armed to the teeth; where&amp;#8217;s the cannon&amp;nbsp;fodder?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;That&lt;/em&gt; gave me a great idea.  The ending is now dependent on the difficulty &lt;em&gt;and&lt;/em&gt; how many secrets you found.  You get an initial &amp;#8220;score&amp;#8221; from 0 to 40 depending on your secret rate; there are 13 secrets, so about 3 points per secret.  If you&amp;#8217;re playing on medium, you get an extra 30 points; if you&amp;#8217;re playing on hard, you get an extra 60 points.  The maximum possible score is then 100, if you play on &lt;span class="caps"&gt;UV&lt;/span&gt; and manage to find&amp;nbsp;everything.&lt;/p&gt;
&lt;p&gt;Then, for each 41 points, you get a cyberdemon.  For each 7 points after that, you get a baron.  For every point remaining, you get five imps.  And everyone gets ten extra imps just for&amp;nbsp;playing.&lt;/p&gt;
&lt;p&gt;The result is a small army charging through this portal after you, but roughly scaled to match how good you are at the game and how many resources you should have left.  In case of emergency, there&amp;#8217;s a little more ammo sprinkled around this room, but I really wanted you to be able to deal with the onslaught with whatever you had on&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;I love coming up with goofy ad-hoc algorithms like that, by the way.  It&amp;#8217;s a straightforward problem, but the requirements are completely arbitrary, so the algorithm can be equally arbitrary.  I chose odd numbers like 41 and 7 so that they wouldn&amp;#8217;t divide evenly into each other and create predictable behavior or obvious discontinuities in difficulty.  41 in particular was chosen because it ensures that someone playing on easy will &lt;em&gt;never&lt;/em&gt; get a cyberdemon — the maximum possible score on easy is 40.  On the other hand, someone playing on medium will get a cyberdemon just from finding a couple secrets, and someone playing on hard will always get at least one cyberdemon, and possibly&amp;nbsp;two.&lt;/p&gt;
&lt;p&gt;The most spectacular part by far is the imp horde.  If you&amp;#8217;ve found any secrets at all, you&amp;#8217;ll probably get a couple dozen imps, and they just keep popping out one after the other.  If you don&amp;#8217;t start killing them immediately, they seem to fill the room — but they&amp;#8217;re still relatively low-level monsters and not a serious threat.  I really love the effect of having a seemingly-endless army pour into the room from some&amp;nbsp;elsewhere.&lt;/p&gt;
&lt;p&gt;I did break my own rule here.  The monsters are actually spawned, rather than being nudged through the portal from the other side.  (I still give them a nudge and play the portal sound, so the difference is very hard to notice.)  The number of monsters varies depending on your own actions, so they &lt;em&gt;have&lt;/em&gt; to be spawned.  That does mean the monster count is inaccurate, but since these are the last monsters of the map, I think it&amp;#8217;s&amp;nbsp;excusable.&lt;/p&gt;
&lt;p&gt;The first release candidate of this map had a hilarious bug.  See, the Doom engine mostly handles fractional values with &amp;#8220;fixed-point&amp;#8221; numbers, which are integers that have a fixed number of digits reserved for the fractional part.  Currency is a good example: we write $1.25, but what we really mean is 125 cents.  It&amp;#8217;s an integer with two decimal digits reserved for the fractional part.  Doom&amp;#8217;s fixed-point is similar — it uses 32-bit integers, with 16 of those bits reserved for the fractional part.  &lt;code&gt;1.0&lt;/code&gt; is thus represented as &lt;code&gt;65536&lt;/code&gt; (which is&amp;nbsp;2¹⁶).&lt;/p&gt;
&lt;p&gt;Fixed-point isn&amp;#8217;t built into very many programming languages, so the Doom source code has to have its own functions for handling arithmetic correctly.  Unfortunately, the scripting language inherited this fault, and is possibly &lt;em&gt;worse&lt;/em&gt; about it — it only understands integers, and can&amp;#8217;t distinguish between real integers and fixed-point values.  All of this is to say that I did this to scale the proportion of secrets found to a score out of&amp;nbsp;40:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;int difficulty = FixedDiv(found * 1.0, total * 1.0) * 40;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Seems reasonable enough.  I want to divide the number of secrets found by the total number of secrets, but if I do it directly, it&amp;#8217;ll just truncate to 0.  So I multiply both values by &lt;code&gt;1.0&lt;/code&gt; to make them fixed-point (the scripting language does understand that literal numbers with decimal points are fixed-points), then I use the &lt;code&gt;FixedDiv&lt;/code&gt; function to perform a fixed-point division.  Multiply by &lt;code&gt;40&lt;/code&gt;, and you have a score out of 40,&amp;nbsp;right?&lt;/p&gt;
&lt;p&gt;No, actually you have a score out of &lt;code&gt;40.0&lt;/code&gt;, because I never converted the result back to a regular integer.  If you find one out of thirteen secrets, that&amp;#8217;s &lt;code&gt;1.0 / 13.0&lt;/code&gt; or &lt;code&gt;0.076923&lt;/code&gt;, times &lt;code&gt;40&lt;/code&gt; is &lt;code&gt;3.076923&lt;/code&gt;.  But remember, that&amp;#8217;s really an integer being &lt;em&gt;treated&lt;/em&gt; like it has decimal places, and the language can&amp;#8217;t tell the difference.  You have to multiply by 65536 to figure out the true value, which is &lt;code&gt;201649&lt;/code&gt;.  And that&amp;#8217;s your &amp;#8220;score&amp;#8221; for the finale.  Divide by 41, and you will see that every secret you discover will cause an extra 4918 cyberdemons to be spawned in the ending.&amp;nbsp;Oops!&lt;/p&gt;
&lt;p&gt;I never noticed this because in my efforts to test the behavior of finding all secrets versus finding no secrets (without having to replay the entire map many times), I temporarily added a line like &lt;code&gt;difficulty = 0;&lt;/code&gt; or &lt;code&gt;difficulty = 40;&lt;/code&gt;.  That replaced the bad result of the division and hid the bug.  Double&amp;nbsp;oops!&lt;/p&gt;
&lt;p&gt;The fix was pretty easy.  I want an integer in the end, so I don&amp;#8217;t really need fixed-point numbers at all.  If I do the division last, there&amp;#8217;s no intermediate result less than 1 to be rounded into&amp;nbsp;oblivion.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;int difficulty = 40 * found / total;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Fixed.  Alas, this fix didn&amp;#8217;t make it into the first test release of &lt;span class="caps"&gt;DUMP&lt;/span&gt; 2, so a few people had a fun&amp;nbsp;surprise.&lt;/p&gt;
&lt;p&gt;Of course, even if you do find yourself facing down dozens of cyberdemons, there&amp;#8217;s always one final tactic that you really should have picked up on after all the time you&amp;#8217;ve spent in the&amp;nbsp;map.&lt;/p&gt;
&lt;p&gt;You can ignore all the monsters and run through the back of the&amp;nbsp;portal.&lt;/p&gt;
&lt;h2 id="xen"&gt;&lt;a class="toclink" href="#xen"&gt;Xen&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/media/2016-03-31-throughfare/throughfare86-xen.jpg" class="photo" title="Platforms floating in the void"&gt;&lt;img src="/media/2016-03-31-throughfare/throughfare86-xen_m.jpg" alt="Platforms floating in the void" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not &lt;em&gt;really&lt;/em&gt; Xen, though it bears a certain&amp;nbsp;resemblence.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know where or what this is.  I wanted a denouement, a calm ending that whisks you away from these shattered spaces to whatever the next map is.  I&amp;#8217;m a huge fan of stuff floating in the void, so I made some stuff floating in the&amp;nbsp;void.&lt;/p&gt;
&lt;p&gt;I interpret this as being &amp;#8220;outside&amp;#8221;, whatever you might take that to mean.  You&amp;#8217;ve traversed so many portals and come so far that you&amp;#8217;re well beyond Earth or Hell any more.  You&amp;#8217;re just out here with some debris.&amp;nbsp;Nowhere.&lt;/p&gt;
&lt;p&gt;There are no enemies here.  No threats of any kind.  Ths space exists purely for the atmosphere, so the platforming is as easy as I could make it — running straight from one platform to the next generally works, gravity has been reduced drastically, and missing a jump will quietly teleport you back to the first&amp;nbsp;platform.&lt;/p&gt;
&lt;p&gt;Touching that last massive portal will end the&amp;nbsp;level.&lt;/p&gt;
&lt;h2 id="closing-thoughts"&gt;&lt;a class="toclink" href="#closing-thoughts"&gt;Closing&amp;nbsp;thoughts&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m amazed I managed to build this in a&amp;nbsp;week.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also not without regrets!  I didn&amp;#8217;t make very effective use of lighting; there&amp;#8217;s some, but it could be much improved.  Hell is pretty nicely-realized, but the human areas (especially the base) tend a bit drab and bland; towards the end, I just completely ran out of ideas for what to sprinkle in them.  Some of the details I &lt;em&gt;do&lt;/em&gt; have are cliché and obvious; I&amp;#8217;m much happier with the oddball touches like the &amp;#8220;stage&amp;#8221; in the stucco building and the bizarre whole-room light fixture in the apartments.  Despite the resounding advice of &amp;#8220;take inspiration from real places&amp;#8221;, I did the best work when I managed to &lt;em&gt;stop&lt;/em&gt; worrying about real places and just build&amp;nbsp;stuff.&lt;/p&gt;
&lt;p&gt;After I made the map, I learned about ZDoom&amp;#8217;s &lt;a href="http://zdoom.org/wiki/Classes:SoundEnvironment"&gt;sound environments&lt;/a&gt;, which add reverb to an area of the map.  A couple other maps in &lt;span class="caps"&gt;DUMP&lt;/span&gt; 2 use them, and the effect is really quite impressive.  I wish I&amp;#8217;d known before, but maybe I can find time to insert some before the project&amp;nbsp;ends.&lt;/p&gt;
&lt;p&gt;I have a map set vaguely in progress that I work on from time to time, and I&amp;#8217;ll adapt this to fit in there.  One down, 31 to&amp;nbsp;go!&lt;/p&gt;</content><category term="release"></category><category term="doom"></category><category term="gamedev"></category><category term="tech"></category></entry><entry><title>Mario Maker: …</title><link href="https://eev.ee/release/2016/03/08/mario-maker-dot-dot-dot/" rel="alternate"></link><published>2016-03-08T19:29:00-08:00</published><updated>2016-03-08T19:29:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2016-03-08:/release/2016/03/08/mario-maker-dot-dot-dot/</id><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="/dev/media/mario-maker/dotdotdot.jpg"&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://supermariomakerbookmark.nintendo.net/courses/14DC-0000-01ED-C104"&gt;&lt;code&gt;14DC-0000-01ED-C104&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Difficulty&lt;/strong&gt;: fairly easy&lt;br /&gt;
&lt;strong&gt;Quality&lt;/strong&gt;: ★★★★★&lt;br /&gt;
&lt;strong&gt;Secrets&lt;/strong&gt;:&amp;nbsp;—&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;I removed the music and only used monochrome obstacles, with very few actual enemies.  No pickups, no secrets.  It&amp;#8217;s short, linear, pretty easy, entirely&amp;nbsp;thematic.&lt;/p&gt;
&lt;p&gt;The result is&amp;nbsp;interesting.&lt;/p&gt;</content><category term="release"></category><category term="mario maker"></category></entry><entry><title>Mario Maker: The Works</title><link href="https://eev.ee/release/2016/01/17/mario-maker-the-works/" rel="alternate"></link><published>2016-01-17T12:13:00-08:00</published><updated>2016-01-17T12:13:00-08:00</updated><author><name>Eevee</name></author><id>tag:eev.ee,2016-01-17:/release/2016/01/17/mario-maker-the-works/</id><content type="html">&lt;div class="prose-full-illustration"&gt;
&lt;img src="/dev/media/mario-maker/the-works.jpg"&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://supermariomakerbookmark.nintendo.net/courses/ACD6-0000-0198-668D"&gt;&lt;code&gt;ACD6-0000-0198-668D&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Difficulty&lt;/strong&gt;: fairly easy&lt;br /&gt;
&lt;strong&gt;Quality&lt;/strong&gt;: ★★★★★&lt;br /&gt;
&lt;strong&gt;Secrets&lt;/strong&gt;:&amp;nbsp;🍄🍄🍄🍄🍄🍄&lt;/p&gt;
&lt;p&gt;This is great.  I put a lot of effort into polishing it.  I even set it aside for a while because I wasn&amp;#8217;t happy with it, then came back and fixed&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s fairly long, but doesn&amp;#8217;t have any particularly tricky parts.  Pretty atmospheric, I hope.  Not all of the 1-ups are hidden, and not all of the hidden details are&amp;nbsp;1-ups.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t even want to say anything more about it; I feel like I&amp;#8217;ll ruin it.  Just play&amp;nbsp;it.&lt;/p&gt;</content><category term="release"></category><category term="mario maker"></category></entry></feed>