When starting this section, I immediately had two other interesting ideas and I couldn’t decide which of the 3 rockets to implement. In the end, I decided to start with Bram’s rocket, and then come back after the course to make the others as well!
Feature List for anyone curious (there’s a lot here because I converted this from my objectives list):
Rockets:
- 3 rocket types, each with their own unique mechanics and 5-level campaign
- “Project” Rocket – almost exactly like Bram’s course rocket
- BouncyBonce Rocket:
- Activate thruster with button press; then, thruster cannot be deactivated
- Rocket will bounce off any surface it comes into contact with (this is achieved just by using a physics material in the CharacterBody3D)
- Oval-prism collision shape ensures it is nearly impossible for the rocket to get stuck. This is made using a scaled cylinder, exporting to Blender so its transforms can be applied, and then reimporting it for use in generating a collision sibling.
- Limited fuel – running out of fuel causes explosion with custom particle debris that collides with obstacles
- You can toggle infinite fuel to play around with the bouncy physics, and you can even change this at will while the rocket is running if you like, but levels completed this way won’t be rewarded…
- Pressing R to reset the rocket will also reset this penalty, so playing around with infinite fuel here and there won’t ruin your campaign run if you reset and complete the level legitimately.
- Collision with target pad disengages thruster and achieves victory. Some pads are oriented like bullseye targets instead of landing pads.
- Team Rocket:
- 4 buttons control twin double-thrusters (that’s not a typo); hold to engage either thruster forwards or backwards respectively. Each thruster provides thrust and turning force simultaneously, so linear thrust is achieved by using both thrusters together. As a team.
- Custom collision shape made in the same was as that for the BouncyBonce rocket, but a more complex shape
- Collision with target pad causes target pad and launch pad to switch places; collision with switched target pad achieves victory. Rocket orientation is not checked, but player must have enough control to take off again safely!
- Upon failure, all rockets explode with custom particle debris that collides with obstacles and bounces around
Obstacle Types:
- Static Obstacle
- Moving Obstacles:
- Moves back and forth between two points.
- Time to reach each point is adjustable, and time to each point is a separate value, allowing for asymmetrical movement cycles
- Can use any of 5 different interpolation styles
- Moving Obstacle Variants:
- Erratic Obstacle: applies an export-defined random 2D offset to its destination target each time it moves, causing unpredictable movement patterns within a controlled space
- Ghost Obstacle: alpha value is dependent on player position. Obstacle gets more translucent the further the player gets from it, and becomes completely invisible beyond a predetermined distance.
Difficulty System:
- Feedback from BallChicken was that difficulty management was a key missing feature, so all 3 campaigns have been designed with an integrated difficulty system
- Set difficulty on any level to Easy, Normal, or Hard with + and - keys (numline or numpad) freely before any launch. It can also be mixed-and-matched between levels – you aren’t locked into a given difficulty level for the whole campaign.
- Difficulty setting is persistent between levels, and even between campaigns, so you only have to change it as often as you want to
- Difficulty affects obstacle layout, obstacle properties (via swapping out duplicates), and BouncyBonce fuel tank
- When changing difficulty, adjusted setting appears as an animated label above the rocket. Additionally, obstacles that are new to the updated difficulty will emit sparkles to highlight the changes (ghost obstacles omitted).
- Obstacles disabled by changing difficulty settings still exist in the background and continue moving if applicable. This prevents the player from using difficulty cycling to manipulate obstacle movement cycles.
- Pressing R instantly resets the rocket for quick retries, but does not reset the scene. This prevents obstacle movement cycles from becoming stale after repeated attempts.
- Press H to draw the expected path through the level – very helpful for when you’re not sure if you have the right approach!
Main Menu:
- Diagetic Main Menu with clickable rockets, using raycast camera from Barbarian Blaster
- Project Rocket unlocked by default; BouncyBonce and Team Rocket unlocked by completing previous campaign
- Clicking a locked rocket allows player to unlock the campaign early if they choose
- Launching a campaign shows a campaign stinger, underneath which the level scene loads for a seamless transition. Similarly, “Campaign Unlocked” or “Campaign Complete” stinger upon campaign completion returns player to main menu.
- Quit button is also a clickable rocket XD
- When a campaign is complete, a medal is added to the main menu to show the greatest common difficulty that the whole campaign was completed on. This is saved and updated per-level, so if you mix-and-match difficulties, you don’t have to worry that you’ll lose your Hard completion of level 2 just because you completed level 1 on Normal.
- Quantity and quality of earned medals also results in a rank, displayed in the bottom left. Think you can climb to the top?
Other:
- Each campaign begins with an empty training area with dynamic instructions. Victory here simply resets the rocket so the player can practice at will. Advance by pressing P instead.
- Looping title music, plus a batch of 5 tracks for the levels. These are batch-randomized to minimize the chance of getting the same song twice.
Known Issues:
- Main Menu lighting causes rockets to appear washed out. This is due to giving the sky an energy multiplier of 2 so that the medals wouldn’t appear extremely dark. I don’t know enough about lighting to fix this problem properly, and this compromise was the best I could come up with.
- The rocket explosion shreds only rotate around one axis. This is an engine limitation that will apparently be fixed “someday” =)
- The BouncyBonce fuel interface covers up the “press P to exit training” label. I didn’t see a better place for the label and the interface was much more important, so I decided to just leave well enough alone.
- GPU particle systems are unusably slow in WebGL. This is an engine limitation, so this project has been released only for Windows/Mac/Linux. Because I only have access to a Windows machine, the Mac and Linux builds are untested.
Enjoy, and please let me know what catches your attention - good, bad, or just plain odd =)