Monkey off my Back


Welcome traveller, come rest a while, I'll tell you a story of pain and suffering, success and failure and possibly too many cans of coke. Come come, listen carefully to my devlog. If you haven't already:

Play Tales of Yore

(and support if you like it)

6 months Ago

It's been more than 6 months since I started work on the next big update for Tales of Yore. I called it Northlands because it was intended to be just the north corner of the first continent. What followed was an exercise in idiocy including scope creep and massive attention to detail. Northlands went from being a handful of zones, to 100+ zones. From one town to three. From 5 quests to over 40. That alone with the million and one extra features I decided absolutely had to be in there meant the update has taken more than 6 months to build.


It's a hell of an update and as always I wish I kept scope under control. Towards the end I started struggling to stay focused on the project but pushed through and it's finally out with players. Now admittedly some of them will finish all the content in a few days - but they'll enjoy it, and thats the key I guess. They're happy, I'm happy!


So what sort of stuff went in...

Escort Quests

There were several new quest types added, including the "Escort Quest". This is when the player is expected to take an NPC with them on the journey, ensuring they get to their destination safe and sound. It's quite a cool experience really, you have to think about your own safety as normal but often have to throw yourself in harms way to protect your charge. 


This was a particularly nice thing to implement. The game world acts as a simulation most of the time and players in the world are the same as other actors (with a different brain). To create my escorted character all I had to do was create a new actor in the world that had the player's brain but didn't have anyone controlling it. Telling that new pseudo-player to follow the real player doing the escort and we're off. One escorted NPC!

Losing an escort (either through death or losing track of them) had to be handled. Very simple - remove the actor from the world and set a variable so that the quest can start again. Player arriving, also not too tricky - on talking to the right NPC record that in a variable and remove the actor from the world. 

The tricky bit was server restarts. It's not fair that people in mid-escort lose their quest because the server is restarting. However, when the server restarts everyone just disconnects - and that can't be a trigger for saving the escort otherwise people would exploit. Theres some seriously ugly code in there to deal with that one!

Protect Quests

Next up, "Protect Quests". These have a similar vibe to the escorts but revolve around protecting a certain location from an onslaught of mobs. This can be pretty hard on your own but take a few friends an its a lot of fun. In Northlands the first one of these quests is protected the chicken coop from the Ratins!


From Tale's code point of view there isn't really a quest here. It's a just zone with certain spawners and length of existence. Theres been an event in game to trigger off when all monsters are dead for while, so its just tied to that. It's really nice when things that you've built on the assumption they'll be useful end up getting wired into something a bigger than you imagined.

Boss Upgrades

Boss fights are of course a key stake in the MMORPG world. Up to now they've been big monsters in certain locations that were just about enough to give people a challenge. However, the players had spoken, they want bigger better and stronger monsters that they have to party to beat them. So, I give to you and severe difficulty increase. 


Northlands is hard, like proper hard. The bosses also have all sorts of interesting new things they can do from casting AoE spells to summoning help when they feel like it. They're still not what I want in the end but they are a big step forward from the original Medusa and Dark Knight.

The Sneaky New Rendering Engine

So, I mentioned getting distracted and there was this little random feature that snuck in while I was doing work on Northlands. I'd actually been having a debate on Twitter (you know how worthwhile that is) about whether when writing 2D games you needed to use an "engine". To be clear I don't have a problem or look down on people using engines. Whatever works for you. What I don't like is that when people ask where to start they're immediately pointed at some huge chunky learning curve of an engine when all they want to do is blit some sprites to the screen and plays some sounds. Different people, different approaches, but a lot of the complex ways people achieve simple things in engines blow my mind. 

Want to work out if a user has clicked on a rectangular area on the screen? - why thats a ray cast through some geometry! Anyway, end soap box.


Since it was on my mind and I'd been meaning to add an OpenGL renderer to my game library I got fully distracted and went off on the crusade! 3 days. OpenGL up and running. One bug that stuck around for 2 weeks, turned out to be my use of Canvas not OpenGL :) It's running now and stable, it was an immensely enjoyable distraction and performance on many devices is way better with OpenGL - though on average HTML canvas is faster and more reliable across devices (I'm looking at you iOS). 

Yore vs The Bad Guys

One sad fact of online games is there are a lot of people out there who are only playing online to upset and annoy other people. Whether thats with swearing, hate speech or just generally griefing. Banning people by user name is your first step, just kick and ban them. Of course since you want to make the barrier to entry on the game as low as possible, you've also made it possible for these bad guys to create new accounts straight away. 

Ok, you think, lets ban by IP address - that'll be good, at most they're going to have a couple of devices before they get bored right? Well yes, but no. These folks are so focused on upsetting everyone that they'll happily restart their home routers to get a new IP so they can come back on. I had one guy who came in on no less than 20 different IPs. 

The really annoying thing here is that you're spending time dealing with this nonsense instead of writing your game. 

So.. with these bad guys in mind I've added two things. The first is the wonderful tool called fingerprint.js - it does exactly what it says, generates a fingerprint of the user's device. This gives me a new way of identifying the end client. Before you shout PRIVACY! it doesn't send me anything about your machine or environment, just a hash thats expected to be pretty unique but also the same whenever you use your device. This is great, give the IP doesn't effect it, this new hash is a pretty 

The final additional feature thats been a great success is the "mod mute" command. This causes a player to have their chat messages sent into the void BUT with the impression and feedback that they have been sent and received by other people. So, the client actually plays back the bad guy's messages as though they've been said. 


This is great because you have this image of this hate speak touting, foul mouthed, um... person sat at home chatting their horrible spam into the game and wondering why no one is giving them what they need, attention. For me at least, thats kinda cool.

More of Everything!

And of course a release wouldn't be complete without some stats!

So thats 40% more Items, 50% more mobs, 50% more NPCs, 30% more quests and nearly double the world size to explore!

It's been a hell of a journey to this update and the game just keeps chugging along. Players enjoy what I've done, so I can only count myself as one lucky developer. It's really fantastic to watch them find their way round and pick up new strategies and secrets along the way.

As always, let me know what you think or ask any questions in the comments. Til next time!


Comments

Log in with itch.io to leave a comment.

Sad to hear that you've got those Bad Guys spoiling the party. I liked your fingerprint idea and it made me think that game developers should get together and pool all the Bad Guy fingerprints into a database that games could check as part of the registration process.