The Making of Stefan Hendriks
This timeline is an informal way of showing you how my interests grew, what I did and how. You can find references to most of the material I have made. This is not to be considered a CV or Portfolio. Rather, consider this as background information about who Stefan is.
At the 17th of January Stefan was born.
When I was around 10 years old I had a PC, 8088 with a monochrome monitor. It had a harddisk with 10MB capacity, and the operating system was MS-DOS 5.
The reason I had a PC at that age, in that time, was because of my father. He believed that PC’s would dominate the future. It would be important to get in touch with these devices as soon as possible.
I enjoyed playing games a bit. But I was mostly interested in how they “did those things on a computer”. At a certain point my father gave me a book he used himself to learn BASIC.
It was around these days that two influental games where released: Wolfenstein 3D (I could not run it, my parents would not let me. Although I did try to run it, but it did not work due a missing FPU).
Another influentual game, that did run, though very very slow was Dune II. It took a bit of work to make it fit on disk, but there it was. It took literally minutes to move units around, but I was hooked!
As a child I was intrigued by the money counting in the game, you can see credits ‘roll’ on the screen. My first goal was to have some counter at the top right of the screen. With the QBasic book I worked my way to a counter. The counter was not graphical at all. In fact, it was a simple loop, clearing the screen, printing an amount at the top right and it counted from 0 to 1000. On the 8088 I could actually see it going. As a child I was happy as can be!
After that achievement, I knew that if I wanted to make something (software wise) and put my mind into it, I could do it.
Within this time I had played around with BASIC a lot. My first achievement was a number guessing game (from the book).
I also did a little “Store simulation game”. A text based game, where you basically had a “guaranteed sale” for each item after each turn. You could buy items for a fixed price (say 100 bucks), and then give an amount of which you would want to sell them (200 bucks). Then you could choose to end your turn and you would get money for a random amount of sold items. It also had some sense of time. Like in the year 2000 you would have flat screens (of 5000 bucks a piece).
Later I went for a graphics mode and wrote a little shooter. There I learned how to hit enemy ships. “Missiles” where dots and I learned how to detect hits for enemy ships (which where triangles, but the collision detection was rectangle based).
I played Dune II a lot and I wanted to create maps for it.
I started working on a Dune II map editor, which would be “released” a year later.
“Quake and ReaperBot”
When Quake came out, I could run it on my 80486 DX4 (at 100Mhz). I did not have an internet connection myself, although my parents did participate in a Pilot for cable internet. With the limited time I had on the PC of my father, I searched for a intermediate solution. I wanted to play Multiplayer games, but without the need of an internet connection. This is where I found the world of Bots, which evolved around Quake 1. In particular I found ReaperBot interesting as it did not require any waypoints or other navigational data. It would simply learn the map on its own. This is where I also touched Quake C for the first time as I worked my way into decompiling ReaperBot and applying the ReaperBot Improved Protocol tutorials.
Although I was interested in bots, I merely wanted to play with them. At the time I found C (and QuakeC) so verbose compared to BASIC.
I have released a tool called “Dunedit“. (A map editor for Dune II). Initially I had no internet connection, and only a book to work through BASIC. I had to literally work my way through the game and see what happens. This meant, changing the game files and see how it influenced the game. This way I figured out how the SCENARIO format of Dune II worked, and later also how I could create my own Campaign. This felt like a great achievement, and I felt I was ready for the next step.
The next step
I want to write my own RTS game.
In 1992 I was impressed by Dune II, and I wanted to create such a thing myself. Now I thought I had accumulated enough knowledge to have a basic understanding of how an RTS ‘probably’ should work. I was still programming in QuickBasic and I have found a library called DirectQB. This allowed fast blitting of images, playing sounds, etc. I started writing my first attempt at a Dune II “clone” which I called Arrakis. It took a few attempts, but eventually it got released. (You can grab the source code from here)
Dune II – The Maker
In this year, a lot happened. Half-Life was released. I love this game so much, I am not programming for a while. In the beginning I fixed some bugs in Arrakis. But it was finished. So I accomplished this goal.
However I felt that I still not had made the Dune II RTS I wanted.
I also felt that I had reached the limits of BASIC. So I decided to try to play around with C. I learned a lot, the hard way, that C is different from BASIC (back then I was too stubborn to read the books). I searched for a game library and ended up with Allegro. Allegro is also maintained by the same person who created DirectQB at the time. Since in BASIC I had only one or two source files, my very first attempt was to write a game in one C file. Although I got lots of stuff in, it failed. It also took ages to compile at the end. If you wonder how it looked like, you can still download it from here (I called it Ultra Dune II there).
I retried and went for C++. Although I was not really using C++ full potential (I still wondered what the real difference was between classes and structs back then). This would eventually end up in a pretty decent attempt. I named this remake Dune II – The Maker.
1999 / 2000
“A sidestep, my own bot – RealBot“
When Counter-Strike BETA 5 came (before the team joined with Valve) there was work in progress on a delicate framework that would allow to create bots without the need of the actual source code of the MOD itself. Since Counter-Strike was one of the MOD’s I played a lot these days, I was pretty interested in that. I ended up using one of the early versions of Botmans framework (HPBBot) as starting point. Inspired by ReaperBot from Quake 1 I wanted to create a bot that did not use waypoints.
RealBot was one of the few Bots in the beginning (there was also an Android bot around), and I hosted a little website at a telecom provider with very limited bandwith. The site simply got dragged down and I got a place offered at counter-strike.net.
It blew me away.
Within a short time I had a website, with software hosted on it which I had created and downloaded by thousands of people (one day I had 25.000 people visiting). People who actually hosted servers with it, mailing me with bug reports or feature requests. On busy days I had over 200 e-mails a day. Overwhelming.
But I was still learning C++! (I still am)
With all this attention to RealBot I stopped focussing on Dune II – The maker for a while.
2001 / 2002
With all the attention to RealBot I actually felt a bit pressured (for the first time). At first I released very often, but soon I realized that if I made a mistake then I could affect a few hundred people and get loads of bug reports. I did not use any version control (I kept backups myself) and since I basically started from a hacked version of the HPBBot I needed to start over. Releasing to so many people was a new experience to me. This was the first time I felt so responsible.
With time I learned a great deal about Half-Life and its engine, its quirks and more.
As earlier stated I did not want to use waypoints, but I got stuck making the bots intelligent enough. Unlike Quake DeathMatch games, Counter-Strike expected goals to be fullfilled. Meaning, plant a bomb or rescue hostages. Navigating required a bit more intelligence. So far I had tried using a 180 degree raytracing. THis meant, the bot would have a preferred ‘angle’ to walk to (ie the bomb spot), and as long as the bot had sufficient room to walk to that, it would go for the direct line. When a wall was detected, the most closest to ideal angle would be picked that had room to go to.
At a certain point of time I got help from someone who was convinced I had to use pathfinding, and I took the chance. We shared the source code and worked on it, he had implemented the Floyd Warshall shortest path algorithm. The bots walked pretty good actually. With pathfinding we could control the bots much better and deliver a better gameplay. Although they became much more predictable, which was not very much the case in my very first releases. Personally I loved this feature at start, and grew to dislike it later.
With time we lost contact and I wanted to go further with RealBot. I was not very happy with this “waypoint the map yourself before you can play” restriction. Then again, I wanted to use waypoints because I believe in the power of them. You can store much more data with them then I thought. Also, you can think of smart ‘taking cover’ algorithms and ‘should I camp here’ tactics. Much easier than without waypoints for sure. I figured that waypointing a map with a ‘waypoint editor’ was cumbersome. It had to be much more intuitive. I was not smart enough to write a map scanning utility, going all around the BSP and figuring out what walkable vertices where. And even then, I had to make calculations if the players would fit in the 3D space.
So I thought of something much more practical: Let humans do this for you, while they are playing.
I started rewriting parts of the bot. At first, there could be no Floyd Warshall algorithm, as it is a calculate once tactic. Instead I had to use A* or similar which does not require a pre-calculated set. Also, I needed to keep track of player movements. So I built a class that did that. For all human players check every frame if they have been moved a certain minimum distance, and if so plot a waypoint. If there was already a waypoint available, don’t plot it. When plotting a waypoint, instantly make connections to nearby waypoints (up to 8 neighbours maximum). I kept a pretty short distance, so there was some density.
When loading the map, some waypoints where already there: the bomb spot, hostages, spawn points, etc. I could identify them, and link them with plotted waypoints from real players. If you put a non-waypointed map in a server, it would take 5 minutes to have it decently mapped. The more the map is played, the more detailed the navigation tree will be. Great!
RealBot eventually moved to Bots-United, where it is still hosted. (but no longer maintained).
You can grab the source code from here.
Dune II – The Maker did get much attention these days.
2002 – 2006
Come back of Dune II – The Maker & A study…
At school I always thought that programming was my hobby. And if I ever would work in this industry, it would become “just work” and it would be no fun. So I focussed on something else. I started a study called : Bachelor of Education . If I would graduate, I would be a teacher for kids ranging in age from 4 till 12. I studied in Haarlem and had a great time overall.
At home I programmed most of the time. Times where changing, Counter-Strike was losing my attention and I went back to my old love: Dune II The Maker. I started again, well I did three attempts until I ended up with one of the latest versions that you can play today. I even have created a YouTube movie of it:
2006 – 2010
Make your hobby your work
At the beginning of 2006 I decided to stop with my study. I knew it for a while, but it just was not meant to be. And I also knew that what I really loved doing, was not in the hours at school. I loved programming, and I realized I love it enough to have fun at work. I wanted to work as a Software Engineer.
But I had no papers whatsoever.
Since I quit my study, and I had to pay rent, I searched for a job and found one at Realworks. I started there at the servicedesk, answering phone calls from customers. When I was asked about my ambition I said “I want to work on the software you create”. And within six weeks I got a position in the development team after showing off my code of Dune II The Maker.
A year later I decided that if I ever wanted to graduate as Bachelor, I had to do it now. I figured that I could not develop myself enough at Realworks and found a job at Mirabeau. In the meantime I started my new study (evening school) : Bachelor of Information and Communication Technology .
At Mirabeau I started as a junior Java Software Engineer. From there I have worked on transavia.com (a dutch airliner, sister-company of KLM) and autotrader.nl in these days.
I have learned a lot there, I have learned a lot about Design Patterns, Build Processes and tools and so much more. I also learned that an evening school is really sucking up your social life. Working 40 hours a week and then going to school twice an evening and making homework (with the same intensity as a full-time dedicated study) is tough.
2010 – now
At Mirabeau I have now worked on two other projects: vakgilde.nl and bplusc.nl (the last project is not live yet at the time of writing). I have learned to work with more complex systems and how to write nice components. I’ve been a tech lead for vakgilde, bplusc and also a G-Star iPad App. I also got a love for a quality of code and grown an interest at how to write simple to understand code. I am intrigued how a problem can be solved in so many ways, and that the real challenge is to make it understandable for your co-worker.
At 2010 I graduated. My thesis was about meassuring the quality of code and how it relates to more abstract requirements. This way, as a Software Engineer you could influence the perception of quality by working on concrete, measurable things.
At the end of 2011 I decided to leave Mirabeau.
One thing I have learned is this:
When I work with enthusiastic people, want to deliver the best, have fun, great social skills and are proud of what they are doing. I feel as happy as can be!
And Dune II The Maker?
Well I have also learned so many things, that I first decided to refactor the game to the best state possible. But recently I have decided to start from scratch (again)… to be continued!