I have one month to make an MMO: Sprint 3
Sprint 2 finished the movement and maps. It’s now possible for multiple players to connect their clients, and see each other move around the map. It’s also possible for players to enter a door or warp point, and appear in a new location (like the inside of a building), though there are only placeholders right now, I’ve not done any world building.
This time breakdown of the last two sprints is interesting to look at. It shows the half-day-off I took on Friday between sprints 1 and 2; and my 4-day vacation. It also shows that I spent a whopping 19 hours blogging over the last couple of weeks! That means I’ve spent more time writing in this blog than I’ve spent in GameMaker. I wonder if I should dial this back or not.
Sprint 2 Retrospective
As with Sprint 1, Sprint 2 was pretty on-point as well, with a total of 9 points (dropped from 10 after I removed a task that I felt wasn’t needed) for an 8-point sprint. However, given the amount of time I’ve worked per day being a lot higher than usual, I’d still count this as me underestimating time again.
So not only do I need to adjust my estimates, but I also need to dial back the hours a bit as I was losing steam towards the end of the sprint, and now I’m definitely heading towards burnout. I can feel it creeping up already. I’m also exhausted, though I’m not sure if that was due to the vacation or not.
The coding work came along smoothly, I think this is down to my using code and methods that I’d previously tried and tested before from various other projects I’ve done — the two mini-MMOs I had built for game jams, and various other projects and extensions I’ve released. This meant I didn’t have to spend as much time head-scratching and trying to figure out a way to make something work, I can spend the time iterating on a known solution instead.
Sprint 3 Plan + Tech
Sprint 3 is about getting the NPCs and mobs into the game. I want this MMO to feel like the world is alive, and make it viable to have a single-player experience. As such, I want the NPCs to be more interactable, and possibly even add plot-lines to follow. In a way, I kind of want this game to be more of a single or co-op play experience that just happens to have a lot of other players on the same map.
The work this week is therefore split into two parts: NPCs, and mobs. NPCs are primarily friendly and persistent characters in the game who don’t move around much, but are able to have a dialogue with the player. The work for NPCs will therefore focus mostly on the dialogue engine. Mobs on the other hand primarily interact with the player through combat, and so need to be able to move around the world on their own. I’ll outline some of the requirements:
NPCs will need to be able to:
- allow players to interact with them and trigger dialog to show up
- grab the right dialog from storage and display it
- allow players to make dialog choices that impact things in the game (quests? we’ll have to get to this much later)
- store the state of this dialog so that NPCs can continue conversations and generally behave smarter than your average RPG NPC dialog.
There will be some form of quest or item giving system, but that’s outside the scope of this week. I’ll just get the basics of the dialogue working, and have a think about how to interface that to quests and items for future work.
Mobs will need to be able to:
- receive the player’s position and react to it (aggro, etc.)
- receive other NPC’s positions to avoid bunching up
- be able to move around and broadcast movement information to players
- check for collisions with the map to avoid going into areas it shouldn’t be able to reach
There will be combat in this game, but again, it’s outside the scope of this week, so the mobs will mostly just mill around for now.
This is probably the most intimidating bit of code for me so far because it’s not something I’ve done before. While I’ve made an entity controller system for previous mini-MMOs, I’ve not had it deal with map-collision checking outside of GameMaker. So for this, I’ve given the entity system a total of 4 points spread across different tasks.
Twine as a Dialogue Editing Tool
My previous work with Tiled as a way to build the map, rather than having to put together my own tool for it, I feel was a good success. It’s been extremely easy to build and update the world map, and have it available in the game within seconds.
If anything, I think the game dialogue has many of the same properties — I want to be able to quickly and easily make changes, and have those changes live quickly, and I don’t want to have to build my own dialogue editing tools for it. So, I intend to use another external tool, and add scripts to push the dialog to the server, and have the client pull that dialog off the server when it needs it, avoiding having to update the client at all.
To that end, I intend to use Twine, an open-source interactive fiction building tool. Twine is meant to be for writing interactive fiction; it has good support for branching stories, and the interface is fairly nice to use other than the occasional bug.
More importantly, twine has scripting support, meaning it could conceivably be used to handle more complex NPC interactions, and quests. For example the below screenshot is from a previous project that picks a random side-quest from a list of available ones, making sure to filter out the ones that had already been completed.
I have some prior work in this area. The above screenshot is from a visual novel game for which I built a Twine/Harlowe parser written in GM that is able to parse the scripting at run-time, allowing a non-programmer to write the dialogue and interactions outside GameMaker. This prior work will help me put together the NPC dialogue system rapidly.
Following Sprint 2’s high number of work hours for a 9-point sprint, I’ve deliberately cut scope in this sprint as much as possible, leaving only 8 points. As long as my estimates are still accurate, this should hopefully keep my hours down and curtail burnout. I want to be reach a better balance with work. See you tomorrow!