| Devlog #1 | Devlog #2 | Devlog #3 | Devlog #4 | Devlog #5 | Devlog #6 | Devlog #7 | Devlog #8 |
On a personal note: I've been dealing with a lot of personal shit for the past few weeks. Up until last week, since the last devlog I hadn't really gotten anything substantial done. I started dipping back into my routine finally and I've been steadily cranking on the game since.
Multiplayer is now fully implemented with multiple modes, I've cleaned up and modified LATC a little bit, and even reworked the main menu! In this devlog I'll go through the implementation details of multiplayer, talk about the Steam stats + what's next for the upcoming event, and more!
Grab an early pre-alpha preview build of Tristan Cole's Pro Driver here on itch.io! There will be a multiplayer build live soon so you can stunt around LATC with friends!
Follow me on Twitter for more regular updates on #TCPDgame and all my other projects!
The first multiplayer build of #TCPDgame is almost ready!— Tristan Cole's Pro Driver 🚗🤸 Wishlist on Steam! (@elocnat) August 7, 2021
Vehicle is mostly replicated (few particles & sounds missing), fixed hud issues, scoreboard works, & Steam auth works w/ real app id; still working on #itchio auth!#screenshotsaturday #indiegame #gamedev #indiedev #UE4 pic.twitter.com/IzsM3rkVpG
In the last devlog I mentioned that I wanted to have a single multiplayer mode (free roam) that was joinable/hostable from the main menu. Well this devlog is a few weeks late and I lied: TCPD now has both Free Ride & Trick Attack multiplayer online modes! There’s a server browser where you can search hosted lobbies and you can host your own game with up to 8 players in LATC - there’s even a basic scoreboard with ping! The backend is using Epic Online Services and login works via Steam & Epic logins; I’m still working on itch.io authentication. I’ll dive into more detail on both the vehicle replication and EOS implementation.
I’ve never built a (working) online game before, so I was unfamiliar with any kind of online subsystem. EOS appealed to me because it’s free, has a bunch of services, and cross-platform support. The only problem is that it’s not integrated directly into UE4 - that’s where the EOS Online Subsystem (and Blueprints addon) come in. Currently itch.io authentication isn’t working for me & the documentation is C++ focused mostly but other than that, especially with the help of the sample projects, it’s been really simple to get the basics up and running in my project.
The first step is obviously getting users to login. In the EOS developer portal I setup a new game, gave it the necessary security roles for hosting P2P games, and setup the project’s config file with the secret values. There’s an ‘autologin’ function that I call on startup in the game instance blueprint. If this fails, users get a pop up error message when trying to access the multiplayer menu (it tries to login again first). In the editor, you can use the Developer Authentication Tool to login multiple Epic accounts for testing. I had to register another Epic account for testing purposes and then, because Epic accounts cannot be used without getting your app approved (which isn’t publicly available right now) or launching through the Epic Games Store, add that account to my organization in the developer portal (using a limited permissions role). Configuring Steam login was straightforward in the docs although it can only be tested by launching the packaged game or right clicking and selecting ‘launch game’ on the project file. Authentication with itch.io isn’t currently working for me (and can only be tested through the itch app) so I’m working with the plugin’s support channel to figure out why.
Subsystem login in the game instance BP
Setting up a session - not pretty but it works!
Next step is getting sessions setup. All this logic is done in the game mode blueprint. Settings for the match are stored in & read from the game instance when the map is loaded and the session is created. The docs mention this, but there is one important note when creating a session: you must specify at least one setting while creating the session, even an unused one, because players cannot find a session if it doesn’t have at least one setting. Another thing to note is that there’s currently no implementation for online ‘beacons’ in blueprints, so player ping to other player’s sessions (while searching) isn’t working right now to my knowledge; I’ll probably have to write real C++ code for that. After the session is created, the local/current players need to be registered so that EOS knows how many active players to advertise when searching for sessions. You also need to register all incoming players from the internet (OnPostLogin works for this) and then deregister anybody who leaves the server (as well as destroy the session when the host leaves). I haven’t setup reconnecting to sessions yet, but that’s on the TODO list in case of any crashes or network interruptions.
Before, when I was testing replication, I used SmoothSync for replicating the vehicle’s position. That worked, but only replicated the movement; everything else was kind of broken. I figured that I’d start rewriting code, moving all controls to the player controller, and replicating everything the “right way” -- but that quickly started to become a daunting task. So instead, I just re-enabled smooth sync and did some more testing; turns out that it works pretty well! Collision even works fine with the big collision sphere I have around the vehicle for hitting objects away.
Once I determined that SmoothSync was good enough for a first pass, I started fixing up the vehicle and player controller references. There was a lot of code (especially regarding UI & tricks registering) where I was referencing the usual ‘player controller 0’ (if called on a listen server this is the host’s controller) which ended up causing a lot of bugs. After properly fixing up those references, next up was making sure all the details of the vehicle were replicated. It would be super boring to not see your fellow drivers doing crazy tricks beside you!
Some of the basic vehicle server side/multicast calls
Testing replication of tricks and particles
Replicating the character and body part animations was surprisingly simple. All I needed to do was send the server an event with a value from the owning client depending on the trick being performed and that would either open the body part or update the animation blueprint to use the correct character animation. After sending the server the variable, you tell the server to multicast that variable out to all clients so that everybody can see you’re doing a trick. Initially I had all of these set as “reliable”, but I learned that was a big nono. The thing is, the client will always see the tricks they’re performing (I think), and even though tricks are a core gameplay element, other players seeing them isn’t absolutely required for the most part. If every event was marked as reliable and a client was lagging really badly/had very poor performance, it’s very possible that it will cause even more issues sending too many requests for no real reason. After getting the tricks working I focused on all the other little things like wheels turning and particle/sound effects. Turning the wheels was simple a matter of updating the steering input variable server side which is used in the lerp function to animate them. The boost and grind particles/sounds were done the same way, just set them to activate on the server and multicast to clients.
The good news is not everything had to be rewritten - there were a few functions I broke out/changed, but otherwise just having the physics client side and sending variables to the server to make changes was really easy. There are definitely better ways I could’ve tackled replicating everything I’m sure, but SmoothSync made the whole process so easy that I can’t imagine bothering to refactor everything in the vehicle code for multiplayer. My goal is not a super realistic and detailed simulation - I just want players to drive around racing and tricking in their vehicles while occasionally crashing into each other. I’ve yet to test with another player and higher pings, but I’m excited to see how it performs in real world testing.
That covers the basics for getting everything setup & replicated. It was a lot easier than I was expecting, granted I haven’t implemented anything like chat, leaderboards, lobbies/parties, etc. but those are not crucial to the core implementation I wanted to get finished. The Trick Attack mode is already setup to become a ‘PvP cycle’ style where the game modes are constantly rotating. The ‘free ride’ mode can be hosted separately as well to just drive around and have fun; eventually I’ll add password protected sessions so players can host private games too.
I finally got my Steam page setup! You can wishlist TCPD on Steam now. Everything I’ve read says that you should get your page setup as early as possible, so I decided to just go ahead and create all the basic assets myself to get the page launched and start gathering wishlists. I launched the page on July 6th and then announced it on Twitter and my YouTube page the next day. It got a few retweets and a fair amount of likes (maybe 50-60); that seemed to net me ~17 wishlists. Just for reference, that tweet currently has 13.6k impressions, 54 retweets (including mine), 101 likes, 1458 media views, and 350 engagements (22 are link clicks).
It’s been a month and a week since the page launch, and I’m sitting at 207 wishlists (+ 7 deletions) and 18 followers on Steam. While the wishlists are starting to pickup a little, I would be lying if I said I wasn’t disappointed in the numbers. I wasn’t expecting 1000 or anything like that, but I was hoping for 50-100 a week or close to it. Maybe that was unrealistic considering the state of the game, but considering everything I read pretty much dooms anybody who isn’t getting high double digits of wishlists a day and ending up with at least 10k at launch, it’s not exactly a great sign. Double down on the fact that it’s an early access game and it’s really not looking good for the financials of the game, kind of confirming my early suspicions about this being a niche title that probably won’t sell more than a couple hundred copies (if that) at this rate.
Wishlists since page launch - Peaked 8/3 at 25
Steam & Epic accounts playing together!
On the other hand, I’m not going to act like there aren’t potentially glaring issues that I need to sort out about the game and it’s marketing. Number one, I’m not an artist and I’m not a marketing person; there’s no fancy Steam art and logo, I don’t think the game’s description is very appealing/describes the game’s purpose well enough, the Steam screenshots are kind of bland, and I know for a fact the trailer is severely lacking. I debated whether launching the Steam page at all because of these reasons, but I figured that having it available for people to wishlist was more important than getting everything perfect. I also just straight up don’t have budget to outsource that work right now and my thought was that it can always be improved later. I’m just hoping now that I haven’t shot myself in the foot by releasing too early with mostly ‘placeholder’ content.
Another problem is that I just don’t do much advertising in general. I post on Twitter a couple times a week and occasionally on Reddit (I’ve tried Imgur but apparently they hate my game), but that’s it besides my YouTube channel (which probably gets an average of ~30 views per video at best anyways). This is my own fault, so I’m not blaming anybody here but myself. I don’t want to be a YouTuber or streamer, I hate using social media in general, and here’s the worst sin of all: I don’t want to setup and run a Discord channel. I’m practically begging to fail at this point! I don’t like Discord personally (it’s a fine app and I recognize it’s great for gaming/gamedev) so I try to use it as little as possible. I have absolutely zero interest in running, participating in, or moderating a public chat community like that and am not willing to work with anybody unpaid/without a hired community manager to run it for me which isn’t in the cards right now.
Steam Next Fest starts on October 1st and runs through the 7th. I’ve signed up to participate and plan to have a demo ready with at least a working tutorial, singleplayer free roam, and a couple multiplayer modes available. I’ll be crunching to get a lot of quality of life fixes done like better UI/menus, smoothing out LATC, ensuring vehicle resets correctly, etc. along with trying to make the game feel a little more ‘appealing’ overall. My hope is to get the game in front of a bunch of new people and gather all the feedback (and wishlists!) I can via the Steam forums to improve it before launch. I’ve never participated in any kind of Steam event, so I’m not sure exactly what to expect, but I’m going to try and improve the game as much as I can before then in order to take advantage of the event as best I can.
Let’s update the roadmap for TCPD which I introduced in a previous devlog:
This devlog was a little bit late, but I’m going to focus on getting the game as ready as possible for Steam’s Next Fest and probably wait until that’s over before I end up giving another update. I’ll launch a new build on itch.io when the event starts too so that way anybody who doesn’t want to use Steam for whatever reason can participate and hopefully find active lobbies if they want to try multiplayer. I’ve got a long list of things to focus on for different areas, but the most important things in my mind are going to be a decent (skippable) tutorial, working menus/UI that properly explain game modes/objectives/controls/tricks available/etc., and molding LATC into a smaller but more detailed/polished map.
On a final note, I posted a thread on Reddit recently in r/DestroyMyGame asking for feedback, and got a lot of good feedback specifically about the game’s art (which is definitely the worst part of the game right now). But apart from feedback on the game itself, one of the funniest posts was “Who the fuck is Tristan Cole, and why is their name in the title?”. After I answered they elaborated a little bit saying they didn’t immediately get the THPS reference and even thought the name could even potentially come off as pretentious. I don’t necessarily agree with the pretentious part though I can definitely see missing the reference, but both points have been on my mind. Could the game’s current name be one reason for the poor performance or reception to marketing, or is it just a red herring in the mix with all the valid points I already outlined?
Thanks for reading and following the development of TCPD!
What future game modes do you want to see? Should I change the name of the game? Let me know what you think!
Wishlist TCPD on Steam and tell all your friends to come try the demo in October during Steam Next Fest!
Follow me on Twitter for the latest news on Tristan Cole’s Pro Driver!