>> Ben Lower: My name is Ben Lower and I'm the host for XAPfest. And XAPfest if this is your first time, it's an internal Microsoft focused event, although we are starting to go external. So this recording, this is being live streamed on on RESNET and it will be recorded and posted for people to view later, as well as people externally to view. But XAPfest is really focused on people building apps and how do they make great apps, how do they make their apps better? And so we really have a focus on getting interesting speakers from across the company and sometimes even external partners to come and talk about how you can make your app better, how you can monetize. In this case, the Coding4Fun guys are going to talk about some of the great work they've done if providing tools and open source code that we can use to get started with, learn from, build on top of. So tonight we're going to hear from Clint Rutkas, who is right here, and then Larry Larsen as well. And so with that, I'm going to turn it over to these guys. So please welcome Clint and Larry. [applause]. >> Clint Rutkas: Okay. So just so you guys know, I have lots and lots of Power Point. So be ready to be bored. About us, we are actually on the Channel 9 team. There's our aliases. Crutkas and Larryla. So if you do have questions, you can e-mail us. Does anyone know what Channel 9 is? >>: Yes. >> Clint Rutkas: Okay. So I won't go into that then. I run Coding4fun, and now we're just going to go straight into code. And you can see one of the crazy projects I'm working on. Okay. So I had -- I built out about 10 apps right during -- right before launch to give code examples and whatever. And I realized I was reusing a lot of the same controls. So in doing so, being the good little developer I was, I refactored all of these into a common control set that would make people's lives easier. And the goal here was to make your apps look cool, clean, and consistent with metro guidelines to the best of my ability. Some of these controls are things that I found were lacking. Other -- in the current kit. And other ones were I just hated how the current item worked, namely the slider. So first off, prompts. There is no input dialog. Is everyone in Mango? You know how there's a message box. Is there an input dialog? >>: I don't know. >> Clint Rutkas: Okay. So let's just assume there's no input dialog. So you click it, and it looks very metro like. It may not be perfect guidelines, but it still fits that. So I can type in, you know, whatever. Click okay. And you get your response back. It's very that driven, it's exactly how as a developer you would expect it to work. Back in the day, you had to use about prompts and give information, so I created -- basically here's the -- here is a more stylized version. There's actually a water mark Coding4fun had there. So you can do lots of cool things and make your app look very powerful just by adding in a couple lines of code. >>: Is that actually your URL? >> Clint Rutkas: Better than everyone? Yeah. I have a small ego issue. [laughter]. So really quick I'm going to go stop this and just show you like how to actually make that control. So prompts. Okay. So here's the input prompt code. And I need to make this bigger because people probably can't see it. Can everyone see that? Yes? >>: Yes. >> Clint Rutkas: I hope so. Okay. Good. Because that's going to get really awkward then because it's very small already. So once you reference Coding4fun library you go input prompt, give it a title, message, put in an event dot show, you're good to show. Is that easy enough? >>: Yes. >> Clint Rutkas: Yay. And then you get a response back. You get a popup result of okay, cancelled, and there's also a user dismissed because you can do things like the back button. So that basically says, hey, that person clicked okay, here is the result, what have they got back? If you notice here, I had the popup event args, and that's because I inherit off of a template that gives the base class here a lot more power so I can do string, I can give back a location, if you will, and the event that -- I'm sorry, the result is that object. So the about prompt -- rely, that's actually ironically perfect. So all you do is you put in your name, your Twitter handler, e-mail and then the URL you want, and it just shows it. Yes? >>: The reason you chose even driven is because you were thinking of ->> Clint Rutkas: Event driven? >>: Yeah. >> Clint Rutkas: It's because that's .NET. It's a .NET paradigms, and that's what I opted for. >>: So typically if you checked for the message what was for instance some sort of dialogs not necessarily [inaudible] do they expect a show or show model then okay or not okay then you keep going in the same method? >> Clint Rutkas: Why couldn't I do that? Because I think I couldn't figure out how it actually locked. I asked the question. I think technical DPE or -- and even WP7 and no one could tell me how that worked. So I just assumed it was magic and stepped away and did it the way I knew how to do it. I'd love to do it like that. I just don't know how. And being, you know, a typical developer, I just figured out a different way and moved on that was close enough. Do you know how? Oh. [laughter]. I'd love to know how honestly. That is something I really kind of want to know how to do. Going back to this. So another big problem is how to test this. So you see, I have these two testing objects here. The gesture library within the Silverlight toolkit posed a problem. And that was the -- it detects, even if something's over it and you click it, it goes through. And that made me very upset. Because now I had to take a direct dependency on the Silverlight toolkit to prevent this from happening. So I'm actually clicking now. And it's not bubbling through. So what do you have do is on the -- whatever object that overlays it, also wire up gestures and then capture it and then cancel it. And you look very upset because I was also very upset when I figured that out. I'm not sure that -- I know Mango has a bunch of the stuff built in now. To what degree, I don't know. So I still -- you may still have to do something kind of hackish like that. What else? Okay. How many people like push notifications? How many people hate how you actually have to use them in your app? Yay. So what I did was, I just built a control. So you can do basically whatever you want to it, and you can swipe it. It would help if I actually let go. And that was that user dismissed and they're based on a timer, so they act just like a real dialog. All that is, once again, you know, toast.show and you're good. I'm kind of like the Dell guy, it's like good to go. There's also a message box, password prompt. Password prompt is kind of interesting. So, you know, how when you're typing on the phone you see the last digit. So like you go GH, that you can't actually do with the normal input prompt so actually had to kind of hack it so it works like it. But these are like, to me, the little things that make the differences, given that end user the full experience of what they expect. So if they're typing in their password, it should act like the system app on here. >>: [inaudible]. >> Clint Rutkas: No. The password box, what that does -- I'm aware with that. But it -- so you see how my H shows right now? >>: [inaudible]. >> Clint Rutkas: If you use a password box, the H would be the dot. So you don't know what the last thing you typed is. >>: Well, I think it gives you like a two or three second view. >>: It gives you a very brief view of the H, but then it becomes a dot I think is what you were saying. >> Clint Rutkas: No. And I will challenge that assumption right now. Because I'm -- because that would be very embarrassing on my part. >>: Well, no, I don't think the password box does what yours did there, which is persist the H. >> Clint Rutkas: Well, we'll find out right now. See that is new behavior. [laughter]. Because this is Mango. This is Mango too. Oh, okay. So in 7.0 land, it was not like that. And, crap, my phone's running Mango right now too. So I have no way of verifying my claim now. So now that I see that, I will go back and change my control. Okay. So let's go talk about. How many app people in here have controls that need color, color dialog? One person. Two people. So do you you wanted a slider, a picker or kind of like what's in Microsoft Word? Let's show Microsoft Word, because that's a cool one. Okay. So Microsoft Word has this hexagon control. And it lets you pick on what color you want. But let's say you want more. So you can go pick out your color, however you want the end user can pick it. You can set the sizes, the gray steps, the brightness steps. And either you can do it via binding or via events. So let's say if I don't want any dark colors, it's going to go to brightness. So if you ever used -- have to find a color in Microsoft Word that kind of had this hexagon control and this was my way of making it metro like, for a color picker, this is -- once again, this is a testing app. It's for me to verify my controls work. So if I pick my color and go up, change it, everything works via binding and -- so if you need color. And then lastly the slider, same concept. Do you guys like that? No? >>: [inaudible]. >> Clint Rutkas: One big thing is I'm a firm believer in using the controls from my kit in the kit. So this is actually my super slider control that I built as well as powering that. So then what I create, I'm also dog-fooding in the actual item. And speaking of the super slider. So I have this hatred for the built-in .NET slider because it didn't act as I think it should. When you start off like a media player and you want to jump time, when you click like, you know, four minutes in, what do you expect to it to do? >>: Jump. >> Clint Rutkas: Jump to the four minutes. And now, if I did that if a slider control, a built-in slider control, what does it do? >>: [inaudible]. >> Clint Rutkas: It increments. And I hate that. So much so, I built my own control. So I click and it jumps directly to where I clicked it. That's how I think and end user was want it to work. Do you guys think that? >>: [inaudible]. >> Clint Rutkas: Thank you. Time well spent. It can do stuff like steps. You can have -- I don't know why that says with a thumb because it doesn't have a thumb. Here's one with a thumb. So it's heavily customizable. You can do vertical, horizontal. It just works. >>: How many pieces of [inaudible]. >> Clint Rutkas: No. That's actually a gradient brush. >>: [inaudible] minimum pieces of ->> Clint Rutkas: It does not have 19 pieces of flair. Another big one is round buttons. So you know how you have the app bar. >>: [inaudible]. >> Clint Rutkas: Yeah. Well, it -- so what I did was I created app bar buttons that act just like the real app bar because people -- like I had many times where I wanted a round button to make it look like the app bar. I didn't want the square. So I created a full borne control. This actually works very much like the -- it's actually a real button. But, you know, how when you had the app bar and you put in an image into it, that basically ->>: [inaudible]. >> Clint Rutkas: Yeah, it basically makes it into one color. This uses an opacity mask. So it acts just like that. So if I do something like crazy like that, it works just like the real buttons. So you see like this button, the text turns black. You click these buttons. It turns black. So like I said, it's the small little things, the extra polish, the annoyance so like, hey, this is two pixels off that other companies have. Like I'm a firm believer that those things should have them. You also have rounded buttons. And this is something for you guys I just added in is piles. So you can do animations, crazy stuff. So all these controls, this is basically a button. One cool thing also I added that is not in Silverlight but it's in WPF is called ClipToBounds. Do you know what ClipToBounds does in WPF? >>: [inaudible]. >> Clint Rutkas: Okay. Now I get to use the white board. So you have an image. And that image bleeds out. ClipToBounds would basically go like that. So now everything is in there. So this image right here is actually ClipToBounds. The background image would actually bleed through on the top and the bottom if I didn't have that property set. But it's a very useful item so then you can do crazy positioning, kind of like that head right there, where it's all the way up to the right. But you ClipToBounds it and because it's a rectangle clipping, you know, Silverlight likes it, and it's not going to be angry with perf. So then ->>: [inaudible]. >> Clint Rutkas: Pardon? >>: The case of that animated button right there ->> Clint Rutkas: Yeah. >>: Is there a special way [inaudible]. >> Clint Rutkas: No. Click me just says hey click tile. The reason why I have roar is because A, it's T-REX. So you see the 99 there? That's a control I put in there as well. But the cool thing with that is if you overflow it and made it so it pops outward and then what you can do is even more advanced stuff is that -- is that this control just more stylized. Yes? >>: [inaudible]. >> Clint Rutkas: I just added this in, but this is -- there's no -- I don't see any reason why they wouldn't allow that. >>: [inaudible]. >> Clint Rutkas: Having a control that looks like a system level control? >>: [inaudible]. >> Clint Rutkas: This is me -- this is a test version. I'm not saying do this. But I can't -- so you're telling me I can't have an app. >>: [inaudible]. >> Clint Rutkas: I'm looking at you on this. >>: Don't look at me. If -- we can ->> Clint Rutkas: Okay. Take this offline then. I don't know. I'm not [inaudible]. >>: [inaudible] official rule is. I think it is discouraged for sure that you would try to mimic the home screen in your app. It's just sort of confusing to users many I've actually reviewed apps where the app itself had a bunch of tiles and I was like, wait a second, am I at the home screen or am I in this app? But I think to your point, you're not saying to do this, you're showing some ->> Clint Rutkas: I'm just -- this is a proof of concept to prove that I can do stuff like shrink the button, I can do stuff like make the button longer and do stuff that looks like it, which is ironic because I have a fake co-app that pass market place which does exactly what you guys are saying not to do. >>: I'm not sure -- I'm not sure if it's an official guideline or not, so we can take that offline. >>: But I mean you could have one tile on your app, and that's not going to confuse people that it's your start screen. So if you have one or two or three, whatever it's the -- but if you have two by four grid ->> Clint Rutkas: Yeah. Like you said. >>: [inaudible]. >> Clint Rutkas: This entire -- this simple app that I have here is all about me stress testing the stuff. So then when you guys consume it, it works. And works hopefully how you think it would. So how many people have gotten rejected for memory issues? Me. Okay. So I have this really kind of cool control that does naughty things. It uses reflection. So up in the upper right you can see the left is current, right is peak memory usage. This control only wires up if the debugger is attached. And because it uses reflection it doesn't kit Marketplace issues. So what I can do now is add. And you'll see it goes up to 32. I have remove the memory from it, and it's going to drop back down. Because if the only way a debugger is going to get attached, the control is if you're running it on your own computer, because it uses reflection it never gets wired up when it passes through Marketplace. So then you don't need that fly enabled, and you don't get hit for identity, the seminal identity flag. I think now with the profiler, I don't think this is even needed anymore. >>: This control? >> Clint Rutkas: This control. Am I correct on that? Profiler can do memory. >>: We can trace it [inaudible]. >>: [inaudible]. >>: It seems like what you're doing is you're adding memory to see if you crash the app. >> Clint Rutkas: No, I'm adding memory to prove that the current memory works. So all I'm doing is just adding to -- that's a good question. How am I doing that? This has been a while since I actually wrote this one. So I have a list of bytes and I'm just adding them. So it's kind of ghetto, but it's very effective to show that off. And then the slider, overlays. And time spent. Okay. So time spent. So we have the date picker and we have the time picker. But at no point did we build a time span picker, which for me is a very important control for like saying I want in thing to run for five minutes or 30 seconds. So you click that. Hey looks just like the time span picker. But you have hours, minutes, seconds. And you can set all these things, and it works just like the real one because it's based on the exact real one with the time span picker. >>: [inaudible]. >> Clint Rutkas: But -- I don't know why we did that. That's a good question. >>: [inaudible]. >> Clint Rutkas: I don't know. Does the time span picker -- I'm sorry, does the date or the time, does that use plural? I don't know I didn't -- another Microsoft person picked that out. And this control is actually culturally aware as a well. Because it does use normal text. So if I click German, it adjusts it appropriately. So now we've talked about how to build out controls and a bunch of other ones. Do you guys want to find out how to actually make a control? Yay. Sweet. Because I was going to tell you anyways. Okay. So I have this blank app here. I just went file, new. Solution. Now, some of this will look like black magic because it kind of is. So you need a theme's directory, and in that theme's directory you need generic.xaml, okay? So what you do is first you create a new control. I named it my awesome control. And then in that control you can inherit off of control button, whatever you choose. Then you type in the -- a credit constructor, and you say default style key equals type of my awesome constructor. This then will allow you to wire up. The system knows where in this it is and then will start applying the templating. Now, if you need to do additional work on here over ride on apply template. If you need to grab stuff out of the tree, call that, and this is -- having has already been initialized, you can start grabbing stuff and then hooking in events. Because a lot of the stuff you just have pure xaml but you can't actually wire up events in it. You have to do the wiring up in this apply template. So then you go to your generic xaml. And you need to type some resource dictionary. And then you do the base, name spaces. And you put in -- let's say you're local. So this is my name space. It's the test zapathon. And because my control is in that name space, you have to type, you know, local: My awesome control. You don't actually need this. But what you do need is setter property equals template. And you set the value and you have your control template and you target that control. It's very redundant, I know. But then what you can do is you can type in whatever you want here. So then I can say, you know, text block equals hello zapathon. Cool. Okay? Now, on my home page I'm going to go -- you can see I already have that control. Because I haven't compiled that control doesn't show up here. If I compile it, it's going to say hello zapathon. Now, that's cool, but that's very static. And I don't know about you guys, but I hate static stuff. So how do we go to the next step forward? Are you guys aware of dependency properties? How many people aren't aware of what a dependency property is? Okay. Cool. Because I was going to tell you once again, no matter what. So what a dependency property is something when it updates you can point to it in your control and it magically updates it. Like on a text block, the text field is a dependency property. So guess what we're going to wire up? The text. So I'm going to go in here. And I'm going to type prop DP. And what this is, if you -- is a snippet. Everyone know what a snippet is. Snippet makes your life so much easier. Because what I -- all I have to do now is hit tab, and it wires everything up. I can just type string. I'm going to type in text. And my owner class is my awesome control. >>: [inaudible]. >> Clint Rutkas: Yes. That snippet is built into Visual Studio. Okay. Now, that property -- that snippet, though, is meant for WPF. To make it work in Silverlight, just remove UI. Okay? Enter and it wires up. Now, would you rather have to remember all this or just prop DP? I like prop DP. Okay. So now -- now that we have this control buck -- or this string bucket, how do we put this into the xaml? So I already have my text block here. So I'm going to remove that. And I'm just going to type in text. And then we're going to do binding. Because this a template, we pick template binding. And I'm going to type text. I'm going to save it. And because I am compiled, it gets angry at me. I'm going to compile again. And it's happy with me now. Yay. And you can see I put in that default value in the prop DP and it says default. But now what I can do is type in text equals [inaudible]. So that is how to build a control very, very, very quickly. Now, you can do a lot more. Let me go show you like -- so here's some of the, you know, more of the crazy controls. Whoops. Where did we go? I opened up the wrong solution. So what you can do here is also set, you know, your border brush, padding, verticals, template, did you animations built into it just to make your control look more realistic, whatever. And it just makes it a lot more reusable. And I was talking about -- let me go pick and put prompt. The on template. And the reason why -- the reason why you can't do things like events and stuff is because that is just xaml. What you can do is you can get the template child and you put -- grab the name of it. And then you can you verify is it not null because someone can restyle your app and remove that. And if they restyle it and remove it, you want your app to still work. And then you can do the binding and everything from within that on template. Does that make sense? With that, I have two minutes to answer questions and then afterwards I can answer questions as well. Yay. Okay. Larry, you're up. >> Larry Larsen: All right. Can I move your machine so I can -- or just push it back just a little bit here. >> Clint Rutkas: Yeah. >> Larry Larsen: All right. So here we go. All right. So I'm going to show you a little demo and how to make a tower defense game without programming. I am not a programmer. I watch Clint. I don't know what he's doing. I've only spent -until we did this game, I had only spent maybe a couple hours in Visual Studio, and that was not to do anything program related, it was to try to figure something out. So I'm more of a designer than a programmer. But I really like tower defense games. I like all of them. GeoDefense, Pirates Love Daisies. I love them all. And I always wanted to make a tower defense game. And may first thought was maybe I can hook up with a programmer and I can do some of the graphics and figure out the game and they can design it. But we came up with a little bit better of an idea. And that was to pull all of the hard core programming away from XML files so that I can go in and create my own tower defense game just by changing some of the properties in the XML. And all the hard core programming stuff is just completely separate and I don't have to worry about that. And so that's how we started doing tower defense. And I know Clint is very excited that it's finally launched. It too a very long time for us to get this thing ready. And here it is now. And I'm going to show you here -- I'm just going to right click on our CodePlex project and I'm going to export a brand-new version of this to my machine. We'll stick it right on my desktop and call it Pirates TD demo. And we'll just save it there. Now, everybody loves Pirates. And I'm going to actually go in here and open up the solution. >>: [inaudible]. >> Larry Larsen: What's that? >>: [inaudible] Ninjas. >> Larry Larsen: You know, you could use Ninjas, of course, but I don't want to take your game. I'll show you this game instead. So first thing I'm going to do is I'm just going to run this. And this will show you the sample game that we have that ships with the code. As Clint mentioned before, we've included all the graphics. We have a PSD file so people can go in this and see how we did things like design the maps, lay out the controls for the game. And we also have sounds which were very well will made sounds done internally at Microsoft. >>: [inaudible] use Microsoft game studios. >> Larry Larsen: Yeah. That was one of the big problems we had. I was just going to do like, you know, bust and a move on a microphone making this sounds just to be kind of funny. And Clint didn't laugh. So we end up having to use ->> Clint Rutkas: So the real reason why -- so we were going to buy sounds. But then whenever you try to buy sounds they don't want you to -- you can't redistribute it. So now we had the chicken or the egg problem. I can't create sounds very well. Larry can kind of. But then we wanted to create a decent high-quality game that could go in Marketplace and people can download and actually in a couple case a thousand people have already downloaded the game. So we had the problem of how do we do this. So because it is an internal Microsoft project we were allowed to use Microsoft Game Studios. We are not making money on this. This is a code sample. You guys can then download the code from scripttd.codeplex.com. You reuse all our assets. We don't care. But we -- Microsoft owns the sounds, assets, so we can't get in trouble now for redistributing them. That was our big problem was how do we redistribute the audio without getting in trouble. >> Larry Larsen: And there are places where you can buy sounds to use in your game that you sell on Marketplace. >> Clint Rutkas: Yes. >> Larry Larsen: But it gets a little bit more difficult when you're giving those sounds back away to other people to sell. So ->> Clint Rutkas: That was our problem. >> Larry Larsen: That was the problem there. So don't fret. There are places where you can -- you can buy sounds inexpensively -- >> Clint Rutkas: And they're quite cheap too. >> Larry Larsen: And you can use them in your app, and no problem. And of course you can use our sounds as well. So I'm going to go ahead and start this. We'll do a new game. If you've ever seen a power defense game, it's pretty simple thing. You have the enemies which are called creeps. They come in one side. They try to leave through another side. That site might be the top, might be the bottom, could be very near to each other. But for this game, we're just going to go ahead. I'll pick a map here with a couple different kinds of towers on it. And you just drag your towers out. And I'm actually going to hit pause here because I'm not ready for all these creeps to come out yet. And I'm going to drag this one. We'll make kind of a little bit of a maze. One have the tricks that a lot of people do when they're playing tower defense games is just to try to make a maze that these things have to go through. And as these creeps come out, the idea is you want to kill as many as you possibly can. And hopefully all of them. Because if 10 of them make it off the other side of the map through this exit, I'm going to lose the game. There's a series of waves so you could have 10 waves, 20 waves, however many you want in your game. Now, because a lot of tower defense games are very similar, the only thing that we really need to do is change out the graphics to make this game look completely different. And I'm going to back out of here and. >>: Is this Silverlight or is this XMA. >> Clint Rutkas: This is XMA. >> Larry Larsen: All right. So I've got a directory here of audio and textures. And I'm just going to show you real quick what I did here. I've got some new background. So back where I had, you know, the other background, now I have kind of a Pirates' theme background. I made some new creeps. The flying creeps are now seagulls and pelicans. And the walking -- the ones that used to be walking creeps are now boats. I -- you know, these are graphics that I used from various places. So this isn't the kind of thing that I would put out on Marketplace. So caveat emptor on that. I created new maps which are the top-down views of the areas. And before we had like some wood land areas, a desert. And because I'm doing a seafaring game here, I've just taken some top-down views off of bing maps. And so I've got Clear Water Beach -- actually this is Treasure Island Beach in Florida, because it's Pirate game. I've got the Bellagio in Las Vegas because I would love to see that get infested with Pirates. And a couple other different beaches from around the world. And then for my towers, I only made one tower just for this example. You see you can see it's the skull with, you know, a couple of cannons pointing out. In our game we have several versions of the same tower. Because you can upgrade your tower. So you can click on a tower, you can upgrade it once, upgrade it twice. You can have in our code sample we've got little dots that denote upgraded towers. But you can have your towers look radically different. So you could have like a puny little tower. But when you upgrade it, it gets really big and wild and, you know, outlandish. And then I've done through and changed out some of the sound effects. So where we used to have little blurps and sounds like that, now we have Pirate sounds. [laughter]. And so I just you kind of switched these out. I'm using the same names that I used before. So we've got like a cannon. This used to be a machine gun sound. Now it's a cannon sound. And so I'm going to take this Pirate TV directory here that I've made. And I'm going to go to my demo and open up the content directory. You can see there is an audio and a textures directory in there. I'm just going to drag this over. Copy into it that. Yes, I want to overwrite all these different files. Come in here. I'll hit play. So if you're an extremely lazy designer or person who is thought a very good coder, this is all you really have to do. I mean, you're going to see we have a radically different game here from what we had before, just by switching out some of the graphics and sounds. Deploying. Deploying. Deploying. All right. So now you'll see that we've got our Pirate defense which, you know, you want to move your title so you don't have resume over it. We're going to do new game. And I'm going to pick the Bellagio and I'm going to go ahead and pause this and I've got my towers here. I'm going to put my towers down. You can see it only has one cannon. Because this is going to be the first tower that I'm laying down. And it's not been upgraded yet. And then I'm going to go ahead and play this. And you can see as the creeps come out, I've got a sound that plays. And I might need one more down here, just to get the stragglers as they come out. I'm actually even going to upgrade that. So seriously this took me like 15 minutes. I mean, I did this in no time whatsoever. So anyone who's really invested some time in this game can make a high quality game that they can put out on zoom Marketplace and hopefully make a little bit of lunch money off of it. And I'm going to show you some of the things that you can do to extend this and to change the game play on it. So there's two significant files. I'm going to open up the map that we just played, and I'm going to open up file called in game. So these are two of the types of files. The maps you'll have them numbered one through however many maps you have. And then in game sets what that game actually looks like when you're playing it. These are two of the files. Once you set in game, that's the kind of thing where you'll go in, you'll set it up once. The actual map, XML files you spend a lot of time in, because when you're play testing, and it takes a lot of play testing to get a tower defense game right, you're constantly in there tweaking it to make it a little bit harder, a little bit easier. One of the things I noticed when we put this out on Marketplace, people had a pretty big problem with my second level. They thought it was impossible, which it wasn't really impossible, but it was very difficult. >> Clint Rutkas: It was impossible. >> Larry Larsen: Oh, okay. It might have been a little bit impossible. But, so, yeah, you want to go through and keep testing these. So let's look at the in game right here. So the first thing we're going to do is look at the visual aspect of it. The visual element here, you can see we have our play screen background. And if I go in here, I'm just going to -- let me launch this again here. I'm going to show you this while we're playing. But the play screen is the wooden border that was across the top. You can see that it has the text labels or for things like cache, lives, points. And then the labels that actually fill the numbers in, the values for that. You can see I've got some elements on the screen. We've got some elements on the screen like the options button which of course, you know, you can switch out the options button very easily. And you can change where its location is by just, you know, changing what size and the location right here. We've got ours all the way over on the right towards the top. Resume that game that we were just in. And I'll pause that. So you can see we've got our options button here. Options lets you turn the grid off, turn the sound up or down. We had another button in there was for main menu that I've got commented out. But, you know, you can always have that. We have a hardware back button so we don't really need it but it's there if anyone desires it. There's some other buttons here like force wave. And you can see that's our button that just makes creeps come out no matter what. So if you don't want to wait for them, you think you've got enough towers to handle whatever you can throw in it, you can sit and hit that plus button and just make them come out a lot faster. We've got an enter and exit button. This is kind of an interesting hack that I did. So when with we first did this game, I didn't have these caves that the creeps came out of and left through. And I didn't like that because I didn't really know where these guys were going to come out from. And I could have taken the map into Photoshop and drawn an arrow or something on the ground to show where they're going to come out. But I also didn't like that they just came off the map and they walked over some of the rocks that I had on the left. So I did this trick. I mean, it's so simple to just drop a new button in there. So I just added this code here that says, you know, button name, enter, exit. I put their locations and they don't really do anything. They just reference a transparent P and G file. The transparencies got a little bit of shading so as the creeps come out there's kind of a shadow across them as they come out. For this game I don't even need this though. So I'm just going to go in here and take my caves and remove them. It's that simple. So we've got a pause button, a play button, and three speed buttons down here. The three speed buttons are all in one place. You can change your speed, you know, one time, two times normal speed, three times normal speed. So if you don't want to wait for things to come out, you don't have to sit and wait. Love the Pirates. These are our tower construction buttons. You can -- you'll -- I'll show you when I show you a map, XML file, that you can define how many of the towers that you have. You might have five towers in a game. But on your first map, you don't want to just spoil it by giving them all the towers, you just want to give them one or two towers. But if there are five towers in here, this is where you'll define them in your in game XML. And they're just laid out in a row. I've got my locations, my sizes. I tell it what graphic to use for the tower that's down there. And I also say what graphic to use if that tower is unavailable. So if there was -- if this tower wasn't available, there's another graphic that would show there instead. And that's it for in game XML. And you can see this is just the layout of the game play screen. So next I want to show you the -- a map. So this is one of the maps. You can see here we've got a map ID, which we'll use in some other XML files. And by the way, I don't have enough time to walk through all these XML files. There's a couple other ones that are very short, very simple to use. They're so simple that as developers you will probably open that up and know exactly what you're looking at just from looking at them. If that's not the case, though, I have a very long video on Channel 9 where I walk through all the different XML files and tell people, you know, here's the things that you can do to tweak these. So first here we've got a friendly -- a friendly name, mission two. And let me show you where that comes from. If I click new game, you'll see our maps right here. So I've got mission one, mission two. The titles that lay on top of these pictures, that comes from our friendly name. So I've got mission two, and I could change that to anything. I'm going to call this the Bellagio. You've got your starting cache. I'm going to give you $100 to start this map. You've got the background texture, which is just pulling from that map image that I have. The number of lives, focus color, the victory sound if you win the map, the defeat sound if you lose the map, a sound to play when the wave starts, when the next wave comes out, in case you're over building a tower and you didn't notice that you've got creeps coming out again. There's a little sound you can have it play when you start a wave. And the map start sound. So when a map loads for the first time and it starts playing, you can -- you can have that play. And let me click on this audio directory. You'll see these are just pulling the names for wave files that we have in here. So all you have to do is just drop your other sound in there and reference that name. Very simple. There is a function here called special cells. And special cells are just cells that are on this map that have some kind of special function. Mainly you'll have an entrance and an exit. And this is where the creeps are going to come in from and where they're going to exit through. And you can see I use the grid coordinates for the play grid. So it starts all the way over on the left five columns down, comes out there. It's going to try to leave all the way over on the right, five columns down. So it just tries to go right across the page. I'm going to add one extra entrance right here, just to show you what that would look like. And I'm going to call this one spawn two right there. >>: You lost me. >> Larry Larsen: Is it too difficult? Is it too difficult? Yeah, it is very difficult. I'm going to put in spawn two. That one's going to come out at the top of the screen. And I'm going to put in spawn three, which is going to come out at the bottom of the screen. And what we can do here -- we'll put this away say eight. What you can do here is you can have creeps that come in from different locations around the map. So if they think they're really slick and they're going to build some kind of maze that starts in one place, you completely destroy them by just mixing it up and throwing out creeps from other areas. So we'll look at the next one here. This is the allowed towers. And of course this is where we have the towers defined for this map. We specifically say we want people to be able to use the gun tower, and we want them to be able to upgrade it three times. And I'll show you where we have the upgrades for that gun tower. We want to be able to use a rocket tower. And the rocket of course will hit the flying things, so we want to be able to upgrade that three times. The next thing that we have here is the waives. And the waives, you see that I've got comments here? Just to make it really simple because when you're play testing you might get destroyed and you're like, awe, level 6 just completely wiped me out. That's where I have my big problem. And if you have comments telling you which wave you're o makes it much easier to jump down to it. So we've got five different types of creeps in this code simple. Land basic, land slow, and I think we have a land medium. And then we have two flying ones, a fast one and a slow one. So this creep is going to be a land basic. It's going to be a simple normal type of walking creep that's going to come in through the entrance spawn. And I'm actually going to change that to come in through spawn two. And it's going to try to leave through this exit. And of course that's the exit that I've got defined up here. And you can put in as many exits as you have room for. The number of creeps that we're going to come in, I'm just going to do -- let's just do two. And we want one second in between those two. Now, let's say, you know, two creeps on the first wave. That's not difficult enough. I wanted to have more creeps. So I'm just going to copy this, hit enter. Put in a new one. This is going to be land slow type of creeps, which is just a different type of ship. I want that to come in through the bottom. We're going to have two of them again. And that's fine. >> Clint Rutkas: Hey Larry? >> Larry Larsen: Yes. >> Clint Rutkas: On one line up at the end you have an extra slash. >> Larry Larsen: Sorry about that. So they're we've got two different types of creeps that are going to come through. And the other thing that I want to mention here is as you go on, people are going to be building more towers. They're going to be upgrading it. They're going to make their maze a lot more difficult for these creeps. And the creeps have a specific amount of health assigned to them. So one of the things that we've added here is a health modifier. And the health modifier takes the creep. So we'll say this land basic has 150 hit points. And let's say on wave four or five or six it's just too simple now because that I upgraded a lot of towers, they've built more mazes and things like that. So one of the things that you can do is go if here and say, you know, health modifier five. So now you have the health of that creep times five. You can put in, you know, 4.32 or you can use all kinds of different values, whatever you need, to make your game play good. And so now we'll go ahead and run this one. >>: [inaudible]. >> Larry Larsen: Yeah? >>: Is there a [inaudible] XML file [inaudible]. >>: [inaudible]. >>: Is there a schema for those XML files so that you can [inaudible] or verify them? >> Clint Rutkas: Probably not right now. >>: Okay. >> Larry Larsen: Send me an e-mail though, Larryla, and I'm collecting things for any kind of V2 that ->> Clint Rutkas: Yeah. And we have this on scripttd.codeplex.com if you want to file bugs and give us useful feedback. >>: [inaudible] send you a copy. >> Larry Larsen: That would be awesome. >> Clint Rutkas: That would be awesome. And because you're internal it makes our lives a lot easier as well. >> Larry Larsen: All right. So I'm going to play mission two. I'm going to stick a couple of random towers in a couple of different places here. I know I've got creeps coming out now at the top end, the bottom. Which it's not coming out at the top and the bottom. Of course. >>: [inaudible] mission two. >> Larry Larsen: Yeah, this is mission two. And we should know if it's going to work. Because this should say Bellagio right here, too, instead of mission two. >> Clint Rutkas: Larry? >> Larry Larsen: Yeah? >> Clint Rutkas: When you altered those files. >> Larry Larsen: Yes. >> Clint Rutkas: What directory were they in? >> Larry Larsen: Well, that's a good question here. >> Clint Rutkas: Because you want file open. So hover over XML 2. >> Larry Larsen: Yes. >> Clint Rutkas: So that's why. >> Larry Larsen: Yes. You open up the right project here. All right. >> Clint Rutkas: It always pays to have a developer in the room. [laughter]. >> Larry Larsen: Does make life faster, for me anyway. Any questions while we're waiting for this to run? >>: If you had like typed in an invalid [inaudible] do you get? [inaudible]. >>: Yeah. [inaudible] down at the bottom. >>: It will [inaudible] what you did wrong. >> Larry Larsen: All right. Let's try new game. [inaudible] that's not a good sign. >>: [inaudible]. When you reloaded the solution, it may have just [inaudible]. >>: Aye, aye, captain. >> Larry Larsen: Let me close these down here. I'm actually going to ->> Clint Rutkas: Hey, Larry? >> Larry Larsen: Yeah? >> Clint Rutkas: We're going to verify a hundred percent we're in the right directory. And was it data? >> Larry Larsen: Data, yeah, that's what I want. GUI. Make sure in game is the right one. >> Clint Rutkas: It was in the wrong directory, sorry. >> Larry Larsen: So I wanted to take this out and save that. I also want to open, make sure this is the right one. Hit exit out of here. >> Clint Rutkas: Okay. Go to the hit alt tab. Yeah. >> Larry Larsen: Okay. So I'm going to go to data, my maps, get my -- two. Just drag it here, correct? >> Clint Rutkas: Yeah. Higher. >> Larry Larsen: Higher? >> Clint Rutkas: Yeah. >> Larry Larsen: You can tell how much I've spent -- how much time I've actually spent in here. All right. So now I'm going to make my new entrance real quick. Boom, boom. Got spawn two, spawn three. Comes out at the top. Comes out at the bottom. >>: [inaudible]. >> Clint Rutkas: [inaudible]. >> Larry Larsen: Let me show you here. So I'm going to put in here -- I'll have one creep come out of each entrance. They're all going to leave through the same exit. You can see here I define where they come out. So this is the entrance. And this is where that creep's going to come out from. >> Clint Rutkas: So the give the perception of randomness you'd alter the time between them. >> Larry Larsen: And because the creeps move at different speeds, too, that's going to make a little bit of a difference there, so. All right. >> Clint Rutkas: So it wouldn't be fun if there wasn't some demo issues. [laughter]. >> Larry Larsen: Fun for you. >> Clint Rutkas: I mean, what do you -- he rebuilt the entire sample really quickly in under a minute. >> Larry Larsen: I'm going to go back two because I still have this name. But I'm going to call it Bellagio. >> Clint Rutkas: As it just launched. >> Larry Larsen: Yeah, it's fine. You'll be able to see here that we should have one creep that comes out top, middle and bottom. >>: Aye, aye captain. >> Larry Larsen: Yay. [applause]. >> Larry Larsen: And you can see there that I also got rid of my caves that they came out of. And you can add whatever other types of buttons that you want to on there. So I'm going to show you two other XML files here that are very simple to work with. I'm going to show you one that is going to be our gun tower, and I'm going to show you another one that's going to be one of our creeps, one of our enemies that comes out. So I'll grab that land basic that we used before. So this is a typical creep. And actually let's look at the tower first. So this is the tower. You can see that the ID that I give it here, gun, the type of weapon. We have five different types of weapons. So there's a laser that you can use, there's rockets. There's missiles which one is for the ground, one can be used for the air. We have an earthquake tower that radiates around it with -- as a weapon. And then you can see the variables that we set here. And this is one of the places where the game play balancing comes into effect. So you can see that I have a cost associated with this weapon, I have how long it takes to build. It takes three seconds to build. So you'll notice that, you know, when I was playing the towers don't automatically start firing as soon as you drop them on the screen. You have to wait a little bit which makes it kind of difficult because if you see that you're losing, you can't just quickly drag towers there. You might want to set that to zero though. I have the time to sell set to zero so that you get all your money back if you need to dump a tower really quick. And then you've got the damage. This is how many hit points that this tower or this particular tower is going to take away from a creep as it goes. You've got the amount of time it takes to reload. So you can set it up as a full auto machine gun or you can set it up as an artillery that takes a while for it to load. You've got min range, max range. And that just sets how far away, how many squares away that weapon can fire. And you're minimum range you might have like, you know, how a cannon can't lower its gun far enough to hit someone standing the right in front of it? It's that kind of thing. So you might have a weapon where you want it to launch things a lot ways away. It's better at hitting far away things than it is as hitting close things. So you can say, you know, I can't hit it if something's right up on that tower. We've got a texture that we set. And everything in this level element here is for just a standard tower that you drag out there. And you'll see here that we have another level right after it. This is going to be what the upgrade is. And we'll go over that in just a second. So we've got our shot speed. This is how fast something can shoot, how fast a projectile comes out. And you want to make sure that in your balancing you make sure that if you have a critical weapon that needs a hit -- a creep, that the weapon can shoot as fast as the creep runs. So that's something that takes a little bit of testing, make sure you get it right. I can set up that cannon so that it can shoot flying objects or it can't shoot flying objects. That's kind of an interesting one. Because you can really kind of throw people when they're playing. They might use all of one type of tower and then they have some flying element come out and they're like it's not shooting at any of them. You can also set in your upgrade that, you know, this cannon when it's upgraded it can hit a flying object. You've got your build sound which again is just a name of a wave file that's in your audio directory, your cell sound same thing. If I cell this thing it's going to do a ka-ching sound. And your upgrade sound so when you hit the upgrade button you get a little notifier there that's a good sound. And you're shot sound. I mean, this is the sound that it makes at various levels. Again, if you have a cannon that starts out as a small cannon you might want one sound, and if you upgrade that thing three or four times now it sounds like a Howitzer. >>: Do you have -- do you specify different textures or sounds for when it's in its unbuilt stage and it's built stage like [inaudible]. >> Larry Larsen: Well, this first element that I'm looking at here is kind of its unbuilt state. It's the state that it's in when you first drag a tower off the bottom and drop it on to the play screen. So you can define all of these different elements for that. And then the first time that I click the upgrade button and you can see here it costs a little bit more money to upgrade ->> Clint Rutkas: So I think you're asking for an animation. >>: Well, not necessarily an animation, just like when you first drag it on and it has no stats at all, can't fire at all. >> Clint Rutkas: So we have a [inaudible] bar right now that [inaudible] a create state? >> Larry Larsen: Yeah. I mean, when you first drop it on, you might have a loading bar. Of course you can set that by the time to build. But if you have your time to build set to zero, when you drag it out there, it's ready to go. >> Clint Rutkas: That's a good idea. That's a good idea. Yeah. >>: [inaudible]. >> Clint Rutkas: So like a building image. So [inaudible] versus the [inaudible] bar has a different image? >>: Yeah. >> Larry Larsen: Interesting. Yeah. I mean, send it on to me, and we'll put it on the list. So this is our level two. You can see that I've increased the amount of money that it costs. I've increased the damage that it causes to the creeps. I've taken down the time to build because an upgrade in my opinion shouldn't take as long to build as a brand new tower. I've extended the range a little bit so upgrading this is going to extend the range. I've changed the texture so that someone will know just by looking at it that this tower is a little bit more powerful than the stock one. You can change your shot speed, flying, land. You can see now that we've upgraded this it can hit flying objects. And of course you can have all different sounds. You can have as many different levels as you want in here. So you can of it just keep upgrading. I only have three in the gun XML but, you know, you can just go in and put three, four, five, however many you need. This is our creep ID. So this is a typical land basic. And let me fan the land base. I'm going to grab flier fast. All right. So flier fast you say can it fly? Is this a flying object? The difference -- the main difference between the flying creeps and the land-based creeps, the land-based ones have to go through your maze. The flying ones go from A to B. So they're going to go right over anything you've built. So you need to account for that as a player. You tell it how fast it goes. This is our faster one, so it goes at a two speed. You tell it how many hit points you have. Of course this is going to change, depending on your health modifier at the beginning of each wave. This is the worth. So if I kill this creep, I'm going to get one dollar. I've got the texture that I used for this, and I've got the death sound and the spawn sound for it. So very simple. And the developer for this project, Michael Quant [phonetic], wrote a comprehensive article on if you want to change the parameters of a tower, if you want to add new towers, it's very simple to do. You can just kind of copy from what we've got in there. >>: [inaudible] damage of sorts [inaudible] only you're [inaudible]. >> Clint Rutkas: Yeah. So like the core goal of the engine was, there's two types of power defense games, path following and then I'll go A to B would be -or like here's your entrance, here's your exit. And then it figures out the route. So we tried to design the engine to do both. Doing the path finding, there's one issue we have to resolve. But it's -- this was our first wave. And I -- I mean, I'm pretty proud of it for what we've -- what we produced. So -- and the fact that Larry was able to do -- Larry built all the maps for it, and that, to me, was like someone can do this that doesn't know how -- you know, tons of programming background. >> Larry Larsen: It was -- I mean, I'm pretty good with Photoshop, and it was extremely simple to go through and make a bunch of new maps. So one of the things that I want to mention here are special cells. There's a third special cell that don't actually use here. But I want to talk about the type of tower defense game that he's talking about. Some of the tower defense games, all the creeps pour in, and they go wherever they need to go to get through the map, get to the other side. There's other games like creeps HD on the iPad or geoDefense on Windows Phone. And a those follow a specific path. We have a special cell. The type is called obstacle. And this means that you can set up a wall. And so on your Photoshop file you might have like, you know, a pile of bricks in the middle of the screen or a pile of rocks or a mountain or something like that. You can set up obstacles on the map that you don't actually see but the creeps will have to go around that like there's something there. One of the things that you can do with those obstacles is you can create your own path that the creeps have to follow. And then they have to go in between those obstacles all the way from A to B. And this makes what I call an on-rails type of tower defense game, so all the creeps have to follow this specific path. The problem that we have with that is right now we've got it where you can't drop a tower on top of one of those obstacles. So I've asked them to make a property that says you can or you can't actually build on those obstacles. Question? >>: Can you have a square which is -- creeps can walk there but you can't build them? >> Larry Larsen: Well, that would be one of the properties of the obstacle. Of course you would need to be able to set that there where you say, you know, you can't build a tower he or you can build a tower here. Creeps can [inaudible]. >> Clint Rutkas: Yeah. Instead of just saying can build it would be had two properties for that maybe. >> Larry Larsen: Yeah. >> Clint Rutkas: Or an [inaudible]. >> Larry Larsen: Yeah. Can build, can walk, can creep. That kind of thing. Other questions? I'm already over. Yes? >> Clint Rutkas: We're in Q and A now. No, no, sorry. >>: [inaudible] a version of this on the Marketplace? >> Larry Larsen: Yes. >>: [inaudible] called? >> Larry Larsen: Script TV. >>: Oh, it's just Script TV. I thought it had a different name. >> Larry Larsen: Yeah if you ->> Clint Rutkas: We're clever. >> Larry Larsen: If you go to -- and I call it scripted or script TV, whichever you prefer. But if you go to scripttd.codeplex.com you'll find there's a -- yes? >> Clint Rutkas: Pull it up. >> Larry Larsen: Yes. >>: So before they end the broadcast, Clint, there were a few questions that we had online for you. Some people remotely. >> Clint Rutkas: Okay. >>: Did somebody say that they downloaded the kit and they tried doing it with the 7.1 project on the phone. >> Clint Rutkas: Yes. >>: And they tried the message prompt but it doesn't work. >> Clint Rutkas: Are they using beta 2? I don't know. >>: As far as you know message prompt should work? >> Clint Rutkas: As far as I know. See, I'm finding more and more people are trying to do more clever things like with MBVM they'll have something in regards of I have my page, I navigate away but there is an async call on page 2 that then the new page takes, and it's -- they're doing stuff that I never accounted for, such as that. I would attest to my knowledge that works. >>: [inaudible] in beta 2? >> Clint Rutkas: This is beta -- I believe this is -- so that is beta 2 tooling I believe. I believe. >>: Actually they just clarified he's using beta 1 tools. >> Clint Rutkas: I would tell him -- he's what version? Is this like he just got the latest? I know I'm projecting all my questions towards you. >>: Yeah, well ->> Clint Rutkas: So the viewer ->>: Beta 1 is not [inaudible] beta 2. So you mean today we ruled out beta 3. >> Clint Rutkas: Yeah. So -- so my -- since my screen is up -- whoops. E-mail Crutkas and I will -- and give me as much tail. Because this emulator is -- the emulator in the back is running I believe beta 2 tooling, and it should work. So if there is a bug, I want to get it squashed as fast as possible. And actually one thing I am doing right now is overhauling the prompt system. So this is actually my -- one of my test apps to prove that it works is -- so this is using the built-in popup. The reason why my system right now doesn't use the popup is because in Windows Phone 7.0, the popup is not GPU accelerated, so that image back there would not show up. If you dynamically -- if your parent page did not have it in, it would not show up, which made a very bad user experience. And because it wasn't GPU accelerated, can do cool stuff with it, so now Mango that's fixed, so now I have to redo one have the core objects in my prompt library to leverage that. And that's something I am looking for. But why that does not work, I do not know. One question. Does they have the Silverlight toolkit installed? >>: Yes. >> Clint Rutkas: Then I don't know. >>: Okay. >> Clint Rutkas: I would say if he could send me a repo. >>: He could just e-mail you with that. >> Clint Rutkas: Yeah. >>: There was another question around is there a popup menu available? >> Clint Rutkas: Menu? No. Because that's not metro. I would say use the Silverlight toolkit has a -- the dropdown control that's in the settings dialog. So there's two different types of menu systems. You have the one that kind of like a combo box, but it pushes everything down. But if there's too many objects, then it goes into the kind of like long list and you select it. So like time zones does that. Those -- that to me is kind of how that works. I don't -- metro styling, I don't see a need for in the phone to have a menu system. >>: Okay. >> Clint Rutkas: Is -- would be my argument. Because I'm afraid of the designers coming down to my office. So I kind of view it as system level controls is kind of what I'm doing my best to build at. >>: Okay. There's a request for version 2 of the script TD, support for global leader boards. >> Clint Rutkas: See, the problem with that is that requires infrastructure. >>: [inaudible]. >> Clint Rutkas: Can I talk about the thing that we're ruling out on 9, or no? >> Larry Larsen: I have no problem ->> Clint Rutkas: You know, so now we have to go to mobster talk here. >>: [inaudible] this isn't going to be [inaudible]. >> Clint Rutkas: Yeah, I know, we can't. Okay. Sorry. >>: So one question might be for -- since I'm sure you know the Hawaii team, if they have anything in their roadmap around leader boards or anything like that for Hawaii. That would be something ->> Clint Rutkas: So when this gets turned off, yeah. >>: [inaudible]. >> Larry Larsen: I do want to show you one other quick thing too. This is the mission select maps here. One really quick thing here because I just show one map per screen. You might want to have four maps on the screen, five maps. It's extremely simple here. You have a button. This is in the level select XML. I'm going to put a second one in here. All you have to do is tell it, you know, I want a second level here, and I want to have its location. I'm going to put this one X, Y -- I'm going to put this one at five percent down. I'm going to put this one at 75 percent down. And I want them to be 25 percent of the size that they are normally instead of 50. And I'm going to stop this and just restart it. And let me show you what this does. The level select screen here works like a template. And no matter how many levels you have, they'll always flow into that. And it will create as many right and left buttons as you need to go through all the different screens of your map. So when I go in here now there should be two -- two maps shown on that screen. >>: [inaudible] not available to [inaudible]. >> Larry Larsen: Yes. Yes. And I'll show that you while this loads here too real quick. There's level select. I don't remember where that is off the top of my head. But in your -- in your main screen when you say this is how many maps I have total in the game, there's a value called prerequisite. And you say this is the map that's the prerequisite for the map before it. And it's a very simple way. I've got it in the video that you can watch. And so the placement isn't great, the size can't great, but you can see here I still have these five maps that come with this game. But I've changed how many show occupy this screen. So again, not a programmer, extremely simple to do. And you can have a lot of variation what the game looks like. Any other questions? Yeah? >>: So people can take the code, XML [inaudible] service code too, right? >> Larry Larsen: Yes. Everything's full source. >>: All right. >> Clint Rutkas: Now, if there is a bug or something, please tell us because we want it -- our goal is to make it so there's like eight bajillion apps in Marketplace. So this is like -- so just like the current [inaudible] toolkit is all about like Silverlight controls, this is all about tower defense engines and just trying to do the best we could. >>: I noticed when you download from this site that it also has windows projects. >> Clint Rutkas: That is due to how XMA has to be loaded on the phone. At least to my knowledge. I'm more of a Silverlight guy. But yeah, even -- I asked the XMA team, and they said that is correct how it is. You have to have -- I think it's to built the content correct you need a Windows project. There is some reason why you feed that. >>: The content pipeline is actually ->> Clint Rutkas: The content pipeline. There we go. Yeah. Yeah. We need that to be able to build the project. There is a couple bugs in it that codewise that I want resolved. Like we almost had the content and the content pipeline fully broken so you can alter stuff and not have to go through a long build process. It's not a hundred percent there yet. So it was either launch or don't launch. And I opted for launching. Cool. Any other questions? >> Ben Lower: All right. Thanks, guys. [applause]