Technologia · Projektowanie gier

Ekonomia to nie arkusz.
To lista praw,
które nie mogą
działać wstecz.

Dziewięć z nich, z wydanej symulacji menedżerskiej, każde zapisane jako test, żeby miesiące strojenia nie mogły po cichu odwrócić żadnego. W tym najlepsza mechanika, jaką mam, czyli liczba, której gracz nigdy nie dotyka.

Marcin Firmuga·2026-10-05·9 min czytania·Technologia

Gram w ten gatunek od lat — Game Dev Tycoon, Startup Company, Big Ambitions, linia Devices i Laptop Tycoon — a potem spędziłem osiemnaście miesięcy, budując jedną. Rzeczy, której nie rozumiałem jako gracz, jest to, że ekonomia nie jest miejscem, w którym wstawiasz liczby. Jest miejscem, w którym wstawiasz reguły, których liczbom nie wolno złamać.

Poniżej są prawdziwe prawa z mojej symulacji. Każde jest testem o nazwie czytającej się jak zdanie, i to jest celowe: prawo ekonomiczne zapisane po angielsku przeżywa strojenie, a magiczna liczba w pliku konfiguracyjnym nie.

Dla jakiego gatunku to jest. Gra menedżerska albo tycoon, w której pieniądze kumulują się przez godziny gry, a decyzje gracza to głównie liczby. Jeśli ekonomia twojej gry to sklep z trzema ulepszeniami, większość tego to przerost formy i ostatnia sekcja tak mówi.

Najpierw prawa, potem liczby

Każda ekonomia, którą zbudowałem źle, psuła się tak samo: wystroiłem jedną liczbę, potem drugą, potem czterdzieści kolejnych, a sześć tygodni później gra miała inny charakter i żaden pojedynczy commit nie był za to odpowiedzialny. Wszystkie liczby dało się obronić. Po cichu odwróciły się kierunki.

Prawo to stwierdzenie o kierunku, nie o wielkości. Oto moje, w nazwach z zestawu testów:

Prawo, czyli nazwa jego testuCzego broni
PricePerTokenOnlyEverFallsZapadka w jedną stronę, na której wisi cała reszta.
DemandGrowsFastThenFlattensBoom, który się kończy, więc wczesny sukces nie jest sukcesem na zawsze.
TheFrontierKeepsClimbingAndNeverWaitsForThePlayerŚwiat, który idzie dalej, niezależnie od ciebie.
CuttingPriceBuysShareAndNothingElseDoesDokładnie jedna dźwignia na najważniejszej liczbie.
ShareIsSplitAgainstRealRivalsAndNeverHandedOverZero darmowych klientów, nigdy.
AModelNobodyReplacesQuietlyStopsBeingChosenNic, co wydałeś, nie zostaje dobre.
ScarcityPeaksInTheShortageAndEasesAfterwardsWstrząsy, które przychodzą i mijają.
ASubscriptionLeftAloneDriftsIntoOverchargingAndThatIsAStoryStanie w miejscu musi coś kosztować.
TheMarketNeverBreaksOverFourteenYearsKrańce, czyli miejsce, gdzie kumulujące się liczby naprawdę się psują.

Przeczytaj drugą kolumnę jeszcze raz jak dokument projektowy, bo nim jest. Długo mi zajęło zauważenie, że moje najjaśniejsze stwierdzenie, czym jest ta gra, leży w pliku z testami.

Najlepsza mechanika, jaką mam, to liczba, której gracz nigdy nie dotyka

Jeśli masz zabrać z tego artykułu jedną rzecz, zabierz tę. To najtańsza ciekawa mechanika, jaką kiedykolwiek zbudowałem, i jest zrobiona w całości z prawa, które już wcześniej napisałem.

Układ: rynkowa cena rzeczy, którą sprzedaje mój gracz, spada w czasie — to prawo pierwsze i jest prawdziwe o prawdziwej branży, o której jest ta gra. Gracz wybiera model cenowy wcześnie, a abonament jest wyborem oczywistym, bo jest stabilny. Ustawia go, działa, zamyka ekran.

Rok później jego opłata nie drgnęła, a cena rynkowa spadła o połowę. Teraz liczy sobie dwa razy stawkę rynkową, nie zrobiwszy absolutnie nic. Test mówi to arytmetyką:

var policy = new MonetizationPolicy(); var opening = MarketModel.InitialPricePerMillionTokensUsd; Assert.That(policy.RelativePrice(opening), Is.EqualTo(1.0).Within(1e-9), "A company that has touched nothing does not open at par."); // Mniej wiecej tam, gdzie rok spadku zostawia rynek. var afterAYear = policy.RelativePrice(opening / 2.0); Assert.That(afterAYear, Is.EqualTo(2.0).Within(1e-9), "The fee is fixed and the market halved, so the company is charging twice the " + "market and this is the number that says so.");

A potem asercja, która tłumaczy, dlaczego to jest mechanika, a nie szczegół symulacji. Komunikat to coś, co przeczytałbyś, gdyby kiedyś oblała:

Assert.That(afterAYear, Is.GreaterThan(ModelScandals.PricyAbove), "Standing still no longer costs anything, so the BUSINESS page is a screen a " + "player never has to open twice.");

Ogólna reguła, która się tam kryje

Ekran jest ciekawy tylko wtedy, gdy podjęta na nim decyzja może sama stać się zła. Nie przez licznik, nie przez zdarzenie, które w ciebie strzela, tylko dlatego, że świat się ruszył, a twój wybór został tam, gdzie go zostawiłeś.

To przestawia zwykłą skargę, że gra menedżerska „nudzi się po godzinie". Rzadko brakuje jej zawartości. Brakuje jej rozpadu: powodu, żeby gracz wrócił do decyzji, którą uważa już za zamkniętą.

Przeciwwaga waży tyle samo. Rozliczanie za zużycie podąża za rynkiem w dół, więc nigdy nie dryfuje — a test mówi, dlaczego to jedyny powód, żeby je wybrać:

Assert.That(metered.RelativePrice(opening / 2.0), Is.EqualTo(1.0).Within(1e-9), "Metered pricing stopped following the market down, which is the only reason to " + "take it over a subscription.");

To jest prawdziwy kompromis, a nie lepsza opcja: abonament płaci więcej, dopóki uważasz, i karze, gdy przestajesz; rozliczenie za zużycie płaci mniej i nigdy nie gryzie. Gracz potrafi wytłumaczyć oba jednym zdaniem, a to jest poprzeczka, którą w tym gatunku powinien przechodzić każdy wybór ekonomiczny.

Jedna dźwignia rusza udziałem i tylko jedna

Udział w rynku to liczba, na którą gracze patrzą, co czyni ją liczbą najbardziej narażoną na to, że stanie się niezrozumiała. Jeśli cztery systemy nią szarpią, nikt nie prześledzi, dlaczego się ruszyła, a gra menedżerska, w której centralna liczba rusza się z powodów nie do prześledzenia, jest automatem do gry z arkuszami.

Moja ma więc dokładnie jedną dźwignię, nazwaną tak prosto, jak umiałem:

[Test] public void CuttingPriceBuysShareAndNothingElseDoes() { var market = MarketModel.Evaluate(GameDate.FromCalendar(2024, 6, 1)); var listPrice = new[] { new DeployedModel("List", /* ... */ 1.00) }; var discounted = new[] { new DeployedModel("Discount", /* ... */ 0.25) }; Assert.That(MarketShareModel.PlayerShare(discounted, 0.4, market), Is.GreaterThan(MarketShareModel.PlayerShare(listPrice, 0.4, market))); }

Prawem towarzyszącym jest to, o którym się zapomina, a stanowi różnicę między ekonomią a tablicą wyników: ShareIsSplitAgainstRealRivalsAndNeverHandedOver. Nie ma stanu, w którym rynek po prostu daje graczowi klientów. Nawet dominująca firma napotyka asercję, że rywale zatrzymują część rynku, bo ekonomia, w której konkurenci przestają konkurować, to ekonomia, która po cichu się skończyła — a gracz poczuje to długo przed tym, zanim będzie umiał to nazwać.

Świat nie może czekać na gracza

Większość gier tycoon jest tu hojna i kosztuje je to całe napięcie. Jeśli konkurencja skaluje się do twoich postępów, nic, co robisz, nie jest pilne, bo dystans jest stały z definicji.

Moja stawia tezę przeciwną jako prawo: TheFrontierKeepsClimbingAndNeverWaitsForThePlayer. Najlepsza rzecz na świecie poprawia się według własnego harmonogramu. Zostań w tyle na dwa lata gry, a jesteś w tyle, a nie przyciągnięty gumką z powrotem.

Brzmi surowo i potrzebuje przeciwwagi, którą jest przedział balansu z artykułu o testach grywalności: zwyczajny gracz musi i tak skończyć cztery lata w zasięgu czołówki. Te dwa testy są sprzeczne celowo. Jeden mówi, że świat nie czeka; drugi, że grę mimo to da się wygrać. Balans jest odległością między nimi, a zapisanie obu jest tym, co powstrzymuje cię przed przypadkowym zmiękczeniem pierwszego przy próbie zadowolenia drugiego.

Dwa prawa, od których długa gra robi się żywa

DemandGrowsFastThenFlattens daje ekonomii boom z końcem, więc firma, która wjechała na wczesną falę, nie może się na niej wieźć. Wzrost, który nigdy się nie wypłaszcza, to gra nagradzająca dobry start i potem przestająca o cokolwiek pytać.

ScarcityPeaksInTheShortageAndEasesAfterwards czyni wstrząsy tymczasowymi. Niedobór, który nigdy nie mija, jest po prostu trwałą zmianą ceny w przebraniu i gracze właśnie tak go czytają.

Nic, co wydałeś, nie zostaje dobre

AModelNobodyReplacesQuietlyStopsBeingChosen to prawo, które dodałbym jako pierwsze do cudzej gry tycoon, bo brakuje go w prawie każdej.

Powszechny projekt każe ci zbudować produkt, a ten produkt zarabia już zawsze. Czyni to pierwsze godziny satysfakcjonującymi, a późniejsze pustymi, bo optymalną strategią staje się gromadzenie: nigdy nic nie wycofuj, niech sterta rośnie. Starzenie się jest tym, co zamienia stertę w portfel, którym trzeba zarządzać.

Zwróć uwagę na słowo quietly w nazwie testu. Produkt nie jest kasowany, nie wygasa, nie odpala się żadne powiadomienie. Klienci po prostu przestają go wybierać, bo rynek się ruszył, a on nie. Gracz odkrywa to, patrząc — czyli zachowaniem, które w tym gatunku chcesz nagradzać.

Dowód, że ekonomia nie rozpada się w czternastym roku

Kumulujące się liczby psują się na krańcach. Ekonomia zachowująca się pięknie przez cztery lata potrafi w dziewiątym dać ujemną cenę, nieskończony popyt albo martwy rynek, a wśród twoich graczy jest ktoś, kto tam dojdzie.

TestCzego nie dopuszcza
TheMarketNeverBreaksOverFourteenYearsŻadnej wartości wchodzącej w niemożliwe na dalekim krańcu krzywej.
SomebodyIsActuallyServingTheMarketThroughoutRynku, który technicznie istnieje, a nikogo na nim nie ma.
EveryModelTypeIsSomethingSomebodyEventuallyBuildsZawartości osiągalnej na papierze i wybieranej przez nikogo.
TheServedMarketChangesShapeOverAWholeGameRynku o tym samym kształcie w roku dziesiątym co w pierwszym.

Ten drugi jest subtelniejszy, niż wygląda. „Ktoś obsługuje rynek" w ogóle nie dotyczy gracza — sprawdza, że symulowany świat pozostaje zaludniony. Ekonomia, w której rywale po cichu wymierają, jest technicznie stabilna i kompletnie martwa, a wydać ją bardzo łatwo, bo nic nie zgłasza błędu.

Trzeci to moja ulubiona porządkowa rzecz w całym zestawie. Przechodzi zawartość i sprawdza, że każdy typ produktu jest czymś, co ktoś w świecie w końcu buduje. Zawartość, która istnieje, ale nigdy nie zostaje wybrana, to ekonomiczna wersja nieosiągalnej funkcji: skończona, poprawna i niewidzialna.

Ile realizmu i gdzie się zatrzymać

Moja gra dotyczy branży z prawdziwą, publikowaną ekonomią, więc pokusa, żeby modelować wszystko, była silna, a uleganie jej było błędem, który popełniłem dwa razy.

Reguła, przy której zostałem: kierunki mają być uczciwe, wielkości mają być czytelne. Cena spadająca w czasie jest prawdą o rzeczy prawdziwej i gra bez tego byłaby fałszywa. Dokładny kształt tego spadku istnieje po to, żeby decyzja dała się odczytać, a nie żeby pasować do wykresu.

Sprawdzianem jest to, czy gracz potrafi wytłumaczyć jednym zdaniem, co mu się stało. „Trzymałem opłatę abonamentową, podczas gdy rynek spadł o połowę, więc liczyłem dwa razy za dużo i klienci odeszli" jest zdaniem. Jeśli uczciwy model daje wynik, którego nikt nie umie opowiedzieć, model ma rację, a gra jest zła — a to grę robisz.

Kiedy nic z tego nie dotyczy ciebie

Jeśli twoja ekonomia to sklep z kilkoma ulepszeniami albo pieniądze istnieją wyłącznie po to, żeby dawkować zawartość, którą ułożyłeś ręcznie, to przerost formy. Te prawa zarabiają na siebie wtedy, gdy ekonomia jest grą — gdy gracz spędza godziny na decyzjach liczbowych i oczekuje, że będą się sumować.

Uczciwy sygnał, że ich potrzebujesz: stroiłeś tę samą stałą więcej niż trzy razy i nie umiesz powiedzieć, jak gra ma się czuć w piątej godzinie.

Kolejność, w której napisałbym je ponownie

Pytania, które ludzie zadają

Jak zaprojektować ekonomię gry tycoon?

Najpierw prawa, potem liczby. Ekonomia to mały zestaw stwierdzeń o tym, w którą stronę rzeczy wolno się ruszać: cena jednostkowa tylko spada, popyt rośnie szybko i się wypłaszcza, czołówka pnie się w górę niezależnie od gracza. Każde to zdanie egzekwowalne testem, więc nie odwróci się po cichu w miesiącach strojenia. Liczby stroisz potem; prawa powstrzymują strojenie przed zrobieniem innej gry.

Dlaczego moja gra tycoon nudzi się po pierwszej godzinie?

Zwykle dlatego, że stanie w miejscu przestało cokolwiek kosztować. Jeśli decyzja z pierwszej godziny nadal jest poprawna w piątej, ekran, na którym ją podjęto, jest ekranem, którego nikt już nie otworzy — a gra menedżerska to w większości ekrany. Lekarstwem rzadko jest więcej zawartości, tylko rozpad: rozsądny wybór ma stać się nierozsądny przez ruch świata, a nie przez odpalenie licznika.

Czy udział w rynku powinien być czymś, co gracz kupuje ceną?

Jedna dźwignia powinna nim ruszać, a reszta nie, inaczej udział dryfuje z powodów nie do prześledzenia. U mnie obniżka ceny kupuje udział i nic innego tego nie robi, i tak nazywa się test. Równie ważne: udział jest dzielony przeciw prawdziwym rywalom i nigdy nie jest oddawany, bo ekonomia, w której konkurenci przestają konkurować, po cichu się skończyła.

Jak nie dopuścić do rozpadu ekonomii późno w długiej grze?

Uruchom ją daleko poza miejsce, do którego dotrze gracz, i sprawdź, że nadal jest sensowna. Moja krokuje rynek przez czternaście lat i sprawdza też, że ktoś przez cały czas go obsługuje. Kumulujące się liczby psują się na krańcach, a kampania testowana tylko do czterech lat w końcu spotka gracza, który dojdzie do roku szóstego.

Ile realizmu ekonomicznego potrzebuje gra tycoon?

Tyle, żeby kierunki były uczciwe, i ani trochę więcej. Wielkości istnieją po to, żeby decyzje dało się odczytać. Sprawdzian: czy gracz potrafi wytłumaczyć jednym zdaniem, co mu się stało. Jeśli uczciwy model daje wynik, którego nikt nie umie opowiedzieć, model ma rację, a gra jest zła.

Każde prawo tutaj to prawdziwy test o prawdziwej nazwie. Są w publicznym repozytorium Scaling Laws, w plikach MarketModelTests.cs, BusinessPricingTests.cs i MarketDriftTests.cs, podlinkowanych w źródłach.
Dalej w tej serii: 1541 testów, które nie uruchamiają gry · dlaczego solowe projekty umierają na tych samych czterech funkcjach · deterministyczne losowanie w Unity.
MF

Marcin Firmuga

Solo developer · HCK_Labs · buduję publicznie

Piszę o tym, co naprawdę wypuściłem, z prawdziwymi liczbami i prawdziwym kodem, łącznie z tym, co nie zadziałało. Więcej: moja historia.