BIN
public/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
public/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
3
public/favicon.svg
Normal file
|
After Width: | Height: | Size: 406 KiB |
21
public/site.webmanifest
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "MyWebSite",
|
||||||
|
"short_name": "MySite",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/web-app-manifest-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/web-app-manifest-512x512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "maskable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"theme_color": "#ffffff",
|
||||||
|
"background_color": "#ffffff",
|
||||||
|
"display": "standalone"
|
||||||
|
}
|
||||||
BIN
public/web-app-manifest-192x192.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
public/web-app-manifest-512x512.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
@@ -20,6 +20,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {t} from "astro-i18n";
|
import {t} from "astro-i18n";
|
||||||
import {statsRepo} from "@repo/stats.ts";
|
import {statsRepo} from "@repo/stats.ts";
|
||||||
|
import "@styles/table.css"
|
||||||
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -64,7 +65,3 @@
|
|||||||
<p>{error.message}</p>
|
<p>{error.message}</p>
|
||||||
{/await}
|
{/await}
|
||||||
|
|
||||||
<style>
|
|
||||||
@import "../styles/table.css";
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,8 @@
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
|
maintainAspectRatio: false,
|
||||||
|
|
||||||
scales: {
|
scales: {
|
||||||
x: {
|
x: {
|
||||||
type: "time",
|
type: "time",
|
||||||
@@ -105,5 +107,5 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<canvas bind:this={canvas}></canvas>
|
<canvas height="500" bind:this={canvas}></canvas>
|
||||||
</div>
|
</div>
|
||||||
@@ -101,6 +101,8 @@
|
|||||||
<a href={l("/rules/microwargear")}
|
<a href={l("/rules/microwargear")}
|
||||||
class="btn btn-gray">{t("navbar.links.rules.micro")}</a>
|
class="btn btn-gray">{t("navbar.links.rules.micro")}</a>
|
||||||
<a href={l("/rules/streetfight")} class="btn btn-gray">{t("navbar.links.rules.sf")}</a>
|
<a href={l("/rules/streetfight")} class="btn btn-gray">{t("navbar.links.rules.sf")}</a>
|
||||||
|
<h2 class="px-2 text-gray-300">{t("navbar.links.rules.ranked")}</h2>
|
||||||
|
<a href={l("/rangliste/missilewars")} class="btn btn-gray">{t("navbar.links.ranked.mw")}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- TODO: Add help center
|
<!-- TODO: Add help center
|
||||||
|
|||||||
@@ -43,7 +43,5 @@
|
|||||||
maximumFractionDigits: 2
|
maximumFractionDigits: 2
|
||||||
}).format(data.playtime)})}h</p>
|
}).format(data.playtime)})}h</p>
|
||||||
<p>{t("dashboard.stats.fights", {fights: data.fights})}</p>
|
<p>{t("dashboard.stats.fights", {fights: data.fights})}</p>
|
||||||
{#if user.perms.includes("CHECK")}
|
|
||||||
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
|
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
|
||||||
{/if}
|
|
||||||
{/await}
|
{/await}
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
import {createEventDispatcher} from "svelte";
|
import {createEventDispatcher} from "svelte";
|
||||||
import {schemRepo} from "@repo/schem.ts";
|
import {schemRepo} from "@repo/schem.ts";
|
||||||
import SWModal from "@components/styled/SWModal.svelte";
|
import SWModal from "@components/styled/SWModal.svelte";
|
||||||
import {t} from "astro-i18n"
|
import {t} from "astro-i18n";
|
||||||
|
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
@@ -31,9 +31,11 @@
|
|||||||
|
|
||||||
let {open = $bindable(false)}: Props = $props();
|
let {open = $bindable(false)}: Props = $props();
|
||||||
|
|
||||||
async function upload() {
|
async function upload(e: Event) {
|
||||||
|
e.stopPropagation();
|
||||||
if (uploadFile == null) {
|
if (uploadFile == null) {
|
||||||
return
|
error = "dashboard.schematic.errors.noFile";
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
let file = uploadFile[0];
|
let file = uploadFile[0];
|
||||||
|
|
||||||
@@ -42,33 +44,46 @@
|
|||||||
let type = name.split(".").pop();
|
let type = name.split(".").pop();
|
||||||
|
|
||||||
if (type !== "schem" && type !== "schematic") {
|
if (type !== "schem" && type !== "schematic") {
|
||||||
return
|
error = "dashboard.schematic.errors.invalidEnding";
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let content = await file.arrayBuffer();
|
let content = await file.arrayBuffer();
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content)));
|
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content)));
|
||||||
|
|
||||||
let response = await $schemRepo.uploadSchematic(name, b64);
|
try {
|
||||||
|
await $schemRepo.uploadSchematic(name, b64);
|
||||||
|
|
||||||
open = false;
|
open = false;
|
||||||
value = "";
|
value = "";
|
||||||
dispatch("reset")
|
dispatch("reset");
|
||||||
|
} catch (e) {
|
||||||
|
error = "dashboard.schematic.errors.upload";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reset(e: Event) {
|
||||||
|
e.stopPropagation();
|
||||||
|
open = false
|
||||||
|
value = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
let uploadFile: FileList | null = $state(null);
|
let uploadFile: FileList | null = $state(null);
|
||||||
let value = $state("");
|
let value = $state("");
|
||||||
|
let error = $state(null)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<SWModal title={t("dashboard.schematic.title")} bind:open>
|
<SWModal title={t("dashboard.schematic.title")} bind:open>
|
||||||
<form>
|
<form>
|
||||||
<input type="file" bind:files={uploadFile} bind:value />
|
<label for="schem-upload">{t("dashboard.schematic.title")}</label>
|
||||||
|
<input type="file" id="schem-upload" bind:files={uploadFile} class="overflow-ellipsis" bind:value accept=".schem, .schematic"/>
|
||||||
|
{#if error !== null}
|
||||||
|
<p class="text-red-400">{t(error)}</p>
|
||||||
|
{/if}
|
||||||
</form>
|
</form>
|
||||||
{#snippet footer()}
|
{#snippet footer()}
|
||||||
|
<button class="btn" onclick={upload}>{t("dashboard.schematic.upload")}</button>
|
||||||
<button class="btn !ml-auto" onclick={upload}>{t("dashboard.schematic.upload")}</button>
|
<button class="btn btn-gray" onclick={reset}>{t("dashboard.schematic.cancel")}</button>
|
||||||
<button class="btn btn-gray" onclick={() => open = false}>{t("dashboard.schematic.cancel")}</button>
|
|
||||||
|
|
||||||
{/snippet}
|
{/snippet}
|
||||||
</SWModal>
|
</SWModal>
|
||||||
@@ -68,16 +68,18 @@
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<dialog bind:this={dialog} onclose={close} onclick={(e) => dialog.close()} aria-hidden="true" class="max-h-full max-w-md w-full rounded-lg shadow-lg dark:bg-neutral-800 dark:text-neutral-100">
|
<dialog bind:this={dialog} onclose={close} onclick={(e) => dialog.close()} aria-hidden="true" class="max-h-full min-w-md w-fit rounded-lg shadow-lg dark:bg-neutral-800 dark:text-neutral-100">
|
||||||
<div onclick={stopPropagation(onclick)} aria-hidden="true">
|
<div onclick={stopPropagation(onclick)} aria-hidden="true" class="w-fit">
|
||||||
<div class="p-6 border-b border-neutral-200 dark:border-neutral-700">
|
<div class="p-6 border-b border-neutral-200 dark:border-neutral-700">
|
||||||
<h1 class="text-4xl font-bold">{title}</h1>
|
<h1 class="text-4xl font-bold">{title}</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="p-6 main border-b border-neutral-200 dark:border-neutral-700">
|
<div class="p-6 main border-b border-neutral-200 dark:border-neutral-700">
|
||||||
{@render children?.()}
|
{@render children?.()}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex mx-4 my-2 p-6" onclick={() => dialog.close()} aria-hidden="true">
|
<div class="mx-4 my-2 p-6">
|
||||||
|
<div class="ml-auto flex justify-end" onclick={() => dialog.close()} aria-hidden="true">
|
||||||
{@render footer?.()}
|
{@render footer?.()}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ Die Tage werden kürzer und kälter, es geht auf die weiße Jahreszeit zu. Wenn
|
|||||||
- Design-Regel: **Weihnachtliches/Winterliches Design**
|
- Design-Regel: **Weihnachtliches/Winterliches Design**
|
||||||
|
|
||||||
## Regeln:
|
## Regeln:
|
||||||
|
|
||||||
- Regelwerk: **MiniWarGear**, ohne MGs, 120 TNT trotzdem erlaubt
|
- Regelwerk: **MiniWarGear**, ohne MGs, 120 TNT trotzdem erlaubt
|
||||||
- **Weißer Trockenbeton**/**White Concrete Powder** darf zum Gegner geschossen und/oder geboosted werden, beginnend ab der Ausfahrzeit
|
- **Weißer Trockenbeton**/**White Concrete Powder** darf zum Gegner geschossen und/oder geboosted werden, beginnend ab der Ausfahrzeit
|
||||||
- Solche „Schneeballkanonen“ zählen nicht zum Kanonenlimit und dürfen vorbeladen sein, solange sie keine Projektile schießen können
|
- Solche „Schneeballkanonen“ zählen nicht zum Kanonenlimit und dürfen vorbeladen sein, solange sie keine Projektile schießen können
|
||||||
@@ -33,6 +34,6 @@ Die Tage werden kürzer und kälter, es geht auf die weiße Jahreszeit zu. Wenn
|
|||||||
- Sieger von bester Schneeballkanone wird durch Uservote bestimmt (ähnlich wie bei WG – Designcontest)
|
- Sieger von bester Schneeballkanone wird durch Uservote bestimmt (ähnlich wie bei WG – Designcontest)
|
||||||
- Die Abstimmung endet drei Tage nach Veröffentlichung der Abstimmung
|
- Die Abstimmung endet drei Tage nach Veröffentlichung der Abstimmung
|
||||||
|
|
||||||
Der Gesamtsieger wird mit folgender Formel bestimmt: 0,66 * Fightplatzierung + 0,33 * Platzierung Uservoting, bei Gleichstand bestimmt die Fightplatzierung
|
Der Gesamtsieger wird mit folgender Formel bestimmt: 0,66 _ Fightplatzierung + 0,33 _ Platzierung Uservoting, bei Gleichstand bestimmt die Fightplatzierung
|
||||||
|
|
||||||
**Wir wünschen allen teilnehmenden Teams viel Erfolg!**
|
**Wir wünschen allen teilnehmenden Teams viel Erfolg!**
|
||||||
28
src/content/announcements/de/sw-arcade.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
title: SteamWar Arcade
|
||||||
|
description: "Das erste SteamWar Arcade Event: MissleWars, TowerRun und TNTLeague"
|
||||||
|
key: steamwar-arcade
|
||||||
|
created: 2025-04-14
|
||||||
|
tags:
|
||||||
|
- event
|
||||||
|
- towerrun
|
||||||
|
- misslewars
|
||||||
|
- tntleague
|
||||||
|
- arcade
|
||||||
|
image: ../../../images/sw-arcade-image.png
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ahoi Liebe Community,**
|
||||||
|
|
||||||
|
Am **18. Mai** feiert SteamWar seinen 6. Geburtstag. Zur Feier dieses Meilensteins werden wir ein kleines Event veranstalten: **SteamWar Arcade**
|
||||||
|
|
||||||
|
- Anmeldeschluss ist der **11.5.2025**
|
||||||
|
- In jedem Modus können bis zu **drei Personen** an einem Kampf teilnehmen
|
||||||
|
|
||||||
|
## Ablauf:
|
||||||
|
|
||||||
|
- Es gibt drei Modi zur Auswahl: **TowerRun**, **TNTLeague** und **MissleWars**
|
||||||
|
- Die Teams stimmen 5 Minuten vor Beginn den Modus ab. Sind die Teams sich einig, wird dieser Modus gespielt. Sind die Teams sich nicht einig, wird der dritte Modus gespielt.
|
||||||
|
- Es wird eine einfache Gruppenphase geben: alle gegen alle
|
||||||
|
|
||||||
|
**Wir wünschen allen teilnehmenden Teams viel Erfolg!**
|
||||||
@@ -14,13 +14,12 @@ tags:
|
|||||||
|
|
||||||
| Platzierung | Team | Punkte |
|
| Platzierung | Team | Punkte |
|
||||||
|-------------|-------------|--------|
|
|-------------|-------------|--------|
|
||||||
| 1. | ABYSS | 0 |
|
| 1. | Halcyon | 10 |
|
||||||
| | BlackFire | 0 |
|
| 2. | Happy-End | 8 |
|
||||||
| | Borg | 0 |
|
| 3. | ABYSS | 5 |
|
||||||
| | Halcyon | 0 |
|
| 4. | Borg | 4 |
|
||||||
| | Happy-End | 0 |
|
| 5. | BlackFire | 2 |
|
||||||
| | Pulse | 0 |
|
| 6. | TheNoobTeam | 1 |
|
||||||
| | TheNoobTeam | 0 |
|
|
||||||
|
|
||||||
### Aktueller Spieltag
|
### Aktueller Spieltag
|
||||||
|
|
||||||
@@ -30,42 +29,44 @@ tags:
|
|||||||
|
|
||||||
| 01.03.2025 | Begegnung | Ergebnis |
|
| 01.03.2025 | Begegnung | Ergebnis |
|
||||||
|------------|--------------|----------|
|
|------------|--------------|----------|
|
||||||
| 19:00 | HPY vs ABYS | / |
|
| 19:00 | HPY vs ABYS | HPY qualifiziert |
|
||||||
| 19:30 | Borg vs Hlcy | / |
|
| 19:30 | Borg vs Hlcy | Hlcy qualifiziert |
|
||||||
| 20:00 | TNT vs BF | / |
|
| 20:00 | TNT vs BF | TNT qualifiziert |
|
||||||
| 20:30 | ? vs ? | / |
|
| 20:30 | ABYS vs Borg | Sieg ABYS |
|
||||||
| 21:00 | ? vs ? | / |
|
| 21:00 | Borg vs BF | Sieg Borg |
|
||||||
| 21:30 | ? vs ? | / |
|
| 21:30 | BF vs ABYS | ABYS, Borg qualifiziert |
|
||||||
|
|
||||||
|
PL hat sich nach der Qualifikation zurückgezogen, womit BF nachgerückt ist.
|
||||||
|
|
||||||
### 1. Spieltag
|
### 1. Spieltag
|
||||||
|
|
||||||
| 08.03.2025 | Begegnung | Ergebnis |
|
| 08.03.2025 | Begegnung | Ergebnis |
|
||||||
|------------|-----------|----------|
|
|------------|--------------|----------|
|
||||||
| 19:00 | ? vs ? | / |
|
| 19:00 | ABYS vs Borg | Sieg ABYS |
|
||||||
| 19:30 | ? vs ? | / |
|
| 19:30 | Hlcy vs HPY | Sieg Hlcy |
|
||||||
| 20:00 | ? vs ? | / |
|
| 20:00 | BF vs TNT | Sieg TNT |
|
||||||
| 20:30 | ? vs ? | / |
|
| 20:30 | HPY vs ABYS | Sieg HPY |
|
||||||
| 21:00 | ? vs ? | / |
|
| 21:00 | Borg vs BF | Sieg Borg |
|
||||||
| 21:30 | ? vs ? | / |
|
| 21:30 | TNT vs Hlcy | Sieg Hlcy |
|
||||||
|
|
||||||
### 2. Spieltag
|
### 2. Spieltag
|
||||||
|
|
||||||
| 15.03.2025 | Begegnung | Ergebnis |
|
| 15.03.2025 | Begegnung | Ergebnis |
|
||||||
|------------|-----------|----------|
|
|------------|--------------|----------|
|
||||||
| 19:00 | ? vs ? | / |
|
| 19:00 | HPY vs TNT | Sieg HPY |
|
||||||
| 19:30 | ? vs ? | / |
|
| 19:30 | ABYS vs BF | Sieg ABYS |
|
||||||
| 20:00 | ? vs ? | / |
|
| 20:00 | Borg vs Hlcy | Sieg Hlcy |
|
||||||
| 20:30 | ? vs ? | / |
|
| 20:30 | BF vs HPY | Sieg HPY |
|
||||||
| 21:00 | ? vs ? | / |
|
| 21:00 | TNT vs Borg | Sieg Borg |
|
||||||
| 21:30 | ? vs ? | / |
|
| 21:30 | Hlcy vs ABYS | Sieg Hlcy |
|
||||||
|
|
||||||
### 3. Spieltag
|
### 3. Spieltag
|
||||||
|
|
||||||
| 22.03.2025 | Begegnung | Ergebnis |
|
| 22.03.2025 | Begegnung | Ergebnis |
|
||||||
|------------|-----------|----------|
|
|------------|-------------|----------|
|
||||||
| 19:00 | ? vs ? | / |
|
| 19:00 | ABYS vs TNT | Sieg ABYS |
|
||||||
| 19:30 | ? vs ? | / |
|
| 19:30 | Borg vs HPY | Sieg HPY |
|
||||||
| 20:00 | ? vs ? | / |
|
| 20:00 | Hlcy vs BF | Sieg Hlcy |
|
||||||
| 20:30 | - | / |
|
| 20:30 | - | / |
|
||||||
| 21:00 | - | / |
|
| 21:00 | - | / |
|
||||||
| 21:30 | - | / |
|
| 21:30 | - | / |
|
||||||
@@ -73,32 +74,32 @@ tags:
|
|||||||
### 4. Spieltag
|
### 4. Spieltag
|
||||||
|
|
||||||
| 29.03.2025 | Begegnung | Ergebnis |
|
| 29.03.2025 | Begegnung | Ergebnis |
|
||||||
|------------|-----------|----------|
|
|------------|--------------|----------|
|
||||||
| 19:00 | ? vs ? | / |
|
| 19:00 | TNT vs ABYS | Sieg ABYS |
|
||||||
| 19:30 | ? vs ? | / |
|
| 19:30 | HPY vs Borg | Sieg HPY |
|
||||||
| 20:00 | ? vs ? | / |
|
| 20:00 | BF vs Hlcy | Sieg Hlcy |
|
||||||
| 20:30 | ? vs ? | / |
|
| 20:30 | Borg vs TNT | Sieg Borg |
|
||||||
| 21:00 | ? vs ? | / |
|
| 21:00 | HPY vs BF | Sieg HPY |
|
||||||
| 21:30 | ? vs ? | / |
|
| 21:30 | ABYS vs Hlcy | Sieg Hlcy |
|
||||||
|
|
||||||
### 5. Spieltag
|
### 5. Spieltag
|
||||||
|
|
||||||
| 05.04.2025 | Begegnung | Ergebnis |
|
| 05.04.2025 | Begegnung | Ergebnis |
|
||||||
|------------|-----------|----------|
|
|------------|--------------|----------|
|
||||||
| 19:00 | ? vs ? | / |
|
| 19:00 | TNT vs HPY | Sieg HPY |
|
||||||
| 19:30 | ? vs ? | / |
|
| 19:30 | BF vs ABYS | Sieg BF |
|
||||||
| 20:00 | ? vs ? | / |
|
| 20:00 | Hlcy vs Borg | Sieg Hlcy |
|
||||||
| 20:30 | ? vs ? | / |
|
| 20:30 | ABYS vs HPY | Sieg HPY |
|
||||||
| 21:00 | ? vs ? | / |
|
| 21:00 | BF vs Borg | Sieg Borg |
|
||||||
| 21:30 | ? vs ? | / |
|
| 21:30 | Hlcy vs TNT | Sieg Hlcy |
|
||||||
|
|
||||||
### 6. Spieltag
|
### 6. Spieltag
|
||||||
|
|
||||||
| 12.04.2025 | Begegnung | Ergebnis |
|
| 12.04.2025 | Begegnung | Ergebnis |
|
||||||
|------------|-----------|----------|
|
|------------|--------------|----------|
|
||||||
| 19:00 | ? vs ? | / |
|
| 19:00 | Borg vs ABYS | Sieg ABYS |
|
||||||
| 19:30 | ? vs ? | / |
|
| 19:30 | HPY vs Hlcy | Sieg Hlcy |
|
||||||
| 20:00 | ? vs ? | / |
|
| 20:00 | TNT vs BF | Sieg BF |
|
||||||
| 20:30 | - | / |
|
| 20:30 | - | / |
|
||||||
| 21:00 | - | / |
|
| 21:00 | - | / |
|
||||||
| 21:30 | - | / |
|
| 21:30 | - | / |
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
"url": {
|
"url": {
|
||||||
"1.21.4": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.2.0/AdvancedScripts-2.2.0.jar",
|
"1.21.4": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.2.0/AdvancedScripts-2.2.0.jar",
|
||||||
"1.20.6": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.1.0/AdvancedScripts-2.1.0.jar",
|
"1.20.6": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.1.0/AdvancedScripts-2.1.0.jar",
|
||||||
"1.19.3": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.0.0/AdvancedScripts-2.0.0.jar"
|
"1.19.3": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.0.0/AdvancedScripts-2.0.0.jar",
|
||||||
|
"Hotkey script": "https://git.steamwar.de/SteamWar/SteamWar/src/branch/main/BauSystem/hotkeys.lua"
|
||||||
},
|
},
|
||||||
"sourceUrl": "https://git.steamwar.de/SteamWar/AdvancedScripts"
|
"sourceUrl": "https://git.steamwar.de/SteamWar/AdvancedScripts"
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,8 @@
|
|||||||
"name": "SteamWarTeamserver",
|
"name": "SteamWarTeamserver",
|
||||||
"description": "Dieses Plugin ermöglicht die einfache Einbindung deines Servers in SteamWar. Wie du deinen (Team-)Server über SteamWar erreichbar machen kannst findest du hier.",
|
"description": "Dieses Plugin ermöglicht die einfache Einbindung deines Servers in SteamWar. Wie du deinen (Team-)Server über SteamWar erreichbar machen kannst findest du hier.",
|
||||||
"url": {
|
"url": {
|
||||||
"Info": "/teamserverintegration"
|
"Info": "/teamserverintegration",
|
||||||
|
"Download": "https://git.steamwar.de/SteamWar/SteamWarTeamserverIntegration/releases/download/latest/SteamWarTeamserverIntegration.jar"
|
||||||
},
|
},
|
||||||
"sourceUrl": "https://git.steamwar.de/SteamWar/SteamWarBungeeTeamserver"
|
"sourceUrl": "https://git.steamwar.de/SteamWar/SteamWarTeamserverIntegration"
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
"translationKey": "microwg",
|
"translationKey": "microwg",
|
||||||
"main": false
|
"main": false,
|
||||||
|
"ranked": true
|
||||||
}
|
}
|
||||||
5
src/content/modes/missilewars.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"translationKey": "mw",
|
||||||
|
"main": false,
|
||||||
|
"ranked": true
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "Graf Spree",
|
"name": "Graf Spee",
|
||||||
"description": "A simple, lightweight description of a frostbite.",
|
"description": "A simple, lightweight description of a frostbite.",
|
||||||
"id": 123,
|
"id": 123,
|
||||||
"creator": ["Test", "Test2"],
|
"creator": ["Test", "Test2"],
|
||||||
"gamemode": "warship",
|
"gamemode": "warship",
|
||||||
"image": "../../../images/publics/grafspree/area_render.png",
|
"image": "../../../images/publics/grafspee/area_render.png",
|
||||||
"3d": false
|
"3d": false
|
||||||
}
|
}
|
||||||
3
src/content/rules/de/missilewars.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
translationKey: mw
|
||||||
|
---
|
||||||
@@ -87,7 +87,10 @@
|
|||||||
"title": "Hilfe",
|
"title": "Hilfe",
|
||||||
"docs": "Dokumentation"
|
"docs": "Dokumentation"
|
||||||
},
|
},
|
||||||
"account": "Konto"
|
"account": "Konto",
|
||||||
|
"ranked": {
|
||||||
|
"mw": "MissileWars"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wg": {
|
"wg": {
|
||||||
@@ -123,6 +126,9 @@
|
|||||||
"microwg": {
|
"microwg": {
|
||||||
"title": "MicroWarGear"
|
"title": "MicroWarGear"
|
||||||
},
|
},
|
||||||
|
"mw": {
|
||||||
|
"title": "MissileWars"
|
||||||
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"imprint": "Impressum",
|
"imprint": "Impressum",
|
||||||
"privacy": "Datenschutzerklärung",
|
"privacy": "Datenschutzerklärung",
|
||||||
@@ -167,7 +173,7 @@
|
|||||||
"stats": {
|
"stats": {
|
||||||
"playtime": "Spielzeit: {# playtime #}",
|
"playtime": "Spielzeit: {# playtime #}",
|
||||||
"fights": "Kämpfe: {# fights #}",
|
"fights": "Kämpfe: {# fights #}",
|
||||||
"checked": "Schematics Geprüft: {# checked #}"
|
"checked": "Freigegebene Schematics: {# checked #}"
|
||||||
},
|
},
|
||||||
"schematic": {
|
"schematic": {
|
||||||
"upload": "Hochladen",
|
"upload": "Hochladen",
|
||||||
@@ -194,7 +200,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cancel": "Abbrechen",
|
"cancel": "Abbrechen",
|
||||||
"title": "Schematic hochladen"
|
"title": "Schematic hochladen",
|
||||||
|
"errors": {
|
||||||
|
"invalidEnding": "Diese Dateiendung kann nicht Hochgeladen werden.",
|
||||||
|
"noFile": "Keine Datei.",
|
||||||
|
"upload": "Fehler beim Hochladen, Überprüfe deine Schematic!"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
|
|||||||
@@ -111,7 +111,7 @@
|
|||||||
"stats": {
|
"stats": {
|
||||||
"playtime": "Playtime: {# playtime #}",
|
"playtime": "Playtime: {# playtime #}",
|
||||||
"fights": "Fights: {# fights #}",
|
"fights": "Fights: {# fights #}",
|
||||||
"checked": "Schematics Checked: {# checked #}"
|
"checked": "Accepted Schematics: {# checked #}"
|
||||||
},
|
},
|
||||||
"schematic": {
|
"schematic": {
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
@@ -137,6 +137,11 @@
|
|||||||
"download": "Download",
|
"download": "Download",
|
||||||
"close": "Close"
|
"close": "Close"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"invalidEnding": "This file extension cannot be uploaded.",
|
||||||
|
"noFile": "No file.",
|
||||||
|
"upload": "Error uploading, check your schematic!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
BIN
src/images/sw-arcade-image.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
@@ -1,24 +1,24 @@
|
|||||||
---
|
---
|
||||||
import "$lib/styles/app.css";
|
import "$lib/styles/app.css";
|
||||||
import icon from "../images/logo.png";
|
|
||||||
import {getImage} from "astro:assets";
|
|
||||||
import { astroI18n } from "astro-i18n";
|
import { astroI18n } from "astro-i18n";
|
||||||
import { SEO } from "astro-seo";
|
import { SEO } from "astro-seo";
|
||||||
import { ClientRouter } from "astro:transitions";
|
import { ClientRouter } from "astro:transitions";
|
||||||
const { title, description, clientSideRouter = true } = Astro.props.frontmatter || Astro.props;
|
const { title, description, clientSideRouter = true } = Astro.props.frontmatter || Astro.props;
|
||||||
import "../../public/fonts/roboto/roboto.css";
|
import "../../public/fonts/roboto/roboto.css";
|
||||||
|
|
||||||
const iconImage = await getImage({src: icon, height: 32, width: 32, format: "png", quality: 100});
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<html lang={astroI18n.locale} class="dark">
|
<html lang={astroI18n.locale} class="dark">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport"
|
<meta name="viewport" content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0" />
|
||||||
content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0">
|
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
|
||||||
<meta name="icbm" content="52.370216;4.895168" />
|
<meta name="icbm" content="52.370216;4.895168" />
|
||||||
<link rel="icon" type="imgage/png" href={iconImage.src}/>
|
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
|
<link rel="shortcut icon" href="/favicon.ico" />
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||||
|
<meta name="apple-mobile-web-app-title" content="MyWebSite" />
|
||||||
|
<link rel="manifest" href="/site.webmanifest" />
|
||||||
|
|
||||||
<SEO
|
<SEO
|
||||||
title={title}
|
title={title}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ const ogImage = await getImage({
|
|||||||
)}
|
)}
|
||||||
<div class={post.data.image ? "absolute bottom-8 left-2" : "mb-4"}>
|
<div class={post.data.image ? "absolute bottom-8 left-2" : "mb-4"}>
|
||||||
<h1 class="text-4xl mb-0" transition:name={post.data.title + "-title"}>{post.data.title}</h1>
|
<h1 class="text-4xl mb-0" transition:name={post.data.title + "-title"}>{post.data.title}</h1>
|
||||||
<div class="flex items-center mt-2 text-neutral-300">
|
<div class="flex items-center mt-2 text-neutral-800 dark:text-neutral-300">
|
||||||
<TagSolid class="w-4 h-4 mr-2"/>
|
<TagSolid class="w-4 h-4 mr-2"/>
|
||||||
<div transition:name={post.data.title + "-tags"}>
|
<div transition:name={post.data.title + "-tags"}>
|
||||||
{post.data.tags.map(tag => (
|
{post.data.tags.map(tag => (
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import {type Player} from "../components/types/data";
|
|||||||
import PostComponent from "../components/PostComponent.astro";
|
import PostComponent from "../components/PostComponent.astro";
|
||||||
import BackgroundImage from "../components/BackgroundImage.astro";
|
import BackgroundImage from "../components/BackgroundImage.astro";
|
||||||
|
|
||||||
const teamMember: { [key: string]: Player[]} = await fetch("http://127.0.0.1:1337/data/team")
|
const teamMember: { [key: string]: Player[]} = await fetch(import.meta.env.PUBLIC_API_SERVER + "/data/team")
|
||||||
.then(value => value.json());
|
.then(value => value.json());
|
||||||
|
|
||||||
const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale);
|
const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale);
|
||||||
|
|||||||
@@ -44,4 +44,5 @@ const modes = await getCollection("modes", entry => entry.data.main);
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>))}
|
</div>))}
|
||||||
|
<a href={l("/rangliste/MissileWars")}>MissileWars Rangliste</a>
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
@@ -31,7 +31,7 @@ table {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
tr:nth-child(odd) {
|
tr:nth-child(odd) {
|
||||||
@apply bg-neutral-800;
|
@apply bg-neutral-200 dark:bg-neutral-800;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||