iPad Universal app with no nibs

May 5, 2010 at 1:04 am (iPhone development, Software Engineering) (, , , )

I don’t believe in using nib files in my iPhone/iPad projects, not even the magic ones that are generated by the default project templates. So, as I’ve been looking into creating universal apps, I have noticed than no one seems to have published a sample universal project that doesn’t use nibs.

I thought I would take this opportunity to provide such a project, so that anyone who wants to create a universal iPad/iPhone app with no nibs, has a clean template to start from that is already setup with all boilerplate work in place.

The project is a part of my rcloudlib repo on github, I encourage you to take a look at it, I keep it very lightweight and include items I find that need in almost every project I work on. The most recent version of the app template will always be in the rcloudlib/samples/rcuniversaltemplate directory, and will be expanded in the future. If you want a direct download of the .zip of the super-clean version that will never change, use this link instead.

The project complies and runs, in both iPhone and iPad mode. You can run both iPad/iPhone in the simulator, using the steps described here.

If you have any comments, recommendations, fixes, or anything else…I’d love to hear them.

Thanks
R.

Permalink 1 Comment

malloc_error_break, double free, iPhone 3.0…maybe you fucked up NSTimer?

June 29, 2009 at 11:13 am (iPhone development, Software Engineering) (, , , , , , , , )

Yesterday, while working on a client project that had been rejected from the app store, I was doing some initial diagnostics and came across this wondrously useless error message in the console:

malloc: *** error for object 0x529d20: double free
*** set a breakpoint in malloc_error_break to debug

Apparently, when doing the quick cert-signing and testing previously, we hadn’t looked at the console on all of the versions…because this particular error is only a warning on the iPhone OS 2.2.1, and a crashing error on 3.0.  Don’t have any idea why the difference across versions, but it’s there.  So when we ran this on an iPod Touch 2.2.1, it seemed to execute fine, you had to be looking at the console, without being alerted by the debugger…tricky little bitch.

Now, I know what a double free is, but I have no idea where to find malloc_error_break…and Google doesn’t fucking help much, it’s just a bunch of people posting build errors on forums, with no useful responses.  I’m hoping this post will make it up the list, and you will potentially find something useful here, instead of just a cry for help.

So…faced with an easily recurring error, I was pretty confident I could knock it out in short order.  The malloc_error_break message was sort of helpful, but not enough.  I could set breakpoints, and never quite nail down the error…I could break before it, and after it (on 2.2.1)…but not on it.

The useful piece of information in that error message is twofold…one, the double free indication.  And two, more importantly, the memory address of the object. That is how I found the source of the error.  I couldn’t find malloc_error_break, but I could guess which objects might be getting double-freed by looking at the code.  It turned out, the original engineers had written this code to stop an NSTimer:

- (void) stopTimer
{
  if (ptrTimer)
  {
    [ptrTimer invalidate];
    [ptrTimer release];
    ptrTimer = nil;
  }
}

this code, is wrong.  The release in the middle is extraneous, and is what was causing the double-free.  The invalidate call is all you need to stop the timer, the setting to nil is nice for sanity.  I looked at the memory addresses of the two initial NSTimers set during app load, and noted them at the breakpoint right before the crash.  And bam, one of the addresses showed up in the error message as the object that had been double-freed.

So, that was it.  There happened to be about 7 different timers floating around the app, all mistakenly stopped in the above way, so the app was absolutely going to crash, no matter what you did.  Commenting out the release was all it took for me…and just over an hour later, I had the app all ready for submission to the app store.  We sent it in this morning, hopefully it should be done by friday.

Thanks
R.

Permalink 4 Comments

Spellwars update: and new Screenshots!

April 29, 2009 at 9:31 am (iPhone development, spellwars) (, , , , , , )

Well, it’s been a long time since I’ve posted here, I’ve been quite busy. But with a lull today, I thought I’d give an update on spellwars, since the forums are still private…and if you are following the game from the outside, you might be wondering what’s going on.

I’ll tell you what’s going on: a hell of a lot! The most obvious changes are visual, the UI has had a complete overhaul, which is probably 30-40% finished, by my lead UI designer Ryan Sumo. He’s been working hard and producing very high quality work, I can’t say enough about how great he is to work with, and how much I love what he produces. There are still some very obvious things not done yet, but they are on “the list.”

Jeffrey Lai has produced some absolutely incredible Spell artwork for Spellwars, I am so proud to have him as our marquee artist. I am still looking for more artists to draw spell art, so if you are interested, please contact me.

Arron Hirst over at RzFLY is working away on a new app icon, and a set of tab icons.

Rudi Cilibrasi has implemented a server, so our multi-player version has officially gotten off the ground (though we still plan to ship a single-player version first). He has also just jumped ship from the windoz desktop experience and ordered a macbook + iPhone, so it looks like I will finally have a partner to pitch in a little bit with some of the iPhone code. Rudi’s programming abilities surpass those of just about everyone I’ve ever known, perhaps mine, so having his support and involvement means a lot.

In terms of gameplay, things are gelling quite nicely. The basic concept hasn’t changed, spells are played out on a 280×280 gameboard, they have attack and defense, and special abilities that are all resolved in a priority stack, so spells with a higher speed resolve first, moving down the list to the slowest spells. Every feature I’ve added that affects combat has been meant to add to the strategic element, while keeping the game still simple and quick. Everything is very visual, so while there is a slight bit of a learning curve, it’s not more than a few minutes before you can learn everything there is to know.

And now, what I know you all want…screenshots!

All things considered, I couldn’t be happier with how Spellwars is coming along. I wish I could move it faster…but I wish for a lot of things, and Spellwars will be ready when it is ready. Hopefully, soon.

If you are interested in getting involved, contact me, there is room for people to contribute at almost all levels. From art, game concepts, playtesting, coding, feedback, and everything in between, if you have the interest, I’ve got room for you. The Spellwars ning group is by invite only, but I am happy to invite anyone who is interested in contributing.

Thanks
R.

Permalink Leave a Comment

Enjoyable vs Competitive Gaming

March 6, 2009 at 7:17 pm (iPhone development) (, , , , , , )

After having just spent a couple hours reads through various game theory web sites and blogs, and almost all of sirlin.net, I’m feeling inspired to write about my approach to developing Spellwars. I want to communicate what kind of gaming experience I am aiming to create, and I’ll start by discussing what the possibilities are.

Types of Gaming

From a certain point of view, one that I happen to share, all gaming (and in particular, all multi-player gaming) can be divided into two categories: enjoyable gaming, and competitive gaming.

Let me clarify a couple things about this statement right off that bat. First, the statement describes the act of playing a game, not the game itself. Certain games naturally lend themselves well to one category or the other, some games easily cover both…and of course quite a lot of games are neither. A few examples of games that are typically played for enjoyment might be World of Warcraft, Diablo II, and any of the myriad of the iPhone mafia games. Yes, there is a degree of PvP competition in all these games, but the driving force of the player engagement and experience is not primarily one of strategic competitiveness.

Second, I am not stating that the two are mutually exclusive. The same game might be played both competitively and for enjoyment, even by the same person at the exact same time, but typically a game is played much differently when it is played competitively than when played primarily for fun.

Types of Games

To explain, lets flip the lens, and look at the games, not the playing.

Consider, for example, Magic:The Gathering…which has an extremely strong following of both casual players, and competitive players. A competitive match is so fundamentally different than a casual, fun game of Magic that the two experiences barely resemble each other. But, it is important that the game supports both types of playing, and does so very well. A competitive game is not necessarily any better or worse than a casual game. The game of Magic can be enjoyed in both capacities, they are just different types of experiences.

On the other hand, there are a certain group of games are pretty much meaningless if not played competitively. Consider for example, Texas Hold’em poker. If you aren’t playing for money, even if it’s fake, there is really nothing interesting at all about playing. The entire draw of the game is all in the competition, the reading other players, calculating the relative values of cards, and the probabilities of outcomes. Chess and Go are two other games, that while they can be played “for fun,” they loose their essential quality and meaning when done so. For the sake of easy reference, I will call this type of game a “pure competitive game.”

The last group, included just for the sake of completeness, are those games that really don’t lend themselves well to any sort of meaningful competitive playing. Some games are just not designed to be played competitively (consider the bulk of World of Warcraft outside of the minimal PvP aspect), but the fact is that most multi-player games do aspire to competitive play. That’s usually the point of making the game multi-player.

Typically, the single major feature that any game in this category lacks is balance. A balanced game is what allows for two players to engage in a competitive battle that is fun and interesting for both sides. When one side is too powerful, there is no competition, there is just domination. It turns out, for those of you not actively engaged in game theory or game design, that creating a well balanced game is incredibly difficult. Add the other real world game requirements, that a game also be fun and engaging, and it’s not too hard to see why most games fall short.

Now, I am no game theory purist. I am interested in creating a game that is, at it’s core, an enjoyable experience. I do happen to believe however, that a well balanced game that can be played competitively adds an element of depth that provides a level of fun and enjoyment that can not be attained by games which ignore the element of balance. I believe that games which support both a casual, fun experience, as well as a deep, balanced, competitive experience offer the best of both worlds, and are the very best type of game.

And that is exactly what I am gunning for with Spellwars.

I do not want to create a pure competitive game, of the type where the game is only competitive, and not fun for the game itself. These pure competitive games tend to actually be played out as merely meta-games, without much of an interesting game left when you are done meta-gaming.

What the hell do I mean by that?

Consider what playing pure competitive games at the highest level actually consists of. I’ve done this with M:TG, and I’ve spent enough time researching game theory and AI that I know the same applies to Go, Chess, and yes even competitive RoShamBo. Basically, the actual mechanics of playing the game become secondary to analyzing the meta-game, that is studying the competitive strategies that other players might possibly use, and then constructing your strategy, be it your deck, your chess opening, or your programmed AI, based on your analysis of the competitive landscape. The actual playing out of the game, once it comes time to play a match, becomes a distant second to the work put in at the meta-gaming level.

For the RoShamBo example, the game itself is so trivial and boring that no one actually plays it. But is it a game that is played competitively? Apparently so. And can you actually apply strategy to it? Yep, you can. Check out this program, Iocaine Powder, which slaughtered the competition in that initial RoShamBo competition. Coming across this really drove home two main points to me:

1. Competitive gaming has nothing to do with gaming, it is all about meta-gaming
2. I want Spellwars to be a fun game, as well as a fun competitive game (i.e. meta-game). But primarily, I want it to be fun to play.

I’m here to create a game, and if it results in an interesting meta-game, hot damn. I am paying very specific attention to the game design to make sure it is balanced and has the ability to support competitive play. I want to encourage people to collect spells and construct spellbooks that can win them a tournament (yes I plan to run tournaments). But I think it’s more important, first and foremost, that the game be engaging and fun on its own.

To me, this means that I will put effort and resources into developing the parts of the game that have nothing to do with the competitive part of the game. These are areas like creating beautiful art, developing storylines and characters, creating rare and limited editions of spells, making strong and powerful items and spells that are fun to find and use. (I personally feel that enabling personal expression through the game is the most important feature for Spellwars, but more on that in a future post.)

So in summary, today I learned that I want to create a game that allows for competitive play, but not at the cost of enjoyable play.

I’d love to hear what you think, these are the types of topics that can drive game designers crazy. For me, it’s what inspires me to keep going…to make that game, the one that does it all better than any other game has done it before. And for the iPhone, right now there’s no competition to speak of. I want to set the standard.

Thanks
R.

Permalink 3 Comments

My life as an independent developer

March 2, 2009 at 10:35 pm (iPhone development) (, , , , )

For today’s blog post, I am going to point to a post I wrote earlier today for another blog titled My indie life: R.Cloud Software. In it, I describe what it’s like to be an independent developer, and I include pictures of me and where I work. It also has some nice discussions of Spellwars that I haven’t really posted anywhere else as of yet, so if you are following the progress of my game, I encourage you to give it a read.

I wrote the article for a brand new site called tenfingersclub. They are building a community where indie game developers can connect with gamers who appreciate and support indie games. As an independent game developer myself, I can appreciate the goal of the site…I think it’s a great concept, and I hope it does well. Indie developers of any type are at an inherent disadvantage when it comes to gaining exposure, so any extra chance, any tools or communities that help give indie developers exposure is a worthy effort in my book.

Thanks
R.

Permalink Leave a Comment

Observer pattern in Objective-C: NSNotificationCenter

February 27, 2009 at 12:59 pm (iPhone development) (, , , )

I want to take a moment and thank the thoughtful developers at Apple (technically NextStep probably, but whatever) for the wonderfully simple, and elegantly powerful NSNotificationCenter. I won’t bother going over the API, there’s already many great blog posts on that (my favorite is here), but I wanted to raise awareness of it, and talk about how I’m using it in Spellwars…as well as discuss the potential pitfalls of abusing an event-based architecture.

The basic premise of the Broadcaster/Observer pattern is to decouple components, so that events can be fired and handled without everyone having to know about everyone else. This allows, for example, pieces of the UI (in my case, information labels that display stats of the selected spell) to update when a Spell is selected by the user, but the Spell objects don’t have to have explicit links back to the UI components. They just fire off their event (SpellSelected) and the UI controllers can listen for that event, then update the labels. It makes for a very clean implementation when done correctly.

When I finally got around to refactoring my super-hacky direct method invokations for this particular use case, I was able to remove 80% of the related code, and remove 90% of the complexity. Requiring back-pointers all over the code was making me nauseous. I was just about to implement my own solution when I came across several blog posts referring to said NSNotificationCenter, and once I saw the super-simple 3 method API I knew it was exactly the way to go. Nuff said.

Now, I will warn against going too far down the Broadcaster/Observer path, commonly called an Event-driven architecture, because I’ve seen it abused to the point of making code completely incoherent and impossible to understand or debug. Events are a natural way to pass information between unrelated objects, but between related objects, just invoke the methods directly. It more precisely expresses your intention as a code designer, and it also more precisely executes your intention.

At a startup I worked with over a year ago that shall remained unnamed, they were using Flex to build several web applications. Flex has a very well developed Event architecture, made even better by the Cairngorm micro-architecture. The problem with the product that the company was developing, is that they used Events for everything, absolutely everything. There were basically no direct method invocations on any objects, even when you naturally had the target object already in scope, and it was a child or some other natural relationship. This meant that every time flow control has to pass from one object to another, it required a listener to be added, an event to be defined, said event to be fired, and said listener to then be removed after. If that flow didn’t look obviously wrong to anyone else in the company, there’s nothing I could say to help them. It was such an absurd abomination I just didn’t even know where to begin.

I pretty much decided to begin by finding a new job.

Anyway, there was this one bug where some previous employee of the company had left a big nasty ball of mud with some problem in it, and because of the number of events fired, and the ability for multiple objects to respond to any event, it was just impractical to figure out what was going on, much less track down the problem.

Lesson: Just because you can, it doesn’t mean you should. Like all engineering tools, apply with discretion.

Permalink 2 Comments

First Screenshots of project “Spellwars”

February 24, 2009 at 3:05 pm (iPhone development, spellwars) (, , , )

That’s right, I’ve got some pretty pictures. They’re actually not all that pretty, graphic designer I am not, but they get the point across. I am hoping to generate some interest in the community out there (that means you), if the project looks interesting to you drop me a line: I’m looking for people to work with me.

So lets get to the game. A basic description of what I have right now, is a simple 2-player spell combat game. The game resolves on a board, not unlike battleship, on which players take turns playing spells from their hand, not unlike Magic: The Gathering. A battle starts off looking like this:

Getting ready to start a duel

Seriously, do forgive the lack of design. Anyway, once you tap start, combat begins and you are presented with the spells in your hand, and you then choose one to play:

Choosing a Spell

After you choose your spell, it is placed in the middle of the board. You can then drag your spells around anywhere on the board, before you decide to continue. Once you’ve placed your spells where you want them, tap Turn, and the combat engine will resolve the turn.

Turn 2

It should be noted, the goal of a battle is to reduced your opponent’s HP to 0, by dealing damage through your spells. Each player starts with a certain number of HP, based on other things in the game that have yet to be fully implemented, so for today we’ll say both players get, oh, 50 HP. Sounds good.

Spells interact based on their location on the board, and their area of effect, visualized by the colored circle around the icon. Some spells have a large area, some are smaller…the value of each is different, depending on what your are trying to accomplish with a given spell. Typically a spell will be either serving in attack, defense, or support…potentially all of the above.

Each turn, the spells on the board resolve on a stack, with individual spell speed determining the order of spell resolution. There is no “your turn” or “other person’s turn,” it all happens at once. If 2 spells overlap, the active spell does damage to the “defending” spell, if the spell’s defense is reduced to 0 it is destroyed.

Resolved Combat

Spells in your hand are pulled from your active set, currently called a Book. Think of the deck concept in any CCG, same thing. Each turn, you draw a single spell. Each turn, you can play a single spell. Combat continues until one person runs out of HP. I am tailoring the gameplay so a single game can be played in no more than a minute, probably something like 30 seconds for a single duel vs the CPU. I figure that is about the amount of attention span most iPhone users have, most of the time. The app starts up in about 2 seconds, so you can easily play a game or 3 while waiting in line at starbucks.

Where do the spells come from? Basically, the rest of the game. Which is really the bulk of the game. I’m working on that part next. I envision a multiplayer world, somewhat like lootwars, but with unique places to visit and custom challenges…my version of instanced dungeons vis-a-vis World of Warcraft or Diablo II. My vision is that a big part of the fun of the game is in hunting down and finding rare and unique spells to build up your collection, and to have fun and powerful spells to duel with. You can bet there will be hard to find spells, spell sets, spell combines, limited editions, etc. I know that balancing the supply of items in an economy like this becomes of paramount importance, it’s at the top of my list for things to design very, very carefully. Digital economy, here I come.

On Motivations and Background

I started this project because I found a real void in the iPhone game world of solid multi-player games with deep, compelling game mechanics. Lootwars is by far the most well-designed MMO-ish game I’ve played, but it leaves me feeling so un-fulfilled, wanting so much more. I’ve been gaming for 20 years, and what first pulled my interest was the Rolemaster/MERP games in the mid 80s. Those games had such deep game mechanics that I almost never was able to get past just working through all the tables and numbers…and I loved it! The few game sessions we had as kids were fun, and I knew that one day a computer game implementation of something like that could make for an incredibly compelling engagement. I’m starting to feel the tips of that now.

Later, in the mid 90s, I again got sucked into a simlar game with similarly deep mechanics, Magic: The Gathering. From playing in small towns, to bigger tournaments with large prizes, to the million dollar Pro Tour, I spent enough time playing Magic to gain a real deep respect for the engagement power of a delicately balanced game. The guys at WotC work very hard to make sure Magic stays fun and balanced, even with the influx of hundreds of cards and dozens of new game mechanics a year.

These are what inspire me, and what drive me to create this game. The iPhone deserves it’s own game for gamers, by gamers. I want to make something that is appealing to a broad base of people, there’s no sense in catering solely to hardcore players, but that also has a deep set of interactions and fun things to do, that you can spend as much or as little time as you want, and still find more of the game to explore. I know it’s not easy, but I’m up for the challenge. And I’m looking for others who are like-minded. I can’t do this alone, it’ll take both partners and a supportive community. If you want to play a part, you know where to find me.

Thanks
R.

Permalink 5 Comments

Collision detection between circles

February 19, 2009 at 9:21 pm (iPhone development, Uncategorized) (, , , , )

Collision detection can be a little difficult with complex paths like arbitrary bezier objects.  But when the two objects are circles?  piece of cake! Find the center of each circle, then compare the distance between them. If that is less than the sum of the two radii, they collide.

The calculation is from high school geometry, and yes most of you have forgotten it. As apparently, did I. You probably recognize this:

x^2 + y^2 = z^2

and you might even remember what it applies to. When programming on the iPhone, we have x and y in coordinates from the UIView. When making the comparison between the above mentioned distance between points and radii, it’s easier to compare the squares of the respective z values, so we don’t have to compute 2 unnecessary and expensive square roots.

So anyway, I implement said solution, and go about my business. Over the next week or so, I notice that my collision detection is a little bit inaccurate. Not a lot, but a little. One night I decide I’m going to get it pixel perfect, since I should be able to pretty easily.

A few hours later, I give up and call in my wife. You see, she actually does this kind of math all day, every day. Well, not all day every day, but on a regular basis, every week. She’s a structural engineer, and they have to do calcs to make sure your house doesn’t fall over because of an over-imaginative and under-detail-oriented architect.

It turns out, I made a small…tiny mistake in how I formed the final equation. Rather than squaring the sum of the two radii, I squared each one separately, then added them together. That is:

I wrote:

rad_1^2 + rad_2^2

correct:

(rad_1 + rad_2)^2

Very easy to do in code, so watch out for it. It’s a nasty little bug to track down, because the inaccuracy changes based on the size of the circles…which varies in my app.

The final code I ended up with is below:

-(bool)collisionDetect:(DragView*)otherView
{
CGRect m_frame = [self frame];
CGRect o_frame = [otherView frame];

float m_rad = m_frame.size.width / 2;
float o_rad = o_frame.size.width / 2;

CGPoint m_center = m_frame.origin;
m_center.x += m_rad;
m_center.y += m_rad;

CGPoint o_center = o_frame.origin;
o_center.x += o_rad;
o_center.y += o_rad;

CGPoint dt;
dt.x = m_center.x – o_center.x;
dt.y = m_center.y – o_center.y;

float x_sq = dt.x * dt.x;
float y_sq = dt.y * dt.y;

// this is wrong, I screwed up the original calculation
//float mrad_sq = m_rad * m_rad;
//float orad_sq = o_rad * o_rad;

float rad_sq = (o_rad + m_rad) * (o_rad + m_rad);

return (rad_sq) > (x_sq + y_sq);
}

R.

Permalink 1 Comment

iPhone SDK: The price of logging

February 18, 2009 at 5:48 am (iPhone development) (, , , , , )

While working on a few run-throughs of my currently in-development iPhone game, I came across a performance issue.  When I started playing, the game was pretty zippy…but with each turn it would continue to get slower.  And not just a little slower, a lot slower.  At first a turn might take .2 seconds or so, but by turn 6 or 7 it was up to around 4 seconds to process a turn.  What was going on?  Why am I bothering to share this with the world?

It turns out that the logging was updating a UITextView for each NSLog call, so that a player could tap on a tab and see all the results of the computer resolving all the spells.  Once there is more than one or two spells in play, a single turn could contain maybe 25-30 logging calls.  Each call would copy the whole text out of the UITextView control, append a line to it, then set the text value.  This became incredibly cpu intensive, and was slowing down the app way more than I would have ever imagined.  The instrument panel showed me everything.

system load with unbuffered logging

I was really horrified at how long a single UITextView.text = @”really long multiline multiparagraph log-like string” line can take.  It seems to me that one of the most common use cases is to append text to a control, so being forced to copy the text out, append to it, then copy it back in is really slow and painful.  Is there not a better way?  really?  It’s 2009, do I need to write this kind of control buffering myself?  Apparently, yes.

And it’s worth noting, this only became apparent while running and debugging the app on a device.  The performance issue never really showed up in the simulator, and even once I identified it, the simulator was useless even with the instrument panel.  As much as I love the simulator, and I really do, for performance work don’t waste your time.

So, the solution?  I went with the simple and obvious: create a buffered log.  I only update the LogView when I commit the buffer, while the NSLog calls still go to the console immediately.  Works like a champ!

system load with buffered logging

R.

Permalink Leave a Comment

Creating a multiplayer iPhone game

February 15, 2009 at 11:00 pm (iPhone development) (, , )

I’ve been recently working on a new iPhone game, something to fill the void that is lacking in multi-player, collectible creature/card/spell/something, that semi-mmo feel you get from mixing Magic:The Gathering with Lootwars, Diablo II, World of Warcraft, an iPhone, and 20 years of gaming. It all starts to come out in a big heaping pile of…something, lots of great ideas and no focus. I’ve always felt my job as an engineer was to “fight entropy,” a phrase my old co-worker Matt came up with over a decade ago, and it sure fits…especially when working on a new project. I’ve got so much personal history in the gaming world, how could the ideas *not* come out all at once?

It’s coming along well, and a public beta will be available shortly I hope. I’ll be posting screenshots and game mechanics along the way.

R.

Permalink Leave a Comment