Symulacja ruchu w Pizza Tycoon: efektywność na 25 MHz
W Pizza Tycoon ruch jest implementowany przez prosty system działający na procesorze 386 z częstotliwością 25 MHz. Każdy pojazd porusza się o jeden piksel na takt gry. Główna pętla sprawdza przeszkody i koryguje współrzędne: +1 do X przy ruchu na wschód, -1 do Y na północ.
Licznik progress odlicza od 16 do 0. Po wyzerowaniu resetuje się do 16 i aktywuje logikę granic kafelków: wybór kierunku, aktualizacja sprite'a. Kafelki 16x16 pikseli zapewniają synchronizację — ciężkie obliczenia odbywają się 16 razy rzadziej niż ruch piksel po pikselu.
Przy spawnie progress jest losowy (1–16), rozkładając obciążenie na klatki.
Struktura dróg i zasady kierunku
Mapy to siatka 160x120 kafelków z landsym.vga. Drogi są jednokierunkowe: kafelek 0x16 — wschód, 0x06 — zachód, 0x26/0x36 — pionowo.
Kąty dodają rozgałęzianie. Kafelek 0x56 (CORNER_SW) pozwala na zachód lub południe. Wybór: 50% skręt/prosto. Zakaz dwóch lewych skrętów pod rząd zapewnia naturalność.
Mapy są zaprojektowane logicznie — sąsiednie kafelki zawsze wspierają możliwe ścieżki.
- Proste kafelki: stały kierunek.
- Kąty: probabilistyczny wybór z anty-cyklem.
- Skrzyżowania T/X: kombinacje kątów.
Kolizje poprzez sprawdzanie parami
O(n²) dla 25 pojazdów — 625 sprawdzeń na klatkę. Optymalizacja: wczesny powrót na podstawie kierunków. Wschód+zachód — powrót bez współrzędnych, ponieważ drogi jednokierunkowe wykluczają przeciwnych kierunków.
Sprawdzanie:
- Kierunki (połowa par jest odrzucana).
- Pas (równość dróg).
- Arytmetyka współrzędnych (rzadko, <10 par).
Kolizja → pauza 10 taktów. Korki rozpraszają się naturalnie: lider porusza się pierwszy.
Błędy (przechodzenie przez) — efekt uboczny optymalizacji, akceptowalne dla wizualnej symulacji.
Spawn i recykling pojazdów
Na wejściu w tryb ulic: skanowanie 132 kafelków (12x11). Dla drogowych — rzut kostką na podstawie gęstości dzielnicy. Kąty wykluczone.
Wyjście poza ekran: zastąpienie nowym pojazdem odwrotnego kierunku/koloru na tym samym kafelku. Przewijanie obsługuje nowe pasy podobnie.
// Pseudokod spawnu
for each road_tile in viewport:
if random(traffic_density) > threshold:
spawn_car(tile, random_direction, random_progress)
Analiza asemblera i współczesne błędy
Autor Pizza Legacy spędził 14 lat na nadmiernie skomplikowanych grafach, A* i kolizjach. Oryginał jest prostszy: kafelki dyktują ścieżkę, brak fizyki/prędkości.
Analiza asemblera + LLM odsłoniła mechanikę. Odzyskanie: switch w decide_desired_direction (Car.cpp) na podstawie typów kafelków.
| Podejście | Złożoność | Efektywność |
|-----------|-----------|-------------|
| Oryginał | Proste reguły | 25 MHz, 30 pojazdów |
| Współczesne | Grafy, fizyka | Zatory na CPU 2010+ |
Co jest ważne
- Jednokierunkowe kafelki eliminują wyszukiwanie ścieżki.
- Wczesny powrót w kolizjach minimalizuje pętle.
- Ruch piksel po pikselu + rzadkie aktualizacje = niskie obciążenie.
- Probabilistyczne skręty + anty-cykl tworzą realizm bez AI.
- Recykling pojazdów wyklucza zarządzanie listą.
— Editorial Team
Brak komentarzy.