PROCITY/web/js/citygen/wordlists.js
m3ultra 8b7ca9aae4 Lane A (CityGen): deterministic town generator, registry, names, 2D map, self-check
Layer-1 CityPlan generator per CITY_SPEC schema v1 — pure data, no THREE, all randomness
through core/prng, deterministic + JSON-serializable + <1ms.

- web/js/citygen/plan.js: generatePlan(citySeed) → CityPlan (spine, cross-streets, market
  square + dept anchor, arcade, warehouse fringe, residential collar w/ corner milkbars,
  laneways) + chunkIndex (Amanatides–Woo edge supercover) + corner overlap-resolution pass.
- web/js/core/registry.js: SHOP_TYPES (all 9) + district weights + enums (shared vocabulary).
- web/js/citygen/names.js + wordlists.js: seeded 90s-AU shop/town names, 50+ patterns.
- web/js/citygen/index.js: canonical barrel entry (adopts Lane F's integration shim).
- web/map.html: standalone Canvas-2D plan debugger (pan/zoom/hover, layers, export JSON).
- web/js/citygen/selfcheck.js: node acceptance harness — determinism, golden fingerprint,
  facing, within- AND cross-block no-overlap, chunk+edge coverage, finiteness, assets. ALL GREEN
  (1271/1271) over 6 seeds. web/package.json ({"type":"module"}) lets node run it.
- docs/shots/laneA/: 5 seeds screenshotted, each reads as a town.

Fixes from an adversarial multi-agent review (15 confirmed defects): market facades faced the
wrong way; cross-block corner overlaps; chunkIndex skipped chunks incl. the origin/spine;
stall frontEdge z-band; doubled-possessive names; unparseable map road colour; +others.

CITY_SPEC amendment (treaty, same commit): shop-types table aligned to the registry lanes
import; documented lot.ry/frontEdge, block.kind/district-id, and web/package.json.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 12:06:41 +10:00

85 lines
4.5 KiB
JavaScript
Raw 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.

// PROCITY name wordlists — the flavour bank for names.js. Hand-authored 90s-Australian.
// Pure data, no logic. names.js fills pattern tokens ({Word}, {Suburb}, {Family}, …) from here.
// Optionally regenerated/expanded by a human via an Ollama pass (see A-progress.md); the game
// only ever reads this checked-in file — no network at runtime (CITY_SPEC law).
// Generic evocative single words (records, sound, exchange, rotation…)
export const WORDS = [
'Rotation', 'Groove', 'Vinyl', 'Static', 'Echo', 'Reverb', 'Feedback', 'Needle', 'Tempo',
'Fable', 'Relic', 'Trinket', 'Bower', 'Nook', 'Attic', 'Cellar', 'Emporium', 'Bazaar',
'Hodgepodge', 'Oddment', 'Sundry', 'Curio', 'Salvage', 'Remnant', 'Vestige', 'Memento',
'Wombat', 'Galah', 'Cockatoo', 'Magpie', 'Kookaburra', 'Brumby', 'Dingo', 'Bilby',
'Southern', 'Federal', 'Colonial', 'Paramount', 'Regal', 'Crown', 'Empire', 'Ambassador',
'Sunburnt', 'Redgum', 'Wattle', 'Banksia', 'Bottlebrush', 'Saltbush', 'Coolabah', 'Jacaranda',
];
// Adjectives (worn, faded, second-hand register)
export const ADJ = [
'Golden', 'Lucky', 'Little', 'Grand', 'Olde', 'Corner', 'Central', 'Wonky', 'Dusty', 'Trusty',
'Thrifty', 'Cut-Price', 'Bargain', 'Bonza', 'Fair Dinkum', 'True Blue', 'Reliable', 'Honest',
'Faded', 'Worn', 'Vintage', 'Retro', 'Rare', 'Groovy', 'Funky', 'Mellow', 'Cosmic', 'Electric',
];
// Nouns for shop bodies
export const NOUN = [
'Records', 'Sounds', 'Wax', 'Grooves', 'Discs', 'Tapes', 'Tunes', 'Beat', 'Rhythm', 'Vibe',
'Treasures', 'Treasure Trove', 'Finds', 'Bits', 'Bobs', 'Wares', 'Goods', 'Bygones', 'Antiques',
'Toys', 'Games', 'Playthings', 'Fun', 'Kids', 'Nippers', 'Marbles', 'Kites',
'Books', 'Reads', 'Pages', 'Volumes', 'Paperbacks', 'Stories', 'Print', 'Chapters',
'Video', 'Movies', 'Flicks', 'Rentals', 'Screen', 'Cinema', 'Picture Show',
'Cash', 'Loans', 'Exchange', 'Trading', 'Pawn', 'Deals', 'Swap', 'Barter',
];
// AU suburb / place flavour (fake-but-plausible)
export const SUBURB = [
'Thornbury', 'Coburg', 'Preston', 'Footscray', 'Marrickville', 'Newtown', 'Enmore', 'Brunswick',
'Fitzroy', 'Collingwood', 'Redfern', 'Balmain', 'Bexley', 'Ashfield', 'Petersham', 'Croydon',
'Woop Woop', 'Bullamakanka', 'Dubbo', 'Wagga', 'Bendigo', 'Ballarat', 'Geelong', 'Toowoomba',
'Moe', 'Sale', 'Yass', 'Cootamundra', 'Gundagai', 'Wangaratta', 'Warrnambool', 'Numurkah',
];
// Family / surname flavour (milkbars, family businesses)
export const FAMILY = [
'Papadopoulos', 'Nguyen', 'Kowalski', 'Ferrante', 'De Luca', 'Kotsiopoulos', 'Tran', 'Petrakis',
'Wong', 'Singh', 'Karam', 'Vella', 'Borg', 'Camilleri', 'Muscat', 'Zammit', 'Grech',
'Kelly', 'Ryan', 'Murphy', 'OBrien', 'Doyle', 'Callaghan', 'Sullivan', 'Flanagan',
'Cracknell', 'Trundle', 'Bagshaw', 'Higgins', 'Prentice', 'Weatherall', 'Nabbs', 'Dorrigo',
];
// Saint / charity flavour (op shops parody Vinnies/Salvos/Anglicare)
export const SAINT = [
'Bevan', 'Cletus', 'Doreen', 'Enid', 'Fabian', 'Gladys', 'Hildegard', 'Ignatius', 'Merle',
'Norbert', 'Prudence', 'Quenby', 'Reginald', 'Sheila', 'Trevor', 'Ulrika', 'Verity', 'Wilfred',
];
export const CHARITY = [
'Vinnies-alike', 'Sallies', 'Op-Portunity', 'Second Chance', 'Anglibarn', 'Lifeboat',
'Good Sammy', 'The Smith Family Room', 'Diggers Aid', 'Bush Mission', 'Endeavour',
];
// First names for personalised shops ("Kev's", "Shazza's")
export const FIRSTNAME = [
'Kev', 'Shazza', 'Bazza', 'Dazza', 'Gazza', 'Robbo', 'Macca', 'Johnno', 'Stevo', 'Bluey',
'Dot', 'Merv', 'Val', 'Col', 'Nev', 'Beryl', 'Gaz', 'Snez', 'Franga', 'Tex',
];
// Animals (mascot names: The Laughing Magpie, etc.)
export const ANIMAL = [
'Magpie', 'Galah', 'Kookaburra', 'Wombat', 'Echidna', 'Possum', 'Rosella', 'Currawong',
'Cockatoo', 'Bilby', 'Quokka', 'Numbat', 'Bandicoot', 'Lorikeet', 'Kelpie', 'Blue Heeler',
];
// Town-name pieces (generatePlan names the town)
export const TOWN_PREFIX = [
'Mount', 'Port', 'Lake', 'Upper', 'Lower', 'North', 'South', 'Little', 'Old', 'New', 'Cape',
];
export const TOWN_ROOT = [
'Wilga', 'Barmah', 'Yackandandah', 'Wonthaggi', 'Corryong', 'Nhill', 'Woomelang', 'Beeac',
'Tarwin', 'Koonwarra', 'Meeniyan', 'Boolarra', 'Yinnar', 'Mirboo', 'Toora', 'Fish Creek',
'Dunkeld', 'Penshurst', 'Skipton', 'Rokewood', 'Cressy', 'Inverleigh', 'Bannockburn',
];
export const TOWN_SUFFIX = [
'Flat', 'Creek', 'Springs', 'Gully', 'Junction', 'Crossing', 'Downs', 'Vale', 'Heads',
'Plains', 'Ridge', 'Hollow', 'Bend', 'Reach', 'Wells', '', '', '', // blanks: bare root sometimes
];