...für die Kommunikation mit der online Rest-API
Stand 25. November 2020 - Julian Schönbächler
Das Spiel wird ein Login-, sowie Registrierungsformular beinhalten. Die gesendeten Requests der Formulare beinhalten folgende Daten:
Registrierung
{
"username": "Christoph",
"email": "stophel@blocher.ch",
"password": "schlumpfgate"
}
Login
{
"email": "stophel@blocher.ch",
"password": "schlumpfgate"
}
Ausgehend vom jetzigen Spielaufbau und den aktuellen Anforderungen bezüglich der Kommunikation, sind 3 drei verschiedene Sync-Points vorgesehen, an welchen das Spiel mit der API interagiert.
Direkt nach dem Login und dem Erhalt des Authentifizierungs-Tokens und der Benutzer ID wird eine neue Spiel-Session gestartet.
Das Spiel sendet folgenden Request:
{
"requestType": "session-start",
"requestTime": 1234567890,
"data": {
"loginAt": 1234567890,
"exercube": "SpheryCube1"
}
}
Key | Typ | Beschreibung |
---|---|---|
requestType | string |
Beschreibt den Typ des Requests |
requestTime | int |
Der Zeitstempel des Requests (Unix-Timestamp) |
data | {} |
Objekt mit den Request-spezifischen Daten |
→ loginAt | int |
Der Zeitstempel des Logins (Unix-Timestamp) |
→ exercube | string |
Die ID des ExerCubes |
Als Antwort werden vom Server Benutzerspezifische Daten erwartet, welche für das Spiel erforderlich sind.
{
"session": {
"id": 1,
"healthData": <health-data>,
"workoutPresets": [...<workout>]
}
...
}
Key | Typ | Beschreibung |
---|---|---|
session | {} |
Objekt mit Session-spezifischen Daten |
→id | int |
Die ID der soeben gestarteten Session |
→ healthData | {} |
Spielerspezifische körperliche Daten (siehe: Health Data) |
→ workoutPresets | [] |
Ein Array an gespeicherten Workout Presets |
Info: Momentan werden keine "Workout Presets" gespeichert, sondern einfach die standard Workouts des Spiels verwendet. Der Wert für
workoutPresets
kann also immer ein leeres Array ([]
) sein.
Direkt nach dem Login und dem Erhalt des Authentifizierungs-Tokens und der Benutzer ID wird eine neue Spiel-Session gestartet. Das Spiel sendet folgenden Request:
{
"requestType": "session-close",
"requestTime": 1234567890,
"data": {
"logoutAt": 1234567890,
"sessionTime": 1800,
"netPromoterScore": 10
}
}
Key | Typ | Beschreibung |
---|---|---|
requestType | string |
Beschreibt den typ des Requests |
requestTime | int |
Der Zeitstempel des Requests (Unix-Timestamp) |
data | {} |
Objekt mit den Request-spezifischen Daten |
→ logoutAt | int |
Der Zeitstempel des Logouts (Unix-Timestamp) |
→ sessionTime | int |
Die Dauer der Session (in Sekunden) |
→ netPromoterScore | int |
Die Bewertung der Session [0-10] |
Undefiniert
Ein Workout beschreibt eigentlich immer ein einzelnes Rennen im Spiel. Nachdem der Spieler das Rennen beendet hat (sprich das Ziel erreicht hat), wird ein Request mit den gesamten Workout-Daten erstellt.
{
"requestType": "workout-put",
"requestTime": 1234567890,
"data": {
"workout": <workout>,
"challenge": -1,
"duration": 600,
"hrTracking": true,
"hrAdaptivity": true,
"hrValues": [
{
"time": 3.02,
"value": 82
},
{
"time": 6.13,
"value": 83
},
...
],
"hrAverage": 163,
"hrMax": 199,
"score": 756388,
"maxCombo": 123,
"bodyScore": 0.9,
"brainScore": 0.8,
"dualflowScore": 0.85,
"exercises": [...<exercise>]
}
}
Key | Typ | Beschreibung |
---|---|---|
requestType | string |
Beschreibt den typ des Requests |
requestTime | int |
Der Zeitstempel des Requests (Unix-Timestamp) |
data | {} |
Objekt mit den Request-spezifischen Daten |
→ workout | int |
Workout data that was used for this workout (siehe Workout) |
→ challenge | int |
Die ID der Challenge mit welcher dieses Workout verlinkt ist; -1 falls keine Verlinkung besteht (momentan werden Challenges noch nicht gehandled, der Wert wird immer auf -1 gesetzt sein) |
→ duration | int |
Die effektive Trainingsdauer des Workouts (in Sekunden) |
→ hrTracking | bool |
Wurde die Herzrate getracked? |
→ hrAdaptivity | bool |
Wurde HR adaptiv gespielt? false für Performance adaptiv |
→ hrValues | [] |
Array von allen gemessenen HR-Werten; in der angegebenen Struktur - time = Zeit nach start des Workouts (in Sekunden)- value = HR-Wert |
→ hrAverage | int |
Die Durchschnittliche Herzrate über das ganze Workout gemessen |
→ hrMax | int |
Die tatsächlich erreichte maximale Herzrate |
→ score | int |
Die erreichte Punktzahl in diesem Workout |
→ maxCombo | int |
Maximum Combo, welcher erreicht wurde |
→ bodyScore | float |
Workout BodyScore (prozentualer Wert [0.0-1.0]) |
→ brainScore | float |
Workout BrainScore (prozentualer Wert [0.0-1.0]) |
→ dualflowScore | float |
Workout DualflowScore (prozentualer Wert [0.0-1.0]) |
→ exercises | [] |
Array, welches geordnet alle abgeschlossenen Übungen der Rennstrecke fasst (siehe Exercise) |
Undefiniert
Hier werden alle Datensätze aufgeschlüsselt welche oft Inhalt der einzelnen Requests sein können und als eigene "Objekte" oder "Typen" gehandhabt werden.
{
"hrRestingPulse": 80,
"hrReserve": 116,
"hrMax": 196,
"weight": 75,
"age": 30
}
Key | Typ | Beschreibung |
---|---|---|
hrRestingPulse | int |
Ruhepuls der HR; -1 falls undefiniert |
hrReserve | int |
Reservepuls der HR; -1 falls undefiniert |
hrMax | int |
HR Max; -1 falls undefiniert |
weight | int |
Gewicht (in kg); -1 falls undefiniert |
age | int |
Alter; -1 falls undefiniert |
{
"name": "MyCustomWorkout",
"race": {
"difficulty": 2,
"duration": 900,
"tutorial": false,
"startSpeed": 5,
"hrTarget": 0.9
},
"exercises": [
"touches",
"punches"
],
"tiers": [
{
"cognitiveChallenges": [
"mirror",
"lights"
],
"cognitiveMin": 0.0,
"cognitiveMax": 1.0,
"physicalMin": 0.0,
"physicalMax": 1.0
},
...
]
}
Key | Typ | Beschreibung |
---|---|---|
name | string |
Der Name (und ID; unique) des Workouts |
race | {} |
Renn-spezifische Daten |
→ difficulty | int |
Schwierigkeit des Rennens [0-2] |
→ duration | int |
Dauer des Rennens (in Sekunden) |
→ tutorial | bool |
Boxenstopp Tutorials verwendet? |
→ startSpeed | float |
Startgeschwindigkeit des Rennens [0.0-1.0] |
→ hrTarget | int |
Die Ziel-HR für HR-adaptives Spiel |
exercises | [...string] |
Array an Übungs-Typen welche für das Spiel ausgewählt wurden |
tiers | [...{}] |
Alle Combo-Tier informationen als Array; Länge des Arrays ist die Anzahl der Tiers |
→ cognitiveChallenges | [...string] |
Array an kognitiven Challenge-Typen welche für das Spiel ausgewählt wurden |
→ cognitiveMin | float |
Minimale kognitive Adaptivität [0.0-1.0] |
→ cognitiveMax | float |
Maximale kognitive Adaptivität [0.0-1.0] |
→ physicalMin | float |
Minimale physische Adaptivität [0.0-1.0] |
→ physicalMax | float |
Maximale physische Adaptivität [0.0-1.0] |
{
"id": "midPunchLeft",
"name": "Punch Left",
"time": 2.14,
"tier": 2,
"precision": 3,
"score": 230
}
Key | Typ | Beschreibung |
---|---|---|
id | string |
Die ID (unique) der Übung |
name | string |
Der (human readable) Name der Übung |
time | float |
Die Zeit nach Start des Workouts nachdem die Übung passiert wurde |
tier | int |
Der Combo-Tier mit welchem die Übung passiert wurde |
precision | int |
Der Evaluierungswert der Übung (Anzahl Sterne; 0 falls fehlerhaft) |
score | int |
Die erhaltene Punktzahl für diese Übung |
Diese Beispiele zeigen wie jeweils ein voller Request für die oben beschriebenen Sync-Points am Ende strukturiert ist und aussehen könnte.
{
"requestType": "session-start",
"requestTime": 1606381769,
"data": {
"loginAt": 1606381767,
"exercube": "SpheryCube1"
}
}
{
"requestType": "session-close",
"requestTime": 1606383628,
"data": {
"logoutAt": 1606383614,
"sessionTime": 1847,
"netPromoterScore": 8
}
}
{
"requestType": "workout-put",
"requestTime": 1234567890,
"data": {
"workout": {
"name": "DualFlow",
"race": {
"difficulty": 2,
"duration": 900,
"tutorial": false,
"startSpeed": 5,
"hrTarget": 0.9
},
"exercises": [
"touches",
"punches"
],
"tiers": [
{
"cognitiveChallenges": [
"mirror",
"lights"
],
"cognitiveMin": 0.0,
"cognitiveMax": 1.0,
"physicalMin": 0.0,
"physicalMax": 1.0
},
{
"cognitiveChallenges": [
"audio",
"mirror"
],
"cognitiveMin": 0.3,
"cognitiveMax": 1.0,
"physicalMin": 0.5,
"physicalMax": 1.0
}
]
},
"challenge": -1,
"duration": 600,
"hrTracking": true,
"hrAdaptivity": true,
"hrValues": [
{
"time": 3.02,
"value": 82
},
{
"time": 6.13,
"value": 83
},
...
],
"hrAverage": 163,
"hrMax": 199,
"score": 756388,
"maxCombo": 123,
"bodyScore": 0.9,
"brainScore": 0.8,
"dualflowScore": 0.85,
"exercises": [
{
"id": "midPunchLeft",
"name": "Punch Left",
"time": 2.14,
"tier": 0,
"precision": 3,
"score": 60
},
{
"id": "lowTouchRight",
"name": "Low Touch Right",
"time": 5.72,
"tier": 0,
"precision": 2,
"score": 60
}
...
]
}
}