Making a Game Boss but Forgetting Constraints


Back in December, I asked Carpoon’s composer, Mathew Kirkegaard for new music for a boss I was making, and I said it should only take a couple weeks. But in the end, the boss wasn't finished until the game's 1-year anniversary in August. How did that happen?

Why Make a Boss?

This was something I had wanted to do since the original Carpoon trailer back in 2020, but started in earnest after launch. This boss vehicle represents a deluxe version of what Carpoon could be. While this post is on making the monster truck, I’m going to shift gears later and talk about reaching goals in general. A head fake if you will.

When I first created the monster truck graphics, I didn’t know what it would be like other than chasing players.  Years later, its gameplay was inspired by a bug I encountered where a car that was supposed to leave one surfboard on the beach, left far too many, and blocked the player. I kept that idea in my backpocket for the boss. The monster truck could charge forward, rip up the ground in its wake, leaving piles of concrete that blocked the player and changed the environment.

To save time building it, I used the tiny little enemy car as a parent, and added a framework on top of that, similar to what I did with the SUV and gold car. This was not without its caveats, because I had to prevent a few things from happening. The main one was to override moving traditionally, and allow much faster movement. To do this, I added a speedMultiplier variable to the pre-existing parent class to adjust the speed without breaking everything. I avoided using the old code when needed by setting the speedMuliplier to zero.

Boundary wrapping and adding health was easier to adjust. 

 

Boss Movement

The boss still didn’t move as fast as I liked! I shifted some movement to a lerp between two points, with the distance between set from 0 to 100% and speed following an animation curve. And this worked well, except that the monster truck wasn’t steering to avoid walls while charging after the player, and driving right through the crusher hazard area. The boss was accidentally taking damage and sometimes losing all its health entirely with the player doing nothing. 

I spent far too long trying to fix this with solutions like curved paths, jumping over it, and finding points around the crusher in the centre. I should have taken a step back and created a simpler charging phase and that would have left more time to work on other aspects, or finish quicker.

I did handle some parts of the boss more efficiently, such as removing shocks from the truck to the wheels. These weren’t layering properly all the time in 2D, and after a couple attempts, I went to see what it looked like without them, and it was fine. But at one point, I did take a week to redraw all the tires knobby with multiple frames, instead of smooth to match the trailer.

 

The Marathon Metaphor

I want to sidetrack here to talk about another goal I had, and one that I had been chasing longer than finishing Carpoon (well, if you don’t consider the general dream of making a little big game I had on the backburner for years).

I had a goal to run a marathon once again in under 3 hours and 30 minutes.

I knew this was a goal I had been chasing since 2017 when I did the Kyoto Marathon and came close around 3:33. I went to check this year and found it had been 14 years since I last ran a marathon in under that time. How had that many years passed?

It’s easy to say that there’s always another chance, but I have learned with a few ones in different cities that isn’t always the case.

Leading up to this one, every run I did in training was about 2km longer than what I did in the past. I could keep up with weekend long runs.

I did one practice half-marathon a month prior to go through the motions of packing, waking up early and going to an event. I went too fast on this one and had swollen big toes. Later I found out from a custom running insole shop that I had to do more strength exercises. There are always new strength exercises. But from that shoe shop, we compared the new super shoes I was getting to the old ones and they literally felt half as light. The shop clerk and I looked up at each other in amazement, as if these shoes were magic.

Coming up to race day, I found this day around would be cooler than when I did the same marathon 15 years prior by about 6 degrees Celsius. Amazing chance, the prior temperature difficulty was removed.

In that 42km marathon, I recalled it getting tough around the 24km mark from the heat. This time, I felt pretty good until around 36km, which I would gladly take in any marathon. But I started losing track of the 3:30 pacers.

It turned out I had built up quite a buffer because I had started at the back of my section while the 3:30 pacers were at the front. In the beginning of the race, those pacers had a five minute headstart on me and I had to catch up. For the last few years, I had tried staying with pacers but would lose track of them in the end. This time, my pace was quicker at the start like what I used to, but only for the first 8km or so.

I started walking for a break around 38km and within seconds Yoshiko was there in the crowd, shouting “Tom, keep going! You’re almost there.” I’m always lucky to have wonderful support from my family during these endeavours.

I kept going and finished in about 3:27:40. Not quite the 3:26 I had done at this race 15 years ago, but paced more thoughtfully. The last marathon I did until 3:30 was the following year.

After finishing, I was in disbelief and stunned I had accomplished my goal that I had been close to recapturing many times. Thinking about it now for this almost brings tears to my eyes.

After celebrating (aka being tired for a few days), I wondered if I should have set my goal bigger to beat my personal best. What should I do next? Another goal I had been chasing for so long had now been reached, with developing a video game out of the way the year prior. Was there anything left to do?

The obvious answer would have been to set a new goal right away, but I lost some of my purpose and didn't want to tackle another mountain at that time. I quickly set a goal to run the Sun Run with my nephew so I at least had something.

 

Friends and Feedback!

Back to finishing the boss, it continued to be a slow process. I had set my sights on making other games at the same time. That divided my attention and made gaining momentum difficult

I was happy to get a hand in testing again from friends, and around the midpoint of development, I had some helpful insights. One of them was that they were too good for what the boss was and disposed of it quickly. I bumped up the health from 3 hits to 5 and thought what I could do for a second phase.

Carpoon features googly eyes on cars and at one point, I thought a boss similar to the ones in Zelda with tons of floating eyes all around it might work. A prototype I did wasn’t that fun, and I shifted to another idea: what if the boss lost its tires and was carried around by a pile of cars?  This might make a frantic finish and a fun twist on the boss fight.

When I had enough together, I had a big boost from 1-2 friends testing it each day, and I was lucky that I could quickly implement their feedback to try again with new people the next day. The boss came together quickest at this point, and was a great reminder to playtest earlier than I want to. Playtesting always reveals what some of the real issues are, versus what I think they are in my head.

Kelvin, for instance, had a crucial insight that the boss was only a stage hazard in the first phase. It wasn’t menacing enough because it only pushed players away and didn’t damage them. I quickly changed the boss to kill the player on jump flops and boundary charges.

One last boost was that I had put together a clip for a games showcase on The Crawl’s YouTube channel announcing the intended release date, and that helped solidify the effort to finish it.
 

Lessons:

Use constraints

After finishing the boss I realized I fell into the burrower trap and didn’t think about a realistic deadline to finish the boss. I kept working on improving issues, in this case mostly the boss avoiding the crusher while charging towards the player, without thinking of the bigger picture.

In the end, I left some of the instances where the boss went through the crusher. I could have taken a step back and thought of an alternative boss attack pattern, or kept off to the sides, forcing the player to the centre.

I didn’t have enough constraints for the boss and had too much of a “When it’s done” mentality.

Constraints I did have were:

  • The boss is a monster truck.
  • Has to start by breaking through the brickwall in Parkin’ Panic.
  • It has to have rotating tires. That is something cars in Carpoon don’t have, they are all baked in and don’t change their angle while steering.
  • Unspoken constraint: I wanted it to be fun and a decent challenge for my friends.

 

While I had target due dates, I never considered them as a restraint and took too long. When things finally started clicking and I saw that one year anniversary date coming, I thought this is ridiculous if I can’t make that. 

I do remember many bosses that I have played over the years but in the future I’ll make some detailed notes about them to better understand how they work, and make a clearer goal for all the phases and attacks of my boss first. At one point, there was a part with two monster trucks like Shredder at the end of TMNT2, but that was overwhelming.

And I don’t think I’ll promise something in a trailer again without having it fully in-game first, even if that’s what a lot of big companies do with fake or CG trailers. The boss did seem doable at the time, and likely would have been a lot simpler as a larger car.

It is also true that it is hard to “save” a game after launch. The boss with an anniversary sale only moved six copies. But it was to fulfill a promise I made to fans, and a good experience to learn how to make a game boss. 

Ultimately, not having a clear goal may have impacted me and my energy the most (had a lot of naps). I was reluctant to create new mountains to climb as goals. I have decided to finish developing another game with a friend, and in my spare time add in up to 3 more harpoons to Carpoon while pursuing a quick Carpoon Racing prototype. As for the marathon, I’ll chase 3:20 and then my PB. It’ll be a challenge while going after regular life goals, but it’ll be good for me.

I hope that you go for big goals and have a mountain or two to aim for.   

 



Looking for posts by a specific user? Check our contributors!