Thursday, June 26, 2008

Back to Arch, and Lisp

The past couple of days I've been slowly migrating back to my Arch Linux box, especially after I realized most of my lack-of-hdd-space problems were stemming from the fact that I hadn't emptied my trash in a while. Nice one. Anyway, I'm moving back to that box as my primary dev environment just due to the fact I love more hands-on Linux distros like that, and feel like they're much easier to code on because it's expected you know your system inside and out...that leaves no place for libraries to hide, and removes the voodoo that seems to normally go along with prepping a dev environment from within a more hands-off system (I'm looking at you OS X).

I still haven't decided whether or not I'm going to nuke my OpenSolaris partition; I really enjoy having a full Linux distro running within my Mac, especially when I need to go home and there's no way in hell I'm lugging back two desktop computers. This just will not happen. I'm certainly leaning towards keeping it after being reminded how easy the install and initial set-up was. No fuss, no muss.

I'm finally starting to get back into Lisp as well. Recently I've come down with "do the same thing every day" syndrome, or in a rut as it were. So to rectify this I'm taking a break officially from TF2 (shock!) in order to start working on some projects, including a Lisp syntax checker and the multiple games that have been piling up. (Maybe I'll make some time for musical endevours as well? My saxophone is so painfully neglected...) So much for getting lots of work done over the summer.

So I currently have two primary goals: learn Lisp and complete at least one simple video game project. Hopefully the next time I post I'll have some progress to report!

Sunday, June 22, 2008

Java Just Is Not My Bag...

I've been slowly trying to work out a Java game based on this design since the end of last semester, and progress has been slow to nil. Java is not my main language, and despite the fact I learned quite a bit in my GUI class (where Java was a requirement), I'm still struggling with the very basics. Whereas C++ just *feels* right, when I'm attempting to do any programming in Java I feel like a awkward teenager trying to unsuccessfully grope a transvestite hooker, desperately hoping something good will come out of it if I just keep feeling around long enough and ignore that everything seems wrong about it...

There's not a particular reason for me to feel this way, I've just never been convinced that Java is near as elegant or worthwhile as C++. And I just never really got the hang of it. The main issue is the enormous API; everything in Java is about memorizing syntax. Yes, there is a lot of this in C++ (there's more to the string class than I want to imagine), but somehow it's just not the same. I'm sure this is due to my lack of knowledge, but I don't feel as if I have any control over the built-in functions and objects. As I described to a fellow programmer friend, it feels like trying to use Legos to build an engine.

Anyway, back to my game...I got a fairly good start, with graphics and all that, though I got "stuck" (read: stopped working) when I realized I would have to think about how to deal with the click-place mechanic with the blocks. Yes, this isn't hard, but my mind was whining loudly, "Whyyyyyyyyyyyy do I have to help you figure out how to keep track of all those x and y positions? Can't we just start playing [TF2/ Resident Evil/Metal Gear Solid/Final Fantasy] again??", and I would always give in. Finally, I came back to it after months, and in between that time had started up my zombie RTS project (in C++), and I realized I had no clue what my code was doing, so I overracted and deleted all versions I had made up to that time and fired up Netbeans with a fresh new blank project. And realized it had been so long since I had programmed in Java that I couldn't even remember where to start...

Ironically the main reason I chose this language in the first place is its expansive built-in support for basic graphics stuff. I COULD use a Java game library (like lwjgl) but that would mean reams and reams more of API to trudge through. So once again, I have restarted the same game project, and am faced with my failing as a Java programmer. I have tentatively started the classes, named a few variables, outlined what is inhereted from what, all while struggling to remember exactly how all this works. Someday I will beat this language. Someday.

Saturday, June 14, 2008

Terrible Game Analysis

I fired up Resident Evil: Code Veronica X again for the first time in a while in the hopes I would be able to make some progress and got so lost and frustrated I ended up starting the game over again and pulling up a full walkthrough. Honestly, I don't think I got very far overall, and during my second play through attempt once again shut down the game in total frustration.

This game is largely toted as the worst in the popular game franchise, and was the last of the "classic survival horror" style entries (which RE defined) before Capcom went for a more modern, action style with Resident Evil 4. It is not at all unlikely that the complete revamp was due to the failure of this game. I completely forgot about Resident Evil 0, THIS was a terrible game that marked the end of the traditional survival horror gameplay for the series.Without falling into the pit of ranting too much, I wanted to pinpoint what exactly it was about this game that made it so unbearably frustrating.

This really isn't obvious at first glance; CV sticks very closely to the traditional gameplay style pioneered by the older entries, including the tank controls, fetch quests, and file reading. The level design is dominated by large mansions, labs, and a few outdoor areas, once again in keeping with earlier titles, though it was far more expansive than the previous three. Here's an initial issue: the level design is almost too expansive for it's own good. Like the original RE, you get an overhead floor plan of the areas you're in, but unlike the original RE, you're not limited to an extremely compact area, and quite frankly, none of the rooms are shaped oddly enough to provide landmarks of sorts. Every room is a different sized square. This does not translate into a useful map.

Along these same lines, each one of the rooms was just non-descript enough that I could never seem to remember what was in each one or where it led. To make matters worse, the sheer amount of them made them just blend together; there was never a point where I felt like I had a real idea of where I was going. The original RE technically "looked" all the same, but once again the fact that the area was so severely limited allowed the player to absorb where all the doors led. RE4 deals with its impressively expansive areas by making each one look different and providing an extremely helpful map (besides being exceedingly linear).

Naturally fetch quests were a cornerstone of the series, but CV took this to such a ridiculous extreme that the entire game felt like nothing but one gigantic fetch quest party with a few zombies tossed in to provide some kind of challenge (as if the level design didn't make it hard enough). The fetch quests and puzzles in the original RE were silly, yes, but they at the very least made a small amount of sense within the context; you had to find a book to place with other books to open stairs up, or use the clues on the wall to mix the exact right chemicals to kill the evil plant zombie. You were never at any point needlessly loaded down with too many fetch quests at once either. Code Veronica has you picking up emblems, plates, useless guns, insects made out of jewels, and various other pieces of junk at every turn. At the point I quit the game the first time I had a painting, two "proofs", a plate, and various other pieces of ridiculous brika-brack in my magic chest. To be honest, this was, in fact, the main reason I quit; I was faced with a pile of various junk that needed to be placed in their various respective holes in the game, and the thought of not only having to retraverse the areas to get it all there, make return trips because my carrying capacity was so low, all while painfully low on health with very little ammo to keep zombies at bay and no hope of finding any more health items...this was too much for me.

Just to be fair there are a few good elements; the main character is actually pretty cool (I don't care what anyone else says I like Claire), the combat knife is the most useful anyone ever gets in the entire franchise, and that chick can take an ungodly amount of damage. I mean, she's a fucking TANK. The plot, although it was pretty weak even for a Resident Evil game, still provided some extremely amusing elements (cross-dressing insane main villain) and some important plot points for later games (Wesker being all un-dead and self-elected main villain for the series from this point on). So I suppose in some ways it's not a total loss. It's just unfortunate that, if the level design and fetch quests had been more fine-tuned, the game really wouldn't be half bad.

To sum up, the terrible plot elements, characters, and voice-acting can all easily be forgiven if only the game itself is FUN. Code Veronica manages to make you feel like you're working, not playing an enjoyable video game. And this is its ultimate downfall. When your players quit the game in frustration then you've failed them in a huge way. Fortunately, after RE0 ended up being even worse than CV, Capcom got the message and now RE is (argueably) getting better with each new installment.

The Return of Wheel Bird and Dog (?)

Even though I know it's a HORRIBLE idea to start thinking about new game concepts while working on another game (only because I have the worst track record of finishing projects and I really want to finish BioWar), I realized as I was trying to figure out the assets problem that I had a large library of potential assets for another game...The Official Wheel Bird and Dog game.

People who were not friends with me my first years of college will not be aware of this odd artistic expression that was a fairly substantial part of my life for a few years. It consisted of a crudely drawn dog and purple ibis bird (who did, indeed, ride a wheel contraption around) who were always on the hunt for barley to make mead (despite the fact I discovered later that mead was not made out of barley). Other reoccurring characters included The Mighty Ferret of Girth (an ultra-sized ferret that only made "dook dook" noises), and various other random creatures that did various other things (other favorites of mine were Crack Horse and Bong Monkey, a large tegu whose name I can't remember, and an anoexic cat).

The "comic" ran long enough that I (reportedly) released two trade paperbacks including 10 (or 20?) comics apiece. I wish I could be more accurate with all this but I'm far too lazy to dig it all up. All the comics were scanned onto my computer and posted to a hand-coded website on my Ball State webserver for all my friends viewing pleasure when I was just starting to really get into the internets.

Anyway, enough remenicing. Summery of this story is I still have all this on that server, and I could very easily cut out the characters and produce .pngs and what have you for the sprites. I'd need to think of an original concept for the game, since I wouldn't want it to just be a cookie-cutter platformer, but I'm thinking this would be an excellent basis for a casual game like I was talking about in my earlier post (Ruminations on Casual Games). This is going into the idea bin, there could be more later.

**EDIT: I just remembered the tegu's name was Pom-Pom. He was Dog's pet and liked to eat dirty goth kids at Nine Inch Nails concerts.

Thursday, June 12, 2008

Here's a crazy change of pace....

The first (and only) project for my CS 570 class (Theory of Computation) was to write a parser for a context-free LL(1) language made up by our instructor. I won't get into the specifics, but this was the basic structure of my entry: use a function for each non-terminal, and only check for the first of the "right hand side" of each grammar rule. I made the very easy and glaringly bad decision to declare a global token variable, which was modified directly by every function. So, essentially, there was just the one variable and each function got to check it out when it was its turn. This was especially cringe-worthy in the do-while loops; if the token was equal to a specific character at a specific point in time, it would jump into the "do" part. The functions in the "do" would modify the token, and then it would be checked at the end in the "while" section. Then it would act accordingly. This makes me cringe...

Because I'm a ridiculous nerd, I rewrote the program to utilize local char variables passed between the functions (easy as cake). This was certainly something I should have done in the first place, but I'm not too overly concerned about it, since I still managed to get an A on the project.

Here are the original project and the updated version.

I started working on a third version that optionally takes a file name as an argument when you invoke the program, reads the file, and then parses the sentences accordingly, but this modification will require more insight.

What's the moral of the story? The first project took me about 2 hours to do, I half assed it, and even though it worked, I still feel like I could have done better if I had taken the time to work on it a little longer and put a little more work into it. I also like consistently trying to improve on my older work even when the projects are, at best, trivial (or, in this came, seemingly trivial with applications to far less trivial projects, ie compilers). Practicing the basics never ever hurts, as long as you are able to move on and work on something more substantial and don't spin your wheels over return types, etc.

Lengthy To-Do List

Due to my horrible work schedule and the general feeling of exhaustion resulting from it, I haven't had the time or even really the desire to work on BioWar lately (that's the really lame working title) so in an attempt to motivate myself, here is a list of basic gameplay elements I need to implement:

1) Resources: I currently have get and set functions for this, but I need to design the system in which these are obtained.

2) Unit stats: I haven't yet set some basic specs for the units; after doing that I'll need to do some basic play-testing to ensure there will be some sort of balance. The main reason I haven't even started doing this yet is I still have to define what certain stats mean, ie what exactly does speed mean in terms of game-play?

3) GUI: I still haven't decided how the game will even look (which can most certainly come later). I don't currently have any assets I could use to create a GUI, so I may have to rope in someone else to do basic graphics for me. It's either that or ASCII art.

4) Battle: The battle system must be designed and implemented; this will come in parallel to the stats tweaking, even though essentially the two will be independent.

Getting through this one chunk at a time won't be too much of a challenge, though getting motivated to actually DO it will be. Too much Team Fortress 2 doesn't make for a very productive code monkey.

Sunday, June 8, 2008

Ruminations on Casual Games

There has been quite a bit of talk the past couple of years about the growing casual games industry. Although previously most casual games were purely free Flash or Java based internet games, Nintendo has started an annoying trend of trying to cater directly to this so-called "casual" crowd with their newest consoles (most specifically the Nintendo DS and the Wii). To the absolute chegrin of "real" gamers (ie people who actually CARE about video games), both consoles, especially the Wii, are drowning in what is commonly referred to as shovelware: pet and baby care sims (insulting games for the little girl tween market that requires its own angry post), movie tie-in games, and so on, each one with a lower production value than the last.

So here's the biggest question for any developers: what, exactly, constitues "casual" gaming, and what can we do to accomidate this elusive market with extremely fun, high quality games? And are people ignoring the fact that many so-called "hardcore" games could, in theory, be fantastic casual games?

Well okay...a casual gamer...a few things come to mind:
1) not interested in getting into a game too deeply (ie want to play quickly and be done with it)
2) not interested in spending lots of money on equipment or games
3) not interested in getting involved with the culture around a game (outside of maybe a casual MMO such as RuneScape); if there IS a culture it needs to be completely casual as well
4) zero learning curve, but there is room to allow for increased difficulty or it could get boring, even in a short amount of time

There are a few examples of more "hardcore" games that could easily be considered more casual, or have elements of casual games, except for a few key issues. Team Fortress 2 has excellent class balance, and is extremely condusive to pick-up-and-play. Play the Pyro and you're guaranteed to at least enjoy yourself, even if you're terrible at the game. The problem? Same as all online multiplayer FPSes...the culture that has built up around it can be extremely harsh and unforgiving, which is not something casual gamers are prepared to deal with, nor should they have to. Portal is another excellent example; they story and atmosphere are very fun, and the puzzles are challenging. The fact that it is very rare for the character to die is also very appealing. The problem with this game is that, although you learn new skills in each level, it's very hands-off in term of instructions, and even after blowing through the main game I had huge problems getting through the very intense and challenging boss battle. Katamari Damacy, Ratchet and Clank....the list goes on.

So say we have a game similar to TF2 or Portal...an online mutiplayer game with a strong focus on fun, maybe some puzzles, doesn't have to be a first person shooter. The first move would be to make the controls absolutely transparent, possibly with a pull down menu in the corner and can easily be dismissed and turned off (this is another issue with TF2, the keyboard commands can get confusing for any but the most hardcore FPS player). Since it's an online multiplayer game, the environment should be more condusive to teamwork (a la TF2) with less emphasis on destroying the other person (even to the point where the "adversary" is a computer like in Portal). Along these same lines set up very strict etiquitte rules for servers, or make it very easy for someone to turn off communication and to play on a private server or alone, and allow players to easily message admins about players breaking these rules.

Anyway, this post is quickly turning rambling; I may run with this and try to post a real design later. The casual gamer market is quickly becoming very important, mostly due to the fact that it is obviously becoming very profitable. With more care and planning, all casual games could easily be elevated to the level of "gateway drug"...games as high-quality, but low-cost as Katamari Damacy that make people realize how fun video games really can be (as an interesting side-note I think Katamari would have sold much better if it had been marketed more as a casual game, but unfortunately it was released on PS2, and before the Wii or DS). Check back for a possible design later!