Jumpilot · CTF
Pierwsza gra na modułach ładowanych na tagi

Przeciąganie liny na całym parku

Gra drużynowa na urodziny dla ok. 20 dzieci. Działa na tych samych tagach, z których przez cały dzień korzystają wszyscy goście parku. Każdy tag to osobne pole do zdobycia: dzieci z imprezy przeciągają jego pasek na stronę swojej drużyny, a silnik na koniec sumuje terytorium ze wszystkich tagów. Pozostali goście zbierają punkty jak zawsze.

~20
dzieci w 2 drużynach
60 s
domyślna runda
10 s
blokada na tagu
Wypróbuj: jeden tag
Ola: drużyna niebieska · Kuba: pomarańczowa · Gość: brak na liście
Przebieg imprezy

Od zapisów do zwycięzcy w czterech krokach

01
Animator zapisuje dzieci
Telefonem z NFC przykłada kolejne opaski i od razu przydziela je do drużyny niebieskiej albo pomarańczowej.
02
Start rundy
Każdy tag dostaje własny pasek, ustawiony pół na pół, z licznikiem czasu w dolnym rzędzie.
03
Dzieci biegają
Przyłożenie przesuwa pasek tego taga o piksel w stronę drużyny. Na tym samym tagu opaska ma 10 s blokady, więc trzeba biec dalej i pilnować wielu tagów naraz.
04
Koniec czasu
Silnik sumuje piksele każdej drużyny ze wszystkich tagów i wygrywa większa suma. Tagi wracają do zwykłych punktów, a wynik animator widzi w panelu.
Inspiracja

Jak „Turf War” w Splatoon, tylko na całym parku

W Splatoon na Nintendo Switch dwie drużyny przez kilka minut zamalowują arenę swoim kolorem, a wygrywa ta, która pokryje większą powierzchnię. U nas areną jest park, a „farbą” przyłożenie opaski. Każdy tag to kawałek terenu do przejęcia, a wynik to suma pikseli ze wszystkich tagów.

Splatoon
arena, farba, procent pokrycia
Jumpilot CTF
tagi parku, opaska, suma pikseli
Platforma, nie jedna gra

CTF to pierwszy przykład

Gra jest modułem, który operator parku wgrywa na tagi z wyprzedzeniem. Przy starcie gry tagi dostają polecenie aktywacji skryptu, a tag reaguje tylko na moduły, które ma wgrane. Tag bez danego skryptu ignoruje polecenie i dalej działa normalnie. Ta sama mechanika pozwoli dodawać kolejne gry bez zmiany firmware. Każda działa nad zwykłymi punktami i zabiera tylko opaski swoich graczy.

CTF, przejmowanie terenuprototyp
[KOLEJNA GRA]w przyszłości
[KOLEJNA GRA]w przyszłości
Współistnienie z parkiem

Gra bierze tylko swoje opaski. Resztę przepuszcza dalej.

Na parku stoi kilkadziesiąt ogólnodostępnych tagów, a impreza nie może ich zająć. Dlatego gra jest modułem-nakładką: przy każdym przyłożeniu sprawdza, czy opaska jest na liście graczy i czy trwa runda. Jeśli tak, ruch trafia do gry. Jeśli nie, opaska przechodzi do zwykłego naliczania punktów, tak jak w każdy inny dzień.

Poza rundą nawet dzieci z urodzin dostają normalne punkty. Po końcu gry tagi wracają do zwykłej pracy, a moduł czeka na kolejną imprezę.

Opaska przyłożona do taga
Moduł CTF
Opaska na liście graczy i runda trwa?
TAK
Ruch w grze.
Tag wysyła zgłoszenie, silnik przesuwa pasek tego taga.
NIE
Zwykłe punkty.
Warstwa bazowa tagu nalicza punkty i pokazuje potwierdzenie.
Opaski rozpoznawane są po UID NFC, tym samym, którego tag używa na co dzień.
Wyświetlacz taga 16 × 8

Co pokazuje tag w każdym stanie

Rzędy 0-6 to pasek tego taga. Liczba na nim to zawsze punkty, które dostanie gość, także w trakcie rundy. Dolny rząd to czas, który kurczy się do zera. Font, centrowanie i ikona zegara odwzorowują firmware 1:1.

Ten sam tag, ta sama runda

Dziecko z urodzin a zwykły gość

Runda trwa, na tym tagu niebiescy lekko prowadzą. Podchodzą do niego kolejno Ola z drużyny niebieskiej i gość, który przyszedł na park sam.

Telefon animatora

Przypisywanie opasek przez NFC

Panel gry otwiera się w Chrome na Androidzie, w sieci lokalnej parku. Telefon czyta UID opaski przez Web NFC i od razu dopisuje ją do wybranej drużyny. Zapis 20 dzieci to kilka minut przy stoliku urodzinowym.

Urodziny Oli · sala 2
Panel gry CTF
ZASADY RUNDY
Czas
60 s
Blokada
10 s
Krok paska
1 px
Tagi w grze
[LICZBA]
ZAPISY
Niebiescy 0 · Pomarańczowi 0
1. Animator wybiera drużynę
Ustawia czas i blokadę, potem tryb skanowania.
Tryb skanowania
Drużyna niebieska
Przyłóż opaskę do tyłu telefonu
Dodano do niebieskich
04:A2:3F:1C:8B:51:80
04:9E:11:7A:C2:51:80
04:5B:E0:32:96:51:80
04:17:CC:08:4D:51:80
2. Dzieci podchodzą po kolei
Każde przyłożenie od razu dopisuje UID do drużyny.
Lobby
Drużyny gotowe
Niebiescy
10
Pomarańczowi
9
DOPISZ SPÓŹNIALSKIEGO
Dziecko przykłada opaskę do telefonu animatora. Przyłożenia do tagów w parku nikogo nie zapisują.
Tagi z modułem ctf przejdą w tryb rundy
3. Spóźnialscy i start
Brakujące dziecko podchodzi do animatora i przykłada opaskę do telefonu.
Koniec rundy
Wynik
Większa suma pikseli
Niebiescy
PRZYKŁAD: PIKSELE NA TAGACH (A : B)
Tag 3 · ścianka11 : 5
Tag 7 · trampoliny6 : 10
Tag 12 · tunel13 : 3
Tag 18 · kosze9 : 7
…
Suma[SUMA A] : [SUMA B]
4. Ogłoszenie zwycięzcy
Suma pikseli ze wszystkich tagów. Animator ogłasza wynik z panelu.
Dla parku

Gra, którą widać, sprzedaje urodziny

Rozgrywka toczy się na tych samych tagach, z których korzystają wszyscy goście. Każdy, kto akurat jest na parku, widzi drużyny biegające między tagami i kolorowe paski na wyświetlaczach. Zagrać jednak nie może, bo tryby gier są dostępne wyłącznie podczas imprez urodzinowych.

Reklama w trakcie zabawy
Gra jest widoczna w całym parku, a nie w zamkniętej sali. Każda impreza pokazuje pozostałym gościom, co można przeżyć na urodzinach.
Tylko na urodzinach
Opaska zwykłego gościa nie bierze udziału w grze. Żeby zagrać z drużyną, trzeba zarezerwować urodziny, i to jest powód, żeby o nie zapytać.
Bez szkody dla codziennej pracy
Goście w tym czasie zbierają swoje punkty jak zawsze. Park nie musi niczego wyłączać ani rezerwować tagów na imprezę.
Pod maską

Serwer decyduje, tagi tylko rysują

Silnik gry jest jedynym źródłem prawdy: prowadzi pasek każdego taga osobno i na końcu sumuje terytorium. Cały ruch idzie przez lokalny broker MQTT parku.

devices/ctf/claim tag → silnik: kto przyłożył i gdzie
devices/ctf/state silnik → tagi: pasek każdego taga, czas, blokada (retained)
devices/ctf/roster silnik → tagi: lista graczy (retained)

Test obciążeniowy: ok. 165 przyłożeń w 30 s, ok. 10 odświeżeń ekranu na sekundę, ok. 30 KB wolnej pamięci bez restartów. Blokadę 10 s pilnuje i tag, i serwer. Potwierdzenia warstwy bazowej (zielony błysk, zegar blokady) zawsze rysują się nad grą.

Do dopracowania przed wdrożeniem
Pasek na każdym tagu osobno. Prototyp ma jeden wspólny pasek. Silnik musi prowadzić stan per tag i sumować terytorium na koniec rundy.
Liczba na tagu = punkty gościa. Prototyp rysuje na pasku punkty z konfiguracji gry. Moduł powinien pokazywać punkty bazowe taga.
Potwierdzenia gościa nad grą. Zielony błysk (z=1) i zegar (z=5) rysują się dziś pod paskiem gry (z≥11). Trzeba je podnieść nad warstwy modułów.
Blokada dziecka jest niewidoczna. Drugie przyłożenie na tym samym tagu po prostu nic nie robi. Krótki sygnał „biegnij dalej” ułatwiłby zabawę.
Zwycięzca tylko w panelu. Po końcu rundy tagi od razu wracają do punktów, bez animacji wygranej w kolorze drużyny.
Wymagania telefonu. Web NFC działa tylko w Chrome na Androidzie i tylko przez HTTPS. Prototyp używa certyfikatu self-signed, który trzeba raz zaakceptować.