Crunch week 7: Achievements, Battle Pass and Chance.js

I finally started moving items into gold territory this week, though at a slower pace than I had hoped. I have had those pesky Property items on my to-do list for a month, yet other things keep getting in the way. Nevertheless, I managed to debug the mail system in Reception all the way, so that it now updates in real time from the server listener, and got the Livery and Settings pages to gold as well with a few last-minute tweaks.

The major addition here was Milestones, which is what I call achievements in Mr Football, but first on Monday I spent a day rethinking the Drills mechanic of daily rewards. My original concept had hewn fairly closely to the Star Trek Timelines Daily Missions template around which many of the game features were based, but it has been quite a few years since STT was released. Its author Beamable (nee Disruptor Beam), along with many other mobile game developers, have since evolved towards the Battle Pass system and I think it’s suitable for Mr Football as well.

This is basically an in-game wireframe with no functionality as yet. You can see the dual-track design that is the hallmark of most Battle Pass systems, with the free track at the top and the paid track at the bottom. The naming of this feature is still up in the air, but I think I will settle on some version of Membership with a Concourse Level and Members Reserve respectively. For this genre of game, I think it’s always better to seat your nomenclature within the lore of the sport you are simulating. As to prices and rewards for the paid track, that will be determined during beta.

Membership and Milestones will both give a steady stream of rewards, with the latter particularly important during the onboarding process to keep bolstering player lists and building up each coach’s best 22 to be able to compete at higher levels. It was back in week 3 that I started serious work on achievement design, and this week was the time to implement it. Adding in achievements to the back end server code means touching most game systems, as that is kind of the point of them: to reward investigating every play mode to its fullest.

Most achievement pages in mobile games are interactive, in the sense that you have to visit them to collect the rewards. I have always thought that to be needless busywork, navigating the UI rather than playing the game, so I am going to award them automatically and send notifications through temporary “toast” pop-ups. The Milestones scene in Phaser is thus not a treasure map but more of an honours board, letting coaches know how close they are to the next tier of rewards without forcing them to press yet more buttons to collect them. Perhaps I am making the wrong decision to withhold the sugar hit of collecting shiny trinkets; I look forward to user feedback on this point, as it is not a standard way to do things in this kind of title.

Thanks to a suggestion from the always-helpful @Kal_Torak on the Phaser Discord, I moved to the Chance.js library to provide random number generation. It is easy to install on both Cloud Functions server and Phaser client as a dependency, and the syntax is simple as pie including d6 and coinflip methods. Much smoother than the ugly and unwieldy Mersenne Twister function I was embedding before.

I am at the point where I am dotting Is and crossing Ts to finish up a lot of scenes on which I have spent a lot of time over many years, like the Livery scene above. There has also been a lot of iteration on the Workbox PWA system, that’s almost ready, plus some work on cleaning up Firebase event listener leaks. Finally, I also managed to stomp on a few annoying Phaser bugs that had been sitting there for weeks.

I feel like I am a little bit behind on schedule, but not any more than I was expecting after setting such an ambitious deadline at the start of crunch. I promise I am going to get to that Property scene at long last in week 8! I just need to get the main game loop operational and the onboarding process free of bugs, then the beta can begin and I can start getting that all-important advice (and hopefully encouragement!) from early adopters.