30 Nov 2011

Vote for Illyriad for Indie of the Year 2011

Author: Luna | Filed under: Community

Vote for Illyriad in IndieDB’s – Indie of the Year 2011

2011 has been a big year for Illyriad. Since the beginning of the year we’ve had a UI redesign, two tournaments, the introduction of daily bonuses, new research and avatar graphics, the addition to the Chrome store, new buildings and a new server upgrade just to mention a few things. All of this has been done with a small development team in the true spirit of an indie game. We appreciate the continued support of our players and have all of you to thank for our continued growth.

As we close out this year we look to you, our community, for support again as we are up for IndieDB’s Indie of the Year for 2011. If you could, please take a moment to vote for us. Just follow the link below to vote before the deadline of December 10, 2011.

Indie of the Year Awards

2011 Indie of the Year Awards via Indie DB

If you have a registered account at IndieDB you can vote once at any time. If you aren’t registered or logged in you may have to wait for a time before being allowed to vote, as only a certain number of anonymous votes are allowed per minute.

Thank you so much for your support!

GM Luna

17 Nov 2011

Illyriad Community Call-out

Author: Luna | Filed under: Community

Player-run websites and events are an important contribution to the Illyriad community. There is a wealth of knowledge and creativity within our player base and it is always wonderful to see it come to life and engage the community!

One of the earliest community projects was the Unofficial Wiki: Arcanum Illyria, initiated and hosted by HonoredMule:

Several blogs also exist about Illyriad, including: The Wisdom of Kurdruk providing both unusual insight as well as tips for new players created by Kurdruk:

My Eternal Reverie is a collection of Illyriad web-comics and blogs created by SunStorm who recently also hosted the “Capture a City” event:

Of course, we must not forget the The Travelers’ Tale section on the forum where players share their prose, poetry, history and artwork.

The very first tournament in Illyriad was Armok’s Blood Bowl which was player-run and created by Noryasha Grunk. Our first official tournament was indeed inspired by the players themselves!

It’s fantastic when player-driven events and challenges emerge from and engage the community. Equally of note, both remarkable in balance and to be arranged by such a new player was the open to all players Race to the Center of the Universe run by Hugie. In fact, the 6th ranked player had only started playing Illyriad the previous month. The dev team did graciously step in to provide the photo-finish as there were only 350 milliseconds between first and second place!

Most recently created is the ambitious Illyriad Olympics, mini-tournaments in the world of Illyria:

Currently there are three tournament ideas listed for players to try:

A big thank you to all of the Illyriad player-tournament hosts, bloggers and fansite operators. We wish you the best of luck!

If you have an Illyriad blog or fansite that is not listed here or have a tournament you’d like help promoting, send an email to community(at)illyriad.co.uk to let us know about it.

15 Nov 2011

WebGL Experiments: Texture Compression

Author: Ben Adams | Filed under: Development, Graphics

Lilli Thompson from Google asked us how we were doing texture decompression in the pixel shaders and what algorithm we were using. We thought we would share our answer…

Texture compression was a bit of journey – as no one at Illyriad had ever implemented anything in 3d before; to us texture compression was mostly a tick box on a graphics card.

It started when we found out our 90MB of jpegs expanded to 2GB of on-board memory and we were worried we’d made a terrible mistake, as this was certainly beyond the possibilities of low-end hardware! Half of it this was due to Three.js keeping a reference to the image and the image also being copied to the GPU process – so essentially the required texture memory doubled.

Dropping the reference Three.js held after the texture was bound to WebGL resolved this. I’m not sure how this will play out with context lost events – as I assume we will have lost the texture at that point – but local caching in the file system and reloading may help with recreating them at speed.

With 1GB of memory remaining we were faced with three choices – either deciding what were were trying to do wasn’t possible; reducing the texture sizes and losing fidelity or trying to implement texture de-compression in the shader. Naturally we opted for the last.

We were originally planning to use 24bit S3TC/DX1; however this proved overly complex in the time we had available as the pixel shaders have no integer masking or bitshifts and everything needs to be worked in floats. The wonders we could unleash with binary operators and type casting (not conversion) – but I digress…

In the end we compromised on 256 colour pallettized textures (using AMD’s The Compressonator to generate P8 .DDS textures). This reduced the texture to one byte per pixel – not as small or high colour as DX1 – but already 4 times smaller than our original uncompressed RGBA textures.

It took a while to divine the file format; which we load via XMLHttpRequest into an arraybuffer. The files have 128 bytes of header which we ignore, followed by the 256×4 byte palette which we load into a lookup table texture RGBA. The rest we load into a Luminance texture. Both textures need to use NearestFilter sampling and not use mipmapping to be interpreted sensibly.

We have created our own compressed texture loaders – the colour texture loader looks a little like this:

Illyriad.TextureCompColorLoader = function (path, width, height, uniforms) {
  var texture = new THREE.DataTexture(0, 1, 1, THREE.LuminanceFormat,
                    (new THREE.UVMapping()), THREE.RepeatWrapping, THREE.RepeatWrapping,
                      THREE.NearestFilter, THREE.NearestFilter);

  var request = new XMLHttpRequest();
  request.open("GET", path, true);
  request.responseType = "arraybuffer";

  // Decode asynchronously
  request.onload = function () {
    if (request.status == 200) {
      var imageDataLength = request.response.byteLength - width * height;
      uniforms.tColorLUT.texture = new THREE.DataTexture(
                                      new Uint8Array(request.response, 128, 256 * 4),
                                      256, 1, THREE.RGBAFormat, (new THREE.UVMapping()),
                                      THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping,
                                      THREE.NearestFilter, THREE.NearestFilter);
      uniforms.tColorLUT.texture.needsUpdate = true;
      texture.image = { data: new Uint8Array(request.response, imageDataLength),
                        width: width, height: height };
      texture.needsUpdate = true;
    }
  }
  request.send();
  return texture;
}

When we first did the decompression in the pixel shader, it was very blocky as we had turned off filtering to read the correct values from the texture. To get around this we had to add our own bilinearSample function to do the blending for us. In this function it uses the diffuse texture with the colour look up table and using the texture size and texture pixel interval samples the surrounding pixels. The other gotcha is that the lookup texture is in BGRA format so the colours need to be swizzeled. This makes that portion of the shader look like this:

uniform sampler2D tDiffuse;
uniform sampler2D tColorLUT;

uniform float uTextInterval;
uniform float uTextSize;

vec3 bilinearSample(vec2 uv, sampler2D indexT, sampler2D LUT)
{
    vec2 tlLUT = texture2D(indexT, uv ).xx;
    vec2 trLUT = texture2D(indexT, uv + vec2(uTextInterval, 0)).xx ;
    vec2 blLUT = texture2D(indexT, uv + vec2(0, uTextInterval)).xx;
    vec2 brLUT = texture2D(indexT, uv + vec2(uTextInterval , uTextInterval)).xx;

    vec2 f = fract( uv.xy * uTextSize );
    vec4 tl = texture2D(LUT, tlLUT).zyxw;
    vec4 tr = texture2D(LUT, trLUT).zyxw;
    vec4 bl = texture2D(LUT, blLUT).zyxw;
    vec4 br = texture2D(LUT, brLUT).zyxw;
    vec4 tA = mix( tl, tr, f.x );
    vec4 tB = mix( bl, br, f.x );
    return mix( tA, tB, f.y ).xyz;
}

void main()
{
   vec4 colour  = vec4(bilinearSample(vUv,tDiffuse,tColorLUT),1.0);
   ...

This performs fairly well; and certainly better than when your computer feels some virtual memory is required because you are using too much! However, I’m sure on-board graphics card decompression should be swifter and hopefully open up the more complex S3TC/DX1-5 compression formats.

There is a major downside however with decompressing this way in the pixel shader. You have to turn off mipmapping! Not only does turning off mipmapping cause a performance hit as you always have to read the full-size textures – but more importantly it doesn’t look good. In fact in the demo – we had to use full-size textures for the grass so we could apply mipmapping as otherwise in the distance it was a wall of static!

Unfortunately, as far as I’m aware, WebGL while you can create mipmaps with generateMipmap – you can’t supply your own. Again, real compressed textures should help here.

EDIT: Benoit Jacob has pointed out this is possible by passing a non-zero ‘level’ parameter to texImage2D – one to look into.

Some caveats on the demo:

  • Obviously even 90MB of jpeg textures is far too much – the production version will be substantially smaller, as we are being a bit smarter on how we will be using them.
  • This has been a learning process both for us and Quantic Arts (who are used to boxed set games).
  • This was a tester to see the upper limits of what we can do in WebGL, so we haven’t been focusing on optimization yet.
  • We will be reworking the obj models to reduce their download size substantially.
  • The way the game works is that no one player will need all the textures at once (the time between queuing a building and it’s actual appearance in the game allows us to download the models/texture)

So the actual game requirements will be much much lower.

14 Nov 2011

Sound: Enhancing the Illyriad experience with audio

Author: James Niesewand | Filed under: Development, Sound

In Illyriad we will be using audio in three ways:

1. Motif background music

We will be mixing these in and out of the game environment dependent upon the map focus on biome. Some examples could be Mediterranean music, jungle music, desert music or polar music. We also plan to have some generic musical motifs and themes that enhance the game experience, such as triumphal themes that linger after you win a battle or trepidation themes that build anticipation before a diplomatic event such as sabotage or assassination. We are generally writing specific music for all of these themes as opposed to licencing them. We are also exploring the Web Audio API for this purpose – almost treating it as a sequencer – so that we can slave a standardized or fractional BPM to the game server clock and use all the clever tricks. For example, we may increase tempo of the music with the player’s proximity to the event outcome.

Weird, I know, but during the midlife crisis that impelled me to start Illyriad, I also released a reasonably successful album of ambient and dance music.  So I’m pretty familiar with creating soundscapes and – whilst I haven’t yet used it in anger – the toolset I see in the Web Audio API looks pretty comprehensive. I would bet my bottom dollar that someone will build (if they haven’t already) a full Web Audio API sequencer, and I can also see (the equivalent of) VST plugins and softsynths being sold on the Chrome webstore.

2. Notification/event audio

These are the standardized sounds that occur during gameplay based on triggers such as event queuing or occurrences. For example, starting building construction in game with sound of carpenters sawing or the messenger noise you get when you receive an email. We’re looking at making some of these specific to the game races, so the new mail sound for receiving an in game message is different for Elves and Orcs. Some of these are being worked on currently by James Bell, our audio engineer. He is out in the field recording the sounds at historic battle re-enactment events around the UK so that we can really get it right!

We’re also looking to mix these on the fly in the browser. A battle notification audio event would be made up of many different audio snippets in the mix. For example, a player who attacks a pack of lions, using his cavalry, in a savannah environment that wins the battle will get a very different sound effect notification from a player who attacks a horde of skeleton warriors, using his bowmen, in the arctic north that loses the battle.

3. Environmental audio

Different from the motif music, these are specifically audio snippets (some looped, some one-off or randomly triggered) that are geo-specific, especially within the WebGL 3D environment. If you go up close to the grinding cog-wheels of a working flourmill or approach the river bank, the audio source is located (in the stereo and depth pan) in reference to your viewing position and that of the sound source with volume controlled by proximity.

Some of these effects are environment proximity-related and others are time-slaved (such as the dawn chorus of birds or the frogs and crickets of dusk) or environment-slaved (for example, wind, rain or thunder) as the game world progresses and changes.

10 Nov 2011

Review: Daily Mobile

Author: Illyriad Press | Filed under: Press, Reviews

Illyriad has been reviewed by Daily Mobile

“Illyriad: A Great Multi-Platform Game for Android Cell Phone Operating System and iOS”

You can read the full review here.

9 Nov 2011

WebGL Experiments: Illyriad’s 3d Town

Author: Ben Adams | Filed under: Development, Graphics, Sound

What can WebGL do? Can it do what we want? We were wondering.. and so decided to put it to the test…

To test the upper bounds of WebGL we put together a rough and ready demo [caution - it's bandwidth hungry].  It’s very rough, not optimized and currently only runs on Chrome [working in all browsers that support WebGL is our priority]; but that’s kind of the point – its a technology tester to ensure we weren’t making a mistake.

The results speak of themselves – it definitely proves itself!  Sure it needs a bit more polish, but we are now confident that the actual in-game libraries we are building have a lot of head room to use. Below are a couple screenshots of the town during the day:


And another at night:

Of course there were many trials along the way and things that didn’t quite work as we’d planned as can seen below:

   

We learnt the importance of GPU compressed textures and had to write a pixel shader decompressor of our own, as WebGL doesn’t currently support them natively – but with a cost.  The loss of mip-maping this causes it can clearly be seen; and we will have to work around this if they are not supported soon.

Overall we are very pleased with the result, which you can check out here.  Remember to press space to unlock your mouse to look around - if you aren’t fond of reading on-screen instructions ;-)

Naturally this is just a taster of what we have waiting in the wings. We’ll look to provide some follow-up blog posts about the techniques and tools being used in this early experiment including:

  • Web Audio API
  • Pixel shader texture decompression
  • Deferred shading

3rd Party Libraries in use

8 Nov 2011

Review: Genre Reviews

Author: Illyriad Press | Filed under: Press, Reviews

Illyriad has been reviewed by Genre Reviews

“Illyriad: A game with a lot of depth and many paths to success.”

You can read the full review here.

4 Nov 2011

MMObility: Ten terrific titles for this nifty new netbook

Author: Illyriad Press | Filed under: Articles, Press

Illyriad was mentioned in Massively’s MMObility column:

“The HTML5-based MMORTS will truly work on any device, as long as it has a browser. I have played it on every phone, tablet, laptop, desktop and now netbook in my home. Once you meet the community and get started, you are likely to forget that the game is actually a free-for-all PvP sandbox. … It’s perfect for a netbook. Hell, it’s perfect for any device.”

You can read the full article here.

MMObility: Ten terrific titles for this nifty new netbook

2 Nov 2011

Letting Go

Author: Kevin Hassall | Filed under: Graphics

As Illyriad’s players have doubtless noticed, the game’s art evolves slowly. There is no industrial production line. Each piece is allowed the time it needs to mature, with no great rush.

This is probably clearest in the character art.

Here, we start with a single page narrative on the character, who he or she is – background, attitudes, etc. Then we assemble a mood board. Then step by step the character takes shape. And by the end, we have thought about it way too much.

For example, let me tell you about my daughter. She is lovely. Such a sweet girl. Of course, she has always had things her own way, and Her Majesty (my wife), says that I’ve spoiled her, but nothing’s too good for my little girl! And such an imagination! Most of her time is spent in the cellar, where she says she’s playing with her friends. How sweet! Heaven only knows what she gets up do down there, since she doesn’t ever take her friends down there – though I think there used to be some prisoners in the dungeon down there – but her games keep her occupied for hours and she’s always so happy when she comes up for dinner…

But in reality this character, about whom we have built up a whole back story (the spoiled sadistic serial killer, with her overly-doting father) is going to have to head out into the world of Illyria as a player avatar, to be imbued with a whole range of personalities and hopes, with a new persona for every player who selects her.

At some stage, however much thought and love we have put in to each piece of work, there comes a point where it stops being ours and belongs to the players. And that’s the whole reason for us doing this. We knew that that day would come, and that’s what makes it all worth while. At some point, she won’t be my little girl any more. But as every parent knows, it can be tough to let go.

27 Oct 2011

Culture: Continuity and Variety

Author: Kevin Hassall | Filed under: Game Design, Graphics

When we’re depicting cultures in Illyriad, there is a tension between the need to make each seem coherent and consistent with itself, and also the need to allow for a variety of interpretation. That all sounds a bit obscure, so let me explain.

Players in Illyriad can pick any one of several races. In all of these cases, players might be coming to them with a range of expectations. For the Dwarves, Tolkien’s Dwarves are the obvious reference, but they might also be thinking of the Dwarves of Norse myth, or the Mostali of RuneQuest, or the insular Dwarves of Dragon Age. For Elves, they might be thinking of the superior and distant Elves of the Lord of the Rings movies, or they might be thinking of the spindly wood elves in illustrated editions of The Hobbit, or they might think of the dangerous and otherworldly creatures who kidnapped Tamlane in the legend. And so on.

The challenge in each case is to allow players to bring their own preconceptions into the world of Illyriad, while maintaining a sense of continuity and coherence.

This is easiest to do with the written Faction descriptions. So, if we are looking at Orcs, then people always assume mindless violence – but as Illyriad is about building cities and kingdoms, this begs the question of how Orcs might run a society. Simply, we don’t have to answer that question – we can propose different options, one per faction, and the players can gravitate towards, focus on, whichever suits their sense of what is Orc-ish. So, we have the ritualized violence of the Blood Reavers, the desperate attempts of the Pax Orcana to adopt ‘civilized’ habits, the measured confrontations of the Crimson Skulls… all offering a different view, a different treatment, of the same subject.

When we create art for the different races, however, there is a different challenge. The example of our Elves, above, demonstrates this. Here we have to bring together wisdom and compassion, with cruelty; the superiority of the “high” elf, with the roughness of the woodland dweller; the sexual fantasy view, with a more realistic depiction. There are a lot of different views of ‘what Elves are like’ coming together here, and the challenge has been to bring them into a single, visually coherent depiction.

Page 8 of 14« First...678910...Last »