Thursday, December 30, 2010

The DigiPlague

UPDATED (Jan. 2, 2011): Made some corrections to the description of the DigiPlague.  Added tips on how to fight the DigiPlague.

I can't sleep.  It's not that I'm too awake or don't really want to, it's that my head is threatening to explode.  I seem to have come down with the DigiPlague.

What is the DigiPlague?
The DigiPlague is a five to seven day disease. It's a sneaky illness disguised as a cold, but suddenly becomes apparent to what it is.  It's this germ that somehow manages to survive at DigiPen, mutating with each new freshman class.  It survives from person to person, always passing on before it dies completely.  It is a close friend of the DigiFunk.  The best way to describe the DigiPlague is to break it down into it's five days (the seven day version extends largely days 3 and 4).

Day 1
The DigiPlague begins as the sniffles.  It seems to be just some sniffling and sneezing, but it comes on rapidly.  After a few hours, you hurt from sneezing so much and physically ache.  You are completely exhausted, but you assume it's just a cold.

Day 2
You feel better in the morning, leading you to believe it was just a simple cold or something that stirred up your allergies, but that's how the DigiPlague tricks you.  A hot shower in the morning will make you feel close to 100% well, but as the day goes on, you spiral into illness.  You sniffle and sneeze and end up physically exhausted again.  At this point, you may begin to suspect just what it is you have.

Day 3
This is the day that you feel like death.  You wake up dying, and though a hot shower can make you feel better, you know it's not going to stay that way.  This is the day to just stay in bed with OJ and tissues.  Get some soup, bunker down, and just ride it out.  You will feel like crap today.

Day 4
You begin the day feeling like crap, much like the previous day.  However, you can sometimes blow your nose and get some of the junk blocking your sinuses out.  As the day goes on, you begin to feel better, but to what degree varies from plague to plague.  The key note here is that this is when you start to get better.

Day 5
You return to the snifflies and feeling like you have a cold.  You aren't all the way back yet, but you're close.  Make sure to get plenty of rest so you don't relapse.  After today, you should be back to your old self.

How do I avoid the DigiPlague?
There are a few tricks to avoiding the DigiPlague, but it's nothing special.  Eat you vegetables, get your vitamins (especially C), and get enough sleep.  Those are standard.  Also, hygiene is important.  Wash your hands often, shower daily, yadda yadda.

The real trick to avoiding the DigiPlague is to avoid the DigiPlagued.  It's a zombie-apocalypse style rule that holds a great amount of merit here.  If someone you know has the DigiPlague, avoid them.  Encourage them to stay home and get well.  If you see someone sneeze on a keyboard, avoid that workstation.  It's all common sense really, but when there's too much to do and the DigiPlague takes hold, people forget about these things.  If you want to do your part in ending the DigiPlague forever, stay home when you're sick and encourage others to do the same.

How can I fight the DigiPlague?
First thing you'll need is some tissues.  I strongly recommend the type with lotion so you don't blow your nose raw.  Stock up; I've gone through about three boxes with this most recent DigiPlague.

Secondly, stay home where it's warm and get comfy.  Going out is extra strain you don't need to put on your body.  Only go out when necessary, such as to stock up on tissues and orange juice.  I strongly recommend taking plenty of hot showers.  The steam from shower will help break up all the junk in your sinuses, so you'll feel a fair amount better afterward.  However, don't let that lull you into thinking you're well enough to go out.

If you want to, you can try taking decongestants and the like.  They might help you more than they help me - theoretically, I may be allergic to them, or they may set off my asthma.  Either way, I've never really taken them before this most recent plague, and they aren't doing much.

Eat hot meals, preferably soup type things and comfort foods.  You can't beat comfort foods when you're sick.  I proclaim spicy foods a miracle cure for sinus congestion, but even they don't seem capable of standing up to the DigiPlague.  Eat stuff that will be kind to your throat.  It'll have it's own battle to go through as the plague runs its course.

In the end, there is no cure for the DigiPlague.  Once it starts, you just have to wait it out.  If you get it, just be sure to take care of yourself and stay home as much as you can.  After you're better, clean your bedding, get a new toothbrush, purge the DigiPlague from your home.  Try to keep from spreading it - Only you can prevent the DigiPlague.

Tuesday, December 28, 2010

This Week In DigiPen: Epilogue

Well, as you may have noticed, that didn't work out quite as planned.  DigiPen demands much time, nearly all of it during certain weeks of the semester (week 7, week 8, and week 14 in particular).  This semester was particularly demanding, though I'm not entirely sure why.

It's very different not having a game team.  Having a team means you have people you can rely on - and that you have someone relying on you.  That's a driving factor - it keeps you rolling in good times and in bad.  It gives you someone to talk to about the issues you're having in other classes.  You have team meetings with Check-In for your personal soapbox.  It makes you aware of problems you have and get them off your chest.

A quick aside about Check-In and what it is.  If you know what it is, feel free to skip the italics.  Check-In is a protocol for team meetings where you go around to each person and they say how they feel in a few simple words: "I feel..." followed by glad, mad, sad, or afraid, then what is triggering that feeling (i.e. I feel sad that I didn't come through with my weekly DigiPen updates for my blog).  After talking about their feelings, the person then states if they are in or out of the meeting - if they're not going to be productive, they may as well take the time off to relax or get caught up on some other work.  Finally, the team responds to that member's decision ("Welcome" for in, "Thank you" for out).  If you're out, you take your leave then.

Overall, I think my This Week In DigiPen project would have worked better if I had used a format similar to Week 7 and Week 8.  It was quick, simple, and didn't require much time or effort.  It was a sort of check in that got the point across, but, by the time I discovered this format, I had burned out.

So, let's move on to some promises to keep.

CS300 - Points are not Vectors
Way back when, I promised that I would show off my first shiny graphics assignment, which I thought I had completed to the fullest.  Turns out that I had a lingering bug that stuck through my next two assignments.  It slipped by in my first assignment (lighting), but it became obvious in the bump mapping assignment that my light was following my camera in position.  However, the direction was fully correct.

The eye looks at the origin with a spot light above pointing at the origin as well.

The eye moves past the origin, and the light follows incorrectly, shining in the same direction as before.

The eye turns around to face the origin, and the light points in the correct direction.
I tried for the longest time to figure this out.  I showed it to person after person with no luck.  Finally, one of my fellow students realized that I had made a very simple mistake.  In 3D graphics, we use 4D matrices to transform points and vectors because math is a magical thing.  It allows us to distinguish between points (translation dependent) and vectors (translation independent).  Had I thought of this simple distinction between the two, the answer would have been obvious.

For example, let's take the origin.  As a 3D point, that would be at (0, 0, 0).  In 4D, we add a 1 at the end of that, so (0, 0, 0, 1).  This extra 1 allows us to translate that point wherever it needs to go.  Let's say we have another point P at (1, 2, 3, 1), and we want to draw a vector V from the origin to our point P.  That's the difference between P and the origin, so V = P - O = (1 - 0, 2 - 0, 3 - 0, 1 - 1) = (1, 2, 3, 0).  This 0 at the end means we ignore any translation that may be applied to the vector, thus it is translation independent.

Now then, our light has some translation away from the camera, right?  At least, that's what we want.  So, if our light is moving with the camera, that means it's not translating away from the camera.  If we don't have a translation, then our light is translation independent.  If the light is translation independent, then it's position must be a vector, not a point.  That's a problem.  In fact, that was my problem.  So, what's the difference between a point and a vector in 4D?  That last element:  (x, y, z, 1) is a translatable point, (x, y, z, 0) is a translation independent vector.

So, now that we've got that out of the way, let's see some shiny graphics.

Some simple Phong lighting.

Now with normal mapping generated from a height map (texture turned off for emphasis).

Now with shadows!  Note the cone under the torus' shadow for maximum fanciness.

Reflection and refraction using cube mapping.

Alright, that's enough of graphics.  Now on to what DigiPen is really about - the games.  Blankie is launched, so you may as well go play it.  It hit the scope I wanted it to (a single level that's a bit long), and overall I'm very happy with it.

At this point, I'm rambling, so I'm just gonna cut it off here - goodbye semester.  Onward to my final semester!

Friday, November 19, 2010

The Vortex of Doom

A while back, I mentioned that my doom-ometer reading was at a 10, so what was I talking about?  Well, first, let's talk about what doom is.

There's this horrible thing called the Vortex of Doom.  This is a place where you have too much to get done, but you feel so doomed that you get nothing done.  Since you're not getting anything done, you feel horrible about not getting any of your to-do's done.  Since you feel horrible, you're not getting anything done.  Rinse.  Repeat.

The Vortex of Doom is very hard to get out of since it is a self replicating cycle.  The best way to escape it is to just stop.  Give something up, take some time out, and then get back in the game.  However, the Vortex of Doom is very sneaky - you often don't realize you've fallen into it until it's too late.  Once you're in the Vortex, you become blind to many things, including the solution.

So how do you avoid falling into the Vortex of Doom?  First of all, manage your time.  Less obviously, you need to monitor how doomed you are.  If you're aware of how doomed you feel, you'll be a better judge of when you need to take a break or some time off.  This is where a doom-ometer (alternatively doom-o-meter or doomometer) comes in.

Enter the doom-ometer.
A doom-ometer is a way for you to measure how doomed you feel.  As such, you should be the one to make your doom-ometer.  Pictured above is my Doom-ometer from last year - it ranges from zero (no doom) to ten (overwhelming doom).  It's simple with a rotating arrow.  Creating and personalizing our doom-ometers was a great team meeting - very similar to our meeting spent personalizing our sprint board.  By attaching these to our sprint board, we could update our doom reading at the start of each meeting during check in.

Another example of a doom-o-meter, more in the style of a pressure gauge.
The idea is that once you're doom reading hits a certain threshold, you should take a break.  In fact, the team will force you to take a break.  We agreed early on that if our doom level ever reached nine or more, then your task for the meeting was to take time off.  It didn't matter if what you had on the ToDo section of the sprint board was critical - you were excused and covered for.  Luckily, we only had to call in this rule a few times.

Our third team member's thermometer style doomometer, complete with paper slider.
By taking that time off, you would have time to recover and get away from the Vortex of Doom.  It was guilt free time off - we had agreed on this early on in development, so even if a milestone was just around the corner, you were good to go and relax.  If it had to get done, someone would cover for you.

Overall, the doom-ometer was a great tool for our team.  It allowed us to monitor how each of us was holding up, as well as when we just needed some time off.  It was a fun meeting making them, and it added a lot to our sprint board.  Having our doom reading as part of check-in each meeting was a nice way to sum up how all the 'I feel's.  Of course, it also made each of us aware of our internal state - and knowing is half the battle!

Thursday, November 11, 2010

Overnight Development - Crunching for Engine Proof

Let's face it, sometimes you just don't have time to work on things right now. You push off what's not due tomorrow, and then it keeps getting pushed off for other assignments. Suddenly, you realize that what you've been pushing off has come up and it's due in the next couple of days, and you've got three days to do what you were planning on finishing over the course of three weeks.

Welcome to DigiPen, a balancing act of time management. You've got a game to work on, and four or five other classes worth of work on top of it all.

Yesterday was the presentation of Engine Proof milestone, and three days before that, I was sitting on the Tech Demo of my game.


How it all started on Sunday.

For those of you not in the know, a Tech Demo is really just proof that you've got some of the basic technology working for your project. Engine proof is meant to show that all that technology is working toward your project. After Engine Proof comes First Playable, where you show the "first" version of your project itself (i.e. a full level of your game). Since I'm on a solo project that I only plan to work on this semester, I need to deliver the next milestone, such that my Tech Demo was really an Engine Proof. More specifically, the player could run...



And jump...


And glide...


And hide...


And even win...


As you can see the engines are working together to give the general idea of what my game is going to be. So, for the Engine Proof presentation, what I needed was a First Playable. That means that I wanted to show my first level from beginning to end, complete with splash screens and a main menu. The first that I needed to do was create a level system and move all of my game code out of the core loop and really just do everything in a better way. so, here's what I came up with.

Ta-da!.... Wait, isn't that the same thing?

Okay, so it looks no different from my starting point, but that's the point. What you don't see in that screen shot is my level architecture working in a way that makes it indistinguishable from when I was updating each character in the game's update loop. With a level system, I could add more levels, in particular levels to handle the splash screens and main menu. However, that would have to wait. First, I needed to move PJ (the kid in pajamas) off of some invisible line and onto an actual platform.


That's more like it!

So what cosmic significance did this have for my game? Well, it's a platformer, so unless I feel like making PJ's movement code handle each platform individually, I needed it so that he could see if he's landing on a generic platform object and move around on said platform. The old way, featuring magic numbers and invisible lines, would require hundreds of lines of bad code that would doom development. Anyway, what's next?


Naturally, moving platforms.

Of course, once we get platforms into a game, the first feature everyone wants is moving platforms (or at least that's what every ProjectFun student wanted during the platformer). Rightly so, moving platforms are cool - they add all sorts of neat options to the level design. All I need to do is add the platform's movement vector to PJ's right? So, I started with the vertical. It seemed to work...


Nope, definitely not working.

So what's the problem? He moves with the platform just fine, and he could even run back and forth. Why can't he jump? Basically, I had done some silly things when he was running along the invisible ground plane, so now it was interfering with the way it should work. Easy to fix right? Well, yes, but not if you go about it the wrong way. That wrong way would be just removing some odd multiplication and hoping it works. That sort of thing causes horizontally moving platforms to not work quite right...


Why didn't I just add the platform's velocity like I said to?

Alrighty then, got that fixed by going with the original thought I had. I'm still not sure what happened between me thinking it through and implementing it. Anyway, moving platforms work (I made sure to test in all directions). That takes care of the platforming part about my game, so onward to the scrolling!

Scrolling involves getting some sort of a camera going along, and as far as I know, Flex handles everything in camera space. So how do I move the camera when the camera is always at the origin? Easy, I move the world around the camera in the opposite direction. Just like how the ship in Futurama works, right?


Well, it almost works.

Mind you, that little bug there is after quite a few other silly issues (like the camera just taking off on it's own). Sadly, I don't remember what I did to fix it - I had thought my screenshots would remind me. I also thought I'd be writing this three days ago, so...


Oh look, I fixed it!

Alright, camera's working, moving platforms are working. Let's make sure that I can move the position of my camera down a ways, place some platforms, and let's make sure it's all working as planned. At this point, I through some platformer down as a horizontal plane and ran around. So far so good. Then I tried a stair-step formation.


Uh-oh. Why's he jumping once he gets close to the next platform?

So maybe there's some issues with platforming still. After looking at the platforming code and face-palming again, I figured out that I had placed some of the "stop falling" code in the "on ground" state - such that he would see the next platform and suddenly put himself on that one.


There we go. Able to jump and no teleporting issues.

So, now platforming works, right? Moving on to walls. Why walls? Well, I wanted to have a wall within the first screen of my level that keeps players from moving on without understanding how to jump and glide. Knowing how to do that is important for my game, so with a wall, I can keep players from moving on until they figure out how to jump over it.


Oh hai wall! I can't run through you? You're tearing me apart, wall!

Walls working, check. Reference to The Room, check. Now let's start laying out my level. As part of being able to jump over that wall, you have to jump up some platforms. However, once again, my platforming controls were off: When you jumped from a higher platform onto the ground below while gliding, you would just pass right on through.


Aww, c'mon! Off by one error...

Alright, so platforming works now, right? Okay. Let's get that wall set up. And you know what, let's get some smaller platforms in so that it can all appear on the first screen.


This is the basic controls tutorial. You must use gliding to get over the wall.

Quick lesson in game design: Let's say you want to teach the player something. The best way to do this is to tell them, and then make them prove that they know it. The way to do that is to make a challenge that they can only get through by using what they learned. Here, I have the basic controls test: The player can only get through here by moving right, jumping up to the high platform, and then gliding over to the platform on top of the wall. After this test, I know that the player knows the basic controls. How can I make this better? I need to add a sign reminding the player of what the basic controls are - which I plan to. Now that they know how to move, jump, and glide, what's next?


No one lives forever!

Immediately after learning the controls, I put a second test. Again, I need a sign to instruct the player, but here's what I want them to learn a this point: Falling in pits is bad. If PJ falls into this pit, the player restarts the level - a minor punishment but it should do well to get the point across. Note that PJ can get over this pit with just a jump - he need not use his blanket as a parachute to glide. However, no harm done in gliding, right? Correct.

As is, that pit is placed so that if the player jumps from the platform, he lands before the pit. If the player glides from the top of the platform, they make it past the pit, but not by much. This makes it so that the player should not land in the pit by jumping from the platform. Again, this is deliberate. I don't want the player to feel cheated because they jumped off of the platform at the end of the jumping tutorial into a pit. That would just suck. So what lies beyond this pit?


Oh noes! A monster!

Again, I need to add a sign to instruct the player how to succeed at this challenge, but again, they cannot succeed without understanding their abilities. To pass this monster, PJ must hide under his blanket. The player cannot move while hidden, so they have to use a bit of skill and timing to make it through. Again, the point is for the player to learn how to use their hiding ability. If they get caught by the monster, they only go back a little ways, so it's not a harsh punishment if they fail.

As before I placed this tutorial very carefully. The player cannot run into the monster from jumping over the pit. If the player uses a basic jump to get over, there's plenty of ground to cover before the first monster. With a glide, there's still enough space that the player will see the monster ahead of time. What about gliding from that one platform back there - the one above the wall? I thought of that too. Gliding from that platform gets you about where you would land after a normal jump over the pit, so there's plenty of ground to cover still.

With my tutorials done, I'm sure at this point that platforming and camera movement are working properly. So let's start adding in all the elements of my level...


Sweet, seems to be working. Almost.

At this point (about half way through putting my level together), I started to experience slow gameplay. This lag was not good, especially with only half of the level implemented. I decided to just push through it and finish my basic design. I could look into optimization later. So onward I went with my level.


Hurray for multiple paths through the level!

So far, so good. As I got it all in, I needed to make sure that I could beat my level. I still wanted to be able to win the game at the end of it all.


This was one of the trickiest parts of the game.


Yay! I did it!

With my level done, I took a brief look at optimization to get rid of that lag. I tried removing most of the walls since only a few were used to actually block the player (the others were largely there for asthetics). I made physics work a bit faster. Ultimately though, I was still getting lag. However, I didn't have time to track it down quite yet, so I went ahead and put the splash screens together.


DigiPen's splash comes first, as required.

Finally, all that remained was getting the main menu together using some placeholder art. However, I realized at this point that my original plan was likely not going to work (which I later realized it would have, but it would have been pretty ugly). I started adding mouse controls into my input manager, thinking that I'd have it done no problem. Then I went into testing.

The Play button didn't work. So I threw a break point into it's behavior after checking if the mouse had been clicked. Ran it, clicking all over. No break. If the behavior isn't returning true on the mouse click when I click the mouse, then it must be an issue with the input manager, right? So I threw a break point into the IsPressed function. Nothing. Threw break points into my mouse event functions. Nothing. Basically, I couldn't see the mouse at all.

My first round of searching revealed nothing useful. No one was having such a simple issue as an event listener not triggering. At that point, I decided it best to take a half hour break. When I came back, I tried again with Google, searching some barely different keywords, coming to the livedocs for Action Script. Right there was my answer: only certain objects could search for mouse input.


It works!

All that remained was to add some sounds. The first issue was music. I had spent close to three hours looking for fitting music over the last week with pretty much nothing but some okay fits. I had settled on some music from the ProjectFun Workshop library - which we DigiPen students return to time and time again. However, there was a slight issue I had forgotten about.

Flash can't play .mid. Also, I have nothing that can convert .mid to .mp3. With no choice left but one of the less fitting music tracks, I attacked with Audacity (the audio editing software), coming up with a cut of the more fitting bits that looped nicely enough. Once I got it in the game, I was pretty pleased, actually.

As for sound effects, I dove straight into the Workshop library. Sound effects were in .wav format, which Audacity can convert quite easily. Luckily, there was a nice soft effect called "Grass4.wav" that worked out for landing from a jump.

And there it was, my next milestone hit at 100%. Satisfied with my progress, though still worried about the lag, I tossed it up on the game website in preparation for my presentation. On the web, the game ran without the slightest hint in lag. Basically, when I had been running it before, even in release mode, it was using the debug player. Lag was gone, the build was uploaded, and all that remained was to throw a presentation together.

So what's the real moral of the story here? It definitely is not procrastination - that's what got me into this whole crunch thing. Time management? Not so much. I guess the real moral is to have a plan. If I hadn't had my level designed on a whiteboard before hand, I would have been screwed - that alone took about four or five hours to get right. The entire time, I knew what I wanted my game to look like, and I knew exactly where I wanted to be.

Also, having a solid architecture helped tremendous amounts. By using a component based design, I was able to make each of my levels quite quickly and near painlessly. My engine was designed so that I could attach behaviors as need be, such that adding some debug movement would take all of five minutes - and that five minutes includes starting the development environment and testing.

Finally, knowing when to break is key to crunching. There is a point where you're not going to find the answer if you just sit there. There's a time when you're just not going to get anything done. Once you're aware that you've hit that point, go grab a bite to eat, talk to someone about your problem - or about something else. Your brain just needs a moment to reset. Once you come back from your break, you might just have an epiphany or otherwise. You might just be attacking the same exact problem, but you'll be doing so with a fresh outlook. Sometimes, that's all you need - a chance to step back, take a breath, and look at the big picture.

Monday, November 1, 2010

We Interrupt Your Regularly Scheduled Broadcast...

This Week In DigiPen has been postponed until the author escapes the Vortex of Doom. We apologize for this inconvenience and are working to correct the issue.

That's the plan anyway. Here's the short version.

Week 7
Monday - Stayed home on account of not feeling well.
Tuesday - Boerkoel homework due, so very little sleep acquired.
Wednesday - Tech Demo of game due. (Wanna see?)
Thursday - Boerkoel midterm.

I don't really remember what happened after that... Yes, his tests are that intense. Did I mention it's Number Theory?

Week 8
Monday - Working on AI until 9am Tuesday morning.
Tuesday - Go to math at 10am. Midterm review for graphics and sound.
Wednesday - Feeling pretty lousy and shaken already, I went through a mock interview in game class. It didn't really boost my damaged confidence. Went to the Microsoft interview prep session hoping it wouldn't take too long and I could study before it got late. I was wrong.
Thursday - Feeling down and out already, suffered the graphics midterm - which was 19 pages long (not multiple choice mind you). Then sound midterm happened - which was better, but still kind of harsh.
Friday - Microsoft interview. It went okay, but I'm not getting my hopes up. I don't think I could stand to have them dashed.

Current status: Burned out hard.
Doomometer reading: 10.

Coming soon! Further explanation of doom.

Saturday, October 16, 2010

This Week In DigiPen: Chapter 5 and Chapter 6

Two weeks and a short post!? What gives? Where's my weekly DigiFunk photo? >:(

If this thought crosses your mind, I guess I'm sorry. However, things are really picking up around here. Seriously, sorry about the lack of photos. I have them, they're just still on my phone or on my other computer or otherwise not within reach from here. So, let's get this done so I can sleep and wake up and get back to work.

Week 5
So, I warned that week 5 was going to be rough - and it was. I'm still hurting from week 5 honestly. We were given another program to write for Cryptography (currently still in the number theory section) that we were supposed to have done between Tuesday and Thursday. It would have been great if we had been notified that we were expected to return on Thursday with the Chinese Remainder Theorem working perfectly in our TI-89's. Usually, he's said that we should have such things done after a week, but this time he decided to throw a quiz at us.

Sound synthesis had three written problems that took approximately 40 minutes per problem. Luckily, I had planned for that. However, realizing homework takes 40 minutes per problem is kind of depressing.

By the end of the week, I barely had the steam to work on graphics. Luckily, it got pushed back to be due on Monday, which gave me plenty of time to finish and make sure I got lights working properly. Screenshots will be posted, I promise. Likely with some of my graphical bugs too. Those are always fun.

However, my game is beginning to suffer at this point - without a team relying on me, it does get pushed to the back burner a lot. I found out that I can do some cool things in Flash that will allow me to make an engine similar to the C# engine we use for ProjectFun Summer Workshops Videogame Programming Level 2. Basically, I get to make my sprites a bit more modular, such that I can add behaviors to a sprite so that I don't have to write a bunch of specialized classes for each object. That does mean I've put more of a workload on the engine - but the time invested now should have a nice return later on.

Week 6
Recovery week. Sort of. With weeks 7 and 8 being the weeks for midterms, and week 5 having hit so hard on all fronts, this is my last chance to try relaxing before "hell weeks." We have three such weeks at DigiPen: Weeks 7 and 8, as already mentioned, and week 14, which is when games are due. Coming up next week is the tech demo for our games, which I hope to recreate my prototype for. However, far too much of my time was taken up by writing documentation - the functional specification document.

Since I'm on a solo project, I was required to write this document in place of a GDD and TDD (Game/Technical Design Document, respectively). However, such a document is usually written for websites, not games. I spent a fair amount of time researching these documents this week, which I really felt was wasted time. I can say, without a doubt, that this functional spec was the worst game document I have ever written. That makes me a sad panda.

It really sucks to have such horrible documentation, but some of the prep work for this document was extremely valuable. I now have a much better idea of what game I'm making, a basic level design for my first iteration before playtesting begins, and quite a few little design decisions were made (will my game include lives, spikes, pits, pickups, time, score, etc.). As important as all of these decisions were, the functional spec did little to organize these thoughts and decisions. What really makes it suck is that I take great pride in my documents, so having this horrible one for my solo project really makes me feel like a failure.

Since everything was due last week, that means nothing was really due this week (except for some math that got pushed back). Therefore, everything is due next week. So let me break this down...
Monday - Nothing due since all I have is game lab.
Tuesday - Math homework due. AI project proposal due.
Wednesday - Tech demo due.
Thursday - Math midterm. Sound Synthesis homework/program due.
Friday - Graphics due.

And the next week...
Following Tuesday - AI A* project due.
Following Thursday - Graphics Midterm. Sound Synthesis Midterm.

:(

Don't expect a post next week. If I get it in, it will be a treat for us all. In the meantime, go read my friend's blog. It seems to be more clever than mine...

Monday, October 4, 2010

This Week In DigiPen: Chapter 4

Things are starting to pick up around here. Classes are all, as always, assigning projects at the same time so that all said projects are due on the same week. It's time to be productive - but then I discovered this on Monday, which kept me quite entertained with the most hilarious stories that are all too human.

So there goes productivity for the most part of this week. Finally, I start getting back into the spirit of work, and then this and this happen. A bit more on the productive side, but still not exactly the homework I should be working on. However, it was rather educational.

[In keeping with the point of this topic, I just deleted about five paragraphs of me talking about my life and week. Now, back to DigiPen.]

So, due in week 5, we have two programs to be written on my TI-89, math homework that will likely require these programs, some OpenGL shader fun, a sound synthesis program using DirectSound, some written homework for that sound synthesis involving plenty of math, an AI project (which I finished today, thankfully), and of course I should keep working on my game.

Right, game class. My goal this week was to get some proof of research - showing that I could get a sprite on the screen, animating, and reacting to user input. And so that's what I have. I don't claim to be a master of Flash/Flex yet, but I'm at least getting along now.

Anywho, I need to get back to work. Before I go though, it's time for some more DigiFunk damage.


We begin with the permanent marker attacking the once shiny new whiteboards.


Next, we see true DigiFunk, someone's discarded trash and the destruction of a wiring cage.


Finally, my prime example of the DigiFunk - the armrest that has been gnawed off.

Don't worry, that chair's not brand new. Still, how do you just pick off the armrest of a chair you don't own?

Friday, October 1, 2010

Building the Nightmare

Having been provoked by Extra Credits and Zero Punctuation, I felt the need to add my thoughts and definitions of the horror genre. Let me begin as a college professor might by explaining my credentials in the field. I am a devoted fan of the horror genre, having been raised on movies such as Alien, Halloween, The Thing, The Fog, and a myriad of John Carpenter's best (along with Disney movies and The Wizard of Oz...). My first adventure into the survival-horror genre in video games was Resident Evil 2 on the N64 which scared me to the point of quitting the game - 10 minutes from the end. Years later, I returned to the old cartridge to win the day, but realizing how close I had been just pulled me in. Since then, I've sought out as many horror games as I can find.

Now then, let's take a look at Dictionary.com's definition of the word horror.
"–noun 1. an overwhelming and painful feeling caused by something frightfully shocking, terrifying, or revolting; a shuddering fear"
Luckily for me, this matches up well with my breakdown of horror (which also agrees similarly with Yahtzee's three types of horror. There are three clear pieces to the horror equation: Thrills (shocking), Suspense (a shuddering fear), and Gore (revolting).

Thrills
"The kind where you're in a dark room and a guy in a spooky mask jumps out of the cupboard going 'Abloogy woogy woo.'" - Ben "Yahtzee" Croshaw
Excellently put, thrills are the tension spikes when something jumps out at you. This is meant to make you jump, something that the Resident Evil series makes heavy use of and was overdone in Dead Space (by the end of the game, you knew when to expect something to jump out). Actually, that parenthetical hits on the core of a thrill: Thrills are scary because they are unexpected. This sort of scare revolves around catching you unawares. It's all about that spike in tension and making you jump. However, each successive thrill is less effective - unless it's a one-two punch as seen in F.E.A.R. on that ladder in the sewers...

When your character gets on a ladder, he grabs the ladder and climbs down onto it, looking down to make sure his footing is good, then looks up, then back down, then up. Finally, you can go about your business on the ladder (don't get me wrong, this all happens very quickly). On this on ladder - on my second play through, mind you - I was fully prepared for this thrill. It scared the crap out of me the first time around, so when I got to that point again, I was pretty sure that it was the ladder. So I get on the ladder, look down, brace myself, look up - nothing. I quickly decide that I must have the wrong ladder as I look back down, then I look back up and HOLY CRAP SHE'S RIGHT THERE!!! I slide down the ladder, berating myself for getting tricked, then turn to my left and HOLY CRAP THERE'S PAXTON FETTEL! Two rounds later and I realize that they got me twice with the same thrill.

The reason it worked so well was that it's all so unexpected - you just saw that there was nothing there and since when do two thrills happen in such quick succession? You don't expect anything of that sort. Then they never used that trick again. Not even in F.E.A.R. 2 Project Origin. They knew that it wouldn't stand out a second time around. F.E.A.R. does also use some interesting tactics of making you feel like you're safe when you're not, so that when that phantom floating toward you that you're sure is just going to vanish two inches from your face suddenly does damage to you, you jump.

Suspense
"The kind where the guy in the mask isn't in the cupboard but standing right behind you, and you just know that he's going to go 'Abloogy woogy woo' at some point and he doesn't so you get and you're getting more and more tense but you don't want to turn around..." -Ben "Yahtzee" Croshaw
Again, quite well said. We hit again on this notion of tension. Suspense is what builds that tension level up and up, making you nervous and antsy and wary of every corner. This is the most powerful form of horror since it builds so well upon itself. It can end in a thrill or just stop building - but your tension level doesn't drop because nothing has jumped out yet and you're still expecting something to happen. This is where it gets tricky, because suspense ending in a thrill crescendo can end up laughable.

For example, I once watched The Messengers at a friend's house with a group of people. Having seen my fair share of proper horror, I could see what this movie was trying to accomplish as the lead female slowly climbed the creaking stairs, staring at the dusty old window from where a mysterious sound was coming from. At the exact moment of the thrill, I yelled out, "Bird!"

Sure enough, a raven flew against the window, making the lead character jump. Suspense that tells you what to expect isn't suspense at all - it's an advertisement. As I mentioned previously, a thrill is all about the unexpected. Even if suspense is building to that thrill, you should never know when the thrill will take place.

Silent Hill and its sequel are jewels of suspense. The games are literally stressful to play, making you paranoid to the point where you just have to stop playing to collect yourself. They don't use music or sounds to cue you in on thrills - those just happen when the game so pleases. In Silent Hill 2, there's a specific room where the music suddenly grows to a fast paced rate - the type that makes you go I'M GONNA DIE BY SOMETHING HORRIBLE!!!! RUUUUUUN!!!!

I still don't think there's anything actually in that room. However, I still haven't gone back to check. I was expecting it since I'd started the game once before, but I still ran away and never looked back. This scare was so effective due to its unusual construction - the thrill comes first with the sudden and noticeable change in music, then the music holds that suspense and builds it as you run through the small room. Once on the other side of the room, you can't help but wonder if you're safe.

Gore
"The guy in the spooky mask goes 'Abloogy woogy woo' while standing on the far side of a brightly lit room before walking slowly over to you plucking a violin and then slapping you in the face with a T-bone steak." -Ben "Yahtzee" Croshaw
Okay, so that isn't exactly what gore encompasses (except the T-bone steak part), but it's about how I see it. Gore is the "cheap" scare because it makes people uneasy. People don't like needles, so you show them someone getting poked in the eye with a needle to make them cringe. That's pretty much what I think of gore.

Gore can be used in horror, but it's use is rather limited. Showing us blood on the movie screen after the "pretty girl that went to go surprise Mark wearing only an over sized t-shirt" gets stabbed in the chest (and it's always her chest) as she runs out into the night away from her more gruesomely murdered boyfriend is to be expected. However, that's not something to build a movie around (I'm looking at you, America).

American "horror" seems to think that gore is all that matters. Yes, violence is something we're rather open about here in the states, but that doesn't make a movie about a guy sawing off his own arm to escape a madman good. It doesn't even make it scary. It makes it something to make people go... well, ew.

Gore is simply a spice to the horror genre. Entering a room covered in blood with a dismembered corpse hanging from the ceiling in The Thing (the video game, I mean) is rather creepy, but it doesn't really increase the tension level. What does increase the tension level of that scene is that your engineer follower starts freaking out and won't move until you give him some items to make him feel up to entering the massacre. However, that is suspense, not gore.

Gore is blood and guts, corpses and ghouls. It is the uneasy stuff that serves to hold the tension level where it is or lay the groundwork for suspense. Perhaps used in conjunction with other mechanics, you can produce thrills or suspense with gore, but that's not gore on its own anymore.

Recovery
It is important that the audience has some recovery time between scares, otherwise they will become desensitized to our scare tactics (it's also important to add variety to our scares for that reason). The tension level needs to drop at some point. It's important to make an emotional roller coaster for our audience (this is why UP was so sad at the start - because it was offset with so much happy).

All Together Now
So now that I've broken horror down into three main elements, let's look at an example of how it all fits together by analyzing the opening scene from Dead Space.

After having crashed on the USG Ishimura, engineer Isaac and his team consisting of some military escort sent in to repair the injured frigate have left the hanger, entering a processing chamber for new crew to be scanned. The place is deserted, so they send Isaac ahead to check out a computer terminal behind the glass. As he opens the door to this half of the room, Isaac finds blood spilled across the floor and walls, even some on the ceiling. Something has happened here.

[Here, gore is used as a gateway to suspense. Why is there blood all over? What happened here? Suddenly, you have questions without answers. The tension level is rising.]

Isaac reaches the terminal, which reports the USG Ishimura is pretty much dead in the water, but not beyond repair. Suddenly, the lights go out, replaced by a single rotating yellow light accompanied by alarms and the declaration of quarantine. Isaac's team claims he must have tripped something on the terminal.

[The sudden change is a quick drop into a suspenseful situation. Why is the quarantine suddenly going off? Why did the lights have to shut off? Something bad is about to happen - this feeling is a true sign of suspense. That tension level is building fast.]

As a dark figure drops from the ceiling behind an unsuspecting team member, Isaac can only watch in terror as it creeps up behind his friend and attacks. The team calls out that they're not alone and open fire, too late to save the unsuspecting victim.

[We see here a slight thrill and accelerated suspense. Something bad is happening now and there's nothing you can do to stop it. We also have a bit of gore due to our friend getting killed. Tension is high and building still.]

There's a crash to Isaac's right, and he can see a monster like the one that just killed his friend making its way toward him as the team calls out to the unarmed engineer, "There's one of them in there with Isaac! Run Isaac! Get out of there!"

[This is where the thrill really picks up. We are now being chased by something that just took out a marine, and we're just an unarmed engineer. We have to run, but that means running away from our friends too. We are cut off and alone. And that thing is right behind us! Tension has spiked toward critical mass.]

So Isaac flees, narrowly escaping a swipe from the creature's arm blades and rushing through another door into a winding corridor. Vents are bursting open around him as more monsters arrive to kill their prey. Isaac sees an elevator ahead, rushing to it and frantically pressing the call button.

[Now we're talking about suspense and thrills! They are interwoven here with thrills pulsing and the suspense setting the bar for the tension level. As we come to the elevator and the door takes a moment to open, we can't help but feel our pulse quicken as the tension level suddenly grows. That thing was right behind us! We don't have time to wait for the door to open!]

Finally the elevator dings as its doors slide open. Isaac dives inside, pressing whatever button gets him the hell out of here. As the doors slide closed again, we see the shadows of monsters from where we came.

[Now that the scare is over, we can begin our recovery, right?]

As Isaac takes a breath, the monster that chased him from the terminal stabs its blades between the elevators doors, pulling them open halfway.

[Thrill! The false sense of security is meant to put us off our guard - much like the final scare in a horror movie.]

The doors shutter as the creature's muscles begin to spasm. It pokes its head into the elevator, hissing and growling and howling all at once, glaring at Isaac. The doors slam shut, cutting off the monsters arms and head, which now roll around the elevator floor.

[And finally, we end our section of horror with gore, leaving the player unsettled. Are they really as safe as they think?]

This final question is actually a divergence in horror movies. Some choose to award the audience with a feeling equivalent to "you're safe now." (Alien does this - you never see the full monster until the end.) Meanwhile, others choose for a feeling similar to the end of our scene here - that of insecurity. Is the threat really gone? Only time will tell...

Sunday, September 26, 2010

This Week In DigiPen: Chapter 2 and Chapter 3

Off to a great start with this weekly update on "Friday" thing. Given the nature of DigiPen, I should redefine the parameters of how this blog is going to work out - or in other words, not promise Friday updates. So, here's the plan, one update per week, likely occurring some time over the weekend. That's something I hope I can stick to... Anywho, updates.

Week 2
DigiPen is a very busy place with sudden demands. For example, delivering a concept presentation for the game we're going to work on for the semester (and likely year). For me, I had two (technically three) options. First, I could stick with Steve Rabin's AI project and hold out on concept presentation until that team has something more to present. Second, I could break off on my own and work on a solo project. (Technically, there was also trying to work my way onto another team - but given the nature of senior year, that can be dangerous.)

Over the weekend, I really had to work on some soul searching. What do I want to do with my last year at DigiPen? What do I want to show on my resume? What do I really value in games? That last one got me thinking - Steve Rabin's AI Project is really cool, groundbreaking even, but pushing game technology is not my passion. I was being drawn in by the carrots - the chance to work with Rabin, the chance to deliver a presentation at the AI summit at GDC, fame and fortune. My passion is with games themselves - I'm here to make good games. Working with Rabin would have been a form of selling myself out.

Within an hour after my decision, I had a prototype (yay for ProjectFun) of my current project. Blankie is about hiding under a blanket. It'll be a cute and simple game, appealing to a wide audience. I plan to make it in Flash - because quite frankly learning Flash sounds like a good idea. I did go over other technologies that I could make this in, including Unity and XNA. Unity is up and coming, but we'll see where it is at the end of the semester. XNA sounds like it would be easy enough to pick up elsewhere. Given the difficulty I had finding people that know Flash at DigiPen, it will really help me stand out. Also, I can throw my game up on my website once it's in a playable state and start getting feedback from online playtesting.

There is precious little time at DigiPen, but we do actually have some extracurricular activities - which brings me to Club Day. Held early in the year at DigiPen, Club Day allows us to advertise clubs and student groups to incoming freshmen, and for new clubs to form up. I took over for Producer Club last spring, so it was up to me to advertise and get things set up. It went pretty well, but while in Pascal I couldn't help but notice that the DigiFunk had struck again.

Sunkist stains are the worst. Maybe it's coffee?

Week 3
I developed an overview of my development cycle for Blankie over the weekend, giving me a heads up on how I was going to pull off a solo project. Having a team to back you up makes a project exponentially easier to complete; you have someone to rely on when your productivity slumps and vice versa. As part of a team, there are others depending on you and driving you forward. It's quite a difference being on your own. Luckily, my roommates helped out by suggesting that I look into what my other classes would be up to during development (particularly weeks 7 and 8 - two of the hardest weeks at DigiPen). Those weeks are littered with projects and midterms and milestones. It's not pretty.

Boerkoel's homework was a thorough kick in the pants - as to be expected. It took hours to develop a solution to a single question on the homework, which, having missed one piece of information, was entirely wrong in the end. Proofs are not my strength in the least - in fact, I'm horrible at them, and they made up the first half of the homework. It's not pretty.

Producer Club had its initial meeting on Wednesday - which none of the interested parties from Club Day showed up to. Well, that's not true. One of the veteran members did show up, but we've come to the conclusion that we don't really have time to run a club. As such, we've decided against regular meetings, but still would like to run specific events (in particular, GDC preparation and post-mortem, mock interviews for producers, and there was mention of more in depth Myers-Briggs).

Then there's researching Flash. First of all, the official tools to develop for Flash cost about $300, which is out of my budget as a poor college student. Then there's the tutorials and/or lack thereof. All of the Flash tutorials I've found this week are scattered and unorganized. I was hoping for something more along the lines of cplusplus.com, but there doesn't seem to be anything like that. Just heaps of garbage with hidden gems - all of which assume you're proficient in the Flash development tools.

The free stuff, Flex, is much more affordable, but even more difficult to come across a decent tutorial. Whereas one site (again, a hodgepodge of instruction of varying degrees of quality) had about 250 Flash tutorials, there were 23 Flex tutorials - all of which were horribly written. Finally, after four hours of digging through the internet, I came across this, a lovely tutorial for Flex 2.0. While old, it's still quite applicable and shows me the key concepts I need to make a simple 2D platformer (or rather, teaches me how to actually get a sprite on the screen, which I can figure out the game logic from there).

There is hope for Blankie after all. Just four hours worth of digging to find that shining jewel.

And as a funny note, apparently the spell checker here seems to think Sunkist is a word, but platformer isn't.

Sunday, September 12, 2010

This Week In DigiPen: Chapter 1

This past week was the first week of the fall semester, which means my spare time is null and forfeit. I've been thinking for the past few weeks that maybe I should catalog the adventures of a DigiPen semester, which, as you may have guessed by the title, is exactly what this is. So, with that out of the way, onward!

My summer ends on the scene of DigiPen's new campus bright and early after a breakfast of eggs, bacon, and toast to commemorate the new school year. It's quite different from the old campus, its grey walls and dreary students. There is much hustle and bustle abound, but most notable of feelings is that of energy - a new presence that had not existed at the old campus. Everyone is excited and happy (for the most part). I wonder how long it will last given DigiPen's high demands - it's never lasted more than a week.

Also apparent, this new building makes even us seniors feel a bit freshman-like. We have no idea where the rooms are now, so we must rely on the maps and signs around us, just as those new to DigiPen at all. It's a bit unnerving, but we should have expected it.

Then, Boerkoel happens. My first class of the day is Cryptography with the infamous math instructor, Boerkoel. He will teach you, and you will learn... or else. Much in his expected manner, he begins class by completely blowing every student's mind and making us all question how much we truly understand the field of mathematics as a whole.

For example, how do you define integers? Whole numbers, you say. Well, how do you define those? Counting numbers, you say. Well, what does that mean? Non-fractional numbers, you say. Well, what about 6 / 2? That is clearly 3, which we have accepted as an integer. Numbers that can be written without a fractional component, you say. Well, what about pi? It has no fractional component there, correct? And so on.

The hustle and bustle are still buzzing as we meet with all our friends we haven't seen since the end of the spring semester before exploring our mysterious bookstore - which to my dismay seems to be a remnant of the 7-Eleven we left behind at the old campus. There are no books (unless you count sketchbooks), but rather candies and such.

The day plays out, with each class showing to be interesting, but also the warnings flare in my mind that these classes will be difficult - which I was expecting. Luckily, I have friends in all of my classes, but still nothing truly prepared me for the drain of being at school for nearly twelve hours with classes through most of the day. Tuesdays will be rough, with Boerkoel's Cryptography in the morning starting at 10:30am, CS300 (Advanced 3D graphics) taught by an instructor with a very thick accent that speaks at 90 miles an hour, Sound Synthesis to wrap up the afternoon, and Steve Rabin's Artificial Intelligence at night, ending at 9:20pm - which got out about twenty minutes late this week (so that I didn't get out of class until roughly 9:40pm). Thursday is similar to Tuesday, but without the night class.

Wednesday was much easier. Game class, and only game class... Well, twice on Wednesdays. There's the lecture and the lab separately, but still, a nice refresher after Tuesday. There's an interesting project that Rabin would like to get going at DigiPen, something that could truly push games to a new level - but it's very, very high demand. I've expressed my interest, but I'm definitely forming backup plans, just in case.

Other discoveries of the week include the food in our new (and most definitely wonderful) cafeteria. Since the new campus is an old Microsoft building (from what I hear, the old Flight Sim building to be precise), we have a fantastic full kitchen and proper cafeteria - staffed quite properly as well! While our old caterers were definitely nice people, I'm sorry to say the food was mediocre for a more-than-mediocre price. The pizza is delicious, and I've only heard tasty things about the sammiches.

Something I've noticed is the lack of "the Magic kids" - students that were always in the cafeteria playing Magic the Gathering at the old campus. So far, I've only heard reports of a single MTG game being played, which is quite odd. Usually they gather immediately for the freshmen to argue over what order cards are played in while the veteran DigiPen students just sigh at their naivety before sorting out the matter. By second semester, all of these Magic kids will have calmed down and gained the knowledge of how every type of action and card can be played. Still, they were always there at the old campus - always were there five MTG players in the room with cards out - but now they seem to have vanished.

That's all I've got for the first week of DigiPen. It's beginning to ramp up, but I'm going to try to put in an update each week (aiming at Fridays, but you never know). Wish me luck - hopefully I won't need it.

Oh, and the DigiFunk has already struck - while not the terrible body odor smell seems to have vanished, the wake of random destruction has already hit our new Plato (see below).


This happened on the first day of school. :(