Here's a text file named people.txt with a list of names. We're going to write a program that reads in the names, puts them into a last name first form, and writes them out to a new file. This program will need two files, one for input, file in file is a new file based on people.txt as the path, and file out file, which is a new file whose name is switchedpeople.txt. As we've done before, we need to create a scanner for our input file inside a try catch. Our scanner input will be a new scanner based on in file, and we'll catch file not found exception if there's an error. We'll print out the exceptions message. For output, we're going to need a new class called printwriter. We're going to create a printwriter named output, and it will be a new printwriter based on our output file. Creating a printwriter will also throw a file not found exception in case of error. That means we don't have to have another catch block. Here's a loop for reading the input. As long as the input has more data available, we're going to read one line at a time by using the next line method on our input scanner. We'll create a string array called name parts, which will become the result of taking the line and splitting it on blanks. The new name will be the second name on the line, which is name parts sub one, a comma and a blank, and the person's first name, which was the first item on the line. Instead of doing system.out.print line to have output go to the screen, we're going to use the printwriter's write method. We'll have output.write new name. The write method, just like system.out.print, doesn't add a new line when it writes. If you want new lines in the file, and we do, you have to add them yourself. After the loop is finished, we'll close the input file, and, this is ultra important, we have to close the output file as well. Why? Because disks are slow compared to the CPU. Instead of writing data immediately to the disk every time a program has something to write, Java maintains a buffer of data, and fills it up as you write to the printwriter. When the buffer is full, it writes all of that data to the disk. The printwriter's close method makes sure that all the data in the buffer gets written to disk, even if the buffer isn't full yet. Let's compile the program, and let's run it. There's no output to the screen, because all of our output has gone to a file. Let's open switchedpeople.txt, and here are the original names, and the names in lastNameFirstForm. What happens if we add a couple of names to our original list? Let's add Arturo Toscanini, and Neal Sadaka. Save that, and we'll run the program again. This time, the file switchedpeople.txt already exists. The old version of the file is removed, and a completely new file with the same name is created. If I come here, it'll say, the file switchedpeople.txt on the disk is more recent than the current buffer. Do you want to reload it? And when I reload it, there are Arturo and Neal in lastNameFirstFormat. Because opening a printwriter will wipe out an existing file, this is a place where you can use file.exists if you don't want users to overwrite a file that has already been created. One additional note. This program will crash if you add a blank line somewhere in the middle, or if you have someone with only one name, and it'll give incorrect results if you have somebody with more than two names. You might want to try fixing the program to solve these problems. The link in the video description will show you both this program and the solution. In summary, to write to a file, open a printwriter that's based on some file object. Use the write method to write output to the disk file. If you want new lines in your output, you have to put them there yourself. And always be sure to close your printwriter before your program ends.


Hello, hello, hello, hello. Lo, lo, lo, lo, lo, lo. Lo, lo, lo, lo, lo. Lo, lo, lo, lo, lo. It's time to begin! I'm Rick, Facebook, Instagram, Twitter, and more juicy content. Thank you very much for those of you on Patreon and follow us!專gili socialетуcompeThey're on Twitter! Today we have a video that's called What is Unique about Hyderabadi Breani? Am I right? What is unique? What is unique about it? Because actually your first thing, you hear Breani, I've been told now, and so I know that when everybody, anybody thinks of Breani, Hyderabadi Breani is the most famous. Is the most famous and supposed to be the best. The best? We wouldn't know. We have not had Hyderabadi Breani in terms of in Hyderabadi, and I feel like you can't call, that's like being like somewhere in LA has like New York sliced pizza, doesn't mean you've actually had a New York sliced pizza even if they're from New York. Correct. That would be absolutely correct. So even if it says Hyderabadi Breani, doesn't mean it's Hyderabadi Breani. Exactly. Here we go. Looks delicious. Are you a Breani lover? Yes. If so, this one might interest you. It does. When you think about Breani, the first kind that comes to mind is the Hyderabadi Breani. Every day, a minimum of three lakh dinner plates of Breani are cooked and consumed in Hyderabadi. Its flavor and aroma are a combination of the quality of ingredients, the cooking method and the experienced hand of the Kanzama. Thank you for that. The Hyderabadi kind is ubiquitous, such that the Food Delivery app's Wiggy said it delivered 3.5 lakh Breannis on New Year's Eve in 2022 to 2023 across the country with 75.4% of consumers choosing Hyderabadi Breani. The Persian word Brean means fried or roasted. There should be more. Fried or roasted. The Hyderabadi Breani refers to parts of the meat at the bottom of the vessel that gets partially roasted due to high heat. So what makes the Hyderabadi Breani special? We don't know. Though there is no standard way of making Hyderabadi Breani, typically it is cooked in a Deg or a vessel that has a wide bottom and a tapering top so it can be sealed after the layers of rice are added. So cooking happens on dum or the steam generated inside the pot. Giving charcoal is heat on top of the sealed vessel for even cooking. Raw marinated meat and rice are cooked together to create the final product called the Kachar Ghost Ki Biryani or Red Mutton Biryani. When the ingredients are cooked separately and mixed it is called Pakki Biryani. There are choices in meat cuts like Nalli, Marrow Bone or Ran, Kali and Sardine's Cookies Channel. But the aroma and fragrance remain talking points, the key ingredient is the quantity of meat. Though the commercial biryanis have a rise to a proportion of 80 to 20, most wedding biryanis tweak it to 60 to 40 thereby improving the quality. True Hyderabadi Shadi ki Biryani uses 1.5 kg of mutton to a kilo of rice. The marinate comprises cumin, cinnamon, cloves, ginger-garlic paste, green chillies, curd, milk, lemon juice and fried onions. The marination time between 4 and 6 hours is something restaurants cannot do as they are dealing with large quantities that has been served quickly. While there is no standard Hyderabadi Biryani, leading caterers in the city say that the Dawati Pakkwan or traditional Shadi ki Biryani is the true Hyderabadi Biryani. That looks so good. Bottle rice. My wife would be thrilled. I've actually made it on my channel. I'm pretty sure it was Hyderabadi Biryani. Let me know if that's correct. But once again, I'm not saying I've had Hyderabadi Biryani but I'm pretty sure that's what somebody sent me and it takes so long. I bet it. Did you do the full 4 to 6 marinade thing? It took an hour. What did you use for the meat? Because my suspicion was you could get mutton. It's just not easily acquired. You have to go to a specialty shop to acquire it at grocery stores. Actually you know where I think you could get it now. I'm 99.9% set. So if you want to get it, there's a Bengali store that's close to us that we've frequented and I promise they've got it. They have a giant meat locker with frozen meats hanging. And I would not surprise me one bit. We haven't bought it. We've bought fish that's straight from the waters of West Bengal. And they're frozen obviously. But it would not surprise me if they have mutton at that meat market. I feel like a lot of people from different cities that will move and open restaurants highly favor it being the water from their place that makes the dishes so unique. That's the thing with New York bagels and hot dogs and pizza. There's something in the water. They import the water from New York. I guess that makes sense because obviously a lot of things marinate or soaked in water and so different places have different minerals and different things. Like for example, there's a coffee. I wish I could get it. It's just so expensive to get because it's when we were in Papua New Guinea 20 something years ago, there's coffee there that's grown in Papua New Guinea that tastes unlike any and I've had other beans that they claim are from Papua New Guinea. This particular local region that grows them in the mountains has a particular flavor, but it costs like $20 for a small bag to get it shipped from Papua New Guinea. I wish I had the money to do that and support that local grower there because it's the most interesting, beautiful flavor and it's regional. So even my suspicion is that like most things, even if you make it here in the states, it's not going to be exactly the same if you got it in Hyderabad. You know, absolutely. Yeah. Anyways, I'm very hungry. Yeah. Yeah. So yeah, if there's other food videos, if this was wrong, let us know because we don't have any idea. People screaming, banging on the computers right now. This is not Hyderabad. Let us know what other videos are going to react to down below.


Okay, so I'm going to talk to you about Battle Force North, which is a turn-based strategy game that has been developed by a large community of users and contributors and developers. It's a hex-based game in a traditional war game format, but it has some differences. It's simplified, so it doesn't take hours and hours to play. You can play a pretty decent game of it in an hour or two. It has a lot of role-playing style elements. It borrowed a lot from the sort of tripple runs on a greatest part. We're hoping that once Apple releases their SDK, we might get it working on the iPhone and iPod Touch. It's also very customizable. It's very moddable. We've worked very hard on making the basic game engine, which was originally developed just for one specific storyline and one specific concept, but we've worked very hard on extending it to work with a lot of different game concepts that stretch far beyond the original vision of that. So what's so special about it? We have a very large developer and player community, at least relative to other typical games. We have thousands and thousands of users. WebNOS has been downloaded more than a million times. It's also been distributed many times with different magazines. It has distributions for many Linux distributions, such as Debian and Ubuntu and Gen2. It's a very mature project. It's already reached a stage where it can run very stably. It has a lot of features. It's got a very rich feature set so that it's not just a very basic simple game, but it has network multiplayer, it has the interview replays, it has a very large wide tool set that many contributors have developed for it. It's also got very high quality artwork relative to other games. It has very good graphics, very good music. We have a sub-community of artists who work hard to improve their own artistic skills and to contribute to WebNOS. It's also very well balanced out. We have another sub-community who is very interested in making sure that WebNOS has a very balanced gameplay, and they work continuously to tweak every element of the game. We use a variety of technologies in WebNOS to make everything work. The main game engine is programmed in C++. We use an affiliate advanced C++ style. We use the STL, so vectors and maps and the standard STL algorithms. We use a little boost has been creeping in, which if anyone doesn't know, boost is an advanced C++ library which is designed to experiment with more advanced C++ features that might be candidates for future standardization efforts in C++. We do all of our graphics and sounds using the simple direct media layer, or STL. That's a basic library which allows one to give access to a simple frame-buffer and events interface, and it comes with a host of other libraries which we use such as STLNet, which we use for networking, STLTTF, which gives us true type font support, and STLImage, which allows us to load images in a variety of formats, such as PNG is the main image format we use. These libraries give us the same interface across all the platforms that we run on. That credit should be given to the STL for allowing us to run on Windows, Mac, Linux, and many other platforms. We've noticed it's internationalizable, you can get text, and that's enabled it to be translated into 40 different languages. We also use Python just a little bit to allow for AIs to be scriptable in Python. This wasn't originally planned, but it was out of later, and our use of Python is fairly limited, but we use it here. We also use both Python and Perl to produce many scripts and tools, which we used to facilitate development. We do tend to avoid too many dependencies. Most web-noth technology is fairly homegrown. We don't even use, for instance, XML. We've developed our own format for sharing data, and this has been controversial how much technology we've homegrown, a lot of contributors complain that we reinvent the wheel too much, but on the other hand, we've had a lot of problems even with the dependencies that we do use, and so we're generally very resistant to adding new dependencies because we feel it increases the number of bugs that we could introduce, which we don't have close control of. Web-noth has a very large and vibrant community. Probably the biggest area the community is in a web forum we have, and that's where users tend to communicate, users tend to get help with bugs and so forth. This is a little different to traditional open-source projects in that we don't use a mailing list. However, we've found that it makes it very accessible to users. We use a PHPBB-based forum, which unfortunately is a reasonable forum, but we've found it has a lot of maintenance effort associated with it, and we've gone through several different developers who have been responsible for maintaining the forum and keeping up-to-date with security patches and have all gotten frustrated and left one up to the other. So if anyone wants to maintain a PHPBB forum, please let me know. Then the main place probably that developers communicate is on IRC. We find that IRC is very useful because often if someone posts on a mailing list or a forum, people find the person mildly interesting but aren't interested enough to respond, and responses only occur if someone usually strongly disagrees with something in the email or forum post. Well, an IRC channel has the disadvantage that one of time zones, that one may have a question and other people aren't there, but it has the advantage that people feel it's a lot more casual. They can communicate in real time and so forth. So most of that development takes place on WebNOS Dev on IRC.frino.net and some of the other WebNOS channels I was here. We also do have a developer mailing list, and this is sometimes used for more serious or perhaps even controversial discussions and for big announcements and so forth. And we also have a bug tracking system which we use quite extensively, which we point somewhere to if they have a bug to file. So what's so hard about making a free game? There's several things we found which do make it hard to make a free game. There are actually, unfortunately, very few really good quality free games out there, especially compared to commercial game development. So I've listed a few points here that I think make it very hard to make a free game. For instance, with most open source projects, it's often at least reasonably clear which direction the project should go in. But with a game project, one can take it in almost any direction. And we constantly get users or contributors who want to take WebNOS in a completely different direction and who think that it should go in a, it should become something different. And we even sometimes get some very good contributors who might contribute some very good art or some very good code. But in part of their contribution, they want to take WebNOS in a very different direction to where it is now. And sometimes we find that we have to be kind of resistant to that. Sometimes we have to discuss things in great ways to decide where to take the game. Also, with a game project, there's no real ending. A game can be improved indefinitely. It can be improved forever. There's no, it's difficult to ever say that a certain feature is complete. And it's always very subjective. To one person, some gameplay might be completing great and to another person it might be horrible. A very big example of this is WebNOS uses random numbers quite heavily to resolve combat. And some people love this because they think it gives them a chance to analyze all the different probabilities. Well, some people hate it and think that WebNOS should become a lot more deterministic. And also, to make a game, you have to master many different areas. You have to have people who can be technically excellent. And I think many people underestimate how difficult it is to program a game. And you also have to have excellent artists who can draw good graphics to make your game look appealing, although some games do try to go without that, like Nethack. And you also have to have good game design. It's very possible to develop excellent graphics and even to have a very good engine and have very poor game design. And of course, you have to have play testing. You have to spend a lot of time tweaking the game and doing a lot of argue this work there. So how do all the games? So in 2003, I was at a very boring job and I wanted to do some programming on the side that I would find more interesting. And the reason I learned to program in the first place was actually when I was about 14, I really wanted to make a game. And I tried to make a game and all my attempts were pretty much miserable failures. But I did actually at least decide I liked programming and ended up going to university and studying there. And then, so finally many years later, I was 23. And I decided that why don't I go back and develop a game? And I had noticed that all my previous game projects, I had tried to look at commercial games at the time and say, I'm gonna make a game like that. And I realized that that was really unfeasible, especially by 2003. The many millions of dollars that were poured into a typical commercial game would be very difficult for a single developer. And at this stage, I wasn't counting on any help with the project at all. To match. So I decided that what I would do would be to go and find some old games that I enjoyed when I was much younger and try to make a game that used some of the same concepts. But it definitely wouldn't be a clone of the game, it would be something new. And I figured that if people could make on Genesis and Super Nintendo systems could write in assembly and cram into a couple of megabits a game, I should be able to do something the same or better using C++, using many megabytes of memory and so forth. So I remember a few Genesis games I had enjoyed when I was younger. One was War Song, the other one was Master of Monsters. And I played them a little and I used some of the game concepts to make a very simple Hex War game. And I released it as Battle for Weasel North 0.1. And I didn't really think that much would come of it. But then things got going when just a few weeks after I released it. Francisco Munoz, who's a Spanish developer, he saw it and he liked it. And he sent me some improved artwork for it. And I'm a horrible artist, so the initial version of the game was looked terrible, but and his improvements were a relatively small iteration, but they at least gave me the confidence to release further versions. So I worked with Francisco for a couple of months and then eventually we were getting more interest from other people who sent us emails and said that they liked the game. So we decided to set up a web-based forum and from there a community began forming. It actually took us probably six months before we actually started the CVS repository instead of just shoving tables around, but we did eventually do that. So the Weasel North engine now contained about 90,000 non-blank lines of C++, so it's a medium-sized project. And like I said earlier, it uses a very modern style of C++ and we use a common C++ technique called resource acquisition is initialization, or RAII, which to anyone who doesn't know basically means that instead of, say we wanted to allocate some memory and then we wanted to operate on the memory and then we wanted to free the memory. Instead of doing that straight in code, we would manage the memory with an object that would delete it in its, in its destructor and the C++ language guarantees that behavior. So because of that, there's generally been very few memory leaks in Weasel North over its history. And like I said, we have very few dependencies. We try to program as many things as possible and the engine includes an AI. It includes a parser for our WML language. It contains a random map generator. It contains, we haven't used any third-party theme or widget engine. So we have buttons. We have list objects. We have dialogue objects, all those things we've programmed ourselves. And of course, it has support for all the game objects. So there have been a few problems with Weasel North's design that we've found over the years. One of the problems is that we use SDL, which is probably our only real option for developing a portable game along with perhaps OpenGL. And we have looked at replacing large parts of SDL with OpenGL. However, the problem with OpenGL is that many open platforms still do not have good OpenGL drivers. Also, Weasel North runs on many lower-end machines and many of our users rely heavily on it, running on lower-end machines and are very thankful that it's a quality game that will run even, I think there are some people who have told me they use it on a 486. So if we used OpenGL, all those users would go away. The problems with SDL are that it has a very basic API and there's very little further development on it. I think the lead developer now works for Blizzard and seems pretty vivid in his main job on World of Warcraft or whatever. So there's not that much support for it and worse, it doesn't have very many features. For instance, in SDL, it's difficult to even flip an image in real time. So when we want to store images that must be displayed either left or right-facing, such as a unit image, we will generally have to store both the left-facing and the right-facing version in memory, which blows up our memory footprint pretty heavily. And also, for instance, in this image we see here, we'll see that we have a unit and is trying to move somewhere and the areas that it can't move are displayed with every other line is displayed in black. Now, originally this was coded differently so that the area that the unit can't move to would be displayed in gray. And in my opinion, that looked significantly better, but the problem is that grayscaling an image in real time with SDL wasn't really feedable, so instead we would have to cache a grayscale version of the image as well as a color version and that of course blew up the memory footprint again. So eventually we replaced it with this display, which I think looks a lot worse. Also, the other SDL library, such as SDL-TTF and SDL-NET, we feel even like, SDL is reasonable, but SDL-NET especially, we really don't think is production quality and we'll probably look at replacing it eventually. SDL-TTF, we found a very serious memory leak at one point and it was making Wesnils constantly run out of memory on most machines, so we had to pull in the whole of SDL-TTF into our code base and fix the bug and then ship it with our code until the bug, until the fix to SDL-TTF was widely distributed. And so because of these problems, the major outcome is that Wesnils is sometimes slow, it's also sometimes slow simply because high speed hasn't really been a design consideration. We consider either views, we consider it being very, very flexible and mottable to be a higher priority than it being efficient and usable in memory. Okay, so Wesnils also runs over a network. You can play against another player, you can play a team game, you can play like a cooperative game against the AI, you can play a combination, you can also observe games and so forth. It wasn't originally designed to be networked. When I first developed it, I figured it would always just run on a local machine because I was just developing a very primitive game that I intended only to be playing as to the AI. And also originally saves could only take place at the end of the scenario. So the beginning of networking was when people started complaining to me that you could only save the game at the end of a scenario. I originally thought that was a good feature because it made the game more challenging, you couldn't just save and then you didn't like your combat results so you reload the game, but people still complained about it. So I decided that I would implement saves as the start of scenarios save plus the deltas to record every move you had made and that would be the save. And this also allowed for a replay of a game to be stored because you could use all the deltas to show a replay. And likewise, it also allowed you to just send the deltas of the network to implement network multiplayer. So if it's my turn, I would play and then the move I make would be sent to the other players and then those would be played out on the other machine display. And the implication of this and largely because Blaznos wasn't originally designed to be networked, we have you generally play through a server. But the server is very thin and dumb. It basically does very little except forward data from one player to another. It doesn't inspect the data, it doesn't understand anything about whether it's logic or game engine or anything like that. This has the advantage of also allowing a very efficient server. You can have hundreds of people connected to a single server and playing games and so we don't need a meta server or anything like that. However, people playing against each other must have the same version and the same version of the data. If they modify their version of the game so that their Elvish fighter has 50 hit points instead of 30, then your version won't, we'll expect their Elvish fighter to be dead and their version won't and then the game will report the game that out of sync as others call it. And we generally, the server will make a check to see that you're using the same version as everyone else on the server. So we generally minimize problems by just saying that everyone using say version 1.3.2 has to be on this server. And this means that for anyone who can modify the source code, cheating is very easy because you can cheat to, if there's anything that you're not meant to know about, if you're playing with, say, fog of war, that's where you can't see the area of outside of a certain range of your units, you could cheat by just modifying the source so that you could see that. You could cheat to make the random number generator, generate numbers that are very favorable to you and hope that your opponent doesn't notice. Fortunately, we found that most people who want to cheat aren't really capable enough of modifying the source code. So, so far at least this hasn't been a problem. The most common form of cheating is people who think that modifying it so that their Elvish fighter has 100 hit points will go unnoticed and that the game will very quickly run out. So, since we developed networking, so originally the focus of Wethnoth was on campaigns on the single player mode, then we developed networking, but we didn't originally put too much effort into multiplayer. But eventually a community has sprung up of people who much more interested in multiplayer than myself and the first few developers were. And many of these people were originally just players who played for countless hours and enjoyed it, but found that the game was unbalanced for one reason or another because the game originally was designed for a specific campaign where you're the player who controls humans and elves and you fight against orcs and evil humans and undead and so forth. And because of that, it was, balancing it out didn't matter very much. All that really mattered was that each scenario was fun. It didn't really matter if some evil orcish assassin could always kill the dwarves because if you were the player you didn't just use dwarves against them or whatever. But when people started playing multiplayer, they noticed that for instance, hey, if I'm dwarves and the other player is Drakes, I have no chance of winning on this map.  So these players started submitting patches to try to improve the balance. And they've now gotten to a stage where it is actually very finely tuned and we now have six different sides or factions that you can choose when you're playing. And we have about, I think a dozen maps that are all finely tuned so that pretty much any combination of factions and any combination of any of our official maps you'll find is a very balanced game. And we often get new players who pop up especially on the forums and say, you know, if I play dwarves, I can never beat Drakes on this map, it's so unfair. And then we usually refer them to one of our best players who will usually very convincingly beat them with dwarves as the Drakes. Um, so, like I've mentioned, Weznoth uses, Weznoth markup language for all of its configuration. We try to put as much and make the game as configurable as possible. So all everything, like unit settings, to themes, to all campaigns, everything is stored in Weznoth markup language. So it's a simple XML language. It was originally just meant to be a very basic flat config file that just had headings in square brackets and then name value pairs. But it evolved to support child nodes and then to support a lot of many farmer complex features. It also has internationalization support built in so that in WML you just have to proceed something with an underscore and then that string will automatically become a translatable string. And WML is also used as a save game format and the network protocol format. We also have a binary version of it so that we can use that for the network and if people want smaller and faster saves. And that's an example of XML. The XML doesn't really have a good binary standard. It also has a pre-processor to make things easier. And that's very similar to the C pre-processor. So you can hash to find something with some arguments and then make it equal to a block of text. And that saves you, it reduces the velocity really. And yeah, it's evolved greatly over time. It still evolves and it's very flexible in it. If someone requests a new feature and this is very common for like if a campaign designer comes and says I want my, this AI unit in this particular map to follow, like I want him to go for this village because that village is the village that has the princess in it, according to the storyline. Then we can add very easily a new WML attribute which says go for village or something and add it to the unit. Wetnose also has a map editor. And the map editor reuses much of Wetnose code. It reuses all the hex rendering code and so forth. And so it allows very easy and advanced creation of maps. You have a lot of typical features you might expect in a paint type program. So you can have different size brushes. You can use it to generate a random map with certain settings to give you a starting point and it allows flipping of areas and so forth. It's just a map editor. It doesn't support any scenarios. So you can't put units on it in the map editor. You can't control how the AI moves or anything like that. Generally what you do is you take the output of your map and then you put that in a scenario. And you can use that from there. Wetnose is also a very complex problem for an AI. It has a huge state space. Just as an example, if you have just four units that are in range of four enemy units, the number of possible ways to attack, like you could get all four of your units to attack one of the enemy units and then all the different directions from which you can attack.  Can I protect him and so forth? So there's many millions and millions of possible outcomes in any situation which makes it very difficult for an AI. So the default C++ AI has been a lot of work has gone into it to make it as good as possible but even then it's very difficult to make an AI that's competitive of the best players. Still the C++ AI very heavily concentrates on trying to come up with the best possible outcome on the current turn. So for instance, if you put one of your units in a situation where the AI might be able to kill it if it used five of its units against it and your unit was a valuable unit the AI is very good at calculating yeah I have a 90% chance of killing that unit. And originally I actually programmed the AI to do probabilistic outcomes based on a it would run a simulation of a battle 30 times and say 70% of the time this is what happened when I ran a simulation. But then a developer, Rusty Russell who's a fairly well-known Linux kernel developer he joined the West North team and he programmed a much more sophisticated algorithm which actually mathematically analyzes the probabilities and surprisingly quickly comes up with all the possible results of the battle how much damage will be done on average and what's your chance to kill the enemy. And okay, next one. Yeah, is this working? Okay, so there's also support that's been made to write AI's in Python and a Python AI will have full access to all of the game state in West Northern and then we'll make decisions about how the AI is. And there have been several attempts to write AI's in Python and some of them are quite good. It's also good for scenario designer if they want specific behavior in a certain scenario they can add that to the AI. We also try to make the default AI very configurable so that you can use WML to make it say more aggressive or less aggressive or other behavior. So one thing I got to get a lot of questions about is why does West North have such good art? Because while it doesn't have really fancy three graphics considering the design of 2D sprites it does actually really have very good artwork. And especially since it actually began with no artists at all. I'm not an artist and I didn't know anyone who was an artist. So what I did was I tried to make adding art as easy as possible. I made it simply a directory with a whole lot of PNG files and you could just go and edit WML and say this is with unit image, it's this PNG file and that would be used. And then when we add a support for animations and so forth we continue to try to make it as simple and dumb as possible. And I also maintained a policy early on if of many features we wanted such as animations I said to people if you do animations I promise you they'll be in the game next release. And this was very encouraging for a lot of artists because especially many of them told me that they had contributed to other games and it would take many months for their art to actually end up in the game or the game would fall completely or whatever. So artists being able to contribute art and then seeing their art used within a week was very encouraging for artists. It's also interesting that many of West North's current artists actually taught themselves art during West North's development. In fact, our lead artist, Jet Reel, when he first wanted to start doing art for West North he sent me an image that he wanted to contribute and I looked at it and I was like oh my goodness that's terrible. And I think I told him that and he ended up, I said well maybe you should post it on the forums and see what people there think of it. And so he posted it on the forum and people they also told him it was terrible. And I thought that that would be the end of it but he's actually worked incredibly hard to improve his art skills and he's studied the history of art and everything and now he's our lead artist and he's done probably the most artwork of the year in the game of anyone. So over several years he's greatly improved his art skills and the same can be said for many of our other artists and Jet Reel's actually done an excellent job of, for instance, if he draws a character with a sword then we need that character animated and that's probably many friends of animation. So he'll be very good about letting people who probably aren't quite as talented or haven't spent as much time in art as he has in helping them develop the animation so he doesn't have to develop every single animation. So we have a very good system of distributing the artwork according to people's ability. So Jet Reel or some of our other top artists do the very hardest work but we distribute some of the other work to other people. We've also had problems with artists who don't like or misunderstand the GPL and free software concepts. For instance, we had one artist who contributed some excellent art that everyone loved but then one of our senior artists sent him, said maybe you could modify this art just in this minor way and they actually drew, sent him an email with his image and drew some arrows on it to show what they meant and he was incredibly offended that someone would modify his image. So he immediately left the project and refused to continue contributing. Wetmouth is also very internationalized. It's in over 40 languages with varying degree of quality and this is especially surprising considering when I first wrote it in internationalizing it was the last thing on my mind. I didn't even consider it. Originally when people mentioned to me the possibility of internationalizing it, I tried to develop my own system for it. Thankfully, some people talking out of that and into using Get Text Instead. And so like I mentioned before, we, WML has internationalization support where anything with an underscore will be exposed to Get Text and there's a very, very large community of translators who have translated into many different languages. Probably translations such as Polish, German and French are the strongest and I'll probably get in trouble with some translators later for not mentioning their translation. And we also have some languages like Latin and Esperanto. So Wetnose also has several other cool features. Since we have a large community, people, especially since Wetnose has developed in C++, there are often people who wanna contribute but they don't know C++ because C++ is a very complex language and they might know Python or Perl or something and they still wanna contribute. So we have, for instance, Rusty Russell made something called stats.wetnose.org where in the game, you can opt in to a service where every time you finish a campaign, finish a scenario in a campaign, it will send your statistics to a centralized server and then you can later go and look at your statistics at how you did, what your average goal was at the end of the scenario and compare it to how other players did. This is also useful because campaign developers can get a feeling, it'll show this scenario, 80% of people beat it on their first try, this scenario, 70% of people did, this scenario, 2% of people beat it on their first try and most people took eight tries to beat it or something like that. So they can tweak the difficulty. We also have things like units.wetnose.org which is just a site which contains all of our units extracted from WML and the server can directly hook into the SVN so you can see the latest changes to the units, it'll show them and all their statistics so you can see the latest statistics in the game. We've also made some extensions to PHPBB, for instance, we've made it so that you can use a tag in PHPBB and post a Weznoth map and the Weznoth map format is plain text and then it'll actually generate HTML to actually show that map embedded in your post. So that's very nice, if you make a map and you wanna show it off to people, you can just post on the forums and people will see your map immediately, they won't have to download it. We also, Eric Raymond has also contributed some features to Weznoth and for instance, WMLWint which is a Wint program for WML, so it detects a very wide range of errors in campaigns and problems with them and this has greatly helped us increase quality. We have, I think we actually have more WML than we have C++ so they are often WML bugs and this corrects it. We also have an add-on server which can serve up campaigns so if you can make your own campaign and we get a lot of people who wanna have their campaign added to the game but that's not always feedable because there's like 30 or 40 campaigns that different people have made and they're very varying in quality and we don't wanna add every single one and then we don't wanna add some campaign that might not be that high quality and then expect our translators to translate it and so forth so we set up a server that allows people to add their content to the server and it also doesn't just allow campaigns, it allows for instance multiplayer eras so if you wanna make a new multiplayer era where everyone gets super powerful units or something, you can upload that and then in the game there's a simple add-on button, get add-ons which you click and it'll take you to and show you all the contents of the add-ons server and you can easily download and install anything you want. So people often ask me how they can get involved in web-noth development. Probably the best way is to just participate in the web-noth forums, find yourself a way there to participate in the web-noth IRC channel. You can find an area of interest, you can find images that need animating, you can find a bug that needs fixing a feature that you think would be good and then we're usually very pretty easy about giving SVN access. Usually if people contribute two or three useful patches, we think yeah, we can trust you enough and we can grant SVN access. Also, Google Summall Code Project, I should probably mention that I work for Google, so whatever. Anyway, it's a great way to get involved in open-source projects and several games have been used in Summall Code earlier before so we would be happy to sponsor someone for Summall Code. So that's pretty much it for my presentation. Does anyone have any questions? Yes, ma'am? My developers were meant to sit and ask me questions about why is web-noth so awesome or something like that. Okay, well thank you everyone for coming.