Add help modal, changelog, map visits, Dockerfile, CI

- Help modal (? button or keyboard shortcut): how-to-play in Swedish,
  flavor text, full changelog sourced from src/data/version.ts
- src/data/version.ts: versioned changelog entries, in-universe Malmö voice
- Map zone clicks: each location on the Leaflet map is now clickable.
  Unlocked cult areas give resources + log entries. Locked locations show
  lore hints. 30s cooldown per location so it's a decision, not a spam button.
- Dockerfile + nginx.conf + docker-compose.yml (port 5684)
- Gitea CI workflow (identical to 2048 — derives image from repo path, needs
  TKNTKN secret, pushes :latest and :sha tags)
- README.md with mechanics summary and docker instructions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Fredrik Johansson
2026-07-07 23:31:37 +02:00
parent f5776f269b
commit 5fcb339408
11 changed files with 420 additions and 3 deletions

View File

@@ -1,9 +1,10 @@
import './style.css';
import { createState, tick, buyUpgrade, saveState, loadState, clearSave } from './engine.ts';
import { createState, tick, buyUpgrade, visitLocation, saveState, loadState, clearSave } from './engine.ts';
import { initUI, renderState } from './ui.ts';
import { initMap, updateMap } from './map.ts';
let state = loadState() ?? createState();
let visitCooldowns = new Map<string, number>();
let lastTime = 0;
const TARGET_FPS = 30;
const FRAME_MS = 1000 / TARGET_FPS;
@@ -18,12 +19,18 @@ function start(): void {
() => {
clearSave();
state = createState();
visitCooldowns = new Map();
document.getElementById('overlay')!.classList.remove('visible');
renderState(state);
}
);
initMap('map');
initMap('map', (locationId) => {
const result = visitLocation(state, locationId, visitCooldowns);
state = result.state;
visitCooldowns = result.cooldowns;
renderState(state);
});
renderState(state);
requestAnimationFrame(loop);