So this month has been a bit interesting as I have found some time to work on Oversteer Racing, not as much as I’d have liked, but a bit.
Although I’ve found some time to work on Oversteer Racing I don’t have a lot to show for it. I’ve spent a fair bit of time refactoring some code to make it more useful. Specifically I’ve taken the code that I use to determine how long a player remains stationary in the pit box and made it more generic so that it can be used to work out the length of a stop for all cars. So, whilst I’ve done a fair bit of work I’ve actually got very little to show for it from the outside 😉
I do have some tasks left on pit stops before I move onto something else (it feels like I’ve been working on this code for the entire year so far) but I’m definitely making progress. The remaining tasks are to hook up the code for calculating a pit stop with the AI code for the rival cars. I then need to make sure the rival cars are correctly fuelled, damage is fixed and so on. At that point I think I can move on to something else… 🙂
Next month I plan to finish off the remaining pit stop tasks and then start looking at obstacle avoidance for rival cars.
I have to be honest, it’s been a really bad month for spending any time on Oversteer Racing. I had a huge piece of work (for another project) to finish at the end of May and that left me exhausted and the last thing I wanted to do was spend even more time coding. I’ve been surprised how much working at a consistently high pace for an extended period of time has taken out of me. As a result I’ve been spending some time doing other things and taking a bit of a break.
That said, I’m never a fan of stopping work on something completely as the overcoming inertia and restarting can be pretty difficult… so I have done some work on Oversteer Racing. The work I’ve been doing has still be focused on pit stops. Building on the work from last month (where the rival cars were passing through the pits without stopping), the rival cars now turn into their pit box and then move out into the pit lane again in order to leave the pits.
I’m also happy with the code that allows the rival cars decide whether they should be pitting or not. So there’s a good amount of groundwork done for the “race craft” of the rival cars.
I need to determine how long rival cars should stop for.
As suggested last month, it’s been another fairly quiet month in terms of work on Oversteer Racing. Part of the problem of being a 5-9 developer, or more often a 10pm to 12am developer, is that it’s very easy for other commitments to get in the way of the small window of time you have to work on a project. Also, even when you do have a bit of free time, your day job can leave you exhausted and not in the mood to do more coding late into the night.
That said, I did manage to do some work on pit stops for rival cars. I’ve got a working version of the code allowing the cars to decide when to stop based on fuel usage, tyre life, their team mates, damage and the progress of the race. I’ve also set up the paths for the AI cars to follow so that they can enter the pit lane, turn into the pit box and then exit the pits.
At the moment the rival cars don’t stop in their pit box and refuel, change tyre or replace damaged parts. This is the next piece of work that I need to do and I’m hoping that I’ll have a bit more time to work on this in June.
It’s been a really busy month and I’ve had to spend quite a lot of time on one of my other projects, my fantasy F1 competition. It’s always the same this time of year because of the start of the F1 season and the hard deadline that the start of the season represents. The game needs to launch a couple of weeks before the first race in order to give people the time to sign up. The hard part is picking the right cost for the drivers and teams so that there is a high number of possible teams but it’s not easy for players to pick teams with lots of good components. Once the game has launched I can’t change the value of the components so, if I get it wrong, then it can have a detrimental effect on the game for the entire season.
But, back to Oversteer Racing, what have I achieved in the last month?
Unfortunately the answer is not a lot…. but I did do something, no really. I found and fixed a bug that caused the sand/dust particle system to continue playing after a car had left the track but was now stationary. Unfortunately that’s all I’ve managed to do and that’s pretty disappointing but, when you’re one person working on a game then, when you have to stop to do something else, all progress stops.
I really hope to be back working on the AI code again. I need to get this finished off so I can move on to other things.
It’s been an interesting month. I’ve not made much progress on new features but once I started adding AI cars into the game it uncovered a few issues…. so I’ve been focusing on fixing those.
1, 2, 3 … er
As I’m now able to add AI cars to the game I thought I’d add some code to show the current race order. Unfortunately that’s where things went awry…
The main issue was that the lap counter would sometimes lose count, particularly for the player car. Obviously being able to count the number of laps a car has done is fundamental to circuit racing. The AI cars accurately keep track of the number of laps completed but the player car would value would drift and end up one to two laps off. Fortunately the issue turned out to be fairly simple and one that was only triggered when more than one car was on track. This was why I hadn’t spotted the issue when I’d written the lap counter code and it only came to light at this stage. Easily fixed though.
The second issue was that there was a bug in the code that works out the split times between the player car and the car ahead and the one behind (as appropriate). This worked reasonably well but there was an intermittent issue whereby the time for the split to the car behind would occasionally be calculated as over 20 seconds when the gap was actually much, much lower. This turned out to only happen when cars were on different laps. So, when the lead car crosses the start/finish line it’s a lap further on than the following car. At this point the code should look to the previous sector entry times to determine the split. Instead it was using the current sector of the lead car and looking back a lap to when the following car entered the same sector – which explains the discrepancy. By the time the split was next calculated the cars had often moved to another track section and the code got the comparison correct and showed the correct split time.
I’ll be back working on the AI code for rival cars.
It’s been a very busy January and there’s always a bunch of “admin” stuff to do. So a lot of my time has been spent doing my personal tax return, company accounts and company tax return etc. Talking about that in my latest dev blog is not going to be a rivetting read so I’ve decided to focus on my plans for the coming year.
Get the game into players’ hands
OK, so this may be optimistic given that I’m working on this in my spare time but I think it’s possible. Afterall, I’ve been deliberately vague about what the above means. Ideally I’d have the game out and available but I think it will also be a reasonable achievement to have reached the point where the game can be tested by a few people. If you’re interested in doing this then do let me know although, in all honesty, I’m unlikely to have a ‘testable’ version of the game before the Autumn.
More of the time, all of the time
There’s no escaping the fact that the major issue affecting how the game is developing is a lack of time on my part. I can’t see this changing significantly but what I can try and do is set aside more time more regularly. The beginning of the year has been filled with a number of admin tasks as I mentioned but I’ve also had some coding work to do on other projects… and sometimes I just need a break from coding 😉 However, I think the only way I can improve the situation is to set aside the same bit of time each week to work on the game. this has the benefit of having a clear time that I can work towards each week. Odd things are bound to crop up from time to time and mean that this isn’t always possible but I think it’s likely to pay off overall.
This past month I’ve made some improvements to how the car behaves when it’s receiving a tow and when it’s entering/leaving the gravel traps etc. This makes the car behaviour seem more natural but also provides important benefits to overtaking. The changes mean that, when pulling out from behind a car to pass, the advantage of the tow now decreases gradually and allows the overtaking car to carry the extra speed for a bit longer and this helps it make the pass.
I’ll be working on the AI code for the rival cars. At present they’ll lap the circuit reasonably well and can take alternative lines. However, what they don’t do is challenge for position and that’s my next task.
At the end of 2017 I thought it would be a good opportunity to take stock and review what I’ve achieved with Oversteer Racing over the last twelve months.
If you’ve been following along with my dev blogs then you’ll know that I began the year by working on pit stops. This included the UI allowing the player to refuel the car, change tyres and fix damage and also animating the pit crew as they run to/from the car.
I also did my first video dev blog on pit stops:
I’ve created a functional user interface that allows players to name the drivers and teams and also place themselves in the team of their choice. Although the UI works it’s far from pretty at this moment in time.
A lot of work this year has been on rival cars. The first step was to get the cars to drive the circuit and put in competitive lap times. I then worked on tracking the race position of the cars and calculating split times between the cars. I also worked on aerodynamic tows and this made it easier for cars to overtake each other. The final part of this work for 2017 was to work on code to allow rival cars to return to the circuit if they had left the track.
I also published a second dev blog:
What’s gone well?
I’ve been pleased with some of the developments I’ve added to the game during the year and, in particular, the work on rival cars and their AI. After all, it’s not a racing game without other cars to race against.
What’s not gone well?
The main issue has been a lack of time and that’s meant I’ve achieved far less than I’d hoped this year 🙁
My main focus will be to complete all the functionality of the game so that I have a working implementation of everything. I will then do a lot more play testing and refine the game further.
Mucky Creature is a company run by one person and sometimes it’s difficult to find the time to work on these projects. Unfortunately November has been one of those times. Lots of other things crop up that demand your attention and, when you do find a bit of time, you’re a bit too frazzled to be able to focus on code. So, it’ been pretty slow going this month…
That said, the work I have managed to do has been focussed on how AI cars recover after leaving the track. The AI does make mistakes and, most of the time, this just means they go a bit wide in a corner but sometimes they do end up off the track. Also, when going wheel to wheel with anther driver the “aggression” factor of the AI driver can mean that a more placid driver won’t turn in on a competitor and can then run out of room to make it through the corner. The other situation is where a car has been bumped by another car and has ended up off the track.
In simple situations the AI car can work out where it’s meant to be going even if this is not the waypoint it was originally aiming for. This process of skipping a missed waypoint is often enough to allow the car to recover and carry on racing.
However, in some extreme cases the AI car may end up in the gravel or in such a position that it can’t drive its way out. In these situations we have to “break the spell” somewhat. I could implement a solution that allows cars to execute a series of back and forth movements to return to the track. This would be a lot of work and it’s not something that I think is a wise use of my time at present as it doesn’t significantly improve the game. So, currently my solution is to allow the car time to recover on its own but, if that doesn’t happen, it is moved to the next waypoint, correctly rotated and released.
This seems like a reasonable compromise between the work needed to achieve something and the actual impact it has on the game. I’m hoping this is one of those situations where a shortcut is acceptable.
For this dev blog I’ve created a video showing the progress I’ve been making with the game. The transcript for the video follows.
Welcome to the second dev blog for Oversteer Racing. I had hoped to produce these video dev blogs more frequently but it’s been a busy year so this is my second… only nine months since the first.
The focus of this video is to show you some of the progress I’ve been making on the game. Specifically I’ll be talking about the work I’ve been doing on rival cars and AI. We now have more than one car on track and that’s a major step for a racing game. I’m driving the blue and white car and the AI is driving the red car. On track you’ll see some diamond markers. When playing the game these would be hidden but they’re used by the AI to determine where the track is and the best route. Currently this setup of track markers allows the AI car to follow different routes around the track, such as taking different lines through a corner, and the lap times are comparable to those I can achieve with the player car.
The other work I’ve been doing is on the situational awareness of the AI cars and also modelling the effect of an aerodynamic tow on cars following another closely. So, as you see me drive around the track you may notice a yellow line extending from the front of the blue and white car. This is not something that will be visible in the final game but demonstrates when the car is getting an aerodynamic advantage by following the car in front. The size of the advantage is proportional to the how closely the cars are to each other. The closer they are the more of a tow the following car gets and the faster it can go.
In the footage you can see me using the aerodynamic tow to catch up with the car in front and then pass it on the inside of the first corner. When the player car is alongside the red car you may be able to see a yellow line extend from the side of the red car. This is used for me for debugging and shows that the red/AI car is aware that another car is alongside and it adjusts the line it takes through the corner to allow the passing car room. In the actual game I plan to link this to an aggression factor so some drivers are more likely to turn in on passing cars and defend strongly than others.
So, I hope that’s given you an insight to the work I’ve been doing and how Oversteer Racing is shaping up.