The factory now has an engineering office with five named developers and
the first-mission vending machine, an accounting office, and the manager's
room. Mr. Mohammadi drives in with his KMC T8 pickup and walks to his desk.
The production hall has five work areas staffed by 40 instanced workers, and
a truck loads packed machines at the dock and drives out of the gate.
The family car is a BMW-style sports sedan (no badges) parked beside the
start point, with a top speed of 200 km/h. Driving is now sliced into
sub-steps so the car can't tunnel through walls. Microsoft footprints that
reach into the compound are dropped, and the gate sign reads correctly
from inside the yard.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The ground is Esri World Imagery: ~1 m/pixel tiles around the city
zone, the factory and 300 m either side of the drive between them,
coarser tiles for the whole region. Tiles are hosted with the game
(public/imagery, scripts/fetch-imagery.mjs), stream in near the camera,
are cached by the service worker as visited, and replace the drawn
roads and land areas
- ~141,500 Microsoft building footprints (ODbL) join OSM's ~4,000 in a
compact delta-encoded file (public/data/buildings.bin, built by
scripts/build-buildings.mjs). Heights are estimated from footprint
area and land use, with industrial halls outside the ring road.
Buildings are built in 500 m blocks as the camera approaches
- Caddy compresses the buildings file and caches map data for a week;
the build targets ES2022 for top-level await
- Tests for decoding, factory clearance, machine reachability and tile
placement
Imagery attribution: Esri, Maxar, Earthstar Geographics, and the GIS
User Community. Commercial use requires a suitable Esri licence.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Real-world mode is first person: the view stands at the GPS position at
eye height and only real walking moves it; the phone's orientation
aims it, with the camera picture (AR) or over the 3D city when the
camera is off. Without an orientation sensor it follows the compass or
walking direction and can be dragged. The family, car and run buttons
are hidden in this mode
- Orientation sensors are now separate from the camera stream in ar.js
- On phones, dialogue, the buy prompt, banners, points and GPS status
sit in the middle of the screen; the prompt can be tapped; the toolbar
is one scrollable row and no longer covers the budget and clock
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Real-world mode opens the phone's rear camera as the game background;
the 3D camera stands at the GPS position and follows the phone's
orientation, so machines, beacons, range circles, the route and the
robot appear in their real direction. City, traffic and family are
hidden in this view; a toggle switches back to the 3D map, and drag
turns the view where there is no orientation sensor
- Stable mode (default on): drops GPS jumps impossible on foot, holds the
position until it drifts past half the GPS error, calms the compass
- Arrival range is 2.5x the GPS error (20–50 m), shown as a ground circle
- Tests for the stabilizer, AR orientation and field of view
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The runner lives on the deployment server, so the deploy job runs
docker compose locally with a temporary registry login.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- The factory company is now "شرکت روبات مارکت" on signs, dialogue,
briefing, map label, manifest and README
- Real-world mode no longer shows "location not found" for every
problem: it takes a quick coarse Wi-Fi/network fix first, keeps
searching after a GPS timeout, and reports permission denied (1),
location off (2), still searching (3) or a non-HTTPS page separately
- Three GPS test machines at real coordinates beside the factory, only
present in real-world mode; the closest machine within reach is used
and the arrival radius is twice the GPS error (12–40 m)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI now builds and pushes the image to the Gitea container registry, links
the package, and the deploy job ships only deploy/docker-compose.yml and an
.env naming the image to /opt/vending-machine-game.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Gitea runner hung for over 30 minutes on `npm ci` because it cannot
reach registry.npmjs.org. The registry is now configurable through the
NPM_REGISTRY repository variable, passed on to the server's Docker
build, and npm gives up after bounded retries. Jobs also have time
limits (test 15 min, deploy 30 min) so the runner is never held forever.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every push and pull request installs, tests and builds the game. Pushes
to main then ship the sources to the server over SSH and restart the
site with docker compose; the deploy step is skipped until the
DEPLOY_HOST / DEPLOY_SSH_KEY secrets exist. An optional HEALTH_URL is
polled after deploying.
The Gitea server is now the `origin` remote; GitHub remains as `github`.
Gitea ignores .github/workflows while .gitea/workflows exists, so the
GitHub Pages workflow keeps running only on GitHub.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A two-stage image runs the tests and builds the game with Node, then
serves dist/ with Caddy, which obtains and renews Let's Encrypt
certificates for robotmarkets.ir (configurable via SITE_ADDRESS).
HTTPS is required for installing the PWA and for GPS mode.
- Caddyfile: gzip/zstd, long-lived caching for hashed assets, no-cache
for the page, service worker and manifest, SPA fallback, permissions
policy for location and motion sensors
- docker-compose.yml: ports 80/443, persistent certificate volumes
- README: server setup, updates, running behind an existing proxy, and
workarounds when Docker Hub is unreachable from servers in Iran
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Traffic cars picked a random direction even on one-way carriageways,
so some drove head-on in the player's lane and stopped dead in front of
them; every bump also threw the player's car backwards while the
traffic car stayed put, so the player could not get past.
- Map data records one-way roads (oneway tags, motorways, roundabouts)
- Traffic drives with the flow in one of two lanes on one-way roads and
on the right-hand half of two-way roads, spawning only from nearby roads
- Bumps slow the player down instead of reversing them; a traffic car
pressed against for more than 0.8 s pulls away out of sight
- Regression test for traffic direction and lanes; ?debug collision log
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The game now begins inside the Negin Sazan Pishgam Radmehr Atousa
vending-machine factory on the Mashhad–Chenaran road, and the world
extends ~20 km along the real driving route to Park Mellat and
Ferdowsi University.
- Factory compound: production hall with assembly line, office, yard,
gate and company signs; first mission at its half-price demo machine
- Map data merged from four OSM extracts (factory zone, route corridor,
region main roads, city zone), clipped to a 15 x 18 km region
- City meshes chunked and culled by distance; traffic recycled around
the player; minimap and city map drawn from cached tiles + overview
- The Robot Market robot no longer walks with the family: it comes out
of a machine when they arrive, greets them with expression portraits
and goes back inside when they leave
- PWA: manifest, icons from the robot avatar, offline service worker
generated at build time, install button / iOS steps, update prompt;
Vazirmatn font bundled instead of Google Fonts
- Real-world mode: safety notice, GPS + compass tracking with accuracy
smoothing, 20-40 m arrival radius, speed lock and in-person bonus
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the linear forest walk with an open area of real western Mashhad
built from OpenStreetMap data, starting at Park Mellat. A father and child,
guided by the Robot Market robot, find vending machines at a park, school,
universities, a metro station and a mall, on foot or by car.
- Iran province briefing map; only Mashhad is unlocked
- Third-person camera, building collision, arcade car and ambient traffic
- Minimap and full city map with addresses, opening hours and A* routing
- Purchase scoring, missions with cash rewards, ranks and an end screen
- Map data build script (OSM + Natural Earth) and new logic tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>