EXIL is a game which tell the story of Lena, a young girl which recently died. It's a platform game filled with action and dynamic fights. Her suicide will leave here deep inside of the dead's kingdom. She lost her memory and parts of her soul.
Six month already passed since the previous blog-post, it’s time to talk again a bit about EXIl. The major change since the previous blog-post is the addition of a true character. I finally did a clean version of Lena and added it in the game. Some progress in the code were already made for the Colossus climbing system…
Posted by Froyok on Jan 9th, 2013
[The following post is a reprinted version, the original text is available here : Post on froyok.fr ]
Six month already passed since the previous blog-post, it's time to talk again a bit about EXIl. The major change since the previous blog-post is the addition of a true character. I finally did a clean version of Lena and added it in the game. Some progress in the code were already made for the Colossus climbing system...
I started the coding for the Colossus climbing system some months ago. After some search and regarding the UDK limitations I had to create a grid system. The UDK doesn't allow developers to access the vertices position of a skeletal mesh, which make me impossible to stick the player to the Colossus using these positions. So making something similar to Shadow of Colossus is impossible, I have to fake it.
So I made a system based on points to make climbing points. These points are automatically created when the Colossus spawn in the game based. It's based on all the sockets of the Colossus which start with "grid_" in their name. Because there is no way to get the full count of the sockets of a skeletal mesh by code, I manually count the grid points and store the number inside an ini file. This way I can still stay in the editor, udpate the grid, and just change the number and relaunch the game. No need to change the code and recompile.
Using the sockets is also a big advantage for me. I'm not a good programmer and dealing with quaternions to place correctly the player would have been a nightmare. The socket give me a good rotation value so I don't have to process them in any way, I can directly use their rotation value.
Since the points are based on the sockets, I can quickly open the skeletal mesh in the UDK editor and change the grid the way I want. The rest of the code adapt itself on the position of the point procedurally.
I have started to attach the player but I still have hard time to move correctly. My most annoying bug was that if the Colossi was moving too fast, the player would start floating in the air. I fixed this problem by using the "SetBase" function that I never used before. "SetBase" simply change the relative world of the player. So when I stick the player to a point, I use "Setbase" on it and the player will follow by itself the point, no need to manually update his position.
Another hard part I had to figure out is how to to find the best point to grab when you are climbing the Colossi. Currently I use a mix between a screen position added with the nearest points. I don't think it's the best way to do it but I can't use the player rotation to search at his left because sometimes the player can be upside-down. I also have to implement a bone velocity system which count the speed of a bone moving where the player is sticking. Once i will know this information I will be able to go in ragdoll mode when the player will be falling from a point.
With all these problems, I stopped to work on this part and gone back on Lena. I probably worked almost a month on this system, during October 2012. Once I will new clues about how to deal with these problems is fix and udpate the system.
One of the most important change is Lena. During July 2012 I took the time to create correctly the main character of the game. This mean creating sketches, sculpting, baking and finally rigging it for the game. This took me a full month to make something really clean (even if not perfect).
I'm not a character artist and Lena was a nice challenge, it was the first time a really sculpt a head for example. While Lena is still not beautiful as I would like, I find it enough satisfying to keep it.
Once the sculpt was done I took a screenshot of it and painted some concept/design for the clothes. I was not satisfied by the work I have already done in the past (see the dev-blog 2). You can see below (in first) the result concept for the clothes I had from my previous search (and it's ugly). Followed by the new concept and the final design.
From this I have sculpted the main form and baked them to have something basic in the game. It's not the perfect workflow but since I spent one month on the character I was a bit bored. Taking pause in my work between my tasks help me a lot in the end (It keep my mind fresh and always motivated). From this point I have then made Lena evolve slowly, tweaking the collisions, adding a lot of animations during November/December 2012. Having a proper character helped me to fix definitively some scales for the game (especially for the acrobatics movements).
I did first the rig before having any clothes, this way I was able to see if the proportion were correct or not and if I had to correct the sculpt/low-poly mesh. I have then done some clothes following more or less my new concept and these last days I started to add some details.
I also worked on the tattoo system. When I created Lena I had in mind a system to show the player's life bar without using the HUD. I prefer a screen totally empty because I would like the player to focus on the environment and not worrying too much about the information given by the HUD. This is why a life-bar on the player would be good, Lena is always in the center of the screen so it's hard to lost the life information. It's inspired from Dead Space.
So I though about a tattoo that would change regarding the player's health because I wanted to give a tattoo on the face of Lena, similar to the Santa Muerte tattoos (that I already had in mind with my first attempt to make Lena). It's only recently that I have implemented this tattoo system. I first made a test, using zBrush to paint the lines and the exported the vertex color as a mask for the UDK. I use Maya to set a gradient map which will control the blending.
Once I was satisfied by the system, I started to search for a good tattoo. I'm still not pleased but below is the current one. I tried to create something like a tree on her back, but on the front I was out of ideas. I also added some details on the arms to be sure that the player can know it's health even when the camera is not well oriented.
After that I worked on the death system, because the game was crashing when Lena died. This is now fixed and when you die you in go in a ragdoll mode with only the possibility to move the camera. When I was developing this I meet a very fun bug. I had it because my physics asset for lean was totally wrong which made the game physics go totally crazy.
I will probably don't touch anymore the ragdoll system. The only thing I will probably add is when you die like this your body will disappear with some dust and particles floating around. Since Lena is already dead it feels logical that her body should disappear totally. And since I'm already using a complex shader adding this effect should not be a problem. By the way, I have to improve the cloth materials because currently each pieces use it's own shader. It's not the best optimization regarding the drawcalls.
I the previous month I have also started to do some animations for Lena. Mostly to make the transitions between the acrobatics movement of Lena more pleasant to watch. But since I'm still developing the main character I had to use a system which will allow to change a bit the rig without losing the animations. With Maya it was very simple, all I have to do was to reference my rig. This way the animation scene only store the positions of the controllers. I can then do some changes to the rig, the animation will adapt itself.
I have also made a trigger button that I only have to put in the scene. It's a custom actor that I have made. I wanted to make a pressure button simple and easy to use. So I made my own actor to automate the process, because setting up a kismet and a matinee every time I needed something would have killed my time. I still have to fix some bugs. Currently I don't have a full control over the "touch" system, this mean that the player can stay on the button but the button will still reset itself after the given time.
I also started to make the first environment of the game. I paused this part because I run out of ideas regarding how I would like to level design the gameplay side. I have finished my concepts and search for the art side so I just need to find a good layout to start the building of the environment. I never done level design before and in the case of a platform game I'm a bit lost.
I want the player to start the game in some underground levels, similar to some ugly sewers. I also wanted to make something like a crypt to show that Lena is "dead", but crypts aren't located in the sewer. So the idea of the broken bridge comes into my mind, it was good to show to the player the exit without letting the access of it. This way the player will be forced to go down first. The following is just some blocking tests. I'm not trying to find a perfect architecture, just something a bit appealing. For the moment I'm not satisfied.
For those wondering : no, I don't plan a minimalistic design. I'm more interested in photo-realistic scenes. The current visual design is just because of the blocking, and a blocking is nicer with a sweet lighting on it. By the way, the blocking is done inside Maya (even the collisions) and I import big meshes inside the UDK, put lights, and bake with lightmass. The UVs are done with the "Automatic Mapping" function of Maya which works really well for this type of meshes.
For the coming weeks I would like to finish properly the death system, some little FX are missing. Once this part will be done I will go back on the first level of the game. I will try to post at least one dev-blog post each month now. It will be easier to track my own work by the way. :)
Rendez-vous in February !