This week we’re at GDC 2013. We landed on Sunday morning, and since the Independent Games Summit doesn’t start until Monday, we decided to head out to Japan Town for the afternoon. We met up with awesome indies Paul Veer from Vlambeer, Sarah Gross from Two Bit Art, and a few more. We found an arcade with typically Japanese games, one of which is the great table flipping game. Much fun was had as you can see in this little video:
Monday morning was the start of the Independent Games Summit, my favourite part of the GDC. So many indies, and a feeling of complete cooperation rather than competition. Fellow Vancouverite infinite ammo tweeted profusely about all the awesome talks, and he actually went over his tweet limit in the process!
Shane did his talk about how we designed Shellrazer without feeling like we lost our soul, and I think it went well. The day closed with a very raw and emotional talk by Matt Gilgenbach, which I think struck everybody deep in their hearts. What an awesome list of talks for day 1 for the IGS!
Tuesday was equally awesome, and it felt like it flew by super quick. Great talks again, and a great atmosphere with all these indies hanging out in between the talks and in the sun on the grassy bit on top of the North hall during lunch. Colin Northway did a very interesting 5 minute talk about his and his wife’s awesome traveling life, and man that gets me thinking. Maybe the next thing Slick Entertainment should invest in is a bus or a boat or something, and just be on the move constantly.
Ok, that’s all for this week. Not much actual DEV in the blog, but definitely a lot of inspiration gathering.
This week we return with a bit of news about Shellrazer. We’ve now had 833,569 downloads on iOS, and 1,490,513 on Android. That’s insane!! Of course most of the iOS downloads were from one of our free-weeks, and the Android version is free with an in app purchase to unlock the full game. Still, 2,324,082 people having downloaded our game is pretty stellar!
On top of that, Shellrazer is a finalist in the “Best Game on the Go” category in the Canadian Video Game Awards! We think that is super awesome, and we’re quite humbled to be a finalist. Of course a huge congrats go out to all finalists, but it’s good to see a bunch of our friends in the list: Our friends at Klei Entertainment are in pretty much every category with their fantastic game Mark of the Ninja, Nick Yonge/krangGames’s awesome game I saw her standing there, The fantastic Sound Shapes by Queasy Games, the beautiful Incredipede by Northway games, and of course the addicting Waveform by fellow Vancouver indie Eden Studios. Huge congrats!
Next week we’re headed to GDC, so we’ll be blogging from San Francisco. If you’re going to the IGS or GDC, we hope to see you there!
Alright, one more procedural goodness post. I’ve mainly been working on terrain generation in the last week, and it’s slowly paying off. The week started off with a bit of trouble in my Voronoi code, it was generating faulty results with some random points. After jamming for a day at the Indie House and a few tips from Ryan Clark, I decided to go for a slightly different Voronoi method, and that one turned out to be slower, but way more reliable. Since this code is used only when generating a terrain, its reduced performance is fine for now. If it turns out to be a problem, I’ll optimize it later.
The white lines in the images are rivers. They don’t really work well yet, I’ll have to revisit that code. So on the left it shows the distance to the ocean in number of neighbours, which I use as a height value for the area. The lighter blue areas are lakes. On the right is ‘distance to fresh water’, which I can use as a moisture amount.
The next step is assigning a biome to each area. I do this by selecting the best fit for the area based on the height, moisture, number of lake or ocean neighbours, and a bit of randomness. Each biome has a different surface type as well as a few parameters to modify the heightmap in an appropriate way. Behold the result!
Oh, hang on, that’s not right. Fixed a bug in the biome to heightmap code, and voila:
That’s a little better. The next step was to add a bit more information to the biomes such as vegetation densities, etc. This is all still very early and sparse, but at least it works. Here’s what it looks like:
Alright, that’s where I ended up this week. There’s a lot more to be added, such as specific hand-crafted scenarios, roads between these scenarios, towns, animals, etc. That’ll be for a later time though.
Keep those turtle cannons blazing, and hope to see you next time!
This week, I’m going to continue with some procedural stuff I’ve been working on in the last week. For the new SUPER SECRET prototype we’re working on, we plan to generate procedural worlds in the form of a heightfield with objects on it. I looked around what was available for procedural terrain generation, and there’s quite a few websites describing how to generate a random heightfield, erode it, track water flow, etc.
This is where I started experimenting. I implemented a rough version of this: http://codeflow.org/entries/2011/nov/10/webgl-gpu-landscaping-and-erosion/. The problem with this approach is that the generated landscape is quite slow to generate on a CPU (which we’ll pretty much have to do if we want to ship on mobile devices), and the result was very random. The randomness can be good, but in our case, we need to be in control of the world a bit more than that, to make sure quests can be completed properly, all areas can be reached, etc. The nice thing about this method is that you can get information about water flow, which helps to generate rivers, lakes, etc. In the end I ditched this approach because it became way too simulate-y, and not enough game-world-y.
The next approach was to just generate an island using a random heightfield, and then massage it into something we want. I used a 2d Perlin noise, with a fall-off at the edges. The falloff guarantees that the end result will be an island, because the edges are pushed under the water plane at the zero plane. After generating the heights, the surface types are assigned: rocks to steep areas, and sand, snow and grass depending on the height of the terrain. Here is the result:
This is a little better, but still quite random. Also, there are no rivers, so they would still need to be generated. Also, as you can see, there’s an island at the top that is disconnected from the mainland. This would have to be fixed in a later pass somehow. This result isn’t bad, but still not quite what we want.
The next approach I am currently working on is this one: http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/. This approach uses a relaxed voronoi diagram to generate seemingly random, but nicely connected polygons. Then these polygons are used to generate biomes, rivers, etc. This approach sound really good to me, because I can actually control, and force, certain biomes to be generated at specific locations.
So the first problem was to get reliable voronoi code. Because I’m working in C# for the editor, and then port to C++, I wanted to write this code myself, and not just grab a C library from some place and convert it to C#. This turned out to be a bit more complex than I thought, but I ended up making a little application to test my voronoi generation code where you can add points by clicking, and while moving the mouse it updates the voronoi regions in real time. Here’s a screenshot of this app:
At the top you can see the ‘Relax’ button. This calculates the average of all vertices in a polygon, and uses that as a point in a new voronoi diagram. This generate polygons that are a bit more regular than the fairly irregular mess in the screenshot above. The result is something like this:
Ok, that’s where I ended up this week. Jesse is back this week from his little Vegas trip, so expect a bunch more awesome art in the weeks to come!
I almost can’t believe it: Slick Entertainment is a decade old! In the last 10 years we’ve made a bunch of great games, and I am super proud of what we’ve achieved with our small team: 4 fun games, custom C++ engine on 6 different platforms, 3 games feature online multiplayer, all hand-drawn art for […]