Friday, December 30, 2011

A Simple C++ Timer Class

I'm still working on my simple game engine for You Are Cat here and there. I'm kind of throwing in features without a definitive design. Many people will tell you that that is a headache and not the way to build an engine. I would agree, but I tend to learn things a little better when I have to revise and rebuild the code constantly.

Yes, it's not very efficient. Yes, I know how to design and do class diagrams, etc. When I get this basic version done and understand how every little piece works and how to optimize it better, I'll probably redesign it the proper way – which will be easier with all that knowledge (which I don't have yet).


But that's not what prompted this blog entry. I built a simple Timer class and wanted to share it.

Where's My Timer?
Since each game mode in You Are Cat will involve a timer (a countdown, to be specific), I needed a timer that would display when that mode is active. I looked around on the internet, but didn't find anything that really fit my needs, and no one had a straight-forward solution, so I just created my own.

This class actually only tracks the change in time for your countdown (you can also have it count up if you want) – it doesn't control how the time is displayed. You would do that separately in however manner you wish. Currently the time in mine displays as a DirectX Font. I'll probably change it later to a texture / sprite.

The Header
You can find the full code of the header here. The class tracks only a few things:


  float _timeToCount; // core time in milliseconds
  float _incrTime; // time to increment
  bool _countdown; // is the timer a countdown?
  bool _timerOn; // is the timer running?
  int _timeMin; // minute portion of _incrTime
  int _timeSec; // second portion of _incrTime


If you look at the full header code you'll see various functions to Initialize, Update, Start, Stop and ConvertTime. Others check to see if the Timer is running, or what the current/core time is. The only ones not defined in the header are the constructor, destructor, Initialize, Update and ConvertTime.

The Implementation
You can find the full code of the implementation here. The guts of the class are the functions Initialize, Update and ConvertTime.

Initialize
This function gets the Timer object ready for use. You only have to specify the total time for the timer in milliseconds, along with a boolean value for whether the timer is a countdown or not. Depending on that boolean value, it will set _incrTime accordingly. _timeToCount will always represent the original time you initialize the object to; it doesn't change. It will also call ConvertTime to convert the millisecond value of _incrTime to integer values for minutes and seconds.

Update
This function updates the current value of the timer (_incrTime), using the frame time of your engine. In other words, the difference between the start and end of the previous frame. Your engine will be calculating this since it's needed to update positions of objects every frame so it can render movement properly. Merely pass this frame time (in milliseconds) into the Update function. It will decrement / increment the _incrTime accordingly and update the minutes / seconds with ConvertTime. It also clamps _incrTime if it goes out of bounds (beyond 0 or _timeToCount). This function should be called once a frame, most likely in the section that manages the HUD.

ConvertTime
This function does a simple calculation to turn the value passed to it (in milliseconds) into two integers: one for minutes, one for seconds. These are the two values that you can use to feed the display of the timer. They can be accessed via the Min and Sec functions.

Using the Timer Class
In my engine, I've added a pointer to a new Timer object in my HUD class as a private variable. Then I created an accessor function called Countdown, which returns the pointer to the Timer.

After I've created my HUD, the Timer is ready to go. I merely call the following to start and display it:


  _HUD->ShowTimer(true);
  _HUD->Countdown()->Initialize(90000.0f, YAC_TIMER_DESCEND);
  _HUD->Countdown()->Start();


ShowTimer is a function specific to my HUD. If true, a flag in the HUD class is set and the timer will be displayed on-screen, otherwise not. Next, I call Initialize to set the timer at 90 seconds and descending (I have defined YAC_TIMER_DESCEND as true in another file). Lastly, I start the timer with Start, which sets the _timerOn flag.

Because the timer won't always be displayed, there's no point in wasting clock cycles by calling an update function if it's not being used. So my timer only updates within my HUD class implementation when it's on and running. I call the update when it's time to display the current time of the timer. Here is what I call:


  if (_pTimer->isRunning()) {_pTimer->Update(frameTime);}


_pTimer is the actual private variable for the Timer, the one that was accessed by Countdown in the previous code snippet. If the timer is running, then update it. After that, display it's updated value on the screen using the Min and Sec functions. Once it reaches the end of the countdown (or countup, if that's a word), it will not advance anymore, having been clamped by the Update function.

Once the timer is finished, you'll need code that advances/ends the gameplay, as well as housekeeping function calls that stop, restart, hide or kill the Timer object, depending on your needs.

You Are Cat
Another reminder that the full code I'm working on is visible as an open source project (Eclipse Public License 1.0) on Google Code. You can view it here.

If I make any changes to the Timer class, I'll update this post accordingly. There are different ways it can be implemented, obviously, it just boils down to the needs of your program.

Thursday, December 22, 2011

Wine Tasting - Grgich Hills: Zinfandel 2008

My wife and I are members of the Grgich Hills Estate wine club, specifically Miljenko's Cellar Club (quarterly shipments).  Grgich Hills is located in Rutherford, in Napa Valley, and they own all their vineyards, allowing them to put the label of "Estate" on all the wines they produce.  In 2003 they started switching to biodynamic farming due to a virus on some of their older vines (planted in 1959), and in 2006 became 100% biodynamic.

In the world of wine, owner Miljenko "Mike" Grgich is something of a legend, having crafted the 1973 Chateau Montelena Chardonnay that won against the white Burgundies of France in the famous 1976 Paris Tasting.  This was chronicled in the movie Bottle Shock (which is somewhat inaccurate) and in the book Judgment of Paris by George M. Taber (which is quite accurate).

The Wine
Anyway, the subject of this post is not the Paris Tasting, but a wine from Grgich Hills, their Zinfandel 2008.  We got a bottle of this back in August, when we first visited the winery and signed up for the club, and another in our most recent shipment this month.  We opened the one purchased in August.

The Zinfandel is grown in their Calistoga vineyard, located in Napa Valley, at the northern end of the valley.


Opening and First Taste
The cork was very dry on this one, just a touch of the wine on the end, with no seepage.  I tasted it immediately after, and the aftertaste was very strong.  So we decided to aerate it with a wine-shower funnel we have, by Metrokane.


We funnelled it straight into the glass, however, not into a decanter.  We let it sit for a half hour after that before drinking with our meal of supreme pan pizza and a light salad (very fancy, I know).  Generally we try to pair wines with food properly, as we've learned that's very important when it comes to bringing out the full flavor of a wine.

The Verdict
It was much better after aeration and with food.  The nose was a mix of blackberry and raspberry to me, and drinking I got more of a strawberry taste, while my wife fixated on cherry.  It's interchangeable - sometimes you could taste one or the other.  The strong aftertaste mellowed out a bit after aeration and it went down smoothly with the pizza.  This is a good wine for any type of steak or tomato pasta dish.

This Zinfandel has a nice, deep red color

Grgich says their Zinfandels can be aged from 5 to 7 years, though they do recommend they be drunk not long after purchasing.  Since we have a second bottle of this vintage, we'll probably hold onto it for a while.  Perhaps a year or so, we'll see.  On that one we'll probably decant it and let it breathe for a few hours before drinking.

I've yet to try a Grgich wine that I don't like.  I highly recommend them, and that is why they are one of our three current wine clubs.  This 2008 Zinfandel is currently only $35 - well worth it, try a bottle sometime.

Wednesday, December 21, 2011

The Hobbit - Official Trailer #1

If you haven't heard, the first official trailer for The Hobbit was released yesterday.  To say I'm excited is an understatement.  I'm very pumped about these movies; in my opinion Peter Jackson is pretty much the only person who's gotten fantasy right in film.  He took books that I thought were "okay" (The Lord of the Rings) and turned them into great films that stayed as true to the books as possible, made you care about the characters and created a sense of wonder you rarely get in film nowadays.  So glad he is directing these, though I wouldn't have minded it Guillermo del Toro had stayed on - he could have done it justice as well.

I saw the Lord of the Rings films probably about 4-5 times each in the theater, I have the extended editions on DVD, and I'm dorky enough to have watched them all in a single sitting (takes all day).  So I'm a fan.

And now, 10 years after the first film of The Lord of the Rings came out, we finally get to see real footage from the first of the two The Hobbit films.  This first part is subtitled An Unexpected Journey.  Here is the trailer:


The dwarven song in the middle is fantastic - very well done, fits perfectly with the feel of the story.  If this first part is as good as the trailer is, the second part will blow it out of the water when you factor in Smaug the Dragon and the Battle of the Five Armies.  I remember watching the old Rankin & Bass animated version of The Hobbit when I was a kid (have that on DVD too), and Smaug was always my favorite part.  We even had this giant puzzle of Smaug that I put together times.

Smaug is going to be so awesome.

I'll probably blog on The Hobbit here and there as important info surfaces.  Needless to say, I haven't been this pumped about a movie since Revenge of the Sith nearly 7 years ago (where does time go?).  December 14, 2012 cannot come fast enough.

There are also some production vlogs on the official YouTube channel for the movie - I suggest checking them out.  Not only will the movie be in 3D, it's being shot at 48 fps and the resolution is around 5k per frame.  In comparison, something like 1080p is around 2k per frame.  I'm not a huge fan of 3D, but for a movie like this - especially with Peter Jackson involved - it's going to be sick.

Check out production video #4 below for a discussion on the 3D technology they are using.  See the others in the link above.

Thursday, December 15, 2011

The Wheel of Time [9] Winter's Heart

This is Part 9 of my continuing series of blogs regarding what may possibly be my last re-read of The Wheel of Time, in anticipation of the 14th and final book releasing in 2012. Please see this blog post for an overview of the re-read and why I am blogging about it. Warning: CONTAINS SPOILERS FOR THE ENTIRE SERIES. The best way to approach this retrospective is via your own re-read. If you have not read the entire series yet, you may want to wait on reading this.




Book 9: Winter's Heart (2000)
We continue the "Wandering Trilogy" with Winter's Heart, another short volume that required another two year wait. This is when it really became evident that the pace of the series had slowed considerably. It wasn't a one-off anymore; it was a trend. Re-reading now, it's a decent book, but back in the day it was frustrating, despite having one of the iconic scenes of the series.

More on that later. First, a digression about the new medium of book publishing. eBooks.

The Prologue eBook
Winter's Heart started something new in publishing. Given that the previous book was the first #1 on the New York Times Bestseller list of the series, anticipation for the next installment was high. To capitalize on that and build even more buzz, they offered the prologue for Winter's Heart, entitled "Snow," in an eBook format for $5 a few months before the book dropped.


Now, eBooks barely existed back in 2000. And I certainly did not want to spend $5 for it, even though the prologues from this point on are around 90 pages on average. A few bucks more could get you an entire paperback book six times that length. It also felt like they were starting to milk the series and make as much money off it as they could. Obviously there are marketing reasons behind all this and it is a business after all... but to a 24 year old still naïve about some things in the world, it was hard not to think that way when the books are suddenly shorter, take longer to release, are slower in plot and are now #1 bestsellers. I'm just saying.

But really, the primary reason I didn't bother with the prologue eBook (or any others in the future), was that I wanted to read the entire book at once. I didn't want to read part and then wait a few months in between. It's like when you hear the first single from your favorite band's new album, and listen to it incessantly, then when the album actually comes out you skip that song during the first few listens of the album because you've already heard it twenty times. The book was meant to be read whole in one shot, so that's what I wanted to do.

Reading eBooks
I would have only been able to read it on a computer at that point, anyway. I got my first computer of my very own in 1998, after finishing college (the only computer I "owned" before that was a Commodore 64 my parents had). It was a Compaq laptop with Windows 98. But I didn't use it to read eBooks. I didn't want to read books on my computer.

If I recall correctly, though, the only decent formats then were .pdf (Adobe), .pdb (Palm OS) and .prc (Mobipocket). You could also read them on a PDA. I did get a few eBooks a few years later, in 2002 / 2003, just before the next volume (Crossroads of Twilight) came out. I would get them in the PalmReader format, and I had this totally bitchin' Sony CLIÉ PDA on which to read them. I actually still have those eBooks on my previous PC hard drive, but they are worthless now, since they have DRM and it was tied to my account and credit card info on whatever ancient website I bought them at, which I don't remember. So I can't even view them now.
  
Only thing missing here was internet access.

Thoughts Then
Anyway, as I said before, another two years passed before this volume arrived. I was starting to get used to this; Winter's Heart was the third volume in a row that was released in a two-year interval. I realized that the days of a new novel every year were gone (sigh). There seemed no end in sight for the series, and I figured it might stretch on to 15 or 16 volumes. I definitely thought that after reading this one.

I still lived in Omaha when this book came out. I vaguely remember sitting in a mall food court and eating lunch while reading the prologue, awkwardly trying to hold hardcover open with one hand while eating with the other. I'm pretty sure it was the Westroads Mall, which was right by where I worked at the time.

I liked how the novel was themed around winter, since prior to Book 8 there wasn't much in the way of snow or winter. The early books spanned longer periods of time and things were so fast-paced that I didn't really pay attention to the seasons in the series that much. It had been summer for so long (due to the Dark One's touch on the world) and with the years between books I had forgotten about winter.

However. I did not like this book upon first read. I was very frustrated with the glacial pace. Where were all the cool things that had been prophesized or viewed, all the things Jordan had left hints about and had been building up to for 8 books? We're still not there yet?

No Preparatory Re-Read
Something worth mentioning is that this was the first time I didn't do a full re-read of the series prior to the new volume coming out. That had become a tradition for me starting with Book 6, Lord of Chaos, but with 9 and counting, a re-read every time became a bit much. It takes a long time to read these books.

As much as I love the story, there are other things I'd like to read, and I need breaks from it every once in a while. So I didn't do a full re-read for this one, I merely read the previous two to refresh my memory on recent events.

Thoughts Now
It's so much easier to like this book now, with the knowledge of events in later volumes. It still feels a bit short, and the Elayne chapters still make my eyes glaze over (I generally skim through them), but overall I enjoyed the book a bit more this time. I can now see why Jordan did what he did, though as I mentioned in the blog for The Path of Daggers, it's hard to see that when you first read it and don't know where things are going.

The book is slow in places, and personally I don't think that slow pace works as well when chapters are grouped in chunks by character, especially "one and done" groups of chapters (i.e. the character never appears again in the book). Take a step back and look at what's going on at a high level, compare it to any of the first 7 volumes, and you'll see a marked difference.



  • 6 chapters = Perrin finds out Faile has been captured, he mopes around camp.
  • 8 chapters = Elayne dickering around in Caemlyn, assassination attempt (though not really), a bunch of women glaring at each other (Sea Folk, Kin, Aes Sedai, Wise Ones), sex with Rand, bonding Rand, visiting the Borderland rulers in Braem Wood.
  • 10 chapters = Mat loiters in Ebou Dar, thinks about leaving, finally leaves with a huge entourage of Important People.
  • 8 chapters = Rand skulking around Far Madding, looks for renegade Asha'man to kill, finally leaves and cleanses the male half of the Source.

A visual breakdown can be seen here.

That's essentially it. There are a few important and memorable scenes, but for the most part the book moves bits and pieces of the main storyline along at a snail's pace. The Perrin and Elayne storylines barely advance in comparison to their length. The Rand and Mat storylines were satisfactory, in that they moved many pieces about, but I desperately wanted more during that first read-through.

And when grouped in chunks by character, some of the content loses its importance. Take the Perrin chapters. They are all at the beginning. He doesn't do much, and then he's done until the next book. I mentioned this earlier, it's a "one and done" type of structure. Jordan started doing this with A Crown of Swords. This is part of why I don't like these middle books (Wandering Trilogy) as much as the others, which mix up appearances throughout each book and make it feel more like everything is happening at once.

Crossroads of Twilight, the next book, does this too.  It really drags down the story, in my opinion.

Far Madding
One thing that has always bothered me about this book is Far Madding. Of course, we've known the city has existed, since it's marked on the map, but the characters have never gone there. It's briefly mentioned a few times, but nothing about what the city is like, aside from men are expected to obey women there (big surprise, women are more powerful in this world overall).
   
Is it me, or does the island look like the Starfleet emblem?

So I found it quite a shock to learn that people can't channel in Far Madding. They have some large ter'angreal in the middle of the city called a "guardian," that prevents men and women from channeling in the city, as well as detects channeling outside the exclusion zone. Rand goes here for one main reason: to escape the hazards of saidin. He's been having all sorts of problems with the Source – getting nauseous, having problems holding onto it, etc. Very convenient to suddenly have a completely new place that blocks channeling to go to.

I would guess that this caused confusion for many readers because we didn't know the city was like that. It seemed like this would be knowledge the characters would discuss earlier, mainly for the benefit of the reader.  Kind of like how Cadsuane is never mentioned until halfway through the series.  After 8 books, it seemed odd to throw in an entirely new element like this, especially when the city is smack in the middle of the map. At least to me. I mean, there are other places we don't go to until way later in the series – like Bandar Eban and Maradon in Books 12 and 13 – but those places don't have any special attributes like Far Madding does.

The Cleansing
This is one of the iconic scenes of the series, the cleansing of saidin. It's rather clever how Jordan pulled this off, since it's hard to fathom that anyone short of the Creator or the Dark One could cleanse the male half of the Source. But Rand made it work with all the tools that were essentially left to him from times long past.

Why else would the Choedan Kal have been created? They were never used before, from what I gather. Why else would Shadar Logoth have come into being? It seemed to be some random "evil thing" like Padan Fain, serving no real purpose but to be evil in The Eye of the World. And it helps that there's someone like Nynaeve now, one of the most powerful Aes Sedai in a long time, in terms of One Power strength (aside from the former damane Alivia, of course).

All the elements were there for a reason, and Rand figured out how to do it. I didn't exactly understand what happened the first time I read it, but later understood how the evils essentially "cancelled each other out."

Like Far Madding, I found it a bit jarring to suddenly go cleanse the Source. Yes, Rand mentions it a couple of times before that, but he didn't seem too urgent about it and after the ho-hum of most of the book, I wasn't expecting him to do it right then and there. But it makes sense when you think about it. The problems he was having with the Source, along with the number of Asha'man going mad, expedited his need to cleanse it.

Regarding the eBook cover, which shows Rand with the male access key for the Choedan Kal – this is probably my favorite depiction of Rand. That's generally how I've seen him in my mind, though with a bit longer hair. Would have been cool if the cover had shown him and Nynaeve facing each other while channeling, but this will do. Nynaeve was on the eBook cover for the last two volumes anyway.



Darrell K. Sweet: 1934-2011
I'm assuming if you're reading this blog entry, you've read all the entries before it. And if you've done that, you'll know that I haven't been kind to the cover art by Darrell K. Sweet. Unfortunately, Sweet died while I was reading this book, on December 5th. Instead of complaining about the cover for Winter's Heart this time, I'd like to talk about Sweet and his art. I recently noticed something about the art for the Wandering Trilogy (Books 8-10) that I hadn't noticed before, and it makes more sense to discuss that in the blog for Crossroads of Twilight.

I fully respect Sweet as an artist. He was a great painter; his talent is unquestioned. It was partly due to many of his fantasy covers that I got into fantasy in the first place. His covers for the Xanth novels (by Piers Anthony) and The Chronicles of Thomas Covenant (by Stephen R. Donaldson) are classics and were very influential to me when I was younger. He also did the ones for L.E. Modesitt Jr.'s The Saga of Recluce, which I didn't get into until I was older, but which have become the face of the series.

I've always loved the Xanth ones the most, though. His style fit that world perfectly. It's going to be strange to not see his artwork on the new novels coming out in that series.

Here are some of my favorites:


Sweet and The Wheel of Time
The main reason I pick on his covers in these blogs so much, though, is because I didn't feel his style fit The Wheel of Time. He knows how to make an eye-catching cover – which is the point, they're trying to sell books – but I felt the series got short-shrift because of the inaccuracies of the covers. I just don't like his interpretation of Robert Jordan's world. When you paint Trollocs as regular humans with helmets, to me that shows a lack of respect for the source material – it's like he didn't even read the text, not even an excerpt. It's not a detail that's hard to miss.

What makes me sad the most, though, is that Sweet never finished the cover for the final upcoming book, A Memory of Light. Even though I didn't like the art he did for the series, he started it and should have finished it. According to Brandon Sanderson, Sweet created a concept, but not a finished painting. So who knows what will happen to the cover for this last one. I trust Tor and Harriet (Jordan's widow) will make the right decision. We'll find out next year.

Update, Feb 2012: Michael Whelan is painting the final cover.  Yeah!  Very happy about this.

The last book in this series is becoming even more bittersweet. Both the original author and cover artist have died. The ones Sanderson has been writing still felt the same as Jordan's partly due to the covers. Now the last one will be out of place.

Either way, thank you, Darrell K. Sweet, for all the fantasy artwork you've done over the years. I may not have liked what you did for The Wheel of Time, but they are undeniably an integral part of the series and now I can't imagine it without them.

Next:
Book 10 – Crossroads of Twilight


Previous:
Book 8 – The Path of Daggers
Book 7 – A Crown of Swords
Book 6 – Lord of Chaos
Book 5 – The Fires of Heaven
Book 4 – The Shadow Rising
Book 3 – The Dragon Reborn
Book 2 – The Great Hunt
Book 1 – The Eye of the World

Thursday, December 8, 2011

Beer Tasting - Brother David's Triple: Abbey Style Ale

I'm a big fan of the tripel style ales, particularly Trappist ales (those brewed by Trappist monks, like the Chimay brand), and every once in a while I try a different one to see how it stacks up. Chimay Grande Réserve is one of my favorite ales of all time, and I get one regularly at the local BevMo. I always compare other kinds back to this ale... it probably doesn't help that I discovered Chimay early, because most other ales in the same style pale in comparison.

The Beer
The one I chose recently is an Abbey Style Ale, called Brother David's Triple. It's brewed by the Anderson Valley Brewing Company, located in Boonville, CA. This brewery specializes more in regular ales, porters and stouts, but also do a Double and Triple style ale. I have never tried one of their beers until now and had never heard of them. Boonville is far up in northern California, near Mendocino. It's an area I have yet to visit, but I hope to soon. If so, I'll make it a point to tour the brewery.



If you're wondering why I put the bottle cap in the picture, it's because I thought it looked cool. It says "Solar Powered Brewery." According their website, only 40% of their electrical power is from solar, but it's nice to know they treasure their environment and do what they can to be more "green."

Abbey Style Beer
These are beers that are similar in style to monastic beers. They are high in alcohol (generally around 10% or so) and typically have nice fruity overtones to them. There are only 7 official Trappist breweries that can sell ales with an authentic Trappist logo, but many other breweries attempt the same style of ale, and generally call it an "Abbey Style Ale." Or a Dubbel, or Tripel. They come close (Gulden Draak is a good one), but I haven't tasted one yet that is better than an official Trappist ale.

As such, these can be hit or miss. Brother David's Triple is actually the first one from America that I've tried.

The Verdict
I found this ale more fruity than I expected. I got some banana in it, a little apricot, and a sugary aftertaste. It wasn't that bitter. The color was a bit brighter than I expected, kind of a reddish-orange, with a little hint of brown. It's a decent ale and I was able to finish it, but I was not wowed by it. Considering the price, the money is better spent on something like Chimay.

However – I have not tried any other American abbey style ales. In searching on the internet, some people say this one isn't too bad when stacked up against some other American versions. I'll be checking some out in the future, but compared to the Trappist stuff, it doesn't come close to being as good.

Thursday, December 1, 2011

Game of the Month [Nov 11] The Binding of Isaac [Steam]


This month I'm going with a game on Steam. I've been quite busy this past month, so I haven't played enough PS3 games to really choose one for GotM. PlayStation has been my primary gaming platform for years now, but during the last year or so, I've gamed more and more on Steam and I enjoy a lot of the indie games that are released through them. And you can't beat the regular sales they have.

The title of this game is what caught my eye. The Binding of Isaac. If you're not familiar with that phrase, take a look
here. It refers to the Biblical story of Abraham, when he was asked by God to sacrifice his son. The binding refers to Isaac being bound to the sacrificial altar.

Now, I knew about the story and thought it a strange title for a game. I didn't hesitate to get it after glancing at the game page and seeing the discounted price tag of $2.50. The regular price is $5 and it's well worth the purchase.

The game story builds off the Biblical story. Isaac's mother hears the voice of God and He tells her to sacrifice her son. Isaac overhears and hides down in the basement. Down there he finds caverns and monsters and must navigate his way through. He uses tears as his weapon, and you can find a variety of collectible items, power-ups and secrets throughout.



If you think the art style looks a bit like Super Meat Boy, then you are a winner. The designer is Edmund McMillen, half of Team Meat. It features many of the same retro designs as his previous title, along with an 8-bit style soundtrack that's pretty cool.

The gameplay is very much like the dungeons in The Legend of Zelda. The interesting thing about this game, though, is that the dungeon layout and content is randomly generated each time. You have six levels you must complete to beat the game. Sounds easy, right? It's not... you can't save your progress and you only have one life. If you die you have to start over.

That may be frustrating for some, but having the dungeons, enemies and items all randomly generated makes up for that frustration, because the game is different every time. There are
tons of collectibles and power-ups to get, and they only last for a single game. Sometimes you get good ones, sometimes you get crappy ones, but either way the experience changes because of your abilities. Because of this, along with unlockable characters and achievements that go from completing the game various ways to collecting everything, there is great depth for a game with only 6 short levels.

And it's fun to play, the controls easy to grasp. It's another game like Super Meat Boy where you don't feel cheated because it's so difficult, since most games run only 5-10 minutes. There's not a huge time investment.

If you want to check it out, you can play a flash demo here:
http://www.newgrounds.com/portal/view/581168

If you use Steam, I highly recommend it. Easily worth the price.