Spandex For All! KarjaSoft Announces Spandex Force: Superhero U

July 16th, 2011

Indeed, the day has finally come! So, go check out the game right away at www.spandexforce.com. The official press release follows below:

FOR IMMEDIATE RELEASE

Spandex For All! KarjaSoft Announces Spandex Force: Superhero U

Stockholm, Sweden — July 16, 2011 — Independent game developer KarjaSoft proudly announces the release of Spandex Force: Superhero U, a tongue-in-cheek puzzle game with RPG and adventure elements.

Spandex Force: Superhero U is a superhero-themed puzzle game for Windows and Mac that lets the player create his or her own hero and attend the prestigious university Superhero U in Vigilance Valley. The game features many different kinds of minigames, including, but not limited to match-3 battles against teachers, other students and nefarious villains threatening the school.

Other minigames let the player rescue old ladies in distress, collect the precious metal Absurdium, or focus on physical, elemental and mental training. Three different match-3 mechanics and a large variety of puzzles are available, and everything is presented in a tongue-in-cheek manner that pokes fun at superhero cliches. The player can also customize his or her hero with different accessories and weapons, choose from various superpowers and develop the hero further by collecting experience and reputation points.

Screenshots:

http://www.spandexforce.com/screenshots/ss1.jpg
http://www.spandexforce.com/screenshots/ss2.jpg
http://www.spandexforce.com/screenshots/ss3.jpg
http://www.spandexforce.com/screenshots/ss4.jpg

“Spandex Force: Superhero U is definitely the best superhero RPG-puzzle-adventure game currently on the market,” says Miro Karjalainen, owner of KarjaSoft, not in the least bit deterred by the fact that the only two such games available are Spandex Force: Superhero U and its prequel, Spandex Force.

More information, screenshots and downloads can be found on the official webpage:

http://www.spandexforce.com

About KarjaSoft:

KarjaSoft started developing casual computer games in 2006. The first release was the fluffy arcade game Sheeplings in 2007, followed by Spandex Force in 2008 and the adventure/pet raising game Wildhollow in 2009. Current plans involve world-wide market domination in superhero puzzle/RPG games by 2012.

Contact:

Miro Karjalainen
KarjaSoft
info@karjasoft.com
http://www.karjasoft.com

Now I’m going to watch the new X-Men movie to celebrate!



RPG Difficulties and Spandex Force

July 6th, 2011

Tonight I will have a few beers downtown.

Tomorrow I will go to Croatia for some sun, sea, beer and hiking in a national park.

Next week, unless something unforeseen shows up, I will release Spandex Force: Superhero U on an unsuspecting public.

But right now I intend to muse about difficulty in RPGs. The Rampant Coyote posted an entry about this and it got me thinking. He argues that a difficulty setting doesn’t necessarily have to mean just a more difficult game – it could also entail a new way of playing the game. It does make sense. Almost all games are full of (more or less) meta games – collect extra lives in SMB3, get all collectables in a casual game, and so on. A difficulty level that would result in a new way of playing the game is an intriguing thought, and might simply mean putting focus on some of the metagames instead of simply the main game.

Also, I agree with the necessity for difficulty levels in action RPGs. I just suck at action games and if I have to spend time on learning how to get my motor skills to work I’d rather press a big fat DELETE button and do something else. Give me the easiest setting, or give me hell!

Then again, I am strongly against difficulty levels in turn based RPGs and strategy games. For some reason I like the idea of playing the game like a puzzle; learn what I need to do to overcome this obstacle, and once I’ve come up with a solution it’s reproducable. An environment like that also lends itself well to meta games. What’s the lowest level I can beat Final Fantasy 5 at? What spells can I get at a ridiculously early stage of the game? Can I kill the dragon on Emerald Isle?

However, I realize that that point of view can be a bit obsessive and might not reflect the “normal” gamer. So I’ve actually opted for a different method with variable difficulty in Spandex Force: Superhero U. I imagine that the majority of players would rather just play and have everything adapt itself automatically.

Every minigame has a difficulty rating, from 1 to infinity. 1 is extremely easy, 20 getting challenging, 100 is very very hard. This difficulty determines how many tokens you have to collect to finish a minigame, or the opponent’s level (and the levels of his superpowers).

How is this difficulty determined? I’m glad you asked!

A base difficulty value is determined based on the player’s level. This value can range between the player’s level and the player’s level times 3. Then, each task has a relative difficulty from 1-10. Tasks in the first missions have a relative difficulty of 1-2, but the fights in the last episode have a difficulty of 9-10. The relative difficulty determines if the lower or the higher end of the base difficulty will be chosen. Let’s take an example:

Justice Guy is level 5, and will enter a task with relative difficulty 4.
Base difficulty = 5-15
Modified difficulty = (max – min) / 10 * relative difficulty + min = (15 – 5)/10 * 4 + 5 = 9

So, that’s it? The difficulty will be 9? Well, not exactly.

During gameplay, the player has a variable keeping track of how well he does. This variable starts at 50 and depending on whether or not he loses or wins minigames it increases and decreases to range between 0-100. This variable determines how likely it is that a new token falling onto the board will create a match. In other words: if you play well, it’s less likely that you’ll receive “free” chains when matching tokens, but more likely if things aren’t going so well for you.

Also, this variable affects the modified difficulty too. It can modify the value by 50%-200%. Let’s continue our previous example:

Justice Guy is level 5, and will enter a task with relative difficulty 4. He has a success variable rating of 78.
Modified difficulty = 9
After the variable of 78 has been taken into account, the difficulty is = 9 * 1.8 = 16

The final difficulty will actually be 16, in other words? Yes, almost. For scaling reasons I divide that value by two, though. So the final difficulty is 8.

In fact, I was toying with applying a quadratic transformation afterwards to smooth out the value, and give it a ceiling. It turned out to be a bad idea, though – it was hard finding a formula that would give suitable difficulty early as well as in the end. I tried this one, for example:

Justice Guy is level 5, and will enter a task with relative difficulty 4. He has a success variable rating of 78.
Modified difficulty = 16
Transformed difficulty = -0.0025x*x + 1x + 0.0025 = -0,64 + 16 + 0.0025 = 15.3625

Not much difference, eh? It would have been more of a difference if x was 100:

Transformed difficulty = -0.0025x*x + 1x + 0.0025 = -25 + 100 + 0.0025 = 75.0025

It seemed like a good idea at the time, but in the end I let the difficulty remain pretty linear. Theoretically I think that this means that a player can level up too much to finish the game…but if anyone has that much time to spare, I’ll eat my hat!



My Next Game Will Be…

June 27th, 2011

Thanks to everyone who voted in my last blog post! I had a secret favourite that I was rooting for, and it seems that at least a handful of people agreed with me, because that’s the one that got most votes. If I could be arsed to get around the IP + cookie check in the voting plugin I just might have cheated and added even more votes to that option, but luckily I didn’t have to.

“Okay, okay! Tell us which game won already,” I hear you exclaim. Superhero Princess Maker, that’s what!

Of course, I can’t go on calling it Superhero Princess Maker, so I thought of a more fitting name: Spandex Force: Champion Rising. And here is some concept art to boot:

So, what’s this game all about? Imagine the setting:

There’s a superhero convention in town, and the Blizzard Wizard is getting into a heated argument with Infinitorax Supreme.

Infinitorax: “Superheroes today… No skill, no power, no concept of ethics or morality!”
Blizzard: “Well, I for one blame society for that. With proper guidance every superpowered being could be a paragon of justice.”
Infinitorax: “Is that what you believe? No, dear Blizzard Wizard, a hero’s mettle is predetermined and nothing we can do changes that.”
Blizzard: “Is not!”
Infinitorax: “Is too!”
Blizzard: “Is NOT!”
Infinitorax: “Really? How about…THAT…one? That pathetic, useless, witless excuse for a hero lurking in the corner? Is that a creature destined for greatness?”
Blizzard: “Well… Yes! I truly believe that even such a miserable hero could be made great with the right guidance!”
Infinitorax: “I see… Fancy a wager, my dear Blizzard Wizard? You have one year to turn that useless pile of excrement into a fine jewel.”
Blizzard: “It’s a deal!”

The game will take place over 365 days. You guide the young hero in his/her daily routine, ensure that the stats are raised, that powers are learned, and that the proper ethics are upheld. If you fail to raise the stats, he/she will become a useless, powerless hero and you will lose the bet. If you fail to keep the ethics up, the hero will become a supervillain instead.

Throughout the year there will be everyday chores, meetings with strange heroes and villains, puzzles and many weird encounters. Most of the details are undetermined so far, and everything stated so far is just a concept…but it wouldn’t surprise me if this is similar to what the end product will be like.

But before I start working on this game I intend to release Spandex Force: Superhero U, of course!



Spandex Force: Superhero U v0.3 BETA Update

June 9th, 2011

Spandex Force: Superhero U is progressing well. Very well. In fact, the first demo build has been sent off to a potential distributor and I’m waiting for a response that will determine how much I will have to focus on guerilla marketing and self-publishing.

The current version of the game is 0.3 BETA, and it’s pretty much feature-complete. You can create your own hero, there’s an Adventure Mode divided into 5 chapters, 15 different school classes to choose from, randomly composed artifacts to purchase, 27 superpowers to buy and level up, your hero collects experience points and reputation, fellow students offer a few optional side quests, and there are lots and lots of different villains, students and teachers to battle. Additionally, there are 20 achievements/trophies to unlock, a Relaxed Mode for some non-timed relaxed play, and a Battle Arena where you can battle other players’ characters. All in all, the game is starting to look rather nifty.

So, why don’t I release it already?

There are a few reasons:

  • I’m waiting for feedback from the distributor
  • I need to add some minor things – shield artifacts, areas on the screens to examine in order to get a few silly messages and some other small details
  • And most importantly, I need to examine the difficulty and the balancing

Anyone feel like doing some beta testing to help out with the third point? Send me an e-mail at info@karjasoft.com!



Spandex Force Online Accounts Revisited

May 2nd, 2011

In a previous blog post I discussed online accounts for my upcoming game Spandex Force: Superhero U. I have done some thinking and revised my API quite a bit. For the technically inclined people, here’s a summary of how I’m doing things instead:

First of all, the main reason for the online accounts is to allow a user to play his game on various platforms. Windows, Mac, online, iPhone, Android, etc. All clients will connect to the online account and be able to access the available heroes.

In order to allow this, I have some basic criteria:

  • A simple REST based API. No SSL encryption since all platforms cannot support it
  • Extremely easy to use. There’s no use in having online accounts if it introduces problems for the end user
  • Light-weight. I’ll be using my webserver for this, so I hope that it’ll cope with this if the traffic is light-weight

My first approach included email and password authentication, and the user had to register an account in order to activate these features. Pretty simple, but not simple enough. In version 2 of my API I’m going for this approach instead:

  • An unregistered version of the game will request an ID from the server. The unregistered version will store everything both locally and online.
  • As soon as a registration code is entered, the server will check if another ID already has used that registration code. If so, it will tell the client to start using that ID instead, and synchronize the heroes between the two IDs. If no ID has used the registration code, it simply assigns it to the existing ID.
  • The client automatically remembers the registration code and which ID to connect to, and does a local and online save of everything.

The benefit of this approach is that the user doesn’t have to register an account – he only has to enter a registration code. Also, he doesn’t have to give up any personal information at all. Also, it’s a bit of a piracy deterrent: since a registration code is connected with the heroes that are saved, anyone who spreads his registration code will let others access his stuff…

Additionally, the actual API has been changed a bit:

  • Seed (input: ID) – Generate a new seed value for this user
  • ID (input: ID, registration key, old ID) – Get a new ID, or get an ID connected to a registration code (depending on the input)
  • Login (input: ID, hash) – Authenticate the user
  • Heroes (input: ID, hash) – Get a list of this user’s heroes
  • Save (input: ID, hash, revision, hero data) – Save a hero
  • Load (input: ID, hash, hero name) – Load a hero
  • Delete (input: ID, hash, hero name) – Delete a hero
  • Opponents (input: ID, hash, hero name) – Get suitable opponents for a hero
  • Set achievement (input: ID, hash, achievement) – Store an achievement status
  • Get achievements (input: ID, hash) – Get a list of all achievements

You can see that the API has been expanded with getting opponents to fight (used in the Battle Arena) and storing/getting achievements. All in all, I think that this is a step in the right direction. Everything seems to be working smoothly now and the only downside is that it can take a few seconds to log in or get the list of current heroes, as opposed to if everything was done locally.

Can’t wait to see all the problems that will pop up once I let people actually use this…



Unwinnable RPG Battles

April 13th, 2011

I’m having a lot of fun writing the dialogue for the final episode of Spandex Force: Superhero U. At one point the hero ends up in a fight that he or she cannot win – a common RPG cliché. I’ve never really liked the completely unwinnable battles, personally, so I’m adding a bit of a twist to this one.


No, this is not my game. It’s FF2.

It is possible to win the battle, and I assume that someone somewhere will actually level up and find good enough artifacts to beat up the Protector Mk III. What happens then? In the original Spandex Force I had a similar situation, where nothing really happened at all. The game just pretended that you lost. This time I’m better prepared, and a special dialogue will be invoked:

<text id=”hero” text=”Man, that was tough!”/>
<text id=”villain” text=”You… Defeated the Protector Mk III?!”/>
<text id=”villain” text=”That wasn’t supposed to happen.”/>
<text id=”hero” text=”Yeah, I can imagine that you think so!”/>
<text id=”villain” text=”No, seriously! That was not supposed to happen.”/>
<text id=”villain” text=”The storyline and the ending assumes that you lost this battle.”/>
<text id=”villain” text=”Let’s all just pretend that you got beat up by the robot, OK?”/>
<text id=”hero” text=”Um… I guess I can play along.”/>
<text id=”hero” text=”Alright, everyone! That robot was WAY too tough for me!”/>
<text id=”hero” text=”Let’s return to the university and think of something else.”/>

I can’t be arsed to prettify things, so you get to see my wonderful dialogue XML notation too.

Speaking of unwinnable RPG battles, many people view them as dull, predictible tropes that must be avoided. I like clichés and prefer to use them instead. The entire game is tongue-in-cheek and tries to acknowledge that the plotlines are silly, that there are major plot holes, that the game world is rather ridiculous and so on. Using clichés fit in wonderfully in that context.

Additionally, there’s one thing that makes an unwinnable battle even more acceptable in this game: you never lose anything (except for your precious time) if you fail a battle. You won’t spend any potions, any consumables – you won’t be tempted into using your precious elixirs (á la Final Fantasy) in vain.

I think that that is the primary reason that many people feel cheated by unwinnable battles: they invest too much into trying to win the battle, and only too late realize that the game is cheating and won’t allow them to win.



Spandex Force: Superhero U in Numbers

February 24th, 2011

Alright then, time for a quick update on my newest game!

Here’s Spandex Force: Superhero U in numbers. Note: this only covers the first three episodes, so these numbers will increase…

Number of unique minigame types: 8
Number of superpowers: 47
Number of words in the dialogue: 10 229
Number of missions available: 22
Number of sidequests: 3
Number of villains/other characters to fight:
25
Number of episodes completely finished: 3
Approximate number of minigames played per episode: 28
Speedrun of the first three episodes
: 2 h 48 min
Amount of space needed for the videoclips I’ve taken to create a teaser trailer: 4.59 GB

All in all, I think that there will be plenty of content in this game to keep people busy…



The Game You Develop is Never the Game You Planned

January 27th, 2011

When I was sketching up the designs for Wildhollow, it was a wildly different game compared to how it ended up. I had wanted to make a mix between Harvest Moon and Viva Piñata, with strange genetic manipulations and animated crossbred animals that ran around, playing with balls and other things in a large environment. Instead, I had to cut down on the animations to an enormous degree – so much that the animal handling parts became simple abstractions. “Buy animal, feed, brush, sell for profit.”

And there were many other cutbacks and deviations from my original plans. Most of them due to budget constraints. Some, because it was a bloody awful idea to start with, or plain laziness time constraints…but in general, it was due to art requirements and the budget.

Now, with Spandex Force: Superhero U, I’m facing the same problems. Let’s mention the Sidekick Situation, as an example.

Sidekicks

When I made my original sketches I had been playing way too much Dragon Age: Origins, and I loved the character interactions. “Hey, why not make something leaning towards that,” I thought. I also had played way too much King’s Bounty: The Legend, in which you can select a helper character that aids you in various ways. So I got a great idea: there shall be fellow students at the school with whom you can develop relationships, bicker and squabble about various things, and eventually (if you complete a sidequest or two) select one of them to become your sidekick.

Now that reality has caught up with me I’m noticing a couple of flaws with my plan:

  1. Having loads and loads of dialogue may sound like a cool thing, but it’s really not all that cool to have to write it. Why couldn’t I remember how much time it took to write all those lines for Wildhollow? Not to mention, try to think of worthwhile things for the characters to say.
  2. Picking up characters works in a game like King’s Bounty, since it’s focused on exploration and discovering all the secrets that lie hidden in the massive game world. This doesn’t work all that well in a game that focuses on puzzles, and don’t feature a massively huge game world – to put it mildly.
  3. It’s hard to think of suitable bonuses for having a sidekick. A passive bonus somehow? Or an attack bonus in the battles? Both? Or just a cool thing with no particularly good bonus? Balancing things becomes a bit iffy.
  4. Screen real estate. I’m planning on porting the game to mobile devices, and it really gets cluttered up already as it is. Power levels, experience points, health, equipment, etc etc. Not to mention that I want to add some acheivements which will have to be presented somehow. And now I want to add another character, possibly with his or her own statistiscs, as well? Hey, I want to keep this game simple!

So, my current thought is to have the fellow students as mildly amusing interludes now and then, and that each of them will offer a voluntary sidequest – for example, Lighting Lad is being bullied by the Wombat and requires your assistance. No need to add sidekicks right now; maybe I’ll save that for the sequel…



Spandex Force: Superhero U Battle Arena

January 14th, 2011

When I released the original Spandex Force many called it a Puzze Quest clone, something I don’t really agree with. It’s highly “inspired” by PQ, of course, but I made some significant changes. For one thing, it’s focused on superpowers rather than matching skulls to damage your opponent, and it is also impossible to heal since I wanted quick matches. The latter point leads to a more significant difference between Puzzle Quest and Spandex Force: my game is intended to be played casually.

That mindset has continued with Spandex Force: Superhero U. If anything, I’m aiming for even more casual gameplay, with small and fast games that will be over in a couple of minutes – easy to pick up and just have a go.

One area in which that shows is in the Battle Arena that I’ve been working on lately. I want to have an online component in the game, but I also want something very simple that will work for everyone. This is what I’m going for right now at least:

  • If you have an account, all of your heroes will be stored both locally and on a server. All information about the hero is stored, including some statistics about the gameplay style in battles – for example, what powers are used most frequently, what tokens does he tend to favour, and so on. This is transparent to the player, and he doesn’t have to do anything.
  • If a player enters the Battle Arena, he will be able to play against AI representations of these other players. The game tries to suggest suitable matches, and the player simply chooses whom to do battle with.
  • In order to determine a good match, each stored hero has a force level that is determined by his level + his total physical/elemental/mental powers (including bonuses from artifacts). This can range from 4 to…well…2-300. There’s no real upper limit there.
  • To make the battles worthwhile, you’ll gain XP, money and reputation (different resources in the game) after each won battle. These can be used later on in the Adventure Mode.

Okay, so that covers how the battles against other heroes work, and what the matching will be determined by. But what else will there be? Rankings, of course!

I haven’t decided on the exact formula, but there will be win/loss statistics in the Battle Arena, with different points awarded depending on how big the relative difference is between your hero and your opponent. All of this will be used when creating top lists.

“Plural,” I hear you ask. Indeed, there will be multiple top lists. One global list, for all the heroes, but also lists for six different divisions.

A hero’s force level determines his division. I’m temporarily using boxing terms to define the different divisions, but that will definitely change:

  • Flyweight – force level 0-19
  • Featherweight – force level 20-39
  • Lightweight – force level 40-69
  • Middleweight – force level 70-99
  • Heavyweight – force level 100-149
  • Super Heavyweight – force level 150+

Of course, since a player gains levels and powers he won’t remain in a division for very long. But this system potentially opens up for people who want to make heroes explicitly to be in the top lists of the various divisions. How? Very easy: the XP, money etc that you gain in Battle Arena matches won’t take any effect until you enter the Adventure Mode again. So… If you have a level 6 hero that you want to use to compete in the Featherweight divison you simply never play again in the Adventure Mode with him or her. Will anyone actually do that? Who knows…but the possibility is there.

Regarding the actual layout of the Battle Arena, I’m trying to be as lightweight as possible. When you enter the arena screen you will get some info about your statistics (wins/losses/division/rank, etc), and you will see four random opponent heroes you can battle. (Two in the same division, one lower, one higher – or something like that.) If you don’t like the heroes in question, you click a button to get four new ones.

You can also view the different top lists, and choose to battle the heroes there. I’m essentially creating a positive feedback loop: people who play a lot will advance in the rankings, and – since others can more easily choose to play against those heroes – their statistics will increase even more. I think that it’s a good idea, but I’m not sure about that.

The keen observer will note an absence of many things normally found in online components. No online battles against a live opponent? No friend lists? No chat? Etc etc. Nope, none of that. At least not right now. I’m fairly convinced that all of those things would be past the point of diminishing returns. I’m also hoping very much that what I’m proposing will be enough to give a fresh and interesting optional gameplay component, beside the normal Adventure Mode!



Spandex Force Online Accounts

November 18th, 2010

One of the new features I’m adding to Spandex Force: Superhero U compared to the original game is online accounts. Now, now, don’t be alarmed! I’m not aiming for a draconial Ubisoft-like “you’ve got to be online to play my game” approach. Instead, I’m doing this to leverage new technology and new platforms.

The first three platforms that I’m targeting are:

  • Windows – standalone 800×600 resolution application
  • Mac – standalone 800×600 resolution application
  • Web – 640×480 Flash version

In order for the web version to really make sense, the next logical step is to have centralized accounts. That way you can start playing the game on the web version and then download a standalone application and continue right where you left off. Or for that matter, you can play the standalone version at home and then use the web version when you’re out and about. Or at work, even though I wouldn’t expect anyone to play games at work of course! Tsk tsk.

I’ve also been eyeing iPhone and Android, since that would be completely awesome. Do some leveling up while you’re commuting, and then move on with the storyline on another platform when you have more time – or something like that.

In order to support these online accounts I’ve created a minimal API. I had a look at stuff like OpenID as well, but that’s just complicating things in absurdum. Instead I went for the simplest method I could think of that’s still reasonably secure: use your e-mail address and a password to log in.

Now for some technical mumbo-jumbo.

My API defines the following actions:

  • Seed (input: e-mail) – Generate a new seed value for this e-mail address (i.e. this user)
  • Login (input: e-mail, hash) – Authenticate the user
  • Password (input: e-mail, scrambled password, hash) – Set the password for the user and login
  • Heroes (input: e-mail, hash) – Get a list of this user’s heroes
  • Save (input: e-mail, hash, revision, hero data) – Save a hero
  • Load (input: e-mail, hash, hero name) – Load a hero
  • Delete (input: e-mail, hash, hero name) – Delete a hero

So… What happens when a new user creates an account?

  1. Enter e-mail and password
  2. Call “seed” and get a new seed value. This causes the server to generate a random number and connect it with this e-mail address in the database
  3. Combine the seed and the scrambled (MD5-hashed) password, and use MD5 to generate a hash
  4. Call “login” with the hash
  5. The server notes that there’s no password set for this user, so it requests a password
  6. Call “password” with the e-mail, the hash and the scrambled password. This is the only time the password is communicated from the client to the server – and even then it only sends a scrambled password. I.e., the clear text password will never be stored anywhere
  7. The server authenticates the hash and logs in the user

Of course, after this the normal login procedure skips 5 and 6.

So, essentially: I’m trying my best to protect the user’s password, and I’m adding a server-defined seed to make sure that the server always has control over the login procedure. This ought to give decent security combined with an API that works from any client and is as simple as possible. The only thing needed is an e-mail and password.

The seed could be rationalized away, and only the hashed password could be used instead. But I’d prefer to not send that over the ‘net more times than are absolutely necessary – which is exactly once after you’ve created your account.

The only downside to this API is that any client can create a new account… Essentially, this opens up for DoS attacks that create thousands of new “dummy” accounts, filling up my database. That’s why I have timestamps and the possibility to prune the database from empty/unused accounts regularly. Then again, if this does become a problem I can always require a valid e-mail address before an account is activated. See, that’s why it’s clever to use the e-mail as the username.

Have I missed something essential?



Copyright © 2009 KarjaSoft