LD48 #24 picks

There were 1406 games submitted for Ludum Dare 24. I probably won’t get to play more than a tiny fraction of that number before the judging is over.

As a judge, I believe my goal should be to play every game, but given the time window and the number of entries, that’s not very likely to happen. So sadly, I end up picking games somewhat arbitrarliy from among the entrants, usually based on the thumbnail screen shot and/or title being interesting.

One strange thing I’ve noticed about LD’s website is that when browsing through all 1406 entries, I will notice that the ordering seems to be random. I expect this is to shuffle the games up so people will have a better chance of playing games that otherwise would be buried at the bottom of the list. But a side effect of this is that no matter how many times I page through all roughly 50 pages of games, I invariably miss many — it seems the shuffle re-randomizes while I’m paging through, and I end up seeing some games twice and therefore obviously must be seeing some games zero times. This is kindof annoying and I wish I could get all 1406 games on one page somehow.

I’ve just taken a walk through the submissions and grabbed the title and URL of the pages of the entries that looked like they might be interesting. This is a completely arbitrary process and I spend maybe 2 seconds looking at each game before deciding whether to pick it up and play with it, or skip it and move on. So don’t feel slighted if I missed yours — if it was any good, most likely I’ll discover it anyway after the judging is over.

I don’t want to skew the judging by recommending games, but for non-LD participants who can’t judge, there’s no harm in sharing a list of links to games I think look like they might be cool. In all likelihood, probably a lot of these are terrible. I haven’t played them yet and this should not be considered a recommendation or endorsement; it is merely a list. (more…)

D’oh! Game Maker Studio requires a Mac to build an OS X game

So, last night, for the first time I tried building a Game Maker Studio project to OS X. I was a little surprised to discover that apparently GM:Studio needs to connect to a Mac OS X system in order to complete its build process. This makes it a little bit of a problem to build OS X projects.

I guess the upshot of that is that it means that it is impossible to create OS X builds in a dev environment where there is no means to test them. On the other hand, I guess the true cost of Studio is around $2500 since I have to buy a Mac. But hey, I suppose that could be a tax deductible expense if I’m buying it for business purposes. I know they make them cheaper, but I probably wouldn’t buy a mini. Eh, maybe. I’ll have to kick it around and decide, but I’m more into the idea of getting a MacBook Pro.

Random number generation in game programming

Random number generators are extremely useful in game programming. I have found a lot of uses for randomness in my projects.

What can you do with randomness?

Man, all kinds of stuff. Nearly any value that you want to initialize in a game object is a candidate for possible randomization. Randomness fuzzes up your game, making less deterministic and therefore harder to defeat with simple patterns and more replayable.

Pretty much any time I would normally use a literal or a constant number in my code, anymore I step back and ask myself what range of values might work in that place, and then create a random function that will provide me with a number in that range. The only time I don’t do this is when I really do need a precise value, or when performance is too important to sacrifice the computation time needed for the random function to return its result.

Here are just a few ideas for how you can use random numbers to improve your games:

Unit stats

Nothing makes a video game feel more like a video game than when every enemy you encounter is an exact clone of all the other enemies that look like it. You can use randomness to give your enemies some personality by giving them randomized stats. Instead of fixed values for Attack, Defense, Speed, Damage, etc., use a random range of values to generate stronger and weaker versions of your enemies. It takes a little more time to compute these values on the fly, but modern processors can handle this load easily, unless you’re generating a huge number of units.

Sprite generation

Why spend a lot of time hand-drawing every sprite in your game? Create a generator system that randomly puts pieces together, and create random sprites on the fly. If you’ve played around with an avatar generator such as eightbit.me or the Mii generator on Wii or the XBox Live Arcade avatar generator, imagine that kind of model system, but with a random selector in charge of picking the hair, eyes, etc. You can do this to randomly generate other things, such as buildings, procedurally, as well.

Colors

If you’re calling drawing functions, randomizing colors can give your game a lot better visual appeal. If you’re clever in how you pick your random colors, you can come up with color schemes that work nicely, yet are always slightly different each time you play. You can either pre-define a palette of colors and randomly select one, or you can randomly select R, G, B or H, S, V numbers and create a color at runtime. You can experiment with different mathematical tweaks to shape and constrain the randomness.

Map generation

If you can write a good random map generator, you can save yourself from having to hand-design all your maps. GOOD random generation may be very difficult to accomplish, however — especially for more complex games. But even if you can’t guarantee a good random map at runtime, an almost-good random map generator can save you tons of time or spur your creativity by doing most of the work for you, leaving you with something almost good enough, that just needs a little hand-polishing to make shine.

Procedurally generated content in general is a good use for random functions. You can use a random number function to create a deterministic sequence of generated values that is always the same. This is because computer hardware actually does not have a means of creating a truly random number — it fakes it, approximating randomness with a pseudo-random algorithm.

This is used to good effect in one of my favorite Atari 2600 games, Pitfall. A pseudo-random function, using a fixed seed, is used to generate each screen in the game. This achieves a very high information density, since the data that was needed to represent each screen could not be stored on a 4kb ROM, but a generator function that creates that data easily could. This technique is not used very much in modern game development since storage isn’t much of an issue any more, but it is still a very interesting technique and one which merits study.

AI

There are many potential applications of randomness to AI. Whenever your AI needs to make a decision, you potentially can use randomness to make that decision less predictable. Weighted probability is important here, as completely random AI behavior is erratic and seems crazy, while an AI that occasionally does something unexpected will seem tricky or deceptive or clever. Dynamically weighting the probability according to context at runtime will make your AI seem smarter.

GameMaker/GML random functions

These are built in to the Game Maker Language (GML):

  1. random(N): returns a random floating point value between 0 and N, not including N.
  2. random_range(A, B): returns a random a floating point value between A and B, not including B.
  3. irandom(N): returns a random integer value between 0 and N.
  4. irandom_range(A, B): returns a random integer value between A and B.
  5. choose(a,b,c,d,e,f,g,h,i,j,k…): Randomly returns one of the arguments, up to 16 arguments may be passed into a GML function. You can weight the likelihood of one result by repeating it in the arguments list. (e.g., choose(dog, dog, dog, cat) would be 3/4 likely to return dog, 1/4 likely to return cat.)
  6. random_get_seed(): Gets the current seed value for the randomizer.
  7. random_set_seed(): If you need a randomized, but deterministic function, you can set the seed for your random function. (This approach of setting a known seed is how the levels in Pitfall for Atari 2600 were always the same even though they were generated by the Atari’s random number generator.)
  8. randomize(): Sets the seed of the randomizer to a random value.

These are scripts you may import into your project:

  1. gauss(median, deviation): Returns a random value with a gaussian (“normal”) distribution around a median value. From GMLScripts.com.

All programming languages have similar random functions or classes built into them. Whatever tool you happen to be using, it pays to learn about how it can produce random numbers, and how you can use them to do useful and interesting things.

If you have any favorite ways of using random numbers in your programs, post a comment below and share it!

Keeping randomness under control

One of the mistakes most game developers will make when using random functions is to use too wide a range of random values, or failing to control the range of values returned by the random function.

Know your math

Randomness feels most random when the probability distribution is flat. However, this often does not make for the most interesting gameplay mechanics. It’s often more useful to have a weighted function that has a greater probability of returning a value in one part of the range than in another. Understanding probability math is key to getting your randomized functions under control. The other key is to develop your intuition to know what range of values will work best for a given situation.

If you’ve ever played tabletop role playing games, then you know about dice. Dice are good analog randomizers, and can help us understand probability and randomness in a computer program. In classic Dungeons & Dragons, character ability scores are randomly determined by adding the values of three six-sided dice. This results in a bell curve, meaning that the results of a 3d6 roll are distributed in such a way that an “average” score between 9-12 is far more likely than an extreme score of 3 or 18. So one way to directly simulate this type of dice rolling in a computer program would be :

N = 0;
repeat(3){N+=irandom_range(1,6)}; // generates a value between 3-18, distributed around 10.5

In computer programming, there are more efficient ways to achieve a bell curve distribution than this. Calling random() multiple times, and writing loops will make your code slow, so if there’s ways to avoid doing that, it’s a good idea. The gauss() function from gmlscrips.com creates a “normal” distribution around the agrument passed into it, and is fast and efficient.

round(gauss(10.5, 3.5)); //simulates rolling 3d6, approximately

Note that this will not return exactly the same distribution of values as a true 3d6 roll will. But this is because 3d6 is actually an approximation of a gaussian distribution — the gauss() distribution is more accurate to a “standard normal” statistical distribution. If you compared graphs of the bell curves of 3d6 vs. the gauss() function, the gauss curve would be smoother, and would include values outside the 3-18 range (2 and 19 would show up a tiny percent of the time).

There are other types of distibutions that you might want to achieve with your randomized functions, for some purpose. Knowing your math is important here. Learn the graphs of common functions, and understand the relationship between the shape of the graph and the probability distribution of a randomized function modified by each function. For example, random(x), ln(random(x)), and random(x)^2 have very different looking distributions. Knowing this, you can tailor an equation to fit your needs.

Once you get comfortable with the math, it’s actually fun. Play around with a graphic calculator and see what different graphs you can come up with. Each time you discover an interesting or useful shape, make note and file it away for a time when it might be useful.

Testing

Because adding randomness to your functions make the game non-deterministic, it can make things more difficult to test. Certain conditions become hard to duplicate, because you don’t directly control them, and this can make repeatable testing of your game seem impossible.

There are approaches you can take to ensure that your code works, still. First, when you are building up your functions, ensure that the non-random parts of the code work well before you introduce randomness. If necessary, temporarily remove the randomization and replace it with a literal value, a constant, or a variable. Once you are have tested thoroughly and are sure the code is working correctly with a range of controlled values, you may safely replace the controlled values with random values that are constrained to the ranges you tested.

In some cases, you may need to go back and re-test code. It would be a pain to have to find/replace every random() call in your code. Not only would it be time consuming, it would increase the opportunity for errors to creep in. A better approach may be to comment out the equivalent non-random code next to the random code, and leave it in your code file. That way you just have to comment out the randomized function and un-comment the deterministic version.

Even this is time consuming and error prone, however. You may want to create randomized and non-random versions of your functions, and introduce a configuration variable that you can toggle to enable/disable randomness. Then you can pepper your code with things like:

if settings.random {randomized_function()} else {deterministic_function()};

All this extra branching in your code can get ugly and unmangeabeable too, so try to limit this to keep it to a minimum.

You could also use polymorphism to create sibling classes, one which inherits randomized functions, and one which doesn’t, and just spawn the appropriate class instances according to the game configuration at runtime.

The great thing about being able to turn randomness on or off at runtime is that it allows you to very quickly see the difference, reducing the lag time between test runs. This could even turn into a feature of the game, rather than a debug exercise.

With proper care taken during development, randomized functions can be just as reliable as deterministic functions. It just takes a little extra forethought and planning.

Game Maker HTML5 and WordPress

Site traffic on the WordPress portion of csanyk.com is up due to Ludum Dare. According to my Jetpack stats counter, got about double my usual visits on Saturday, mostly as a result of posting my alpha build of Karyote. Traffic yesterday was about at the same level. It’s too early to know whether the increase in traffic will be sustained or not, but I’d expect there might be a small bump with a long tail.

This does not include hits of the actual Karyote game url, which is not hosted within my WordPress site. I haven’t looked at the awstats numbers yet, but I’m kindof curious to know many people are playing the game now.

I’d like to get my Game Maker HTML5 games better integrated to WordPress, but (as of the last time I played with doing that, during the GM:HTML5 beta, at least) it is tricky, and I haven’t gotten it working right yet.

Game Maker Studio auto-generates a basic HTML5 page for your game when you build it, but it’s not a simple matter to cut and paste the necessary code from that page into a WordPress page.

YoYoGames should probably think about providing CMS integrators so that people can have an easier time packaging their games in a way that allows them to integrate with WordPress, Blogger, Drupal, Django, and other CMS frameworks.

While I’m wishing, it’d also be cool if Studio has a feature allowing you to modify the template used to generate their HTML5 page. That feature could exist for all I know, I need to get more familiar with the HTML5 features of Studio.

Hopefully if they don’t, at least the dev community will step forward and address it.

Karyote (Enhanced)

I’ve patched a few bugs and added some enhancements to Karyote, and plan to make several more changes in the next few days as I’m able. There’s a post about it on my Ludum Dare journal.

I thought I’d write up a little postmortem of the enhancement here:

After struggling with the idea and trying to come up with what the game should be all weekend, and being disappointed with what I was able to deliver by the compo deadline, it’s really interesting to me that I’m actually starting to like this game now that I’ve fixed the first two high priority issues.

What I take from that is that I am better at critiquing and improving something that exists than I am at coming up with something new. That’s consistent with how I know myself, too. What’s interesting to me about this is that I somehow am able to switch from being a “whole cloth designer” coming up with a new game design to a “critic” and when I’m in critic mode, I know just what the game needs, while when I’m trying to develop the design that “designer” mode me came up with, I get frustrated and hate what I’m making. Maybe it’s not so weird, though — it could be all I really needed was to play it enough to figure out what it needed.

Comments I’ve received on my game have been generally positive, as well, which surprises me. I wonder whether commenters/raters apply a sliding scale of expectations when it comes to providing feedback. I mean, it’s one thing to compliment someone on an effort that was good relative to their current ability and constraints. It’s another to say that a game stands up relative to other entries, or even among all games of all time. I think it’s safe to assume that the comments I’ve gotten aren’t expecting LD games to be among the all time greats, and that people are generally inclined to deliver positive feedback and encourage the developer, rather than slam it.

I tend to judge myself more along the “all time” basis, though, which is harsher but also a higher standard to aspire to, and pushes me to do better. So it’s surprising to me when people say they enjoyed something I made when I don’t think holds a candle to Pac Man. But it is really nice to know that people have tried my game and that some of them have even enjoyed it. Getting comments, good or bad, is extremely positive for me. Just having the knowledge that people tried it out makes me feel like it was worthwhile to make it.

 

Ludum Dare 24 Postmortem

I’ve posted a postmortem of my LD48 #24 project, over on my ludumdare.com journal.

After poking around for my old journal entries on ludumdare.com, I think they may purge content, so in case that’s true I’m mirroring the post below, after the cut:

(more…)

LD48 24: Evolution. Karyote alpha

It’s not much at all yet, but I have an alpha build of my entry for Ludum Dare 24: Evolution up and running in HTML5.

Karyote

It’s not really playable yet, at the moment I’m just working out some motion and object prototypes. Graphics are all placeholders. You’re always in the center. Move with the arrow keys. Left/Right turns, Up moves forward.

Somehow, I’m doing another game with a microorganism theme. LD#23 was Bactarium, LD#24 will be called Karyote. You control a single celled organism that mutates as you play.

I still need to figure out what exactly you’re doing in the game, but I have some ideas that I haven’t implemented yet, so I’m a little further along than it looks as far as the concept goes. I’m designing as I go, mainly this is design by fiddling around. That’s a dangerous way to go on any project, but when I don’t have much of an idea to begin with, I find it’s one of the most reliable ways of getting me going. Hopefully I’ve learned enough lessons from previous projects to avoid messing up the code architecture, so debugging and feature changes don’t turn into a nightmare toward deadline.

Ludum Dare 24 This Weekend

It wasn’t that long ago (late April, in fact) that I participated in my first Ludum Dare. I really enjoyed that experience, and am really looking forward to Ludum Dare 24 this weekend. I’ll be hanging out this weekend at our Cleveland Game Developers LD48 site, generously hosted at the Shaker Launch House space.

I plan to work solo, and entering my game into the compo, again, but one of these times I’d really like to get into a team and work on something as a group. For the weekend, I’ll be blogging on my page on the LD site, so be sure to check there and see how I’m doing.

I’m trying to think about my goals for the last LD48, and how I’ve grown since then and what my new goals should be.

LD 23 goals:

  1. Finish a solo project in 48 hours. Achievement unlocked!

LD 24 goals:

  1. Blog my progress as I go, self-documenting the development process. Last time I blogged a little bit, this time I want to take that further.
  2. Post playable builds as I go, not just at the very end. Last time I saw other people doing this, and I felt envious as they got feedback from people playing sneak-preview releases of their projects. I was super impressed that they managed to release something playable so quickly, but I have some ideas about how to accomplish that.
  3. Produce builds for Windows, OSX, and HTML5 to reach a wider audience. Last time, I was still using Game Maker 8.1 Professional for my project, which limited me to Windows. This time I’ll be using GM:Studio. This will be my first project targeting multiple platforms, so kindof a new thing.
  4. Use fellow CleGameDevs people for feedback and encouragement. We used IRC for this, and had our first night at a common space, which was good. I just want to do this more.
  5. Play and rate more entries. Last time I did play a lot of games during the rating period, and played even more after the rankings were posted.

Incorporating music into my game will probably remain a future goal, for now. I’ve experimented a little with FamiTracker, and may attempt to produce a little music for my game, but I still think becoming a chiptune artist is a far-away goal. I think music is a really important element of videogame design, but it’s probably better to have no music at all, rather than bad music. There are certain game themes which lend themselves to silence, so I can possibly use that, or I can make a game that has an overwhelming amount of sound effects in it, like my last LD48 entry. Or maybe I’ll get lucky and one of our musically talented CleGameDevs people will throw me some resources, and I’ll make it a Jam entry instead of a Compo entry.

Tonight and tomorrow I plan to go over my preparation checklist and make sure I am ready. Gotta make sure all my software is up to date and working properly.

Game Maker beta license expiration cuts off access to tools

This past weekend was the Game Maker Community Jam, a 72-hr game development competition sponsored by Yoyogames. I didn’t participate in this one, unfortunately, due to my license for Game Maker Studio being revoked. Here’s what happened:

Back in January, I participated in Global Game Jam, at which I obtained a free, time-limited license for Game Maker: HTML5, then in beta Due to bugs that I encountered with Game Maker HTML5, I had to start over twice after my project became corrupted, for reasons still unknown but hopefully long since fixed by Yoyogames. I ended up completing my project that weekend with my old standby, Game Maker 8.0 Professional. I just barely got it done, but had to sacrifice a lot of sleep and many features that I’d hoped to include as a result of the time/work lost due to the project corruption bug.

A few months later, in April, Yoyogames released Game Maker: Studio beta, which I downloaded, and I began using it. I played with the Studio beta a bit during Ludum Dare 23, but quickly realized that a 48-hr competition is no time to be discovering a new version of a tool, so again I fell back to a stable release, this time Game Maker 8.1. After LD23, I began porting my project, Bactarium, to Studio, refining it along the way.

Some time later, Game Maker Studio concluded its beta testing, and released 1.0. My beta license stopped working, so I had to buy Studio. Yoyogames had made an offer with their Global Game Jam that participants who tried out the HTML5 beta, which they had offered to GGJ participants for free, would be able to get 50% off when it was finally released. So, when I went to their web site to purchase my license, I was expecting to have to pay something. However, when I entered my old HTML5 license, the store allowed me to download the core Studio 1.0, as well as the HTML5 add-on license, for free.

Apparently this was in error, but at the time I had no way to know this, no way to claim the 50% discount that I should have been entitled to. I assumed that Yoyogames was being really gracious to people who participated in the HTML5 and Studio beta program — maybe I was getting two discounts and they stacked? In any case, I would have been willing to pay for the product if the site had been set up to take my money, but it wasn’t, and it didn’t require me to pay anything. The HTML5 license I received at GGJ apparently entitled me to download the GM:Studio 1.0 core, plus the HTML5 module, all for free. I was of course thrilled.

So I downloaded Studio 1.0 and used it, working on bringing Bactarium into Studio so that I could port it to Mac OS X and HTML5, and worked on a few other tech demos as well to familiarize myself with the new features. Things have worked fine up until last week, when I went to download and install the latest update. After installing, when Studio launched it told me that no license was detected and I needed to enter it. Figuring the license data had gotten blown away by the upgrade for some reason, I went through the license recovery process and re-entered my license key. However, Studio refused to accept my key.

I opened a ticket with Yoyogames helpdesk, and promptly received a response within 24 hours, informing me that my license key was no longer valid, as the HTML5 license that I had from Global Game Jam had expired. OK, I can accept that, no big deal. The communication from Yoyogames helpdesk further explained that they would be sending out coupon codes within about a week to people who participated in the beta, so they could get their discount. So, basically, I could choose to wait up to a week for the coupon code, or pay full price now. I would have thought that the old license key itself would have been the discount code, but oh well. I’m electing to wait.

Waiting put me out of participating in the GMC Jam this weekend. Oh, I suppose I could have worked in 8.1 again, but by the time I received the notification from the Yoyogames helpdesk, I’d lost enough time that it didn’t seem like a good idea to try to throw something together. I had other things to do this weekend, so I did them. No regrets about any of it, but it would have been better if the logistics had worked out a little better. I don’t mind the license expiring, since I’d expected it to anyway, and I don’t mind paying for my license, but not being able to purchase with the discount because Yoyogames didn’t think to distribute the discount codes prior to expiring the beta licenses is a bit disappointing.

So, today’s Monday. I still have not received my coupon code, but as they had said it would be happening sometime in the next week, I’ll try to be patient and wait for it to come by Friday, hopefully. I’m really hoping it’ll come through soon.

Darker Implications

One concern I now have is that, in reading up on the way Game Maker currently works, apparently you need to connect to Yoyogames server at least monthly to re-validate your license. This anti-piracy measure goes a bit too far in my opinion, and potentially hurts legitimate users. Copy protection crackers will always find ways to defeat such measures, while legitimate users will always be at risk of having their license killed in error, thereby denying them access to software on their own hard drive, that they paid for.

I can understand why Yoyogames feels they need to control licenses with a phone-home system tied to a remote killswitch, however the potential exists for legitimate users to be left in the cold if Yoyogames decides to kill an old version in order to force everyone to upgrade to their latest. If Yoyogames ever decided to stop supporting this version of Game Maker, or discontinue Game Maker entirely, or go out of business, all the paid-for licenses of the product potentially go bye bye.

It’s one thing to stop supporting an old version of a product, quite another to shut down license servers, effectively killing off the old version so that users are forced to upgrade. To be clear, I’ve seen no indication from Yoyogames that they plan to ever do this to their customers, only that they now have the mechanism available to them that allows them to do so. I sincerely hope that they never do this, as the backlash from the community would be substantial.

I would hope that as a last measure that they’d release some patch that permanently unlocks all licenses so as to prevent this from happening, and if they don’t then I’m sure the cracker community likely will, although this would technically violate the EULA as well as laws such as the Digital Millenium Copyright Act.

Update

It’s Thursday, and I’ve woken up to find the coupon code from Yoyogames waiting for me in my inbox. They’ve changed things up a bit from the original offer, and it’s about the same although I think it works out better from a certain standpoint.

Originally, participants in Global Game Jam were going to get Game Maker HTML5 1.0 (when it was released) for 50% off the originally announced price of $199. Yoyogames was selling beta licenses for half off, so essentially GGJ12 participants were getting access to the beta for free, and paying the same price for the finished product that the beta testers were paying anyway. This was nice because A) you didn’t actually have to pay anything for a beta, and B) you could try before you buy for a few months.

Somewhere along the line, Yoyogames changed their mind about their products and pricing. Game Maker HTML5 1.0 was never released; instead, it was folded into Game Maker Studio, becoming an optional $99 add-on.

As a result, the original deal no longer made any sense. So instead, Yoyogames has substituted Studio. With the coupon, you get the $99 Studio core for free; and if you want the HTML5 module, you pay full price for it.

Comparing to the old deal, this is better in two ways:

  1. You get Studio, which can build to Windows and OS X for free, and you can stop there if you want to.
  2. For the same cost as the original deal, you can buy the HTML5 module and have three build targets instead of two.

My old complaint still stands, that they should have issued the coupons and given developers a week or two to use thembeforedisabling the temporary licenses. On the other hand, apparently those licenses were only supposed to have been good for two months, and I think I got about 6 or 7 months out of mine, and I’m definitely not complaining about that. All in all, a week’s worth of inconvenience is still a week’s worth of inconvenience, but I’m glad that in the end, they’ve given developers who worked with the beta something worthwhile.

Product Review: Samsung Galaxy SII on T-Mobile

I am not an early adopter when it comes to technology that I want to rely on every day, so I came to Android only recently. After reading a lot of positive reviews, I bought a T-Mobile Samsung Galaxy SII. I’ve been using it for two months, now, so here’s my thoughts on it:

iPhone killer?

Many of the reviews said that the Galaxy SII was better in many respects than the current iPhone, and on paper I could see those claims arguably looked valid. It has a larger screen, for one — and it’s a very high quality screen, too. I like that I can remove the battery if I want to, the fact that it has an SD slot so I can expand the memory without having to pay Apple premium for the capacity. I understand why Apple made the design choices they did with the battery, the sacrifice in field replaceable battery for greater battery capacity to phone size makes a little more sense to me than the SD slot decision, which feels like pure greed.

And anyway, unless I want to switch carriers — which, thanks to the prevalent business model in the USA, is a rather expensive and therefore unattractive proposition — I can’t own an iPhone unless I want to hack it to work on T-Mobile, and I was reluctant to do so because of my experience with my last unlocked phone, a Nokia E75.

That phone was a nice enough handset — small, durable, held up for more than two years, fit well in the hand, decent battery life, had OK web browsing and wifi capability, though poor compared to a true smartphone, but for some reason T-Mobile never supported its MMS capabilities adequately, and through my carrier, it could only send/receive 5-7kb postage stamp sized images, which was annoying considering it had a 5MP camera and normally T-Mobile’s size limit for MMS is 300kb. I’d seen a hacked iPhone on T-Mobile in person and it seemed like a number of the features were not well supported, so this time I wanted to go with an officially supported handset.

I didn’t really want to give up the E75, but after a particularly unfortunate drop onto a hardwood floor, the bezel broke, leaving the edge of the keyboard unsupported so it would flop around and let pocket crud accumulate under its membrane. And the battery wasn’t holding a charge like it used to, and the screen had gotten to where it was pretty scratched up. I was sick of the ever-widening gap in browsing capability with my E75, and have been wanting to try my hand at mobile app development for a while, so Android seemed like the next phone for me.

Purchasing

I did my research, and all reviews said that the Galaxy SII was by far the best handset available currently in the market. It didn’t have a physical keyboard, which concerned me, because I’m a heavy texter and I like the feel of a physical keyboard, even if it’s micro sized. But what sold me was some special pricing and offers that T-Mobile was running, which allowed me to get the phone at a $50 rebate, plus $100 in trade-in value for my old Shadow handset. That put the Galaxy SII at a price I was comfortable with, so I bought it.

By the way, T-Mobile, if you’re reading this, your handling of the trade-in program is awful. I sent my handset in to you a week after I bought my phone, on May 6, and a month later (June 4) I got an email from you saying that time was running out and I’d better ship it to you soon or I would lose out on the trade-in. I wrote back to say that I’d sent the phone in three weeks ago, and it should be there by now, and I was alarmed that you hadn’t received it. I did get a response to this, but all it said was that your receiving process takes a very long time, and that phones are only entered into your system after they get processed.

t-mobile trade in process is awful

T-Mobile trade in process is awful

That is just unacceptably stupid and wrong. The very first thing you should do in your process is confirm receipt of the package! I very strongly suspect that I will never see that $100, and if I don’t, you can forget about me sticking with T-mobile for my next phone. It’s 7/6 and I still haven’t received any confirmation that my trade-in was received and processed.

[Update 7/10: After writing to them again when I wrote this review, I got a response today, four days later. They tell me my rebate is scheduled to be sent out at the end of this month, so I guess that means that they did receive the trade-in from me; however, it also means that they never did bother to notify me of this. At least it’s not lost.]

[Update 8/20: Finally received my $100 gift card for my trade in. Only took about three months!]

Initial Impressions

My initial impression of the phone was that I liked it a lot, but it would take a little getting used to the lack of physical keyboard. In the store, they let me play with their demo model long enough to get confident that Swype input really was feasible and could work. I expected some foibles with it, and I knew I wouldn’t care for the lack of tactile feedback, which necessitated looking at the screen more as I typed, but I could accept that as a trade off given the many advantages of the new phone.

The screen was beautiful, web browsing was fast and pages rendered much better than with the Opera Mobile I was running on my E75 (its default browser was lamentably out of date, whatever it was.) Installing apps was very easy, and I found a few fun ones and a few useful ones that I liked. I spent a few days playing around with configuring this and that, learning how to connect the phone to my laptop so I could back up my contacts and get photos and stuff off.

Battery Life

I guess I must be a heavy user of the phone, because my battery will only last about 8-10 hours on a charge. This is barely adequate to get through a work day, and forces me to umbilical to a wall outlet whenever possible to top off my charge, and forces me to carry around a charger, which is just one more thing I don’t really want to have to carry with me. It’s alright when I’m sitting at a desk for work all day, or if I’m driving around I can use a car charger, but if I’m walking around all day, it’s a cause of anxiety. There are aftermarket super-batteries that you can get, and they’re not too expensive, but they are bulky, adding a bulge to the rear of the phone, which is incompatible with any protective armor cases you can currently buy for the phone. Since the SII has been out for a while, it seems unlikely that this will change, which is unfortunate.

Android, I appreciate that you can change settings when battery is below a certain threshold, to prolong life. That’s really great. But would it be too much trouble to restore the old settings while I’m charging, or at least when the charge level goes back about that threshold? It really sucks to have to reconfigure manually every damn day when I shouldn’t have to.

Swype: It’s garage. It’s guache. It’s gator. Ah, fuck it. G-A-R-B-A-G-E.

If you want to turn your life into a commercial of arrows, buy a smartphone without a physical keyboard and try Swype. It’s garbage. Using it produces a comedy of errors. Quite possibly a tragedy of errors, as well.

Swype is absolute dogshit. I say that, playing off of the business idiom “eat your own dogfood.” I find it really hard to believe that Swype’s developers are using Swype on a day-to-day basis. My friend Max said to me, he says, “MAYBE YOU JUST SUCK AT SWYPE, HOLMES.”

Maybe you just suck at Swype, Holmes.

Max confronts me with the ugly truth I just can’t admit to myself.

It is not possible for someone to suck this much at something for so long and not get better. Ergo, Swype is at fault.

After I typed in my first web or email address, I forget which, Swype decided it had “learned” new grammar rules and that it should not ever put a space after a period, which it formerly had done any time I finished a sentence. Swype, you need to learn when a sentence ends vs. when a dot is used in a url or email address, or as a decimal in a number.

I really hate to give the impression that I’m unprofessional by using swear words, but I thought about it a lot and I truly cannot give an honest review of this product without them. I’m sorry, it’s that bad.

Swype’s accuracy is so hit or miss, it’s like you’re permanently drunk whenever you try to type with it. DamnYouAutoCorrect.com is funny, and a lot of the time feels contrived — but in real life it’s a disaster. Sometimes you sound like a dadaist on LSD, other times you sound like a grammar-challenged moron, and at the worst of times it makes you say things you didn’t mean, but with the limited context the recipient has no idea. This fucks up communication so badly, I’m actually scared to use it for anything important at this point. Swype makes me really, really angry on a regular basis.

I thought, OK I just need to proof read before I send, right? Well, it’s not so easy. First, to accurately swype, your eyes have to really follow your finger. You naturally want to continue swyping out words until you’re done with whatever you’re writing, but if you do that, your eyes aren’t watching Swype’s output, which at its default accuracy/speed setting is wrong about 1-in-3 words, sometimes more. Even at the “best” accuracy setting, it’s about 2-in-10, which is not nearly better enough. Like OCR, swype recognition of words is not useful unless it is accurate over 99% of the time, and it’s far short of that. Backing up and proofreading a lot of text, and then changing every third word, is much slower than simply hunt and pecking the input.

So the only way for me to effectively swype is to verify after each and every word. Your eyes feel like you’re watching a tennis match as they bounce from the screen keyboard to the output box. It really slows your wpm down. It’s truly a step backward if they can’t fix this. I found that it did get better if I set the accuracy to maximum, but it still gets words wrong frequently enough that I really have to watch what it’s saying for me regardless. If you’re not a wordsmith, you may not care, but for me it’s a major problem.

It’s not faster than hunt and peck if you have to meticulously scan every single god damn word that it guesses you meant to enter just to make sure that it’s right. It completely destroys the appearance that you are intelligent and in command of language. Every time I see something I’ve typed with it, I’m embarrassed, because it’s NOT what I typed. If you enjoy Mad Libs, you’ll probably like Swype a lot, but if you value your command of language and feel that the impression you give others through texting is important, you’ll hate it. Perhaps swypographical errors are to be expected in SMS messages, and are temporary and have a tiny audience, so don’t matter. Except when you’re trying to be cool, or smooth, or persuasive, or say something heartfelt over SMS, and it completely ruins the moment. It’s another thing when you try to use the screen keyboard to enter text on a web site, like facebook, and it utterly botches your input and turns you into a blathering moron.

I used to look down on people who couldn’t use language, but now thanks to Swype I feel like we’re all in the same boat. It’s worse than the battery life issue, which just produces anxiety that I won’t be able to use the phone when I need it. Swype makes me absolutely angry. It’s a solid concept, but the execution needs improvement. There are replacement soft keyboards, but I haven’t tried any yet. Most of them cost between $2.99-9.99, and for a $500 phone, it better come with a @%#$@) keyboard input that @#$@#ing works.

I’d be very happy if they made a version of this handset that is twice as thick, but has a physical, slide-out QWERTY keyboard.

Apps

I’m not a huge App user yet, but I love how easy it is to install new apps. I haven’t bought any yet, but I’ve downloaded a dozen or so that sounded useful.

Reviewing specific apps is a bit beyond the scope of this article, but I will single out the official Facebook app for a WTF award for not having Share links on the mobile app. It’s nicer to use the FB app than visit facebook in a web browser, but not being able to Share things is really a strange user experience design decision and I can’t understand why they only show the Like link.

I’m a little disappointed that I can’t remove some of the bundled apps that I don’t want and will never use.

Netflix is a nice service and all, but I’ll never use it on my phone, and I don’t have a Netflix account, at all. If the phone came with a “light” or “free” version, I might use it and end up getting into it enough that I’d pay for the service, but out of the box it was only interested in me if I was a paid subscriber, or if T-Mobile bundled a subscription with the phone. Maybe just a limited 1-2 movies/month introductory deal, included with your plan. As it is, it’s about 20mb of storage on my phone that I’ll never get back. I generally have better things to do than watch video on a tiny phone screen, but it could possibly come in handy once or twice.

Contacts

The only other major complaint I’ve had about the phone in the first week of ownership was the royal clusterfuck it made of my contacts. When I got the phone, the salesman asked me if I already had a gmail account that I’d like to use with the phone. I’ve had a gmail account since 2004 or so, and have been using it as my primary non-professional email address for much of that time, so I said sure.

I kindof wish I hadn’t, though, because Android really fubared my contacts. I had a mess of my old phone’s imported contacts, my gmail contacts (including anyone who I’d ever emailed for any reason in the last 8 years), and my google+ circles. Worse, these weren’t well integrated. I had three and four entries for some people. There is a merge feature in the Contacts app, but it sucks. I ended up clearing out about 90% of my contacts, but I believe as a result my autocomplete when filling To: field in gmail’s web UI will no longer remember a large number of the addresses it used to.

The reality is, the people I interact with via my cell phone are not the same as the people who I email. In some cases, sure, there’s overlap. Certainly, when I’m accessing my email account through my cell phone, I want full access to my email contacts. And some people I have a phone number for, I also have an email address for. But there are a lot of people who I email, or know very casually on google+, who I don’t necessarily ever want to IM/SMS/call. I like having my identity compartmentalized, and being relatively anonymous in certain circles. Android really doesn’t account for this in its design of the user experience for contacts, at all. It didn’t ask me (maybe it did ask the sales guy who set it up for me) if I wanted all these contacts to be jumbled together into one writhing mass of humanity, and there wasn’t any way to undo it after the fact. It was pretty horrible. I ended up using Wondershare MobileGo to manage my contacts, which was still pretty tedious and awful, but did the job, insofar as it helped me to mass delete and consolidate dozens of contacts. It still took over four hours to go through everyone and clear everything up, and that’s really not acceptable.

I’m pretty sure that I’m not unique in how I deal with my contacts, so I think Android really drops the ball here. I have a few suggestions for improving the user experience:

  1. Allow users to filter contacts by source. Here’s all your Contacts from your old phone. Here’s all your gmail Contacts. Here’s your google+ contacts.
  2. Better Merge feature. Mass select N contacts, and then click Merge. Not select merge, then select any two contacts.
  3. When there’s conflicts, such as multiple phone numbers and email, keep them by default, ask which one is primary, and ask if any are outdated. I had a few contacts resurrect from my old phone’s trash, apparently, and I don’t even know if I have their current contact info now, because who memorizes everyone’s phone number? A great solution here would be to have some kind of service that automatically looks up each bit of contact info and attempts to verify that they’re still good. I imagine this would be very difficult for email addresses, but would potentially be do-able for phone numbers and mailing addresses.
  4. Use gmail’s metrics for how much you’ve written to a given contact in your gmail contacts, and auto-filter out contacts whom you’ve contacted below a given threshold. If I have ever emailed some address one time in my entire life, and it was more than a year ago, chances are good I don’t need them in my phone’s Contacts.

One thing I did appreciate was that it included every new word it found in my Contacts into the autocorrect dictionary. So now when guessing wrong at what I’m swyping, I can pull up street and city names, and the odd last name or first name of some person I’ve communicated with at some point in the last decade. This is actually useful when I intend to type those words, as well. It’s a feature.

Messaging

SMS/MMS, IM, Talk. Also, Twitter. All these apps on my phone just to send short text messages to people. Why so many apps that do almost exactly the same thing? I really would like a single solution, which can seamlessly handle all protocols.

Also, and this is truly beyond bad, I have had a lot of inconsistent reliability issues with sending SMS. I never really know if someone got an SMS that I send from this phone. I never had this problem before I upgraded to this handset. I’m not sure what factors are at play, either. I SMS a short list of people on a regular basis, but I have consistently had problems with sending to one particular contact. It seems to deliver my outbound messages reliably only when I send as a new message; if I reply to the existing thread of messages, it is very likely to fail to deliver the message — although it appears on my end that it sent successfully. I’m not sure how high the failure rate is, but it must be at least 50%, perhaps even 75% or 90% when replying to them. My workaround is to always initiate a new message. It shows up in the same threaded conversation anyway, but somehow if I simply reply, it doesn’t work, but if I start a new SMS, and address it to this contact, it will go through. It’s a ridiculous problem and absolutely should not be tolerated. So far, T-Mobile has been unable to figure out the cause and provide a fix for it. I don’t know if it affects other contacts, either. If I send some message to someone, and they never get it, chances are they’ll never notice that they never got a message that they never knew about, and thus won’t bring it up, so I’ll never know. Not knowing is awful. It could be ruining a lot of friendships, and killing potential relationships that never develop because they thought I’d stay in touch, and I thought that if they really wanted me to stay in touch with them, they’d reply back to my message… that they never got.

[Update 7/11/12: Several people recommended the swiftkey3 app as a replacement. I tried it out and it does seem to be more accurate, although it works by tapping only. I did like the swyping motion, my issue with Swype was its accuracy problems and poor prediction. Swiftkey3 is a $3.99 app, and while I do resent having to spend money to get a soft keyboard that actually works, I’m glad it actually works. My accuracy with Swiftkey is somewhere in the high 90’s, and its guessing capabilities are amazing — both in correcting off-target key taps, and to suggest what my next word is most likely to be. It gets my recommendation if you’re looking for a better touchscreen text input.]

I didn’t have too many issues with the Mail app, which integrates pretty well with my gmail account. Read messages are marked read whether I read them in gmail in a web browser, in the mail app on the phone, or in Thunderbird on my PC. And that’s how it should be. If I delete something, though, I have to delete it everywhere. I guess this is a safer approach to take, but triple-redundant deleting can be annoying. I feel like there should be an option to mark the message deleted, update the server, and then the next time the other clients talk to the server, it passes along the info that this message is now marked as deleted also.

The only problem I have had with the Mail app started happening to me just this week. A few times, now, I’ve launched it, watched it update itself, and then mark every damn message in my Inbox Unread. It’s annoying not to know what message threads you’re up to date on and which contain new messages that you should probably read. So far it’s only happened a couple times, and I’m not sure what causes it, but if it happens a lot, I’ll be looking for a new app to read gmail with.

[Update 7/12/12: I’ve observed this problem happening repeatedly since it started happening. It doesn’t happen all the time, and when it does happen it seems to be temporary. I don’t have to go through and re-read everything to mark them read again — usually exiting the app and re-launching it will correct the read message marking. It’s still an annoying defect, but not as severe as I had first feared.]

Maps and GPS

I didn’t expect that I would use these functions as much as I do, but they are nice to have at times. I prefer not to use a GPS; I have a good sense of direction and I have developed it over the years by not relying on external tools for navigation. I prefer to keep my bearings, the lay of the land, and driving directions in my head as much as possible, and as a result I usually only need to write down driving directions once, and then after that I can reliably drive that route from memory, very likely.

But when driving someplace I’ve never been to before, it does come in handy. Where I used to write down directions, and worry that I’ll run into a detour or wrong information, or miss a turn, I now have greater confidence that the GPS will redirect me if something unexpected happens.

Unfortunately, it drains the battery faster than just about anything. I don’t know if this is because the GPS transmitter uses a lot of power, or because it tends to leave the display turned on (normally the battery usage statistics say that the display alone can account for 60-65% of the battery consumption all by itself). But when driving, I just plug it in to the car charger, and it about barely holds even on charge — I drove to Columbus, OH, from Cleveland, OH with it and gained 1-2% of charge in a 2.5hr drive. I doubt that I would have had any battery left if I hadn’t been charging it the whole time. Whoa.

Camera

The Galaxy SII does have one of the nicer cameras I’ve used in a cell phone. It takes good pictures, at moderate distances. I like the on-screen controls. I love the capability to share via any service I can think of, right from the phone. That’s really the best thing about the camera — the social integration.

I’m not too crazy about using it for self-portaits. The wide angle lens makes my nose look big and bloated, and I’m way less handsome that way. That’s my only complaint with it. If I had 2-3x longer arms, I could take better pictures of myself at the distances it’s intended to be used, and just zoom in.

Conclusion

I want to say I like my phone a lot. The Galaxy SII is an impressive gadget. It does a lot of cool things. Most of the time, I think to myself, “I have a really good phone.”

But now that I’ve objectively reflected on all the glitches and problems I have had with it in the first two months of ownership, I’m aware that I’ve been living with a lot of cognitive dissonance. The problems that I’ve had with it are significant, important problems — the most severe type of problems are the social consequences of having a phone that mangles your wordsmithing and fails to even deliver messages reliably.

It’s a cool phone when it isn’t pissing me off. But it pisses me off most of the time when I’m using it. It’s very useful for web browsing, and I use it for that about half of the time. That’s when I really like it. When I’m trying to use it to communicate with someone, though, which is it’s primary purpose, I feel like it’s ruining my life. Not exaggerating in the slightest. The silent delivery failures have harmed relationships that I have with friends and make people think I don’t care about them or that I’m ignoring them, and this makes them feel very hurt, and I have no idea that it’s going on unless I see the friend in person and they bring it up. The swypo errors make me look like a complete idiot on a frequent basis.

The battery life is another major issue, and a lot of reviews seem to gloss over this. Sure, you install a battery minder app that will automatically shut down stuff that you’re not using in order to conserve juice, but they really didn’t serve the market well by providing an 1800mah battery. If you have a phone like this, you want to use the hell out of it, all day long. 1800 milliamp hours gives you a full day’s worth of charge and then some only if you don’t use it. If you do use it, you can get by for half the day, and then spend the next few hours hoping it doesn’t die and you miss an important call or message, or need to look up some bit of crucial information and can’t. And if you don’t use it, what’s the point?

All phone makers, now hear this:  We can deal with the extra weight. Give us 3x battery life and bulkier phones with a real keyboard. At least make it an option. And make armored cases that fit the extended battery covers, please!

A lot of the reviews that I’ve read have been over the top positive, saying it’s the best phone there is, period, including iPhone. I haven’t tried an iPhone still, but I’d be really surprised if the user experience of an iPhone isn’t 10x more polished. I have no idea, but I sure hope so.

I don’t want to hate Android, or this phone, or T-Mobile, but I do have a lot of issues with all three of them at this point. There is a lot here to impress, and a lot of potential, but fitting it all together and smoothing the rough edges and polishing it, well that has a long, long way to go yet.

I really can’t believe that I spent this much money on something that I use every day, and am having this poor an experience with it. There’s a lot of potential in this platform, and even in this handset, and so many of the problems seem like they’d be relatively easy to fix.