[null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/tmwtit.png", "src": "https://tsknight.com/img/tmwtit.png", "formatted_filename": "tmwtit"}, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/SlideRacing.jpg", "src": "https://tsknight.com/img/SlideRacing.jpg", "formatted_filename": "SlideRacing"}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/UserPicker.png", "src": "https://tsknight.com/img/UserPicker.png", "formatted_filename": "UserPicker", "rendered_width": 406}, null, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/sillyidea.jpg", "src": "https://tsknight.com/img/sillyidea.jpg", "formatted_filename": "sillyidea", "rendered_width": 400}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/cities1.png", "src": "https://tsknight.com/img/cities1.png", "formatted_filename": "cities", "rendered_width": 500}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/cities2.jpg", "src": "https://tsknight.com/img/cities2.jpg", "formatted_filename": "cities", "rendered_width": 500}, null, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/diving1.jpg", "src": "https://tsknight.com/img/diving1.jpg", "formatted_filename": "diving"}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/divingmes.jpg", "src": "https://tsknight.com/img/divingmes.jpg", "formatted_filename": "divingmes", "rendered_width": 550}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/lirScreen.jpg", "src": "https://tsknight.com/img/lirScreen.jpg", "formatted_filename": "lirScreen", "rendered_width": 400}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/cmScreen.png", "src": "https://tsknight.com/img/cmScreen.png", "formatted_filename": "cmScreen", "rendered_width": 400}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/ffScreen.jpg", "src": "https://tsknight.com/img/ffScreen.jpg", "formatted_filename": "ffScreen", "rendered_width": 400}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/tmScreen.png", "src": "https://tsknight.com/img/tmScreen.png", "formatted_filename": "tmScreen", "rendered_width": 400}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/invisible1.png", "src": "https://tsknight.com/img/invisible1.png", "formatted_filename": "invisible", "rendered_width": 400}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/slScreen.jpg", "src": "https://tsknight.com/img/slScreen.jpg", "formatted_filename": "slScreen", "rendered_width": 400}, null, {"document_url": "http://tsknight.com/", "unformatted_src": "/img/stScreen.png", "src": "https://tsknight.com/img/stScreen.png", "formatted_filename": "stScreen", "rendered_width": 400}, null]
My name is Thomas and I love to be surrounded by creativity.

I'm currently doing freelance game development under the Radical Dog banner, and writing for the developer-focused blog.

Previously I have worked as part of small teams, and was Lead Developer at Automation Consultants.

I have a proven track record, as my Flash games have been played upwards of 15 million times.

I have an eye for detail and strive to produce pixel-perfect work.

I have a broad background including HCI and film, and believe in a tight link between elegant code and sharp design.

I graduated my Masters in Computer Science at University College London with a Merit.

I led a Game Development student special interest group, working in Unity/C#.

I think board games are the best thing since sliced bread. Programmers can learn a lot from how Pandemic will kill you with a deck of cards.

I can be contacted at . 
At Automation Consultants, I worked on plugins for Atlassian Jira and Confluence. As Lead Developer, I formalised development practices going forwards including good use of Git, and maintainable code style.

I developed a plugin to automatically assign Jira Service Desk issues to service agents based on who has the least workload. This uses Java servlets to communicate with the Atlassian REST api, and a Javascript front-end. I also managed the server setup and deployment for another plugin, the 'Approval Macro for Confluence', and worked closely with our other developers on a variety of projects.

Junior Game Developer

At Meta Games Universal, we developed slot games and other applications. It is a small company with a team of only 6, which was exciting as I was able to make a directly visible contribution.

I led the front-end development of a JQuery Mobile web app, for use at ICE 2016. As you can imagine, developing for a conference meant a strict deadline that could not be missed! Luckily, everything went well and our client, OpenBet, were happy to show off our hard work. This app generated QR codes to give to a bookie on-location, as a conceptual demo as to how a web-app could improve the betting shop experience. In order to finish the work within the 5-week deadline, I pushed to avoid taking shortcuts that would make later design changes take longer.

Much of our work was made in a proprietary program developed in-house, using a pre-processed mix of C#, Actionscript 3, and XML. This has given me excellent practice in diagnosing obscure bugs, and the confidence to tackle literally anything. To illustrate this, here is a picture of me skydiving. Cities Unlocked

For my Masters dissertation, I worked in a team for Cities Unlocked, a venture to help the blind and visually impaired in conjunction with Microsoft and Guide Dogs UK. My slice of the project involved doing experimental work to ascertain possible directions for a touch-screen UI, given limited or no visual feedback. Apple has a market-leading system for the visually impaired involving long-presses and multi-taps. The question being asked by Microsoft was if a more efficient, quicker system could be designed using single-action controls (one tap, or one swipe). My research led to understanding that a strictly faster system was possible, but at the expense of practicality; rather than being a skin to apply over any app, this would work best for a custom-build app for the visually impaired.

As an experiment in blue-sky thinking around HCI, this was a fascinating experiment.

MSc Summary

I gained an MSc Computer Science at University College London and graduated with a Merit. The primary language in the taught portions of the course was Java, in which we were assessed in weekly tasks and on a final coursework developing a small desktop application.

Outside of Java, I have also worked with databases, JQuery, PHP, and HTML/CSS. This was also the period in which I ran the Game Development SSIG. Modules in my Masters included:

Before this, I did an undergraduate degree in History and Philosophy of Science at UCL, and gained a 2:1.

Game Development SSIG

During my MSc I ran the Game Development special student interest group, and we spent our time learning Unity (C#) and Unreal (C++) for a few stolen hours each week. I taught what I had learned from my work developing Flash, and a small but dedicated group kept it going the entire year.

During this time, I implemented A* pathfinding for the second time (I have previously used it in Flash demos), intending to use this to make a 'responsibility engine' where figures would attend responsibilities and 'make friends' with each other in downtime. I have also done work on a little strategy game, which takes inspiration from Advanced Wars and Chess, being completely deterministic. I have always found game AI hugely interesting, and I hope to pick this up again in the future! The Diving Messiah

Mousebreaker is a UK-based games portal that has hired me for two separate stints during breaks in my undergraduate degree. I designed and created the games with additional art support from the team.

The Diving Messiah is a launcher game with upgrades, based around a footballer making the longest, worst dive ever. It is mechanically balanced to give the player a degree of control with when to activate "boosts", while still maintaining the luck and chaos that makes the genre fun. I am particularly proud of the menu. The music plays along with the intro then switches into a seamless loop, while lightning highlights the footballing "messiah". Overdramatic, perhaps, but that was the whole point! Originally the diving messiah himself was planned to be Luis Suarez, but during the production of this game Neymar made a clown out of himself at the 2013 Confederations Cup. That's part of the appeal of making games quickly - they can be topical!

Intro and menu art was by myself, in-game art was made by Elena Bolado.

Literally Insane Racing

Literally Insane Racing was made over the course of 2 months for Mousebreaker. It is a racing game, and very large - 40 cars, 60 races, car customisation, and a campaign that takes 2+ hours to complete. It is the spiritual successor to Slide Racing, and implements the Box2D physics engine. The cars are very carefully balanced, so that every single car has an event where it will do well. This is achieved through races having entries limited to cars from certain countries, or with different drivetrains and so on. The player is expected to use 15-20 of the cars in their playthrough, meaning that they will end up with a garage personal to them and giving a sense of ownership. Two different players can make genuinely different decisions in their car purchases and what they choose to upgrade, and still progress through the campaign.

According to my analytics, and despite there being no incentive, a percentage of players continued grinding after completing the game to collect every last car. I believe that this demonstrates the power of giving players something to own, in a somewhat Pokemon-esque manner.

The Cutest Massacre

The Cutest Massacre is a Smash Bros inspired brawler, in which cute animals bludgeon each other with baseball bats, rocket launchers, and their little paws. This game has the most complex AI I have developed. All 6 species of animals have different patterns, so that the cat will focus on the player, while the badger will focus on the weakest opponent and so on. There are also times where animals will flee, such as in capture the flag games, or prioritise crates containing weapons. This all interacts with a variable difficulty level, so that as players fight through the campaign the opponents will get tougher.

The game was made in 5 weeks for Mousebreaker. Background art and menus by Elena Bolado and Silvia Bezos.

Fat Footy

Fat Footy is a 2v2 football game, developed for Mousebreaker in only 2 weeks. In single-player, the player works with an AI to win matches, while two players could either compete against each other or work together against an AI team. The football itself uses masking techniques and layered shadows to appear to roll like a 3D ball, while being only standard 2D Flash.

The Man with the Invisible Trousers

'Radical Dog' is the brand I have built for games made independently, with branding rights sold to numerous arcade websites.

The Man with the Invisible Trousers is a puzzle-platformer, with a detective noir theme. It has been my most successful game to date, getting over 5 million views and onto the front page of several large game portals and dozens of smaller ones. (Newgrounds, Kongregate, and Addicting Games to name a few.) The story segments lay clues towards a murderer, with clues and murderer changing each playthrough. Gameplay centres on a gravity mechanic. The player always falls towards their feet, and can walk up curved walls to change orientation. The difficulty is dynamic, so that if the player solves the puzzles quickly then more difficult levels will be spliced in. The presentation of this game was a big part of its success. This includes playful touches like the "Don't play" option in the menu, and funny extra conversations when the player loiters around NPCs. I also got help from a fantastic voice actor for the intro and credits, completing the hardboiled detective experience.

The game was made in around 70 hours over 4 weeks. All programming and graphics were my own.


Slide Racing

My first full game, Slide Racing, is a racing game with a career mode, 8 tracks, and 8 cars. It slowly but steadily built up over 5 million plays since 2009, which equates to over 140 years of wasted time globally. Having been unimpressed by other Flash racing games, I set out to make my own. I created an engine with circular collisions, twitchy controls and tough opponents. The game is intentionally hard, and over the course of the 1.5 hour career mode the AI progressively increases in difficulty with neater driving. I believe this was central to the game's success. One thing I learnt from this experience is to not be shy about making a challenging game!

I believe it is important for a developer to evaluate their work and learn from it, both successes and failures. From my first game I took away lessons in handling dialog, clarity in instructions, and the intriging power of semi-secret achievements.

Snazzy Tennis

Snazzy Tennis was blasted out in 24 hours of work, as a weekend challenge to implement a Flash version of Tennis for Two, one of the earliest computer games. It is a single-button game that can be played by one or two players, and it did remarkably well for such a small project! There are three difficulty levels to beat. These are two AIs, one that uses general guesswork based on the current speed and position of the ball, and one that makes attempts to calculate the perfect shot before hitting. The "medium" difficulty AI switches between the other two. In practice, these worked out well; the first and second are very beatable, while the third must be beaten with low, fast shots.

The single-button control will do a light shot with a higher angle on a light tap, while if the player holds for more power the shot will be faster and at a lower angle. Through this, the player can do both safe volleys and powerful slams with only one button. It's pleasingly intuitive, and I have demonstrated the two-player mode with success at UCL's open days.