When linking to these pages, please use the URL:
www.iki.fi/sol/ - it's permanent.
At some point in the past I wanted to have tree meshes in some project or another. I can't really remember what the project was. Point is, there weren't any good, free solutions for this out there.
I also wrote an editor for it called HappyTree. The sources to the editor (and link to a win32 binary) can also be found on the github page I liked above.
This is a little product endorsement I've been meaning to write for several years, but haven't for one reason or another gotten around to it.
Kahtoola microspikes. Who honestly don't pay me to write this. I wouldn't mind if they did, but they don't.
With the weather in Finland being what it is, the streets are often deadly slippery during the winter. Oh sure, they do sand the ice (when they get around to it), but that doesn't really solve the issue. People don't slip on ice because it's slippery. People slip on ice because it's surprising that it's slippery. If you expect the surface to be slippery, you walk in a different way to avoid falling down.
In that kind of weather taking a 20+kg dog out for a walk can be stressful, because the dog has more traction than you do, and if for some reason or another the dog decides to start pulling you somewhere, it may be difficult to assert who's making the decisions.
But not with these babies. Oh no. While wearing these, you don't need to care where you step, or how. While other people are shuffling around carefully, you can just go past them with confident strides.
Pretty much the only surface that I've found to feel slippery with these on are metal manhole covers. I especially like walking on thick ice with these, as they bite in quite well. Another slightly problematic surface is near-zero degree snow, which may get stuck in the bottom of your shoes. That's not as big of a problem as you might think, though.
The biggest negative is that you can't walk indoors with these (with a straight face anyway), so entering a store requires you to take them off (and to carry a bag with you to put the wet things into while in the store), and to put them back on. Taking them off isn't much of an issue, but putting them on takes a bit more effort. With some practise that's not difficult either, but it's another small hassle.
At home we just use a thick doormat onto which we can step with the spikes, and don't bother taking the spikes off.
They're definitely more expensive than your average teeny-tiny spike rubber thingies you might use, but they're definitely worth it just for not having to care about slippery surfaces outdoors. And yes, you'll definitely have more traction than the dog, too.
Welcome to 2015. To start off, here's the new year demo..
Let's see what's going on with my self improvement tasks;
On the topic of getting in shape: Based on weight index my weight is "normal", but that doesn't mean that I'm in a good shape. I'm turning 40 this year (eek), and in my 5-year checkup they found some worrying figures. So I was put on cholesterol medication, on top of which I've started to use our basement gym a couple times a week. I'm working through the McGyver episodes, 30 minutes on exercise bike and 15 minutes on weights, to start with. I'm planning on keeping that schedule unless something exceptional happens (like being sick or on a trip somewhere).
With 139 episodes of McGyver total, that should be enough distraction at the gym for at least a year, even if I occasionally did three days a week.
On hobby project front, SoLoud remains the 'big' project, even though I haven't touched it for a few months now. There's still a plenty to do there. I'll probably update couple other projects that depend on SoLoud (game projects mainly) to push myself to add some of the missing features.
I've also started following Casey Muratori's excellent hand made hero series, where he streams building of a game from scratch with little to no offscreening, and following that has caused me to ponder a few other game types to build as well. Too many ideas, too little time..
I'll also probably dust off some other old projects of mine this year and release the sources. Cleaning up HORS for instance, and plugging SoLoud to it, might be a fun nostalgy trip. A lot of pages on this web site are in need of updating, even if just to add a notice that the information is out of date (like most of the emscripten tutorial).
I'm also planning on applying to study teaching, but I'm not holding my breath on that, as there's way more applicants than starting positions, and they prioritize people who already do lecturing on a professional basis (and my single course gig doesn't really count). The course I'm applying for is done completely remotely, and I could do it alongside my job. If I do get in, I won't have any trouble with free time this year, so not getting in may also be good news.
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.
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.
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
can kilrathi saga be played on windows 7
cheats for bookworm popcap don't work anymore
Why would you cheat in bookworm..?
circle with triangle inside paranormal
code to create child window to send message "hello"
Will MessageBox do?
fate of sol story
Not written yet.
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
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
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
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:
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|
|Assassins Creed Brotherhood||41|
|Batman Arkham Asylum||64|
|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|
|Dead Rising 2||300|
|Dead Space 2||411|
|Dragon Age Origins||500||Saves grow as you progress|
|East India Company||3400|
|Elder Scrolls Oblivion||1100|
|Elder Scrolls Skyrim||13000||Saves grow as you progress|
|Giana Sisters Twisted Dreams||1|
|Jack Keane and the Fire Within||110|
|JustCause||820||May contain several save states|
|King's Bounty Princess||1000|
|Legend of Grimrock||250|
|Legend of Grimrock 2||1900|
|Mass Effect 2||60|
|Max Payne||1200||Save sizes vary wildly|
|Medal of Honor||175|
|Need For Speed Hot Pursuit||540|
|Prince of Persia (new)||210|
|Puzzle Agent 2||760|
|Quest for Infamy||665|
|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|
|Test Drive Unlimited 2||150||various files, hard to tell what's the save|
|Wasteland2||2000||Save sizes vary wildly|
|Witcher||15000||Save sizes vary wildly|
|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!").
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:
|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:
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.
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.
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.
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.
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.
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.
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.
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..
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.