Street Legends Devlog 1: Seven Homies and a City

Street Legends is a colony sim in the Dwarf Fortress tradition, except the colony is a street crew and the mountain is a crime-ridden city.

Vega5 min read

Street Legends is a colony sim in the Dwarf Fortress tradition, except the colony is a street crew and the mountain is a crime-ridden city.

You start off with seven homies and a crib on a friendly block (your starting territory). You never directly control them, rather you point them towards work: shaking down a corner store, collecting from a counter that owes, robbing an opp-protected business, going to bail a homie out of jail, and so on. They handle the rest, including eating, sleeping, sulking and crashing out.

At this point, to “win” is to grow your syndicate into something that controls the city and gains maximum influence over the criminal underworld. Ideally, you should be able to play indefinitely, as long at least one member of the crew remains. To “lose” means the last homie went down – pour out a little liquor and play again.


The 5 Pillars

These were decided on day one, before any architecture planned or any code was written. They have settled most of the design decisions I have had to make since:

  1. Maximum player agency: Everything you do matters and contributes to the state of the city and the “story” being told.

  2. Everything ripples: One homie’s bad day can affect every one he crosses paths with and, in turn, affect other people whose path those people cross, and so on.

  3. Emergent stories: No scripted missions. The story comes from systems running into each other, interacting, and running into conflicts.

  4. Moddable from day one: All content is data. The base game itself is a mod called “Core”

  5. Graphic-minimal: Mechanics come first. Art direction is retro, pixel art. Art is swappable 16px tiles.

The one I keep coming back to is #2. Nearly every feature I have built since started with a question “what happens because of this?”


The game doesn’t know it’s in Unity

The biggest technical decision was made before any gameplay existed: the entire game is just plain C#, and it’s doesn’t know Unity exists.

  • StreetLegends.Sim holds every piece of game state and rule. It has no MonoBehaviors, no scene access, and no UnityEngine.Random. Just give it a seed and it runs the same way every time.

  • StreetLegends.Game is the Unity side. It draws what the sim says and forwards any input. It doesn’t own anything.

Systems mostly do not call each other. Instead, they publish events on a bus (“crime was committed”, “someone got arrested”, “the hour changed”), and any systems that care subscribe to the event. The feed you read in-game is the same events, rewritten as prose.


Everything is JSON

Buildings, districts, jobs, weapons, needs, rival crews, police behavior, the offense catalog, sentencing guidelines, and prison schedules are all def files under Data/Core/Defs. There are 16 of them now. A mod that loads later would be able to overwrite any def by name.

So, “the Vipers carry pistols 40% of the time” isn’t buried in the code, it’s just “pistolChance”: 0.4 in rivals.json, and anyone can change it.


Rolling a city

Every run starts with a seed, and the seed builds the whole city:

  1. Arterial roads in a loose grid, 17 to 26 tiles apart.

  2. Blocks between them, ringed with sidewalks.

  3. Districts, placed by distance from the center: a downtown core, suburbs, parks, and on the outskirts either nice suburbs (big two-story houses, few shops, hostile to the crew) or trailer parks (dirt lots, dense rows, cheap to live in).

  4. Buildings, placed with some care. Houses face the street, so fronts line the south sidewalk and backs line the north. Downtown blocks get a solid storefront strip with towers set back behind it. Shops of the same type keep their distance from each other so a street doesn't end up with three pawn shops.

  5. Landmarks: one police precinct, a courthouse across the road from it, a hospital, and exactly one nightclub (the Boom Boom Room, with a flashing beer sign).

  6. Intersections, each classified by the blocks around it. Downtown crossings get signals, residential ones get stop signs, and empty corners get nothing. A typical city has about 12 lights and 14 stop signs.

  7. Neighborhoods with names and attitudes: friendly, indifferent or hostile. That attitude sets how fast people there call the cops on you.

The map is now 128×160 tiles. A normal city has about 46 storefronts to fight over and a couple hundred residents. The top strip of the map isn't city at all. That's where the prison ended up, because it didn't fit anywhere else. It gets its own post.


The art is arriving

Initially, much of the city contained placeholder art, just little boxes basically. I had been working on pixel art for some time but I still had a lot of room to improve, especially at this pixel resolution. So, over the course of time the art has also improved. But this also causes me to go back and redo buildings or assets that I thought were good enough.

The result is all hand-drawn at 16px per tile: a skyline of 11 towers, 40 house fronts and 26 backs, trailers, two sheets of storefronts (bank, pawn shop, taco shop, the Outrun Arcade), trees, traffic lights with working lamp states, a cop shop, a courthouse, and a prison drawn in thirteen separate layers.

I am learning a lot about trying to work within a minimal canvas with a minimal palette. There is something very rewarding about getting something to look “just right”.


Where it stands

About ten weeks in, the project is 73 C# files and around 17,500 lines. The city now has:

  • civilians with homes, jobs, schedules, moods and opinions of your crew

  • protection rackets, robberies, and two rival crews running the same racket as you

  • pistols, firefights, and sieges on your crib

  • cops, a precinct with six cells, and a full court system with pleas, witnesses and trials

  • a prison upstate with a daily routine and a yard where things go wrong

  • recruiting, so the crew can finally grow as well as shrink

Each of those gets its own post. Next time: the block is alive. That post covers the couple hundred people who live here and have their own opinions about you.


Street Legends is built in Unity.