
Booze & Brains
About
Booze & Brains is a top-down vehicle game where the player must run over objects, zombies, and other obstacles to score points and complete the game. Developed in just four days during a game jam, this project was built by a team of four, with me handling the game programming.
Car Mechanics
For the car controls, I focused on creating a responsive and satisfying driving experience. The movement system involved:
-
Rigidbody-based physics to simulate realistic acceleration and turning.
-
Torque application for smooth and dynamic movement.
-
Friction adjustments to balance drifting and handling.
Tuning the car's handling was a key challenge, as I had to find the right balance between arcade-style fun and a sense of weight.
Object Destruction
To enhance the chaos and excitement, I implemented a destruction system for objects and enemies:
-
Zombies & Breakable Objects → Used colliders and health components, where objects would break upon impact based on velocity and mass.
-
Particle Effects & Sound Design → Added explosions, debris, and impact sounds to make destruction more satisfying.
-
Score System → Players were rewarded with points based on what they destroyed, encouraging more aggressive driving.
​
​

Car Movement Mechanics in Booze & Brains
For car movement, I designed a script that controlled the vehicle's acceleration, steering, and drifting. The key variables included:
-
Acceleration Factor – Determines how fast the car gains speed.
-
Turn Factor – Controls the sharpness of turns.
-
Acceleration Input – Captures player input for movement.
-
Rotation Angle – Keeps track of the car’s current rotation.
Car Engine Function
To create a realistic engine system, I implemented a function called CarEngine(). Inside this function, I introduced a local variable:
Vector2 engineForceVector = transform.up * accelerationInput * accelerationFactor; rb2d.AddForce(engineForceVector);
This applied force in the upward direction of the car, ensuring smooth acceleration.
​
Steering Function
For steering, I created another function where:
rotationAngle -= steeringInput * turnFactor; rb2d.MoveRotation(rotationAngle);
This allowed the car to turn dynamically based on player input.
Drifting Mechanics
To introduce realistic drifting and skidding, I added a drift factor variable and a function to modify velocity. Inside this function, I used:
Vector2 forwardVelocity = transform.up * Vector2.Dot(rb2d.velocity, transform.up); Vector2 rightVelocity = transform.right * Vector2.Dot(rb2d.velocity, transform.right); rb2d.velocity = forwardVelocity + rightVelocity * driftFactor;
-
A higher drift factor increased skidding.
-
The right velocity was reduced, making turns feel more fluid.
To visualize skid marks, I added a Trail Renderer on the car’s wheels, enhancing the feedback when drifting.

-
For object destruction, I implemented a system where:
-
Objects had different point values – Some were worth more than others.
-
Certain objects required a minimum speed to break – This added a challenge to the destruction mechanics.
-
Speed-Based Destruction Mechanic
-
If the player’s car reached a specific speed, it would:
-
Change color to cyan and glow, visually indicating that the car was powerful enough to destroy high-resistance objects.
-
Gain the ability to break certain objects on impact.
-
Implementation Steps
-
Checking Speed on Collision
-
On OnTriggerEnter2D, the object would access the car’s controller script to check the current speed.
-
Visual Feedback for Speed Threshold
-
When the car reached the required speed, I modified its sprite color and added a glow effect.
-
Scoring System
-
Points were awarded based on the object’s value.
-
Score Manager handled adding and displaying the points.
This game was a great learning experience in physics-based mechanics, destruction systems, and arcade-style vehicle handling. Looking back, I see areas where I could refine the mechanics, but it remains a fun and chaotic game jam project that I'm proud of.
Gameplay:

