Site Sections

Tuesday, November 16, 2010

Device Reset in Direct X 9

So, an issue that I have been battling for about a week involved resetting devices in Direct X. I wanted to cover how to do this and the possible downfalls you might run into while performing something that should be fairly straight forward to accomplish.

Q. When would you need to reset the device?
A. Anytime the device becomes "lost", this could occur when you resize the viewport, minimize the window, switch between fullscreen and windowed modes, and when in fullscreen, giving focus to another window other than the application which is running direct x.

Q. Why is this so difficult?
A. That is a great question, I am not sure. It seems like the Direct X interface should be smart enough to recover itself in the event that the device is lost. This is not the case. Not only is it not able to recover itself, it requires quite a bit of tender loving care when resetting occurs.

Q. What is required to reset a device.
A. After you have set up the code to create a device, your application loop must regularly check to see if the device is still active. This can be performed by calling the Device.TestCooperativeLevel() function. This function tests the device to determine if it is in a state ready to render. The possible outcomes of this function call are D3D_OK, in which case you may proceed to render your scene, D3DERR_DRIVERINTERNALERROR, in which case the device is in a bad state or the drivers are unable to process commands for some reason. The other two states are the important ones, these are D3DERR_DEVICELOST and D3DERR_DEVICENOTRESET. These indicate that the device is lost and needs to be reset.

Once either of the Device Lost or Device Not Reset errors are identified, code must be written to reset the device. The important thing to understand is that the device is very stupid about how it handles passing out resources. As such, you must ensure that the device reset occurs on the same thread as it was created. Additionally, Microsoft documentation indicates that the device releases all explicit render targets, depth stencil surfaces, additional swap chains, state blocks and default resources associated with the device. This means that any resource that is returned from the Device "Get" functions that return pointers to resources, must have their resource.release() function called on them to notify the device that the resource is no longer required. The down side to this is that any of these resources that will be required again once the device is reacquired, must be recreated before they can be used again.

The most frustrating thing here is that the Microsoft documentation states that these resources SHOULD be released, however, it is my experience that failure to release these resources causes the reset to fail, returning an D3DERR_INVALIDCALL. As a result, it really isn't just recommended, but a must, to ensure that all modules that request resources from the device have both a OnLostDevice and OnResetDevice functions that handle freeing and recreating these resources.

Another note, it is also a good idea to call the Device.EvictManagedResources function. This function removes any additional resources that were allocated using the managed resource pool. See this article for more information on the managed resource pool. Using the managed resource pool can also help prevent the need for the OnLostDevice and OnResetDevice functions for your modules, however there is a cost/benefit trade off here that must be understood and should be researched before choosing either method of resource management.

Once all resources have been released, we can reset the device. To do so, we must first build a set of Present Parameters similar to what we created when first creating the Direct X Device. This is the tricky part as there are many options here to set and any bad combination of these will cause the device to fail to reset. The important thing to note here is that you need some way for your application to know if it is in windowed mode or fullscreen mode when it resets (assuming that you want your application to have both a fullscreen and windowed modes). The reason for this is that depending on the mode, different settings require different values. For example, in fullscreen mode, you need to specify BackBufferWidth and BackBufferHeight values that equal a value that is equivalent to a supported display resolution. These can be retrieved using the EnumAdapterModes function. If the application is a windowed application, these values need to be set to the dimensions of the HWND object that is stored in the hDeviceWindow of the Present Parameters. Also, importantly, FullScreen_RefreshRateInHz should be set to the window resolution selected from the EnumAdaptersModes function in fullscreen mode, but should always be set to 0 in windowed mode, otherwise the reset will fail.

The rest of the parameters can be referenced here. Rules for setting each of them are listed. Be sure to verify that each of them are set accordingly depending on what mode your device is in.

Finally, reset the device by calling the device.reset(presentParameters) function. This will attempt to reset the device. If it was successful, it will return a D3D_OK and you should proceed with recreating all of your required resources by calling the OnResetDevice functions of your applications modules. If it does not, this is where the difficulty comes in. In most failure events the function will return D3DERR_INVALIDCALL, if this occurs then check your parameters to make sure they are correct. Otherwise, it is most likely due to a non-released resource.  Running your application using the debug version of the Direct X dll will improve the quality of the error message received from the Direct X driver. This may not be an option for you if your application is already pushing the limits of available frame rates.

I hope that this tutorial has been helpful. I know that when I went looking for information on how this stuff works, the tutorials were brief, mostly directed at solving specific problems and less about the actual theory behind the information. I cannot claim to be a Direct X expert and if any of the information in this article is false, as always feel free to correct me and I will update the tutorial.

Sunday, November 14, 2010

Game Review - Enslaved Odyssey to the West : Ninja Theory : PS3

I purchased Enslaved without knowing much about the title. Mostly that it was made by Ninja Theory and that it would have the same motion capture and voice acting work as Heavenly Sword. I was impressed by the level of cinematography in Heavenly Sword and with my love for action/adventure platformers such as the God of War series, Dante's Inferno, Darksiders, and Prince of Persia, I thought that I would really enjoy this game. The screen shots and cover art seemed interesting enough and the premise was something different as far as I could tell from the run of the mill "You are the hero, and you will go defeat the bad guy".

In Enslaved you play as Monkey, a man who lost his parents when he was young and has lived in the post apocalyptic USA about 200 years after nature has reclaimed the city. You meet Monkey while he is trapped on a slave ship, something the game never reveals how this comes about. You witness the other main character in the game, Trip, escape from her pod and start the slave ship on a collision course into New York city.

After escaping the ship you find yourself enslaved by Trip, forced to act to her every command, otherwise she will kill you. If she dies, you die. This leads to an interesting dynamic, but one that is actually quite glossed over in the game. Monkey and Trip become fast friends, only infrequently having dialog in the vein of Monkey's dislike for becoming enslaved. Maybe he just finds Trip so attractive (which she is) that he is willing to be her slave, hoping for some sexual torture as a reward.

Regardless of this, the dialog between Monkey and Trip reminded me heavily of the Ubisoft reboot of Prince of Persia. Interlaced humor and witty banter is quite prevalent. As both a pro and a con, you do not however have to perform an action button press to hear this witty banter, it is just interlaced throughout the level game play.

This leads into the second important aspect of the game, the game play. This I also found to be very similar to the Prince of Persia reboot, except that the parkour aspects of the environment were too easy to traverse. There was no chance of falling in most cases and it seemed to that pressing a direction and rapidly pressing the x button was effective enough in avoiding any potentially hazardous ledges that may fall. Combat was somewhat unique in that you use a staff much like Beyond Good and Evil, but that there was also combined areas of over the shoulder firing from your staff's plasma cannon. Overall, playing on normal difficulty, combat was very easy for the most part. There were very few times that I found myself in a situation that I was worried that I was going to die. Even less of those times did I actually die. I believe my death count throughout the course of the game was about 10. Most of these were due to miss understanding of the levels layout or a lack of cover when being fired on by ranged bots. This could have probably been avoided had I used Trip's distract action more often.

Graphically, I can not praise this game enough on the level design and artwork that really brings this post apocalyptic environment to life. I am however, a bit disappointed in the amount of texture popping that occurs during the cut scenes. The game was developed on the Unreal III engine and the age of the tech shows. However, I have played quite a few games on the Unreal III tech that didn't have this problem quite as bad. Perhaps it was an issue over texture quality and loading time. I would have rather opted for a longer load time and waiting for cleaner cut scenes than to see textures pop during the middle of a cut scene camera transition.

Overall, I was very pleased with the game. The witty dialog made for an enjoyable play through. It was far too easy as I had stated, probably good for someone who is new to the action/adventure platforming titles. The title is a bit short, however, there is a bit of re-playability as you can return to previous chapters to collect tech orbs and masks as well as re-attempt to beat some of the speed based missions for achievements or trophies. I would have to give the game a 7.5/10 though for the issues stated above.

Wednesday, November 3, 2010

Tower Assault! Curse of Zombie Island

Working with Rogue Pirate Ninja Interactive LLC, we have completed our IPhone title, "Tower Assault! Curse of Zombie Island". We are very proud and excited to bring this game to the app store for purchase. You can purchase it here or from your IPhone or IPod Touch device.


Tower Assault! Curse of Zombie Island is a reverse TD style game where you control a horde of zombie pirates against the forces of an Evil Witch Doctor who has stolen your pirate loot and cursed your crew. You control them by firing brains out of a cannon.


The goal of the game was to provide small bite sized levels that varied in the goals and difficulty as the game progressed. We didn't want to make a simple puzzle style game though and have weaved a story of revenge into the over all game play.

I hope that you try Tower Assault! Curse of Zombie Island and enjoy it. I should have more time to start posting again now that the work on this title is complete, so look forward to that as well.

Monday, August 2, 2010

Where I have been...

So it has been a while since I have posted, this was due to my job hunting and subsequent relocation to my new place in Austin Texas. It was quite a journey to get to where I am now, but I am much happier than I was before at GE Aviation.

The biggest reason, I got a job in the game industry.

My new employer is UTV True Games and I am working on the Faxion Online MMO (www.faxiononline.com). This has been very exciting for me and an amazing learning experience. I can't talk about much now, but I hope to be able to write more once the game gets closer to release.

In other news, work that I have been doing with an independent game group, Rogue Pirate Ninja Interactive (www.roguepirateninja.com) is going well. We are working on an IPhone game that has been announced called "Tower Assault! Curse of Zombie Island" and will hopefully be released in the coming months.

Finally, the other big announcement is that I will be getting married the 21st of August. So it has been a hectic couple of months and I do hope to get back into the swing of things with some reviews, some programming stuff, and some art.

Monday, April 5, 2010

Downloads - PC : OctTree Implementation in Direct X

Well, here is something I dusted off today. This was something I was working on about 2 years ago. It is an implementation of an OctTree in Direct X. I started this with the hopes that it would turn into a full fledged 3D scene editor at some point, however with a lack of a development team and the challenges of working with Direct X, it was decided by myself that this may be a bit more than I was willing to take on at the time with my limited graphics experience.

Screenshot:

If you take a look at some of my old posts about Direct X you will see around the time I decided it was a good idea to switch back to OpenGL and other projects. I would love to see this go somewhere in the future, but in my current state of affairs (job hunting, my impending homelessness, my impending marriage - hopefully after I or my fiancee find a new job/home) I really don't have time to pursue this project anymore. Since I am not using it and it really isn't super functional, however the OctTree is and there is some interesting stuff I was doing in MFC to try and build a properties window, I figure it might be useful for someone trying to learn Direct X. It is written for DX9 however, so don't expect any fancy DX10 or DX11 code in here (remember... 2 years ago). You will also need Visual Studio 2008, so bust that baby out if you got it, else you are kinda dead in the water.

I figure it is better to get it out there to at least show that I have been proactive in learning about graphics and if I help someone learn then I will be happy for that. You can download the source here from drop.io (or from the Downloads side bar). Let me know if you have any questions... I might be able to help, maybe... I did comment the code fairly well so I hope that helps those of you trying to read it.

Controls for moving about are currently just using the arrow keys to move about the plane, there is code in there to support moving in the Y direction, either both rotation or translation in that direction. Once again, old project so what you see is what you get. The application supports .X format for models.

Enjoy!

Saturday, March 27, 2010

ACM Programming Competition Tips

This article is being spawned from my experience at the Northern Michigan College ACM style Programming Competition that I attended today. While the competition is fresh in my mind I wanted to cover some tips I learned from failing miserably this time in the competition.

First tip, and probably the most important thing to understand, ACM competitions are not so much about raw programming skills as they are about knowing certain API's and knowing how to solve certain categories of programming questions. The API's you need to understand are a language's File IO, String parsing (especially tokenizing), Collection classes (List, Dictionary, Vector), and Math libraries. The reason for this is that almost every problem that you will encounter in an ACM style competition is rooted in this problem format:

Step 1: Parse input line by line
Step 2: Perform computation on each entry parsed, or on a collection of entries parsed
Step 3: Output result in a specific format

This implies two very important things:
Tip two, KNOW how to write very versatile parsing code. The number one issue that I had today was that although I know C# file IO, and I would say that I am fairly proficient at it. I generally tend to use documentation heavily when I write code. In an ACM competition you rarely have documentation. Everything is basically from memory. If you are lucky and do get documentation, the reliance of  API documentation for something like parsing, which will need to be done at some level for each problem, becomes a hinder and a time sap. If you practice writing versatile parsing, code that can handle tokenizing both strings and integers (C# Split function works really well for this and you can easily write a re-usable block of tokenizing code in about 4-6 lines using it), the ability to simply write this from memory when you walk into the competition is crucial for a good time on the first couple of easy questions.

Tip Three: Have a working knowledge of Math libraries. I can not stress this enough, there is inevitably some problem that requires you to use at a minimum the Pow function (pretty much a standard in any languages Math API). I recommend knowing the parameter order from memory. There really isn't a whole lot more to say on this other than to have a somewhat working knowledge of math, which if you are a computer scientist, you should have.

The rest of the tips that I have are domain specific tips. These are good to have a fundamental understanding of how to use effectively.
Tip four: Understand sorting algorithms. The better you are at understanding sorting algorithms (or at least their use as part of a language's API) the better off you will be. Generally optimization isn't the primary concern at a competition, output correctness is. However when a grader is testing your problem, they will generally have that one input test that will destroy O(n^2) operations. It is best if you can work your sorting algorithms to be O(n log n) on general practice. Search algorithms are also another similar domain, these should be on average O(log n) if you can. Keep in mind that most languages already have optimized searching and sorting algorithms as long as you are using the provided data structure types (I.E. System.Collections.Generic package in C# or your standard java.util.AbstractCollection package in java). Use these to your advantage whenever possible.

This leads me to my final domain specific tip:
Tip five: Understand recursion and how to define a recursive problem. This is the one topic that spurred me today. I do not use recursion at work (in fact I am required not to by my works coding standards). This has lead me to be a bit rusty on looking at problems in a non-iterative manner. A problem that I had fundamentally correct in an iterative solution was too slow (see tip four), and as a result was returned incorrect. Less than 15 minutes before the competition was over, I saw the recursive solution but it was too late to implement it for points. Had I brushed up on my recursive algorithm design practices prior to the competition I may have been able to do better on this problem.

Overall, the best method of doing well in an ACM competition is to practice, practice, practice. Try implementing simple programs that manipulate some sort of text input, and output it in another format after some sort of computation. This is also useful for any career where you work with managers that do not know how to program, because if they give you menial documentation work, or data parsing work to be done by hand (first hand experience talking here, it happens), you are more prepared to take what could be a 20-40 hour task and turn it into about 3-8 hours of fun programming.

As far as practice, there are resources online, where you can get old ACM competition questions to practice with. You can see some of the world finals problems here. There are other sites out there that have varying degree of difficulty programming problems that are like little brain teasers and can also help build the skills needed to do well in a programming competition. Like I said, you can study for this test like you would any standardized test, it is not about skill as a programmer, but skill as an ACM problem solver.

Good luck to anyone who goes to take part in an ACM competition, they are a lot of fun and they let you let your geek hang out. I did the one this weekend as an independent team since I am no longer in college, I did it for fun, and fun was had. If you can not find an ACM competition that you can participate in, start your own competition, let me know if you do.

Monday, March 22, 2010

Book Review - Programming In Lua, 2nd ed. @ The Books We Love

Just a quick post to have you all take a look at the latest post on my other blog "The Books We Love". I have recently reviewed Programming in Lua 2nd edition. It is a great book, so take a look at the review here: http://thebookswelove.blogspot.com/2010/03/book-review-programming-in-lua-2nd-ed.html

For future note, I have started this second blog to house my book reviewes and all future book reviewes will be hosted there, I will reference them here if they pertain to Game Development or Software Engineering. So check both often :D

Thanks!

Thursday, February 25, 2010

Scheduling

Scheduling is something that since leaving school as a graduate I really have not had to deal with. The reason being that my day usually consists of working on various tasks that are assigned to me through our task tracking system. Granted some adhoc scheduling is required to ensure that the top priority task is worked on first or to balance due dates with priorities to insure that all of the tasks are completed on time and under budget.

The scheduling that I am referring to is my out of work time. This has mostly been open due to no extra curricular activities with a fraternity or school organizations. The problem I have noticed is that I have a lot of things I want to work on, and I tend to get sidetracked easily. As a result I feel that it is time to schedule my after work activities again like I did when I was very busy in school.

My schedule looks something like this:

Monday Tuesday Wednesday Thursday Friday Saturday Sunday
9 am Work Work Work Work Work Videogames Videogames
10 am Work Work Work Work Work Videogames Videogames
11 am Work Work Work Work Work Videogames Videogames
12 am Work Work Work Work Work Videogames Videogames
1 pm Work Work Work Work Work Videogames Videogames
2 pm Work Work Work Work Work Videogames Videogames
3 pm Work Work Work Work Work Videogames Videogames
4 pm Work Work Work Work Work Programming Programming
5 pm Work Work Work Work Work Programming Programming
6 pm Web Web Web Web Web Programming Programming
7 pm Dinner Dinner Applebees Dinner Dinner Programming Japanese
8 pm Japanese Programming Applebees Japanese Programming Programming Japanese
9 pm Japanese Programming Applebees Japanese Programming Programming Personal
10 pm Personal Personal Applebees Personal Personal Personal Personal
11 pm Personal Personal Personal Personal Personal Personal Personal
12 pm Bed Bed Bed Bed Bed? Bed? Bed

The major reason for this is that I feel like I do not get enough work done on my personal projects (and I play too many video games) if I do not have a schedule. I am starting this this week and I hope that I can stick with it. I have a few really important goals with this:
  1. Work more on personal programming projects.
  2. Learn Japanese (which I keep meaning to do but never stick with it, I think scheduled time for this will help)
  3. Keep sane while working hard (I have to play video games and I need social time, thus both are scheduled in the form of video games and Applebees trivia nights). 
 I hope that I can stick with this and that I become more productive as a result. Obviously it isn't set in stone but it is a guide and I am hoping that it will be useful. I am putting it here as a means of trying to show others what I am trying to do to better myself and maybe provide some inspiration for others to do the same.

Monday, February 22, 2010

Recent Work, Lua Love, and My Weekend Retreat

It has been a while since I updated. Been a hectic February, life moves too fast and work is a pain at times. I had to pull an all nighter last Thursday to get a demo finished. I would normally have just asked for more time but this was my project and really my ass on the line. I wrote the research paper that was behind it, not really expecting the funding to come through and when it did, I got the work. I was very proud of the work I did but damn it was a struggle.

The project involved Lua, which I must say after working with Lua in both C and C# integration. I like C# much better. The .Net version of Lua integration is extremely easy to work with and the ability for C# to have attributes which can be put to use in registering exposed functions to Lua is a dream compared to working with Swig or writing your own function wrappers. I learned a lot though, about Lua and about C. I consider myself a good C programmer, a professional if you will, but there is never a shortage of things to learn. This project really stretched my expertise in DLL handling in windows in a C environment (not for Lua but still, I learned it because of this Lua project).

It is interesting to note that a DLL can be loaded into the program space more than once. Mind you this is generally not a good method of doing things, but sometimes a necessary evil. Care must be made though that DLLs are not loaded from multiple copies of the same DLL in the file system. All references to a DLL should be made on the same DLL file. If you do not you will give yourself problems because it will actually load two copies into program space and when you expect the DLL to have global variables that are maintained in the program space environment you will be rudely awakened to find that those global variables in your other DLL are in fact different than the ones you expect them to be.

Another interesting thing I picked up last week was the use of Lua userdata types. These data types are used to represent "objects" in Lua that are not considered one of the standard primitive types. These can be anything from C structs or pointers to C++, C#, or Java objects. It is basically just a pointer to memory in the Lua environment. The tricky things about these datatypes is that you can not create them in the Lua environment. You can only receive them from the main application. Thus the use of these data types are heavily reliant on the host application, functions that receive a pointer to something must be represented as a userdata type and not the primitive that it points to (if it is a pointer to a primitive of course). This obviously can cause some issues, especially when generating interfaces to pre-existing libraries. I found that Swig is not so good at handling this, so care had to be taken to fix some of my wrappings. Also, typedefs can be a cause of torment when dealing with Swig if the typedefs are not included in the header that is being "Swigged". The reason for this is that Swig thinks that these typedefs need to be represented as a userdata type which can cause problems when working with things like handles.

Finally, it should be mentioned that applications that use functions that have output parameters are also a very complicated issue when working with Lua. Lua has no concept of pass by reference. It only allows pass by value and as a result, any pointer passed to the function, when converted to a Lua wrap, is treated as a userdata type. Very inconvenient when Lua has a perfectly good multi-return mechanism built into the language. In fact this is so good that great care must be made to utilize it, unfortunately Swig once again fails at this because it does not know what is an input parameter and what is an output parameter. Now I don't know if I am just too thick skulled to know how to use Swig in all its faceted feature set, but I handled this by brute force modification of my generated Lua wrappings. I feel like modifying these wrappings not only gave me more control over what was being done in each function, but also provided better functionality and ensured that each function was being generated correctly. It took a bit more time but I was happier with the results, and I was able to fix all of the issues that possibly would have gone undetected for a few weeks, or months, or years, until those functions were used by a scripter.

Overall, I still love Lua, I think it is one of the best scripting languages out there. It is easy to use (on the scripting side of things) and not overly complicated to integrate. I was able to get scripts executing within a matter of two hours at the most, much can be said for that. The demo was a success and I am very excited to say that I was able to secure additional funding to continue my work. My managers were happy and thus I was happy. Glory day!

Oh and I beat Dante's Inferno this weekend... also a bonus, saw the anime for Dante's Inferno I was not impressed, more just a retelling of the game storyline. I think EA did a better job with Viceral when they made the Deadspace anime for that games release. It added something to the story that was not in the game. I also am not a fan of anime where they have a handful of different studios with different art styles writing different parts of one story. The change in art style confuses me, not that I am dumb, it just makes my eyes readjust to the changes in color pallets and the character movements. I hope to write a review on Dante's Inferno to finish up the trillogy of reviews (First Impression, First Look, and Overall review) but life is killer and I am super busy looking for a new job, planning my wedding, working at my current job, and working on side projects. As a result the blog always seems to fall to the back burner. Well... back to watching some anime before bed, and back to the grind tomorrow.

Tuesday, February 2, 2010

Game Review - Prince of Persia : Ubisoft : PS3

The latest game I recently played (skipping a few others I have played and not had time to review) is Prince of Persia for the PS3 by Ubisoft. Now this game is an older title for this generation, circa 2008, however I believe that this game still holds up compared to its big brother Assassin's Creed II (is that the right term since its newer?).

Not surprisingly the main characters move very similarly and the games hold much in common for game play styles. Prince of Persia is very much a platformer in the sense that AC and ACII are. Most of the game revolves around climbing very complicated structures and obstacles to reach very high points in each level.

The Good:
Prince of Persia does platformers like they should be done. The obstacles are not complicated to figure out what you are suppose to do, however still provide a good challenge. The game has 4 types of special "plates" that are opened up only by collecting enough "light seeds" which are scattered around the environment. These are only available once you have healed the land in an area. The plates that are opened up provide access to additional areas to heal. The plates also require you to perform some kind of feat, such as the green plates allow you to run on walls, however the slightest bump and you will be sent back to the last successful platform you managed to land on. 

Story in the game was decent, it was driven mostly by very witty humor between the two main characters. This dialog was optional which is something I have not seen very often in games, it was controlled by pressing the L2 button on the controller and could be pressed as often as you liked. Certainly there were only so many worthwhile dialog sections, but the Prince was never short of cynical one-liners to say. I was surprised at how much of the games dialog was wrapped around the Prince trying to get in the Princesses knickers. I found this quite amusing, and her retorts were even more amusing, it created a chemistry that I have seen few games pull off. 

To top off these high points, I found it interesting Ubisoft's approach to deaths in the game. It becomes quickly apparent that you can not technically die in the game. Any time that the Prince would fall or would be killed by an enemy, your companion is there to save you. This is not overly cheap or simple in my opinion when it comes to the platforming, however I found it quite unrealistic in fighting the bosses in the game. Saving you does however give enemies a chance to heal so in that regard it wasn't completely unfair. 

The Bad: 
The ending, I won't spoil it for anyone who is going to play the game after reading this, but I will say that I just was not impressed. I felt that the end of the story was predicable (for me from the beginning) and was designed in such a way to simply anger you. I feel almost as if that is Ubisoft's motives in games is to make the players so angry at the ending of games that they must play the sequels to the titles just so that they can relieve some tension towards the franchise. I have felt the same emotion at the end of BOTH Assassin's Creed games. 

I am also not a fan of how they are selling the Epilogue to the game, a two hour "extra" level as DLC for 10 bucks... an Epilogue? DLC in my opinion should never have anything to do with main plot in a game. I think it should only include additional side quests and fun multiplayer content. I payed for the game, and I would pay for a sequel, but an extra 10 bucks just to see the end of the game, and not the crappy one that they gave me but a real freaking ending???!!! That's robbery in my opinion and I am not going to put out for that. Games like Elderscrolls Oblivion, or Fallout 3, or GTA, I can see having additional plot line as these titles are not strictly tied to their predecessors in the series. The stories stand alone on their own and presumably so will their iterations. Adding main story to these games expand their worth. Granted Ubisoft has not released another Prince of Persia in the story line, and from the looks of it, the next title in the series will not be continuing this plot line, so perhaps a DLC expansion isn't inexcusable, but a 10 dollar two hour one is.

Ah fighting... so important in many games, not Prince of Persia. Combat is sparse and only moderately exciting. The combo system is nice and the use of your partner's magical abilities to link longer combos together is somewhat innovative. Her use of magic does however remove the use of the triangle button for the Prince's abilities, so really more of a gimmick to seem innovative when they could have just given the magical powers to your character instead. Also, it seemed that as the enemies got tougher, gaining the ability to shapeshift which required you to perform only certain types of attacks, it seemed that even if you used that type of attack on them at times you still could not hit them. Their ability to block attacks is legendary, making for sometimes extremely long fights. 

Finally, I hate being analog screwed. If the reader is not familiar with this term, it is the act of trying to tell your character to do one thing but he/she/it does something else because of the slight variation in camera angle vs. analog stick angle. This game (and Assassin's Creed titles) are notoriously bad about this. There were many times that I expected the character to run straight up a wall, instead I got a wall run, only there would be no place to wall run to... frustrating.

Overall: 
Prince of Persia was a good game. I would give it an 8.5/10. Platforming is key in any good platformer and I think that Ubisoft is one of the best at what they do. I really commend the voice acting work that was done on this title and I would love to see more games take a similar approach. I still don't like the price of the DLC and I don't expect it to change, I guess I will just read a synopsis online... oh well. 

Downloads Now Functional

I have to apologize, it appears that the applications that I had up here on this blog for download since the blogs inception were not functional... I am not sure why I never knew this. Maybe nobody has tried to download them. Well, now I have proper installers working that seem to function correctly on both Windows XP and Windows Vista without Visual Studios installed.

All applications (for the PC) still require the .Net Framework to execute.

If anyone has any more issues with installing, please let me know as I am trying to work out my release procedures so that everyone can use the applications. Thanks a ton!

Monday, February 1, 2010

Downloads - Alarm Clock : PC

Application time... literally. My dad asked me to make him an alarm clock application that he could set up multiple alarms with custom messages and sound to remind him of things he had to do. It must be because he plays too much farmville and Civilization IV (although the Civ IV is my fault). But since I made the application, I figure give it to the world, it might be useful to someone.

Features:
  • Almost unlimited custom alarms (limited by RAM of course)
  • Custom Alarm Messages (for each alarm)
  • Custom Alarm Sounds (for each alarm)
  • Enable/Disable alarms in your list by using the check box in the alarms list
  • Customize Alarm date/time and re-occurrence settings (for each alarm)
  • Set custom snooze times so you can avoid canceling and forgetting about your important meeting
  • Save/Load Alarm lists
  • Minimize the application to your system tray so it's not in the way
  • Alarms pop up over other applications when they go off
 Screenshot:
 

Sunday, January 31, 2010

Downloads - PC : Final Odyssey - My First Full Title

I can't believe they put it back up, Final Odyssey. This is the game that I was responsible for when I was working with Husky Games in college. It is a top down space shooter. The game was developed over the course of 2 years from the hard work and dedication to students in our Enterprise program. It was all done with spare time and late nights.

You can download the game here, as well as other titles that the current generation of Enterprise program students are working on. I encourage you to download it and check it out. I actually have a copy in a DVD case with a full color printed manual that I received as a Lead Programmer on the project. Receiving that game in its case completed and sitting on my shelf made me cry the day I got it as it has always been my dream to have a full title on my shelf with my name on it. Yes I just admitted that I cried...

Anyways, here is a screen shot of the game in action. The manual for the game is included with the install.


The game was never polished as much as I had hoped it would have been before I left. It was released pretty much as is the semester after I graduated. The Enterprise moved on afterwords since none of the original developers were still with the organization. It is still fun to go fly around and shoot stuff for a while. It brings back a lot of nostalgic memories seeing it again. I hope people find it interesting enough to check out. 

Monday, January 11, 2010

Game Review - Canabalt : IPhone : Adamatomic

Another game that I have played recently that I would like to cover is actually a mobile title. The game is called Canabalt. I originally heard of this title through twitter, it was posted as a twitter score with a link to the developers website where they provide the game for free to play.




The game was an developed in 5 days with a focus on simple designs with minimal feature sets. I think that Canabalt meets these requirements very well. The premise of the game is that you are a runner that runs on top of roofs in a parkour fasion (immediately sounds like Mirror's Edge). The feel of the game is dark and grey, so immediately you assume without any sort of back story that your main character is running from something. The art in the game includes a desolate city with battling robots in the background and flyby spacecraft that attempt to kill you by dropping bombs onto roof tops.

Controls in the game are simple, touch the play field to make your runner jump, touch it longer and your runner will jump higher. As your runner progresses, he gets faster, the speed in the game will build to a mind numbing speed that makes survival difficult and thus provides the challenge. Hitting obstacles such as boxes and chairs will cause you to slow down and if slowed down too much, makes it impossible to clear some gaps in the game. Play continues until you die. Your score is determined by how far you were able to run. Scores can be posted on twitter with a cute quote describing the cause of your death.

The Good:

The game is challenging, it is extremely difficult once you reach a certain speed. The hardest things I have found is that some buildings you have to jump into a hallway through a window. I find myself often jumping to high on these obstacles and hitting the wall instead of the window. Honestly, I believe that the challenge of the game is what makes it addicting.

I also appreciate the simple interface as well as the concise game mechanic feature set. The game is not cluttered with unnecessary features which is appreciated. Also, given that the game is a non-zero sum game (for those of you who are familiar with game theory), the fact that the game challenges you by driving you to reach a never ending increasing score based solely on your skill as a runner provides a non-stress inducing game play. This differs to games that have a definitive ending and a final goal. The Germans are big fans of non-zero sum games, games such as monopoly, which is a zero sum game, are not played as much by the Germans as they find it too competitive and find that cooperation is more satisfying than backstabbing. I honestly have to agree, games where additional resources are injected into the environment provide more options for players and creates a more diverse strategy. 




To get back on track, Canabalt also strikes my fancy due to the art design in the game, simple and elegant, yet hints at a more complex and deeper meaning to the world that is constructed by its blacks and grays. I think that the animations are smooth and transition well. It makes me wish that there was a graphic novel based on the game that would explain what the runner is running from and where he is going. What are the robots in the background? Who is the organization that is after you and what other technologies are they hiding besides giant fighting robots and spacecraft with big crazy bombs that turn you into a fine mist. This game I think could inspire some great fan fiction for those with that interest who like cyberpunk story writing. (If there is any out there based on Canabalt, someone post the link in the comments to this post, it would be greatly appreciated.)

The Bad:

I honestly have little to say that is bad about Canabalt. I think the game is well designed and even better implemented and executed. I think the only major issues I have are the random generator of the buildings. Sometimes this will generate random levels that are almost impossible to get through (actually I think sometimes they are impossible). I hate games that create deaths that feel cheap, especially when you have a really good score and you feel like you could keep going for a while, and for no apparent reason a gap between buildings are impossibly far apart.

The only other issue is actually the location of the twitter your score button. It is right where I tend to touch the screen to jump and as a result, I have more than once submitted scores that I would not have submitted to twitter. Nothing is more embarrassing than twittering a pitifully low score of 173km, ok there may be a few more things that are more embarrassing than this, but I still feel that there might be a better location for this button.




Overall:

I must say that Canabalt is by far one of the best IPhone App games on the marketplace. After playing the flash based one online, I had no problem paying the 2.99 for the game to have it with me anywhere I go. I think that this game would not have been so popular and successful were it not for the fact that the IPhone still has no flash player for its web browser, as it being free to play online would defeat the purpose of purchasing the app from the store. I am not saying that it is excusable for Apple to restrict the flash player for safari mobile, but I am saying that this has provided an interesting mechanic of advertising games for the IPhone platform that I would like to see other developers take advantage of. By allowing people to use your app on a webpage, it makes it feel more like a try before you buy situation. I think that many developers try to do this with a "Free" or "Light" version of the app on the store, but I find myself using the free or light version and never buying the full version because the free or light version is sufficient for my needs and that the extra pay for bells and whistles are just not worth the money. I still can not believe this game was developed in 4 days, it's just phenomenal.


Check out Canabalt here.