GAMMA ☢ TEAM
| Summary | Co-op salvage runs in the Chernobyl Exclusion Zone. Loot, survive the mutants, make the quota, bring your dead home |
|---|---|
| Description |
The game isn't finished yet, this is just the foundation. It will get much better as more content is added, and I’ll take into account everything you don’t like, I look forward to your suggestions, let's make this game better together [Image] Next Updates: • Firstperson mode (done) • For newcomers to loot-gathering games, add explanatory hints on the first day (done) • New everyday shop system • Separate the jumpsuit into its components: different boots, different backpacks (done) • Casino in bar ( roulette - done, jackpot - done, spin wheel, 21 ) • Climbing over fences (done) • Searching the lockers (done) • Better walk control ( done ) • Make the mini-map more user-friendly (done) • New locations • New monsters ( The concepts have already been devised ) • Make dungeon generation more branching than it currently is • Fully joystics / steam deck support • So that almost all the loot can be interacted with • A bestiary of monsters that will gradually unlock, allowing you to study their behavior (done) • Perfect the monster spawn system • Alt gun slot • Walkie-Talkie + alt slot The debt is almost paid. Just One More Run into the Zone ⚠️ Beta. Gamma Team is still in development, so expect bugs. This is my first project, made for a game jam. Thanks for playing, and feedback is very welcome! Gamma Team is a cyclical co-op salvage crew working the Chernobyl Exclusion Zone for a company that only cares about one number: the quota. Every Underground is randomly generated, so no two runs are the same. The Monsters aren't just hit points: each one has its own behavior, and you'll have to learn how to hide from it, trick it or run. And when the day is over, grab the Accordion and the Guitar, because every good run ends with a song in the back of the truck. Things out here listen. Some of them hunt by sound. One of them has learned to speak in your friends' voices. Sell your haul at the bar, meet the quota, and do it all again. For any ideas or bugs you can tell in: https://discord.gg/eGe7Av4A5M [Image] Tech I am proud of, and why this game took so long Baked light and shadows [Image] The engine handles dynamic light well, but my map is half a kilometre of terrain with a forest and dozens of lamps, and the sun and lamps never move. Keeping them dynamic would mean paying every frame for something that never changes. So all static light is baked into a map over the terrain: sun visibility separately, lamp light separately, with shadows cast into it by real tree triangles with leaf alpha, by the terrain and by static models. Live shadows stay where they actually matter: on people and monsters. I already had the germ of baked shadows in another project (which is still under development), but in this project, i fully realized it. Fog of the unseen [Image] Everything the player cannot see because of walls is covered by dark fog. It is not a view cone and not a post effect: sight-blocking geometry is sliced by a horizontal plane at eye height into a flat plan of segments, and each surface checks for itself whether the line from the eyes to it is blocked. The eye is a disc rather than a point, so a wall corner gets a real soft penumbra instead of a staircase of rays. The first version did this per pixel and ate half the frame indoors, so visibility is now solved into a grid of five centimetre cells once per eye movement, and a pixel costs a single lookup. A custom navigation grid [Image] The built-in navmesh builds at runtime and would be plenty for a normal game. Three things got in my way, all specific to my bestiary: one agent size per scene, while my creatures range from half a metre to a four metre span and one of them is supposed to never fit through a door; a path query on the order of a millisecond with no budget, with a dozen creatures on the map; and the questions I want to ask, which it was not built for: where do I stand so the player cannot see me, where is open ground, where do I stash what I stole. So I wrote my own grid: columns every half metre, floor tiers inside one column (two storey houses, a bridge over a ravine, underground sublevels) and a clearance value in every cell. One grid serves every body size at once: a big creature fails to fit through a narrow gap on its own, with no special rules. HUD drawn with shader [Image] The standard s&box UI is convenient, and for a normal interface I would simply use it. But my whole look rests on a pixel staying a pixel, and a pixel font through regular text rendering drifts in hinting and letter positions. So the interface is one quad over the frame with my own shader, glyphs are taken off the TTF by the font's own grid, strings are assembled into a texture, and every appearance and disappearance is Bayer dithered: text does not fade by alpha, it dissolves pixel by pixel and stays crisp at any resolution. The shadow under the text is dithered the same way, and that is where the look comes from. Underground levels: bake the rooms first, then build the level out of them [Image] I wanted both random generation and good light, which normally pull against each other: there is nothing to bake until the level exists. The compromise: the light of every room and corridor prefab is baked into a volume once per session and cached, then a seeded generator assembles a whole level out of ready rooms, the volumes travel with them, and at the joints in doorways the light of neighbouring rooms is blended so it does not break at the threshold. The result is a new layout every run with light close to a hand baked one, and no waiting at build time. Only flickering lamps are left live. Physics and world synchronisation The engine can sync transforms by itself, and for many things that is enough. My game is p2p co-op on one shared channel, so the rule is simple: the network carries the reason, never the picture. A dropped item does not stream coordinates every frame, one event travels ("fall from here with this velocity") and every machine runs the same fall locally. Players and monsters send their own position snapshots, and between them the body is carried by my own smoothing. Underground levels, vegetation and road debris are not transmitted at all: the seed travels and every machine builds the same world. So a client does not live one ping in the past, its own action appears instantly on a ghost: drop an item and the ghost falls at once, while the real one takes its place when the host confirms. Price, damage and death are always decided by the host. Fighting for the fps The longest part of the work, and honestly mostly my own doing. I built the lighting as one large function with every branch inside, and the shader ended up bound by GPU registers rather than by polygons: switching a piece of code off at runtime saved 0.36 ms, while cutting the same piece out of the build saved 1.5 ms, because the compiler kept the variables of every branch alive. The cure is not flags but static shader variants per context (street, truck, house, underground), which gave back almost two milliseconds inside the truck. The driver hands out registers in steps of 72, 80, 96, 128 and does so non monotonically, so every change has to be measured for real. The shader sits at 96 now, but my work continues to make this better. GPU Grass I won’t dwell on it here. it runs almost entirely on the GPU. It was originally created in my prev s&box projects: Protect The House and Green Spin. I only made visual changes to it for this game.The game isn't finished yet, this is just the foundation. It will get much better as more content is added, and I’ll take into account everything you don’t like, I look forward to your suggestions, let's make this game better together
[Image]
Next Updates:
• Firstperson mode (done)
• For newcomers to loot-gathering games, add explanatory hints on the first day (done)
• New everyday shop system
• Separate the jumpsuit into its components: different boots, different backpacks (done)
• Casino in bar ( roulette - done, jackpot - done, spin wheel, 21 )
• Climbing over fences (done)
• Searching the lockers (done)
• Better walk control ( done )
• Make the mini-map more user-friendly (done)
• New locations
• New monsters ( The concepts have already been devised )
• Make dungeon generation more branching than it currently is
• Fully joystics / steam deck support
• So that almost all the loot can be interacted with
• A bestiary of monsters that will gradually unlock, allowing you to study their behavior (done)
• Perfect the monster spawn system
• Alt gun slot
• Walkie-Talkie + alt slot
The debt is almost paid. Just One More Run into the Zone
⚠️ Beta. Gamma Team is still in development, so expect bugs. This is my first project, made for a game jam. Thanks for playing, and feedback is very welcome!
Gamma Team is a cyclical co-op salvage crew working the Chernobyl Exclusion Zone for a company that only cares about one number: the quota.
Every Underground is randomly generated, so no two runs are the same. The Monsters aren't just hit points: each one has its own behavior, and you'll have to learn how to hide from it, trick it or run. And when the day is over, grab the Accordion and the Guitar, because every good run ends with a song in the back of the truck.
Things out here listen. Some of them hunt by sound. One of them has learned to speak in your friends' voices.
Sell your haul at the bar, meet the quota, and do it all again.
For any ideas or bugs you can tell in: https://discord.gg/eGe7Av4A5M
[Image]
Tech I am proud of, and why this game took so long
Baked light and shadows
[Image]
The engine handles dynamic light well, but my map is half a kilometre of terrain with a forest and dozens of lamps, and the sun and lamps never move. Keeping them dynamic would mean paying every frame for something that never changes. So all static light is baked into a map over the terrain: sun visibility separately, lamp light separately, with shadows cast into it by real tree triangles with leaf alpha, by the terrain and by static models. Live shadows stay where they actually matter: on people and monsters. I already had the germ of baked shadows in another project (which is still under development), but in this project, i fully realized it.
Fog of the unseen
[Image]
Everything the player cannot see because of walls is covered by dark fog. It is not a view cone and not a post effect: sight-blocking geometry is sliced by a horizontal plane at eye height into a flat plan of segments, and each surface checks for itself whether the line from the eyes to it is blocked. The eye is a disc rather than a point, so a wall corner gets a real soft penumbra instead of a staircase of rays. The first version did this per pixel and ate half the frame indoors, so visibility is now solved into a grid of five centimetre cells once per eye movement, and a pixel costs a single lookup.
A custom navigation grid
[Image]
The built-in navmesh builds at runtime and would be plenty for a normal game. Three things got in my way, all specific to my bestiary: one agent size per scene, while my creatures range from half a metre to a four metre span and one of them is supposed to never fit through a door; a path query on the order of a millisecond with no budget, with a dozen creatures on the map; and the questions I want to ask, which it was not built for: where do I stand so the player cannot see me, where is open ground, where do I stash what I stole. So I wrote my own grid: columns every half metre, floor tiers inside one column (two storey houses, a bridge over a ravine, underground sublevels) and a clearance value in every cell. One grid serves every body size at once: a big creature fails to fit through a narrow gap on its own, with no special rules.
HUD drawn with shader
[Image]
The standard s&box UI is convenient, and for a normal interface I would simply use it. But my whole look rests on a pixel staying a pixel, and a pixel font through regular text rendering drifts in hinting and letter positions. So the interface is one quad over the frame with my own shader, glyphs are taken off the TTF by the font's own grid, strings are assembled into a texture, and every appearance and disappearance is Bayer dithered: text does not fade by alpha, it dissolves pixel by pixel and stays crisp at any resolution. The shadow under the text is dithered the same way, and that is where the look comes from.
Underground levels: bake the rooms first, then build the level out of them
[Image]
I wanted both random generation and good light, which normally pull against each other: there is nothing to bake until the level exists. The compromise: the light of every room and corridor prefab is baked into a volume once per session and cached, then a seeded generator assembles a whole level out of ready rooms, the volumes travel with them, and at the joints in doorways the light of neighbouring rooms is blended so it does not break at the threshold. The result is a new layout every run with light close to a hand baked one, and no waiting at build time. Only flickering lamps are left live.
Physics and world synchronisation
The engine can sync transforms by itself, and for many things that is enough. My game is p2p co-op on one shared channel, so the rule is simple: the network carries the reason, never the picture. A dropped item does not stream coordinates every frame, one event travels ("fall from here with this velocity") and every machine runs the same fall locally. Players and monsters send their own position snapshots, and between them the body is carried by my own smoothing. Underground levels, vegetation and road debris are not transmitted at all: the seed travels and every machine builds the same world. So a client does not live one ping in the past, its own action appears instantly on a ghost: drop an item and the ghost falls at once, while the real one takes its place when the host confirms. Price, damage and death are always decided by the host.
Fighting for the fps
The longest part of the work, and honestly mostly my own doing. I built the lighting as one large function with every branch inside, and the shader ended up bound by GPU registers rather than by polygons: switching a piece of code off at runtime saved 0.36 ms, while cutting the same piece out of the build saved 1.5 ms, because the compiler kept the variables of every branch alive. The cure is not flags but static shader variants per context (street, truck, house, underground), which gave back almost two milliseconds inside the truck. The driver hands out registers in steps of 72, 80, 96, 128 and does so non monotonically, so every change has to be measured for real. The shader sits at 96 now, but my work continues to make this better.
GPU Grass
I won’t dwell on it here. it runs almost entirely on the GPU. It was originally created in my prev s&box projects: Protect The House and Green Spin. I only made visual changes to it for this game.
|
| Votes | 346 39 380 |
| Error Rate | 0.23% |
| Loading Screen Media | https://cdn.sbox.game/org/glag/ex_zone/loadingscreen/f478f08d-1638-4101-aff1-a98f5c427631.mp4 |
| Reviews |
64 reviews
79.7% Recommended (51)
12.5% Promise (8)
7.8% Needs Work (5)
|
| Usage |
12 active now
1,617 players
2,804 sessions
865 hours playtime
18 minutes avg session
CCU sampled
Totals captured
|
| Data | {"GameConfigConfirmed": true} |