IAvecilla/GeoWho

β˜… 0Forks 0GitHub β†—Compare

README

πŸ—ΊοΈ GeoWho

A daily "guess the historical figure" game. A world map marks where a famous person was born (β˜…) and where they died (✝), with their exact birth and death dates. Name who it is.

Three figures a day, with a scoring ladder per figure:

When you get it Points
First try, from the map + dates alone 100
After one free hint 50
From four multiple-choice options (after a second hint) 10
Not at all 0

Each wrong guess automatically reveals the next hint (category β†’ occupation β†’ country). After the third figure you get your total score out of 300, and a countdown to the next day's three. Progress is saved, so the day resumes where you left off.

Run it

npm install
npm run dev        # http://localhost:5173

Other commands

npm run build      # type-check + production build to dist/
npm run preview    # serve the production build
npm run verify     # data/logic tests + full render smoke test
npm run data       # rebuild the dataset from Wikidata (see below)

How it works

  • The day's three figures are chosen deterministically from the date, so everyone gets the same puzzle; no repeats within a day.
  • Guess with an autocomplete name box (ranked most-famous-first); the final stage offers four multiple-choice options β€” same category, closest era.
  • The dataset is trimmed to the top 200 most famous figures (household names), with real birth/death coordinates and dates. TOP_N in scripts/prep-people.mjs controls the size.

Code layout

  • src/lib/game.ts β€” the game rules: daily selection, the pure scoring reducer (applyGuess/applyPick), option builder, date helpers, constants.
  • src/lib/people.ts β€” dataset access, search, clues.
  • src/lib/storage.ts β€” daily progress persistence (localStorage).
  • src/components/ β€” Round (the per-figure stage machine), WorldMap, GuessInput, Options, Clues, Summary.

The data (Wikidata)

A global "most famous humans" query times out, so the pipeline scopes by occupation (small sets) and takes the top figures by fame within each:

Script Role
scripts/fetch-people.mjs Top figures across ~35 occupations, with birth/death coords + dates.
scripts/fetch-people-extra.mjs Big/late occupations needing a higher fame threshold (politician, statesperson, naturalist).
scripts/fetch-people-must.mjs Guarantees curated iconic figures by QID.
scripts/fetch-dates.mjs Adds each date's precision so exact dates are honest (no fake "1 January" for year-only records).
scripts/fetch-occupations.mjs Adds real P106 occupations, used to categorize each figure (clue #1).
scripts/prep-people.mjs Formats dates to their precision, projects each point onto the map with d3-geo, emits src/data/people.json + src/data/world.json.

Points are pre-projected to pixel coordinates in the map's viewBox, so the runtime ships no projection library β€” it just plots x/y on the map path.

Dates render at their true precision: day (14 March 1879), month, or year (550 BC). A few otherwise-iconic figures can't be included when Wikidata has no coordinates for their birth/death places (e.g. Frida Kahlo).

Deploy

Fully static β€” npm run build and host dist/ anywhere. This repo also auto-deploys to GitHub Pages on every push to main (.github/workflows/deploy.yml).

Contributors

ColoCarletti

Issues