Betrayal at…Krilloan

Ξ April 30th, 2007 | → 0 Comments | ∇ Awesome Stuff, Observations |

In my youth I was a nerd. Oh yes - I know that it’s hard to imagine. Surely I couldn’t have been one of the geeky losers; I who became awesome and cool in every way? Well, no, I wasn’t. I was pretty damn cool - I simply had nerdy interests like programming my Amiga, reading copious amounts of geeky literature, and role-playing. The last bit is something I’ve all but forgotten these days, but reading about the Disappointment in the Demonweb Pits made me recall an amusing series of events.

It all began when a friend of my brother’s introduced me to Drakar & Demoner, a Swedish “equivalent” to Dungeons & Dragons which takes place in a world called Ereb Altor. All in all it’s probably a pretty shitty system, but it served nicely as an introduction into the weird world of role-playing games. Table-top ones, that is; I had played several CRPGs before this. Go Ultima IV! Anyway, I quickly decided that this was great fun so I got my own set of rulebooks for D&D. The Swedish D&D that is. I also found some friends who were interested in trying it out.

The first roleplaying session I had with my friends was…interesting to say the least. More than a dozen people who had never roleplayed before sat around, trying to grasp the concepts of this strange way of playing a game. Some had an intuitive understanding of the possibilities: a pair started making out in a bar in-game, and went to do the nasty in a tent. Another person wanted to find people to mug. Yet another tried to explore the town. Then, of course, there were others who just didn’t get the appeal at all and wanted to kill everyone so we’d be over and done with the session. All in all it was pretty amusing for most involved, and eventually I ended up with two or three regular players. Alas, they had no idea of how to be Dungeon Master (or as we call it in Swedish: “game leader”) so I ended up with the task of making up stories for them.

Then, just as now, I was a lazy bugger so I mostly bought pre-written stories and modified them slightly for my group. Essentially, I removed the parts involving lateral thinking, logic, or any attempts at non-linearity - those things were too complex. (Do I sound bitter? I don’t mean to sound bitter. Really.) One of these pre-written adventures I bought wasn’t just an adventure: it was a whole city called Krilloan and a large campaign which took place inside the city. When I was just about to set loose my little group of brawlers inside Krilloan, we received an unexpected addition: another friend of mine had heard of our fantastic exploits and wanted to join in.

Sounds great, huh? The problem was that this friend was a bit…well. More geeky. “More geeky than what,” you ask, whereupon I reply: “More geeky than just about everything.” This is the kind of person who, when asked what kind of music he listens to, answers that he listens to in-game music from computer games. Yes. Well. Anyway… To put it bluntly: the other people in my role-playing group found him irritating and obnoxious, and really didn’t care much for his being part of their exclusive group. Still, I couldn’t very well tell him that so he ended up making a character and joining the campaign anyway. Ain’t I a real softie.

Things went okay for a session or two, but eventually the others got really annoyed at the geekier of us geeks, and decided to have their revenge. They communicated through notes with me that they wanted to covertly purchase black masks and black cloaks, and coordinate an ambush on the geek character. They attacked him in a dark alley, mugged him, and slit his throat. Game over. But he got to create a new character and join in again instantly (through some story-telling magic) so no real harm was done. And it was frankly pretty awesome to see his confusion during the following sessions, where he discussed with the others who could have been behind the attack. “It must have been this baron we’re after! He must have hired some assassins!” The others nodded and agreed - that must have been it.

Things were fine for another two sessions or so, until the group found a magical chalice. This was an artifact belonging to an evil church, but that didn’t stop my usual brawler players from being stupid.

“I try sensing some magic off this thing.”
“Oooh, you definitely feel the radiant magic emerging from the chalice! It’s just full of power…”
“Hmm.. So, guys.. What do we do with it? Hey, I know! Let’s pour some wine into it!”
“Oh, nothing happened. Well, it’s a chalice, so…I’ll try drinking the wine from it.”

This is where the geekier guy chimes up.

“No! Dude! This is an artifact from an evil church - you can’t drink from it! Who knows what will happen?!”

The brawlers got quite annoyed at this sensible interruption and growled: “Well, you drink it then.” Of course the geekier person of the crowd refused; but it was too late. The other players held him down and forced his mouth open while they poured the wine down his throat…and then he fell down limp, stone dead.

“Well. Damn. I guess he was right!”

My friends were real bastards.

 

The Vileness of Coffee

Ξ April 20th, 2007 | → 1 Comments | ∇ Observations |

Have you heard of the War of the Golden Stool? Or the Russo-Japanese War of 1904? Maybe Tecumseh’s War? They all have one thing in common:

Coffee played an important role in starting all of them.

The 20th century had barely begun when serious conflicts once again arose between the British Imperial government of the Gold Coast and the Ashanti Kingdom. The latter was a semi-autonomous African state that co-existed with the British; but it was never an easy co-existance. The British constantly tried to assert their authority over the Ashanti after the demise of the slave trade, and twice the Ashanti had risen against the white invaders. In 1900 Sir Frederick Hodgson tried once more to impress the Ashanti: he demanded their submission, and that he would be seated on the Ashanti’s Golden Stool - the stool that, as he understood it, acted as a throne to the Ashanti people. The Ashanti couldn’t resist the white men, and he eventually got his wish; however, as he sat down he decided to drive his point home even further: he smiled, relaxed, and had a cup of hot coffee while he sat on his golden stool. Little did he know that the Golden Stool wasn’t just a throne - whoever sat on it also symbolised the direct embodiment of the Ashanti gods. And the white man sitting there drinking the black liquid was too much for the proud Ashanti: to them it symbolised not only the rise of white gods, but also white gods who would devour the black peoples. Thus began the Third Ashanti Uprising, or the War of the Golden Stool in 1900.

The Russo-Japanese War was a completely different business: in the early 1900s both Russia and Japan had massively imperialistic ambitions, and due to their close proximity they - of course - became bitter rivals. Both countries competed for influence, trade and territory in East Asia, and Japan desperately wanted to convert itself to a modern power. After the Sino-Japanese War (1894-1895) Japan defeated China; this led to the Treaty of Shimonoseki in 1895 in which China yielded many territories to Japan. One of these territories were the Liaodong Peninsula. Three Western countries, Russia, the German Empire and France, tried to apply pressure on Japan to relinquish its claim on the Liaodong Peninsula, because on this peninsula could be found Port Arthur. Russia especially desired this port, since it was the only warm-water port available in that area, and the only viable place in which they could import luxury items from the Pacific. Luxury items? Like what? Yes, you guessed it: coffee. Thus, another war was started in coffee’s name.

In 1811, North America was full of strife. The great War of 1812 stood just around the corner, but before it another war broke out: Tecumseh’s War, or Tecumseh’s Rebellion. Tecumseh was a Shawnee cheif who led an American Indian confederacy against the United States in the Old Northwest. The two principal adversaries in the war, Tecumseh and William Henry Harrison, had both been participants in the Battle of Fallen Timbers at the close of the Northwest Indian War in 1794. That war ended with the Treaty of Greenville, in which much of present-day Ohio was ceded to the United States; however, Tecumseh never signed the treaty - he continued to fight the United States and William Henry Harrison through the years, and ignited the American Indians to a great rebellion in 1811. Why did he do that? The story has it that the two leaders sat down in 1794 to discuss the terms of surrender, in order to come up with a solution that would be acceptable to both parties. Things were proceeding fine until a fateful moment. William Henry Harrison had brewed a pot of strong coffee and, in a friendly gesture, offered a cup to Tecumseh. The latter gladly accepted, tasted the brew, and then exclaimed: “By the ancestors, this is the most vile and putrid liquid I have ever tasted! I thought you wished to come to a compromise - yet you offend me with this awful beverage,” whereupon he stormed out of the pavillion. And he never forgave Harrison until the day he died.

In short, what I’m trying to say is that coffee has caused so much pain and suffering in this world; if we had any sense we would make the disgusting habit of coffee-drinking illegal, punishable by public flogging. It doesn’t matter that you try to disguise the black brew with nuts and milk and cream and whatnot - it’s still an awful thing to put in your mouth. Much better to rely on the magnificent flavour of tea. If you’re ever in Linköping I recommend that you try the cactus tea from the central tea boutique. It has just the right amount of sweetness without tasting like perfume (like most fruit teas do).

Oh, and did I mention that cool people play Sheeplings?

 

Prototyping, Software 3D Algorithms and Sheeplings v1.0

Ξ April 16th, 2007 | → 3 Comments | ∇ Indie Games, Sheeplings, Spandex Force |

At long last, my uber-cute sheepherding game Sheeplings v1.0 is released and ready for purchase! It just might appear on a few portals as well in the near future. I ought to make a v1.1 to improve things even further, but - hopefully understandably - I really feel like diving into something new for the moment. Enter my new project - currently called New Project!

Or rather: enter prototype month.

A while ago I made an experiment with dynamic in-game music that I intended to use in a game called Crux. Recently I made a prototype of the idea, and…it just didn’t work. It was seriously lacking in fun. When it comes to (relatively) new ideas there’s just no getting around it: prototyping is invaluable to sort out the trash from the golden nuggets.

Instead, I started to examine other game ideas I’ve had: a SimCity-esque casual strategy game, a resource management game involving sheep, a game featuring automatically generated logic tests, a Guitar Hero-like casual game, and much more. I think most of them would work, but I decided to go for a game with strong, non-experimental gameplay.

Yes, I’m making a match-3 clone.

But there’s a twist to the tale: I actually like match-3 games. That is, I love the hypnotic gameplay, but I don’t like most actual games that implement it. They’re too slow or too mellow or too stagnant or too frenzied - there’s always something that leaves me un-gripped. So I won’t be making a straight clone - I’ll be making something I want to play myself. Also, given the twisted madman that I am, I won’t rest at that. There will be two different modes of match-3 play, and one special gameplay mode for “boss battles.” In short, I’m preparing a game that combines features from match-3 games, RPGs and Guitar Hero. Madness; it’s madness I tell you! Normally my cynical mind would have started to back away slowly by now, but I am approaching this in a careful way. Thanks to the power of prototyping I’ve managed to create simple versions of a few of the game modes, and they show the most important aspect: it’s fun. Even in this bare-bones manner the gameplay itself is fun. So I think I’m on to a good start.

I mentioned Guitar Hero; of course I’m not making a Guitar Hero clone in any way. It’s just some features that bear a similarity. For example, the 3D scrolling background that delivers objects to the front, along these lines:

Screenshot

It’s almost ridiculous, how much effort I had to put into making that. It took me all Sunday to get it running like I wanted. Let me give you a chronological summary:

  • First problem: BlitzMax’s features no “draw polygon” function. In other words, BlitzMax only works with two-dimensional square bitmaps (or plotting primitives that would be too slow). Okay, some searching around gave me a DrawPolygon function that some kind BlitzMax developer on the Blitz Forums had written. Time to test it out.
  • Second problem: the DrawPolygon function only implements affine texture mapping. In other words, a straight interpolation. Imagine that you have a polygon and a texture; affine texture mapping simply “smears out” all the pixels in the texture so that they’re evenly distributed. This is not a good thing for perspective.
  • And this brings us to the third problem: 3D systems draw images using triangles. In order to draw a square, you draw two triangles. Imagine what happens when you move the texture coordinates in a scrolling manner while simulating perspective using affine texture mapping? It looks like two trianges that don’t really fit together.
  • In order to fix this I - naively - imagined that there might be some primitive drawing function that used quads instead of triangles, and that - magically - would correct this behaviour. Hell no. Oh well, let’s leave that problem; let’s move on to the perspective issue.
  • Oh, look here! Both DirectX and OpenGL have support for XYZ coordinates, and not just XY! This means that I can just modify the Z coordinate and get perspective, right? Wrong. This requires additional setup of cameras and whatnot - something that BlitzMax apparently doesn’t do by default. I simply cannot be arsed to go through that, so let’s consider the options.

“What options exist,” one may ask. “It’s a fact that affine texture mapping looks like crap and that just adding a Z coordinate doesn’t fix it. You’ll have to be satisfied with affine texture mapping and this weird shift between triangles.” Bullcrap, I say! Time to think back to the days of glory; the days of optimization; the days when no 3D graphics cards were available. I recalled that I messed around with 3D graphics and perspective correct texture mapping back in the 486 days, and there’s really no magic behind it. All you have to do is put in a (1 / z) here and there, to make sure that the z value affects the projected x and y coordinates. So how could I exploit this to make things look better?

It’s really so simple that it hurts.

In order to minimize the projection error, all I have to do is subdivide the scrolling area into chunks, calculate each chunk’s coordinates with respect to the z variable, and then draw these chunks using normal affine texture mapping! I feel pretty stupid that I didn’t think of this immediately, but better late than never. So, to sum things up: in order to draw that nice scrolling background you can see above, what I do is make a loop that draws 16 (or 32 - I haven’t decided yet) horizontal strips (since that’s where the perspective is most correct). This not only gives a very good impression of perspective, but it also takes care of the nasty issue with the sliding triangles.

Even though 3D systems are getting more and more advanced, and no-one implements software 3D engines, I still think it pays to know basic algorithms.

 

Comics, Movies, Frank Miller, 300 and Thermopylae

Ξ April 11th, 2007 | → 0 Comments | ∇ Movies, Observations |

I just have to get it out of my system: I love 300! You know, the gory movie about the Spartans who stood up to the Persian empire, based on a comic by Frank Miller. I’ve seen the movie twice so far - once as a DVD rip (Shhh! Shhh! Don’t tell anyone!) and yesterday I saw it again at the movies. While I love it, the other geeks I saw it with were divided: some thought it was a beautiful action flick, and some were quite disappointed. Personally I’m not sure why I love it; given my loathing for Kill Bill and similar action-only movies I really shouldn’t approve of this two-dimensional fantastical portrait of a slaughter. Induction really isn’t applicable in real life, it seems.

But what differs between Kill Bill and 300? Why do I approve of the latter but not the former. Well, one obvious thing is aesthetics. Kill Bill is essentially a mix of a gangster flick and a samurai flick (or something like that), while there’s no missing the fact that 300 is an animated comic. Every detail in the movie breathes comics - from the way they almost exclusively utilized blue/green screens rather than real environments, to the over-the-top one-liner-based dialogue. Not to mention the constant posing. I think this is a prime example of how cliches can be used to create something grand - and probably grander than what would have been created with more restraint. Movie critics apparently aren’t too fond of the movie, and that’s understandable: I would hazard a guess that the movie’s simplistic script and cliches are poison to a reviewer schooled in film theory. Maybe it takes a layman to appreciate this kind of entertainment; after all, it has performed marvellously at the box offices.

Another thing that struck me is that Kill Bill is the story of one person, compared to - say - 300 persons. 300 persons fighting for a greater cause than their personal revenge. The epic quality of 300 is most definitely something that appeals to me much more than the down-to-earth feeling of Kill Bill: there’s no sense of greater cause in the latter. Also, it doesn’t hurt that the Spartans are doomed from the very beginning; I have a very nasty addiction to tragedy, and people giving up their lives almost always send shivers up my spine. I’m quite aware that my Goth tendencies are at fault, but I prefer it that way, thank you!

A third thing that separates Kill Bill and 300 is the gender of the protagonists. Male chauvinist pig that I am, I probably have a bias against female warriors. Or - more realistically - I probably can’t identify with Kill Bill’s main character in the same way that I can identify with Leonidas of Sparta. And to tie things up with the previous paragraph: I also find it easier to identify with the driving force of the Spartans than with whatever-she’s-called in Kill Bill. Epic sacrifice is much more appealing than personal revenge.

Okay, I’ve established some of my reasons for liking 300. But there’s more. For instance, the movie is extremely - and I mean extremely - close to the original comic, visually. This worked wonders in Sin City, just as it does in this movie. I also love tiny details like how Thermopylae is translated into Hot Gates. It makes sense - since they are speaking English it makes sense to translate the names of the places as well. It’s especially effective in this case, since Hot Gates has an undertone of Hell that - probably - wouldn’t have been very obvious if the Greek name was kept. Speaking of original Greek names, I had to refresh my memory on the battle of Thermopylae after seeing this movie, and I might as well sum up some important things I noted. All so that you don’t have to bother with it.

  • The Spartans didn’t face Xerxes with only Arcadians at their side. Rather, there were also 400 Corinthians, 1,000 Phocians, and many many more. In total, the estimate lies at 7,000 people holding Thermopylae against the Persians.
  • The Persians supposedly numbered millions, but modern estimates suggest “just” 200,000 land-based troops.
  • In the movie there’s a lot of talk of Sparta’s freedom against Persia’s slavery. I think they forgot to mention the fact that the Helots were slaves to Sparta, and 1,000 Helots were with the Spartans at Thermopylae.
  • The oracle’s prophecy isn’t elaborated upon in the film, but according to Herodotus the original prophecy was that Sparta will be destroyed unless one of their two (yes, two) kings give up his life. It’s speculated that this is a reason why Leonidas decided to stand at Thermopylae.
  • And much much more. This is all rather fascinating, actually, but I can’t be arsed to write more.

Finally, I just have to mention two things:

  1. If you haven’t seen 300 yet, do it!
  2. And… Since 300 and Sin City were successfull, please please please please God let them make a properly dark and gruesome version of Miller’s Batman: The Dark Knight Returns as well!

 

Books - A Quarterly Report

Ξ April 2nd, 2007 | → 2 Comments | ∇ Book Reviews, Literature |

I don’t make New Year’s resolutions unless they’re extremely simple to keep. This year I decided to write down every book I read throughout the year; at first I wanted to make a yearly summary, but I soon realized that it would be too much to summarize - a quarterly report seems much more appropriate. ‘Nuff said. This is the list of books I’ve read or listened to so far in 2007. (Yes, listened to. I use my commuting time to listen to audio books; I can’t imagine a time when I didn’t do this, but it’s still less than a year ago that I started. I highly recommend that you try it as well.)

Angels and Demons - Dan Brown

Description: The pretentious part of me feels a bit annoyed at the rest of me, because I thoroughly enjoyed both this book and The DaVinci Code. It’s an extremely basic book: the story is simplistic, the plot twists are way too obvious…but it still has this cozy “let’s see what happens next” feeling. A perfect book to read in the bath, or when lounging about on a lazy Sunday. Also, I do love religious themes despite being an atheist.
Recommended for: Everyone but the arrogant nerd who won’t read populistic literature.

Legacies of Great Economists - The Teaching Company

Description: You’ll see a few more TTC courses in this list, and I have to admit that I’m hooked on this series of audio books. It’s an excellent way to get a semi-college-level insight into various areas. (Semi because it’s relatively thorough, but not as deep as a proper course.) This was my first ever dive into Economics, and I enjoyed it thoroughly. Economic theories were discussed, but the course mostly concerned the persons behind the theories; and the lecturer was full of interesting anecdotes to keep it all enjoyable.
Recommended for: Technical geeks who want to expand their knowledge of Economics.

Rama II - Arthur C Clarke

Description: Very interesting novel, but I’m not certain that it’s an improvement from Rendez-Vous with Rama. Highly entertaining science fiction with believable characters, but just a tad too much drama and not enough science for my taste. And don’t get me started on the mysticism; co-writing this novel might not have been a good idea. (I assume that those parts weren’t Clarke’s.)
Recommended for: Technical geeks who want drama.

Economics - The Teaching Company

Description: A thorough summary of basic Economics and a guide to everything from initial economic concepts to world markets. Yes, I got hooked after I finished the earlier Economics course. This wasn’t quite as gripping, but still very educational. Presented by the same lecturer, Timothy Taylor, as the former course.
Recommended for: Technical geeks who - for some reason - get hooked on Economics.

Garden of Rama - Arthur C Clarke

Description: The third Rama book, and…not the best one. I like the fact that the books aren’t stagnating, but there seems to be just a bit too much speculative sociological mumbo-jumbo in this one compared to - say - Rendez-Vous with Rama. For some reason I just find a sterile spaceship more interesting than a lush social analysis.
Recommended for: People who have read the earlier Rama books, ’cause we want to know how it ends.

I, Robot - Isaac Asimov

Description: I really shouldn’t need to give anyone a description of this novel, but since the movie gave such a half-assed attempt at utilizing the ideas from the book I have to anyway. The movie was a dull action movie featuring Will Smith. The book is a series of short stories about robots, artificial intelligence, their interactions with humans, and logical consequences of all of this. But wait, logical? I’m not so sure about that. All stories feature logical problems of some kind. “How do we determine this?” “How will a robot act in this situation?” and so on. The problem is that it’s all very simplistic, and not all that believable. Granted, it was written 50 years ago, but the scenarios just don’t hold up; the robots act illogically…and so do the people. Still, it is a marvellous piece to read despite that.
Recommended for: Computer geeks who want to read speculations about AI, and anyone else who wants a good sci fi novel.

Wizardry and Wild Romance - Michael Moorcock

Description: Enough with all the sci fi already! Time to move back to my usual genre: fantasy. I decided to read Michael Moorcock’s analytical papers on the subject (collected in this volume); and it was a marvellous read. For a while. Moorcock is an extremely well-read person with a keen mind, but I can’t agree with his conclusions. In my view, fantasy is not as tightly intertwined with Romance as he insinuates; fantasy isn’t a strict renewal of Romantic ideas, and failing to uphold these ideals does not immediately make books badly written fantasy, in my opinion. Maybe I’m just bitter ’cause he constantly talks down on Tolkien, but I do think that Moorcock’s missing The Point(TM) in a lot of Tolkien’s works, and instead compares it with his own idea of what fantasy ought to be.
Recommended for: The scholarly fantasy reader with a fetish for over-analysis.

The Claiming of Sleeping Beauty - Anne Rice

Description: A twisted version of the classic fairy-tale, Sleeping Beauty. Warning: this is not a children’s book. I thought that it would be a suitably erotic grown-up version of the tale, but it turned out to be rather heavy on S&M and dominance instead. Anne Rice is a filthy, filthy woman, just so you know. Despite these positive traits, the story was fairly thin and uninteresting - too much focus was put on colourful descriptions of spankings (pun intended - colourful… ah-hah) and tortures and imaginative sexual acts, and not enough care was put into describing a believable character development for Beauty. I like smut as much as the next person, but I often got the feeling that Ms/Mrs Rice got carried away with this novella, and sat writing one-handed.
Recommended for: Innocent people who find this dive into the forbidden fascinating.

The Science of Discworld III - Terry Pratchett (and two others)

Description: Third time’s the charm, and I love mis-using proverbs. There’s no need to exclaim “third time’s the charm” with this book - all three Science of Discworld books are excellent, whether or not you’re scientifically-minded. This time the Ankh-Morpork wizards examine evolution and intelligent design, and it’s a very enjoyable read. I do think that the science part of the book is a tad too negative about intelligent design, though. Don’t get me wrong - I don’t approve of ID one bit, but this book goes to great lengths to describe why it’s unscientific and invalid; enough that I feel that the authors aren’t being strictly objective anymore. A better approach would - in my view - be to not give it credit by arguing against it so much.
Recommended for: Anyone who doesn’t get bored by popular science.

Starship Titanic - Douglas Adams, Terry Jones

Description: Absolutely delightful book by two of the most brilliant comedy writers. The amusing descriptions and the witty dialog makes this a great read at just about anytime. I get a suspicion that the science fiction theme might put people off from this book. It’s a pity, because this is a very universal book that ought to be read by anyone who wants to lighten up their day.
Recommended for: Everyone except boring humour-less bastards.

Dante’s Divine Comedy - The Teaching Company

Description: This course deals with interpreting and giving background to Dante’s Divine Comedy, and it does a great job at it. I admit that I haven’t read the poem yet, but I don’t think that it’s a negative thing to have listened to this analysis first. First of all, this has given me insight into medieval Italy, and I am also sure to notice things in the poem that I otherwise would have missed. Now I just have to get this thumb out of my rear and read the Divina Comedia sometime.
Recommended for: People with an interest in classical literature - it doesn’t get much more classical than this.

Ancient Near Eastern Mythology - The Teaching Company

Description: I’ve always had a fascination with Mesopotamia and the other Near-Eastern areas - it seems like such important cultures to know more about. And I sure got to know more about ‘em from this course; a bit more than I felt like, in fact. I loved the historical backgrounds, the archeological methods, and the explanation of the different writing systems…but the myths themselves were pretty dull. Mostly there were comparisons between bible tales and ancient Sumerian/Egyptian/[insert other civilization here] myths. I had expected something more interesting. Something more unknown and unexpected.
Recommended for: Hm… Not sure. The ones dying to assimilate more knowledge, or the ones interested in scholarly bible studies.

All in all, I feel that this has been a pretty productive quarter. Twelve books; almost one per week. It’s nothing compared to what one read in high school, but it’s still a fair amount of literature. Unfortunately the next three months will probably not be as impressive - I foresee a shortage of time, as I dive into a new game project.

 

About

    Pretentious! Miro Karjalainen is a pretentious bastard with a background in punk rock, computer science, linguistics, embedded systems, game development and the noble art of drinking beer. E-mail: info@karjasoft.com

Admin Stuff