Sokak Efsaneleri

A slide-and-merge puzzle about the street animals of Istanbul. Swipe and every creature slides at once; two of a kind merge, until a stray kitten becomes a legend.

Role
Solo developer: game design, code, tools, release
Status
Version 1.0 in App Store review, Android closed test next
When
First prototype on 10 October 2026, App Store submission on 22 October
Stack
Unity 6, C#, Firebase, BigQuery, AdMob, Unity IAP, Codemagic

The code is private, so this page explains how the game is built instead of linking to it.

A level on the 5 by 6 board
A legendary cat's card
The Balat street with the creatures

Summary

Problem
Hundreds of puzzle levels had to be fair and get harder on purpose, without a crowd of testers, and the game had to reach iOS from a Windows machine.
My part
All of it, as the only developer: game design, the C# code and its tests, the level generator and solver, the release pipeline. The art is AI-generated from briefs I wrote.
Outcome and status
All 500 levels ship already solved, the generated ones by breadth-first search, and 803 tests check the rules without Unity. Built on Windows and signed on a cloud Mac, version 1.0 is in App Store review; an Android closed test is next.

From the street to a legend

The real game, as it appears in its App Store listing, plus one capture from a real iPhone.

Screen 1 of 7

  1. The street

    Your street
    1

    Your street

    The creatures live on a postcard street in Balat. Feed them and their love grows.

  2. Two districts
    2

    Two districts

    Kadıköy and Balat, each with its own creature types and things to tap.

  3. On a real iPhone
    3

    On a real iPhone

    Kadıköy's home scene, captured on a device.

  4. Playing

    A level
    4

    A level

    Swipe and every creature slides at once. Reach the goal before the moves run out.

  5. Efsane!
    5

    Efsane!

    Eight of a kind become a legend: Yavru, Afacan, Patron, then Efsane.

  6. Collecting

    The album
    6

    The album

    Five species with four stages each: twenty characters to collect.

  7. A legend's card
    7

    A legend's card

    Every Efsane has a nickname, a line of story and three costumes.

Try the rule

Swipe the board or use the arrow keys. Two of the same kind merge and their counts add up. Make a cat of 8 to raise an Efsane.

  1. Yavru1+
  2. Afacan2+
  3. Patron4+
  4. Efsane8+

A small re-telling of the rule for this page, not the game's code. The shortest solution shown here is found with the same idea the game uses: breadth-first search.

While the board has focus, the arrow keys swipe it. The buttons under it do the same, and the board can be read as a table further down.

Moves 0 of 8. The shortest win takes 5.

The arrow keys work once the board has focus.Swipe sideways on the board. To swipe up and down too, press Play on the board first.

Show the board as a table
Column 1Column 2Column 3Column 4
Row 1Cat 1emptyGull 1Cat 1
Row 2Cat 1Cat 1emptyCat 1
Row 3Cat 1Gull 1Cat 1empty
Row 4emptyemptyGull 1Cat 1

How it works

Generating levels that are fair, measuring difficulty without a crowd of testers, shipping to iOS from Windows and keeping AI-made art readable.

Every level is solved before you see it

Levels 1 to 60 were tuned by hand in a level editor inside Unity. Levels 61 to 500 come from a seeded generator: each candidate board is solved with breadth-first search, thrown away if a creature can never meet its own kind, and kept only if its depth (the length of its shortest win) fits its slot, the level's place in a block of ten. The levels that pass go into a pre-built level table that ships with the game.

  1. SeedMulberry32: same seed, same board
  2. Generatorboard recipes for each slot
  3. Dead-end checkcan every creature meet its kind?
  4. BFS solvershortest win is the level's depth
  5. Move budgetdepth plus a slack
  6. Level tablepre-built: levels 61 to 500, all solved

Difficulty measured with a simulated player

A player model looks a few swipes ahead and picks moves with a softmax; its parameters were fitted to my own star history. It plays each candidate level up to two thousand times, and the share of lost games has to land inside the range set for the level's slot. Every tenth level is a hard one, so the curve is a saw.

Target share of lost games, levels 61 to 80
  • Regular level
  • Hard level, every tenth
Show as a table
LevelTarget loss
6115–28%
6215–28%
6315–28%
6422–35%
6522–35%
6622–35%
6728–40%
6828–40%
6928–40%
7040–55%
7115–28%
7215–28%
7315–28%
7422–35%
7522–35%
7622–35%
7728–40%
7828–40%
7928–40%
8040–55%
Measured loss by solution depth (+2 moves of slack)
Show as a table
DepthMeasured loss
4about 10%
520–30%
645–55%
760–70%

Six layers, one direction

The rules, the solver and the economy live in a plain C# core with no Unity in it, so 803 tests run in seconds on .NET. Each layer is its own assembly, and dependencies only point down.

  1. Editorscene builder, level editor27 files
    Gameboard, HUD, scenes107 files
    Metaprogress across levels3 files
  2. depends on
    Servicesinterfaces + Firebase, AdMob, IAP adapters55 files
    DataScriptableObject catalogs and tuning8 files
  3. depends on
    Corepure C#: rules, solver, economy48 files

Balance changes without a release

Every setting resolves as code default, then a tuning asset, then Remote Config. Analytics only start after the player accepts the consent card, and a daily BigQuery export feeds a level funnel that shows where people get stuck.

  1. Unity clientlevel_start, level_end
  2. Consent cardKVKK, before any event
  3. Firebase Analyticswith Crashlytics
  4. BigQuerydaily export, SQL funnel
  5. Remote Config121 parameters back to the game

Shipping to iOS without a Mac

I develop on Windows. Unity exports the Xcode project, a GitHub release carries it to Codemagic, and a cloud Mac signs and uploads the build. App Store Connect itself is scripted through its API: builds, in-app purchases and review notes.

  1. Unity on WindowsIL2CPP, ARM64
  2. Xcode exportzipped project
  3. GitHub releasea small private CI repo
  4. CodemagicMac mini M2: pods, sign, build
  5. TestFlightthen App Store review

AI-made art with hard checks

I wrote the art briefs and Codex generated the images. Deterministic Python scripts then assemble the sprites and check every creature at 64 pixels, in greyscale, as a bare silhouette and under three kinds of colour blindness, so a species stays recognisable on a small, busy board.

Full colour
Full colour
Deuteranopia
Deuteranopia
Silhouettes
Silhouettes
The first dark board next to the colourful redesign that came out of playtests.
The first dark board next to the colourful redesign that came out of playtests.

Five prototypes, one game

Before any Unity code I built five quick HTML5 prototypes and played them. The slide-and-merge one stayed.

Prototype 1 of 5

  1. Blast

    Blast

  2. Sort

    Sort

  3. Block puzzle

    Block puzzle

  4. Çini kaydır

    Çini kaydır

  5. Sokak Efsaneleri

    Sokak Efsanelerikept

In numbers

500
levels, each solved before it ships
803
core tests that run on plain .NET, without Unity
1,042
EditMode tests inside Unity
474
PlayMode tests inside Unity
121
Remote Config parameters the game reads
49k
lines of C#

Decisions I would make again

Next projectSurebet AnalyzerReads football odds from several sources in real time and flags price combinations whose implied probabilities add up to less than 100%.