Battlefight: Order, Freedom, and the Growing Shadow

About the Project

Battlefight is a competitive 3D top-down shooter built for the mobile-first generation. Set in a post-apocalyptic world where two brothers clash over the ruins of an empire, it combines high-speed, skill-based gameplay with a deep, community-driven narrative.

What inspired us?

We were inspired by the tactical depth of games like Brawl Stars and the gritty, choice-driven world-building of Diablo. We felt that many mobile shooters lacked a "soul"—they were either generic clones or aggressive pay-to-win traps. We wanted to build a game where every match matters, not just for your trophy count, but for the state of the game world itself.

How we built it

The project is powered by Godot 4.6, utilizing GDScript for high-performance gameplay logic.

  • The Core: We implemented a modular FighterBase system that handles complex state machines for abilities, damage calculation, and status effects.
  • Juicy Combat: We focused heavily on "Game Juice," implementing custom acceleration curves for movement and dynamic camera controllers to ensure every shot feels impactful.
  • Data-Driven UI: Using a custom UIFactory, we separated design tokens from logic, allowing for a professional, consistent look across the Lobby, Shop, and HUD.
  • The Backend: We've integrated a persistent saving system using encrypted ConfigFile storage, with a roadmap toward a full Supabase implementation for real-time multiplayer.

Challenges we faced

One of our biggest hurdles was balancing the Shadow System. We wanted the "Shadow" to be more than just lore—it needed to be a physical presence on the map. Mathematically, we had to ensure that the "Shadow Damage" scaled correctly so it was a threat but didn't feel unfair. We use a simple linear decay for health when inside a Shadow Zone:

$$HP_{new} = HP_{old} - (DPS \times \Delta t)$$

Where \( \Delta t \) is the frame delta. Balancing the movement friction \( \mu \) against the acceleration \( \alpha \) took weeks of playtesting to find the "Goldilocks zone" where the controls felt responsive but not slippery:

$$v_{t+1} = v_t + (\alpha \cdot \text{input} - \mu \cdot v_t) \Delta t$$

What we learned

Building Battlefight taught us that Execution is everything. A great idea is a start, but the difference between a "prototype" and a "product" lies in the polish—the UI transitions, the reload timing, and the responsiveness of the joystick. We also learned how to manage a complex codebase by following a strict CTO-approved architectural standard, moving away from hardcoded values toward a more scalable, data-driven approach.

The Future of Battlefight

We aren't just building a game; we're building a platform. Our vision includes "Live-Ops" where community victories literally push back the Shadow on the world map, changing the playable zones for everyone. Battlefight is a story of Order vs. Freedom, and the players are the ones who will write the final chapter.

Built With

Share this project:

Updates