Blog

Atanua Finances

December 22nd, 2014 (permalink)

Atanua, my real-time logic simulation aimed at education launched as a purchaseable product a bit less than 7 years ago. I open sourced it a couple days ago, and now it's free for everyone to use (and hack).

During those 7 years I've tried various things to turn it into money, with varying degrees of success. The original idea was to have a small amount of big clients - namely, schools - who would pay a chunk of money for it, preferably annually. These clients would also drive the development via providing feedback and requests. For hobbyists, the program would be free.

It took a while to realize that this strategy doesn't work (for small software, at least). Schools in general are either unwilling or unable to pay - either there's political reasons for software acquisition, decisions made "higher up", there may be a culture of "just use free stuff" (whether it's legal or not), or the budgets are just tight.

I actually sent mail to some schools that publicly used Atanua without paying, and just got answers "oh sorry, we thought it was free". Someone suggested that I should just target teachers, and ask them to pay personally, but in my mind the teachers are the good guys..

So I turned the licensing around. Fine. Schools are not going to pay. But I still want to know if Atanua is being used, so I gave free classroom licenses to anyone who asked - to make sure it's an actual school, I asked permission to use their logo on the website.

Some 150 schools applied for the free license. I don't know how many of those actually have it in use, but the interest was clearly out there. One school had a logo that looks like stylized "4ch"; probably standing for 4chan. I never posted the logo, but I sent the license anyway.

Later on I did a push to try to up-sell licenses to the schools. A couple replied that they'd love to, but nothing came out of it.

I clearly stated that the free license offer was for schools and not for individual students, but that didn't stop about 100 students from asking, regardless. Some wrote very, very long tales of how the software is vital for their future, but not vital enough to shell out the 25 eur I was asking.

There were a couple more memorable cases where people were requesting free licenses.

First was a 12 year old claiming to be a teacher. The misspellings in his email roused my suspicions, and I googled the person, finding the school where he was attending, his teachers, and so on. I accused him of the fraud, and the tale became more and more complex, including his "boss" emailing me (from the same email account, with the same misspellings). I forwarded the whole email chain to his school, to do with it whatever they wanted. I never got a reply, so I don't know if it lead anywhere.

The second case was a bit more professional: the person actually made a clone of his school's web site under another domain name and claimed to be a teacher there. Unfortunately a lot of the links were broken, but from a very quick glance the site might have been believable. I did find the original site though..

When I turned the licensing around, I figured I could do a sort of "pay what you feel its worth" system, with a bunch of tiers. Everybody just paid as little as possible. Over time I started dropping the cheapest options off, and finally just left two options, hobbyist and standard.

At least one "hobbyist" license was sold to a company name, with a company address. I guess the company had a hobby.

I tried various ways of promotion, including google ads, articles in trade magazines and web sites, discounts, giving out free licenses at contests (mainly ludum dare) and to people who made crazy things with it. None of the above has had any real effect in sales.

There's one thing I tried which did affect sales directly. And I hate that it did.

Nagware.

Every time I made the nag dialogs worse, the sales picked up. Seriously. That's the only single thing that I did that had a clear, undeniable change in sales.

There was one huge benefit from having the free "personal edition" licensing at the start; if you google for cracks for atanua, you'll find that there are tons and tons of links. I'm pretty sure nearly, if not all, of these are malware. I haven't found any atanua reg keys in the wild (not that I've actively looked), so I don't think piracy was ever a real concern.

In the end, Atanua had less than 10 sales a year, and the total sum I got was a bit over 1000 eur due to the various pricing points, tax and cc processor fees.

With that little commercial interest, I wasn't too motivated in developing it further. There were a few bursts of development where I added a few features that were most requested (including boxing and toggleable switches); these were caused by active teachers who emailed me and nicely asked for those features. But that was about it.

I could have left the software as is and cash in the hobbyist license per 2 months or so, but I don't think it's worth it. It was clearly not picking up commercially, so I figured it's possibly it might gain more success as open source. So here we go.

Whether that leads anywhere remains to be seen.

RST, 2014 Edition

December 19th, 2014 (permalink)

I haven't done these in over a year because google seems to have become better at filtering the crazy out of it, but here we go, have a 2014 recent search terms update:

faded white circle

Sounds like a pop album.

java bit mask hack 32

I kinda feel sad that something that's probably very basic in programming is considered a "hack" or "low level" these days.

"port from dos to windows" success rate

I have no idea what the success rate is, it probably depends on the persons doing the project (and their motivation).. and naturally the state of the original product.

ascii art 256 level grayscale ramp

How exactly are you going to turn (approx) 94 glyphs into a 256 level ramp?

bachelor thesis layout

Varies from school to school, and also from department to department.

c++ program to implement a simulation of the children's game musical chairs. in this game, assume that we start with n children and a collection of n - 1 chairs.

Sounds like a fun programming homework.

can i create a windowed 3d program in dx7

Yes.

can kilrathi saga be played on windows 7

Yes.

cheats for bookworm popcap don't work anymore

Why would you cheat in bookworm..?

circle with triangle inside paranormal

Sounds spooky.

code to create child window to send message "hello"

Will MessageBox do?

fate of sol story

Not written yet.

hate israel

I don't.

how do display window with only client area c code winapi

Twiddle with the window flags a bit.

how does atanua (simulator) work ?

Virtual blue smoke.

how to cover a ball with paper neatly

First shred the paper to little bits, mix with some glue-like substance, and then paint the ball with the resulting pulp.

how to make a spell work

You mean in a game, right?

how to make a time in the logic lab

Usually by using some kind of clock source.

how to remove in .cfl file in unix

Extract all files and then re-build the cfl with only the files you want.

how to start off making an mmorpg

Make lots of smaller projects first.

i have ideas for an mmorpg what should i do?

Write a book.

magic bare bones tutorial

Umm.. magic the gathering maybe..?

magic spells that really work

Soooo, you're NOT talking about games then..

modeling natural fractal growth

Start off my modelling any natural process, and it kinda tends to follow from there.

my name is i was born 1997..... my hobby.... graduate years.... this my excellent cv

Seriously?

terra nova: strike force centauri source code

Oh, I wish.

what are instances in rendering

Re-rendering the same data with some variant parameter (like position/orientation/scale/skinning/color/whatever).

what is width and height

[flips table]

what type of application software do you think would be most difficult to learn +way

One that doesn't explain inputs and produces almost random output? Oh, I just described "dragon's lair" / "space ace".

write a c program that simulates a guessing game. each turn, you choose among nine possible guesses.

More homework! Yay!

x rise to power 0=1 sol pls

No.

By Grabthar's Hammer, What A Savings

October 22nd, 2014 (permalink)

I've been playing Skyrim. Sorry. Anyway, I noticed that it started getting more and more unstable, and this seemed to have something to do with the save games. I dug up the directory my saves went into, and removed most of the old ones (I had over 256 saves), and the game became more stable.

I also noticed that the saves take significant amount of space. The game is rather large and remembers every item you toss around in the wilderness, so big savegames are to be expected. Still, saves that take over ten megabytes are rather large.

Since my computer has saves from a bunch of games lying around, I figured it would be fun to compare the save sizes a bit. More on the actual data graphed later..

All of these values should be taken with 150ml or more of salt. This is by no means any scientific survey, due to several factors which I'll discuss shortly.

The save games for any single game seem to fall into certain categories:

  • Static size. Non-compressed static structure.
  • Approximately the same size but sizes fluctuate wildly. Probably stores the same things all the time run through a compression algorithm. Another possibility is that the number of serialized entities varies, but stays relatively constant. May also include screenshot which compresses in different ways.
  • Growing as you progress in the game. Elder scrolls games are good examples; the save game probably contains changes in the world state and the more the player mucks with the world, the more save data is needed.
  • Weird multi-file mess. Sometimes it's hard to say what's save data and what's configuration data, for instance.

In most cases I picked a "typical" file size (not the biggest, not the smallest), but for instance in "skyrim" not all saves are 13 megabytes. Instead, the game starts off with relatively small (still multi-megabyte) saves and the saves grow as you keep playing.

I haven't played through all of the games listed, which may affect the save sizes. Some sizes show early progress, others very late progress in the games. Some save sizes may be gross underestimates because I don't know what files to include in a single "save". Some saves may include several save states in a single file. And so on. Still, the results should give a rough ballpark of what we're talking about.

Here's the raw numbers:

Game Save in kilobytes Notes
Alan Wake 450
Alpha Protocol 50
Assassins Creed Brotherhood 41
Batman Arkham Asylum 64
Bioshock2 1200
Blackwell Deception 1500 Saves grow as you progress
Blackwell Epiphany 15000 Saves grow as you progress
Book of Unwritten Tales 170 Wildly variable sizes
Borthers A Tale of Two Sons 490
Botanicula 0 <-- 16 bytes to be precise
Breath of Death VII 24
Broken Sword Director's Cut 7
Bully Scholarship Edition 22
Crysis2 500 Saves grow as you progress
Darksiders 14
Dead Rising 2 300
Dead Space 412
Dead Space 2 411
Dragon Age Origins 500 Saves grow as you progress
Dust 4
East India Company 3400
Elder Scrolls Oblivion 1100
Elder Scrolls Skyrim 13000 Saves grow as you progress
Fable 300
Fable 3 1000
Fallout3 8400
FalloutNV 6000
FUEL 200
GalCiv2 2000
Giana Sisters Twisted Dreams 1
HotlineMiami 256
Jack Keane and the Fire Within 110
Jamestown 4
JustCause 820 May contain several save states
King's Bounty 800
King's Bounty Princess 1000
L.A. Noire 118
Legend of Grimrock 250
Legend of Grimrock 2 1900
Mass Effect 20
Mass Effect 2 60
Max Payne 1200 Save sizes vary wildly
Medal of Honor 175
Metro 2033 30
Metro LL 60
Mirror's Edge 9000
Need For Speed Hot Pursuit 540
OpenTTD 90
Overlord 22
Prince of Persia (new) 210
Prototype 17
Puzzle Agent 500
Puzzle Agent 2 760
Quest for Infamy 665
Rainslick4 63
Red Faction Guerrilla 1000 Save sizes vary wildly
Resonance 4000 Saves grow as you progress
Sid Meier's Ace Patrol 15
Sid Meier's Pirates! 1004
Sid Meier's Railroads 6400
Syberia 73
Syberia2 70
Test Drive Unlimited 2 150 various files, hard to tell what's the save
Torchlight2 600
UnderGarden 2
VVVVVV 3
Wasteland2 2000 Save sizes vary wildly
Witcher 15000 Save sizes vary wildly
Witcher 2 1700
XCOM Enemy Unknown 900 Save sizes vary wildly

Some things of note. I think I played more Witcher2 than Witcher, which further shows that the kids at cd projekt red paid more attention to save size optimization the second time around.

Lots of games have WAY too big save files for what they are - the blackwell games are a good example of this. There's no way the adventure games would need all that saved state. Sid Meier's Pirates! also has surprisingly large saves, as does Max Payne and Mirror's Edge. Mass Effects appear to have well-designed save data, as does Batman Arkham Asylum.

Some of these save game sizes can be understood as plain laziness (if it's not a problem, don't fix it), others may depend on the game engine ("it just works that way"). Some games really do need a lot of save data ("but the player may want to come pick up that napkin two years later!").

Analysing Another Kid Game

September 9th, 2014 (permalink)

We've been playing a variant of a simple card game called "hunger" with Niklas. It has zero player agency, but it's a thing to play and it teaches numbers and comparing them.

The basic rules (that we've used) to play it are as follows:

Deal the whole deck more or less evenly to all of the players (three, in this case).

Each turn, every player plays the top card of their deck. The one with the highest value card (suit is ignored) gets the cards and puts them to the bottom of their deck.

If two or more players play the same value card, those players play another card until one has higher value card than the others. If a player runs out of cards during this process, they can pull a random card from another player.

Once one player runs out of cards, the game ends. The one with the thickest deck wins. We made this rule because playing this game one-on-one takes FOREVER.

So anyway, I decided to crunch some numbers, and made a monte carlo simulator for the game and ran 10 million games.

Aggregate results from a ten million random games:

Value Average
Turns per game (12-821) 90.744
2-way collisions per game 8.373
3-way collisions per game 0.236
Card pulls per game 0.101

The shortest game played in this set is 12 turns! This is possible because 2-way and 3-way collisions are included within the turn. It's theoretically possible (but rather unlikely) to have a 1-turn game.

Having aces (the highest value card) in your deck at start is a deciding factor on how well you'll do, as we see from the stats. If you start with N aces, you'll:

N lose win
0 83.725% 1.216%
1 36.002% 22.822%
2 9.986% 51.378%
3 0.698% 78.218%
4 0.000% 94.578%

You can still win when starting with 0 aces, by running out of cards in a 2-way or 3-way collision, and being lucky enough to pull an ace from someone else.

Not winning with four aces is easier, since it's possible that the other surviving player has a thicker deck than you have (even though that's not likely). Losing when starting from four aces is still theoretically possible if someone pulls one of your aces after running out of cards in a 2- or 3-way collision, but this is so unlikely that it doesn't even show in the results.

You've Been, Thunderstruck

August 15th, 2014 (permalink)

We had some stuff fried due to thunderstorm, including bluray player, game console and my wife's PC. We spent a whole day, a lot of money and favors from very good friends to get stuff back together, mostly.. I'm still a bit unsure whether our video projector got damaged or if the game console is broken, but we'll see.

Anyway, fixing wife's computer required a new motherboard, which is a move win7 doesn't like. The system tries to load drivers meant for the old motherboard and bluescreens, and then goes through a lenghty automated repair cycle that doesn't work.

I got it finally fixed by googling around and finding this resource, which describes a mystical spell you have to give to the command prompt to get things working. Kinda like with linux, actually..

Anyway, here's how I went with it:

Step one: try to boot, fail, try to boot, go to the automated repair thing, cancel, pick advanced repair options (or some such), pick command prompt.

Step two: insert the new motherboard's driver CD in the drive. If you don't have a drive, copy the contents to a USB stick on some other computer. If that doesn't have a CD drive either, download the drivers off the net. Just make sure the driver media is somehow plugged to the computer.

Step three: all of the drive letters are jumbled. You need to find the drive letter of your windows installation AND the drive letter of your driver media (the CD or USB stick).

Step four: Cast this spell:

dism /image:c:\ /add-driver /Driver:X:\ /recurse

..except that you need to replace c:\ with the drive letter of your windows installation, and X:\ with the drive letter of your driver media (CD or USB stick).

The command will go through the driver media and install all of the drivers to your windows installation; in my case that was over 450 different drivers. That takes a while.

Step five: reboot. This will also take a while.

Step six: wait for windows to rediscover all the devices in your system. This, again, will take a while.

Step seven: uninstall any applications related to your old motherboard (like cpu temperature displays or whatnot) that just throw errors if you try to run them.

Oh, and as a word of warning, I take no responsibility of any damage caused by following the above. I don't know what the heck the command actually does. It worked for me, though.

Cheap-Ass DIY Passive Mixer

June 21st, 2014 (permalink)

I have a slight problem with my audio gear. Namely, latency. Playing midi stuff through windows' normal audio interface introduces a huge latency. Using asio4all, I can get the latency down to below 10ms, but then I can't hear the system sounds, and getting asio4all going can be tricky when you're running a hundred apps and any of them might have audio open..

So I went and bought a cheap USB audio dongle, which I can use as a dedicated asio4all device. Which works quite fine, except that I have to move my headphones from one jack to the other, and I still can't hear system sounds.

The proper solution to this would be to buy a usb mixer (which will also work as a USB audio device), but those easily cost more than 200 eur which I don't have to spend. So I figured I might go with a low-end solution:

Googling around I found a bunch of schematics for simple DIY passive mixers. The values for the resistors vary a lot from one schematic to another, so I took a wild guess and went with 2kOhm resistors. The sleeves should be connected to ground, so I just tied them all together.

The result works. I do have to pump up the system volume a bit due to the additional resistance, but considering that I earlier had the volume at something like 2%, this isn't much of a problem. (I am happy, however, that I didn't go with 10kOhm resistors =)

The audio quality is probably also completely out the window, but I couldn't hear much of a difference. Your mileage may vary and all that.

Oh, the reason why those resistors are a good idea is that this way the different audio outputs don't talk (much) with each other, so frying electronics is less likely.

Tired of Saving the World

April 7th, 2014 (permalink)

Since Google seems to be filtering all the crazy bits out of the recent search terms, I haven't had that to remind me to post here.

Anyway, to the subject at hand.

As I was working through my backlog of games on steam, I found myself weary at watching yet another intro animation that describes how the world is going to be destroyed by one evil force or another and only you can save the world by collecting an oddly specific number of magic thingamabobs from around the world, while everybody else (most of whom are more experienced than you) seem to be otherwise occupied.

Yaawwwnn.

Another thing that really tires me are shopping lists. I went through a bunch of games I had not finished at one point and realized most of them I stopped playing when I hit a "shopping list".

With a shopping list I mean that at some point of your quest someone tells you that in order to progress, you need to do a, b, c and d, or possibly to collect a, b, c and d, or, let's say, seven magic thingamabobs.

I understand where these kinds of quests come from. They give the illusion of non-linearity to the player, or possibly just encourage the player to explore the world a bit in the order the player wants. But the prime problem is the same as with the world-saving master quest.

  • Why are the stakes always so big?
  • Why does the player have to do everything?
  • Why does the player's role have to be so important?

All of these are relatively easy to fix.

First, I don't think it's always necessary to save the world. If you've played Full Throttle, for instance, the stakes are much lower, and by making them more personal, they have much more impact than your generic world-saving.

Infinity is boring. It doesn't matter if you're about to be crushed by an infinitely large boot or a half-ton one, but the half-ton one you can understand, and it feels much more threatening.

The second and third points can be solved by making the player feel like he's not the only one doing something, and also not necessarily giving the player the most important task. The Half-Life series actually does this at points.

Let's say a voodoo medicine is needed to cure the teacher of the village. Others go and find the exotic and dangerous ingredients while you're tasked to get water (and a bucket to carry the water in, and so on and so forth). While doing that, you also bring wet towels to ease the teacher's pain and discuss various matters with him.

By making the stakes more manageable, they become more personal and have stronger emotional impact. By giving the player a less-central role, the tasks again become more personal. While not the most important, the others' efforts would be wasted. And while not being alone, the player gets a feeling he's really helping, doing something he can understand.

New Year, Blah Blah

January 17th, 2014 (permalink)

Okay, it's been a new year for a while. Time to update the site..

First, here's the traditional new year's demo for the two of you who hasn't seen it yet..

I also started writing more "making of" articles, you can find those under the new Breakdowns category.

I cleaned up and published my TextGL code, which I used in "Litterae Finis".

And now, for no reason whatsoever, let's look at a game design.

There's a co-operative children's board game I've played recently. The premise is that there's four fruit trees. Every turn, players roll a die; if sides 1-4 come up, the player picks a fruit from the tree related to that side. If side 5 comes up, the enemy in this game, the bird, takes a step forward. The final side of the die lets the player choose which tree to pick a fruit from.

Oh, and if a tree is already empty, you don't do anything.

If the bird takes five steps, it gets to the garden and eats the rest of the fruit. If the players manage to pick all of the fruit before this happens, they win.

So I thought to myself, how much agency do the players actually have, and what's the probability that the players win..

So instead of working out the math, I wrote a small simulator for the game and ran a million randomized games to see what the result is.

The only place where the players actually make any decisions is when the final side of the die comes up, i.e, which tree to pick from. If you always pick from the tree with the least fruit, the likelihood of rolling empty trees gets higher, and thus the likelihood that you roll a bird comes up more. On the other hand, if you always pick from the tree with the most fruit, the reverse is true.

Now, if you do the good choice always, your chances of winning are about 63.1%, and if you do the bad choice, you end up winning 55.5% of the time. Totally random picks win at around 59.7% of the time.

Since it's a kid's game, it makes sense that the game is rigged to make the players win most of the time, but not so much that the bird doesn't have a chance at all. You also can affect how the game goes, but only slightly.

For the heck of it, I also ran some tests to see how the number of steps the bird has to make affects the results, and I'm pretty sure the game designers did the same, as the five steps is such a clear sweet spot.

steps bad rand good
10 96.7% 97.5% 98.1%
9 93.8% 95.1% 96.2%
8 88.9% 91.0% 92.6%
7 81.5% 84.2% 86.5%
6 70.0% 73.8% 76.8%
5 55.5% 59.7% 63.1%
4 38.1% 42.5% 45.9%
3 22.2% 25.0% 27.7%
2 9.3% 10.8% 12.2%
1 2.1% 2.6% 3.0%

So there.

As for new year's resolutions, I think I'll keep the trio I've used for some years now; let's see which ones I manage to upkeep this time..

  • Writing. Doing it right now. Also the "breakdown" articles. Other stuff? We'll see.
  • Music. Still "doodling" on the midi keyboard every now and then, should dedicate some time to record stuff too..
  • Getting in shape. This is (still) mostly a scheduling issue - I need to dedicate some part of the day for this and make it a routine or I don't get anywhere with it again..

There are of course other things I'd love to do, like code a zillion different projects and finish one of my indie game projects and get it out there and make SoLoud much better and.. .. but those will happen if they will, and since I really WANT to get those done, they have higher probability of happening than, say, getting in shape.

And no, round is no shape for a human to be.