Skip to content
Oct 7 11

How to use Dropbox to Share a UDK Map Folder

by Wayne Denier

Our team was having trouble sharing our work-in-progress UDK map files with each other over the popular file sharing software Dropbox. Dropbox by default creates a single destination folder on your hard drive to store all the files on your account. However saving our map files outside of the UDK Content directories cause some significant problems with finding references and level streaming just plain didn’t work.

There is a way, however, to make both Dropbox and UDK happy by using a symbolic link between two folders in Windows. Follow this great write up and tutorial by Alex Castle to learn more about how these work. The short version is that a simple command line utility will let you create a brand new folder within the UDK Maps folder which is bound to one of your local Dropbox folders. Here’s the command to run from your command prompt…

mklink /J "C:\UDK\UDK-2011-09\UDKGame\Content\Maps\MyTeamFolder\" "C:\Users\MyUsersFolder\Dropbox\MyTeamShareFolder"

The breakdown: mlink.exe is the utility which creates the link, /J says make a hard link between the two folders, the first path is where you would like a new folder to be created (it should be inside your UDK maps directory) and the second path is the path for your already existing Dropbox folder for sharing.

Feb 22 11

Default MVC model binder doesn’t like fields

by Wayne Denier
This issue came up both in trying to complete an MVC 3 exercise and recently again when trying to bind an existing Action with a new View model. The form in the View code was posting to the same Action with a few values specified in GET variables, but the variables were being mysteriously swallowed by the Model Binder and not bound despite the variables being named exactly the same as the members of my Model! This is what I discovered both times…
public class ExampleViewModel
	public string ThisPropertyWillBeBound { get; set; }
	public int ThisOneToo { get; set; }

	public string ThisFieldWontThough;
	public int WatchOutForThis;
If you are defining a custom type as an argument for an Action, the DefaultModelBinder can only map GET variables posted to the Action to Properties on that custom type. In the above example, if I had a WatchOutForThis=really value in my GET variables, the binder ignores this entirely since WatchOutForThis is a field and not a property.

The difference between creating a field and an auto implemented property is so subtle this can be a really tricky one to catch! Check this if your suddenly find values mysteriously missing between receiving the request and getting to your Action code.

Nov 5 10

Super Meat Boy and Metrics as a Reward

by Wayne Denier

This little XBLA darling has hit with a great amount of accolades from folks for it’s old-school platforming difficulty. The brutal yet simple formula is reminiscent of another recent Flash game turned XBLA port N+. This is a complement as much as a criticism of course, since N is a really fantastic game to compare to and all games that have the clout to transition from freeware to a market title deserve a comeuppance for their hard work.

There is a particular feature worth mentioning, too. Meat Boy presents a fun little offering to players who smash and grind their way to the completion of the levels in the game. The game logs the path (and death) of every single attempt as the player tries to complete each level. When the level is complete, it reviews a hilarious mish-mash of all of the player’s trials overlayed in a single animation. If the player had a particularly difficult time getting through the level (with more and more trials) the playback will be even more extravigant as every failed playthrough adds to the silliness and fanfare that occurs upon success.

This sort of technique can be used by developers to garner playtest information from players about problematic levels and frustrating level design. Playing back failures, exact paths and point of player death are useful metrics. However in this case they are playing back for the benefit of the player. At the very least, it’s an eye-catching display of silliness, and at best the player actually sees where they made mistakes and can learn to better their chances on the next level.

Oct 10 10

GDC Online 2010: Impressions

by Wayne Denier

GDC Online was held at the Austin Convention Center last week. I picked up a one day pass for the last day to attend the career building talks and see a little bit of the trade floor. This was my first industry convention.

When I left I did feel like I had obtained a quality list of next steps from professionals in the field of Game Design. All the same, some of the undertones left my palate dry. The first prevalent sentiment (which I heard from no less than four individual speakers) was the extremity of the hours you might work. Sixty to eighty hours weeks; they nailed it into our heads. This is actually the very first thing you hear from anyone that hears that you are an aspiring game designer, I’ve heard it at least tens of times! Honestly, it’s a little tiring to have to hear it so often and it always sounds extremely negative. Yes, I understand that there are long hours and yes I still want to become a professional game designer. Of course this was not without exception, in fact one designer claimed that he has his dream job and works forty hours like anyone else. Worst of all the “long work hours” concept was always book-ended with a very generic and non-descript sentiment that they would never trade this job for anything else.

That very tidbit on the end was what I was the most interested in, and the reason I came to talk to professionals in the first place. Why do you keep designing? I wanted to hear the stories. Passion is a big keyword in this industry, and I wanted to hear about that passion! I wanted to hear that it stays with you, and validate this career that I am investing in.

This was finally confirmed when I heard Jeremy Gibson‘s talk on networking. His talk was full of clear and concise insights into the simple social interactions you will encounter in the industry. His mantra goes above and beyond the resume/portfolio/interview/rinse/repeat sentiment that I have been familiar with all my years in the workforce. It’s about making connections and communicating which can be immediately applied. The advice was valuable in the pursuit of working your way into a reputable company as well as going your own way and building a team.

Finally, just listening to Jeremy speak was uplifting. He’s a man who is happy doing what he does and is extremely successful at doing it. It’s a very attractive advertisement, over the doom-and-gloom of long hours and boilerplate business technicalities. Afterward I was sure to tell him how much I appreciated the talk, not just for the content but for his uplifting attitude.

For more on Jeremy Gibson, check out his page at the University of Southern California where he teaches, and this page that talks about Skyrates which is a game he worked on.

Sep 15 10

How to select checkboxes from comma separated list with jQuery

by Wayne Denier

If you have checkboxes that are grouped by having the same name, the value sent via POST will contain all the selected item values as a comma separated list. I inherited some code that was doing this and wanted a quick way of taking this same comma separated value and reselecting the checkboxes from it. The following Javascript snippet I developed using jQuery does just that.

// Takes comma-delimited list of preselected values and selects html checkboxes
var array = "<%=originalValue%>".split(',');
for (var i in array)
$("[name=myCheckboxName][value=" + $.trim(array[i]) + "]").attr('checked', true);
Sep 12 10

Everything you need to know about scoring in Lara Croft and the Guardian of Light

by Wayne Denier
If you need to complete a Score Challenge in any of the levels, or are trying to get onto the Leaderboards, here is a little information to get you started. Using this, I was able to unlock all the Score Challenges, and I am currently ranked 202 out of 16749 players in All Levels Combined. That is above 98% of all players on the Leaderboard as of the time of this writing. Lets get to it!

How it Works

You get points from two things, killing enemies and collecting jewels. Jewels are the easiest. They give you a flat 1200 pts per jewel obtained. Kills are more complex. Each enemy has a certain points value, around 500 pts for small creatures and somewhere between 1000 and 2000 pts for larger ones. However, these points are multiplied depending on how full the relic bar is. Kills award 1X points if your bar is empty, 2X points if it is above 50% full, and 3X points if it is COMPLETELY full.

Using the Relic Bar

The relic bar fills as you get points. If you take any damage while it is partially full, you will loose some of your relic bar. If you take any damage while it is COMPLETELY full, your relic bar will be emptied.

How to Score High

  • Collect every jewel
  • Kill every enemy
  • Keep your relic bar full to maximize points from kills


  • Take your time: There is a whole separate Leaderboard for time trials. If you want to get the best score, you have to work your way through a level throughly, and be careful to avoid damage. Don’t rush!
  • Pick up diamonds first: All points contribute to charging your relic bar. Jewels always give the same amount. If you pick up jewels first, your bar will be more full when you get your first kill. This also works if you took some damage and are trying to get back in the game.
  • Keep a safe distance: Use your dodge to keep yourself a good distance away. If at all possible keep the enemies up-screen to take advantage of the perspective.
  • Beware of the Death Nova: All larger enemies will explode when they die. In doing so, they will shoot a spread of explosive projectiles in every direction. Watch out for this! Also, try not to hang out around walls when this happens. If it hits the wall behind you, the splash damage will tap you every time.
  • You are doing it right.

    Get a good weapon: You need to kill things fast if you want to keep from taking any damage. The best way to do this is with a weapon with a high rate of fire that will also take advantage of the Scatter Shot relic power. The High Power Assault Rifle worked extremely well until I was able to get the Minigun. That’s all you’ll ever need. Well, if you got your hands on a Golden Shotgun…

  • Get a good relic: Something with Power Shot and Scatter Shot. I used Golden Arrow of Tezcatlipoca for quite a while. If you can get a relic with Ammo Regen too, then you’ve got it made (see Fist of Tezcatlipoca).

Good hunting!

Aug 26 10

Everyday Design: 4th Generation Volkswagon Jetta

by Wayne Denier

Personally I am a bigger fan of BMW than Volkswagon, but my girlfriend has a VW right now so I’m becoming comfortable with this car. I’m really happy with how it drives and the interior looks nice. In most cases I was able to find the controls and functions I needed when I needed them, but these are a few of the cases where things went awry.

The Sideview Mirror Adjustment
This little knob eluded me at first, but I found it after a moment. You turn it to choose between controlling the left or right mirrors. Pushing it up down left or right tilts the mirror like using a joystick.

What’s wrong with it
It looks like a knob, but is extra long so you can push it around like a joystick. This was lost on me at first since I’m used to either a 4 way arrow pad or a slender rod with a nub on the end like a joystick. Because of this I glazed over it a few times before realizing what it’s for. Also it is positioned on the door just above the lock and window controls which just ‘seemed’ too far away from the driver’s sideview mirror to be associated with it. Lastly, the label is a bit confusing, since it looks very similar to the rear window defrost. As for using the control, it feels more uncomfortable for it to be oriented perpendicular to the mirror the way it is on the door. It would feel better on the dash facing the driver so that the left/right/up/down directions are naturally mapped to the direction the mirror moves.

The Lock/Unlock Door Toggle
This is the one that really got me. I was going through a security checkpoint when I needed to exit the car and open all the doors so they could inspect it. I was borrowing the car and I had never used the toggle before. I usually use the lock/unlock buttons on the car key and only needed to use it at that moment since the car was still running. I wasn’t really panicked per-se, but I was rushing and it just didn’t occur to me that this was it. Once I got out, the security guard pointed the button out, and I immediately commenced feeling like an idiot.

What’s wrong with it
The conventional symbol of an open or closed padlock is completely natural to me now, and anything else almost seems silly. The funny part of it is that the buttons on the car key happen to use the padlock symbol! This makes me think that the key design is naturalized to America, while the door ajar and key symbol is from the original design. I could be wrong here but it seems like the only explanation.

The Vents
In the front you can open and close the vents with a dial right next to each one. It’s pretty obvious what this does, and I didn’t have any trouble using it at all.

What’s wrong with it
There are two symbols to indicate the state of the vent, a circle to represent the closed state and a picture of the front seat with an arrow pointing at the head to represent the open state. First of all, circles tend to represent an open state while a line or the letter “I” represent closed, so this label doesn’t make any sense. Secondly, the symbol of the seat with an arrow at the head seems a little out of place. Yes, the vent will blow air at my head, but could it ever blow at my feet? No, because it’s mounted near my head. I know because of the position where it’s going to point. I can see also that the symbol is a direct copy of the symbol on the A/C selector knob in the center of the console.

This control just seems like it was labeled terribly. In the end I can not call it a bad control. The control is so intuitively placed you don’t even need the labeling to know what it’s for or how to use it. Super high points for intuitive here, but then vent dials have been mostly the same for decades.

Jul 29 10

Some Physics: Water Prism

by Wayne Denier

Jul 9 10

Review: The Saboteur

by Wayne Denier

Go over and read my review for The Saboteur at Author credit is listed as Full Sail Student. Be sure to check out all the great game reviews by Full Sail students like me!

Jun 21 10

Using Powershell to inspect folder permissions

by Wayne Denier

We wanted to find out which folders had special write/modify permissions in a website, so we could switch out the current anonymous user account for a new one. Bellow is a Powershell command that we used…

dir D:\Inetpub\Wwwroot\target\ -recurse -exclude *.*  | Get-Acl | % { @{Path=$_.Path; Access=$_.Access}} |% {$a = $_.Access
$b = @($a | ?{ $_.IsInherited -ne $true -and $_.IdentityReference -and ($_.IdentityReference -contains "NT AUTHORITY\Network Service" -or $_.IdentityReference -contains "MACHINE\IUSR_MACHINE") }|%{ $_.IdentityReference, $_.FileSystemRights})
if ($b.count -gt 0) {$_.Path, $b}
} >> D:\temp\FolderPermissionsWeb.txt
There’s a couple of things going on here, but it’s really rather simple. The first segment goes to a directory, and returns all child items that are not files recursively.
dir D:\Inetpub\Wwwroot\target\ -recurse -exclude *.*

The pipe takes the results and performs another command, in this case Get-Acl. Get-Acl returns a list of all access control levels for the items. So at this point we’ve already got all access permission for all the folders in the search. My first proof of concept included only these two commands and outputed the results straight to the command prompt. It was enough to get the job done since it showed me all access for everyone on those folders!

The rest of the statements are all about pruning the results down to only the information I want.

$b = @($a | ?{ $_.IsInherited -ne $true -and $_.IdentityReference -and ($_.IdentityReference -contains "NT AUTHORITY\Network Service" -or $_.IdentityReference -contains "MACHINE\IUSR_MACHINE") }|%{ $_.IdentityReference, $_.FileSystemRights})

This section achieves that. The end of the first line declares $a as a list of all ACL it could find. I then declared a variable called $b that will contain all the results from $a that match my conditions. I don’t want to see any access that has been inherited, and I only want to see right assigned for Network Service or the machine’s IUSER account (IUSER account name varies per machine).

if ($b.count -gt 0) {$_.Path, $b}
} >> D:\temp\FolderPermissionsWeb.txt

Finally, I check to see if there are any matches, and then append them to my file. The code here is sort of rough, which I will chalk up to being a novice at Powershell. I’d hope to make it shorter and format the output a little more, which I’ll work on.