2013-12-02

Non trivial Property Drawers in Unity

Another programming related post... I promise I'll publish something nicer next time.
Also, because Google insist on making their products consistently worse, I am unable to upload pictures. This is going to be even drier than usual.

Recently, Unity added a new tool to its arsenal, in the form of Property Drawers. They allow specifying how to display your own types inside Unity's editor interface, when contained as a variable of a MonoBehaviour. Previously we were limited to specifying how to draw a whole component, which had its limitations in terms of reuse.

So, now that you know they exist, you might start looking around for examples... only to find the most trivial one repeated over and over again: a Property Drawer for a class with one simple variable. But you want to display an array, or an array of colours, or a visual angle selector (which is used in an example, but its code is curiously missing). Something actually useful when editing complex games in Unity.

So, I'll save you an hour of reading through documentation and debugging weird errors. Property Drawers are very easy to use when you know what to pay attention to.

Basic case: a class with a Sprite picker

Let's create a simple class LayeredElement.cs, to organize Sprites.

LayeredElement.cs:

    [Serializable]
    public class LayeredElement {
        /// <summary>
        /// Order in which this element is painted,
        /// 0 being the background.
        /// </summary>
        public int layer;
        public int Layer { get { return this.layer; } }
    }

    [Serializable]
    public class NonConfigurablePart : LayeredElement {
        public Sprite sprite;
        public Sprite Sprite { get { return sprite; } }
    }


To display NonConfigurablePart we need to expose the layer and sprite variables. Currently I don't know how to display a texture/sprite selector using EditorGUI, so I'll use a simple selector and display the sprite independently.

NonConfigurablePartDrawer.cs:

    using UnityEditor;
    using UnityEngine;

    [CustomPropertyDrawer( typeof( NonConfigurablePart ) )]
    public class NonConfigurablePartDrawer : PropertyDrawer {
        // Default Unity line height
        private int textHeight = 16;
        // All sprites wiil take the same area.
        private int spriteDim = 60;

        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
            EditorGUI.BeginProperty( position, label, property );

            // Store the original indentation.
            // Since we are being drawn inside a component,
            // changing it could modify how later elements are displayed.
            int origIndent = EditorGUI.indentLevel;

            // Obtain the properties we are interested in. Accessing variables by name is error prone, so be careful.
            SerializedProperty layerProp = property.FindPropertyRelative( "layer" );
            SerializedProperty spriteProp = property.FindPropertyRelative( "sprite" );

            // Name of the variable this NonConfigurablePart has in the current MonoBehaviour.
            EditorGUI.LabelField( new Rect( position.xMin, position.yMin, position.width, textHeight ), label );

            // We don't use indentation, actually, so just get rid of it
            EditorGUI.indentLevel = 0;
            // Calculate the area to use for the layer field.
            // 130 is the number of pixels Unity usually leaves before showing variable setters.
            // Found via trial and error =)
            Rect layerRect = new Rect( 130, position.yMin, position.width - 130, textHeight );

            // Check if it was modified this frame, to avoid overwriting the property constantly
            EditorGUI.BeginChangeCheck();
            int layer = EditorGUI.IntField( layerRect, "Layer", layerProp.intValue );
            if (layer < 0) layer = 0;
            if (EditorGUI.EndChangeCheck()) {
                layerProp.intValue = layer;
            }

            // Calculate where to draw the selector (right below the layer field).
            Rect selectorRect = new Rect( layerRect.xMin, layerRect.yMax, position.width - 130, textHeight );
            // PropertyField updates the property automatically, so no need to BeginChangeCheck
            EditorGUI.PropertyField( selectorRect, spriteProp, new GUIContent( "" ), false );

            // Calculate where to draw the sprite
            Rect spriteRect = new Rect( 130, selectorRect.yMax + 5, spriteDim, spriteDim );
            this.DrawSprite( (Sprite)spriteProp.objectReferenceValue, spriteRect );

            // That's it. Some little house cleaning and leave.
            EditorGUI.indentLevel = origIndent;
            EditorGUI.EndProperty();
        }

        // Calculate height required by the component.
        // Notice the absence of position; we cannot rely on a controlled width...
        public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {
            // Layer (and label), selector and the sprite itself.
            return this.textHeight * 2 + this.spriteDim + 5;
        }

        private void DrawSprite(Sprite sprite, Rect spriteRect) {
            if (sprite != null) {
                EditorGUI.DrawTextureTransparent( spriteRect, sprite.texture, ScaleMode.ScaleToFit );
            } else {
                // Draw a visibly unconfigured rectangle
                EditorGUI.DrawRect( spriteRect, Color.magenta );
            }
        }
    }


There is nothing extraordinarily complex here, but some very specific calls and behaviours.
Keep reading for something a little bit more complex.

2013-09-26

Implementing a Transition-based State Machine

Warning: this is one of the code heavy posts I once warned about. Those allergic to discussions of programming topics or big listings of code (C# code; it's not that bad), keep walking. Or stay and become harder, better, faster, stronger...

In this article I will introduce a (probably not so) new approach to implementing State Machines, mostly for videogames. The reference is, as usual, Buckland's implementation in his Programming Game AI by Example book. His version of the state machine was and still is the de facto standard when coding small AIs or logical behaviours. Although new and improved systems exist, like Behaviour Trees, FSMs are still pervasive in the video game industry.

FSMs have been slightly improved through time, as languages and techniques developed, offering new possibilities, but the core remains pretty much unchanged. Here I will introduce one major revision to how SMs are implemented and, more important, used.

Basic introduction to the classic State Machine

In Buckland's book, State Machines are composed of several elements:
  • The State Machine itself, which contains
    •  A reference to the machine's owner
    • The current state to execute
    • The global state to execute
    • The previous state, in case a behaviour requires going back to it
  • A base generic abstract class State<T>, with methods Enter, Update and Exit. Enter is called when the state becomes the current one, Exit when it stops being so. Update is called on every execution cycle (of the state machine, not necessarily of the game or entity).
  • A collection of singletons derived from State<T>, one for each behaviour T can display.
  • A messaging system which allows communication between entities. State<T> includes an abstract method to evaluate messages and treat them if appropriate.
Important details:
  • States are, curiously, stateless. That's why a reference to the owner is required: it must contain all the state information the machine needs.
  • It is considered in bad taste (but unfortunately common) to transition from outside the states themselves, but the state machine usually allows this through several hijacking methods.
Thus, each state is responsible for checking its possible transitions. State hijacking is supported via the global states, which check conditions outside the scope of low level ones. If used, global states usually become a state machine of their own, to support all the possible situations.

2012-10-10

Game Design Challenge: Wii U

This is probably the fastest GDC submission I've sent. From inception to emailing in barely 90 minutes. And, surprisingly, I'm quite proud of it. Still, I can't avoid thinking I've seen a very similar idea somewhere. EVE: Dust 514? Somehow, but not quite. Nintendoland? I didn't know much about it until 20 minutes ago. Sanctum? Iron Brigade/Trenched? These focus more on the tower defence side of things.
Anyway, meet Squad Action

Squad Action: Working Title

SA:WT is a hybrid DOTA/RTS multiplayer game for Wii U which takes advantadge of the console's online platform and varied controller possibilities.

Teams of 2 or 3 players work together to destroy the enemy base while keeping theirs safe. Each team will count with one commander and one or two ground troops.
The commander surveys the battle ground using the Wii U Gamepad and its touch enabled screen in RTS fashion.
The soldiers play in the main TV screen, FPS style, using a WiiMote and Nunchuck. They will traverse the combat area fighting the rival players and structures.
In local games the TV screen can be split up to four times to accomodate 2 full teams (plus two Gamepads), while online teams can play from different locations and screens.

Resources are collected by soldiers while alive, at a rate of one unit per second (main advantadge of killing enemies), defeating enemy troops or buildings and disabling the enemy commander's droid. Most of the resources collected are sent to the team account and a small part is kept for personal use.
Ground troops can return to the base to buy basic equipment and heal, but they cannot upgrade their loadout. The commander can offer equipement recommendations and loan part of the team resources to a player, so she can acquire equipment out of her reach. These loans would be later discounted from the players' collected resources, trading a short term advantadge for future income problems.

Options available to the commander:
- Build gates, sensors or turrets in their half of the map.
- Upgrade soldiers' armour and weapons.
- Buy and drop temporal buffs almost anywhere on the map, which can be picked by allies or enemies.
- Place warnings or attack signals on the map. In local games these can be seen by the enemy!
- Browse available equipment and mark recommendations.
- Loan resources to team members.
- Deploy a remote controlled droid.

Remote droids are controlled from a FPS perspective in the Gamepad display. They have limited combat capabilities but are the only way to build the most powerful structures, repair damaged equipment or resurrect team members before their respawn time arrives. However, while the bot is deployed the commander can do nothing else and, should the bot be destroyed, they'd be unable to play for 15 seconds, or up to a minute late into a match. The bots can self-destruct without penalty, but it takes 10 seconds until the sequence completes, during which the robot cannot move and is open to enemy attacks.
The bot can also transform into a stationary turret atop the team's base core. These turrets are very powerful and provide extra protections to nearby allies, but turn slowly and if destroyed will damage the base noticeably.

The winning team will be the first to destroy the enemy base or reach a set amount of resources, depending on game/map type.

Update: SA:WT is one of this month's highlighted entries! I'm glad that someone has enjoyed my idea. One more for the list of pending projects!

2012-03-16

Review: Rez (Q Entertainment/Sega/HexaDrive, 2001/2008)


Platforms: Dreamcast, PS2, XBLA

In one of my first posts I exposed my distaste for the punctuation system used in videogames. As I said, my opposition stems mainly from videogame reviewer's reluctance to give marks below 6 and the 1 through 10 standard reliance on a mythical perfect game. This perfect game is, per se, impossible, and using it as a measure, therefore, pointless.
Although I remain adamant that perfection is unattainable, I request permission to exercise my right, as human being, to contradict myself by stating that Rez is, without the slightest doubt, a perfect game. Its perfection, however, does not arise from the impossibility of improving it -I'd gladly accept one or two extra areas on par with the ones available- but from the fact that any enhancement it received would fail to add anything to the experience as a whole. Rez can only improve by becoming larger, prettier or more literate, but none of these changes would make it any better than it already is. This is clearly demonstrated by playing the HD version available for the Xbox360. It looks better, sounds great, is panoramic and has a couple extra features, and remains exactly as good as the PS2 or Dreamcast versions ever were. I still play the PS2 and HD versions from time to time, depending on which one is at reach, and can't fault any of them.

Rez, gloriously low res
In trying to explain the greatness of Mizuguchi's magnum opus, let's get started by clarifying what Rez is not: a story game. What little narrative it has is implied in the hacker lines it displays from time to time and in the astounding* final area, and no more is needed. The tutorial, which is not that good, is more relevant than all the text present in the rest of the game, excluding "analyzation", "shot down" and "support item". Because those three arbitrary groups of letters, simple as they seem, are all this game is about: analyse all areas to 100% percent to unlock the next one, shoot everything that moves and collect as many power ups as you can. Why, you ask. Because the game encourages you to interact with those simple terms.
Players first learn to shoot. And shooting feels good because it produces a nice, simple note. Shooting up to eight targets at once feels even better, as it creates a simple and beautiful tune: duru-ruprup, turaruraru. As enemies get bigger or closer together, the rhythm and tone get more frantic, luring the player into the musical frenzy.
Collecting items is revealed to be important because they are obviously different and shooting at them just sounds better. As if that wasn't enough, accruing eigth blue items (less in later phases) transforms the avatar into progressively more detailed depictions of completeness and tranquillity AND awards you extra lifes. There is no indication of how many impacts you can sustain, but it can be instinctively guessed. Collecting red orbs turns out to be useful too, as each one, up to four, becomes a short-lived, powerful auto-shoot at your request.

It's mine, my precioussss
 The other special item is identified as particularly important because, when shot, mutates from a probe into a shiny countdown box. Release a full blast on it and a rainbow congratulates you, followed by a surreal deformation of space and a new region of the level. Somewhere in the screen you read 10%, later 20%... and you just know you need 100%.

That's it. With just one verb (or one stick and two buttons), sound cues and simple graphics Rez is able to completely explain itself in the first five minutes of gameplay. As levels progress, the wording gets more frantic, but the meaning remains the same: the enemies are instruments and you have to compose art. The music and graphics, although fundamental to the game, never take the focus away from the core, and only work to enhance it.
Music is simple and integrates with the frequency and spacing between enemies. Your shots are synchronised to the music, and so is the whole of the screen.
The background and reticule are rendered in wireframe -and a subtle glow when aiming, so that enemies and other targetable objects can be easily identified. Enemies feature simple shapes, almost iconic, with the most distinctive being tentacled beings composed of hundreds of small squares. Whether this minimalistic approach was a matter of hardware limitations or a choice made long before development started I can't tell, by I can assure you that contention in the graphical area was the best thing they could have done.

Simply beautifil of beautifuly simple?
 In the end, nothing gets in the way of the experience, but everything collaborates to make it deeper. And this is exactly what defines a perfect game.

Beyond shooting, Rez offers variety in the form of mutating levels, mixing different possible configurations each time a level is played. After dozens of hours spent in its world I am still surprised by combinations I had never seen before.

The man changes its behaviour depending on your proficiency
And then there's the fifth area, with its haunting beauty, melancholy and sensitivity, letting us know that videogames can be deep without breaking the definitions we use to constrain their possibilities.

Conclusion

I can't create the chart right now, but as soon as I can, I'll upload it. Spoiler: Rez is at the top and Child of Eden is dangerously close the bottom.

EDIT:
Here's the chart.


* Marvel has sadly reduced the word "astounding" to meaninglessness.

2012-01-04

Review: Etrian Odyssey III: The Drowned City (ATLUS, 2010)


It took long, but two days ago I finally beat The Drowned City's three endings, so at last I can say that this is, accompanied by Castlevania: Order of Ecclesia, at the top of my DS charts by a decent margin.

Etrian III is built like a good post-rock/post-metal/prog album or song, as any decent game should be. A common thematic undercurrent and instrumentation (story, mechanics, general rules) encapsulates the whole, slowly progressing so it never repeats itself, revisiting previous moments with a new twist, and always insinuating the breaking points when everything will come together gloriously. Also, there must be something unexpected inbetween, plus new things to discover when we decide to play the album again.
EO3 follows this rules almost to the letter, with its level design getting more complex as time goes by. All of the 5+1 strati our guild must conquer start conservatively, introducing minor changes to the basics and new monsters to get used to. Once the player got used to the new environment, new game elements are introduced in the following levels (new FOE patterns, currents, mission types or traps) to expand the world as we go down, one level after the other, always yearning for the next surprise.

EO3 also feels like the great comeback from that band that so deeply dissapointed you with their second album*. After identifying everything that failed in Heroes of Laggard, ATLUS removed almost everything new, refined the formula and added some amazing new tricks.
Once sea exploration, weapon forging and the new classes are introduced at the beginning, all goes back to old style Etrian, until the real additions are revealed half way through: a second city, subclassing and story branching come quickly one after another, setting EO3 as a whole sequel, instead of the expansion feeling that surrounded all of EO2. And, eventhough story branching seems irrelevant at first, it is later put to good use at the end of the 4th stratum, when the consequences of each choice are finally introduced. And with this the pieces are set for the final feature introduction: meaningful replaying in a proper New Game+ mode for the first time.
All this together manages to make this third entry in the series superior to the original, including its amazing revelation of the 5th stratum.

Princess, Ninja, Pirate. Add water. Mix.
Subclasses alone have such an impact on the way the game is played and exploited that it is the core of The Drowned City. If the series was known for the freedom it offered when creating a party, subclasses add completely new levels of customization, making it quite hard to share more than one or two combos with everyone you know who playes the game (unless, of course, you all follow the same guides and dislike independent thought). The most common combos would include a cross between Ninja or Buccaneer and a Zodiac or Arbalist, plus a Monk/Ninja or Ninja/Monk, but that's already a few possibilities. Add in the other options and you can satisfy most RPG players' dreams. And, to top it all, there are few and unlikely choices that would produce a party unfit to beat the game.

Another addition, although less notable, is the existence of invisible areas,  where auto-mapping is disabled and in which FOEs don't show in the map. It is, however, quite a minor feature, requiring just a bit more caution and attention from the adventurers.

2011-12-14

Too many bundles

Cave Story seen by @naramura. Shared by @Nicalis.
Today, 14 Dec. 2011, a new Humble Indie Bundle has begun, barely a week after the previous Humble Introversion Bundle concluded. And with it, we've already had 6 bundles from Wolfire in a year: Frozenbyte, Indie 3, Frozen Synapse, Voxatron Debut, Introversion and Indie 4.

Add in Desura's Indie Royale bundles, with its 3 weeks cycle, UK's The Little Big Bunch, supposed to start today, and the fact that indie developers were already quite fond of selling their games in packs, and you have way too many offers like this in a considerably small territory.

Although I like the idea of selling games this way, which clearly works and benefits every participant, I'd like it to stop for a moment and take a breath. Think of the consequences this madness is bringing.
Right now, we live in an ecosystem in which players start wondering whether buying an indie game at release makes sense. If it is any good, chances are it will be sold with some other games at very low prices, even as low as 0.01€, in less than a year. Early buyers are heavily punished.
The standard price for games is also being established at a dangerously low margin of "as little as you want", potentially harming developers who prefer to set their one prices and use sales or gifts to attract new buyers as time goes by.

If anyone involved in this madness reads this, I urge you to reconsider. Keep the good work, release and promote bundles, but slow down. Don't burn the formula or your clients' pockets too fast, or the market will be saturated and possibly damaged. Now that the indie scene is starting to flourish, we must take special care that it grows strong and at a good pace. By watering it to much we risk rotting its branches and roots.

Disclaimer: I'll still acquire HIB 4, of course. It's the best bundle I've seen since Introversion's Anthology! And I love playing from Linux.

2011-12-12

Roguelike Line of Sight by Eric Lippert


Isn't it wonderful when two passions get intertwined in ways you never expected? The passions in question are Roguelikes and the C# programming language, joined in the person of Eric Lippert.

In this week's post Eric has tackled the problem of developing a line of sight algorithm for roguelike games, which he'll apparently follow with an implementation. An interesting read for programmers and players alike, which saved me the time required to read through the forums myself =) And don't worry, the technical details are not enough to blow anyone's brains*.

For those not in the know, Roguelikes are top-down view computer role games of unusual graphical simplicity (environments, objects and characters are usually depicted using ASCII symbols) and extremely complex worlds. The genre's identifying marks are random generated dungeons, permanent character deaths (the save file is deleted if the character dies) and cumbersome controls. You should check ADOM (Ancient Domains Of Magic) or NetHack, if you haven't already.

And Eric Lippert is a respected member of the .NET community, having worked on the compilers of Visual Basic and C#, and lately leading the development of Roslyn, an on the fly VB.NET and C# compiler and analyzer.

* Disclaimer: No guarantees regarding the rest of the blog. Tread with caution.

2011-11-19

Fragmented lives

Two days ago I watched, once again, Trois Couleurs: Bleu, the first movie in Kieslowski's Colours Trilogy. In that movie music is used to illustrate the main character's missing links with its family. And all the while I wondered: why do games so rarely use music and game elements to such effect. I've seen this done, from time to time, although not to its full potential, and usually limited to the music. Character themes and such.

But how could this be turned into something exclusive to video-games? The usual is removing characters which enable secondary actions (Beyond Good & Evil's partners, Dark Souls's Fire Keeper), or an object (Sands of Time's dagger), but I can't think of an instance in which the player's actual ability to interact with the environment was limited or bolstered by changes in the protagonist's motivation or expectations. Except, once again, Demon's Souls and Dark Souls' human/ghost/undead forms come to mind.

I'll give some thought to ways this could be accomplished, or other games I've seen something like this.

And that's it for today.

2011-10-09

Running out of games to buy

Update (2011-12-14):  The way things are looking, STALKER 2 might finally include no "always connected" DRM protection at all. The dust is still setting, but GSC seems to have closed its offices. A sad day for Ukranian game developers and players all around, for sure. Please, guys, if you have the opportunity to finish the game, respect your clients and protect the game in a sane way.

Original post:

Today I have learnt that the next chapter in the STALKER (no more s.t.o.p.s., please) series will come with a little present: DRM requiring constant internet connection. Another thing I've learnt today is that I will not play that game. And that realization hurts, because I am a huge STALKER fan. I own the trilogy: Shadow of Chernobyl, Clear Sky and Call of Pripyat. The last two, I bought them on release date, and was proud of having supported GSC.
Why not buy STALKER 2? I will not accept been treated like a criminal by default, and I have already been bitten by this DRM stupidity. Clear Sky in Western Europe was distributed by Deep Silver, who slapped TAGES into it. TAGES, I found out, is incompatible with my DVD reader, and what did Deep Silver's support recommend? Get a new DVD. Haven't bought a Deep Silver product since, the same as I do with any company who betrays my trust.

But, sadly, during the last years my boycott list has grown non-stop. The videogame industry is becoming more and more unfriendly to its clients, constantly creating barriers between games and players: DRM, online passes, activations and even DRMed save games. The joy of playing is gone, replaced by the absurd requirement of registering, activating, checking the internet, writing codes and what not.
CEOs of the world: I am tired of all this. I don't see the point in giving money to your companies, when you only think of ways to make me pay full-price and give as little as you can in return. I refuse to ask for permission to play my games and I sure don't like having to rely on your servers, either.

After more than a decade of faithfully buying several games per month, I find my options limited, but not for lack of promising games, but for an excess of stupidity in the industry. I've gone from buying 3-4 games a month, even if I had no time to play them, to 1 or 2, with luck. And that average only holds because of independent developers and Good Old Games. For me videogame news are just a list of games I will not play, either because I am boycotting the company as a whole (Ubisoft), or because I find the security measures excesive (all the rest). And you read it right: not play. I won't even bother pirating the game, because I talk a lot about what I play to friends and acquaintances, and I will not give free advertisement to Ubisoft and company. You are not getting even an indirect sale from me.
Once DRM is removed, as happened with Mirror's Edge and Mass Effect, I'll gladly buy the game. But, most probably, by then I've already lost interest in the game and the publisher will have lost a sale.

Nowadays PC gaming is almost completely lost to me, and I fear that Valve's intentions to integrate Steamworks into PS3 releases will bring console games to the ground, too, as online passes are starting to do. If things keep going this way, I'll have to forget about playing, and bring books and movies back as my main hobbies.

And I won't feel sorry for any of the developers who forced me out of gaming.

2011-10-06

League of Legends Dominion: impressions

For those not in the know, Riot just released a new 5v5 game mode for League of Legends. It's selling point is that it is based on control points, rather than base defense and lane control, and offers a faster paced experience.

Short introduction

In Dominion each team base starts with 500 energy points and, each second, the team controlling more towers removes as many points from the rival's energy as the difference in controlled points. In order to make things interesting faster, Heroes start at level 3 and with enough currency for a couple of items, experience and gold are much easier to obtain and almost every fight is to death, especially the first encounters. This is because the time spent dead has been drastically reduced, to ensure players are more aggresive.

Is it any good?

It is fun, that's for sure. A match consists of 20 minutes of running around, attacking, defending bases, chasing and escaping, with the tide of battle changing easily. So easily that most games are won by very close margins. I have even lost a game to a team with only 1 point remaining.
But all this tension is continuous, without a pause or moment for reflection. While dead, you barely have time to look for your next item and buy it. There's no sense of progression, narrative or strategy, because all actions are more imrpovised than thought out. In this stressful environment communication is too difficult, to the extent that almost noone speaks more than monosillables. Also, the absence of secondary objectives, like guarding Baron Nashor's lair in the classic 5v5 map, takes away from the experience.

In the end, after a battle in Dominion, little more than the result is left. Each encounter in Summoner's Rift, on the other hand, feels like a story in which you evaluated your opponents and tried to counter their strengths, coordinating with your allies*. Also, since death is a lot more relevant, you learn to fear those characters which kill you in a breeze (Annie, Kata, hello!).
Like in narrative, the ideal is to introduce rest periods after moments of great tension, so the player can take a breath before going head first into the next fray. The tension must also go in crescendo, after each pause. This way, each new peak of excitement feels more pronounced**.
On the contrary, when exposed to constant action, as in Dominion, every new encounter is treated by the brain as the same thing, eventually losing part of its interest. If Dominion matches where any longer, it would soon become tiresome. Riot did well keeping things under 25 minutes, but even at that lenght I still get tired of this game mode.

Conclusion

Maybe Riot will some day manage to add extra depth to its new child, but until then it will probably remain a distraction from repetition. Its advantadge is that rival DotAs don't have a secondary game mode to break the monotony, once the competition from Valve and Blizzard arrives.
LoL's best card, its extremely wide and varied hero roster, might not be enough to fend of the attacks by itself.

However, I am not convinced that Dominion will save LoL from Valve and Blizzard's attempts at stealing its market share. The genre has a small fan base and big companies can do a lot of damage to Riot, through advertisement and simple brand awareness.


* Of course, there is always a black sheep who only complains about the noobity of the team. Welcome to the sad reality of online societies.

** Check Schell's The Art of Game Design for more about narrative in videogames. Or any good book about narrative, actually.