360iDev 2012 & Game Jams in general

A couple of weeks ago, I went to 360iDev, an iPhone/iOS conference that has been going on for a few years now, devoted entirely to iPhone (and now iPad) development. I actually went last year too, and that year had been to WWDC only a few months before. It was my first time at either conference, and I got a lot out of both of them. But the fact that 360iDev can even hold a candle to the flame that is Apple’s flagship developer conference (WWDC) speaks volumes about how great it is. This year, I elected to go to GDC instead of WWDC, but I still wanted to go to a big tech-focused conference, so I went to 360iDev.

Both years at 360iDev, I took part in the 360iDev Game Jam. (I also wrote a blog post about the game I made last year, which I then called ColorWheel.) This year, I teamed up with a guy named Levi that I’d never met or worked with before, we managed to make a pretty cool (albiet very simple) little puzzle game in the allotted 12 hours. I’ve tentatively started calling it Cloud Growth. I just finished a write-up of Cloud Growth (UPDATE: I’ve recovered the text from the game jam site, which no longer exists, and posted it below this post.), including some more details about the game’s development over on the Game Jam website. The theme of the game jam this year was “growth”, and our game heavily features clouds, so the naming was not particularly creative. The mechanics aren’t particularly creative either, but I can’t remember playing a game with them before, so I do want to polish this little prototype up, and release it at some point.

Anyway, Game jams are awesome. If you are interested in making games I would highly recommend the experience. But don’t take my word for it! At 360iDev, I attended a talk by Phil Hassey, an indie game developer who made a name for himself with a fantastic RTS called Galcon. Phil’s talk was mostly a postmortem for Galcon and his latest game Dynamite Jack, but he must have plugged Ludum Dare about twenty times. (He helps run the thing.) Ludum Dare actually happens bi-monthly. I was going to participate in August, but spent Friday evening working on a project to make games easier for me to write instead. (I will probably talk more about that project here on this blog eventually.)

It feels these days like there’s a game jam every weekend. Last weekend, for example, there was a game jam devoted to making games in the universe of Adventure Time, the TV show. (If I hadn’t been exhausted from a full week of 360iDev, and my lack of sleep that Tuesday night, I’d have been seriously tempted to take part, because Adventure Time is awesome.) A few months back there was a game jam where the participants were supposed to create games inspired by a twitter parody (@petermolydeux) of the relatively famous game creator/producer, Peter Molyneux. I think Peter Molyneux even attended the event!

Previously, I’ve also participated in the Global Game Jam. I can’t wait to do more of them.


Cloud Growth is a simple action puzzle game collaboration between Martin Grider (@livingtech), and Levi Brown, (@levigroker, blog).

We did about ten or twenty minutes of brainstorming, and eventually decided on this concept where we are placing simple clouds on a grid of open sky. There is a cloud “queue” in the upper right hand corner of the screen, so you know what the next one to be placed will be. Clouds have different colors, and if two clouds of the same color are placed next to one another, they will grow into a square of one size larger than the largest sized cloud of the two. You get points for placing clouds, and more points for growing clouds.

Martin wrote all of the game logic and most of the view controller code. Part of Martin’s enthusiasm for this particular concept was that he wanted to continue work on a generic GameModel object he’d been writing that abstracts away the “game grid”, as well as touch interactions on that grid. This was a resounding success, and much code was added to that library.

Levi did all the artwork and animations. These screenshots do not adequately capture the awesomeness of those animations. When a cloud is placed, for example, there is a really great bouncing effect, that is just fun to see. A good portion of Levi’s time in the wee hours of the morning was spent ensuring that the lightening bolts (currently shown when clouds reach the 3rd largest size), begin at the cloud of their origin, and end at the lightening tower at the bottom of the screen.

Future ideas:
* Part of the original concept was that the clouds would get removed from the gameboard after a certain threshold, but as the clouds cannot currently grow more than three times, that made the game far too easy. When code is written for larger growth, this idea will be revisited.
* Some kind of lightening counter would be fun, maybe with progressively harder levels as the counter is filled.

Abstract Puzzle, the name, the logo

How clever is too clever? If a puzzle exists in the forest, but nobody is around to solve it, is it still interesting? (Translation: If you make a puzzle, but tell nobody that it exists to be solved, will anybody ever solve it? …probably not likely.)

I like my puzzles with well defined rules. I tend to get frustrated with really open-ended puzzles. (One of the reasons I never really got into crosswords, that and my brain is rubbish for trivia.) That makes the following admission all the more worthy of admonishment. Essentially, I was chatting with the designer for Oppo-Citrus yesterday, and it became clear that he hadn’t understood the logo I created for Abstract Puzzle (that’s it on the right). Now, I know the logo is rather amateurish in terms of graphic design, but I mentioned that I liked the idea behind it if not the execution. That’s when I got the blank stare. I had to explain to him that it’s meant to be a chess board made out of puzzle pieces. It’s a hybrid of puzzles and games. It’s a puzzle game. That hadn’t been clear to him, which of course had me questioning whether it was clear to anyone.

Now I actually think that one is okay. It’s just a logo. Its importance is in recognizability, not necessarily understandability. And I think it looks fairly unique. (Though, again, I’m thinking of it more as a first-draft than the final representation of my business.) It’s not what prompted me to write this post.

What prompted me to write the post was realizing that the name of the business actually suffers from the same issue. Only, I think there’s even less chance people are going to understand the name. So that’s why I’m writing this. To explain it. To give it away. So… um, spoiler alert. I guess. If you consider a puzzle nobody actually knows is a puzzle to be spoilable.

Abstract Puzzle — two words, meant to evoke another hybrid concept. “Abstract strategy”, my favorite kind of board game, and “action puzzle”, my favorite kind of video game. It’s just like the name of this website, Chesstris, only instead of combining specifics, it’s combining general terms.

So there you have it: Why I chose the name that I did for my new business.

How I keep track of TODO items

I came to a realization this morning. I am a programmer. I am not a professional emailer. When I want to get work done, I open XCode, I do not open my email. For this reason, it makes literally no sense for me to keep my tasks in a browser window. From now on, I’m keeping all my tasks in a TODO file with the project, where they belong.

Read-on for some history and analysis of my project management habits.

Continue reading

Slydris – an enthusiastic endorsement

After all the posting I’ve done about Action Puzzle games lately, I would feel remiss if I didn’t write this post. Essentially, I finally picked up Slydris after it went Universal (it was iPad only at launch, then shortly thereafter became available for iPhone too) a week or so ago, and it’s easily been my most-played game recently.

The beauty of Slydris is in its similarity to Tetris without copying (or even using) the geometry mechanics. Essentially, there are horizontal bars of varying length, and you slide them left and right to try and make complete rows (the mechanic it DOES borrow from Tetris). That’s it.

Oh, I guess there is a bar that fills up and lets you delete 3 rows at once, and there are various in-game powerup type blocks. But overall it’s all about sliding those pieces left and right, and getting them to fall into place how you want ’em.

It’s one of the best examples I’ve seen lately of simple gameplay leading to complexity.

I’ve just followed the game’s creator, Luke Schneider, aka radiangames, on twitter (@radiangames). He’s released 12 games in the last two years, which is no small feat. I hope in 2 years I will have come even close to that. (That’s one every two months, which I am sadly nowhere near at this point, 3-months into my indie stint.)

The Slydris Soundtrack is also free right now, which is quite good (listening to it now).

Posted in iOS

TouchArcade and new Action Puzzle Games

Hot on the heels of my Action Puzzle slide deck, I saw a post yesterday on TouchArcade about Fluxe, a new app that bills itself as Action Puzzle, so I checked it out, and I’ve got to say that it’s well worth playing. I won’t get too into the gameplay, since TA already did that, and honestly, reading about it didn’t do much for my understanding anyway. It’s definitely in the “like tetris” category, but it uses the line-clear mechanic rather than the pentominos. It’s only a 4-wide well/column that you’re filling, so none of the pieces are not more than 3 blocks either wide or tall.

As you can see from the screenshot, there are lines across 3 of the sides of the app. Those are timers. I know what the ones on the left and right do, but I’m not actually sure what the one at the bottom does offhand. I’ve been struggling with whether to implement timers in Oppo-Citrus, so that is a topic of interest to me.

Anyway, TouchArcade has been giving a lot of love to action puzzle games lately, with their recent review (which couldn’t have been more positive) and subsequent creator interview for the slide-a-row RPG 10000000. 10000000 looks to do for slide-a-row what Dungeon Raid did for the drag-over-like-colors-to-remove mechanic, which is to say, it just slaps D&D/RPG elements all over it. (Someone mentioned Dungeon Raid at our MN Game Devs group, and I had to admit I had just totally forgotten about it.)

I could probably have given “Action Puzzle Games with RPG Elements” its own page in the slide-deck. The first one I remember playing was Puzzle Quest, and it and its sequel have a presence in the app store, (although they’re not great ports, was my impression). TouchArcade also recently reviewed Puzzle Dungeons (which is free), and unfortunately after checking it out for a bit I’ve concluded it doesn’t add terribly much to the subgenre. (But it is a solid game if you can’t get enough match-3.)

TA also previewed what looks to be an original action puzzle game I can’t wait to try (looks like it just came out today) for the iPad called Slydris.

Action Puzzle Games

I presented the following slides on Action Puzzle Games tonight at the MN Mobile Game Dev Group. I’m not sure the slides are really enough to convey the meaning, but most of this is really just a list of good Action Puzzle Games for iOS, and I said I’d post those, so here they are.

Special thanks to Jesper Juul, from whose amazing article (“Swap Adjacent Gems to Make Sets of Three: A History of Matching Tile Games”) I stole the Family Tree of matching tile games.

MailChimp signups from iOS – How to add a subscriber to a MailChimp Group

This week, I’ve spent some of my time integrating MailChimp into the client work I’m doing. I found some of the documentation lacking, and there is no example for how to add your email signups to a MailChimp’s list “Group”, so I thought I’d document that here.

(Astute readers who are actually reading from chesstris.com will notice the fact that I’ve got a MailChimp signup form on Chesstris.com also. I haven’t done anything with it, and so far, I’m the only person who has signed up, but it’s there. I’m still sort of trying it out.)

MailChimp has an iOS SDK they call ChimpKit, which is available up on github. In general, it’s a great SDK, but the README has some installation instructions that are both incomplete and also pretty stupid, as far as I’m concerned. After fiddling around with it for a couple of hours yesterday, I’ve concluded that there is no reason to include their sample project as a git submodule of your project. The instructions I’m going to suggest basically don’t do that, so if you are ultra concerned with keeping up to date with the ChimpKit project (keep in mind it hasn’t been updated since 9 months ago), then read-no-further, and go figure out how to actually use the classes in their sample project yourself (since that’s what’s missing from their instructions). Personally, I think git submodules are a PITA, and not worth the effort anyway.

OK, so what you really want to do is the following:

1) Download the ChimpKit code. You can clone it on github, or just download, your preference.

2) ChimpKit requires SBJson, so you’ll need to include that project’s files in your project. You can do this as a git submodule if you really want, but you already know how I feel about those. You can also just add the files to your project and be done with it.

3) Grab just the files in ChimpKit’s “Core” folder and drag them into your project (or use the “Add files…” dialogue). Personally, I like to organize code in my projects in a certain way, so I copied the directory into my project’s “Externals” directory, and renamed it from “Core” to “ChimpKit”.

4) If you don’t care about adding your subscriber to a group, you just need to do the following:

4.a) Add the include: #import "SubscribeAlertView.h" to the top of your view controller or wherever.

4.b) Add this code somewhere, maybe after an IBAction or something.

SubscribeAlertView *alert = [[SubscribeAlertView alloc]
initWithTitle:@"Newsletter Sign-up"
message:@"To sign up for the newsletter please input your email address below."
apiKey:mailChimpAPIKey_
listId:mailChimpListID_
cancelButtonTitle:@"Cancel"
subscribeButtonTitle:@"Confirm"];
[alert show];

Of course you’ll need to define mailChimpAPIKey_ and mailChimpListID_, but both are strings. If you don’t know your list ID, you can find that on the mailchimp website. (Or by using the “lists” api method, and you can see an example of that below.)

…and you’re done!

5) But assuming you care about adding your subscribers to the group, there are two ways you could go. You could modify the code in SubscribeAlertView, or implement the subscribe form yourself. I’m going to assume the former, and not go into the latter, even though it’s what I’m probably going to do since I think their popup looks like toasted a$$.

6) Next we’re going to find your list’s groups. You might be able to skip this step if you already know the name of your grouping and groups, because the API also supports adding by name, but I think this is a better way because a) you can use the ID, and b) you are sure to use the right strings, because you’ll be copy/pasting them out of the JSON. I actually had to perform this step because I’m not the MailChimp admin, I just have access to an API key.

6.a) First, set up the object you’re going to be calling this code from as a <ChimpKitDelegate> in your header, and #import "ChimpKit.h" in the source file.

6.b) Then implement the chimpkit delegate methods:

#pragma mark - chimpkit delegate methods

- (void)ckRequestSucceeded:(ChimpKit *)ckRequest {
NSLog(@"HTTP Status Code: %d", [ckRequest responseStatusCode]);
NSLog(@"Response String: %@", [ckRequest responseString]);
}

- (void)ckRequestFailed:(NSError *)error {
NSLog(@"Response Error: %@", error);
}

6.c) Finally, you’ll need to run the following code to call the MailChimp’s ‘listInterestGroupings‘ API method. Again, you’ll need to define mailChimpListID_. (I just ran this in a ViewController’s viewDidLoad method.)

ChimpKit *ck = [[ChimpKit alloc] initWithDelegate:self
andApiKey:mailChimpAPIKey_];

// get the lists
// [ck callApiMethod:@"lists" withParams:nil];

// get the list groups
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setValue:mailChimpListID_ forKey:@"id"];
[ck callApiMethod:@"listInterestGroupings" withParams:params];

(There’s your example in there of how to get the lists.)

With any luck, you’ll get a response that is a big block of JSON. Use your favorite online JSON parser to turn that into something readable, and it’ll probably look something like this:

[
{
"id":9501,
"name":"Web Signups",
"form_field":"hidden",
"display_order":"0",
"groups":[
{
"bit":"1",
"name":"likes chess",
"display_order":"1",
"subscribers":0
},
{
"bit":"2",
"name":"likes go",
"display_order":"2",
"subscribers":0
},
{
"bit":"4",
"name":"likes puzzle games",
"display_order":"3",
"subscribers":0
}]
}
]

7) Add your group subscriptions by modifying SubscribeAlertView.m around line 140 to look like the following:

NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setValue:self.listId forKey:@"id"];
[params setValue:self.textField.text forKey:@"email_address"];
[params setValue:@"true" forKey:@"double_optin"];
[params setValue:@"true" forKey:@"update_existing"];
NSMutableDictionary *mergeVars = [NSMutableDictionary dictionary];
[mergeVars setValue:
[NSArray arrayWithObjects:
[NSDictionary dictionaryWithObjectsAndKeys:
@"9501", @"id",
@"likes go, likes puzzle games", @"groups",
nil],
nil]
forKey:@"GROUPINGS"];
[params setValue:mergeVars forKey:@"merge_vars"];
[self.chimpKit callApiMethod:@"listSubscribe" withParams:params];

You’ll also note that double_optin was set to false by default. That’s a stupid default, IMHO.

So there you have it. I think you could probably replace the @"9501", @"id" key/value pair with @"Web Signups", @"name", according to the API docs, but I only tried the ID. I also added some code to the SubscribeAlertView‘s requestCompleted:(ChimpKit *)request method to actually let me know that the submission was successful, but other than that, I think I’ve outlined everything pretty well. Let me know if you find this useful.

Oh, and so life happens and it’s July and Oppo-Citrus isn’t out yet. It’s still “right around the corner”, but as you can see I’ve started this exciting (no really!) freelance project. I was definitely hoping this would happen when I set out on my own, and it’s been going great! It’s 20 hours a week of my time, and it turns out that’s actually more than half my time as an indie. (I don’t think it’s because I’m not working 40 hours either, I think there are just hours you end up “losing” to email or twitter or whatever.) Anyway, last week was a holiday week (the boss gave me two days off!), and I’m planning on slacking some this week too, so I haven’t worked on Oppo-Citrus as much as I’ve wanted. The next goal is to get it at least submitted to apple before I leave for vacation the last week of this month. We shall see. We shall see.

Music for Oppo-Citrus

I have spent probably about a day of the last 2 & 1/2 weeks playing around with Pure Data and its iOS counterpart, libpd. After some digging and asking around, I think this is the best way to synthesize music on the iPhone. (By that, I mean generate music “from nothing”, rather than just play mp3s and stuff like that.) I now feel I know enough to be dangerous, but also have reached the point — inevitable in every learning endeavor — where I’ve realized and feel a bit overwhelmed by how very much there is yet to learn. Pure Data (and it’s closed-source predecessor Max) is one of those programs that is so open-ended that you could probably spend your entire life working in it. It’s not so much the program that is overwhelming though. It’s the realization that ultimately what I’m doing is making music. Even if I want to cheat in every possible way, it still comes down to composition. I am composing music. Pure Data is just like any other musical instrument (although possibly the most complex one I have ever encountered), and I’m just not sure whether my compositions are worthy of inclusion in a game.

So I’m going to look for a musician for Oppo-Citrus. One who can work for peanuts, or better yet, virtual peanuts, because that’s what I can afford to give them. Ideally, I’m looking to turn a grid of numbers into a looping sound mosaic. But more importantly, a mosaic that doesn’t completely suck.

I actually came here to write a post about having registered my LLC officially with the state. The name of my new company is Abstract Puzzle, and I’m sure you’ll read more about it in the near future. It’s already got it’s own facebook page, and if you’re reading this, and you haven’t already, it’s be super great if you could go over there and like it.

But then I started listening to my old friend John Keston’s music on SoundCloud, and felt inspired to write about my libpd “research”. Music is incredibly inspirational, and I’ve been reprimanded in iTunes reviews (well, maybe only one) for not including some in ActionChess. My reasoning was always that it’s also incredibly subjective, and one person’s mozart is another person’s … well, mozart. Anyway, music can be as abrasive as it is immersive. I really like the idea of creating a truly unique and interesting sound experience though, and I think if done correctly, that might be worth the extra effort.

Announcing Oppo-Citrus

You already saw the logo in my last post, but here it is again for posterity. Cool, huh?

I realized I was procrastinating this post, partly because I don’t know what to write here. I mean, this should be a teaser, so I don’t want to give away all the details, but I also want to be honest about giving an insight into the work I’m doing, both technically, and from a game design perspective.

There was another reason for not writing, a personal one that I normally wouldn’t go into here, but since I said I was going to have this post done a couple of days ago, I figure I should at least mention the real reason it’s later. The short of it is that I haven’t gotten anything done the last couple of days because my 2-year old daughter has been sick. The doctor thinks it might be whooping-cough, which despite having the silliest sounding name of any child’s illness, is actually fairly serious, and can lead to death in very small children. (Fortunately, she’s beyond that age, but it hasn’t been easy, and the most frustrating symptom is coughing until she vomits or gets very short of breath.) Anyway, it’s been a rough first week as an indie. I keep reminding myself that this is at least part of why I wanted to do this. I have the freedom to drop everything now and take care of her as needed. Yes, I might be delaying a product launch by a couple of days, and maybe I won’t make as much money in that time or whatever, but those are tradeoffs I get to make now.

Moving on… Lets start with the basic premise.

game_screenHere’s the current mockup of the game screen for Oppo-Citrus. The first idea I had for this is still intact: you drag a bar of colored squares into the column above, trying to position it such that you make a shape with four (or more) of the same color. You get points for every unique tetris shape. Right now, you get 1 point for the first one, 2 for the second, 3 for the third, etc. I thought about making additional shapes a multiplier, but since it’s fairly random right now, it seemed like that might be too rewarding. There is skill to it, don’t get me wrong, but a lot depends on getting the right combinations of colors.

The red shape and faded red squares around it are because this screenshot is mid-animation of removing the shapes made from placement of that top row from the gameboard.

As you can see, this first level is just two colors (lemons and limes), and as you might imagine, it’s actually fairly easy to make shapes. The real question is whether you can make enough shapes before filling up the board to progress onto the next level. That half-filled yellow bar below the row at the bottom is the level progress indicator. As you make shapes, it fills up, and eventually you get a screen that asks whether you would like to continue on to the next level or keep playing this one for points. I’ll leave what happens on subsequent levels up for a future post or posts, but in addition to the obvious (adding more colors), I have lots of ideas for powerups and additional game mechanics that actually change the game pretty radically while sticking with the original premise.