I never intended to make HappyFunTimes what it is today. This is I guess an example of what happens when you just do something. Things happen.
It started off when I was working on Chrome. I learned about WebSockets. I might have seen some tutorial on how easy they are to use. I think I read about Socket.IO, a popular library that can use WebSockets and it just occured me, as it has several others, that it would be easy to use WebSockets to make certain kinds of games.
My first game was PowPow. You can see the commit history shows it was made around April 10, 2011. That’s 3 years before I started on HappyFunTimes. In fact the video linked to on that page is from April 8th. At the time I had people using their laptops as controllers. After that one day playing I tried making phone controllers. Being April 2011 it was still common for Android phones NOT to have multi−touch or to have broken multi−touch so if you go look at the code in that repo you’ll see the iPhone controls are Left/Right/Fire (3 fingers) but the Android controls are “point the direction you want to go, tap to fire” (1 finger)
At the time I thought it would be good to make a library but when you’re working full time, or when I am, it’s often hard to find motivation to do things outside of work. I suppose that’s kind of stupid since I made PowPow outside of work but it only took a few days. So, I guess I have no idea why I find motivation for some things and not others. If I had infinite time and infinite motivation there are sooo many things I’d work on.
As a side note, in 2012 I used the same tech for our Molyjam game, “Octopi Everything” which I plan to port to HappyFunTimes (if I can motivate myself 😛)
Then last year in June 2013 I quit my job at Google. I traveled and goofed off and didn’t really know what I wanted to do. In March I found myself in Kyoto for Bitsummit. There I met Eddie Lee and Kalin of Funktronic Labs along with Sagar Patel, Andrew Palmer, and Edwon. Also in Tokyo I had previously met Alvin Phu and they were all so inspring. Everyone was working on something. Alvin in particular had a fulltime job with crazy Japanese overtime and still was working his ass off on his own game.
So, I started feeling like I should get off my ass and start working on something. I still had no idea what but I should at least spend time making something, anything. I thought about it and though, “ok, fine. I guess I’ll turn that code from powpow and octopi into a library finally and then maybe make a mobile game after”. I thought it would take at most a couple of weeks. I didn’t intend to make any money. I just thought it would be fun to put out the library and maybe have a game jam (which I still need to do!)
Next up I thought I should try dual stick controls. Partly because I wanted to make a unity example that shows walking a character around. So I hacked together ShootShoot.
With that working I got a unity character example working which didn’t take too long but took longer than expected dealing with UnityScript vs C# issues.
After that I wanted to see how a platformer would play so I threw together JumpJump and shortly after that I decided I wanted to make something showing off round based play among other things and wrote BoomBoom.
I ran into another issue which was I could not get consistent performance out of Chrome using the Canvas 2D api so I ended up writing JumpJump and BoomBoom in WebGL. That ended up making some useful libraries like a single quad single draw call tile map renderer as well as a runtime color adjustable sprite system.
In writing these games though things kept popping up. For example, originally
you’d need to go to long and complex Urls. To play jumpjump for example you
might open a browser and go to
http://localhost:8080/examples/jumpjump/gameview.html then you’d get out your phone and go to
http://192.168.2.9:8080/examples/jumpjump/index.html. That’s a lot to type, especially on a phone. Of course I used bookmarks and
other things to make it go faster but eventually I got tired of typing so I
thought, “hmm, I’ll write a script that generates an index.html that lists all
the controllers”. I wrote that. I also wrote ones to list the games. Now I
could go to
http://localhost:8080/games.html to pick a game and controllers could go to
http://192.168.2.9:8080/ and pick the corresponding game. That was much better. So much less typing.
But then, I realized if there’s only one game running why not just send the
controller there automatically. So added a script to the page contollers go to
that lists the games to check which games are running. If there is only one
just go to it. This was awesome. Now I’d start a game, then on the phone I’d
just go to
http://192.168.2.9:8080 and it would automatically join the game! It seemed so awesome!
That led to the next step. Using the same code, when game disconnects the phones get notified so I used the same code that checks if any other games are running. If there is only 1 game running I jump to that game. The effect was that the system felt like a virtual console. I’d start it up, phones would connect, they’d jump into the game, and if I switched games they’d all jump to the new game. This was feeling really really great. There was even the added and unintended bonus that I reloaded the same game the controllers would see that as the one game running and reconnect. That was great for development. I’d tweak the game and click “reload” in the browser. That would have the effect of having all the controllers auto−reload. Faster iteration times FTW!
It still sucked though to ask people to go to their phone and type in something
http://192.168.2.9:8080. I knew about Captive Portals. They are those things you see when you use
hotel WiFi or coffee shop WiFi and it asks you to log in inside the browser. If
I could get HappyFunTimes to support something like that I could make it so
when players connect to the WiFi they automatically connect to the game, no
typing anything at all. It took a few days but I got it working. Note that
feature only works on iOS and it only works if you configure your router a
certain way to let HappyFunTimes respond to certain requires but the effect is
pretty amazing. On Android some of the same code means if HappyFunTimes is
setup this way users can just got to any Url to connect so I tell them go to to
h.com or something like that and they connect.
These things are simple to explain and maybe it seems obvious but my impression is most people don’t really get it until they see it in action. I think even tech heads think “Yea, type some long address and you’re in” but when I actually demo HappyFunTimes in a room full of people and they see everyone effortlessly connect and play some games and they see me switch everyone to new games and go through all the demos it’s pretty impressive.
Announcing HappyFunTimes got a few people using it and I quickly realized I had some problems. All the games had to be checked into the same repo, or at least there was no easy way to separate individual games from the system. On top of that I had tried to show it at a certain event run by industry people. I sent them a link thinking “these are game developers, they won’t have a problem following the 5 steps to install to check it out”. Instead I got back a message something like “Wow, that looks hard”. Of course at the time I didn’t intend for end users or regular gamers to install it but gees!!, if an actual developer was bitching about installing node.js and cloning a git repo then there’s no way anyone else is ever going to get anywhere except for the most dedicated.
So, those two issues led to do things.
- I absolutely had to make an installer for at least Windows and OSX It had just install and work, no setup.
I had to find a way to separate the games and make it easy for others to add their own games to the system.
Those two things led to several features. For the installer it wasn’t enough just to install. I also had to come up with a way to easily connect phones to the local game without having to configure your router and without having to type long cryptic Urls.
My first solution was to make happyfuntimes.net and write a script that scanned
for the local happyfuntimes. Basically if you’re running Chrome on Android it
could figure out your local ip address. Say
192.168.2.37. It would then ping every address on that network and see if it got the
correct response. It worked! But, iOS Safari doesn’t have the feature to look
up the local ip address. My next solution was if I can’t find out the local ip
address then I’ll just guess. Most routers use a common set of addresses. I’ll
just try them all. Unfortunately trying them all took > 5 minutes. I added
some heuristics to guess better and therefore faster but it mostly didn’t work
Then the more obvious ideas was I should change happyfuntimes.net so when
happyfuntimes starts it tells happyfuntimes.net its ip address. When a phone
goes to happyfuntimes.net, happyfuntimes.net can see the matching ip address
and tell the phone where to go. Problem solved!! Telling users to go to
happyfuntimes.net is not as nice as auto−connecting but it’s not a
cryptic Url so it’s easy to explain to users. Of course I wish is was just
hft.com or something simularly short but short URLs are expensive 😎
Next up was separating the games. npm, the node package manager, suggested a way to do it. It took a lot of trial and error though to finally get it working but the result is http://superhappyfuntimes.net and the related system.
The funny thing is though I never intended to take it this far. Each piece is just the next logical step as I built things up. I don’t know if there is anything to take away from that except that just doing stuff for the hell of it often leads places. Make some simple game or demo or app and you’ll likely end up with pieces of code or tech that you can use on the next thing or you’ll see how to tweak what you’re making into the something else and after a while you’ve made way more than you ever expected. I guess like they say, “Just do it!”
There are several reasons.
- It means no install required. Users can show up at some event and participate immediately. Potentially even other phones like Firefox OS phones or Windows phones or Xiaomi Phones should all work.
It requires no approval from Apple. I'm happy that Apple seemingly does a good job of keeping malware off of iOS but I'm not so happy that they have to approve every app. Even if your app is not malware they might say no.
It lets anyone make a custom controller.