MINEFLAPPY-GAME/README.md
Dave bc72c5dc30 Fullscreen PWA: no border, installs as an app, works offline
- canvas fills the entire screen on any device; the 480x640 world is
  scaled to fit and bottom-aligned so the ground always sits on the
  bottom edge, with the sky painted full-bleed behind it
- the canvas buffer now always matches its laid-out size, so the drawing
  can never drift out of step with the screen
- HUD (score, badge, buffs, toasts, biome banner) moved to screen space
  so it stays pinned to the real screen edges
- sun and stars drawn in screen space so the sky above the play area is
  not empty
- PWA: manifest, service worker (offline), generated app icons and an
  in-game INSTALL APP button
- overlays now dim the whole screen, not just the game strip
2026-10-23 19:52:18 +02:00

126 lines
4.3 KiB
Markdown

# Mineflappy
**Minecraft Flappy Bird** — a single-file HTML5 canvas game. No build step, no
dependencies, no assets. Everything (sprites, font, music, sound) is generated
in code.
```
open index.html # that's it - it runs straight from the filesystem
```
It fills the whole screen on any device - phone, tablet or desktop - with no
letterboxing and no border, and it can be installed as a standalone app.
---
## Deploy to Coolify
### Option A - Dockerfile (recommended)
The repo ships a `Dockerfile` that serves the game with nginx.
1. In Coolify: **New Resource → Application → Public/Private Repository**
2. **Repository URL**: `http://forgejo-b82b4lpyyzyg40thdsjdd38i.163.245.214.68.sslip.io/David/MINEFLAPPY-GAME.git`
- Branch: `main`
- Build Pack: **Dockerfile**
3. **Dockerfile Location**: `/Dockerfile` (default is fine)
4. **Port**: `80` — set this under **Networking → Ports exposes**
5. **Health Check Path**: `/healthz`
6. Hit **Deploy**.
7. Add a domain: **Settings → Domains → Add Domain** - e.g. `game.yourdomain.com`
- Tick **Force HTTPS** and let Coolify/Traefik issue the Let's Encrypt cert.
- Coolify routes the domain to the container's port 80 automatically.
Push a new commit and Coolify rebuilds and redeploys it.
> **If you get "502 Bad Gateway"**: the container is healthy, but the proxy
> can't reach it. The usual cause is an empty **Ports exposes** field — when
> it's blank Coolify routes to port **3000** instead of 80. Put `80` in that
> field and redeploy. The bundled `nginx.conf` listens on **both 80 and
> 3000**, so the game is served either way, but setting the port correctly
> is still the right fix.
### Option B - Static Site (no Dockerfile)
If you'd rather not run a container:
1. **New Resource → Static Site** with the same repo
2. **Build Command**: `echo "static"` (there is nothing to build)
3. **Root Directory**: `/`
4. Deploy, then attach a domain as above.
### Option C - docker compose
A `docker-compose.yml` is included if you deploy by compose instead:
```bash
docker compose up -d --build
# game is on http://localhost:8080
```
---
## Run it locally with Docker
```bash
docker build -t mineflappy .
docker run --rm -p 8080:80 mineflappy
# open http://localhost:8080
```
---
## Layout
| File | What it is |
|---|---|
| `index.html` | The entire game - markup, CSS and JS in one file |
| `Dockerfile` | nginx:alpine image that serves `index.html` |
| `nginx.conf` | Server config: no-cache on the game, gzip, `/healthz` |
| `docker-compose.yml` | Optional compose deployment |
| `manifest.webmanifest` | Web app manifest - name, icons, standalone display |
| `sw.js` | Service worker - caches the app so it works offline |
| `icon-192.png` / `icon-512.png` | App icons (generated from the chicken sprite) |
| `apple-touch-icon.png` / `favicon-32.png` | iOS home screen + browser tab icons |
---
## Install it as an app (PWA)
The game is a full-screen Progressive Web App:
- **iPhone / iPad** - Safari -> Share -> **Add to Home Screen**
- **Android** - Chrome -> menu -> **Install app**
- **Desktop Chrome/Edge** - the install icon in the address bar, or the
**INSTALL APP** button in the corner of the game
Installed, it launches fullscreen with no browser chrome, keeps working
offline, and remembers your score.
---
## The game
Six birds, each with one ability:
| Bird | Ability | Effect |
|---|---|---|
| Chicken | Double Flap | Every 4th flap is 34% stronger |
| Enderman | Teleport | Blink 70px forward (refused if a pipe is in the way) |
| Allay | Allay Magnet | Nearby gems fly to you |
| Blaze | Melt | Burns away the next pipe, widening its gap |
| Phantom | Phase | Fly through anything for 1.2s |
| Wolf | Howl | Slows the whole game to 55% for 2s |
Also in: five biomes that change with your score (Plains → Desert → Mineshaft →
Nether → Ice Peaks), a day/night cycle, weather, gold/bubble/wings/lucky-cube
pickups, difficulty settings, bird unlocks, per-bird best scores, a daily
challenge with a shareable code, a ghost of your best run, and 2-player on one
screen.
**Controls** - `Space` / `W` / `↑` / tap to flap, `F` to use your ability,
`P` to pause, `C` on the game-over screen to change bird. In 2-player mode
`Space` is player 1 and `↑` is player 2.
Progress is stored in `localStorage` under `mineflappy_v2` (per origin, so
`https://mineflappy.apphub.co.za` keeps its own scores).