About Me

I make stuff, because I go crazy if I don’t, and I do my best to make cool stuff, for the same reason.

Random Grab-Bag 1

It’s been awhile, and I’ve been anything but idle, so I figured it’d be a good idea to drop a quick note about the silly things I’ve been up to lately. For starters, I pushed iOS7 friendly versions of The Dungeon and Panic Attack up to the App Store. I also made the latter free for a week - get it quick, folks!

Panic Attack Theme!

For Panic Attack, I also wanted to modernize its look a bit, so I updated my theme a bit. This was actually something I really wanted to do before iOS7 came out, but it didn’t quite make the cut. I regret it a bit now, but I’m glad that it turned out well. It’s kind of hard for me not to use it. Check it out! I also spent a bit of time just doing a little bit of cleanup and polish on Panic Attack. Despite my best efforts and all common sense, I’m not quite done with the poor game yet.

{% flickr_image 9956361644 z center “Shiny!” %}

Angraxian

I’ve also been working a bit on a little SHMUP idea, more or less inspired by Chillaxian, a mellow, groovy riff on Galaxian. Mine goes pretty much whole-hog in the opposite direction, hoping to be a fast, angry, almost psychotic take on the space shooter. It’s also my first foray into SpriteKit. (Hence the quiet - most of the things I’ve been working on have been under NDA!)

And More?

I’ve also kind of started playing around with another little SpriteKit project. Last night was a public Art/Code night thing for the local indie gamedev scene, and I started futzing with. . .well, just look. It’s a bit silly right now, but I’m hoping to make it cooler soon!

Tappy Swipey

One of the early feature requests for Panic Attack, even before it was called that, revolved around user input. People expected to slide, and were surprised and annoyed when their expectations weren’t met. I’m a people-pleaser, and I like trying to make things that people will enjoy using, so the next update will include a second, likely more-popular control scheme that closely mimics the one found in Planet Puzzle League, a Tetris Attack clone for the Nintendo DS.

It seems like a not-bad idea to describe why I built things the way I did. I came at this project with a couple of strong biases: first, the original Tetris Attack for the SNES, and a freeware game called Crack Attack for desktop PCs. Both had a kind of reticule thing - hitting a button would swap the two wrapped blocks. My thinking, for my iOS version, was to just nuke the reticule and have the blocks swap if you tapped between them. The context seemed obvious in my eyes, but - whoops! - hasn’t been to others.

Now, one of the little details about my current scheme revolves around timing. It’s an important thing, for all of the versions I’ve played and enjoyed. Things happen at a particular time, and take a bit of time for the animations to run through. I lock blocks for a quarter of a second, giving the animation time to complete. If you try to swap a locked block, you’ll get a wiggle that says, hey, Cool It. With this, the game seemed to play pretty well.

Enter the Swipe. I’ve got it working now, actually, and. . .goddamnit. It plays better than the tap. I don’t know if it’s more intuitive, but it’s definitely faster, because, at the moment, I’ve got a lot of the timing stuff sort of turned off. You can press your finger down on a block to grab it, then tug the thing over, and everything just slides and is completely happy. The quarter-second delay is broken. The game seems to feel better for it, but now I’m worried that it’ll completely break the feel of the game. It’ll certainly make tap-mode less appealing, since I don’t think you can do as many things as quickly.

So - either I can force a delay into swipe mode and cripple it like taps, leave it as is and have a lame tap mode, or try to disable the delay for tap mode. There’s one little animation glitch with the current swipe mode, but it doesn’t seem like a good enough reason not to turn something on for the sake of better gameplay.

Woof. Compromises.

Waterfight Pre-Mortem

Like a lot of indies and hobbyists, I play around with a lot of prototypes. Most of the time, these don’t see the light of day, and for good reason - they’re generally awful. It’s occurred to me more and more recently, though, that the cone of shamesilence might be more appropriate for, say, Apple, and less appropriate for someone nobody’s heard of.

So with that in mind, I thought it’d be a fun exercise to share some of my less-awful fiddlings, on the off-chance that someone finds them interesting. If nothing else, these are great mistakes to learn from. There’s also the slim chance that they’ll encourage me to actually finish them - finishing stuff’s always a good thing, even if it’s complete garbage.

Initial Motivation

{% flickr_image 9423048349 n left “An early test with hue shifting.” %}

There was a great article about making caves with cellular automata from. . .sheesh, back in March, I think. @madgarden, one of my many nemeses, wrote a quick little C implementation and pushed a neat little toy game of life up onto the App Store. When I saw this thing make caves, for some reason, my first thought was how they’d look if they were full of water, and you could drop ink into it to see it spread. You’d have a fun little set of restrictions on where the water could go, and a bit of falloff as the ring lost momentum.

Crackpot idea, huh? But it seemed like something that’d be neat to see working, so I promptly forgot about the idea for a month or two while I was trying to get Panic Attack shipped. Eventually, I came back to it in the middle of May. According to screenshots, it looks like I spent about a week playing around with it before interest fizzled. It looks like this was, more or less, while Panic Attack was in review. Go figure.

What’d I Build?

{% flickr_image 9425814028 n right “Territorial spread in action. I like the pretty teal.” %}

What exists now is actually remarkably close to what the original idea was. You can mark points on a 2d grid of colored cells, taking turns with your opponent in an attempt to control as much of the available space as possible. Some of the mechanics don’t work quite as you’d expect, but this is. . .techno. . .something, not water.

What Went Right, and Why?

The cellular automata stuff got hooked up and working really, stupidly fast. I pretty much have @madgarden to thank for that. I also tried doing something a little different. For nerd talk, the game is pretty much just a big grid of CALayers. I overlap them slightly, such that their borders rest on top of their neighbors. I offset the colors just slightly on each, fiddling with small deltas on saturation and luminance, and I think it turned out really kind of pretty.

Doing colors with HSB rather than RGB is something I’m probably going to do more and more going forward, particularly in places where I want to keep a fairly distinctive color scheme but want to keep some kind of interesting noise. This was a trick I first tried playing with on the dumb LD26 project - that’ll get one of these pre-mortems, too, at some point.

What Sucked, and Why?

The game itself was kind of slow. This is because I’m doing things in a thickheaded way. It’s definitely not shippable as it stands now, but maybe moving to some of the new iOS7 stuff will make it tolerable.

The UI/interaction stuff is also godawful. It was getting better near the end, but it was really hard to tell what the hell was going on, and what various taps would do. It was barely usable for me, and certainly doesn’t pass the Spouse Test.

What’s Next?

Maybe iOS7, but probably nothing. It looked pretty, at least, so it has that going for it. I’m not even sure there’s much of a market for this, so at best it’d probably just be a free app.

iOS7 Automatic Updates

Automatic App Update is one of the new headline features in iOS 7. Part of me is thrilled, particularly as a developer - now, I’m less likely to wonder whether a customer is running the latest version of my software. Sure, that particular class of defects is still going to be something to consider, but now it’ll hopefully be less prevalent.

A snooty part of my personality, though, wondered how necessary it was. I mean, we get a badge and everything, and people who don’t pay attention to their home screen or don’t bother to update apps don’t deserve special privilege. Right?

Except, today, I spent all day bouncing between apps. Never touched Springboard once, and had a few things in the background that’d been updated - apps I actually use and enjoy, no less. Uh. Whoops.

This, if nothing else, is really a step in the same direction as a lack of task manager and some (basic on a traditional PC) features, like rich storage management controls. It advocates that users shouldn’t have to give any kind of a shit, and their stuff’ll just work, and be new, bright and shiny.

This, of course, begs the question about what happens when a developer, inevitably, ships the DO NOT UPDATE! update, but time’ll tell if Apple has something new for that particular issue. As far as I’m aware, a developer can issue a rollback for an update, but this is still problematic if you’re using Core Data and its handy, helpful automatic migration (I’ll spare you the boring details). In most apps, though, this’ll probably work out just fine.

All in all, I’m actually really looking forward to 7.

Habits

New Years’ Resolutions, by and large, are a crock of shit. Most people who make them don’t follow them, and they’re just a fantastic source of guilt for just about everyone. Boring. Write about something else.

This year, instead of making resolutions I won’t keep, I’m just trying to passively do little things that’ll help me as I go. One of the things that took me nearly two weeks to notice was a brief nightly journal. Every night, assuming I’ve done something, I jot down a few sentences, maybe a paragraph or two, into my journal. GTD folks might call it a decompression, or a dump, or a hull breach, but for me, it’s just a way to kind of vomit a few words onto the page.

Another thing, and this is kind of a bigger one, is to just do a little bit every day. It’s hard when you’ve had a lingering, stupid little cold since November, but it’s getting easier as time passes. This might be something like start a refactor of past stupidities, or twiddle with how buttons look, or even crack open a fresh prototype. Any progress is good progress.

These have actually helped me build and keep more momentum, assuming that I manage to keep it up. Only 11 more months to go, though, right? Then I can go back to being an awful person. I can hardly wait!

2013 Plans and Goals

Okay, let’s get this show on the road. Next year, I promise, I’ll do this a month earlier!

What do I actually want to get done in 2013? Basically, the same plans as 2012 - it’d be nice to actually make something and send it out into the world to get ripped apart. This year, though, I’ve got some new ideas and some different plans.

For one thing, I’ve been working on something based on an odd idea I had over the summer. That’s not quite ready to show yet, unless you’ve been following on twitter, in which case, uh, you’ve seen it. Same with a bullet hell-esque shooter. That one’s a pure mechanical nightmare. There’s also another clone that’s in the works, but way too early to talk about.

The odd thing about all of those? They’re basically clones, with a minor twist. Yes, that’s sort of intentional, for reasons which deserve their own post.

But, all is not boring and dull! One neat thing that I’m pursuing is sort of tertiary to all of this game development stuff. I’ve had a fascination with games for people of different tastes and persuasions - one of my favorite things to ponder is how, exactly, I’d write a game for someone who was visually impaired. I’ve actually considered making The Dungeon easier to play for non-sighted users, but I don’t think any of them would actually want to play it. (If that’s not the case, please yell at me, and I can try to make it happen. Honest.)

So, games for. . .not 10-50 year olds. Who does that leave us with? Well, either slower games, or. . .hm. Early education? Surely nobody buys software for toddlers and pre-kindergarden. . .

2012 Retrospective

Because this went so well, it seemed like a good idea to take a look through last year’s as I start to think about what to do this year. In no particular order, they were basically:

* Ship The Dungeon 2.0
* Mac version of TD?
* Make a Not-Game
* Write more

Woof. One out of, uh, four ain’t bad, right? If nothing else, there’s room for improvement, and to be fair, the 2.0 update (and .0.1 and .0.2) ended up being pretty damned big. It’s almost gotten to the point where I’m not completely ashamed of it, either, so that’s bonus awesome.

The Mac version ended up being a bit of a quagmire, and interest petered out pretty quickly. It really is better suited for a quick, 30 second play experience, not the kind of deep game that most desktop players are accustomed to.

The Not-Game projects both petered out as well due to lack of interest, as did writing more. This started to pick up a little as I switched away from Posterous and over towards this static site thing with Octopress (couldn’t you tell?) I’d like to write more, because I really do enjoy it. I’ve got a few things that’ve needed doing for a few months now, but am finally hitting a stride where things are actually being accomplished on a night-to-night basis.

That’s not to say I’m disappointed with how 2012 went. It was kind of a colossal year, with a huge change right near the end. I prototyped a few things, one of which is still being developed, and deserves its own little chunk of space. All done looking backwards now - time to look ahead. Woof!

Dome Rotation

I’ve been playing around a bit with a few little iOS apps, and one of the annoying things I’ve come across is how rotation is handled: specifically, how it isn’t quite handled by your views. It is, from a certain point of view, just fine, but from another, it’s completely nuts.

Every UIView has what’s called a transform - the linear algebra explanation is that it’s a 3x3 matrix that mucks about with your UIView’s box in 3d-space. This is all well and good, until you ask for your view’s center after rotating.

Read that again. Okay.

So, time for a quick test. Portrait mode, iPad, what’s my center? {384, 512}. Width, height, all well and good.

Rotate to landscape (so now we’re wider than we are tall). What’s the view’s center? {384, 512}? Uh. Hm.

Were you expecting that? I sure as heck wasn’t. I don’t really have a great solution for this yet, either, so if you’re like me, and enjoy positioning crap based on your view’s coordinates, you might be a little sad. Fear not, however! There’s a semi-awful solution that isn’t too hardcore stupid. In your view controller, just add a few methods:

-(CGPoint)center
{
	return CGPointApplyAffineTransform(self.view.center, self.view.transform);
}

-(CGRect)frame
{
	return CGRectApplyAffineTransform(self.view.frame, self.view.transform);
}

As always, test and log thoroughly before taking this at face value. Also, this means that instead of doing self.view.center, you’d end up with just self.center. Both’ll work fine in portrait, but only one’ll be happy with all rotations.

Buildiness

For quite some time now, I’ve had a bit of a wild hare about something incredibly stupid. After being pestered a few too many times about getting a TestFlight build while away from my computer, I thought, hey, it’d be sweet if I could, from my phone, tell the damned machine to make a new build and push it up to TestFlight.

So, one weekend when I was particularly full of beans, I gave it a quick, vicious stab.

Thankfully, someone else already solved a hell of a lot of this problem. My minor contribution is a bit of AppleScript-y magic that fires a script off from an iMessage (which, in light of their reliability, was maybe not my best choice. Still, it hasn’t missed a build so far.)

What’s the practical use of this? For one thing, if I can keep project sizes small (let’s say under half a meg) it ends up being faster for me to push everything up via this script, then use TestFlight to install on all of the various devices I’m building for. All of the things I’m working on are Universal and support iOS 5.1, so I’ve got: a 3GS, a 4, an iPad 1, and a now-horrifically-embarrassingly out of date iPad 3 (which I adore. Seriously. It’s what I’ve been doing all of my blogging on).

The other, somewhat less silly part about this is that I don’t actually need a computer for development. Well, sure, I need something to go compile some shit, but I don’t actually need it with me. I was inspired by some lunatic’s story about ditching his laptop for an iPad/linode server, and this is kind of like the poor man’s version of that. No slight intended to Textastic (which is great) but it doesn’t make Obj-C development as easy as Xcode. Shucks.

It’s sure as hell good enough to muddle about, though, and learning not to depend on newfangled tools is probably a good thing for anyone to learn. It’s also not the worst debugging feedback loop I’ve ever worked with, though by golly, does it come close.

First, I started off using the following GitHub gist. It’s really what’s doing most of the heavy lifting. It’ll clean your builds, make the project, sign with a provisioning profile, then curl it on up to TestFlight.

#!/bin/sh

# Current as working as of 2012/4/17
# Xcode 4.3.2

PROJECT_ROOT="$HOME/SomeDirWhereYourProjectLives/XXXXXXXX"

WORKSPACE="$PROJECT_ROOT/XXXXXXXX.xcodeproj/project.xcworkspace"
CONFIG="AdHoc"
SCHEME="XXXXXXXX"
SDK="iphoneos"
TARGET="XXXXXXXX"
BUILDDIR="$HOME/build$TARGET"
OUTPUTDIR="$BUILDDIR/AdHoc-iphoneos"
APPNAME="XXXXXXXX"
DEVELOPER_NAME="John Doe (PRTG45V3X)"
PROVISIONING_PROFILE="$PROJECT_ROOT/XXXXXXXX.mobileprovision"

echo $BUILDDIR

cd $PROJECT_ROOT

echo "********************"
echo "*     Cleaning     *"
echo "********************"
xcodebuild -alltargets clean

# echo "********************"
# echo "*     Archiving     *"
# echo "********************"
# xcodebuild -workspace $WORKSPACE -scheme $SCHEME archive

echo "********************"
echo "*     Building     *" 
echo "********************"
xcodebuild -sdk "$SDK" -target $TARGET -configuration "$CONFIG" OBJROOT=$BUILDDIR SYMROOT=$BUILDDIR

echo "********************"
echo "*     Signing      *"
echo "********************"
xcrun -log -sdk iphoneos PackageApplication -v "$OUTPUTDIR/$APPNAME.app" -o "$OUTPUTDIR/$APPNAME.ipa" -sign "$DEVELOPER_NAME" -embed "$PROVISIONING_PROFILE"

API_TOKEN="ZZZZZZZZZZZZZZ"
TEAM_TOKEN="YYYYYYYYYYYYYY"
RELEASE_NOTES="TBD"

# remove the old zipped dSYM
rm -rf "$OUTPUTDIR/$APPNAME.app.dSYM.zip"
# zip up the new dSYM, we must cd to where the dSYM is or the zip command will zip up tons of intermediate dirs
cd $OUTPUTDIR
zip -r -9 "$OUTPUTDIR/$APPNAME.app.dSYM.zip" "$APPNAME.app.dSYM"

curl http://testflightapp.com/api/builds.json \
  -F file="@$OUTPUTDIR/$APPNAME.ipa" \
  -F dsym="@$OUTPUTDIR/$APPNAME.app.dSYM.zip" \
  -F api_token="$API_TOKEN" \
  -F team_token="$TEAM_TOKEN" \
  -F notes="$RELEASE_NOTES" -v

echo "********************"
echo "*    Cleaning up   *"
echo "********************"
echo $BUILDDIR
rm -Rf "$BUILDDIR"

Also, you might need to do this just before signing, in order to unlock the keychain:

security unlock-keychain -p YOUR_PASSWORD "$HOME/Library/Keychains/login.keychain"

The trick, for me, is that I keep all of my projects in my Dropbox folder. I’d prefer not to have my build directories live in there, where they’ll be muddling with files a bunch, so I have my DerivedData actually spit out into ~/build instead. (I somehow got this to work through Xcode, too, though I now have no friggin’ clue how.)

I’ve also got this AppleScript hooked up to fire in Messages on message received events. It checks against who sent the message in order to only fire the script if I’ve asked it to do work. It’d be kind of cool to have a smarter whitelist, but for now, this is good enough. I’ve tried making it a bit smarter to clear out the unread badge count, but my script-fu is not quite strong enough. Consider it an exercise for the reader!

using terms from application "Messages"
	
    on message received theMessage from theBuddy for theChat
        -- display dialog (theBuddy's name as string)
        set whoDidIt to full name of theBuddy
        -- display alert whoDidIt & who & theMessage & huh
        if whoDidIt is equal to "Jim Truher" then
            tell application "Terminal"
                activate
                do script "automatedBuildAndUploadToTestflight.sh " & theMessage & ";exit"
            end tell
        end if
		
    end message received
	
end using terms from

After using this system for a few weeks, it’s occurred to me that the really neat, useful part about this whole workflow is that I can end up pushing TestFlight builds a hell of a lot more easily now than I could before. It’s really pretty fantastic.

Ramblings

A few months after my son was born (this would have been September, 2011), circumstances dictated that my office become a guest bedroom once more. This really was a great thing, because it meant that the person occupying it was helping life not devolve into some kind of horror flick. An interesting side-effect was that I moved my laptop into the kitchen and did most of my fun work there (the 2.0 update for TD, at the time).

This also meant that I did a fair bit of writing, too. I actually really enjoy it, partly as a means of expressing and organizing my scattered thoughts, and partly as a measure of “things made”. I like making things, and I’m slowly starting to believe that the more things I make, the better I’ll be at making them.

Back to writing, though. I played around briefly - three or four days, at most - on 750words.com, and actually really enjoyed the experience. Spending fifteen minutes to write 750 words was incredibly cathartic, especially given how much work-related stress I was under at the time. It made me want to write more, which ended up making writing circle back around to a source of guilt instead.

“Guilt?!” you say. “How can this possibly make you feel guilty?” Well, you see, I don’t do it. I can sit down at my desk and not write shit. That’s where I program, you see, or browse reddit, or do any number of things that aren’t “write some goddamned prose, you monkey.” And, yet, this is being written, right now! How can that be?!

Well, I’m at the kitchen table right now. Obviously.

The Dungeon 2.0.2 Update

The 2.0.2 was submitted last night. I decided to do the app store update in limerick form and post a more detailed list here.

  • Potions now give a little bit of hunger back, depending on difficulty level.
  • The twitter button on the main menu now redirects to halfbitsoftware.com because I’m certain nobody cares about @halfbitsoftware.
  • Minor Twitter text formatting bug fixed.
  • Removed a few megs of unused images and compressed existing images.
  • Added retina splash screen
  • Fixed view screen bug.
  • Wizards now start with more wand charges to make the early game a bit more fair.
  • Animation fix on wand blasts.
  • Fixed minor high scores list issue.
  • Fixed empty name error.

How I Get Stuff Done

I’ve been meaning to write this for awhile, mostly because I find it interesting seeing how other people work and figured someone might find this useful. I actually keep my task list, for the most part, in a physical journal, written with an actual pen (a fountain pen, because that’s just how I roll). It’s a system I’ve been fumbling with for almost a decade now, and it’s absolutely not perfect yet, but it’s certainly good enough for right now.

I pretty much do all of my todo listing and heavy thinking in a little journal. I’m always tempted by technical solutions, like the many, many todo list apps on iOS and OS X, but I feel like they’ll let me do too much, too quickly. I need something that’ll slow me down and force me to think hard, rather than something that’ll just let me spew thoughts uncontrollably. Often, in the course of writing down what I have to do, I’ll actually figure out how the hell to do it, too. It’s rare, but still counts as bonus awesome.

This, sadly, leads to a bit of angst every 3-6 months when I start to get dissatisfied with the system. The biggest bummer, at the moment, is that if my notebook isn’t here, I can’t really record anything for later, which is why I’ve also started using Elements on iPhone and having it poke into nvALT’s text directory, which syncs to Dropbox. It isn’t bad for little notes, but I don’t think it’s good for much else than jotting down quick notes for later digestion.

My favorite pen/ink combination, thus far, is also the first pen I tried. It’s a boring Lamy Safari, in charcoal, with a black EF nib. Because it’s not black enough, I also use Sailor Nano black ink, which is an incredibly dark, durable ink. It also flows really well, though has a tendency to clog on thinner, crappier pens.

My journal of choice, because I’m a dipshit, are those trendy, floofy moleskine journals from various reputable retailers. I like the graph paper ones for general project tracking and todo listing, and the plain ones for when I. . .don’t really want lines. They’re better for drawing, too. Their paper is plenty good for my needs, I like the feel of them, and it’s a cheap thrill to see the finished ones lined up, all nice and neat on my shelf.

Every once in awhile, I flip through old journals, but that’s a different post.