Tag Archives: reflection

The Great Soul-Searching Odyssey, Part III–Rebirth

It’s been quite a while since I went on my sojourn of soul-searching, and I’m happy to say I have finally come to a few conclusions. I’m also happy to say that while I’ve been soul searching, I haven’t been idle. I’ll put that information out in a forthcoming blog post, but for now, let’s finish this odyssey.

First thing’s first. How’s that boxing game coming along?

It is, and it isn’t.

I’m going to finish the boxing game; in fact, I’m still working on it, but it’s going to have very little to do with Mike Tyson’s Punch-Out. Instead, it will make use of a new, revolutionary style of interaction that’s going to make the game actually worth playing. Instead of standing in one place, dodging back and forth, and throwing random punches, you’ll actually be able to circle the opponent, run around the ring, knock the opponent against the ropes, etc. What’s more, the framework for the boxing game won’t be just for boxing, but instead will have myriad possibilities including fighters and adventure games. And–oh yeah–I’m building it from the start to be multi-player.

Also, when I say “I’m building,” I mean that I’m actually working on the project right now–well not at this exact moment in time, but you get the picture. Currently, it’s possible to navigate the arena in true, 3D-style, approach the enemy, and pick up loose items (that last part isn’t for boxing). The project is making progress, and it has been fun to watch it grow. The boxing game/whatever it becomes isn’t the only thing I’m working on, however, and thus we come to my second conclusion.

I have wanted to design games for as long as I can remember, and once I realized I had the power to do so through coding, I turned game design into a part-time hobby. Just as I was picking up the hobby, however, my wife and I fell on hard times financially as a result of the cost of moving from Texas to Minnesota. As a way of helping to make ends meet, I attempted to approach Grey Matter Productions as a money-making venture. There were two problems with this approach, though. First, I knew squat about programming when I first started, thus making the likelihood of turning out a playable game right away infinitesimally small. Second, I was already working a more-than-full-time job, and the prospect of coming home and putting in another few hours of work at the end of the day was extremely daunting. You can imagine how much I got accomplished.

Thankfully, our finances have stabilized, and I have been able to treat Grey Matter Productions and game development in general as the hobbies they were intended to be. Interestingly enough, this has actually sped up development quite a bit, as I’m able to enjoy coding for the sheer sake of coding rather than working on it out of obligation.

Since what I’m doing is a hobby first and foremost, I’ve decided to treat it as such. This means that, from time to time, I may work on other projects as the interest strikes me or to avoid burn-out on a particular game. In fact, this has already come in handy when trying to break through a particularly tough road block in boxing; by taking my mind off of the current difficulty, I was able to stumble on a solution in a round-about way. I’m happier about coding than I have been in a long time, and I’ve made more progress in the past month than at any other time since I began this venture.

For those of you wanting a boxing game, you’ll get it, and when you do, it will be better-designed, more intense, and more feature-rich than its original incarnation. There’s also the upshot that I’ll like it more and thus will be more inclined to work on it. At the same time, however, you may have to wait a bit longer for it. That doesn’t mean I won’t be working, but it does mean that I’ll likely be working on more than one project at once.

It will all be worth it, though. Just you wait and see …

The Great Soul-Searching Odyssey, Part II

When I was much younger, I received Mike Tyson’s Punch-Out as a birthday present. (It was the same year I got a brand new bike, and I’m sad to say I spent more time with the former than the latter.) My dad read me the manual, and I ran into the other room, glued my nose to the TV screen, and pummeled my way through a whole list of crazy characters as the scrappy—and thoroughly under-sized—Little Mac.

The funny thing about that experience, though, was that no matter how much I squinted and stared, I couldn’t see to play the game to save my life. I could see the shapes of the characters, and I could tell them apart based on their appearances, but I never saw the tells and quirks that have long been a hallmark of the Punch-Out games. I never saw the gem flashes and eye blinks that warned of impending punches, but I learned through careful timing and a whole lot of dodging how to stay on my feet. I once even thoroughly confused mom by hiding under a bean bag chair with the controller while continuing to play the game by sound alone.

Years later, Punch-Out was rereleased for the Nintendo Wii, and I found out that other blind people were able to play the same way. It turns out that on the Wii the game is even more accessible, as many of the opponents’ punch tells are now audible. It’s so playable, in fact, that Karl Belanger once told me he had racked up 136 straight victories. For even more proof, check out videos like this one or this one where Liam Erven drops two opponents in fine style.

Flash forward a few years to the beta release of BGT. I picked up the language, started mucking about with various functions, and thought it might be an interesting test of my newfound skill to try making an audio only version of Punch-Out. When I made the switch to Python, I took the concept and code with me, figuring that it would still be a fine first project. I figured that the game could be a gentle introduction to programming, and it would give me something more substantial to release than Guess the Number or another Space Invaders clone.

And herein lies the irony. Here I am, finally gaining the ability to design the games I’ve always dreamed of, and I’m spending my time porting a game to audio that’s already perfectly playable by both the blind and sighted alike. The folks at Nintendo spent far more time and money on their product than I ever will, and they produced it with richer sound, more features, and an overall better design.

The question I’ve been asking myself as I struggled with the keyboard handler and pyHook is whether this boxing game is even worth it. If a superior product already exists for a mainstream console, and if that product is already completely playable without sight, what is the point of my designing my version? Sometimes, even though I’ve sunk nearly a year of work into the boxing game already, I’ve contemplated just tossing the game in the closet for a while to work on something else—something far more original and interesting to me.

Two things stop me, though: my sense of duty—the fact that I’ve already promised the game—and this post sent to the Audyssey list back when I announced the game:

Not trying to sound negative here, but it seems that every once in a while
we get some announcement on here about some huge audio game project coming
out. it never materializes and we’re left waiting for this non-existent
game. let’s hope we aren’t disappointed yet again. I learned to take these
announcements with a grain of salt, and so should everyone else. usually
when these announcements are posted, the game is still in the planning
stages and nothing ever comes of it. all this does is give most gamers hope.
I really hope I’m wrong this time and that this game does indeed come out.

I want that author to be wrong, too.

The Great Soul-Searching Odyssey, Part I

March has come and gone, and the blog has lain dormant this whole time. Not cool, Ryan. Not cool. So what have I been up to in that time? It turns out quite a lot, though not as much of it was as productive as I would have liked. Here is my tale.

Remember back in February when I happily wrote about creating my first keyboard handler? (If not, just jump down to the next post. Go ahead. I’ll wait.) It turns out that, despite the awesomeness of said handler, JAWS, the eternal programming thorn in my side, didn’t want to play nice with my code. In particular, it wanted to steal the use of the arrow keys for itself, thus keeping them out of my program. As any of you who have had to put JAWS to sleep in order to play a large chunk of audio games can attest, this is pretty annoying.

I was determined to figure this problem out, however, so I started searching high and low for solutions. The title didn’t lie. This really is an odyssey.

First, I traveled to the land of the great and powerful Pygame developers. Well actually, I just wrote an email to their listserv. Be that as it may, many of them recommended a module called pyHook, a powerful artifact which, according to legend, could freeze the dreaded JAWS in its tracks and prevent it from making off with my arrow keys. But oh man. PyHook is something like 10 points beyond my current skill level, and even its documentation was nearly indecipherable to my n00b mind.

Nevertheless, I threw everything I had against pyHook, aided somewhat by a wise old sage named Alec the Brave.* After what seemed like 10 days—because that’s about how long it was—I managed to throw together a workable solution that allowed me to run my demo side scroller and keep JAWS up and running at the same time. Some of you probably saw my exuberant tweet on the subject.

*Alec’s wisdom is beyond reproach, though his age and sage status have yet to be determined.

Alas, though, my struggles were for naught, for as soon as I began to tweak and debug the program, I realized that pyHook—and here I’ll use the technical phrase—“broke the hell out of” my keyboard module. I’ll spare everyone the gritty details, but suffice it to say that holding down keys was a nightmare, and even though the arrow keys kind of worked, they absolutely didn’t work if something like the control key was held down. All of this meant that if I chose to continue to use pyHook, I would invalidate the eight days I had spent designing and implementing my keyboard handler. What’s more, I had once again run out of ideas on how to proceed.

So what did I learn from the first leg of my journey? I learned that sometimes, the problem I need to solve isn’t as immediate as I think. More than that, I learned that it’s way too easy to get bogged down in side projects that leave me no time for working on important things—like punching a clown in the face. When the day comes that JAWS speech is a deal breaker, I’ll figure out the arrow key problem. Either that, or I’ll have it done for me by someone with a lot more expertise and skill.

Until then, I want to code a game, and that’s just what I intend to do.

Therein, however, lies the next step on my soul search, but since it’s almost midnight, I’ll have to save it for another day.

Pouring

                I guess I always knew somewhere deep down that there were going to be down sides to programming, but of late they’ve been cropping up in some very unexpected places. I expected to have to face some of the legendary heckling and complaining that almost all developers have encountered, but the community has been blessedly understanding and kind about the whole thing.

                Perhaps I’d better back up a bit here. A few weeks ago I received an email on the Audyssey list from a user who told me that Block Party wouldn’t run on his system and that he was getting error X. Having no idea what error X involved, I put out feelers, and I was told to put a specific line of code into the main module that would fix everything. I placed the line of code where I was told and uploaded the new executable to the site.

                I then went back to work on the boxing game, building in support for multiple punch types and perfecting existing sounds, only to discover that my current keyboard code didn’t support things like holding down keys. If I wanted to press up and A at the same time to throw a left hook, I could, but I couldn’t hold up and tap A at some future point and achieve the same result. Some people might argue that it makes no difference, but for some reason, the lack of being able to hold keys feels awkward to me, and I’d like to be able to fix it.

                So I started working on a solution. I went out and started researching Pygame, a Python library specifically designed for game development. (Some of you may recognize Pygame as the library used to code Sound RTS.) I figured if I imported the Pygame keyboard module, I could build in support for a lot of the keyboard-based stuff I really wanted. There’s also the added bonus that Pygame supports mice and joysticks as well. But just as I started my research, life started happening.

                First came the emails from the Audyssey list telling me that the new version of Block Party wouldn’t run on 64-bit Windows 7. I have to pause here to point out that the emails I have received thus far have been extremely cordial, and I cannot stress enough how much I appreciate that. After the emails, though, came a mountain of work at my job, and after that came some previously-made engagements which have taken up a significant chunk of my time.

                Today I finally had time to sit down and research the problem, and I came to the conclusion that I needed to roll back to the previous version and find another solution to the problem, only to receive more kind emails from people telling me that They—the emails’ authors—could now happily run Block Party’s latest version on their computers. Argh! Now I have to trouble-shoot Windows 7 64-bit!

                The most interesting and awesome thing about this whole ordeal is the response I have received from the blind gaming community. As I wrote earlier, I have received no negative emails about Block Party’s refusal to play nice with everyone’s computers. Especially given some of the epic flare-ups which have previously occurred on the Audyssey list, I was expecting to have to dawn my ceramic suit and dive for cover to escape the flaming. Instead, everyone has been very understanding and patient with me as I research and learn in an attempt to solve the problem.

                Which is probably why I feel so bad.

                You all have been waiting for months for the boxing game—almost as long as I have. I have been giving out teasers and snippets from time to time and writing about my progress in various forums, but real, tangible results of this project have not been forthcoming. I know deep down that there will be setbacks; I’ve written about them in a previous post or two, but I hate that they’re occurring at all. More than anything I want to finish this game and release it to the general public, but for some reason things just keep coming up. Maybe this is all a bit melodramatic, and maybe I’m just on edge after the whole Qwitter thing, but I keep feeling like there’s a clock hanging over my head, and when it strikes, there goes my credibility. The funny thing is: it’s not you; it’s me.

                Holy crap. I have to stop writing now before something even more cheesy comes out of my keyboard: “maybe we should just be friends.”

                Anyhow, thanks for letting me get that off my chest, and thanks for being so awesome about the whole thing. I promise I’ll make the end result worth it, and we’ll all have a lot of fun.

A Worthy Challenge

                When you start out programming, people tell you it’s a good idea to start with something small. It’s why almost all program tutorials start you out with printing “Hello world!” to the screen. In the case of games they tell you to produce Guess the Number or a Space Invaders clone or something equally unsatisfying from a gamer’s prospective. But in spite of this good advice, the starry-eyed gamers want to produce something exciting, something revolutionary, and they either wind up failing or producing something ugly. I’m a big believer that you only truly fail when you give up, so I don’t believe I have failed to produce a great game. I do think, though, that the current incarnation of boxing is pretty unattractive.

                A big part of the reason behind this ugliness is that I started with an extremely limited skillset. I could only conceptualize how to produce the kinds of things I wanted with some very limited tools, and my code and design reflect this fact. It’s why I’ve been writing on the Twitter feed recently about how I’ve been going back through all of my modules and stripping out/refactoring a lot of the detritus that has collected there.

                But as my knowledge has been evolving, so has my vision for the direction I’d like to take the boxing game in, spurred on in no small part thanks to some bona-fide geniuses on the Python tutor list. When I look at their code examples, their suggestions for different work-arounds, their ideas for alternative—and better implementation—I realize that I’ve only been scratching the surface of what this game is truly capable of. I don’t, for example, have to stop at four basic punches, especially when boxing offers a whole host of new ones. I don’t have to limit the game to blocking and not blocking when I can easily build in slipping, bobbing and weaving, stepping in, and so much more. Did you know that a classic boxing combination is to throw an uppercut with the power hand, then follow it up with a devastating hook with the other hand? Apparently the first punch lifts the jaw into prime position, and the follow-up punch lays the opponent out. I didn’t know that before yesterday, but now that I do, I want to build it in! Now that I have more tools at my disposal, I can do that—and what’s more, I can do it with relative ease.

                This probably comes as a bit of a disappointment to people who were hoping I would release the game yesterday, but I promise that the mechanic change will make the game a lot more fun for all involved. Instead of just mashing a particular button repeatedly and getting away with it, players will have to make strategic decisions and play off of their opponents. They’ll have to learn which punches to lead with and when to throw a proper combination, and the opponent will be learning right back. If they throw the old one-two too many times, the opponent will start to anticipate it.

                While I think future players will really appreciate these changes, I’m also making them for my own sake. Nothing is more frustrating than spending lots of time on a project that is no longer of interest, and I don’t want to become frustrated with the boxing game. I want this to be an exciting journey for all involved, but since I’m steering the ship right now, I need to make sure I don’t fall asleep at the wheel. Thankfully, we’re bound for Tahiti.

                And I’d better stop with the nautical metaphors.

                Oh hey—random thing: Did you know that coffee gives you super powers? No, really. I use it all the time when coding to help me stay strong. In fact, I might go have some right now!

Changing the Rules

                Years ago I used to run around the neighborhood with the local kids and play some variant of “guns:” cowboys and Indians (we weren’t racially sensitive), cops and robbers, spacemen versus other spacemen. Even though most of us were on board, there was always that one kid who just had to bend the rules a bit.

                “Hey,” you’d yell, blowing imaginary smoke off the barrel of your plastic revolver. “I shot you!”

                “Nuh-uh,” he would always return. “I was wearing a bullet proof vest.”

                I understand now, after a hasty Wikipedia search, that bulletproof armor did in fact exist during the 19th century—at least as far as Wikipedia claims. According to the article, it existed some 300 years before the Civil War. But as kids, we and the bulletproof wannabe thought of ballistic vests in the more widely recognized, modern sense. As far as we were concerned, he was cheating, arbitrarily changing the rules when the game was already in progress.

                I always look back on my body armor memories and smirk when something completely new and unexpected comes along to shake things up. (By the way, My Body Armor Memories would make a great band name. Feel free to use it.) In the case of programming that game-changer was decimal numbers, referred to in computer parlance as floating point numbers. As far as your computer is concerned, writing floating point numbers is hard. The mechanics of why this is the case are a bit obnoxious, but suffice it to say that when you see 0.1 on your computer screen, the computer isn’t thinking of the same number. If I assign the number 0.1 to the letter x, then tell Python to print x, I’ll get a nice, pretty 0.1. If I tell it to print 0.1 to 25 decimal places, though, I get 0.1000000000000000055511151. This difference of numbers can cause major trouble in coding if you’re not aware of it, and just like my cheating neighbor, it caught me completely off guard.

                In trying to program the opponent creator, I designed a system that checks the time an event is scheduled to occur against the user’s current time. If the two numbers match, a sound is played, and the user can edit events. When I tried to move a tenth of a second at a time, however, I found that my comparisons weren’t matching up. I tried to debug the code with print statements, and things looked like they should have worked.

position 2.8
position 2.9
position 3.0
position 3.1
Event placed!

Even when I pressed the right arrow, then pressed the left arrow to return to 3.1, things looked like they were working.

position 3.2
position 3.1

                But at 3.1, I should have received a message that said “sound method called.” I didn’t, and the reason, as I discovered after 8 days of struggling with the code and obtaining tips from experienced programmers, was those blasted floating point numbers. A simple print-out of the three punches I had entered shows why.

{3.1000000000000014: {‘punch’: {‘strength’: 0, ‘height’: ‘head’, ‘can_stun’: False, ‘can_break’: False, ‘speed’: 1, ‘side’: ‘left’}},
2.1000000000000005: {‘punch’: {‘strength’: 0, ‘height’: ‘head’, ‘can_stun’: False, ‘can_break’: False, ‘speed’: 1, ‘side’: ‘left’}},
1.0999999999999999: {‘punch’: {‘strength’: 0, ‘height ‘: ‘head’, ‘can_stun’: False, ‘can_break’: False, ‘speed’: 1, ‘side’: ‘left’}}}

                When I enter a check between the time of an event and the user’s current time, they will never match up, because in no world is 3.1 equal to 3.1000000000000014. But completely unaware of this oddity in computer programming, I scanned through my code perhaps a dozen times, grew incredibly frustrated, and even considered a complete re-write. As Christopher Toth later told me, “This is the kind of thing that makes perfectly sane programmers gibber in fear.” How right he is.

                The code is working properly now. I found I could overcome the problem by rounding the floating point numbers I encounter, but the solution was a long time in coming. I never realized when I started out that some of the hurdles I would face in learning to program would require a grappling hook and a spotter to overcome. (This situation also shows why I do not give release dates or accept pre-orders.) Even so, the trial is passed, and I have some talented programmers to thank for it.

Catharsis

                When I was 14 my school loaned me a brand new, state-of-the-art laptop that possessed the ability to dial into the internet. It was a monster of a machine with all of 4 gigabytes of hard drive space, a detachable 3.5 inch floppy drive, and JAWS 3.2, and I loved it. For those of you who remember those early versions of JAWS, you’ll remember that the internet was a trying place to navigate full of inaccessible links and hard to read content. Still, the text games worked perfectly, and I suddenly had a new hobby.

                It started out with Telearena, a simple text-based BBS game with little to offer players beyond stock fights and repeated descriptions. Take any standard Merc mud, divide the fun quotient by 10, stomp on the result, set it on fire, then put the fire out with bleach, and you might come close to the enjoyment one could gain from playing it. Of course, it was the first game of its kind I ever played, and I was hopelessly entranced.

                From there it became Majormud, and then there was The Rose, Council of Guardians, by far my favorite of the BBS titles. But there were dozens more games out there, and I played them all.

                It wasn’t long, though, before I discovered the true potential for text-based gaming that actual Multi-user Domains (muds) could bring to the table—muds like Dreams, Discworld, and The Inquisition. There were others: Aardwolf, God Wars 2, BatMud, Achaea, 3 kingdoms, MUME—Multi Users in Middle Earth, and at least a score more. I even started spending money to play muds, shelling out both monthly fees and promotional charges to muds like Modus Operandi, Dragon Realms, and Lusternia. And because I know some of you mud enthusiasts out there are wondering, I did have a run at all of the Squidsoft games: Star Conquest, Galaxy Web, and Fortharlin. I even spent far too much time on Miriani—and no, I won’t link to that horrible twink of a game.

                But beyond the hundreds—possibly thousands—of dollars I spent mudding, the more detrimental cost came in the form of the literally thousands of hours I spent glued to my computer desperately trying to reach that next level, finish that elusive quest, or farm excessive amounts of gold and loot. I pretended to be sick from school and work so I could put in extra time on gaming. I stayed up playing until 3 or 4 in the morning, then honestly wondered why I could not stay awake in classes the next day. Instead of socializing with my peers—the people I worked and went to school with—I made virtual friends online. On New Year’s Eve, 2000, I rang in the new year with a handful of friends on a custom-built mud they had designed for just that purpose. Nobody invited me to post-high-school graduation parties; after the ceremony I went straight home and sat sadly in my basement, wishing I had made some real friends. But by that point I was well and truly hooked, and my addiction—for that’s what it was—persisted all the way through college. It followed me into my post-college work; it followed me to Hawaii, to Texas, and—finally—to Minnesota.

                I can only guess why mudding had such a profound draw on me, but any reason I give sounds more like a hollow excuse in retrospect. I suppose what it really comes down to is that I wanted to escape into a place where I could be powerful beyond what I could ever hope to accomplish in real life. In the real world I was a pudgy, socially awkward blind teen-ager who struggled with image and self-confidence, but online I was a swashbuckling warrior, a daring rogue, or a powerful mage, and no one ever needed to know that I was blind or a little heavy around the gut. Instead of facing my fears about blindness and getting involved in school and the community, I patrolled the streets of Lithmore as a reeve and defended the realm from murderers and thieves. People do this all the time with video games, and I can understand why. After a long, difficult day it’s sometimes fun to get lost in mindless entertainment. For some people it’s an episode of Jersey Shore; for others it’s a few games of Major League Baseball 2K11 on Xbox. But with muds, the game never ends. There is always that next goal waiting just around the corner for a dedicated player to come and attain it.

                I played my last text-based multi-user game on December 20, 2010, and I have no idea why. I had tried to quit before; I made it as far as a month during the Summer of 2009, and every day was a challenge. I would be reading a book or playing my guitar, and I would suddenly be overcome with an overwhelming desire to play something—anything—so long as it was a mud. In the end I rationalized my return to text-based gaming as a step toward moderation—a rationalization that lasted all of a week. It wasn’t long before I was back at it again, spending 12 to 16 hours in a single weekend in front of the computer. But this past Christmas vacation, a time I eagerly anticipated for the comparatively huge span it would afford me to mud, something weird happened. Before I knew it January 2 was upon me. I hadn’t mudded in 13 days, and I wasn’t bothered by it in the slightest. In fact, I was surprised, looking back on those two weeks, that so much time had passed.

                It hasn’t been as easy over the past few months as it was during those first two weeks. To tell the truth, the whole reason I’m writing this post today is because I’m fighting the persistent urge to log back onto Discworld or check the latest progress on God Wars. Even as I write, I am filled with nostalgia for those worlds of fantasy and imagination I no longer visit. But I know I can’t go back there. Just as in the past, it would start simply enough—an hour here or there—but before long I know I would spiral back down into my old habits.

                When I look at the above paragraph, I can’t help but think it comes across as a bit dramatic. I haven’t ever struggled with chemical addictions—drugs, alcohol, cigarettes—and I haven’t had to face down habits such as gambling that could destroy everything around me. Instead, I traded half my life—14 years—for gold and experience that amounted to nothing more than stats on a server, and I won’t ever get those 14 years back. I never hurt my body, but I did hurt myself, squandering my potential and talent on computer-generated orcs and meaningless collections of numbers rather than using it to better myself and the world around me.

                So why program games now? Why spend my free time creating virtual fantasies? I suppose it’s for that escape, that temporary journey to a place where each of us can forget about the world for a time and just dream. At the same time, though, I do it for the process. I love the thinking, the imagining, and the problem-solving that it takes to create something. I love knowing that I have the power to shape the world with the strength of my mind, and I love being the architect of my own imagination. I love that instead of following, I’m leading—even if I’m only leading myself.

                So I’ll keep struggling against my old habits. I’ll keep fighting the urges to slip back into the placid waters of inactivity. I’ll keep pushing against half a life’s worth of lost opportunities even though I know it won’t be easy. I’ve invested too much time and energy into this change, and I like the person I’ve since become. If spending time with this new me requires me to give up my lazy past, then I will happily pay that price.