Publish Void Bastion website
This commit is contained in:
commit
8474894756
15 files changed
+570
No files matched your search
@@ -0,0 +1,2 @@
|
||||
intern/statistik/stats-config.local.php
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.3 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 524 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.3 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 499 KiB |
@@ -0,0 +1,28 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Konto löschen – Void Bastion</title>
|
||||
<link rel="stylesheet" href="legal.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="topbar"><nav class="shell"><a class="brand" href="index.html">GER<span>GAMES</span></a><a class="back" href="index.html">← Zurück zu Void Bastion</a></nav></header>
|
||||
<main class="shell"><h1>Konto löschen</h1><p class="lead">So kannst du dein GerGames-Konto und die damit verbundenen Daten löschen.</p>
|
||||
<div class="panel">
|
||||
<h2>Direkt in der App</h2>
|
||||
<ol><li>Öffne in Void Bastion dein <strong>Profil</strong>.</li><li>Wähle <strong>Konto löschen</strong>.</li><li>Bestätige den deutlich angezeigten Löschhinweis ein zweites Mal.</li></ol>
|
||||
<p>Nach erfolgreicher Löschung wird das Onlinekonto entfernt und auf dem Gerät ein neues, nicht verbundenes Gastprofil angelegt.</p>
|
||||
<h2>Ohne Zugriff auf die App</h2>
|
||||
<p>Sende eine Löschanfrage an <a href="mailto:support@gergames.de?subject=Void%20Bastion%20Kontol%C3%B6schung">support@gergames.de</a>. Nenne den Spielernamen und – falls vorhanden – die gekürzte Spieler-ID. Wir können zur Vermeidung einer unberechtigten Löschung einen geeigneten Nachweis verlangen.</p>
|
||||
<h2>Welche Daten werden gelöscht?</h2>
|
||||
<ul><li>GerGames-Onlinekonto und verknüpfte Anmeldekennungen</li><li>Spielername und serverseitiger Fortschritt</li><li>Bestenlisteneinträge, soweit sie dem Konto zugeordnet sind</li><li>sonstige kontobezogene Spieldaten</li></ul>
|
||||
<p>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.</p>
|
||||
<h2>Wichtig bei Käufen</h2>
|
||||
<p>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.</p>
|
||||
<div class="links"><a href="impressum.html">Impressum</a><a href="privacy.html">Datenschutz</a><a href="support.html">Support</a></div>
|
||||
</div>
|
||||
</main>
|
||||
<footer><div class="shell">GerGames · Void Bastion</div></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,29 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Impressum – GerGames</title>
|
||||
<link rel="stylesheet" href="legal.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="topbar"><nav class="shell"><a class="brand" href="index.html">GER<span>GAMES</span></a><a class="back" href="index.html">← Zurück zu Void Bastion</a></nav></header>
|
||||
<main class="shell"><h1>Impressum</h1><p class="lead">Anbieterkennzeichnung für GerGames und Void Bastion.</p>
|
||||
<div class="panel">
|
||||
<h2>Angaben gemäß § 5 DDG</h2>
|
||||
<p>Dominic Springer<br>GerGames<br>Ziegelweg 1<br>95213 Münchberg<br>Deutschland</p>
|
||||
<h2>Kontakt</h2>
|
||||
<p>E-Mail: <a href="mailto:support@gergames.de">support@gergames.de</a></p>
|
||||
<h2>Verantwortlich für den Inhalt</h2>
|
||||
<p>Dominic Springer<br>Ziegelweg 1<br>95213 Münchberg<br>Deutschland</p>
|
||||
<h2>Verbraucherstreitbeilegung</h2>
|
||||
<p>Wir sind nicht verpflichtet und nicht bereit, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p>
|
||||
<h2>Haftung für Links</h2>
|
||||
<p>Diese Website kann Links zu externen Angeboten enthalten. Für deren Inhalte sind ausschließlich die jeweiligen Betreiber verantwortlich.</p>
|
||||
<p class="meta">Stand: Oktober 2026</p>
|
||||
<div class="links"><a href="privacy.html">Datenschutz</a><a href="support.html">Support</a><a href="delete-account.html">Konto löschen</a></div>
|
||||
</div>
|
||||
</main>
|
||||
<footer><div class="shell">GerGames · Void Bastion</div></footer>
|
||||
</body>
|
||||
</html>
|
||||
+278
@@ -0,0 +1,278 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#06131f">
|
||||
<meta name="description" content="Void Bastion ist ein strategisches Tower-Defense-Spiel im Weltraum für Windows, Android und iOS – entwickelt von GerGames.">
|
||||
<title>Void Bastion — GerGames</title>
|
||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='14' fill='%2306121e'/%3E%3Ccircle cx='32' cy='32' r='20' fill='none' stroke='%235cecff' stroke-width='5'/%3E%3Ccircle cx='32' cy='32' r='7' fill='%23ff9d3f'/%3E%3Cpath d='M32 4v11M32 49v11M4 32h11M49 32h11' stroke='%235cecff' stroke-width='5' stroke-linecap='round'/%3E%3C/svg%3E">
|
||||
<style>
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
--ink: #f3f9fc;
|
||||
--muted: #9cb2bf;
|
||||
--cyan: #5cecff;
|
||||
--cyan-soft: #1e9bb2;
|
||||
--orange: #ff9d3f;
|
||||
--navy: #06121e;
|
||||
--panel: rgba(8, 25, 38, .76);
|
||||
--line: rgba(117, 226, 247, .22);
|
||||
--max: 1180px;
|
||||
}
|
||||
* { box-sizing: border-box; }
|
||||
html { scroll-behavior: smooth; }
|
||||
body {
|
||||
margin: 0;
|
||||
min-width: 320px;
|
||||
background: var(--navy);
|
||||
color: var(--ink);
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
a { color: inherit; }
|
||||
.shell { width: min(calc(100% - 40px), var(--max)); margin: 0 auto; }
|
||||
.hero {
|
||||
min-height: 92svh;
|
||||
position: relative;
|
||||
display: grid;
|
||||
align-items: center;
|
||||
isolation: isolate;
|
||||
overflow: hidden;
|
||||
background: #05101a url("assets/station.webp") center / cover no-repeat;
|
||||
}
|
||||
.hero::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: -1;
|
||||
background:
|
||||
linear-gradient(90deg, rgba(3, 12, 20, .96) 0%, rgba(3, 12, 20, .74) 47%, rgba(3, 12, 20, .18) 100%),
|
||||
linear-gradient(0deg, var(--navy) 0%, transparent 22%);
|
||||
}
|
||||
.hero::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
width: 42vw;
|
||||
aspect-ratio: 1;
|
||||
right: -15vw;
|
||||
top: 10vh;
|
||||
z-index: -1;
|
||||
border: 1px solid rgba(92, 236, 255, .35);
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 0 100px rgba(13, 172, 210, .18), inset 0 0 80px rgba(13, 172, 210, .1);
|
||||
}
|
||||
.topbar {
|
||||
position: absolute;
|
||||
inset: 0 0 auto;
|
||||
z-index: 4;
|
||||
border-bottom: 1px solid rgba(255,255,255,.08);
|
||||
background: linear-gradient(180deg, rgba(3,12,20,.88), rgba(3,12,20,.28));
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
.nav { height: 76px; display: flex; align-items: center; justify-content: space-between; gap: 24px; }
|
||||
.brand { display: inline-flex; align-items: center; gap: 12px; text-decoration: none; font-weight: 800; letter-spacing: .12em; }
|
||||
.brand-mark { width: 34px; height: 34px; display: grid; place-items: center; border: 1px solid var(--cyan); border-radius: 50%; box-shadow: 0 0 20px rgba(92,236,255,.3); }
|
||||
.brand-mark::before { content: ""; width: 10px; height: 10px; border-radius: 50%; background: var(--orange); box-shadow: 0 0 16px var(--orange); }
|
||||
.brand small { color: var(--cyan); font-size: .72em; }
|
||||
.nav-link { color: var(--muted); text-decoration: none; font-size: .94rem; transition: color .2s ease; }
|
||||
.nav-link:hover, .nav-link:focus-visible { color: var(--cyan); }
|
||||
.hero-grid { padding: 132px 0 90px; display: grid; grid-template-columns: minmax(0, 680px) 1fr; align-items: center; }
|
||||
.eyebrow { display: flex; align-items: center; gap: 10px; margin: 0 0 18px; color: var(--cyan); font-weight: 750; letter-spacing: .16em; text-transform: uppercase; font-size: .78rem; }
|
||||
.eyebrow::before { content: ""; width: 36px; height: 2px; background: var(--cyan); box-shadow: 0 0 12px var(--cyan); }
|
||||
h1, h2, h3 { margin: 0; line-height: 1.08; text-wrap: balance; }
|
||||
h1 { max-width: 730px; font-size: clamp(4rem, 9vw, 8.5rem); letter-spacing: -.065em; text-transform: uppercase; }
|
||||
h1 span { display: block; color: transparent; -webkit-text-stroke: 1px rgba(210, 245, 252, .78); }
|
||||
.lead { max-width: 610px; margin: 26px 0 32px; color: #c4d4dc; font-size: clamp(1.05rem, 1.8vw, 1.3rem); }
|
||||
.actions { display: flex; align-items: center; flex-wrap: wrap; gap: 14px; }
|
||||
.button { min-height: 52px; display: inline-flex; align-items: center; justify-content: center; padding: 0 24px; border: 1px solid var(--cyan); color: #031119; background: var(--cyan); text-decoration: none; font-weight: 800; letter-spacing: .04em; transition: transform .2s ease, box-shadow .2s ease; }
|
||||
.button:hover, .button:focus-visible { transform: translateY(-2px); box-shadow: 0 10px 30px rgba(92,236,255,.25); }
|
||||
.button-secondary { color: var(--ink); background: rgba(2,11,18,.68); }
|
||||
.button-secondary:hover, .button-secondary:focus-visible { color: var(--cyan); }
|
||||
.status { display: inline-flex; align-items: center; gap: 9px; min-height: 52px; padding: 0 16px; color: #c8d7de; border: 1px solid rgba(255,255,255,.13); background: rgba(2,11,18,.55); }
|
||||
.status::before { content: ""; width: 7px; height: 7px; background: var(--orange); border-radius: 50%; box-shadow: 0 0 12px var(--orange); }
|
||||
.platforms { margin-top: 34px; display: flex; gap: 20px; flex-wrap: wrap; color: var(--muted); font-size: .88rem; letter-spacing: .08em; text-transform: uppercase; }
|
||||
.platforms span { display: flex; align-items: center; gap: 8px; }
|
||||
.platforms span::before { content: ""; width: 5px; height: 5px; transform: rotate(45deg); background: var(--cyan-soft); }
|
||||
.tower-strip { position: absolute; right: -4vw; bottom: 4vh; width: min(59vw, 920px); pointer-events: none; filter: drop-shadow(0 22px 45px rgba(0,0,0,.65)); opacity: .82; }
|
||||
section { position: relative; padding: 110px 0; }
|
||||
.intro { background: radial-gradient(circle at 82% 10%, rgba(15,132,167,.13), transparent 34%), var(--navy); }
|
||||
.section-grid { display: grid; grid-template-columns: .85fr 1.15fr; gap: clamp(50px, 9vw, 120px); align-items: center; }
|
||||
h2 { font-size: clamp(2.4rem, 5vw, 4.8rem); letter-spacing: -.045em; text-transform: uppercase; }
|
||||
.copy { color: var(--muted); max-width: 650px; font-size: 1.08rem; }
|
||||
.copy strong { color: var(--ink); }
|
||||
.stats { display: grid; grid-template-columns: repeat(2, 1fr); border: 1px solid var(--line); background: linear-gradient(145deg, rgba(13,45,63,.78), rgba(4,17,28,.62)); }
|
||||
.stat { padding: 28px; min-height: 145px; border: 1px solid rgba(117,226,247,.09); }
|
||||
.stat strong { display: block; color: var(--cyan); font-size: clamp(2.2rem, 5vw, 4rem); line-height: 1; font-variant-numeric: tabular-nums; }
|
||||
.stat span { display: block; margin-top: 10px; color: #b6c7d0; }
|
||||
.tactics { background: #081722; border-block: 1px solid rgba(117,226,247,.1); }
|
||||
.section-head { display: flex; justify-content: space-between; gap: 50px; align-items: end; margin-bottom: 52px; }
|
||||
.section-head p { max-width: 490px; color: var(--muted); margin: 0; }
|
||||
.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
|
||||
.card { position: relative; min-height: 300px; padding: 34px; border: 1px solid var(--line); overflow: hidden; background: linear-gradient(160deg, rgba(13,42,58,.9), rgba(5,18,29,.95)); }
|
||||
.card::after { content: attr(data-index); position: absolute; right: 18px; bottom: -28px; color: rgba(92,236,255,.045); font-size: 9rem; font-weight: 900; line-height: 1; }
|
||||
.card-icon { width: 46px; height: 46px; margin-bottom: 50px; border: 1px solid var(--cyan-soft); display: grid; place-items: center; color: var(--cyan); font-weight: 900; transform: rotate(45deg); }
|
||||
.card-icon span { transform: rotate(-45deg); }
|
||||
.card h3 { font-size: 1.45rem; text-transform: uppercase; }
|
||||
.card p { position: relative; z-index: 1; color: var(--muted); margin: 14px 0 0; }
|
||||
.development { overflow: hidden; background: #040d15; }
|
||||
.gallery { background: radial-gradient(circle at 10% 30%, rgba(92,236,255,.08), transparent 35%), #06131f; }
|
||||
.gallery-grid { display: grid; grid-template-columns: 1.35fr .85fr; gap: 18px; align-items: stretch; }
|
||||
.shot { margin: 0; position: relative; border: 1px solid var(--line); background: #020910; overflow: hidden; min-height: 330px; }
|
||||
.shot img { width: 100%; height: 100%; min-height: 330px; display: block; object-fit: cover; transition: transform .5s ease; }
|
||||
.shot:hover img { transform: scale(1.025); }
|
||||
.shot figcaption { position: absolute; inset: auto 0 0; padding: 45px 24px 20px; background: linear-gradient(transparent, rgba(2,9,16,.95)); color: #d8e8ee; font-weight: 700; letter-spacing: .04em; }
|
||||
.shot figcaption small { display: block; margin-top: 4px; color: var(--cyan); font-size: .78rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; }
|
||||
.dev-panel { position: relative; display: grid; grid-template-columns: 230px 1fr; gap: 44px; align-items: center; padding: clamp(30px, 6vw, 70px); border: 1px solid var(--line); background: linear-gradient(110deg, rgba(6,30,45,.95), rgba(12,27,39,.75)); }
|
||||
.dev-icon { width: 100%; border-radius: 24%; box-shadow: 0 20px 70px rgba(0,0,0,.55), 0 0 45px rgba(45,214,244,.13); }
|
||||
.dev-panel h2 { font-size: clamp(2rem, 4vw, 4rem); }
|
||||
.dev-panel p { color: var(--muted); max-width: 680px; margin: 20px 0 0; }
|
||||
.store-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 30px; }
|
||||
.store-badge { min-height: 68px; display: flex; align-items: center; gap: 12px; padding: 12px 15px; border: 1px solid rgba(255,255,255,.14); background: rgba(2,10,17,.48); color: #d7e5eb; }
|
||||
.store-badge b { display: block; font-size: .96rem; }
|
||||
.store-badge small { display: block; color: #7f9aa8; font-size: .74rem; line-height: 1.3; }
|
||||
a.store-badge { text-decoration: none; transition: border-color .2s ease, background .2s ease, transform .2s ease; }
|
||||
a.store-badge:hover, a.store-badge:focus-visible { border-color: var(--cyan); background: rgba(10,46,62,.72); transform: translateY(-2px); }
|
||||
.store-symbol { width: 28px; height: 28px; display: grid; place-items: center; flex: 0 0 auto; border: 1px solid var(--cyan-soft); color: var(--cyan); font-size: .82rem; font-weight: 900; }
|
||||
.badge { display: inline-block; margin-bottom: 18px; padding: 6px 11px; border: 1px solid rgba(255,157,63,.5); color: #ffc187; font-size: .78rem; letter-spacing: .14em; text-transform: uppercase; }
|
||||
footer { padding: 36px 0; color: #78919f; border-top: 1px solid rgba(255,255,255,.07); }
|
||||
.footer-row { display: flex; justify-content: space-between; gap: 20px; flex-wrap: wrap; }
|
||||
.footer-row strong { color: #bcd2dc; letter-spacing: .12em; }
|
||||
.footer-links { display: flex; gap: 18px; flex-wrap: wrap; }
|
||||
.footer-links a { color: #9cb2bf; text-decoration: none; }
|
||||
.footer-links a:hover, .footer-links a:focus-visible { color: var(--cyan); }
|
||||
.reveal { opacity: 0; transform: translateY(24px); transition: opacity .7s ease, transform .7s ease; }
|
||||
.reveal.visible { opacity: 1; transform: none; }
|
||||
@media (max-width: 900px) {
|
||||
.hero-grid { grid-template-columns: 1fr; }
|
||||
.tower-strip { width: 92vw; right: -34vw; bottom: 4vh; opacity: .5; }
|
||||
.section-grid, .dev-panel { grid-template-columns: 1fr; }
|
||||
.dev-icon { width: min(190px, 55vw); }
|
||||
.cards { grid-template-columns: 1fr; }
|
||||
.gallery-grid { grid-template-columns: 1fr; }
|
||||
.card { min-height: 240px; }
|
||||
.card-icon { margin-bottom: 35px; }
|
||||
.section-head { display: block; }
|
||||
.section-head p { margin-top: 20px; }
|
||||
}
|
||||
@media (max-width: 620px) {
|
||||
.shell { width: min(calc(100% - 28px), var(--max)); }
|
||||
.nav { height: 68px; }
|
||||
.nav-link { display: none; }
|
||||
.hero { min-height: 860px; }
|
||||
.hero-grid { padding-top: 112px; align-self: start; }
|
||||
h1 { font-size: clamp(3.6rem, 19vw, 5.7rem); }
|
||||
.tower-strip { width: 155vw; max-width: none; right: -63vw; bottom: 5vh; opacity: .58; }
|
||||
section { padding: 78px 0; }
|
||||
.stats { grid-template-columns: 1fr 1fr; }
|
||||
.stat { padding: 20px; min-height: 120px; }
|
||||
.button, .status { width: 100%; }
|
||||
.store-grid { grid-template-columns: 1fr; }
|
||||
.platforms { gap: 12px 18px; }
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
html { scroll-behavior: auto; }
|
||||
.reveal { opacity: 1; transform: none; transition: none; }
|
||||
.button { transition: none; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="topbar">
|
||||
<nav class="nav shell" aria-label="Hauptnavigation">
|
||||
<a class="brand" href="#start" aria-label="GerGames – Startseite"><span class="brand-mark" aria-hidden="true"></span><span>GER<small>GAMES</small></span></a>
|
||||
<a class="nav-link" href="#entwicklung">Entwicklungsstand</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="hero" id="start">
|
||||
<div class="hero-grid shell">
|
||||
<div>
|
||||
<p class="eyebrow">Strategisches Tower Defense</p>
|
||||
<h1>Void <span>Bastion</span></h1>
|
||||
<p class="lead">Die letzte Verteidigungslinie liegt zwischen dem Reaktor und der Leere. Baue, verbessere und halte deine Stellung gegen immer stärkere Angriffswellen.</p>
|
||||
<div class="actions">
|
||||
<a class="button" href="https://git.dominicspringer.de/Emporex/Void-Bastion-Releases/releases/download/v0.1.0-alpha.2/Void-Bastion-Setup-x64.exe">Windows Alpha herunterladen</a>
|
||||
<a class="button button-secondary" href="#spiel">Spiel entdecken</a>
|
||||
<span class="status">Alpha 0.1.0 · 64 Bit</span>
|
||||
</div>
|
||||
<div class="platforms" aria-label="Geplante Plattformen"><span>Windows</span><span>Android</span><span>iOS</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<img class="tower-strip" src="assets/towers.webp" alt="Kinetik-, Laser- und Raketenturm aus Void Bastion">
|
||||
</section>
|
||||
|
||||
<section class="intro" id="spiel">
|
||||
<div class="section-grid shell">
|
||||
<div class="reveal">
|
||||
<p class="eyebrow">Halte die Linie</p>
|
||||
<h2>Jede Zelle zählt.</h2>
|
||||
<p class="copy"><strong>Void Bastion verbindet klar lesbare Karten mit taktischen Entscheidungen.</strong> Nutze Reichweite, Feuerrate und Schaden deiner Türme, verteidige unterschiedliche Weltraumsektoren und entscheide nach der letzten Missionswelle selbst, ob du im Endlosmodus weiterkämpfst.</p>
|
||||
</div>
|
||||
<div class="stats reveal" aria-label="Spielumfang">
|
||||
<div class="stat"><strong>03</strong><span>Weltraumkarten</span></div>
|
||||
<div class="stat"><strong>03</strong><span>Turmklassen</span></div>
|
||||
<div class="stat"><strong>15</strong><span>Missionswellen</span></div>
|
||||
<div class="stat"><strong>∞</strong><span>Endlosmodus</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tactics">
|
||||
<div class="shell">
|
||||
<div class="section-head reveal">
|
||||
<div><p class="eyebrow">Deine Verteidigung</p><h2>Planen. Aufrüsten. Überleben.</h2></div>
|
||||
<p>Drei Schwierigkeitsgrade, unterschiedliche Feindklassen und klar erkennbare Reichweiten machen jede Entscheidung nachvollziehbar – aber nicht automatisch leicht.</p>
|
||||
</div>
|
||||
<div class="cards">
|
||||
<article class="card reveal" data-index="1"><div class="card-icon"><span>01</span></div><h3>Position wählen</h3><p>Nutze das Bauraster und platziere jeden Turm dort, wo seine Reichweite den Gegnerweg optimal abdeckt.</p></article>
|
||||
<article class="card reveal" data-index="2"><div class="card-icon"><span>02</span></div><h3>Systeme kombinieren</h3><p>Kinetik, Laser und Raketen erfüllen verschiedene Rollen – vom schnellen Einzelziel bis zum schweren Flächenschaden.</p></article>
|
||||
<article class="card reveal" data-index="3"><div class="card-icon"><span>03</span></div><h3>Gemeinsam halten</h3><p>Verteidige im Koop eine gespiegelte Station mit getrennten Ressourcen und einem gemeinsamen Reaktor – lokal mit KI, später auch online.</p></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="gallery" aria-labelledby="gallery-title">
|
||||
<div class="shell">
|
||||
<div class="section-head reveal">
|
||||
<div><p class="eyebrow">Direkt aus dem Prototyp</p><h2 id="gallery-title">Die Front im Blick.</h2></div>
|
||||
<p>Frühe Spielszenen aus der laufenden Entwicklung: transparente Reichweiten, klar erkennbare Bauflächen und eine Koop-Arena mit gemeinsamem Reaktor.</p>
|
||||
</div>
|
||||
<div class="gallery-grid">
|
||||
<figure class="shot reveal"><img src="assets/gameplay-coop.webp" alt="Koop-Arena mit zwei gespiegelten Verteidigungsseiten und gemeinsamem Reaktor" loading="lazy"><figcaption>Gespiegelte Koop-Arena<small>Gemeinsamer Reaktor · getrennte Ressourcen</small></figcaption></figure>
|
||||
<figure class="shot reveal"><img src="assets/gameplay-grid.webp" alt="Weltraumkarte mit Straßen, Bauraster und Turmauswahl" loading="lazy"><figcaption>Taktisches Bauraster<small>Positionieren · verbessern · verteidigen</small></figcaption></figure>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="development" id="entwicklung">
|
||||
<div class="shell">
|
||||
<div class="dev-panel reveal">
|
||||
<img class="dev-icon" src="assets/reactor.webp" alt="Leuchtender Reaktor von Void Bastion">
|
||||
<div><span class="badge">Aktuell in Entwicklung</span><h2>Die Bastion wächst.</h2><p>Void Bastion entsteht bei <strong>GerGames</strong>. 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.</p>
|
||||
<div class="store-grid" aria-label="Geplante Veröffentlichungsplattformen">
|
||||
<a class="store-badge" href="https://git.dominicspringer.de/Emporex/Void-Bastion-Releases/releases/download/v0.1.0-alpha.2/Void-Bastion-Setup-x64.exe"><span class="store-symbol">PC</span><span><b>Windows Alpha</b><small>Setup herunterladen · 111 MiB</small></span></a>
|
||||
<span class="store-badge"><span class="store-symbol">A</span><span><b>Android</b><small>Google Play folgt</small></span></span>
|
||||
<span class="store-badge"><span class="store-symbol">i</span><span><b>iPhone & iPad</b><small>App Store folgt</small></span></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="footer-row shell"><strong>GERGAMES</strong><span>Void Bastion · Entwickelt in Deutschland</span><span class="footer-links"><a href="impressum.html">Impressum</a><a href="privacy.html">Datenschutz</a><a href="support.html">Support</a><a href="delete-account.html">Konto löschen</a></span></div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry) => entry.isIntersecting && entry.target.classList.add('visible'));
|
||||
}, { threshold: 0.14 });
|
||||
document.querySelectorAll('.reveal').forEach((element) => observer.observe(element));
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,12 @@
|
||||
Options -Indexes
|
||||
|
||||
<IfModule mod_authz_core.c>
|
||||
<FilesMatch "^stats-config\..*\.php$">
|
||||
Require all denied
|
||||
</FilesMatch>
|
||||
</IfModule>
|
||||
|
||||
<IfModule mod_headers.c>
|
||||
Header always set X-Robots-Tag "noindex, nofollow, noarchive"
|
||||
Header always set Cache-Control "no-store, private"
|
||||
</IfModule>
|
||||
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
header('X-Robots-Tag: noindex, nofollow, noarchive', true);
|
||||
header('Cache-Control: no-store, private', true);
|
||||
header('Referrer-Policy: no-referrer', true);
|
||||
header('X-Content-Type-Options: nosniff', true);
|
||||
|
||||
session_name('void_bastion_internal_stats');
|
||||
session_set_cookie_params([
|
||||
'lifetime' => 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'])):
|
||||
?>
|
||||
<!doctype html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex,nofollow,noarchive"><title>GerGames – Interne Statistik</title><style>
|
||||
:root{color-scheme:dark;font-family:Inter,system-ui,sans-serif;background:#06121e;color:#eaf8fc}*{box-sizing:border-box}body{margin:0;min-height:100vh;display:grid;place-items:center;padding:24px;background:radial-gradient(circle at 50% 0,#12394d 0,transparent 48%),#06121e}.box{width:min(100%,420px);padding:32px;border:1px solid #2d7182;background:#091d2a;box-shadow:0 24px 80px #0008}h1{margin:0 0 8px;font-size:1.7rem}p{color:#9db6c1}label{display:block;margin:18px 0 6px;color:#bcd5df}input,button{width:100%;min-height:48px;border:1px solid #316f80;background:#071722;color:#fff;padding:10px 12px;font:inherit}button{margin-top:22px;background:#5cecff;color:#031119;font-weight:800;cursor:pointer}.error{color:#ffac99}
|
||||
</style></head><body><main class="box"><h1>Interne Statistik</h1><p>Geschützter GerGames-Bereich</p><?php if ($loginError): ?><p class="error"><?= e($loginError) ?></p><?php endif; ?><form method="post" autocomplete="off"><label for="username">Benutzername</label><input id="username" name="username" required autocomplete="username"><label for="password">Passwort</label><input id="password" name="password" type="password" required autocomplete="current-password"><button type="submit">Anmelden</button></form></main></body></html>
|
||||
<?php
|
||||
exit;
|
||||
endif;
|
||||
|
||||
$releases = fetchJson((string) $config['gitea_releases_api']) ?? [];
|
||||
$downloadTotal = 0;
|
||||
$latestDownloads = 0;
|
||||
$latestRelease = 'Noch kein Release';
|
||||
$platformDownloads = ['windows' => 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';
|
||||
?>
|
||||
<!doctype html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex,nofollow,noarchive"><meta http-equiv="refresh" content="300"><title>Void Bastion – Interne Statistik</title><style>
|
||||
:root{color-scheme:dark;--bg:#06121e;--panel:#0a2030;--line:#26596a;--cyan:#5cecff;--muted:#92aebb;font-family:Inter,system-ui,sans-serif}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 85% 0,#12384b 0,transparent 35%),var(--bg);color:#edfaff;min-height:100vh}.shell{width:min(1120px,calc(100% - 32px));margin:auto;padding:48px 0}header{display:flex;justify-content:space-between;align-items:start;gap:24px;margin-bottom:34px}h1{margin:0;font-size:clamp(2rem,5vw,4rem);letter-spacing:-.04em}p{color:var(--muted)}a{color:var(--cyan)}.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.card{padding:24px;border:1px solid var(--line);background:linear-gradient(145deg,#0d2c3d,#071722)}.card strong{display:block;color:var(--cyan);font-size:clamp(2rem,4vw,3.5rem);line-height:1}.card span{display:block;margin-top:10px;color:#b9ced7}.panel{margin-top:18px;padding:24px;border:1px solid var(--line);background:#081b28}.warning{color:#ffbd7b}.meta{font-size:.9rem}@media(max-width:800px){.grid{grid-template-columns:1fr 1fr}header{display:block}}@media(max-width:480px){.grid{grid-template-columns:1fr}}
|
||||
</style></head><body><main class="shell"><header><div><p>GERGAMES · NICHT ÖFFENTLICH</p><h1>Void Bastion Statistik</h1></div><a href="?logout=1">Abmelden</a></header><section class="grid"><article class="card"><strong><?= $downloadTotal ?></strong><span>Downloads insgesamt</span></article><article class="card"><strong><?= $latestDownloads ?></strong><span>Downloads aktuelles Release</span></article><article class="card"><strong><?= $players ?></strong><span>Registrierte Piloten</span></article><article class="card"><strong><?= $activeToday ?></strong><span>Heute aktive Piloten</span></article><article class="card"><strong><?= $platformDownloads['windows'] ?></strong><span>Windows-Downloads</span></article><article class="card"><strong><?= $platformDownloads['android'] ?></strong><span>Android-Downloads</span></article></section><section class="panel"><h2><?= e($latestRelease) ?></h2><p>Die Downloadwerte stammen direkt aus den Gitea-Release-Anhängen und werden alle fünf Minuten neu geladen.</p><?php if ($playerStats === null): ?><p class="warning">Die private Nakama-Statistik ist noch nicht mit dem HTTP-Schlüssel verbunden.</p><?php else: ?><p>Letzte Spieleraktualisierung: <?= e($updatedAt) ?></p><?php endif; ?><p class="meta">Diese Seite ist nicht verlinkt, von Suchmaschinen ausgeschlossen und verlangt eine Anmeldung. Es werden ausschließlich zusammengefasste Werte dargestellt.</p></section></main></body></html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
return [
|
||||
'username' => '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' => '',
|
||||
];
|
||||
@@ -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}}
|
||||
@@ -0,0 +1,49 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Datenschutz – Void Bastion</title>
|
||||
<link rel="stylesheet" href="legal.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="topbar"><nav class="shell"><a class="brand" href="index.html">GER<span>GAMES</span></a><a class="back" href="index.html">← Zurück zu Void Bastion</a></nav></header>
|
||||
<main class="shell"><h1>Datenschutz</h1><p class="lead">Informationen zur Datenverarbeitung auf der Website und im Spiel Void Bastion.</p>
|
||||
<div class="panel">
|
||||
<p class="notice"><strong>Hinweis zum Entwicklungsstand:</strong> 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.</p>
|
||||
<h2>1. Verantwortlicher</h2>
|
||||
<p>Dominic Springer, handelnd unter GerGames<br>Ziegelweg 1<br>95213 Münchberg<br>Deutschland<br>E-Mail: <a href="mailto:support@gergames.de">support@gergames.de</a></p>
|
||||
<h2>2. Website</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>Die Website setzt derzeit keine eigenen Analyse- oder Marketing-Cookies ein.</p>
|
||||
<h2>3. Lokales Gastprofil</h2>
|
||||
<p>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.</p>
|
||||
<h2>4. GerGames-Onlinekonto und Nakama</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<h2>5. Apple, Google und Plattformkonten</h2>
|
||||
<p>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.</p>
|
||||
<h2>6. Bestenlisten und Multiplayer</h2>
|
||||
<p>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.</p>
|
||||
<h2>7. Werbung</h2>
|
||||
<p>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.</p>
|
||||
<h2>8. Empfänger und Drittlandübermittlung</h2>
|
||||
<p>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.</p>
|
||||
<h2>9. Deine Rechte</h2>
|
||||
<p>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.</p>
|
||||
<p>Anfragen zu deinen Rechten kannst du an <a href="mailto:support@gergames.de">support@gergames.de</a> senden.</p>
|
||||
<h2>10. Kontolöschung</h2>
|
||||
<p>Ein GerGames-Konto kann in den Kontoeinstellungen von Void Bastion gelöscht werden. Zusätzlich steht die externe Anleitung unter <a href="delete-account.html">Konto und Daten löschen</a> 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.</p>
|
||||
<h2>11. Kinder</h2>
|
||||
<p>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.</p>
|
||||
<h2>12. Änderungen</h2>
|
||||
<p>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.</p>
|
||||
<p class="meta">Stand: Oktober 2026 · Arbeitsfassung, keine individuelle Rechtsberatung.</p>
|
||||
<div class="links"><a href="impressum.html">Impressum</a><a href="support.html">Support</a><a href="delete-account.html">Konto löschen</a></div>
|
||||
</div>
|
||||
</main>
|
||||
<footer><div class="shell">GerGames · Void Bastion</div></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,24 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Support – Void Bastion</title>
|
||||
<link rel="stylesheet" href="legal.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="topbar"><nav class="shell"><a class="brand" href="index.html">GER<span>GAMES</span></a><a class="back" href="index.html">← Zurück zu Void Bastion</a></nav></header>
|
||||
<main class="shell"><h1>Support</h1><p class="lead">Hilfe zu Void Bastion, Konten, Spielständen und Onlinepartien.</p>
|
||||
<div class="panel">
|
||||
<h2>Kontakt</h2>
|
||||
<p>Support-E-Mail: <a href="mailto:support@gergames.de">support@gergames.de</a></p>
|
||||
<h2>Diese Angaben helfen uns</h2>
|
||||
<ul><li>Plattform und Betriebssystemversion</li><li>Version von Void Bastion</li><li>kurze Beschreibung des Problems</li><li>ungefähre Uhrzeit des Fehlers</li><li>deine gekürzte Spieler-ID aus dem Profil – niemals Passwörter oder Anmeldecodes</li></ul>
|
||||
<h2>Konto und Datenschutz</h2>
|
||||
<p>Für Auskunft, Berichtigung oder Löschung nutze bitte die Kontaktadresse oder die Seite <a href="delete-account.html">Konto und Daten löschen</a>.</p>
|
||||
<div class="links"><a href="impressum.html">Impressum</a><a href="privacy.html">Datenschutz</a><a href="delete-account.html">Konto löschen</a></div>
|
||||
</div>
|
||||
</main>
|
||||
<footer><div class="shell">GerGames · Void Bastion</div></footer>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user