commit 8474894756555396b161e7dc2af9d612fd6344ce Author: Dominic Springer Date: Sun Oct 4 21:27:04 2026 +0200 Publish Void Bastion website diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a5e277d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +intern/statistik/stats-config.local.php + diff --git a/assets/gameplay-coop.webp b/assets/gameplay-coop.webp new file mode 100644 index 0000000..a5c92c2 Binary files /dev/null and b/assets/gameplay-coop.webp differ diff --git a/assets/gameplay-grid.webp b/assets/gameplay-grid.webp new file mode 100644 index 0000000..af3745c Binary files /dev/null and b/assets/gameplay-grid.webp differ diff --git a/assets/reactor.webp b/assets/reactor.webp new file mode 100644 index 0000000..fb07fe3 Binary files /dev/null and b/assets/reactor.webp differ diff --git a/assets/station.webp b/assets/station.webp new file mode 100644 index 0000000..aa29dc9 Binary files /dev/null and b/assets/station.webp differ diff --git a/assets/towers.webp b/assets/towers.webp new file mode 100644 index 0000000..b8bfdf1 Binary files /dev/null and b/assets/towers.webp differ diff --git a/delete-account.html b/delete-account.html new file mode 100644 index 0000000..711e0cb --- /dev/null +++ b/delete-account.html @@ -0,0 +1,28 @@ + + + + + + Konto löschen – Void Bastion + + + +
+

Konto löschen

So kannst du dein GerGames-Konto und die damit verbundenen Daten löschen.

+
+

Direkt in der App

+
  1. Öffne in Void Bastion dein Profil.
  2. Wähle Konto löschen.
  3. Bestätige den deutlich angezeigten Löschhinweis ein zweites Mal.
+

Nach erfolgreicher Löschung wird das Onlinekonto entfernt und auf dem Gerät ein neues, nicht verbundenes Gastprofil angelegt.

+

Ohne Zugriff auf die App

+

Sende eine Löschanfrage an support@gergames.de. Nenne den Spielernamen und – falls vorhanden – die gekürzte Spieler-ID. Wir können zur Vermeidung einer unberechtigten Löschung einen geeigneten Nachweis verlangen.

+

Welche Daten werden gelöscht?

+
  • GerGames-Onlinekonto und verknüpfte Anmeldekennungen
  • Spielername und serverseitiger Fortschritt
  • Bestenlisteneinträge, soweit sie dem Konto zugeordnet sind
  • sonstige kontobezogene Spieldaten
+

Lokale Daten auf Geräten werden nicht automatisch von anderen Geräten entfernt. Dort muss der lokale Spielstand in den App-Einstellungen beziehungsweise durch Entfernen der App gelöscht werden. Gesetzlich zwingend aufzubewahrende oder zur Missbrauchsabwehr erforderliche Daten können im notwendigen Umfang ausgenommen sein.

+

Wichtig bei Käufen

+

Eine Kontolöschung beendet keine über Apple oder Google laufenden Abonnements und führt nicht automatisch zu einer Rückerstattung. Void Bastion verwendet derzeit noch keine echten In-App-Käufe oder Abonnements.

+ +
+
+ + + diff --git a/impressum.html b/impressum.html new file mode 100644 index 0000000..1dea347 --- /dev/null +++ b/impressum.html @@ -0,0 +1,29 @@ + + + + + + Impressum – GerGames + + + +
+

Impressum

Anbieterkennzeichnung für GerGames und Void Bastion.

+
+

Angaben gemäß § 5 DDG

+

Dominic Springer
GerGames
Ziegelweg 1
95213 Münchberg
Deutschland

+

Kontakt

+

E-Mail: support@gergames.de

+

Verantwortlich für den Inhalt

+

Dominic Springer
Ziegelweg 1
95213 Münchberg
Deutschland

+

Verbraucherstreitbeilegung

+

Wir sind nicht verpflichtet und nicht bereit, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.

+

Haftung für Links

+

Diese Website kann Links zu externen Angeboten enthalten. Für deren Inhalte sind ausschließlich die jeweiligen Betreiber verantwortlich.

+

Stand: Oktober 2026

+ +
+
+ + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..07aaa1b --- /dev/null +++ b/index.html @@ -0,0 +1,278 @@ + + + + + + + + Void Bastion — GerGames + + + + +
+ +
+ +
+
+
+
+

Strategisches Tower Defense

+

Void Bastion

+

Die letzte Verteidigungslinie liegt zwischen dem Reaktor und der Leere. Baue, verbessere und halte deine Stellung gegen immer stärkere Angriffswellen.

+
+ Windows Alpha herunterladen + Spiel entdecken + Alpha 0.1.0 · 64 Bit +
+
WindowsAndroidiOS
+
+
+ Kinetik-, Laser- und Raketenturm aus Void Bastion +
+ +
+
+
+

Halte die Linie

+

Jede Zelle zählt.

+

Void Bastion verbindet klar lesbare Karten mit taktischen Entscheidungen. Nutze Reichweite, Feuerrate und Schaden deiner Türme, verteidige unterschiedliche Weltraumsektoren und entscheide nach der letzten Missionswelle selbst, ob du im Endlosmodus weiterkämpfst.

+
+
+
03Weltraumkarten
+
03Turmklassen
+
15Missionswellen
+
∞Endlosmodus
+
+
+
+ +
+
+
+

Deine Verteidigung

Planen. Aufrüsten. Überleben.

+

Drei Schwierigkeitsgrade, unterschiedliche Feindklassen und klar erkennbare Reichweiten machen jede Entscheidung nachvollziehbar – aber nicht automatisch leicht.

+
+
+
01

Position wählen

Nutze das Bauraster und platziere jeden Turm dort, wo seine Reichweite den Gegnerweg optimal abdeckt.

+
02

Systeme kombinieren

Kinetik, Laser und Raketen erfüllen verschiedene Rollen – vom schnellen Einzelziel bis zum schweren Flächenschaden.

+
03

Gemeinsam halten

Verteidige im Koop eine gespiegelte Station mit getrennten Ressourcen und einem gemeinsamen Reaktor – lokal mit KI, später auch online.

+
+
+
+ + + +
+
+
+ Leuchtender Reaktor von Void Bastion +
Aktuell in Entwicklung

Die Bastion wächst.

Void Bastion entsteht bei GerGames. Karten, KI-Koop, Endlosmodus, Ranglisten und die technische Grundlage für Online-Multiplayer sind bereits in Arbeit. Veröffentlichungstermine und Store-Links folgen, sobald die spielbare Version bereit ist.

+
+ PCWindows AlphaSetup herunterladen · 111 MiB + AAndroidGoogle Play folgt + iiPhone & iPadApp Store folgt +
+
+
+
+
+
+ + + + + + diff --git a/intern/statistik/.htaccess b/intern/statistik/.htaccess new file mode 100644 index 0000000..6454faf --- /dev/null +++ b/intern/statistik/.htaccess @@ -0,0 +1,12 @@ +Options -Indexes + + + + Require all denied + + + + + Header always set X-Robots-Tag "noindex, nofollow, noarchive" + Header always set Cache-Control "no-store, private" + diff --git a/intern/statistik/index.php b/intern/statistik/index.php new file mode 100644 index 0000000..fe15ede --- /dev/null +++ b/intern/statistik/index.php @@ -0,0 +1,137 @@ + 0, + 'path' => '/intern/statistik/', + 'secure' => true, + 'httponly' => true, + 'samesite' => 'Strict', +]); +session_start(); + +$configPath = __DIR__ . '/stats-config.local.php'; +if (!is_file($configPath)) { + http_response_code(503); + exit('Die interne Statistik ist noch nicht konfiguriert.'); +} +$config = require $configPath; + +if (isset($_GET['logout'])) { + $_SESSION = []; + session_destroy(); + header('Location: ./'); + exit; +} + +$loginError = ''; +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['username'], $_POST['password'])) { + $userOk = hash_equals((string) $config['username'], (string) $_POST['username']); + $passwordOk = hash_equals((string) $config['password_sha256'], hash('sha256', (string) $_POST['password'])); + if ($userOk && $passwordOk) { + session_regenerate_id(true); + $_SESSION['authenticated'] = true; + header('Location: ./'); + exit; + } + usleep(350000); + $loginError = 'Anmeldung fehlgeschlagen.'; +} + +function fetchJson(string $url, string $method = 'GET', ?string $body = null): ?array +{ + if (function_exists('curl_init')) { + $handle = curl_init($url); + $options = [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_CONNECTTIMEOUT => 4, + CURLOPT_TIMEOUT => 8, + CURLOPT_USERAGENT => 'GerGames-Internal-Stats/1.0', + CURLOPT_HTTPHEADER => ['Accept: application/json', 'Content-Type: application/json'], + CURLOPT_CUSTOMREQUEST => $method, + ]; + if ($body !== null) { + $options[CURLOPT_POSTFIELDS] = $body; + } + curl_setopt_array($handle, $options); + $response = curl_exec($handle); + $status = (int) curl_getinfo($handle, CURLINFO_RESPONSE_CODE); + curl_close($handle); + if (!is_string($response) || $status < 200 || $status >= 300) return null; + } else { + $context = stream_context_create(['http' => [ + 'method' => $method, + 'timeout' => 8, + 'ignore_errors' => true, + 'header' => "Accept: application/json\r\nContent-Type: application/json\r\nUser-Agent: GerGames-Internal-Stats/1.0\r\n", + 'content' => $body ?? '', + ]]); + $response = @file_get_contents($url, false, $context); + if (!is_string($response)) return null; + } + $decoded = json_decode($response, true); + return is_array($decoded) ? $decoded : null; +} + +function e(string $value): string +{ + return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); +} + +if (empty($_SESSION['authenticated'])): +?> +GerGames – Interne Statistik

Interne Statistik

Geschützter GerGames-Bereich

+ 0, 'android' => 0]; +foreach ($releases as $releaseIndex => $release) { + if (!is_array($release)) continue; + if ($releaseIndex === 0) $latestRelease = (string) ($release['name'] ?? $release['tag_name'] ?? 'Aktuelles Release'); + foreach (($release['assets'] ?? []) as $asset) { + if (!is_array($asset)) continue; + $count = max(0, (int) ($asset['download_count'] ?? 0)); + $downloadTotal += $count; + if ($releaseIndex === 0) $latestDownloads += $count; + $name = strtolower((string) ($asset['name'] ?? '')); + if (substr($name, -4) === '.exe') $platformDownloads['windows'] += $count; + if (substr($name, -4) === '.apk') $platformDownloads['android'] += $count; + } +} + +$playerStats = null; +$httpKey = trim((string) ($config['nakama_http_key'] ?? '')); +if ($httpKey !== '') { + $statsUrl = (string) $config['nakama_rpc_url'] . '?http_key=' . rawurlencode($httpKey) . '&unwrap'; + $rpcResponse = fetchJson($statsUrl, 'POST', '{}'); + if (is_array($rpcResponse)) { + $playerStats = $rpcResponse; + if (isset($rpcResponse['payload']) && is_string($rpcResponse['payload'])) { + $payload = json_decode($rpcResponse['payload'], true); + if (is_array($payload)) $playerStats = $payload; + } + } +} + +$players = (int) ($playerStats['total_players'] ?? 0); +$today = gmdate('Y-m-d'); +$activeToday = (int) (($playerStats['daily_active'] ?? [])[$today] ?? 0); +$updatedAt = isset($playerStats['updated_at']) ? date('d.m.Y H:i', (int) $playerStats['updated_at'] / 1000) : 'Noch keine Daten'; +?> +Void Bastion – Interne Statistik

GERGAMES · NICHT ÖFFENTLICH

Void Bastion Statistik

Abmelden
Downloads insgesamt
Downloads aktuelles Release
Registrierte Piloten
Heute aktive Piloten
Windows-Downloads
Android-Downloads

Die Downloadwerte stammen direkt aus den Gitea-Release-Anhängen und werden alle fünf Minuten neu geladen.

Die private Nakama-Statistik ist noch nicht mit dem HTTP-Schlüssel verbunden.

Letzte Spieleraktualisierung:

Diese Seite ist nicht verlinkt, von Suchmaschinen ausgeschlossen und verlangt eine Anmeldung. Es werden ausschließlich zusammengefasste Werte dargestellt.

diff --git a/intern/statistik/stats-config.example.php b/intern/statistik/stats-config.example.php new file mode 100644 index 0000000..bd002f8 --- /dev/null +++ b/intern/statistik/stats-config.example.php @@ -0,0 +1,10 @@ + 'dominic', + // SHA-256 eines langen, zufälligen Passworts. Keine Klartextpasswörter ablegen. + 'password_sha256' => 'HIER_SHA256_EINTRAGEN', + 'gitea_releases_api' => 'https://git.dominicspringer.de/api/v1/repos/Emporex/Void-Bastion-Releases/releases', + 'nakama_rpc_url' => 'https://api.void-bastion.gergames.de/v2/rpc/private_stats', + // Ausschließlich in stats-config.local.php eintragen; niemals ins Repository übernehmen. + 'nakama_http_key' => '', +]; diff --git a/legal.css b/legal.css new file mode 100644 index 0000000..3e0e611 --- /dev/null +++ b/legal.css @@ -0,0 +1 @@ +:root{color-scheme:dark;--ink:#edf9fd;--muted:#9db4c0;--cyan:#5cecff;--orange:#ff9d3f;--navy:#06121e;--panel:#0a1d2b;--line:rgba(117,226,247,.23);--max:920px}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 85% 0,rgba(22,137,164,.16),transparent 32%),var(--navy);color:var(--ink);font:16px/1.7 Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif}a{color:var(--cyan)}.shell{width:min(calc(100% - 32px),var(--max));margin:auto}.topbar{border-bottom:1px solid var(--line);background:rgba(3,13,21,.94)}nav{min-height:72px;display:flex;align-items:center;justify-content:space-between;gap:24px}.brand{text-decoration:none;color:var(--ink);font-weight:850;letter-spacing:.12em}.brand span{color:var(--cyan)}.back{text-decoration:none;color:var(--muted)}main{padding:72px 0 100px}h1,h2{line-height:1.15}h1{font-size:clamp(2.6rem,7vw,4.8rem);margin:0 0 18px;text-transform:uppercase;letter-spacing:-.04em}h2{font-size:1.45rem;margin:44px 0 12px;color:#c8f6ff}.lead{font-size:1.12rem;color:var(--muted);margin-bottom:38px}.panel{padding:clamp(22px,5vw,44px);border:1px solid var(--line);background:rgba(8,27,41,.84)}.notice{margin:0 0 30px;padding:18px 20px;border:1px solid rgba(255,157,63,.65);background:rgba(92,48,15,.42);color:#ffd2a7}.placeholder{color:#ffba78;font-weight:800}.meta{color:#7896a5;font-size:.9rem}.links{display:flex;flex-wrap:wrap;gap:14px 24px;margin-top:40px;padding-top:24px;border-top:1px solid var(--line)}ul{padding-left:22px}code{color:#b8f6ff}footer{padding:28px 0;border-top:1px solid var(--line);color:#7896a5}@media(max-width:600px){nav{align-items:flex-start;flex-direction:column;padding:18px 0;gap:8px}main{padding-top:48px}.panel{padding:22px}} diff --git a/privacy.html b/privacy.html new file mode 100644 index 0000000..b8e7cba --- /dev/null +++ b/privacy.html @@ -0,0 +1,49 @@ + + + + + + Datenschutz – Void Bastion + + + +
+

Datenschutz

Informationen zur Datenverarbeitung auf der Website und im Spiel Void Bastion.

+
+

Hinweis zum Entwicklungsstand: Echte Werbung, In-App-Käufe sowie Apple- und Google-Kontoverknüpfungen sind noch nicht aktiviert. Diese Erklärung wird vor Aktivierung solcher Funktionen entsprechend ergänzt.

+

1. Verantwortlicher

+

Dominic Springer, handelnd unter GerGames
Ziegelweg 1
95213 Münchberg
Deutschland
E-Mail: support@gergames.de

+

2. Website

+

Beim Aufruf dieser Website verarbeitet der Hostinganbieter technisch erforderliche Verbindungsdaten, insbesondere IP-Adresse, Datum und Uhrzeit, angeforderte Datei, übertragene Datenmenge, Referrer sowie Browser- und Betriebssystemangaben. Die Verarbeitung dient der sicheren und fehlerfreien Bereitstellung der Website. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. Unser berechtigtes Interesse liegt im sicheren Betrieb unseres Angebots.

+

Hostinganbieter: netcup GmbH, Daimlerstraße 25, 76185 Karlsruhe, Deutschland. Protokolldaten werden nur so lange gespeichert, wie dies für Betrieb, Fehleranalyse und Missbrauchsabwehr erforderlich ist, und anschließend gelöscht. Gesetzliche Aufbewahrungspflichten bleiben unberührt.

+

Die Website setzt derzeit keine eigenen Analyse- oder Marketing-Cookies ein.

+

3. Lokales Gastprofil

+

Beim ersten Spielstart erzeugt Void Bastion eine zufällige Spieler-ID und einen vorläufigen Spielernamen. Lokal gespeichert werden außerdem Einstellungen, Spielfortschritt, Kernkristalle und lokale Bestwerte. Die lokale Verarbeitung ist für das Speichern des Spielstands erforderlich. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO.

+

4. GerGames-Onlinekonto und Nakama

+

Für Ranglisten und Online-Multiplayer werden eine zufällige Konto-ID, Spielername, verknüpfte Anmeldeanbieter, Bestenlistenwerte und für laufende Partien erforderliche Spielzustände an den von GerGames betriebenen Nakama-Server übertragen. Zusätzlich fallen technisch erforderliche Verbindungs- und Sicherheitsdaten wie IP-Adresse und Zeitstempel an. Die Verarbeitung ist zur Bereitstellung der Onlinefunktionen erforderlich; Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO. Sicherheitsprotokolle können auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO verarbeitet werden.

+

Für eine interne, nicht öffentliche Nutzungsstatistik werden außerdem die pseudonyme Konto-ID, Plattform, App-Version sowie der erste und letzte Aktivitätstag verarbeitet. Daraus werden ausschließlich zusammengefasste Spielerzahlen gebildet. Die Statistik dient der technischen Planung, Fehlererkennung und Weiterentwicklung des Spiels. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt im sicheren und bedarfsgerechten Betrieb des Spiels. Es werden dafür keine Analyse-Cookies und kein externer Analysedienst eingesetzt.

+

Kontodaten werden grundsätzlich bis zur Löschung des Kontos gespeichert. Kurzlebige Matchdaten werden nach Ende beziehungsweise Ablauf der Partie nicht dauerhaft als vollständige Partieaufzeichnung gespeichert. Datenbank-Sicherungen werden täglich erstellt und nach 14 Tagen automatisch überschrieben. Gesetzlich erforderliche oder zur Missbrauchsabwehr zwingend benötigte Daten können im erforderlichen Umfang länger aufbewahrt werden.

+

5. Apple, Google und Plattformkonten

+

Wenn du später freiwillig „Mit Apple anmelden“, Game Center oder Google Play Games verknüpfst, übermittelt der jeweilige Plattformanbieter eine technische Kennung und gegebenenfalls einen dort gewählten Anzeigenamen. Zweck ist die Anmeldung und Wiederherstellung desselben GerGames-Kontos auf mehreren Geräten. Es gelten zusätzlich die Datenschutzbestimmungen von Apple beziehungsweise Google. Eine Verknüpfung findet erst nach einer aktiven Auswahl statt.

+

6. Bestenlisten und Multiplayer

+

In Bestenlisten können Spielername, Rang, Punktestand, erreichte Welle, Karte und Schwierigkeitsgrad für andere Spieler sichtbar sein. In einer Multiplayer-Lobby sehen Mitspieler den Spielernamen, die zugewiesene Seite und den Bereitschaftsstatus. Verwende keinen Klarnamen, wenn du nicht möchtest, dass er öffentlich angezeigt wird.

+

7. Werbung

+

Die Entwicklungsfassung verwendet ausschließlich Testanzeigen. Für eine spätere Veröffentlichung ist Google AdMob mit freiwilliger Belohnungswerbung und zurückhaltender Vollbildwerbung vorgesehen. Echte Werbung wird erst nach Einrichtung der erforderlichen Einwilligungsverwaltung aktiviert. Je nach Einwilligung können Google und Werbepartner Gerätekennungen, IP-Adresse, Anzeigeninteraktionen und Diagnosedaten verarbeiten. Vor Aktivierung werden Anbieter, Zwecke, Rechtsgrundlagen, Empfänger, Drittlandübermittlungen und Widerrufsmöglichkeit konkret ergänzt.

+

8. Empfänger und Drittlandübermittlung

+

Daten erhalten nur Dienstleister, die für Hosting, Plattformanmeldung, Storebetrieb oder – nach Aktivierung und Einwilligung – Werbung erforderlich sind. Bei Apple und Google kann eine Verarbeitung außerhalb der EU/des EWR stattfinden. Maßgeblich sind die jeweils anwendbaren Garantien des Anbieters, insbesondere Angemessenheitsbeschlüsse oder Standardvertragsklauseln.

+

9. Deine Rechte

+

Du hast im Rahmen der gesetzlichen Voraussetzungen Rechte auf Auskunft, Berichtigung, Löschung, Einschränkung der Verarbeitung, Datenübertragbarkeit und Widerspruch. Eine erteilte Einwilligung kannst du mit Wirkung für die Zukunft widerrufen. Außerdem besteht ein Beschwerderecht bei einer Datenschutzaufsichtsbehörde.

+

Anfragen zu deinen Rechten kannst du an support@gergames.de senden.

+

10. Kontolöschung

+

Ein GerGames-Konto kann in den Kontoeinstellungen von Void Bastion gelöscht werden. Zusätzlich steht die externe Anleitung unter Konto und Daten löschen bereit. Die Löschung umfasst das Konto und die zugeordneten Spiel- und Ranglistendaten, soweit keine gesetzliche Aufbewahrung oder zwingende Missbrauchsprävention entgegensteht. Lokale Spieldaten werden auf dem jeweiligen Gerät getrennt gelöscht.

+

11. Kinder

+

Void Bastion richtet sich nicht gezielt an Kinder unter 16 Jahren. Es werden keine Klarnamen verlangt. Eltern und Sorgeberechtigte können sich bei Fragen oder Löschwünschen an die oben genannte Kontaktadresse wenden.

+

12. Änderungen

+

Diese Erklärung wird angepasst, wenn neue Funktionen, Plattformanmeldungen, Käufe oder echte Werbung aktiviert werden. Die jeweils aktuelle Fassung wird auf dieser Website und aus dem Spiel heraus erreichbar sein.

+

Stand: Oktober 2026 · Arbeitsfassung, keine individuelle Rechtsberatung.

+ +
+
+ + + diff --git a/support.html b/support.html new file mode 100644 index 0000000..e838712 --- /dev/null +++ b/support.html @@ -0,0 +1,24 @@ + + + + + + Support – Void Bastion + + + +
+

Support

Hilfe zu Void Bastion, Konten, Spielständen und Onlinepartien.

+
+

Kontakt

+

Support-E-Mail: support@gergames.de

+

Diese Angaben helfen uns

+
  • Plattform und Betriebssystemversion
  • Version von Void Bastion
  • kurze Beschreibung des Problems
  • ungefähre Uhrzeit des Fehlers
  • deine gekürzte Spieler-ID aus dem Profil – niemals Passwörter oder Anmeldecodes
+

Konto und Datenschutz

+

Für Auskunft, Berichtigung oder Löschung nutze bitte die Kontaktadresse oder die Seite Konto und Daten löschen.

+ +
+
+ + +