Showing posts with label Senior Project. Show all posts
Showing posts with label Senior Project. Show all posts

Wednesday, May 2, 2012

Carnival Videos

Uploaded some Carnival gameplay videos on Youtube.



Wednesday, April 11, 2012

Finally! A look at Carnival


So I'd been holding off on showing off screenshots of Carnival for a while. But now that the Senior Project Fair is over, I may as well show off where it stands. I was going to post a video as well, but I think I'll hold off on that for a bit. At least until I've got some rather major bugs sorted out and a few extra animations and particle effects thrown in.

Be sure to check out Marie's blog as well. She was responsible for all of the character, armour and weapon textures, and definitely bumped our overall visual quality up a couple notches.


 The two trainer screens - currently missing skill descriptions. The icon designs were done by Lee Pakkala, the UI elements and background by Marie Deslauriers, and the two trainers were illustrated by me. I also was responsible for adding the interactivity in Flash with Actionscript 2.0 and connecting it to the Unrealscript side of things.


The gear and abilities loadout screens, just before a player enters a server game. Currently missing weapon/armour descriptions, and more specific details. Icons are dragged across from the table on the right and dropped on slots on the left. Armour and weapons are equipped in real-time on the character preview. The player can also click and drag on the preview area to rotate the model. The armour and weapons were modeled by Lee Pakkala. The character mesh was modeled and textured by Marie Deslauriers, who was also responsible for painting the weapon and armour textures.


Some in-game screenshots. I tried taking these on my own, holding two controllers and hitting the screen capture button as quickly as I could. I would have liked to use our spectator camera to angle the shots more effectively, but unfortunately one of the major bugs we are currently experiencing made that impossible. The environment was modeled and textured by Nick Zou, although I retextured certain pieces (most notably the walls immediately surrounding the arena, and the structures into which the doors are set). Animations were posed by Hana Ameerah, Shahd AlFakhry and Nick Zou. I was responsible for taking those poses, tweaking them to ensure that they communicated their respective actions effectively enough, and also set their timings. Again, HUD UI was designed by Marie Deslauriers and the icons were the work of Lee Pakkala. All of the programming - game mechanics, HUD, networking, as well as the construction of levels, animation trees, particle effects, etc. were handled by me.

Hopefully if I am given the chance to work on a project like this again in the future, I will be able to disperse the programming and game-engine-related responsibilities across more team members, instead of taking them on myself. I would have also certainly liked to have worked on more of the art and asset creation, but unfortunately, I did not have the time.

Senior Project is Over - Sort of

Today was the senior project fair. I'm having a bit of trouble looking at the screen right now, what with my eyes getting all squinty from exhaustion. But boy do I have a story, and it must be told. I warn you, it is as long as my day has been.

It seems that despite the fact that people have always seen me as an excellent programmer, so far neither of my game projects have been without an extremely bumpy submission day. Today's had the potential of turning out horribly, but we came out alright.

7:00PM, Last Night
I was in the lab, running some last minute testing. I was hoping to test our installer out on the lab PCs we were going to be using for the Senior Project Fair, but unfortunately the local admin account password the systems administrator left us was unreadable, and he had gone home. I still don't know what the second last character was. An h? Maybe an r. No matter. We ran some further tests between my laptop and a team member's, and then called it a night. Figured I'd spend that night at home fixing the bugs we did find (of which there were a handful), then come back bright and early the next morning.

Fixed the bugs on my PC at home (which is a significantly better environment for working than my tiny laptop), and fell asleep at 1:30AM.

6:00AM, Today
I woke up. Several nights this past week, I was going to bed around this time. Despite the natural urge to go back to sleep, I didn't feel too tired. I think I've broken my internal clock so badly that it doesn't even understand when I should be awake or asleep.

7:30AM
Everything's going as planned. My bug fixes seemed to stick. A few new issues may have popped up, but they were easily dealt with. I also implemented a dodging mechanic, along with an animation that would flip to match your direction of movement! It was a quick affair, and certainly got me motivated to move further. Technically, though I should have been done all of the coding a long time ago, but being the only programmer on a fairly sizable game project definitely saw my time stretched beyond its limits.

9:00AM
The systems administrator (who is a significantly kinder fellow than I realized over the past five years) logged us into the local administrator, and so we nervously went on to test our packaged installer. We'd heard stories across the hallway that despite the admin access, some people still couldn't install their games. Thankfully, we were in the clear. It installed fine. Then I tried to run the game - opened, and crashed.

But it's okay. I anticipated this, based on an absolutely random hunch from having worked on XNA many months ago in a similar environment. Preparing for this random chance, I brought with me 6 pairs of headphones (half of which were broken) - one for each PC. Plugged one in, and the game opened just fine. Turns out it was crashing because it could not find an audio device. Come on guys, not everyone has speakers.

Of course, it can never be that easy, right? Things were going too well. I moved on to logging myself in, and then checking the server list to see what the situation was there. Slight problem. The game was built expecting every network to have a single external IP address, allowing me to filter the server list and show only hosted games within the network. This was all being pulled from a MySQL database, mind you. A strange set up - local game, but all the accounts and data was hosted on the internet. Fixed the problem by removing the filtering and clearing the server list. Okay, we're still good. Maybe we won't be able to connect to a hosted game?

Nope, that worked too.

10:30AM
Here came the whopper that made up for all of our pleasant sailing: on the client computer, the server (and I assume, every other player) was naked and bald. Furthermore, none of their attacks were animating, though running and dying was working fine. I flipped my shit. Something I had changed the previous night had caused this ridiculous problem.

Finding what the problem itself was proved simple enough, but not so for what was causing it. There is a single struct that contains all of the information regarding my player's loadout - all of the armour they equipped and the abilities they chose before joining the server. That one struct was not being replicated for new players, as they joined.

It seemed to me like every five minutes, I would have a "OH I KNOW WHAT THE PROBLEM IS" moment, and every time for two and a half hours I would be horribly wrong. I haven't yet figured out what the cause was, though I do intend to go back and fix the damn thing - and perhaps another handful of bugs.

12:45PM
It is a truly horrible feeling. I was the only programmer in the whole group - all of this was resting on my shoulders, and if I could not fix this, it seemed like we would make complete fools of ourselves. Not only did I desperately not want to let my team down, but it kept ringing in my head. I didn't even want to do the programming for this project - I wanted to create and texture 3D assets. Characters, armour, weapons - that was the direction in which I wanted to expand my portfolio, and I wanted to build myself a reputation as a 3D artist. Or the beginnings of one.

Unfortunately, I was the only one in my group with an aptitude for programming. Everyone else was in the art category, so I had to pick up the coding side of things. Or did I really? Maybe we would have managed just fine. Maybe it's all in my head. I don't know anymore.

So, 12:45- I was thinking there, thinking about the fact that not only would I not be noted for having skills as a 3D artist, but I'd instead be crowning my five years of university with a disaster. I wouldn't even be remembered as a good programmer. At best, I'd be "that kid who bit off way more than he could chew." And they'd be right.

At this point, I accepted the fact that I probably wouldn't be able to solve the problem - I packaged the game up and rushed my team members into installing it on all the machines. At least we'd have something multiplayer to show - it's better than nothing. But no, it seemed that nothing was, at least at the time, what we were destined to show.

We tried joining a hosted game with the lab PCs - something that had worked some two hours earlier. Nothing. No response whatsoever. I could feel my heart break. We had a mutliplayer game with no multiplayer. At best, we had a game with a simple character creator, a couple of trainer skill trees, a marketplace and an (admittedly pretty cool) loadout screen where users could drag and drop their equipment icons onto slots and see it update a 3D preview in realtime. Oh, and we could host a game and allow our visitors to run around alone in the arena. And yes, that's right. Visitors. They were coming in already, it was past 1:00PM.

2:00PM
This was around the time the judges were supposed to come and see our project, and we were supposed to present. The presentation itself would have been alright. Professor Arya or Professor Whitehead (I honestly can't remember who it was anymore, my memory is hazy) offered to bump us to the last group, giving us an hour at least to figure out what was going on and fix it. I told him flat out - I don't think extra time is going to help us. Thankfully, he didn't listen to my stupidity and bumped us to last. I may have plenty of sour things to say about my program's faculty in private, but today I really cannot swear to any of it. They weren't condescending or critical of my failures as a programmer at all - only encouraging and accommodating.

It wasn't too long after that Nick Zou (the team member who was helping me debug earlier) suggested that we try the game between our laptops. Just to get something going, if we could. I had virtually given up, but at this point I really had nothing to lose, so I gave it a shot, expecting to not even be able to join the game. I was wrong.

We were able to get into a game together, but the bug from earlier that morning that kept the client from seeing animations, weapons and armour was still happening. But the host could see everything perfectly... Then we had an idea. I can't remember if it was mine, or his, or if we came up with it together. But it resulted in Nick sitting in the far corner of the class, hidden by a sheet, and me setting my laptop out on the open table for people to see.

Nick played blind.

He couldn't see what anyone was doing. All he could see was people running around. Couldn't even see if his own attacks hit. But somehow, he managed to kick a lot of people's asses.

Interest in our project started to grow, and despite only having one functioning copy, people were crowding around to watch the fight. I'm sure other groups got much larger crowds, but considering the state of our game, we could do worse. What's more: people seemed to enjoy the game. It was difficult, it was unbalanced, and Nick was making mince meat of most contenders, but they were enjoying themselves. One guy kept coming back - although he was equally interested in the programming aspect of it, and had been trying to help me figure out what the problem was. I can't really remember his name now, but I wish I could thank him again.

Edit: His name was Harold Mintah

3:30PM
From here, the story's fairly linear. Presented to the judges, they seemed to like it well enough, but the game wasn't anything special. They did, however, like the art style, and I saw some employer-type fellow asking Marie (who did a lot of texturing) for a business card. I don't think anyone was particularly wowed by anything I did, though some of the judges did come to me afterward to make a few suggestions regarding the flow of animations and other such things. I guess they were mildly impressed by the fact that I coded it on my own, but really that just makes me look irresponsible, since the product itself was essentially broken. Another truth.

It definitely is disappointing that despite the countless hours I put into this project, I don't think I'll get much out of it. I do, however, intend to clean it up, and fix the bugs as well as I can, before putting it away. If anything, I will get some decent video footage for my portfolio.

My eyes are burning, I think I need sleep.

Thursday, March 1, 2012

Paladin Skill Trainer

So I didn't post the WIPs as I was working on this one, largely because I never really liked it at any stage. I've been pretty burnt out from working in UDK and studying for midterms and I've spent my evenings on this. I'm still not particularly pleased, but it's good enough for what it's for.


Thursday, February 23, 2012

Barbarian Skill Trainer, the Second

Only about three hours (perhaps less) of work over my last posting of this illustration. It's still kind of rough and sketchy in places, but that's how I feel like leaving it for the moment. Just for posterity's sake - this is one of the skill trainers for my senior project game. He exists only as an illustration in our menu UI... but the character design's kind of neat, I think. Maybe one day I'll make a 3D model out of him? Probably not. Onwards, to the paladin!

Wednesday, February 22, 2012

Barbarian Skill Trainer

Since I finished my Korean Girl/Woman portrait, I decided to devote my artsy evenings to senior project - not to say that I would be coding all night, though. I do have two character portraits to complete for our user interface. Initially this was six, but as we cut down the number of trainers we'd include in our game, so fell the number of portraits I had to produce.



So this one's still pretty rough, but I don't like it that much. I never really felt into it, but I pushed along anyways. I hate touching his face, because it never seems to come out right. And yeah, he's only got one arm. He lost it as a child, before he ever picked up an axe. He's that badass. They call him two-hands, because he always chooses to use the biggest two handed weapon available.

Thursday, February 2, 2012

UDK, TextureRenderTarget2D, SetExternalTexture() and Scaleform 4

May 18th, 2012 Edit: It appears that the May 2012 release of UDK fixes this issue (reference). Thanks to Steven Webster for letting me know!

Punch UDK in its stupid face!

Perhaps I'm not being clear enough. So a couple weeks ago, I decided to build the user interface for my Senior Project (a UDK based game) using Scaleform 4, a recent addition to Unreal. Up until the November 2011 release, UDK only supported Scaleform 3, which in turn only allowed developers to use ActionScript 2.0 when creating interfaces in Flash. The last time I touched ActionScript 2.0 was when I was in the eleventh grade. I think I made a pong game. So obviously, I was pleased to hear that I could use AS3, which I had learned to a reasonable extent only a few years ago.

Bad move.

Since then, I've been running into issue after issue, and it was really my own fault. I shouldn't have expected such fresh features to be well supported. A lot of major elements are quite broken. For the most part, there have been solid workarounds, but now I've run into something that I cannot avoid.

I've been trying to incorporate a preview window for 3D components for things like the inventory screen, where clicking on an item would load up a rotating view of the object. I found out how to do this, in theory - it involves taking what is essentially a camera (SceneCapture2DActor) and having it render directly to a texture (TextureRenderTarget2D). Then, SetExternalTexture() is used to replace an image texture in the Scaleform UI at runtime. Effectively, you are given a sneak-peak at something rendered from off screen. The technique relies heavily on the notion of dynamic textures, which can be used to create computer screens, water reflections, etc. (Check out these links for more information on Rendering to Texture and Swapping Render Targets into Scaleform UIs).

Unfortunately, where the plan fell through was at the very end - SetExternalTexture(), unfortunately, causes the whole program to crash when used with a TextureRenderTarget2D. I found some complaints about this on the Epic forums, but unfortunately it doesn't seem to be high on the list of priorities. People have been complaining about it since early December at least, and to my dismay, the January 2012 release (which came out today, or very recently) has the same problem.

So, I've decided to bite the bullet and revert to the October 2011 release of UDK, and switch out in favour of AS2. I'm really frustrated, but since I'm more familiar now with a lot of the processes and issues, I should hopefully be able to redo the work I did in the past couple of weeks in much less time. Unfortunately, I have a meeting with my Senior Project advisor on Friday, and I will definitely be falling short of my biweekly goals. Gat dangit.

Tuesday, January 31, 2012

UDK Woes

So yesterday I buckled down and spent the whole day working on getting the main menu hooked up for my senior project game. Needless to say, I didn't get anywhere near as far with it as I would have liked, but I really figured a lot of stuff out - stuff I didn't expect to be quite so challenging. Granted, some of those things were due to my own stupidity (accidentally saving maps in the folder of an older UDK release and wondering why it kept complaining about external packages, and also not noticing when my debug log statements were showing up in the window amongst all of the other crap UDK feels like printing).

So it seems that taking the ActionScript 3 route was not the greatest decision - it's only been supported in UDK since the November release, so needless to say they're still working out the kinks, and some of the AS3 specific details are sparsely documented. Still, I truck on.

I ran into a couple major issues - one of those being that my custom GFxMoviePlayer class' WidgetInitialized method not being called. At all. Funny thing! This is supposed to be the official, supported method of having UnrealScript recognize the initialization of various components within a flash file (buttons, for example - so you can hook up event listeners and have UnrealScript handle the clicks). Totally busted. The developers are aware of this, however, and the problem's fixed on their end - so it should be out in the next release. Unfortunately, I have to get these things working now. More info here.

Thankfully, the link above suggested a convenient workaround, which brings us to the very rudimentary elements of flash-unreal communication. Using ExternalInterface.call lets you call any UnrealScript method within the custom GFxMoviePlayer class from ActionScript. Generally used as follows: ExternalInterface.call("myFunctionName","firstParameter","secondParameter",...)

Unfortunately, I hit another speed bump soon after - Adding event listeners in UnrealScript doesn't seem to work! So I could (I think) send the button objects to unreal, but couldn't do anything with them. Some forum posts suggested that the name of the event type had changed from 'CLIK_press' to 'CLIK_buttonPress', but it still didn't work for me. So at the end of the day, I decided to rely on the flash end to handle everything to do with the input, and just send data to unreal using ExternalInterface.call. I'm not sure how this would affect performance, but since it's a relatively unintensive menu system, it shouldn't be too bad.

At the end of the day, I ended up only managing to get a menu system with the Quit button working... but it's something.

Thursday, January 19, 2012

Carnival UI

It's ten at night, and I've got a group meeting with my senior project advisor tomorrow at 1:00PM. Looks like I ought to get something related to my section of the work done. Needless to say, I haven't been spending enough time on senior project this week, but the work that I have done has more than anything been related more to other group members' tasks. For example, testing out rigging and skinning on the character models, and sifting through one of the environments (that had way too many edges simply lying around doing nothing, and was not built to UDK scale).

So tonight, I'm going to try and bring in a Photoshop mockup of the game's login screen into flash and have it running in UDK. I'm a bit uncertain as to whether or not I'll be able to run it on my laptop and demonstrate it during my meeting but... That's unimportant for the time being. So instead, here's the design mockup!


Initially I was rather bothered by the fact that I had to work with that logo (credit goes to Marie Deslauriers). I'd made an alternate version, because I felt that the logo was lacking contrast and wasn't particularly readable. Still, general opinion sided with Marie's version, so I went ahead and did what I could to bring some contrast in, and keep the stone texture from overpowering the other elements on the page. Here's a comparison between her version of the logo and mine - they definitely cater to a different sort of game, mine (the right side) being somewhat more cartoony.


After a fair bit of critique from a handful of people (mainly Khuyen), I ended up changing a few details (as you can see below). That was mostly for my own sanity, since I genuinely did like the design, and wanted to see it brushed up as well as it could be - even if we weren't going to use it for the game's UI.


Anyways, it's time to get myself acquainted with Scaleform 4.0, and reacquainted with Actionscript 3.0. Thank goodness the November 2011 release of UDK includes support for Scaleform4, because I was not looking forward to having to deal with AS2.0. Not at all.