tab-shooter/README.md
Janik Dietz 25fc6fb345
feat: add fullscreen mode and extract shared game engine
- Add new fullscreen game mode playable in a dedicated browser tab
- Extract shared game logic into `engine.js` to be used by both popup and fullscreen modes
- Implement self-protection to prevent closing the game tab or popup tab
- Update documentation and bump version to 1.1.0
2026-08-04 08:02:53 +02:00

118 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🚀 Tab Shooter
A small Chrome browser game that turns your open tabs into targets.
Pilot a spaceship, blast the tabs you no longer need, and they really get closed.
> Für alle, die zu viele Tabs offen haben. Schieß sie ab — und sie verschwinden wirklich.
---
## 📦 Installation (in Chrome laden)
1. Chrome öffnen → `chrome://extensions` aufrufen.
2. Oben rechts den **Entwicklermodus** (Developer mode) einschalten.
3. Auf **„Entpackt laden“** (Load unpacked) klicken.
4. Den Ordner `tab-shooter` auswählen.
5. Das Tab-Shooter-Icon 🚀 erscheint in der Toolbar. Anklicken → Spiel startet.
> Nach Code-Änderungen in `popup.js`/`manifest.json` die Extension auf
> `chrome://extensions` einfach neu laden (🔄-Button).
---
## 🎮 Spielen
### Zwei Spielmodi
| Modus | Wie |
|---|---|
| **Popup** (kompakt, 420×600) | Toolbar-Icon klicken → **SPIEL STARTEN** |
| **Vollbild** (eigener Tab, bis 900×680) | Toolbar-Icon klicken → **🖥️ Im Vollbild spielen** |
Im Vollbild-Modus öffnet sich das Spiel in einem eigenen Tab. Dieser Tab
ist **geschützt** er taucht nie als Ziel auf und lässt sich nicht abschießen.
Perfekt, wenn du mehr Platz und eine bessere Übersicht willst.
### Ablauf
1. Modus wählen & Scope wählen: **Aktuelles Fenster** oder **Alle Fenster**.
2. **SPIEL STARTEN** drücken.
3. Deine echten Tabs erscheinen als gegnerische Raumschiffe (mit echtem Favicon + Titel).
4. Schießen — jeder Tab, den du triffst, wird in Chrome **wirklich geschlossen**.
> 🛡️ **Selbstschutz:** Folgende Tabs sind nie Ziele:
> - der Tab, der das Popup trägt (sonst würde sich das Spiel selbst beenden)
> - der Game-Tab im Vollbild-Modus
> - alle internen Chrome-Seiten (`chrome://`, `devtools://`, …)
> - alle Seiten dieser Extension selbst
### Steuerung
| Aktion | Tastatur | Maus |
|---|---|---|
| Bewegen | `←` `→` oder `A` `D` | Maus bewegen |
| Schießen | `Leertaste` | Klick (halten) |
### Features
- **Echte Tabs als Gegner** Favicon & Titel, verknüpft via Tab-ID.
- **Bewegte Gegner** manche sind „feindlich" und schießen zurück.
- **Power-Ups** (zufälliger Drop):
- 🔫 **Triple Shot** drei Schüße gleichzeitig (6 s)
-**Rapid Fire** schnellere Schussfolge (6 s)
- 🛡️ **Shield** absorbiert einen Treffer
- **Score & Highscore** gespeichert via `chrome.storage.local`.
- **3 Leben**, danach Game Over mit Statistik.
---
## 🗂 Projektstruktur
```
tab-shooter/
├── manifest.json # MV3-Manifest, Berechtigungen
├── engine.js # Geteilte Game-Engine (Klasse TabShooterGame)
├── popup.html # Popup-UI (kompakt)
├── popup.css # Shared Space-Theme Styling
├── popup.js # Popup-Controller (nutzt engine.js)
├── game.html # Vollbild-UI (eigener Tab)
├── game.css # Vollbild-Overrides
├── game.js # Vollbild-Controller (nutzt engine.js)
├── background.js # Service Worker (MV3)
├── generate_icons.py # Icon-Generator (pure stdlib, keine Abhängigkeiten)
├── README.md
└── icons/
├── icon16.png
├── icon48.png
└── icon128.png
```
---
## 🔐 Berechtigungen & Privatsphäre
| Permission | Zweck |
|---|---|
| `tabs` | Offene Tabs lesen (Titel, Favicon, ID) und getroffene Tabs schließen. |
| `favicon` | Favicons über die `_favicon`-API laden. |
| `storage` | Highscore lokal speichern. |
**Es werden keine Inhaltsdaten (Page content) von Tabs gelesen** — nur Titel und Favicon-URL.
Tabs werden **ausschließlich dann** geschlossen, wenn sie im Spiel getroffen wurden.
Der aktive Popup-Tab und interne `chrome://`-Seiten sind nie Ziele.
---
## 🛠 Icons neu generieren
Falls du die Icons anpassen willst (Farben, Form in `generate_icons.py`):
```bash
python generate_icons.py
```
Das Skript nutzt nur die Python-Standardbibliothek (`zlib` + `struct`) — keine PIL nötig.
---
Viel Spaß beim Aufräumen! 🛸💥