&lt;?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Half-Bit Software</title><link href="https://halfbitsoftware.com/atom.xml" rel="self"/><link href="https://halfbitsoftware.com/"/><id>https://halfbitsoftware.com/</id><updated>2020-08-26T17:50:04-07:00</updated><author><name>Jim Truher</name></author><entry><title type="html">MediaPlayer Framework 1</title><link href="https://halfbitsoftware.com/blog/2020/08/26/mediaplayer-framework-1/"/><id>https://halfbitsoftware.com/blog/2020/08/26/mediaplayer-framework-1/</id><updated>2020-08-26T17:50:04-07:00</updated><published>2020-08-26T17:50:04-07:00</published><content type="html">&amp;lt;p&amp;gt;I’ve been working with the MediaPlayer framework for the last couple of years, bumping my shins into its rough corners early and often. I file radars for what I find, but it always feels like shouting into the void, so I figured I might as well double-dip and write stuff over here, too!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;On today’s exciting episode: the delightful &amp;lt;code&amp;gt;setQueueWithItemCollection:&amp;lt;/code&amp;gt; method, and how it does something I really didn’t expect.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;To make your iOS device play a song in its music library, an &amp;lt;code&amp;gt;MPMusicPlayerController&amp;lt;/code&amp;gt; needs to be given some songs. There’re a few different ways to do this, but the one I just mentioned is our huckleberry for today. That method accepts an &amp;lt;code&amp;gt;MPMediaItemCollection&amp;lt;/code&amp;gt;, which is - for our purposes - basically just an array of &amp;lt;code&amp;gt;MPMediaItem&amp;lt;/code&amp;gt; objects.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;In &amp;lt;a href=&amp;#34;https://apps.apple.com/us/app/myoosic/id1460547592&amp;#34;&amp;gt;Myoosic&amp;lt;/a&amp;gt;, I even (basically) do this:&amp;lt;/p&amp;gt;
&amp;lt;div class=&amp;#34;highlight&amp;#34;&amp;gt;&amp;lt;pre tabindex=&amp;#34;0&amp;#34; class=&amp;#34;chroma&amp;#34;&amp;gt;&amp;lt;code class=&amp;#34;language-objectivec&amp;#34; data-lang=&amp;#34;objectivec&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;line&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;cl&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;-&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;kt&amp;#34;&amp;gt;void&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;nf&amp;#34;&amp;gt;setQueue:&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;NSArray&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;o&amp;#34;&amp;gt;&amp;amp;lt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;MPMediaItem&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;o&amp;#34;&amp;gt;*&amp;amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;nv&amp;#34;&amp;gt;items&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;{&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;line&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;cl&amp;#34;&amp;gt; &amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;MPMediaItemCollection&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;o&amp;#34;&amp;gt;*&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;c&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;o&amp;#34;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;MPMediaItemCollection&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;nl&amp;#34;&amp;gt;collectionWithItems&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;items&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;];&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;line&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;cl&amp;#34;&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;line&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;cl&amp;#34;&amp;gt; &amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;nb&amp;#34;&amp;gt;self&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;player&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;#34;nl&amp;#34;&amp;gt;setQueueWithItemCollection&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;n&amp;#34;&amp;gt;c&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;];&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#34;line&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;cl&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;p&amp;#34;&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;p&amp;gt;Here’s the bit that tripped me up today: what happens if that array is empty? After all, my &amp;lt;code&amp;gt;setQueue:&amp;lt;/code&amp;gt; method just takes an array - that array could very well be empty.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Well, what happens is hilarious and not at all what I expected: calling &amp;lt;code&amp;gt;setQueueWithItemCollection:&amp;lt;/code&amp;gt; with an empty collection will queue every song available in your library!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I don&amp;amp;rsquo;t know if this is what you&amp;amp;rsquo;d expect, but it certainly tripped me up. It&amp;amp;rsquo;s easy enough to guard against an empty &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; array, but it seems strange that I&amp;amp;rsquo;d need to.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">XCBarnacle</title><link href="https://halfbitsoftware.com/blog/2020/07/24/xcbarnacle/"/><id>https://halfbitsoftware.com/blog/2020/07/24/xcbarnacle/</id><updated>2020-07-24T12:00:00-07:00</updated><published>2020-07-24T12:00:00-07:00</published><content type="html">&amp;lt;p&amp;gt;I&amp;amp;rsquo;ve had an itch for awhile to write a little helper tool for managing which Xcode is currently, well, selected. It seemed like a good idea, even before I&amp;amp;rsquo;d been bit a few times by an annoying bug involving bad environment state, but felt pretty obligatory once a dev friend of mine started yelling at me with similar complaints.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;So, naturally, I decided to build one. I&amp;amp;rsquo;m mostly pretty happy with it, it&amp;amp;rsquo;s already saved my bacon a few times, and it&amp;amp;rsquo;s free. I&amp;amp;rsquo;m not sure I could pass app store review, and I don&amp;amp;rsquo;t even know that I want to bother, so for now, it&amp;amp;rsquo;s hosted here, on itch.io:&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;#34;http://jtruher.itch.io/xcbarnacle&amp;#34;&amp;gt;XCBarnacle&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Octopath Traveler 1</title><link href="https://halfbitsoftware.com/blog/2018/09/06/octopath-traveler-1/"/><id>https://halfbitsoftware.com/blog/2018/09/06/octopath-traveler-1/</id><updated>2018-09-06T15:01:00-07:00</updated><published>2018-09-06T15:01:00-07:00</published><content type="html">&amp;lt;p&amp;gt;One of my favorite silliest parts of this game revolves around Olberic, a brave knight. Each playable character has their own way of interacting with the world around them. The nice priest lady can guide people through life, the trader can buy stuff off of people, and the knight -&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Well. The knight can walk up to random fools, challenge them to a duel, and beat the everloving shit out of them.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It’s maybe one of my favorite mechanics in this game, particularly with how I’ve got him configured. You can mix and match what subclasses characters get, and I’ve thrown Thief at him.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Thief is a little broken in single-target. You can steal health and energy, which is already broken, but you do it with this fast little double-jab.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The bravest knight in the land is running around, challenging people to duels, then running up and stabbing them repeatedly.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I don’t think this is a great game, but I’m having a lot of fun playing it for silly shit like this.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Also, the music is really pretty great!&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">The World is Alive - Summer Slow Jam</title><link href="https://halfbitsoftware.com/blog/2018/06/30/the-world-is-alive-summer-slow-jam/"/><id>https://halfbitsoftware.com/blog/2018/06/30/the-world-is-alive-summer-slow-jam/</id><updated>2018-06-30T12:54:00-07:00</updated><published>2018-06-30T12:54:00-07:00</published><content type="html">&amp;lt;p&amp;gt;This isn’t exactly a postmortem, because most jam games feel kind of unfinished. (At least, mine usually feel that way to me.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;So when this jam was first announced back in early June, I got pretty stoked. The technical theme - I tend to do better at those - was Minigames, which seemed great! My mind jumped first to the kind of dinky little silly-ass Warioware games, with just ridiculous hooks and gimmicks and 4 or 5 seconds of gameplay per screen.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Which is why I got to work on all of that, basically. I got a whole system up and running where I could flip between a bunch of these minigames at random, got basically done with a high score logging webservice (that I honestly thought would be cool if everyone could register/post to), then had a week or two off before the creative theme was announced.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Once the theme (The World is Alive) was announced, I pretty much ignored everything I’d built so far.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I mean, sure, I could’ve shoehorned it into what I’d built, but it didn’t seem right, and I’m not sure I can articulate why. Doing something more specific seemed like a good idea, and I had a handful of things I wanted to try.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I always manage to get to games late, and I’d just picked up Hollow Knight, so doing something a little bit spookier and more atmospheric sounded like a fun idea. Unfortunately, this inspiration didn’t really strike me upside the head until, oh, Monday or Tuesday, so losing that first weekend’s worth of progress was kind of a bummer.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;That said, I’m still pretty happy with how things turned out. I dragged over a lot of the stuff from Slower than Light, like the lighting and the little hover/highlight text, but ended up with something (I hope) that makes a little bit more sense. It’s a pretty straightforward little mini-metroidvania, minus the combat, which - if I had another couple of weeks - I might almost consider adding.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It’s a little tough to know what to do with it. Fighting and combat and conflict are pretty common in games, but this feels more like a mellow thing. There’s no real way to die in it, which I like, but there’s also not much in the way of real challenge. Navigating the world is pretty straightforward, so that’s probably the first place I’d look.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The story, such as it is, is a little thin on the ground, too. If I was gonna keep going, I’d try to refine the hell out of that, since I think there’s a lot of redundancy and what is there isn’t necessarily very clear. It’s fine if things aren’t obvious at first glance, but I’m not sure that players would come up with the conclusions I’d intend. (Sometimes that’s okay, and sometimes it’s just bad/sloppy writing.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Overall, I’m still pretty happy with it. It’s fun tinkering, and I still really like making gloomy little games.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Summer Slow Jam 2018 Prep</title><link href="https://halfbitsoftware.com/blog/2018/06/03/summer-slow-jam-2018-prep/"/><id>https://halfbitsoftware.com/blog/2018/06/03/summer-slow-jam-2018-prep/</id><updated>2018-06-03T10:02:00-07:00</updated><published>2018-06-03T10:02:00-07:00</published><content type="html">&amp;lt;p&amp;gt;I’ve been doing the occasional game jam for awhile now. They’re fun! It’s nice to throw yourself at something for a short amount of time just to see if anything good comes of it - more often than not, it’s totally worth the minor time investment. One thing that’s been a little annoying, though, comes down to infrastructure.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;There’s a few different types of infrastructure, too, and maybe that’s a weird way to put it, but it’s the term I’m gonna use, so whatever! The tools, code, art, assets you’ve built up over time all count as infrastructure, but what I mean here is a literal kind of infrastructure.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I’m going to back up just a little. Eight years ago, Apple released Game Center, an iOS and MacOS service for high scores, matchmaking, online social stuff, the works. It was exclusive to those two platforms and better than nothing, but had some warts and rough edges. It also had a ton of green felt, which wasn’t great.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;(As an aside, and particularly with Apple, be careful about using their technologies and frameworks if they’re not dogfooding it themselves. How many games do they ship? Zero? Yikes.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Back to infrastructure, though: Game Center was good enough for leaderboards, even if there were authentication challenges around valid high scores. Trolling online scoreboards is a tough problem to solve at scale, but that’s not the point of this!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;No, the point of this is that, for the Pigsquad Summer Slow Jams, I’m finally getting around to building my own online infrastructure.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Hold for applause.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It’s actually been kind of fun and interesting getting back into the online/server-y world. I’m picking up Rails again for some dumb friggin’ reason. It’s stuff I know sorta well, including all the warts, and the landscape has changed an awful lot since I stopped actively working with it ~7 years ago. I mean, shit, Docker didn’t exist back then, mongrel was still the hottest shit (thanks, Zed Shaw!) and nobody was really grown up enough to know what they were doing.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It was total cowboy country, but it was kind of fun, in a way.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Thankfully, the scope is pretty limited here. I figured, with the first technical theme being ‘minigames’, an arcade-y cabinet with a handful of Warioware-style games that can post scores to a web service would be pretty cool for seeing who does best. And if I get this thing working and chugging well enough, who’s to say I wouldn’t ask other people to try banging on it, too?&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Infrastructure is fun.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">On That MacBook Pro Keyboard</title><link href="https://halfbitsoftware.com/blog/2018/04/26/on-that-macbook-pro-keyboard/"/><id>https://halfbitsoftware.com/blog/2018/04/26/on-that-macbook-pro-keyboard/</id><updated>2018-04-26T10:53:00-07:00</updated><published>2018-04-26T10:53:00-07:00</published><content type="html">&amp;lt;p&amp;gt;&amp;lt;a href=&amp;#34;https://theoutline.com/post/4277/dont-buy-the-new-macbook-pros-even-on-sale-in-my-opinion?zd=1&amp;amp;amp;zi=56xsnavs&amp;#34;&amp;gt;Don’t buy the MacBook Pros even on sale, in my opinion | The Outline&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;So, that doesn’t seem great, does it? I really, really want to like that keyboard, I promise. I like the clicky feel of it, short-throw keys are my jam, I could even get used to the narrower gaps between keys.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;(Don’t get me started on the inverted-T.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;But the reliability issues are maddening - key’s that would double fire, or not fire at all, or only fire at a particular angle or from a particular spot. C’mon, that’s no way for a computer to be.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;So, like Casey Johnston, I sold my 2016 MacBook Pro and threw that money at an iMac Pro. So far? It’s &amp;lt;a href=&amp;#34;https://twitter.com/jtruher/status/989326545381543936&amp;#34;&amp;gt;completely knocking my socks off.&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Breath of the Wild, Escalation, and You</title><link href="https://halfbitsoftware.com/blog/2018/04/24/breath-of-the-wild-escalation-and-you/"/><id>https://halfbitsoftware.com/blog/2018/04/24/breath-of-the-wild-escalation-and-you/</id><updated>2018-04-24T16:42:00-07:00</updated><published>2018-04-24T16:42:00-07:00</published><content type="html">&amp;lt;p&amp;gt;I’m going to start this tiny bit of controversy with a warning: don’t @ me. You know what that means, so don’t. I liked the game just fine, don’t hassle me about any of this. Your efforts are better spent elsewhere.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Okay. So. Breath of the Wild was pretty great. I’ve put hundreds of hours into it and I’m still finding new stuff in it - little groves of trees, koroks (naturally), characters just hiding out in the middle of friggin’ nowhere.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It’s big, and it’s mellow, and it’s a world that I find fascinating.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;My problem, if that’s even the right word for it, is this: artificial escalation.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Remember Oblivion? Put enough hours into it and you start seeing doofy little bandits wearing full Daedric or Glass armor. Immersion shattered, dogs and cats living together, mass hysteria.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Zelda’s got that same problem, kind of. At the start of the game, you’ve got rusty swords and junky wooden shields and your armor’s tattered rags that you found on the floor. You’re fighting dinky little red Bokoblins with a few blues thrown in, and maybe you’ve bumped into a Lynel or a Talus and had a really bad time. A couple hours in and you’ve got shiny knight armor or a stealth suit (A SHEIKAH SLATE?!) and you’re off to the figurative races, with decent weapons and a better understanding of how to make people sad with them. You see black Bokoblins and maybe even a silver one, which is great because those drop gems.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Fine! That’s how videogames work! As you play more and more, new, cooler stuff shows up. Lightning swords and royal halberds and - wait a second, didn’t this world get totally thrashed? Where’s all this great gear coming from, anyway?&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;That’s my problem: the escalation scale’s all kooky.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I don’t even know if it makes sense or if these are just the ramblings of a madman (pro-tip: they are) but if the game’s ever moddable, I’d love to see a fairly simple edit. Raise the ceiling, sure, but keep the frequencies skewed towards the low-end. You’re still mostly fighting dumb little guys with dumb little weapons, but every once in awhile you’re going to find something truly exciting and rare, something that you’ll want to save for a really big, scary, dangerous encounter, rather than just going “oh, which Royal Sword do I want to ditch now?”&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It’s a little numbing, at the end of the day: there are no highs or lows at that point, and there’s no feeling of desperation there, either. I played it through on Normal, restarted on Master, then noticed just how weak, frail, and flimsy I felt for the first few hours. It was the most exciting part of that playthrough, knowing that I had to be careful and strategic and couldn’t just headbutt my way through every problem I got myself into.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Maybe they’ll do that in the sequel. Or not! I’m fine either way. I’m certainly not foolish enough to expect them to add any kind of hunger/weakness system to the game. That’d be a bridge way, way too far.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Not Reviews</title><link href="https://halfbitsoftware.com/blog/2018/02/05/not-reviews/"/><id>https://halfbitsoftware.com/blog/2018/02/05/not-reviews/</id><updated>2018-02-11T10:07:00-08:00</updated><published>2018-02-11T10:07:00-08:00</published><content type="html">&amp;lt;p&amp;gt;I’ve been thinking about writing on here more, which is a thing I think about often and then never actually do anything about.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Oops.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The fact that it’s an ongoing concern is a more interesting part, and maybe the whys behind that, too. It’s neat looking back at the nonsense, and knowing I have basically zero audience means that I’m doing it just for me, which is kind of great from an intrinsic motivational perspective.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;But that’s all really just noodling and waffling. One thing I’m realizing is that I don’t know why I have this site anymore - it doesn’t really have a purpose, partly because it was never very well defined, and partly because any purpose it may have had has long since evaporated thanks to lack of use. Neglect is freeing, though, because at this point I can do whatever the hell I want with it.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;So one of the things I’m going to start doing, I think, are little mini-reviews: things that are too long for a tweet, because those stupid 12/42 tweet lists are a little nuts, and because I might as well try to write more. Reviews are a little bonkers, so this’ll is more like blathering and rambling.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">The Smallest Unit of Music</title><link href="https://halfbitsoftware.com/blog/2018/01/24/the-smallest-unit-of-music/"/><id>https://halfbitsoftware.com/blog/2018/01/24/the-smallest-unit-of-music/</id><updated>2018-01-29T15:14:00-08:00</updated><published>2018-01-29T15:14:00-08:00</published><content type="html">&amp;lt;p&amp;gt;I’m a pretty big music fan. If I’m working at a computer, odds are good I’ve got music playing. If I’m writing, same thing, only it’ll all be instrumental stuff. (For whatever reason, I can’t write fiction and listen to something with vocals at the same time.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;My habits are pretty straightforward. I like listening to albums, complete albums, all the way through. I like sticking to particular genres or artists depending on my mood that day. I’m also stuck in iTunes, which is &amp;lt;a href=&amp;#34;https://www.panic.com/extras/audionstory&amp;#34;&amp;gt;(fine, whatever, if only)&amp;lt;/a&amp;gt;. In iTunes, I mark albums I really like as loved, and sort my albums by artist, then by year. This is mostly because I think it’s neat seeing how artists and groups evolve and change over time: it’s nice being able to see the usually-continuous line of creative output.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This is all fine, as far as desktop listening goes, but recently I threw more money at Apple to sign up for iCloud Music Library, which means they’re (ostensibly) smart and able to push all my shit up to the cloud, then let me pull it back down again from other places. These other places end up being iOS devices, in almost all cases. (I’m holding out hope that the HomePod eventually lets me use my library).&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Which brings me to my point of sadness: the Music app on iOS doesn’t do what I want.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I’m a simple man with simple tastes: I want sorting as described above, and I want album shuffle. I have a list of albums I really like, and I don’t really care about what order they’re played in, but the songs pretty much have to be in the right album-order, or I lose my mind and start foaming at the mouth. (Ask my coworkers, they’ll agree, it’s unsightly and embarrassing.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I don’t really have a conclusion, other than it’d be nice, I guess. Maybe I’ll get around to filing a radar, someday.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Lode Jogger Postmortem</title><link href="https://halfbitsoftware.com/blog/2016/10/11/lode-jogger-postmortem/"/><id>https://halfbitsoftware.com/blog/2016/10/11/lode-jogger-postmortem/</id><updated>2017-09-11T19:37:00-07:00</updated><published>2017-09-11T19:37:00-07:00</published><content type="html">&amp;lt;p&amp;gt;I (sorta) finished another &amp;lt;a href=&amp;#34;http://itch.io/jam/gbjam-5&amp;#34;&amp;gt;jam&amp;lt;/a&amp;gt;, this time (mostly) making &amp;lt;a href=&amp;#34;http://jtruher.itch.io/lode-jogger&amp;#34;&amp;gt;Lode Jogger&amp;lt;/a&amp;gt;!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Hooboy. This one was a doozy.&amp;lt;/p&amp;gt;
&amp;lt;h3 id=&amp;#34;what-is-it&amp;#34;&amp;gt;What Is It?&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;Lode Jogger is a gameboy jam game designed to be a near-copy of Lode Runner, one of my favorite childhood games. Players must run around a level, collecting treasure and avoiding the deadly monks, before escaping through the exit.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-went-right&amp;#34;&amp;gt;What Went Right&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Mechanics - Mostly&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;All of the bits of Lode Runner are here! You can run around, you fall properly, you can climb ladders and go across ropes, and the crazy monks can do all of that, too! Treasure works, digging works, everything&amp;amp;rsquo;s there.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It&amp;amp;rsquo;s a little bit clunky, sure, and I don&amp;amp;rsquo;t think I got ladders totally right, but I&amp;amp;rsquo;ll cut myself just a tiny sliver of slack. About the only thing I was missing? Monks can&amp;amp;rsquo;t pick up treasure!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Pathfinding/AI&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;When it comes to jams, I usually try to avoid doing much of anything involving complicated AI. Anything risky or too intensive generally gets tossed out as unfeasable. With this, though, AI was kind of important. The monks have to try to chase you, after all!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I distilled it down into basic pathfinding: monks will try to get you. That means, of course, that I&amp;amp;rsquo;m recalculating based on a grid. It&amp;amp;rsquo;s pretty much just a slope field, with the bottom of the hill being wherever the player is. They&amp;amp;rsquo;re smart enough to know that ropes might be the quickest way to get somewhere, though, which worked out nicely. For anyone curious about the technical details, it&amp;amp;rsquo;s just a &amp;lt;a href=&amp;#34;http://www.roguebasin.com/index.php?title=The_Incredible_Power_of_Dijkstra_Maps&amp;#34;&amp;gt;dijkstra map&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-maybe-kinda-didnt-go-great&amp;#34;&amp;gt;What Maybe Kinda Didn&amp;amp;rsquo;t Go Great&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Levels&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I had a fine test level for making sure all of the mechanics worked sensibly - you could collect treasure, you could die by falling into a pit, ladders and ropes seemed to work okay, and monks could follow you.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The bummer is that I more or less stopped at that point. Whoopsie! I definitely should have made more levels, but I think I was just under a lot of time pressure.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Audio&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I basically completely punted on audio, full stop. So. At least it couldn&amp;amp;rsquo;t have gone worse, right? I like the idea of basic bleeps and simple bfxr boops, but in practice most of the time they&amp;amp;rsquo;re complete earsores: too chirpy, scratchy, piercing. I&amp;amp;rsquo;ll stick with no audio at all instead of garbage audio, and given how distracted I was by the other aspects, it&amp;amp;rsquo;s probably good that I didn&amp;amp;rsquo;t bother.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Graphics&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I don&amp;amp;rsquo;t hate the gameboy palette, but I also didn&amp;amp;rsquo;t really put a whole lot of time or energy into the art of the game. 160x144 isn&amp;amp;rsquo;t a bad resolution to work in, but my artistic abilities were not really up to the task. One of the rules of the jam was also that all assets must be made during the week: oops. I punted on that big-time, too.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Having animated tiles for digging and dying would&amp;amp;rsquo;ve been awesome, but again, time and lack of skill were both factors. I think I was too anxious about getting some of the good parts done that I let a lot of stuff just kind of fall by the wayside. Shucks!&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;final-thoughts&amp;#34;&amp;gt;Final Thoughts&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;I&amp;amp;rsquo;m both proud and disappointed. I poked at a few things that I haven&amp;amp;rsquo;t really worked on before, like basic pathfinding for the monks.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;At the same time, Lode Runner is one of my top-tier favorite games, so not doing it justice stung a little. It might be something I revisit later, but probably with a very different shell. The GB palette&amp;amp;rsquo;s a little limiting, and I could do a lot better with a lot more of everything. (Sound wouldn&amp;amp;rsquo;t be bad, either. I loved the Mad Monk&amp;amp;rsquo;s Revenge soundtrack!)&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">1-Bit Clicker Jam: Clickenville</title><link href="https://halfbitsoftware.com/blog/2017/04/14/1-bit-clicker-jam-clickenville/"/><id>https://halfbitsoftware.com/blog/2017/04/14/1-bit-clicker-jam-clickenville/</id><updated>2017-04-14T10:00:00-07:00</updated><published>2017-04-14T10:00:00-07:00</published><content type="html">&amp;lt;p&amp;gt;I&amp;amp;rsquo;ve been wanting to do another jam for awhile. I like the two week cycle, but haven&amp;amp;rsquo;t seen any themes or jams that really struck my fancy. The technical limitations ones went well in the past, so those are the ones I tend to go after.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This time, it was a 1-bit (black and white graphics) clicker (mouse only) jam. Perfect! My idea was to go after something that was a little bit like Spaceplan or a cookie clicker-esque game.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-is-it&amp;#34;&amp;gt;What Is It&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;Clickenville is a game where you try to throw money at your problems. You have a number of buildings that provide income and offer upgrade options. These buildings let you alter the world of the game how you see fit, improving things for the residents, the town, and the world as a whole.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-went-right&amp;#34;&amp;gt;What Went Right&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;This was my first experience writing a more substantial shader. The theme being a 1-bit clicker made me think, with my limited art skills, that doing a cool dithering shader would be the best way to go. That way, I could find a tileset that looked good under this visual transformation and save myself a lot of effort in the process.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It&amp;amp;rsquo;d also kind of hearken back to some of the games I played as a kid back on a black and white computer. Atkinson dithering was pretty great back then, and doing something that resembled it sounded like a fun project.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Plus, Obra Dinn looks great with a (much better) dithering technique.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This was also a chance to poke a little bit at a different way of building up content. I knew going into it that having a whole lot of different kinds of buildings with interconnected systems and resources would be a pretty neat feature. Say, you could have a guild that trained adventurers, then send them off to explore a dungeon. Some of these adventurers might die along the way, which would leave bones for necromancers to use.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I didn&amp;amp;rsquo;t really start out whole-hog on doing something data-driven at first, because I didn&amp;amp;rsquo;t really understand what I wanted. Once I got a few basic classes and a really simple workflow going, though, I started pulling everything out and ended up with a little ruby script that reads a bunch of json and writes out a bunch of haxe classes for my in-game content. It worked pretty well, even if augmenting this system over time was a bit of a challenge.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-didnt-go-great&amp;#34;&amp;gt;What Didn&amp;amp;rsquo;t Go Great&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;It&amp;amp;rsquo;s funny, I always start writing my postmortems in this section. This time around, I basically pretended that audio didn&amp;amp;rsquo;t exist. There&amp;amp;rsquo;s neither catchy music nor bleeps, and certainly no bloops. It&amp;amp;rsquo;s always something I neglect and something I&amp;amp;rsquo;m not tremendously proficient with, so it&amp;amp;rsquo;s kind of a self-fulfilling prophecy. Someday I&amp;amp;rsquo;ll aim more for doing better audio work, but this time I was focused way more on the neat shader and the general mechanics.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;A few mechanics are still missing, unfortunately. I wanted a workflow where you&amp;amp;rsquo;d start off with really basic buildings and had to spend resources to unlock them, but it kind of fell out along the way. I didn&amp;amp;rsquo;t have a great handle on how the UI ought to look or work, and letting people know what something cost was a bit of a challenge - both for unlocking buildings and for letting people know what a particular upgrade would cost.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;final-thoughts&amp;#34;&amp;gt;Final Thoughts&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;Is it done? Heck no. Am I happy with it? Mostly, sorta, yeah.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Game jams are always a &amp;lt;a href=&amp;#34;https://www.youtube.com/watch?v=9pt7EWFF_T8&amp;#34;&amp;gt;question of time&amp;lt;/a&amp;gt; but more buildings would be top of my list. Doing a full UI pass to make things make more sense would also be pretty important.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The big takeaway that I had was: well, I had everything interactable hardcoded. Was this necessary? Why couldn&amp;amp;rsquo;t you plunk down a Blacksmith wherever the hell you wanted, if you had the funds?&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This meant, in a broad way, that I was putting together an RTS instead of a simple clicker. Oops. Neat thought, though.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Oneshot Postmortem</title><link href="https://halfbitsoftware.com/blog/2016/06/27/oneshot-postmortem/"/><id>https://halfbitsoftware.com/blog/2016/06/27/oneshot-postmortem/</id><updated>2016-06-27T16:01:00-07:00</updated><published>2016-06-27T16:01:00-07:00</published><content type="html">&amp;lt;p&amp;gt;I finished another &amp;lt;a href=&amp;#34;http://itch.io/jam/simple&amp;#34;&amp;gt;jam&amp;lt;/a&amp;gt;, this time making &amp;lt;a href=&amp;#34;http://jtruher.itch.io/oneshot&amp;#34;&amp;gt;oneshot&amp;lt;/a&amp;gt;!&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-is-it&amp;#34;&amp;gt;What Is It&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;It&amp;amp;rsquo;s a little arena-y shooter thing, I guess? 2-4 people jump around in a little room and try to shoot each other. Everyone only gets one bullet before having to scramble for another one.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-went-right&amp;#34;&amp;gt;What Went Right&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Finished!&amp;lt;/em&amp;gt; It&amp;amp;rsquo;s done, and playable, and doesn&amp;amp;rsquo;t seem to blow up! Kudos, me.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Simple!&amp;lt;/em&amp;gt; I stuck to the bounds of the theme, once again bolstered by a technical, rather than creative, limitation.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-maybe-kinda-didnt-go-great&amp;#34;&amp;gt;What Maybe Kinda Didn&amp;amp;rsquo;t Go Great&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Music!&amp;lt;/em&amp;gt; Specifically, the lack thereof. This is usually one of the things I leave until the very end, and in this case, it bit me a little. I had a few beats going, but most of it was pretty godawful. Here, no music was far better than the noise I was making&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Stages!&amp;lt;/em&amp;gt; Because of the limitations of the jam (5 assets, no more) I wanted to set up a bunch of different levels on just one Tiled map, using camera position to set whatever &amp;amp;lsquo;stage&amp;amp;rsquo; is presently in use. That would&amp;amp;rsquo;ve taken more UI and more smarts around picking that stage, though, so it got punted as well.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Playtesting!&amp;lt;/em&amp;gt; Man, this really didn&amp;amp;rsquo;t happen. Turns out, making a multiplayer game is hard if you&amp;amp;rsquo;re not throwing it at people to poke at. For all I know, this is actually pretty fun, but I haven&amp;amp;rsquo;t found out yet.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Juice!&amp;lt;/em&amp;gt; I know, I know, this is kind of falling out of fashion, but it really could do with a bit more zazz. Maybe particles that fly out when you jump, or screenshake when you zap a fool. Something! It could use a lot more stuff filling in the cracks.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;final-thoughts&amp;#34;&amp;gt;Final Thoughts&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;This one&amp;amp;rsquo;s kinda tricky.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I think I liked the idea way more before I started fiddling with it. It started out as a kind of dual-stick shooter with only one stick: aiming was based on the direction of travel. I wasn&amp;amp;rsquo;t sure that this&amp;amp;rsquo;d be all that much fun to play, as it seemed like you&amp;amp;rsquo;d be jousting, or something along those lines. You end up hoping to be pointed in the right direction, and that didn&amp;amp;rsquo;t sound too fun.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Instead, you&amp;amp;rsquo;re just kind of hoping to have a clear horizontal line of sight with an enemy when you pew pew a laser. I don&amp;amp;rsquo;t know if that&amp;amp;rsquo;s better, but it seems a lot simpler in terms of demands on the player. Different maps would likely help a lot in this situation, as would bigger maps. If I end up spinning more on this, it&amp;amp;rsquo;ll be one of the first things I try, along with a lot of playtesting.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Overall, I&amp;amp;rsquo;m pretty happy with it. Moving feels kinda goofy and fun, at least playing on a keyboard. Gamepad might be way more frustrating.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I&amp;amp;rsquo;m glad I did it, which is probably a good sign!&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">LZRS Postmortem</title><link href="https://halfbitsoftware.com/blog/2016/04/18/lzrs-postmortem/"/><id>https://halfbitsoftware.com/blog/2016/04/18/lzrs-postmortem/</id><updated>2016-04-18T12:16:00-07:00</updated><published>2016-04-18T12:16:00-07:00</published><content type="html">&amp;lt;p&amp;gt;I&amp;amp;rsquo;ve been pretty sloppy in the past about recapping when I&amp;amp;rsquo;ve actually managed to finish something. This is an attempt to be a bit more proactive and a bit less &amp;amp;ldquo;oh right, I should&amp;amp;rsquo;ve done that weeks ago&amp;amp;rdquo; about a project. This time around: &amp;lt;a href=&amp;#34;https://jtruher.itch.io/lzrs&amp;#34;&amp;gt;LZRS&amp;lt;/a&amp;gt; for #lowrezjam2016!&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-is-it&amp;#34;&amp;gt;What Is It&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;LZRS started out due to an interest in the laser section from Mega Man 2. Yes, this whole game is basically just poking and prodding at a single mechanic. Lasers flying across the screen that the player needs to avoid to navigate an environment felt like a decent hook - I mean, clearly, given that a MM game used it!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Because I&amp;amp;rsquo;m lazy, I tend to throw procedural generation at just about anything I come up with, so in this case, my initial idea from long ago was to make a generator for screens, or levels, or courses, or whatever. This makes total sense, because content takes time to make, but it also creates another problem: now you&amp;amp;rsquo;ve got to make the thing that &amp;lt;em&amp;gt;actually&amp;lt;/em&amp;gt; makes the thing, which can be more work. &amp;amp;ldquo;Fun&amp;amp;rdquo; is tricky to algorithmically generate.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;And that, sadly, is where the idea sat until a few weeks ago.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-went-right&amp;#34;&amp;gt;What Went Right&amp;lt;/h4&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;It finished!&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;p&amp;gt;Bear with me, here - for someone chronically late on side projects, actually getting something semi-satisfactory done is a big deal (to me). Having two weeks instead of two days contributed heavily, as did having a general idea before I even knew about the jam. Most of the time, I try to start from the theme, but here the theme is more about a technical limitation, rather than creative. That&amp;amp;rsquo;s an interesting distinction to me.&amp;lt;/p&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Platformer&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;p&amp;gt;It&amp;amp;rsquo;s a platformer! Usually people tend to start with these, but not me! I&amp;amp;rsquo;m not really very good at real-time, actiony games, likely due to lack of experience. It&amp;amp;rsquo;s pretty exciting to have something finished that plays reasonably well. Collision happens, there&amp;amp;rsquo;s triggers, stuff goes fwhoosh, and it all seems to behave as I&amp;amp;rsquo;d expect. (Whether things behave as players expect is another matter entirely.)&amp;lt;/p&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Reception&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;p&amp;gt;People seem to like it! I haven&amp;amp;rsquo;t woken up to any severed heads in my bed, which I consider a good sign. It&amp;amp;rsquo;s short enough that most people should be able to finish it, and nobody&amp;amp;rsquo;s complained about getting bored, either.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;what-maybe-kinda-didnt-go-great&amp;#34;&amp;gt;What Maybe Kinda Didn&amp;amp;rsquo;t Go Great&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;Usually you go with five specifics, but to heck with that. I do what I like&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I think most of what I&amp;amp;rsquo;m unhappy with boils down to one word: incomplete. It&amp;amp;rsquo;s a jam game, and I was pushing back and forth against what seemed like a good idea to add, and what seemed possible within the remaining time. A few hours a night is an awful lot if you&amp;amp;rsquo;re driven with a plan, but for exploration, it ends up being a bit trickier. Experimentation is fine but it really helps if you think your new idea is going to bear fruit.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;(And before I go too much farther, incomplete is from my perspective as the dude who saw everything it could have been, rather than the players going through the whole thing. Very different perspectives.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;First off, the big mechanic: lasers. Sure, they slide around, or turn themselves on and off, but from a mechanical perspective, they&amp;amp;rsquo;re kind of lame, aren&amp;amp;rsquo;t they? There&amp;amp;rsquo;s no telegraphing, there aren&amp;amp;rsquo;t any hints about whether they&amp;amp;rsquo;re going to turn off soon, or even which kind of laser is which! It&amp;amp;rsquo;s a little lame. They don&amp;amp;rsquo;t move at different speeds, and they&amp;amp;rsquo;re not even textured. Tons of work could be done here polishing and improving.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Audio&amp;amp;rsquo;s one big area that I&amp;amp;rsquo;m a little disappointed with, and would probably get tackled pretty soon. Just looking at the main spaceman character is a great start: sounds for footsteps, jumps, hard landings, skids - there&amp;amp;rsquo;s plenty here that I could add to push a bit more depth and feel into things. Heck, just having multiple different sounds for the same type of event would be great for adding feel and juiciness.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This next one&amp;amp;rsquo;s a bit tricky to explain, but the unfinished-specific umbrella is probably just &amp;amp;lsquo;polish&amp;amp;rsquo;. I&amp;amp;rsquo;ve usually got a pretty discerning, ruthless eye about what works, what doesn&amp;amp;rsquo;t, and what to change. Some of the tiles don&amp;amp;rsquo;t work quite right, but more importantly, my tiles are all black with alpha. Why care? Well, I can&amp;amp;rsquo;t really tint them, which makes me kind of bummed out. I like being able to just tweak colors a bit, and if they&amp;amp;rsquo;re white instead of black, I can muddle with the levels as much as I&amp;amp;rsquo;d like.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The backgrounds change as you progress through the level, after all, so why not the walls and the environment, too? This was another issue of &amp;amp;ldquo;things work, so don&amp;amp;rsquo;t break anything&amp;amp;rdquo; that kept me from making too many daring changes. The hard deadline both helped and hurt me, bless its heart. Twiddling with the precise color progression for the background would likely be on my list, too, just to make sure it&amp;amp;rsquo;s exactly what I want.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I&amp;amp;rsquo;ve been thrilled by people posting their times and death counts and would love to have some kind of global leaderboard for scores. I don&amp;amp;rsquo;t know that I want to do anything platform-specific, which means either picking something cross-platform or finding an acceptable third-party solution. I haven&amp;amp;rsquo;t really gotten that far or done any thinking about it yet, but it&amp;amp;rsquo;d be a great thing to have.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Lastly on this hate train: levels and courses. Courses feels like the right word for the sequence of, uh, ten or eleven laser-filled screens of death. I didn&amp;amp;rsquo;t even consider it for the scope of the jam because, well, there&amp;amp;rsquo;s no way to pick a different course on the menu. Duh! Having a bunch of courses with different themes or different mechanics would be really pretty great. Designing the levels wasn&amp;amp;rsquo;t quite as rough as I was afraid it&amp;amp;rsquo;d be, and making more of them might be fun.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;final-thoughts-brainfarts&amp;#34;&amp;gt;Final Thoughts &amp;lt;del&amp;gt;Brainfarts&amp;lt;/del&amp;gt;&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;I&amp;amp;rsquo;m tremendously happy with how things turned out. I&amp;amp;rsquo;ve been itching to do Ludum Dare for ages, but the 48/72 deadlines are a bit too much for someone with a dearth of time. Having two weeks and a technical restriction made all the difference in the world, and I think going in with an easily-applicable concept helped a ton.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The game even seems pretty fun, which is always a pleasant surprise. The mechanic isn&amp;amp;rsquo;t mine, but I can claim some of the level design, at the very least. It was a good experience and something I wouldn&amp;amp;rsquo;t at all mind putting more time into. That alone probably makes this experiment a success.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Luxe status bar</title><link href="https://halfbitsoftware.com/blog/2016/03/25/luxe-status-bar/"/><id>https://halfbitsoftware.com/blog/2016/03/25/luxe-status-bar/</id><updated>2016-03-25T10:14:00-07:00</updated><published>2016-03-25T10:14:00-07:00</published><content type="html">&amp;lt;p&amp;gt;Another in a long series of brief tips! If you&amp;amp;rsquo;d like to hide the status bar on iOS (unconfirmed, so far, for Android), just set fullscreen to true in &amp;lt;code&amp;gt;project.flow&amp;lt;/code&amp;gt;. If you want this just for mobile devices, it&amp;amp;rsquo;s likely easiest to do in &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;pre tabindex=&amp;#34;0&amp;#34;&amp;gt;&amp;lt;code&amp;gt;override function config(config:luxe.AppConfig) {
#if mobile
config.window.fullscreen = true;
#end
}
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p&amp;gt;Boom! No more status bar!&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Target-Action in Luxe</title><link href="https://halfbitsoftware.com/blog/2016/03/01/target-action-in-luxe/"/><id>https://halfbitsoftware.com/blog/2016/03/01/target-action-in-luxe/</id><updated>2016-03-09T16:55:00-08:00</updated><published>2016-03-09T16:55:00-08:00</published><content type="html">&amp;lt;p&amp;gt;There&amp;amp;rsquo;s an incredibly common, useful design paradigm called &amp;amp;rsquo;target-action&amp;amp;rsquo;, one I first encountered on iOS. Basically, you&amp;amp;rsquo;ve got a button that calls a function when something specific happens: maybe a touch or a drag or something. This is the basis of all of iOS&amp;amp;rsquo; user input.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;So I thought it&amp;amp;rsquo;d be handy to recreate something similar using the entity-component model. It&amp;amp;rsquo;s pretty braindead-simple, but it seems to work okay for my purposes. It&amp;amp;rsquo;s not quite as powerful as it could be, but given that I&amp;amp;rsquo;ve already put together a game with it, I figure it&amp;amp;rsquo;s good enough.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Here&amp;amp;rsquo;s what the component looks like:&amp;lt;/p&amp;gt;
&amp;lt;pre tabindex=&amp;#34;0&amp;#34;&amp;gt;&amp;lt;code&amp;gt;import luxe.Component;
import luxe.Input;
class TargetActionComponent extends Component {
public var mouse_up_action : Void-&amp;amp;gt;Void;
public function new(?_up_action : Void-&amp;amp;gt;Void) {
super( {name: &amp;amp;#34;targetAction&amp;amp;#34;} );
mouse_up_action = _up_action;
}
override function onmouseup(e:MouseEvent) {
if(mouse_up_action != null &amp;amp;amp;&amp;amp;amp; cast(entity, Sprite).point_inside(e.pos)) {
mouse_up_action();
}
}
}
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p&amp;gt;And here&amp;amp;rsquo;s what using it might look like:&amp;lt;/p&amp;gt;
&amp;lt;pre tabindex=&amp;#34;0&amp;#34;&amp;gt;&amp;lt;code&amp;gt;var turkey = new Sprite({...});
turkey.add(new TargetActionComponent( function() { trace(&amp;amp;#34;I&amp;amp;#39;m a turkey!&amp;amp;#34;); } ));
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p&amp;gt;The neat thing, and something I found pretty useful, is being able to rebind your target actions after creation. That ends up looking something like this:&amp;lt;/p&amp;gt;
&amp;lt;pre tabindex=&amp;#34;0&amp;#34;&amp;gt;&amp;lt;code&amp;gt;t.get(&amp;amp;#39;targetAction&amp;amp;#39;).mouse_up_action = function() { trace(&amp;amp;#34;Gobble gobble gobble!&amp;amp;#34;); };
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p&amp;gt;The obvious next step is adding more triggers and actions for various input events. Touch events are a good thing to consider, as well as down-events, too - great for juicy, depressable buttons!&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Another Luxe Tip</title><link href="https://halfbitsoftware.com/blog/2016/02/26/another-luxe-tip/"/><id>https://halfbitsoftware.com/blog/2016/02/26/another-luxe-tip/</id><updated>2016-02-26T18:32:00-08:00</updated><published>2016-02-26T18:32:00-08:00</published><content type="html">&amp;lt;p&amp;gt;I didn&amp;amp;rsquo;t expect to write more of these, but here I am! I wanted to document a bit of interesting behavior I found in the process of building/rebuilding a shmup.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I had this cool effect for making a sprite kind of flicker and glow a bit by adding a duplicate and making it expand and contract rapidly. I think the old way in SpriteKit used a parent/child relationship with an SKAction for the animation. In luxe, the way I&amp;amp;rsquo;m doing it is by attaching a component to the base sprite.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This component is fairly simple. I build a sprite, attach it to its parent via the parent property (so moving it by hand is unnecessary), then add a few animations. I&amp;amp;rsquo;ve already learned that &amp;lt;code&amp;gt;onremoved()&amp;lt;/code&amp;gt; is the right place to do teardown, so I destroy the sprite in there and all&amp;amp;rsquo;s well, right? Not quite.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The extra wrinkle here is that I&amp;amp;rsquo;ve got a timer that fires after a few seconds to remove the component. Simple and straightforward - &amp;lt;code&amp;gt;entity.remove(&amp;#39;flicker&amp;#39;);&amp;lt;/code&amp;gt; - until I tried to run it. There&amp;amp;rsquo;s a couple of annoying subtle bugs in here that made me sad.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The first is the parent-child relationship built from the sprite. The lifecycle of a sprite is this, during destroy. First, destroy yourself, then loop through and destroy your children. This means I&amp;amp;rsquo;m double-destroying my flicker sprite! Dangit. The solution? Don&amp;amp;rsquo;t add it as a child, and manually update position in &amp;lt;code&amp;gt;update()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The second is that timer. See, there&amp;amp;rsquo;s a problem there, too: what happens if you kill the parent before the timer fires? Everything gets cleaned up properly, but then you try to call &amp;lt;code&amp;gt;entity.remove(&amp;#39;flicker&amp;#39;)&amp;lt;/code&amp;gt; and - boom, again! Dangit. The fix here was to save my scheduled timer and tell it to stop in &amp;lt;code&amp;gt;onremoved()&amp;lt;/code&amp;gt;. Both reasonably simple fixes, but real head-scratchers as I was working through the issues. This isn&amp;amp;rsquo;t even a particularly complicated situation, but making simple mistakes really bit me in the ass.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Little Luxe Tips</title><link href="https://halfbitsoftware.com/blog/2016/02/16/little-luxe-tips/"/><id>https://halfbitsoftware.com/blog/2016/02/16/little-luxe-tips/</id><updated>2016-02-16T11:02:00-08:00</updated><published>2016-02-16T11:02:00-08:00</published><content type="html">&amp;lt;p&amp;gt;I&amp;amp;rsquo;m not dead! A shock, I know, but between real-life obligations and a decline in my general state of gives-a-crap, my fun little hobby life has suffered in recent months. Shucks.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Doesn&amp;amp;rsquo;t mean I can&amp;amp;rsquo;t bounce back, though, right? Spring 2015-ish, I was on the hunt for something new to tinker with, and I found &amp;lt;a href=&amp;#34;http://snowkit.org&amp;#34;&amp;gt;this rad stuff&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;First off, a dumb, semi-obvious one. For anyone loading textures in &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt;, using something like &amp;lt;code&amp;gt;config.preload.textures.push({ id:&amp;#39;assets/playershot.png&amp;#39; });&amp;lt;/code&amp;gt; who want nearest neighbor filtering on all of their textures, it&amp;amp;rsquo;s important to call &amp;lt;code&amp;gt;phoenix.Texture.default_filter = phoenix.Texture.FilterType.nearest;&amp;lt;/code&amp;gt; &amp;lt;em&amp;gt;before&amp;lt;/em&amp;gt; you load anything. Promise - this&amp;amp;rsquo;ll make you sad and confused otherwise. Obvious in hindsight and a real forehead-slapper once I figured it out.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Another important thing to note is that someday (soon?) phoenix is going to go away, replaced with &amp;lt;a href=&amp;#34;http://snowkit.org/2015/09/14/snowkit-dev-log-7-embers/&amp;#34;&amp;gt;embers&amp;lt;/a&amp;gt;. The API might look similar, and this might still be relevant, but just something to keep in mind.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I bumped into another forehead-slapper obvious issue with global events and ids. It&amp;amp;rsquo;s super easy to just &amp;lt;code&amp;gt;Luxe.events.listen(&amp;#39;whatever&amp;#39;, function() { doRadStuff(); })&amp;lt;/code&amp;gt; - but the gotcha here was not holding onto what &amp;lt;code&amp;gt;listen()&amp;lt;/code&amp;gt; returns. Whoopsie. That&amp;amp;rsquo;s the thing you use later to unlisten to things, ala &amp;lt;code&amp;gt;Luxe.events.unlisten(event_id)&amp;lt;/code&amp;gt;. The worst part? This is even &amp;lt;a href=&amp;#34;http://luxeengine.com/docs/guide.events.html&amp;#34;&amp;gt;in the docs&amp;lt;/a&amp;gt;! Bad me.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The last tip is going to be a bit of a rambler. Luxe supports the pretty useful entity-component model of design: you&amp;amp;rsquo;ve got your base entity, and you can lump additional behavior onto it via components, which are small little focused nuggets of goodness. I&amp;amp;rsquo;m coming from an objc/iOS background, which means that I spotted new, init and destroy and thought, aha! That&amp;amp;rsquo;s clearly the place to put stuff!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;D&amp;amp;rsquo;oh. Nope. See, the thing you&amp;amp;rsquo;re attaching your component to isn&amp;amp;rsquo;t quite ready in new - that&amp;amp;rsquo;s just for building stuff up. Init, too, is a little early - sure, you&amp;amp;rsquo;ll be ready, but if you want to add stuff your component after the fact (adding components to an entity returns that built component - handy for twiddling stuff immediately afterwards) - well, onadded is a better place. Teardown is similar, as onremoved happens earlier in the destruction lifecycle than ondestroy.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Slow Jam 1: Technical Postmortem</title><link href="https://halfbitsoftware.com/blog/2015/07/09/slow-jam-1-technical-postmortem/"/><id>https://halfbitsoftware.com/blog/2015/07/09/slow-jam-1-technical-postmortem/</id><updated>2015-07-09T10:59:00-07:00</updated><published>2015-07-09T10:59:00-07:00</published><content type="html">&amp;lt;p&amp;gt;Yesterday, I posted up some of my recent thoughts and experiences on the last PIGSquad game jam. It went pretty well, and I&amp;amp;rsquo;m pretty happy with it! This is going to be the big, ugly breakdown of how I actually put the whole thing together.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;And just to repeat myself, here&amp;amp;rsquo;s the &amp;lt;a href=&amp;#34;http://jtruher.itch.io/3720-1&amp;#34;&amp;gt;page for the game&amp;lt;/a&amp;gt;!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I&amp;amp;rsquo;ve mentioned this before, but I&amp;amp;rsquo;ve been doing a lot of work and research with luxe, a game engine built on top of Haxe. It&amp;amp;rsquo;s all pretty new and different for me, coming primarily from a recent iOS background - but that&amp;amp;rsquo;s for another post.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Luxe is in alpha, which means it isn&amp;amp;rsquo;t quite finished yet. Luxe, more importantly, is completely badass. Damn and blast, I was going to talk about this another time.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I&amp;amp;rsquo;m not going to cover what I brought up yesterday - we all know it&amp;amp;rsquo;s a spaceship game. Instead, I&amp;amp;rsquo;ll go into how I actually put this whole thing together, from start to finish, with a bit of a focus on Luxe. Like with C, Luxe starts you off in Main. It&amp;amp;rsquo;s the entry point for the whole app (as far as I understand - apologies in advance, __discovery). For me, it&amp;amp;rsquo;s also where I keep a few important, app-wide things, like where we&amp;amp;rsquo;re at in a state machine, and the starfield background.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;background-starfield&amp;#34;&amp;gt;Background Starfield&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;Speaking of which, that background is something that turned out really well. I&amp;amp;rsquo;m pretty proud of how I put it together, so let&amp;amp;rsquo;s start there. In Pixelmator, I added noise, tweaked light and dark balance and fiddled with it until I got black with a sea of stars. From there, I duplicated that layer and ripped out anything black, leaving just stars. That layer, with just stars and no black background, was duplicated a couple more times. The trick here is that I went in with the eraser and just swept through it, leaving patches of stars here and there.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Now, the engine part of things. Each of those transparent layers gets to live as a texture on its own quad. Simple uv coordinate manipulation - adding a delta on each frame - makes the texture slide across the quad (or Sprite, if you prefer the luxe term). Each quad also gets its own delta speed, adding basic parallax. Finally, I provided a basic setter to Main, the class containing this whole thing, so that any state could change the speed that the game went at. Simple, straightforward, and pretty clean.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;physics&amp;#34;&amp;gt;Physics&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;One of the physics simulations luxe supports is called Nape. Nape is pretty darned good, and more than sufficient for my purposes. Putting it to good use is left as an exercise for the reader, but my general scheme was to put together a couple of simple static boxes: one would keep the player ships from exiting the view, and the other served to clean up any bullets or asteroids that bumped into it. It was a pretty straightforward system.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Nape, in particular, is pretty cool because of the rich callbacks system. I can define certain physics bodies as one type, and others as another, then get a function called when the two bodies interact. It&amp;amp;rsquo;s how all of my collision works: when two asteroids bump, I spawn a little explosion. When a bullet hits an asteroid, same thing. When an asteroid hits a player, explode a lot! Oh, and kill that poor helpless ship, too.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;input&amp;#34;&amp;gt;Input&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;Input was pretty straightforward, too. Luxe comes with an entity component system right out of the box, so I put this to good use. My InputComponent ended up being a bit of a God Object, which isn&amp;amp;rsquo;t great - but, hey, game jam. It&amp;amp;rsquo;s okay if things are a bit clunky or poorly designed, as long as it works. Input holds onto the particular ship&amp;amp;rsquo;s physics body and attaches to the ship&amp;amp;rsquo;s Sprite. Each frame, I update the sprite&amp;amp;rsquo;s position and rotation based on its physics body. (This is how asteroids and bullets work, too.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;One trick that I apply here, I think picked up from &amp;lt;a href=&amp;#34;http://www.madgarden.net&amp;#34;&amp;gt;@madgarden&amp;lt;/a&amp;gt; is to give the acceleration a boost when the player tries to move in the opposite direction of travel. So, if you&amp;amp;rsquo;re heading right and going fast, then try to go left, give a bit more oomph to the physics impulse until your velocity normalizes. It makes everything a lot zippier and feels pretty great, once you&amp;amp;rsquo;ve tuned whatever that extra-oomph is.&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;data-driven-nonsense&amp;#34;&amp;gt;Data-Driven Nonsense&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;I think this came up in yesterday&amp;amp;rsquo;s overall post, but going into the last day, I put together a basic json-based data file for ship stats. This was after I&amp;amp;rsquo;d already gotten the whole game up and running. This was huge, because it meant I could see where the hardcoded numbers are, and set them up accordingly in the json. My InputComponent, after it&amp;amp;rsquo;s been loaded, can ask Main about what ship it&amp;amp;rsquo;s made and assign values out of the data file.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It was almost offensive how well this system worked, and it&amp;amp;rsquo;s something I plan on re-using for other projects. The only failing: the lack of testing. If I had my druthers, I&amp;amp;rsquo;d put together something that let me twiddle and toggle game settings on the fly, rather than having a lengthy rebuild/relaunch cycle. Being able to disable ship death and tweak ship settings in-game would have been huge. Maybe for the next jam! (But probably not, knowing me.)&amp;lt;/p&amp;gt;
&amp;lt;h4 id=&amp;#34;music&amp;#34;&amp;gt;Music&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;This is probably going to earn its own post at some point, but figuring out how to do loops and samples in Garage Band was pretty great. I stepped through a bunch of their supplied loops, dragged in the ones that sounded good, then set them to loop over a particular interval until I got something I liked. The one trick that I found handy was to separate an intro from a main game loop. This seemed like a good way of doing things, because in luxe there&amp;amp;rsquo;s a completion handler for when a sound effect will end.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;That&amp;amp;rsquo;s most of the interesting chunks. Doing this project in luxe has really gotten me excited again about building stuff, and I&amp;amp;rsquo;m looking forward to the next gamejam in August (July&amp;amp;rsquo;s has a schedule conflict for me, sadly). I&amp;amp;rsquo;m also looking forward to just having an easier, cross-platformier dev environment. After being iOS only for so long, being able to blast something out to a bunch of different places feels pretty great.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">Summer Slow Jam 1 Postmortem</title><link href="https://halfbitsoftware.com/blog/2015/07/08/summer-slow-jam-1-postmortem/"/><id>https://halfbitsoftware.com/blog/2015/07/08/summer-slow-jam-1-postmortem/</id><updated>2015-07-08T18:42:00-07:00</updated><published>2015-07-08T18:42:00-07:00</published><content type="html">&amp;lt;p&amp;gt;It&amp;amp;rsquo;s been awhile! I missed each and every one of you. At least I haven&amp;amp;rsquo;t been sitting on my thumbs during my long-ish silence. Promise!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Before we get too far, here&amp;amp;rsquo;s the &amp;lt;a href=&amp;#34;http://jtruher.itch.io/3720-1&amp;#34;&amp;gt;page for the game&amp;lt;/a&amp;gt;!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;So, PIGSquad, a local group of gamedev enthusiasts, is pretty great. Recently, they started this neat Summer Slow Jams thingie - each month this summer is a different jam with a different theme (or set of themes). I like game jams, but most of the 48/72 hour ones are a bit too rushed for me. Family obligations make it difficult to really focus, too. A week, on the other hand. . .&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;A week is a pretty healthy amount of time. The general theme was &amp;amp;ldquo;something you can showcase&amp;amp;rdquo; and the game-specific themes were: seed, spirits, in the fast lane, explosions(!), brewfest, guilty pleasures, wild west, and man vs machine. Most of these didn&amp;amp;rsquo;t really say much to me, and the overall prompt of a showcase-worthy game was a bigger barrier than the game themes, honestly.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;(One interesting thing about the themes - at least two of them are total gimmes. Guilty Pleasures and Explosions pretty much let you build whatever the hell you want - what game couldn&amp;amp;rsquo;t use more explosions? It was a neat trick to make it easier for everyone to contribute and come up with something.)&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;First off, before you can really start on anything, you have to, uh, think about what the hell you&amp;amp;rsquo;re doing, right? For jams, I usually just sit and stare at the theme for awhile and waited for stuff to fall out. Seed, spirits, brewfest, and guilty pleasures didn&amp;amp;rsquo;t yield much immediately. I had a neat hook for man vs machine that was basically a cyborg metroidvania with some of the corruption mechanics from Breath of Fire: Dragon Quarter - you had rad robo-abilities, but using them made you more inhuman. I stopped myself at &amp;amp;lsquo;metroidvania&amp;amp;rsquo; and filed that away for later.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Which left only a few more options. I had a hook for wild west: basically, a timing/reaction game with two players, where one had to move an analog stick in a certain way to draw a pistol, aim, and fire, but it felt too fiddly and didn&amp;amp;rsquo;t strike me as particulary &amp;amp;ldquo;showcaseable&amp;amp;rdquo;. Yes, that&amp;amp;rsquo;s a word, as of now.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;In The Fast Lane was the first thing I ended up building a prototype for. I had the idea of doing a Grandma Simulator, where you&amp;amp;rsquo;re an old lady sitting in the fast lane, oblivious to the traffic crashing behind you. It seemed a little cruel and mean, and again, not all that showcaseable. (My standards on what&amp;amp;rsquo;s worth showcasing might, upon reflection, be a little bit high.) I kept thinking about it and ended up doing a kind of Road Rage simulator, instead. I wired up simple boxes with basic movement to fake up what actual freeway traffic was like. It worked, but it didn&amp;amp;rsquo;t strike me as particularly zazzy, so I shelved it.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Time from first code written to discard: maybe a day or so? On a 48h jam, I probably would&amp;amp;rsquo;ve just had to stick out the crappy prototype, but I knew I had a bit more time to let things noodle and build. Probably a good thing, too, given how fiddly the cars felt. Tuning physics for game feel is tricky, and adding decent AI drivers felt like a big challenge.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It was Tuesday before I settled on a different idea, going with something else I thought of on the first night of the jam, using the theme of Explosions instead. I had pretty decent shmup sprites, and a fairly good grasp of what makes those fun to play, so I settled on a cooperative Asteroid Field Navigation game, with a dash of Star Wars in-joke to boot. 3720 : 1 (3720 to 1) was born-ish!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;It didn&amp;amp;rsquo;t hurt that I&amp;amp;rsquo;d, more or less, done this already before. A shmup that I&amp;amp;rsquo;ve been writing since the Kennedy Administration had a neat asteroid field mechanic, where occasionally these white ping-pong balls of death and sadness would rain down on you and the aliens. Dodging them was fun and shooting them was fun - why not make a whole game around that one mechanic? It seemed like it&amp;amp;rsquo;d work. Scaling back weapon effectiveness and making it a team effort could help keep the game interesting and challenging.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Which meant that I had to get to work, and work I did! Though, looking back, not nearly as much as I should have. The fun umbrella of personal issues kept me from being as productive as I ought to have been, leading to some last-minute issues. Things got done, but not up to my usually high standards. This being a jam is no reason for clumsiness or cludginess.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;My choice of tools were probably the thing that really saved me. I used Pixatronic to generate my spaceship sprites and the asteroids, Pixelmator for the rad parallax starfield (probably my favorite part of the whole shebang), bfxr for sound effects, Garage Band for the music and, last but absolutely not least, luxe for the engine.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Garage Band is a little cheesy, but the track for that turned out pretty well, too. Figuring out how to put together simple loops was fun, and completely worth the half-hour invested. This is a tool I&amp;amp;rsquo;ll absolutely use again the next time around. Moving forward, I&amp;amp;rsquo;d like to add a few more loops to alternate between, rather than just an intro and a single loop. Variation is good, and making different loops is as simple as toggling channels on and off.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Luxe let me put together everything with remarkable speed and not a whole heck of a lot of code. How much code, you ask? This much!&amp;lt;/p&amp;gt;
&amp;lt;pre tabindex=&amp;#34;0&amp;#34;&amp;gt;&amp;lt;code&amp;gt;-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
haXe 7 242 74 1003
JSON 1 0 0 98
-------------------------------------------------------------------------------
SUM: 8 242 74 1101
-------------------------------------------------------------------------------
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p&amp;gt;Note that little chunk of JSON! Another thing I&amp;amp;rsquo;m pretty happy with is having a set of ships, loaded from a file! It&amp;amp;rsquo;s odd where the low bars and the high bars are, huh? It&amp;amp;rsquo;s something I wanted to do on bullet heck for ages, and just couldn&amp;amp;rsquo;t handle, or couldn&amp;amp;rsquo;t get around to it. C&amp;amp;rsquo;est la vie.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Before I get too much further, remember the theme I&amp;amp;rsquo;d chosen: Explosions! I had, uh, one. It wasn&amp;amp;rsquo;t a bad one - a simple circle that appears and shrinks, with a bunch of squarish particles flying everywhere. Probably not the worst explosion in the world, but it could have done with a lot more polish and tweaking. This is an area I&amp;amp;rsquo;d definitely like to give more attention going forward, particularly when it comes to ships exploding. They should knock asteroids around when they go kaboom! At least I&amp;amp;rsquo;ve got screen shake.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Going into the big jam demo night, I had a main menu screen, a ship selector screen (for up to 4 players) and a game screen. Each worked - mostly. The ship selector had a few bugs, and there were a few little issues with the game, too. I&amp;amp;rsquo;m proud that I was able to get them fixed mid-jam-demo, but less proud that I let them slip at all. One of the things I&amp;amp;rsquo;ve been reluctant to do, with jams, is commit to working in a team. I&amp;amp;rsquo;ve always been concerned that I won&amp;amp;rsquo;t be able to work fast enough, or won&amp;amp;rsquo;t be able to contribute enough.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Next time, however, my plan is to take on a team of friends and have them be extra sets of eyeballs. This experience is some proof that I can push something decent enough out without completely driving myself mad. Everything I caught in the last few hours could&amp;amp;rsquo;ve been spotted earlier - with another set of eyes, or more people. Given the next jam topic is going to be multiplayer games, all the more reason to get more people involved. The fact that I&amp;amp;rsquo;ve already written a multiplayer game for a jam (partially unintentionally) only helps my case.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;What&amp;amp;rsquo;s more, on the final demo night, I&amp;amp;rsquo;ll be able to have other people around to talk and show off the work. I absolutely suck at self-promotion and talking about my work, so this is going to be a huge boon to me. I dreaded showing it to people, and really hope the next time around goes even better than this time.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The mechanics of scoring could have used a bit of help and explanation. Basically, you earn points (parsecs) based on how far forward the furthest ship is. The gameplay idea was to have someone in a quick ship towards the more dangerous part of the asteroid field, where fast reflexes were most necessary, and have the other players hang back and try to shoot asteroids out of their path. There isn&amp;amp;rsquo;t much of a visual explanation of this effect - probably something added to the score bar would help in that regard.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Knowing which ships to pick is also a bit of a challenge. The star explanations for ship capabilities are. . .well, that was one of the last things I did, on the day of the jam. I was throwing numbers into JSON and hoping nothing broke. More work on ship balance is going to be necessary to call this actually finished and done.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;At the end of the day, I&amp;amp;rsquo;m pretty darn happy with how this project turned out - happy enough to actually post it for people to fiddle with. I learned a lot about working with luxe, making music, not leaving things until the last minute (cough, cough) and just putting together a general framework for more of these types of games. The general blocks and chunks are going to be really straightforward to pull out for the next multiplayer work.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;If you&amp;amp;rsquo;d like to try it, head to my &amp;lt;a href=&amp;#34;http://jtruher.itch.io&amp;#34;&amp;gt;itch page&amp;lt;/a&amp;gt; to give 3720:1 a try. It&amp;amp;rsquo;s still a little clumsy in a lot of ways, but I&amp;amp;rsquo;m still happy with how it turned out. Feedback is always welcome, and the best place to hit me is probably my &amp;lt;a href=&amp;#34;http://twitter.com/jtruher&amp;#34;&amp;gt;twitter&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;</content></entry><entry><title type="html">What&amp;#39;s a Game?</title><link href="https://halfbitsoftware.com/blog/2015/04/28/whats-a-game/"/><id>https://halfbitsoftware.com/blog/2015/04/28/whats-a-game/</id><updated>2015-04-28T22:44:00-07:00</updated><published>2015-04-28T22:44:00-07:00</published><content type="html">&amp;lt;p&amp;gt;Some people like to carefully proofread what they write and post on the Great Wide Internet™. It&amp;amp;rsquo;s a good philosophy! It leads to quality content (for your braaaand) and, in general, it&amp;amp;rsquo;s how things ought to be done.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This is not gonna be one of those things. Strap yourselves in, folks, I&amp;amp;rsquo;m going completely free association, here.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Backing up a step, I&amp;amp;rsquo;ve been playing around with &amp;lt;a href=&amp;#34;http://www.luxeengine.com&amp;#34;&amp;gt;luxe&amp;lt;/a&amp;gt; for the last few weeks, hence the silence. Ludum Dare went Very Poorly, but unfortunately I don&amp;amp;rsquo;t know the Latin for that. &amp;amp;lsquo;Vilissimo&amp;amp;rsquo;, sayeth the googles. The sad part is that it&amp;amp;rsquo;s all stupid emotional nonsense, but that&amp;amp;rsquo;s not what I&amp;amp;rsquo;m here to fumble with.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;I&amp;amp;rsquo;ve been building a silly little couch party game for the last few nights - since Friday, come to think of it. Or maybe last Thursday (4/23/2015). The first night, I got a whole level loaded from &amp;lt;a href=&amp;#34;http://www.mapeditor.org&amp;#34;&amp;gt;Tiled&amp;lt;/a&amp;gt;! I&amp;amp;rsquo;ve never done that before, so it was kinda neat to see such quick turnaround. Slowly but surely, I&amp;amp;rsquo;m learning. Second and third night, all physics, then input. Now I&amp;amp;rsquo;ve got these neat little marbles that roll around the screen, more or less how I imagined my prototype, way back when. Triggers are hooked up, so I know when things bounce into bad things, and&amp;amp;hellip;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Wait. Shoot. I&amp;amp;rsquo;m forgetting something. The whole, uh, game part of gamedev. This is just fiddling and playing around - valuable, for sure, and certainly when trying to pick up something new and slippery, but I can&amp;amp;rsquo;t really play this. Games generally have goals, some have scores. Even games with emergent fun, whatever the hell that is, tends to have some kind of structure in place. So far, this is just a toy. Which loops back to why I&amp;amp;rsquo;m here!&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;What&amp;amp;rsquo;s a game, in the kind of base, boiled-down sense? Is it just a set of rules, simple or complex? Pong&amp;amp;rsquo;s a game, right? At its core, Pong is a game that ends when someone&amp;amp;rsquo;s lives hit zero. Aha! That means, in my game, I need to keep track of each player, decrement some counter when a particular event happens, and call the game &amp;amp;lsquo;over&amp;amp;rsquo; when there&amp;amp;rsquo;s only one person left standing. Right?&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Well, sure. But what if it was a little different? What if there was a flag, and each marble had to steal/knock it away from the other marbles to take it back to their little cubby? How do you structure that? I guess that&amp;amp;rsquo;s where I&amp;amp;rsquo;m at. Luxe (bless it) has this pretty common, rad, new-to-me Entity-Component system. I&amp;amp;rsquo;ve got a Sprite, and I attach Input to it, and bam, it moves. I attach Physics, and shazam, it affects its world, while the world around it affects it. (I&amp;amp;rsquo;ve combined the two for convenience, but you get the point).&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Which, after a whole lot of hot air and sore fingers on my part, leads to the conclusion: are Game Modes for this Dumb Marble Game just components that I can bolt onto&amp;amp;hellip;what? Having them attached to the sprites themselves seems a little too low-level, truth be told. What if the game object, the thing that holds the world, and the sprites, and receives the callbacks for collision, is the one I lump this thing onto?&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Well, now we&amp;amp;rsquo;re getting somewhere, aren&amp;amp;rsquo;t we?&amp;lt;/p&amp;gt;</content></entry></feed>