Arvind vs. Education: How Unrest Was Made, Part 1 (Arvind)
To tell you how I made the game engine I've used to ship games on Windows, OS X and Linux, I first have to tell you about the Indian education system.
In India, a child goes to school for twelve years in total. We start young. Ignoring the pre-school competition coaching classes which started at age three, I began year one of my schooling at the ripe old age of five and left at seventeen.
Programming classes, consisting mostly of basic HTML or QBasic (yes, QBasic), start at grade six as an an “optional” subject. Optional subjects are taught for one thirty minute session out of forty-eight hours of schooling per week (think Saturday is a holiday? Tough luck, kid), and don’t count towards your actual grades. Coding isn’t taken seriously and nobody learns anything productive.
Luckily for me, in my eleventh year in school, I had the chance to take up C++ programming as an elective subject. At this point, I didn’t know any programming – all I knew was that some of my friends and teachers said I was “good at computers," whatever that meant. But hey--I would like to thank fifteen-year-old me for choosing C++ as opposed to “easier” subjects, which were Economics and Psychology.
(Just let that process in your head for a moment – how the hell are these subjects easier? They’re incredibly complicated fields we still don’t know everything about! C++ is like a walk in the park in comparison. And these are fifteen-year-old kids, for god’s sake! But I digress.) I loved my C++ classes. They managed to be everything my education had lacked so far. Instead of memorization and grammar, we had open-ended lectures about programming concepts. My teacher actually encouraged students to solve problems in different ways! I even made a Dope Wars clone for DOS using Turbo C++ as my class twelfth project--sixteen-year-old me is very proud!
As someone not interested in the competitive exam scene--one million kids competing for five thousand college seats, and a coaching industry built around exploiting teenage insecurity and societal pressures for money (sign me the fuck up!)--those classes redeemed the entire dark teenage period for me. (But I digress again.) College starts immediately after school ends, and luckily I managed to get into the Computer Science course at a decent place (I cannot speak about my true feelings about said college, or my friends will kill me). After the first “general” year--where every student has to study every branch of engineering at a surface level for some reason--finally, in my second year of higher education, I was ready to learn some actual programming. (DUN DUN DUN)
If it wasn’t particularly clear from my tone so far, I am not a big believer in the outdated Indian education system. There are good things, but they happen in spite of the system, as opposed to because of it. It's too focused on memorization and the curriculum is outdated...which brings me to the part which made me lose my faith in it completely.
In both school and college, students had to program in Turbo C++ 3.0 - an archaic compiler that can’t even run natively in any Windows version newer than XP. This was a bone of contention amongst a lot of students because it meant our education was obsolete before we even learned it, which didn’t fill us with confidence in our ability to compete in the job market.
This situation made me start trying to learn how to make a “modern” application using Visual C++ so that I could program something that my laptop could actually run without emulating DOS. This, combined with my love of video games, led me to search online for a way to display a simple PNG image in a program, which in turn led me to discover Lazyfoo’s SDL tutorials. These tutorials helped me a lot in setting up a basic framework for a hypothetical future game.
In 2008, there weren’t any pre-existing engines at the same level of popularity as Unity or Unreal today. I was familiar with Valve’s Source engine, having been part of the HL2 modding scene (I worked on Dystopia – play it now!) but source code access was limited and it was prohibitively expensive to license. All of these things made writing my own engine the only realistic choice.
After soaking up a lot of tutorials and advice, teenage Arvind realized that trying to write a general-purpose engine is a waste of effort. It's better to just try and make a game, then utilize the components and code you wrote in your next game. Now, teenage Arvind was the kind of person that makes a game about how much they hate everyone, how much college sucks and my god aren’t adults annoying?! Ahem.
So I started work on my first game, A.Typical RPG (look at these posts, I find them adorably humorous), a game about my college experience. It was literally my tutorial codebase gradually morphing into a game. By sheer luck, I managed to find a very talented artist to work with me due to both of us having been a part of the HL2 modding community.
- How I benefited from programming a game from scratch:
- I got to teach myself basic concepts like state machines, game loops, input handling.
I learned how to manage a team, and how to set goals and deadlines for a project.
- I was learning general C++ concepts like templates, vectors, certain algorithms which I feel made me a better programmer overall.
Due to the game being a mini-game driven RPG, I had to program lots of game systems--game event handlers, conversation mechanics, asset loading/unloading to optimize performance, saving/loading game state to/from file and so on.
- I was making something I wanted to play while doing all of the above.
Pretty much every point in that list can be taken as a negative point, and to an extent I agree--learning basic programming concepts while working on something you intend to sell is probably not a great idea. Maybe I would have ended up making all of my 3 games with Unity if I had been born a couple of years later.
Since this is a series of posts, there isn't really an "ending" here - I'm still making games, and I was incredibly lucky to meet the right people at the right time, and make the games I wanted to make. In part II, I'll discuss how I met my team and how I program my games.