psp dev

You are currently browsing the archive for the psp dev category.

A few weeks ago, developer Jeerum released a game exploit for the Demo of the game “minna no sukkiri”. At that time he announced he would be releasing more of his game exploits “for the sake of it”. Jeerum keeps his word and released a “Hello World” and a binary loader for the Game Carol Vorderman’s Sudoku.

Credits go to Jeerum for the exploit, as well as N00b81 and npt, for help with the code and beta testing respectively.

Download and more info can be found in Jeerum’s release thread , although I must admit I’m completely confused regarding the usefulness of this release…

Nevertheless, congrats to Jeerum :)

thanks to TiPi for the tip!



As most of you probably know, team Fail0verfl0w announced at the German Chaos Computer Congress that they completely broke the PS3 security, by finding the signing keys used by Sony on the system.

In clear words, they are able to sign content and have a (non hacked) PS3 believe this content is signed by Sony (and therefore the PS3 will run anything you want).

I have received many contacts from people asking me if this would have an impact on the PSP. After all, the PS3 is able to run (decrypt) some PSP games, activate PSP content (like Media Go), and overall there is such a symbiosis between the PS3 and the PSP that we can’t help but ask ourselves: “what if the PSP keys were also available on the PS3?”

Well, it seems the question was legitimate, as Mathieulh announced on Twitter that he can now sign PSP content.

For those who wonder what this means, well simply put: no need for any exploit, HBL, or HEN  in the future, as we will (?) be able to run our homebrews directly from the XMB without any hack. That is, if Mathieu releases his code.

If you still didn’t get it, this is a major breakthrough, with an impact similar to the pandora batteries and the first CFW on the PSP

Congrats Mathieu! Any plan for a release? :)

source: twitter via psp-hacks.com, thanks to Lune for the tip!

Warning: I want to add that console hacking teams do not work for money. People like MathieuLH or the team fail0verfl0w will NOT ask you for money in exchange for their work. If their work ever gets released, it will be available for free. Don’t get tricked by fakers (there are lot of fake failoverflow accounts on youtube apparently)

Almost a year ago I published a small chart giving a summary of the “hackability” of PSP based on the model and the firmware. Things have changed over a year, and with the recent announce of a 6.20 Kernel exploit (and associated HEN) by Total_Noob, they will probably change again very soon. But if you just bought a PSP, all the current possibilities are probably a jungle to you, and you are wondering what your options are. Here’s a quick chart with the current status:

Overall I think it looks way better than the chart a year ago, don’t you think? Below are details for each model.

PSP Phat and PSP2000 (except ta88v3)

If you own a PSP Phat (PSP-1000), or a PSP Slim (PSP 2000) that is NOT a Ta88v3, then your PSP, independently of its firmware, is 100% hackable with a pandora battery. It’s been the case for many months now, and it will not change as the exploit used for the pandora batteries is a hardware exploit and cannot be fixed with a new firmware.

PSP-3000 and TA88v3, Firmware 5.03 and below

If you are the unlucky owner of a “doomed” motherboard, but happen to have a firmware 5.03 or below, your PSP is “half-hackable” through the laughing man tiff exploit and the associated Homebrew Enabler, better known as “ChickHEN”. “half-hackable” means that your PSP can have all the features of fully hackable PSPs (homebrew, plugins, customizable themes, ISOs,…), but unlike fully hacked PSPs, if your hard-reboot your PSP, you’ll have to run the hack again. (For those who still don’t know, putting your PSP in sleep mode works fine and is the best thing to do to keep the HEN in Ram)

PSP-3000, PSP Go and TA88v3, Firmware 5.05 up to firmware 6.20

Half-Byte Loader allows you to run most homebrews on these models, through a vulnerability in the Patapon2 Demo. Additionally, Total_Noob announced yesterday that he was working on a HEN for these models. A HEN will basically bring you most features a Custom Firmware can have, but you’ll have to be patient (like the rest of us).

PSP-3000, PSP Go and TA88v3, Firmware 6.30/6.31

Half-Byte Loader allows you to run most homebrews on these models, through a vulnerability in the Hots Shots Golf game. Total_Noob’s HEN is not planned for these firmwares, but he mentioned that a downgrader to 6.20 might be doable. There’s still goog hope to get kernel access on these firmwares in the foreseeable future.

Vocabulary

Homebrew: User made (non official) applications. These include games such as Wagic, utilities, emulators…
ISO: In the PSP world, digital copy of a game, most of the time unencrypted, preventing it from running on an Official firmware. ISOs are often associated to game piracy.
plugin: Homebrews that are loaded in the Ram of the PSP to extend its functionalities. For example, the music plugin allows to play MP3s while playing a game or a homebrew on the PSP.
HEN: Homebrew ENabler. A program that patches the PSP Ram to allow running unsigned code (Homebrews). unlike eLoader, a HEN is in the Ram and therefore doesn’t require to be launched everytime you want to run unsigned code. To do this a HEN usually requires a Kernel exploit.
TA88v3 :A Model of Motherboard that was introduced on the PSP2000 in summer 2008. It fixes the vulnerability used by the pandora batteries. Several techniques exist to identify your PSP Motherboard. If you have a PSP 2000, the easiest way to identify if it has a “doomed” motherboard is to try a pandora kit (battery + memory stick) on it.

After studying both the Gripshift and the MOHH exploit, I now feel confident to write a little guide on creating a binary loader.

What This article is about

The first step to running homebrew on a PSP is to find a user mode exploit, which is done by taking control of the Ram through techniques such as a buffer overflow in a game or crafted images.
Imagine that you’ve found such a vulnerability, and have full control of our beloved variable $ra. The next step for you is to create a proof of concept. The basic idea is to create a binary loader, that is, a piece of code able to load another piece of code from a file on the memory stick, then run it.
Writing a binary loader is fairly simple once you know how to do it, but it relies on lots of tribal knowledge, as there is no central place that gathers that kind of information.

So there it is :)
Disclaimer: I just learned how to do it myself very recently. Some of the techniques I describe here might not be optimal. I also suck big time at MIPS. Oh, and I tend to write a ruby script for things that could probably go in a Makefile. As usual, take everything you read on the internet with a grain of salt.

In this guide I’m assuming you already have control of the variable $ra and can change it to whatever value you want. I’m taking the example of a savegame. Some steps are fairly different if you found a vulnerability in the XMB, but overall the principles are the same. I’m assuming you know how to use PSPLink, and have a fair knowledge on how to use a hexeditor, scripting languages, a bit of C and/or MIPS,  basic Makefiles…roughly, the kind of stuff you learn writing homebrews :)

Tools you will NEED (Download links)

  • prxtool and psplink are part of the minimal psp sdk. Honestly you should already have this installed if you are reading this.
  • For windows users, cygwin might be useful, and install ruby with it if you plan to run my scripts
  • A Hex editor (on Windows I use XIV32)
  • Savegame Deemer to work on savegame data easily
  • PRXDecrypter to decrypt Eboots
  • SED (Savegame Encrypter/Decrypter) to encrypt your exploit once it’s ready
  • Silverspring’s libdoc (for 5.00)

Contents

Writing a binary loader from a savegame exploit requires the following steps:

  1. Find a place to jump to
  2. Find the function imports
  3. Compile a binary loader
  4. Inject your binary loader in savegame
  5. Write a SDK adapted to your game
  6. Create a small “proof of concept” binary file (a.k.a. “Hello World”)
  7. Reencrypt your savegame

Find a place to Jump to

Run psplink and crash your game like you “usually” do. Keep that running, you’ll need it for this step.

You have control of $ra, and need to have it jump to wherever you will inject your binary loader code. Basically, your code will be injected in the savegame, so you need to know where in Ram that piece of the savegame ends up. To do that, you need to visually compare your Ram and the savegame. To do a dump of your ram just after you found a crash, type savemem 0×08800000 200000000 memdump.bin in psplink. This will create a memdump.bin file on your drive, which should be roughly 24MB.
Now look for a very recognizable pattern in your savegame. A series of letters or bytes that you can easily look for. And look for these values in your Ramdump as well (with an hexeditor, obviously). In the image below, my ramdump is on the left, and the savegame is on the right.

Once you’ve found them in you’re ramdump, you pretty much know where you will want to jump, AND where you will inject the code in your savegame. In this example, my pattern is at offset 0x43F0 in the savegame, and at offset 0x32C3E0 in the ramdump. That last one is actually 0×8800000 + 0x32C3E0 (0x08B2C3E0) in ram since we dumped our file starting at 0×08800000. You can check if your psplink is still open: you should find your pattern if you type:  memdump 0x08B2C3E0 20 (replace the address with whatever you chose, of course).
You want to make sure the place you jump to is exactly equivalent to the pattern you chose in your savegame, over a few hundred bytes. If there are differences in this area between your savegame and the ram, it means this savegame block is not entirely loaded at this position, and it will make your code injection more difficult (you want your code to be in one block, not splattered all over the Ram :P )
So you have step one: we found a nice place to jump to (0x08B2C3E0), and where in the SDDATA.BIN we will inject our binary loader (0x43F0).

Find the function imports

OK, this one sounds extremely difficult, as if it required lots of exceptional knowledge: that’s not the case. Or, rather, we have tools that do the work for us.
When you write a homebrew, you call functions of the PSPSDK. The position of these functions in Ram is not known in advance in the case of a game exploit, so we need to find them and “redirect” them correctly.
In the case of a game, you’ll want to extract the “EBOOT.BIN” from your game and decrypt it. The EBOOT.BIN is inside the iso of your game, so to get it you will need an iso of your game. If the game is an UMD, it’s very easy to do on any custom firmware with the “USB Drive” option that you can find in any custom firmware. (If the game is a PSN game, you’ll need NPDecryptor to create the ISO).

Most likely, this “EBOOT.BIN” is encrypted, so you additionally need to decrypt it with prxdecrypter.


Once you have your decrypted EBOOT.BIN handy, use prxtool to retrieve information from it, with the following syntax:

prxtool -f EBOOT.BIN

This will give you the actual addresses of each function that the game imports and uses. These are the functions that you will be able to use in your homebrews or in the binary loader.


You’ll notice that instead of function names, you get a library name followed by hexa values. From there you can either manually do the associations, or (better) get an xml file with the nids/function names associations. Such xml files can be found on silverspring’s website (http://silverspring.lan.st/).
Once you have one of those xml nids files, just type

prxtool -f -n yourfile.xml EBOOT.BIN

which will give you a much more readable output :)

Keep this output somewhere!
If prxtool complains about your file not being a prx… you probably screwed up the decryption process at some point, or you used the wrong EBOOT.BIN (there are several of those in the ISO, most of them are dummies)

Compile a binary loader

For this step I suggest you download my patapon exploit SDK as it is a good example. This SDK can be found as a part of HBL, here.
The binary loader itself is pretty simple to write, directly in assembly. You could write it in C based on the SDK you will create (that I describe below), but my inspiration here is the sparta_sdk which has its binary loader written in mips assembly. Assembly is a bit tougher than C/C++, but in this case, we are simply going to adapt my patapon work to fit your game, so it’s only a few replacements here and there.

Note: this work is heavily inspired by Mattiaz’s “sparta sdk”, it is recommended that you download it too if you want to see the differences, which can be educational.

Open the file “loader.S” from the patapon binloader folder.

Basically what we want to replace here are the function addresses used by the patapon binLoader. I used addresses that made sense for Patapon, but not for your game. So for the 4 functions involved (sceIoOpen, sceIORead, sceIOClose, sceKernelDcacheInvalidateRange) , you will take your list of imports generated earlier, and replace the “patapon” value with the value for your game. In my example, I replaces 0x08A69854 (the value from the Gripshift exploit) with 0x08C88590 (the value from the patapon exploit) for sceIoClose, and so on.
Additionally, you need to update the address where the filename is stored. The filename is the name of your binary, and is traditionally ms0:/h.bin. You need to add this string in your savefile somewhere around your jump location, and inject this address into the asm code. In my example below, I put the file name “0xF0” bytes after my jump point, so I changed the 0xC0 from the sparta sdk into F0. Don’t forget to put a “0×00″ at the end of your string!! Note that this also means that the length of my compiled binary loader has to be less than F0 bytes, otherwise when I inject it I will overwrite my file name  :’(

That’s pretty much the only things you have to change. We’ll now compile this file and inject it in the SDDATA.BIN.
Compiling assembly is not especially difficult as all the tools for that are provided in the PSPSDK. Again, taking inspiration from the spartaSDK, here are the needed compilation commands:

psp-as loader.s
psp-objcopy -O binary a.out a.bin

The first step compiles the code, and the second step creates a binary version of it.

Inject the binary loader in your Savegame

Once you’ve got a compiled version of your binLoader, it is then easy to inject it into your save file, either manually with a copy paste, or through the scripting language of your choice. The only thing to remember is that you want to inject it at the precise location matching $ra, that you found above in this article.

For the injection, I have a small ruby script that takes a valid SDDATA.BIN file and loads the exploit + the compiled binary loader into it directly. I’m only providing a picture of the code but you can also find the code here. I suggest you go with the method you prefer (and the language you prefer) for injecting your code.

Note that at this step, you already have a way to create your hello world (in asm) and inject it instead of the binary loader. It’s actually not necessarily a bad idea to try much easier code (such as calling sceKernelExitGame) before aiming for a binary loader, to make sure your thing works.

Write a SDK

This sounds difficult. It’s not. Once you have your function imports, writing the SDK is a piece of cake. What you need to do here is take the list of function imports you retrieved through prxtool, and write a file named sdk.S just like the one in the patapon SDK. It’s pretty straight forward. In my example, I replaced 0x08A69854 with 0x08C88590 and so on, just like I did with the .S. This is assembly, but it’s dead simple, as you don’t even need to look for what the functions actually do.

In my case I wrote a simple ruby script that parses my prxtool “functions imports” file into a sdk.S  function, but there probably are some options in prxtool to help you with that task.
You then copy the sdk.h from the patapon exploit, and that’s it. One .S file and one .h, and you’re done!

Write a Hello world

Once you’ve got your sdk, writing a Hello World is extremely simple. Actually, you can even cheat and reuse the sample provided in the patapon SDK. Be sure to start with the smallest file possible, just to make sure your code actually works. A simple proof of concept is just some C code that calls “sceKernelExitGame()“. That’s enough for you to confirm that your SDK is roughly correct and that your binary Loader (coded previously) does its job. Additional samples can also be found in the sparta SDK.

The sparta_sdk makefiles might need a few changes since we are using a different way of writing the SDK(take inspiration from the Makefile from patapon rather than that from sparta in that case)
The output of the compilation should be a h.bin file. If your binary loader loads ms0:/h.bin, then just put that h.bin at the root of your memory stick, put your binaryLoader SDDATA.bin in the correct subfolder of the SAVEPLAIN directory, and fire up your game (with SGDeemer and psplink enabled of course), trigger the exploit…and your hello world should appear :)

TroubleShooting

There might be several reasons for your exploit to fail at that point. Although computer programming IS exact science, it’s extremely easy to do stupid mistakes if your working environment is not “good” enough. At that point, PSPLink is the key to your success. If you get a crash, try to investigate the Ram. Are you actually jumping to the correct location? Is your binary loader really at that location? Is it entirely there or did it get truncated for some weird reason? Add breakpoints to your binary loader to see if it actually runs. When you are sure the binary Loader runs, make sure it really loads your hello world where you expect it to be loaded in Ram. If so, add breakpoints to your hello world as well. Or simplify it.
All these steps can be extremely painful if you don’t automate some of your work. I highly recommend taking the time to write a few scripts that will automate the work for you (compile the binLoader and inject it, etc…). Choose whatever scripting language you’re confident with :)

Reencrypt your savegame

That’s the last step when you want to make sure your exploit works on official firmware. A tool called SED allows you to reencrypt your exploited savegame. To do that though, you need the savegame key. That key can be found in the SAVEPLAIN data given by SGDeemer. It’s at the very bottom of XXXX.bin where XXX is the code of your game . At the bottom of that file, the last 20 bytes should be only zeroes. you want the 16bytes before that. That’s your key :)
For the usage of SED… well, google for it, I’m feeling lazy. If you made it that far, SED shouldn’t be a problem for you :)

People.

Please.

Remember what happened with Gripshift. it HAD an exploit, a Hello World, and even a SDK. you bought that very expensive copy. AND it led nowhere good for you.

Now I see people buying games for a very expensive price, based on fake “hints” that this might be THE game in which pspjoke found an exploit.

mgs

Ok, clear your mind. Imagine the game is MGS (which, by the way, it’s not). Do you think buying it now for such a high price will do you any good? Based on what? A proof of concept code? What are your chances that this becomes an eLoader? And maybe an eLoader is not what you are looking for. Maybe you’re expecting a HEN? But it’s been said many times that a HEN requires a kernel exploit…which pspjoke and N00b81 probably don’t have.

We’ve had several examples in the past of perfectly working Game exploits that led to nothing really useful for end users: Gripshift, Medal of Honor, Mercury,…

Bottom line: don’t buy an expensive game based on hope, you will be disappointed.

But hey, let me be bold: The game in which pspjoke found an exploit is NOT MGS.

I’m thinking I should start rumors of hacks in some of the crappy games I own, I could sell them for good money :P

pspjoke and N00b81 were kind enough to contact me regarding the recent game exploit found by pspjoke. As others who’ve been trusted with this information, I swore not to reveal the game’s name  so don’t even ask.

In order to test, I myself created an overflow in a savegame for that game and could confirm the vulnerability (I’m amazed to see that it takes 10 minutes to create that overflow when I spent 3 months crafting mine on the libtiff back in 2009, talk about wasting time :D )

pspjoke2

pspjoke

So, people can stop asking if it’s real or fake, it’s real.

The only question is: will it lead to something useful for users? Maybe, maybe not. N00b81 and pspjoke are actively working on an eLoader (a program that would load homebrews) for this vulnerability, but it is still unclear if this will ever be publicly released.

As usual, it’s not that the devs are selfishly keeping their exploits for themselves, but rather that, as soon as the exploit is made public, the game will be removed from the PSN Store by Sony, making it basically useless. In other words, PSP3000 and TA88v3 owners who can’t enjoy the power of Chickhen may hope for an eLoader in a near future…if they can afford an extensive UMD. PSPGo owners already know that there’s pretty much no hope for them in game exploits, and can try to contact Datel and beg for them to create a signed homebrew Loader, or look for exploits in the firmware itself.

Anyways, as long as no eLoader or HEN is ready for that exploit, knowing the name of the game is useless for most people. People who would have the knowledge to use the information should rather dig their own UMDs and start looking for their own exploits using my awesome guide :)

This post is not to tease people. It’s to confirm that the exploit is real, and if you see people claiming it’s fake, tell them I said it’s real. You can quote me on that :P

Image6Here’s another “how to look for exploits” post from me, I hope it’ll be useful to all the people who are currently trying to free the PSPGo from the chains that prevent it to breathe :)

Recently we’ve seen lots of crashes involving images, especially TIFF files. Let me start by correcting something here: some people believe that TIFF support has been removed from the PSP after the laughing man tiff exploit. This is NOT true, only support of a class of TIFF files (files with an unassociated alpha layer) has been dropped by Sony. So, yes, even in the latest firmwares, the PSP can display tiff files.

Now let’s go back to the recent crashes. So, you’ve crafted a tiff file that crashes your PSP. Or you’ve found one on the internet. That’s great. People will tell you that this could lead to an exploit. They are right. Other people will tell you that this is an exploit. They are wrong. A crash is not necessarily an exploit, and, in the case of tiff files, a crash is very likely to NOT be an exploit.

Let’s take for example a file that can easily be found these days on various sites, a tiff crash apparently created by CoD3r-D. This files does crash the latest PSP firmwares, but a quick analysis in PSPLink gives us the following:

Image4

Ok. So let’s be clear here: the error we get is a breakpoint. a breakpoint cannot lead to an exploit. A breakpoint is how your PSP tells you: “you tried to mess up with me, I’d rather stop everything here, and while I’m at it, I’ll shut down very soon to prove my point.”

Why do these breakpoints happen frequently with Tiff files? Well the libtiff (the library used on the PSP to handle TIFF files) has a pretty good error handling system. Any file that is “corrupted” will trigger some error handling code, that is supposed to spit an error message. That’s how it works on a PC. On the PSP, for some reason, it seems that instead of getting a nice “unsupported file” error screen, in most cases, the PSP just crashes with a breakpoint. It feels like Sony’s engineers have replaced all error handling code with breakpoints, but that’s just my guess so don’t quote me on this.

So I’m saying it again: breakpoint == not exploitable. Keep looking for other crashes!

I’ll try to have a more detailed post on “how to go further” with other crashes, but that’s it from me now :)

3 Weeks ago Datel made it to the (PSP) news headlines by releasing the new version of the Action Replay, a piece of software not signed by Sony and yet running on non hacked PSP.
As it seems clear that Datel figured out how to reproduce Sony’s signature (and technically, run everything they want on every PSP model), the PSP scene was excited at the possibilities that opened up for the future of homebrews.

There were several ideas about “how” this could be used for the benefit of the underground scene, but unfortunately all of these apparently led to … nothing at all.

The idea of figuring out the encryption process just by looking at the action replay EBOOT didn’t feel like a doable thing. It was clear from the start that it wouldn’t be any easier than figuring out Sony’s encryption process, which hackers haven’t been able to do in the 5 years of the PSP’s life.

Other attempts were made to find an exploit in the PSPAR Eboot, with classic buffer overflow exploits, through the program’s configuration files, which proved to be quite secured against such attacks.

Hackers were also hoping to be able to inject a fake “cheat code” into the Ram, that would actually be nothing more than a binary loader (a homebrew Loader). It turns out that the PSPAR does not allow users to create their own cheat codes (old Action replay software allowed to do that through the help of a “trainer” program). Actually the cheats are all stored in the EBOOT itself, making it virtually impossible to “inject” anything.

Finally, it was expected to maybe trick the update mechanism. Previous versions of the Action Replay would patch themselves by loading a data file in the PSP/COMMON folder. But it seems that this new version does not update itself. Rather, users have to connect to the pspar.com website and download an entirely new EBOOT for each update. This was somewhat expected, as it would otherwise mean that the EBOOT has the code to sign itself again after being modified, which was very unlikely. Nevertheless, it’s now officially clear that this won’t work either.

So all of this has been a dead end so far. The last ray of hope could come from Datel themselves, if they decide to come up with a commercial “homebrew loader” solution, like they did for the gameCube/Wii (SD Media Launcher). Personally I’d pay good money for that, but Datel hasn’t replied to people who inquired about that (do it too, if many people show interest, maybe they’ll consider it!). I guess they need to weight the pros and cons of going (yet again) at (legal) war against Sony…

On a side note, it means that people on official firmwares can now cheat in games, so the whole “we lock CFW users out of the PSN because CFW users can cheat” crap has no meaning at all anymore. It also probably means that online play will become less enjoyable now, but I can’t really tell, I’m on CFW and therefore can’t access the PSN or the playstation store…

Devs m0skit0 and ab5000 have been working on an eLoader for the MOHH exploit in the past months. Today, m0skit0 released an alpha version of his work, named “Half Byte Loader”. He mentioned that this is currently only useful for devs, as it doesn’t allow to run homebrew yet, but let’s hope this will lead to something good in the weeks to come.

An important point to mention is that it is the first open source eLoader that’s been released, in 4 years of PSP hacking. Many thanks for that :) This could probably become the base of future homebrew loaders, and this will at least be a useful source of information for lots of devs around here!

source and download: advancedPSP

I have been working on Wagic for more than 2 years now, and it’s become quite big for a homebrew game. In terms of gameplay and features of course, but also in terms of source code. I use a small application named CLOC to count the number of lines of code in Wagic, and I was amazed at how the source code for Wagic keeps on getting bigger with time.

Wagic now has 70’000 lines of code.

As a comparison, a “standard” Custom Firmware for the PSP has around 25’000 lines of code.

Out of curiosity, I ran CLOC on several open source projects of the PSP community and here are the results:

Project NameLines of Code3rd gen Equiv.
Wagic70’000 (including 40’000 for JGE)85’000
DSON PSP (DS Emulator)37’000 (including 28’000 from the PC emulator)32’000
CFW 3.10 OE23’00021’000
Battlegrounds 3D 0.4 (tank game in 3D)12’00010’000
PSP Mancala (Mancala Game)3’2002’500

(3rd gen equiv. Is CLOC’s attempt at comparing projects written in various languages. It assumes for example that one line of assembly code does way less than one line of C, itself doing less than one line of C++)

What does this show? Well, pretty much nothing, except that the number of lines of code in a project are not directly related to its popularity :P

A “standard” homebrew game with basic features, that is still more than a “proof of concept” will have between 2’000 and 10’000 lines of C/C++ code (I didn’t try any LUA game).

A basic rule of thumb is that a programmer alone can maintain around 20’000 lines of code. The number of lines of code in a program give no specific indication on the quality of the code itself, but there are two obvious things: Maintenance and bugs increase with the number of lines of code. I’m not saying that Wagic has 15 times more bugs than Battleground 3, but that it is highly probable that Wagic has 2 times more bugs than when it had only 35’000 lines of code.

Well, if we want a project to grow bigger, add more features, at some point we have to increase the code size. What are the solutions to deal with it?

  1. Version control. I can’t imagine a project with more than 10’000 lines of code that is not version controlled. We use SVN for Wagic, there’s a free service provided by google code for that. So far it’s great. Other projects use their own SVN servers (such as the PSP SDK at ps2dev). Other solutions such as Git exist. I don’t think any software project can expect to grow without at least a basic version control system
  2. Bugs tracking. I used to write down every single bug on a piece of paper. This works half well when you’re alone on the project, assuming it’s always the same piece of paper. Let me withdraw that: it doesn’t work. You end up forgetting things. Inputting the bugs in a system that will help you keep records is a great idea. I’m happy we progressively shifted to that in the Wagic project. Google code offers this service as well. There are alternatives such as mantis,…
  3. Automated tests. I gave up the idea of having human beings test every single feature in Wagic after the second release I think. There is no way you can get people test thousands of cards in an acceptable amount of time. Depending on the project, automated testing can be hard to implement. Unit tests are fairly easy to implement in languages such as Java, but I haven’t taken the time yet to implement unit tests in Wagic. Wagic does regression tests, which is basically a way of making sure that a new feature does not break old ones. We have lots of progress to do in this area
  4. Reduce the quantity of source code. One other thing I haven’t taken the time to do seriously yet. The best solution to reduce maintenance is of course to reduce the size of stuff to maintain. Wagic has lots of dead code, or code that could be optimized/refactored. We try to do some cleanup regularly, for example by removing hardcoded cards, and instead softcode them (which also improves the parser, that’s a good thing). Often, cleaning up the card codes doesn’t reduce the total amount of code though. But it allows us to code 50 cards when it was only possible to code 1 initially.

These are the four things we use on a daily basis to work on Wagic, and that proved efficient over the months to increase the quality of the game. It is far from perfect of course. We are experimenting with other things (such as a wiki) to improve documentation and communication between devs…we’ll see how it goes.

« Older entries § Newer entries »