I wrote Pyramid 13 [app store], a “little” Pyramid solitaire game for iOS (it works on iPad as well as iPhone and iPod touch), over the course of the last few months.
I did this initially to scratch my own itch for a better version of the game than I had seen in other multi-solitaire games and a couple of the other dedicated Pyramid games I had tried from the store already. I wanted to make a game that felt more like a native app than many games tend to. I wanted it to be fast to launch, support all the modern things like multitasking (I’m actually often amazed how long it will stay “running” while in the background — days at times on my iPhone 4) and high-res Retina graphics, have simple sound effects (though no music track, but it does allow you to keep playing your own music while playing the game). Also, it’s pretty friendly to the battery, especially for a game.
It was a part-time effort, as I was also working on a couple other apps during the time and getting my indie development company, InfinitApps, in place, registering it with the state as an LLC, getting a bank account, and so on.
In the process of building this game, I decided to try something that’s (probably) somewhat novel for a game, which is to use high-level UIKit code (that’s the Apple framework used for most apps with standard UI elements) for all of the UI. I didn’t use OpenGL or even CoreAnimation directly, but rather I used the animation APIs available in iOS 4 for all of the card animations, including the card flip-and-slide. This worked well (probably better than I expected it to), and it was pretty quick to get the initial playable game working.
Of course, it then became an issue to see how I could make a game worth selling, and I spent quite a bit of time doing the other things that I thought would help set it apart.
I created a few different card styles, including the default one which I think is a nice addition to the landscape for playing Pyramid solitaire: it uses numbers rather than face cards for 11, 12 and 13, thus making it more accessible to younger kids. This one also is more friendly because it color codes the cards not along suit lines, but rather based on the pairs of cards that add up to 13, so 5 and 8 have the same color (and same-colored icon) for example.
I also have a traditional style that uses suited cards, and I threw in a fun one which has hexadecimal and binary numbers on the face. I also played with a couple other styles that I ultimately decided to leave out of 1.0 in order to ship it.
I also wanted to include multiple backgrounds, as the background gets more visible as the cards are removed from the board. Then it was natural to be able to use your own pictures or favorite color for the background or card back. Since I had previously built a color picker for iOS (more on that in a future post, as I hope to release it as open source soon), I included that as a way to change the color of the built-in card backs and some of the backgrounds. For the photographic card backs, I fortunately have a wife who is an accomplished photographer, so she provided me with the better-looking ones.
I also spent the time needed to add Game Center support. This included having a scoring system to let people compare scores based on how far they got in a game. Also included are a handful of achievements (13, naturally) that can be earned as the game is played.
Game Center support turns out to be a bit more involved than one might at first expect due to some choices made in the API and the number of things left to app developers, but it still seems worth the effort to get the additional network effect that is possible with groups of friends playing the same game and comparing results.
One of the things that Game Center achievements require is artwork, so I worked with a designer/artist (who is a friend of mine) to create those, along with the app icon and the stylized card back.
Finally, as I was looking at Pyramid 13 on my iPad one day, I was unhappy with playing the game zoomed up to 2x. Apparently, it is possible to get artwork rendered in high resolution when zoomed up like that (both Trainyard and Carcassonne, even prior to the iPad version coming out last week, would show at least some of their graphics in high-res when rendered in 2x on the iPad). But instead of doing this, I decided to just take the extra time and rework my code to support the iPad natively. This means that when searching for iPad or universal apps in the app store, my game will appear, and it’s a better experience anyway. It fills the screen, and it allows playing while holding the iPad in either orientation (when used on an iPhone, Pyramid 13 is a portrait-only game).
I’m pretty happy with the result. It’s a fun game that I still enjoy playing (even after play-testing it quite a bit for the last few months). I like seeing where I rate relative to my friends and others in Game Center, and it’s nice to see other people, including my mother-in-law, brothers-in-law, sisters-in-law, wife and daughters all enjoy playing it.
Of course, I have plans to make improvements in the future. I want to make the end-of-pyramid experience a bit better with improved graphics and feedback. The toolbar graphics could probably use some tweaking. And there are a couple small bugs I noticed after submitting it. I’ll probably do a 1.1 update to address these (and any other problems that might turn up now that more people are using the app) early next year.
Longer term, I have a couple other card styles I could finish and include, and there are some other Pyramid game variations that could be fun. Of course, I also have other app ideas that I want to dive into, so these other ideas will depend somewhat on how successful Pyramid 13 is in the App Store. Also, I’d be open to localizing it into other languages, but that’s not something I’ve had time to investigate yet.
I’ve also considered doing a Lite version that would remove most of the customizability (but not alter the basic gameplay) and include iAds. This would allow me to release a free-but-ad-supported version, so that could be interesting to pursue.