June 29, 2026
7 min read
Obsidian's 'Karma Police': The Art of RPG Build Balancing

Key Takeaways
- •The Danger of Walled Choices and the "Bad Build" Trap
- •Implementing Reactivity in Mobile Game Development
- •Decoupled Reactivity: Engineering the Skill Check System
Obsidian's 'Karma Police': The Art of RPG Build Balancing
In late June 2026, legendary Obsidian Entertainment design director Josh Sawyer sat down on the Human Can Opener podcast to discuss a topic near and dear to every RPG developer's heart: game balance. During the conversation, Sawyer dropped a fascinating term for an internal studio practice they use at Obsidian: the "Karma Police."
This isn't a reference to the classic Radiohead song, but rather a dedicated group of designers whose sole responsibility is to go through the game's reactivity matrices, dialogues, and world interactions to ensure that every single skill in the game has enough "cool stuff" to do. As Sawyer put it, the studio’s design philosophy is simple: "We're not gonna leave you out to dry."
For studios offering game design and development services, this philosophy is a masterclass in player agency. Let’s explore the engineering and design architecture behind build diversity, and how you can implement a performance-critical, zero-allocation skill reactivity system in your own games.
The Danger of Walled Choices and the "Bad Build" Trap
Every RPG player knows the disappointment of spending hours tailoring a highly specific character build—say, a smooth-talking diplomat or a tech-savvy engineer—only to find that 90% of the game's obstacles must be solved with raw combat. When a game offers choices it fails to support, it breaks the implicit contract between the player and the developer.
Unbalanced skill systems lead to "optimized paths" where players learn to ignore secondary or flavor skills. At Obsidian, the "Karma Police" prevent this by auditing content. If a designer adds a lockpicking check, they must make sure there’s a corresponding hacking terminal, speech check, or physical path nearby. Every playstyle must feel like a viable, rewarding way to experience the world.
Implementing Reactivity in Mobile Game Development
When clients outsource mobile game development or look to hire mobile game developer teams, they expect games that feel as deep and responsive as desktop RPGs, but running under strict hardware limitations. Mobile games face constraints in screen space and processing power. We cannot afford heavy, monolithic systems that chew up CPU cycles and trigger frequent garbage collection.
As the best game designer in india, our approach to mobile systems is to ensure that reactivity is baked into the architecture from day one. In mobile game design, this means designing compact dialogue trees and reactive UI elements that adapt dynamically without cluttering the screen or dropping frames. This is where high-quality game performance optimization meets elegant architectural design.
Decoupled Reactivity: Engineering the Skill Check System
To build a system that supports the "Karma Police" philosophy, we must avoid tight coupling. A common anti-pattern in Unity C# game programming and Unreal Engine C++ development is hardcoding checks directly into the conversation managers or trigger systems. This creates a coupled mess that is impossible to maintain and scale.
Instead, we can design a decoupled architecture using the Strategy Pattern to isolate check logic and the Observer Pattern to broadcast evaluations without allocating garbage.
Below, we compare a standard, allocation-heavy implementation against a high-performance, decoupled alternative.
Standard Implementation (High Coupling & GC Allocations)
In a standard codebase, developers often write string-based checks directly in monolithic managers:
Performance Issues of the Coupled Approach
- String Allocation: Methods like `StartsWith` and string lookups allocate temporary memory on the heap, triggering Garbage Collection (GC) spikes.
- Tight Coupling: The UI manager must know about every skill name and threshold, breaking S.O.L.I.D. principles.
- Linear Time Complexity: The checks scale as O(N) with the number of skills.
Performance-Tuned Implementation (Strategy & Observer Patterns)
To achieve zero runtime heap allocations and a clean, decoupled design, we utilize strongly-typed enums, cached interface strategies, and struct-based return types.
Architectural Complexity Analysis
Let's analyze the algorithmic efficiency of the two approaches:
| Metric | Coupled Implementation | Performance-Tuned Implementation |
|---|---|---|
| Time Complexity (Lookup) | O(N) linear scan of string conditions | O(1) constant time dictionary hash lookup |
| Space Complexity (Heap) | O(N) allocations due to temp string manipulation | O(1) auxiliary space (Zero GC heap allocations) |
By converting our reactivity system to use cached strategies and struct value types, we completely eliminate GC overhead at runtime, which is critical for maintaining high frame rates in mobile game memory profiling.
Error-Handling & Testing Strategy
A professional codebase requires strict validation. The strategy pattern makes unit testing straightforward. Since our strategies are decoupled, we can easily test them in isolation without loading the entire Unity Engine:
By verifying our design strategies via unit tests and keeping dependencies separate, we ensure long-term maintainability for the project.
Embracing the 'Karma Police' in Your Next Game
Design philosophies like Obsidian's "Karma Police" are what separate good RPGs from legendary ones. But to make this work, your codebase must support your design goals. By using decoupled strategies, you give your designers the freedom to add reactivity anywhere in the game world without worrying about breaking the code or destroying mobile performance.
If you are looking to build a high-performance mobile game or need custom 3d game development services that prioritize visual polish and premium design, get in touch today. Let’s make something incredible.