So, yesterday was the first ever Indian ComicCon. Accordingly, I packed a bag with enough clothes for two days, and by 10:20 yesterday (Saturday the 19th) I was off towards Delhi. Public transport here being what it is, I only reached reached the event by around 5:30, it having started at 12, and set to end at around 7:30. Still, at least I had arrived, and how many times to you get to attend the first day of a country’s first ComicCon?

It was held (and, as I type this, is still being held) in Dilli Haat, a part of New Delhi, which I had never visited before. I found it to be a large set of handicrafts stalls, followed by a set of stalls each promising the cuisine of a different Indian state. Honestly, to me the whole thing seemed like trash for foreign tourists, but even then, it was a nice enough place to be in. Finally, after walking past the pashmina shawls and ethnic foods, I finally reached ComicCon itself, all six stalls of it. Now, that may be a slight exaggeration, there may have been a couple more than that, but if you are going to hold a full convention, then I expect the number of booths to at least hit the double digits.

Still, at least the low number meant that I could go through each stall thoroughly. Even then though, the Campfire stall held little interest for me as I had already gone through their comics when they had come to BITS a few weeks ago (speaking of which, I will soon briefly review six of their works). The Amar Chitra Katha stall also did not really grip, as although I love them, it is the memory of a childhood love of the thin, brightly colored single issues they put out, not the glossy compilations that they were displaying here. I completely skipped over a stall that was publicizing a set of graphics-heavy retellings of Indian mythology. Virgin Comics’ Ramayan 3392 has permanently killed any interest I could ever conceivably had of those, so I really have no regret about that. Similarly, I didn’t bother with a stall that was selling miscellaneous merchandise, none of which looked comic book related.

Of the other stalls, there were a number selling comics, albeit not particularly interesting ones. Still, I bought a classic series of Spider-man, the Death of Captain Stacy, back when John Romita, Gil Kane and Stan Lee were all on it. It actually is a good read and I have always liked the Silver Age Marvel comics. Buzzinga was selling a number of interesting posters. There was a really good Batman poster which I wanted, but was sadly sold out, a nice Halo Wars poster, which Aditya Pradhan bought and a Watchman movie poster of Dr. Manhattan that I had considered for a while, but when the salesman told me how they had been selling like hotcakes, really did seem too common.

The swag of the show though was without any doubt the graphic novel Hush from Manta Ray. This had been created with the intention of telling a story without using any words, and succeeds wildly. At no point do you feel the need for expository text, and leaving out all text creates situations where you realize for yourself what is going on, which makes the comic a much more personal read. The story is never anything particularly new, but it uses that well, playing into what you know to make comic at times more understandable and at others more surprising. This is the sort of comic where immediately after finishing the first read, you go into a second to continue the flow. The second reading, where you have some idea of what is going on, and then everything clicks into place, is a whole new read, and just as rewarding as the first. Also very much worth mentioning is how the entire story is placed in a clearly Indian school, with clearly Indian underpinnings everywhere, but never tries to extract anything from the readers over the fact. I really do appreciate that.

As the whole thing was so short, and I had nowhere to stay, I decided at around 8 o’clock that I may as well go back to Pilani. This meant my missing Nanya, which is quite unforgivable of me. If I travel all the way to Delhi, one of the things that just must be done is to see her. This is all the worse as she had even asked if she should come to Comic Con when we reached, and I told her not to bother, thinking that we would see her tomorrow, and that she may as well avoid the trip as we were not sure whether it would still be open by the time I reached. It also meant missing my grandfather, but that is a story that needs a lot of background. Still, I had seemed to have exhausted all that Comic Con had to offer.

All told, this was not very good for the first ComicCon I have ever attended. I can understand how it may be hard to find stalls, although this few is just a joke. Nevertheless, it is hard to do in India, and I don’t really fault them for that. What I do fault them for is not bringing in any feel of a convention. There was no real craziness, no place to socialize and no real help for anyone there. What I really wanted, and rather expected, would that there would be a large floor where people could simply stand together and talk, but the way it was situated, at the tail of Dilli Haat just was not conducive to this. I also really would have liked a booth where I could have gone for information (such as where it would be possible to stay). The convention never really felt as though it was taking itself seriously enough. There were no seats for people watching the panels, there was no real comic book enthusiasm, there really just did not seem to be much going on. Dilli Haat is a nice enough place, but not at all suited to this sort of thing. Personally, I doubt that I will attend next year.

This is even more self-indulgent than what I normally put on here, difficult though that is to achieve, but sadly no one is around to edit what I write, so I am putting it up anyway.

One of the my eternal temptations is to go into writing instead of video game development. This is because, frankly speaking, it is much easier. Now, it is hard to write well, I am not going to get into comparisons between the difficulty of writing well and making good games. That won’t add anything to this post, and would probably devolve into “my daddy is strongest” type arguments. My point is just that it is easier to put something down on paper that anyone can read than to write enough code, draw enough art and write enough game story that anyone can play.

The problem is though that when I start writing, especially when I am writing a critique, I can’t help but get the feeling that everything I put down has already been said. Not just the ideas that I am trying to get across, I can live with those being out before, but even the way I say it, the style, the setting, even the words themselves all feel too familiar. Sure, this particular permutation of them may be unique, but that doesn’t keep the whole thing from feeling derivative and laving a bad taste in the mouth of not only the reader but also, and somewhat more immediately, myself.

When you look at games however, this is a field which feels so much more open. Even the game I am currently making, there are a lot of familiar elements in it, certainly, but when I see people play it for the first time, and the time that it takes them to adjust to its combat system, I do feel that I have created something novel, and it is a very satisfying feeling.

Of course, a lot of this is that I simply am better at, and spend a lot more time in, creating games as compared to writing. Quite possibly, if it were the other way around, my feelings would be just as reversed. After all, so many of the games now made are stock derivatives. Whatever the case, at least for now, the song seems sweeter on this side.

Now son, lots of people were always coming through this bar, all friendly folk, as fine a bunch as I could hope to see, and when one of them wanted to do a bit of the music, why I would just be tickled pink. Some of these gentlemen, why they was fine players, mighty fine indeed. Lord, but was a treat to play with them.

Now, I always enjoyed playing with the gentlemen, but there was this one boy… Oh, he was not a bad player, there were many worse, and this boy loved his jazz. Loved it maybe too much, truth be told, ’cause when he would get up on that stage, and give us all that wide, sunny smile, and then just fall into the music… for one minute, all sixty seconds, Lord, you would feel that you was the Duke, and him Mister Armstrong, and that the both of you was just going to play all might, nothing but the music. Oh my, it was grand, for a minute there was just you, the keys and the jazz, that jazz that lives in the soul and strains at the fingers. For that minute, there was no world, just the playing.

And then, it would happen like it always would. You would play the wrong key, and that off-note would ring out of itself, and hang in the air until there was nothing left in that air worth holding on to, and that was when you would remember that you were not the Duke, and you were not Mister Monk, and he was not Mister Armstrong, but you would have to keep playing anyhow. And you would never be the Duke, but you would have to keep playing anyhow.

When those nights ended and the applause stopped, and the last tip had rattled in the jar, those were the nights I would drink myself to sleep.

KoTOR Was Wrong

2010/07/24

This is an aggressive title (although less so than my original, RPGs Are Wrong). So, let me back down a little. This is nothing more than an analysis of the mechanic of gaining light and dark side points, or anything similar, through actions.

How Are They Wrong?

Aesthetically – Cause And Effect

Getting dark side points for performing evil actions is the same as telling the player that he has become more evil by performing an evil action. This however is an absurd inversion of cause and effect. You do not become more evil because you kill beggars, you kill beggars because you are evil.
It can be argued that performing the act gives such enjoyment that you become more likely to do it again, and so become more evil by performing the action. It is necessary in such games that angels can fall or demons be redeemed. However, this system does not aid this either as by the end, players can have accumulated enough alignment points that even with a drastic policy shift, they will end the game with the same alignment. These are after all quite long games.

Minigame – Distraction From Story

This ruleset makes conversation essentially a minigame where you figure out the text choice that will lead to alignment points. Firstly, this ruins any hope of immersion in the story, which should be the strongest part of an RPG. Players do not act as they envision the character would, but instead act for dialog points causing players to focus less on the story, and more on the game as they are rewarded for doing so.

The second problem is that it is a painfully bad minigame. There is never any point where you are in doubt as to what speech choice will give you alignment points (even in KoTOR2, after Kreia berates you for your charity, that does not stop you from getting light side points for similar activities later). If a minigame has no skill, it should not be part of the game.

Black and White – No Room for Magneto

This is the most obvious of my objections, and so there is really not much point on elaboration here. Simply put there is no room, for instance, for a character who simply views everyone as below him. There is no room for Magneto.

Solutions

Fix Nothing – Exupery’s Perfection

The simplest solution possible is just to rip the mechanic out entirely. This is drastic, but as countless games have proved, it is not necessary for this mechanic to be part of an RPG. However, there are separate paths in these games, there must be a light and dark side in a Star Wars game. So, we must make provision for it.

Alignment Choice & Shift

Simply have the player choose alignment at the beginning and allow him to play as he wishes. If the player acts contrarily to the alignment over a sustained period, then the alignment should shift. However, this should only be for the most extreme cases. Otherwise, just let the player play.

I have been writing a music program, and right now it is still very much in development. Its key feature, recommending songs based off other people’s music, is still far away. However, it does have one person who uses it for all that he can – me.

Now, this is by no means because it is the best music player out there. It is not. So many things which we take completely for granted are missing. I have not been able to listen to John Lennon in a while as it refuses to play wma files. Many minor annoyances which I just never had to deal with earlier pile up. It is really a painful process.

That fact is why I do this. There are no excuses with your own personal program. If a feature is missing, then it is because you have not gotten around to implementing it. It is in your hands, and yours alone.

Now, it has become a habit to note down what I feel is missing from the program. On a regular basis, I will miss a feature, either from a different music player, or, now that I have the habit of wishing for features, from m own imagination. The moment you start forcing yourself to use your own program is the moment where your daily grievances and whining drastically increases.

However, a feature that you personally want is quite often a feature your future users will want also. Your productivity will greatly increase as you now assign much higher priority to the program. Also, quietly and to yourself, there is a lot of satisfaction from saying that you are listening to a program which you wrote.

It is an uncomfortable thing to do, using your program from the earliest moment that you can, but it is rewarding for both the final program and for yourself.

This is really a pretty stupid hack, but somewhat interesting to see. Python does not implement actual privacy in the way of C++ or Java. Instead, what it does is name mangling, which was done so that derived classes would not overwrite the methods of the base. This is done by putting a double underscore before the name of the method. An example would be:


>>> class A:
    def __init__(self, x):
        self.__x=x
    def getX(self):
        return self.__x

>>> a=A(3)
>>> a.x

Traceback (most recent call last):
File “”, line 1, in
a.x
AttributeError: A instance has no attribute ‘x’
>>> a.__x

Traceback (most recent call last):
File “”, line 1, in
a.__x
AttributeError: A instance has no attribute ‘__x’
>>> a.getX()
3

Ignoring the fact that the above would be much better done by inheriting from object and using a property, this is how privacy is generally implemented in Python. However, as mentioned above, all it really does is mangle the name. So, if we wanted to, we could still do:


>>> print a._A__x
3
>>> a._A__x=7
>>> a.getX()
7
>>>

and thus access the variable anyway. If you really want to, you can probably get around any privacy implementation you want to, but it is really very easy in the case of Python. As Guido van Rossum says, we are all consenting adults here. Besides, there is nothing really stopping you from opening up the petrol tank of your car so you can light it with a match when it doesn’t run the way you want. This is a fact which is to be known and not used.

Still, the interesting thing is that now that you know how the name mangling works, what if you mangle the name to hide into a different class? We get something like this:


>>> class Top:
    def __init__(self, bottom):
        bottom._Bottom__getTop=lambda :self

>>> class Bottom:
    chk=lambda self, top: self.__getTop()==top

>>> bot=Bottom()
>>> top=Top(bot)
>>> bot.__getTop()

Traceback (most recent call last):
File “”, line 1, in
bot.__getTop()
AttributeError: Bottom instance has no attribute ‘__getTop’
>>> bot.chk(top)
True
>>> tp=Top(Bottom())
>>> bot.chk(tp)
False
>>>

Still, just because we can do it this way does not mean we should. This is a pretty bad idea, breaking into the abstraction of another class like that. A better idea would be to simply have the Bottom class store the top itself instead of just the check. Another way would be to simply make the function public. Both of these are a lot easier for someone else to follow than the above idea. Just look at the code, keep reading my blog if you found it interesting, and never, ever use it in actual code. Or, I will hunt you down, and ritually sacrifice you to the gods of readable code in the hope that doing so will keep them from exacting their terrible vengeance on my poor self. But still,

“Although practicality beats purity”

The zen of python, Tim Peters

When making games, there is generally some data which I do not want to keep inside the code itself. That way, it is nice and easy to edit, and can be changed by the program itself, if needed. A classic case would be high scores. This needs to be stored outside the code as it will be changed by the program (although, I suppose if you are making the game open source, you could just modify the code, and store it there). Another example could be the list of characters and their attributes. By keeping this outside the main code, it means that it can be edited without wading through a sea of code, making it easier for everyone.

Now, the only thing is how the data should be stored. The first option is to use comma separated values, which are wonderful in their simplicity. These have two delimiters, a comma between values for separating the fields of a record and newlines separating records. Also, ” ” are used to enclose data with the reserved characters. Very simple, very clear, absolutely no scope for confusion.

So, now if I wanted to store the above high scores, it would look something like the below:
A,300
B,200
"X, the Y", 100


Very simple, very minimal, very clear, and happily, very easy to parse. Now, we shall move on to seeing how it works for lists of characters. We shall directly take from the character data I used in one of my prototypes. For readability, the first row of the document is the column names, which is allowed by the specification. The result is:

name,speed,attack,strengths,health
castle,0,10,"spear,arrow",100
sword,1,5,,25
spear,1,4,horse,20
horse,2,6,siege,30
siege,1,4,castle,20
arrow,1,3,,15

Which, while still simple and minimal, suddenly looks much less clear. Even with the column headers, there is still a lot to be desired. Especially as whitespace is considered part of the field, and so we cannot prettify the document. To a parser, this is still simple, it is true. But, so is binary. People need to be able to go into the data itself if necessary. The other thing is the slightly awkward handling of the list of strengths. In most cases it is fine. Even when there is no strength and we make do with an empty field, it is clear enough. However, in the case of the castle, where it has two strengths, things look different. As this is only a list, and not an actual tree, things are still easy, and we send a small, comma separated list to be dealt with. However, this itself is not nice to look at, and if we go one stage deeper, things become much worse as we cannot even resort to this simple method. So, clearly this will not work for trees, which, in their callous manner, are still best used for a lot of data storage. In my next article, we will go into a couple of formats for storing them, XML and YAML.

Follow

Get every new post delivered to your Inbox.

Join 37 other followers