Channel Breachers
A co-op horror extraction game for 1 to 4 players. You and your crew are CRT television sets diving into Dead Channels, corrupted broadcast frequencies that have taken on a life of their own.
Context
Channel Breachers is a co-op horror extraction game for 1 to 4 players, built with a small team at itDoes! Interactive. I wanted REPO’s extraction loop combined with the TV portals from Little Nightmares 2, but scoped small enough for us to actually finish, since Roots: Homebound had gotten too big for the resources we had at the time. I ended up designing CRTures, CRT television people who are the portal themselves, and built the Dead Channels they breach into.
My Work
Solo-built the majority of Channel Breachers’ systems stack: replicated procedural level generation, the portal and channel-switching mechanics the game is built around, the full extraction loop and economy, and cross-platform Steam and Steam Deck support, all built and optimized to hold up in real-time, 4-player co-op multiplayer. It has been, honestly, much faster and simpler to design and develop than Roots.
Core Loop & Economy
- Built the lobby loop: buying gear through a rotary phone, grabbing items from the lobby door, equipping hats, and switching channels.
- Built the rotary phone’s dialing logic. You dial a 3-digit number, the phone checks it against a catalogue magazine actor (which can expand to hold more items over time), and if it’s valid, pulls the cost from a cash register actor backed by game state. Players keep their own tip money on their player instance.
- Built the extraction loop: a spawn point that tallies how much you’ve brought back against how much is left for the candle you’re trying to light, and an extraction point where hitting the partial quota converts your haul into a bag you carry back to spawn.
- Built the hub TV in the lobby, where interacting with buttons picks which level (Dead Channel) you drop into.
- Built the health and stamina systems.
The Channel System
This is the system I’m most proud of. The player is a TV, and the TV has channels, shown through a face widget (teeth, a talking mouth, small character-driven animations) that you cycle through with a hold-and-release selection wheel.
- Built multiple functional channels: a map channel showing teammate locations, an item channel that stores an item and spits it back out, a Steam profile picture channel, and the portal channel (below).
- Channels are equippable and unlockable.
- Built the rendering trick behind it: the channel widget gets pushed onto the TV panel’s material, and also pushed onto a rectangle light with blur applied, so it reads as an animated, colored TV glow.
- Also built the selection wheels for eye emotes and hand emotes, using the same wheel system.
The Portal System
The portal is one of the biggest mechanics in the game. Open your portal, and if a teammate opens theirs, you can throw an item into yours and it comes out the other side, across gaps, up stairs, over drops the level design is built around this logistics puzzle.
- Built a custom HLSL portal parallax shader that renders what the other side actually sees. If there’s no connected portal open, it just renders dark.
- Built the portal-open VFX that plays when a level is opened from the hub TV.
Level Generation (C++)
- The core level generator started as a solution ported over from Godot. I reworked it into Unreal C++, exposed and instigated from Blueprint, then reworked it again for replication and extended it well past the original.
- Built deterministic naming overrides for dungeon and vent level streaming to fix GUID mismatches that were causing rubber-banding.
- Built a PCG dressing pass architecture that splits server-spawned interactive actors from client-side cosmetic instanced meshes.
- Refactored item spawning around an ItemSpawnManager that runs a TActorIterator world scan with a positional sort, bound via delegate to OnPCGGraphGeneratedDelegate.
- Defined and built the generation pipeline order (Rooms, then Doors, then Vents, then Dressing, then Items), tracked with a PendingDressingCount.
- Generation covers locked vents and doors, and enemy roster/boss selection per run.
Enemies & AI
- Built a traversal system for the generated modules and Integrated a third-party pathfinding plugin (CPathfinding) so enemies can walk on walls and ceilings, not just floors.
World Actors & Interactables
- Built a clock actor that tracks match time and can be picked up and stored like any other item.
- Built a mirror using a 2D scene capture that moves with the player, so it accurately reflects what’s actually on their screen.
- Built an outlet actor that charges player stamina, including the HUD elements and Blueprint-driven animations, plus the underlying stamina and health regen logic.
- Built an Item Master framework defining how items can be interacted with: overlap, hit, thrown, enter portal, exit portal, and direct interact, backed by a data table of item values, rarities, and other properties.
Character Customization & Voice
- Built character customization for hand color.
- Built a mouth animation widget that animates in sync with the player’s mic input, for vicinity voice chat.
Platform, Multiplayer & Optimization
- Integrated Steamworks (via Steamcore Pro) for Steam features and multiplayer session handling, surfaced through the main menu.
- Developing for both Windows and Mac.
- Actively testing and optimizing for Steam Deck, including controller support.
UI & Menus
- Built the main menu, including settings and multiplayer session screens.
- Built HUD elements for health, stamina, and outlet-charging feedback.
Conclusion
The core gameplay loop is fully playable end to end: level generation (rooms, vents, doors, locked variants, items), enemy roster and boss selection, the shop loop through the rotary phone, hats, channel switching, health and stamina, and a complete main menu with settings and multiplayer session support. Steam integration is in, and I’m actively developing and optimizing for Windows, Mac, and Steam Deck. I’m continuing development toward an Epic MegaGrant submission.