Eine Pixelstadt, die lebt, wenn niemand online ist: NPCs und Geister
Eine Pixelstadt wirkt bewohnt, und zwar vor allem durch Menschen, die stillstehen. In den 16 Städten von Pokémon Smaragd-Edition teilen sich die 100 Stadtbewohner ohne Ausblende-Flag, die also bei jedem Besuch da sind, so auf: 59 stehen an einem Posten, blicken in eine Richtung oder schauen sich um, 39 wandern in einem Feld von ein oder zwei Zellen um den Punkt, an dem sie platziert wurden, und 2 laufen auf der Stelle; nimmt man die 58 hinzu, die ein Story-Flag entfernen kann, überwiegend Teammitglieder, Rivalen und benannte Figuren, von denen 54 stehen, lautet die Verteilung 113 von 158 (71,5 %), 43 (27,2 %) und 2. Ein Wanderer macht einen Schritt in 16 Frames und wartet dann 32, 64, 96 oder 128, ist also höchstens 11 bis 33 Prozent der Zeit in Bewegung.1 Der Tag wird abgerechnet, wenn der Spieler zurückkommt, durch eine Funktion, die einmal mit der Zahl der vergangenen Tage läuft, nicht durch eine Uhr, die tickt, während niemand spielt.23 Ist sonst niemand da, füllt der Kanon die Stadt mit den Spuren anderer Leute in kleinen, festen Plätzen (das Record Mixing von Smaragd kopiert 20 Geheimbasen, 5 Modewörter und den alten Mann eines anderen Spielers in Ihr Spiel) und lässt Fremde Präsenz teilen, ohne Worte zu teilen.45 Ich habe all das gemessen, weil meine eigene Stadt, Kiradex World, an ihrem ersten stillen Morgen dieselbe Frage beantworten muss, und der eigene Code ihres Servers, auf einer simulierten Uhr angetrieben, beantwortet sie in drei Punkten schlecht: Die vier Sammler bleiben stehen, wenn der Raum leer ist; sie machen einen Schritt pro Sekunde statt der konfigurierten 0,7 Sekunden und stehen 75 Prozent jedes Laufwegs still; und in einem Modell des Zeichencodes der App wird ein anderer Sammler rückwärts springend gezeichnet, wenn eine Bewegung mitten im Schritt eintrifft: bei 45 der 64 Bewegungen eines Rennens und auf 7 bzw. 16 Frames eines Laufwegs von 40 Tiles bei 30 bzw. 80 ms Netzwerk-Jitter, auf einem gleichmäßigen Laufweg ohne Jitter dagegen nie.67 Hier folgen der vermessene Kanon, die modernen Referenzen, Live-Präsenz mit ihren Zahlen, die Regeln für eine Welt, in der sich Kinder aufhalten können, und das Briefing.
Kurzfassung
- Der größte Teil einer Stadt steht. Sechs von zehn der 100 Menschen in Smaragds Städten ohne Ausblende-Flag haben einen stationären Standard-Bewegungstyp, und sieben von zehn aller 158, sobald man die 58 mitzählt, die die Story entfernen kann (ein Story-Skript kann trotzdem einen von ihnen gehen lassen, so wie der Junge an der Arena in Petalburg den Spieler zur Arena führt); fast alle übrigen wandern in Feldern von ein oder zwei Zellen im Tempo des Spielers selbst, 16 Frames (268 ms) pro Zelle, und warten zwischen den Schritten 0,54 bis 2,14 Sekunden. Littleroot hat 6 Menschen, Petalburg 7, Mauville 10, von denen 2, 3 und 6 kein Ausblende-Flag tragen.18
- Eine Routine besteht aus wenigen zeitlich festgelegten Punkten und einem Schlüssel; eine Erinnerung ist ein Flag pro Tag. Stardew Valley schreibt den Tag eines Dorfbewohners als Zeichenkette aus zeitlich festgelegten Punkten (Pierres normaler Tag hat 7) und wählt aus 22 Schlüsselformaten in drei Gruppen, welcher Tag gilt, wobei der erste Treffer gewinnt: ein Sonderschlüssel, der für alle geprüft wird, dann 5 Ehe-Formate für verheiratete Dorfbewohner, die keine anderen verwenden, oder 16 normale für alle anderen; einmal am Tag mit einem Dorfbewohner zu sprechen bringt +20 Freundschaft. Animal Crossing: New Horizons gibt +1 von 255 für das erste Gespräch des Tages und bringt eine Reaktion pro Tag bei.29101112
- Die Spuren anderer füllen eine leere Stadt, in festen Plätzen, und sie verfallen. Smaragds Record Mixing überträgt 5.188 Bytes der Welt eines anderen Spielers; auf der Begegnungsallee (Join Avenue) füllen Fans die Ladenplätze, die echte Besucher leer lassen, mit 75 % des Werts eines Besuchers (nach Serebiis Darstellung); die Bauwerke in Death Stranding werden „destroyed by Timefall after some time“ (nach einiger Zeit vom Zeitregen zerstört); Journey zeigt jeweils eine fremde Person, ohne Namen bis zum Abspann und mit einem einzigen Klang.413145
- Live-Präsenz ist ein Puffer, keine Senderate. Der von Fans gebaute Server-Emulator von Habbo schaltet jeden Raum in einem 500-ms-Zyklus weiter; Gaffer on Games puffert „3X the packet send rate“ (das Dreifache des Paketsendeintervalls); in einem Modell des Laufens in Kiradex mit den 3,75 und 7,5 Tiles pro Sekunde dieser Reihe ergibt eine Uhr, die andere Sammler 350 ms hinter der geschätzten Serverzeit zeichnet, bei bis zu 80 ms Jitter 0 Rückwärts-Frames und 0 ausgehungerte Frames, während 100 ms 125 bis 456 der 600 Frames aushungern lassen, die gezeichnet werden, solange der Sender sendet.15167
- Die Regeln für Kinder tragen Daten. Game Center beschränkt Kinder „to sending and receiving preset messages“ (auf das Senden und Empfangen vorgefertigter Nachrichten); Apples Dokumentation sagt, ein Spiel mit einer eigenen Mehrspielerfunktion „should disable it“ (sollte sie deaktivieren), wenn Screen Time Mehrspieler einschränkt; die geänderte COPPA-Regel, deren Einhaltung seit dem 22. April 2026 verlangt wird, schreibt eine schriftliche Richtlinie zur Datenaufbewahrung mit einer Löschfrist vor.171819
- Kiradex weicht heute an vier Stellen von seinem eigenen Plan ab. Die Sammler des Platzes bleiben stehen, wenn niemand im Raum ist, obwohl
server/app/npcs.pysagt „A town is never empty“ (Eine Stadt ist nie leer); sie gehen alle 1,0 s einen Schritt statt der konfigurierten 0,7 s; die App sendet eine Bewegung pro Tile (4 pro Sekunde beim Laufen, 6,0 bis 6,4 beim Rennen), wo die Begründung des Plans von 8 bis 10 Hz sprach; und nichts liest die Einschränkungs-Flags von Game Center, obwohl der Plan Identität und Kindersicherung auf Game Center aufbaut.62021222324 - Was das Kiradex bringt. Ein Briefing für acht Stadtbewohner mit Routinen, die an die Tageszeiten der App selbst gebunden sind, auf einer Uhr pro Raum und mit Positionen, die aus dieser Uhr berechnet werden; die Laufwege der letzten acht Besucher, als namenlose Echos in einer schlichten, vom Server gewählten Figur abgespielt, sieben Tage aufbewahrt und ohne ID gesendet; ein einmal täglicher Gruß, der nie verfällt; ein Renderpuffer von 350 ms; ein Satzbuch mit sechs Zweigen zu je 8 bis 12 ganzen Sätzen; und sieben Sicherheitseinstellungen, jede mit einer Prüfung, die ein Skript, ein Test oder eine Aufnahme bestehen oder nicht bestehen kann.7119
1. Stadtbewohner, vermessen: Smaragd, Stardew Valley und Animal Crossing
Jede kleine soziale Welt trifft in ihrer ersten Nacht auf dieselbe Frage: Was sieht ein Spieler, der auf den Platz kommt, wenn sonst niemand da ist? Der Kanon hat drei Antworten, und dieser Beitrag geht sie der Reihe nach durch. Die erste sind Stadtbewohner, die ihr eigenes Leben führen, sodass die Stadt belebt ist, ob jemand online ist oder nicht. Die zweite sind Spuren anderer Leute, hinterlassen von Spielern, die gerade nicht da sind. Die dritte ist gut gemachte Live-Präsenz, wenn Leute da sind, begrenzt durch die Regeln für eine Welt, in der sich Kinder aufhalten können. Die erste Antwort ist die älteste und am besten vermessene, weil der Quellcode eines ihrer Meisterwerke öffentlich ist.
Was die Menschen in Smaragd tun
Pokémon Smaragd-Edition wurde aus der Dekompilierung von pret gelesen, einem flachen Klon von pokeemerald bei Commit 731ad5b, und von einem Skript gezählt, measure_npcs.py, das die Konstanten der Bewegungstypen und die Objektereignisse jeder Stadtkarte liest.1 Smaragd definiert 81 Bewegungstypen, 0x00 bis 0x50. Gruppiert danach, was die Person auf dem Bildschirm tut, laufen 24 eine feste Schleife aus vier Abschnitten, 17 stehen und blicken (fest, wechselnd oder sich umschauend), 16 gehen, joggen oder rennen auf der Stelle, 8 ahmen den Spieler nach, 5 wandern zufällig innerhalb eines Bereichs, 4 gehen hin und her, 4 sind versteckt oder getarnt, und die letzten drei sind NONE, der Spieler und der Beerenbaum, der ein Objekt und keine Person ist.125
Die Städte nutzen nur wenige davon. Auf den 16 Stadtkarten gibt es 172 Objektereignisse, und nicht alle davon sind Menschen: 6 sind Itembälle, 2 sind Umzugswagen, 1 ist ein Boot und 5 sind Pokémon. Das Skript sortiert sie nach ihrer graphics_id und zählt die 158 Menschen für sich.18 Nur 11 der 81 Bewegungstypen kommen bei den Menschen vor. 113 der 158 (71,5 %) stehen und blicken, 43 (27,2 %) wandern innerhalb eines Bereichs und 2 (1,3 %) laufen auf der Stelle. Die häufigsten einzelnen Typen sind FACE_DOWN mit 32, FACE_RIGHT mit 23, LOOK_AROUND mit 20, FACE_UP mit 19 und WANDER_AROUND mit 17.18
Diese 158 sind nicht alle Bewohner. 58 von ihnen tragen ein Ausblende-Flag, ein Story-Flag, das sie von der Karte nimmt, und 41 dieser 58 verwenden den Sprite eines Schurkenteams, des Rivalen oder einer benannten Figur; die 58 sind also überwiegend Darsteller in den Szenen der Story, und 54 von ihnen stehen. Die 100 Menschen ohne Ausblende-Flag, die bei jedem Besuch auf der Karte sind, verteilen sich anders: 59 stehen und blicken, 39 wandern innerhalb eines Bereichs und 2 laufen auf der Stelle. Die Bewohner, die ein Spieler die meiste Zeit sieht, stehen also zu sechs Zehnteln und wandern zu knapp vier Zehnteln; die sieben Zehntel der Gesamtzahl entstehen erst, wenn man die Darsteller hinzunimmt, die fast alle stehen. Es handelt sich um Standard-Bewegungstypen, also um das, was eine Person tut, wenn kein Skript sie bewegt; ein Story-Skript kann eine stehende Person trotzdem gehen lassen, so wie der Junge an der Arena in Petalburg, der sich standardmäßig umschaut und kein Ausblende-Flag trägt, den Spieler zur Arena führt. Die Zählung beschreibt die Stadt im Ruhezustand, nicht jede Szene darin.18
Sechs von zehn der Stadtbewohner, die immer auf Smaragds Karten stehen, haben einen stationären Standard-Bewegungstyp, sieben von zehn, wenn man die entfernbaren Darsteller der Story mitzählt; die Wanderer bleiben in Feldern von ein oder zwei Zellen. Geskriptete Szenen, die jeden gehen lassen können, sind nicht mitgezählt.26
Drei Städte unterschiedlicher Größe zeigen dieselbe Form. Die Tabelle zählt nur Menschen; die ausgelassenen Objektereignisse sind die beiden Umzugswagen in Littleroot und drei Itembälle, zwei in Petalburg und einer in Mauville. Die letzte Spalte zählt die Menschen ohne Ausblende-Flag danach, was sie tun.1
| Stadt | Menschen | Stehen und blicken | Wandern in einem Feld | Wanderbereiche (x, y) | Mit Ausblende-Flag | Ohne Ausblende-Flag (stehen, wandern) |
|---|---|---|---|---|---|---|
| Littleroot | 6 | 3 (nach oben) | 3 (WANDER_AROUND) |
(1, 2), (2, 1), (2, 1) | 4 | 2 (0, 2) |
| Petalburg | 7 | 5 (2 schauen sich um, 2 nach oben, 1 nach unten) | 2 (1 ringsum, 1 auf und ab) | (1, 1), (0, 1) | 4 | 3 (2, 1) |
| Mauville | 10 | 8 (2 schauen sich um, 2 nach oben, 2 nach links, 1 nach rechts, 1 nach unten) | 2 (links und rechts) | (1, 1), (1, 0) | 4 | 6 (4, 2) |
Das Feld eines Wanderers wird Zelle für Zelle durchgesetzt: Vor jedem Schritt lehnt IsCoordOutsideObjectEventMovementRange jedes Ziel ab, das außerhalb des Bereichs des Objekts um seinen Platzierungspunkt liegt, sodass ein Wanderer um seine Heimatzelle kreist, statt umherzuziehen.27 Die Ausblende-Flags sind die andere Hälfte der Bevölkerung. Vier der 6 Menschen in Littleroot, vier der 7 in Petalburg und vier der 10 in Mauville tragen ein Flag, das sie entfernt, wenn die Story weitergeht; die Bevölkerung einer Stadt ist also eine Funktion des Spielfortschritts: Menschen gehen und kommen, weil etwas passiert ist.1
Wie oft sie sich bewegen
Das Timing steht in derselben Datei. Ein wandernder oder sich umschauender Stadtbewohner wartet vor seinem nächsten Schritt oder seiner nächsten Drehung 32, 64, 96 oder 128 Frames, zufällig aus sMovementDelaysMedium gewählt: 0,54, 1,07, 1,61 oder 2,14 Sekunden bei den 59,7275 Hz des Game Boy Advance, im Mittel 1,34. Dasselbe gilt für die beiden Blicktypen, die zwischen entgegengesetzten Richtungen wechseln, FACE_DOWN_AND_UP und FACE_LEFT_AND_RIGHT. Die Blicktypen, die zwischen zwei benachbarten Richtungen oder unter dreien wechseln, wählen aus sMovementDelaysShort, 32, 48, 64 oder 80 Frames, im Mittel 0,94 Sekunden, und die beiden drehenden Typen warten fest 48 Frames. Eine dritte Tabelle, sMovementDelaysLong, ist im Quellcode mit // Unused markiert, und kein Bewegungstyp liest sie.127
Der Schritt selbst ist der des Spielers. PlayerWalkNormal ruft GetWalkNormalMovementAction auf, dieselbe Aktion, die auch der Schritt eines Wanderers verwendet; MOVE_SPEED_NORMAL verweist auf sStep1Funcs, das 16 Frames lang 1 Pixel pro Frame bewegt, eine 16-Pixel-Zelle in 268 ms, 3,73 Zellen pro Sekunde. Rennen ist MOVE_SPEED_FAST_1, sStep2Funcs, 8 Frames pro Zelle, 134 ms, 7,47 Zellen pro Sekunde.127 Legt man die beiden Zeilen zusammen, ist ein Wanderer in jedem Zyklus aus Schritt und Wartezeit, 0,81 bis 2,41 Sekunden, für 268 ms in Bewegung: zwischen 11 und 33 Prozent der Zeit, pro ausgeführtem Schritt. Das ist eine Obergrenze. Ist die Richtung, die ein Wanderer wählt, blockiert, durch eine Wand oder den Rand seines Feldes, schickt MovementType_WanderAround_Step4 ihn zurück zum Blicken und Warten, ohne dass er sich bewegt; sein tatsächlicher Bewegungsanteil ist also niedriger. Den Rest der Zeit steht er oder dreht sich.127
Ein Wanderer in Smaragd bewegt sich in einzelnen Schritten zwischen langen Wartezeiten; die Sammler von Kiradex, gemessen in Abschnitt 6, bewegen sich in Schüben von je einem Tile, während sie eigentlich gehen sollten.26
Nach meiner Lesart tragen drei Details den Effekt. Nichts in der Stadt geht schneller oder langsamer als Sie, also wirkt nichts wie eine andere Art von Ding. Die Pausen sind länger als die Schritte, die Stadt besteht also aus Standbildern, die von Bewegung unterbrochen werden, weshalb sie mit 6 bis 10 Menschen nie überfüllt aussieht. Und die Bevölkerung ist über die Ausblende-Flags in die Story geschrieben, sodass sich die Stadt verändert, weil der Spieler etwas getan hat, nicht weil ein Timer ausgelöst wurde.
Smaragds Tag wird bei der Ankunft abgerechnet
Smaragd führt einen Tag, aber nicht mit einer Uhr, die läuft, während niemand spielt. Es reserviert 64 Plätze für Tages-Flags nach DAILY_FLAGS_START und nutzt 12 davon: neun Beerengeschenke (das einer Wettbewerbshalle, das des Beerenmeisters und seiner Frau, das von fünf Gebern auf Routen oder in Städten, das des Blumenladens), das Tages-Flag der Geheimbasis, das Lotterielos und FLAG_DAILY_APPRENTICE_LEAVES.228 Wenn der Spieler zurückkommt, läuft UpdatePerDay einmal mit der Zahl der vergangenen Tage, und während des Spiels läuft es auch aus DoTimeBasedEvents; es ruft der Reihe nach ClearDailyFlags, UpdateDewfordTrendPerDay, UpdateTVShowsPerDay, UpdateWeatherPerDay, UpdatePartyPokerusTime, UpdateMirageRnd, UpdateBirchState, UpdateFrontierManiac, UpdateFrontierGambler, SetShoalItemFlag und SetRandomLotteryNumber auf.23 Das Modewort, das Fernsehen und das Wetter bewegen sich alle nach vergangenen Tagen, berechnet im Moment der Rückkehr.3 Nichts ist passiert, während das Modul aus war; die Stadt tut so, als wäre etwas passiert.
Stardew Valley: Ein Tagesplan ist eine Zeichenkette
Stardew Valley ist die moderne Referenz für Stadtbewohner mit eigenem Leben. Die Seite „Villagers“ seines Wikis listet 6 Junggesellen, 6 Junggesellinnen, 22 Dorfbewohner, die man nicht heiraten kann, und 12, denen man nichts schenken kann, also 34 beschenkbare Dorfbewohner, und sagt: „Each villager has a daily routine, so they can be located in different sections of town depending on the in-game time of the day and weather.“ (Jeder Dorfbewohner hat einen Tagesablauf und ist daher je nach Tageszeit im Spiel und Wetter in verschiedenen Teilen der Stadt anzutreffen.)229
Die Routine ist Daten. Jeder Dorfbewohner hat eine Datei unter Content/Characters/schedules/, und jeder Eintrag ist eine Zeichenkette aus durch Schrägstriche getrennten Punkten, jeder Punkt <time> [location] <tileX> <tileY> [facing] [animation] [dialogue], mit der Zeit im 24-Stunden-Format ohne Doppelpunkt und der Blickrichtung 0 für oben, 1 rechts, 2 unten und 3 links.9 Abigails Mittwoch, wie die Seite ihn angibt, lautet 1000 ArchaeologyHouse 11 9 0/1800 Town 47 87 0/2200 SeedShop 1 9 3 abigail_sleep: drei Punkte, ein Fußweg zwischen je zweien und eine Animation am letzten.9 Pierre, der den Gemischtwarenladen führt, hat an einem normalen Tag 7 zeitlich festgelegte Punkte (6:00 Uhr an seiner Theke, 7:00 Uhr in den Gängen, 8:30 Uhr wieder an der Theke, dann 17:00, 19:00, 21:00 und 23:00 Uhr durch die Gänge, die Küche, ein Bücherregal und das Bett), und seine Seite listet 6 Varianten seines Tagesplans: Grüner Regen, der reparierte Bus am 15. Frühling, das Wüstenfest, Regen, Freitag und der normale Tag.230
Die Intelligenz steckt in den Schlüsseln. Welcher Tagesplan an einem bestimmten Tag läuft, entscheiden 22 Schlüsselformate in drei Gruppen, jede in fester Reihenfolge geprüft, der erste Treffer gewinnt. Ein Sonderschlüssel, GreenRain, wird „checked first, regardless of marriage status“ (zuerst geprüft, unabhängig vom Familienstand). Ein verheirateter Dorfbewohner probiert danach nur die 5 Ehe-Formate, von marriage_<festivalID> über ein Datum und marriageJob bis zum Wochentag: „Married NPCs don’t use any other schedule keys. If the marriage keys don’t match, they won’t have a schedule for that day.“ (Verheiratete NPCs verwenden keine anderen Tagesplanschlüssel; passt keiner der Ehe-Schlüssel, haben sie an diesem Tag keinen Tagesplan.) Jeder andere Dorfbewohner probiert die 16 normalen Formate, von <festivalID>, <season>_<dayofmonth>, <dayofmonth>_<hearts>, <dayofmonth>, bus, rain2 (eine „50% chance of applying on rainy days“, an Regentagen mit 50 % Wahrscheinlichkeit gültig) und rain über die Schlüssel aus Wochentag und Herzen und den Wochentag bis zu <season>, spring und schließlich default.29 Nach meiner Lesart hat ein Dorfbewohner also viele mögliche Tage, dieselben wenigen Punkte setzen sich neu zu einem Leben zusammen, und die Herz-Schlüssel bedeuten, dass ein Dorfbewohner, der Sie mag, einen anderen Tag verbringt. Der Hinweis der Seite zu den Einschränkungen verrät, wie der Tag berechnet wird: Wird ein NPC zu einem bestehenden Spielstand hinzugefügt, „they generally don’t follow their schedule correctly until you’ve slept once in-game (which triggers their first day update).“ (folgen sie ihrem Tagesplan meist erst richtig, wenn Sie im Spiel einmal geschlafen haben, was ihre erste Tagesaktualisierung auslöst.)9 Wie bei Smaragd wird der Tag in Stardew an der Tagesgrenze ausgerechnet, nicht fortlaufend vorangetrieben.
Freundschaft ist das tägliche Gedächtnis, und sie hat ihren Preis. Ein Herz sind 250 Punkte; „talking to them once per day (+20)“ (einmal täglich mit ihnen sprechen, +20) ist der erste Punkt auf der Liste des Wikis, wie man sie steigert; ein Dorfbewohner nimmt ein Geschenk pro Tag und zwei pro Woche an, ein Geburtstagsgeschenk zählt achtfach; und wer nicht spricht, verliert jeden Tag Punkte, 2 bei den meisten Dorfbewohnern und 10 nach einem Blumenstrauß, bis die Anzeige voll ist oder ihre Obergrenze erreicht, und 20 beim Ehepartner, bei dem der Verfall nie aufhört.10 Herz-Ereignisse, die geskripteten Szenen, öffnen sich bei Herz-Schwellen, und „most events can be viewed anytime (with some time restrictions) or out of order.“ (die meisten Ereignisse lassen sich jederzeit, mit einigen zeitlichen Einschränkungen, oder außer der Reihe ansehen.)10 Der Dorfbewohner wirkt auch auf Sie ein, während Sie fort sind: Bei 3 Herzen „will send you a recipe in the mail“ (schickt Ihnen Pierre ein Rezept per Post), und auf jeder Stufe über null kann er 250g oder mehr schicken.30
Animal Crossing: der Dorfbewohner, der weiß, dass Sie vorbeigekommen sind
New Horizons reduziert den Dorfbewohner, der weiß, dass Sie heute mit ihm gesprochen haben, auf einen einzigen Punkt. Freundschaft reicht von 0 bis 255 und beginnt bei 25; der erste Punkt auf Nookipedias Liste dessen, was sie steigert, ist „+1 point“ (+1 Punkt) für „speaking to the villager for the first time each day“ (das erste Gespräch mit dem Dorfbewohner an jedem Tag); ein Dorfbewohner nimmt ein Geschenk pro Tag an; und bei 150 Punkten hat ein Dorfbewohner eine Chance von 6 %, Ihnen zu einem Geschenk sein Foto zu geben, die um 0,04 % pro Punkt auf 10,2 % bei 255 steigt.11 Nach meiner Lesart ist das eher ein Flag als eine Anzeige, weil der Spieler nie sieht, wie sie sich bewegt.
Das sichtbare Leben der Dorfbewohner ist klein und gehört ihnen. Jeder hat eines von sechs Hobbys (Bildung, Mode, Fitness, Musik, Natur, Spielen), und in New Horizons „a villager always has one hobby that doesn’t change“ (hat ein Dorfbewohner immer ein Hobby, das sich nicht ändert); Dorfbewohner jagen Insekten und Fischen nach, „still will not catch either of them“ (fangen aber trotzdem keines von beiden), treiben Sport, lesen und singen zu einem nahen Musikspieler mit, und seit dem Update 2.0 „invite the player to their house, ask the player for an invitation“ (laden sie den Spieler zu sich ein, bitten den Spieler um eine Einladung) oder kommen zu „a random visit“ (einem zufälligen Besuch) vorbei.3132 Acht Persönlichkeiten prägen, was sie sagen, vier für männliche Dorfbewohner (faul, sportlich, griesgrämig und eingebildet) und vier für weibliche (normal, munter, hochnäsig und schwesterlich), von denen „Smug and big sister were introduced in New Leaf, with the other six being present since Doubutsu no Mori.“ (eingebildet und schwesterlich wurden in New Leaf eingeführt; die anderen sechs gibt es seit Doubutsu no Mori.)33
Die Städte blieben über die ganze Reihe klein.32
| Spiel | Dorfbewohner zu Beginn | Höchstzahl an Dorfbewohnern |
|---|---|---|
| Animal Crossing | 6 | 15 |
| Wild World | 3 | 8 |
| Let’s Go to the City (City Folk) | 6 | 10 |
| New Leaf | 5 | 10 |
| New Horizons | 2 (ein sportlicher und ein schwesterlicher, aus 83 möglichen) | 10 |
Wild World änderte auch das Tempo: Dort „the villagers walk at a much slower pace than the player“ (gehen die Dorfbewohner deutlich langsamer als der Spieler), was Let’s Go to the City beibehielt.32 Das ist das Gegenteil von Smaragds Regel, und nach meiner Lesart funktionieren beide aus demselben Grund: Ein Dorfbewohner, der schlendert, wirkt wie ein Bewohner, und ein Stadtbewohner, der in Ihrem Tempo einen Schritt macht und dann wartet, ebenfalls. Was den Effekt zerstört, ist eine Person, die sich in keinem der beiden Tempi bewegt, und das ist das Kiradex-Problem in Abschnitt 6.
Der vorgefertigte Ausdruck der Reihe ist die Reaktion, und sie ist selbst ein Geschenk der Stadtbewohner, in täglicher Ration. New Horizons hatte zu Version 1.0.0 44 Reaktionen und bis 2.0 weitere 44, insgesamt 88, und „The player can learn one Reaction per day,“ (der Spieler kann eine Reaktion pro Tag lernen), manche nur von bestimmten Persönlichkeiten oder bei hoher Freundschaft.212
2. Die Spuren anderer: Was eine Stadt füllt, wenn niemand online ist
Stadtbewohner halten eine Stadt belebt, aber es sind jeden Tag dieselben Leute. Die zweite Antwort ist die, zu der jedes untersuchte Spiel griff, wenn es eine leere Welt fürchtete: Man füllt sie mit Spuren echter Menschen, hinterlassen von Spielern, die jetzt nicht online sein müssen. Smaragd tat es mit einem Linkkabel.
Record Mixing: die Welt eines anderen Spielers, in festen Plätzen
Wenn zwei Smaragd-Spieler Record Mixing durchführen, sendet jedes Spiel dem anderen eine feste Struktur, PlayerRecordEmerald, mit 11 Arten von Datensätzen in 0x1444 Bytes, 5.188 insgesamt.434 Für das Gefühl, dass andere hier waren, zählen die Plätze: 20 Geheimbasen, 25 Fernsehplätze (5 normale und 20 weitere), 16 Nachrichten, 5 Modewörter und 2 Lehrlinge von den 4, die ein Spiel speichert.4 Nach meiner Lesart ist genau das der Sinn der Plätze: Ihre Stadt hat sich verändert, weil jemand anderes gespielt hat, mit den Basen, Sendungen und dem Modewort eines Freundes, die in Ihr Spiel getragen wurden.
Der klarste Fall ist eine einzelne Person. Im Pokémon-Center von Mauville steht ein alter Mann, einer von fünf (der Barde, der Hipster, der Händler, der Geschichtenerzähler und der Aufgekratzte, im Original the Bard, the Hipster, the Trader, the Storyteller und the Giddy). Welchen ein neues Spiel bekommt, wählt (trainerId % 10) / 2, mit dem eigenen Kommentar des Quellcodes „Determine man based on the last digit of the player’s trainer ID,“ (den Mann anhand der letzten Ziffer der Trainer-ID des Spielers bestimmen), und beim Record Mixing kopiert ReceiveOldManData den alten Mann des Partners über Ihren.435 Der Bewohner Ihrer Stadt ist buchstäblich der Stadtbewohner eines anderen Spielers.
Der Hipster rationiert Vokabular nach Kontakt. Sein Skript setzt FLAG_UNLOCKED_TRENDY_SAYINGS und bringt ein Wort bei, wenn sein taughtWord false ist, und setzt es dann auf true; der einzige Aufruf, der es wieder auf false setzt, ResetHipsterFlag über ResetMauvilleOldManFlag, erfolgt an genau einer Stelle, am Ende von ReceiveOldManData in record_mixing.c.35 Ein Modewort wird also jedes Mal einmal freigeschaltet, wenn Record Mixing den Hipster bringt, plus einmal für einen Spieler, der mit ihm beginnt, und das ist nach der Auswahlregel ein Spieler, dessen Trainer-ID auf 2 oder 3 endet. Der erste Beitrag dieser Reihe formuliert die Regel genauso.3635 Das Vokabular wächst, indem man Leute trifft, nicht durch Warten.
Das Modewort, in Arithmetik
Das Modewort, zwei Easy-Chat-Wörter, die die Stadt Dewford als aktuelle Redewendung behandelt, ist die einzige Spur, die Smaragd bewertet. Sein Quellkommentar sagt, dass eine Redewendung, die „boring“ (langweilig) ist, „lose trendiness over time until it reaches 0, at which point it will stop being boring and gain trendiness until it reaches maxTrendiness (then it becomes boring again and the cycle repeats).“ (mit der Zeit an Beliebtheit verliert, bis sie 0 erreicht; dann hört sie auf, langweilig zu sein, und gewinnt an Beliebtheit, bis sie maxTrendiness erreicht, worauf sie wieder langweilig wird und der Zyklus sich wiederholt.)37 Der Höchstwert einer Redewendung wird durch bis zu drei verschachtelte Random() % 98-Ziehungen zwischen 30 und 127 bestimmt. Nimmt man jede Ziehung als unabhängig und gleichverteilt über ihre 98 Werte, liegt der Mittelwert des Höchstwerts bei 62,9, und 81,3 % der Höchstwerte liegen bei 80 oder darunter; der Startwert ist gleichverteilt zwischen 30 und dem Höchstwert, im Mittel 46,5; und der Wert bewegt sich pro vergangenem Tag um 5, abgerechnet in UpdatePerDay wie alles andere.383 Diese Zahlen sind eine Näherung an den Code, nicht seine exakte Ausgabe: Random() liefert 16 Bit, ein Rest zwischen 0 und 71 kommt also 669-mal in 65.536 vor, einer zwischen 72 und 97 dagegen 668-mal, und aufeinanderfolgende Ziehungen stammen aus einem einzigen Generator, nicht aus unabhängigen Würfeln. Gewichtet man die Reste so, weiterhin unter der Annahme unabhängiger Ziehungen, ändert sich keine der beiden Zahlen in der ersten Nachkommastelle.3837 Als stetige Rate gerechnet steigt eine Redewendung mit Höchstwert 30 in 12 Tagen von null auf ihren Höchstwert und fällt zurück, eine mit Höchstwert 64 in 25,6 und eine mit Höchstwert 127 in 50,8. Das Spiel bewegt den Wert in ganzen Tagen, und ein Wert, der über seinen Höchstwert oder unter null hinausginge, prallt um den Rest zurück, sodass sich die Tageswerte nicht in diesen gebrochenen Perioden wiederholen: Tag für Tag nachgebaut, ab einem Wert von null und steigend, wiederholt sich die exakte Folge erstmals nach 12, 128 und 254 Tagen.3837 Bis zu 5 Modewörter werden gespeichert, und beim Mischen „their own trends are replaced with their mixing partner’s, unless the phrase is the same, in which case the version with a higher trendiness value is used.“ (werden die eigenen Modewörter durch die des Mischpartners ersetzt, außer bei derselben Redewendung; dann wird die Version mit dem höheren Beliebtheitswert verwendet.)3837
Ein Modewort ist ein langsames Zickzack, einmal am Tag abgetastet: 81,3 % der Höchstwerte liegen bei 80 oder darunter, ein Anstieg und Abfall von etwa 32 Tagen oder weniger.2638
Nach meiner Lesart ist das die richtige Form für eine Spur, die eine Stadt davor bewahren muss, schal zu werden: Sie steigt, sie fällt, ihre Lebensdauer steht bei ihrer Geburt fest, und der Kontakt mit einem anderen Spieler kann sie durch etwas Frischeres ersetzen.
Easy Chat gegen den Union-Raum
Smaragd hatte zwei Wege, auf denen Spieler etwas sagen konnten, und sie sind die beiden Enden der Sicherheitsargumentation dieses Beitrags. Der Union-Raum (Union Room), die lokale Drahtlos-Lobby des Spiels, zeigt 8 Gruppenleiter, fasst 5 Spieler pro Drahtlosgruppe (RFU_CHILD_MAX, 4, plus einen), zeichnet 40 Sprites und definiert 30 Aktivitätscodes. Sein Chat wird getippt: vier Tastaturseiten (UPPER, LOWER, EMOJI, REGISTER), 15 Zeichen pro Nachricht (MAX_MESSAGE_LENGTH) und 10 registrierte Phrasen im Spielstand (UNION_ROOM_KB_ROW_COUNT).439 Meine Lesart ist, dass getippter Chat dort tragbar war, weil jeder im Raum in Funkreichweite von Ihnen war.
Alles andere, was Spieler einander sagten, lief über Easy Chat. Es hat 22 Gruppen und insgesamt 1.815 Einträge. Von Anfang an offen sind Trainer (27, davon 6 deaktiviert), Status (109), Kampf (63), Grüße (42), Leute (75), Stimmen (63), Rede (60), Endungen (69), Gefühle (69), Zustände (69), Aktionen (78), Lebensstil (45), Hobbys (54), Zeit (45), Verschiedenes (42) und Adjektive (36), dazu eine Namensliste mit 202 Einträgen, von denen jeder erst öffnet, wenn der Spieler die betreffende Art gesehen hat; gesperrt sind Ereignisse (29) und zwei Attackenlisten (154 und 200), bis das Spiel durchgespielt ist, das Modewort (33) bis zum Flag des Hipsters, und eine nationale Namensliste mit 251 Einträgen.3840 Ohne die 6 deaktivierten Trainer-Einträge, die kein Spieler wählen kann, sind das 940 Wörter, Namen nicht mitgezählt, offen ab der ersten Stunde. Ein switch in easy_chat.c entscheidet, welche Gruppen freigeschaltet werden, und ein zweiter entscheidet über jeden Eintrag: ein Name danach, ob seine Art gesehen wurde, jedes andere Wort nach seinem enabled-Feld.3840 Phrasen sind feste Raster: Ein Profil ist 2 mal 2, 4 Plätze; eine Kampferöffnung 2 mal 3, 6; Post 2 mal 5, 10 Plätze für bis zu 9 Wörter; das Modewort und der gute Spruch 2 mal 1; der Fragebogen 2 mal 2, 4 Wörter.3840
Ein kombinierbares Vokabular von 940 Wörtern ist ausdrucksstark, und nach meiner Lesart ist es auch ein Vokabular, aus dem ein entschlossenes Kind alles Mögliche buchstabieren kann. Genau diesen Tausch lehnt das Kiradex-Briefing in Abschnitt 7 ab: ganze Sätze, niemals Wörter.
Die Spuren Fremder in anderen Spielen
Jedes andere untersuchte Spiel, das eine leere Welt fürchtete, griff zu anderen Spielern, die meisten zu den Spuren, die Spieler hinterlassen. Die Quellen sind unterschiedlich belastbar, und jeder Absatz nennt seine eigene.
Dark Souls (FromSoftware, 2011). Wikipedia, mit Verweis auf seine eigene Quelle: „The player can see ghostly images of other players, activate bloodstains that show how other players died, and leave messages using preset phrases.“ (Der Spieler kann geisterhafte Bilder anderer Spieler sehen, Blutflecken aktivieren, die zeigen, wie andere Spieler gestorben sind, und mit vorgefertigten Phrasen Nachrichten hinterlassen.)41 Der Daily Telegraph verlieh ihm die Auszeichnung „Best Integration of Online Features“ (beste Integration von Online-Funktionen).41 Die Seite von Bandai Namco Europe zum Remaster nennt „The Way of the Multiplayer (up to 6 players with dedicated servers)“ (der Weg des Mehrspielermodus, bis zu 6 Spieler mit dedizierten Servern) unter den Hauptmerkmalen und sagt nichts weiter über die Ebene der Geister und Nachrichten; FromSoftwares eigene Beschreibung war nicht erreichbar.42 Die Seite sagt nicht, ob die geisterhaften Bilder Spieler wiedergeben, die gegangen sind, oder Spieler zeigen, die in diesem Moment verbunden sind; sie führt sie, mit den Blutflecken und den Nachrichten, unter den „online features“ (Online-Funktionen) auf, die das Spiel in „the single-player world“ (die Einzelspielerwelt) „integrates“ (integriert), und stellt „Direct multiplayer“ (direkten Mehrspielermodus), also Beschwörungen und Invasionen, in den nächsten Satz.41
Journey (thatgamecompany, 2012). Wieder Wikipedia: „In each level, the player may come across one other player temporarily connected to their game“ (in jedem Level kann der Spieler einem anderen Spieler begegnen, der vorübergehend mit seinem Spiel verbunden ist); die beiden „cannot communicate via speech or text and cannot see each other’s names until after the game’s credits“ (können weder per Sprache noch per Text kommunizieren und sehen die Namen des anderen erst nach dem Abspann); „The only form of communication between the two is a musical chime.“ (Die einzige Form der Kommunikation zwischen beiden ist ein musikalischer Klang.) Die Entwickler „felt having text or voice communication or showing usernames would allow players’ biases and preconceptions to come between them and the other player.“ (meinten, Text- oder Sprachkommunikation oder angezeigte Benutzernamen würden die Vorurteile und vorgefassten Meinungen der Spieler zwischen sie und den anderen Spieler treten lassen.)5 Das ist die Sicherheitsargumentation in Form eines Designs, gemacht für Erwachsene.
Death Stranding (Kojima Productions, 2019). Sonys Seite: „Donate valuable resources to rebuild structures in your world and others’, and offer likes in support of player structures that appear in yours.“ (Spenden Sie wertvolle Ressourcen, um Bauwerke in Ihrer und in fremden Welten wieder aufzubauen, und vergeben Sie Likes für Bauwerke anderer Spieler, die in Ihrer Welt erscheinen.)43 Wikipedia ergänzt, dass Spieler „can leave supplies, structures, and messages that can be viewed and used by other players, although structures will eventually be destroyed by Timefall after some time“ (Vorräte, Bauwerke und Nachrichten hinterlassen können, die andere Spieler sehen und nutzen können, wobei Bauwerke nach einiger Zeit vom Zeitregen zerstört werden), und dass „The player does not directly encounter other players in the world.“ (der Spieler anderen Spielern in der Welt nicht direkt begegnet.)14 Spuren verfallen, sodass die Welt nicht verschlammt.
Splatoon (Nintendo, 2015). Die Miiverse-Beiträge der Spieler „appear in-game as graffiti on various buildings“ (erscheinen im Spiel als Graffiti an verschiedenen Gebäuden), so Wikipedia mit Verweis auf seine Quelle. Die Graffiti stammten aus Beiträgen in der Miiverse-Community des Spiels; nach meiner Lesart hing die Spur also an Nintendos Miiverse-Dienst und nicht am eigenen Online-Spiel.44
Die drei späteren Pokémon-Funktionen stützen sich auf eine einzige Quelle, Serebii, eine langjährige Fanseite; die Seiten von pokemon.com zu Schwarze Edition 2 und Weiße Edition 2 und zu Sonne und Mond erwähnen weder die Begegnungsallee noch die Festival-Plaza, und keine Herausgeberseite zu den Arenen in GO wurde gespeichert; lesen Sie die nächsten drei Absätze daher als Serebiis Darstellung, nicht als die des Herausgebers.45
Begegnungsallee (Join Avenue, Pokémon Schwarze Edition 2 und Weiße Edition 2, 2012). Nach Serebii „starts off as an empty pathway“ (beginnt die Allee als leerer Weg), und Leute kommen, um Läden zu eröffnen, was „is done automatically whenever you connect with someone“ (automatisch geschieht, wann immer Sie sich mit jemandem verbinden), per PassBy, Infrarot, Union-Raum, Wi-Fi, GTS und anderem. Es gibt acht Läden; „every 10th person shown to the shop, the shop will rank up“ (mit jeder zehnten Person, die zum Laden geführt wird, steigt der Laden eine Stufe auf), bis Rang 10, mit „discounts of 1% for every rank up“ (1 % Rabatt pro Stufe) bis zu „a 40% discount“ (40 % Rabatt); normale Besucher sind „from 100 to 200 points“ (100 bis 200 Punkte) wert; und nach den Top Vier „various fans will come and visit“ (kommen verschiedene Fans zu Besuch), und „If you help a fan rather than another player, they will give 75% of the normal popularity points.“ (Helfen Sie einem Fan statt einem anderen Spieler, gibt er 75 % der normalen Beliebtheitspunkte.)13 Nach meiner Lesart ist das im Kanon die klarste Formulierung einer Ersatzregel: Platzhalter füllen die Plätze, die echte Menschen leer lassen, und sie sind etwas weniger wert.
Festival-Plaza (Pokémon Sonne und Mond, 2016). Nach Serebii „will propogate itself with players you will find online and locally“ (sic; füllt sich die Plaza mit Spielern, die Sie online und lokal finden), und „This is not limited to people on your friend list“ (das ist nicht auf Personen auf Ihrer Freundesliste beschränkt); Gäste, die etwas wollen, sagen es, zahlen Festival-Münzen, wenn Sie helfen, und ein Gast, dem geholfen wurde, kann zum VIP gemacht werden, wodurch er „more likely to appear in your plaza in the future“ (künftig eher auf Ihrer Plaza erscheint); der Plaza-Rang kostet auf Stufe 1 6 Münzen und ab Stufe 101 300.46 Präsenz durch Avatare: Womit Sie interagieren, ist der Avatar eines anderen Spielers, und Serebii beschreibt die Menschen dahinter als „all players that are also playing online“ (alle Spieler, die ebenfalls online spielen), die „when they see you“ (wenn sie Sie sehen) Sie zu „challenge you to battles or request trades“ (Kämpfen herausfordern oder um Tausch bitten) können. Nach dieser Darstellung stehen die Figuren der Plaza für Spieler, die selbst online sind; zusammen mit Journey ist sie eine der beiden Funktionen dieser Liste, die die Quellen als Live-Präsenz statt als Spur beschreiben.46
Pokémon GO, Arenen (die Überarbeitung von 2017). Nach Serebii fasst eine Arena bis zu sechs Verteidiger; jeder verlorene Kampf senkt die Motivation eines Verteidigers, und „Once their Motivation has dropped to 0, then they are removed from the Gym“ (sobald ihre Motivation auf 0 gefallen ist, werden sie aus der Arena entfernt); Beeren stellen sie wieder her; und ein Verteidiger verdient alle 10 Minuten 1 Münze, „capped at 50 Coins earned a day.“ (mit einer Obergrenze von 50 Münzen pro Tag.)47 Der Ort zeigt den Begleiter eines anderen Spielers, während dieser fort ist, und er verfällt, wenn die Gemeinschaft ihn nicht füttert.
Das gemeinsame Muster, nach meiner Lesart aller acht: eine kleine feste Zahl von Plätzen (8 Läden, 6 Verteidiger, 1 Begleiter, 20 Basen), Spuren, die verfallen oder rotieren (Zeitregen, Motivation, der Zyklus des Modeworts), Platzhalter, die weniger wert sind als Menschen, und, abgesehen von den Kämpfen und Tauschanfragen der Festival-Plaza, kein Live-Kanal zwischen Fremden jenseits einer vorgefertigten Phrase oder eines Klangs.
3. Live-Präsenz: Raten, Puffer und das Vorbeigehen
Die dritte Antwort ist die, an die man zuerst denkt: Wenn andere Spieler online sind, zeigt man sie, in Bewegung, auf demselben Platz. Zwei kleine soziale 2D-Welten, Habbo und Club Penguin, zeigen die beiden Enden der Präsenz auf einem Raster. Keines der beiden Unternehmen hat seine Raten veröffentlicht. Was ich habe, sind zwei quelloffene Fan-Server und ein Fan-Client, geschrieben, um mit den Original-Clients kompatibel zu sein; die folgenden Zahlen belegen also, was diese Clients erwarteten, nicht Zahlen, die Sulake oder Disney veröffentlicht hätten.154849
Habbo: ein Schritt pro Serverzyklus
Arcturus Morningstar, eine quelloffene Neuimplementierung des Habbo-Servers, betreibt jeden Raum in einem festen 500-ms-Zyklus (scheduleAtFixedRate(this, 500, 500, TimeUnit.MILLISECONDS)) und ruft das cycle jeder laufenden Einheit einmal pro Raumzyklus auf; einen Avatar markiert es bei IDLE_CYCLES = 240, also 120 Sekunden, als untätig, und einen Nicht-Besitzer entfernt es bei IDLE_CYCLES_KICK = 480, also 240 Sekunden.15 Nitro, ein quelloffener Habbo-Client, bewegt ein Raumobjekt über ein festes DEFAULT_UPDATE_INTERVAL von 500 ms: Bei jeder Aktualisierung vom Server nimmt es die Änderung zur neuen Position und interpoliert linear nach der verstrichenen Zeit geteilt durch 500, am Ende begrenzt, und setzt die Änderung dann auf null.49 Dass ein Zyklus genau ein Tile ist, ist meine Lesart beider zusammen (eine Serverperiode von 500 ms, gezeichnet als lineare Interpolation über 500 ms); ich habe das RoomUnit des Servers nicht gelesen, um es zu bestätigen. Trifft die Lesart zu, liegt das Rendering konstruktionsbedingt eine Serverperiode zurück, sodass ihm nie die Daten ausgehen, solange der Server Schritt hält.
Club Penguin: ein Ziel, kein Datenstrom
Houdini, ein quelloffener Club-Penguin-Server des Solero-Projekts, zeigt ein anderes Design. Eine Bewegung ist eine sp-Nachricht, die ein Ziel, x und y, trägt und unverändert an den Raum weitergeleitet wird; der Client geht selbst dorthin. Eine Safe-Chat-Zeile ist eine ss-Nachricht, die eine Zahl trägt, und die anderen Arten vorgefertigter Rede reisen genauso: sj für einen Witz, sma für die Nachricht eines Maskottchens, sl für eine Bühnenzeile, sg für die Zeile eines Fremdenführers, se für ein Emote, jede als ID weitergeleitet.48 Der Server begrenzt Emotes und Aktionen auf eine pro Sekunde und Wechsel der Zeichnung auf einen pro halbe Sekunde, und ein Heartbeat-Task prüft die verbundenen Clients alle 61 Sekunden und schließt alle, die in dieser Zeit keinen Heartbeat gesendet haben.48 Bewegung geschieht per Klick auf ein Ziel, nicht pro Tile, und Rede ist eine Zahl, die auf der anderen Seite nachgeschlagen wird; nach meiner Lesart musste ein Wortfilter deshalb das meiste von dem, was gesagt wurde, nie zu sehen bekommen.
Keine der beiden Welten sendet mit den 10 bis 60 Aktualisierungen pro Sekunde der Physikdemonstrationen weiter unten.16 In einer Welt, in der Menschen von Tile zu Tile gehen, ist der Schritt oder das Ziel die Aktualisierung.
Gaffer on Games: zurückliegend rendern, zwischen zwei bekannten Punkten
Die Methode, die die Client-Seite bestimmt, legt Glenn Fiedler in „Snapshot Interpolation“ dar (Gaffer on Games, 30. November 2014). Puffern, was ankommt, und zwischen zwei verzögerten Aktualisierungen rendern: „In effect, we’ve traded a small amount of added latency for smoothness.“ (Im Grunde haben wir ein wenig zusätzliche Latenz gegen Flüssigkeit getauscht.)16 Seine Faustregel für die Verzögerung lautet „enough delay so that I can lose two packets in a row and still have something to interpolate towards“ (genug Verzögerung, dass ich zwei Pakete hintereinander verlieren kann und trotzdem noch etwas habe, auf das ich hin interpolieren kann); bei 2 bis 5 % Paketverlust funktioniert am besten, was „is 3X the packet send rate. At 10 packets per-second this is 300ms,“ (das Dreifache des Paketsendeintervalls ist, bei 10 Paketen pro Sekunde 300 ms), plus ein oder zwei Frames für Jitter, weshalb seine Demonstrationen mit 350 ms liefen. Bei „30 snapshots per-second“ (30 Snapshots pro Sekunde) kostet derselbe Schutz 150 ms, und „60 packets per-second needs only 85ms.“ (60 Pakete pro Sekunde brauchen nur 85 ms.)16 Extrapolation, also das Vorausraten, „doesn’t work very well for rigid bodies because their motion is non-linear and unpredictable.“ (funktioniert bei Starrkörpern nicht sehr gut, weil ihre Bewegung nichtlinear und unvorhersehbar ist.)16
Der Platz von Kiradex läuft über WebSockets zu einem FastAPI-Server,23 und WebSockets laufen über TCP, wo nichts verloren geht, ein erneut gesendetes Paket aber verspätet ankommt. Nach meiner Lesart macht das Jitter statt Verlust zum Budget einer WebSocket-Welt, und es macht einen Läufer auf einem Raster zum einfachen Fall für Fiedlers Methode: Ein Läufer auf einem Raster bewegt sich in geraden Linien zwischen Tile-Mittelpunkten und bleibt abrupt stehen, es gibt also nichts zu extrapolieren und nichts Nichtlineares zu verbergen.
Ein Modell des Vorbeigehens
Um den Puffer für Kiradex zu bemessen, habe ich einen anderen Sammler simuliert, der vorbeigeht, mit der Logik des Rigs der App, wie ich sie am 5. Oktober gelesen habe. Das Skript, measure_remote_walk.py, modelliert zwei Dinge. Erstens das heutige Verhalten, in der eigenen Arithmetik des Rigs: Der progress eines Schritts ist ein 32-Bit-Float, der in jedem Frame um Float(deltaTime) mal 4 Tiles pro Sekunde wächst; jede eingehende Bewegung plant neu ab dem letzten ganzen Tile des Läufers und setzt den laufenden Schritt auf null zurück, auch mitten im Schritt; ein Pfad von mehr als 6 Tiles wird übersprungen; und der Läufer wird auf ganzen Pixeln gezeichnet. Das Rig zeichnet jeden anderen Sammler mit den 4 Tiles pro Sekunde des Laufens, weil nur der eigene Laufweg des Spielers je als Rennen markiert wird. Zweitens die Alternative: Snapshot-Interpolation auf einer gleichmäßigen Renderuhr, der geschätzten Serverzeit minus einer Verzögerung von 100 bis 350 ms, gezeichnet zwischen den beiden empfangenen Aktualisierungen, deren Zeitstempel die Renderuhr einschließen.750 Für das heutige Rig sendet der Sender eine Bewegung pro abgeschlossenem Tile mit den heute gemessenen Raten: alle 250 ms beim Laufen mit 4 Tiles pro Sekunde und alle 156 ms beim Rennen mit 6,4, der Nennrate des Rennens (der Bewegungsbeitrag dieser Reihe modelliert das Rennen der App bei 60 Hz mit 6,0 Tiles pro Sekunde, weil der Überschuss jedes Tiles verworfen wird). Für den Puffer bewegt sich der Sender außerdem nach dem Bewegungsvertrag der Reihe, dem Briefing des Bewegungsbeitrags mit 16 Ticks pro Tile beim Laufen und 8 beim Rennen bei 60 Hz, also 3,75 und 7,5 Tiles pro Sekunde, worauf Abschnitt 7 hinarbeitet. Das Netzwerk fügt gleichverteilten Jitter von 0, 30 oder 80 ms hinzu, und es werden 60 Frames pro Sekunde für 10 Sekunden Laufen gezeichnet.72122
Die Arithmetik zählt. In 32 Bit ergeben 15 Frames zu 1/60 Sekunde bei 4 Tiles pro Sekunde in der Summe genau 1,0, ein Schritt dauert also 15 Frames, genau die 250 ms des Senders; in 64-Bit-Arithmetik ist dieselbe Summe 0,9999999999999999, der Schritt dauert 16 Frames, und ein so geschriebenes Modell findet auf einem gleichmäßigen Laufweg Rücksprünge, die die eigene Arithmetik des Rigs nicht erzeugt.7
Das ist ein Modell, und seine Annahmen sind der Grund, seine Zahlen als Bemessungshilfe und nicht als Ergebnis zu behandeln. Es nimmt eine gerade, offene Straße an, sodass die Länge eines Pfads die Manhattan-Distanz ist; ein diagonaler Schritt, der im Rig √2-mal so lange dauert, ist nicht modelliert; der Jitter ist gleichverteilt; das deltaTime jedes Frames ist genau 1/60 Sekunde, während es auf einem Telefon schwankt; die 32-Bit-Operationen laufen in der Reihenfolge des Codes ohne fused multiply-add; nichts darin wurde von zwei Geräten aufgenommen. Ob ein gleichmäßiger Laufweg ohne Jitter auf einem Telefon je zurückspringt, kann das Modell daher nicht klären: Eine Framezeit, die um ein Haar von 1/60 abweicht, kann einen Schritt um eine Rundung unter 1,0 lassen. Das Zurücksetzen selbst, das immer ausgelöst wird, wenn eine Bewegung mitten im Schritt eintrifft, ist eine Lesart des Quellcodes, kein Modellergebnis. Die Pufferhälfte nimmt außerdem zwei Dinge an, von denen ihr Ergebnis abhängt: Die Schätzung der Serveruhr durch den Renderer ist exakt, und eine Aktualisierung braucht über ihren Jitter hinaus keine Zeit, um anzukommen. Ein echter Client muss die Serveruhr schätzen, und jeder Fehler in dieser Schätzung oder jede stetige Einwegverzögerung, die sie nicht berücksichtigt, geht direkt vom Puffer ab.7
Im Modell zeichnet das heutige Rig einen vorbeigehenden Sammler rückwärts, wenn eine Bewegung mitten im Schritt eintrifft, bei jedem Rennen und bei jedem Laufweg mit Jitter; bei den Geschwindigkeiten des Bewegungsvertrags tut ein 350-ms-Puffer das nie und hungert nie aus.26
Das heutige Rig zeichnet den Läufer beim Laufen ohne Jitter sauber: Jeder Schritt endet im Frame, bevor die nächste Bewegung eintrifft, also gibt es auf 40 Tiles 0 Rücksprünge, 0 Sprünge und 0 Rückwärts-Frames. Jitter zerstört das. Bei 30 ms treffen 13 Bewegungen mitten im Schritt ein und setzen ihn zurück, 7 davon spät genug im Schritt, um den Läufer rückwärts zu zeichnen, und 1 Pfad ist lang genug für einen Sprung; bei 80 ms sind es 25 Zurücksetzungen, 16 Rückwärts-Frames und 2 Sprünge. Beim Rennen ist der Sender schneller als die 4 Tiles pro Sekunde, mit denen das Rig ihn zeichnet, sodass bei jedem getesteten Jitter 45 der 64 Bewegungen mitten im Schritt eintreffen, jede mit einem Rückwärts-Frame, bei 9 Sprüngen. Immer wenn er zurückspringt, fällt der gezeichnete Läufer um bis zu 5,9 bis 6,7 Tiles hinter den Sender zurück, bevor ein Sprung ihn nach vorn bringt; auf dem gleichmäßigen Laufweg liegt er nie ein volles Tile zurück (höchstens 0,94).7 Ein Rücksprung zeichnet den Läufer um so viel vom Schritt zurück, wie bereits gezeichnet war, in diesen Läufen bis zu 14 Pixel auf einem 16-Pixel-Tile.750
Mit Puffer bewegt sich der Läufer nie rückwärts: 0 Rückwärts-Frames in allen 60 gepufferten Läufen, vier Geschwindigkeiten mal drei Jitter mal fünf Verzögerungen. Die Frage ist nur, wie oft der Renderer nichts hat, worauf er zeichnen kann, gezählt über die 600 Frames, die gezeichnet werden, solange der Sender noch sendet. Beim Laufen des Bewegungsvertrags mit 3,75 Tiles pro Sekunde hungert eine Renderuhr, die 300 ms zurückliegt, bei 0, 30 und 80 ms Jitter 0, 0 und 27 Frames aus; 325 ms hungern 0, 0 und 6 aus; 350 ms keinen. Mit 100 ms Rückstand hungern in jedem Fall bei diesen Geschwindigkeiten 125 bis 456 Frames aus. Beim Rennen mit 7,5 hungern 300 ms und mehr bei jedem getesteten Jitter 0 Frames aus. Bei den heutigen 4 und 6,4 Tiles pro Sekunde hungert dasselbe Modell beim Laufen mit 300 ms 0, 0 und 7 aus und bei 325 oder 350 keinen.7 Nach meiner Lesart ist eine Renderuhr 350 ms hinter der geschätzten Serverzeit die Zahl, und der Grund ist eine Schranke, keine Zählung. Bei einer Bewegung pro Tile trägt die Aktualisierung, die ein Frame braucht, einen Zeitstempel höchstens einen Schritt nach der Renderuhr und trifft höchstens den schlimmsten Jitter nach ihrem Zeitstempel ein. Bei 3,75 Tiles pro Sekunde ist ein Schritt 1/3,75 Sekunde lang, 266,7 ms, und ein Schritt plus 80 ms Jitter sind 346,7 ms; bei exakter Uhr hungert eine Verzögerung von 350 ms also bei keiner Jitter-Ziehung bis 80 ms einen Frame aus, mit 3,3 ms Reserve.7 Diese 3 ms sind der gesamte Spielraum für die Uhrschätzung: Eine Schätzung, die der Serveruhr um mehr als etwa 3 ms vorausläuft, verliert die Garantie und kann Frames aushungern. Die obigen Zahlen stammen aus einer einzigen Jitter-Ziehung, Seed 1, und 325 ms erfüllten in dieser Ziehung die Schwelle, die Abschnitt 7.4 setzt, mit 4 Frames Abstand, aber nicht in jeder Ziehung: Erneut über die Seeds 1 bis 200 ausgeführt, beim Laufen mit 3,75 Tiles pro Sekunde und 80 ms Jitter, hungerten 325 ms in allen 200 Frames aus und in 8 davon mehr als 10, während 350 ms in keiner aushungerten.7 350 ms sind auch die Verzögerung, mit der Fiedlers eigene Demonstrationen liefen. Bei einer Bewegung pro Tile ist das etwas mehr als ein Laufschritt Verzögerung, ein Schritt dauert bei 3,75 Tiles pro Sekunde 267 ms, und damit Fiedlers „3X the packet send rate“, umgedreht für eine Welt, in der die Pakete Schritte sind und über TCP verspätet statt gar nicht ankommen.16
4. Das Handwerk als Regeln mit Zahlen
Jede Regel unten geht auf eine Messung oder eine zitierte Quelle weiter oben zurück. Wo eine Regel meine Synthese mehrerer Quellen ist, sagt die Quellenspalte, welcher.
| Element | Regel | Quelle |
|---|---|---|
| Wer sich bewegt | Von den Stadtbewohnern, die immer da sind, haben etwa sechs von zehn einen stationären Standard-Bewegungstyp, stehen an einem Posten und blicken in eine Richtung oder schauen sich um, und knapp vier von zehn wandern in einem Feld von ein oder zwei Zellen um ihren Posten. Darsteller der Story, die kommen und gehen, stehen meist, was die Gesamtzahl auf sieben von zehn und eins von vier verschiebt. | Smaragds 100 Menschen ohne Ausblende-Flag: 59 stehen, 39 wandern, 2 laufen auf der Stelle; alle 158: 113 und 43; Bereiche 1 oder 2 Zellen1 |
| Tempo | Ein Stadtbewohner macht einen Schritt im Tempo des Spielers und wartet dann länger, als der Schritt gedauert hat: ein Schritt von 268 ms, dann 0,54, 1,07, 1,61 oder 2,14 s, zufällig gewählt. Ein langsameres Schlendern funktioniert auch (Wild World); ein Tempo, das keines von beiden ist, nicht. | Smaragds gemeinsame Laufaktion und Verzögerungstabelle1; Wild World32 |
| Bewegungsanteil | Ein Wanderer ist höchstens 11 bis 33 Prozent der Zeit in Bewegung, pro ausgeführtem Schritt; ein blockierter Schritt blickt nur und wartet. | Smaragd, Arithmetik auf den beiden Zeilen oben; eine Obergrenze127 |
| Bevölkerung | Sechs bis zehn Menschen ergeben eine Stadt; die ganzen Dörfer von Animal Crossing kommen auf höchstens 8 bis 15. | Littleroot 6 Menschen, Petalburg 7, Mauville 10, von denen 2, 3 und 6 kein Ausblende-Flag tragen1; Animal-Crossing-Dörfer, höchstens 8 bis 1532 |
| Wandel | Manche Stadtbewohner gehen und kommen mit dem Fortschritt des Spielers, per Flag. | 12 der 23 Menschen in den drei Städten tragen ein Ausblende-Flag1 |
| Routine | Ein Tag besteht aus drei bis sieben zeitlich festgelegten Punkten; ein Schlüssel wählt, welcher Tag gilt, in einer festen Reihenfolge der Spezifität, der erste Treffer gewinnt. | Abigails Mittwoch 3 Punkte, Pierres normaler Tag 7; 22 Schlüsselformate92 |
| Der Tag | Den Tag abrechnen, wenn der Spieler zurückkommt, mit einem Durchlauf, der die Zahl der vergangenen Tage nimmt; nie einen Timer laufen lassen, während niemand spielt. | UpdatePerDay3; Stardews erste Tagesaktualisierung9 |
| Gedächtnis | Das erste Gespräch des Tages mit einem Flag pro Stadtbewohner merken; die Belohnung klein halten. | +1 von 255 in New Horizons11; +20 gegen 250 pro Herz in Stardew10 |
| Neue Wörter | Neuen Ausdruck auf einen pro Tag oder einen pro Begegnung rationieren. | Eine Reaktion pro Tag12; ein Modewort pro Ankunft des Hipsters35 |
| Spuren | Die Spuren anderer kommen in kleinen, festen Plätzen und verfallen oder rotieren. | 20 Basen und 5 Modewörter4; 8 Läden13; 6 Verteidiger47; Zeitregen14; Anstieg und Abfall eines Modeworts von 12 bis etwa 50,8 Tagen38 |
| Platzhalter | Platzhalter füllen die Plätze, die Menschen leer lassen, und zählen weniger. | Die Fans der Begegnungsallee mit 75 %, nach Serebiis Darstellung13 |
| Fremde | Fremde teilen Präsenz, keine Worte: keine Namen, ein Klang oder eine vorgefertigte Phrase. | Journey5; Dark Souls41; Game Center für Kinder17 |
| Rede | Vorgefertigte Zeilen reisen als IDs und antworten, statt nur zu grüßen; ein ganzer Satz kann nichts buchstabieren, was eine Wortliste kann. | Club Penguins ss-IDs48; Easy Chats 940 offene Wörter in Rastern von 2 bis 10 Plätzen38 |
| Aktualisierungen | Auf einem Raster eine Aktualisierung pro Schritt; entfernte Läufer auf einer Uhr rendern, die etwas mehr als einen Laufschritt hinter der geschätzten Serverzeit liegt, und nie einen laufenden Schritt zurücksetzen. | Habbos 500-ms-Zyklus und lineare Interpolation (Emulator und Fan-Client)1549; das Modell bei 3,75 und 7,5 Tiles pro Sekunde, unter der Annahme exakter Uhrsynchronisation und ohne Grundlatenz: 350 ms Rückstand ergeben bis 80 ms Jitter 0 Rückwärts-Frames und 0 ausgehungerte7 |
| Untätigkeit | Einen Spieler nach zwei Minuten ohne Eingabe als untätig markieren und eine Verbindung schließen, die ihren Heartbeat nicht mehr beantwortet. | Arcturus: untätig bei 240 Zyklen (120 s), ein untätiger Nicht-Besitzer entfernt bei 480 (240 s)15; Houdini schließt jeden Client, der in einem 61-s-Fenster keinen Heartbeat gesendet hat48. Die 240 s ohne Ping des Briefings verbinden beides, meine Anpassung |
| Einschränkungen | Meldet Game Center Mehrspieler als eingeschränkt, auch bei „nur Freunde“, entfällt der eigene Mehrspielermodus, und nach meiner Lesart gehören Wiedergaben der Laufwege echter Spieler dazu: Ein solcher Spieler bekommt nur Stadtbewohner. | Apples Dokumentation zu isMultiplayerGamingRestricted18; Echos als Mehrspielerfunktion ist meine Lesart (Abschnitt 7.6) |
| Kommunikation | Meldet Game Center personalisierte Kommunikation als eingeschränkt oder den Spieler als minderjährig, entfällt die eigene Kommunikation. | Apples Dokumentation zu isPersonalizedCommunicationRestricted51 |
| Aufbewahrung | Daten von Kindern nur so lange aufbewahren, wie ihr schriftlich festgelegter Zweck es erfordert, mit der Löschfrist im Hinweis. | 16 CFR 312.10 in geänderter Fassung; Einhaltung ab dem 22. April 202619 |
5. Der Apple-Weg: die Flags von Game Center, Altersbereiche, die Richtlinien und COPPA
Eine Stadt, in die Kinder hineingehen können, ist durch Regeln von Apple und von der US-amerikanischen Federal Trade Commission begrenzt, und die meisten davon tragen Daten. Dieser Abschnitt gibt Apples und die eigenen Worte der FTC wieder, mit der Verfügbarkeit, wo Apple sie veröffentlicht. Alles, was ich darüber sage, was eine Regel für Kiradex bedeutet, ist eine Lesart, als solche gekennzeichnet, und nichts davon ist Rechtsberatung.
Die drei Einschränkungs-Flags von Game Center
Der lokale Spieler von Game Center trägt drei Boolesche Werte, die ein Spiel lesen kann, bevor es irgendetwas Soziales öffnet. Ihre Verfügbarkeit stammt aus Apples Dokumentation in dem am 4. Oktober 2026 gespeicherten Stand, und jede Erläuterung ist wörtlich zitiert.185152
| Eigenschaft | iOS | Was Apple sagt |
|---|---|---|
GKLocalPlayer.isMultiplayerGamingRestricted |
13.0 | „If this property is true, the local player can’t join multiplayer games. If your game uses a custom multiplayer feature, you should disable it.“ (Ist diese Eigenschaft true, kann der lokale Spieler keinen Mehrspielerspielen beitreten. Verwendet Ihr Spiel eine eigene Mehrspielerfunktion, sollten Sie sie deaktivieren.) |
GKLocalPlayer.isPersonalizedCommunicationRestricted |
14.0 | „If this property or the underage property is true, the local player can’t include personalized messages on invitations or enable voice communication in multiplayer games. If your game includes any custom communication features, you should disable them.“ (Ist diese Eigenschaft oder die Eigenschaft underage true, kann der lokale Spieler Einladungen keine personalisierten Nachrichten beifügen und in Mehrspielerspielen keine Sprachkommunikation aktivieren. Enthält Ihr Spiel eigene Kommunikationsfunktionen, sollten Sie sie deaktivieren.) |
GKLocalPlayer.isUnderage |
4.1 | „If this property is true, Game Center disables some features for the local player.“ (Ist diese Eigenschaft true, deaktiviert Game Center einige Funktionen für den lokalen Spieler.) |
Die Seite des ersten Flags fügt das Detail hinzu, auf das es am meisten ankommt: Der Wert stammt aus Screen Time, wo Eltern Mehrspielerspiele mit allen, nur mit Freunden oder mit niemandem erlauben können, und „when you configure the setting to friends only, this property returns true for restricted.“ (wenn Sie die Einstellung auf „nur Freunde“ setzen, liefert diese Eigenschaft true für eingeschränkt.)18 Ein Kind, das nur mit Freunden spielen darf, gilt also trotzdem als eingeschränkt, und ein Spiel mit eigenem Platz wird aufgefordert, ihn abzuschalten. Die Seite des zweiten Flags hat zwei Sätze mit unterschiedlicher Reichweite. Der erste nennt, was Game Center selbst blockiert, personalisierte Nachrichten in Einladungen und Sprache; der zweite verlangt vom Spiel, „any custom communication features“ (alle eigenen Kommunikationsfunktionen) selbst zu deaktivieren, ohne Ausnahme für vorgefertigte. Nach meiner Lesart ist ein Menü aus ganzen vorgefertigten Sätzen eine eigene Kommunikationsfunktion, und das Briefing behandelt es als eine solche.51
Game Center für Kinder, und Screen Time
Apples Datenschutzseite zu Game Center legt die Regel fest, die Kiradex bereits für alle übernommen hat: „when communicating with other players in Game Center, children cannot send or receive user-inputted text. They are restricted to sending and receiving preset messages. In-game voice chat is disabled for children.“ (bei der Kommunikation mit anderen Spielern in Game Center können Kinder keinen von Benutzern eingegebenen Text senden oder empfangen. Sie sind auf das Senden und Empfangen vorgefertigter Nachrichten beschränkt. Sprachchat im Spiel ist für Kinder deaktiviert.)17 Sie sagt auch „Children’s accounts never make real names visible to friends,“ (Kinderaccounts machen echte Namen nie für Freunde sichtbar), und dass Eltern mit Screen Time „multiplayer functionality, the ability to add friends, and the ability to connect with friends playing the same game.“ (Mehrspielerfunktionen, das Hinzufügen von Freunden und das Verbinden mit Freunden, die dasselbe Spiel spielen) blockieren können.17 Apples Support-Seite zu Screen Time listet die Einschränkungen von Game Center namentlich auf, darunter „Connect with Friends“ (Mit Freunden verbinden) und „Private Messaging“ (Private Nachrichten), jeweils „Allowed or Blocked.“ (Erlaubt oder Blockiert).53
Declared Age Range
Am 11. Juni 2025 kündigte Apple an, dass ein Kinderaccount „is required for children under 13“ (für Kinder unter 13 erforderlich ist) und dass „App developers will be able to request this information through the new Declared Age Range API“ (App-Entwickler diese Information über die neue Declared Age Range API anfordern können), wobei Eltern wählen, ob sie den Altersbereich eines Kindes „always, for each app request, or never“ (immer, bei jeder Anfrage einer App oder nie) teilen, „in a way that does not reveal the child’s birth date.“ (auf eine Weise, die das Geburtsdatum des Kindes nicht preisgibt.)54 Dieselbe Ankündigung sagte, die Altersfreigaben würden bis Ende jenes Jahres „expanded to five categories“ (auf fünf Kategorien erweitert), mit 13+, 16+ und 18+ für Jugendliche.54 Der Weltplan von Kiradex nennt die API als Schalter für seine Jugendregeln und hält die Entscheidung vom 2. Oktober fest: unter 13 nach dem angegebenen Bereich gar kein Platz; 13 bis 15 der Platz mit Jugendregeln; ab 16 oder ohne Angabe der volle Platz.23 Die eigene Referenzseite der API habe ich für diesen Beitrag nicht abgerufen, daher steht ihre iOS-Mindestversion hier nicht.
Die App Review Guidelines
Drei Richtlinien begrenzen einen sozialen Platz, zitiert nach der Fassung, die Apple mit „Last Updated: June 8, 2026“ (zuletzt aktualisiert am 8. Juni 2026) datiert.55
- 1.2, nutzergenerierte Inhalte. Apps „with user-generated content or social networking services must include“ (mit nutzergenerierten Inhalten oder sozialen Netzwerkdiensten müssen enthalten) eine Methode zum Filtern anstößigen Materials, „A mechanism to report offensive content and timely responses to concerns“ (einen Mechanismus zum Melden anstößiger Inhalte und zeitnahe Reaktionen auf Bedenken), „The ability to block abusive users from the service“ (die Möglichkeit, missbräuchliche Nutzer vom Dienst auszuschließen) und „Published contact information so users can easily reach you.“ (veröffentlichte Kontaktdaten, damit Nutzer Sie leicht erreichen können). Apps, die am Ende „used primarily for pornographic content, Chatroulette-style experiences, random or anonymous chat“ (vor allem für pornografische Inhalte, Erlebnisse im Stil von Chatroulette, zufälligen oder anonymen Chat genutzt werden) und für den Rest dieser Liste, „do not belong on the App Store and may be removed without notice.“ (gehören nicht in den App Store und können ohne Vorankündigung entfernt werden).55
- 1.3, die Kinderkategorie. Apps darin „must not include links out of the app, purchasing opportunities, or other distractions to kids unless reserved for a designated area behind a parental gate,“ (dürfen keine Links aus der App heraus, keine Kaufmöglichkeiten und keine anderen Ablenkungen für Kinder enthalten, außer in einem ausgewiesenen Bereich hinter einer Elternschranke) und „should not include third-party analytics or third-party advertising,“ (sollten keine Analysen oder Werbung von Drittanbietern enthalten), mit engen Ausnahmen.55
- 5.1.4, Kinder. Apps, die „collect, transmit, or have the capability to share personal information (e.g. name, address, email, location, photos, videos, drawings, the ability to chat, other personal data, or persistent identifiers used in combination with any of the above) from a minor must include a privacy policy and must comply with all applicable children’s privacy statutes,“ (personenbezogene Daten eines Minderjährigen erheben, übertragen oder teilen können, etwa Name, Adresse, E-Mail, Standort, Fotos, Videos, Zeichnungen, die Möglichkeit zu chatten, andere personenbezogene Daten oder dauerhafte Kennungen in Verbindung mit einem der genannten, müssen eine Datenschutzrichtlinie enthalten und alle geltenden Kinderdatenschutzgesetze einhalten), und „the parental gate requirement for the Kid’s Category is generally not the same as securing parental consent“ (die Anforderung einer Elternschranke für die Kinderkategorie ist im Allgemeinen nicht dasselbe wie das Einholen der elterlichen Einwilligung) nach diesen Gesetzen.55
Der Plan von Kiradex nimmt den zweiten der beiden Wege, die sein Designdokument aus den Richtlinien ableitet: außerhalb der Kinderkategorie, mit Altersfreigabe 9+ oder 12+ (die Freigabe ist noch nicht gewählt), unter 5.1.4.23 Nach meiner Lesart bedeutet „the ability to chat“ (die Möglichkeit zu chatten) in der Liste von 5.1.4, dass auch ein Platz mit ausschließlich vorgefertigten Zeilen die Datenschutzrichtlinie braucht, was immer er sonst vermeidet.
COPPA in geänderter Fassung
Die geänderte Children’s Online Privacy Protection Rule der FTC wurde am 22. April 2025 im Federal Register veröffentlicht (Dokument 2025-05904, 90 FR 16918). Sie „is effective June 23, 2025,“ (tritt am 23. Juni 2025 in Kraft), und „Except with respect to § 312.11(d)(1), (d)(4), and (g), regulated entities have until April 22, 2026 to comply.“ (Mit Ausnahme von § 312.11(d)(1), (d)(4) und (g) haben regulierte Stellen bis zum 22. April 2026 Zeit, die Vorgaben einzuhalten.)19 Die Mitteilung der FTC vom 16. Januar 2025, nach einer Abstimmung mit 5 zu 0, fasste die Änderung zusammen: eine gesonderte überprüfbare elterliche Einwilligung, um Daten von Kindern an Dritte weiterzugeben, „related to targeted advertising or other purposes“ (im Zusammenhang mit gezielter Werbung oder anderen Zwecken), und Aufbewahrung „for as long as reasonably necessary to fulfill a specific purpose,“ (so lange, wie es zur Erfüllung eines bestimmten Zwecks vernünftigerweise nötig ist), sodass „operators cannot retain the information indefinitely.“ (Betreiber die Daten nicht unbegrenzt aufbewahren dürfen.)56
Drei Passagen des Regeltexts betreffen einen Platz, der sich an irgendetwas erinnert.
- Aufbewahrung, § 312.10. „Personal information collected online from a child may not be retained indefinitely. At a minimum, the operator must establish, implement, and maintain a written data retention policy that sets forth the purposes for which children’s personal information is collected, the business need for retaining such information, and a timeframe for deletion of such information.“ (Online von einem Kind erhobene personenbezogene Daten dürfen nicht unbegrenzt aufbewahrt werden. Der Betreiber muss mindestens eine schriftliche Richtlinie zur Datenaufbewahrung erstellen, umsetzen und pflegen, die die Zwecke der Erhebung, den geschäftlichen Bedarf für die Aufbewahrung und eine Löschfrist festlegt.) Die Richtlinie gehört in den Online-Hinweis.19
- Dauerhafte Kennungen, § 312.2. Zu den personenbezogenen Daten gehört „A persistent identifier that can be used to recognize a user over time and across different websites or online services,“ (eine dauerhafte Kennung, mit der sich ein Nutzer über die Zeit und über verschiedene Websites oder Onlinedienste hinweg wiedererkennen lässt), etwa „a customer number held in a cookie, an Internet Protocol (IP) address, a processor or device serial number, or unique device identifier.“ (eine in einem Cookie gespeicherte Kundennummer, eine IP-Adresse, eine Prozessor- oder Geräteseriennummer oder eine eindeutige Gerätekennung.)19
- Interne Abläufe, § 312.5(c)(7). Eine Einwilligung ist nicht nötig, „Where an operator collects a persistent identifier and no other personal information and such identifier is used for the sole purpose of providing support for the internal operations of the website or online service,“ (wenn ein Betreiber eine dauerhafte Kennung und keine anderen personenbezogenen Daten erhebt und diese Kennung ausschließlich zur Unterstützung der internen Abläufe der Website oder des Onlinedienstes verwendet wird), mit Hinweis.19
Der geänderte § 312.8 verlangt außerdem ein schriftliches Informationssicherheitsprogramm für Daten von Kindern.19 Meine Lesart dessen, was das für einen Platz bedeutet, der die Laufwege von Besuchern wiedergibt, steht im Briefing, als solche gekennzeichnet; WORLD.md Abschnitt 3 verlangt, dass ein Anwalt das endgültige Design prüft, und die Entscheidungen vom 2. Oktober verschieben das, bis die App Zugkraft hat, sodass die Lesart bis dahin gilt.23
Was es kostet
Nichts in diesem Abschnitt wurde auf einem Gerät gemessen. Das Lesen von drei Booleschen Werten auf GKLocalPlayer nach der Authentifizierung ist hier nicht gemessen; ebenso wenig Speicher oder CPU eines Renderpuffers von 350 ms für bis zu 39 andere Sammler in einem Raum für 40.21 Nach meiner Lesart kann beides neben dem Zeichnen eines Frames keine Rolle spielen, aber das ist eine Lesart, und die Prüfungen des Briefings betreffen Verhalten, nicht Zeiten.
6. Die Fallstudie: der Platz von Kiradex, gemessen an seinem eigenen Code
Kiradex World ist die Pixelstadt in Kiradex, meiner App zum Sammeln von Karten: ein Platz von 40 mal 30 Tiles zu je 16 Pixeln, bedient von einem kleinen FastAPI- und WebSocket-Server, der Präsenz im Speicher hält und nichts speichert, abgesehen von dem, was sein Webserver standardmäßig protokolliert (Abschnitt 7.6, Einstellung 6).212357 Ich habe den Server und den Weltcode der App am 5. Oktober aus dem Arbeitsverzeichnis gelesen, ohne etwas zu ändern, und die eigenen Klassen des Servers mit zwei Skripten auf einer simulierten Uhr angetrieben; die Zahlen in diesem Abschnitt sind also das Verhalten des Codes und nicht meine Lesart davon.21620 Das Repository ist privat, daher werden Dateien über ihren Pfad benannt. Es handelt sich um Unterschiede zwischen dem Plan in docs/WORLD.md, den eigenen Docstrings des Codes und dem, was der Code tut; keiner davon ist ein Fehler, den jemand versteckt hätte, und der Plan führt einen Teil des vierten bereits als noch nicht gebaut.
Was es gibt
Der Server hält 23 vorgefertigte Zeilen, 14 für Spieler (Indizes 0 bis 13) und 9 für die eigenen Sammler der Stadt (14 bis 22); Räume für 40; ein Limit von 8 Bewegungen pro Sekunde und einer Zeile alle 2,0 Sekunden pro Spieler; eine Stadtuhr, die alle 0,5 s tickt (TICK_SECONDS in server/app/main.py); eine Abklingzeit von 60 Sekunden, um demselben Sammler eine Karte zu zeigen; und die Ankunft auf Tile (19, 13) des Platzes von 40 mal 30.2120 Vier geskriptete Sammler leben auf dem Server, damit jeder in einem Raum dieselben sieht: Moss, Prism, Comet und Dawn, jeder mit 4 Wegpunkten auf Schleifen von 18, 22, 30 und 32 Tiles, einer Kartenart, die er gezeigt bekommen möchte (Vintage, Holo, beliebig, japanisch), und 2 oder 3 Zeilen. server/app/npcs.py setzt STEP_SECONDS = 0.7, lässt jeden Sammler an einem Wegpunkt gleichverteilt 3 bis 8 Sekunden pausieren und gleichverteilt alle 20 bis 40 Sekunden eine Zeile sagen, die erste nach 8 bis 20.2120
Nach meiner Lesart ist das der richtige Instinkt: Stadtbewohner auf dem Server statt in jedem Telefon, Zeilen auf einer langsamen Uhr und für jeden ein Wunsch, damit eine Sammlung irgendwo zählt. Gemessen untergraben ihn drei Dinge, und ein viertes ist eine Lücke zwischen Plan und Code.
1. Der Gang ist ein Stop-and-go
measure_npc_cadence.py importiert server/app/npcs.py und rooms.py, baut den Platz und die vier Sammler und treibt sie eine simulierte Stunde lang mit dem echten Tick von 0,5 s an.6 Jedes der 6.253 Intervalle zwischen Schritten innerhalb eines Abschnitts beträgt genau 1,0 Sekunden, nicht 0,7: Ein Schritt wird beim ersten Tick zu oder nach seinem next_move ausgelöst, also werden 0,7 Sekunden auf zwei Ticks aufgerundet. Das sind 1,0 Tiles pro Sekunde statt der 1,43, die die Konstante nahelegt. Pausen vor einem Abschnitt dauern im Mittel 6,75 Sekunden (4,5 bis 9,0, über 1.202 davon), und Zeilen liegen im Mittel 30,7 Sekunden auseinander, über 465 Intervalle zwischen aufeinanderfolgenden Zeilen eines Sammlers (469 Zeilen in der Stunde).6
Der Client zeichnet jeden Schritt in 250 ms: PlazaRig.swift setzt tilesPerSecond in Zeile 101 auf 4.50 Ein Sammler, der ein Tile pro Sekunde geht, wird also 25 Prozent jedes Abschnitts in Bewegung und die übrigen 75 Prozent stillstehend gezeichnet, zwischen jedem Paar von Tiles.6 Smaragds Wanderer machen einen Schritt im Tempo des Spielers und warten dann; die Sammler von Kiradex bewegen sich im Tempo des Spielers in Schüben von je einem Tile, während sie eigentlich gehen sollten, was nach meiner Lesart weder wie das Schlendern eines Bewohners noch wie ein Gang wirkt (die unterste Zeile des Zeitstrahldiagramms in Abschnitt 1).
2. Ein anderer Sammler, der vorbeigeht, springt zurück
Wenn der Server die Bewegung eines anderen Sammlers weiterleitet, plant PlazaRig.move(other:to:facing:) (Zeilen 526 bis 542 von PlazaRig.swift) einen Pfad ab dem letzten ganzen Tile des Läufers, setzt dessen Schritte auf diesen Pfad und setzt bei jeder Nachricht progress = 0, auch wenn ein Schritt halb gezeichnet ist; ein Pfad von mehr als 6 Tiles wird übersprungen.50 Das Modell aus Abschnitt 3, in der eigenen 32-Bit-Arithmetik des Rigs, beziffert das. Ein gleichmäßiger Laufweg ohne Jitter springt nie zurück, weil jeder Schritt kurz vor dem Eintreffen der nächsten Bewegung endet. Mit 30 oder 80 ms Jitter wird ein Laufweg von 40 Tiles 13- oder 25-mal mitten im Schritt zurückgesetzt, 7 bzw. 16 davon rückwärts gezeichnet. Beim Rennen zeichnet das Rig den Läufer mit den 4 Tiles pro Sekunde des Laufens, sodass bei jedem getesteten Jitter 45 von 64 Bewegungen mitten im Schritt eintreffen, bei 9 Sprüngen; und immer wenn er zurückspringt, fällt der gezeichnete Läufer um bis zu 5,9 bis 6,7 Tiles hinter den Sender zurück.7 Pixel-Art in Bewegung, ein früherer Beitrag dieser Reihe, liest denselben Rücksprung aus dem Code für das zweite Antippen des Spielers mitten im Schritt; die Regel, die sein Briefing setzt, nie einen laufenden Schritt zurückzusetzen, ist die Regel, die dieses Briefing auf andere Sammler anwendet.22
3. Die Stadt bleibt stehen, wenn sie leer ist
Der Modul-Docstring von server/app/npcs.py sagt über die Sammler: „A town is never empty, and it has somewhere for a collection to matter.“ (Eine Stadt ist nie leer, und sie hat einen Ort, an dem eine Sammlung zählt.)20 Room.tick in server/app/rooms.py sagt in seinem eigenen Docstring etwas anderes, „A room with nobody in it stands still,“ (Ein Raum, in dem niemand ist, steht still), und tut es auch: Hat der Raum keine Spieler, kehrt die Methode sofort zurück, und die Sammler erstarren, wo sie gerade waren.206 Das Skript misst, was die erste Ankunft dann sieht: Frische Sammler in einem Tick auf 10.000 simulierte Sekunden vorzutreiben, erzeugt vier Zeilen auf einmal, eine von jedem Sammler, der steht, wo er stand; dazwischen ist nichts passiert.6 Und weil der Server nichts speichert, sieht der erste Sammler an einem stillen Morgen dieselben vier Leute und kein Zeichen, dass je jemand anderes da war. Eine Suche in Kiradex/ und server/app/ findet nichts, was einen Besuch oder ein tägliches Gespräch festhält.24
4. Raten und die Flags von Game Center
Zwei Unterschiede bestehen zwischen docs/WORLD.md und dem Code. Abschnitt 5 des Plans bewahrt als Begründung, die zum Server führte, ein Design, in dem Clients Position und Richtung mit 8 bis 10 Hz senden.23 Die App sendet stattdessen ein move pro abgeschlossenem Tile: heute 4 pro Sekunde beim Laufen und 6,4 beim Rennen mit der Nennrate des Rennens (6,0 bei 60 Hz im Modell des Codes aus dem Bewegungsbeitrag), in beiden Fällen unter dem Limit des Servers von 8 pro Sekunde; der Bewegungsvertrag der Reihe, 16 Ticks pro Tile beim Laufen und 8 beim Rennen bei 60 Hz, würde daraus 3,75 und 7,5 machen, immer noch darunter (Abschnitt 7.4).2122 Nach meiner Lesart ist eine Meldung pro Tile das bessere Design für ein Raster, und das Briefing behält es bei; die Zeile im Plan ist diejenige, die aktualisiert werden sollte.
Abschnitt 3 des Plans baut Identität auf Game Center auf, damit „a child’s Game Center is controlled by the parent in Screen Time (multiplayer on/off, adding friends on/off, sharing the friend list with games on/off).“ (das Game Center eines Kindes von den Eltern in Screen Time gesteuert wird: Mehrspieler an/aus, Freunde hinzufügen an/aus, Freundesliste mit Spielen teilen an/aus.)23 Nichts in Kiradex/ oder server/app/ liest GKLocalPlayer.isMultiplayerGamingRestricted, isUnderage oder isPersonalizedCommunicationRestricted oder ruft die Declared Age Range API auf.24 Abschnitt 5 des Plans führt „junior mode by Declared Age Range“ (Jugendmodus nach Declared Age Range) bereits unter den noch nicht gebauten Dingen.23 Die Flags von Game Center sind der Teil, den er nicht aufführt: Die Mehrspielereinstellung von Screen Time steuert den eigenen Mehrspielermodus von Game Center, und Apples Dokumentation verlangt von einem Spiel mit „a custom multiplayer feature“ (einer eigenen Mehrspielerfunktion), diese selbst zu deaktivieren; solange die App das Flag nicht liest, erreicht die Einstellung der Eltern den Platz also nicht.18
Der Client verbindet sich nach einem abgebrochenen Socket mit einem Backoff von min(30, 2^attempts) Sekunden neu (PlazaClient.swift Zeile 165), und das Ausblenden eines Sammlers geschieht auf dem Gerät, per ID.215023 Beides bleibt im Briefing, wie es ist; es fügt der Ausblendliste eine Verwendung hinzu: Sie reist mit jeder Anfrage nach den Echos des Platzes, sodass der Server die Laufwege von Sammlern weglassen kann, die dieser Spieler ausgeblendet hat (Abschnitt 7.2).
7. Das Briefing: was Kiradex baut und welche Prüfungen es bestehen muss
Das Briefing behält, was der Platz hat (die eigenen Sammler des Servers, nur vorgefertigte Zeilen, eine Bewegung pro Tile, Präsenz im Speicher), und fügt die drei Antworten in der Reihenfolge hinzu, in der der Kanon sie gibt: Stadtbewohner, deren Leben nicht stehen bleibt, Spuren von Menschen, die da waren, und Präsenz, die ohne Rücksprünge gezeichnet wird. Jeder Punkt hat eine Prüfung, die ein Skript, ein Test oder eine Aufnahme bestehen oder nicht bestehen kann. Tile-Koordinaten sind die des Platzes, x nach rechts und y nach unten.21
Die Grenze beim Entlehnen ist die, die der erste Beitrag dieser Reihe für Patente und für die Ausdrucksform zieht: kein Pokémon-Wesen, kein Pokémon-Ortsname, kein Begriff aus der Marke als Name einer Funktion und nichts, was zielt und wirft, um zu fangen, eine Fangwahrscheinlichkeit anzeigt, einen Begleiter zum Kämpfen schickt oder etwas zum Reiten besteigt.36 Jedes Element unten besteht aus Stadtbewohnern, die gehen, stehen und ganze vorgefertigte Sätze sagen, und aus blassen Wiedergaben der Laufwege anderer Sammler. Die Systeme der Spiele werden oben als Tatsachen über veröffentlichte Werke genannt; die Funktionen von Kiradex bekommen hier eigene Namen von Kiradex: Stadtbewohner, Echos, der heutige Gruß, das Satzbuch und der stille Platz. docs/WORLD.md Abschnitt 3 nennt jeden Live-Sammler, der kein Freund ist, bereits einen Passanten; diese Bezeichnung bleibt, und die Wiedergaben heißen Echos, damit die beiden nie verwechselt werden.23 Die rechtlichen Anmerkungen sind Lesarten, keine Beratung.
7.1 Stadtbewohner mit Routinen
- Bevölkerung. Die eigenen Sammler des Platzes von 4 auf 8 erhöhen, jeder mit einem Posten.21 Die Aufteilung folgt Smaragds stets anwesenden Menschen, 59 von 100 stehend und 41 nicht (39 wandernd, 2 auf der Stelle laufend), was bei acht auf fünf stehende und drei sich bewegende gerundet wird. Fünf stehen an Posten und drehen sich: die Ladentheke, die Hallentür, der Brunnen und zwei Stände. Zwei wandern in einem Feld von 2 Zellen um einen Posten, wie Smaragds Wanderer. Der dritte, der sich bewegt, stammt nicht aus Smaragds Aufteilung, deren 158 Stadtbewohner alle stehen, in einem Feld wandern oder auf der Stelle laufen, ohne einen einzigen auf einer Route: Er ist eine der heutigen vier Wegpunktschleifen, beibehalten, und geht eine Runde zwischen den Posten, sodass aus den heutigen vier Schleifen eine wird.121 Die vier neuen Sammler werden vom eigenen Figurensystem der App gezeichnet, mit Namen aus den eigenen Wortlisten der App, wie die vier heutigen.20
- Wartezeiten. Ein Sammler an einem Posten dreht sich, und ein Wanderer macht einen Schritt, nach einer zufällig gewählten Wartezeit von 1, 2, 3 oder 4 Ticks der 0,5-s-Uhr des Servers: 0,5, 1,0, 1,5 oder 2,0 Sekunden, Smaragds 0,54, 1,07, 1,61 und 2,14 auf den nächsten Tick gerundet. Eine Wartezeit in ganzen Ticks wird vom Tick nicht noch einmal gerundet, und genau das ist der Fehler, den Abschnitt 6 beim Schritt gemessen hat.16
- Die Uhr des Raums. Jeder Raum läuft auf einer Uhr: der Zeit des Servers in UTC, gelesen in der eigenen Zeitzone des Raums, eine IANA-Zone pro Raum in der Serverkonfiguration. Der Server sendet beides bei der Ankunft, in
welcomeund in der Antwort des stillen Platzes ({"zone": "<IANA name>", "clock": <server ms>}), und solange der Platz offen ist, nimmt die App ihre Tageszeit daraus statt vom Telefon, sodass alle in einem Raum dieselben Stadtbewohner im selben Licht sehen. Heute nimmtDaylight.nowdie Stunde ausCalendar.current, dem eigenen Kalender und der eigenen Zone des Telefons, und der Server hält nur eine monotone Uhr und nennt keine Zone.50 Welche Zone ein Raum verwendet und in welchen Raum ein Sammler geschickt wird, ist Konfiguration, die dieses Briefing offenlässt; eine Zone für alle Räume ist der einfachste Anfang. Außerhalb des Platzes bleibt die Uhr des Telefons die des Sammlers. - Routinen. Der Tag jedes Stadtbewohners besteht aus 3 bis 7 zeitlich festgelegten Punkten, als eine Zeichenkette in den Daten des Servers geschrieben, gewählt durch einen Schlüssel, der der Reihe nach geprüft wird: ein Datum, ein Wochentag, eine Tageszeit, dann der Standard, jeweils auf der Uhr des Raums gelesen.9 Die Tageszeiten sind die der App selbst, aus
Daylight.PhaseinKiradex/World/Daylight.swift: Morgen von 6 bis 9, Tag von 9 bis 17, Abend von 17 bis 20 und sonst Nacht.50 Nachts auf der Uhr des Raums gehen die fünf an den Posten und die beiden Wanderer durch ihre eigenen Türen nach drinnen, so wie Pierres Freitag in Stardew Valley endet, vom Saloon aus („Returns home to sleep.“, kehrt zum Schlafen nach Hause zurück), und der Läufer auf der beibehaltenen Schleife verkürzt seine Runde.30 - Das Tempo. Den Stop-and-go-Gang mit einer von zwei Änderungen beheben. Bevorzugt: Der Server sendet einen Abschnitt einmal,
{"t": "walk", "id": ..., "path": [...], "at": <server ms>}, und der Client geht ihn abatim Lauftempo des Spielers nach dem Bewegungsvertrag der Reihe, 16 Ticks pro Tile bei 60 Hz, 3,75 Tiles pro Sekunde (4 im heutigen Rig).22 Minimum: ein Schrittintervall des Servers in ganzen Ticks,STEP_SECONDS = 0.5, wobei der Client den Schritt eines Stadtbewohners über dieselben 0,5 Sekunden zeichnet, 2 Tiles pro Sekunde, das Schlendern eines Bewohners statt des Gangs des Spielers.632 - Zeit, wenn der Raum leer ist. Das Tile eines Stadtbewohners ist eine reine Funktion der Uhr des Raums: Route, Tageszeit und ein Seed, berechnet, wenn danach gefragt wird, nicht durch
Room.tickvorangetrieben. Der Seed ist ein einziger globaler Wert in der Serverkonfiguration, nicht einer pro Raum oder Zone, sodass zwei Räume mit derselben Zone dieselben Stadtbewohner auf denselben Tiles zeigen. Der erste Sammler, der um 07:40 nach der Uhr des Raums hereinkommt, sieht Moss dort, wo Moss um 07:40 wäre, und ebenso ein Sammler, der demselben Raum von einem Telefon beitritt, das auf eine andere Zone eingestellt ist.63
Prüfungen. (a) Das Tempo, je nach Design. Für den bevorzugten Abschnitt speist ein Client-Test einen geskripteten walk mit einem geraden Pfad von 5 Tiles und einem at-Zeitstempel ein, protokolliert die Position des Stadtbewohners in jedem Tick, so wie -motionLog aus dem Bewegungs-Briefing die des Spielers protokolliert, und stellt sicher, dass er in dem Tick losgeht, auf den at nach der Schätzung der Raumuhr durch den Client fällt, die Tiles des Pfads der Reihe nach besucht, sich in jedem Tick um genau 1 Pixel und nie rückwärts bewegt, 16 Ticks pro Tile braucht und 80 Ticks nach at auf dem letzten Tile steht; ein Server-Test stellt sicher, dass jeder Abschnitt einmal, vollständig und mit seinem Zeitstempel gesendet wird. Für die Minimal-Variante treibt ein Server-Test die Stadtbewohner eine simulierte Stunde lang mit dem 0,5-s-Tick an und stellt sicher, dass jedes Schrittintervall innerhalb eines Abschnitts dem konfigurierten entspricht; heute findet measure_npc_cadence.py 1,0 s statt der konfigurierten 0,7 s. Für beide stellt ein Server-Test sicher, dass jede Wartezeit eine ganze Zahl von Ticks ist.622 (b) Ein Test öffnet zwei Räume mit derselben Zone im Abstand von 600 Sekunden, beide mit dem einen globalen Seed, und stellt bei derselben Serverzeit identische Tiles der Stadtbewohner fest; ein Client-Test, bei dem die Zone des Telefons auf eine andere als die des Raums eingestellt ist, stellt sicher, dass die Tageszeit des Platzes der Uhr des Raums folgt. (c) Ein Test setzt die Serveruhr auf einen UTC-Zeitpunkt, der in der Zone des Raums 03:00 ist, und stellt sicher, dass die fünf an den Posten und die beiden Wanderer nicht auf der Karte des Platzes sind und der Läufer auf der beibehaltenen Schleife schon. (d) Ein Server-Test zählt die acht nach Art und findet 5 an Posten, 2 wandernd und 1 auf der beibehaltenen Schleife.
7.2 Echos: die letzten acht Laufwege
- Mechanik. Der Platz behält die letzten 8 Besuche.413 Ein Besuch ist der gegangene Pfad, als Paare aus Tile und Zeit, von der Ankunft bis zur ersten genommenen Tür oder 60 Sekunden, je nachdem, was kürzer ist; die Figur des Läufers wird nicht behalten. Hält ein Raum weniger als 8 Live-Sammler, füllen Echos die Lücke: Jedes spielt seinen Laufweg in seinem eigenen Tempo ab und verblasst an der Tür, die es genommen hat. Ein Echo hat kein Namensschild, hält keine Karte hoch, hat kein Tippziel und sagt nichts. Es ist ein Laufweg, keine Person.5
- Aussehen. Die Figur eines Echos wird nie aus der Figur des Läufers abgeleitet. Der Server gibt jedem eine von vier schlichten Figuren, die Standardteile des Manifests in vier schlichten Färbungen, von der Schmiede eigens für Echos gefertigt und blass gezeichnet (eine der Farbrampen der Schmiede mit festem Alpha). Welche der vier, wählt ein verschlüsselter Hash des eigenen Salts des Laufwegs unter dem Geheimnis des Servers, das der Server behält und nie sendet, sodass zwei Laufwege desselben Sammlers voneinander unabhängige Figuren bekommen. Auch ein Sammler kann Standardteile tragen, ein Läufer, der zufällig eine der vier trägt, kann also zufällig seinem Echo gleichen, und diese Übereinstimmung trägt nichts: Die Figur sagt nichts darüber, wer gegangen ist.58
- Verfall. Ein Echo wird nach 7 Tagen verworfen oder wenn 8 neuere Besuche eintreffen, je nachdem, was zuerst eintritt.14
- Wer Echos sieht. Sammler auf dem Live-Platz, wann immer er weniger als 8 von ihnen hält. Niemand, bei dem
isMultiplayerGamingRestrictedtrue ist: Ihr stiller Platz hat nur Stadtbewohner, weil ein Echo nach meiner Lesart Teil des Mehrspielermodus des Platzes ist (7.6, Einstellung 1).18 - Ausblenden. Wer einen Sammler ausblendet, blendet auch seine Echos aus, und der Server übernimmt das Filtern. Jeder gespeicherte Laufweg trägt ein zufälliges Salt und ein Tag: einen verschlüsselten Hash (ein HMAC) aus der ID des Läufers und diesem Salt, unter einem Geheimnis, das nur der Server hält, sodass zwei Laufwege desselben Sammlers voneinander unabhängige Tags tragen. Eine Anfrage nach Echos trägt die IDs, die der Anfragende ausgeblendet hat; der Server berechnet für jeden gespeicherten Laufweg das Tag jeder ausgeblendeten ID neu, lässt die passenden Laufwege weg und verwirft die Liste, wenn die Anfrage beantwortet ist, oder, bei einer Live-Verbindung, wenn der Socket schließt. Was einen Client erreicht, sind eine schlichte Figur, der Pfad und die Stunde: keine ID, kein Tag, kein Salt und nichts aus der Figur des Läufers. Das entfernt die Kennung und das Aussehen, die heute bei jeder Ankunft zusammen reisen (
Player.public()inserver/app/rooms.pysendet ID, Namen und Figur in einem Objekt, undserver/app/main.pysendet es an den ganzen Raum). Den Laufweg entfernt es nicht. Ein Pfad, sein Tempo und seine Stunde können für jemanden, der in dieser Stunde auf dem Platz war oder weiß, wohin ein Freund immer geht, auf einen Sammler hindeuten, und ein Client, der während desselben Laufwegs im Raum war, hat jedes Tile mit der ID des Läufers inmovedempfangen. Echos sind namenlos, nicht anonym.2320 - Was es speichert, und die COPPA-Lesart. Kein Name, keine Game-Center-ID, keine Geräte-ID, keine Figur des Läufers, keine Region und keine Zeit feiner als die Stunde: die Tiles, Schrittzeiten relativ zum Beginn des Laufwegs, die Stunde, das Salt, das auch die schlichte Figur wählt, und das Tag, mit dem ein Ausblenden angewendet wird. Lesart, keine Beratung: Das Tag ist von einer dauerhaften Kennung abgeleitet, also behandle ich es wie eine. Es bleibt auf dem Server, wird nie gesendet und ausschließlich dazu verwendet, ein Ausblenden anzuwenden, was ich als die Nutzung für interne Abläufe lese, die § 312.5(c)(7) beschreibt, mit Hinweis. Den Laufweg, wie er gesendet wird, ohne Kennung und mit einer vom Server gewählten Figur, lese ich als außerhalb der Definition personenbezogener Daten in der Regel. Die Schwachstelle dieser Lesart ist, dass ein Laufweg Verhalten ist und jemand, der den Platz in dieser Stunde gesehen hat, ihn einem Sammler zuordnen kann; die Zeit nur auf die Stunde, die Obergrenze von 60 Sekunden und die sieben Tage verengen das, schließen es aber nicht aus. Die ausgeblendeten IDs, die eine Anfrage trägt, werden für diese Anfrage verwendet und weder protokolliert noch behalten. Die schriftliche Aufbewahrungsrichtlinie im Datenschutzhinweis nennt 7 Tage, wie § 312.10 es verlangt.19 Damit wird der Server von einem, der nichts speichert, zu einem, der Laufwege eine Woche lang speichert, und die Lesart ist eine für den Anwalt, den der Plan aufschiebt, bis es Zugkraft gibt.23
- Wer aufgezeichnet wird. Niemand unter 13: Nach der Entscheidung vom 2. Oktober haben sie gar keinen Platz.23 Niemand, bei dem
isMultiplayerGamingRestrictedtrue ist (sie haben keinen Live-Platz, auf dem sie gehen könnten, Einstellung 1), niemand, bei demisUnderagetrue ist, was Einstellung 2 bereits als Kindersignal behandelt, und niemand im Alter von 13 bis 15 nach dem angegebenen Bereich, was die erste der Jugendregeln ist, die der Plan noch zu schreiben lässt.185223 - Darf nicht ähneln. Einem Blutfleck, einem wiedergegebenen Tod, einem Beschwörungszeichen, einer Wand aus Spielerbeiträgen. Ein Echo ist nie ein Wesen und kämpft nie.4144
Prüfungen. (a) Ein Server-Test zeichnet 10 Besuche auf und stellt sicher, dass 8 behalten werden, wobei der älteste verworfen wird, und dass keiner eine um 7 Tage vorgestellte Uhr überlebt. (b) Ein Schema-Test stellt sicher, dass ein gespeicherter Laufweg genau die Felder path, hour, salt und tag hat, ohne Namen, ID oder Figurenzeichenkette darin, und dass die Echos, die ein Client empfängt, genau die Felder figure, path und hour haben: kein Hash-, Tag-, Salt- oder ID-Feld. Er stellt sicher, dass die Figurenzeichenkette des Echos diejenige der vier ist, die der verschlüsselte Hash des Salts des Laufwegs wählt, gleich, was der Läufer trug, und bei einem Läufer, der eine Figur außerhalb der schlichten vier trägt, dass es nicht die des Läufers ist. (c) Ein UI-Test ohne Live-Mitspieler zeigt bis zu 8 Echos, und keines reagiert auf Antippen. (d) Ein Test mit dem Flag für eingeschränkten Mehrspielermodus, einer mit isUnderage und einer mit dem Bereich von 13 bis 15 stellen sicher, dass der Server von diesem Client keinen Besuch aufzeichnet. (e) Ein Server-Test speichert Laufwege von zwei Sammlern, fragt Echos mit einem von ihnen ausgeblendet an, findet die Laufwege dieses Sammlers weggelassen und findet die ausgeblendete ID danach nirgends im Zustand des Servers.
7.3 Der heutige Gruß
- Mechanik. Jeder Stadtbewohner merkt sich, ob Sie heute mit ihm gesprochen haben.1110 Das erste Gespräch des lokalen Tages wählt eine Begrüßungszeile („Back again!“ und Ähnliches, für Kiradex geschrieben und nach Index 22 in
server/app/lines.pyergänzt); spätere Gespräche am selben Tag wählen eine gewöhnliche Zeile.21 Jeder dritte Tag, an dem Sie mit demselben Stadtbewohner gesprochen haben, rückt ihn eine Stufe auf einer verborgenen Leiter der Stammgäste vor, gezählt ab Ihrem ersten Gespräch und nie zurückgesetzt, und auf jeder Stufe sagt er eine neue Zeile. Es wird keine Anzeige gezeigt. - Kein Verfall. Nichts geht verloren, wenn Sie einen Tag oder einen Monat auslassen. Stardews Freundschaft verfällt für jeden Tag, an dem Sie nicht sprechen; diese hier nie, weil PEGI „daily quests, log-in streak or event-based rewards that expire after a while“ (tägliche Aufgaben, Login-Serien oder ereignisbasierte Belohnungen, die nach einer Weile verfallen) mit PEGI 7 einstuft, und mit PEGI 12, wenn „players are punished by losing rewards or game status when they do not return in time.“ (Spieler bestraft werden, indem sie Belohnungen oder Spielstatus verlieren, wenn sie nicht rechtzeitig zurückkehren.)105958
- Wo er lebt. Auf dem Gerät: ein Wörterbuch von Stadtbewohner-ID zum letzten lokalen Datum eines Gesprächs und zur Zahl der Gesprächstage, im Profil des Sammlers, sodass der Server ohne Speicher pro Spieler bleibt.
Prüfungen. (a) Ein Unit-Test spricht am 2026-10-05 zweimal und am 2026-10-06 einmal mit einem Stadtbewohner und erhält zwei Erstbegrüßungen des Tages und eine gewöhnliche Zeile. (b) Ein Unit-Test stellt das Gerätedatum vor und zurück und findet, dass nie eine Stufe der Leiter entfernt wird. (c) Eine Suche in server/app findet keinen für diese Funktion hinzugefügten Speicher pro Spieler. (d) Ein Unit-Test mit ersten Gesprächen an drei Tagen, die Wochen auseinanderliegen, findet den Stadtbewohner eine Stufe höher auf der Leiter.
7.4 Präsenz ohne Rücksprünge
- Senden. Ein
movepro abgeschlossenem Tile, wie heute. Die heutige Basis sind 4 pro Sekunde beim Laufen und 6,0 bis 6,4 beim Rennen (das Rennen wie bei 60 Hz modelliert und mit seiner Nennrate); nach dem Bewegungsvertrag der Reihe, den 16 Ticks pro Tile beim Laufen und 8 beim Rennen bei 60 Hz aus dem Bewegungs-Briefing, sind es 3,75 und 7,5, und auf diesen Vertrag arbeitet dieses Briefing hin. Beides liegt unter dem Limit von 8 pro Sekunde.2122 Der Server fügt jedemmoved, das er weiterleitet, seinen eigenen Millisekunden-Zeitstempel hinzu. - Rendern. Jeder Client hält aus den empfangenen Zeitstempeln eine Schätzung der Serveruhr und zeichnet jeden anderen Sammler auf einer Renderuhr, die 350 ms hinter dieser Schätzung liegt: linear zwischen den beiden empfangenen Zeitstempeln, die die Renderuhr einschließen, mit dem Laufzyklus nach zurückgelegter Strecke. Nie einen laufenden Schritt zurücksetzen. Läuft der Puffer leer, auf dem letzten Tile verharren; ein Läufer auf einem Raster bleibt abrupt stehen, also wird nichts extrapoliert. Nur springen, wenn ein Läufer mehr als 6 Tiles oder 2 Sekunden zurückliegt.716 Die 350 ms stammen aus einer Schranke, geprüft in einem Modell, das eine exakte Uhrschätzung und keine Einwegverzögerung über den Jitter hinaus annahm (Abschnitt 3): Beim Laufen des Bewegungsvertrags mit 3,75 Tiles pro Sekunde ist ein Schritt 266,7 ms lang, ein Schritt plus 80 ms Jitter sind 346,7 ms, und eine mindestens so lange Verzögerung hungert bei keiner Jitter-Ziehung einen Frame aus. Das lässt etwa 3 ms für den Fehler der Uhrschätzung; eine Schätzung, die der Serveruhr weiter vorausläuft, kann Frames aushungern. 325 ms bestanden Prüfung (a) in der ersten Jitter-Ziehung des Modells, mit 6 ausgehungerten Frames bei 80 ms, scheiterten aber in 8 von 200 Ziehungen; 350 ms hungerten in keiner aus.7 Das ist ein Startwert, den eine Aufnahme auf Geräten bestätigen muss, kein Ergebnis.
- Untätigkeit. Einen Sammler nach 120 Sekunden ohne Eingabe als untätig markieren, dargestellt durch den bestehenden
doze-Leerlaufzyklus des Rigs, so wie Arcturus einen Avatar nach 240 Zyklen zu 500 ms als untätig markiert.1550 Den Socket nach 240 Sekunden ohne Ping schließen. Diese Regel ist meine Anpassung zweier Quellen: Die Ping-Prüfung stammt von Houdini, das jeden Client schließt, der in einem Fenster von 61 Sekunden keinen Heartbeat gesendet hat, und die 240 Sekunden sind die Dauer, nach der Arcturus einen untätigen Nicht-Besitzer entfernt, wobei Arcturus Zyklen ohne Aktion zählt, nicht fehlende Pings.4815
Prüfungen. (a) Die neue Logik in measure_remote_walk.py übertragen, mit der Renderuhr aus der Schätzung der Serveruhr durch den Client statt aus der eigenen Uhr des Senders, und mit dem Sender bei 3,75 und 7,5 Tiles pro Sekunde 0 Rückwärts-Frames in allen sechs Fällen verlangen, 0 ausgehungerte Frames bei 0 und 30 ms Jitter und höchstens 10 ausgehungerte von den 600 Frames, die bei 80 ms gezeichnet werden, solange der Sender sendet. Das Modell mit exakter Uhr ergibt bei 350 ms in allen sechs Fällen 0 ausgehungerte Frames, in jeder von 200 Jitter-Ziehungen.7 (b) Ein UI-Test mit einem geskripteten Mitspieler, der quer über den Platz nach rechts geht, nimmt keinen Frame auf, in dem das x des Mitspielers abnimmt. (c) Ein Server-Test stellt sicher, dass jedes weitergeleitete moved einen Zeitstempel trägt. (d) Ein Server-Test stellt die Uhr ohne Ping 241 Sekunden vor und stellt sicher, dass der Socket geschlossen ist.
7.5 Das Satzbuch
- Form. Sechs Zweige mit je 8 bis 12 Zeilen zum Start, 48 bis 72 insgesamt, jede Zeile zwei Antipp-Vorgänge entfernt (Zweig, dann Zeile): Grüße, Antworten (eine Lieblingsära, wie lange Sie schon sammeln, welches Set), Sammeln, Tauschen (einen Tausch vereinbaren, nie einen bepreisen), Anfeuern und Abschiede. Heute gibt es 14 Spielerzeilen in einer Liste.21 Emotes bleiben eine eigene Reihe. Ein Spieler, für den Game Center eingeschränkte Kommunikation meldet oder der minderjährig ist, bekommt das Satzbuch gar nicht (7.6, Einstellung 2).
- Wachstum. Bis zu 30 weitere Zeilen, durch Spielen freigeschaltet, höchstens eine pro Tag, aus der Stammgast-Leiter in 7.3 und aus Stufen.1235 Der Server hält die Liste und kann eine Zeile innerhalb einer Stunde zurückziehen, da er die Liste ohnehin bei der Ankunft sendet.20
- Gegen den Kanon. Easy Chat öffnet 940 Wörter und setzt sie zu Rastern von 2 bis 10 Plätzen zusammen; New Horizons hat 88 Reaktionen; Smaragds Union-Raum nahm 15 getippte Zeichen.38124 Die Zeilen von Kiradex sind ganze Sätze, nie aus Wörtern zusammengesetzt, sodass keine Folge von Auswahlen einen Namen, eine Zahl oder einen Ort buchstabieren kann.
- Darf nicht ähneln. Der Gruppenstruktur von Easy Chat oder seinem Wortraster, der Modewortliste oder irgendeinem Begriff aus der Marke.40
Das vorgeschlagene Satzbuch: die eine Abbildung in diesem Beitrag, die ein Vorschlag und keine Messung ist.26
Prüfungen. (a) Ein Test über lines.py stellt 6 Zweige mit je 8 bis 12 Zeilen zum Start sicher und dass jede Zeile höchstens 2 Antipp-Vorgänge von der Wurzel entfernt ist. (b) Ein Test stellt sicher, dass keine Zeile eine Ziffer oder einen freien Platz enthält. (c) Ein Test liest die Easy-Chat-Wortlisten von pret und findet keine Zeile, die einem Eintrag gleicht, und keinen Eintrag aus zwei oder mehr Wörtern innerhalb einer Zeile. (d) Ein Unit-Test schaltet an zwei aufeinanderfolgenden Tagen je eine Zeile frei und verweigert eine zweite Freischaltung am selben Tag.
7.6 Sicherheitseinstellungen, jede mit einer Prüfung
- Die Einschränkung von Game Center schaltet andere Sammler ab, live und wiedergegeben. Ist
GKLocalPlayer.local.isMultiplayerGamingRestrictedtrue, „nur Freunde“ eingeschlossen, öffnet sich der Platz als stiller Platz: nur Stadtbewohner, ohne Echos und ohne WebSocket. Die Stadtbewohner und die Uhr des Raums kommen in einer Anfrage, die keine Account-ID, keine Geräte-ID und keine ausgeblendeten IDs trägt; der Server verwendet die IP-Adresse der Anfrage nur, um sie zu beantworten, und der Platz-Server protokolliert sie nicht; die eigenen Edge-Anfrageprotokolle des Hosts sind hier nicht überprüft (Einstellung 6).18 Lesart: Die Seite sagt „If your game uses a custom multiplayer feature, you should disable it,“ (Verwendet Ihr Spiel eine eigene Mehrspielerfunktion, sollten Sie sie deaktivieren), und ein Echo ist die Wiedergabe des Laufwegs eines echten Sammlers, eine Spur eines anderen Spielers der Art, die Abschnitt 2 untersucht, und eine, die ein Betrachter wiedererkennen kann (7.2). Wikipedia beschreibt die geisterhaften Bilder anderer Spieler in Dark Souls unter der Überschrift Multiplayer des Spiels, ohne zu sagen, ob es Aufzeichnungen oder zu dieser Zeit verbundene Spieler sind. Diese Quelle ist uneinheitlich: Der Text unter der Überschrift sagt, das Spiel „integrates online features into the single-player world“ (integriert Online-Funktionen in die Einzelspielerwelt), und führt „Direct multiplayer“ (direkten Mehrspielermodus) als kooperative Beschwörungen und Invasionen auf, getrennt von den Geistern. Das Briefing wählt trotzdem die vorsichtige Seite: Nach meiner Lesart sind Echos Teil der eigenen Mehrspielerfunktion des Platzes, und ein Spieler, dessen Eltern den Mehrspielermodus eingeschränkt haben, sieht keine.1841 Echos könnten für diesen Spieler zurückkehren, wenn App Review oder Apple schriftlich einen wiedergegebenen Laufweg in einer schlichten Figur ohne angehängte Kennung als etwas anderes als Mehrspieler lesen würde; dieses Briefing setzt das nicht voraus. Prüfung: Ein UI-Test mit auf true gesetztem Flag stellt sicher, dass kein WebSocket geöffnet, kein Echo gezeichnet wird und dass der Platz sagt, er sei still; ein Server-Test ruft die Route des stillen Platzes auf und findet kein Echo in der Antwort und keine IP-Adresse im Protokoll des Servers. - Eigene Kommunikation aus. Ist
isPersonalizedCommunicationRestrictedoderisUnderagetrue, gibt es standardmäßig nur Emotes: Das Satzbuch ist ausgeblendet, keinsaywird gesendet, die Zeilen anderer Sammler werden für diesen Spieler nicht gezeichnet, und es gibt nie Sprache, eine Einladungsnachricht oder ein Eingabefeld.5152 Lesart: Die Seite sagt „If your game includes any custom communication features, you should disable them,“ (Enthält Ihr Spiel eigene Kommunikationsfunktionen, sollten Sie sie deaktivieren), und ein Satzbuch aus vorgefertigten Sätzen ist eine eigene Kommunikationsfunktion. Dass Game Center Kindern in seinen eigenen Funktionen vorgefertigte Nachrichten erlaubt, nimmt die eigenen Funktionen eines Spiels nicht aus.5117 Ich behalte Emotes, weil ein Winken oder ein Nicken nichts trägt, womit ein Kind jemanden erreichen könnte, aber ein Emote ist eine Art Kommunikation (Wikipedias Darstellung von Journey nennt dessen Klang „The only form of communication between the two“, die einzige Form der Kommunikation zwischen beiden), und das ist der schwächste Schritt in der Lesart: Liest App Review auch Emotes als eigene Kommunikationsfunktion, entfallen sie, und der Platz bietet diesem Spieler nur noch Präsenz.5 Die Zeilen für diesen Spieler zu behalten, wäre eine Ausnahme, die Apples schriftliche Zustimmung braucht; dieses Briefing nimmt sie nicht in Anspruch. Prüfung: Eine Suche inKiradex/WorldnachTextField,TextEditorundUITextFieldliefert nichts, und ein UI-Test mit jeweils einem auf true gesetzten Flag zeigt die Emote-Reihe, kein Satzbuch, sendet keinsayund zeichnet keine Zeile eines anderen Sammlers. - Altersbereiche nach Declared Age Range, wie am 2. Oktober entschieden. Unter 13: kein Platz, nur ein generierter Name. 13 bis 15: der Platz mit Jugendregeln, deren erste lautet, dass ihre Laufwege nie aufgezeichnet werden. Ab 16 oder ohne Angabe: der volle Platz.2354 Prüfung: ein Unit-Test der Modustabelle über die drei Bereiche und die drei Game-Center-Flags.
- Melden und Ausblenden erreichen die Echos. Wer einen Sammler ausblendet, blendet seine Live-Figur aus und, wie in 7.2 für jede Anfrage auf dem Server gefiltert, seine Echos; das Melden bleibt auf dem Panel jedes Sammlers.55 Ein Echo trägt eine schlichte Figur und hat kein Panel, ein Spieler kann das Echo eines ausgeblendeten Sammlers also nicht herausgreifen, um es auszublenden; das erledigt der Filter des Servers. Ein Ausblenden erreicht Laufwege, die davor und danach gespeichert wurden; es erreicht nicht, was ein anderer Spieler live gesehen hat oder in einem Laufweg wiedererkennt. Prüfung: der Server-Test in 7.2(e) und ein UI-Test, der einen geskripteten Mitspieler ausblendet, seinen aufgezeichneten Laufweg abspielt und sicherstellt, dass er nicht gezeichnet wird.
- Keine zufällige Paarung, kein anonymer Chat. Fremde teilen immer nur den Platz; nichts bringt zwei Fremde in einem privaten Raum zusammen.55 Prüfung: Ein Test über die Handler in
server/app/main.pyfindet keine Nachricht, die einen Kanal zwischen zwei Sammlern öffnet, die keine Game-Center-Freunde sind. - Aufbewahrung schriftlich. Der Datenschutzhinweis erhält die schriftliche Richtlinie zur Datenaufbewahrung: Präsenz nur im Speicher; Echos 7 Tage, jedes mit einem verschlüsselten Hash der ID des Läufers, der auf dem Server bleibt, nur zum Anwenden von Ausblendungen verwendet und nie gesendet wird; die ausgeblendeten IDs, die eine Anfrage trägt, werden nicht behalten; die IP-Adresse einer Verbindung wird nur verwendet, um sie zu beantworten und die Antwort zu routen, was ich als Unterstützung interner Abläufe nach § 312.5(c)(7) lese, und vom Platz-Server nicht protokolliert; Meldungen werden nach Grund und Raum protokolliert.19 Heute startet der Server uvicorn 0.37.0 mit seinen Standardwerten (
server/Procfile,--proxy-headers), und nach meiner Lektüre des eigenen Codes von uvicorn schreiben diese Standardwerte die weitergeleitete Adresse des Clients für jede HTTP-Anfrage ins Protokoll (das Zugriffsprotokoll ist an, solange es nicht abgeschaltet wird) und für jeden angenommenen WebSocket (eine INFO-Zeile aufuvicorn.error); das Briefing startet ihn mit--no-access-log --log-level warning.57 Prüfung: Die URL des Hinweises ist aus den Einstellungen erreichbar, der Server-Test in 7.2(a) hält die 7 Tage ein, und ein Test, der unter dem Produktions-Startbefehl einen WebSocket öffnet und die Route des stillen Platzes aufruft, findet keine IP-Adresse im aufgezeichneten Protokoll. Die Edge-Anfrageprotokolle des Hosts liegen außerhalb dieses Tests und sind hier nicht überprüft: Ob sie die Adresse des Clients aufzeichnen und wie lange, ist vor dem Schreiben des Hinweises mit dem Host zu klären. - Keine Analysen oder Werbung von Drittanbietern in der Welt.55 Prüfung: Ein Abhängigkeitsaudit des App-Targets listet kein Analyse- oder Werbe-SDK.
Was abzulehnen ist
- Ein eigener Spielzeit-Timer. Screen Time begrenzt die Zeit in einer App bereits, und der Server von Club Penguin zählte die erlaubten Minuten eines Kindes herunter und trennte bei null; das Limit der Plattform ist das, das Eltern bereits kennen.1748
- Followerzahlen und jede Zählung, wer wen mag; der Plan schließt sie bereits aus.23
- Eine Besucherliste mit Namen, eine Seite darüber, wer vorbeikam. Ein Echo ist mit Absicht namenlos: Es trägt keine ID und nichts aus der Figur des Läufers. Anonym ist es nicht: Wer in dieser Stunde auf dem Platz war oder die Gewohnheiten eines Freundes kennt, kann einen Laufweg trotzdem wiedererkennen, weshalb ein Echo die Stunde und keine feinere Zeit trägt und weshalb es keine Liste gibt, aus der man Echos ablesen könnte.
- Ein Echo, das man antippen, ansprechen oder dem man folgen kann.
- Eine Anzeige für den heutigen Gruß oder irgendetwas, das verloren geht, wenn man nicht zurückkommt.59
Nicht in diesem Briefing
- Räume, die Menschen einrichten. Möbel, Mützen und Besuche in den Räumen anderer Sammler gehören in einen kommenden Beitrag dieser Reihe.
- Der Wortlaut neuer Zeilen. Das Briefing legt die Form des Satzbuchs fest; die Sätze werden für Kiradex geschrieben und separat lokalisiert.
- Gruppenspiel. Tausch, Zeigen und Erzählen und der Tauschbildschirm, den der Plan als noch nicht gebaut führt, liegen außerhalb dieses Briefings.23
- Irgendetwas aus den gemessenen Spielen. Kein Wesen, kein Ortsname, kein Zeichen, kein Tile und kein Klang aus Pokémon, Stardew Valley, Animal Crossing, Dark Souls, Journey, Death Stranding, Splatoon, Habbo oder Club Penguin.
- Zeiten auf einem Gerät. Die Prüfungen betreffen Verhalten, Aufnahmen und ein Modell; nichts hier verspricht eine Framezeit.
Wichtigste Erkenntnisse
Wenn Sie die Grafik zeichnen
- Zeichnen Sie mehr stehende als gehende Menschen. Sechs von zehn der Stadtbewohner, die immer auf Smaragds Karten sind, stehen an einem Posten, die meisten in eine Richtung blickend und einige sich umschauend (sieben von zehn, wenn man die Darsteller der Story mitzählt); geben Sie jeder stehenden Figur eine Blickrichtung und ein Umschauen, und heben Sie die Laufzyklen für die knapp vier von zehn auf, die wandern.1
- Lassen Sie das Echo des Laufwegs eines anderen Spielers wie eine Spur wirken, nicht wie eine Person: blass, namenlos, mit leeren Händen, an einer Tür verblassend. Nichts an seiner Zeichnung sollte zum Antippen einladen.5
Wenn Sie die Engine bauen
- Rechnen Sie den Tag der Stadt bei der Ankunft ab, mit einem Durchlauf, der die Zahl der vergangenen Tage nimmt, und berechnen Sie das Tile eines Stadtbewohners aus einer Uhr, die alle im Raum teilen, nicht aus der jedes Telefons; eine Serverschleife, die bei leerem Raum zurückkehrt, lässt die Stadt erstarren, wie Kiradex’ gemessene Schleife.36
- Machen Sie das Schrittintervall des Servers zu einer ganzen Zahl von Ticks und zeichnen Sie jeden Schritt über das Intervall, das ihm gegeben wurde; ein Schritt von 0,7 s auf einem Tick von 0,5 s landet alle 1,0 s und wird in 0,25 s gezeichnet, ein Gang, der 75 Prozent der Zeit stillsteht.6
- Senden Sie eine Aktualisierung pro Tile, versehen Sie sie auf dem Server mit einem Zeitstempel und zeichnen Sie andere Läufer auf einer Uhr 350 ms hinter der geschätzten Serverzeit, ohne je einen laufenden Schritt zurückzusetzen; im Modell, bei den 3,75 und 7,5 Tiles pro Sekunde der Reihe und mit exakter Uhrschätzung, sind das bei bis zu 80 ms Jitter 0 Rückwärts-Frames und 0 ausgehungerte.7
- Lesen Sie
isMultiplayerGamingRestricted,isPersonalizedCommunicationRestrictedundisUnderage, bevor Sie einen Socket öffnen; „nur Freunde“ gilt als eingeschränkt, und nach meiner Lesart sollte ein eingeschränkter Spieler auch keine Wiedergaben anderer Spieler sehen.185152
Wenn Sie die Spielschleife entwerfen
- Halten Sie die Spuren anderer in wenigen festen Plätzen, die verfallen: acht Laufwege für sieben Tage reichen, um zu sagen, dass jemand hier war. Wenden Sie Ausblendungen auf dem Server an, senden Sie eine Spur ohne ID und in einer schlichten Figur statt der eigenen des Läufers, und sagen Sie offen, dass ein Laufweg von jemandem, der ihn gesehen hat, trotzdem wiedererkannt werden kann.414
- Merken Sie sich den heutigen Gruß mit einem Flag und nehmen Sie für einen verpassten Tag nie etwas zurück; PEGI stuft verfallende Serien ein.59
- Geben Sie Fremden Sätze, keine Wörter: Ein Satzbuch aus ganzen Sätzen lässt sich nicht dazu bringen, irgendetwas zu buchstabieren, und Game Center beschränkt Kinder ohnehin auf vorgefertigte Nachrichten. Wenn Game Center meldet, dass Kommunikation eingeschränkt ist, nehmen Sie auch das Satzbuch weg.381751
Häufige Fragen
Wie wirkt eine Spielstadt lebendig, wenn keine anderen Spieler online sind?
Geben Sie ihr Stadtbewohner mit eigenen Routinen und Spuren von Menschen, die da waren. In den 16 Städten von Pokémon Smaragd-Edition stehen 59 der 100 Stadtbewohner ohne Ausblende-Flag an Posten, 39 wandern in Feldern von ein oder zwei Zellen und 2 laufen auf der Stelle (71,5 %, 27,2 % und 1,3 % aller 158, wenn man die Darsteller der Story mitzählt, die ein Flag entfernen kann und die meist stehen); sie gehen im Tempo des Spielers und warten zwischen den Schritten 0,54 bis 2,14 Sekunden; die Dorfbewohner in Stardew Valley haben Tage aus wenigen zeitlich festgelegten Punkten, ausgewählt durch 22 Schlüsselformate; und Smaragds Record Mixing kopiert die Basen, Modewörter und den Bewohner eines anderen Spielers in Ihre Stadt.124
Wie oft sollten sich NPCs in einem Pixelspiel mit Draufsicht bewegen?
In Smaragd macht ein Wanderer einen Schritt von 16 Frames (268 ms, dieselbe Aktion wie der Gang des Spielers) und wartet dann 32, 64, 96 oder 128 Frames, ist also höchstens 11 bis 33 Prozent der Zeit in Bewegung, pro ausgeführtem Schritt, und weniger, wenn ein gewählter Schritt blockiert ist; die meisten Stadtbewohner haben einen Standard-Bewegungstyp, der nie einen Schritt macht, auch wenn ein Story-Skript einen von ihnen trotzdem gehen lassen kann. Animal Crossing: Wild World ging den anderen Weg und machte seine Dorfbewohner langsamer als den Spieler. Schlecht wirkt ein Tempo, das keines von beiden ist: Die Sammler von Kiradex bewegen sich in Schüben von einem Tile mit der Geschwindigkeit des Spielers und halten zwischen den Tiles 0,75 Sekunden an.1326
Was ist Record Mixing in Pokémon Smaragd?
Ein Austausch per Linkkabel, bei dem jedes Spiel dem anderen eine feste Struktur aus 11 Arten von Datensätzen in 5.188 Bytes sendet, darunter 20 Geheimbasen, 25 Fernsehplätze, 16 Nachrichten und 5 Modewörter. Der alte Mann aus Mauville des Partners ersetzt Ihren, und die Ankunft des Hipsters ist das Einzige, was ihn ein weiteres Modewort beibringen lässt.435
Wie viel Interpolationsverzögerung braucht ein 2D-Mehrspielerspiel?
Glenn Fiedlers Regel lautet: genug, um zwei verlorene Pakete zu überstehen, etwa drei Sendeintervalle, plus ein oder zwei Frames für Jitter.16 Über WebSockets, die auf TCP laufen, geht nichts verloren, und ein verspätetes Paket wird erneut gesendet, also ist das Budget nach meiner Lesart Jitter statt verlorener Pakete, und ein Puffer von etwas mehr als einem Intervall kann genügen. Für eine Rasterwelt, die eine Aktualisierung pro Tile sendet, ergab ein Modell des Laufens in Kiradex mit den 3,75 Tiles pro Sekunde beim Laufen und 7,5 beim Rennen dieser Reihe, dass eine Renderuhr 350 ms hinter der geschätzten Serverzeit bei bis zu 80 ms Jitter 0 Rückwärts-Frames und 0 ausgehungerte Frames liefert; in einer Jitter-Ziehung hungern 300 ms beim Laufen mit 80 ms 27 von 600 Frames aus und 325 ms 6, während 100 ms in jedem Fall 125 bis 456 aushungern, und über 200 Ziehungen hungern 350 ms in keiner aus. Die 350 ms beruhen auf einer Schranke: ein Schritt von 266,7 ms bei 3,75 Tiles pro Sekunde plus 80 ms Jitter ergibt 346,7 ms. Es ist ein Modell mit gerader Straße, gleichverteiltem Jitter, exakter Uhrschätzung und ohne Grundlatenz, keine Aufnahme von einem Gerät.7
Dürfen Kinder in einem iOS-Spiel chatten?
Game Center sagt, dass Kinder „cannot send or receive user-inputted text“ (keinen von Benutzern eingegebenen Text senden oder empfangen können) und „restricted to sending and receiving preset messages“ (auf das Senden und Empfangen vorgefertigter Nachrichten beschränkt) sind, mit deaktiviertem Sprachchat. Apples Dokumentation fordert ein Spiel mit „any custom communication features“ (eigenen Kommunikationsfunktionen) auf, diese zu deaktivieren, wenn isPersonalizedCommunicationRestricted oder isUnderage true ist, und Richtlinie 1.2 verlangt für nutzergenerierte Inhalte Filterung, Meldung, Blockierung und veröffentlichte Kontaktdaten. Dieser Satz nimmt vorgefertigte Nachrichten nicht aus, daher entfallen nach meiner Lesart die eigenen vorgefertigten Zeilen eines Spiels, wenn eines der beiden Flags true ist, auch wenn Game Center Kindern in seinen eigenen Funktionen vorgefertigte Nachrichten erlaubt; das Briefing von Kiradex behält für einen solchen Spieler nur Emotes, und diese Lesart ist meine, nicht Apples Text.175155
Erlaubt COPPA, die Bewegungen anderer Spieler zu speichern und als Geister wiederzugeben?
Ich bin kein Anwalt, und das ist eine Lesart, keine Beratung. Die geänderte Regel zählt „A persistent identifier that can be used to recognize a user over time“ (eine dauerhafte Kennung, mit der sich ein Nutzer über die Zeit wiedererkennen lässt) zu den personenbezogenen Daten, erlaubt einem Betreiber, eine dauerhafte Kennung allein „for the sole purpose of providing support for the internal operations“ (ausschließlich zur Unterstützung der internen Abläufe) mit Hinweis zu verwenden, und verlangt seit dem 22. April 2026 eine schriftliche Aufbewahrungsrichtlinie mit Löschfrist. Das Design von Kiradex speichert einen Laufweg ohne Namen, ohne Account-ID, ohne Geräte-ID und nicht die Figur des Läufers, dazu einen verschlüsselten Hash der ID des Läufers, der auf dem Server bleibt, nur zum Anwenden der Ausblendungen anderer Spieler verwendet und nie gesendet wird; das Echo wird in einer von vier schlichten Figuren gezeichnet, die der Server wählt, und beides wird sieben Tage aufbewahrt und in dieser Richtlinie genannt. Ich behandle den Hash als dauerhafte Kennung für interne Abläufe und den gesendeten Laufweg als außerhalb der Definition, aber ein Laufweg ist Verhalten, das jemand, der den Platz in dieser Stunde gesehen hat, einem Sammler zuordnen könnte; Echos sind also namenlos statt anonym, und ein Anwalt sollte das endgültige Design prüfen.19
Verwandt auf dieser Website: Pixel-Art-Welten auf dem iPhone ist der erste Leitfaden dieser Reihe, mit den Tile-Systemen und dem Platz, in dem die Stadt dieses Beitrags liegt, und seine rechtlichen FAQ ziehen die Patentgrenze, der das Briefing folgt; Pixel-Art-Figuren baute die Sammler und die Schmiede, deren schlichte Figuren die Echos tragen, und zitiert die PEGI-Regel, die den heutigen Gruß vor dem Verfall bewahrt; Pixel-Art-Bauten baute die Türen, durch die die Stadtbewohner nachts nach Hause gehen; Pixel-Art in Bewegung misst die Gänge der Handhelds, modelliert den der App und setzt die Regel, nie einen Schritt zurückzusetzen, die das Briefing auf andere Sammler anwendet; und iPhone Duo für Entwickler behandelt das Gerät, für das der Platz gezeichnet wird.
Quellen
-
Messung des Autors,
measure_npcs.pyim Beweisordner des Autors für diesen Beitrag, überarbeitet und erneut ausgeführt am 5. Oktober 2026, Ausgabe gespeichert alsmeasure_npcs.out. Eingaben: diepokeemerald-Dekompilierung von pret, ein flacher Klon bei Commit731ad5b(master, 1. Oktober 2026):include/constants/event_object_movement.h(die 81 Bewegungstypen), die 16data/maps/*/map.json-Dateien der Städte (Objektereignisse, Grafik-IDs, Bewegungstypen, Bereiche, Ausblende-Flags) undsrc/event_object_movement.c(die Schritttabellen, die drei Verzögerungstabellen, bei 59,7275 Hz getaktet, welcher Bewegungstyp welche Verzögerung setzt, undMovementType_WanderAround_Step4). Die Überarbeitung sortiert Objektereignisse nachgraphics_idin Menschen, Objekte (6ITEM_BALL, 2TRUCK, 1MR_BRINEYS_BOAT) und Wesen (5) und bricht ab, wenn eine Grafik-ID auftaucht, die sie nicht klassifiziert hat; die EreignisseVAR_0undVAR_3, deren Sprite aus einer Variablen stammt, werden als Menschen gezählt, weil jedes von ihnen das Ausblende-Flag eines Rivalen trägt. Die frühere Version zählte alle 172 Objektereignisse als Stadtbewohner; sie und ihre Ausgabe liegen mit dem Suffix.r1daneben, und die Ausgabe der Überarbeitung wiederholt die früheren Zeilen unverändert. Die erste Überarbeitung und ihre Ausgabe liegen mit dem Suffix.r2vor; das aktuelle Skript, eine zweite Überarbeitung, teilt die 158 Menschen nach dem Ausblende-Flag in ihrem Objektereignis: die 58 mit einem (54 stehen, 4 wandern; 41 davon verwenden den Sprite eines Schurkenteams, des Rivalen oder einer benannten Figur, nach einer festen Liste von Grafik-IDs im Skript) und die 100 ohne (59 stehen, 39 wandern, 2 laufen auf der Stelle), und zählt die Menschen ohne Ausblende-Flag in den drei Städten neu (Littleroot 2, Petalburg 3, Mauville 6); seine Ausgabe wiederholt jede frühere Zeile unverändert. Eine Person ohne Ausblende-Flag ist bei jedem Laden auf der Karte; die 58 Darsteller der Story zu nennen, ist meine Lesart ihrer Sprites und Flag-Namen, kein Feld in den Daten. Die Bewegungsanteile (11 bis 33 Prozent) sind Arithmetik auf den Schritt- und Verzögerungszeilen, 16 Frames über 16 plus 32 bis 128, pro ausgeführtem Schritt: eine Obergrenze, da ein Wanderer, dessen gewählte Richtung blockiert ist, ohne Bewegung erneut blickt und wartet. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Messung des Autors,
measure_daily.pyim selben Ordner, erneut ausgeführt am 5. Oktober 2026, Ausgabe identisch mitmeasure_daily.out. Eingaben: pretpokeemerald731ad5binclude/constants/flags.hundsrc/clock.c; die gespeicherten Seiten des Stardew Valley Wiki „Villagers“ (oldid 191346, bearbeitet am 26. Februar 2026), „Pierre“ und „Modding:Schedule data“ (die 22 Schlüsselformate aus den Tabellen der Seite gezählt); und Nookipedias Seite „Reaction“ (die Zahlen für New Horizons nach Version). ↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/clock.c(DoTimeBasedEventsundUpdatePerDay, das einmal mitdaysSinceläuft, den Tagen seit seinem letzten Lauf), Commit731ad5b;DoTimeBasedEventswird außerdem beim Laden von Karten insrc/overworld.cund von einer periodischen Feldaufgabe insrc/field_tasks.caufgerufen, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/clock.c. ↩↩↩↩↩↩↩ -
Messung des Autors,
measure_record_mixing.pyim selben Ordner, erneut ausgeführt am 5. Oktober 2026, Ausgabe identisch mitmeasure_record_mixing.out. Eingaben: pretpokeemerald731ad5bsrc/record_mixing.c(struct PlayerRecordEmerald, seine 11 Mitglieder und seine Größe von 0x1444 Bytes),include/constants/global.hund die zugehörigen Header (SECRET_BASES_COUNT,TV_SHOWS_COUNT,POKE_NEWS_COUNT,SAVED_TRENDS_COUNT,APPRENTICE_COUNT),src/mauville_old_man.c(die fünf alten Männer und die Auswahlregel) sowiesrc/union_room_chat.c,include/union_room.hundinclude/constants/global.h(die Gruppenleiter des Union-Raums, Gruppengröße, Sprites, Aktivitätscodes, Tastaturseiten,MAX_MESSAGE_LENGTHundUNION_ROOM_KB_ROW_COUNT). ↩↩↩↩↩↩↩↩↩↩↩↩ -
Wikipedia, „Journey (2012 video game)“, Abschnitte Gameplay und Development, jede Aussage mit eigener Quelle, gespeichert am 4. Oktober 2026, https://en.wikipedia.org/wiki/Journey_(2012_video_game). Die eigene Journey-Seite von thatgamecompany wurde ebenfalls gespeichert und enthält nur Navigation. ↩↩↩↩↩↩↩
-
Messung des Autors,
measure_npc_cadence.pyim selben Ordner, überarbeitet und erneut ausgeführt am 5. Oktober 2026, Ausgabe gespeichert alsmeasure_npc_cadence.out; die Überarbeitung fügt nur eine Zählung jedersaid-Nachricht hinzu (469 in der Stunde), neben den 465 Intervallen zwischen aufeinanderfolgenden Zeilen eines Sammlers, über die der Mittelwert von 30,7 Sekunden gebildet wird, und ihre übrigen Zeilen sind unverändert (die vorherige Version liegt mit dem Suffix.pre-astravor). Sie importiert die eigenen Moduleapp.npcs(STEP_SECONDS,make_all) undapp.rooms(Plaza) des Kiradex-Servers aus dem am 5. Oktober 2026 gelesenen Arbeitsverzeichnis (Dateien und Hashes in Anmerkung 20), liestTICK_SECONDSausserver/app/main.pyund treibt vier Sammler mit Seed 1 auf einer idealen 0,5-s-Uhr 3.600 simulierte Sekunden lang an, wobei jedemoved- undsaid-Nachricht protokolliert wird. Intervalle von 1,5 s oder weniger zwischen aufeinanderfolgenden Schritten zählen als innerhalb eines Abschnitts; längere Lücken sind Pausen. Der Test des leeren Raums prüftRoom.tickauf seine frühe Rückkehr und ruft einmaladvance(10000.0)auf frischen Sammlern auf. Die Zahlen 25 und 75 Prozent teilen den 250-ms-Schritt des Clients (PlazaRig.tilesPerSecond = 4) durch das gemessene Intervall von 1,0 s. Dieser Lauf ersetzt die 0,7 s und 36 Prozent, diemeasure_kiradex.pyallein aus der Konstante ableitet. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Modell des Autors,
measure_remote_walk.pyim selben Ordner, überarbeitet und erneut ausgeführt am 5. Oktober 2026, Ausgabe gespeichert alsmeasure_remote_walk.out; die vorherige Version, die die Arithmetik des Rigs in 64-Bit-Gleitkommazahlen rechnete, und ihre Ausgabe liegen mit dem Suffix.pre-f32vor. Die Überarbeitung führt jede Operation, die das Rig inFloatausführt, in 32 Bit (NumPyfloat32) in der Reihenfolge des Codes aus:progressist einFloat(PlazaRig.swiftZeile 29),updateerhältFloat(event.deltaTime)(PlazaStage.swiftZeile 149), undadvance()addiertdt * tilesPerSecond * (running ? runPace : 1) / length(Zeile 660), wobeirunningnur beim Spieler gesetzt wird (Zeile 614); Positionen sind(Float(x) + 0.5) * 16(TileMap.swiftZeile 235) und werden beifrom + (to - from) * progressgezeichnet, auf ganze Pixel gerundet, bei Gleichstand von null weg (Zeilen 670 und 726). Es gibt die Prüfung aus, dass 15 Frames zu 1/60 Sekunde in 32 Bit genau 1,0 ergeben und in 64 Bit 0,9999999999999999. Es implementiertPlazaRig.move(other:to:facing:)so nach, wie es am 5. Oktober gelesen wurde (Pfad ab dem letzten ganzen Tile des Läufers;progress = 0bei jeder Nachricht; ein Sprung, wenn der Pfad leer oder länger als 6 Schritte ist), und zählt als Rücksprung ein Zurücksetzen, solange Schritte übrig sind und der Fortschritt 0,05 übersteigt, als Rückwärts-Frame eine gezeichnete Pixelposition, die kleiner ist als im Frame davor, und den Rückstand aus der gezeichneten Pixelposition. Getrennt davon modelliert es Snapshot-Interpolation auf einer gleichmäßigen Renderuhr,rt = now - delayfür Verzögerungen von 100, 250, 300, 325 und 350 ms, wobeinowdie Uhr des Senders ist; die modellierte Regel ist also die geschätzte Serverzeit minus der Verzögerung, nicht die neueste Aktualisierung minus der Verzögerung; diese Hälfte ist ein vorgeschlagener Renderer, nicht das Rig, und läuft in 64-Bit-Gleitkommazahlen. Annahmen: dasdeltaTimejedes Frames genau 1/60 Sekunde; kein fused multiply-add; perfekte Uhrsynchronisation zwischen Sender und Renderer; keine Grundlatenz in einer Richtung, sodass eine Aktualisierung zu ihrem Zeitstempel plus Jitter eintrifft; eine gerade, offene Straße (die Pfadlänge ist die Manhattan-Distanz; diagonale Schritte, die im Rig √2-mal so lange dauern, sind nicht modelliert); ein Sender, der eine Bewegung pro abgeschlossenem Tile sendet, mit den heutigen 4 Tiles pro Sekunde beim Laufen und der Nennrate 6,4 des Rennens für beide Hälften, und für den Puffer zusätzlich nach dem Bewegungsvertrag der Reihe mit 3,75 und 7,5 Tiles pro Sekunde; gleichverteilter Jitter von 0 bis J ms für J gleich 0, 30 und 80; 60 Frames pro Sekunde; Seed 1. Das Rig läuft pro Fall 12 simulierte Sekunden (10 mit Senden und 2 zum Ausklingen) und jeder gepufferte Lauf 660 Frames (11 Sekunden), wobei ausgehungerte Frames nur über die 600 gezählt werden, die gezeichnet werden, solange der Sender noch sendet. Ein zweites Skript,measure_remote_walk_seeds.pyim selben Ordner, ausgeführt am 5. Oktober 2026, Ausgabe gespeichert alsmeasure_remote_walk_seeds.out, lädt dieselbe Interpolationsfunktion aus dem Quelltext vonmeasure_remote_walk.py, stellt sicher, dass Seed 1 dessen 27, 6 und 0 ausgehungerte Frames reproduziert, und führt den Puffer bei 3,75 und 7,5 Tiles pro Sekunde über die Seeds 1 bis 200 erneut aus: bei 80 ms Jitter und Laufen hungern 325 ms auf allen 200 Seeds Frames aus und auf 8 mehr als 10, 350 ms auf keinem, und jeder andere Fall bei 325 und 350 ms auf keinem. Es gibt die Schranke hinter den 350 ms aus: ein Schritt bei 3,75 Tiles pro Sekunde dauert 266,67 ms, plus 80 ms Jitter 346,67 ms, bleiben 3,33 ms. Außerdem verschiebt es die Renderuhr wie eine Uhrschätzung, die der Serveruhr vorausläuft; in diesem Modell, dessen Frames und Schritte auf dem 1/60-s-Raster liegen, hungerte ein Vorlauf von 10 ms auf 200 Seeds noch keinen Frame aus, und 25 ms Vorlauf verhalten sich wie 325 ms; die 3 ms im Text sind also die Garantie der Schranke, nicht der Punkt, an dem dieses Modell auszuhungern beginnt. Es ist ein Modell, keine Aufnahme von zwei Geräten. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/data/maps/, die 16map.json-Dateien der Städte, darunterLittlerootTown,PetalburgCityundMauvilleCity, unddata/maps/PetalburgCity/scripts.inc(der Junge an der Arena,LOCALID_GYM_BOY,MOVEMENT_TYPE_LOOK_AROUNDohne Ausblende-Flag inmap.json, von den BewegungenPetalburgCity_Movement_BoyWalkToGymzur Arena geführt), Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/tree/master/data/maps. ↩↩↩↩ -
Stardew Valley Wiki, „Modding:Schedule data“, gespeichert am 4. Oktober 2026, https://stardewvalleywiki.com/Modding:Schedule_data. Das Format des Tagesplans, Abigails Rohdaten zum Stand der Spielversion 1.5.1, die Schlüsselformate und ihre Reihenfolge sowie der Hinweis unter „Limitations“. ↩↩↩↩↩↩↩↩
-
Stardew Valley Wiki, „Friendship“, gespeichert am 4. Oktober 2026, https://stardewvalleywiki.com/Friendship. Punkte pro Herz, die Wege, auf denen Freundschaft steigt und fällt, die Verfallstabelle, Geschenke, der Geburtstagsmultiplikator und Herz-Ereignisse. ↩↩↩↩↩↩
-
Nookipedia, „Friendship“, Abschnitt New Horizons, gespeichert am 4. Oktober 2026, https://nookipedia.com/wiki/Friendship. ↩↩↩↩
-
Nookipedia, „Reaction“, Abschnitt New Horizons, gespeichert am 4. Oktober 2026, https://nookipedia.com/wiki/Reaction. Die Zahlen nach Version stammen aus
measure_daily.py(Anmerkung 2). ↩↩↩↩↩ -
Serebii.net, „Join Avenue“, Abschnitt Pokémon Black 2 and White 2, gespeichert am 4. Oktober 2026, https://www.serebii.net/black2white2/joinavenue.shtml. Eine Fanseite und die einzige Quelle, die für diese Funktion verwendet wurde. ↩↩↩↩↩
-
Wikipedia, „Death Stranding“, Abschnitt Gameplay, mit Verweis auf seine eigenen Quellen, gespeichert am 4. Oktober 2026, https://en.wikipedia.org/wiki/Death_Stranding. ↩↩↩↩↩
-
Krews, Arcturus Morningstar, ein von Fans geschriebener quelloffener Emulator des Habbo-Servers,
src/main/java/com/eu/habbo/habbohotel/rooms/Room.java(IDLE_CYCLES = 240,IDLE_CYCLES_KICK = 480,scheduleAtFixedRate(this, 500, 500, TimeUnit.MILLISECONDS)), gespeichert am 5. Oktober 2026, https://git.krews.org/krews/Morningstar/-/blob/master/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java. Emulator-Konstanten, keine von Sulake veröffentlichten Zahlen;RoomUnitwurde nicht gelesen. ↩↩↩↩↩↩↩ -
Glenn Fiedler, „Snapshot Interpolation“, Gaffer on Games, 30. November 2014, gespeichert am 4. Oktober 2026, https://gafferongames.com/post/snapshot_interpolation/. ↩↩↩↩↩↩↩↩
-
Apple, „Game Center & Privacy“, Abschnitt „Children in Game Center“ und der Abschnitt zu Freunden, gespeichert am 4. Oktober 2026, https://www.apple.com/legal/privacy/data/en/game-center/. ↩↩↩↩↩↩↩↩
-
Apple Developer Documentation,
GKLocalPlayer.isMultiplayerGamingRestricted(iOS 13.0+), das Dokumentations-JSON, gespeichert am 4. Oktober 2026, https://developer.apple.com/documentation/gamekit/gklocalplayer/ismultiplayergamingrestricted. Die Zitate sind der Discussion-Text, in dem der Inline-Verweis auftrueals Wort wiedergegeben ist, abgeflacht durchsources/extract_gk.pyim Entwurfsordner. ↩↩↩↩↩↩↩↩↩↩↩↩ -
Federal Trade Commission, „Children’s Online Privacy Protection Rule“, endgültige Regel, Federal Register, 22. April 2025, Dokument 2025-05904, 90 FR 16918, gespeichert am 4. Oktober 2026, https://www.federalregister.gov/documents/2025/04/22/2025-05904/childrens-online-privacy-protection-rule. Der Abschnitt DATES und die geänderten 16 CFR 312.2 (Definition personenbezogener Daten), 312.5(c)(7), 312.8 und 312.10. Jede Aussage in diesem Beitrag darüber, was die Regel für Kiradex bedeutet, ist die Lesart des Autors, keine Rechtsberatung. ↩↩↩↩↩↩↩↩↩↩↩
-
Lektüre des Kiradex-Repositorys (privat) durch den Autor, Arbeitsverzeichnis am 5. Oktober 2026, nur lesend, keine git-Befehle ausgeführt; Dateien identifiziert durch die ersten acht Hexadezimalziffern ihres SHA-256:
server/app/main.py(87c6cc9f;TICK_SECONDS = 0.5,SHOW_EVERY_SECONDS, die Nachrichten-Handler, darunter diemoved-Weiterleitung in Zeile 223, die dieidund das Tile des Läufers trägt),server/app/npcs.py(d84f12a5; der Modul-Docstring,STEP_SECONDS = 0.7, die vier Definitionen und ihre Routen, Wünsche und Zeilen),server/app/rooms.py(dcd66866;Player.public()in Zeile 115, das ID, Namen und Figur in einem Objekt zurückgibt, bei der Ankunft inmain.pyZeile 203 an den Raum gesendet;CAPACITY,MOVES_PER_SECOND,SAY_EVERY_SECONDS,PlazaundRoom.tickmit seinem Docstring und seiner frühen Rückkehr),server/app/lines.py(391f5391; die 23 Zeilen und der Docstring, der sagt, dass der Server die Liste bei der Ankunft sendet). ↩↩↩↩↩↩↩↩↩↩↩ -
Messung des Autors,
measure_kiradex.pyim selben Ordner, erneut ausgeführt am 5. Oktober 2026, Ausgabe identisch mitmeasure_kiradex.out. Es importiertapp.lines,app.roomsundapp.npcsaus dem Arbeitsverzeichnis in Anmerkung 20 und liestPlazaRig.swiftundPlazaClient.swift(Anmerkung 50) für die Konstanten des Clients: Anzahl der vorgefertigten Zeilen, Raumkapazität, Ratenlimits, Tick, Abklingzeit, Größe des Platzes und Ankunft, die Routen und Schleifenlängen der vier Sammler, die Lauf- und Renngeschwindigkeiten, die Sprungschwelle von 6 Schritten und den Backoff für die Neuverbindung. Seine abgeleiteten 0,7 s und 36 Prozent sind durch Anmerkung 6 ersetzt. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Blake Crosley, „Pixel-Art Motion: Walks, Cameras and Doors on iPhone“, blakecrosley.com, 5. Oktober 2026, https://blakecrosley.com/blog/pixel-art-motion-on-iphone. Seine Anmerkung 6 modelliert den Gang der App bei exakt 60 Hz: Das Rennen braucht 10 Frames pro Tile, 6,00 Tiles pro Sekunde, gegenüber den 6,4, die 4 Tiles pro Sekunde mal dem Rennfaktor 1,6 nahelegen, und 6,32 bei 120 Hz; sein Abschnitt zum aktuellen Code liest den Rücksprung bei einem zweiten Antippen mitten im Schritt aus
walk(to:), und sein Briefing setzt die Regel, dass ein laufender Schritt nie zurückgesetzt wird; Punkt 1 seines Briefings setzt das Laufen auf 16 Ticks pro Tile und das Rennen auf 8 bei 60 Hz, 3,75 und 7,5 Tiles pro Sekunde, den Bewegungsvertrag der Reihe, und seine Prüfungen protokollieren die Position des Spielers in jedem Tick mit einem Startargument-motionLog. ↩↩↩↩↩↩↩ -
Kiradex,
docs/WORLD.md(„Kiradex World: research and plan“), Arbeitsverzeichnis am 5. Oktober 2026 (SHA-256 c7714bc1), nur lesend: Abschnitt 2 (der Weg über die Kinderkategorie und 5.1.4, Altersfreigabe 9+ oder 12+), Abschnitt 3 (Game-Center-Identität, Screen-Time-Steuerung, keine Followerzahlen, vorgefertigte Zeilen, die Prüfung durch einen Anwalt), Abschnitt 5 (der am 2. Oktober gebaute Server: FastAPI und WebSockets, nur Präsenz, nichts gespeichert, acht Bewegungen pro Sekunde, Ausblenden auf dem Gerät, „Not yet“ (noch nicht) einschließlich des Jugendmodus nach Declared Age Range; und die Begründung, die dazu führte, mit Clients, die Position und Richtung mit 8 bis 10 Hz senden) sowie „Decisions taken (Blake, October 2, 2026)“, Punkte 6 (Altersfreigabe und Altersbereiche) und 8 (kein Anwalt, bis es Zugkraft gibt). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Suche des Autors in
Kiradex/undserver/app/im Kiradex-Arbeitsverzeichnis, 5. Oktober 2026, nachisMultiplayerGamingRestricted,isUnderage,isPersonalizedCommunicationRestricted, der Declared Age Range API und jedem Speicher für Besuche oder tägliche Gespräche: keine Treffer. ↩↩↩ -
pret,
pokeemerald/include/constants/event_object_movement.h, Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/event_object_movement.h. ↩ -
Die Abbildungen wurden mit
figures/make_figures.pygezeichnet, das neben dem Entwurf des Beitrags liegt, am 5. Oktober 2026, aus den gespeicherten Ausgaben vonmeasure_npcs.py,measure_npc_cadence.py,measure_chat_trend.py,measure_record_mixing.py,measure_kiradex.pyundmeasure_remote_walk.py; jeder Wert wird aus diesen Dateien geparst und vor dem Zeichnen gegen einen erwarteten Wert geprüft: den des Recherchedossiers, außer bei der Abbildung zur Stadtbevölkerung, die jetzt nur Menschen aus dem überarbeitetenmeasure_npcs.pyzeigt, mit einer Zeile für die 100 Menschen ohne Ausblende-Flag, und bei den 940 offenen Wörtern des Satzbuchs aus dem überarbeitetenmeasure_chat_trend.py. Nach der Prüfung durch die zweite Engine zeigt die Modewort-Abbildung die eigenen ganztägigen Werte des Spiels aus dem überarbeitetenmeasure_chat_trend.py(ein Punkt pro vergangenem Tag, keine stetige Dreieckswelle), und die Abbildung zum Vorbeigehen zeigt das überarbeitetemeasure_remote_walk.py: das heutige Rig in seiner eigenen 32-Bit-Arithmetik und den Puffer bei den 3,75 und 7,5 Tiles pro Sekunde des Bewegungsvertrags mit Verzögerungen von 100, 300, 325 und 350 ms. Die Abbildung zum Satzbuch ist ein Schema des Vorschlags des Briefings, mit auf dieselbe Weise geparsten Vergleichszahlen. Keine Spielgrafik, kein Sprite und keine gerenderte Karte wird verwendet. ↩↩↩↩↩ -
pret,
pokeemerald/src/event_object_movement.c(IsCoordOutsideObjectEventMovementRange,sMovementDelaysMedium,sMovementDelaysShort,sMovementDelaysLongmit seinem Kommentar// Unused, die feste Wartezeit von 48 Frames der beiden drehenden Typen,MovementType_WanderAround_Step4,GetWalkNormalMovementAction, diesStep-Tabellen), Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/event_object_movement.c. ↩↩↩↩↩ -
pret,
pokeemerald/include/constants/flags.h(DAILY_FLAGS_STARTund die 12 Tages-Flags), Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/flags.h. ↩ -
Stardew Valley Wiki, „Villagers“, oldid 191346, bearbeitet am 26. Februar 2026, gespeichert am 4. Oktober 2026, https://stardewvalleywiki.com/Villagers. Die 34 beschenkbaren Dorfbewohner sind eine Zählung der Listen der Seite (6 Junggesellen, 6 Junggesellinnen, 22 Nicht-Heiratskandidaten); die Wiki-Seite „Friendship“ zählt eine andere Gruppe von 28 Stadtbewohnern zu Spielbeginn. ↩
-
Stardew Valley Wiki, „Pierre“, gespeichert am 4. Oktober 2026, https://stardewvalleywiki.com/Pierre. Der normale Tagesplan, die sechs Varianten und die Post auf jeder Herzstufe und bei drei Herzen. ↩↩↩
-
Nookipedia, „Hobby“, gespeichert am 4. Oktober 2026, https://nookipedia.com/wiki/Hobby. ↩
-
Nookipedia, „Villager“, die Abschnitte zu den einzelnen Spielen, gespeichert am 4. Oktober 2026, https://nookipedia.com/wiki/Villager. ↩↩↩↩↩↩↩
-
Nookipedia, „Villager“, Abschnitt Personalities, gespeichert am 4. Oktober 2026, https://nookipedia.com/wiki/Villager#Personalities. ↩
-
pret,
pokeemerald/src/record_mixing.c(struct PlayerRecordEmerald,ReceiveOldManData,ReceiveDewfordTrendData), Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/record_mixing.c. ↩ -
pret,
pokeemerald/src/mauville_old_man.c(die Auswahlswitch ((trainerId % 10) / 2)und ihr Kommentar,ResetHipsterFlag,ResetMauvilleOldManFlag,SetHipsterTaughtWord),pokeemerald/src/record_mixing.c(der eine Aufruf vonResetMauvilleOldManFlagam Ende vonReceiveOldManData) sowiepokeemerald/data/scripts/mauville_man.inc(setflag FLAG_UNLOCKED_TRENDY_SAYINGS,special HasHipsterTaughtWord) undpokeemerald/data/maps/MauvilleCity_PokemonCenter_1F/map.json(das Objektereignis, dessen SkriptMauvilleCity_PokemonCenter_1F_EventScript_MauvilleOldManist), Commit731ad5b, vom Autor am 4. und 5. Oktober 2026 gelesen, https://github.com/pret/pokeemerald/blob/master/src/mauville_old_man.c. Dass der Hipster in Spielen beginnt, deren Trainer-ID auf 2 oder 3 endet, ist die Arithmetik des Autors auf demswitch. ↩↩↩↩↩↩ -
Blake Crosley, „Pixel-Art Worlds on iPhone: What the 16-Bit Masters Knew“, blakecrosley.com, 3. Oktober 2026 (rechtliche FAQ aktualisiert am 4. Oktober 2026), https://blakecrosley.com/blog/pixel-art-world-on-iphone. Er formuliert die Modewort-Regel als ein Wort jedes Mal, wenn Record Mixing den Hipster bringt, und seine rechtlichen FAQ nennen die drei Patente, die gegen den Entwickler von Palworld geltend gemacht wurden (Zielen und Werfen eines Fangitems, eine Anzeige der Fangwahrscheinlichkeit, das Besteigen einer reitbaren Figur), mit eigenen Quellen. ↩↩
-
pret,
pokeemerald/src/dewford_trend.c(der Kopfkommentar zutrendinessundmaxTrendinessund zum Speichern von Modewörtern), Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/dewford_trend.c. ↩↩↩↩ -
Messung des Autors,
measure_chat_trend.pyim selben Ordner, überarbeitet und erneut ausgeführt am 5. Oktober 2026, Ausgabe gespeichert alsmeasure_chat_trend.out. Die Überarbeitung zieht mit.enabled = FALSEmarkierte Einträge von den offenen Wörtern ab (946 Einträge, 940 aktiviert), gibt die ZeilenumEnabledWordsder Trainer-Gruppe auseasy_chat_groups.haus („Excludes Red, Green, Flame, Gold, Leaf, and Silver“, schließt Red, Green, Flame, Gold, Leaf und Silver aus) und gibt die Regel pro Eintrag inIsEasyChatIndexAndGroupUnlockedaus, nach der ein Name in der Liste mit 202 Einträgen erst öffnet, wenn seine Art gesehen wurde; die frühere Version und ihre Ausgabe liegen mit dem Suffix.r1vor. Eingaben: pretpokeemerald731ad5bsrc/data/easy_chat/(Gruppengrößen, deaktivierte Einträge,numEnabledWords),src/easy_chat.c(derswitchfür die Gruppenfreischaltung, die Regel pro Eintrag und die Phrasenraster),include/constants/global.h(MAIL_WORDS_COUNT,NUM_QUESTIONNAIRE_WORDS,SAVED_TRENDS_COUNT) undsrc/dewford_trend.c(SeedTrendRngund der tägliche Schritt). Eine zweite Überarbeitung nach der Prüfung durch die zweite Engine (die vorherige Version und ihre Ausgabe liegen mit dem Suffix.pre-astravor) kennzeichnet die Verteilung der Höchstwerte als Näherung unter Annahme unabhängiger Gleichverteilung: Sie wird aus den drei verschachteltenRandom() % 98-Ziehungen berechnet, jede als unabhängige gleichverteilte Ziehung über 0 bis 97 genommen. Sie fügt dieselbe Verteilung mit den 16-Bit-Modulo-Gewichten hinzu (Random()insrc/random.cliefert die oberen 16 Bit, sodass jeder Rest zwischen 0 und 71 669-mal in 65.536 vorkommt und jeder zwischen 72 und 97 668-mal), was einen Mittelwert von 62,89 und 81,34 % bei 80 oder darunter ergibt, gegenüber 62,90 und 81,33 %, weiterhin unter Annahme unabhängiger Ziehungen; und sie bildetUpdateDewfordTrendPerDaymit einem vergangenen Tag pro Aufruf nach, ab einem Wert von 0 und steigend, der für die Höchstwerte 30, 64 und 127 nach 12, 128 und 254 Tagen erstmals in diesen Zustand zurückkehrt (dieselbe Zykluslänge von jedem erreichbaren Startzustand aus). Die Längen von Anstieg und Abfall von 12, 25,6 und 50,8 Tagen sind das Doppelte des Höchstwerts geteilt durch 5, eine stetige Näherung. ↩↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/union_room_chat.c,pokeemerald/include/union_room.hundpokeemerald/include/constants/global.h, Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/union_room_chat.c. Die Lesart, warum getippter Chat dort tragbar war, ist die des Autors. ↩ -
pret,
pokeemerald/src/easy_chat.cundpokeemerald/src/data/easy_chat/, Commit731ad5b, abgerufen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/easy_chat.c und https://github.com/pret/pokeemerald/tree/master/src/data/easy_chat. ↩↩↩↩ -
Wikipedia, „Dark Souls (video game)“, Abschnitte Multiplayer (mit Verweis auf seine Quelle [5]) und Awards, gespeichert am 4. Oktober 2026, https://en.wikipedia.org/wiki/Dark_Souls_(video_game). ↩↩↩↩↩↩
-
Bandai Namco Entertainment Europe, „Dark Souls Remastered“, Key features, gespeichert am 5. Oktober 2026, https://en.bandainamcoent.eu/dark-souls/dark-souls-remastered. Die Seite von Bandai Namco America wurde als Skript-Hülle mit 127 Bytes Text gespeichert; FromSoftwares eigene Beschreibung war nicht erreichbar. ↩
-
PlayStation, „Death Stranding“, Abschnitt „Unique social strand gameplay“, gespeichert am 4. Oktober 2026, https://www.playstation.com/en-us/games/death-stranding/. ↩
-
Wikipedia, „Splatoon (video game)“, Abschnitte Gameplay und Multiplayer, mit Verweis auf seine eigenen Quellen, gespeichert am 4. Oktober 2026, https://en.wikipedia.org/wiki/Splatoon_(video_game). Nintendos eigene Splatoon-Seiten wurden nicht abgerufen. ↩↩
-
The Pokémon Company International, die Spielseiten auf pokemon.com zu „Pokémon Black Version 2 and Pokémon White Version 2“ und „Pokémon Sun and Pokémon Moon“, gespeichert am 4. Oktober 2026, https://www.pokemon.com/us/pokemon-video-games/pokemon-black-version-2-and-pokemon-white-version-2 und https://www.pokemon.com/us/pokemon-video-games/pokemon-sun-and-pokemon-moon; keine von beiden erwähnt Join Avenue oder Festival Plaza. Bulbapedia wurde nicht versucht. ↩
-
Serebii.net, „Festival Plaza“, Abschnitt Pokémon Sun and Moon, gespeichert am 4. Oktober 2026, https://www.serebii.net/sunmoon/festivalplaza.shtml. Eine Fanseite und die einzige Quelle, die für diese Funktion verwendet wurde. ↩↩
-
Serebii.net, „Gyms“, Abschnitt Pokémon GO, gespeichert am 4. Oktober 2026, https://www.serebii.net/pokemongo/gyms.shtml. Eine Fanseite und die einzige Quelle, die für diese Funktion verwendet wurde. ↩↩
-
Solero, Houdini, ein von Fans geschriebener quelloffener Emulator des Club-Penguin-Servers,
houdini/handlers/play/player.py(die Handlersp,ss,sj,sma,sl,sgundse, ihre Abklingzeiten,server_heartbeat, das die Zeit nimmt, 61 Sekunden schläft und jeden Client schließt, dessen letzter Heartbeat älter ist als diese Zeit (if penguin.heartbeat < timer: await penguin.close(), aus dem gespeicherten HTML gelesen; die gespeicherte Textextraktion verstümmelt diese Zeile), undserver_egg_timer, das die erlaubten Minuten eines Spielers jede Minute herunterzählt, bei 7 und 5 warnt und bei null trennt), gespeichert am 4. Oktober 2026, https://github.com/solero/houdini/blob/master/houdini/handlers/play/player.py. Belege dafür, was der Original-Client erwartete, nicht von Disney veröffentlichtes Verhalten. ↩↩↩↩↩↩↩ -
billsonnn, Nitro renderer, ein von Fans geschriebener quelloffener Habbo-Client,
src/nitro/room/object/logic/MovingObjectLogic.ts(DEFAULT_UPDATE_INTERVAL = 500und die lineare Interpolation inupdate), gespeichert am 4. Oktober 2026, https://github.com/billsonnn/nitro-renderer/blob/main/src/nitro/room/object/logic/MovingObjectLogic.ts. ↩↩↩ -
Lektüre des Kiradex-Repositorys (privat) durch den Autor, Arbeitsverzeichnis am 5. Oktober 2026, nur lesend:
Kiradex/World/PlazaRig.swift(SHA-256 819cd8d6;progressalsFloatin Zeile 29,tilesPerSecondin Zeile 101,move(other:to:facing:)in den Zeilen 526 bis 542,runningnur beim Spieler gesetzt in Zeile 614,advance()in den Zeilen 652 bis 672,place()und seine Pixelrundung in den Zeilen 722 bis 727, die ListeidleEmotesmitdoze),Kiradex/World/TileMap.swift(db4272c2;tileSizevon 16 in Zeile 60 undcentrein Zeile 235),Kiradex/World/PlazaClient.swift(5c491933; die Verzögerung für die Neuverbindung in Zeile 165),Kiradex/World/PlazaStage.swift(8b4850af; die auf den Platz angewendete Tageslichtphase undrig.update(Float(event.deltaTime))in Zeile 149) undKiradex/World/Daylight.swift(536350dc;Daylight.Phaseund seine Stundenbereiche sowieDaylight.now, das die Stunde ausCalendar.currentnimmt, dem eigenen Kalender und der eigenen Zone des Geräts). Die Uhren des Servers wurden am selben Tag durchsucht:server/app/main.pyundserver/app/rooms.pyverwendentime.monotonic(), und nichts inserver/appnennt eine Zeitzone. ↩↩↩↩↩↩↩↩↩ -
Apple Developer Documentation,
GKLocalPlayer.isPersonalizedCommunicationRestricted(iOS 14.0+), das Dokumentations-JSON, gespeichert am 4. Oktober 2026, https://developer.apple.com/documentation/gamekit/gklocalplayer/ispersonalizedcommunicationrestricted. Zum Zitieren abgeflacht wie in Anmerkung 18. Dass die eigenen vorgefertigten Zeilen eines Spiels zu den „custom communication features“ (eigenen Kommunikationsfunktionen) gehören, die die Seite ein Spiel zu deaktivieren auffordert, und dass Emotes nicht dazugehören, sind Lesarten des Autors. ↩↩↩↩↩↩↩↩ -
Apple Developer Documentation,
GKLocalPlayer.isUnderage(iOS 4.1+), das Dokumentations-JSON, gespeichert am 4. Oktober 2026, https://developer.apple.com/documentation/gamekit/gklocalplayer/isunderage. Zum Zitieren abgeflacht wie in Anmerkung 18. ↩↩↩↩ -
Apple Support, „Set up parental controls to manage your child’s iPhone or iPad“, Abschnitt „Set restrictions for Game Center“, gespeichert am 4. Oktober 2026, https://support.apple.com/en-us/105121. ↩
-
Apple Newsroom, „Apple expands tools to help parents protect kids and teens online“, 11. Juni 2025, gespeichert am 4. Oktober 2026, https://www.apple.com/newsroom/2025/06/apple-expands-tools-to-help-parents-protect-kids-and-teens-online/. ↩↩↩
-
Apple, „App Review Guidelines“, zuletzt aktualisiert am 8. Juni 2026, Richtlinien 1.2, 1.3 und 5.1.4, gespeichert am 4. Oktober 2026, https://developer.apple.com/app-store/review/guidelines/. ↩↩↩↩↩↩↩↩
-
Federal Trade Commission, „FTC Finalizes Changes to Children’s Privacy Rule Limiting Companies’ Ability to Monetize Kids’ Data“, Pressemitteilung, 16. Januar 2025, gespeichert am 4. Oktober 2026, https://www.ftc.gov/news-events/news/press-releases/2025/01/ftc-finalizes-changes-childrens-privacy-rule-limiting-companies-ability-monetize-kids-data. ↩
-
Lektüre des Startbefehls des Kiradex-Servers und des Webservers, den er ausführt, durch den Autor, 5. Oktober 2026, nur lesend:
server/Procfile(SHA-256 2e883a7e) undserver/railway.toml(17f8a3ba) startenuvicorn app.main:appmit--proxy-headers --forwarded-allow-ips='*'und ohne Protokolloptionen;server/requirements.txt(71c30c3b) legtuvicorn[standard]==0.37.0fest. In dieser Version, wie sie in der Umgebung des Servers installiert ist, setztuvicorn/config.py(379e9baf)access_logstandardmäßig auf true;uvicorn/protocols/http/httptools_impl.py(b6e4010a) undh11_impl.py(e1bf8ab3) protokollieren dannget_client_addr(self.scope)für jede Anfrage; unduvicorn/protocols/websockets/websockets_impl.py(029977b2) protokolliert'%s - "WebSocket %s" [accepted]'mit der Client-Adresse auf INFO-Ebene im Loggeruvicorn.error, den--log-level warningstummschaltet. Eine Lektüre des Codes; kein Server wurde ausgeführt und kein bereitgestelltes Protokoll eingesehen. ↩↩ -
Blake Crosley, „Pixel-Art People: Characters and a Creator on iPhone“, blakecrosley.com, 3. Oktober 2026, Abschnitt 4 (die Regeln von PEGI) und Abschnitte 6 und 7 (die Figurenzeichenkette, das Manifest und die Schmiede, die jede Figur zeichnet), https://blakecrosley.com/blog/pixel-art-characters-on-iphone. ↩↩↩
-
PEGI, „What do the labels mean?“, abgerufen am 3. Oktober 2026, https://pegi.info/what-do-the-labels-mean, zitiert nach dem Figuren-Beitrag (Anmerkung 58); für diesen Beitrag nicht erneut abgerufen. ↩↩↩